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