146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* 246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL - Simple DirectMedia Layer 346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Copyright (C) 1997-2004 Sam Lantinga 446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is free software; you can redistribute it and/or 646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modify it under the terms of the GNU Library General Public 746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License as published by the Free Software Foundation; either 846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner version 2 of the License, or (at your option) any later version. 946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is distributed in the hope that it will be useful, 1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner but WITHOUT ANY WARRANTY; without even the implied warranty of 1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Library General Public License for more details. 1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner You should have received a copy of the GNU Library General Public 1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License along with this library; if not, write to the Free 1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Sam Lantinga 2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner slouken@libsdl.org 2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/ 2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_config.h" 2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define _ULS_CALLCONV_ 2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define CALLCONV _System 2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <unidef.h> // Unicode API 2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <uconv.h> // Unicode API (codepage conversion) 2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <process.h> 3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <time.h> 3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_video.h" 3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_mouse.h" 3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../SDL_sysvideo.h" 3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../SDL_pixels_c.h" 3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../../events/SDL_events_c.h" 3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_os2fslib.h" 3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic ULONG ulFCFToUse = 4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FCF_TITLEBAR | 4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FCF_SYSMENU | 4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FCF_MINBUTTON | 4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FCF_MAXBUTTON | 4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FCF_NOBYTEALIGN | 4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FCF_SIZEBORDER | 4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FCF_TASKLIST; 4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int bMouseCaptured = 0; 5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int bMouseCapturable = 0; 5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic HPOINTER hptrGlobalPointer = NULL; 5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic HPOINTER hptrCurrentIcon = NULL; 5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int iWindowSizeX = 320; 5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int iWindowSizeY = 200; 5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int bWindowResized = 0; 5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#pragma pack(1) 5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnertypedef struct BMPINFO 5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner BITMAPINFO; 6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner RGB clr; 6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} BMPINFO, *PBMPINFO; 6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#pragma pack() 6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// Backdoors: 6746be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerDECLSPEC void SDLCALL SDL_OS2FSLIB_SetFCFToUse(ULONG ulFCF) 6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ulFCFToUse = ulFCF; 7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// Configuration defines: 7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// We have to report empty alpha mask, otherwise SDL will select 7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// alpha blitters, and this will have unwanted results, as we don't 7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// support alpha channel in FSLib yet. 7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define REPORT_EMPTY_ALPHA_MASK 7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// Experimental: Move every FSLib_BitBlt() call into window message 8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// processing function. 8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// This may fix dirt left on desktop. Or not. 8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner//#define BITBLT_IN_WINMESSAGEPROC 8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// Experimental-2: Use WinLockWindowUpdate() in around bitblts! 8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// This is not enabled, because it seems to cause more problems 8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// than good. 8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner//#define USE_WINLOCKWINDOWUPDATE_AROUND_BITBLTS 8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// Use the following to show resized image instead of black stuff 9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// even if the surface is resizable. 9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner//#define RESIZE_EVEN_IF_RESIZABLE 9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* The translation table from a VK keysym to a SDL keysym */ 9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDLKey HWScanKeyMap[256]; 9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_keysym *TranslateKey(int vkey, int chcode, int scancode, SDL_keysym *keysym, int iPressed); 9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int iShiftIsPressed; 9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef BITBLT_IN_WINMESSAGEPROC 9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define WM_UPDATERECTSREQUEST WM_USER+50 10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef USE_WINLOCKWINDOWUPDATE_AROUND_BITBLTS 10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define FSLIB_BITBLT(hwnd, buffer, top, left, width, height) \ 10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { \ 10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinLockWindowUpdate(HWND_DESKTOP, HWND_DESKTOP); \ 10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLib_BitBlt(hwnd, buffer, top, left, width, height); \ 10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinLockWindowUpdate(HWND_DESKTOP, NULL); \ 10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else 11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define FSLIB_BITBLT(hwnd, buffer, top, left, width, height) \ 11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLib_BitBlt(hwnd, buffer, top, left, width, height); 11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner///////////////////////////////////////////////////////////////////// 11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// 11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// SetAccessableWindowPos 11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// 11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// Same as WinSetWindowPos(), but takes care for the window to be 11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// always on the screen, the titlebar will be accessable everytime. 12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// 12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner///////////////////////////////////////////////////////////////////// 12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic BOOL SetAccessableWindowPos(HWND hwnd, HWND hwndInsertBehind, 12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner LONG x, LONG y, 12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner LONG cx, LONG cy, 12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ULONG fl) 12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWP swpDesktop, swp; 12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Get desktop area 12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowPos(HWND_DESKTOP, &swpDesktop); 13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((fl & SWP_MOVE) && (fl & SWP_SIZE)) 13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If both moving and sizing, then change size and pos now!! 13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (x+cx>swpDesktop.cx) 13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner x = swpDesktop.cx - cx; 13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (x<0) 13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner x = 0; 13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (y<0) 13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner y = 0; 14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (y+cy>swpDesktop.cy) 14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner y = swpDesktop.cy - cy; 14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return WinSetWindowPos(hwnd, hwndInsertBehind, x, y, cx, cy, fl); 14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (fl & SWP_MOVE) 14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Just moving 14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowPos(hwnd, &swp); 14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (x+swp.cx>swpDesktop.cx) 14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner x = swpDesktop.cx - swp.cx; 15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (x<0) 15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner x = 0; 15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (y<0) 15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner y = 0; 15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (y+swp.cy>swpDesktop.cy) 15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner y = swpDesktop.cy - swp.cy; 15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return WinSetWindowPos(hwnd, hwndInsertBehind, x, y, cx, cy, fl); 15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (fl & SWP_SIZE) 15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Just sizing 16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowPos(hwnd, &swp); 16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner x = swp.x; 16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner y = swp.y; 16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (x+cx>swpDesktop.cx) 16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner x = swpDesktop.cx - cx; 16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (x<0) 16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner x = 0; 16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (y<0) 16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner y = 0; 17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (y+cy>swpDesktop.cy) 17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner y = swpDesktop.cy - cy; 17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return WinSetWindowPos(hwnd, hwndInsertBehind, x, y, cx, cy, fl | SWP_MOVE); 17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return WinSetWindowPos(hwnd, hwndInsertBehind, x, y, cx, cy, fl); 17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic UniChar NativeCharToUniChar(int chcode) 17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner UniChar ucResult = (UniChar) chcode; 18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int rc; 18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner UconvObject ucoTemp; 18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner char achFrom[2]; 18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner char *pchFrom; 18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner size_t iFromCount; 18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner UniChar aucTo[10]; 18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner UniChar *pucTo; 18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner size_t iToCount; 18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner size_t iNonIdentical; 18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Create unicode convert object 19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rc = UniCreateUconvObject(L"", &ucoTemp); 19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (rc!=ULS_SUCCESS) 19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Could not create convert object! 19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return ucResult; 19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Convert language code string to unicode string 19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner achFrom[0] = (char) chcode; 20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner achFrom[1] = 0; 20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iFromCount = sizeof(char) * 2; 20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iToCount = sizeof(UniChar) * 2; 20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pucTo = &(aucTo[0]); 20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pchFrom = &(achFrom[0]); 20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rc = UniUconvToUcs(ucoTemp, 20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner &pchFrom, 20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner &iFromCount, 20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner &pucTo, 21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner &iToCount, 21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner &iNonIdentical); 21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 21346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (rc!=ULS_SUCCESS) 21446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 21546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Could not convert language code to UCS string! 21646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner UniFreeUconvObject(ucoTemp); 21746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return ucResult; 21846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 21946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 22046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner UniFreeUconvObject(ucoTemp); 22146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 22246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 22346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("%02x converted to %02x\n", (int) chcode, (int) (aucTo[0])); 22446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 22546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 22646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return aucTo[0]; 22746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 22846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 22946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner///////////////////////////////////////////////////////////////////// 23046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// 23146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// TranslateKey 23246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// 23346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// This creates SDL Keycodes from VK_ and hardware scan codes 23446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// 23546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner///////////////////////////////////////////////////////////////////// 23646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_keysym *TranslateKey(int vkey, int chcode, int scancode, SDL_keysym *keysym, int iPressed) 23746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 23846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->scancode = (unsigned char) scancode; 23946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->mod = KMOD_NONE; 24046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->unicode = 0; 24146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 24246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (iPressed && SDL_TranslateUNICODE) 24346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 24446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (chcode) 24546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->unicode = NativeCharToUniChar(chcode); 24646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 24746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->unicode = vkey; 24846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 24946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 25046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = HWScanKeyMap[scancode]; 25146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 25246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Now stuffs based on state of shift key(s)! 25346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (vkey == VK_SHIFT) 25446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 25546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iShiftIsPressed = iPressed; 25646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 25746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 25846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((iShiftIsPressed) && (SDL_TranslateUNICODE)) 25946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 26046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Change syms, if Unicode stuff is required 26146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // I think it's silly, but it's SDL... 26246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch (keysym->sym) 26346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 26446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_BACKQUOTE: 26546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = '~'; 26646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 26746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_1: 26846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_EXCLAIM; 26946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 27046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_2: 27146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_AT; 27246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 27346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_3: 27446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_HASH; 27546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 27646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_4: 27746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_DOLLAR; 27846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 27946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_5: 28046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = '%'; 28146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 28246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_6: 28346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_CARET; 28446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 28546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_7: 28646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_AMPERSAND; 28746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 28846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_8: 28946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_ASTERISK; 29046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 29146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_9: 29246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_LEFTPAREN; 29346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 29446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_0: 29546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_RIGHTPAREN; 29646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 29746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_MINUS: 29846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_UNDERSCORE; 29946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 30046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_PLUS: 30146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_EQUALS; 30246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 30346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 30446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_LEFTBRACKET: 30546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = '{'; 30646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 30746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_RIGHTBRACKET: 30846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = '}'; 30946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 31046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 31146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_SEMICOLON: 31246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_COLON; 31346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 31446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_QUOTE: 31546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_QUOTEDBL; 31646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 31746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_BACKSLASH: 31846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = '|'; 31946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 32046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 32146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_COMMA: 32246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_LESS; 32346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 32446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_PERIOD: 32546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_GREATER; 32646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 32746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_SLASH: 32846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = SDLK_QUESTION; 32946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 33046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 33146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner default: 33246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 33346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 33446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 33546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return keysym; 33646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 33746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 33846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define CONVERTMOUSEPOSITION() \ 33946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* We have to inverse the mouse position, because every non-os/2 system */ \ 34046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* has a coordinate system where the (0;0) is the top-left corner, */ \ 34146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* while on os/2 it's the bottom left corner! */ \ 34246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (FSLib_QueryFSMode(hwnd)) \ 34346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { \ 34446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* We're in FS mode! */ \ 34546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* In FS mode our window is as big as fullscreen mode, but not necessary as */ \ 34646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* big as the source buffer (can be bigger) */ \ 34746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* So, limit mouse pos to source buffer size! */ \ 34846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (ppts->x<0) ppts->x = 0; \ 34946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (ppts->y<0) ppts->y = 0; \ 35046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (ppts->x>=pVideo->hidden->SrcBufferDesc.uiXResolution) ppts->x = pVideo->hidden->SrcBufferDesc.uiXResolution-1; \ 35146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (ppts->y>=pVideo->hidden->SrcBufferDesc.uiYResolution) ppts->y = pVideo->hidden->SrcBufferDesc.uiYResolution-1; \ 35246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->iSkipWMMOUSEMOVE++; /* Don't take next WM_MOUSEMOVE into account! */ \ 35346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.x = ppts->x; ptl.y = ppts->y; \ 35446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinMapWindowPoints(pVideo->hidden->hwndClient, HWND_DESKTOP, &ptl, 1); \ 35546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointerPos(HWND_DESKTOP, ptl.x, ptl.y); \ 35646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Then convert OS/2 position to SDL position */ \ 35746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ppts->y = pVideo->hidden->SrcBufferDesc.uiYResolution - ppts->y - 1; \ 35846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else \ 35946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { \ 36046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWP swpClient; \ 36146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* We're in windowed mode! */ \ 36246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowPos(pVideo->hidden->hwndClient, &swpClient); \ 36346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Convert OS/2 mouse position to SDL position, and also scale it! */ \ 36446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (ppts->x) = (ppts->x) * pVideo->hidden->SrcBufferDesc.uiXResolution / swpClient.cx; \ 36546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (ppts->y) = (ppts->y) * pVideo->hidden->SrcBufferDesc.uiYResolution / swpClient.cy; \ 36646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (ppts->y) = pVideo->hidden->SrcBufferDesc.uiYResolution - (ppts->y) - 1; \ 36746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 36846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 36946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 37046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 37146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner///////////////////////////////////////////////////////////////////// 37246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// 37346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// WndProc 37446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// 37546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// This is the message processing window procedure for the 37646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// SDLWindowClass, which is the client window in our application. 37746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// It handles switching back and away from the app (taking care of 37846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// going out and back to and from fullscreen mode), sending keystrokes 37946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// and mouse events to where it has to be sent, etc... 38046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// 38146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner///////////////////////////////////////////////////////////////////// 38246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 38346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 38446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HPS ps; 38546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner RECTL rcl; 38646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_VideoDevice *pVideo = NULL; 38746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 38846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch (msg) 38946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 39046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case WM_CHAR: // Keypress notification 39146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 39246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// printf("WM_CHAR\n"); fflush(stdout); 39346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 39446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo = WinQueryWindowPtr(hwnd, 0); 39546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pVideo) 39646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 39746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* 39846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // We skip repeated keys: 39946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (CHARMSG(&msg)->cRepeat>1) 40046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 40146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 40246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// printf("Repeated key (%d), skipping...\n", CHARMSG(&msg)->cRepeat); fflush(stdout); 40346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 40446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return (MRESULT) TRUE; 40546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 40646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 40746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 40846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If it's not repeated, then let's see if its pressed or released! 40946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (SHORT1FROMMP(mp1) & KC_KEYUP) 41046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 41146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // A key has been released 41246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_keysym keysym; 41346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 41546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// printf("WM_CHAR, keyup, code is [0x%0x]\n", CHAR4FROMMP(mp1)); // HW scan code 41646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 41746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // One problem is with F1, which gets only the keyup message because 41946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // it is a system key. 42046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // So, when we get keyup message, we simulate keydown too! 42146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // UPDATE: 42246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // This problem should be solved now, that the accelerator keys are 42346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // disabled for this window! 42446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* 42546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (SHORT2FROMMP(mp2)==VK_F1) 42646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 42746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateKeyboard(SDL_PRESSED, TranslateKey(SHORT2FROMMP(mp2), // VK_ code 42846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SHORT1FROMMP(mp2), // Character code 42946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner CHAR4FROMMP(mp1), // HW Scan code 43046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner &keysym,0)); 43146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner }*/ 43246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 43346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateKeyboard(SDL_RELEASED, TranslateKey(SHORT2FROMMP(mp2), // VK_ code 43446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SHORT1FROMMP(mp2), // Character code 43546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner CHAR4FROMMP(mp1), // HW Scan code 43646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner &keysym,0)); 43746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 43846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 43946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 44046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // A key has been pressed 44146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_keysym keysym; 44246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 44346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 44446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// printf("WM_CHAR, keydown, code is [0x%0x]\n", CHAR4FROMMP(mp1)); // HW scan code 44546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 44646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Check for fastkeys: ALT+HOME to toggle FS mode 44746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // ALT+END to close app 44846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((SHORT1FROMMP(mp1) & KC_ALT) && 44946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (SHORT2FROMMP(mp2) == VK_HOME)) 45046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 45146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 45246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf(" Pressed ALT+HOME!\n"); fflush(stdout); 45346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 45446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Only switch between fullscreen and back if it's not 45546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // a resizable mode! 45646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( 45746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (!pVideo->hidden->pSDLSurface) || 45846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((pVideo->hidden->pSDLSurface) 45946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner && ((pVideo->hidden->pSDLSurface->flags & SDL_RESIZABLE)==0) 46046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) 46146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) 46246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLib_ToggleFSMode(hwnd, !FSLib_QueryFSMode(hwnd)); 46346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 46446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 46546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf(" Resizable mode, so discarding ALT+HOME!\n"); fflush(stdout); 46646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 46746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 46846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((SHORT1FROMMP(mp1) & KC_ALT) && 46946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (SHORT2FROMMP(mp2) == VK_END)) 47046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 47146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 47246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf(" Pressed ALT+END!\n"); fflush(stdout); 47346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 47446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Close window, and get out of loop! 47546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Also send event to SDL application, but we won't 47646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // wait for it to be processed! 47746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateQuit(); 47846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinPostMsg(hwnd, WM_QUIT, 0, 0); 47946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 48046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 48146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 48246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateKeyboard(SDL_PRESSED, TranslateKey(SHORT2FROMMP(mp2), // VK_ code 48346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SHORT1FROMMP(mp2), // Character code 48446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner CHAR4FROMMP(mp1), // HW Scan code 48546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner &keysym,1)); 48646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 48746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 48846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 48946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 49046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return (MRESULT) TRUE; 49146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 49246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case WM_TRANSLATEACCEL: 49346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 49446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PQMSG pqmsg; 49546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pqmsg = (PQMSG) mp1; 49646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (mp1) 49746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 49846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pqmsg->msg == WM_CHAR) 49946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 50046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // WM_CHAR message! 50146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Let's filter the ALT keypress and all other acceleration keys! 50246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return (MRESULT) FALSE; 50346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 50446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 50546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; // Default processing (pass to parent until frame control) 50646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 50746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 50846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case WM_PAINT: // Window redraw! 50946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 51046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_PAINT (0x%x)\n", hwnd); fflush(stdout); 51146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 51246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ps = WinBeginPaint(hwnd,0,&rcl); 51346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo = FSLib_GetUserParm(hwnd); 51446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pVideo) 51546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 51646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!pVideo->hidden->pSDLSurface) 51746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 51846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner RECTL rclRect; 51946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // So, don't blit now! 52046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 52146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_PAINT : Skipping blit while resizing (Pre!)!\n"); fflush(stdout); 52246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 52346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowRect(hwnd, &rclRect); 52446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Fill with black 52546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinFillRect(ps, &rclRect, CLR_BLACK); 52646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 52746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 52846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (DosRequestMutexSem(pVideo->hidden->hmtxUseSrcBuffer, 1000)==NO_ERROR) 52946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 53046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int iTop, iLeft, iWidth, iHeight; 53146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int iXScaleError, iYScaleError; 53246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int iXScaleError2, iYScaleError2; 53346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWP swp; 53446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 53546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Re-blit the modified area! 53646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // For this, we have to calculate the points, scaled! 53746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowPos(hwnd, &swp); 53846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 53946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_PAINT : WinSize: %d %d, BufSize: %d %d\n", 54046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner swp.cx, 54146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner swp.cy, 54246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->SrcBufferDesc.uiXResolution, 54346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->SrcBufferDesc.uiYResolution 54446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ); 54546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fflush(stdout); 54646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 54746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 54846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef RESIZE_EVEN_IF_RESIZABLE 54946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // But only blit if the window is not resizable, or if 55046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // the window is resizable and the source buffer size is the 55146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // same as the destination buffer size! 55246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((!pVideo->hidden->pSDLSurface) || 55346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((pVideo->hidden->pSDLSurface) && 55446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (pVideo->hidden->pSDLSurface->flags & SDL_RESIZABLE) && 55546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((swp.cx != pVideo->hidden->SrcBufferDesc.uiXResolution) || 55646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (swp.cy != pVideo->hidden->SrcBufferDesc.uiYResolution) 55746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) && 55846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (!FSLib_QueryFSMode(hwnd)) 55946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) 56046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) 56146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 56246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner RECTL rclRect; 56346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Resizable surface and in resizing! 56446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // So, don't blit now! 56546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 56646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_PAINT : Skipping blit while resizing!\n"); fflush(stdout); 56746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 56846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowRect(hwnd, &rclRect); 56946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Fill with black 57046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinFillRect(ps, &rclRect, CLR_BLACK); 57146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 57246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 57346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 57446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 57546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iXScaleError = (pVideo->hidden->SrcBufferDesc.uiXResolution-1) / swp.cx; 57646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iYScaleError = (pVideo->hidden->SrcBufferDesc.uiYResolution-1) / swp.cy; 57746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (iXScaleError<0) iXScaleError = 0; 57846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (iYScaleError<0) iYScaleError = 0; 57946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iXScaleError2 = (swp.cx-1)/(pVideo->hidden->SrcBufferDesc.uiXResolution); 58046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iYScaleError2 = (swp.cy-1)/(pVideo->hidden->SrcBufferDesc.uiYResolution); 58146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (iXScaleError2<0) iXScaleError2 = 0; 58246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (iYScaleError2<0) iYScaleError2 = 0; 58346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 58446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iTop = (swp.cy - rcl.yTop) * pVideo->hidden->SrcBufferDesc.uiYResolution / swp.cy - iYScaleError; 58546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iLeft = rcl.xLeft * pVideo->hidden->SrcBufferDesc.uiXResolution / swp.cx - iXScaleError; 58646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iWidth = ((rcl.xRight-rcl.xLeft) * pVideo->hidden->SrcBufferDesc.uiXResolution + swp.cx-1) 58746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner / swp.cx + 2*iXScaleError; 58846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iHeight = ((rcl.yTop-rcl.yBottom) * pVideo->hidden->SrcBufferDesc.uiYResolution + swp.cy-1) 58946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner / swp.cy + 2*iYScaleError; 59046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 59146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iWidth+=iXScaleError2; 59246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iHeight+=iYScaleError2; 59346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 59446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (iTop<0) iTop = 0; 59546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (iLeft<0) iLeft = 0; 59646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (iTop+iHeight>pVideo->hidden->SrcBufferDesc.uiYResolution) iHeight = pVideo->hidden->SrcBufferDesc.uiYResolution-iTop; 59746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (iLeft+iWidth>pVideo->hidden->SrcBufferDesc.uiXResolution) iWidth = pVideo->hidden->SrcBufferDesc.uiXResolution-iLeft; 59846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 59946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 60046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_PAINT : BitBlt: %d %d -> %d %d (Buf %d x %d)\n", 60146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iTop, iLeft, iWidth, iHeight, 60246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->SrcBufferDesc.uiXResolution, 60346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->SrcBufferDesc.uiYResolution 60446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ); 60546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fflush(stdout); 60646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 60746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 60846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLIB_BITBLT(hwnd, pVideo->hidden->pchSrcBuffer, iTop, iLeft, iWidth, iHeight); 60946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 61046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 61146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DosReleaseMutexSem(pVideo->hidden->hmtxUseSrcBuffer); 61246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 61346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 61446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 61546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 61646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 61746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 61846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_PAINT : No pVideo!\n"); fflush(stdout); 61946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 62046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 62146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinEndPaint(ps); 62246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 62346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_PAINT : Done.\n"); 62446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fflush(stdout); 62546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 62646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 62746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 62846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case WM_SIZE: 62946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 63046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 63146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_SIZE : (%d %d)\n", 63246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SHORT1FROMMP(mp2), SHORT2FROMMP(mp2)); fflush(stdout); 63346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 63446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iWindowSizeX = SHORT1FROMMP(mp2); 63546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iWindowSizeY = SHORT2FROMMP(mp2); 63646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bWindowResized = 1; 63746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 63846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Make sure the window will be redrawn 63946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinInvalidateRegion(hwnd, NULL, TRUE); 64046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 64146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 64246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 64346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case WM_FSLIBNOTIFICATION: 64446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 64546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_FSLIBNOTIFICATION\n"); fflush(stdout); 64646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 64746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((int)mp1 == FSLN_TOGGLEFSMODE) 64846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 64946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // FS mode changed, reblit image! 65046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo = FSLib_GetUserParm(hwnd); 65146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pVideo) 65246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 65346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!pVideo->hidden->pSDLSurface) 65446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 65546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Resizable surface and in resizing! 65646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // So, don't blit now! 65746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 65846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_FSLIBNOTIFICATION : Can not blit if there is no surface, doing nothing.\n"); fflush(stdout); 65946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 66046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 66146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 66246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (DosRequestMutexSem(pVideo->hidden->hmtxUseSrcBuffer, 1000)==NO_ERROR) 66346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 66446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pVideo->hidden->pSDLSurface) 66546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 66646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef RESIZE_EVEN_IF_RESIZABLE 66746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWP swp; 66846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 66946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // But only blit if the window is not resizable, or if 67046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // the window is resizable and the source buffer size is the 67146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // same as the destination buffer size! 67246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowPos(hwnd, &swp); 67346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((!pVideo->hidden->pSDLSurface) || 67446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ( 67546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (pVideo->hidden->pSDLSurface) && 67646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (pVideo->hidden->pSDLSurface->flags & SDL_RESIZABLE) && 67746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((swp.cx != pVideo->hidden->SrcBufferDesc.uiXResolution) || 67846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (swp.cy != pVideo->hidden->SrcBufferDesc.uiYResolution) 67946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) && 68046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (!FSLib_QueryFSMode(hwnd)) 68146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) 68246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) 68346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 68446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Resizable surface and in resizing! 68546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // So, don't blit now! 68646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 68746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_FSLIBNOTIFICATION : Cannot blit while resizing, doing nothing.\n"); fflush(stdout); 68846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 68946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 69046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 69146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 69246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 69346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_FSLIBNOTIFICATION : Blitting!\n"); fflush(stdout); 69446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 69546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLIB_BITBLT(hwnd, pVideo->hidden->pchSrcBuffer, 69646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 0, 0, 69746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->SrcBufferDesc.uiXResolution, 69846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->SrcBufferDesc.uiYResolution); 69946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 70046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 70146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 70246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 70346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_FSLIBNOTIFICATION : No public surface!\n"); fflush(stdout); 70446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 70546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 70646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DosReleaseMutexSem(pVideo->hidden->hmtxUseSrcBuffer); 70746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 70846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 70946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 71046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 71146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return (MPARAM) 1; 71246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 71346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case WM_ACTIVATE: 71446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 71546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_ACTIVATE\n"); fflush(stdout); 71646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 71746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 71846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo = FSLib_GetUserParm(hwnd); 71946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pVideo) 72046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 72146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->fInFocus = (int) mp1; 72246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pVideo->hidden->fInFocus) 72346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 72446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Went into focus 72546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((pVideo->hidden->iMouseVisible) && (!bMouseCaptured)) 72646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE)); 72746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 72846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointer(HWND_DESKTOP, NULL); 72946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 73046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (bMouseCapturable) 73146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 73246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Re-capture the mouse, if we captured it before! 73346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetCapture(HWND_DESKTOP, hwnd); 73446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bMouseCaptured = 1; 73546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 73646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWP swpClient; 73746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner POINTL ptl; 73846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Center the mouse to the middle of the window! 73946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowPos(pVideo->hidden->hwndClient, &swpClient); 74046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.x = 0; ptl.y = 0; 74146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinMapWindowPoints(pVideo->hidden->hwndClient, HWND_DESKTOP, &ptl, 1); 74246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->iSkipWMMOUSEMOVE++; /* Don't take next WM_MOUSEMOVE into account! */ 74346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointerPos(HWND_DESKTOP, 74446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.x + swpClient.cx/2, 74546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.y + swpClient.cy/2); 74646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 74746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 74846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 74946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 75046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Went out of focus 75146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE)); 75246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 75346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (bMouseCaptured) 75446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 75546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Release the mouse 75646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetCapture(HWND_DESKTOP, hwnd); 75746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bMouseCaptured = 0; 75846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 75946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 76046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 76146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 76246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_ACTIVATE done\n"); fflush(stdout); 76346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 76446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 76546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 76646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 76746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case WM_BUTTON1DOWN: 76846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 76946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_BUTTON1DOWN\n"); fflush(stdout); 77046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 77146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 77246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo = FSLib_GetUserParm(hwnd); 77346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pVideo) 77446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 77546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateMouseButton(SDL_PRESSED, 77646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_BUTTON_LEFT, 77746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 0, 0); // Don't report mouse movement! 77846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 77946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (bMouseCapturable) 78046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 78146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // We should capture the mouse! 78246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!bMouseCaptured) 78346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 78446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetCapture(HWND_DESKTOP, hwnd); 78546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointer(HWND_DESKTOP, NULL); 78646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bMouseCaptured = 1; 78746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 78846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWP swpClient; 78946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner POINTL ptl; 79046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Center the mouse to the middle of the window! 79146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowPos(pVideo->hidden->hwndClient, &swpClient); 79246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.x = 0; ptl.y = 0; 79346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinMapWindowPoints(pVideo->hidden->hwndClient, HWND_DESKTOP, &ptl, 1); 79446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->iSkipWMMOUSEMOVE++; /* Don't take next WM_MOUSEMOVE into account! */ 79546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointerPos(HWND_DESKTOP, 79646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.x + swpClient.cx/2, 79746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.y + swpClient.cy/2); 79846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 79946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 80046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 80146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 80246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 80346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case WM_BUTTON1UP: 80446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 80546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_BUTTON1UP\n"); fflush(stdout); 80646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 80746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateMouseButton(SDL_RELEASED, 80846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_BUTTON_LEFT, 80946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 0, 0); // Don't report mouse movement! 81046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 81146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case WM_BUTTON2DOWN: 81246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 81346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_BUTTON2DOWN\n"); fflush(stdout); 81446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 81546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 81646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo = FSLib_GetUserParm(hwnd); 81746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pVideo) 81846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 81946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateMouseButton(SDL_PRESSED, 82046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_BUTTON_RIGHT, 82146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 0, 0); // Don't report mouse movement! 82246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 82346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (bMouseCapturable) 82446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 82546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // We should capture the mouse! 82646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!bMouseCaptured) 82746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 82846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetCapture(HWND_DESKTOP, hwnd); 82946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointer(HWND_DESKTOP, NULL); 83046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bMouseCaptured = 1; 83146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 83246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWP swpClient; 83346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner POINTL ptl; 83446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Center the mouse to the middle of the window! 83546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowPos(pVideo->hidden->hwndClient, &swpClient); 83646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.x = 0; ptl.y = 0; 83746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinMapWindowPoints(pVideo->hidden->hwndClient, HWND_DESKTOP, &ptl, 1); 83846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->iSkipWMMOUSEMOVE++; /* Don't take next WM_MOUSEMOVE into account! */ 83946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointerPos(HWND_DESKTOP, 84046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.x + swpClient.cx/2, 84146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.y + swpClient.cy/2); 84246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 84346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 84446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 84546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 84646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 84746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 84846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case WM_BUTTON2UP: 84946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 85046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_BUTTON2UP\n"); fflush(stdout); 85146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 85246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateMouseButton(SDL_RELEASED, 85346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_BUTTON_RIGHT, 85446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 0, 0); // Don't report mouse movement! 85546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 85646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case WM_BUTTON3DOWN: 85746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 85846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_BUTTON3DOWN\n"); fflush(stdout); 85946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 86046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 86146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo = FSLib_GetUserParm(hwnd); 86246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pVideo) 86346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 86446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateMouseButton(SDL_PRESSED, 86546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_BUTTON_MIDDLE, 86646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 0, 0); // Don't report mouse movement! 86746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 86846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (bMouseCapturable) 86946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 87046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // We should capture the mouse! 87146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!bMouseCaptured) 87246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 87346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetCapture(HWND_DESKTOP, hwnd); 87446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointer(HWND_DESKTOP, NULL); 87546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bMouseCaptured = 1; 87646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 87746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWP swpClient; 87846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner POINTL ptl; 87946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Center the mouse to the middle of the window! 88046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowPos(pVideo->hidden->hwndClient, &swpClient); 88146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.x = 0; ptl.y = 0; 88246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinMapWindowPoints(pVideo->hidden->hwndClient, HWND_DESKTOP, &ptl, 1); 88346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->iSkipWMMOUSEMOVE++; /* Don't take next WM_MOUSEMOVE into account! */ 88446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointerPos(HWND_DESKTOP, 88546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.x + swpClient.cx/2, 88646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.y + swpClient.cy/2); 88746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 88846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 88946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 89046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 89146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 89246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case WM_BUTTON3UP: 89346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 89446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_BUTTON3UP\n"); fflush(stdout); 89546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 89646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateMouseButton(SDL_RELEASED, 89746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_BUTTON_MIDDLE, 89846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 0, 0); // Don't report mouse movement! 89946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 90046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case WM_MOUSEMOVE: 90146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 90246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// printf("WM_MOUSEMOVE\n"); fflush(stdout); 90346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 90446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 90546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo = FSLib_GetUserParm(hwnd); 90646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pVideo) 90746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 90846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pVideo->hidden->iSkipWMMOUSEMOVE) 90946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 91046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->iSkipWMMOUSEMOVE--; 91146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 91246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 91346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner POINTS *ppts = (POINTS *) (&mp1); 91446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner POINTL ptl; 91546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 91646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (bMouseCaptured) 91746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 91846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWP swpClient; 91946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 92046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowPos(pVideo->hidden->hwndClient, &swpClient); 92146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 92246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Send relative mouse position, and re-center the mouse 92346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Reposition the mouse to the center of the screen/window 92446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateMouseMotion(0, // Buttons not changed 92546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1, // Relative position 92646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ppts->x - (swpClient.cx/2), 92746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (swpClient.cy/2) - ppts->y); 92846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 92946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.x = 0; ptl.y = 0; 93046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinMapWindowPoints(pVideo->hidden->hwndClient, HWND_DESKTOP, &ptl, 1); 93146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->iSkipWMMOUSEMOVE++; /* Don't take next WM_MOUSEMOVE into account! */ 93246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Center the mouse to the middle of the window! 93346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointerPos(HWND_DESKTOP, 93446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.x + swpClient.cx/2, 93546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.y + swpClient.cy/2); 93646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 93746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 93846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner CONVERTMOUSEPOSITION(); 93946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 94046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Send absolute mouse position 94146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateMouseMotion(0, // Buttons not changed 94246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 0, // Absolute position 94346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ppts->x, 94446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ppts->y); 94546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 94646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 94746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((pVideo->hidden->iMouseVisible) && (!bMouseCaptured)) 94846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 94946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 95046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// printf("WM_MOUSEMOVE : ptr = %p\n", hptrGlobalPointer); fflush(stdout); 95146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 95246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 95346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (hptrGlobalPointer) 95446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointer(HWND_DESKTOP, hptrGlobalPointer); 95546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 95646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE)); 95746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 95846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 95946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 96046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointer(HWND_DESKTOP, NULL); 96146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 96246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 96346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 96446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// printf("WM_MOUSEMOVE done\n"); fflush(stdout); 96546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 96646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 96746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return (MRESULT) FALSE; 96846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case WM_CLOSE: // Window close 96946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 97046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("WM_CLOSE\n"); fflush(stdout); 97146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 97246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 97346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo = FSLib_GetUserParm(hwnd); 97446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pVideo) 97546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 97646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Send Quit message to the SDL application! 97746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateQuit(); 97846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 97946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 98046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 98146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 98246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef BITBLT_IN_WINMESSAGEPROC 98346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case WM_UPDATERECTSREQUEST: 98446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo = FSLib_GetUserParm(hwnd); 98546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((pVideo) && (pVideo->hidden->pSDLSurface)) 98646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 98746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (DosRequestMutexSem(pVideo->hidden->hmtxUseSrcBuffer, SEM_INDEFINITE_WAIT)==NO_ERROR) 98846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 98946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int numrects; 99046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_Rect *rects; 99146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int i; 99246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWP swp; 99346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 99446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner numrects = (int) mp1; 99546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rects = (SDL_Rect *) mp2; 99646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 99746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowPos(hwnd, &swp); 99846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef RESIZE_EVEN_IF_RESIZABLE 99946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((!pVideo->hidden->pSDLSurface) || 100046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ( 100146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (pVideo->hidden->pSDLSurface) && 100246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (pVideo->hidden->pSDLSurface->flags & SDL_RESIZABLE) && 100346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((swp.cx != pVideo->hidden->SrcBufferDesc.uiXResolution) || 100446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (swp.cy != pVideo->hidden->SrcBufferDesc.uiYResolution) 100546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) && 100646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (!FSLib_QueryFSMode(hwnd)) 100746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) 100846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) 100946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 101046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Resizable surface and in resizing! 101146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // So, don't blit now! 101246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 101346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[WM_UPDATERECTSREQUEST] : Skipping blit while resizing!\n"); fflush(stdout); 101446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 101546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 101646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 101746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 101846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 101946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[WM_UPDATERECTSREQUEST] : Blitting!\n"); fflush(stdout); 102046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 102146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 102246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Blit the changed areas 102346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (i=0; i<numrects; i++) 102446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLIB_BITBLT(hwnd, pVideo->hidden->pchSrcBuffer, 102546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rects[i].y, rects[i].x, rects[i].w, rects[i].h); 102646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 102746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DosReleaseMutexSem(pVideo->hidden->hmtxUseSrcBuffer); 102846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 102946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 103046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 103146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 103246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 103346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner default: 103446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 103546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("Unhandled: %x\n", msg); fflush(stdout); 103646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 103746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 103846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 103946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 104046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Run the default window procedure for unhandled stuffs 104146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return WinDefWindowProc(hwnd, msg, mp1, mp2); 104246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 104346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 104446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner///////////////////////////////////////////////////////////////////// 104546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// 104646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// FrameWndProc 104746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// 104846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// This is the message processing window procedure for the 104946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// frame window of SDLWindowClass. 105046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// 105146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner///////////////////////////////////////////////////////////////////// 105246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic MRESULT EXPENTRY FrameWndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 105346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 105446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PFNWP pOldFrameProc; 105546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MRESULT result; 105646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PTRACKINFO ti; 105746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int cx, cy, ncx, ncy; 105846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner RECTL rclTemp; 105946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PSWP pswpTemp; 106046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 106146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_VideoDevice *pVideo = NULL; 106246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 106346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo = (SDL_VideoDevice *) WinQueryWindowULong(hwnd, QWL_USER); 106446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 106546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pOldFrameProc = pVideo->hidden->pfnOldFrameProc; 106646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 106746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((pVideo->hidden->bProportionalResize) && 106846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (msg==WM_ADJUSTWINDOWPOS) && 106946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (!FSLib_QueryFSMode(pVideo->hidden->hwndClient)) 107046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) 107146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 107246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pswpTemp = (PSWP) mp1; 107346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 107446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Resizing? */ 107546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pswpTemp->fl & SWP_SIZE) 107646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 107746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Calculate client size */ 107846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rclTemp.xLeft = pswpTemp->x; 107946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rclTemp.xRight = pswpTemp->x + pswpTemp->cx; 108046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rclTemp.yBottom = pswpTemp->y; 108146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rclTemp.yTop = pswpTemp->y + pswpTemp->cy; 108246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinCalcFrameRect(hwnd, &rclTemp, TRUE); 108346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 108446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ncx = cx = rclTemp.xRight - rclTemp.xLeft; 108546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ncy = cy = rclTemp.yTop - rclTemp.yBottom; 108646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 108746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Calculate new size to keep it proportional */ 108846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 108946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((pVideo->hidden->ulResizingFlag & TF_LEFT) || (pVideo->hidden->ulResizingFlag & TF_RIGHT)) 109046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 109146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* The window is resized horizontally */ 109246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ncy = pVideo->hidden->SrcBufferDesc.uiYResolution * cx / pVideo->hidden->SrcBufferDesc.uiXResolution; 109346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 109446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((pVideo->hidden->ulResizingFlag & TF_TOP) || (pVideo->hidden->ulResizingFlag & TF_BOTTOM)) 109546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 109646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* The window is resized vertically */ 109746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ncx = pVideo->hidden->SrcBufferDesc.uiXResolution * cy / pVideo->hidden->SrcBufferDesc.uiYResolution; 109846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 109946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 110046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Calculate back frame coordinates */ 110146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rclTemp.xLeft = pswpTemp->x; 110246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rclTemp.xRight = pswpTemp->x + ncx; 110346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rclTemp.yBottom = pswpTemp->y; 110446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rclTemp.yTop = pswpTemp->y + ncy; 110546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinCalcFrameRect(hwnd, &rclTemp, FALSE); 110646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 110746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Store new size/position info */ 110846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pswpTemp->cx = rclTemp.xRight - rclTemp.xLeft; 110946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 111046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!(pVideo->hidden->ulResizingFlag & TF_TOP)) 111146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 111246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pswpTemp->y = pswpTemp->y + pswpTemp->cy - (rclTemp.yTop - rclTemp.yBottom); 111346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pswpTemp->cy = rclTemp.yTop - rclTemp.yBottom; 111446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 111546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 111646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pswpTemp->cy = rclTemp.yTop - rclTemp.yBottom; 111746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 111846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 111946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 112046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 112146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner result = (*pOldFrameProc)(hwnd, msg, mp1, mp2); 112246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 112346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((pVideo->hidden->bProportionalResize) && (msg==WM_QUERYTRACKINFO)) 112446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 112546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ti = (PTRACKINFO) mp2; 112646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 112746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Store the direction of resizing */ 112846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((ti->fs & TF_LEFT) || (ti->fs & TF_RIGHT) || 112946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (ti->fs & TF_TOP) || (ti->fs & TF_BOTTOM)) 113046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->ulResizingFlag = ti->fs; 113146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 113246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 113346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return result; 113446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 113546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 113646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner///////////////////////////////////////////////////////////////////// 113746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// 113846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// PMThreadFunc 113946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// 114046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// This function implements the PM-Thread, which initializes the 114146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// application window itself, the DIVE, and start message processing. 114246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// 114346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner///////////////////////////////////////////////////////////////////// 114446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint iNumOfPMThreadInstances = 0; // Global! 114546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void PMThreadFunc(void *pParm) 114646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 114746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_VideoDevice *pVideo = pParm; 114846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HAB hab; 114946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HMQ hmq; 115046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner QMSG msg; 115146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ULONG fcf; 115246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 115346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 115446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[PMThreadFunc] : Starting\n"); fflush(stdout); 115546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 115646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 115746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iNumOfPMThreadInstances++; 115846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 115946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Initialize PM, create a message queue. 116046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 116146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hab=WinInitialize(0); 116246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hmq=WinCreateMsgQueue(hab,0); 116346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (hmq==0) 116446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 116546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 116646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[PMThreadFunc] : Could not create message queue!\n"); 116746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf(" It might be that the application using SDL is not a PM app!\n"); 116846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fflush(stdout); 116946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 117046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->iPMThreadStatus = 2; 117146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 117246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 117346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int rc; 117446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner RECTL rectl; 117546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 117646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fcf = ulFCFToUse; // Get from global setting 117746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 117846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 117946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[PMThreadFunc] : FSLib_CreateWindow()!\n"); 118046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fflush(stdout); 118146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 118246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 118346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rc = FSLib_CreateWindow(HWND_DESKTOP, 0, &fcf, 118446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner "SDL Application", 118546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner NULLHANDLE, 0, 118646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner &(pVideo->hidden->SrcBufferDesc), 118746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WndProc, 118846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner &(pVideo->hidden->hwndClient), 118946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner &(pVideo->hidden->hwndFrame)); 119046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 119146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 119246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[PMThreadFunc] : FSLib_CreateWindow() rc = %d\n", rc); 119346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fflush(stdout); 119446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 119546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 119646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!rc) 119746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 119846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 119946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[PMThreadFunc] : Could not create FSLib window!\n"); 120046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fflush(stdout); 120146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 120246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->iPMThreadStatus = 3; 120346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 120446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 120546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 120646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[PMThreadFunc] : FSLib_AddUserParm()!\n"); 120746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fflush(stdout); 120846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 120946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 121046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Store pVideo pointer in window data for client window, so 121146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // it will know the instance to which it belongs to. 121246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLib_AddUserParm(pVideo->hidden->hwndClient, pVideo); 121346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 121446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Now set default image width height and fourcc! 121546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 121646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[PMThreadFunc] : SetWindowPos()!\n"); 121746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fflush(stdout); 121846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 121946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 122046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Set the position and size of the main window, 122146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // and make it visible! 122246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Calculate frame window size from client window size 122346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rectl.xLeft = 0; 122446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rectl.yBottom = 0; 122546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rectl.xRight = pVideo->hidden->SrcBufferDesc.uiXResolution; // Noninclusive 122646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rectl.yTop = pVideo->hidden->SrcBufferDesc.uiYResolution; // Noninclusive 122746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinCalcFrameRect(pVideo->hidden->hwndFrame, &rectl, FALSE); 122846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 122946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SetAccessableWindowPos(pVideo->hidden->hwndFrame, 123046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWND_TOP, 123146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (WinQuerySysValue (HWND_DESKTOP, SV_CXSCREEN) - (rectl.xRight-rectl.xLeft)) / 2, 123246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (WinQuerySysValue (HWND_DESKTOP, SV_CYSCREEN) - (rectl.yTop-rectl.yBottom)) / 2, 123346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (rectl.xRight-rectl.xLeft), 123446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (rectl.yTop-rectl.yBottom), 123546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWP_SIZE | SWP_ACTIVATE | SWP_SHOW | SWP_MOVE); 123646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 123746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Subclass frame procedure and store old window proc address 123846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->pfnOldFrameProc = 123946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSubclassWindow(pVideo->hidden->hwndFrame, FrameWndProc); 124046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetWindowULong(pVideo->hidden->hwndFrame, QWL_USER, (ULONG) pVideo); 124146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 124246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 124346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[PMThreadFunc] : Entering message loop\n"); fflush(stdout); 124446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 124546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->iPMThreadStatus = 1; 124646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 124746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while (WinGetMsg(hab, (PQMSG)&msg, 0, 0, 0)) 124846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinDispatchMsg(hab, (PQMSG) &msg); 124946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 125046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 125146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[PMThreadFunc] : Leaving message loop\n"); fflush(stdout); 125246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 125346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // We should release the captured the mouse! 125446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (bMouseCaptured) 125546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 125646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetCapture(HWND_DESKTOP, NULLHANDLE); 125746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bMouseCaptured = 0; 125846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 125946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Destroy our window 126046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinDestroyWindow(pVideo->hidden->hwndFrame); pVideo->hidden->hwndFrame=NULL; 126146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Show pointer to make sure it will not be left hidden. 126246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE)); 126346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinShowPointer(HWND_DESKTOP, TRUE); 126446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 126546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Uninitialize PM 126646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinDestroyMsgQueue(hmq); 126746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // All done! 126846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pVideo->hidden->iPMThreadStatus = 0; 126946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 127046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinTerminate(hab); 127146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Commented out, should not be needed anymore, because we send it 127246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner from WM_CLOSE. 127346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Notify SDL that it should really die now... 127446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateQuit(); SDL_PrivateQuit(); SDL_PrivateQuit(); //... :)) 127546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 127646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 127746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[PMThreadFunc] : End, status is %d!\n", pVideo->hidden->iPMThreadStatus); fflush(stdout); 127846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 127946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 128046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iNumOfPMThreadInstances--; 128146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 128246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // HACK to prevent zombie and hanging SDL applications, which does not take 128346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // care of closing the window for some reason: 128446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // There are some apps which do not process messages, so do a lot of things 128546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // without noticing that the application should close. To close these, 128646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // I've thought about the following: 128746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If the window is closed (the execution came here), I wait a bit to 128846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // give time to the app to finish its execution. If it does not, I kill it 128946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // using DosExit(). Brute force, but should work. 129046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pVideo->hidden->iPMThreadStatus==0) 129146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 129246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DosSleep(5000); // Wait 5 secs 129346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If a new PM thread has been spawned (reinitializing video mode), then all right. 129446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Otherwise, we have a problem, the app doesn't want to stop. Kill! 129546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (iNumOfPMThreadInstances==0) 129646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 129746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 129846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[PMThreadFunc] : It seems that the application haven't terminated itself\n"); fflush(stdout); 129946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[PMThreadFunc] : in the last 5 seconds, so we go berserk.\n"); fflush(stdout); 130046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[PMThreadFunc] : Brute force mode. :) Killing process! Dieeeee...\n"); fflush(stdout); 130146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 130246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DosExit(EXIT_PROCESS, -1); 130346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 130446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 130546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _endthread(); 130646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 130746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 130846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstruct WMcursor 130946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 131046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HBITMAP hbm; 131146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HPOINTER hptr; 131246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner char *pchData; 131346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}; 131446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 131546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Free a window manager cursor */ 131646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid os2fslib_FreeWMCursor(_THIS, WMcursor *cursor) 131746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 131846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (cursor) 131946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 132046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner GpiDeleteBitmap(cursor->hbm); 132146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinDestroyPointer(cursor->hptr); 132246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(cursor->pchData); 132346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(cursor); 132446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 132546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 132646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 132746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Local functions to convert the SDL cursor mask into OS/2 format */ 132846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void memnot(Uint8 *dst, Uint8 *src, int len) 132946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 133046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while ( len-- > 0 ) 133146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dst++ = ~*src++; 133246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 133346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void memxor(Uint8 *dst, Uint8 *src1, Uint8 *src2, int len) 133446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 133546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while ( len-- > 0 ) 133646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dst++ = (*src1++)^(*src2++); 133746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 133846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 133946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Create a black/white window manager cursor */ 134046be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerWMcursor *os2fslib_CreateWMCursor_Win(_THIS, Uint8 *data, Uint8 *mask, 134146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int w, int h, int hot_x, int hot_y) 134246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 134346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HPOINTER hptr; 134446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HBITMAP hbm; 134546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner BITMAPINFOHEADER bmih; 134646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner BMPINFO bmi; 134746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HPS hps; 134846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner char *pchTemp; 134946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner char *xptr, *aptr; 135046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int maxx, maxy; 135146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int i, run, pad; 135246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WMcursor *pResult; 135346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 135446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner maxx = WinQuerySysValue(HWND_DESKTOP, SV_CXPOINTER); 135546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner maxy = WinQuerySysValue(HWND_DESKTOP, SV_CYPOINTER); 135646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 135746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Check for max size! 135846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((w>maxx) || (h>maxy)) 135946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return (WMcursor *) NULL; 136046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 136146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult = (WMcursor *) SDL_malloc(sizeof(WMcursor)); 136246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!pResult) return (WMcursor *) NULL; 136346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 136446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pchTemp = (char *) SDL_malloc((maxx + 7)/8 * maxy*2); 136546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!pchTemp) 136646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 136746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(pResult); 136846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return (WMcursor *) NULL; 136946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 137046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 137146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(pchTemp, 0, (maxx + 7)/8 * maxy*2); 137246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 137346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hps = WinGetPS(_this->hidden->hwndClient); 137446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 137546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmi.cbFix = sizeof(BITMAPINFOHEADER); 137646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmi.cx = maxx; 137746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmi.cy = 2*maxy; 137846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmi.cPlanes = 1; 137946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmi.cBitCount = 1; 138046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmi.argbColor[0].bBlue = 0x00; 138146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmi.argbColor[0].bGreen = 0x00; 138246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmi.argbColor[0].bRed = 0x00; 138346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmi.argbColor[1].bBlue = 0x00; 138446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmi.argbColor[1].bGreen = 0x00; 138546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmi.argbColor[1].bRed = 0xff; 138646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 138746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&bmih, 0, sizeof(BITMAPINFOHEADER)); 138846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmih.cbFix = sizeof(BITMAPINFOHEADER); 138946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmih.cx = maxx; 139046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmih.cy = 2*maxy; 139146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmih.cPlanes = 1; 139246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmih.cBitCount = 1; 139346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 139446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner run = (w+7)/8; 139546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pad = (maxx+7)/8 - run; 139646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 139746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (i=0; i<h; i++) 139846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 139946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner xptr = pchTemp + (maxx+7)/8 * (maxy-1-i); 140046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner aptr = pchTemp + (maxx+7)/8 * (maxy+maxy-1-i); 140146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner memxor(xptr, data, mask, run); 140246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner xptr += run; 140346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner data += run; 140446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner memnot(aptr, mask, run); 140546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mask += run; 140646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner aptr += run; 140746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(xptr, 0, pad); 140846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner xptr += pad; 140946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(aptr, ~0, pad); 141046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner aptr += pad; 141146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 141246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pad += run; 141346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (i=h ; i<maxy; i++ ) 141446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 141546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner xptr = pchTemp + (maxx+7)/8 * (maxy-1-i); 141646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner aptr = pchTemp + (maxx+7)/8 * (maxy+maxy-1-i); 141746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 141846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(xptr, 0, (maxx+7)/8); 141946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner xptr += (maxx+7)/8; 142046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(aptr, ~0, (maxx+7)/8); 142146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner aptr += (maxx+7)/8; 142246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 142346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 142446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hbm = GpiCreateBitmap(hps, (PBITMAPINFOHEADER2)&bmih, CBM_INIT, (PBYTE) pchTemp, (PBITMAPINFO2)&bmi); 142546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hptr = WinCreatePointer(HWND_DESKTOP, hbm, TRUE, hot_x, maxy - hot_y - 1); 142646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 142746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 142846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("HotSpot : %d ; %d\n", hot_x, hot_y); 142946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("HPS returned : %x\n", (ULONG)hps); 143046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("HBITMAP returned : %x\n", (ULONG)hbm); 143146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("HPOINTER returned: %x\n", (ULONG)hptr); 143246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 143346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 143446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinReleasePS(hps); 143546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 143646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 143746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[CreateWMCursor] : ptr = %p\n", hptr); fflush(stdout); 143846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 143946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 144046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->hptr = hptr; 144146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->hbm = hbm; 144246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->pchData = pchTemp; 144346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 144446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 144546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[CreateWMCursor] : ptr = %p return.\n", hptr); fflush(stdout); 144646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 144746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 144846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return (WMcursor *) pResult; 144946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 145046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 145146be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerWMcursor *os2fslib_CreateWMCursor_FS(_THIS, Uint8 *data, Uint8 *mask, 145246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int w, int h, int hot_x, int hot_y) 145346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 145446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 145546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[CreateWMCursor_FS] : returning pointer NULL\n"); fflush(stdout); 145646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 145746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 145846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // In FS mode we'll use software cursor 145946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return (WMcursor *) NULL; 146046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 146146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 146246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Show the specified cursor, or hide if cursor is NULL */ 146346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint os2fslib_ShowWMCursor(_THIS, WMcursor *cursor) 146446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 146546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 146646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[ShowWMCursor] : ptr = %p\n", cursor); fflush(stdout); 146746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 146846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 146946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (cursor) 147046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 147146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointer(HWND_DESKTOP, cursor->hptr); 147246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hptrGlobalPointer = cursor->hptr; 147346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->iMouseVisible = 1; 147446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 147546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 147646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 147746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointer(HWND_DESKTOP, FALSE); 147846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hptrGlobalPointer = NULL; 147946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->iMouseVisible = 0; 148046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 148146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 148246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 148346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[ShowWMCursor] : ptr = %p, DONE\n", cursor); fflush(stdout); 148446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 148546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 148646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 1; 148746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 148846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 148946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Warp the window manager cursor to (x,y) 149046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner If NULL, a mouse motion event is posted internally. 149146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 149246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid os2fslib_WarpWMCursor(_THIS, Uint16 x, Uint16 y) 149346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 149446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner LONG lx, ly; 149546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWP swpClient; 149646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner POINTL ptlPoints; 149746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowPos(_this->hidden->hwndClient, &swpClient); 149846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptlPoints.x = swpClient.x; 149946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptlPoints.y = swpClient.y; 150046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinMapWindowPoints(_this->hidden->hwndFrame, HWND_DESKTOP, &ptlPoints, 1); 150146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner lx = ptlPoints.x + (x*swpClient.cx) / _this->hidden->SrcBufferDesc.uiXResolution; 150246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ly = ptlPoints.y + swpClient.cy - ((y*swpClient.cy) / _this->hidden->SrcBufferDesc.uiYResolution) - 1; 150346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 150446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateMouseMotion(0, // Buttons not changed 150546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 0, // Absolute position 150646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner x, 150746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner y); 150846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 150946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointerPos(HWND_DESKTOP, lx, ly); 151046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 151146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 151246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 151346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* If not NULL, this is called when a mouse motion event occurs */ 151446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid os2fslib_MoveWMCursor(_THIS, int x, int y) 151546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 151646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* 151746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_Rect rect; 151846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 151946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 152046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[MoveWMCursor] : at %d ; %d\n", x, y); fflush(stdout); 152146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 152246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 152346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rect.x = x; 152446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rect.y = y; 152546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rect.w = 32; 152646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rect.h = 32; 152746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner os2fslib_UpdateRects(_this, 1, &rect); 152846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // TODO! 152946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 153046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 153146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 153246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Determine whether the mouse should be in relative mode or not. 153346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This function is called when the input grab state or cursor 153446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner visibility state changes. 153546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner If the cursor is not visible, and the input is grabbed, the 153646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner driver can place the mouse in relative mode, which may result 153746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner in higher accuracy sampling of the pointer motion. 153846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 153946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid os2fslib_CheckMouseMode(_THIS) 154046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 154146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 154246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 154346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void os2fslib_PumpEvents(_THIS) 154446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 154546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Notify SDL that if window has been resized! 154646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( 154746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (_this->hidden->pSDLSurface) && 154846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (_this->hidden->pSDLSurface->flags & SDL_RESIZABLE) && 154946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ( 155046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (_this->hidden->SrcBufferDesc.uiXResolution!=iWindowSizeX) || 155146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (_this->hidden->SrcBufferDesc.uiYResolution!=iWindowSizeY) 155246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) && 155346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (iWindowSizeX>0) && 155446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (iWindowSizeY>0) 155546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) 155646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 155746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner static time_t prev_time; 155846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner time_t curr_time; 155946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 156046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner curr_time = time(NULL); 156146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((difftime(curr_time, prev_time)>=0.25) || 156246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (bWindowResized)) 156346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 156446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Make sure we won't flood the event queue with resize events, 156546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // only send them at 250 msecs! 156646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // (or when the window is resized) 156746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 156846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_PumpEvents] : Calling PrivateResize (%d %d).\n", 156946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iWindowSizeX, iWindowSizeY); 157046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fflush(stdout); 157146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 157246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Tell SDL the new size 157346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateResize(iWindowSizeX, iWindowSizeY); 157446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner prev_time = curr_time; 157546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bWindowResized = 0; 157646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 157746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 157846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 157946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 158046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* We don't actually allow hardware surfaces other than the main one */ 158146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int os2fslib_AllocHWSurface(_THIS, SDL_Surface *surface) 158246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 158346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(-1); 158446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 158546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void os2fslib_FreeHWSurface(_THIS, SDL_Surface *surface) 158646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 158746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return; 158846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 158946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 159046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* We need to wait for vertical retrace on page flipped displays */ 159146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int os2fslib_LockHWSurface(_THIS, SDL_Surface *surface) 159246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 159346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(0); 159446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 159546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 159646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void os2fslib_UnlockHWSurface(_THIS, SDL_Surface *surface) 159746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 159846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return; 159946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 160046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 160146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int os2fslib_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) 160246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 160346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetColors] : TODO!\n"); fflush(stdout); 160446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // TODO: Implement paletted modes 160546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(1); 160646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 160746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 160846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void os2fslib_DestroyIcon(HWND hwndFrame) 160946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 161046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (hptrCurrentIcon) 161146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 161246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinDestroyPointer(hptrCurrentIcon); 161346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hptrCurrentIcon = NULL; 161446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 161546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSendMsg(hwndFrame, 161646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WM_SETICON, 161746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner NULL, 161846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner NULL); 161946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 162046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 162146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 162246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 162346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Set the window icon image */ 162446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid os2fslib_SetIcon(_THIS, SDL_Surface *icon, Uint8 *mask) 162546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 162646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWND hwndFrame; 162746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_Surface *icon_rgb; 162846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HPOINTER hptrIcon; 162946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HBITMAP hbm; 163046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner BITMAPINFOHEADER bmih; 163146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner BMPINFO bmi; 163246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HPS hps; 163346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner char *pchTemp; 163446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner char *pptr, *mptr, *dptr, *dmptr; 163546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int maxx, maxy, w, h, x, y; 163646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_Rect bounds; 163746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 163846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 163946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetIcon] : Creating and setting new icon\n"); fflush(stdout); 164046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 164146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 164246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hwndFrame = WinQueryWindow(_this->hidden->hwndClient, QW_PARENT); 164346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 164446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Make sure the old icon resource will be free'd! 164546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner os2fslib_DestroyIcon(hwndFrame); 164646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 164746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((!icon) || (!mask)) 164846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return; 164946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 165046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner w = icon->w; 165146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner h = icon->h; 165246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 165346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner maxx = WinQuerySysValue(HWND_DESKTOP, SV_CXICON); 165446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner maxy = WinQuerySysValue(HWND_DESKTOP, SV_CYICON); 165546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 165646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Check for max size! 165746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((w>maxx) || (h>maxy)) 165846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return; 165946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 166046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pchTemp = (char *) SDL_malloc(w * h*2 * 4); 166146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!pchTemp) 166246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return; 166346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 166446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(pchTemp, 0, w * h*2 * 4); 166546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 166646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Convert surface to RGB, if it's not RGB yet! 166746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner icon_rgb = SDL_CreateRGBSurface(SDL_SWSURFACE, icon->w, icon->h, 166846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 32, 0, 0, 0, 0); 166946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( icon_rgb == NULL ) 167046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 167146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(pchTemp); 167246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return; 167346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 167446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bounds.x = 0; 167546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bounds.y = 0; 167646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bounds.w = icon->w; 167746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bounds.h = icon->h; 167846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( SDL_LowerBlit(icon, &bounds, icon_rgb, &bounds) < 0 ) 167946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 168046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_FreeSurface(icon_rgb); 168146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(pchTemp); 168246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return; 168346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 168446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 168546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Copy pixels upside-down from RGB surface into BMP, masked with the icon mask */ 168646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 168746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Pixels 168846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pptr = (char *) (icon_rgb->pixels); 168946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Mask 169046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mptr = mask; 169146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 169246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (y=0; y<h; y++) 169346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 169446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner unsigned char uchMaskByte; 169546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 169646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Destination 169746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dptr = pchTemp + w*4 * (h-y-1); 169846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Destination mask 169946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dmptr = pchTemp + w*h*4 + w*4 * (h-y-1); 170046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 170146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (x=0; x<w; x++) 170246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 170346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (x%8==0) 170446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 170546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner uchMaskByte = (unsigned char) (*mptr); 170646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mptr++; 170746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 170846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner uchMaskByte <<= 1; 170946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 171046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (uchMaskByte & 0x80) 171146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 171246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Copy RGB 171346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dptr++ = *pptr++; 171446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dptr++ = *pptr++; 171546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dptr++ = *pptr++; 171646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dptr++ = *pptr++; 171746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 171846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dmptr++ = 0; 171946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dmptr++ = 0; 172046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dmptr++ = 0; 172146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dmptr++ = 0; 172246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 172346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 172446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Set pixels to fully transparent 172546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dptr++ = 0; pptr++; 172646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dptr++ = 0; pptr++; 172746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dptr++ = 0; pptr++; 172846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dptr++ = 0; pptr++; 172946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 173046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dmptr++ = 255; 173146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dmptr++ = 255; 173246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dmptr++ = 255; 173346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dmptr++ = 255; 173446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 173546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 173646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 173746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 173846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // There is no more need for the RGB surface 173946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_FreeSurface(icon_rgb); 174046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 174146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hps = WinGetPS(_this->hidden->hwndClient); 174246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 174346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmi.cbFix = sizeof(BITMAPINFOHEADER); 174446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmi.cx = w; 174546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmi.cy = 2*h; 174646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmi.cPlanes = 1; 174746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmi.cBitCount = 32; 174846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 174946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(&bmih, 0, sizeof(BITMAPINFOHEADER)); 175046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmih.cbFix = sizeof(BITMAPINFOHEADER); 175146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmih.cx = w; 175246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmih.cy = 2*h; 175346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmih.cPlanes = 1; 175446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bmih.cBitCount = 32; 175546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 175646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hbm = GpiCreateBitmap(hps, (PBITMAPINFOHEADER2)&bmih, CBM_INIT, (PBYTE) pchTemp, (PBITMAPINFO2)&bmi); 175746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hptrIcon = WinCreatePointer(HWND_DESKTOP, hbm, FALSE, 0, 0); 175846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 175946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinReleasePS(hps); 176046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 176146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Free pixel array 176246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(pchTemp); 176346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 176446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Change icon in frame window 176546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSendMsg(hwndFrame, 176646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WM_SETICON, 176746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (MPARAM) hptrIcon, 176846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner NULL); 176946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 177046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* 177146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Change icon in switchlist 177246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Seems like it's not needed, the WM_SETICON already does it. 177346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 177446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PID pidFrame; 177546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HSWITCH hswitchFrame; 177646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWCNTRL swctl; 177746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 177846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowProcess(hwndFrame, &pidFrame, NULL); 177946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hswitchFrame = WinQuerySwitchHandle(hwndFrame, pidFrame); 178046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQuerySwitchEntry(hswitchFrame, &swctl); 178146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 178246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner swctl.hwndIcon = hptrIcon; 178346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 178446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinChangeSwitchEntry(hswitchFrame, &swctl); 178546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 178646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 178746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 178846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Store icon handle in global variable 178946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hptrCurrentIcon = hptrIcon; 179046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 179146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 179246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// ------------------------ REAL FUNCTIONS ----------------- 179346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 179446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 179546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void os2fslib_SetCursorManagementFunctions(_THIS, int iForWindowedMode) 179646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 179746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (iForWindowedMode) 179846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 179946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->FreeWMCursor = os2fslib_FreeWMCursor; 180046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->CreateWMCursor = os2fslib_CreateWMCursor_Win; 180146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->ShowWMCursor = os2fslib_ShowWMCursor; 180246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->WarpWMCursor = os2fslib_WarpWMCursor; 180346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->MoveWMCursor = os2fslib_MoveWMCursor; 180446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->CheckMouseMode = NULL;//os2fslib_CheckMouseMode; 180546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 180646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 180746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // We'll have software mouse cursor in FS mode! 180846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->FreeWMCursor = os2fslib_FreeWMCursor; 180946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->CreateWMCursor = os2fslib_CreateWMCursor_FS; 181046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->ShowWMCursor = os2fslib_ShowWMCursor; 181146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->WarpWMCursor = os2fslib_WarpWMCursor; 181246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->MoveWMCursor = os2fslib_MoveWMCursor; 181346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->CheckMouseMode = NULL;//os2fslib_CheckMouseMode; 181446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 181546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 181646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 181746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void os2fslib_InitOSKeymap(_THIS) 181846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 181946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int i; 182046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 182146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iShiftIsPressed = 0; 182246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 182346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Map the VK and CH keysyms */ 182446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for ( i=0; i<=255; ++i ) 182546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[i] = SDLK_UNKNOWN; 182646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 182746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // First line of keyboard: 182846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x1] = SDLK_ESCAPE; 182946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x3b] = SDLK_F1; 183046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x3c] = SDLK_F2; 183146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x3d] = SDLK_F3; 183246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x3e] = SDLK_F4; 183346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x3f] = SDLK_F5; 183446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x40] = SDLK_F6; 183546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x41] = SDLK_F7; 183646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x42] = SDLK_F8; 183746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x43] = SDLK_F9; 183846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x44] = SDLK_F10; 183946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x57] = SDLK_F11; 184046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x58] = SDLK_F12; 184146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x5d] = SDLK_PRINT; 184246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x46] = SDLK_SCROLLOCK; 184346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x5f] = SDLK_PAUSE; 184446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 184546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Second line of keyboard: 184646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x29] = SDLK_BACKQUOTE; 184746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x2] = SDLK_1; 184846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x3] = SDLK_2; 184946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x4] = SDLK_3; 185046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x5] = SDLK_4; 185146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x6] = SDLK_5; 185246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x7] = SDLK_6; 185346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x8] = SDLK_7; 185446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x9] = SDLK_8; 185546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0xa] = SDLK_9; 185646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0xb] = SDLK_0; 185746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0xc] = SDLK_MINUS; 185846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0xd] = SDLK_EQUALS; 185946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0xe] = SDLK_BACKSPACE; 186046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x68] = SDLK_INSERT; 186146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x60] = SDLK_HOME; 186246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x62] = SDLK_PAGEUP; 186346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x45] = SDLK_NUMLOCK; 186446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x5c] = SDLK_KP_DIVIDE; 186546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x37] = SDLK_KP_MULTIPLY; 186646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x4a] = SDLK_KP_MINUS; 186746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 186846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Third line of keyboard: 186946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0xf] = SDLK_TAB; 187046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x10] = SDLK_q; 187146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x11] = SDLK_w; 187246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x12] = SDLK_e; 187346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x13] = SDLK_r; 187446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x14] = SDLK_t; 187546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x15] = SDLK_y; 187646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x16] = SDLK_u; 187746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x17] = SDLK_i; 187846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x18] = SDLK_o; 187946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x19] = SDLK_p; 188046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x1a] = SDLK_LEFTBRACKET; 188146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x1b] = SDLK_RIGHTBRACKET; 188246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x1c] = SDLK_RETURN; 188346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x69] = SDLK_DELETE; 188446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x65] = SDLK_END; 188546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x67] = SDLK_PAGEDOWN; 188646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x47] = SDLK_KP7; 188746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x48] = SDLK_KP8; 188846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x49] = SDLK_KP9; 188946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x4e] = SDLK_KP_PLUS; 189046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 189146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Fourth line of keyboard: 189246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x3a] = SDLK_CAPSLOCK; 189346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x1e] = SDLK_a; 189446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x1f] = SDLK_s; 189546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x20] = SDLK_d; 189646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x21] = SDLK_f; 189746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x22] = SDLK_g; 189846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x23] = SDLK_h; 189946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x24] = SDLK_j; 190046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x25] = SDLK_k; 190146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x26] = SDLK_l; 190246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x27] = SDLK_SEMICOLON; 190346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x28] = SDLK_QUOTE; 190446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x2b] = SDLK_BACKSLASH; 190546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x4b] = SDLK_KP4; 190646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x4c] = SDLK_KP5; 190746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x4d] = SDLK_KP6; 190846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 190946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Fifth line of keyboard: 191046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x2a] = SDLK_LSHIFT; 191146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x56] = SDLK_WORLD_1; // Code 161, letter i' on hungarian keyboard 191246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x2c] = SDLK_z; 191346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x2d] = SDLK_x; 191446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x2e] = SDLK_c; 191546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x2f] = SDLK_v; 191646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x30] = SDLK_b; 191746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x31] = SDLK_n; 191846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x32] = SDLK_m; 191946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x33] = SDLK_COMMA; 192046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x34] = SDLK_PERIOD; 192146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x35] = SDLK_SLASH; 192246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x36] = SDLK_RSHIFT; 192346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x61] = SDLK_UP; 192446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x4f] = SDLK_KP1; 192546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x50] = SDLK_KP2; 192646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x51] = SDLK_KP3; 192746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x5a] = SDLK_KP_ENTER; 192846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 192946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Sixth line of keyboard: 193046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x1d] = SDLK_LCTRL; 193146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x7e] = SDLK_LSUPER; // Windows key 193246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x38] = SDLK_LALT; 193346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x39] = SDLK_SPACE; 193446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x5e] = SDLK_RALT;// Actually, altgr on my keyboard... 193546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x7f] = SDLK_RSUPER; 193646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x7c] = SDLK_MENU; 193746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x5b] = SDLK_RCTRL; 193846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x63] = SDLK_LEFT; 193946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x66] = SDLK_DOWN; 194046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x64] = SDLK_RIGHT; 194146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x52] = SDLK_KP0; 194246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWScanKeyMap[0x53] = SDLK_KP_PERIOD; 194346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 194446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 194546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 194646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Iconify the window. 194746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This function returns 1 if there is a window manager and the 194846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner window was actually iconified, it returns 0 otherwise. 194946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 195046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint os2fslib_IconifyWindow(_THIS) 195146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 195246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HAB hab; 195346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HMQ hmq; 195446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ERRORID hmqerror; 195546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 195646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If there is no more window, nothing we can do! 195746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->iPMThreadStatus!=1) return 0; 195846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 195946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Cannot do anything in fullscreen mode! 196046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (FSLib_QueryFSMode(_this->hidden->hwndClient)) 196146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 196246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 196346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Make sure this thread is prepared for using the Presentation Manager! 196446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hab = WinInitialize(0); 196546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hmq = WinCreateMsgQueue(hab,0); 196646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Remember if there was an error at WinCreateMsgQueue(), because we don't 196746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // want to destroy somebody else's queue later. :) 196846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hmqerror = WinGetLastError(hab); 196946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 197046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetWindowPos(_this->hidden->hwndFrame, HWND_TOP, 197146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 0, 0, 0, 0, SWP_MINIMIZE); 197246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 197346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Now destroy the message queue, if we've created it! 197446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (ERRORIDERROR(hmqerror)==0) 197546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinDestroyMsgQueue(hmq); 197646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 197746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 1; 197846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 197946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 198046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_GrabMode os2fslib_GrabInput(_THIS, SDL_GrabMode mode) 198146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 198246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HAB hab; 198346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HMQ hmq; 198446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ERRORID hmqerror; 198546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 198646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 198746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If there is no more window, nothing we can do! 198846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->iPMThreadStatus!=1) 198946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return SDL_GRAB_OFF; 199046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 199146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Make sure this thread is prepared for using the Presentation Manager! 199246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hab = WinInitialize(0); 199346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hmq = WinCreateMsgQueue(hab,0); 199446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Remember if there was an error at WinCreateMsgQueue(), because we don't 199546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // want to destroy somebody else's queue later. :) 199646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hmqerror = WinGetLastError(hab); 199746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 199846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 199946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (mode == SDL_GRAB_OFF) 200046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 200146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 200246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_GrabInput] : Releasing mouse\n"); fflush(stdout); 200346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 200446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 200546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Release the mouse 200646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bMouseCapturable = 0; 200746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (bMouseCaptured) 200846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 200946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetCapture(HWND_DESKTOP, NULLHANDLE); 201046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bMouseCaptured = 0; 201146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 201246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 201346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 201446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 201546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_GrabInput] : Capturing mouse\n"); fflush(stdout); 201646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 201746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 201846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Capture the mouse 201946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bMouseCapturable = 1; 202046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (WinQueryFocus(HWND_DESKTOP) == _this->hidden->hwndClient) 202146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 202246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetCapture(HWND_DESKTOP, _this->hidden->hwndClient); 202346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bMouseCaptured = 1; 202446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 202546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWP swpClient; 202646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner POINTL ptl; 202746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Center the mouse to the middle of the window! 202846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowPos(_this->hidden->hwndClient, &swpClient); 202946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.x = 0; ptl.y = 0; 203046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinMapWindowPoints(_this->hidden->hwndClient, HWND_DESKTOP, &ptl, 1); 203146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->iSkipWMMOUSEMOVE++; /* Don't take next WM_MOUSEMOVE into account! */ 203246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetPointerPos(HWND_DESKTOP, 203346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.x + swpClient.cx/2, 203446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.y + swpClient.cy/2); 203546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 203646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 203746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 203846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 203946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Now destroy the message queue, if we've created it! 204046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (ERRORIDERROR(hmqerror)==0) 204146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinDestroyMsgQueue(hmq); 204246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 204346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return mode; 204446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 204546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 204646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Set the title and icon text */ 204746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void os2fslib_SetCaption(_THIS, const char *title, const char *icon) 204846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 204946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HAB hab; 205046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HMQ hmq; 205146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ERRORID hmqerror; 205246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 205346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If there is no more window, nothing we can do! 205446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->iPMThreadStatus!=1) return; 205546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 205646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Make sure this thread is prepared for using the Presentation Manager! 205746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hab = WinInitialize(0); 205846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hmq = WinCreateMsgQueue(hab,0); 205946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Remember if there was an error at WinCreateMsgQueue(), because we don't 206046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // want to destroy somebody else's queue later. :) 206146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hmqerror = WinGetLastError(hab); 206246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 206346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSetWindowText(_this->hidden->hwndFrame, (char *) title); 206446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 206546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Now destroy the message queue, if we've created it! 206646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (ERRORIDERROR(hmqerror)==0) 206746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinDestroyMsgQueue(hmq); 206846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 206946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 207046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int os2fslib_ToggleFullScreen(_THIS, int on) 207146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 207246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 207346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_ToggleFullScreen] : %d\n", on); fflush(stdout); 207446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 207546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If there is no more window, nothing we can do! 207646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->iPMThreadStatus!=1) return 0; 207746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 207846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLib_ToggleFSMode(_this->hidden->hwndClient, on); 207946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Cursor manager functions to Windowed/FS mode*/ 208046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner os2fslib_SetCursorManagementFunctions(_this, !on); 208146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 1; 208246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 208346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 208446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* This is called after the video mode has been set, to get the 208546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner initial mouse state. It should queue events as necessary to 208646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner properly represent the current mouse focus and position. 208746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 208846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void os2fslib_UpdateMouse(_THIS) 208946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 209046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner POINTL ptl; 209146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HAB hab; 209246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HMQ hmq; 209346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ERRORID hmqerror; 209446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWP swpClient; 209546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 209646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If there is no more window, nothing we can do! 209746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->iPMThreadStatus!=1) return; 209846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 209946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 210046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Make sure this thread is prepared for using the Presentation Manager! 210146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hab = WinInitialize(0); 210246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hmq = WinCreateMsgQueue(hab,0); 210346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Remember if there was an error at WinCreateMsgQueue(), because we don't 210446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // want to destroy somebody else's queue later. :) 210546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hmqerror = WinGetLastError(hab); 210646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 210746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 210846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 210946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->fInFocus) 211046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 211146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If our app is in focus 211246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS); 211346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS); 211446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateAppActive(1, SDL_APPACTIVE); 211546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryPointerPos(HWND_DESKTOP, &ptl); 211646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinMapWindowPoints(HWND_DESKTOP, _this->hidden->hwndClient, &ptl, 1); 211746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowPos(_this->hidden->hwndClient, &swpClient); 211846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Convert OS/2 mouse position to SDL position, and also scale it! 211946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.x = ptl.x * _this->hidden->SrcBufferDesc.uiXResolution / swpClient.cx; 212046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.y = ptl.y * _this->hidden->SrcBufferDesc.uiYResolution / swpClient.cy; 212146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ptl.y = _this->hidden->SrcBufferDesc.uiYResolution - ptl.y - 1; 212246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateMouseMotion(0, 0, (Sint16) (ptl.x), (Sint16) (ptl.y)); 212346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 212446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 212546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If we're not in focus 212646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS); 212746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateAppActive(0, SDL_APPINPUTFOCUS); 212846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateAppActive(0, SDL_APPACTIVE); 212946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PrivateMouseMotion(0, 0, (Sint16) -1, (Sint16) -1); 213046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 213146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 213246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Now destroy the message queue, if we've created it! 213346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (ERRORIDERROR(hmqerror)==0) 213446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinDestroyMsgQueue(hmq); 213546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 213646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 213746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 213846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* This pointer should exist in the native video subsystem and should 213946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner point to an appropriate update function for the current video mode 214046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 214146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void os2fslib_UpdateRects(_THIS, int numrects, SDL_Rect *rects) 214246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 214346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If there is no more window, nothing we can do! 214446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->iPMThreadStatus!=1) return; 214546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 214646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef BITBLT_IN_WINMESSAGEPROC 214746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinSendMsg(_this->hidden->hwndClient, 214846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WM_UPDATERECTSREQUEST, 214946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (MPARAM) numrects, 215046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (MPARAM) rects); 215146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else 215246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (DosRequestMutexSem(_this->hidden->hmtxUseSrcBuffer, SEM_INDEFINITE_WAIT)==NO_ERROR) 215346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 215446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int i; 215546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 215646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->pSDLSurface) 215746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 215846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef RESIZE_EVEN_IF_RESIZABLE 215946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWP swp; 216046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // But only blit if the window is not resizable, or if 216146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // the window is resizable and the source buffer size is the 216246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // same as the destination buffer size! 216346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinQueryWindowPos(_this->hidden->hwndClient, &swp); 216446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((_this->hidden->pSDLSurface) && 216546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (_this->hidden->pSDLSurface->flags & SDL_RESIZABLE) && 216646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((swp.cx != _this->hidden->SrcBufferDesc.uiXResolution) || 216746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (swp.cy != _this->hidden->SrcBufferDesc.uiYResolution) 216846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) && 216946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (!FSLib_QueryFSMode(_this->hidden->hwndClient)) 217046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) 217146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 217246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Resizable surface and in resizing! 217346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // So, don't blit now! 217446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 217546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[UpdateRects] : Skipping blit while resizing!\n"); fflush(stdout); 217646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 217746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 217846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 217946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 218046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* 218146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Blit the whole window 218246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLIB_BITBLT(_this->hidden->hwndClient, _this->hidden->pchSrcBuffer, 218346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 0, 0, 218446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->SrcBufferDesc.uiXResolution, 218546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->SrcBufferDesc.uiYResolution); 218646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 218746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 218846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_UpdateRects] : Blitting!\n"); fflush(stdout); 218946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 219046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 219146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Blit the changed areas 219246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (i=0; i<numrects; i++) 219346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLIB_BITBLT(_this->hidden->hwndClient, _this->hidden->pchSrcBuffer, 219446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rects[i].y, rects[i].x, rects[i].w, rects[i].h); 219546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 219646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 219746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 219846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 219946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_UpdateRects] : No public surface!\n"); fflush(stdout); 220046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 220146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DosReleaseMutexSem(_this->hidden->hmtxUseSrcBuffer); 220246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 220346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 220446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 220546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_UpdateRects] : Error in mutex!\n"); fflush(stdout); 220646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 220746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 220846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 220946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 221046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 221146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Reverse the effects VideoInit() -- called if VideoInit() fails 221246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner or if the application is shutting down the video subsystem. 221346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 221446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void os2fslib_VideoQuit(_THIS) 221546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 221646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 221746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_VideoQuit]\n"); fflush(stdout); 221846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 221946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Close PM stuff if running! 222046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->iPMThreadStatus == 1) 222146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 222246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int iTimeout; 222346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinPostMsg(_this->hidden->hwndFrame, WM_QUIT, (MPARAM) 0, (MPARAM) 0); 222446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // HACK: We had this line before: 222546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner //DosWaitThread((TID *) &(_this->hidden->tidPMThread), DCWW_WAIT); 222646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // We don't use it, because the PMThread will never stop, or if it stops, 222746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // it will kill the whole process as a emergency fallback. 222846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // So, we only check for the iPMThreadStatus stuff! 222946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 223046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_VideoQuit] : Waiting for PM thread to die\n"); fflush(stdout); 223146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 223246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 223346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iTimeout=0; 223446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while ((_this->hidden->iPMThreadStatus == 1) && (iTimeout<100)) 223546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 223646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iTimeout++; 223746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DosSleep(64); 223846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 223946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 224046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 224146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_VideoQuit] : End of wait.\n"); fflush(stdout); 224246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 224346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 224446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->iPMThreadStatus == 1) 224546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 224646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 224746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_VideoQuit] : Killing PM thread!\n"); fflush(stdout); 224846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 224946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 225046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->iPMThreadStatus = 0; 225146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DosKillThread(_this->hidden->tidPMThread); 225246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 225346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->hwndFrame) 225446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 225546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 225646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_VideoQuit] : Destroying PM window!\n"); fflush(stdout); 225746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 225846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 225946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinDestroyWindow(_this->hidden->hwndFrame); _this->hidden->hwndFrame=NULL; 226046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 226146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 226246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 226346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 226446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 226546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Free result of an old ListModes() call, because there is 226646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // no FreeListModes() call in SDL! 226746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->pListModesResult) 226846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 226946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(_this->hidden->pListModesResult); _this->hidden->pListModesResult = NULL; 227046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 227146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 227246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Free list of available fullscreen modes 227346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->pAvailableFSLibVideoModes) 227446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 227546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLib_FreeVideoModeList(_this->hidden->pAvailableFSLibVideoModes); 227646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->pAvailableFSLibVideoModes = NULL; 227746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 227846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 227946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Free application icon if we had one 228046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (hptrCurrentIcon) 228146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 228246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinDestroyPointer(hptrCurrentIcon); 228346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hptrCurrentIcon = NULL; 228446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 228546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 228646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 228746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Set the requested video mode, returning a surface which will be 228846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner set to the SDL_VideoSurface. The width and height will already 228946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner be verified by ListModes(), and the video subsystem is free to 229046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner set the mode to a supported bit depth different from the one 229146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner specified -- the desired bpp will be emulated with a shadow 229246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner surface if necessary. If a new mode is returned, this function 229346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner should take care of cleaning up the current mode. 229446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 229546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_Surface *os2fslib_SetVideoMode(_THIS, SDL_Surface *current, 229646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int width, int height, int bpp, Uint32 flags) 229746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 229846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner static int bFirstCall = 1; 229946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLib_VideoMode_p pModeInfo, pModeInfoFound; 230046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLib_VideoMode TempModeInfo; 230146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HAB hab; 230246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HMQ hmq; 230346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ERRORID hmqerror; 230446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner RECTL rectl; 230546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_Surface *pResult; 230646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 230746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If there is no more window, nothing we can do! 230846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->iPMThreadStatus!=1) return NULL; 230946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 231046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 231146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetVideoMode] : Request for %dx%d @ %dBPP, flags=0x%x\n", width, height, bpp, flags); fflush(stdout); 231246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 231346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 231446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // We don't support palette modes! 231546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (bpp==8) bpp=32; 231646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 231746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Also, we don't support resizable modes in fullscreen mode. 231846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (flags & SDL_RESIZABLE) 231946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner flags &= ~SDL_FULLSCREEN; 232046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 232146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // No double buffered mode 232246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (flags & SDL_DOUBLEBUF) 232346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner flags &= ~SDL_DOUBLEBUF; 232446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 232546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // And, we don't support HWSURFACE yet. 232646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (flags & SDL_HWSURFACE) 232746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 232846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner flags &= ~SDL_HWSURFACE; 232946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner flags |= SDL_SWSURFACE; 233046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 233146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 233246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 233346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetVideoMode] : Changed request to %dx%d @ %dBPP, flags=0x%x\n", width, height, bpp, flags); fflush(stdout); 233446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 233546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 233646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // First check if there is such a video mode they want! 233746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pModeInfoFound = NULL; 233846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 233946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // For fullscreen mode we don't support every resolution! 234046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // So, go through the video modes, and check for such a resolution! 234146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pModeInfoFound = NULL; 234246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pModeInfo = _this->hidden->pAvailableFSLibVideoModes; 234346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 234446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while (pModeInfo) 234546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 234646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Check all available fullscreen modes for this resolution 234746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((pModeInfo->uiXResolution == width) && 234846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (pModeInfo->uiYResolution == height) && 234946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (pModeInfo->uiBPP!=8)) // palettized modes not yet supported 235046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 235146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If good resolution, try to find the exact BPP, or at least 235246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // something similar... 235346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!pModeInfoFound) 235446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pModeInfoFound = pModeInfo; 235546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 235646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((pModeInfoFound->uiBPP!=bpp) && 235746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (pModeInfoFound->uiBPP<pModeInfo->uiBPP)) 235846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pModeInfoFound = pModeInfo; 235946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 236046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pModeInfo = pModeInfo->pNext; 236146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 236246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 236346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If we did not find a good fullscreen mode, then try a similar 236446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!pModeInfoFound) 236546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 236646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 236746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetVideoMode] : Requested video mode not found, looking for a similar one!\n"); fflush(stdout); 236846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 236946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Go through the video modes again, and find a similar resolution! 237046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pModeInfo = _this->hidden->pAvailableFSLibVideoModes; 237146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while (pModeInfo) 237246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 237346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Check all available fullscreen modes for this resolution 237446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((pModeInfo->uiXResolution >= width) && 237546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (pModeInfo->uiYResolution >= height) && 237646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (pModeInfo->uiBPP == bpp)) 237746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 237846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!pModeInfoFound) 237946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pModeInfoFound = pModeInfo; 238046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 238146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (((pModeInfoFound->uiXResolution-width)*(pModeInfoFound->uiYResolution-height))> 238246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((pModeInfo->uiXResolution-width)*(pModeInfo->uiYResolution-height))) 238346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 238446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Found a mode which is closer than the current one 238546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pModeInfoFound = pModeInfo; 238646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 238746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 238846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pModeInfo = pModeInfo->pNext; 238946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 239046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 239146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 239246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If we did not find a good fullscreen mode, then return NULL 239346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!pModeInfoFound) 239446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 239546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 239646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetVideoMode] : Requested video mode not found!\n"); fflush(stdout); 239746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 239846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return NULL; 239946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 240046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 240146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 240246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetVideoMode] : Found mode!\n"); fflush(stdout); 240346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 240446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 240546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // We'll possibly adjust the structure, so copy out the values 240646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // into TempModeInfo! 240746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memcpy(&TempModeInfo, pModeInfoFound, sizeof(TempModeInfo)); 240846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pModeInfoFound = &TempModeInfo; 240946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 241046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (flags & SDL_RESIZABLE) 241146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 241246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 241346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetVideoMode] : Requested mode is resizable, changing width/height\n"); fflush(stdout); 241446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 241546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Change width and height to requested one! 241646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner TempModeInfo.uiXResolution = width; 241746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner TempModeInfo.uiYResolution = height; 241846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner TempModeInfo.uiScanLineSize = width * ((TempModeInfo.uiBPP+7)/8); 241946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 242046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 242146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // We can try create new surface! 242246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 242346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Make sure this thread is prepared for using the Presentation Manager! 242446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hab = WinInitialize(0); 242546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hmq = WinCreateMsgQueue(hab,0); 242646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Remember if there was an error at WinCreateMsgQueue(), because we don't 242746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // want to destroy somebody else's queue later. :) 242846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hmqerror = WinGetLastError(hab); 242946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 243046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 243146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 243246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (DosRequestMutexSem(_this->hidden->hmtxUseSrcBuffer, SEM_INDEFINITE_WAIT)==NO_ERROR) 243346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 243446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 243546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetVideoMode] : Creating new SW surface\n"); fflush(stdout); 243646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 243746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 243846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Create new software surface! 243946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult = SDL_CreateRGBSurface(SDL_SWSURFACE, 244046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pModeInfoFound->uiXResolution, 244146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pModeInfoFound->uiYResolution, 244246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pModeInfoFound->uiBPP, 244346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((unsigned int) pModeInfoFound->PixelFormat.ucRedMask) << pModeInfoFound->PixelFormat.ucRedPosition, 244446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((unsigned int) pModeInfoFound->PixelFormat.ucGreenMask) << pModeInfoFound->PixelFormat.ucGreenPosition, 244546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((unsigned int) pModeInfoFound->PixelFormat.ucBlueMask) << pModeInfoFound->PixelFormat.ucBluePosition, 244646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((unsigned int) pModeInfoFound->PixelFormat.ucAlphaMask) << pModeInfoFound->PixelFormat.ucAlphaPosition); 244746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 244846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pResult == NULL) 244946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 245046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DosReleaseMutexSem(_this->hidden->hmtxUseSrcBuffer); 245146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_OutOfMemory(); 245246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return NULL; 245346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 245446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 245546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 245646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetVideoMode] : Adjusting pixel format\n"); fflush(stdout); 245746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 245846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 245946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Adjust pixel format mask! 246046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->format->Rmask = ((unsigned int) pModeInfoFound->PixelFormat.ucRedMask) << pModeInfoFound->PixelFormat.ucRedPosition; 246146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->format->Rshift = pModeInfoFound->PixelFormat.ucRedPosition; 246246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->format->Rloss = pModeInfoFound->PixelFormat.ucRedAdjust; 246346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->format->Gmask = ((unsigned int) pModeInfoFound->PixelFormat.ucGreenMask) << pModeInfoFound->PixelFormat.ucGreenPosition; 246446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->format->Gshift = pModeInfoFound->PixelFormat.ucGreenPosition; 246546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->format->Gloss = pModeInfoFound->PixelFormat.ucGreenAdjust; 246646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->format->Bmask = ((unsigned int) pModeInfoFound->PixelFormat.ucBlueMask) << pModeInfoFound->PixelFormat.ucBluePosition; 246746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->format->Bshift = pModeInfoFound->PixelFormat.ucBluePosition; 246846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->format->Bloss = pModeInfoFound->PixelFormat.ucBlueAdjust; 246946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->format->Amask = ((unsigned int) pModeInfoFound->PixelFormat.ucAlphaMask) << pModeInfoFound->PixelFormat.ucAlphaPosition; 247046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->format->Ashift = pModeInfoFound->PixelFormat.ucAlphaPosition; 247146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->format->Aloss = pModeInfoFound->PixelFormat.ucAlphaAdjust; 247246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 247346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef REPORT_EMPTY_ALPHA_MASK 247446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->format->Amask = 247546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->format->Ashift = 247646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->format->Aloss = 0; 247746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 247846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 247946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Adjust surface flags 248046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->flags |= (flags & SDL_FULLSCREEN); 248146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult->flags |= (flags & SDL_RESIZABLE); 248246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 248346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // It might be that the software surface pitch is not the same as 248446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // the pitch we have, so adjust that! 248546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pModeInfoFound->uiScanLineSize = pResult->pitch; 248646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 248746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Store new source buffer parameters! 248846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memcpy(&(_this->hidden->SrcBufferDesc), pModeInfoFound, sizeof(*pModeInfoFound)); 248946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->pchSrcBuffer = pResult->pixels; 249046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 249146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 249246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetVideoMode] : Telling FSLib the stuffs\n"); fflush(stdout); 249346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 249446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 249546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Tell the FSLib window the new source image format 249646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLib_SetSrcBufferDesc(_this->hidden->hwndClient, &(_this->hidden->SrcBufferDesc)); 249746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 249846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( 249946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((flags & SDL_RESIZABLE)==0) || 250046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (bFirstCall) 250146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ) 250246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 250346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bFirstCall = 0; 250446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 250546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetVideoMode] : Modifying window size\n"); fflush(stdout); 250646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 250746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 250846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Calculate frame window size from client window size 250946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rectl.xLeft = 0; 251046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rectl.yBottom = 0; 251146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rectl.xRight = pModeInfoFound->uiXResolution; // Noninclusive 251246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rectl.yTop = pModeInfoFound->uiYResolution; // Noninclusive 251346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinCalcFrameRect(_this->hidden->hwndFrame, &rectl, FALSE); 251446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 251546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Set the new size of the main window 251646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SetAccessableWindowPos(_this->hidden->hwndFrame, 251746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HWND_TOP, 251846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 0, 0, 251946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (rectl.xRight-rectl.xLeft), 252046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (rectl.yTop-rectl.yBottom), 252146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SWP_SIZE | SWP_ACTIVATE | SWP_SHOW); 252246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 252346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 252446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Set fullscreen mode flag, and switch to fullscreen if needed! 252546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (flags & SDL_FULLSCREEN) 252646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 252746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 252846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetVideoMode] : Also trying to switch to fullscreen\n"); 252946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fflush(stdout); 253046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 253146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLib_ToggleFSMode(_this->hidden->hwndClient, 1); 253246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Cursor manager functions to FS mode*/ 253346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner os2fslib_SetCursorManagementFunctions(_this, 0); 253446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 253546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 253646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 253746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetVideoMode] : Also trying to switch to desktop mode\n"); 253846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fflush(stdout); 253946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 254046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLib_ToggleFSMode(_this->hidden->hwndClient, 0); 254146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Cursor manager functions to Windowed mode*/ 254246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner os2fslib_SetCursorManagementFunctions(_this, 1); 254346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 254446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 254546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->pSDLSurface = pResult; 254646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 254746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DosReleaseMutexSem(_this->hidden->hmtxUseSrcBuffer); 254846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 254946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 255046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 255146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetVideoMode] : Could not get hmtxUseSrcBuffer!\n"); fflush(stdout); 255246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 255346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 255446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pResult = NULL; 255546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 255646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 255746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // As we have the new surface, we don't need the current one anymore! 255846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((pResult) && (current)) 255946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 256046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 256146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetVideoMode] : Freeing old surface\n"); fflush(stdout); 256246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 256346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_FreeSurface(current); 256446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 256546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 256646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Redraw window 256746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinInvalidateRegion(_this->hidden->hwndClient, NULL, TRUE); 256846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 256946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Now destroy the message queue, if we've created it! 257046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (ERRORIDERROR(hmqerror)==0) 257146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 257246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 257346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetVideoMode] : Destroying message queue\n"); fflush(stdout); 257446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 257546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner WinDestroyMsgQueue(hmq); 257646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 257746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 257846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 257946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_SetVideoMode] : Done\n"); fflush(stdout); 258046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 258146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 258246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* We're done */ 258346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 258446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Return with the new surface! 258546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return pResult; 258646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 258746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 258846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* List the available video modes for the given pixel format, sorted 258946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner from largest to smallest. 259046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 259146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_Rect **os2fslib_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags) 259246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 259346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 259446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_ListModes] : ListModes of %d Bpp\n", format->BitsPerPixel); 259546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 259646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Destroy result of previous call, if there is any 259746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->pListModesResult) 259846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 259946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(_this->hidden->pListModesResult); _this->hidden->pListModesResult = NULL; 260046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 260146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 260246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // For resizable and windowed mode we support every resolution! 260346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((flags & SDL_RESIZABLE) && ((flags & SDL_FULLSCREEN) == 0)) 260446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return (SDL_Rect **)-1; 260546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 260646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Check if they need fullscreen or non-fullscreen video modes! 260746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((flags & SDL_FULLSCREEN) == 0) 260846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 260946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 261046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // For windowed mode we support every resolution! 261146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return (SDL_Rect **)-1; 261246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 261346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 261446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLib_VideoMode_p pFSMode; 261546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // For fullscreen mode we don't support every resolution! 261646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Now create a new list 261746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pFSMode = _this->hidden->pAvailableFSLibVideoModes; 261846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while (pFSMode) 261946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 262046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pFSMode->uiBPP == format->BitsPerPixel) 262146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 262246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_Rect *pRect = (SDL_Rect *) SDL_malloc(sizeof(SDL_Rect)); 262346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pRect) 262446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 262546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Fill description 262646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pRect->x = 0; 262746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pRect->y = 0; 262846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pRect->w = pFSMode->uiXResolution; 262946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pRect->h = pFSMode->uiYResolution; 263046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 263146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// printf("!!! Seems to be good!\n"); 263246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// printf("F: %dx%d\n", pRect->w, pRect->h); 263346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 263446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // And insert into list of pRects 263546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!(_this->hidden->pListModesResult)) 263646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 263746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 263846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// printf("!!! Inserting to beginning\n"); 263946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 264046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 264146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // We're the first one to be inserted! 264246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->pListModesResult = (SDL_Rect**) SDL_malloc(2*sizeof(SDL_Rect*)); 264346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->pListModesResult) 264446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 264546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->pListModesResult[0] = pRect; 264646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->pListModesResult[1] = NULL; 264746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 264846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 264946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(pRect); 265046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 265146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 265246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 265346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // We're not the first ones, so find the place where we 265446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // have to insert ourselves 265546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_Rect **pNewList; 265646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int iPlace, iNumOfSlots, i; 265746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 265846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 265946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// printf("!!! Searching where to insert\n"); 266046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 266146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 266246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iPlace = -1; iNumOfSlots = 1; // Count the last NULL too! 266346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (i=0; _this->hidden->pListModesResult[i]; i++) 266446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 266546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iNumOfSlots++; 266646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (iPlace==-1) 266746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 266846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((_this->hidden->pListModesResult[i]->w*_this->hidden->pListModesResult[i]->h)< 266946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (pRect->w*pRect->h)) 267046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 267146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner iPlace = i; 267246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 267346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 267446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 267546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (iPlace==-1) iPlace = iNumOfSlots-1; 267646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 267746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 267846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// printf("!!! From %d slots, it will be at %d\n", iNumOfSlots, iPlace); 267946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 268046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 268146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pNewList = (SDL_Rect**) SDL_realloc(_this->hidden->pListModesResult, (iNumOfSlots+1)*sizeof(SDL_Rect*)); 268246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pNewList) 268346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 268446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for (i=iNumOfSlots;i>iPlace;i--) 268546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pNewList[i] = pNewList[i-1]; 268646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pNewList[iPlace] = pRect; 268746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->pListModesResult = pNewList; 268846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else 268946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 269046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(pRect); 269146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 269246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 269346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 269446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 269546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pFSMode = pFSMode->pNext; 269646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 269746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 269846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 269946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner// printf("Returning list\n"); 270046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 270146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return _this->hidden->pListModesResult; 270246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 270346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 270446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Initialize the native video subsystem, filling 'vformat' with the 270546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner "best" display pixel format, returning 0 or -1 if there's an error. 270646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 270746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int os2fslib_VideoInit(_THIS, SDL_PixelFormat *vformat) 270846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 270946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLib_VideoMode_p pDesktopMode; 271046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 271146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 271246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_VideoInit] : Enter\n"); fflush(stdout); 271346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 271446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 271546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Report the best pixel format. For this, 271646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // we'll use the current desktop format. 271746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pDesktopMode = FSLib_GetDesktopVideoMode(); 271846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!pDesktopMode) 271946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 272046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("Could not query desktop video mode!"); 272146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 272246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_VideoInit] : Could not query desktop video mode!\n"); 272346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 272446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 272546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 272646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 272746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Determine the current screen size */ 272846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->info.current_w = pDesktopMode->uiXResolution; 272946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->info.current_h = pDesktopMode->uiYResolution; 273046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 273146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Determine the screen depth */ 273246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->BitsPerPixel = pDesktopMode->uiBPP; 273346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->BytesPerPixel = (vformat->BitsPerPixel+7)/8; 273446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 273546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->Rmask = ((unsigned int) pDesktopMode->PixelFormat.ucRedMask) << pDesktopMode->PixelFormat.ucRedPosition; 273646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->Rshift = pDesktopMode->PixelFormat.ucRedPosition; 273746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->Rloss = pDesktopMode->PixelFormat.ucRedAdjust; 273846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->Gmask = ((unsigned int) pDesktopMode->PixelFormat.ucGreenMask) << pDesktopMode->PixelFormat.ucGreenPosition; 273946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->Gshift = pDesktopMode->PixelFormat.ucGreenPosition; 274046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->Gloss = pDesktopMode->PixelFormat.ucGreenAdjust; 274146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->Bmask = ((unsigned int) pDesktopMode->PixelFormat.ucBlueMask) << pDesktopMode->PixelFormat.ucBluePosition; 274246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->Bshift = pDesktopMode->PixelFormat.ucBluePosition; 274346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->Bloss = pDesktopMode->PixelFormat.ucBlueAdjust; 274446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->Amask = ((unsigned int) pDesktopMode->PixelFormat.ucAlphaMask) << pDesktopMode->PixelFormat.ucAlphaPosition; 274546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->Ashift = pDesktopMode->PixelFormat.ucAlphaPosition; 274646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->Aloss = pDesktopMode->PixelFormat.ucAlphaAdjust; 274746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 274846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef REPORT_EMPTY_ALPHA_MASK 274946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->Amask = 275046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->Ashift = 275146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner vformat->Aloss = 0; 275246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 275346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 275446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Fill in some window manager capabilities 275546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->info.wm_available = 1; 275646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 275746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Initialize some internal variables 275846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->pListModesResult = NULL; 275946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->fInFocus = 0; 276046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->iSkipWMMOUSEMOVE = 0; 276146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->iMouseVisible = 1; 276246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 276346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (getenv("SDL_USE_PROPORTIONAL_WINDOW")) 276446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->bProportionalResize = 1; 276546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else 276646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 276746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PPIB pib; 276846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PTIB tib; 276946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner char *pchFileName, *pchTemp; 277046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner char achConfigFile[CCHMAXPATH]; 277146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FILE *hFile; 277246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 277346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* No environment variable to have proportional window. 277446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner * Ok, let's check if this executable is in config file! 277546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 277646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->bProportionalResize = 0; 277746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 277846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DosGetInfoBlocks(&tib, &pib); 277946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pchTemp = pchFileName = pib->pib_pchcmd; 278046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while (*pchTemp) 278146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 278246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (*pchTemp=='\\') 278346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pchFileName = pchTemp+1; 278446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pchTemp++; 278546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 278646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (getenv("HOME")) 278746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 278846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sprintf(achConfigFile, "%s\\.sdl.proportionals", getenv("HOME")); 278946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hFile = fopen(achConfigFile, "rt"); 279046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!hFile) 279146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 279246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Seems like the file cannot be opened or does not exist. 279346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner * Let's try to create it with defaults! 279446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 279546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hFile = fopen(achConfigFile, "wt"); 279646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (hFile) 279746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 279846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fprintf(hFile, "; This file is a config file of SDL/2, containing\n"); 279946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fprintf(hFile, "; the list of executables that must have proportional\n"); 280046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fprintf(hFile, "; windows.\n"); 280146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fprintf(hFile, ";\n"); 280246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fprintf(hFile, "; You can add executable filenames into this file,\n"); 280346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fprintf(hFile, "; one under the other. If SDL finds that a given\n"); 280446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fprintf(hFile, "; program is in this list, then that application\n"); 280546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fprintf(hFile, "; will have proportional windows, just like if\n"); 280646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fprintf(hFile, "; the SET SDL_USE_PROPORTIONAL_WINDOW env. variable\n"); 280746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fprintf(hFile, "; would have been set for that process.\n"); 280846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fprintf(hFile, ";\n"); 280946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fprintf(hFile, "\n"); 281046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fprintf(hFile, "dosbox.exe\n"); 281146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fclose(hFile); 281246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 281346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 281446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner hFile = fopen(achConfigFile, "rt"); 281546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 281646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 281746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (hFile) 281846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 281946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while (fgets(achConfigFile, sizeof(achConfigFile), hFile)) 282046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 282146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Cut \n from end of string */ 282246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 282346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while (achConfigFile[strlen(achConfigFile)-1] == '\n') 282446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner achConfigFile[strlen(achConfigFile)-1] = 0; 282546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 282646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Compare... */ 282746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (stricmp(achConfigFile, pchFileName)==0) 282846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 282946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Found it in config file! */ 283046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->bProportionalResize = 1; 283146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 283246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 283346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 283446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner fclose(hFile); 283546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 283646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 283746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 283846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 283946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DosCreateMutexSem(NULL, &(_this->hidden->hmtxUseSrcBuffer), 0, FALSE); 284046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 284146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Now create our window with a default size 284246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 284346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // For this, we select the first available fullscreen mode as 284446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // current window size! 284546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memcpy(&(_this->hidden->SrcBufferDesc), _this->hidden->pAvailableFSLibVideoModes, sizeof(_this->hidden->SrcBufferDesc)); 284646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Allocate new video buffer! 284746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->pchSrcBuffer = (char *) SDL_malloc(_this->hidden->pAvailableFSLibVideoModes->uiScanLineSize * _this->hidden->pAvailableFSLibVideoModes->uiYResolution); 284846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!_this->hidden->pchSrcBuffer) 284946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 285046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 285146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_VideoInit] : Yikes, not enough memory for new video buffer!\n"); fflush(stdout); 285246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 285346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("Not enough memory for new video buffer!\n"); 285446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 285546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 285646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 285746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // For this, we need a message processing thread. 285846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // We'll create a new thread for this, which will do everything 285946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // what is related to PM 286046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->iPMThreadStatus = 0; 286146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner _this->hidden->tidPMThread = _beginthread(PMThreadFunc, NULL, 65536, (void *) _this); 286246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->tidPMThread <= 0) 286346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 286446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 286546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_VideoInit] : Could not create PM thread!\n"); 286646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 286746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("Could not create PM thread"); 286846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 286946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 287046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef USE_DOSSETPRIORITY 287146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Burst the priority of PM Thread! 287246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DosSetPriority(PRTYS_THREAD, PRTYC_TIMECRITICAL, 0, _this->hidden->tidPMThread); 287346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 287446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Wait for the PM thread to initialize! 287546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while (_this->hidden->iPMThreadStatus==0) 287646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DosSleep(32); 287746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If the PM thread could not set up everything, then 287846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // report an error! 287946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->iPMThreadStatus!=1) 288046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 288146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 288246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_VideoInit] : PMThread reported an error : %d\n", _this->hidden->iPMThreadStatus); 288346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 288446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("Error initializing PM thread"); 288546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return -1; 288646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 288746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 288846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 0; 288946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 289046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 289146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 289246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void os2fslib_DeleteDevice(_THIS) 289346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 289446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 289546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_DeleteDevice]\n"); fflush(stdout); 289646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 289746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Free used memory 289846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLib_FreeVideoModeList(_this->hidden->pAvailableFSLibVideoModes); 289946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->pListModesResult) 290046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(_this->hidden->pListModesResult); 290146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (_this->hidden->pchSrcBuffer) 290246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(_this->hidden->pchSrcBuffer); 290346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DosCloseMutexSem(_this->hidden->hmtxUseSrcBuffer); 290446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(_this->hidden); 290546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(_this); 290646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLib_Uninitialize(); 290746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 290846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 290946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int os2fslib_Available(void) 291046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 291146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 291246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // If we can run, it means that we could load FSLib, 291346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // so we assume that it's available then! 291446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return 1; 291546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 291646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 291746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void os2fslib_MorphToPM() 291846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 291946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PPIB pib; 292046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner PTIB tib; 292146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 292246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DosGetInfoBlocks(&tib, &pib); 292346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 292446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Change flag from VIO to PM: 292546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pib->pib_ultype==2) pib->pib_ultype = 3; 292646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 292746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 292846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_VideoDevice *os2fslib_CreateDevice(int devindex) 292946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 293046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_VideoDevice *device; 293146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 293246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 293346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_CreateDevice] : Enter\n"); fflush(stdout); 293446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 293546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 293646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Initialize all variables that we clean on shutdown */ 293746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device = (SDL_VideoDevice *)SDL_malloc(sizeof(SDL_VideoDevice)); 293846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( device ) 293946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 294046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(device, 0, (sizeof *device)); 294146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Also allocate memory for private data 294246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->hidden = (struct SDL_PrivateVideoData *) SDL_malloc((sizeof(struct SDL_PrivateVideoData))); 294346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 294446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( (device == NULL) || (device->hidden == NULL) ) 294546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 294646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_OutOfMemory(); 294746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( device ) 294846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(device); 294946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return NULL; 295046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 295146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_memset(device->hidden, 0, (sizeof *device->hidden)); 295246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 295346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Set the function pointers */ 295446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 295546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_CreateDevice] : VideoInit is %p\n", os2fslib_VideoInit); fflush(stdout); 295646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 295746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 295846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Initialization/Query functions */ 295946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->VideoInit = os2fslib_VideoInit; 296046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->ListModes = os2fslib_ListModes; 296146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->SetVideoMode = os2fslib_SetVideoMode; 296246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->ToggleFullScreen = os2fslib_ToggleFullScreen; 296346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->UpdateMouse = os2fslib_UpdateMouse; 296446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->CreateYUVOverlay = NULL; 296546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->SetColors = os2fslib_SetColors; 296646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->UpdateRects = os2fslib_UpdateRects; 296746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->VideoQuit = os2fslib_VideoQuit; 296846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Hardware acceleration functions */ 296946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->AllocHWSurface = os2fslib_AllocHWSurface; 297046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->CheckHWBlit = NULL; 297146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->FillHWRect = NULL; 297246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->SetHWColorKey = NULL; 297346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->SetHWAlpha = NULL; 297446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->LockHWSurface = os2fslib_LockHWSurface; 297546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->UnlockHWSurface = os2fslib_UnlockHWSurface; 297646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->FlipHWSurface = NULL; 297746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->FreeHWSurface = os2fslib_FreeHWSurface; 297846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Window manager functions */ 297946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->SetCaption = os2fslib_SetCaption; 298046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->SetIcon = os2fslib_SetIcon; 298146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->IconifyWindow = os2fslib_IconifyWindow; 298246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->GrabInput = os2fslib_GrabInput; 298346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->GetWMInfo = NULL; 298446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Cursor manager functions to Windowed mode*/ 298546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner os2fslib_SetCursorManagementFunctions(device, 1); 298646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Event manager functions */ 298746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->InitOSKeymap = os2fslib_InitOSKeymap; 298846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->PumpEvents = os2fslib_PumpEvents; 298946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* The function used to dispose of this structure */ 299046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->free = os2fslib_DeleteDevice; 299146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 299246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Make sure we'll be able to use Win* API even if the application 299346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // was linked to be a VIO application! 299446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner os2fslib_MorphToPM(); 299546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 299646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Now initialize FSLib, and query available video modes! 299746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!FSLib_Initialize()) 299846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 299946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Could not initialize FSLib! 300046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef DEBUG_BUILD 300146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner printf("[os2fslib_CreateDevice] : Could not initialize FSLib!\n"); 300246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 300346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("Could not initialize FSLib!"); 300446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(device->hidden); 300546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_free(device); 300646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return NULL; 300746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 300846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner device->hidden->pAvailableFSLibVideoModes = 300946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner FSLib_GetVideoModeList(); 301046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 301146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return device; 301246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 301346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 301446be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerVideoBootStrap OS2FSLib_bootstrap = { 301546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner "os2fslib", "OS/2 Video Output using FSLib", 301646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner os2fslib_Available, os2fslib_CreateDevice 301746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}; 301846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3019