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

📄 menus.cpp

📁 uclinux 下的vlc播放器源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    /* Build menu */    RefreshMenu( p_intf, p_intf->p_sys->p_navig_menu, hMenu, i,                 ppsz_varnames, pi_objects, NavigMenu_Events );}void RefreshSettingsMenu( intf_thread_t *p_intf, HMENU hMenu ){#define MAX_SETTINGS_ITEMS 10    vlc_object_t *p_object;    char *ppsz_varnames[MAX_SETTINGS_ITEMS];    int pi_objects[MAX_SETTINGS_ITEMS];    int i;    /* Delete old menu */    int count = wce_GetMenuItemCount( hMenu );    for( i = 0; i <= count; i++ ) RemoveMenu( hMenu, 0, MF_BYPOSITION );    if( p_intf->p_sys->p_settings_menu )        MenuItemExt::ClearList( p_intf->p_sys->p_settings_menu );    else p_intf->p_sys->p_settings_menu = new vector<MenuItemExt*>;    /* Initializations */    memset( pi_objects, 0, MAX_SETTINGS_ITEMS * sizeof(int) );    i = 0;    AppendMenu( hMenu, MF_STRING, ID_PREFERENCES, _T("&Preferences...") );    p_object = (vlc_object_t *)        vlc_object_find( p_intf, VLC_OBJECT_INTF, FIND_PARENT );    if( p_object != NULL )    {        ppsz_varnames[i] = "intf-switch";        pi_objects[i++] = p_object->i_object_id;        ppsz_varnames[i] = "intf-add";        pi_objects[i++] = p_object->i_object_id;        vlc_object_release( p_object );    }    /* Build menu */    RefreshMenu( p_intf, p_intf->p_sys->p_settings_menu, hMenu, i,                 ppsz_varnames, pi_objects, SettingsMenu_Events );}/***************************************************************************** * Refresh the menu. *****************************************************************************/void RefreshMenu( intf_thread_t *p_intf, vector<MenuItemExt*> *p_menu_list,                  HMENU hMenu , int i_count, char **ppsz_varnames,                   int *pi_objects, int i_start_id ){    vlc_object_t *p_object;    vlc_bool_t b_section_empty = VLC_FALSE;    int i;    /* Initializations */    int i_item_id = i_start_id;    for( i = 0; i < i_count; i++ )    {        if( !ppsz_varnames[i] )        {            if( b_section_empty )            {                AppendMenu( hMenu, MF_GRAYED | MF_STRING,                            MenuDummy_Event + i, _T("Empty") );            }            AppendMenu( hMenu, MF_SEPARATOR, 0, _T("") );            b_section_empty = VLC_TRUE;            continue;        }        if( !pi_objects[i] )        {            AppendMenu( hMenu, MF_GRAYED | MF_STRING,                        MenuDummy_Event, _FROMMB(ppsz_varnames[i]) );            b_section_empty = VLC_FALSE;            continue;        }        p_object = (vlc_object_t *)vlc_object_get( p_intf, pi_objects[i] );        if( p_object == NULL ) continue;        b_section_empty = VLC_FALSE;        CreateMenuItem( p_intf, p_menu_list, hMenu, ppsz_varnames[i],                        p_object, &i_item_id );        vlc_object_release( p_object );    }    /* Special case for empty menus */    if( wce_GetMenuItemCount(hMenu) == 0 || b_section_empty )    {        AppendMenu( hMenu, MF_GRAYED | MF_STRING,                    MenuDummy_Event + i, _T("Empty") );    }}/***************************************************************************** * Private methods. *****************************************************************************/void CreateMenuItem( intf_thread_t *p_intf, vector<MenuItemExt*> *p_menu_list,                     HMENU hMenu, char *psz_var, vlc_object_t *p_object,                     int *pi_item_id ){    MenuItemExt *pMenuItemExt;    HMENU hMenuItem;    vlc_value_t val, text;    int i_type;    /* Check the type of the object variable */    i_type = var_Type( p_object, psz_var );    switch( i_type & VLC_VAR_TYPE )    {    case VLC_VAR_VOID:    case VLC_VAR_BOOL:    case VLC_VAR_VARIABLE:    case VLC_VAR_STRING:    case VLC_VAR_INTEGER:    case VLC_VAR_FLOAT:        break;    default:        /* Variable doesn't exist or isn't handled */        return;    }    /* Make sure we want to display the variable */    if( i_type & VLC_VAR_HASCHOICE )    {        var_Change( p_object, psz_var, VLC_VAR_CHOICESCOUNT, &val, NULL );        if( val.i_int == 0 ) return;        if( (i_type & VLC_VAR_TYPE) != VLC_VAR_VARIABLE && val.i_int == 1 )            return;    }    /* Get the descriptive name of the variable */    var_Change( p_object, psz_var, VLC_VAR_GETTEXT, &text, NULL );    var_Get( p_object, psz_var, &val );    if( i_type & VLC_VAR_HASCHOICE )    {        hMenuItem = CreateChoicesMenu( p_intf, p_menu_list, psz_var,                                       p_object, pi_item_id );        AppendMenu( hMenu, MF_STRING | MF_POPUP, (UINT)hMenuItem,                    _FROMMB(text.psz_string ? text.psz_string : psz_var) );        if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) free( val.psz_string );        if( text.psz_string ) free( text.psz_string );        return;    }    switch( i_type & VLC_VAR_TYPE )    {    case VLC_VAR_VOID:        AppendMenu( hMenu, MF_STRING , ++(*pi_item_id),                    _FROMMB(text.psz_string ? text.psz_string : psz_var) );        pMenuItemExt = new MenuItemExt( p_intf, *pi_item_id, psz_var,                                        p_object->i_object_id, val, i_type );        p_menu_list->push_back( pMenuItemExt );        break;    case VLC_VAR_BOOL:        val.b_bool = !val.b_bool;        AppendMenu( hMenu, MF_STRING | MF_CHECKED, ++(*pi_item_id),                    _FROMMB(text.psz_string ? text.psz_string : psz_var) );        pMenuItemExt = new MenuItemExt( p_intf, *pi_item_id, psz_var,                                        p_object->i_object_id, val, i_type );        p_menu_list->push_back( pMenuItemExt );        CheckMenuItem( hMenu, *pi_item_id ,                       ( val.b_bool ? MF_UNCHECKED : MF_CHECKED ) |                       MF_BYCOMMAND );         break;    default:        if( text.psz_string ) free( text.psz_string );        return;    }    if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) free( val.psz_string );    if( text.psz_string ) free( text.psz_string );}HMENU CreateChoicesMenu( intf_thread_t *p_intf,                         vector<MenuItemExt*> *p_menu_list, char *psz_var,                          vlc_object_t *p_object, int *pi_item_id ){    MenuItemExt *pMenuItemExt;    vlc_value_t val, val_list, text_list;    int i_type, i;    HMENU hSubMenu = CreatePopupMenu();    /* Check the type of the object variable */    i_type = var_Type( p_object, psz_var );    /* Make sure we want to display the variable */    if( i_type & VLC_VAR_HASCHOICE )    {        var_Change( p_object, psz_var, VLC_VAR_CHOICESCOUNT, &val, NULL );        if( val.i_int == 0 ) return NULL;        if( (i_type & VLC_VAR_TYPE) != VLC_VAR_VARIABLE && val.i_int == 1 )            return NULL;    }    else    {        return NULL;    }    switch( i_type & VLC_VAR_TYPE )    {    case VLC_VAR_VOID:    case VLC_VAR_BOOL:    case VLC_VAR_VARIABLE:    case VLC_VAR_STRING:    case VLC_VAR_INTEGER:        break;    default:        /* Variable doesn't exist or isn't handled */        return NULL;    }    if( var_Get( p_object, psz_var, &val ) < 0 ) return NULL;    if( var_Change( p_object, psz_var, VLC_VAR_GETLIST,                    &val_list, &text_list ) < 0 )    {        if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) free( val.psz_string );        return NULL;    }    for( i = 0; i < val_list.p_list->i_count; i++ )    {        vlc_value_t another_val;        HMENU hMenuItem;        char *psz_tmp;        switch( i_type & VLC_VAR_TYPE )        {        case VLC_VAR_VARIABLE:            hMenuItem = CreateChoicesMenu( p_intf, p_menu_list,              val_list.p_list->p_values[i].psz_string, p_object, pi_item_id );            AppendMenu( hSubMenu, MF_STRING | MF_POPUP, (UINT)hMenuItem,                        _FROMMB(text_list.p_list->p_values[i].psz_string ?                          text_list.p_list->p_values[i].psz_string :                          val_list.p_list->p_values[i].psz_string) );            break;        case VLC_VAR_STRING:            another_val.psz_string =                strdup(val_list.p_list->p_values[i].psz_string);            AppendMenu( hSubMenu, MF_STRING, ++(*pi_item_id),                        _FROMMB(text_list.p_list->p_values[i].psz_string ?                          text_list.p_list->p_values[i].psz_string :                          val_list.p_list->p_values[i].psz_string) );            pMenuItemExt = new MenuItemExt( p_intf, *pi_item_id, psz_var,                          p_object->i_object_id, another_val, i_type );            p_menu_list->push_back( pMenuItemExt );            if( !(i_type & VLC_VAR_ISCOMMAND) && val.psz_string &&                !strcmp( val.psz_string,                         val_list.p_list->p_values[i].psz_string ) )              CheckMenuItem( hSubMenu, *pi_item_id, MF_CHECKED | MF_BYCOMMAND);            break;        case VLC_VAR_INTEGER:            asprintf( &psz_tmp, "%d", val_list.p_list->p_values[i].i_int );            AppendMenu( hSubMenu, MF_STRING, ++(*pi_item_id),                        _FROMMB(text_list.p_list->p_values[i].psz_string ?                          text_list.p_list->p_values[i].psz_string : psz_tmp));            pMenuItemExt = new MenuItemExt( p_intf, *pi_item_id, psz_var,                p_object->i_object_id, val_list.p_list->p_values[i], i_type );            p_menu_list->push_back( pMenuItemExt );            if( val_list.p_list->p_values[i].i_int == val.i_int )              CheckMenuItem( hSubMenu, *pi_item_id, MF_CHECKED | MF_BYCOMMAND);            break;        default:            break;        }    }    /* Clean up everything */    if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) free( val.psz_string );    var_Change( p_object, psz_var, VLC_VAR_FREELIST, &val_list, &text_list );    return hSubMenu;}int wce_GetMenuItemCount(HMENU hMenu){    const int MAX_NUM_ITEMS = 256;    int iPos, iCount;    MENUITEMINFO mii;    memset( (char *)&mii, 0, sizeof(MENUITEMINFO) );    mii.cbSize = sizeof(MENUITEMINFO);    iCount = 0;    for( iPos = 0; iPos < MAX_NUM_ITEMS; iPos++ )    {        if( !GetMenuItemInfo(hMenu, (UINT)iPos, TRUE, &mii) ) break;        iCount++;    }    return iCount;}void OnMenuEvent( intf_thread_t *p_intf, int id ){    MenuItemExt *p_menuitemext = NULL;    vector<MenuItemExt*>::iterator iter;    if( p_intf->p_sys->p_settings_menu )    for( iter = p_intf->p_sys->p_settings_menu->begin();         iter != p_intf->p_sys->p_settings_menu->end(); iter++ )        if( (*iter)->id == id )        {            p_menuitemext = *iter;            break;        }    if( p_intf->p_sys->p_audio_menu && !p_menuitemext )    for( iter = p_intf->p_sys->p_audio_menu->begin();         iter != p_intf->p_sys->p_audio_menu->end(); iter++ )         if( (*iter)->id == id )        {            p_menuitemext = *iter;            break;        }    if( p_intf->p_sys->p_video_menu && !p_menuitemext )    for( iter = p_intf->p_sys->p_video_menu->begin();         iter != p_intf->p_sys->p_video_menu->end(); iter++ )        if( (*iter)->id == id )        {            p_menuitemext = *iter;            break;        }    if( p_intf->p_sys->p_navig_menu && !p_menuitemext )    for( iter = p_intf->p_sys->p_navig_menu->begin();         iter != p_intf->p_sys->p_navig_menu->end(); iter++ )        if( (*iter)->id == id )        {            p_menuitemext = *iter;            break;        }    if( p_menuitemext )    {        vlc_object_t *p_object = (vlc_object_t *)            vlc_object_get( p_intf, p_menuitemext->i_object_id );        if( p_object == NULL ) return;        var_Set( p_object, p_menuitemext->psz_var, p_menuitemext->val );        int i_type = var_Type( p_object, p_menuitemext->psz_var );        switch( i_type & VLC_VAR_TYPE )        {        case VLC_VAR_VOID:        case VLC_VAR_BOOL:        case VLC_VAR_VARIABLE:        case VLC_VAR_STRING:        case VLC_VAR_INTEGER:            break;        default:            /* Variable doesn't exist or isn't handled */            return;        }        vlc_object_release( p_object );    }}/***************************************************************************** * A small helper class which encapsulate wxMenuitem with some other useful * things. *****************************************************************************/MenuItemExt::MenuItemExt( intf_thread_t *p_intf, int _id, char *_psz_var,                          int _i_object_id, vlc_value_t _val, int _i_val_type ){    /* Initializations */    id = _id;    p_intf = p_intf;    psz_var = strdup( _psz_var );    i_val_type = _i_val_type;    i_object_id = _i_object_id;    val = _val;};MenuItemExt::~MenuItemExt(){    if( psz_var ) free( psz_var );    if( ((i_val_type & VLC_VAR_TYPE) == VLC_VAR_STRING)        && val.psz_string ) free( val.psz_string );};void MenuItemExt::ClearList( vector<MenuItemExt*> *p_menu_list ){    vector<MenuItemExt*>::iterator iter;    if( !p_menu_list ) return;    for( iter = p_menu_list->begin(); iter != p_menu_list->end(); iter++ )    {        delete *iter;    }    p_menu_list->clear();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -