+/*****************************************************************************
+ * GtkSetupVarMenu :
+ *****************************************************************************
+ *
+ *****************************************************************************/
+static gint GtkSetupVarMenu( intf_thread_t * p_intf,
+ vlc_object_t * p_object,
+ GtkWidget *p_root,
+ char * psz_variable,
+ void(*pf_toggle )( GtkCheckMenuItem *, gpointer ) )
+{
+ vlc_value_t val;
+ char * psz_value;
+ GtkWidget * p_menu;
+ GSList * p_group = NULL;
+ GtkWidget * p_item;
+ GtkWidget * p_item_active = NULL;
+
+ int i_item;
+
+ /* temporary hack to avoid blank menu when an open menu is removed */
+ if( GTK_MENU_ITEM(p_root)->submenu != NULL )
+ {
+ gtk_menu_popdown( GTK_MENU( GTK_MENU_ITEM(p_root)->submenu ) );
+ }
+ /* removes previous menu */
+ gtk_menu_item_remove_submenu( GTK_MENU_ITEM( p_root ) );
+ gtk_widget_set_sensitive( p_root, FALSE );
+
+ /* get the current value */
+ if( var_Get( p_object, psz_variable, &val ) < 0 )
+ {
+ return FALSE;
+ }
+ psz_value = val.psz_string;
+
+ if( var_Change( p_object, psz_variable, VLC_VAR_GETLIST, &val ) < 0 )
+ {
+ free( psz_value );
+ return FALSE;
+ }
+
+ /* menu container */
+ p_menu = gtk_menu_new();
+ gtk_object_set_data( GTK_OBJECT( p_menu ), "p_intf", p_intf );
+
+ for( i_item = 0; i_item < val.p_list->i_count; i_item++ )
+ {
+ p_item = gtk_radio_menu_item_new_with_label( p_group,
+ val.p_list->p_values[i_item].psz_string );
+ p_group = gtk_radio_menu_item_group( GTK_RADIO_MENU_ITEM( p_item ) );
+
+ if( !strcmp( psz_value, val.p_list->p_values[i_item].psz_string ) )
+ {
+ p_item_active = p_item;
+ }
+
+ gtk_widget_show( p_item );
+
+ /* signal hanling for off */
+ gtk_signal_connect( GTK_OBJECT( p_item ), "toggled",
+ GTK_SIGNAL_FUNC ( pf_toggle ), NULL );
+
+ gtk_menu_append( GTK_MENU( p_menu ), p_item );
+
+ }
+ /* link the new menu to the menubar item */
+ gtk_menu_item_set_submenu( GTK_MENU_ITEM( p_root ), p_menu );
+
+ if( p_item_active )
+ {
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (p_item_active), TRUE);
+ }
+
+ if( val.p_list->i_count > 0 )
+ {
+ gtk_widget_set_sensitive( p_root, TRUE );
+ }
+
+ /* clean up everything */
+ var_Change( p_object, psz_variable, VLC_VAR_FREELIST, &val );
+
+ return TRUE;
+}
+
+/*****************************************************************************
+ * GtkDeinterlaceMenus: update interactive menus of the interface
+ *****************************************************************************
+ *****************************************************************************/
+static gint GtkDeinterlaceMenus( gpointer p_data,
+ GtkWidget * p_root,
+ void(*pf_toggle )( GtkCheckMenuItem *, gpointer ) )
+{
+ intf_thread_t * p_intf;
+ GtkWidget * p_menu;
+ GtkWidget * p_separator;
+ GtkWidget * p_item;
+ GtkWidget * p_item_active;
+ GSList * p_group;
+ guint i_item;
+ guint i;
+ char *ppsz_deinterlace_mode[] = { "discard", "blend", "mean", "bob", "linear", NULL };
+ char *psz_deinterlace_option;
+ char *psz_filter;
+
+ p_intf = (intf_thread_t *)p_data;
+
+ /* temporary hack to avoid blank menu when an open menu is removed */
+ if( GTK_MENU_ITEM(p_root)->submenu != NULL )
+ {
+ gtk_menu_popdown( GTK_MENU( GTK_MENU_ITEM(p_root)->submenu ) );
+ }
+ /* removes previous menu */
+ gtk_menu_item_remove_submenu( GTK_MENU_ITEM( p_root ) );
+ gtk_widget_set_sensitive( p_root, FALSE );
+
+ p_group = NULL;
+
+ /* menu container */
+ p_menu = gtk_menu_new();
+ gtk_object_set_data( GTK_OBJECT( p_menu ), "p_intf", p_intf );
+
+ /* special case for "off" item */
+ p_item = gtk_radio_menu_item_new_with_label( p_group, "None" );
+ p_group = gtk_radio_menu_item_group( GTK_RADIO_MENU_ITEM( p_item ) );
+
+ gtk_widget_show( p_item );
+
+ /* signal hanling for off */
+ gtk_signal_connect( GTK_OBJECT( p_item ), "toggled",
+ GTK_SIGNAL_FUNC ( pf_toggle ), NULL );
+
+ gtk_menu_append( GTK_MENU( p_menu ), p_item );
+
+ p_separator = gtk_menu_item_new();
+ gtk_widget_set_sensitive( p_separator, FALSE );
+ gtk_widget_show( p_separator );
+ gtk_menu_append( GTK_MENU( p_menu ), p_separator );
+
+
+ /* search actual deinterlace mode */
+ psz_filter = config_GetPsz( p_intf, "filter" );
+ psz_deinterlace_option = strdup( "None" );
+
+ if( psz_filter && *psz_filter )
+ {
+ if( strstr ( psz_filter, "deinterlace" ) )
+ {
+ free( psz_deinterlace_option );
+ psz_deinterlace_option = config_GetPsz( p_intf, "deinterlace-mode" );
+ if( !psz_deinterlace_option )
+ psz_deinterlace_option = strdup( "None" );
+ }
+ }
+ if( psz_filter )
+ free( psz_filter );
+
+ p_item_active = NULL;
+ i_item = 0;
+
+ /* create a set of deinteralce buttons and append them to the container */
+ for( i = 0; ppsz_deinterlace_mode[i] != NULL; i++ )
+ {
+ i_item++;
+
+ p_item = gtk_radio_menu_item_new_with_label( p_group, ppsz_deinterlace_mode[i] );
+ p_group = gtk_radio_menu_item_group( GTK_RADIO_MENU_ITEM( p_item ) );
+ gtk_widget_show( p_item );
+
+ if( !strcmp( ppsz_deinterlace_mode[i], psz_deinterlace_option ) )
+ {
+ p_item_active = p_item;
+ }
+ /* setup signal hanling */
+ gtk_signal_connect( GTK_OBJECT( p_item ), "toggled",
+ GTK_SIGNAL_FUNC( pf_toggle ),
+ NULL );
+
+ gtk_menu_append( GTK_MENU( p_menu ), p_item );
+
+ }
+
+ /* link the new menu to the menubar item */
+ gtk_menu_item_set_submenu( GTK_MENU_ITEM( p_root ), p_menu );
+
+ /* acitvation will call signals so we can only do it
+ * when submenu is attached to menu - to get intf_window
+ * We have to release the lock since input_ToggleES needs it */
+ if( p_item_active != NULL )
+ {
+ gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( p_item_active ),
+ TRUE );
+ }
+
+ /* be sure that menu is sensitive if non empty */
+ if( i_item > 0 )
+ {
+ gtk_widget_set_sensitive( p_root, TRUE );
+ }
+
+ return TRUE;
+}
+
+
+