📄 menu.c
字号:
var_Change( p_object, psz_variable, VLC_VAR_FREELIST, &val_list, &text_list ); 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" ) ) { vlc_value_t val; vout_thread_t *p_vout; p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); if( p_vout && var_Get( p_vout, "deinterlace-mode", &val ) == VLC_SUCCESS ) { if( val.psz_string && *val.psz_string ) { free( psz_deinterlace_option ); psz_deinterlace_option = val.psz_string; } else if( val.psz_string ) free( val.psz_string ); } if( p_vout ) vlc_object_release( p_vout ); } } 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;}/***************************************************************************** * GtkSetupMenus: function that generates title/chapter/audio/subpic * menus with help from preceding functions ***************************************************************************** * Function called with the lock on stream *****************************************************************************/gint GtkSetupMenus( intf_thread_t * p_intf ){ es_descriptor_t * p_audio_es; es_descriptor_t * p_spu_es; GtkWidget * p_menubar_menu; GtkWidget * p_popup_menu; guint i; p_intf->p_sys->b_chapter_update |= p_intf->p_sys->b_title_update; p_intf->p_sys->b_audio_update |= p_intf->p_sys->b_title_update | p_intf->p_sys->b_program_update; p_intf->p_sys->b_spu_update |= p_intf->p_sys->b_title_update | p_intf->p_sys->b_program_update; if( 1 ) { p_menubar_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_window ), "menubar_deinterlace" ) ); p_popup_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_popup ), "popup_deinterlace" ) ); p_intf->p_sys->b_deinterlace_update = VLC_TRUE; GtkDeinterlaceMenus( p_intf, p_menubar_menu, GtkMenubarDeinterlaceToggle ); p_intf->p_sys->b_deinterlace_update = VLC_TRUE; GtkDeinterlaceMenus( p_intf, p_popup_menu, GtkPopupDeinterlaceToggle ); p_intf->p_sys->b_deinterlace_update = VLC_FALSE; } if( p_intf->p_sys->b_program_update ) { pgrm_descriptor_t * p_pgrm; if( p_intf->p_sys->p_input->stream.p_new_program ) { p_pgrm = p_intf->p_sys->p_input->stream.p_new_program; } else { p_pgrm = p_intf->p_sys->p_input->stream.p_selected_program; } p_menubar_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_window ), "menubar_program" ) ); GtkProgramMenu( p_intf, p_menubar_menu, p_pgrm, GtkMenubarProgramToggle ); p_intf->p_sys->b_program_update = VLC_TRUE; p_popup_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_popup ), "popup_program" ) ); GtkProgramMenu( p_intf, p_popup_menu, p_pgrm, GtkPopupProgramToggle ); p_intf->p_sys->b_program_update = VLC_FALSE; } if( p_intf->p_sys->b_title_update ) { char psz_title[5]; p_menubar_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_window ), "menubar_title" ) ); GtkRadioMenu( p_intf, p_menubar_menu, NULL, _("Title"), 1, p_intf->p_sys->p_input->stream.i_area_nb - 1, p_intf->p_sys->p_input->stream.p_selected_area->i_id, GtkMenubarTitleToggle ); snprintf( psz_title, 4, "%d", p_intf->p_sys->p_input->stream.p_selected_area->i_id ); psz_title[ 4 ] = '\0'; gtk_label_set_text( p_intf->p_sys->p_label_title, psz_title ); p_intf->p_sys->b_title_update = VLC_FALSE; } if( p_intf->p_sys->b_chapter_update ) { char psz_chapter[5]; p_popup_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_popup ), "popup_navigation" ) ); GtkTitleMenu( p_intf, p_popup_menu, GtkPopupNavigationToggle );#if 0 GtkRadioMenu( p_intf, p_menubar_menu, NULL, _("Title"), 1, p_intf->p_sys->p_input->stream.i_area_nb - 1, p_intf->p_sys->p_input->stream.p_selected_area->i_id, on_menubar_chapter_toggle );#endif p_menubar_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_window ), "menubar_chapter" ) ); GtkRadioMenu( p_intf, p_menubar_menu, NULL, _("Chapter"), 1, p_intf->p_sys->p_input->stream.p_selected_area->i_part_nb - 1, p_intf->p_sys->p_input->stream.p_selected_area->i_part, GtkMenubarChapterToggle ); snprintf( psz_chapter, 4, "%d", p_intf->p_sys->p_input->stream.p_selected_area->i_part ); psz_chapter[ 4 ] = '\0'; gtk_label_set_text( p_intf->p_sys->p_label_chapter, psz_chapter ); p_intf->p_sys->i_part = p_intf->p_sys->p_input->stream.p_selected_area->i_part; p_intf->p_sys->b_chapter_update = VLC_FALSE; } /* look for selected ES */ p_audio_es = NULL; p_spu_es = NULL; for( i = 0 ; i < p_intf->p_sys->p_input->stream.i_selected_es_number ; i++ ) { if( p_intf->p_sys->p_input->stream.pp_selected_es[i]->i_cat == AUDIO_ES ) { p_audio_es = p_intf->p_sys->p_input->stream.pp_selected_es[i]; } if( p_intf->p_sys->p_input->stream.pp_selected_es[i]->i_cat == SPU_ES ) { p_spu_es = p_intf->p_sys->p_input->stream.pp_selected_es[i]; } } vlc_mutex_unlock( &p_intf->p_sys->p_input->stream.stream_lock ); /* audio menus */ if( p_intf->p_sys->b_audio_update ) { /* find audio root menu */ p_menubar_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_window ), "menubar_audio" ) ); p_popup_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_popup ), "popup_language" ) ); p_intf->p_sys->b_audio_update = VLC_TRUE; GtkLanguageMenus( p_intf, p_menubar_menu, p_audio_es, AUDIO_ES, GtkMenubarAudioToggle ); p_intf->p_sys->b_audio_update = VLC_TRUE; GtkLanguageMenus( p_intf, p_popup_menu, p_audio_es, AUDIO_ES, GtkPopupAudioToggle ); p_intf->p_sys->b_audio_update = VLC_FALSE; } /* sub picture menus */ if( p_intf->p_sys->b_spu_update ) { /* find spu root menu */ p_menubar_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_window ), "menubar_subpictures" ) ); p_popup_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_popup ), "popup_subpictures" ) ); p_intf->p_sys->b_spu_update = VLC_TRUE; GtkLanguageMenus( p_intf, p_menubar_menu, p_spu_es, SPU_ES, GtkMenubarSubtitleToggle ); p_intf->p_sys->b_spu_update = VLC_TRUE; GtkLanguageMenus( p_intf, p_popup_menu, p_spu_es, SPU_ES, GtkPopupSubtitleToggle ); p_intf->p_sys->b_spu_update = VLC_FALSE; } /* create audio channels and device menu (in menubar _and_ popup */ if( p_intf->p_sys->b_aout_update ) { aout_instance_t *p_aout; p_aout = (aout_instance_t*)vlc_object_find( p_intf, VLC_OBJECT_AOUT, FIND_ANYWHERE ); if( p_aout != NULL ) { vlc_value_t val; val.b_bool = VLC_FALSE; var_Set( (vlc_object_t *)p_aout, "intf-change", val ); /* audio-channels */ p_menubar_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_window ), "menubar_audio_channels" ) ); p_popup_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_popup ), "popup_audio_channels" ) ); GtkSetupVarMenu( p_intf, (vlc_object_t *)p_aout, p_popup_menu, "audio-channels", GtkPopupAoutChannelsToggle ); GtkSetupVarMenu( p_intf, (vlc_object_t *)p_aout, p_menubar_menu, "audio-channels", GtkPopupAoutChannelsToggle ); /* audio-device */ p_menubar_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_window ), "menubar_audio_device" ) ); p_popup_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_popup ), "popup_audio_device" ) ); GtkSetupVarMenu( p_intf, (vlc_object_t *)p_aout, p_popup_menu, "audio-device", GtkPopupAoutDeviceToggle ); GtkSetupVarMenu( p_intf, (vlc_object_t *)p_aout, p_menubar_menu, "audio-device", GtkPopupAoutDeviceToggle ); vlc_object_release( (vlc_object_t *)p_aout ); } p_intf->p_sys->b_aout_update = VLC_FALSE; } if( p_intf->p_sys->b_vout_update ) { vout_thread_t *p_vout; p_vout = (vout_thread_t*)vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); if( p_vout != NULL ) { vlc_value_t val; val.b_bool = VLC_FALSE; var_Set( (vlc_object_t *)p_vout, "intf-change", val ); /* video-device */ p_menubar_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_window ), "menubar_video_device" ) ); p_popup_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_popup ), "popup_video_device" ) ); GtkSetupVarMenu( p_intf, (vlc_object_t *)p_vout, p_popup_menu, "video-device", GtkPopupVoutDeviceToggle ); GtkSetupVarMenu( p_intf, (vlc_object_t *)p_vout, p_menubar_menu, "video-device", GtkPopupVoutDeviceToggle ); vlc_object_release( (vlc_object_t *)p_vout ); } p_intf->p_sys->b_vout_update = VLC_FALSE; } vlc_mutex_lock( &p_intf->p_sys->p_input->stream.stream_lock ); return TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -