| /****************************************************************************** | |
| @File PVRShellOS.cpp | |
| @Title Windows/PVRShellOS | |
| @Version | |
| @Copyright Copyright (c) Imagination Technologies Limited. | |
| @Platform WinCE/Windows | |
| @Description Makes programming for 3D APIs easier by wrapping window creation | |
| and other functions for use by a demo. | |
| ******************************************************************************/ | |
| /**************************************************************************** | |
| ** INCLUDES ** | |
| ****************************************************************************/ | |
| #include <windows.h> | |
| #include <TCHAR.H> | |
| #include <stdio.h> | |
| #include "PVRShell.h" | |
| #include "PVRShellAPI.h" | |
| #include "PVRShellOS.h" | |
| #include "PVRShellImpl.h" | |
| // No Doxygen for CPP files, due to documentation duplication | |
| /// @cond NO_DOXYGEN | |
| #if !(WINVER >= 0x0500) | |
| #define COMPILE_MULTIMON_STUBS | |
| #include <multimon.h> | |
| #endif | |
| /**************************************************************************** | |
| Defines | |
| *****************************************************************************/ | |
| /*! The class name for the window */ | |
| #define WINDOW_CLASS _T("PVRShellClass") | |
| /*! Maximum size to create string array for determining the read/write paths */ | |
| #define DIR_BUFFER_LEN (10240) | |
| /*! X dimension of the window that is created */ | |
| #define SHELL_DISPLAY_DIM_X 800 | |
| /*! Y dimension of the window that is created */ | |
| #define SHELL_DISPLAY_DIM_Y 600 | |
| /***************************************************************************** | |
| Declarations | |
| *****************************************************************************/ | |
| LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); | |
| /*!*************************************************************************** | |
| Class: PVRShellInit | |
| *****************************************************************************/ | |
| /*!*********************************************************************** | |
| @Function PVRShellOutputDebug | |
| @Input format printf style format followed by arguments it requires | |
| @Description Writes the resultant string to the debug output (e.g. using | |
| printf(), OutputDebugString(), ...). Check the SDK release notes for | |
| details on how the string is output. | |
| *************************************************************************/ | |
| void PVRShell::PVRShellOutputDebug(char const * const format, ...) const | |
| { | |
| va_list arg; | |
| char buf[1024]; | |
| va_start(arg, format); | |
| vsnprintf(buf, 1024, format, arg); | |
| va_end(arg); | |
| // Passes the data to a platform dependant function | |
| m_pShellInit->OsDisplayDebugString(buf); | |
| } | |
| /*!*********************************************************************** | |
| @Function OsInit | |
| @description Initialisation for OS-specific code. | |
| *************************************************************************/ | |
| void PVRShellInit::OsInit() | |
| { | |
| m_hAccelTable = 0; | |
| m_pShell->m_pShellData->nShellDimX = SHELL_DISPLAY_DIM_X; | |
| m_pShell->m_pShellData->nShellDimY = SHELL_DISPLAY_DIM_Y; | |
| m_hDC = 0; | |
| m_hWnd = 0; | |
| // Pixmap support: init variables to 0 | |
| m_hBmPixmap = 0; | |
| m_hBmPixmapOld = 0; | |
| m_hDcPixmap = 0; | |
| /* | |
| Construct the binary path for GetReadPath() and GetWritePath() | |
| */ | |
| { | |
| /* Allocate memory for strings and return 0 if allocation failed */ | |
| TCHAR* exeNameTCHAR = new TCHAR[DIR_BUFFER_LEN]; | |
| char* exeName = new char[DIR_BUFFER_LEN]; | |
| if(exeNameTCHAR && exeName) | |
| { | |
| DWORD retSize; | |
| /* | |
| Get the data path and a default application name | |
| */ | |
| // Get full path of executable | |
| retSize = GetModuleFileName(NULL, exeNameTCHAR, DIR_BUFFER_LEN); | |
| if (DIR_BUFFER_LEN > (int)retSize) | |
| { | |
| /* Get string length in char */ | |
| retSize = (DWORD)_tcslen(exeNameTCHAR); | |
| /* Convert TChar to char */ | |
| for (DWORD i = 0; i <= retSize; i++) | |
| { | |
| exeName[i] = (char)exeNameTCHAR[i]; | |
| } | |
| SetAppName(exeName); | |
| SetReadPath(exeName); | |
| SetWritePath(exeName); | |
| } | |
| } | |
| delete [] exeName; | |
| delete [] exeNameTCHAR; | |
| } | |
| m_u32ButtonState = 0; // clear mouse button state at startup | |
| } | |
| /*!*********************************************************************** | |
| @Function OsInitOS | |
| @description Saves instance handle and creates main window | |
| In this function, we save the instance handle in a global variable and | |
| create and display the main program window. | |
| *************************************************************************/ | |
| bool PVRShellInit::OsInitOS() | |
| { | |
| MONITORINFO sMInfo; | |
| TCHAR *appName; | |
| RECT winRect; | |
| POINT p; | |
| MyRegisterClass(); | |
| /* | |
| Build the window title | |
| */ | |
| { | |
| const char *pszName, *pszSeparator, *pszVersion; | |
| size_t len; | |
| unsigned int out, in; | |
| pszName = (const char*)m_pShell->PVRShellGet(prefAppName); | |
| pszSeparator = STR_WNDTITLE; | |
| pszVersion = (const char*)m_pShell->PVRShellGet(prefVersion); | |
| len = strlen(pszName)+strlen(pszSeparator)+strlen(pszVersion)+1; | |
| appName = new TCHAR[len]; | |
| for(out = 0; (appName[out] = pszName[out]) != 0; ++out); | |
| for(in = 0; (appName[out] = pszSeparator[in]) != 0; ++in, ++out); | |
| for(in = 0; (appName[out] = pszVersion[in]) != 0; ++in, ++out); | |
| _ASSERT(out == len-1); | |
| } | |
| /* | |
| Retrieve the monitor information. | |
| MonitorFromWindow() doesn't work, because the window hasn't been | |
| created yet. | |
| */ | |
| { | |
| HMONITOR hMonitor; | |
| BOOL bRet; | |
| p.x = m_pShell->m_pShellData->nShellPosX; | |
| p.y = m_pShell->m_pShellData->nShellPosY; | |
| hMonitor = MonitorFromPoint(p, MONITOR_DEFAULTTOPRIMARY); | |
| sMInfo.cbSize = sizeof(sMInfo); | |
| bRet = GetMonitorInfo(hMonitor, &sMInfo); | |
| _ASSERT(bRet); | |
| } | |
| /* | |
| Reduce the window size until it fits on screen | |
| */ | |
| while( | |
| (m_pShell->m_pShellData->nShellDimX > (sMInfo.rcMonitor.right - sMInfo.rcMonitor.left)) || | |
| (m_pShell->m_pShellData->nShellDimY > (sMInfo.rcMonitor.bottom - sMInfo.rcMonitor.top))) | |
| { | |
| m_pShell->m_pShellData->nShellDimX >>= 1; | |
| m_pShell->m_pShellData->nShellDimY >>= 1; | |
| } | |
| /* | |
| Create the window | |
| */ | |
| if(m_pShell->m_pShellData->bFullScreen) | |
| { | |
| m_hWnd = CreateWindow(WINDOW_CLASS, appName, WS_VISIBLE | WS_SYSMENU,CW_USEDEFAULT, CW_USEDEFAULT, m_pShell->m_pShellData->nShellDimX, m_pShell->m_pShellData->nShellDimY, | |
| NULL, NULL, m_hInstance, this); | |
| SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) &~ WS_CAPTION); | |
| SetWindowPos(m_hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); | |
| } | |
| else | |
| { | |
| int x, y; | |
| SetRect(&winRect, | |
| m_pShell->m_pShellData->nShellPosX, | |
| m_pShell->m_pShellData->nShellPosY, | |
| m_pShell->m_pShellData->nShellPosX+m_pShell->m_pShellData->nShellDimX, | |
| m_pShell->m_pShellData->nShellPosY+m_pShell->m_pShellData->nShellDimY); | |
| AdjustWindowRectEx(&winRect, WS_CAPTION|WS_SYSMENU, false, 0); | |
| x = m_pShell->m_pShellData->nShellPosX - winRect.left; | |
| winRect.left += x; | |
| winRect.right += x; | |
| y = m_pShell->m_pShellData->nShellPosY - winRect.top; | |
| winRect.top += y; | |
| winRect.bottom += y; | |
| if(m_pShell->m_pShellData->bShellPosWasDefault) | |
| { | |
| x = CW_USEDEFAULT; | |
| y = CW_USEDEFAULT; | |
| } | |
| else | |
| { | |
| x = winRect.left; | |
| y = winRect.top; | |
| } | |
| m_hWnd = CreateWindow(WINDOW_CLASS, appName, WS_VISIBLE|WS_CAPTION|WS_SYSMENU, | |
| x, y, winRect.right-winRect.left, winRect.bottom-winRect.top, NULL, NULL, m_hInstance, this); | |
| } | |
| if(!m_hWnd) | |
| return false; | |
| if(m_pShell->m_pShellData->bFullScreen) | |
| { | |
| m_pShell->m_pShellData->nShellDimX = sMInfo.rcMonitor.right; | |
| m_pShell->m_pShellData->nShellDimY = sMInfo.rcMonitor.bottom; | |
| SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,m_pShell->m_pShellData->nShellDimX,m_pShell->m_pShellData->nShellDimY,0); | |
| } | |
| m_hDC = GetDC(m_hWnd); | |
| ShowWindow(m_hWnd, m_nCmdShow); | |
| UpdateWindow(m_hWnd); | |
| delete [] appName; | |
| return true; | |
| } | |
| /*!*********************************************************************** | |
| @Function OsReleaseOS | |
| @description Destroys main window | |
| *************************************************************************/ | |
| void PVRShellInit::OsReleaseOS() | |
| { | |
| ReleaseDC(m_hWnd, m_hDC); | |
| DestroyWindow(m_hWnd); | |
| } | |
| /*!*********************************************************************** | |
| @Function OsExit | |
| @description Destroys main window | |
| *************************************************************************/ | |
| void PVRShellInit::OsExit() | |
| { | |
| const char *szText; | |
| /* | |
| Show the exit message to the user | |
| */ | |
| szText = (const char*)m_pShell->PVRShellGet(prefExitMessage); | |
| int i, nT, nC; | |
| const char *szCaption; | |
| TCHAR *tzText, *tzCaption; | |
| szCaption = (const char*)m_pShell->PVRShellGet(prefAppName); | |
| if(!szText || !szCaption) | |
| return; | |
| nT = (int)strlen(szText) + 1; | |
| nC = (int)strlen(szCaption) + 1; | |
| tzText = (TCHAR*)malloc(nT * sizeof(*tzText)); | |
| tzCaption = (TCHAR*)malloc(nC * sizeof(*tzCaption)); | |
| for(i = 0; (tzText[i] = szText[i]) != 0; ++i); | |
| for(i = 0; (tzCaption[i] = szCaption[i]) != 0; ++i); | |
| MessageBox(NULL, tzText, tzCaption, MB_OK | MB_ICONINFORMATION | MB_SETFOREGROUND); | |
| FREE(tzText); | |
| FREE(tzCaption); | |
| } | |
| /*!*********************************************************************** | |
| @Function OsDoInitAPI | |
| @Return true on success | |
| @description Perform API initialisation and bring up window / fullscreen | |
| *************************************************************************/ | |
| bool PVRShellInit::OsDoInitAPI() | |
| { | |
| // Pixmap support: create the pixmap | |
| if(m_pShell->m_pShellData->bNeedPixmap) | |
| { | |
| m_hDcPixmap = CreateCompatibleDC(m_hDC); | |
| m_hBmPixmap = CreateCompatibleBitmap(m_hDC, 640, 480); | |
| } | |
| if(!ApiInitAPI()) | |
| { | |
| return false; | |
| } | |
| // Pixmap support: select the pixmap into a device context (DC) ready for blitting | |
| if(m_pShell->m_pShellData->bNeedPixmap) | |
| { | |
| m_hBmPixmapOld = (HBITMAP)SelectObject(m_hDcPixmap, m_hBmPixmap); | |
| } | |
| SetForegroundWindow(m_hWnd); | |
| /* No problem occured */ | |
| return true; | |
| } | |
| /*!*********************************************************************** | |
| @Function OsDoReleaseAPI | |
| @description Clean up after we're done | |
| *************************************************************************/ | |
| void PVRShellInit::OsDoReleaseAPI() | |
| { | |
| ApiReleaseAPI(); | |
| if(m_pShell->m_pShellData->bNeedPixmap) | |
| { | |
| // Pixmap support: free the pixmap | |
| SelectObject(m_hDcPixmap, m_hBmPixmapOld); | |
| DeleteDC(m_hDcPixmap); | |
| DeleteObject(m_hBmPixmap); | |
| } | |
| } | |
| /*!*********************************************************************** | |
| @Function OsRenderComplete | |
| @Returns false when the app should quit | |
| @description Main message loop / render loop | |
| *************************************************************************/ | |
| void PVRShellInit::OsRenderComplete() | |
| { | |
| MSG msg; | |
| /* | |
| Process the message queue | |
| */ | |
| while(PeekMessage(&msg, m_hWnd, 0, 0, PM_REMOVE)) | |
| { | |
| if (!TranslateAccelerator(msg.hwnd, m_hAccelTable, &msg)) | |
| { | |
| TranslateMessage(&msg); | |
| DispatchMessage(&msg); | |
| } | |
| } | |
| } | |
| /*!*********************************************************************** | |
| @Function OsPixmapCopy | |
| @Return true if the copy succeeded | |
| @description When using pixmaps, copy the render to the display | |
| *************************************************************************/ | |
| bool PVRShellInit::OsPixmapCopy() | |
| { | |
| return (BitBlt(m_hDC, 0, 0, 640, 480, m_hDcPixmap, 0, 0, SRCCOPY) == TRUE); | |
| } | |
| /*!*********************************************************************** | |
| @Function OsGetNativeDisplayType | |
| @Return The 'NativeDisplayType' for EGL | |
| @description Called from InitAPI() to get the NativeDisplayType | |
| *************************************************************************/ | |
| void *PVRShellInit::OsGetNativeDisplayType() | |
| { | |
| return m_hDC; | |
| } | |
| /*!*********************************************************************** | |
| @Function OsGetNativePixmapType | |
| @Return The 'NativePixmapType' for EGL | |
| @description Called from InitAPI() to get the NativePixmapType | |
| *************************************************************************/ | |
| void *PVRShellInit::OsGetNativePixmapType() | |
| { | |
| // Pixmap support: return the pixmap | |
| return m_hBmPixmap; | |
| } | |
| /*!*********************************************************************** | |
| @Function OsGetNativeWindowType | |
| @Return The 'NativeWindowType' for EGL | |
| @description Called from InitAPI() to get the NativeWindowType | |
| *************************************************************************/ | |
| void *PVRShellInit::OsGetNativeWindowType() | |
| { | |
| return m_hWnd; | |
| } | |
| /*!*********************************************************************** | |
| @Function OsGet | |
| @Input prefName Name of value to get | |
| @Modified pn A pointer set to the value asked for | |
| @Returns true on success | |
| @Description Retrieves OS-specific data | |
| *************************************************************************/ | |
| bool PVRShellInit::OsGet(const prefNameIntEnum prefName, int *pn) | |
| { | |
| switch(prefName) | |
| { | |
| case prefButtonState: | |
| *pn = m_u32ButtonState; | |
| return true; | |
| }; | |
| return false; | |
| } | |
| /*!*********************************************************************** | |
| @Function OsSet | |
| @Input prefName Name of preference to set to value | |
| @Input value Value | |
| @Return true for success | |
| @Description Sets OS-specific data | |
| *************************************************************************/ | |
| bool PVRShellInit::OsSet(const prefNameBoolEnum prefName, const bool value) | |
| { | |
| switch(prefName) | |
| { | |
| case prefShowCursor: | |
| ShowCursor(value ? TRUE : FALSE); | |
| return true; | |
| } | |
| return false; | |
| } | |
| /*!*********************************************************************** | |
| @Function OsSet | |
| @Input prefName Name of value to set | |
| @Input i32Value The value to set our named value to | |
| @Returns true on success | |
| @Description Sets OS-specific data | |
| *************************************************************************/ | |
| bool PVRShellInit::OsSet(const prefNameIntEnum prefName, const int i32Value) | |
| { | |
| PVRSHELL_UNREFERENCED_PARAMETER(prefName); | |
| PVRSHELL_UNREFERENCED_PARAMETER(i32Value); | |
| return false; | |
| } | |
| /*!*********************************************************************** | |
| @Function OsGet | |
| @Input prefName Name of value to get | |
| @Modified pp A pointer set to the value asked for | |
| @Returns true on success | |
| @Description Retrieves OS-specific data | |
| *************************************************************************/ | |
| bool PVRShellInit::OsGet(const prefNamePtrEnum prefName, void **pp) | |
| { | |
| switch(prefName) | |
| { | |
| case prefHINSTANCE: | |
| *pp = m_hInstance; | |
| return true; | |
| default: | |
| return false; | |
| } | |
| } | |
| /*!*********************************************************************** | |
| @Function OsDisplayDebugString | |
| @Input str string to output | |
| @Description Prints a debug string | |
| *************************************************************************/ | |
| void PVRShellInit::OsDisplayDebugString(char const * const str) | |
| { | |
| if(str) | |
| { | |
| #if defined(UNICODE) | |
| wchar_t strc[1024]; | |
| int i; | |
| for(i = 0; (str[i] != '\0') && (i < (sizeof(strc) / sizeof(*strc))); ++i) | |
| { | |
| strc[i] = (wchar_t)str[i]; | |
| } | |
| strc[i] = '\0'; | |
| OutputDebugString(strc); | |
| #else | |
| OutputDebugString(str); | |
| #endif | |
| } | |
| } | |
| /*!*********************************************************************** | |
| @Function OsGetTime | |
| @Return An incrementing time value measured in milliseconds | |
| @Description Returns an incrementing time value measured in milliseconds | |
| *************************************************************************/ | |
| unsigned long PVRShellInit::OsGetTime() | |
| { | |
| return (unsigned long)GetTickCount(); | |
| } | |
| /***************************************************************************** | |
| Class: PVRShellInitOS | |
| *****************************************************************************/ | |
| /*!****************************************************************************************** | |
| @function MyRegisterClass() | |
| @description Registers the window class. | |
| This function and its usage is only necessary if you want this code | |
| to be compatible with Win32 systems prior to the 'RegisterClassEx' | |
| function that was added to Windows 95. It is important to call this function | |
| so that the application will get 'well formed' small icons associated | |
| with it. | |
| **********************************************************************************************/ | |
| ATOM PVRShellInitOS::MyRegisterClass() | |
| { | |
| WNDCLASS wc; | |
| wc.style = CS_HREDRAW | CS_VREDRAW; | |
| wc.lpfnWndProc = (WNDPROC)WndProc; | |
| wc.cbClsExtra = 0; | |
| wc.cbWndExtra = 0; | |
| wc.hInstance = m_hInstance; | |
| wc.hIcon = LoadIcon(m_hInstance, _T("ICON")); | |
| wc.hCursor = 0; | |
| wc.lpszMenuName = 0; | |
| wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); | |
| wc.lpszClassName = WINDOW_CLASS; | |
| return RegisterClass(&wc); | |
| } | |
| /***************************************************************************** | |
| Global code | |
| *****************************************************************************/ | |
| void doButtonDown(HWND hWnd, PVRShellInit *pData, EPVRShellButtonState eButton, LPARAM lParam) | |
| { | |
| RECT rcWinDimensions; | |
| GetClientRect(hWnd,&rcWinDimensions); | |
| float vec2TouchPosition[2] = { (float)(short)LOWORD(lParam)/(float)(rcWinDimensions.right), (float)(short)HIWORD(lParam)/(float)(rcWinDimensions.bottom) }; | |
| pData->TouchBegan(vec2TouchPosition); | |
| SetCapture(hWnd); // must be within window so capture | |
| pData->m_u32ButtonState |= eButton; | |
| } | |
| bool doButtonUp(HWND hWnd, PVRShellInit *pData, EPVRShellButtonState eButton, LPARAM lParam) | |
| { | |
| RECT rcWinDimensions; | |
| GetClientRect(hWnd,&rcWinDimensions); | |
| float vec2TouchPosition[2] = { (float)(short)LOWORD(lParam)/(float)(rcWinDimensions.right), (float)(short)HIWORD(lParam)/(float)(rcWinDimensions.bottom) }; | |
| pData->TouchEnded(vec2TouchPosition); | |
| pData->m_u32ButtonState &= (~eButton); | |
| if(vec2TouchPosition[0] < 0.f || vec2TouchPosition[0] > 1.f || vec2TouchPosition[1] < 0.f || vec2TouchPosition[1] > 1.f) | |
| { // pointer has left window | |
| if(pData->m_u32ButtonState==0) | |
| { // only release capture if mouse buttons have been released | |
| ReleaseCapture(); | |
| } | |
| return false; | |
| } | |
| return true; | |
| } | |
| /*!*************************************************************************** | |
| @function WndProc | |
| @input hWnd Handle to the window | |
| @input message Specifies the message | |
| @input wParam Additional message information | |
| @input lParam Additional message information | |
| @returns result code to OS | |
| @description Processes messages for the main window. | |
| *****************************************************************************/ | |
| LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) | |
| { | |
| PVRShellInit *pData = (PVRShellInit*) GetWindowLongPtr(hWnd, GWLP_USERDATA); | |
| switch (message) | |
| { | |
| case WM_CREATE: | |
| { | |
| CREATESTRUCT *pCreate = (CREATESTRUCT*)lParam; | |
| SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)pCreate->lpCreateParams); | |
| break; | |
| } | |
| case WM_PAINT: | |
| break; | |
| case WM_DESTROY: | |
| return 0; | |
| case WM_CLOSE: | |
| pData->gShellDone = true; | |
| return 0; | |
| case WM_QUIT: | |
| return 0; | |
| case WM_MOVE: | |
| pData->m_pShell->PVRShellSet(prefPositionX, (int)LOWORD(lParam)); | |
| pData->m_pShell->PVRShellSet(prefPositionY, (int)HIWORD(lParam)); | |
| break; | |
| case WM_LBUTTONDOWN: | |
| { | |
| doButtonDown(hWnd,pData,ePVRShellButtonLeft,lParam); | |
| break; | |
| } | |
| case WM_LBUTTONUP: | |
| { | |
| if(!doButtonUp(hWnd,pData,ePVRShellButtonLeft,lParam)) | |
| return false; | |
| break; | |
| } | |
| case WM_RBUTTONDOWN: | |
| { | |
| doButtonDown(hWnd,pData,ePVRShellButtonRight,lParam); | |
| break; | |
| } | |
| case WM_RBUTTONUP: | |
| { | |
| if(!doButtonUp(hWnd,pData,ePVRShellButtonRight,lParam)) | |
| return false; | |
| break; | |
| } | |
| case WM_MBUTTONDOWN: | |
| { | |
| doButtonDown(hWnd,pData,ePVRShellButtonMiddle,lParam); | |
| break; | |
| } | |
| case WM_MBUTTONUP: | |
| { | |
| if(!doButtonUp(hWnd,pData,ePVRShellButtonMiddle,lParam)) | |
| return false; | |
| break; | |
| } | |
| case WM_MOUSEMOVE: | |
| { | |
| RECT rcWinDimensions; | |
| GetClientRect(hWnd,&rcWinDimensions); | |
| float vec2TouchPosition[2] = { (float)(short)LOWORD(lParam)/(float)(rcWinDimensions.right), (float)(short)HIWORD(lParam)/(float)(rcWinDimensions.bottom) }; | |
| if(vec2TouchPosition[0] < 0.f || vec2TouchPosition[0] > 1.f || vec2TouchPosition[1] < 0.f || vec2TouchPosition[1] > 1.f) | |
| { | |
| // pointer has left window | |
| if(pData->m_u32ButtonState==0) | |
| { // only release capture if mouse buttons have been released | |
| ReleaseCapture(); | |
| } | |
| pData->TouchEnded(vec2TouchPosition); | |
| return false; | |
| } | |
| else | |
| { // pointer is inside window | |
| pData->TouchMoved(vec2TouchPosition); | |
| } | |
| break; | |
| } | |
| case WM_SETFOCUS: | |
| pData->m_bHaveFocus = true; | |
| return 0; | |
| case WM_KILLFOCUS: | |
| pData->m_bHaveFocus = false; | |
| return 0; | |
| case WM_KEYDOWN: | |
| { | |
| switch(wParam) | |
| { | |
| case VK_ESCAPE: | |
| case 0xC1: | |
| pData->KeyPressed(PVRShellKeyNameQUIT); | |
| break; | |
| case VK_UP: | |
| case 0x35: | |
| pData->KeyPressed(pData->m_eKeyMapUP); | |
| break; | |
| case VK_DOWN: | |
| case 0x30: | |
| pData->KeyPressed(pData->m_eKeyMapDOWN); | |
| break; | |
| case VK_LEFT: | |
| case 0x37: | |
| pData->KeyPressed(pData->m_eKeyMapLEFT); | |
| break; | |
| case VK_RIGHT: | |
| case 0x39: | |
| pData->KeyPressed(pData->m_eKeyMapRIGHT); | |
| break; | |
| case VK_SPACE: | |
| case 0x38: | |
| pData->KeyPressed(PVRShellKeyNameSELECT); | |
| break; | |
| case '1': | |
| case 0x34: | |
| pData->KeyPressed(PVRShellKeyNameACTION1); | |
| break; | |
| case '2': | |
| case 0x36: | |
| pData->KeyPressed(PVRShellKeyNameACTION2); | |
| break; | |
| case VK_F11: | |
| case 0xC2: | |
| pData->KeyPressed(PVRShellKeyNameScreenshot); | |
| break; | |
| } | |
| } | |
| default: | |
| break; | |
| } | |
| return DefWindowProc(hWnd, message, wParam, lParam); | |
| } | |
| /*!*************************************************************************** | |
| @function WinMain | |
| @input hInstance Application instance from OS | |
| @input hPrevInstance Always NULL | |
| @input lpCmdLine command line from OS | |
| @input nCmdShow Specifies how the window is to be shown | |
| @returns result code to OS | |
| @description Main function of the program | |
| *****************************************************************************/ | |
| int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, TCHAR *lpCmdLine, int nCmdShow) | |
| { | |
| size_t i; | |
| char *pszCmdLine; | |
| PVRShellInit init; | |
| PVRSHELL_UNREFERENCED_PARAMETER(hPrevInstance); | |
| #if defined(_WIN32) | |
| // Enable memory-leak reports | |
| _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)); | |
| #endif | |
| // Get a char-array command line as the input may be UNICODE | |
| i = _tcslen(lpCmdLine) + 1; | |
| pszCmdLine = new char[i]; | |
| while(i) | |
| { | |
| --i; | |
| pszCmdLine[i] = (char)lpCmdLine[i]; | |
| } | |
| // Init the demo, process the command line, create the OS initialiser. | |
| if(!init.Init()) | |
| { | |
| delete[] pszCmdLine; | |
| return EXIT_ERR_CODE; | |
| } | |
| init.CommandLine(pszCmdLine); | |
| init.m_hInstance = hInstance; | |
| init.m_nCmdShow = nCmdShow; | |
| // Initialise/run/shutdown | |
| while(init.Run()); | |
| delete[] pszCmdLine; | |
| return EXIT_NOERR_CODE; | |
| } | |
| /// @endcond | |
| /***************************************************************************** | |
| End of file (PVRShellOS.cpp) | |
| *****************************************************************************/ | |