21 #include "../../SDL_internal.h" 23 #if SDL_VIDEO_DRIVER_WINDOWS 31 #include "../../events/SDL_events_c.h" 32 #include "../../events/SDL_touch_c.h" 33 #include "../../events/scancodes_windows.h" 50 #define MOUSEEVENTF_FROMTOUCH 0xFF515700 53 #define REPEATED_KEYMASK (1<<30) 54 #define EXTENDED_KEYMASK (1<<24) 57 #ifndef VK_OEM_NEC_EQUAL 58 #define VK_OEM_NEC_EQUAL 0x92 62 #ifndef WM_XBUTTONDOWN 63 #define WM_XBUTTONDOWN 0x020B 66 #define WM_XBUTTONUP 0x020C 68 #ifndef GET_XBUTTON_WPARAM 69 #define GET_XBUTTON_WPARAM(w) (HIWORD(w)) 72 #define WM_INPUT 0x00ff 75 #define WM_TOUCH 0x0240 77 #ifndef WM_MOUSEHWHEEL 78 #define WM_MOUSEHWHEEL 0x020E 81 #define WM_UNICHAR 0x0109 85 WindowsScanCodeToSDLScanCode(LPARAM lParam, WPARAM wParam)
89 int nScanCode = (lParam >> 16) & 0xFF;
92 if (nScanCode == 0 || nScanCode == 0x45) {
153 bIsExtended = (lParam & (1 << 24)) != 0;
210 if (bwParamMousePressed && !bSDLMousePressed) {
212 }
else if (!bwParamMousePressed && bSDLMousePressed) {
241 if ((rawButtons & RI_MOUSE_BUTTON_1_DOWN))
243 if ((rawButtons & RI_MOUSE_BUTTON_1_UP))
245 if ((rawButtons & RI_MOUSE_BUTTON_2_DOWN))
247 if ((rawButtons & RI_MOUSE_BUTTON_2_UP))
249 if ((rawButtons & RI_MOUSE_BUTTON_3_DOWN))
251 if ((rawButtons & RI_MOUSE_BUTTON_3_UP))
253 if ((rawButtons & RI_MOUSE_BUTTON_4_DOWN))
255 if ((rawButtons & RI_MOUSE_BUTTON_4_UP))
257 if ((rawButtons & RI_MOUSE_BUTTON_5_DOWN))
259 if ((rawButtons & RI_MOUSE_BUTTON_5_UP))
276 keyState = GetAsyncKeyState(VK_LBUTTON);
277 if (!(keyState & 0x8000)) {
280 keyState = GetAsyncKeyState(VK_RBUTTON);
281 if (!(keyState & 0x8000)) {
284 keyState = GetAsyncKeyState(VK_MBUTTON);
285 if (!(keyState & 0x8000)) {
288 keyState = GetAsyncKeyState(VK_XBUTTON1);
289 if (!(keyState & 0x8000)) {
292 keyState = GetAsyncKeyState(VK_XBUTTON2);
293 if (!(keyState & 0x8000)) {
300 WIN_ConvertUTF32toUTF8(UINT32 codepoint,
char *
text)
302 if (codepoint <= 0x7F) {
303 text[0] = (char) codepoint;
305 }
else if (codepoint <= 0x7FF) {
306 text[0] = 0xC0 | (char) ((codepoint >> 6) & 0x1F);
307 text[1] = 0x80 | (char) (codepoint & 0x3F);
309 }
else if (codepoint <= 0xFFFF) {
310 text[0] = 0xE0 | (char) ((codepoint >> 12) & 0x0F);
311 text[1] = 0x80 | (char) ((codepoint >> 6) & 0x3F);
312 text[2] = 0x80 | (char) (codepoint & 0x3F);
314 }
else if (codepoint <= 0x10FFFF) {
315 text[0] = 0xF0 | (char) ((codepoint >> 18) & 0x0F);
316 text[1] = 0x80 | (char) ((codepoint >> 12) & 0x3F);
317 text[2] = 0x80 | (char) ((codepoint >> 6) & 0x3F);
318 text[3] = 0x80 | (char) (codepoint & 0x3F);
327 ShouldGenerateWindowCloseOnAltF4(
void)
346 LRESULT returnCode = -1;
354 wmmsg.
msg.win.hwnd = hwnd;
356 wmmsg.
msg.win.wParam = wParam;
357 wmmsg.
msg.win.lParam = lParam;
364 return CallWindowProc(DefWindowProc, hwnd, msg, wParam, lParam);
371 SDL_snprintf(message,
sizeof(message),
"Received windows message: %p UNKNOWN (%d) -- 0x%X, 0x%X\n", hwnd, msg, wParam, lParam);
373 SDL_snprintf(message,
sizeof(message),
"Received windows message: %p %s -- 0x%X, 0x%X\n", hwnd,
wmtab[msg], wParam, lParam);
375 OutputDebugStringA(message);
399 minimized = HIWORD(wParam);
400 if (!minimized && (LOWORD(wParam) != WA_INACTIVE)) {
408 GetCursorPos(&cursorPos);
409 ScreenToClient(hwnd, &cursorPos);
412 WIN_CheckAsyncMouseRelease(data);
450 case WM_LBUTTONDBLCLK:
452 case WM_RBUTTONDBLCLK:
454 case WM_MBUTTONDBLCLK:
456 case WM_XBUTTONDBLCLK:
461 WIN_CheckWParamMouseButtons(wParam, data, mouseID);
469 HRAWINPUT hRawInput = (HRAWINPUT)lParam;
481 GetRawInputData(hRawInput, RID_INPUT, &inp, &size,
sizeof(RAWINPUTHEADER));
484 if (inp.header.dwType == RIM_TYPEMOUSE) {
486 RAWMOUSE* rawmouse = &inp.data.mouse;
488 if ((rawmouse->usFlags & 0x01) == MOUSE_MOVE_RELATIVE) {
493 if (initialMousePoint.
x == 0 && initialMousePoint.
y == 0) {
494 initialMousePoint.
x = rawmouse->lLastX;
495 initialMousePoint.
y = rawmouse->lLastY;
498 SDL_SendMouseMotion(data->
window, 0, 1, (
int)(rawmouse->lLastX-initialMousePoint.
x), (
int)(rawmouse->lLastY-initialMousePoint.
y) );
500 initialMousePoint.
x = rawmouse->lLastX;
501 initialMousePoint.
y = rawmouse->lLastY;
503 WIN_CheckRawMouseButtons(rawmouse->usButtonFlags, data);
504 }
else if (isCapture) {
508 if (WindowFromPoint(pt) != hwnd) {
509 ScreenToClient(hwnd, &pt);
526 static short s_AccumulatedMotion;
528 s_AccumulatedMotion += GET_WHEEL_DELTA_WPARAM(wParam);
529 if (s_AccumulatedMotion > 0) {
530 while (s_AccumulatedMotion >= WHEEL_DELTA) {
532 s_AccumulatedMotion -= WHEEL_DELTA;
535 while (s_AccumulatedMotion <= -WHEEL_DELTA) {
537 s_AccumulatedMotion += WHEEL_DELTA;
545 static short s_AccumulatedMotion;
547 s_AccumulatedMotion += GET_WHEEL_DELTA_WPARAM(wParam);
548 if (s_AccumulatedMotion > 0) {
549 while (s_AccumulatedMotion >= WHEEL_DELTA) {
551 s_AccumulatedMotion -= WHEEL_DELTA;
554 while (s_AccumulatedMotion <= -WHEEL_DELTA) {
556 s_AccumulatedMotion += WHEEL_DELTA;
565 if (!IsIconic(hwnd)) {
567 GetCursorPos(&cursorPos);
568 ScreenToClient(hwnd, &cursorPos);
580 SDL_Scancode code = WindowsScanCodeToSDLScanCode(lParam, wParam);
602 SDL_Scancode code = WindowsScanCodeToSDLScanCode(lParam, wParam);
617 if ( wParam == UNICODE_NOCHAR ) {
625 if ( WIN_ConvertUTF32toUTF8( (UINT32)wParam, text ) ) {
632 #ifdef WM_INPUTLANGCHANGE 633 case WM_INPUTLANGCHANGE:
642 case WM_NCLBUTTONDOWN:
648 case WM_CAPTURECHANGED:
653 WIN_CheckAsyncMouseRelease(data);
657 #ifdef WM_GETMINMAXINFO 658 case WM_GETMINMAXINFO:
668 BOOL constrain_max_size;
679 GetWindowRect(hwnd, &size);
692 if (max_w && max_h) {
695 constrain_max_size =
TRUE;
697 constrain_max_size =
FALSE;
705 style = GetWindowLong(hwnd, GWL_STYLE);
711 menu = (style & WS_CHILDWINDOW) ?
FALSE : (GetMenu(hwnd) !=
NULL);
712 AdjustWindowRectEx(&size, style, menu, 0);
713 w = size.right - size.left;
714 h = size.bottom - size.top;
717 info = (MINMAXINFO *) lParam;
719 info->ptMinTrackSize.x = w + min_w;
720 info->ptMinTrackSize.y = h + min_h;
721 if (constrain_max_size) {
722 info->ptMaxTrackSize.x = w + max_w;
723 info->ptMaxTrackSize.y = h + max_h;
726 info->ptMaxSize.x =
w;
727 info->ptMaxSize.y =
h;
728 info->ptMaxPosition.x =
x;
729 info->ptMaxPosition.y =
y;
730 info->ptMinTrackSize.x =
w;
731 info->ptMinTrackSize.y =
h;
732 info->ptMaxTrackSize.x =
w;
733 info->ptMaxTrackSize.y =
h;
740 case WM_WINDOWPOSCHANGED:
750 if (!GetClientRect(hwnd, &rect) || IsRectEmpty(&rect)) {
753 ClientToScreen(hwnd, (LPPOINT) & rect);
754 ClientToScreen(hwnd, (LPPOINT) & rect + 1);
762 w = rect.right - rect.left;
763 h = rect.bottom - rect.top;
792 hittest = LOWORD(lParam);
793 if (hittest == HTCLIENT) {
807 if (GetUpdateRect(hwnd, &rect,
FALSE)) {
808 ValidateRect(hwnd,
NULL);
824 if ((wParam & 0xFFF0) == SC_KEYMENU) {
828 #if defined(SC_SCREENSAVE) || defined(SC_MONITORPOWER) 830 if ((wParam & 0xFFF0) == SC_SCREENSAVE ||
831 (wParam & 0xFFF0) == SC_MONITORPOWER) {
849 UINT i, num_inputs = LOWORD(wParam);
851 if (data->
videodata->GetTouchInputInfo((HTOUCHINPUT)lParam, num_inputs, inputs,
sizeof(
TOUCHINPUT))) {
855 if (!GetClientRect(hwnd, &rect) ||
856 (rect.right == rect.left && rect.bottom == rect.top)) {
862 ClientToScreen(hwnd, (LPPOINT) & rect);
863 ClientToScreen(hwnd, (LPPOINT) & rect + 1);
869 for (i = 0; i < num_inputs; ++
i) {
878 x = (float)(input->x - rect.left)/(rect.right - rect.left);
879 y = (float)(input->y - rect.top)/(rect.bottom - rect.top);
894 data->
videodata->CloseTouchInputHandle((HTOUCHINPUT)lParam);
902 HDROP drop = (HDROP) wParam;
904 for (i = 0; i <
count; ++
i) {
905 UINT size = DragQueryFile(drop, i,
NULL, 0) + 1;
908 if (DragQueryFile(drop, i, buffer, size)) {
925 POINT winpoint = { (
int) LOWORD(lParam), (
int) HIWORD(lParam) };
926 if (ScreenToClient(hwnd, &winpoint)) {
927 const SDL_Point point = { (
int) winpoint.
x, (
int) winpoint.y };
951 return CallWindowProc(data->
wndproc, hwnd, msg, wParam, lParam);
952 }
else if (returnCode >= 0) {
955 return CallWindowProc(DefWindowProc, hwnd, msg, wParam, lParam);
961 static void *g_WindowsMessageHookData =
NULL;
966 g_WindowsMessageHookData = userdata;
972 const Uint8 *keystate;
974 DWORD start_ticks = GetTickCount();
977 while (PeekMessage(&msg,
NULL, 0, 0, PM_REMOVE)) {
978 if (g_WindowsMessageHook) {
979 g_WindowsMessageHook(g_WindowsMessageHookData, msg.hwnd, msg.message, msg.wParam, msg.lParam);
983 TranslateMessage(&msg);
984 DispatchMessage(&msg);
1006 static int app_registered = 0;
1018 if (app_registered) {
1022 if (!name && !SDL_Appname) {
1024 #if defined(CS_BYTEALIGNCLIENT) || defined(CS_OWNDC) 1025 SDL_Appstyle = (CS_BYTEALIGNCLIENT | CS_OWNDC);
1027 SDL_Instance = hInst ? hInst : GetModuleHandle(
NULL);
1032 SDL_Appstyle = style;
1033 SDL_Instance = hInst ? hInst : GetModuleHandle(
NULL);
1037 class.hCursor =
NULL;
1039 LoadImage(SDL_Instance, SDL_Appname, IMAGE_ICON, 0, 0,
1041 class.lpszMenuName =
NULL;
1043 class.hbrBackground =
NULL;
1047 class.cbWndExtra = 0;
1048 class.cbClsExtra = 0;
1049 if (!RegisterClass(&
class)) {
1050 return SDL_SetError(
"Couldn't register application class");
1064 if (!app_registered) {
1068 if (app_registered == 0) {
1070 if (GetClassInfo(SDL_Instance, SDL_Appname, &
class)) {
1071 UnregisterClass(SDL_Appname, SDL_Instance);
#define WIN_UTF8ToString(S)
SDL_Mouse * SDL_GetMouse(void)
SDL_bool g_WindowFrameUsableWhileCursorHidden
#define SDL_IsShapedWindow
void SDL_SetKeyboardFocus(SDL_Window *window)
int Win32_ResizeWindowShape(SDL_Window *window)
uint32_t Uint32
An unsigned 32-bit integer type.
GLuint GLsizei const GLchar * message
GLint GLint GLint GLint GLint x
SDL_bool relative_mode_warp
GLuint GLuint GLsizei count
#define SDL_BUTTON_X2MASK
LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
The structure that defines a point.
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
#define SDL_GetWindowFlags
int SDL_SendTouch(SDL_TouchID id, SDL_FingerID fingerid, SDL_bool down, float x, float y, float pressure)
GLuint const GLchar * name
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
void SDL_SetMouseFocus(SDL_Window *window)
#define SDL_GetKeyboardFocus
#define SDL_TOUCH_MOUSEID
union SDL_SysWMmsg::@16 msg
SDL_bool g_WindowsEnableMessageLoop
int SDL_SendSysWMEvent(SDL_SysWMmsg *message)
int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)
int SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, float x, float y, float pressure)
#define SDL_VERSION(x)
Macro to determine SDL version program was compiled against.
SDL_HitTestResult
Possible return values from the SDL_HitTest callback.
void SDL_UnregisterApp(void)
#define SDL_GetWindowSize
SDL_bool in_border_change
GLenum GLenum GLenum input
#define SDL_GetEventState(type)
#define SDL_GetKeyboardState
GLint GLint GLint GLint GLint GLint y
int SDL_SendMouseMotion(SDL_Window *window, SDL_MouseID mouseID, int relative, int x, int y)
struct SDL_VideoData * videodata
uint8_t Uint8
An unsigned 8-bit integer type.
int SDL_SendKeyboardText(const char *text)
#define SDL_stack_alloc(type, count)
#define SDL_BUTTON_X1MASK
void WIN_UpdateClipCursor(SDL_Window *window)
#define WIN_StringToUTF8(S)
static Uint32 callback(Uint32 interval, void *param)
#define SDL_BUTTON_MIDDLE
#define SDL_GetWindowMinimumSize
int SDL_AddTouch(SDL_TouchID touchID, const char *name)
BOOL(WINAPI *CloseTouchInputHandle)(HTOUCHINPUT)
void SDL_ToggleModState(const SDL_Keymod modstate, const SDL_bool toggle)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
#define SDL_assert(condition)
#define SDL_GetMouseFocus
void WIN_UpdateKeymap(void)
static char text[MAX_TEXT_LENGTH]
void WIN_PumpEvents(_THIS)
int SDL_SendKeymapChangedEvent(void)
static const SDL_Scancode windows_scancode_table[]
int SDL_SendDropFile(const char *file)
The type used to identify a window.
SDL_bool focus_click_pending
uint16_t Uint16
An unsigned 16-bit integer type.
void(* SDL_WindowsMessageHook)(void *userdata, void *hWnd, unsigned int message, Uint64 wParam, Sint64 lParam)
Set a function that is called for every windows message, before TranslateMessage() ...
SDL_VideoDevice * SDL_GetVideoDevice(void)
#define SDL_GetWindowMaximumSize
SDL_bool in_window_deactivation
int SDL_SendMouseWheel(SDL_Window *window, SDL_MouseID mouseID, int x, int y, SDL_MouseWheelDirection direction)
GLubyte GLubyte GLubyte GLubyte w
void SDL_SetWindowsMessageHook(SDL_WindowsMessageHook callback, void *userdata)
#define SDL_stack_free(data)
void WIN_CheckClipboardUpdate(struct SDL_VideoData *data)
WPARAM mouse_button_flags
#define SDL_TICKS_PASSED(A, B)
Compare SDL ticks values, and return true if A has passed B.
int SDL_SendMouseButton(SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button)
SDL_Scancode
The SDL keyboard scancode representation.
#define SDL_GetMouseState
int SDL_RegisterApp(char *name, Uint32 style, void *hInst)
GLfloat GLfloat GLfloat GLfloat h
#define SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4
Tell SDL not to generate window-close events for Alt+F4 on Windows.
SDL_bool IME_HandleMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM *lParam, struct SDL_VideoData *videodata)