menus.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:26k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * menus.cpp : WinCE gui plugin for VLC
  3.  *****************************************************************************
  4.  * Copyright (C) 2000-2004 the VideoLAN team
  5.  * $Id: 3cebdc7cb5b46f26aa7154c53e150ac4cc696066 $
  6.  *
  7.  * Authors: Marodon Cedric <cedric_marodon@yahoo.fr>
  8.  *          Gildas Bazin <gbazin@videolan.org>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. /*****************************************************************************
  25.  * Preamble
  26.  *****************************************************************************/
  27. #ifdef HAVE_CONFIG_H
  28. # include "config.h"
  29. #endif
  30. #include <vlc_common.h>
  31. #include <vlc_interface.h>
  32. #include <vlc_playlist.h>
  33. #include "wince.h"
  34. /*****************************************************************************
  35.  * Event Table.
  36.  *****************************************************************************/
  37. /* IDs for the controls and the menu commands */
  38. enum
  39. {
  40.     /* menu items */
  41.     MenuDummy_Event = 1000,
  42.     OpenFileSimple_Event = 1100,
  43.     OpenFile_Event,
  44.     OpenDisc_Event,
  45.     OpenNet_Event,
  46.     FirstAutoGenerated_Event = 1999,
  47.     SettingsMenu_Events = 2000,
  48.     AudioMenu_Events = 3000,
  49.     VideoMenu_Events = 4000,
  50.     NavigMenu_Events = 5000,
  51.     PopupMenu_Events = 6000
  52. };
  53. HMENU OpenStreamMenu( intf_thread_t *p_intf )
  54. {
  55.     HMENU hmenu = CreatePopupMenu();
  56.     AppendMenu( hmenu, MF_STRING, ID_FILE_QUICKOPEN,
  57.                 _T("Quick &Open File...") );
  58.     AppendMenu( hmenu, MF_STRING, ID_FILE_OPENFILE,
  59.                 _T("Open &File...") );
  60.     AppendMenu( hmenu, MF_STRING, ID_FILE_OPENNET,
  61.                 _T("Open &Network Stream...") );
  62.     return hmenu;
  63. }
  64. HMENU MiscMenu( intf_thread_t *p_intf )
  65. {
  66.     HMENU hmenu = CreatePopupMenu();
  67.     AppendMenu( hmenu, MF_STRING, ID_VIEW_STREAMINFO, _T("Media &Info...") );
  68.     AppendMenu( hmenu, MF_STRING, ID_VIEW_MESSAGES, _T("&Messages...") );
  69.     AppendMenu( hmenu, MF_STRING, ID_PREFERENCES, _T("&Preferences...") );
  70.     return hmenu;
  71. }
  72. void PopupMenu( intf_thread_t *p_intf, HWND p_parent, POINT point )
  73. {
  74. #define MAX_POPUP_ITEMS 45
  75.     vlc_object_t *p_object, *p_input;
  76.     char *ppsz_varnames[MAX_POPUP_ITEMS];
  77.     vlc_object_t * pi_objects[MAX_POPUP_ITEMS];
  78.     int i = 0, i_last_separator = 0;
  79.     /* Initializations */
  80.     memset( pi_objects, 0, MAX_POPUP_ITEMS * sizeof(vlc_object_t *) );
  81.     ppsz_varnames[i] = "VLC media player";
  82.     pi_objects[i++] = 0;
  83.     ppsz_varnames[i++] = NULL; /* Separator */
  84.     i_last_separator = i;
  85.     /* Input menu */
  86.     p_object = (vlc_object_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT,
  87.                                                 FIND_ANYWHERE );
  88.     if( p_object != NULL )
  89.     {
  90.         ppsz_varnames[i] = "bookmark";
  91.         pi_objects[i++] = p_object;
  92.         ppsz_varnames[i] = "title";
  93.         pi_objects[i++] = p_object;
  94.         ppsz_varnames[i] = "chapter";
  95.         pi_objects[i++] = p_object;
  96.         ppsz_varnames[i] = "program";
  97.         pi_objects[i++] = p_object;
  98.         ppsz_varnames[i] = "navigation";
  99.         pi_objects[i++] = p_object;
  100.         ppsz_varnames[i] = "dvd_menus";
  101.         pi_objects[i++] = p_object;
  102.         ppsz_varnames[i] = "video-es";
  103.         pi_objects[i++] = p_object;
  104.         ppsz_varnames[i] = "audio-es";
  105.         pi_objects[i++] = p_object;
  106.         ppsz_varnames[i] = "spu-es";
  107.         pi_objects[i++] = p_object;
  108.     }
  109.     p_input = p_object;
  110.     if( !p_input ) goto interfacemenu;
  111.     /* Video menu */
  112.     if( i != i_last_separator ) ppsz_varnames[i++] = NULL; /* Separator */
  113.     i_last_separator = i;
  114.     p_object = (vlc_object_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT,
  115.                                                 FIND_ANYWHERE );
  116.     if( p_object != NULL )
  117.     {
  118.         vlc_object_t *p_dec_obj;
  119.         ppsz_varnames[i] = "fullscreen";
  120.         pi_objects[i++] = p_object;
  121.         ppsz_varnames[i] = "zoom";
  122.         pi_objects[i++] = p_object;
  123.         ppsz_varnames[i] = "deinterlace";
  124.         pi_objects[i++] = p_object;
  125.         ppsz_varnames[i] = "aspect-ratio";
  126.         pi_objects[i++] = p_object;
  127.         ppsz_varnames[i] = "crop";
  128.         pi_objects[i++] = p_object;
  129.         ppsz_varnames[i] = "video-on-top";
  130.         pi_objects[i++] = p_object;
  131.         ppsz_varnames[i] = "directx-wallpaper";
  132.         pi_objects[i++] = p_object;
  133.         ppsz_varnames[i] = "video-snapshot";
  134.         pi_objects[i++] = p_object;
  135.         p_dec_obj = (vlc_object_t *)vlc_object_find( p_object,
  136.                                                      VLC_OBJECT_DECODER,
  137.                                                      FIND_PARENT );
  138.         if( p_dec_obj != NULL )
  139.         {
  140.             ppsz_varnames[i] = "ffmpeg-pp-q";
  141.             pi_objects[i++] = p_dec_obj;
  142.             vlc_object_release( p_dec_obj );
  143.         }
  144.         vlc_object_release( p_object );
  145.     }
  146.     /* Audio menu */
  147.     if( i != i_last_separator ) ppsz_varnames[i++] = NULL; /* Separator */
  148.     i_last_separator  = i;
  149.     p_object = (vlc_object_t *)vlc_object_find( p_intf, VLC_OBJECT_AOUT,
  150.                                                 FIND_ANYWHERE );
  151.     if( p_object != NULL )
  152.     {
  153.         ppsz_varnames[i] = "audio-device";
  154.         pi_objects[i++] = p_object;
  155.         ppsz_varnames[i] = "audio-channels";
  156.         pi_objects[i++] = p_object;
  157.         ppsz_varnames[i] = "visual";
  158.         pi_objects[i++] = p_object;
  159.         ppsz_varnames[i] = "equalizer";
  160.         pi_objects[i++] = p_object;
  161.         vlc_object_release( p_object );
  162.     }
  163.  interfacemenu:
  164.     /* Interface menu */
  165.     if( i != i_last_separator ) ppsz_varnames[i++] = NULL; /* Separator */
  166.     i_last_separator = i;
  167.     /* Build menu */
  168.     vector<MenuItemExt*> popup_menu;
  169.     HMENU hmenu = CreatePopupMenu();
  170.     RefreshMenu( p_intf, &popup_menu, hmenu, i,
  171.                  ppsz_varnames, pi_objects, PopupMenu_Events );
  172.     MenuItemExt::ClearList( &popup_menu );
  173.     /* Add static entries */
  174.     if( p_input != NULL )
  175.     {
  176.         vlc_value_t val;
  177.         AppendMenu( hmenu, MF_SEPARATOR, 0, _T("") );
  178.         AppendMenu( hmenu, MF_STRING, StopStream_Event, _T("Stop") );
  179.         AppendMenu( hmenu, MF_STRING, PrevStream_Event, _T("Previous") );
  180.         AppendMenu( hmenu, MF_STRING, NextStream_Event, _T("Next") );
  181.         var_Get( p_input, "state", &val );
  182.         if( val.i_int == PAUSE_S )
  183.             AppendMenu( hmenu, MF_STRING, PlayStream_Event, _T("Play") );
  184.         else
  185.             AppendMenu( hmenu, MF_STRING, PlayStream_Event, _T("Pause") );
  186.         vlc_object_release( p_input );
  187.     }
  188.     else
  189.     {
  190.         playlist_t * p_playlist = pl_Hold( p_intf );
  191.         if( p_playlist && !playlist_IsEmpty( p_playlist ) )
  192.         {
  193.             AppendMenu( hmenu, MF_SEPARATOR, 0, _T("") );
  194.             AppendMenu( hmenu, MF_STRING, PlayStream_Event, _T("Play") );
  195.         }
  196.         if( p_playlist ) pl_Release( p_intf );
  197.     }
  198.     AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)MiscMenu( p_intf ),
  199.                 _T("Miscellaneous") );
  200.     AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)OpenStreamMenu( p_intf ),
  201.                 _T("Open") );
  202.     TrackPopupMenu( hmenu, 0, point.x, point.y, 0, p_parent, 0 );
  203.     PostMessage( p_parent, WM_NULL, 0, 0 );
  204.     DestroyMenu( hmenu );
  205. }
  206. void RefreshAudioMenu( intf_thread_t *p_intf, HMENU hMenu )
  207. {
  208. #define MAX_AUDIO_ITEMS 10
  209.     vlc_object_t *p_object;
  210.     char *ppsz_varnames[MAX_AUDIO_ITEMS];
  211.     vlc_object_t * pi_objects[MAX_AUDIO_ITEMS];
  212.     int i;
  213.     /* Delete old menu */
  214.     int count = wce_GetMenuItemCount( hMenu );
  215.     for( i = 0; i <= count; i++ ) RemoveMenu( hMenu, 0, MF_BYPOSITION );
  216.     if( p_intf->p_sys->p_audio_menu )
  217.         MenuItemExt::ClearList( p_intf->p_sys->p_audio_menu );
  218.     else p_intf->p_sys->p_audio_menu = new vector<MenuItemExt*>;
  219.     /* Initializations */
  220.     memset( pi_objects, 0, MAX_AUDIO_ITEMS * sizeof(vlc_object_t *) );
  221.     i = 0;
  222.     p_object = (vlc_object_t *)
  223.         vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE );
  224.     if( p_object != NULL )
  225.     {
  226.         ppsz_varnames[i] = "audio-es";
  227.         pi_objects[i++] = p_object;
  228.         vlc_object_release( p_object );
  229.     }
  230.     p_object = (vlc_object_t *)
  231.         vlc_object_find( p_intf, VLC_OBJECT_AOUT, FIND_ANYWHERE );
  232.     if( p_object != NULL )
  233.     {
  234.         ppsz_varnames[i] = "audio-device";
  235.         pi_objects[i++] = p_object;
  236.         ppsz_varnames[i] = "audio-channels";
  237.         pi_objects[i++] = p_object;
  238.         ppsz_varnames[i] = "visual";
  239.         pi_objects[i++] = p_object;
  240.         vlc_object_release( p_object );
  241.     }
  242.     /* Build menu */
  243.     RefreshMenu( p_intf, p_intf->p_sys->p_audio_menu,
  244.                  hMenu, i, ppsz_varnames, pi_objects, AudioMenu_Events );
  245. }
  246. void RefreshVideoMenu( intf_thread_t *p_intf, HMENU hMenu )
  247. {
  248. #define MAX_VIDEO_ITEMS 15
  249.     vlc_object_t *p_object;
  250.     char *ppsz_varnames[MAX_VIDEO_ITEMS];
  251.     vlc_object_t * pi_objects[MAX_VIDEO_ITEMS];
  252.     int i;
  253.     /* Delete old menu */
  254.     int count = wce_GetMenuItemCount( hMenu );
  255.     for( i = 0; i <= count; i++ ) RemoveMenu( hMenu, 0, MF_BYPOSITION );
  256.     if( p_intf->p_sys->p_video_menu )
  257.         MenuItemExt::ClearList( p_intf->p_sys->p_video_menu );
  258.     else p_intf->p_sys->p_video_menu = new vector<MenuItemExt*>;
  259.     /* Initializations */
  260.     memset( pi_objects, 0, MAX_VIDEO_ITEMS * sizeof(vlc_object_t *) );
  261.     i = 0;
  262.     p_object = (vlc_object_t *)
  263.         vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE );
  264.     if( p_object != NULL )
  265.     {
  266.         ppsz_varnames[i] = "video-es";
  267.         pi_objects[i++] = p_object;
  268.         ppsz_varnames[i] = "spu-es";
  269.         pi_objects[i++] = p_object;
  270.         vlc_object_release( p_object );
  271.     }
  272.     p_object = (vlc_object_t *)
  273.         vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE );
  274.     if( p_object != NULL )
  275.     {
  276.         vlc_object_t *p_dec_obj;
  277.         ppsz_varnames[i] = "fullscreen";
  278.         pi_objects[i++] = p_object;
  279. #ifdef WINCE
  280.         ppsz_varnames[i] = "transform";
  281.         pi_objects[i++] = p_object;
  282. #endif
  283.         ppsz_varnames[i] = "zoom";
  284.         pi_objects[i++] = p_object;
  285.         ppsz_varnames[i] = "deinterlace";
  286.         pi_objects[i++] = p_object;
  287.         ppsz_varnames[i] = "aspect-ratio";
  288.         pi_objects[i++] = p_object;
  289.         ppsz_varnames[i] = "crop";
  290.         pi_objects[i++] = p_object;
  291.         ppsz_varnames[i] = "directx-on-top";
  292.         pi_objects[i++] = p_object;
  293.         p_dec_obj = (vlc_object_t *)
  294.             vlc_object_find( p_object, VLC_OBJECT_DECODER, FIND_PARENT );
  295.         if( p_dec_obj != NULL )
  296.         {
  297.             ppsz_varnames[i] = "ffmpeg-pp-q";
  298.             pi_objects[i++] = p_dec_obj;
  299.             vlc_object_release( p_dec_obj );
  300.         }
  301.         vlc_object_release( p_object );
  302.     }
  303.     /* Build menu */
  304.     RefreshMenu( p_intf, p_intf->p_sys->p_video_menu, hMenu, i,
  305.                  ppsz_varnames, pi_objects, VideoMenu_Events );
  306. }
  307. void RefreshNavigMenu( intf_thread_t *p_intf, HMENU hMenu )
  308. {
  309. #define MAX_NAVIG_ITEMS 10
  310.     vlc_object_t *p_object;
  311.     char *ppsz_varnames[MAX_NAVIG_ITEMS];
  312.     vlc_object_t * pi_objects[MAX_NAVIG_ITEMS];
  313.     int i;
  314.     /* Delete old menu */
  315.     int count = wce_GetMenuItemCount( hMenu );
  316.     for( i = 0; i <= count; i++ ) RemoveMenu( hMenu, 0, MF_BYPOSITION );
  317.  
  318.     if( p_intf->p_sys->p_navig_menu )
  319.         MenuItemExt::ClearList( p_intf->p_sys->p_navig_menu );
  320.     else p_intf->p_sys->p_navig_menu = new vector<MenuItemExt*>;
  321.     /* Initializations */
  322.     memset( pi_objects, 0, MAX_NAVIG_ITEMS * sizeof(vlc_object_t *) );
  323.     i = 0;
  324.     p_object = (vlc_object_t *)
  325.         vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE );
  326.     if( p_object != NULL )
  327.     {
  328.         ppsz_varnames[i] = "title";
  329.         pi_objects[i++] = p_object;
  330.         ppsz_varnames[i] = "chapter";
  331.         pi_objects[i++] = p_object;
  332.         ppsz_varnames[i] = "program";
  333.         pi_objects[i++] = p_object;
  334.         ppsz_varnames[i] = "navigation";
  335.         pi_objects[i++] = p_object;
  336.         ppsz_varnames[i] = "dvd_menus";
  337.         pi_objects[i++] = p_object;
  338.         ppsz_varnames[i] = "prev-title";
  339.         pi_objects[i++] = p_object;
  340.         ppsz_varnames[i] = "next-title";
  341.         pi_objects[i++] = p_object;
  342.         ppsz_varnames[i] = "prev-chapter";
  343.         pi_objects[i++] = p_object;
  344.         ppsz_varnames[i] = "next-chapter";
  345.         pi_objects[i++] = p_object;
  346.         vlc_object_release( p_object );
  347.     }
  348.     /* Build menu */
  349.     RefreshMenu( p_intf, p_intf->p_sys->p_navig_menu, hMenu, i,
  350.                  ppsz_varnames, pi_objects, NavigMenu_Events );
  351. }
  352. void RefreshSettingsMenu( intf_thread_t *p_intf, HMENU hMenu )
  353. {
  354. #define MAX_SETTINGS_ITEMS 10
  355.     vlc_object_t *p_object;
  356.     char *ppsz_varnames[MAX_SETTINGS_ITEMS];
  357.     vlc_object_t * pi_objects[MAX_SETTINGS_ITEMS];
  358.     int i;
  359.     /* Delete old menu */
  360.     int count = wce_GetMenuItemCount( hMenu );
  361.     for( i = 0; i <= count; i++ ) RemoveMenu( hMenu, 0, MF_BYPOSITION );
  362.     if( p_intf->p_sys->p_settings_menu )
  363.         MenuItemExt::ClearList( p_intf->p_sys->p_settings_menu );
  364.     else p_intf->p_sys->p_settings_menu = new vector<MenuItemExt*>;
  365.     /* Initializations */
  366.     memset( pi_objects, 0, MAX_SETTINGS_ITEMS * sizeof(vlc_object_t *) );
  367.     i = 0;
  368.     AppendMenu( hMenu, MF_STRING, ID_PREFERENCES, _T("&Preferences...") );
  369. /* Other interfaces */
  370.     /*FIXME: copy the Qt way of mapping menus and objects */
  371.     /*p_object = (vlc_object_t *) NULL;
  372.         //vlc_object_find_name( p_intf, "wince", FIND_PARENT );
  373.     if( p_object != NULL )
  374.     {
  375.         ppsz_varnames[i] = "intf-add";
  376.         pi_objects[i++] = p_object;
  377.         vlc_object_release( p_object );
  378.     }*/
  379.     /* Build menu */
  380.     RefreshMenu( p_intf, p_intf->p_sys->p_settings_menu, hMenu, i,
  381.                  ppsz_varnames, pi_objects, SettingsMenu_Events );
  382. }
  383. /*****************************************************************************
  384.  * Refresh the menu.
  385.  *****************************************************************************/
  386. void RefreshMenu( intf_thread_t *p_intf, vector<MenuItemExt*> *p_menu_list,
  387.                   HMENU hMenu , int i_count, char **ppsz_varnames,
  388.                   vlc_object_t **pi_objects, int i_start_id )
  389. {
  390.     vlc_object_t *p_object;
  391.     bool b_section_empty = false;
  392.     int i;
  393.     /* Initializations */
  394.     int i_item_id = i_start_id;
  395.     for( i = 0; i < i_count; i++ )
  396.     {
  397.         if( !ppsz_varnames[i] )
  398.         {
  399.             if( b_section_empty )
  400.             {
  401.                 AppendMenu( hMenu, MF_GRAYED | MF_STRING,
  402.                             MenuDummy_Event + i, _T("Empty") );
  403.             }
  404.             AppendMenu( hMenu, MF_SEPARATOR, 0, _T("") );
  405.             b_section_empty = true;
  406.             continue;
  407.         }
  408.         if( !pi_objects[i] )
  409.         {
  410.             AppendMenu( hMenu, MF_GRAYED | MF_STRING,
  411.                         MenuDummy_Event, _FROMMB(ppsz_varnames[i]) );
  412.             b_section_empty = false;
  413.             continue;
  414.         }
  415.         p_object = pi_objects[i];
  416.         if( p_object == NULL ) continue;
  417.         b_section_empty = false;
  418.         CreateMenuItem( p_intf, p_menu_list, hMenu, ppsz_varnames[i],
  419.                         p_object, &i_item_id );
  420.         vlc_object_release( p_object );
  421.     }
  422.     /* Special case for empty menus */
  423.     if( wce_GetMenuItemCount(hMenu) == 0 || b_section_empty )
  424.     {
  425.         AppendMenu( hMenu, MF_GRAYED | MF_STRING,
  426.                     MenuDummy_Event + i, _T("Empty") );
  427.     }
  428. }
  429. /*****************************************************************************
  430.  * Private methods.
  431.  *****************************************************************************/
  432. void CreateMenuItem( intf_thread_t *p_intf, vector<MenuItemExt*> *p_menu_list,
  433.                      HMENU hMenu, char *psz_var, vlc_object_t *p_object,
  434.                      int *pi_item_id )
  435. {
  436.     MenuItemExt *pMenuItemExt;
  437.     HMENU hMenuItem;
  438.     vlc_value_t val, text;
  439.     int i_type;
  440.     /* Check the type of the object variable */
  441.     i_type = var_Type( p_object, psz_var );
  442.     switch( i_type & VLC_VAR_TYPE )
  443.     {
  444.     case VLC_VAR_VOID:
  445.     case VLC_VAR_BOOL:
  446.     case VLC_VAR_VARIABLE:
  447.     case VLC_VAR_STRING:
  448.     case VLC_VAR_INTEGER:
  449.     case VLC_VAR_FLOAT:
  450.         break;
  451.     default:
  452.         /* Variable doesn't exist or isn't handled */
  453.         return;
  454.     }
  455.     /* Make sure we want to display the variable */
  456.     if( i_type & VLC_VAR_HASCHOICE )
  457.     {
  458.         var_Change( p_object, psz_var, VLC_VAR_CHOICESCOUNT, &val, NULL );
  459.         if( val.i_int == 0 ) return;
  460.         if( (i_type & VLC_VAR_TYPE) != VLC_VAR_VARIABLE && val.i_int == 1 )
  461.             return;
  462.     }
  463.     /* Get the descriptive name of the variable */
  464.     var_Change( p_object, psz_var, VLC_VAR_GETTEXT, &text, NULL );
  465.     var_Get( p_object, psz_var, &val );
  466.     if( i_type & VLC_VAR_HASCHOICE )
  467.     {
  468.         hMenuItem = CreateChoicesMenu( p_intf, p_menu_list, psz_var,
  469.                                        p_object, pi_item_id );
  470.         AppendMenu( hMenu, MF_STRING | MF_POPUP, (UINT)hMenuItem,
  471.                     _FROMMB(text.psz_string ? text.psz_string : psz_var) );
  472.         if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) free( val.psz_string );
  473.         free( text.psz_string );
  474.         return;
  475.     }
  476.     switch( i_type & VLC_VAR_TYPE )
  477.     {
  478.     case VLC_VAR_VOID:
  479.         AppendMenu( hMenu, MF_STRING , ++(*pi_item_id),
  480.                     _FROMMB(text.psz_string ? text.psz_string : psz_var) );
  481.         pMenuItemExt = new MenuItemExt( p_intf, *pi_item_id, psz_var,
  482.                                         p_object, val, i_type );
  483.         p_menu_list->push_back( pMenuItemExt );
  484.         break;
  485.     case VLC_VAR_BOOL:
  486.         val.b_bool = !val.b_bool;
  487.         AppendMenu( hMenu, MF_STRING | MF_CHECKED, ++(*pi_item_id),
  488.                     _FROMMB(text.psz_string ? text.psz_string : psz_var) );
  489.         pMenuItemExt = new MenuItemExt( p_intf, *pi_item_id, psz_var,
  490.                                         p_object, val, i_type );
  491.         p_menu_list->push_back( pMenuItemExt );
  492.         CheckMenuItem( hMenu, *pi_item_id ,
  493.                        ( val.b_bool ? MF_UNCHECKED : MF_CHECKED ) |
  494.                        MF_BYCOMMAND );
  495.         break;
  496.     default:
  497.         free( text.psz_string );
  498.         return;
  499.     }
  500.     if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) free( val.psz_string );
  501.     free( text.psz_string );
  502. }
  503. HMENU CreateChoicesMenu( intf_thread_t *p_intf,
  504.                          vector<MenuItemExt*> *p_menu_list, char *psz_var,
  505.                          vlc_object_t *p_object, int *pi_item_id )
  506. {
  507.     MenuItemExt *pMenuItemExt;
  508.     vlc_value_t val, val_list, text_list;
  509.     int i_type, i;
  510.     HMENU hSubMenu = CreatePopupMenu();
  511.     /* Check the type of the object variable */
  512.     i_type = var_Type( p_object, psz_var );
  513.     /* Make sure we want to display the variable */
  514.     if( i_type & VLC_VAR_HASCHOICE )
  515.     {
  516.         var_Change( p_object, psz_var, VLC_VAR_CHOICESCOUNT, &val, NULL );
  517.         if( val.i_int == 0 ) return NULL;
  518.         if( (i_type & VLC_VAR_TYPE) != VLC_VAR_VARIABLE && val.i_int == 1 )
  519.             return NULL;
  520.     }
  521.     else
  522.     {
  523.         return NULL;
  524.     }
  525.     switch( i_type & VLC_VAR_TYPE )
  526.     {
  527.     case VLC_VAR_VOID:
  528.     case VLC_VAR_BOOL:
  529.     case VLC_VAR_VARIABLE:
  530.     case VLC_VAR_STRING:
  531.     case VLC_VAR_INTEGER:
  532.         break;
  533.     default:
  534.         /* Variable doesn't exist or isn't handled */
  535.         return NULL;
  536.     }
  537.     if( var_Get( p_object, psz_var, &val ) < 0 ) return NULL;
  538.     if( var_Change( p_object, psz_var, VLC_VAR_GETLIST,
  539.                     &val_list, &text_list ) < 0 )
  540.     {
  541.         if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) free( val.psz_string );
  542.         return NULL;
  543.     }
  544.     for( i = 0; i < val_list.p_list->i_count; i++ )
  545.     {
  546.         vlc_value_t another_val;
  547.         HMENU hMenuItem;
  548.         char *psz_tmp;
  549.         switch( i_type & VLC_VAR_TYPE )
  550.         {
  551.         case VLC_VAR_VARIABLE:
  552.             hMenuItem = CreateChoicesMenu( p_intf, p_menu_list,
  553.               val_list.p_list->p_values[i].psz_string, p_object, pi_item_id );
  554.             AppendMenu( hSubMenu, MF_STRING | MF_POPUP, (UINT)hMenuItem,
  555.                         _FROMMB(text_list.p_list->p_values[i].psz_string ?
  556.                           text_list.p_list->p_values[i].psz_string :
  557.                           val_list.p_list->p_values[i].psz_string) );
  558.             break;
  559.         case VLC_VAR_STRING:
  560.             another_val.psz_string =
  561.                 strdup(val_list.p_list->p_values[i].psz_string);
  562.             AppendMenu( hSubMenu, MF_STRING, ++(*pi_item_id),
  563.                         _FROMMB(text_list.p_list->p_values[i].psz_string ?
  564.                           text_list.p_list->p_values[i].psz_string :
  565.                           val_list.p_list->p_values[i].psz_string) );
  566.             pMenuItemExt = new MenuItemExt( p_intf, *pi_item_id, psz_var,
  567.                           p_object, another_val, i_type );
  568.             p_menu_list->push_back( pMenuItemExt );
  569.             if( !(i_type & VLC_VAR_ISCOMMAND) && val.psz_string &&
  570.                 !strcmp( val.psz_string,
  571.                          val_list.p_list->p_values[i].psz_string ) )
  572.               CheckMenuItem( hSubMenu, *pi_item_id, MF_CHECKED | MF_BYCOMMAND);
  573.             break;
  574.         case VLC_VAR_INTEGER:
  575.             asprintf( &psz_tmp, "%d", val_list.p_list->p_values[i].i_int );
  576.             AppendMenu( hSubMenu, MF_STRING, ++(*pi_item_id),
  577.                         _FROMMB(text_list.p_list->p_values[i].psz_string ?
  578.                           text_list.p_list->p_values[i].psz_string : psz_tmp));
  579.             pMenuItemExt = new MenuItemExt( p_intf, *pi_item_id, psz_var,
  580.                 p_object, val_list.p_list->p_values[i], i_type );
  581.             p_menu_list->push_back( pMenuItemExt );
  582.             if( val_list.p_list->p_values[i].i_int == val.i_int )
  583.               CheckMenuItem( hSubMenu, *pi_item_id, MF_CHECKED | MF_BYCOMMAND);
  584.             break;
  585.         default:
  586.             break;
  587.         }
  588.     }
  589.     /* Clean up everything */
  590.     if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) free( val.psz_string );
  591.     var_Change( p_object, psz_var, VLC_VAR_FREELIST, &val_list, &text_list );
  592.     return hSubMenu;
  593. }
  594. int wce_GetMenuItemCount(HMENU hMenu)
  595. {
  596.     const int MAX_NUM_ITEMS = 256;
  597.     int iPos, iCount;
  598.     MENUITEMINFO mii;
  599.     memset( (char *)&mii, 0, sizeof(MENUITEMINFO) );
  600.     mii.cbSize = sizeof(MENUITEMINFO);
  601.     iCount = 0;
  602.     for( iPos = 0; iPos < MAX_NUM_ITEMS; iPos++ )
  603.     {
  604.         if( !GetMenuItemInfo(hMenu, (UINT)iPos, TRUE, &mii) ) break;
  605.         iCount++;
  606.     }
  607.     return iCount;
  608. }
  609. void OnMenuEvent( intf_thread_t *p_intf, int id )
  610. {
  611.     MenuItemExt *p_menuitemext = NULL;
  612.     vector<MenuItemExt*>::iterator iter;
  613.     if( p_intf->p_sys->p_settings_menu )
  614.     for( iter = p_intf->p_sys->p_settings_menu->begin();
  615.          iter != p_intf->p_sys->p_settings_menu->end(); iter++ )
  616.         if( (*iter)->id == id )
  617.         {
  618.             p_menuitemext = *iter;
  619.             break;
  620.         }
  621.     if( p_intf->p_sys->p_audio_menu && !p_menuitemext )
  622.     for( iter = p_intf->p_sys->p_audio_menu->begin();
  623.          iter != p_intf->p_sys->p_audio_menu->end(); iter++ )
  624.         if( (*iter)->id == id )
  625.         {
  626.             p_menuitemext = *iter;
  627.             break;
  628.         }
  629.     if( p_intf->p_sys->p_video_menu && !p_menuitemext )
  630.     for( iter = p_intf->p_sys->p_video_menu->begin();
  631.          iter != p_intf->p_sys->p_video_menu->end(); iter++ )
  632.         if( (*iter)->id == id )
  633.         {
  634.             p_menuitemext = *iter;
  635.             break;
  636.         }
  637.     if( p_intf->p_sys->p_navig_menu && !p_menuitemext )
  638.     for( iter = p_intf->p_sys->p_navig_menu->begin();
  639.          iter != p_intf->p_sys->p_navig_menu->end(); iter++ )
  640.         if( (*iter)->id == id )
  641.         {
  642.             p_menuitemext = *iter;
  643.             break;
  644.         }
  645.     if( p_menuitemext )
  646.     {
  647.         vlc_object_t *p_object = p_menuitemext->p_object;
  648.         if( p_object == NULL ) return;
  649.         var_Set( p_object, p_menuitemext->psz_var, p_menuitemext->val );
  650.         int i_type = var_Type( p_object, p_menuitemext->psz_var );
  651.         switch( i_type & VLC_VAR_TYPE )
  652.         {
  653.         case VLC_VAR_VOID:
  654.         case VLC_VAR_BOOL:
  655.         case VLC_VAR_VARIABLE:
  656.         case VLC_VAR_STRING:
  657.         case VLC_VAR_INTEGER:
  658.             break;
  659.         default:
  660.             /* Variable doesn't exist or isn't handled */
  661.             return;
  662.         }
  663.         vlc_object_release( p_object );
  664.     }
  665. }
  666. /*****************************************************************************
  667.  * A small helper class which encapsulate wxMenuitem with some other useful
  668.  * things.
  669.  *****************************************************************************/
  670. MenuItemExt::MenuItemExt( intf_thread_t *p_intf, int _id, char *_psz_var,
  671.                           vlc_object_t * _p_object, vlc_value_t _val, int _i_val_type )
  672. {
  673.     /* Initializations */
  674.     id = _id;
  675.     p_intf = p_intf;
  676.     psz_var = strdup( _psz_var );
  677.     i_val_type = _i_val_type;
  678.     p_object = _p_object;
  679.     val = _val;
  680. };
  681. MenuItemExt::~MenuItemExt()
  682. {
  683.     free( psz_var );
  684.     if( ( i_val_type & VLC_VAR_TYPE ) == VLC_VAR_STRING )
  685.         free( val.psz_string );
  686. };
  687. void MenuItemExt::ClearList( vector<MenuItemExt*> *p_menu_list )
  688. {
  689.     vector<MenuItemExt*>::iterator iter;
  690.     if( !p_menu_list ) return;
  691.     for( iter = p_menu_list->begin(); iter != p_menu_list->end(); iter++ )
  692.     {
  693.         delete *iter;
  694.     }
  695.     p_menu_list->clear();
  696. }