+
+ end:
+ delete intf;
+
+#ifndef UNDER_CE
+ /* Uninitialize OLE/COM */
+ CoUninitialize();
+#endif
+}
+
+/*****************************************************************************
+ * CBaseWindow Implementation
+ *****************************************************************************/
+LRESULT CALLBACK CBaseWindow::BaseWndProc( HWND hwnd, UINT msg, WPARAM wParam,
+ LPARAM lParam )
+{
+ CBaseWindow *p_obj;
+
+ // check to see if a copy of the 'this' pointer needs to be saved
+ if( msg == WM_CREATE )
+ {
+ p_obj = (CBaseWindow *)(((LPCREATESTRUCT)lParam)->lpCreateParams);
+ SetWindowLong( hwnd, GWL_USERDATA,
+ (LONG)((LPCREATESTRUCT)lParam)->lpCreateParams );
+
+ p_obj->hWnd = hwnd;
+ }
+
+ if( msg == WM_INITDIALOG )
+ {
+ p_obj = (CBaseWindow *)lParam;
+ SetWindowLong( hwnd, GWL_USERDATA, lParam );
+ p_obj->hWnd = hwnd;
+ }
+
+ // Retrieve the pointer
+ p_obj = (CBaseWindow *)GetWindowLong( hwnd, GWL_USERDATA );
+
+ if( !p_obj ) return DefWindowProc( hwnd, msg, wParam, lParam );
+
+ // Filter message through child classes
+ return p_obj->WndProc( hwnd, msg, wParam, lParam );
+}
+
+int CBaseWindow::CreateDialogBox( HWND hwnd, CBaseWindow *p_obj )
+{
+ uint8_t p_buffer[sizeof(DLGTEMPLATE) + sizeof(WORD) * 4];
+ DLGTEMPLATE *p_dlg_template = (DLGTEMPLATE *)p_buffer;
+ memset( p_dlg_template, 0, sizeof(DLGTEMPLATE) + sizeof(WORD) * 4 );
+
+ // these values are arbitrary, they won't be used normally anyhow
+ p_dlg_template->x = 0; p_dlg_template->y = 0;
+ p_dlg_template->cx = 300; p_dlg_template->cy = 300;
+ p_dlg_template->style =
+ DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX;
+
+ return DialogBoxIndirectParam( GetModuleHandle(0), p_dlg_template, hwnd,
+ (DLGPROC)p_obj->BaseWndProc, (LPARAM)p_obj);
+}
+
+/*****************************************************************************
+ * ShowDialog
+ *****************************************************************************/
+static void ShowDialog( intf_thread_t *p_intf, int i_dialog_event, int i_arg,
+ intf_dialog_args_t *p_arg )
+{
+ SendMessage( p_intf->p_sys->p_window->GetHandle(), WM_CANCELMODE, 0, 0 );
+ if( i_dialog_event == INTF_DIALOG_POPUPMENU && i_arg == 0 ) return;
+
+ /* Hack to prevent popup events to be enqueued when
+ * one is already active */
+#if 0
+ if( i_dialog_event != INTF_DIALOG_POPUPMENU ||
+ !p_intf->p_sys->p_popup_menu )
+#endif
+ {
+ SendMessage( p_intf->p_sys->p_window->GetHandle(),
+ WM_APP + i_dialog_event, (WPARAM)i_arg, (LPARAM)p_arg );
+ }