⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdl_os2fslib.c

📁 gnash 在pc和嵌入式下开发需要的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
  {    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 + -