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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * interface.cpp: WinCE gui plugin for VLC
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 the VideoLAN team
  5.  * $Id: 8633fbe6478607cdcda1b52e7bab36d015ddced6 $
  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., 59 Temple Place - Suite 330, Boston, MA  02111,
  23.  * USA.
  24.  *****************************************************************************/
  25. /*****************************************************************************
  26.  * Preamble
  27.  *****************************************************************************/
  28. #ifdef HAVE_CONFIG_H
  29. # include "config.h"
  30. #endif
  31. #define __STDC_CONSTANT_MACROS 1
  32. #include <inttypes.h>
  33. #include <vlc_common.h>
  34. #include <vlc_aout.h>
  35. #include <vlc_vout.h>
  36. #include <vlc_interface.h>
  37. #include <vlc_input.h>
  38. #include <vlc_playlist.h>
  39. #include "wince.h"
  40. #define INT64_C(val) val##LL
  41. #include <windowsx.h>
  42. #include <commctrl.h>
  43. #include <commdlg.h>
  44. #define NUMIMAGES     9   // Number of buttons in the toolbar
  45. #define IMAGEWIDTH    17   // Width of the buttons in the toolbar
  46. #define IMAGEHEIGHT   16   // Height of the buttons in the toolbar
  47. #define BUTTONWIDTH   0    // Width of the button images in the toolbar
  48. #define BUTTONHEIGHT  0    // Height of the button images in the toolbar
  49. #define ID_TOOLBAR    2000 // Identifier of the main tool bar
  50. // Help strings
  51. #define HELP_SIMPLE _T("Quick file open")
  52. #define HELP_ADV    _T("Advanced open")
  53. #define HELP_FILE   _T("Open a file")
  54. #define HELP_DISC   _T("Open Disc Media")
  55. #define HELP_NET    _T("Open a network stream")
  56. #define HELP_SAT    _T("Open a satellite stream")
  57. #define HELP_EJECT  _T("Eject the DVD/CD")
  58. #define HELP_EXIT   _T("Exit this program")
  59. #define HELP_OTHER _T("Open other types of inputs")
  60. #define HELP_PLAYLIST   _T("Open the playlist")
  61. #define HELP_LOGS       _T("Show the program logs")
  62. #define HELP_FILEINFO   _T("Show information about the file being played")
  63. #define HELP_PREFS _T("Go to the preferences menu")
  64. #define HELP_ABOUT _T("About this program")
  65. #define HELP_STOP _T("Stop")
  66. #define HELP_PLAY _T("Play")
  67. #define HELP_PAUSE _T("Pause")
  68. #define HELP_PLO _T("Playlist")
  69. #define HELP_PLP _T("Previous playlist item")
  70. #define HELP_PLN _T("Next playlist item")
  71. #define HELP_SLOW _T("Play slower")
  72. #define HELP_FAST _T("Play faster")
  73. // The TBBUTTON structure contains information the toolbar buttons.
  74. static TBBUTTON tbButton[] =
  75. {
  76.   {0, ID_FILE_QUICKOPEN,        TBSTATE_ENABLED, TBSTYLE_BUTTON},
  77.   {1, ID_FILE_OPENNET,       TBSTATE_ENABLED, TBSTYLE_BUTTON},
  78.   {0, 0,              TBSTATE_ENABLED, TBSTYLE_SEP},
  79.   {2, StopStream_Event,       TBSTATE_ENABLED, TBSTYLE_BUTTON},
  80.   {3, PlayStream_Event,        TBSTATE_ENABLED, TBSTYLE_BUTTON},
  81.   {0, 0,              TBSTATE_ENABLED, TBSTYLE_SEP},
  82.   {4, ID_VIEW_PLAYLIST,       TBSTATE_ENABLED, TBSTYLE_BUTTON},
  83.   {0, 0,              TBSTATE_ENABLED, TBSTYLE_SEP},
  84.   {5, PrevStream_Event,      TBSTATE_ENABLED, TBSTYLE_BUTTON},
  85.   {6, NextStream_Event,      TBSTATE_ENABLED, TBSTYLE_BUTTON},
  86.   {0, 0,              TBSTATE_ENABLED, TBSTYLE_SEP},
  87.   {7, SlowStream_Event,      TBSTATE_ENABLED, TBSTYLE_BUTTON},
  88.   {8, FastStream_Event,       TBSTATE_ENABLED, TBSTYLE_BUTTON},
  89. };
  90. // Toolbar ToolTips
  91. TCHAR * szToolTips[] =
  92. {
  93.     HELP_SIMPLE, HELP_NET, HELP_STOP, HELP_PLAY, HELP_PLO, HELP_PLP,
  94.     HELP_PLN, HELP_SLOW, HELP_FAST
  95. };
  96. /*****************************************************************************
  97.  * Constructor.
  98.  *****************************************************************************/
  99. Interface::Interface( intf_thread_t *p_intf, CBaseWindow *p_parent,
  100.                       HINSTANCE h_inst )
  101.   : CBaseWindow( p_intf, p_parent, h_inst ),
  102.     hwndMain(0), hwndCB(0), hwndTB(0), hwndSlider(0), hwndLabel(0),
  103.     hwndVol(0), hwndSB(0), timer(0), video(0), b_volume_hold(0)
  104. {
  105. }
  106. Interface::~Interface()
  107. {
  108.     delete timer;
  109.     delete video;
  110. }
  111. BOOL Interface::InitInstance()
  112. {
  113.     /* Initializations */
  114.     i_old_playing_status = PAUSE_S;
  115.     int i_style = WS_VISIBLE;
  116. #ifndef UNDER_CE
  117.     i_style |= WS_OVERLAPPEDWINDOW | WS_SIZEBOX;
  118. #endif
  119.     // Create main window
  120.     hwndMain =
  121.         CreateWindow( _T("VLC WinCE"), _T("VLC media player"), i_style,
  122.                       0, MENU_HEIGHT, CW_USEDEFAULT, CW_USEDEFAULT,
  123.                       NULL, NULL, GetInstance(), (void *)this );
  124.     if( !hwndMain ) return FALSE;
  125.     ShowWindow( hwndMain, TRUE );
  126.     UpdateWindow( hwndMain );
  127.     return TRUE;
  128. }
  129. /***********************************************************************
  130. FUNCTION:
  131.   CreateMenuBar
  132. PURPOSE:
  133.   Creates a menu bar.
  134. ***********************************************************************/
  135. HWND Interface::CreateMenuBar( HWND hwnd, HINSTANCE hInst )
  136. {
  137.     HMENU menu_file, menu_view;
  138. #ifdef UNDER_CE
  139.     SHMENUBARINFO mbi;
  140.     memset( &mbi, 0, sizeof(SHMENUBARINFO) );
  141.     mbi.cbSize     = sizeof(SHMENUBARINFO);
  142.     mbi.hwndParent = hwnd;
  143.     mbi.hInstRes   = hInst;
  144.     mbi.nToolBarId = IDR_MENUBAR;
  145.     if( !SHCreateMenuBar( &mbi ) )
  146.     {
  147.         MessageBox(hwnd, _T("SHCreateMenuBar Failed"), _T("Error"), MB_OK);
  148.         return 0;
  149.     }
  150.     TBBUTTONINFO tbbi;
  151.     tbbi.cbSize = sizeof(tbbi);
  152.     tbbi.dwMask = TBIF_LPARAM;
  153.     SendMessage( mbi.hwndMB, TB_GETBUTTONINFO, IDM_FILE, (LPARAM)&tbbi );
  154.     menu_file = (HMENU)tbbi.lParam;
  155.     RemoveMenu( menu_file, 0, MF_BYPOSITION );
  156.     SendMessage( mbi.hwndMB, TB_GETBUTTONINFO, IDM_VIEW, (LPARAM)&tbbi );
  157.     menu_view = (HMENU)tbbi.lParam;
  158.     RemoveMenu( menu_view, 0, MF_BYPOSITION );
  159.     SendMessage( mbi.hwndMB, TB_GETBUTTONINFO, IDM_SETTINGS, (LPARAM)&tbbi );
  160.     menu_settings = (HMENU)tbbi.lParam;
  161.     SendMessage( mbi.hwndMB, TB_GETBUTTONINFO, IDM_VIDEO, (LPARAM)&tbbi );
  162.     menu_video = (HMENU)tbbi.lParam;
  163.     SendMessage( mbi.hwndMB, TB_GETBUTTONINFO, IDM_AUDIO, (LPARAM)&tbbi );
  164.     menu_audio = (HMENU)tbbi.lParam;
  165.     SendMessage( mbi.hwndMB, TB_GETBUTTONINFO, IDM_NAVIGATION, (LPARAM)&tbbi );
  166.     menu_navigation = (HMENU)tbbi.lParam;
  167. #else
  168.     menu_file = CreatePopupMenu();
  169.     menu_view = CreatePopupMenu();
  170.     menu_settings = CreatePopupMenu();
  171.     menu_audio = CreatePopupMenu();
  172.     menu_video = CreatePopupMenu();
  173.     menu_navigation = CreatePopupMenu();
  174. #endif
  175.     AppendMenu( menu_file, MF_STRING, ID_FILE_QUICKOPEN,
  176.                 _T("Quick &Open File...") );
  177.     AppendMenu( menu_file, MF_SEPARATOR, 0, 0 );
  178.     AppendMenu( menu_file, MF_STRING, ID_FILE_OPENFILE,
  179.                 _T("Open &File...") );
  180.     AppendMenu( menu_file, MF_STRING, ID_FILE_OPENDIR,
  181.                 _T("Open &Directory...") );
  182.     AppendMenu( menu_file, MF_STRING, ID_FILE_OPENNET,
  183.                 _T("Open &Network Stream...") );
  184.     AppendMenu( menu_file, MF_SEPARATOR, 0, 0 );
  185.     AppendMenu( menu_file, MF_STRING, ID_FILE_ABOUT,
  186.                 _T("About VLC") );
  187.     AppendMenu( menu_file, MF_STRING, ID_FILE_EXIT,
  188.                 _T("E&xit") );
  189.     AppendMenu( menu_view, MF_STRING, ID_VIEW_PLAYLIST,
  190.                 _T("&Playlist...") );
  191.     AppendMenu( menu_view, MF_STRING, ID_VIEW_MESSAGES,
  192.                 _T("&Messages...") );
  193.     AppendMenu( menu_view, MF_STRING, ID_VIEW_STREAMINFO,
  194.                 _T("Stream and Media &info...") );
  195.     AppendMenu( menu_settings, MF_STRING, ID_PREFERENCES,
  196.                 _T("&Preferences...") );
  197. #ifdef UNDER_CE
  198.     return mbi.hwndMB;
  199. #else
  200.     HMENU hmenu = CreateMenu();
  201.     AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)menu_file, _T("File") );
  202.     AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)menu_view, _T("View") );
  203.     AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)menu_settings,
  204.                 _T("Settings") );
  205.     AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)menu_audio, _T("Audio") );
  206.     AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)menu_video, _T("Video") );
  207.     AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)menu_navigation, _T("Nav") );
  208.     SetMenu( hwnd, hmenu );
  209.     return 0;
  210. #endif
  211. }
  212. /***********************************************************************
  213. FUNCTION:
  214.   CreateToolBar
  215. PURPOSE:
  216.   Registers the TOOLBAR control class and creates a toolbar.
  217. ***********************************************************************/
  218. HWND CreateToolBar( HWND hwnd, HINSTANCE hInst )
  219. {
  220.     DWORD dwStyle;
  221.     HWND hwndTB;
  222.     RECT rect, rectTB;
  223.     INITCOMMONCONTROLSEX iccex;
  224.     iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
  225.     iccex.dwICC = ICC_BAR_CLASSES;
  226.     // Registers TOOLBAR control classes from the common control dll
  227.     InitCommonControlsEx (&iccex);
  228.     //  Create the toolbar control
  229.     dwStyle = WS_VISIBLE | WS_CHILD | TBSTYLE_TOOLTIPS |
  230.         WS_EX_OVERLAPPEDWINDOW | CCS_NOPARENTALIGN;
  231.     hwndTB = CreateToolbarEx( hwnd, dwStyle, 0, NUMIMAGES,
  232.         hInst, IDB_BITMAP1, tbButton, sizeof(tbButton) / sizeof(TBBUTTON),
  233.         BUTTONWIDTH, BUTTONHEIGHT, IMAGEWIDTH, IMAGEHEIGHT, sizeof(TBBUTTON) );
  234.     if( !hwndTB ) return NULL;
  235.  
  236.     // Add ToolTips to the toolbar.
  237.     SendMessage( hwndTB, TB_SETTOOLTIPS, (WPARAM)NUMIMAGES,
  238.                  (LPARAM)szToolTips );
  239.     // Reposition the toolbar.
  240.     GetClientRect( hwnd, &rect );
  241.     GetWindowRect( hwndTB, &rectTB );
  242.     MoveWindow( hwndTB, rect.left, rect.bottom - rect.top - 2*MENU_HEIGHT,
  243.                 rect.right - rect.left, MENU_HEIGHT, TRUE );
  244.     return hwndTB;
  245. }
  246. /***********************************************************************
  247. FUNCTION:
  248.   CreateSliderBar
  249. PURPOSE:
  250.   Registers the TRACKBAR_CLASS control class and creates a trackbar.
  251. ***********************************************************************/
  252. HWND CreateSliderBar( HWND hwnd, HINSTANCE hInst )
  253. {
  254.     HWND hwndSlider;
  255.     RECT rect;
  256.     INITCOMMONCONTROLSEX iccex;
  257.     iccex.dwSize = sizeof( INITCOMMONCONTROLSEX );
  258.     iccex.dwICC = ICC_BAR_CLASSES;
  259.     // Registers TRACKBAR_CLASS control classes from the common control dll
  260.     InitCommonControlsEx( &iccex );
  261.     hwndSlider = CreateWindowEx( 0, TRACKBAR_CLASS, NULL,
  262.                 WS_CHILD | WS_VISIBLE | TBS_HORZ | WS_EX_OVERLAPPEDWINDOW |
  263.                 TBS_BOTTOM,  //|WS_CLIPSIBLINGS,
  264.                 0, 0, 0, 0, hwnd, NULL, hInst, NULL );
  265.     if( !hwndSlider ) return NULL;
  266.     SendMessage( hwndSlider, TBM_SETRANGEMIN, 1, 0 );
  267.     SendMessage( hwndSlider, TBM_SETRANGEMAX, 1, SLIDER_MAX_POS );
  268.     SendMessage( hwndSlider, TBM_SETPOS, 1, 0 );
  269.     // Reposition the trackbar
  270.     GetClientRect( hwnd, &rect );
  271.     MoveWindow( hwndSlider, rect.left,
  272.                 rect.bottom - rect.top - 2*(MENU_HEIGHT-1) - SLIDER_HEIGHT,
  273.                 rect.right - rect.left - 40, 30, TRUE );
  274.     ShowWindow( hwndSlider, SW_HIDE );
  275.     return hwndSlider;
  276. }
  277. HWND CreateStaticText( HWND hwnd, HINSTANCE hInst )
  278. {
  279.     HWND hwndLabel;
  280.     RECT rect;
  281.     hwndLabel = CreateWindowEx( 0, _T("STATIC"), _T("label"),
  282.                                 WS_CHILD | WS_VISIBLE | SS_CENTER ,
  283.                                 0, 0, 0, 0, hwnd, (HMENU)1980, hInst, NULL );
  284.     // Reposition the trackbar
  285.     GetClientRect( hwnd, &rect );
  286.     MoveWindow( hwndLabel, rect.left,
  287.                 rect.bottom - rect.top - 2*(MENU_HEIGHT-1) - SLIDER_HEIGHT +30,
  288.                 rect.right - rect.left - 40,
  289.                 SLIDER_HEIGHT - 30, TRUE );
  290.     ShowWindow( hwndLabel, SW_HIDE );
  291.     return hwndLabel;
  292. }
  293. /***********************************************************************
  294. FUNCTION:
  295.   CreateVolTrackBar
  296. PURPOSE:
  297.   Registers the TRACKBAR_CLASS control class and creates a trackbar.
  298. ***********************************************************************/
  299. HWND CreateVolTrackBar( HWND hwnd, HINSTANCE hInst )
  300. {
  301.     HWND hwndVol;
  302.     RECT rect;
  303.     INITCOMMONCONTROLSEX iccex;
  304.     iccex.dwSize = sizeof( INITCOMMONCONTROLSEX );
  305.     iccex.dwICC = ICC_BAR_CLASSES;
  306.     // Registers TRACKBAR_CLASS control classes from the common control dll
  307.     InitCommonControlsEx( &iccex );
  308.     hwndVol = CreateWindowEx( 0, TRACKBAR_CLASS, NULL,
  309.                 WS_CHILD | WS_VISIBLE | TBS_VERT | TBS_RIGHT | TBS_AUTOTICKS |
  310.                 WS_EX_OVERLAPPEDWINDOW, //|WS_CLIPSIBLINGS,
  311.                 0, 0, 0, 0, hwnd, NULL, hInst, NULL );
  312.     if( !hwndVol ) return NULL;
  313.     SendMessage( hwndVol, TBM_SETRANGEMIN, 1, 0 );
  314.     SendMessage( hwndVol, TBM_SETRANGEMAX, 1, 200 );
  315.     SendMessage( hwndVol, TBM_SETPOS, 1, 100 );
  316.     SendMessage( hwndVol, TBM_SETTICFREQ, 50, 0 );
  317.     // Reposition the trackbar
  318.     GetClientRect( hwnd, &rect );
  319.     MoveWindow( hwndVol, rect.right - rect.left - 40,
  320.                 rect.bottom - rect.top - 2*(MENU_HEIGHT-1) - SLIDER_HEIGHT,
  321.                 40, SLIDER_HEIGHT, TRUE );
  322.     ShowWindow( hwndVol, SW_HIDE );
  323.     return hwndVol;
  324. }
  325. /***********************************************************************
  326. FUNCTION:
  327.   CreateStatusBar
  328. PURPOSE:
  329.   Registers the StatusBar control class and creates a Statusbar.
  330. ***********************************************************************/
  331. HWND CreateStatusBar( HWND hwnd, HINSTANCE hInst )
  332. {
  333.     DWORD dwStyle;
  334.     HWND hwndSB;
  335.     RECT rect;
  336.     INITCOMMONCONTROLSEX iccex;
  337.     iccex.dwSize = sizeof (INITCOMMONCONTROLSEX);
  338.     iccex.dwICC = ICC_BAR_CLASSES;
  339.     // Registers Statusbar control classes from the common control dll
  340.     InitCommonControlsEx( &iccex );
  341.     // Create the statusbar control
  342.     dwStyle = WS_VISIBLE | WS_CHILD | TBSTYLE_TOOLTIPS | CCS_NOPARENTALIGN;
  343.     hwndSB = CreateWindowEx( 0, STATUSCLASSNAME, NULL,
  344.                              WS_CHILD | WS_VISIBLE | TBS_VERT | TBS_BOTTOM |
  345.                              TBS_RIGHT  |WS_CLIPSIBLINGS,
  346.                              0, 0, CW_USEDEFAULT, 50, hwnd, NULL, hInst, 0 );
  347.     if (!hwndSB ) return NULL;
  348.     // Get the coordinates of the parent window's client area.
  349.     GetClientRect( hwnd, &rect );
  350.     // allocate memory for the panes of status bar
  351.     int nopanes = 2;
  352.     int *indicators = new int[nopanes];
  353.     // set width for the panes
  354.     indicators[0] = 3 * ( rect.right - rect.left ) / 4;
  355.     indicators[1] = rect.right - rect.left;
  356.     // call functions to set style
  357.     SendMessage( hwndSB, SB_SETPARTS, (WPARAM)nopanes, (LPARAM)indicators );
  358.     return hwndSB;
  359. }
  360. /***********************************************************************
  361. FUNCTION:
  362.   WndProc
  363. PURPOSE:
  364.   Processes messages sent to the main window.
  365. ***********************************************************************/
  366. LRESULT Interface::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
  367. {
  368.     switch( msg )
  369.     {
  370.     case WM_CREATE:
  371.         hwndCB = CreateMenuBar( hwnd, hInst );
  372.         hwndTB = CreateToolBar( hwnd, hInst );
  373.         hwndSlider = CreateSliderBar( hwnd, hInst );
  374.         hwndLabel = CreateStaticText( hwnd, hInst );
  375.         hwndVol = CreateVolTrackBar( hwnd, hInst );
  376. #ifdef UNDER_CE
  377.         hwndSB = CreateStatusBar( hwnd, hInst );
  378. #endif
  379.         /* Video window */
  380.         if( config_GetInt( p_intf, "wince-embed" ) )
  381.             video = CreateVideoWindow( p_intf, hwnd );
  382.         timer = new Timer( p_intf, hwnd, this );
  383.         break;
  384.     case WM_COMMAND:
  385.         switch( GET_WM_COMMAND_ID(wp,lp) )
  386.         {
  387.         case ID_FILE_QUICKOPEN:
  388.         case ID_FILE_OPENFILE:
  389.         case ID_FILE_OPENDIR:
  390.         case ID_FILE_OPENNET:
  391.         case ID_VIEW_STREAMINFO:
  392.         case ID_VIEW_MESSAGES:
  393.         case ID_VIEW_PLAYLIST:
  394.         case ID_PREFERENCES:
  395.             OnShowDialog( GET_WM_COMMAND_ID(wp,lp) );
  396.             break;
  397.         case PlayStream_Event: OnPlayStream(); break;
  398.         case StopStream_Event: OnStopStream(); break;
  399.         case PrevStream_Event: OnPrevStream(); break;
  400.         case NextStream_Event: OnNextStream(); break;
  401.         case SlowStream_Event: OnSlowStream(); break;
  402.         case FastStream_Event: OnFastStream(); break;
  403.         case ID_FILE_ABOUT:
  404.         {
  405.             string about = (string)"VLC media player " PACKAGE_VERSION +
  406.                 _("n(WinCE interface)nn") +
  407.                 _("(c) 1996-2008 - the VideoLAN Teamnn") +
  408.                 _("Compiled by ") + VLC_CompileBy() + "@" +
  409.                 VLC_CompileHost() + "." + VLC_CompileDomain() + ".n" +
  410.                 _("Compiler: ") + VLC_Compiler() + ".nn" +
  411.                 _("The VideoLAN team <videolan@videolan.org>n"
  412.                   "http://www.videolan.org/");
  413.             MessageBox( hwnd, _FROMMB(about.c_str()),
  414.                         _T("About VLC media player"), MB_OK );
  415.             break;
  416.         }
  417.         case ID_FILE_EXIT:
  418.             SendMessage( hwnd, WM_CLOSE, 0, 0 );
  419.             break;
  420.         default:
  421.             OnMenuEvent( p_intf, GET_WM_COMMAND_ID(wp,lp) );
  422.             // we should test if it is a menu command
  423.         }
  424.         break;
  425.  
  426.     case WM_TIMER:
  427.         timer->Notify();
  428.         break;
  429.     case WM_CTLCOLORSTATIC:
  430.         if( ( (HWND)lp == hwndSlider ) || ( (HWND)lp == hwndVol ) )
  431.         {
  432.             return( (LRESULT)::GetSysColorBrush(COLOR_3DFACE) );
  433.         }
  434.         if( (HWND)lp == hwndLabel )
  435.         {
  436.             SetBkColor( (HDC)wp, RGB (192, 192, 192) );
  437.             return( (LRESULT)::GetSysColorBrush(COLOR_3DFACE) );
  438.         }
  439.         break;
  440.     case WM_HSCROLL:
  441.         if( (HWND)lp == hwndSlider ) OnSliderUpdate( wp );
  442.         break;
  443.     case WM_VSCROLL:
  444.         if( (HWND)lp == hwndVol ) OnChange( wp );
  445.         break;
  446.     case WM_INITMENUPOPUP:
  447.         if( (HMENU)wp == menu_settings )
  448.             RefreshSettingsMenu( p_intf, menu_settings );
  449.         if( (HMENU)wp == menu_audio )
  450.             RefreshAudioMenu( p_intf, menu_audio );
  451.         if( (HMENU)wp == menu_video )
  452.             RefreshVideoMenu( p_intf, menu_video );
  453.         if( (HMENU)wp == menu_navigation )
  454.             RefreshNavigMenu( p_intf, menu_navigation );
  455.         /* Fall through */
  456.     case WM_KILLFOCUS:
  457.         SHFullScreen( hwnd, SHFS_SHOWSIPBUTTON );
  458.     case WM_ENTERMENULOOP:
  459.         if( video && video->hWnd )
  460.             SendMessage( video->hWnd, WM_KILLFOCUS, 0, 0 );
  461.         break;
  462.     case WM_SETFOCUS:
  463.         SHSipPreference( hwnd, SIP_DOWN );
  464.         SHFullScreen( GetForegroundWindow(), SHFS_HIDESIPBUTTON );
  465.     case WM_EXITMENULOOP:
  466.         if( video && video->hWnd )
  467.             SendMessage( video->hWnd, WM_SETFOCUS, 0, 0 );
  468.         break;
  469.     case WM_LBUTTONDOWN:
  470.         {
  471.             SHRGINFO shrg;
  472.             shrg.cbSize = sizeof( shrg );
  473.             shrg.hwndClient = hwnd;
  474.             shrg.ptDown.x = LOWORD(lp);
  475.             shrg.ptDown.y = HIWORD(lp);
  476.             shrg.dwFlags = SHRG_RETURNCMD ;
  477.             if( SHRecognizeGesture( &shrg ) == GN_CONTEXTMENU )
  478.                 PopupMenu( p_intf, hwnd, shrg.ptDown );
  479.         }
  480.         break;
  481.    case WM_RBUTTONUP:
  482.         {
  483.             POINT point;
  484.             point.x = LOWORD(lp);
  485.             point.y = HIWORD(lp);
  486.             PopupMenu( p_intf, hwnd, point );
  487.         }
  488.         break;
  489.     case WM_HELP:
  490.         MessageBox (hwnd, _T("Help"), _T("Help"), MB_OK);
  491.         break;
  492.     case WM_CLOSE:
  493.         if( hwndCB ) DestroyWindow( hwndCB );
  494.         DestroyWindow( hwnd );
  495.         break;
  496.     case WM_DESTROY:
  497.         PostQuitMessage( 0 );
  498.         break;
  499.     }
  500.     return DefWindowProc( hwnd, msg, wp, lp );
  501. }
  502. void Interface::OnShowDialog( int i_dialog_event )
  503. {
  504.     int i_id;
  505.     switch( i_dialog_event )
  506.     {
  507.     case ID_FILE_QUICKOPEN: i_id = INTF_DIALOG_FILE_SIMPLE; break;
  508.     case ID_FILE_OPENFILE: i_id = INTF_DIALOG_FILE; break;
  509.     case ID_FILE_OPENDIR: i_id = INTF_DIALOG_DIRECTORY; break;
  510.     case ID_FILE_OPENNET: i_id = INTF_DIALOG_NET; break;
  511.     case ID_VIEW_PLAYLIST: i_id = INTF_DIALOG_PLAYLIST; break;
  512.     case ID_VIEW_MESSAGES: i_id = INTF_DIALOG_MESSAGES; break;
  513.     case ID_VIEW_STREAMINFO: i_id = INTF_DIALOG_FILEINFO; break;
  514.     case ID_PREFERENCES: i_id = INTF_DIALOG_PREFS; break;
  515.     default: i_id = INTF_DIALOG_FILE; break;
  516.     }
  517.     if( p_intf->p_sys->pf_show_dialog )
  518.         p_intf->p_sys->pf_show_dialog( p_intf, i_id, 1, 0 );
  519. }
  520. void Interface::OnPlayStream( void )
  521. {
  522.     playlist_t *p_playlist = pl_Hold( p_intf );
  523.     if( p_playlist == NULL ) return;
  524.     if( !playlist_IsEmpty(p_playlist) )
  525.     {
  526.         vlc_value_t state;
  527.         input_thread_t *p_input = (input_thread_t *)
  528.             vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE );
  529.         if( p_input == NULL )
  530.         {
  531.             /* No stream was playing, start one */
  532.             playlist_Play( p_playlist );
  533.             TogglePlayButton( PLAYING_S );
  534.             pl_Release( p_intf );
  535.             return;
  536.         }
  537.         var_Get( p_input, "state", &state );
  538.         if( state.i_int != PAUSE_S )
  539.         {
  540.             /* A stream is being played, pause it */
  541.             state.i_int = PAUSE_S;
  542.         }
  543.         else
  544.         {
  545.             /* Stream is paused, resume it */
  546.             state.i_int = PLAYING_S;
  547.         }
  548.         var_Set( p_input, "state", state );
  549.         TogglePlayButton( state.i_int );
  550.         vlc_object_release( p_input );
  551.     }
  552.     else
  553.     {
  554.         /* If the playlist is empty, open a file requester instead */
  555.         OnShowDialog( ID_FILE_QUICKOPEN );
  556.     }
  557.     pl_Release( p_intf );
  558. }
  559. void Interface::TogglePlayButton( int i_playing_status )
  560. {
  561.     TBREPLACEBITMAP tbrb;
  562.     tbrb.hInstOld = tbrb.hInstNew = (HINSTANCE) hInst;
  563.     tbrb.nButtons = NUMIMAGES;
  564.     if( i_playing_status == i_old_playing_status ) return;
  565.     if( i_playing_status == PLAYING_S )
  566.     {
  567.         tbrb.nIDOld = IDB_BITMAP2;
  568.         tbrb.nIDNew = IDB_BITMAP1;
  569.         SendMessage( hwndTB, TB_REPLACEBITMAP, (WPARAM)0,
  570.                      (LPARAM)(LPTBREPLACEBITMAP)&tbrb );
  571.     }
  572.     else
  573.     {
  574.         tbrb.nIDOld = IDB_BITMAP1;
  575.         tbrb.nIDNew = IDB_BITMAP2;
  576.         SendMessage( hwndTB, TB_REPLACEBITMAP, (WPARAM)0,
  577.                      (LPARAM)(LPTBREPLACEBITMAP)&tbrb );
  578.     }
  579.     UpdateWindow( hwndTB );
  580.     i_old_playing_status = i_playing_status;
  581. }
  582. void Interface::OnVideoOnTop( void )
  583. {
  584.     vlc_value_t val;
  585.     vout_thread_t *p_vout = (vout_thread_t *)
  586.         vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE );
  587.     if( p_vout == NULL ) return;
  588.     if( var_Get( (vlc_object_t *)p_vout, "video-on-top", &val ) < 0 )
  589.         return;
  590.     val.b_bool = !val.b_bool;
  591.     var_Set( (vlc_object_t *)p_vout, "video-on-top", val );
  592.     vlc_object_release( (vlc_object_t *)p_vout );
  593. }
  594. void Interface::OnSliderUpdate( int wp )
  595. {
  596.     input_thread_t *p_input = p_intf->p_sys->p_input;
  597.     int dwPos = SendMessage( hwndSlider, TBM_GETPOS, 0, 0 );
  598.     if( (int)LOWORD(wp) == SB_THUMBPOSITION ||
  599.         (int)LOWORD(wp) == SB_ENDSCROLL )
  600.     {
  601.         if( p_intf->p_sys->i_slider_pos != dwPos && p_input )
  602.         {
  603.             vlc_value_t pos;
  604.             pos.f_float = (float)dwPos / (float)SLIDER_MAX_POS;
  605.             var_Set( p_input, "position", pos );
  606.         }
  607.         p_intf->p_sys->b_slider_free = true;
  608.     }
  609.     else
  610.     {
  611.         p_intf->p_sys->b_slider_free = false;
  612.         if( p_input )
  613.         {
  614.             /* Update stream date */
  615.             char psz_time[ MSTRTIME_MAX_SIZE ], psz_total[ MSTRTIME_MAX_SIZE ];
  616.             mtime_t i_seconds;
  617.             i_seconds = var_GetTime( p_input, "length" ) / INT64_C(1000000 );
  618.             secstotimestr( psz_total, i_seconds );
  619.             i_seconds = var_GetTime( p_input, "time" ) / INT64_C(1000000 );
  620.             secstotimestr( psz_time, i_seconds );
  621.             SendMessage( hwndLabel, WM_SETTEXT, (WPARAM)1,
  622.                          (LPARAM)_FROMMB(psz_time) );
  623.         }
  624.     }
  625. }
  626. void Interface::OnChange( int wp )
  627. {
  628.     DWORD dwPos = SendMessage( hwndVol, TBM_GETPOS, 0, 0 );
  629.     if( LOWORD(wp) == SB_THUMBPOSITION || LOWORD(wp) == SB_ENDSCROLL )
  630.     {
  631.         VolumeChange( 200 - (int)dwPos );
  632.         b_volume_hold = false;
  633.     }
  634.     else
  635.     {
  636.         b_volume_hold = true;
  637.     }
  638. }
  639. void Interface::VolumeChange( int i_volume )
  640. {
  641.     aout_VolumeSet( p_intf, i_volume * AOUT_VOLUME_MAX / 200 / 2 );
  642. }
  643. void Interface::VolumeUpdate()
  644. {
  645.     audio_volume_t i_volume;
  646.     if( b_volume_hold ) return;
  647.     aout_VolumeGet( p_intf, &i_volume );
  648.     int i_volume_ctrl = 200 - i_volume * 200 * 2 / AOUT_VOLUME_MAX;
  649.     DWORD dwPos = SendMessage( hwndVol, TBM_GETPOS, 0, 0 );
  650.     if( i_volume_ctrl == (int)dwPos ) return;
  651.     SendMessage( hwndVol, TBM_SETPOS, 1, i_volume_ctrl );
  652. }
  653. void Interface::OnStopStream( void )
  654. {
  655.     playlist_t * p_playlist = pl_Hold( p_intf );
  656.     if( p_playlist == NULL ) return;
  657.     playlist_Stop( p_playlist );
  658.     TogglePlayButton( PAUSE_S );
  659.     pl_Release( p_intf );
  660. }
  661. void Interface::OnPrevStream( void )
  662. {
  663.     playlist_t * p_playlist = pl_Hold( p_intf );
  664.     if( p_playlist == NULL ) return;
  665.     playlist_Prev( p_playlist );
  666.     pl_Release( p_intf );
  667. }
  668. void Interface::OnNextStream( void )
  669. {
  670.     playlist_t * p_playlist = pl_Hold( p_intf );
  671.     if( p_playlist == NULL ) return;
  672.     playlist_Next( p_playlist );
  673.     pl_Release( p_intf );
  674. }
  675. void Interface::OnSlowStream( void )
  676. {
  677.     input_thread_t *p_input = (input_thread_t *)
  678.         vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE );
  679.     if( p_input == NULL ) return;
  680.     vlc_value_t val; val.b_bool = true;
  681.     var_Set( p_input, "rate-slower", val );
  682.     vlc_object_release( p_input );
  683. }
  684. void Interface::OnFastStream( void )
  685. {
  686.     input_thread_t *p_input = (input_thread_t *)
  687.         vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE );
  688.     if( p_input == NULL ) return;
  689.     vlc_value_t val; val.b_bool = true;
  690.     var_Set( p_input, "rate-faster", val );
  691.     vlc_object_release( p_input );
  692. }
  693. void Interface::Update()
  694. {
  695.     /* Misc updates */
  696.     VolumeUpdate();
  697. }