]> git.sesse.net Git - vlc/blobdiff - modules/gui/wince/interface.cpp
Fix the shoutcast TV listings SD menu item in the Mac OS X GUI. To be backported
[vlc] / modules / gui / wince / interface.cpp
index 044aaad855cdd2aa7b0f568cc4f549547107b0a1..599eb6ba2882e26b84bc6690f0682ccc9d63432f 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * interface.cpp: WinCE gui plugin for VLC
  *****************************************************************************
- * Copyright (C) 2003 VideoLAN
+ * Copyright (C) 2003 the VideoLAN team
  * $Id$
  *
  * Authors: Marodon Cedric <cedric_marodon@yahoo.fr>
 
 #include "wince.h"
 
-#include <winuser.h>
-#include <windows.h>
 #include <windowsx.h>
 #include <commctrl.h>
-#include <commdlg.h> // common dialogs -> fileopen.lib ?
+#include <commdlg.h>
 
 #define NUMIMAGES     9   // Number of buttons in the toolbar           
 #define IMAGEWIDTH    17   // Width of the buttons in the toolbar  
@@ -45,7 +43,6 @@
 #define BUTTONWIDTH   0    // Width of the button images in the toolbar
 #define BUTTONHEIGHT  0    // Height of the button images in the toolbar
 #define ID_TOOLBAR    2000 // Identifier of the main tool bar
-#define dwTBFontStyle TBSTYLE_BUTTON | TBSTYLE_CHECK | TBSTYLE_GROUP // style for toolbar buttons
 
 // Help strings
 #define HELP_SIMPLE _T("Quick file open")
@@ -64,7 +61,6 @@
 #define HELP_FILEINFO   _T("Show information about the file being played")
 
 #define HELP_PREFS _T("Go to the preferences menu")
-#define EXTRA_PREFS _T("Shows the extended GUI")
 
 #define HELP_ABOUT _T("About this program")
 
@@ -106,34 +102,36 @@ TCHAR * szToolTips[] =
 /*****************************************************************************
  * Constructor.
  *****************************************************************************/
-BOOL Interface::InitInstance( HINSTANCE hInstance, intf_thread_t *_p_intf )
+Interface::Interface( intf_thread_t *p_intf, CBaseWindow *p_parent,
+                      HINSTANCE h_inst )
+  : CBaseWindow( p_intf, p_parent, h_inst ),
+    hwndMain(0), hwndCB(0), hwndTB(0), hwndSlider(0), hwndLabel(0),
+    hwndVol(0), hwndSB(0), timer(0), video(0), b_volume_hold(0)
+{
+}
+
+Interface::~Interface()
+{
+    if( timer ) delete timer;
+    if( video ) delete video;
+}
+
+BOOL Interface::InitInstance()
 {
     /* Initializations */
-    pIntf = _p_intf;
-    hwndMain = hwndCB = hwndTB = hwndSlider = hwndLabel = hwndVol = hwndSB = 0;
     i_old_playing_status = PAUSE_S;
 
-    hInst = hInstance; // Store instance handle in our global variable
-
-    // Register window class
-    WNDCLASS wc;
-    wc.style = CS_HREDRAW | CS_VREDRAW ;
-    wc.lpfnWndProc = (WNDPROC)BaseWndProc;
-    wc.cbClsExtra = 0;
-    wc.cbWndExtra = 0;
-    wc.hIcon = NULL;
-    wc.hInstance = hInstance;
-    wc.hCursor = NULL;
-    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
-    wc.lpszMenuName = NULL;
-    wc.lpszClassName = _T("VLC WinCE");
-    if( !RegisterClass( &wc ) ) return FALSE;
+    int i_style = WS_VISIBLE;
+
+#ifndef UNDER_CE
+    i_style |= WS_OVERLAPPEDWINDOW | WS_SIZEBOX;
+#endif
 
     // Create main window
     hwndMain =
-        CreateWindow( _T("VLC WinCE"), _T("VLC media player"), WS_VISIBLE,
+        CreateWindow( _T("VLC WinCE"), _T("VLC media player"), i_style,
                       0, MENU_HEIGHT, CW_USEDEFAULT, CW_USEDEFAULT,
-                      NULL, NULL, hInstance, (void *)this );
+                      NULL, NULL, GetInstance(), (void *)this );
 
     if( !hwndMain ) return FALSE;
 
@@ -144,15 +142,112 @@ BOOL Interface::InitInstance( HINSTANCE hInstance, intf_thread_t *_p_intf )
 }
 
 /***********************************************************************
+FUNCTION: 
+  CreateMenuBar
+
+PURPOSE: 
+  Creates a menu bar.
+***********************************************************************/
+HWND Interface::CreateMenuBar( HWND hwnd, HINSTANCE hInst )
+{
+    HMENU menu_file, menu_view;
+
+#ifdef UNDER_CE
+    SHMENUBARINFO mbi;
+    memset( &mbi, 0, sizeof(SHMENUBARINFO) );
+    mbi.cbSize     = sizeof(SHMENUBARINFO);
+    mbi.hwndParent = hwnd;
+    mbi.hInstRes   = hInst;
+    mbi.nToolBarId = IDR_MENUBAR;
 
+    if( !SHCreateMenuBar( &mbi ) )
+    {
+        MessageBox(hwnd, _T("SHCreateMenuBar Failed"), _T("Error"), MB_OK);
+        return 0;
+    }
+
+    TBBUTTONINFO tbbi;
+    tbbi.cbSize = sizeof(tbbi);
+    tbbi.dwMask = TBIF_LPARAM;
+
+    SendMessage( mbi.hwndMB, TB_GETBUTTONINFO, IDM_FILE, (LPARAM)&tbbi );
+    menu_file = (HMENU)tbbi.lParam;
+    RemoveMenu( menu_file, 0, MF_BYPOSITION );
+    SendMessage( mbi.hwndMB, TB_GETBUTTONINFO, IDM_VIEW, (LPARAM)&tbbi );
+    menu_view = (HMENU)tbbi.lParam;
+    RemoveMenu( menu_view, 0, MF_BYPOSITION );
+    SendMessage( mbi.hwndMB, TB_GETBUTTONINFO, IDM_SETTINGS, (LPARAM)&tbbi );
+    menu_settings = (HMENU)tbbi.lParam;
+    SendMessage( mbi.hwndMB, TB_GETBUTTONINFO, IDM_VIDEO, (LPARAM)&tbbi );
+    menu_video = (HMENU)tbbi.lParam;
+    SendMessage( mbi.hwndMB, TB_GETBUTTONINFO, IDM_AUDIO, (LPARAM)&tbbi );
+    menu_audio = (HMENU)tbbi.lParam;
+    SendMessage( mbi.hwndMB, TB_GETBUTTONINFO, IDM_NAVIGATION, (LPARAM)&tbbi );
+    menu_navigation = (HMENU)tbbi.lParam;
+
+#else
+    menu_file = CreatePopupMenu();
+    menu_view = CreatePopupMenu();
+    menu_settings = CreatePopupMenu();
+    menu_audio = CreatePopupMenu();
+    menu_video = CreatePopupMenu();
+    menu_navigation = CreatePopupMenu();
+#endif
+
+    AppendMenu( menu_file, MF_STRING, ID_FILE_QUICKOPEN,
+                _T("Quick &Open File...") );
+    AppendMenu( menu_file, MF_SEPARATOR, 0, 0 );
+    AppendMenu( menu_file, MF_STRING, ID_FILE_OPENFILE,
+                _T("Open &File...") );
+    AppendMenu( menu_file, MF_STRING, ID_FILE_OPENDIR,
+                _T("Open &Directory...") );
+    AppendMenu( menu_file, MF_STRING, ID_FILE_OPENNET,
+                _T("Open &Network Stream...") );
+    AppendMenu( menu_file, MF_SEPARATOR, 0, 0 );
+    AppendMenu( menu_file, MF_STRING, ID_FILE_ABOUT,
+                _T("About VLC") );
+    AppendMenu( menu_file, MF_STRING, ID_FILE_EXIT,
+                _T("E&xit") );
+
+    AppendMenu( menu_view, MF_STRING, ID_VIEW_PLAYLIST,
+                _T("&Playlist...") );
+    AppendMenu( menu_view, MF_STRING, ID_VIEW_MESSAGES,
+                _T("&Messages...") );
+    AppendMenu( menu_view, MF_STRING, ID_VIEW_STREAMINFO,
+                _T("Stream and Media &info...") );
+
+    AppendMenu( menu_settings, MF_STRING, ID_PREFERENCES,
+                _T("&Preferences...") );
+
+
+#ifdef UNDER_CE
+    return mbi.hwndMB;
+
+#else
+    HMENU hmenu = CreateMenu();
+
+    AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)menu_file, _T("File") );
+    AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)menu_view, _T("View") );
+    AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)menu_settings,
+                _T("Settings") );
+    AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)menu_audio, _T("Audio") );
+    AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)menu_video, _T("Video") );
+    AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)menu_navigation, _T("Nav") );
+
+    SetMenu( hwnd, hmenu );
+    return 0;
+
+#endif
+}
+
+/***********************************************************************
 FUNCTION: 
-  CreateToolbar
+  CreateToolBar
 
 PURPOSE: 
   Registers the TOOLBAR control class and creates a toolbar.
-
 ***********************************************************************/
-HWND WINAPI Interface::CreateToolbar( HWND hwnd )
+HWND CreateToolBar( HWND hwnd, HINSTANCE hInst )
 {
     DWORD dwStyle;
     HWND hwndTB;
@@ -191,13 +286,13 @@ HWND WINAPI Interface::CreateToolbar( HWND hwnd )
 /***********************************************************************
 
 FUNCTION: 
-  CreateSliderbar
+  CreateSliderBar
 
 PURPOSE: 
   Registers the TRACKBAR_CLASS control class and creates a trackbar.
 
 ***********************************************************************/
-HWND WINAPI Interface::CreateSliderbar( HWND hwnd )
+HWND CreateSliderBar( HWND hwnd, HINSTANCE hInst )
 {
     HWND hwndSlider;
     RECT rect;
@@ -231,7 +326,7 @@ HWND WINAPI Interface::CreateSliderbar( HWND hwnd )
     return hwndSlider;
 }
 
-HWND WINAPI Interface::CreateStaticText( HWND hwnd )
+HWND CreateStaticText( HWND hwnd, HINSTANCE hInst )
 {
     HWND hwndLabel;
     RECT rect;
@@ -256,13 +351,13 @@ HWND WINAPI Interface::CreateStaticText( HWND hwnd )
 /***********************************************************************
 
 FUNCTION: 
-  CreateVolTrackbar
+  CreateVolTrackBar
 
 PURPOSE: 
   Registers the TRACKBAR_CLASS control class and creates a trackbar.
 
 ***********************************************************************/
-HWND WINAPI Interface::CreateVolTrackbar( HWND hwnd )
+HWND CreateVolTrackBar( HWND hwnd, HINSTANCE hInst )
 {
     HWND hwndVol;
     RECT rect;
@@ -300,13 +395,13 @@ HWND WINAPI Interface::CreateVolTrackbar( HWND hwnd )
 /***********************************************************************
 
 FUNCTION: 
-  CreateStatusbar
+  CreateStatusBar
 
 PURPOSE: 
   Registers the StatusBar control class and creates a Statusbar.
 
 ***********************************************************************/
-HWND WINAPI Interface::CreateStatusbar( HWND hwnd )
+HWND CreateStatusBar( HWND hwnd, HINSTANCE hInst )
 {
     DWORD dwStyle;
     HWND hwndSB;
@@ -347,225 +442,86 @@ HWND WINAPI Interface::CreateStatusbar( HWND hwnd )
 }
 
 /***********************************************************************
-
-FUNCTION: 
-  BaseWndProc
-
-PURPOSE: 
-  Processes messages sent to the main window.
-  
-***********************************************************************/
-LRESULT CALLBACK CBaseWindow::BaseWndProc( HWND hwnd, UINT msg, WPARAM wParam,
-                                           LPARAM lParam )
-{
-    // check to see if a copy of the 'this' pointer needs to be saved
-    if( msg == WM_CREATE )
-    {
-        CBaseWindow *pObj = reinterpret_cast<CBaseWindow *>
-            ((long)((LPCREATESTRUCT)lParam)->lpCreateParams);
-        ::SetWindowLong( hwnd, GWL_USERDATA,
-                         (LONG)((LPCREATESTRUCT)lParam)->lpCreateParams );
-
-        pObj->DlgFlag = FALSE;
-        pObj->hWnd = hwnd; // videowindow
-    }
-
-    if( msg == WM_INITDIALOG )
-    {
-        CBaseWindow *pObj = reinterpret_cast<CBaseWindow *>(lParam);
-        ::SetWindowLong( hwnd, GWL_USERDATA, lParam );
-        pObj->DlgFlag = TRUE;
-        pObj->hWnd = hwnd; //streamout
-    }
-
-    BOOL bProcessed = FALSE;
-    LRESULT lResult;
-
-    // Retrieve the pointer
-    CBaseWindow *pObj =
-        reinterpret_cast<CBaseWindow *>(::GetWindowLong( hwnd, GWL_USERDATA ));
-
-    // Filter message through child classes
-    if( pObj )
-        lResult = pObj->WndProc( hwnd, msg, wParam, lParam, &bProcessed );
-    else
-        return ( pObj->DlgFlag ? FALSE : TRUE ); // message not processed
-
-    if( pObj->DlgFlag )
-        return bProcessed; // processing a dialog message return TRUE if processed
-    else if( !bProcessed )
-        // If message was unprocessed and not a dialog, send it back to Windows
-        lResult = DefWindowProc( hwnd, msg, wParam, lParam );
-
-    return lResult; // processing a window message return FALSE if processed
-}
-
-/***********************************************************************
-
 FUNCTION: 
   WndProc
 
 PURPOSE: 
   Processes messages sent to the main window.
-  
 ***********************************************************************/
-LRESULT CALLBACK Interface::WndProc( HWND hwnd, UINT msg, WPARAM wp,
-                                     LPARAM lp, PBOOL pbProcessed )
+LRESULT Interface::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
 {
-    SHMENUBARINFO mbi;
-
-    // call the base class first
-    LRESULT lResult = CBaseWindow::WndProc( hwnd, msg, wp, lp, pbProcessed );
-    *pbProcessed = TRUE;
-
     switch( msg )
     {
     case WM_CREATE:
-        //Create the menubar
-        memset( &mbi, 0, sizeof(SHMENUBARINFO) );
-        mbi.cbSize     = sizeof(SHMENUBARINFO);
-        mbi.hwndParent = hwnd;
-        mbi.nToolBarId = IDR_MENUBAR;
-        mbi.hInstRes   = hInst;
-        mbi.nBmpId     = 0;
-        mbi.cBmpImages = 0;
-
-        if( !SHCreateMenuBar(&mbi) )
-        {
-            MessageBox(hwnd, _T("SHCreateMenuBar Failed"), _T("Error"), MB_OK);
-            //return -1;
-        }
-
-        hwndCB = mbi.hwndMB;
-
-        // Creates the toolbar
-        hwndTB = CreateToolbar( hwnd );
-
-        // Creates the sliderbar
-        hwndSlider = CreateSliderbar( hwnd );
-
-        // Creates the time label
-        hwndLabel = CreateStaticText( hwnd );
-
-        // Creates the volume trackbar
-        hwndVol = CreateVolTrackbar( hwnd );
-
-        // Creates the statusbar
-        hwndSB = CreateStatusbar( hwnd );
+        hwndCB = CreateMenuBar( hwnd, hInst );
+        hwndTB = CreateToolBar( hwnd, hInst );
+        hwndSlider = CreateSliderBar( hwnd, hInst );
+        hwndLabel = CreateStaticText( hwnd, hInst );
+        hwndVol = CreateVolTrackBar( hwnd, hInst );
+#ifdef UNDER_CE
+        hwndSB = CreateStatusBar( hwnd, hInst );
+#endif
 
         /* Video window */
-        if( config_GetInt( pIntf, "wince-embed" ) )
-            video = CreateVideoWindow( pIntf, hInst, hwnd );
-
-        ti = new Timer(pIntf, hwnd, this);
-
-        // Hide the SIP button (WINCE only)
-        SetForegroundWindow( hwnd );
-        SHFullScreen( GetForegroundWindow(), SHFS_HIDESIPBUTTON );
+        if( config_GetInt( p_intf, "wince-embed" ) )
+            video = CreateVideoWindow( p_intf, hwnd );
 
-        return lResult;
+        timer = new Timer( p_intf, hwnd, this );
+        break;
 
     case WM_COMMAND:
         switch( GET_WM_COMMAND_ID(wp,lp) )
         {
         case ID_FILE_QUICKOPEN: 
-            OnOpenFileSimple();
-            return lResult;
-
         case ID_FILE_OPENFILE: 
-            open = new OpenDialog( pIntf, hInst, FILE_ACCESS,
-                                   ID_FILE_OPENFILE, OPEN_NORMAL );
-            DialogBoxParam( hInst, (LPCTSTR)IDD_DUMMY, hwnd,
-                            (DLGPROC)open->BaseWndProc, (long)open );
-            delete open;
-            return lResult;
-
+        case ID_FILE_OPENDIR:
         case ID_FILE_OPENNET:
-            open = new OpenDialog( pIntf, hInst, NET_ACCESS, ID_FILE_OPENNET,
-                                   OPEN_NORMAL );
-            DialogBoxParam( hInst, (LPCTSTR)IDD_DUMMY, hwnd,
-                            (DLGPROC)open->BaseWndProc, (long)open );
-            delete open;
-            return lResult;
-
-        case PlayStream_Event: 
-            OnPlayStream();
-            return lResult;
-
-        case StopStream_Event: 
-            OnStopStream();
-            return lResult;
-
-        case PrevStream_Event: 
-            OnPrevStream();
-            return lResult;
-
-        case NextStream_Event: 
-            OnNextStream();
-            return lResult;
-
-        case SlowStream_Event: 
-            OnSlowStream();
-            return lResult;
+        case ID_VIEW_STREAMINFO:
+        case ID_VIEW_MESSAGES:
+        case ID_VIEW_PLAYLIST:
+        case ID_PREFERENCES:
+            OnShowDialog( GET_WM_COMMAND_ID(wp,lp) );
+            break;
 
-        case FastStream_Event: 
-            OnFastStream();
-            return lResult;
+        case PlayStream_Event: OnPlayStream(); break;
+        case StopStream_Event: OnStopStream(); break;
+        case PrevStream_Event: OnPrevStream(); break;
+        case NextStream_Event: OnNextStream(); break;
+        case SlowStream_Event: OnSlowStream(); break;
+        case FastStream_Event: OnFastStream(); break;
 
         case ID_FILE_ABOUT: 
         {
             string about = (string)"VLC media player " PACKAGE_VERSION +
                 _("\n(WinCE interface)\n\n") +
-                _("(c) 1996-2005 - the VideoLAN Team\n\n") +
+                _("(c) 1996-2006 - the VideoLAN Team\n\n") +
+                _("Compiled by ") + VLC_CompileBy() + "@" +
+                VLC_CompileHost() + "." + VLC_CompileDomain() + ".\n" +
+                _("Compiler: ") + VLC_Compiler() + ".\n" +
+#ifndef HAVE_SHARED_LIBVLC
+                _("Based on SVN revision: ") + VLC_Changeset() + ".\n\n" +
+#endif
                 _("The VideoLAN team <videolan@videolan.org>\n"
-                  "http://www.videolan.org/\n\n");
+                  "http://www.videolan.org/");
 
             MessageBox( hwnd, _FROMMB(about.c_str()),
                         _T("About VLC media player"), MB_OK );
-            return lResult;
+            break;
         }
 
         case ID_FILE_EXIT:
             SendMessage( hwnd, WM_CLOSE, 0, 0 );
-            return lResult;
-
-        case ID_VIEW_STREAMINFO:
-            fi = new FileInfo( pIntf, hInst );
-            DialogBoxParam( hInst, (LPCTSTR)IDD_DUMMY, hwnd,
-                            (DLGPROC)fi->BaseWndProc, (long)fi );
-            delete fi;
-            return lResult;
-
-        case ID_VIEW_MESSAGES:
-            hmsg = new Messages( pIntf, hInst );
-            DialogBoxParam( hInst, (LPCTSTR)IDD_MESSAGES, hwnd,
-                            (DLGPROC)hmsg->BaseWndProc, (long)hmsg );
-            delete hmsg;
-            return lResult;
+            break;
 
-        case ID_VIEW_PLAYLIST:
-            pl = new Playlist( pIntf, hInst );
-            DialogBoxParam( hInst, (LPCTSTR)IDD_DUMMY, hwnd,
-                            (DLGPROC)pl->BaseWndProc, (long)pl );
-            delete pl;
-            return lResult;
-
-        case ID_SETTINGS_PREF:
-            pref = new PrefsDialog( pIntf, hInst );
-            DialogBoxParam( hInst, (LPCTSTR)IDD_DUMMY, hwnd,
-                            (DLGPROC)pref->BaseWndProc, (long)pref );
-            delete pref;
-            return lResult;
-                  
         default:
-            OnMenuEvent( pIntf, GET_WM_COMMAND_ID(wp,lp) );
+            OnMenuEvent( p_intf, GET_WM_COMMAND_ID(wp,lp) );
             // we should test if it is a menu command
         }
         break;
   
     case WM_TIMER:
-        ti->Notify();
-        return lResult;
+        timer->Notify();
+        break;
 
     case WM_CTLCOLORSTATIC: 
         if( ( (HWND)lp == hwndSlider ) || ( (HWND)lp == hwndVol ) )
@@ -580,123 +536,104 @@ LRESULT CALLBACK Interface::WndProc( HWND hwnd, UINT msg, WPARAM wp,
         break;
 
     case WM_HSCROLL:
-        if( (HWND)lp == hwndSlider )
-        {
-            OnSliderUpdate( wp );
-            return lResult;
-        }
+        if( (HWND)lp == hwndSlider ) OnSliderUpdate( wp );
         break;
 
     case WM_VSCROLL:
-        if( (HWND)lp == hwndVol )
-        {
-            OnChange( wp );
-            return lResult;
-        }
+        if( (HWND)lp == hwndVol ) OnChange( wp );
         break;
 
     case WM_INITMENUPOPUP:
-        RefreshSettingsMenu( pIntf,
-            (HMENU)SendMessage( hwndCB, SHCMBM_GETSUBMENU, (WPARAM)0,
-                                (LPARAM)IDM_SETTINGS ) );
-        RefreshAudioMenu( pIntf,
-            (HMENU)SendMessage( hwndCB, SHCMBM_GETSUBMENU, (WPARAM)0,
-                                (LPARAM)IDM_AUDIO ) );
-        RefreshVideoMenu( pIntf,
-            (HMENU)SendMessage( hwndCB, SHCMBM_GETSUBMENU, (WPARAM)0,
-                                (LPARAM)IDM_VIDEO ) );
-        RefreshNavigMenu( pIntf,
-            (HMENU)SendMessage( hwndCB, SHCMBM_GETSUBMENU, (WPARAM)0,
-                                (LPARAM)IDM_NAVIGATION ) );
-
-#if 0
-        // Undo the video display because menu is opened
-        // due to GAPI, menu top display is not assumed
-        // FIXME verify if p_child_window exits
-        SendMessage( pIntf->p_sys->p_video_window->p_child_window,
-                     WM_INITMENUPOPUP, wp, lp );
-#endif
+        if( (HMENU)wp == menu_settings )
+            RefreshSettingsMenu( p_intf, menu_settings );
+        if( (HMENU)wp == menu_audio )
+            RefreshAudioMenu( p_intf, menu_audio );
+        if( (HMENU)wp == menu_video )
+            RefreshVideoMenu( p_intf, menu_video );
+        if( (HMENU)wp == menu_navigation )
+            RefreshNavigMenu( p_intf, menu_navigation );
+        /* Fall through */
+
+    case WM_KILLFOCUS:
+        SHFullScreen( hwnd, SHFS_SHOWSIPBUTTON );
+    case WM_ENTERMENULOOP:
+        if( video && video->hWnd )
+            SendMessage( video->hWnd, WM_KILLFOCUS, 0, 0 );
+        break;
 
-        //refresh screen
-        /* InvalidateRect(hwnd, NULL, TRUE);
-           /UpdateWindow(hwndCB); //  NULL*/
+    case WM_SETFOCUS:
+        SHSipPreference( hwnd, SIP_DOWN ); 
+        SHFullScreen( GetForegroundWindow(), SHFS_HIDESIPBUTTON );
+    case WM_EXITMENULOOP:
+        if( video && video->hWnd )
+            SendMessage( video->hWnd, WM_SETFOCUS, 0, 0 );
         break;
 
-#if 0
-    case WM_NOTIFY:
-        // Redo the video display because menu can be closed
-        // FIXME verify if p_child_window exits
-        if( (((NMHDR *)lp)->code) == NM_CUSTOMDRAW )
-            SendMessage( pIntf->p_sys->p_video_window->p_child_window,
-                         WM_NOTIFY, wp, lp );
-        return lResult;
-#endif
+    case WM_LBUTTONDOWN:
+        {
+            SHRGINFO shrg;
+            shrg.cbSize = sizeof( shrg );
+            shrg.hwndClient = hwnd;
+            shrg.ptDown.x = LOWORD(lp);
+            shrg.ptDown.y = HIWORD(lp);
+            shrg.dwFlags = SHRG_RETURNCMD ;
+
+            if( SHRecognizeGesture( &shrg ) == GN_CONTEXTMENU )
+                PopupMenu( p_intf, hwnd, shrg.ptDown );
+        }
+        break;
+
+   case WM_RBUTTONUP:
+        {
+            POINT point;
+            point.x = LOWORD(lp);
+            point.y = HIWORD(lp);
+            PopupMenu( p_intf, hwnd, point );
+        }
+        break;
 
     case WM_HELP:
         MessageBox (hwnd, _T("Help"), _T("Help"), MB_OK);
-        return lResult;
+        break;
 
     case WM_CLOSE:
-        DestroyWindow( hwndCB );
+        if( hwndCB ) DestroyWindow( hwndCB );
         DestroyWindow( hwnd );
-        return lResult;
+        break;
 
     case WM_DESTROY:
         PostQuitMessage( 0 );
-        return lResult;
+        break;
     }
 
     return DefWindowProc( hwnd, msg, wp, lp );
 }
 
-void Interface::OnOpenFileSimple( void )
+void Interface::OnShowDialog( int i_dialog_event )
 {
-    OPENFILENAME ofn;
-    TCHAR DateiName[80+1] = _T("\0");
-    static TCHAR szFilter[] = _T("All (*.*)\0*.*\0");
+    int i_id;
 
-    playlist_t *p_playlist = (playlist_t *)
-        vlc_object_find( pIntf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
-    if( p_playlist == NULL ) return;
-
-    memset( &ofn, 0, sizeof(OPENFILENAME) );
-    ofn.lStructSize = sizeof(OPENFILENAME);
-    ofn.hwndOwner = NULL;
-    ofn.hInstance = hInst;
-    ofn.lpstrFilter = szFilter;
-    ofn.lpstrCustomFilter = NULL;
-    ofn.nMaxCustFilter = 0;
-    ofn.nFilterIndex = 1;     
-    ofn.lpstrFile = (LPTSTR)DateiName; 
-    ofn.nMaxFile = 80;
-    ofn.lpstrFileTitle = NULL; 
-    ofn.nMaxFileTitle = 40;
-    ofn.lpstrInitialDir = NULL;
-    ofn.lpstrTitle = _T("Quick Open File");
-    ofn.Flags = 0; 
-    ofn.nFileOffset = 0;
-    ofn.nFileExtension = 0;
-    ofn.lpstrDefExt = NULL;
-    ofn.lCustData = 0L;
-    ofn.lpfnHook = NULL;
-    ofn.lpTemplateName = NULL;
-
-    SHFullScreen( GetForegroundWindow(), SHFS_HIDESIPBUTTON );
-
-    if( GetOpenFileName( (LPOPENFILENAME)&ofn ) )
+    switch( i_dialog_event )
     {
-        char *psz_filename = _TOMB(ofn.lpstrFile);
-        playlist_Add( p_playlist, psz_filename, psz_filename,
-                      PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END );
+    case ID_FILE_QUICKOPEN: i_id = INTF_DIALOG_FILE_SIMPLE; break;
+    case ID_FILE_OPENFILE: i_id = INTF_DIALOG_FILE; break;
+    case ID_FILE_OPENDIR: i_id = INTF_DIALOG_DIRECTORY; break;
+    case ID_FILE_OPENNET: i_id = INTF_DIALOG_NET; break;
+    case ID_VIEW_PLAYLIST: i_id = INTF_DIALOG_PLAYLIST; break;
+    case ID_VIEW_MESSAGES: i_id = INTF_DIALOG_MESSAGES; break;
+    case ID_VIEW_STREAMINFO: i_id = INTF_DIALOG_FILEINFO; break;
+    case ID_PREFERENCES: i_id = INTF_DIALOG_PREFS; break;
+    default: i_id = INTF_DIALOG_FILE; break;
     }
 
-    vlc_object_release( p_playlist );
+    if( p_intf->p_sys->pf_show_dialog )
+        p_intf->p_sys->pf_show_dialog( p_intf, i_id, 1, 0 );
 }
 
 void Interface::OnPlayStream( void )
 {
     playlist_t *p_playlist = (playlist_t *)
-        vlc_object_find( pIntf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+        vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
     if( p_playlist == NULL ) return;
 
     if( p_playlist->i_size && p_playlist->i_enabled )
@@ -704,7 +641,7 @@ void Interface::OnPlayStream( void )
         vlc_value_t state;
 
         input_thread_t *p_input = (input_thread_t *)
-            vlc_object_find( pIntf, VLC_OBJECT_INPUT, FIND_ANYWHERE );
+            vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE );
 
         if( p_input == NULL )
         {
@@ -737,7 +674,7 @@ void Interface::OnPlayStream( void )
     {
         /* If the playlist is empty, open a file requester instead */
         vlc_object_release( p_playlist );
-        OnOpenFileSimple();
+        OnShowDialog( ID_FILE_QUICKOPEN );
     }
 }
 
@@ -776,7 +713,7 @@ void Interface::OnVideoOnTop( void )
     vlc_value_t val;
 
     vout_thread_t *p_vout = (vout_thread_t *)
-        vlc_object_find( pIntf, VLC_OBJECT_VOUT, FIND_ANYWHERE );
+        vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE );
 
     if( p_vout == NULL ) return;
 
@@ -791,26 +728,26 @@ void Interface::OnVideoOnTop( void )
 
 void Interface::OnSliderUpdate( int wp )
 {
-    vlc_mutex_lock( &pIntf->change_lock );
-    input_thread_t *p_input = pIntf->p_sys->p_input;
+    vlc_mutex_lock( &p_intf->change_lock );
+    input_thread_t *p_input = p_intf->p_sys->p_input;
 
     int dwPos = SendMessage( hwndSlider, TBM_GETPOS, 0, 0 ); 
 
     if( (int)LOWORD(wp) == SB_THUMBPOSITION ||
         (int)LOWORD(wp) == SB_ENDSCROLL )
     {
-        if( pIntf->p_sys->i_slider_pos != dwPos && p_input )
+        if( p_intf->p_sys->i_slider_pos != dwPos && p_input )
         {
             vlc_value_t pos;
             pos.f_float = (float)dwPos / (float)SLIDER_MAX_POS;
             var_Set( p_input, "position", pos );
         }
 
-        pIntf->p_sys->b_slider_free = VLC_TRUE;
+        p_intf->p_sys->b_slider_free = VLC_TRUE;
     }
     else
     {
-        pIntf->p_sys->b_slider_free = VLC_FALSE;
+        p_intf->p_sys->b_slider_free = VLC_FALSE;
 
         if( p_input )
         {
@@ -829,7 +766,7 @@ void Interface::OnSliderUpdate( int wp )
         }
     }
 
-    vlc_mutex_unlock( &pIntf->change_lock );
+    vlc_mutex_unlock( &p_intf->change_lock );
 }
 
 void Interface::OnChange( int wp )
@@ -838,23 +775,40 @@ void Interface::OnChange( int wp )
 
     if( LOWORD(wp) == SB_THUMBPOSITION || LOWORD(wp) == SB_ENDSCROLL )
     {
-        Change( 200 - (int)dwPos );
+        VolumeChange( 200 - (int)dwPos );
+        b_volume_hold = VLC_FALSE;
+    }
+    else
+    {
+        b_volume_hold = VLC_TRUE;
     }
 }
 
-void Interface::Change( int i_volume )
+void Interface::VolumeChange( int i_volume )
 {
-    aout_VolumeSet( pIntf, i_volume * AOUT_VOLUME_MAX / 200 / 2 );
-#if 0
-    SetToolTip( wxString::Format((wxString)wxU(_("Volume")) + wxT(" %d"),
-                i_volume ) );
-#endif
+    aout_VolumeSet( p_intf, i_volume * AOUT_VOLUME_MAX / 200 / 2 );
+}
+
+void Interface::VolumeUpdate()
+{
+    audio_volume_t i_volume;
+
+    if( b_volume_hold ) return;
+
+    aout_VolumeGet( p_intf, &i_volume );
+
+    int i_volume_ctrl = 200 - i_volume * 200 * 2 / AOUT_VOLUME_MAX;
+
+    DWORD dwPos = SendMessage( hwndVol, TBM_GETPOS, 0, 0 );
+    if( i_volume_ctrl == (int)dwPos ) return;
+
+    SendMessage( hwndVol, TBM_SETPOS, 1, i_volume_ctrl );
 }
 
 void Interface::OnStopStream( void )
 {
     playlist_t * p_playlist = (playlist_t *)
-        vlc_object_find( pIntf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+        vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
     if( p_playlist == NULL ) return;
 
     playlist_Stop( p_playlist );
@@ -865,7 +819,7 @@ void Interface::OnStopStream( void )
 void Interface::OnPrevStream( void )
 {
     playlist_t * p_playlist = (playlist_t *)
-        vlc_object_find( pIntf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+        vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
     if( p_playlist == NULL ) return;
 
     playlist_Prev( p_playlist );
@@ -875,7 +829,7 @@ void Interface::OnPrevStream( void )
 void Interface::OnNextStream( void )
 {
     playlist_t * p_playlist = (playlist_t *)
-        vlc_object_find( pIntf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+        vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
     if( p_playlist == NULL ) return;
 
     playlist_Next( p_playlist );
@@ -885,7 +839,7 @@ void Interface::OnNextStream( void )
 void Interface::OnSlowStream( void )
 {
     input_thread_t *p_input = (input_thread_t *)
-        vlc_object_find( pIntf, VLC_OBJECT_INPUT, FIND_ANYWHERE );
+        vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE );
 
     if( p_input == NULL ) return;
 
@@ -897,7 +851,7 @@ void Interface::OnSlowStream( void )
 void Interface::OnFastStream( void )
 {
     input_thread_t *p_input = (input_thread_t *)
-        vlc_object_find( pIntf, VLC_OBJECT_INPUT, FIND_ANYWHERE );
+        vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE );
 
     if( p_input == NULL ) return;
 
@@ -905,3 +859,9 @@ void Interface::OnFastStream( void )
     var_Set( p_input, "rate-faster", val );
     vlc_object_release( p_input );
 }
+
+void Interface::Update()
+{
+    /* Misc updates */
+    VolumeUpdate();
+}