Added support for Windows cursors
This commit is contained in:
parent
4b86de315f
commit
2368a3301a
8 changed files with 772 additions and 8 deletions
|
@ -490,12 +490,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||
|
||||
hittest = LOWORD(lParam);
|
||||
if (hittest == HTCLIENT) {
|
||||
/* FIXME: Implement the cursor API */
|
||||
static HCURSOR cursor;
|
||||
if (!cursor) {
|
||||
cursor = LoadCursor(NULL, IDC_ARROW);
|
||||
}
|
||||
SetCursor(cursor);
|
||||
SetCursor(SDL_cursor);
|
||||
returnCode = TRUE;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,9 +24,141 @@
|
|||
|
||||
#include "SDL_windowsvideo.h"
|
||||
|
||||
#include "../../events/SDL_mouse_c.h"
|
||||
|
||||
|
||||
HCURSOR SDL_cursor = NULL;
|
||||
|
||||
|
||||
static SDL_Cursor *
|
||||
WIN_CreateDefaultCursor()
|
||||
{
|
||||
SDL_Cursor *cursor;
|
||||
|
||||
cursor = SDL_calloc(1, sizeof(*cursor));
|
||||
if (cursor) {
|
||||
cursor->driverdata = LoadCursor(NULL, IDC_ARROW);
|
||||
} else {
|
||||
SDL_OutOfMemory();
|
||||
}
|
||||
|
||||
return cursor;
|
||||
}
|
||||
|
||||
static SDL_Cursor *
|
||||
WIN_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y)
|
||||
{
|
||||
SDL_Cursor *cursor;
|
||||
SDL_Surface *cvt;
|
||||
HICON hicon;
|
||||
HDC hdc;
|
||||
BITMAPV4HEADER bmh;
|
||||
LPVOID pixels;
|
||||
ICONINFO ii;
|
||||
|
||||
SDL_zero(bmh);
|
||||
bmh.bV4Size = sizeof(bmh);
|
||||
bmh.bV4Width = surface->w;
|
||||
bmh.bV4Height = -surface->h; /* Invert the image */
|
||||
bmh.bV4Planes = 1;
|
||||
bmh.bV4BitCount = 32;
|
||||
bmh.bV4V4Compression = BI_BITFIELDS;
|
||||
bmh.bV4AlphaMask = 0xFF000000;
|
||||
bmh.bV4RedMask = 0x00FF0000;
|
||||
bmh.bV4GreenMask = 0x0000FF00;
|
||||
bmh.bV4BlueMask = 0x000000FF;
|
||||
|
||||
hdc = GetDC(NULL);
|
||||
SDL_zero(ii);
|
||||
ii.fIcon = FALSE;
|
||||
ii.xHotspot = (DWORD)hot_x;
|
||||
ii.yHotspot = (DWORD)hot_y;
|
||||
ii.hbmColor = CreateDIBSection(hdc, (BITMAPINFO*)&bmh, DIB_RGB_COLORS, &pixels, NULL, 0);
|
||||
ii.hbmMask = CreateBitmap(surface->w, surface->h, 1, 1, NULL);
|
||||
ReleaseDC(NULL, hdc);
|
||||
|
||||
cvt = SDL_ConvertSurfaceFormat(surface, SDL_PIXELFORMAT_ARGB8888, 0);
|
||||
if (!cvt) {
|
||||
return NULL;
|
||||
}
|
||||
SDL_memcpy(pixels, cvt->pixels, cvt->h * cvt->pitch);
|
||||
SDL_FreeSurface(cvt);
|
||||
|
||||
hicon = CreateIconIndirect(&ii);
|
||||
|
||||
DeleteObject(ii.hbmColor);
|
||||
DeleteObject(ii.hbmMask);
|
||||
|
||||
if (!hicon) {
|
||||
WIN_SetError("CreateIconIndirect()");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cursor = SDL_calloc(1, sizeof(*cursor));
|
||||
if (cursor) {
|
||||
cursor->driverdata = hicon;
|
||||
} else {
|
||||
DestroyIcon(hicon);
|
||||
SDL_OutOfMemory();
|
||||
}
|
||||
|
||||
return cursor;
|
||||
}
|
||||
|
||||
static void
|
||||
WIN_FreeCursor(SDL_Cursor * cursor)
|
||||
{
|
||||
HICON hicon = (HICON)cursor->driverdata;
|
||||
|
||||
DestroyIcon(hicon);
|
||||
SDL_free(cursor);
|
||||
}
|
||||
|
||||
static int
|
||||
WIN_ShowCursor(SDL_Cursor * cursor)
|
||||
{
|
||||
if (cursor) {
|
||||
SDL_cursor = (HCURSOR)cursor->driverdata;
|
||||
} else {
|
||||
SDL_cursor = NULL;
|
||||
}
|
||||
if (SDL_GetMouseFocus() != NULL) {
|
||||
SetCursor(SDL_cursor);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
WIN_WarpMouse(SDL_Window * window, int x, int y)
|
||||
{
|
||||
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
|
||||
POINT pt;
|
||||
|
||||
pt.x = x;
|
||||
pt.y = y;
|
||||
ClientToScreen(hwnd, &pt);
|
||||
SetCursorPos(pt.x, pt.y);
|
||||
}
|
||||
|
||||
static int
|
||||
WIN_SetRelativeMouseMode(SDL_bool enabled)
|
||||
{
|
||||
SDL_Unsupported();
|
||||
return -1;
|
||||
}
|
||||
|
||||
void
|
||||
WIN_InitMouse(_THIS)
|
||||
{
|
||||
SDL_Mouse *mouse = SDL_GetMouse();
|
||||
|
||||
mouse->CreateCursor = WIN_CreateCursor;
|
||||
mouse->ShowCursor = WIN_ShowCursor;
|
||||
mouse->FreeCursor = WIN_FreeCursor;
|
||||
mouse->WarpMouse = WIN_WarpMouse;
|
||||
mouse->SetRelativeMouseMode = WIN_SetRelativeMouseMode;
|
||||
|
||||
SDL_SetDefaultCursor(WIN_CreateDefaultCursor());
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -24,6 +24,8 @@
|
|||
#ifndef _SDL_windowsmouse_h
|
||||
#define _SDL_windowsmouse_h
|
||||
|
||||
extern HCURSOR SDL_cursor;
|
||||
|
||||
extern void WIN_InitMouse(_THIS);
|
||||
extern void WIN_QuitMouse(_THIS);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue