⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 4 页
字号:
                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 + -