extern "C" int GXSUSPEND() { #ifndef _USE_GAPI_ return gx->Suspend(); #else return GXSuspend(); #endif }
/***************************************************************************** * DirectXEventProc: This is the window event processing function. ***************************************************************************** * On Windows, when you create a window you have to attach an event processing * function to it. The aim of this function is to manage "Queued Messages" and * "Nonqueued Messages". * Queued Messages are those picked up and retransmitted by vout_Manage * (using the GetMessage and DispatchMessage functions). * Nonqueued Messages are those that Windows will send directly to this * procedure (like WM_DESTROY, WM_WINDOWPOSCHANGED...) *****************************************************************************/ static long FAR PASCAL DirectXEventProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { event_thread_t *p_event; if( message == WM_CREATE ) { /* Store vd for future use */ p_event = (event_thread_t *)((CREATESTRUCT *)lParam)->lpCreateParams; SetWindowLongPtr( hwnd, GWLP_USERDATA, (LONG_PTR)p_event ); return TRUE; } else { LONG_PTR p_user_data = GetWindowLongPtr( hwnd, GWLP_USERDATA ); p_event = (event_thread_t *)p_user_data; if( !p_event ) { /* Hmmm mozilla does manage somehow to save the pointer to our * windowproc and still calls it after the vout has been closed. */ return DefWindowProc(hwnd, message, wParam, lParam); } } vout_display_t *vd = p_event->vd; #ifndef UNDER_CE /* Catch the screensaver and the monitor turn-off */ if( message == WM_SYSCOMMAND && ( (wParam & 0xFFF0) == SC_SCREENSAVE || (wParam & 0xFFF0) == SC_MONITORPOWER ) ) { //if( vd ) msg_Dbg( vd, "WinProc WM_SYSCOMMAND screensaver" ); return 0; /* this stops them from happening */ } #endif #if 0 if( message == WM_SETCURSOR ) { msg_Err(vd, "WM_SETCURSOR: %d (t2)", p_event->is_cursor_hidden); SetCursor( p_event->is_cursor_hidden ? p_event->cursor_empty : p_event->cursor_arrow ); return 1; } #endif if( message == WM_CAPTURECHANGED ) { for( int button = 0; p_event->button_pressed; button++ ) { unsigned m = 1 << button; if( p_event->button_pressed & m ) vout_display_SendEventMouseReleased( p_event->vd, button ); p_event->button_pressed &= ~m; } p_event->button_pressed = 0; return 0; } if( hwnd == p_event->hvideownd ) { #ifdef MODULE_NAME_IS_directx vlc_mutex_lock( &p_event->lock ); const bool use_overlay = p_event->use_overlay; vlc_mutex_unlock( &p_event->lock ); #endif switch( message ) { #ifdef MODULE_NAME_IS_directx case WM_ERASEBKGND: /* For overlay, we need to erase background */ return !use_overlay ? 1 : DefWindowProc(hwnd, message, wParam, lParam); case WM_PAINT: /* ** For overlay, DefWindowProc() will erase dirty regions ** with colorkey. ** For non-overlay, vout will paint the whole window at ** regular interval, therefore dirty regions can be ignored ** to minimize repaint. */ if( !use_overlay ) { ValidateRect(hwnd, NULL); } // fall through to default #else /* ** For OpenGL and Direct3D, vout will update the whole ** window at regular interval, therefore dirty region ** can be ignored to minimize repaint. */ case WM_ERASEBKGND: /* nothing to erase */ return 1; case WM_PAINT: /* nothing to repaint */ ValidateRect(hwnd, NULL); // fall through #endif default: return DefWindowProc(hwnd, message, wParam, lParam); } } switch( message ) { case WM_WINDOWPOSCHANGED: vlc_mutex_lock( &p_event->lock ); p_event->has_moved = true; vlc_mutex_unlock( &p_event->lock ); return 0; /* the user wants to close the window */ case WM_CLOSE: vout_display_SendEventClose(vd); return 0; /* the window has been closed so shut down everything now */ case WM_DESTROY: msg_Dbg( vd, "WinProc WM_DESTROY" ); /* just destroy the window */ PostQuitMessage( 0 ); return 0; case WM_SYSCOMMAND: switch (wParam) { case IDM_TOGGLE_ON_TOP: /* toggle the "on top" status */ { msg_Dbg(vd, "WinProc WM_SYSCOMMAND: IDM_TOGGLE_ON_TOP"); HMENU hMenu = GetSystemMenu(vd->sys->hwnd, FALSE); vout_display_SendWindowState(vd, (GetMenuState(hMenu, IDM_TOGGLE_ON_TOP, MF_BYCOMMAND) & MF_CHECKED) ? VOUT_WINDOW_STATE_NORMAL : VOUT_WINDOW_STATE_ABOVE); return 0; } default: break; } break; case WM_PAINT: case WM_NCPAINT: case WM_ERASEBKGND: return DefWindowProc(hwnd, message, wParam, lParam); case WM_KILLFOCUS: #ifdef MODULE_NAME_IS_wingapi GXSuspend(); #endif #ifdef UNDER_CE if( hwnd == p_event->hfswnd ) { HWND htbar = FindWindow( _T("HHTaskbar"), NULL ); ShowWindow( htbar, SW_SHOW ); } if( !p_event->hparent || hwnd == p_event->hfswnd ) { SHFullScreen( hwnd, SHFS_SHOWSIPBUTTON ); } #endif return 0; case WM_SETFOCUS: #ifdef MODULE_NAME_IS_wingapi GXResume(); #endif #ifdef UNDER_CE /* FIXME vd->cfg is not lock[ed/able] */ #warning "FIXME: race condition" if( p_event->hparent && hwnd != p_event->hfswnd && vd->cfg->is_fullscreen ) vout_display_SendEventFullscreen(vd, false); if( hwnd == p_event->hfswnd ) { HWND htbar = FindWindow( _T("HHTaskbar"), NULL ); ShowWindow( htbar, SW_HIDE ); } if( !p_event->hparent || hwnd == p_event->hfswnd ) { SHFullScreen( hwnd, SHFS_HIDESIPBUTTON ); } #endif return 0; default: //msg_Dbg( vd, "WinProc WM Default %i", message ); break; } /* Let windows handle the message */ return DefWindowProc(hwnd, message, wParam, lParam); }
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { static PAINTSTRUCT ps; SDL_Event e; memset(&e, 0, sizeof(SDL_Event)); switch (uMsg) { case WM_KEYDOWN: if (wParam == VK_F3) { if (rotkeystate == 0 && theOSystem) if (theOSystem->eventHandler().state() == EventHandler::S_EMULATE) ((FrameBufferWinCE *) (&(theOSystem->frameBuffer())))->rotatedisplay(); rotkeystate = true; return 0; } else rotkeystate = false; e.key.type = SDL_KEYDOWN; e.key.keysym.sym = RotateKey(VK_keymap[wParam]); e.key.keysym.mod = (SDLMod) 0; eventqueue.push(e); return 0; case WM_KEYUP: if (wParam == VK_F3 && rotkeystate) { rotkeystate = false; return 0; } e.key.type = SDL_KEYUP; e.key.keysym.sym = RotateKey(VK_keymap[wParam]); e.key.keysym.mod = (SDLMod) 0; eventqueue.push(e); return 0; case WM_MOUSEMOVE: e.type = SDL_MOUSEMOTION; e.motion.x = LOWORD(lParam); e.motion.y = HIWORD(lParam); eventqueue.push(e); return 0; case WM_LBUTTONDOWN: e.type = SDL_MOUSEBUTTONDOWN; e.motion.x = LOWORD(lParam); e.motion.y = HIWORD(lParam); e.button.button = SDL_BUTTON_LEFT; eventqueue.push(e); return 0; case WM_LBUTTONUP: e.type = SDL_MOUSEBUTTONUP; e.motion.x = LOWORD(lParam); e.motion.y = HIWORD(lParam); e.button.button = SDL_BUTTON_LEFT; eventqueue.push(e); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; case WM_CLOSE: PostQuitMessage(0); return 0; case WM_SETFOCUS: case WM_ACTIVATE: GXResume(); if (theOSystem) theOSystem->frameBuffer().refresh(); return 0; case WM_KILLFOCUS: case WM_HIBERNATE: GXSuspend(); if (theOSystem) if (theOSystem->eventHandler().state() == EventHandler::S_EMULATE) theOSystem->eventHandler().enterMenuMode(EventHandler::S_MENU); return 0; case WM_PAINT: BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); RequestRefresh = true; return 0; } return DefWindowProc(hwnd, uMsg, wParam, lParam); }