📄 menu.c
字号:
config_PutPsz( p_intf, "deinterlace-mode", psz_mode ); vlc_object_release( p_vout ); } else config_PutPsz( p_intf, "deinterlace-mode", psz_mode ); }}static void GtkMenubarDeinterlaceToggle( GtkCheckMenuItem * menuitem, gpointer user_data ){ intf_thread_t *p_intf = GtkGetIntf( menuitem ); GtkLabel *p_label; char *psz_mode; GtkWidget *p_popup_menu; p_label = GTK_LABEL( ( GTK_BIN( menuitem )->child ) ); if( !p_intf->p_sys->b_deinterlace_update && menuitem->active ) { gtk_label_get( p_label, &psz_mode ); GtkDeinterlaceUpdate( p_intf, psz_mode ); p_intf->p_sys->b_deinterlace_update = VLC_TRUE; p_popup_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_popup ), "popup_deinterlace" ) ); GtkDeinterlaceMenus( p_intf, p_popup_menu, GtkPopupDeinterlaceToggle ); p_intf->p_sys->b_deinterlace_update = VLC_FALSE; }}static void GtkPopupDeinterlaceToggle( GtkCheckMenuItem * menuitem, gpointer user_data ){ intf_thread_t *p_intf = GtkGetIntf( menuitem ); GtkLabel *p_label; char *psz_mode; GtkWidget *p_menubar_menu; p_label = GTK_LABEL( ( GTK_BIN( menuitem )->child ) ); if( !p_intf->p_sys->b_deinterlace_update && menuitem->active ) { gtk_label_get( p_label, &psz_mode ); GtkDeinterlaceUpdate( p_intf, psz_mode ); p_intf->p_sys->b_deinterlace_update = VLC_TRUE; p_menubar_menu = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_window ), "menubar_deinterlace" ) ); GtkDeinterlaceMenus( p_intf, p_menubar_menu, GtkMenubarDeinterlaceToggle ); p_intf->p_sys->b_deinterlace_update = VLC_FALSE; }}/**************************************************************************** * Functions to generate menus ****************************************************************************//***************************************************************************** * GtkRadioMenu: update interactive menus of the interface ***************************************************************************** * Sets up menus with information from input * Warning: since this function is designed to be called by management * function, the interface lock has to be taken *****************************************************************************/static gint GtkRadioMenu( intf_thread_t * p_intf, GtkWidget * p_root, GSList * p_menu_group, char * psz_item_name, int i_start, int i_end, int i_selected, void( *pf_toggle )( GtkCheckMenuItem *, gpointer ) ){ char psz_name[ GTK_MENU_LABEL_SIZE ]; GtkWidget * p_menu; GtkWidget * p_submenu; GtkWidget * p_item_group; GtkWidget * p_item; GtkWidget * p_item_selected; GSList * p_group; gint 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 ); p_item_group = NULL; p_submenu = NULL; p_item_selected = NULL; p_group = p_menu_group; p_menu = gtk_menu_new(); gtk_object_set_data( GTK_OBJECT( p_menu ), "p_intf", p_intf ); for( i_item = i_start ; i_item <= i_end ; i_item++ ) { /* we group chapters in packets of ten for small screens */ if( ( i_item % 10 == i_start ) && ( i_end > i_start + 20 ) ) { if( i_item != i_start ) { gtk_menu_item_set_submenu( GTK_MENU_ITEM( p_item_group ), p_submenu ); gtk_menu_append( GTK_MENU( p_menu ), p_item_group ); } snprintf( psz_name, GTK_MENU_LABEL_SIZE, "%ss %d to %d", psz_item_name, i_item, i_item + 9 ); psz_name[ GTK_MENU_LABEL_SIZE - 1 ] = '\0'; p_item_group = gtk_menu_item_new_with_label( psz_name ); gtk_widget_show( p_item_group ); p_submenu = gtk_menu_new(); gtk_object_set_data( GTK_OBJECT( p_submenu ), "p_intf", p_intf ); } snprintf( psz_name, GTK_MENU_LABEL_SIZE, "%s %d", psz_item_name, i_item ); psz_name[ GTK_MENU_LABEL_SIZE - 1 ] = '\0'; p_item = gtk_radio_menu_item_new_with_label( p_group, psz_name ); p_group = gtk_radio_menu_item_group( GTK_RADIO_MENU_ITEM( p_item ) ); if( i_selected == i_item ) { p_item_selected = p_item; } gtk_widget_show( p_item ); /* setup signal hanling */ gtk_signal_connect( GTK_OBJECT( p_item ), "toggled", GTK_SIGNAL_FUNC( pf_toggle ), (gpointer)((long)(i_item)) ); if( i_end > i_start + 20 ) { gtk_menu_append( GTK_MENU( p_submenu ), p_item ); } else { gtk_menu_append( GTK_MENU( p_menu ), p_item ); } } if( i_end > i_start + 20 ) { gtk_menu_item_set_submenu( GTK_MENU_ITEM( p_item_group ), p_submenu ); gtk_menu_append( GTK_MENU( p_menu ), p_item_group ); } /* link the new menu to the title menu item */ gtk_menu_item_set_submenu( GTK_MENU_ITEM( p_root ), p_menu ); /* toggle currently selected chapter * We have to release the lock since input_ToggleES needs it */ if( p_item_selected != NULL ) { gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( p_item_selected ), TRUE ); } /* be sure that menu is sensitive, if there are several items */ if( i_end > i_start ) { gtk_widget_set_sensitive( p_root, TRUE ); } return TRUE;}/***************************************************************************** * GtkProgramMenu: update the programs menu of the interface ***************************************************************************** * Builds the program menu according to what have been found in the PAT * by the input. Usefull for multi-programs streams such as DVB ones. *****************************************************************************/static gint GtkProgramMenu( gpointer p_data, GtkWidget * p_root, pgrm_descriptor_t * p_pgrm, void(*pf_toggle )( GtkCheckMenuItem *, gpointer ) ){ intf_thread_t * p_intf; GtkWidget * p_menu; GtkWidget * p_item; GtkWidget * p_item_active; GSList * p_group; char psz_name[ GTK_MENU_LABEL_SIZE ]; guint i; /* cast */ 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 ); p_item_active = NULL; /* create a set of program buttons and append them to the container */ for( i = 0 ; i < p_intf->p_sys->p_input->stream.i_pgrm_number ; i++ ) { snprintf( psz_name, GTK_MENU_LABEL_SIZE, "id %d", p_intf->p_sys->p_input->stream.pp_programs[i]->i_number ); psz_name[GTK_MENU_LABEL_SIZE-1] = '\0'; p_item = gtk_radio_menu_item_new_with_label( p_group, psz_name ); p_group = gtk_radio_menu_item_group( GTK_RADIO_MENU_ITEM( p_item ) ); if( p_pgrm == p_intf->p_sys->p_input->stream.pp_programs[i] ) { /* don't lose p_item when we append into menu */ p_item_active = p_item; } gtk_widget_show( p_item ); /* setup signal hanling */ gtk_signal_connect( GTK_OBJECT( p_item ), "toggled", GTK_SIGNAL_FUNC( pf_toggle ), (gpointer)(ptrdiff_t)( p_intf->p_sys->p_input-> stream.pp_programs[i]->i_number ) ); 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 ); /* activation 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 more than 1 program */ if( p_intf->p_sys->p_input->stream.i_pgrm_number > 1 ) { gtk_widget_set_sensitive( p_root, TRUE ); } return TRUE;}/***************************************************************************** * GtkLanguageMenus: update interactive menus of the interface ***************************************************************************** * Sets up menus with information from input: * -languages * -sub-pictures * Warning: since this function is designed to be called by management * function, the interface lock has to be taken *****************************************************************************/static gint GtkLanguageMenus( gpointer p_data, GtkWidget * p_root, es_descriptor_t * p_es, gint i_cat, 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; char psz_name[ GTK_MENU_LABEL_SIZE ]; guint i_item; guint i; 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 */ snprintf( psz_name, GTK_MENU_LABEL_SIZE, _("None") ); psz_name[ GTK_MENU_LABEL_SIZE - 1 ] = '\0'; p_item = gtk_radio_menu_item_new_with_label( p_group, psz_name ); 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 ); p_item_active = NULL; i_item = 0; vlc_mutex_lock( &p_intf->p_sys->p_input->stream.stream_lock );#define ES p_intf->p_sys->p_input->stream.pp_es[i] /* create a set of language buttons and append them to the container */ for( i = 0 ; i < p_intf->p_sys->p_input->stream.i_es_number ; i++ ) { if( ( ES->i_cat == i_cat ) && ( !ES->p_pgrm || ES->p_pgrm == p_intf->p_sys->p_input->stream.p_selected_program ) ) { i_item++; if( !p_intf->p_sys->p_input->stream.pp_es[i]->psz_desc || !*p_intf->p_sys->p_input->stream.pp_es[i]->psz_desc ) { snprintf( psz_name, GTK_MENU_LABEL_SIZE, "Language %d", i_item ); psz_name[ GTK_MENU_LABEL_SIZE - 1 ] = '\0'; } else { strcpy( psz_name, p_intf->p_sys->p_input->stream.pp_es[i]->psz_desc ); } p_item = gtk_radio_menu_item_new_with_label( p_group, psz_name ); p_group = gtk_radio_menu_item_group( GTK_RADIO_MENU_ITEM( p_item ) ); if( p_es == p_intf->p_sys->p_input->stream.pp_es[i] ) { /* don't lose p_item when we append into menu */ p_item_active = p_item; } gtk_widget_show( p_item ); /* setup signal hanling */ gtk_signal_connect( GTK_OBJECT( p_item ), "toggled", GTK_SIGNAL_FUNC( pf_toggle ), (gpointer)( p_intf->p_sys->p_input->stream.pp_es[i] ) ); gtk_menu_append( GTK_MENU( p_menu ), p_item ); } } vlc_mutex_unlock( &p_intf->p_sys->p_input->stream.stream_lock ); /* 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -