diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index af3407c407dc7..65f163061d6f9 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -579,6 +579,11 @@ static void WIN_HandleRawMouseInput(Uint64 timestamp, SDL_VideoData *data, HANDL return; } + SDL_Mouse *mouse = SDL_GetMouse(); + if (!mouse) { + return; + } + if (GetMouseMessageSource(rawmouse->ulExtraInformation) != SDL_MOUSE_EVENT_SOURCE_MOUSE) { return; } @@ -647,7 +652,7 @@ static void WIN_HandleRawMouseInput(Uint64 timestamp, SDL_VideoData *data, HANDL } } } - } else { + } else if (mouse->pen_mouse_events) { const int MAXIMUM_TABLET_RELATIVE_MOTION = 32; if (SDL_abs(relX) > MAXIMUM_TABLET_RELATIVE_MOTION || SDL_abs(relY) > MAXIMUM_TABLET_RELATIVE_MOTION) { @@ -655,6 +660,14 @@ static void WIN_HandleRawMouseInput(Uint64 timestamp, SDL_VideoData *data, HANDL } else { SDL_SendMouseMotion(timestamp, window, mouseID, true, (float)relX, (float)relY); } + } else { + int screen_x = virtual_desktop ? GetSystemMetrics(SM_XVIRTUALSCREEN) : 0; + int screen_y = virtual_desktop ? GetSystemMetrics(SM_YVIRTUALSCREEN) : 0; + + if (!data->raw_input_fake_pen_id) { + data->raw_input_fake_pen_id = SDL_AddPenDevice(timestamp, "raw mouse input", NULL, SDL_malloc(1)); + } + SDL_SendPenMotion(timestamp, data->raw_input_fake_pen_id, window, (float)(x + screen_x - window->x), (float)(y + screen_y - window->y)); } data->last_raw_mouse_position.x = x; diff --git a/src/video/windows/SDL_windowsrawinput.c b/src/video/windows/SDL_windowsrawinput.c index fa249914d0f49..b9d4f979ae2f9 100644 --- a/src/video/windows/SDL_windowsrawinput.c +++ b/src/video/windows/SDL_windowsrawinput.c @@ -111,6 +111,11 @@ static DWORD WINAPI WIN_RawInputThread(LPVOID param) WIN_PollRawInput(_this, poll_start); } + if (_this->internal->raw_input_fake_pen_id) { + SDL_RemovePenDevice(0, _this->internal->raw_input_fake_pen_id); + _this->internal->raw_input_fake_pen_id = 0; + } + devices[0].dwFlags |= RIDEV_REMOVE; devices[1].dwFlags |= RIDEV_REMOVE; RegisterRawInputDevices(devices, count, sizeof(devices[0])); diff --git a/src/video/windows/SDL_windowsvideo.h b/src/video/windows/SDL_windowsvideo.h index 53cfbadd7220c..cbf5639e15101 100644 --- a/src/video/windows/SDL_windowsvideo.h +++ b/src/video/windows/SDL_windowsvideo.h @@ -440,6 +440,7 @@ struct SDL_VideoData bool raw_keyboard_enabled; bool pending_E1_key_sequence; Uint32 raw_input_enabled; + SDL_PenID raw_input_fake_pen_id; WIN_GameInputData *gameinput_context;