📄 sdl_os2fslib.c
字号:
{ unsigned char uchMaskByte; // Destination dptr = pchTemp + w*4 * (h-y-1); // Destination mask dmptr = pchTemp + w*h*4 + w*4 * (h-y-1); for (x=0; x<w; x++) { if (x%8==0) { uchMaskByte = (unsigned char) (*mptr); mptr++; } else uchMaskByte <<= 1; if (uchMaskByte & 0x80) { // Copy RGB *dptr++ = *pptr++; *dptr++ = *pptr++; *dptr++ = *pptr++; *dptr++ = *pptr++; *dmptr++ = 0; *dmptr++ = 0; *dmptr++ = 0; *dmptr++ = 0; } else { // Set pixels to fully transparent *dptr++ = 0; pptr++; *dptr++ = 0; pptr++; *dptr++ = 0; pptr++; *dptr++ = 0; pptr++; *dmptr++ = 255; *dmptr++ = 255; *dmptr++ = 255; *dmptr++ = 255; } } } // There is no more need for the RGB surface SDL_FreeSurface(icon_rgb); hps = WinGetPS(_this->hidden->hwndClient); bmi.cbFix = sizeof(BITMAPINFOHEADER); bmi.cx = w; bmi.cy = 2*h; bmi.cPlanes = 1; bmi.cBitCount = 32; SDL_memset(&bmih, 0, sizeof(BITMAPINFOHEADER)); bmih.cbFix = sizeof(BITMAPINFOHEADER); bmih.cx = w; bmih.cy = 2*h; bmih.cPlanes = 1; bmih.cBitCount = 32; hbm = GpiCreateBitmap(hps, (PBITMAPINFOHEADER2)&bmih, CBM_INIT, (PBYTE) pchTemp, (PBITMAPINFO2)&bmi); hptrIcon = WinCreatePointer(HWND_DESKTOP, hbm, FALSE, 0, 0); WinReleasePS(hps); // Free pixel array SDL_free(pchTemp); // Change icon in frame window WinSendMsg(hwndFrame, WM_SETICON, (MPARAM) hptrIcon, NULL); /* // Change icon in switchlist // Seems like it's not needed, the WM_SETICON already does it. { PID pidFrame; HSWITCH hswitchFrame; SWCNTRL swctl; WinQueryWindowProcess(hwndFrame, &pidFrame, NULL); hswitchFrame = WinQuerySwitchHandle(hwndFrame, pidFrame); WinQuerySwitchEntry(hswitchFrame, &swctl); swctl.hwndIcon = hptrIcon; WinChangeSwitchEntry(hswitchFrame, &swctl); } */ // Store icon handle in global variable hptrCurrentIcon = hptrIcon;}// ------------------------ REAL FUNCTIONS -----------------static void os2fslib_SetCursorManagementFunctions(_THIS, int iForWindowedMode){ if (iForWindowedMode) { _this->FreeWMCursor = os2fslib_FreeWMCursor; _this->CreateWMCursor = os2fslib_CreateWMCursor_Win; _this->ShowWMCursor = os2fslib_ShowWMCursor; _this->WarpWMCursor = os2fslib_WarpWMCursor; _this->MoveWMCursor = os2fslib_MoveWMCursor; _this->CheckMouseMode = NULL;//os2fslib_CheckMouseMode; } else { // We'll have software mouse cursor in FS mode! _this->FreeWMCursor = os2fslib_FreeWMCursor; _this->CreateWMCursor = os2fslib_CreateWMCursor_FS; _this->ShowWMCursor = os2fslib_ShowWMCursor; _this->WarpWMCursor = os2fslib_WarpWMCursor; _this->MoveWMCursor = os2fslib_MoveWMCursor; _this->CheckMouseMode = NULL;//os2fslib_CheckMouseMode; }}static void os2fslib_InitOSKeymap(_THIS){ int i; iShiftIsPressed = 0; /* Map the VK and CH keysyms */ for ( i=0; i<=255; ++i ) HWScanKeyMap[i] = SDLK_UNKNOWN; // First line of keyboard: HWScanKeyMap[0x1] = SDLK_ESCAPE; HWScanKeyMap[0x3b] = SDLK_F1; HWScanKeyMap[0x3c] = SDLK_F2; HWScanKeyMap[0x3d] = SDLK_F3; HWScanKeyMap[0x3e] = SDLK_F4; HWScanKeyMap[0x3f] = SDLK_F5; HWScanKeyMap[0x40] = SDLK_F6; HWScanKeyMap[0x41] = SDLK_F7; HWScanKeyMap[0x42] = SDLK_F8; HWScanKeyMap[0x43] = SDLK_F9; HWScanKeyMap[0x44] = SDLK_F10; HWScanKeyMap[0x57] = SDLK_F11; HWScanKeyMap[0x58] = SDLK_F12; HWScanKeyMap[0x5d] = SDLK_PRINT; HWScanKeyMap[0x46] = SDLK_SCROLLOCK; HWScanKeyMap[0x5f] = SDLK_PAUSE; // Second line of keyboard: HWScanKeyMap[0x29] = SDLK_BACKQUOTE; HWScanKeyMap[0x2] = SDLK_1; HWScanKeyMap[0x3] = SDLK_2; HWScanKeyMap[0x4] = SDLK_3; HWScanKeyMap[0x5] = SDLK_4; HWScanKeyMap[0x6] = SDLK_5; HWScanKeyMap[0x7] = SDLK_6; HWScanKeyMap[0x8] = SDLK_7; HWScanKeyMap[0x9] = SDLK_8; HWScanKeyMap[0xa] = SDLK_9; HWScanKeyMap[0xb] = SDLK_0; HWScanKeyMap[0xc] = SDLK_MINUS; HWScanKeyMap[0xd] = SDLK_EQUALS; HWScanKeyMap[0xe] = SDLK_BACKSPACE; HWScanKeyMap[0x68] = SDLK_INSERT; HWScanKeyMap[0x60] = SDLK_HOME; HWScanKeyMap[0x62] = SDLK_PAGEUP; HWScanKeyMap[0x45] = SDLK_NUMLOCK; HWScanKeyMap[0x5c] = SDLK_KP_DIVIDE; HWScanKeyMap[0x37] = SDLK_KP_MULTIPLY; HWScanKeyMap[0x4a] = SDLK_KP_MINUS; // Third line of keyboard: HWScanKeyMap[0xf] = SDLK_TAB; HWScanKeyMap[0x10] = SDLK_q; HWScanKeyMap[0x11] = SDLK_w; HWScanKeyMap[0x12] = SDLK_e; HWScanKeyMap[0x13] = SDLK_r; HWScanKeyMap[0x14] = SDLK_t; HWScanKeyMap[0x15] = SDLK_y; HWScanKeyMap[0x16] = SDLK_u; HWScanKeyMap[0x17] = SDLK_i; HWScanKeyMap[0x18] = SDLK_o; HWScanKeyMap[0x19] = SDLK_p; HWScanKeyMap[0x1a] = SDLK_LEFTBRACKET; HWScanKeyMap[0x1b] = SDLK_RIGHTBRACKET; HWScanKeyMap[0x1c] = SDLK_RETURN; HWScanKeyMap[0x69] = SDLK_DELETE; HWScanKeyMap[0x65] = SDLK_END; HWScanKeyMap[0x67] = SDLK_PAGEDOWN; HWScanKeyMap[0x47] = SDLK_KP7; HWScanKeyMap[0x48] = SDLK_KP8; HWScanKeyMap[0x49] = SDLK_KP9; HWScanKeyMap[0x4e] = SDLK_KP_PLUS; // Fourth line of keyboard: HWScanKeyMap[0x3a] = SDLK_CAPSLOCK; HWScanKeyMap[0x1e] = SDLK_a; HWScanKeyMap[0x1f] = SDLK_s; HWScanKeyMap[0x20] = SDLK_d; HWScanKeyMap[0x21] = SDLK_f; HWScanKeyMap[0x22] = SDLK_g; HWScanKeyMap[0x23] = SDLK_h; HWScanKeyMap[0x24] = SDLK_j; HWScanKeyMap[0x25] = SDLK_k; HWScanKeyMap[0x26] = SDLK_l; HWScanKeyMap[0x27] = SDLK_SEMICOLON; HWScanKeyMap[0x28] = SDLK_QUOTE; HWScanKeyMap[0x2b] = SDLK_BACKSLASH; HWScanKeyMap[0x4b] = SDLK_KP4; HWScanKeyMap[0x4c] = SDLK_KP5; HWScanKeyMap[0x4d] = SDLK_KP6; // Fifth line of keyboard: HWScanKeyMap[0x2a] = SDLK_LSHIFT; HWScanKeyMap[0x56] = SDLK_WORLD_1; // Code 161, letter i' on hungarian keyboard HWScanKeyMap[0x2c] = SDLK_z; HWScanKeyMap[0x2d] = SDLK_x; HWScanKeyMap[0x2e] = SDLK_c; HWScanKeyMap[0x2f] = SDLK_v; HWScanKeyMap[0x30] = SDLK_b; HWScanKeyMap[0x31] = SDLK_n; HWScanKeyMap[0x32] = SDLK_m; HWScanKeyMap[0x33] = SDLK_COMMA; HWScanKeyMap[0x34] = SDLK_PERIOD; HWScanKeyMap[0x35] = SDLK_SLASH; HWScanKeyMap[0x36] = SDLK_RSHIFT; HWScanKeyMap[0x61] = SDLK_UP; HWScanKeyMap[0x4f] = SDLK_KP1; HWScanKeyMap[0x50] = SDLK_KP2; HWScanKeyMap[0x51] = SDLK_KP3; HWScanKeyMap[0x5a] = SDLK_KP_ENTER; // Sixth line of keyboard: HWScanKeyMap[0x1d] = SDLK_LCTRL; HWScanKeyMap[0x7e] = SDLK_LSUPER; // Windows key HWScanKeyMap[0x38] = SDLK_LALT; HWScanKeyMap[0x39] = SDLK_SPACE; HWScanKeyMap[0x5e] = SDLK_RALT;// Actually, altgr on my keyboard... HWScanKeyMap[0x7f] = SDLK_RSUPER; HWScanKeyMap[0x7c] = SDLK_MENU; HWScanKeyMap[0x5b] = SDLK_RCTRL; HWScanKeyMap[0x63] = SDLK_LEFT; HWScanKeyMap[0x66] = SDLK_DOWN; HWScanKeyMap[0x64] = SDLK_RIGHT; HWScanKeyMap[0x52] = SDLK_KP0; HWScanKeyMap[0x53] = SDLK_KP_PERIOD;}/* Iconify the window. This function returns 1 if there is a window manager and the window was actually iconified, it returns 0 otherwise. */int os2fslib_IconifyWindow(_THIS){ HAB hab; HMQ hmq; ERRORID hmqerror; // If there is no more window, nothing we can do! if (_this->hidden->iPMThreadStatus!=1) return 0; // Cannot do anything in fullscreen mode! if (FSLib_QueryFSMode(_this->hidden->hwndClient)) return 0; // Make sure this thread is prepared for using the Presentation Manager! hab = WinInitialize(0); hmq = WinCreateMsgQueue(hab,0); // Remember if there was an error at WinCreateMsgQueue(), because we don't // want to destroy somebody else's queue later. :) hmqerror = WinGetLastError(hab); WinSetWindowPos(_this->hidden->hwndFrame, HWND_TOP, 0, 0, 0, 0, SWP_MINIMIZE); // Now destroy the message queue, if we've created it! if (ERRORIDERROR(hmqerror)==0) WinDestroyMsgQueue(hmq); return 1;}static SDL_GrabMode os2fslib_GrabInput(_THIS, SDL_GrabMode mode){ HAB hab; HMQ hmq; ERRORID hmqerror; // If there is no more window, nothing we can do! if (_this->hidden->iPMThreadStatus!=1) return SDL_GRAB_OFF; // Make sure this thread is prepared for using the Presentation Manager! hab = WinInitialize(0); hmq = WinCreateMsgQueue(hab,0); // Remember if there was an error at WinCreateMsgQueue(), because we don't // want to destroy somebody else's queue later. :) hmqerror = WinGetLastError(hab); if (mode == SDL_GRAB_OFF) {#ifdef DEBUG_BUILD printf("[os2fslib_GrabInput] : Releasing mouse\n"); fflush(stdout);#endif // Release the mouse bMouseCapturable = 0; if (bMouseCaptured) { WinSetCapture(HWND_DESKTOP, NULLHANDLE); bMouseCaptured = 0; } } else {#ifdef DEBUG_BUILD printf("[os2fslib_GrabInput] : Capturing mouse\n"); fflush(stdout);#endif // Capture the mouse bMouseCapturable = 1; if (WinQueryFocus(HWND_DESKTOP) == _this->hidden->hwndClient) { WinSetCapture(HWND_DESKTOP, _this->hidden->hwndClient); bMouseCaptured = 1; { SWP swpClient; POINTL ptl; // Center the mouse to the middle of the window! WinQueryWindowPos(_this->hidden->hwndClient, &swpClient); ptl.x = 0; ptl.y = 0; WinMapWindowPoints(_this->hidden->hwndClient, HWND_DESKTOP, &ptl, 1); _this->hidden->iSkipWMMOUSEMOVE++; /* Don't take next WM_MOUSEMOVE into account! */ WinSetPointerPos(HWND_DESKTOP, ptl.x + swpClient.cx/2, ptl.y + swpClient.cy/2); } } } // Now destroy the message queue, if we've created it! if (ERRORIDERROR(hmqerror)==0) WinDestroyMsgQueue(hmq); return mode;}/* Set the title and icon text */static void os2fslib_SetCaption(_THIS, const char *title, const char *icon){ HAB hab; HMQ hmq; ERRORID hmqerror; // If there is no more window, nothing we can do! if (_this->hidden->iPMThreadStatus!=1) return; // Make sure this thread is prepared for using the Presentation Manager! hab = WinInitialize(0); hmq = WinCreateMsgQueue(hab,0); // Remember if there was an error at WinCreateMsgQueue(), because we don't // want to destroy somebody else's queue later. :) hmqerror = WinGetLastError(hab); WinSetWindowText(_this->hidden->hwndFrame, (char *) title); // Now destroy the message queue, if we've created it! if (ERRORIDERROR(hmqerror)==0) WinDestroyMsgQueue(hmq);}static int os2fslib_ToggleFullScreen(_THIS, int on){#ifdef DEBUG_BUILD printf("[os2fslib_ToggleFullScreen] : %d\n", on); fflush(stdout);#endif // If there is no more window, nothing we can do! if (_this->hidden->iPMThreadStatus!=1) return 0; FSLib_ToggleFSMode(_this->hidden->hwndClient, on); /* Cursor manager functions to Windowed/FS mode*/ os2fslib_SetCursorManagementFunctions(_this, !on); return 1;}/* This is called after the video mode has been set, to get the initial mouse state. It should queue events as necessary to properly represent the current mouse focus and position. */static void os2fslib_UpdateMouse(_THIS){ POINTL ptl; HAB hab; HMQ hmq; ERRORID hmqerror; SWP swpClient; // If there is no more window, nothing we can do! if (_this->hidden->iPMThreadStatus!=1) return; // Make sure this thread is prepared for using the Presentation Manager! hab = WinInitialize(0); hmq = WinCreateMsgQueue(hab,0); // Remember if there was an error at WinCreateMsgQueue(), because we don't // want to destroy somebody else's queue later. :) hmqerror = WinGetLastError(hab); if (_this->hidden->fInFocus) { // If ou
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -