controls.m
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:22k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * controls.m: MacOS X interface module
  3.  *****************************************************************************
  4.  * Copyright (C) 2002-2003 VideoLAN
  5.  * $Id: controls.m 8948 2004-10-07 21:33:38Z bigben $
  6.  *
  7.  * Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
  8.  *          Christophe Massiot <massiot@via.ecp.fr>
  9.  *          Derk-Jan Hartman <hartman at videolan dot org>
  10.  *
  11.  * This program is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2 of the License, or
  14.  * (at your option) any later version.
  15.  * 
  16.  * This program is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program; if not, write to the Free Software
  23.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  24.  *****************************************************************************/
  25. /*****************************************************************************
  26.  * Preamble
  27.  *****************************************************************************/
  28. #include <stdlib.h>                                      /* malloc(), free() */
  29. #include <sys/param.h>                                    /* for MAXPATHLEN */
  30. #include <string.h>
  31. #include "intf.h"
  32. #include "vout.h"
  33. #include "open.h"
  34. #include "controls.h"
  35. #include <osd.h>
  36. /*****************************************************************************
  37.  * VLCControls implementation 
  38.  *****************************************************************************/
  39. @implementation VLCControls
  40. - (IBAction)play:(id)sender
  41. {
  42.     vlc_value_t val;
  43.     intf_thread_t * p_intf = VLCIntf;
  44.     playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
  45.                                         FIND_ANYWHERE );
  46.     if( p_playlist )
  47.     {
  48.         vlc_mutex_lock( &p_playlist->object_lock );
  49.         if( p_playlist->i_size <= 0 )
  50.         {
  51.             vlc_mutex_unlock( &p_playlist->object_lock );
  52.             vlc_object_release( p_playlist );
  53.             [o_open openFileGeneric: nil];
  54.         }
  55.         else
  56.         {
  57.             vlc_mutex_unlock( &p_playlist->object_lock );
  58.             vlc_object_release( p_playlist );
  59.         }
  60.     }
  61.     val.i_int = config_GetInt( p_intf, "key-play-pause" );
  62.     var_Set( p_intf->p_vlc, "key-pressed", val );
  63. }
  64. - (IBAction)stop:(id)sender
  65. {
  66.     vlc_value_t val;
  67.     intf_thread_t * p_intf = VLCIntf;
  68.     val.i_int = config_GetInt( p_intf, "key-stop" );
  69.     var_Set( p_intf->p_vlc, "key-pressed", val );
  70. }
  71. - (IBAction)faster:(id)sender
  72. {
  73.     vlc_value_t val;
  74.     intf_thread_t * p_intf = VLCIntf;
  75.     val.i_int = config_GetInt( p_intf, "key-faster" );
  76.     var_Set( p_intf->p_vlc, "key-pressed", val );
  77. }
  78. - (IBAction)slower:(id)sender
  79. {
  80.     vlc_value_t val;
  81.     intf_thread_t * p_intf = VLCIntf;
  82.     val.i_int = config_GetInt( p_intf, "key-slower" );
  83.     var_Set( p_intf->p_vlc, "key-pressed", val );
  84. }
  85. - (IBAction)prev:(id)sender
  86. {
  87.     vlc_value_t val;
  88.     intf_thread_t * p_intf = VLCIntf;
  89.     val.i_int = config_GetInt( p_intf, "key-prev" );
  90.     var_Set( p_intf->p_vlc, "key-pressed", val );
  91. }
  92. - (IBAction)next:(id)sender
  93. {
  94.     vlc_value_t val;
  95.     intf_thread_t * p_intf = VLCIntf;
  96.     val.i_int = config_GetInt( p_intf, "key-next" );
  97.     var_Set( p_intf->p_vlc, "key-pressed", val );
  98. }
  99. - (IBAction)random:(id)sender
  100. {
  101.     vlc_value_t val;
  102.     intf_thread_t * p_intf = VLCIntf;
  103.     playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
  104.                                                        FIND_ANYWHERE );
  105.     if( p_playlist == NULL )
  106.     {
  107.         return;
  108.     }
  109.     var_Get( p_playlist, "random", &val );
  110.     val.b_bool = !val.b_bool;
  111.     var_Set( p_playlist, "random", val );
  112.     if( val.b_bool )
  113.     {
  114.         vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Random On" ) );
  115.     }
  116.     else
  117.     {
  118.         vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Random Off" ) );
  119.     }    
  120.     p_intf->p_sys->b_playlist_update = VLC_TRUE;
  121.     p_intf->p_sys->b_intf_update = VLC_TRUE;
  122.     vlc_object_release( p_playlist );
  123. }
  124. - (IBAction)repeat:(id)sender
  125. {
  126.     vlc_value_t val;
  127.     intf_thread_t * p_intf = VLCIntf;
  128.     playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
  129.                                                        FIND_ANYWHERE );
  130.     if( p_playlist == NULL )
  131.     {
  132.         return;
  133.     }
  134.     var_Get( p_playlist, "repeat", &val );
  135.     if (!val.b_bool)
  136.     {   
  137.         var_Set( p_playlist, "loop", val );
  138.     } 
  139.     val.b_bool = !val.b_bool;
  140.     var_Set( p_playlist, "repeat", val );
  141.     if( val.b_bool )
  142.     {
  143.         vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat All" ) );
  144.     }
  145.     else
  146.     {
  147.         vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat Off" ) );
  148.     }
  149.     p_intf->p_sys->b_playlist_update = VLC_TRUE;    
  150.     p_intf->p_sys->b_intf_update = VLC_TRUE;
  151.     vlc_object_release( p_playlist );
  152. }
  153. - (IBAction)loop:(id)sender
  154. {
  155.     vlc_value_t val;
  156.     intf_thread_t * p_intf = VLCIntf;
  157.     playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
  158.                                                        FIND_ANYWHERE );
  159.     if( p_playlist == NULL )
  160.     {
  161.         return;
  162.     }
  163.     var_Get( p_playlist, "loop", &val );
  164.     if (!val.b_bool)
  165.     {
  166.         var_Set( p_playlist, "repeat", val );
  167.     }
  168.     val.b_bool = !val.b_bool;
  169.     var_Set( p_playlist, "loop", val );
  170.     if( val.b_bool )
  171.     {
  172.         vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat One" ) );
  173.     }
  174.     else
  175.     {
  176.         vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat Off" ) );
  177.     }    
  178.     p_intf->p_sys->b_playlist_update = VLC_TRUE;
  179.     p_intf->p_sys->b_intf_update = VLC_TRUE;
  180.     vlc_object_release( p_playlist );
  181. }
  182. - (IBAction)forward:(id)sender
  183. {
  184.     vlc_value_t val;
  185.     intf_thread_t * p_intf = VLCIntf;
  186.     val.i_int = config_GetInt( p_intf, "key-jump+10sec" );
  187.     var_Set( p_intf->p_vlc, "key-pressed", val );
  188. }
  189. - (IBAction)backward:(id)sender
  190. {
  191.     vlc_value_t val;
  192.     intf_thread_t * p_intf = VLCIntf;
  193.     val.i_int = config_GetInt( p_intf, "key-jump-10sec" );
  194.     var_Set( p_intf->p_vlc, "key-pressed", val );
  195. }
  196. - (IBAction)volumeUp:(id)sender
  197. {
  198.     vlc_value_t val;
  199.     intf_thread_t * p_intf = VLCIntf;
  200.     val.i_int = config_GetInt( p_intf, "key-vol-up" );
  201.     var_Set( p_intf->p_vlc, "key-pressed", val );
  202.     [self updateVolumeSlider];
  203. }
  204. - (IBAction)volumeDown:(id)sender
  205. {
  206.     vlc_value_t val;
  207.     intf_thread_t * p_intf = VLCIntf;
  208.     val.i_int = config_GetInt( p_intf, "key-vol-down" );
  209.     var_Set( p_intf->p_vlc, "key-pressed", val );
  210.     [self updateVolumeSlider];
  211. }
  212. - (IBAction)mute:(id)sender
  213. {
  214.     vlc_value_t val;
  215.     intf_thread_t * p_intf = VLCIntf;
  216.     val.i_int = config_GetInt( p_intf, "key-vol-mute" );
  217.     var_Set( p_intf->p_vlc, "key-pressed", val );
  218.     [self updateVolumeSlider];
  219. }
  220. - (IBAction)volumeSliderUpdated:(id)sender
  221. {
  222.     intf_thread_t * p_intf = VLCIntf;
  223.     audio_volume_t i_volume = (audio_volume_t)[sender intValue];
  224.     aout_VolumeSet( p_intf, i_volume * AOUT_VOLUME_STEP );
  225. }
  226. - (void)updateVolumeSlider
  227. {
  228.     intf_thread_t * p_intf = VLCIntf;
  229.     audio_volume_t i_volume;
  230.     aout_VolumeGet( p_intf, &i_volume );
  231.     [o_volumeslider setFloatValue: (float)(i_volume / AOUT_VOLUME_STEP)];
  232. }
  233. - (IBAction)windowAction:(id)sender
  234. {
  235.     id o_window = [NSApp keyWindow];
  236.     NSString *o_title = [sender title];
  237.     NSArray *o_windows = [NSApp orderedWindows];
  238.     NSEnumerator *o_enumerator = [o_windows objectEnumerator];
  239.     vout_thread_t *p_vout = vlc_object_find( VLCIntf, VLC_OBJECT_VOUT,
  240.                                               FIND_ANYWHERE );
  241.     playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
  242.                                               FIND_ANYWHERE );
  243.     if( p_vout != NULL )
  244.     {
  245.         while ((o_window = [o_enumerator nextObject]))
  246.         {
  247.             if( [[o_window className] isEqualToString: @"VLCWindow"] )
  248.             {
  249.                 if( [o_title isEqualToString: _NS("Half Size") ] )
  250.                     [o_window scaleWindowWithFactor: 0.5];
  251.                 else if( [o_title isEqualToString: _NS("Normal Size") ] )
  252.                     [o_window scaleWindowWithFactor: 1.0];
  253.                 else if( [o_title isEqualToString: _NS("Double Size") ] )
  254.                     [o_window scaleWindowWithFactor: 2.0];
  255.                 else if( [o_title isEqualToString: _NS("Float on Top") ] )
  256.                     [o_window toggleFloatOnTop];
  257.                 else if( [o_title isEqualToString: _NS("Fit to Screen") ] )
  258.                 {
  259.                     if( ![o_window isZoomed] )
  260.                         [o_window performZoom:self];
  261.                 }
  262.                 else
  263.                 {
  264.                     vlc_value_t val;
  265.                     var_Get( p_vout, "fullscreen", &val );
  266.                     var_Set( p_vout, "fullscreen", (vlc_value_t)!val.b_bool );
  267.                 }
  268.                 break;
  269.             }
  270.         }
  271.         vlc_object_release( (vlc_object_t *)p_vout );
  272.         if (p_playlist) vlc_object_release(p_playlist);
  273.     }
  274.     else if ( p_playlist != NULL )
  275.     {
  276.         if (! ([o_title isEqualToString: _NS("Half Size") ] ||
  277.                [o_title isEqualToString: _NS("Normal Size") ] ||
  278.                [o_title isEqualToString: _NS("Double Size") ] ||
  279.                [o_title isEqualToString: _NS("Float on Top") ] ||
  280.                [o_title isEqualToString: _NS("Fit to Screen") ] ))
  281.         {
  282.             vlc_value_t val;
  283.             var_Get( p_playlist, "fullscreen", &val );
  284.             var_Set( p_playlist, "fullscreen", (vlc_value_t)!val.b_bool );
  285.         }
  286.     vlc_object_release( (vlc_object_t *)p_playlist );
  287.     }
  288. }
  289. - (void)setupVarMenuItem:(NSMenuItem *)o_mi
  290.                     target:(vlc_object_t *)p_object
  291.                     var:(const char *)psz_variable
  292.                     selector:(SEL)pf_callback
  293. {
  294.     vlc_value_t val, text;
  295.     int i_type = var_Type( p_object, psz_variable );
  296.     switch( i_type & VLC_VAR_TYPE )
  297.     {
  298.     case VLC_VAR_VOID:
  299.     case VLC_VAR_BOOL:
  300.     case VLC_VAR_VARIABLE:
  301.     case VLC_VAR_STRING:
  302.     case VLC_VAR_INTEGER:
  303.         break;
  304.     default:
  305.         /* Variable doesn't exist or isn't handled */
  306.         return;
  307.     }
  308.     
  309.     /* Make sure we want to display the variable */
  310.     if( i_type & VLC_VAR_HASCHOICE )
  311.     {
  312.         var_Change( p_object, psz_variable, VLC_VAR_CHOICESCOUNT, &val, NULL );
  313.         if( val.i_int == 0 ) return;
  314.         if( (i_type & VLC_VAR_TYPE) != VLC_VAR_VARIABLE && val.i_int == 1 )
  315.             return;
  316.     }
  317.     
  318.     /* Get the descriptive name of the variable */
  319.     var_Change( p_object, psz_variable, VLC_VAR_GETTEXT, &text, NULL );
  320.     [o_mi setTitle: [[VLCMain sharedInstance] localizedString: text.psz_string ?
  321.                                         text.psz_string : strdup( psz_variable ) ]];
  322.     var_Get( p_object, psz_variable, &val );
  323.     if( i_type & VLC_VAR_HASCHOICE )
  324.     {
  325.         NSMenu *o_menu = [o_mi submenu];
  326.         [self setupVarMenu: o_menu forMenuItem: o_mi target:p_object
  327.                         var:psz_variable selector:pf_callback];
  328.         
  329.         if( text.psz_string ) free( text.psz_string );
  330.         return;
  331.     }
  332.     VLCMenuExt *o_data;
  333.     switch( i_type & VLC_VAR_TYPE )
  334.     {
  335.     case VLC_VAR_VOID:
  336.         o_data = [[VLCMenuExt alloc] initWithVar: psz_variable Object: p_object->i_object_id
  337.                 Value: val ofType: i_type];
  338.         [o_mi setRepresentedObject: [NSValue valueWithPointer:[o_data retain]]];
  339.         break;
  340.     case VLC_VAR_BOOL:
  341.         o_data = [[VLCMenuExt alloc] initWithVar: psz_variable Object: p_object->i_object_id
  342.                 Value: val ofType: i_type];
  343.         [o_mi setRepresentedObject: [NSValue valueWithPointer:[o_data retain]]];
  344.         if( !( i_type & VLC_VAR_ISCOMMAND ) )
  345.             [o_mi setState: val.b_bool ? TRUE : FALSE ];
  346.         break;
  347.     default:
  348.         if( text.psz_string ) free( text.psz_string );
  349.         return;
  350.     }
  351.     if( ( i_type & VLC_VAR_TYPE ) == VLC_VAR_STRING ) free( val.psz_string );
  352.     if( text.psz_string ) free( text.psz_string );
  353. }
  354. - (void)setupVarMenu:(NSMenu *)o_menu
  355.                     forMenuItem: (NSMenuItem *)o_parent
  356.                     target:(vlc_object_t *)p_object
  357.                     var:(const char *)psz_variable
  358.                     selector:(SEL)pf_callback
  359. {
  360.     vlc_value_t val, val_list, text_list;
  361.     int i_type, i, i_nb_items;
  362.     /* remove previous items */
  363.     i_nb_items = [o_menu numberOfItems];
  364.     for( i = 0; i < i_nb_items; i++ )
  365.     {
  366.         [o_menu removeItemAtIndex: 0];
  367.     }
  368.     /* Check the type of the object variable */
  369.     i_type = var_Type( p_object, psz_variable );
  370.     /* Make sure we want to display the variable */
  371.     if( i_type & VLC_VAR_HASCHOICE )
  372.     {
  373.         var_Change( p_object, psz_variable, VLC_VAR_CHOICESCOUNT, &val, NULL );
  374.         if( val.i_int == 0 ) return;
  375.         if( (i_type & VLC_VAR_TYPE) != VLC_VAR_VARIABLE && val.i_int == 1 )
  376.             return;
  377.     }
  378.     else
  379.     {
  380.         return;
  381.     }
  382.     switch( i_type & VLC_VAR_TYPE )
  383.     {
  384.     case VLC_VAR_VOID:
  385.     case VLC_VAR_BOOL:
  386.     case VLC_VAR_VARIABLE:
  387.     case VLC_VAR_STRING:
  388.     case VLC_VAR_INTEGER:
  389.         break;
  390.     default:
  391.         /* Variable doesn't exist or isn't handled */
  392.         return;
  393.     }
  394.     if( var_Get( p_object, psz_variable, &val ) < 0 )
  395.     {
  396.         return;
  397.     }
  398.     if( var_Change( p_object, psz_variable, VLC_VAR_GETLIST,
  399.                     &val_list, &text_list ) < 0 )
  400.     {
  401.         if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) free( val.psz_string );
  402.         return;
  403.     }
  404.     /* make (un)sensitive */
  405.     [o_parent setEnabled: ( val_list.p_list->i_count > 1 )];
  406.     for( i = 0; i < val_list.p_list->i_count; i++ )
  407.     {
  408.         vlc_value_t another_val;
  409.         NSMenuItem * o_lmi;
  410.         NSString *o_title = @"";
  411.         VLCMenuExt *o_data;
  412.         switch( i_type & VLC_VAR_TYPE )
  413.         {
  414.         case VLC_VAR_STRING:
  415.             another_val.psz_string =
  416.                 strdup(val_list.p_list->p_values[i].psz_string);
  417.             o_title = [[VLCMain sharedInstance] localizedString: text_list.p_list->p_values[i].psz_string ?
  418.                 text_list.p_list->p_values[i].psz_string : val_list.p_list->p_values[i].psz_string ];
  419.             o_lmi = [o_menu addItemWithTitle: o_title action: pf_callback keyEquivalent: @""];
  420.             o_data = [[VLCMenuExt alloc] initWithVar: strdup(psz_variable) Object: p_object->i_object_id
  421.                     Value: another_val ofType: i_type];
  422.             [o_lmi setRepresentedObject: [NSValue valueWithPointer:[o_data retain]]];
  423.             [o_lmi setTarget: self];
  424.             
  425.             if( !strcmp( val.psz_string, val_list.p_list->p_values[i].psz_string ) && !( i_type & VLC_VAR_ISCOMMAND ) )
  426.                 [o_lmi setState: TRUE ];
  427.             break;
  428.         case VLC_VAR_INTEGER:
  429.              o_title = text_list.p_list->p_values[i].psz_string ?
  430.                                  [[VLCMain sharedInstance] localizedString: strdup( text_list.p_list->p_values[i].psz_string )] :
  431.                                  [NSString stringWithFormat: @"%d",
  432.                                  val_list.p_list->p_values[i].i_int];
  433.             o_lmi = [[o_menu addItemWithTitle: o_title action: pf_callback keyEquivalent: @""] retain ];
  434.             o_data = [[VLCMenuExt alloc] initWithVar: strdup(psz_variable) Object: p_object->i_object_id
  435.                     Value: val_list.p_list->p_values[i] ofType: i_type];
  436.             [o_lmi setRepresentedObject: [NSValue valueWithPointer:[ o_data retain]]];
  437.             [o_lmi setTarget: self];
  438.             if( val_list.p_list->p_values[i].i_int == val.i_int && !( i_type & VLC_VAR_ISCOMMAND ) )
  439.                 [o_lmi setState: TRUE ];
  440.             break;
  441.         default:
  442.           break;
  443.         }
  444.     }
  445.     
  446.     /* clean up everything */
  447.     if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) free( val.psz_string );
  448.     var_Change( p_object, psz_variable, VLC_VAR_FREELIST, &val_list, &text_list );
  449. }
  450. - (IBAction)toggleVar:(id)sender
  451. {
  452.     NSMenuItem *o_mi = (NSMenuItem *)sender;
  453.     VLCMenuExt *o_data = [[o_mi representedObject] pointerValue];
  454.     [NSThread detachNewThreadSelector: @selector(toggleVarThread:)
  455.         toTarget: self withObject: o_data];
  456.     return;
  457. }
  458. - (int)toggleVarThread: (id)_o_data
  459. {
  460.     vlc_object_t *p_object;
  461.     NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init];
  462.     VLCMenuExt *o_data = (VLCMenuExt *)_o_data;
  463.     vlc_thread_set_priority( VLCIntf , VLC_THREAD_PRIORITY_LOW );
  464.     p_object = (vlc_object_t *)vlc_object_get( VLCIntf,
  465.                                     [o_data objectID] );
  466.     if( p_object != NULL )
  467.     {
  468.         var_Set( p_object, strdup([o_data name]), [o_data value] );
  469.         vlc_object_release( p_object );
  470.         [o_pool release];
  471.         return VLC_TRUE;
  472.     }
  473.     [o_pool release];
  474.     return VLC_EGENERIC;
  475. }
  476. @end
  477. @implementation VLCControls (NSMenuValidation)
  478.  
  479. - (BOOL)validateMenuItem:(NSMenuItem *)o_mi
  480. {
  481.     BOOL bEnabled = TRUE;
  482.     vlc_value_t val;
  483.     intf_thread_t * p_intf = VLCIntf;
  484.     playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
  485.                                                        FIND_ANYWHERE );
  486.     if( p_playlist != NULL )
  487.     {
  488.         vlc_mutex_lock( &p_playlist->object_lock );
  489.     }
  490. #define p_input p_playlist->p_input
  491.     if( [[o_mi title] isEqualToString: _NS("Faster")] ||
  492.         [[o_mi title] isEqualToString: _NS("Slower")] )
  493.     {
  494.         if( p_playlist != NULL && p_input != NULL )
  495.         {
  496.             bEnabled = p_input->input.b_can_pace_control;
  497.         }
  498.         else
  499.         {
  500.             bEnabled = FALSE;
  501.         }
  502.     }
  503.     else if( [[o_mi title] isEqualToString: _NS("Stop")] )
  504.     {
  505.         if( p_playlist == NULL || p_input == NULL )
  506.         {
  507.             bEnabled = FALSE;
  508.         }
  509.     }
  510.     else if( [[o_mi title] isEqualToString: _NS("Previous")] ||
  511.              [[o_mi title] isEqualToString: _NS("Next")] )
  512.     {
  513.         if( p_playlist == NULL )
  514.         {
  515.             bEnabled = FALSE;
  516.         }
  517.         else
  518.         {
  519.             bEnabled = p_playlist->i_size > 1;
  520.         }
  521.     }
  522.     else if( [[o_mi title] isEqualToString: _NS("Random")] )
  523.     {
  524.         int i_state;
  525.         var_Get( p_playlist, "random", &val );
  526.         i_state = val.b_bool ? NSOnState : NSOffState;
  527.         [o_mi setState: i_state];
  528.     }
  529.     else if( [[o_mi title] isEqualToString: _NS("Repeat One")] )
  530.     {
  531.         int i_state;
  532.         var_Get( p_playlist, "repeat", &val );
  533.         i_state = val.b_bool ? NSOnState : NSOffState;
  534.         [o_mi setState: i_state];
  535.     }
  536.     else if( [[o_mi title] isEqualToString: _NS("Repeat All")] )
  537.     {
  538.         int i_state;
  539.         var_Get( p_playlist, "loop", &val );
  540.         i_state = val.b_bool ? NSOnState : NSOffState;
  541.         [o_mi setState: i_state];
  542.     }
  543.     else if( [[o_mi title] isEqualToString: _NS("Step Forward")] ||
  544.              [[o_mi title] isEqualToString: _NS("Step Backward")] )
  545.     {
  546.         bEnabled = FALSE;
  547.         if( p_playlist != NULL && p_input != NULL )
  548.         {
  549.             var_Get( p_input, "seekable", &val);
  550.             if( val.b_bool )
  551.             {
  552.                 bEnabled = TRUE;
  553.             }
  554.         }
  555.     }
  556.     else if( [[o_mi title] isEqualToString: _NS("Mute")] ) 
  557.     {
  558.         [o_mi setState: p_intf->p_sys->b_mute ? NSOnState : NSOffState];
  559.     }
  560.     else if( [[o_mi title] isEqualToString: _NS("Half Size")] ||
  561.                 [[o_mi title] isEqualToString: _NS("Normal Size")] ||
  562.                 [[o_mi title] isEqualToString: _NS("Double Size")] ||
  563.                 [[o_mi title] isEqualToString: _NS("Fit to Screen")] ||
  564.                 [[o_mi title] isEqualToString: _NS("Float on Top")] )
  565.     {
  566.         id o_window;
  567.         NSArray *o_windows = [NSApp orderedWindows];
  568.         NSEnumerator *o_enumerator = [o_windows objectEnumerator];
  569.         bEnabled = FALSE;
  570.         
  571.         vout_thread_t   *p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT,
  572.                                               FIND_ANYWHERE );
  573.         if( p_vout != NULL )
  574.         {
  575.             if ( [[o_mi title] isEqualToString: _NS("Float on Top")] )
  576.             {
  577.                 var_Get( p_vout, "video-on-top", &val );
  578.                 [o_mi setState: val.b_bool ?  NSOnState : NSOffState];
  579.             }
  580.             while ((o_window = [o_enumerator nextObject]))
  581.             {
  582.                 if( [[o_window className] isEqualToString: @"VLCWindow"] )
  583.                 {
  584.                     bEnabled = TRUE;
  585.                     break;
  586.                 }
  587.             }
  588.             vlc_object_release( (vlc_object_t *)p_vout );
  589.         }
  590.     }
  591.     else if( [[o_mi title] isEqualToString: _NS("Fullscreen")])
  592.     {
  593.         if (p_playlist)
  594.         {
  595.             var_Get(p_playlist, "fullscreen", &val );
  596.             [o_mi setState: val.b_bool];
  597.             bEnabled = TRUE;
  598.         }
  599.         else
  600.         {
  601.             bEnabled = FALSE;
  602.         }
  603.     }
  604.     if( p_playlist != NULL )
  605.     {
  606.         vlc_mutex_unlock( &p_playlist->object_lock );
  607.         vlc_object_release( p_playlist );
  608.     }
  609.     return( bEnabled );
  610. }
  611. @end
  612. /*****************************************************************************
  613.  * VLCMenuExt implementation 
  614.  *****************************************************************************
  615.  * Object connected to a playlistitem which remembers the data belonging to
  616.  * the variable of the autogenerated menu
  617.  *****************************************************************************/
  618. @implementation VLCMenuExt
  619. - (id)initWithVar: (const char *)_psz_name Object: (int)i_id
  620.         Value: (vlc_value_t)val ofType: (int)_i_type
  621. {
  622.     self = [super init];
  623.     if( self != nil )
  624.     {
  625.         psz_name = strdup( _psz_name );
  626.         i_object_id = i_id;
  627.         value = val;
  628.         i_type = _i_type;
  629.     }
  630.     return( self );
  631. }
  632. - (void)dealloc
  633. {
  634.     free( psz_name );
  635. }
  636. - (char *)name
  637. {
  638.     return psz_name;
  639. }
  640. - (int)objectID
  641. {
  642.     return i_object_id;
  643. }
  644. - (vlc_value_t)value
  645. {
  646.     return value;
  647. }
  648. - (int)type
  649. {
  650.     return i_type;
  651. }
  652. @end