mirror of
				https://github.com/libsdl-org/SDL.git
				synced 2025-10-26 12:27:44 +00:00 
			
		
		
		
	Be explicit about the event mouse and keyboard ID
This commit is contained in:
		| @@ -58,7 +58,7 @@ typedef Uint32 SDL_PenID; /**< SDL_PenIDs identify pens uniquely within a sessio | |||||||
|  |  | ||||||
| #define SDL_PEN_INVALID ((SDL_PenID)0) /**< Reserved invalid ::SDL_PenID is valid */ | #define SDL_PEN_INVALID ((SDL_PenID)0) /**< Reserved invalid ::SDL_PenID is valid */ | ||||||
|  |  | ||||||
| #define SDL_PEN_MOUSEID ((SDL_PenID)-2) /**< Device ID for mouse events triggered by pen events */ | #define SDL_PEN_MOUSEID ((SDL_MouseID)-2) /**< Device ID for mouse events triggered by pen events */ | ||||||
|  |  | ||||||
| #define SDL_PEN_INFO_UNKNOWN (-1) /**< Marks unknown information when querying the pen */ | #define SDL_PEN_INFO_UNKNOWN (-1) /**< Marks unknown information when querying the pen */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -46,6 +46,9 @@ extern "C" { | |||||||
|  |  | ||||||
| #include <vector> | #include <vector> | ||||||
|  |  | ||||||
|  | #define BAPP_KEYBOARD_ID    1 | ||||||
|  | #define BAPP_MOUSE_ID       1 | ||||||
|  |  | ||||||
| /* Forward declarations */ | /* Forward declarations */ | ||||||
| class SDL_BLooper; | class SDL_BLooper; | ||||||
| class SDL_BWin; | class SDL_BWin; | ||||||
| @@ -248,12 +251,12 @@ class SDL_BLooper : public BLooper | |||||||
|             SDL_GetWindowPosition(win, &winPosX, &winPosY); |             SDL_GetWindowPosition(win, &winPosX, &winPosY); | ||||||
|             int dx = x - (winWidth / 2); |             int dx = x - (winWidth / 2); | ||||||
|             int dy = y - (winHeight / 2); |             int dy = y - (winHeight / 2); | ||||||
|             SDL_SendMouseMotion(0, win, 0, SDL_GetMouse()->relative_mode, (float)dx, (float)dy); |             SDL_SendMouseMotion(0, win, BAPP_MOUSE_ID, SDL_GetMouse()->relative_mode, (float)dx, (float)dy); | ||||||
|             set_mouse_position((winPosX + winWidth / 2), (winPosY + winHeight / 2)); |             set_mouse_position((winPosX + winWidth / 2), (winPosY + winHeight / 2)); | ||||||
|             if (!be_app->IsCursorHidden()) |             if (!be_app->IsCursorHidden()) | ||||||
|                 be_app->HideCursor(); |                 be_app->HideCursor(); | ||||||
|         } else { |         } else { | ||||||
|             SDL_SendMouseMotion(0, win, 0, 0, (float)x, (float)y); |             SDL_SendMouseMotion(0, win, BAPP_MOUSE_ID, SDL_FALSE, (float)x, (float)y); | ||||||
|             if (SDL_CursorVisible() && be_app->IsCursorHidden()) |             if (SDL_CursorVisible() && be_app->IsCursorHidden()) | ||||||
|                 be_app->ShowCursor(); |                 be_app->ShowCursor(); | ||||||
|         } |         } | ||||||
| @@ -271,7 +274,7 @@ class SDL_BLooper : public BLooper | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         win = GetSDLWindow(winID); |         win = GetSDLWindow(winID); | ||||||
|         SDL_SendMouseButton(0, win, 0, state, button); |         SDL_SendMouseButton(0, win, BAPP_MOUSE_ID, state, button); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void _HandleMouseWheel(BMessage *msg) |     void _HandleMouseWheel(BMessage *msg) | ||||||
| @@ -286,7 +289,7 @@ class SDL_BLooper : public BLooper | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         win = GetSDLWindow(winID); |         win = GetSDLWindow(winID); | ||||||
|         SDL_SendMouseWheel(0, win, 0, xTicks, -yTicks, SDL_MOUSEWHEEL_NORMAL); |         SDL_SendMouseWheel(0, win, BAPP_MOUSE_ID, xTicks, -yTicks, SDL_MOUSEWHEEL_NORMAL); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void _HandleKey(BMessage *msg) |     void _HandleKey(BMessage *msg) | ||||||
| @@ -303,7 +306,7 @@ class SDL_BLooper : public BLooper | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         HAIKU_SetKeyState(scancode, state); |         HAIKU_SetKeyState(scancode, state); | ||||||
|         SDL_SendKeyboardKey(0, 0, state, HAIKU_GetScancodeFromBeKey(scancode)); |         SDL_SendKeyboardKey(0, BAPP_KEYBOARD_ID, state, HAIKU_GetScancodeFromBeKey(scancode)); | ||||||
|  |  | ||||||
|         if (state == SDL_PRESSED && SDL_EventEnabled(SDL_EVENT_TEXT_INPUT)) { |         if (state == SDL_PRESSED && SDL_EventEnabled(SDL_EVENT_TEXT_INPUT)) { | ||||||
|             const int8 *keyUtf8; |             const int8 *keyUtf8; | ||||||
|   | |||||||
| @@ -605,11 +605,20 @@ static SDL_Scancode SDL_EVDEV_translate_keycode(int keycode) | |||||||
|     return scancode; |     return scancode; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int SDL_EVDEV_init_keyboard(SDL_evdevlist_item *item, int udev_class) | ||||||
|  | { | ||||||
|  |     SDL_AddKeyboard((SDL_KeyboardID)item->fd, SDL_TRUE); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
| static int SDL_EVDEV_init_mouse(SDL_evdevlist_item *item, int udev_class) | static int SDL_EVDEV_init_mouse(SDL_evdevlist_item *item, int udev_class) | ||||||
| { | { | ||||||
|     int ret; |     int ret; | ||||||
|     struct input_absinfo abs_info; |     struct input_absinfo abs_info; | ||||||
|  |  | ||||||
|  |     SDL_AddMouse((SDL_MouseID)item->fd, SDL_TRUE); | ||||||
|  |  | ||||||
|     ret = ioctl(item->fd, EVIOCGABS(ABS_X), &abs_info); |     ret = ioctl(item->fd, EVIOCGABS(ABS_X), &abs_info); | ||||||
|     if (ret < 0) { |     if (ret < 0) { | ||||||
|         // no absolute mode info, continue |         // no absolute mode info, continue | ||||||
| @@ -922,6 +931,14 @@ static int SDL_EVDEV_device_added(const char *dev_path, int udev_class) | |||||||
|             SDL_free(item); |             SDL_free(item); | ||||||
|             return ret; |             return ret; | ||||||
|         } |         } | ||||||
|  |     } else if (udev_class & SDL_UDEV_DEVICE_KEYBOARD) { | ||||||
|  |         int ret = SDL_EVDEV_init_keyboard(item, udev_class); | ||||||
|  |         if (ret < 0) { | ||||||
|  |             close(item->fd); | ||||||
|  |             SDL_free(item->path); | ||||||
|  |             SDL_free(item); | ||||||
|  |             return ret; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!_this->last) { |     if (!_this->last) { | ||||||
|   | |||||||
| @@ -33,6 +33,7 @@ | |||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
|  |  | ||||||
| #include "../../events/SDL_events_c.h" | #include "../../events/SDL_events_c.h" | ||||||
|  | #include "../../events/SDL_keyboard_c.h" | ||||||
|  |  | ||||||
| #ifdef SDL_PLATFORM_NETBSD | #ifdef SDL_PLATFORM_NETBSD | ||||||
| #define KS_GROUP_Ascii    KS_GROUP_Plain | #define KS_GROUP_Ascii    KS_GROUP_Plain | ||||||
| @@ -388,6 +389,7 @@ static struct wscons_keycode_to_SDL | |||||||
| typedef struct | typedef struct | ||||||
| { | { | ||||||
|     int fd; |     int fd; | ||||||
|  |     SDL_KeyboardID keyboardID; | ||||||
|     struct wskbd_map_data keymap; |     struct wskbd_map_data keymap; | ||||||
|     int ledstate; |     int ledstate; | ||||||
|     int origledstate; |     int origledstate; | ||||||
| @@ -420,14 +422,19 @@ static SDL_WSCONS_input_data *SDL_WSCONS_Init_Keyboard(const char *dev) | |||||||
|     SDL_WSCONS_input_data *input = (SDL_WSCONS_input_data *)SDL_calloc(1, sizeof(SDL_WSCONS_input_data)); |     SDL_WSCONS_input_data *input = (SDL_WSCONS_input_data *)SDL_calloc(1, sizeof(SDL_WSCONS_input_data)); | ||||||
|  |  | ||||||
|     if (!input) { |     if (!input) { | ||||||
|         return input; |         return NULL; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     input->fd = open(dev, O_RDWR | O_NONBLOCK | O_CLOEXEC); |     input->fd = open(dev, O_RDWR | O_NONBLOCK | O_CLOEXEC); | ||||||
|     if (input->fd == -1) { |     if (input->fd == -1) { | ||||||
|         SDL_free(input); |         SDL_free(input); | ||||||
|         input = NULL; |         input = NULL; | ||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     input->keyboardID = SDL_GetNextObjectID(); | ||||||
|  |     SDL_AddKeyboard(input->keyboardID, SDL_FALSE); | ||||||
|  |  | ||||||
|     input->keymap.map = SDL_calloc(sizeof(struct wscons_keymap), KS_NUMKEYCODES); |     input->keymap.map = SDL_calloc(sizeof(struct wscons_keymap), KS_NUMKEYCODES); | ||||||
|     if (!input->keymap.map) { |     if (!input->keymap.map) { | ||||||
|         SDL_free(input); |         SDL_free(input); | ||||||
| @@ -553,22 +560,22 @@ static void Translate_to_keycode(SDL_WSCONS_input_data *input, int type, keysym_ | |||||||
|     switch (keyDesc.command) { |     switch (keyDesc.command) { | ||||||
|     case KS_Cmd_ScrollBack: |     case KS_Cmd_ScrollBack: | ||||||
|     { |     { | ||||||
|         SDL_SendKeyboardKey(0, 0, type == WSCONS_EVENT_KEY_DOWN ? SDL_PRESSED : SDL_RELEASED, SDL_SCANCODE_PAGEUP); |         SDL_SendKeyboardKey(0, input->keyboardID, type == WSCONS_EVENT_KEY_DOWN ? SDL_PRESSED : SDL_RELEASED, SDL_SCANCODE_PAGEUP); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     case KS_Cmd_ScrollFwd: |     case KS_Cmd_ScrollFwd: | ||||||
|     { |     { | ||||||
|         SDL_SendKeyboardKey(0, 0, type == WSCONS_EVENT_KEY_DOWN ? SDL_PRESSED : SDL_RELEASED, SDL_SCANCODE_PAGEDOWN); |         SDL_SendKeyboardKey(0, input->keyboardID, type == WSCONS_EVENT_KEY_DOWN ? SDL_PRESSED : SDL_RELEASED, SDL_SCANCODE_PAGEDOWN); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     } |     } | ||||||
|     for (i = 0; i < sizeof(conversion_table) / sizeof(struct wscons_keycode_to_SDL); i++) { |     for (i = 0; i < sizeof(conversion_table) / sizeof(struct wscons_keycode_to_SDL); i++) { | ||||||
|         if (conversion_table[i].sourcekey == group[0]) { |         if (conversion_table[i].sourcekey == group[0]) { | ||||||
|             SDL_SendKeyboardKey(0, 0, type == WSCONS_EVENT_KEY_DOWN ? SDL_PRESSED : SDL_RELEASED, conversion_table[i].targetKey); |             SDL_SendKeyboardKey(0, input->keyboardID, type == WSCONS_EVENT_KEY_DOWN ? SDL_PRESSED : SDL_RELEASED, conversion_table[i].targetKey); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     SDL_SendKeyboardKey(0, 0, type == WSCONS_EVENT_KEY_DOWN ? SDL_PRESSED : SDL_RELEASED, SDL_SCANCODE_UNKNOWN); |     SDL_SendKeyboardKey(0, input->keyboardID, type == WSCONS_EVENT_KEY_DOWN ? SDL_PRESSED : SDL_RELEASED, SDL_SCANCODE_UNKNOWN); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void updateKeyboard(SDL_WSCONS_input_data *input) | static void updateKeyboard(SDL_WSCONS_input_data *input) | ||||||
| @@ -802,13 +809,13 @@ static void updateKeyboard(SDL_WSCONS_input_data *input) | |||||||
|             } break; |             } break; | ||||||
|             case WSCONS_EVENT_ALL_KEYS_UP: |             case WSCONS_EVENT_ALL_KEYS_UP: | ||||||
|                 for (i = 0; i < SDL_NUM_SCANCODES; i++) { |                 for (i = 0; i < SDL_NUM_SCANCODES; i++) { | ||||||
|                     SDL_SendKeyboardKey(0, 0, SDL_RELEASED, i); |                     SDL_SendKeyboardKey(0, input->keyboardID, SDL_RELEASED, i); | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (input->type == WSKBD_TYPE_USB && events[i].value <= 0xE7) |             if (input->type == WSKBD_TYPE_USB && events[i].value <= 0xE7) | ||||||
|                 SDL_SendKeyboardKey(0, 0, type == WSCONS_EVENT_KEY_DOWN ? SDL_PRESSED : SDL_RELEASED, (SDL_Scancode)events[i].value); |                 SDL_SendKeyboardKey(0, input->keyboardID, type == WSCONS_EVENT_KEY_DOWN ? SDL_PRESSED : SDL_RELEASED, (SDL_Scancode)events[i].value); | ||||||
|             else |             else | ||||||
|                 Translate_to_keycode(input, type, events[i].value); |                 Translate_to_keycode(input, type, events[i].value); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ | |||||||
| typedef struct SDL_WSCONS_mouse_input_data | typedef struct SDL_WSCONS_mouse_input_data | ||||||
| { | { | ||||||
|     int fd; |     int fd; | ||||||
|  |     SDL_MouseID mouseID; | ||||||
| } SDL_WSCONS_mouse_input_data; | } SDL_WSCONS_mouse_input_data; | ||||||
|  |  | ||||||
| SDL_WSCONS_mouse_input_data *SDL_WSCONS_Init_Mouse() | SDL_WSCONS_mouse_input_data *SDL_WSCONS_Init_Mouse() | ||||||
| @@ -39,32 +40,36 @@ SDL_WSCONS_mouse_input_data *SDL_WSCONS_Init_Mouse() | |||||||
| #ifdef WSMOUSEIO_SETVERSION | #ifdef WSMOUSEIO_SETVERSION | ||||||
|     int version = WSMOUSE_EVENT_VERSION; |     int version = WSMOUSE_EVENT_VERSION; | ||||||
| #endif | #endif | ||||||
|     SDL_WSCONS_mouse_input_data *mouseInputData = SDL_calloc(1, sizeof(SDL_WSCONS_mouse_input_data)); |     SDL_WSCONS_mouse_input_data *input = SDL_calloc(1, sizeof(SDL_WSCONS_mouse_input_data)); | ||||||
|  |  | ||||||
|     if (!mouseInputData) { |     if (!input) { | ||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
|     mouseInputData->fd = open("/dev/wsmouse", O_RDWR | O_NONBLOCK | O_CLOEXEC); |     input->fd = open("/dev/wsmouse", O_RDWR | O_NONBLOCK | O_CLOEXEC); | ||||||
|     if (mouseInputData->fd == -1) { |     if (input->fd == -1) { | ||||||
|         SDL_free(mouseInputData); |         SDL_free(input); | ||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     input->mouseID = SDL_GetNextObjectID(); | ||||||
|  |     SDL_AddMouse(input->mouseID, SDL_FALSE); | ||||||
|  |  | ||||||
| #ifdef WSMOUSEIO_SETMODE | #ifdef WSMOUSEIO_SETMODE | ||||||
|     ioctl(mouseInputData->fd, WSMOUSEIO_SETMODE, WSMOUSE_COMPAT); |     ioctl(input->fd, WSMOUSEIO_SETMODE, WSMOUSE_COMPAT); | ||||||
| #endif | #endif | ||||||
| #ifdef WSMOUSEIO_SETVERSION | #ifdef WSMOUSEIO_SETVERSION | ||||||
|     ioctl(mouseInputData->fd, WSMOUSEIO_SETVERSION, &version); |     ioctl(input->fd, WSMOUSEIO_SETVERSION, &version); | ||||||
| #endif | #endif | ||||||
|     return mouseInputData; |     return input; | ||||||
| } | } | ||||||
|  |  | ||||||
| void updateMouse(SDL_WSCONS_mouse_input_data *inputData) | void updateMouse(SDL_WSCONS_mouse_input_data *input) | ||||||
| { | { | ||||||
|     struct wscons_event events[64]; |     struct wscons_event events[64]; | ||||||
|     int n; |     int n; | ||||||
|     SDL_Mouse *mouse = SDL_GetMouse(); |     SDL_Mouse *mouse = SDL_GetMouse(); | ||||||
|  |  | ||||||
|     if ((n = read(inputData->fd, events, sizeof(events))) > 0) { |     if ((n = read(input->fd, events, sizeof(events))) > 0) { | ||||||
|         int i; |         int i; | ||||||
|         n /= sizeof(struct wscons_event); |         n /= sizeof(struct wscons_event); | ||||||
|         for (i = 0; i < n; i++) { |         for (i = 0; i < n; i++) { | ||||||
| @@ -74,13 +79,13 @@ void updateMouse(SDL_WSCONS_mouse_input_data *inputData) | |||||||
|             { |             { | ||||||
|                 switch (events[i].value) { |                 switch (events[i].value) { | ||||||
|                 case 0: /* Left Mouse Button. */ |                 case 0: /* Left Mouse Button. */ | ||||||
|                     SDL_SendMouseButton(0, mouse->focus, mouse->mouseID, SDL_PRESSED, SDL_BUTTON_LEFT); |                     SDL_SendMouseButton(0, mouse->focus, input->mouseID, SDL_PRESSED, SDL_BUTTON_LEFT); | ||||||
|                     break; |                     break; | ||||||
|                 case 1: /* Middle Mouse Button. */ |                 case 1: /* Middle Mouse Button. */ | ||||||
|                     SDL_SendMouseButton(0, mouse->focus, mouse->mouseID, SDL_PRESSED, SDL_BUTTON_MIDDLE); |                     SDL_SendMouseButton(0, mouse->focus, input->mouseID, SDL_PRESSED, SDL_BUTTON_MIDDLE); | ||||||
|                     break; |                     break; | ||||||
|                 case 2: /* Right Mouse Button. */ |                 case 2: /* Right Mouse Button. */ | ||||||
|                     SDL_SendMouseButton(0, mouse->focus, mouse->mouseID, SDL_PRESSED, SDL_BUTTON_RIGHT); |                     SDL_SendMouseButton(0, mouse->focus, input->mouseID, SDL_PRESSED, SDL_BUTTON_RIGHT); | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
|             } break; |             } break; | ||||||
| @@ -88,34 +93,34 @@ void updateMouse(SDL_WSCONS_mouse_input_data *inputData) | |||||||
|             { |             { | ||||||
|                 switch (events[i].value) { |                 switch (events[i].value) { | ||||||
|                 case 0: /* Left Mouse Button. */ |                 case 0: /* Left Mouse Button. */ | ||||||
|                     SDL_SendMouseButton(0, mouse->focus, mouse->mouseID, SDL_RELEASED, SDL_BUTTON_LEFT); |                     SDL_SendMouseButton(0, mouse->focus, input->mouseID, SDL_RELEASED, SDL_BUTTON_LEFT); | ||||||
|                     break; |                     break; | ||||||
|                 case 1: /* Middle Mouse Button. */ |                 case 1: /* Middle Mouse Button. */ | ||||||
|                     SDL_SendMouseButton(0, mouse->focus, mouse->mouseID, SDL_RELEASED, SDL_BUTTON_MIDDLE); |                     SDL_SendMouseButton(0, mouse->focus, input->mouseID, SDL_RELEASED, SDL_BUTTON_MIDDLE); | ||||||
|                     break; |                     break; | ||||||
|                 case 2: /* Right Mouse Button. */ |                 case 2: /* Right Mouse Button. */ | ||||||
|                     SDL_SendMouseButton(0, mouse->focus, mouse->mouseID, SDL_RELEASED, SDL_BUTTON_RIGHT); |                     SDL_SendMouseButton(0, mouse->focus, input->mouseID, SDL_RELEASED, SDL_BUTTON_RIGHT); | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
|             } break; |             } break; | ||||||
|             case WSCONS_EVENT_MOUSE_DELTA_X: |             case WSCONS_EVENT_MOUSE_DELTA_X: | ||||||
|             { |             { | ||||||
|                 SDL_SendMouseMotion(0, mouse->focus, mouse->mouseID, 1, (float)events[i].value, 0.0f); |                 SDL_SendMouseMotion(0, mouse->focus, input->mouseID, 1, (float)events[i].value, 0.0f); | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             case WSCONS_EVENT_MOUSE_DELTA_Y: |             case WSCONS_EVENT_MOUSE_DELTA_Y: | ||||||
|             { |             { | ||||||
|                 SDL_SendMouseMotion(0, mouse->focus, mouse->mouseID, 1, 0.0f, -(float)events[i].value); |                 SDL_SendMouseMotion(0, mouse->focus, input->mouseID, 1, 0.0f, -(float)events[i].value); | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             case WSCONS_EVENT_MOUSE_DELTA_W: |             case WSCONS_EVENT_MOUSE_DELTA_W: | ||||||
|             { |             { | ||||||
|                 SDL_SendMouseWheel(0, mouse->focus, mouse->mouseID, events[i].value, 0, SDL_MOUSEWHEEL_NORMAL); |                 SDL_SendMouseWheel(0, mouse->focus, input->mouseID, events[i].value, 0, SDL_MOUSEWHEEL_NORMAL); | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             case WSCONS_EVENT_MOUSE_DELTA_Z: |             case WSCONS_EVENT_MOUSE_DELTA_Z: | ||||||
|             { |             { | ||||||
|                 SDL_SendMouseWheel(0, mouse->focus, mouse->mouseID, 0, -events[i].value, SDL_MOUSEWHEEL_NORMAL); |                 SDL_SendMouseWheel(0, mouse->focus, input->mouseID, 0, -events[i].value, SDL_MOUSEWHEEL_NORMAL); | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             } |             } | ||||||
| @@ -123,11 +128,11 @@ void updateMouse(SDL_WSCONS_mouse_input_data *inputData) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void SDL_WSCONS_Quit_Mouse(SDL_WSCONS_mouse_input_data *inputData) | void SDL_WSCONS_Quit_Mouse(SDL_WSCONS_mouse_input_data *input) | ||||||
| { | { | ||||||
|     if (!inputData) { |     if (!input) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     close(inputData->fd); |     close(input->fd); | ||||||
|     SDL_free(inputData); |     SDL_free(input); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -538,7 +538,7 @@ void SDL_WinRTApp::OnWindowActivated(CoreWindow ^ sender, WindowActivatedEventAr | |||||||
|              */ |              */ | ||||||
| #if !SDL_WINAPI_FAMILY_PHONE || NTDDI_VERSION >= NTDDI_WINBLUE | #if !SDL_WINAPI_FAMILY_PHONE || NTDDI_VERSION >= NTDDI_WINBLUE | ||||||
|             Point cursorPos = WINRT_TransformCursorPosition(window, sender->PointerPosition, TransformToSDLWindowSize); |             Point cursorPos = WINRT_TransformCursorPosition(window, sender->PointerPosition, TransformToSDLWindowSize); | ||||||
|             SDL_SendMouseMotion(0, window, 0, 0, cursorPos.X, cursorPos.Y); |             SDL_SendMouseMotion(0, window, 0, SDL_FALSE, cursorPos.X, cursorPos.Y); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|             /* TODO, WinRT: see if the Win32 bugfix from https://hg.libsdl.org/SDL/rev/d278747da408 needs to be applied (on window activation) */ |             /* TODO, WinRT: see if the Win32 bugfix from https://hg.libsdl.org/SDL/rev/d278747da408 needs to be applied (on window activation) */ | ||||||
|   | |||||||
| @@ -691,7 +691,7 @@ SDL_bool SDL_IsKeyboard(Uint16 vendor, Uint16 product, int num_keys) | |||||||
|     return SDL_TRUE; |     return SDL_TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
| void SDL_PrivateKeyboardAdded(SDL_KeyboardID keyboardID) | void SDL_AddKeyboard(SDL_KeyboardID keyboardID, SDL_bool send_event) | ||||||
| { | { | ||||||
|     int keyboard_index = -1; |     int keyboard_index = -1; | ||||||
|  |  | ||||||
| @@ -717,14 +717,16 @@ void SDL_PrivateKeyboardAdded(SDL_KeyboardID keyboardID) | |||||||
|     SDL_keyboards = keyboards; |     SDL_keyboards = keyboards; | ||||||
|     ++SDL_keyboard_count; |     ++SDL_keyboard_count; | ||||||
|  |  | ||||||
|  |     if (send_event) { | ||||||
|         SDL_Event event; |         SDL_Event event; | ||||||
|         SDL_zero(event); |         SDL_zero(event); | ||||||
|         event.type = SDL_EVENT_KEYBOARD_ADDED; |         event.type = SDL_EVENT_KEYBOARD_ADDED; | ||||||
|         event.kdevice.which = keyboardID; |         event.kdevice.which = keyboardID; | ||||||
|         SDL_PushEvent(&event); |         SDL_PushEvent(&event); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void SDL_PrivateKeyboardRemoved(SDL_KeyboardID keyboardID) | void SDL_RemoveKeyboard(SDL_KeyboardID keyboardID) | ||||||
| { | { | ||||||
|     int keyboard_index = -1; |     int keyboard_index = -1; | ||||||
|  |  | ||||||
| @@ -936,13 +938,6 @@ static int SDL_SendKeyboardKeyInternal(Uint64 timestamp, Uint32 flags, SDL_Keybo | |||||||
|     Uint8 repeat = SDL_FALSE; |     Uint8 repeat = SDL_FALSE; | ||||||
|     const Uint8 source = flags & KEYBOARD_SOURCE_MASK; |     const Uint8 source = flags & KEYBOARD_SOURCE_MASK; | ||||||
|  |  | ||||||
|     if (keyboardID == 0) { |  | ||||||
|         if (source == KEYBOARD_HARDWARE && SDL_keyboard_count > 0) { |  | ||||||
|             /* Assume it's from the first keyboard */ |  | ||||||
|             keyboardID = SDL_keyboards[0]; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (scancode == SDL_SCANCODE_UNKNOWN || scancode >= SDL_NUM_SCANCODES) { |     if (scancode == SDL_SCANCODE_UNKNOWN || scancode >= SDL_NUM_SCANCODES) { | ||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -30,10 +30,10 @@ extern int SDL_InitKeyboard(void); | |||||||
| extern SDL_bool SDL_IsKeyboard(Uint16 vendor, Uint16 product, int num_keys); | extern SDL_bool SDL_IsKeyboard(Uint16 vendor, Uint16 product, int num_keys); | ||||||
|  |  | ||||||
| /* A keyboard has been added to the system */ | /* A keyboard has been added to the system */ | ||||||
| extern void SDL_PrivateKeyboardAdded(SDL_KeyboardID keyboardID); | extern void SDL_AddKeyboard(SDL_KeyboardID keyboardID, SDL_bool send_event); | ||||||
|  |  | ||||||
| /* A keyboard has been removed from the system */ | /* A keyboard has been removed from the system */ | ||||||
| extern void SDL_PrivateKeyboardRemoved(SDL_KeyboardID keyboardID); | extern void SDL_RemoveKeyboard(SDL_KeyboardID keyboardID); | ||||||
|  |  | ||||||
| /* Get the default keymap */ | /* Get the default keymap */ | ||||||
| extern void SDL_GetDefaultKeymap(SDL_Keycode *keymap); | extern void SDL_GetDefaultKeymap(SDL_Keycode *keymap); | ||||||
|   | |||||||
| @@ -41,7 +41,7 @@ static SDL_MouseID *SDL_mice; | |||||||
| /* for mapping mouse events to touch */ | /* for mapping mouse events to touch */ | ||||||
| static SDL_bool track_mouse_down = SDL_FALSE; | static SDL_bool track_mouse_down = SDL_FALSE; | ||||||
|  |  | ||||||
| static int SDL_PrivateSendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, int relative, float x, float y); | static int SDL_PrivateSendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, SDL_bool relative, float x, float y); | ||||||
|  |  | ||||||
| static void SDLCALL SDL_MouseDoubleClickTimeChanged(void *userdata, const char *name, const char *oldValue, const char *hint) | static void SDLCALL SDL_MouseDoubleClickTimeChanged(void *userdata, const char *name, const char *oldValue, const char *hint) | ||||||
| { | { | ||||||
| @@ -235,7 +235,7 @@ SDL_bool SDL_IsMouse(Uint16 vendor, Uint16 product) | |||||||
|     return SDL_TRUE; |     return SDL_TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
| void SDL_PrivateMouseAdded(SDL_MouseID mouseID) | void SDL_AddMouse(SDL_MouseID mouseID, SDL_bool send_event) | ||||||
| { | { | ||||||
|     int mouse_index = -1; |     int mouse_index = -1; | ||||||
|  |  | ||||||
| @@ -261,14 +261,16 @@ void SDL_PrivateMouseAdded(SDL_MouseID mouseID) | |||||||
|     SDL_mice = mice; |     SDL_mice = mice; | ||||||
|     ++SDL_mouse_count; |     ++SDL_mouse_count; | ||||||
|  |  | ||||||
|  |     if (send_event) { | ||||||
|         SDL_Event event; |         SDL_Event event; | ||||||
|         SDL_zero(event); |         SDL_zero(event); | ||||||
|         event.type = SDL_EVENT_MOUSE_ADDED; |         event.type = SDL_EVENT_MOUSE_ADDED; | ||||||
|         event.mdevice.which = mouseID; |         event.mdevice.which = mouseID; | ||||||
|         SDL_PushEvent(&event); |         SDL_PushEvent(&event); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void SDL_PrivateMouseRemoved(SDL_MouseID mouseID) | void SDL_RemoveMouse(SDL_MouseID mouseID) | ||||||
| { | { | ||||||
|     int mouse_index = -1; |     int mouse_index = -1; | ||||||
|  |  | ||||||
| @@ -469,7 +471,7 @@ void SDL_SetMouseFocus(SDL_Window *window) | |||||||
|     SDL_SetCursor(NULL); |     SDL_SetCursor(NULL); | ||||||
| } | } | ||||||
|  |  | ||||||
| SDL_bool SDL_MousePositionInWindow(SDL_Window *window, SDL_MouseID mouseID, float x, float y) | SDL_bool SDL_MousePositionInWindow(SDL_Window *window, float x, float y) | ||||||
| { | { | ||||||
|     if (!window) { |     if (!window) { | ||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
| @@ -487,7 +489,7 @@ SDL_bool SDL_MousePositionInWindow(SDL_Window *window, SDL_MouseID mouseID, floa | |||||||
| static SDL_bool SDL_UpdateMouseFocus(SDL_Window *window, float x, float y, Uint32 buttonstate, SDL_bool send_mouse_motion) | static SDL_bool SDL_UpdateMouseFocus(SDL_Window *window, float x, float y, Uint32 buttonstate, SDL_bool send_mouse_motion) | ||||||
| { | { | ||||||
|     SDL_Mouse *mouse = SDL_GetMouse(); |     SDL_Mouse *mouse = SDL_GetMouse(); | ||||||
|     SDL_bool inWindow = SDL_MousePositionInWindow(window, mouse->mouseID, x, y); |     SDL_bool inWindow = SDL_MousePositionInWindow(window, x, y); | ||||||
|  |  | ||||||
|     if (!inWindow) { |     if (!inWindow) { | ||||||
|         if (window == mouse->focus) { |         if (window == mouse->focus) { | ||||||
| @@ -495,7 +497,7 @@ static SDL_bool SDL_UpdateMouseFocus(SDL_Window *window, float x, float y, Uint3 | |||||||
|             SDL_Log("Mouse left window, synthesizing move & focus lost event\n"); |             SDL_Log("Mouse left window, synthesizing move & focus lost event\n"); | ||||||
| #endif | #endif | ||||||
|             if (send_mouse_motion) { |             if (send_mouse_motion) { | ||||||
|                 SDL_PrivateSendMouseMotion(0, window, mouse->mouseID, 0, x, y); |                 SDL_PrivateSendMouseMotion(0, window, 0, SDL_FALSE, x, y); | ||||||
|             } |             } | ||||||
|             SDL_SetMouseFocus(NULL); |             SDL_SetMouseFocus(NULL); | ||||||
|         } |         } | ||||||
| @@ -508,13 +510,13 @@ static SDL_bool SDL_UpdateMouseFocus(SDL_Window *window, float x, float y, Uint3 | |||||||
| #endif | #endif | ||||||
|         SDL_SetMouseFocus(window); |         SDL_SetMouseFocus(window); | ||||||
|         if (send_mouse_motion) { |         if (send_mouse_motion) { | ||||||
|             SDL_PrivateSendMouseMotion(0, window, mouse->mouseID, 0, x, y); |             SDL_PrivateSendMouseMotion(0, window, 0, SDL_FALSE, x, y); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     return SDL_TRUE; |     return SDL_TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
| int SDL_SendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, int relative, float x, float y) | int SDL_SendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, SDL_bool relative, float x, float y) | ||||||
| { | { | ||||||
|     if (window && !relative) { |     if (window && !relative) { | ||||||
|         SDL_Mouse *mouse = SDL_GetMouse(); |         SDL_Mouse *mouse = SDL_GetMouse(); | ||||||
| @@ -672,7 +674,7 @@ static void ConstrainMousePosition(SDL_Mouse *mouse, SDL_Window *window, float * | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static int SDL_PrivateSendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, int relative, float x, float y) | static int SDL_PrivateSendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, SDL_bool relative, float x, float y) | ||||||
| { | { | ||||||
|     SDL_Mouse *mouse = SDL_GetMouse(); |     SDL_Mouse *mouse = SDL_GetMouse(); | ||||||
|     int posted; |     int posted; | ||||||
| @@ -713,7 +715,7 @@ static int SDL_PrivateSendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_ | |||||||
|                 if (mouse->WarpMouse) { |                 if (mouse->WarpMouse) { | ||||||
|                     mouse->WarpMouse(window, center_x, center_y); |                     mouse->WarpMouse(window, center_x, center_y); | ||||||
|                 } else { |                 } else { | ||||||
|                     SDL_PrivateSendMouseMotion(timestamp, window, mouseID, 0, center_x, center_y); |                     SDL_PrivateSendMouseMotion(timestamp, window, mouseID, SDL_FALSE, center_x, center_y); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -1186,7 +1188,7 @@ void SDL_PerformWarpMouseInWindow(SDL_Window *window, float x, float y, SDL_bool | |||||||
|         (!mouse->relative_mode || mouse->relative_mode_warp)) { |         (!mouse->relative_mode || mouse->relative_mode_warp)) { | ||||||
|         mouse->WarpMouse(window, x, y); |         mouse->WarpMouse(window, x, y); | ||||||
|     } else { |     } else { | ||||||
|         SDL_PrivateSendMouseMotion(0, window, mouse->mouseID, 0, x, y); |         SDL_PrivateSendMouseMotion(0, window, 0, SDL_FALSE, x, y); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -75,7 +75,6 @@ typedef struct | |||||||
|     Uint32 (*GetGlobalMouseState)(float *x, float *y); |     Uint32 (*GetGlobalMouseState)(float *x, float *y); | ||||||
|  |  | ||||||
|     /* Data common to all mice */ |     /* Data common to all mice */ | ||||||
|     SDL_MouseID mouseID; |  | ||||||
|     SDL_Window *focus; |     SDL_Window *focus; | ||||||
|     float x; |     float x; | ||||||
|     float y; |     float y; | ||||||
| @@ -132,10 +131,10 @@ extern void SDL_PostInitMouse(void); | |||||||
| extern SDL_bool SDL_IsMouse(Uint16 vendor, Uint16 product); | extern SDL_bool SDL_IsMouse(Uint16 vendor, Uint16 product); | ||||||
|  |  | ||||||
| /* A mouse has been added to the system */ | /* A mouse has been added to the system */ | ||||||
| extern void SDL_PrivateMouseAdded(SDL_MouseID mouseID); | extern void SDL_AddMouse(SDL_MouseID mouseID, SDL_bool send_event); | ||||||
|  |  | ||||||
| /* A mouse has been removed from the system */ | /* A mouse has been removed from the system */ | ||||||
| extern void SDL_PrivateMouseRemoved(SDL_MouseID mouseID); | extern void SDL_RemoveMouse(SDL_MouseID mouseID); | ||||||
|  |  | ||||||
| /* Get the mouse state structure */ | /* Get the mouse state structure */ | ||||||
| extern SDL_Mouse *SDL_GetMouse(void); | extern SDL_Mouse *SDL_GetMouse(void); | ||||||
| @@ -153,7 +152,7 @@ extern int SDL_UpdateMouseCapture(SDL_bool force_release); | |||||||
| extern int SDL_SetMouseSystemScale(int num_values, const float *values); | extern int SDL_SetMouseSystemScale(int num_values, const float *values); | ||||||
|  |  | ||||||
| /* Send a mouse motion event */ | /* Send a mouse motion event */ | ||||||
| extern int SDL_SendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, int relative, float x, float y); | extern int SDL_SendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, SDL_bool relative, float x, float y); | ||||||
|  |  | ||||||
| /* Send a mouse button event */ | /* Send a mouse button event */ | ||||||
| extern int SDL_SendMouseButton(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button); | extern int SDL_SendMouseButton(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button); | ||||||
| @@ -173,7 +172,7 @@ extern void SDL_ResetMouse(void); | |||||||
| #endif /* 0 */ | #endif /* 0 */ | ||||||
|  |  | ||||||
| /* Check if mouse position is within window or captured by window */ | /* Check if mouse position is within window or captured by window */ | ||||||
| extern SDL_bool SDL_MousePositionInWindow(SDL_Window *window, SDL_MouseID mouseID, float x, float y); | extern SDL_bool SDL_MousePositionInWindow(SDL_Window *window, float x, float y); | ||||||
|  |  | ||||||
| /* Shutdown the mouse subsystem */ | /* Shutdown the mouse subsystem */ | ||||||
| extern void SDL_QuitMouse(void); | extern void SDL_QuitMouse(void); | ||||||
|   | |||||||
| @@ -496,7 +496,6 @@ int SDL_SendPenMotion(Uint64 timestamp, | |||||||
|                       SDL_bool window_relative, |                       SDL_bool window_relative, | ||||||
|                       const SDL_PenStatusInfo *status) |                       const SDL_PenStatusInfo *status) | ||||||
| { | { | ||||||
|     const SDL_Mouse *mouse = SDL_GetMouse(); |  | ||||||
|     int i; |     int i; | ||||||
|     SDL_Pen *pen = SDL_GetPenPtr(instance_id); |     SDL_Pen *pen = SDL_GetPenPtr(instance_id); | ||||||
|     SDL_Event event; |     SDL_Event event; | ||||||
| @@ -539,7 +538,7 @@ int SDL_SendPenMotion(Uint64 timestamp, | |||||||
|  |  | ||||||
|     send_mouse_update = (x != last_x) || (y != last_y); |     send_mouse_update = (x != last_x) || (y != last_y); | ||||||
|  |  | ||||||
|     if (!(SDL_MousePositionInWindow(window, mouse->mouseID, x, y))) { |     if (!(SDL_MousePositionInWindow(window, x, y))) { | ||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -557,7 +556,7 @@ int SDL_SendPenMotion(Uint64 timestamp, | |||||||
|     if (send_mouse_update) { |     if (send_mouse_update) { | ||||||
|         switch (pen_mouse_emulation_mode) { |         switch (pen_mouse_emulation_mode) { | ||||||
|         case PEN_MOUSE_EMULATE: |         case PEN_MOUSE_EMULATE: | ||||||
|             return (SDL_SendMouseMotion(0, window, SDL_PEN_MOUSEID, 0, x, y)) || posted; |             return (SDL_SendMouseMotion(0, window, SDL_PEN_MOUSEID, SDL_FALSE, x, y)) || posted; | ||||||
|  |  | ||||||
|         case PEN_MOUSE_STATELESS: |         case PEN_MOUSE_STATELESS: | ||||||
|             /* Report mouse event but don't update mouse state */ |             /* Report mouse event but don't update mouse state */ | ||||||
| @@ -584,7 +583,6 @@ int SDL_SendPenMotion(Uint64 timestamp, | |||||||
|  |  | ||||||
| int SDL_SendPenTipEvent(Uint64 timestamp, SDL_PenID instance_id, Uint8 state) | int SDL_SendPenTipEvent(Uint64 timestamp, SDL_PenID instance_id, Uint8 state) | ||||||
| { | { | ||||||
|     SDL_Mouse *mouse = SDL_GetMouse(); |  | ||||||
|     SDL_Pen *pen = SDL_GetPenPtr(instance_id); |     SDL_Pen *pen = SDL_GetPenPtr(instance_id); | ||||||
|     SDL_Event event; |     SDL_Event event; | ||||||
|     SDL_bool posted = SDL_FALSE; |     SDL_bool posted = SDL_FALSE; | ||||||
| @@ -597,7 +595,7 @@ int SDL_SendPenTipEvent(Uint64 timestamp, SDL_PenID instance_id, Uint8 state) | |||||||
|     } |     } | ||||||
|     window = pen->header.window; |     window = pen->header.window; | ||||||
|  |  | ||||||
|     if ((state == SDL_PRESSED) && !(window && SDL_MousePositionInWindow(window, mouse->mouseID, last->x, last->y))) { |     if ((state == SDL_PRESSED) && !(window && SDL_MousePositionInWindow(window, last->x, last->y))) { | ||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -663,7 +661,6 @@ int SDL_SendPenButton(Uint64 timestamp, | |||||||
|                       SDL_PenID instance_id, |                       SDL_PenID instance_id, | ||||||
|                       Uint8 state, Uint8 button) |                       Uint8 state, Uint8 button) | ||||||
| { | { | ||||||
|     SDL_Mouse *mouse = SDL_GetMouse(); |  | ||||||
|     SDL_Pen *pen = SDL_GetPenPtr(instance_id); |     SDL_Pen *pen = SDL_GetPenPtr(instance_id); | ||||||
|     SDL_Event event; |     SDL_Event event; | ||||||
|     SDL_bool posted = SDL_FALSE; |     SDL_bool posted = SDL_FALSE; | ||||||
| @@ -676,7 +673,7 @@ int SDL_SendPenButton(Uint64 timestamp, | |||||||
|     } |     } | ||||||
|     window = pen->header.window; |     window = pen->header.window; | ||||||
|  |  | ||||||
|     if ((state == SDL_PRESSED) && !(window && SDL_MousePositionInWindow(window, mouse->mouseID, last->x, last->y))) { |     if ((state == SDL_PRESSED) && !(window && SDL_MousePositionInWindow(window, last->x, last->y))) { | ||||||
|         return SDL_FALSE; |         return SDL_FALSE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -279,7 +279,7 @@ int SDL_SendTouch(Uint64 timestamp, SDL_TouchID id, SDL_FingerID fingerid, SDL_W | |||||||
|                             if (pos_y > (float)(window->h - 1)) { |                             if (pos_y > (float)(window->h - 1)) { | ||||||
|                                 pos_y = (float)(window->h - 1); |                                 pos_y = (float)(window->h - 1); | ||||||
|                             } |                             } | ||||||
|                             SDL_SendMouseMotion(timestamp, window, SDL_TOUCH_MOUSEID, 0, pos_x, pos_y); |                             SDL_SendMouseMotion(timestamp, window, SDL_TOUCH_MOUSEID, SDL_FALSE, pos_x, pos_y); | ||||||
|                             SDL_SendMouseButton(timestamp, window, SDL_TOUCH_MOUSEID, SDL_PRESSED, SDL_BUTTON_LEFT); |                             SDL_SendMouseButton(timestamp, window, SDL_TOUCH_MOUSEID, SDL_PRESSED, SDL_BUTTON_LEFT); | ||||||
|                         } |                         } | ||||||
|                     } else { |                     } else { | ||||||
| @@ -403,7 +403,7 @@ int SDL_SendTouchMotion(Uint64 timestamp, SDL_TouchID id, SDL_FingerID fingerid, | |||||||
|                         if (pos_y > (float)(window->h - 1)) { |                         if (pos_y > (float)(window->h - 1)) { | ||||||
|                             pos_y = (float)(window->h - 1); |                             pos_y = (float)(window->h - 1); | ||||||
|                         } |                         } | ||||||
|                         SDL_SendMouseMotion(timestamp, window, SDL_TOUCH_MOUSEID, 0, pos_x, pos_y); |                         SDL_SendMouseMotion(timestamp, window, SDL_TOUCH_MOUSEID, SDL_FALSE, pos_x, pos_y); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -330,12 +330,12 @@ static SDL_Scancode TranslateKeycode(int keycode) | |||||||
|  |  | ||||||
| int Android_OnKeyDown(int keycode) | int Android_OnKeyDown(int keycode) | ||||||
| { | { | ||||||
|     return SDL_SendKeyboardKey(0, 0, SDL_PRESSED, TranslateKeycode(keycode)); |     return SDL_SendKeyboardKey(0, Android_KeyboardID, SDL_PRESSED, TranslateKeycode(keycode)); | ||||||
| } | } | ||||||
|  |  | ||||||
| int Android_OnKeyUp(int keycode) | int Android_OnKeyUp(int keycode) | ||||||
| { | { | ||||||
|     return SDL_SendKeyboardKey(0, 0, SDL_RELEASED, TranslateKeycode(keycode)); |     return SDL_SendKeyboardKey(0, Android_KeyboardID, SDL_RELEASED, TranslateKeycode(keycode)); | ||||||
| } | } | ||||||
|  |  | ||||||
| SDL_bool Android_HasScreenKeyboardSupport(SDL_VideoDevice *_this) | SDL_bool Android_HasScreenKeyboardSupport(SDL_VideoDevice *_this) | ||||||
|   | |||||||
| @@ -221,25 +221,25 @@ void Android_OnMouse(SDL_Window *window, int state, int action, float x, float y | |||||||
|         changes = state & ~last_state; |         changes = state & ~last_state; | ||||||
|         button = TranslateButton(changes); |         button = TranslateButton(changes); | ||||||
|         last_state = state; |         last_state = state; | ||||||
|         SDL_SendMouseMotion(0, window, 0, relative, x, y); |         SDL_SendMouseMotion(0, window, Android_MouseID, relative, x, y); | ||||||
|         SDL_SendMouseButton(0, window, 0, SDL_PRESSED, button); |         SDL_SendMouseButton(0, window, Android_MouseID, SDL_PRESSED, button); | ||||||
|         break; |         break; | ||||||
|  |  | ||||||
|     case ACTION_UP: |     case ACTION_UP: | ||||||
|         changes = last_state & ~state; |         changes = last_state & ~state; | ||||||
|         button = TranslateButton(changes); |         button = TranslateButton(changes); | ||||||
|         last_state = state; |         last_state = state; | ||||||
|         SDL_SendMouseMotion(0, window, 0, relative, x, y); |         SDL_SendMouseMotion(0, window, Android_MouseID, relative, x, y); | ||||||
|         SDL_SendMouseButton(0, window, 0, SDL_RELEASED, button); |         SDL_SendMouseButton(0, window, Android_MouseID, SDL_RELEASED, button); | ||||||
|         break; |         break; | ||||||
|  |  | ||||||
|     case ACTION_MOVE: |     case ACTION_MOVE: | ||||||
|     case ACTION_HOVER_MOVE: |     case ACTION_HOVER_MOVE: | ||||||
|         SDL_SendMouseMotion(0, window, 0, relative, x, y); |         SDL_SendMouseMotion(0, window, Android_MouseID, relative, x, y); | ||||||
|         break; |         break; | ||||||
|  |  | ||||||
|     case ACTION_SCROLL: |     case ACTION_SCROLL: | ||||||
|         SDL_SendMouseWheel(0, window, 0, x, y, SDL_MOUSEWHEEL_NORMAL); |         SDL_SendMouseWheel(0, window, Android_MouseID, x, y, SDL_MOUSEWHEEL_NORMAL); | ||||||
|         break; |         break; | ||||||
|  |  | ||||||
|     default: |     default: | ||||||
|   | |||||||
| @@ -67,6 +67,8 @@ SDL_Semaphore *Android_PauseSem = NULL; | |||||||
| SDL_Semaphore *Android_ResumeSem = NULL; | SDL_Semaphore *Android_ResumeSem = NULL; | ||||||
| SDL_Mutex *Android_ActivityMutex = NULL; | SDL_Mutex *Android_ActivityMutex = NULL; | ||||||
| static SDL_SystemTheme Android_SystemTheme; | static SDL_SystemTheme Android_SystemTheme; | ||||||
|  | SDL_KeyboardID Android_KeyboardID = 0; | ||||||
|  | SDL_MouseID Android_MouseID = 0; | ||||||
|  |  | ||||||
| static int Android_SuspendScreenSaver(SDL_VideoDevice *_this) | static int Android_SuspendScreenSaver(SDL_VideoDevice *_this) | ||||||
| { | { | ||||||
|   | |||||||
| @@ -46,5 +46,7 @@ extern int Android_SurfaceHeight; | |||||||
| extern float Android_ScreenDensity; | extern float Android_ScreenDensity; | ||||||
| extern SDL_Semaphore *Android_PauseSem, *Android_ResumeSem; | extern SDL_Semaphore *Android_PauseSem, *Android_ResumeSem; | ||||||
| extern SDL_Mutex *Android_ActivityMutex; | extern SDL_Mutex *Android_ActivityMutex; | ||||||
|  | extern SDL_KeyboardID Android_KeyboardID; | ||||||
|  | extern SDL_MouseID Android_MouseID; | ||||||
|  |  | ||||||
| #endif /* SDL_androidvideo_h_ */ | #endif /* SDL_androidvideo_h_ */ | ||||||
|   | |||||||
| @@ -200,6 +200,7 @@ static bool IsModifierKeyPressed(unsigned int flags, | |||||||
|  |  | ||||||
| static void HandleModifiers(SDL_VideoDevice *_this, SDL_Scancode code, unsigned int modifierFlags) | static void HandleModifiers(SDL_VideoDevice *_this, SDL_Scancode code, unsigned int modifierFlags) | ||||||
| { | { | ||||||
|  |     SDL_CocoaVideoData *videodata = (__bridge SDL_CocoaVideoData *)_this->driverdata; | ||||||
|     bool pressed = false; |     bool pressed = false; | ||||||
|  |  | ||||||
|     if (code == SDL_SCANCODE_LSHIFT) { |     if (code == SDL_SCANCODE_LSHIFT) { | ||||||
| @@ -231,9 +232,9 @@ static void HandleModifiers(SDL_VideoDevice *_this, SDL_Scancode code, unsigned | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (pressed) { |     if (pressed) { | ||||||
|         SDL_SendKeyboardKey(0, 0, SDL_PRESSED, code); |         SDL_SendKeyboardKey(0, videodata.keyboardID, SDL_PRESSED, code); | ||||||
|     } else { |     } else { | ||||||
|         SDL_SendKeyboardKey(0, 0, SDL_RELEASED, code); |         SDL_SendKeyboardKey(0, videodata.keyboardID, SDL_RELEASED, code); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -414,7 +415,7 @@ void Cocoa_HandleKeyEvent(SDL_VideoDevice *_this, NSEvent *event) | |||||||
|             UpdateKeymap(data, SDL_TRUE); |             UpdateKeymap(data, SDL_TRUE); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         SDL_SendKeyboardKey(Cocoa_GetEventTimestamp([event timestamp]), 0, SDL_PRESSED, code); |         SDL_SendKeyboardKey(Cocoa_GetEventTimestamp([event timestamp]), data ? data.keyboardID : 0, SDL_PRESSED, code); | ||||||
| #ifdef DEBUG_SCANCODES | #ifdef DEBUG_SCANCODES | ||||||
|         if (code == SDL_SCANCODE_UNKNOWN) { |         if (code == SDL_SCANCODE_UNKNOWN) { | ||||||
|             SDL_Log("The key you just pressed is not recognized by SDL. To help get this fixed, report this to the SDL forums/mailing list <https://discourse.libsdl.org/> or to Christian Walther <cwalther@gmx.ch>. Mac virtual key code is %d.\n", scancode); |             SDL_Log("The key you just pressed is not recognized by SDL. To help get this fixed, report this to the SDL forums/mailing list <https://discourse.libsdl.org/> or to Christian Walther <cwalther@gmx.ch>. Mac virtual key code is %d.\n", scancode); | ||||||
| @@ -433,7 +434,7 @@ void Cocoa_HandleKeyEvent(SDL_VideoDevice *_this, NSEvent *event) | |||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
|     case NSEventTypeKeyUp: |     case NSEventTypeKeyUp: | ||||||
|         SDL_SendKeyboardKey(Cocoa_GetEventTimestamp([event timestamp]), 0, SDL_RELEASED, code); |         SDL_SendKeyboardKey(Cocoa_GetEventTimestamp([event timestamp]), data ? data.keyboardID : 0, SDL_RELEASED, code); | ||||||
|         break; |         break; | ||||||
|     case NSEventTypeFlagsChanged: { |     case NSEventTypeFlagsChanged: { | ||||||
|         // see if the new modifierFlags mean any existing keys should be pressed/released... |         // see if the new modifierFlags mean any existing keys should be pressed/released... | ||||||
|   | |||||||
| @@ -302,7 +302,7 @@ static int Cocoa_WarpMouseGlobal(float x, float y) | |||||||
|         SDL_SetMouseFocus(win); |         SDL_SetMouseFocus(win); | ||||||
|         if (win) { |         if (win) { | ||||||
|             SDL_assert(win == mouse->focus); |             SDL_assert(win == mouse->focus); | ||||||
|             SDL_SendMouseMotion(0, win, mouse->mouseID, 0, x - win->x, y - win->y); |             SDL_SendMouseMotion(0, win, 0, SDL_FALSE, x - win->x, y - win->y); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -450,9 +450,10 @@ static void Cocoa_HandleTitleButtonEvent(SDL_VideoDevice *_this, NSEvent *event) | |||||||
|  |  | ||||||
| void Cocoa_HandleMouseEvent(SDL_VideoDevice *_this, NSEvent *event) | void Cocoa_HandleMouseEvent(SDL_VideoDevice *_this, NSEvent *event) | ||||||
| { | { | ||||||
|  |     SDL_CocoaVideoData *videodata = (__bridge SDL_CocoaVideoData *)_this->driverdata; | ||||||
|  |     SDL_MouseID mouseID = videodata.mouseID; | ||||||
|     SDL_Mouse *mouse; |     SDL_Mouse *mouse; | ||||||
|     SDL_MouseData *driverdata; |     SDL_MouseData *driverdata; | ||||||
|     SDL_MouseID mouseID; |  | ||||||
|     NSPoint location; |     NSPoint location; | ||||||
|     CGFloat lastMoveX, lastMoveY; |     CGFloat lastMoveX, lastMoveY; | ||||||
|     float deltaX, deltaY; |     float deltaX, deltaY; | ||||||
| @@ -490,7 +491,6 @@ void Cocoa_HandleMouseEvent(SDL_VideoDevice *_this, NSEvent *event) | |||||||
|         return; /* can happen when returning from fullscreen Space on shutdown */ |         return; /* can happen when returning from fullscreen Space on shutdown */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     mouseID = mouse ? mouse->mouseID : 0; |  | ||||||
|     seenWarp = driverdata->seenWarp; |     seenWarp = driverdata->seenWarp; | ||||||
|     driverdata->seenWarp = NO; |     driverdata->seenWarp = NO; | ||||||
|  |  | ||||||
| @@ -524,20 +524,16 @@ void Cocoa_HandleMouseEvent(SDL_VideoDevice *_this, NSEvent *event) | |||||||
|         DLog("Motion was (%g, %g), offset to (%g, %g)", [event deltaX], [event deltaY], deltaX, deltaY); |         DLog("Motion was (%g, %g), offset to (%g, %g)", [event deltaX], [event deltaY], deltaX, deltaY); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_SendMouseMotion(Cocoa_GetEventTimestamp([event timestamp]), mouse->focus, mouseID, 1, deltaX, deltaY); |     SDL_SendMouseMotion(Cocoa_GetEventTimestamp([event timestamp]), mouse->focus, mouseID, SDL_TRUE, deltaX, deltaY); | ||||||
| } | } | ||||||
|  |  | ||||||
| void Cocoa_HandleMouseWheel(SDL_Window *window, NSEvent *event) | void Cocoa_HandleMouseWheel(SDL_Window *window, NSEvent *event) | ||||||
| { | { | ||||||
|     SDL_MouseID mouseID; |     SDL_CocoaVideoData *videodata = ((__bridge SDL_CocoaWindowData *)window->driverdata).videodata; | ||||||
|  |     SDL_MouseID mouseID = videodata.mouseID; | ||||||
|     SDL_MouseWheelDirection direction; |     SDL_MouseWheelDirection direction; | ||||||
|     CGFloat x, y; |     CGFloat x, y; | ||||||
|     SDL_Mouse *mouse = SDL_GetMouse(); |  | ||||||
|     if (!mouse) { |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     mouseID = mouse->mouseID; |  | ||||||
|     x = -[event deltaX]; |     x = -[event deltaX]; | ||||||
|     y = [event deltaY]; |     y = [event deltaY]; | ||||||
|     direction = SDL_MOUSEWHEEL_NORMAL; |     direction = SDL_MOUSEWHEEL_NORMAL; | ||||||
|   | |||||||
| @@ -101,6 +101,8 @@ DECLARE_ALERT_STYLE(Critical); | |||||||
| @property(nonatomic) int trackpad_is_touch_only; | @property(nonatomic) int trackpad_is_touch_only; | ||||||
| @property(nonatomic) unsigned int modifierFlags; | @property(nonatomic) unsigned int modifierFlags; | ||||||
| @property(nonatomic) void *key_layout; | @property(nonatomic) void *key_layout; | ||||||
|  | @property(nonatomic) SDL_KeyboardID keyboardID; | ||||||
|  | @property(nonatomic) SDL_MouseID mouseID; | ||||||
| @property(nonatomic) SDLTranslatorResponder *fieldEdit; | @property(nonatomic) SDLTranslatorResponder *fieldEdit; | ||||||
| @property(nonatomic) NSInteger clipboard_count; | @property(nonatomic) NSInteger clipboard_count; | ||||||
| @property(nonatomic) IOPMAssertionID screensaver_assertion; | @property(nonatomic) IOPMAssertionID screensaver_assertion; | ||||||
|   | |||||||
| @@ -33,6 +33,9 @@ | |||||||
| #include "SDL_cocoamessagebox.h" | #include "SDL_cocoamessagebox.h" | ||||||
| #include "SDL_cocoashape.h" | #include "SDL_cocoashape.h" | ||||||
|  |  | ||||||
|  | #include "../../events/SDL_keyboard_c.h" | ||||||
|  | #include "../../events/SDL_mouse_c.h" | ||||||
|  |  | ||||||
| @implementation SDL_CocoaVideoData | @implementation SDL_CocoaVideoData | ||||||
|  |  | ||||||
| @end | @end | ||||||
| @@ -198,6 +201,13 @@ int Cocoa_VideoInit(SDL_VideoDevice *_this) | |||||||
|             return -1; |             return -1; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         // Assume we have a mouse and keyboard | ||||||
|  |         // We could use GCMouse and GCKeyboard if we needed to, as is done in SDL_uikitevents.m | ||||||
|  |         data.keyboardID = SDL_GetNextObjectID(); | ||||||
|  |         SDL_AddKeyboard(data.keyboardID, SDL_FALSE); | ||||||
|  |         data.mouseID = SDL_GetNextObjectID(); | ||||||
|  |         SDL_AddMouse(data.mouseID, SDL_FALSE); | ||||||
|  |  | ||||||
|         data.allow_spaces = SDL_GetHintBoolean(SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES, SDL_TRUE); |         data.allow_spaces = SDL_GetHintBoolean(SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES, SDL_TRUE); | ||||||
|         data.trackpad_is_touch_only = SDL_GetHintBoolean(SDL_HINT_TRACKPAD_IS_TOUCH_ONLY, SDL_FALSE); |         data.trackpad_is_touch_only = SDL_GetHintBoolean(SDL_HINT_TRACKPAD_IS_TOUCH_ONLY, SDL_FALSE); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -191,7 +191,6 @@ | |||||||
|         NSData *data; |         NSData *data; | ||||||
|         NSArray *array; |         NSArray *array; | ||||||
|         NSPoint point; |         NSPoint point; | ||||||
|         SDL_Mouse *mouse; |  | ||||||
|         float x, y; |         float x, y; | ||||||
|  |  | ||||||
|         if (desiredType == nil) { |         if (desiredType == nil) { | ||||||
| @@ -208,11 +207,10 @@ | |||||||
|  |  | ||||||
|         /* Code addon to update the mouse location */ |         /* Code addon to update the mouse location */ | ||||||
|         point = [sender draggingLocation]; |         point = [sender draggingLocation]; | ||||||
|         mouse = SDL_GetMouse(); |  | ||||||
|         x = point.x; |         x = point.x; | ||||||
|         y = (sdlwindow->h - point.y); |         y = (sdlwindow->h - point.y); | ||||||
|         if (x >= 0.0f && x < (float)sdlwindow->w && y >= 0.0f && y < (float)sdlwindow->h) { |         if (x >= 0.0f && x < (float)sdlwindow->w && y >= 0.0f && y < (float)sdlwindow->h) { | ||||||
|             SDL_SendMouseMotion(0, sdlwindow, mouse->mouseID, 0, x, y); |             SDL_SendMouseMotion(0, sdlwindow, 0, SDL_FALSE, x, y); | ||||||
|         } |         } | ||||||
|         /* Code addon to update the mouse location */ |         /* Code addon to update the mouse location */ | ||||||
|  |  | ||||||
| @@ -1091,7 +1089,7 @@ static SDL_bool Cocoa_IsZoomed(SDL_Window *window) | |||||||
|         y = (window->h - point.y); |         y = (window->h - point.y); | ||||||
|  |  | ||||||
|         if (x >= 0.0f && x < (float)window->w && y >= 0.0f && y < (float)window->h) { |         if (x >= 0.0f && x < (float)window->w && y >= 0.0f && y < (float)window->h) { | ||||||
|             SDL_SendMouseMotion(0, window, mouse->mouseID, 0, x, y); |             SDL_SendMouseMotion(0, window, 0, SDL_FALSE, x, y); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1378,11 +1376,13 @@ static SDL_bool Cocoa_IsZoomed(SDL_Window *window) | |||||||
|  |  | ||||||
|     /* Also note that SDL_SendKeyboardKey expects all capslock events to be |     /* Also note that SDL_SendKeyboardKey expects all capslock events to be | ||||||
|        keypresses; it won't toggle the mod state if you send a keyrelease.  */ |        keypresses; it won't toggle the mod state if you send a keyrelease.  */ | ||||||
|  |     SDL_VideoDevice *_this = SDL_GetVideoDevice(); | ||||||
|  |     SDL_CocoaVideoData *videodata = (__bridge SDL_CocoaVideoData *)_this->driverdata; | ||||||
|     const SDL_bool osenabled = ([theEvent modifierFlags] & NSEventModifierFlagCapsLock) ? SDL_TRUE : SDL_FALSE; |     const SDL_bool osenabled = ([theEvent modifierFlags] & NSEventModifierFlagCapsLock) ? SDL_TRUE : SDL_FALSE; | ||||||
|     const SDL_bool sdlenabled = (SDL_GetModState() & SDL_KMOD_CAPS) ? SDL_TRUE : SDL_FALSE; |     const SDL_bool sdlenabled = (SDL_GetModState() & SDL_KMOD_CAPS) ? SDL_TRUE : SDL_FALSE; | ||||||
|     if (osenabled ^ sdlenabled) { |     if (osenabled ^ sdlenabled) { | ||||||
|         SDL_SendKeyboardKey(0, 0, SDL_PRESSED, SDL_SCANCODE_CAPSLOCK); |         SDL_SendKeyboardKey(0, videodata.keyboardID, SDL_PRESSED, SDL_SCANCODE_CAPSLOCK); | ||||||
|         SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_CAPSLOCK); |         SDL_SendKeyboardKey(0, videodata.keyboardID, SDL_RELEASED, SDL_SCANCODE_CAPSLOCK); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| - (void)keyDown:(NSEvent *)theEvent | - (void)keyDown:(NSEvent *)theEvent | ||||||
| @@ -1457,7 +1457,9 @@ static SDL_bool Cocoa_IsZoomed(SDL_Window *window) | |||||||
|  |  | ||||||
| static int Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL_Window *window, const Uint8 state, const Uint8 button) | static int Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL_Window *window, const Uint8 state, const Uint8 button) | ||||||
| { | { | ||||||
|     const SDL_MouseID mouseID = mouse->mouseID; |     SDL_VideoDevice *_this = SDL_GetVideoDevice(); | ||||||
|  |     SDL_CocoaVideoData *videodata = (__bridge SDL_CocoaVideoData *)_this->driverdata; | ||||||
|  |     SDL_MouseID mouseID = videodata.mouseID; | ||||||
|     const int clicks = (int)[theEvent clickCount]; |     const int clicks = (int)[theEvent clickCount]; | ||||||
|     SDL_Window *focus = SDL_GetKeyboardFocus(); |     SDL_Window *focus = SDL_GetKeyboardFocus(); | ||||||
|     int rc; |     int rc; | ||||||
| @@ -1589,8 +1591,10 @@ static int Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL_ | |||||||
|  |  | ||||||
| - (void)mouseMoved:(NSEvent *)theEvent | - (void)mouseMoved:(NSEvent *)theEvent | ||||||
| { | { | ||||||
|  |     SDL_VideoDevice *_this = SDL_GetVideoDevice(); | ||||||
|  |     SDL_CocoaVideoData *videodata = (__bridge SDL_CocoaVideoData *)_this->driverdata; | ||||||
|  |     SDL_MouseID mouseID = videodata.mouseID; | ||||||
|     SDL_Mouse *mouse = SDL_GetMouse(); |     SDL_Mouse *mouse = SDL_GetMouse(); | ||||||
|     SDL_MouseID mouseID; |  | ||||||
|     NSPoint point; |     NSPoint point; | ||||||
|     float x, y; |     float x, y; | ||||||
|     SDL_Window *window; |     SDL_Window *window; | ||||||
| @@ -1599,7 +1603,6 @@ static int Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL_ | |||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     mouseID = mouse->mouseID; |  | ||||||
|     window = _data.window; |     window = _data.window; | ||||||
|  |  | ||||||
|     if (window->flags & SDL_WINDOW_TRANSPARENT) { |     if (window->flags & SDL_WINDOW_TRANSPARENT) { | ||||||
| @@ -1631,7 +1634,7 @@ static int Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL_ | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_SendMouseMotion(Cocoa_GetEventTimestamp([theEvent timestamp]), window, mouseID, 0, x, y); |     SDL_SendMouseMotion(Cocoa_GetEventTimestamp([theEvent timestamp]), window, mouseID, SDL_FALSE, x, y); | ||||||
| } | } | ||||||
|  |  | ||||||
| - (void)mouseDragged:(NSEvent *)theEvent | - (void)mouseDragged:(NSEvent *)theEvent | ||||||
|   | |||||||
| @@ -614,7 +614,7 @@ static EM_BOOL Emscripten_HandlePointerLockChange(int eventType, const Emscripte | |||||||
| static EM_BOOL Emscripten_HandleMouseMove(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) | static EM_BOOL Emscripten_HandleMouseMove(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) | ||||||
| { | { | ||||||
|     SDL_WindowData *window_data = userData; |     SDL_WindowData *window_data = userData; | ||||||
|     const int isPointerLocked = window_data->has_pointer_lock; |     const SDL_bool isPointerLocked = window_data->has_pointer_lock; | ||||||
|     float mx, my; |     float mx, my; | ||||||
|  |  | ||||||
|     /* rescale (in case canvas is being scaled)*/ |     /* rescale (in case canvas is being scaled)*/ | ||||||
| @@ -631,7 +631,7 @@ static EM_BOOL Emscripten_HandleMouseMove(int eventType, const EmscriptenMouseEv | |||||||
|         my = (float)(mouseEvent->targetY * yscale); |         my = (float)(mouseEvent->targetY * yscale); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_SendMouseMotion(0, window_data->window, 0, isPointerLocked, mx, my); |     SDL_SendMouseMotion(0, window_data->window, EMSCRIPTEN_MOUSE_ID, isPointerLocked, mx, my); | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -669,7 +669,7 @@ static EM_BOOL Emscripten_HandleMouseButton(int eventType, const EmscriptenMouse | |||||||
|         sdl_event_type = SDL_EVENT_MOUSE_BUTTON_UP; |         sdl_event_type = SDL_EVENT_MOUSE_BUTTON_UP; | ||||||
|         prevent_default = SDL_EventEnabled(sdl_event_type); |         prevent_default = SDL_EventEnabled(sdl_event_type); | ||||||
|     } |     } | ||||||
|     SDL_SendMouseButton(0, window_data->window, 0, sdl_button_state, sdl_button); |     SDL_SendMouseButton(0, window_data->window, EMSCRIPTEN_MOUSE_ID, sdl_button_state, sdl_button); | ||||||
|  |  | ||||||
|     /* Do not consume the event if the mouse is outside of the canvas. */ |     /* Do not consume the event if the mouse is outside of the canvas. */ | ||||||
|     emscripten_get_element_css_size(window_data->canvas_id, &css_w, &css_h); |     emscripten_get_element_css_size(window_data->canvas_id, &css_w, &css_h); | ||||||
| @@ -685,7 +685,7 @@ static EM_BOOL Emscripten_HandleMouseFocus(int eventType, const EmscriptenMouseE | |||||||
| { | { | ||||||
|     SDL_WindowData *window_data = userData; |     SDL_WindowData *window_data = userData; | ||||||
|  |  | ||||||
|     const int isPointerLocked = window_data->has_pointer_lock; |     const SDL_bool isPointerLocked = window_data->has_pointer_lock; | ||||||
|  |  | ||||||
|     if (!isPointerLocked) { |     if (!isPointerLocked) { | ||||||
|         /* rescale (in case canvas is being scaled)*/ |         /* rescale (in case canvas is being scaled)*/ | ||||||
| @@ -695,7 +695,7 @@ static EM_BOOL Emscripten_HandleMouseFocus(int eventType, const EmscriptenMouseE | |||||||
|  |  | ||||||
|         mx = (float)(mouseEvent->targetX * (window_data->window->w / client_w)); |         mx = (float)(mouseEvent->targetX * (window_data->window->w / client_w)); | ||||||
|         my = (float)(mouseEvent->targetY * (window_data->window->h / client_h)); |         my = (float)(mouseEvent->targetY * (window_data->window->h / client_h)); | ||||||
|         SDL_SendMouseMotion(0, window_data->window, 0, isPointerLocked, mx, my); |         SDL_SendMouseMotion(0, window_data->window, EMSCRIPTEN_MOUSE_ID, isPointerLocked, mx, my); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_SetMouseFocus(eventType == EMSCRIPTEN_EVENT_MOUSEENTER ? window_data->window : NULL); |     SDL_SetMouseFocus(eventType == EMSCRIPTEN_EVENT_MOUSEENTER ? window_data->window : NULL); | ||||||
| @@ -720,7 +720,7 @@ static EM_BOOL Emscripten_HandleWheel(int eventType, const EmscriptenWheelEvent | |||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     SDL_SendMouseWheel(0, window_data->window, 0, (float)wheelEvent->deltaX, -deltaY, SDL_MOUSEWHEEL_NORMAL); |     SDL_SendMouseWheel(0, window_data->window, EMSCRIPTEN_MOUSE_ID, (float)wheelEvent->deltaX, -deltaY, SDL_MOUSEWHEEL_NORMAL); | ||||||
|     return SDL_EventEnabled(SDL_EVENT_MOUSE_WHEEL); |     return SDL_EventEnabled(SDL_EVENT_MOUSE_WHEEL); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -811,7 +811,7 @@ static EM_BOOL Emscripten_HandleKey(int eventType, const EmscriptenKeyboardEvent | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (scancode != SDL_SCANCODE_UNKNOWN) { |     if (scancode != SDL_SCANCODE_UNKNOWN) { | ||||||
|         SDL_SendKeyboardKeyAndKeycode(0, 0, eventType == EMSCRIPTEN_EVENT_KEYDOWN ? SDL_PRESSED : SDL_RELEASED, scancode, keycode); |         SDL_SendKeyboardKeyAndKeycode(0, EMSCRIPTEN_KEYBOARD_ID, eventType == EMSCRIPTEN_EVENT_KEYDOWN ? SDL_PRESSED : SDL_RELEASED, scancode, keycode); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* if TEXTINPUT events are enabled we can't prevent keydown or we won't get keypress |     /* if TEXTINPUT events are enabled we can't prevent keydown or we won't get keypress | ||||||
|   | |||||||
| @@ -136,6 +136,10 @@ int Emscripten_VideoInit(SDL_VideoDevice *_this) | |||||||
|  |  | ||||||
|     Emscripten_InitMouse(); |     Emscripten_InitMouse(); | ||||||
|  |  | ||||||
|  |     /* Assume we have a mouse and keyboard */ | ||||||
|  |     SDL_AddKeyboard(EMSCRIPTEN_KEYBOARD_ID, SDL_FALSE); | ||||||
|  |     SDL_AddMouse(EMSCRIPTEN_MOUSE_ID, SDL_FALSE); | ||||||
|  |  | ||||||
|     /* We're done! */ |     /* We're done! */ | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -28,6 +28,9 @@ | |||||||
| #include <emscripten/emscripten.h> | #include <emscripten/emscripten.h> | ||||||
| #include <emscripten/html5.h> | #include <emscripten/html5.h> | ||||||
|  |  | ||||||
|  | #define EMSCRIPTEN_KEYBOARD_ID    1 | ||||||
|  | #define EMSCRIPTEN_MOUSE_ID       1 | ||||||
|  |  | ||||||
| struct SDL_WindowData | struct SDL_WindowData | ||||||
| { | { | ||||||
|     SDL_Window *window; |     SDL_Window *window; | ||||||
|   | |||||||
| @@ -1,425 +0,0 @@ | |||||||
| /* |  | ||||||
|   Simple DirectMedia Layer |  | ||||||
|   Copyright (C) 1997-2024 Sam Lantinga <slouken@libsdl.org> |  | ||||||
|  |  | ||||||
|   This software is provided 'as-is', without any express or implied |  | ||||||
|   warranty.  In no event will the authors be held liable for any damages |  | ||||||
|   arising from the use of this software. |  | ||||||
|  |  | ||||||
|   Permission is granted to anyone to use this software for any purpose, |  | ||||||
|   including commercial applications, and to alter it and redistribute it |  | ||||||
|   freely, subject to the following restrictions: |  | ||||||
|  |  | ||||||
|   1. The origin of this software must not be misrepresented; you must not |  | ||||||
|      claim that you wrote the original software. If you use this software |  | ||||||
|      in a product, an acknowledgment in the product documentation would be |  | ||||||
|      appreciated but is not required. |  | ||||||
|   2. Altered source versions must be plainly marked as such, and must not be |  | ||||||
|      misrepresented as being the original software. |  | ||||||
|   3. This notice may not be removed or altered from any source distribution. |  | ||||||
| */ |  | ||||||
| #ifndef SDL_BAPP_H |  | ||||||
| #define SDL_BAPP_H |  | ||||||
|  |  | ||||||
| #include <Path.h> |  | ||||||
| #include <InterfaceKit.h> |  | ||||||
| #include <LocaleRoster.h> |  | ||||||
| #ifdef SDL_VIDEO_OPENGL |  | ||||||
| #include <OpenGLKit.h> |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #include "../../video/haiku/SDL_bkeyboard.h" |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| extern "C" { |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #include "SDL_internal.h" |  | ||||||
|  |  | ||||||
| /* Local includes */ |  | ||||||
| #include "../../events/SDL_events_c.h" |  | ||||||
| #include "../../video/haiku/SDL_bframebuffer.h" |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #include <vector> |  | ||||||
|  |  | ||||||
| /* Forward declarations */ |  | ||||||
| class SDL_BLooper; |  | ||||||
| class SDL_BWin; |  | ||||||
|  |  | ||||||
| /* Message constants */ |  | ||||||
| enum ToSDL |  | ||||||
| { |  | ||||||
|     /* Intercepted by BWindow on its way to BView */ |  | ||||||
|     BAPP_MOUSE_MOVED, |  | ||||||
|     BAPP_MOUSE_BUTTON, |  | ||||||
|     BAPP_MOUSE_WHEEL, |  | ||||||
|     BAPP_KEY, |  | ||||||
|     BAPP_REPAINT, /* from _UPDATE_ */ |  | ||||||
|     /* From BWindow */ |  | ||||||
|     BAPP_MAXIMIZE, /* from B_ZOOM */ |  | ||||||
|     BAPP_MINIMIZE, |  | ||||||
|     BAPP_RESTORE, /* TODO: IMPLEMENT! */ |  | ||||||
|     BAPP_SHOW, |  | ||||||
|     BAPP_HIDE, |  | ||||||
|     BAPP_MOUSE_FOCUS,    /* caused by MOUSE_MOVE */ |  | ||||||
|     BAPP_KEYBOARD_FOCUS, /* from WINDOW_ACTIVATED */ |  | ||||||
|     BAPP_WINDOW_CLOSE_REQUESTED, |  | ||||||
|     BAPP_WINDOW_MOVED, |  | ||||||
|     BAPP_WINDOW_RESIZED, |  | ||||||
|     BAPP_SCREEN_CHANGED |  | ||||||
| }; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| extern "C" SDL_BLooper *SDL_Looper; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* Create a descendant of BLooper */ |  | ||||||
| class SDL_BLooper : public BLooper |  | ||||||
| { |  | ||||||
|   public: |  | ||||||
|     SDL_BLooper(const char* name) : BLooper(name) |  | ||||||
|     { |  | ||||||
| #ifdef SDL_VIDEO_OPENGL |  | ||||||
|         _current_context = NULL; |  | ||||||
| #endif |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     virtual ~SDL_BLooper() |  | ||||||
|     { |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /* Event-handling functions */ |  | ||||||
|     virtual void MessageReceived(BMessage *message) |  | ||||||
|     { |  | ||||||
|         /* Sort out SDL-related messages */ |  | ||||||
|         switch (message->what) { |  | ||||||
|         case BAPP_MOUSE_MOVED: |  | ||||||
|             _HandleMouseMove(message); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case BAPP_MOUSE_BUTTON: |  | ||||||
|             _HandleMouseButton(message); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case BAPP_MOUSE_WHEEL: |  | ||||||
|             _HandleMouseWheel(message); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case BAPP_KEY: |  | ||||||
|             _HandleKey(message); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case BAPP_REPAINT: |  | ||||||
|             _HandleBasicWindowEvent(message, SDL_EVENT_WINDOW_EXPOSED); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case BAPP_MAXIMIZE: |  | ||||||
|             _HandleBasicWindowEvent(message, SDL_EVENT_WINDOW_MAXIMIZED); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case BAPP_MINIMIZE: |  | ||||||
|             _HandleBasicWindowEvent(message, SDL_EVENT_WINDOW_MINIMIZED); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case BAPP_SHOW: |  | ||||||
|             _HandleBasicWindowEvent(message, SDL_EVENT_WINDOW_SHOWN); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case BAPP_HIDE: |  | ||||||
|             _HandleBasicWindowEvent(message, SDL_EVENT_WINDOW_HIDDEN); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case BAPP_MOUSE_FOCUS: |  | ||||||
|             _HandleMouseFocus(message); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case BAPP_KEYBOARD_FOCUS: |  | ||||||
|             _HandleKeyboardFocus(message); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case BAPP_WINDOW_CLOSE_REQUESTED: |  | ||||||
|             _HandleBasicWindowEvent(message, SDL_EVENT_WINDOW_CLOSE_REQUESTED); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case BAPP_WINDOW_MOVED: |  | ||||||
|             _HandleWindowMoved(message); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case BAPP_WINDOW_RESIZED: |  | ||||||
|             _HandleWindowResized(message); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case B_LOCALE_CHANGED: |  | ||||||
|             SDL_SendLocaleChangedEvent(); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case BAPP_SCREEN_CHANGED: |  | ||||||
|             /* TODO: Handle screen resize or workspace change */ |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         default: |  | ||||||
|             BLooper::MessageReceived(message); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /* Window creation/destruction methods */ |  | ||||||
|     int32 GetID(SDL_Window *win) |  | ||||||
|     { |  | ||||||
|         int32 i; |  | ||||||
|         for (i = 0; i < _GetNumWindowSlots(); ++i) { |  | ||||||
|             if (GetSDLWindow(i) == NULL) { |  | ||||||
|                 _SetSDLWindow(win, i); |  | ||||||
|                 return i; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         /* Expand the vector if all slots are full */ |  | ||||||
|         if (i == _GetNumWindowSlots()) { |  | ||||||
|             _PushBackWindow(win); |  | ||||||
|             return i; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         /* TODO: error handling */ |  | ||||||
|         return 0; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /* FIXME: Bad coding practice, but I can't include SDL_BWin.h here.  Is |  | ||||||
|        there another way to do this? */ |  | ||||||
|     void ClearID(SDL_BWin *bwin); /* Defined in SDL_BeApp.cc */ |  | ||||||
|  |  | ||||||
|     SDL_Window *GetSDLWindow(int32 winID) |  | ||||||
|     { |  | ||||||
|         return _window_map[winID]; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| #ifdef SDL_VIDEO_OPENGL |  | ||||||
|     BGLView *GetCurrentContext() |  | ||||||
|     { |  | ||||||
|         return _current_context; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void SetCurrentContext(BGLView *newContext) |  | ||||||
|     { |  | ||||||
|         if (_current_context) |  | ||||||
|             _current_context->UnlockGL(); |  | ||||||
|         _current_context = newContext; |  | ||||||
|         if (_current_context) |  | ||||||
|             _current_context->LockGL(); |  | ||||||
|     } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|   private: |  | ||||||
|     /* Event management */ |  | ||||||
|     void _HandleBasicWindowEvent(BMessage *msg, SDL_EventType sdlEventType) |  | ||||||
|     { |  | ||||||
|         SDL_Window *win; |  | ||||||
|         int32 winID; |  | ||||||
|         if ( |  | ||||||
|             !_GetWinID(msg, &winID)) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         win = GetSDLWindow(winID); |  | ||||||
|         SDL_SendWindowEvent(win, sdlEventType, 0, 0); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void _HandleMouseMove(BMessage *msg) |  | ||||||
|     { |  | ||||||
|         SDL_Window *win; |  | ||||||
|         int32 winID; |  | ||||||
|         int32 x = 0, y = 0; |  | ||||||
|         if ( |  | ||||||
|             !_GetWinID(msg, &winID) || |  | ||||||
|             msg->FindInt32("x", &x) != B_OK || /* x movement */ |  | ||||||
|             msg->FindInt32("y", &y) != B_OK    /* y movement */ |  | ||||||
|         ) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         win = GetSDLWindow(winID); |  | ||||||
|  |  | ||||||
|         // Simple relative mode support for mouse. |  | ||||||
|         if (SDL_GetMouse()->relative_mode) { |  | ||||||
|             int winWidth, winHeight, winPosX, winPosY; |  | ||||||
|             SDL_GetWindowSize(win, &winWidth, &winHeight); |  | ||||||
|             SDL_GetWindowPosition(win, &winPosX, &winPosY); |  | ||||||
|             int dx = x - (winWidth / 2); |  | ||||||
|             int dy = y - (winHeight / 2); |  | ||||||
|             SDL_SendMouseMotion(0, win, 0, SDL_GetMouse()->relative_mode, (float)dx, (float)dy); |  | ||||||
|             set_mouse_position((winPosX + winWidth / 2), (winPosY + winHeight / 2)); |  | ||||||
|             if (!be_app->IsCursorHidden()) |  | ||||||
|                 be_app->HideCursor(); |  | ||||||
|         } else { |  | ||||||
|             SDL_SendMouseMotion(0, win, 0, 0, (float)x, (float)y); |  | ||||||
|             if (SDL_CursorVisible() && be_app->IsCursorHidden()) |  | ||||||
|                 be_app->ShowCursor(); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void _HandleMouseButton(BMessage *msg) |  | ||||||
|     { |  | ||||||
|         SDL_Window *win; |  | ||||||
|         int32 winID; |  | ||||||
|         int32 button, state; /* left/middle/right, pressed/released */ |  | ||||||
|         if ( |  | ||||||
|             !_GetWinID(msg, &winID) || |  | ||||||
|             msg->FindInt32("button-id", &button) != B_OK || |  | ||||||
|             msg->FindInt32("button-state", &state) != B_OK) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         win = GetSDLWindow(winID); |  | ||||||
|         SDL_SendMouseButton(0, win, 0, state, button); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void _HandleMouseWheel(BMessage *msg) |  | ||||||
|     { |  | ||||||
|         SDL_Window *win; |  | ||||||
|         int32 winID; |  | ||||||
|         int32 xTicks, yTicks; |  | ||||||
|         if ( |  | ||||||
|             !_GetWinID(msg, &winID) || |  | ||||||
|             msg->FindInt32("xticks", &xTicks) != B_OK || |  | ||||||
|             msg->FindInt32("yticks", &yTicks) != B_OK) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         win = GetSDLWindow(winID); |  | ||||||
|         SDL_SendMouseWheel(0, win, 0, xTicks, -yTicks, SDL_MOUSEWHEEL_NORMAL); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void _HandleKey(BMessage *msg) |  | ||||||
|     { |  | ||||||
|         int32 scancode, state; /* scancode, pressed/released */ |  | ||||||
|         if ( |  | ||||||
|             msg->FindInt32("key-state", &state) != B_OK || |  | ||||||
|             msg->FindInt32("key-scancode", &scancode) != B_OK) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         /* Make sure this isn't a repeated event (key pressed and held) */ |  | ||||||
|         if (state == SDL_PRESSED && HAIKU_GetKeyState(scancode) == SDL_PRESSED) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         HAIKU_SetKeyState(scancode, state); |  | ||||||
|         SDL_SendKeyboardKey(0, 0, state, HAIKU_GetScancodeFromBeKey(scancode)); |  | ||||||
|  |  | ||||||
|         if (state == SDL_PRESSED && SDL_EventEnabled(SDL_EVENT_TEXT_INPUT)) { |  | ||||||
|             const int8 *keyUtf8; |  | ||||||
|             ssize_t count; |  | ||||||
|             if (msg->FindData("key-utf8", B_INT8_TYPE, (const void **)&keyUtf8, &count) == B_OK) { |  | ||||||
|                 char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]; |  | ||||||
|                 SDL_zeroa(text); |  | ||||||
|                 SDL_memcpy(text, keyUtf8, count); |  | ||||||
|                 SDL_SendKeyboardText(text); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void _HandleMouseFocus(BMessage *msg) |  | ||||||
|     { |  | ||||||
|         SDL_Window *win; |  | ||||||
|         int32 winID; |  | ||||||
|         bool bSetFocus; /* If false, lose focus */ |  | ||||||
|         if ( |  | ||||||
|             !_GetWinID(msg, &winID) || |  | ||||||
|             msg->FindBool("focusGained", &bSetFocus) != B_OK) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         win = GetSDLWindow(winID); |  | ||||||
|         if (bSetFocus) { |  | ||||||
|             SDL_SetMouseFocus(win); |  | ||||||
|         } else if (SDL_GetMouseFocus() == win) { |  | ||||||
|             /* Only lose all focus if this window was the current focus */ |  | ||||||
|             SDL_SetMouseFocus(NULL); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void _HandleKeyboardFocus(BMessage *msg) |  | ||||||
|     { |  | ||||||
|         SDL_Window *win; |  | ||||||
|         int32 winID; |  | ||||||
|         bool bSetFocus; /* If false, lose focus */ |  | ||||||
|         if ( |  | ||||||
|             !_GetWinID(msg, &winID) || |  | ||||||
|             msg->FindBool("focusGained", &bSetFocus) != B_OK) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         win = GetSDLWindow(winID); |  | ||||||
|         if (bSetFocus) { |  | ||||||
|             SDL_SetKeyboardFocus(win); |  | ||||||
|         } else if (SDL_GetKeyboardFocus() == win) { |  | ||||||
|             /* Only lose all focus if this window was the current focus */ |  | ||||||
|             SDL_SetKeyboardFocus(NULL); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void _HandleWindowMoved(BMessage *msg) |  | ||||||
|     { |  | ||||||
|         SDL_Window *win; |  | ||||||
|         int32 winID; |  | ||||||
|         int32 xPos, yPos; |  | ||||||
|         /* Get the window id and new x/y position of the window */ |  | ||||||
|         if ( |  | ||||||
|             !_GetWinID(msg, &winID) || |  | ||||||
|             msg->FindInt32("window-x", &xPos) != B_OK || |  | ||||||
|             msg->FindInt32("window-y", &yPos) != B_OK) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         win = GetSDLWindow(winID); |  | ||||||
|         SDL_SendWindowEvent(win, SDL_EVENT_WINDOW_MOVED, xPos, yPos); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void _HandleWindowResized(BMessage *msg) |  | ||||||
|     { |  | ||||||
|         SDL_Window *win; |  | ||||||
|         int32 winID; |  | ||||||
|         int32 w, h; |  | ||||||
|         /* Get the window id ]and new x/y position of the window */ |  | ||||||
|         if ( |  | ||||||
|             !_GetWinID(msg, &winID) || |  | ||||||
|             msg->FindInt32("window-w", &w) != B_OK || |  | ||||||
|             msg->FindInt32("window-h", &h) != B_OK) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         win = GetSDLWindow(winID); |  | ||||||
|         SDL_SendWindowEvent(win, SDL_EVENT_WINDOW_RESIZED, w, h); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     bool _GetWinID(BMessage *msg, int32 *winID) |  | ||||||
|     { |  | ||||||
|         return msg->FindInt32("window-id", winID) == B_OK; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /* Vector functions: Wraps vector stuff in case we need to change |  | ||||||
|        implementation */ |  | ||||||
|     void _SetSDLWindow(SDL_Window *win, int32 winID) |  | ||||||
|     { |  | ||||||
|         _window_map[winID] = win; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     int32 _GetNumWindowSlots() |  | ||||||
|     { |  | ||||||
|         return _window_map.size(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void _PopBackWindow() |  | ||||||
|     { |  | ||||||
|         _window_map.pop_back(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void _PushBackWindow(SDL_Window *win) |  | ||||||
|     { |  | ||||||
|         _window_map.push_back(win); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /* Members */ |  | ||||||
|     std::vector<SDL_Window *> _window_map; /* Keeps track of SDL_Windows by index-id */ |  | ||||||
|  |  | ||||||
| #ifdef SDL_VIDEO_OPENGL |  | ||||||
|     BGLView *_current_context; |  | ||||||
| #endif |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| #endif |  | ||||||
| @@ -40,6 +40,8 @@ extern "C" { | |||||||
| #include "SDL_bframebuffer.h" | #include "SDL_bframebuffer.h" | ||||||
| #include "SDL_bevents.h" | #include "SDL_bevents.h" | ||||||
| #include "SDL_bmessagebox.h" | #include "SDL_bmessagebox.h" | ||||||
|  | #include "../../events/SDL_keyboard_c.h" | ||||||
|  | #include "../../events/SDL_mouse_c.h" | ||||||
|  |  | ||||||
| static SDL_INLINE SDL_BWin *_ToBeWin(SDL_Window *window) { | static SDL_INLINE SDL_BWin *_ToBeWin(SDL_Window *window) { | ||||||
|     return (SDL_BWin *)(window->driverdata); |     return (SDL_BWin *)(window->driverdata); | ||||||
| @@ -279,6 +281,10 @@ int HAIKU_VideoInit(SDL_VideoDevice *_this) | |||||||
|  |  | ||||||
|     HAIKU_MouseInit(_this); |     HAIKU_MouseInit(_this); | ||||||
|  |  | ||||||
|  |     /* Assume we have a mouse and keyboard */ | ||||||
|  |     SDL_AddKeyboard(BAPP_KEYBOARD_ID, SDL_FALSE); | ||||||
|  |     SDL_AddMouse(BAPP_MOUSE_ID, SDL_FALSE); | ||||||
|  |  | ||||||
| #ifdef SDL_VIDEO_OPENGL | #ifdef SDL_VIDEO_OPENGL | ||||||
|         /* testgl application doesn't load library, just tries to load symbols */ |         /* testgl application doesn't load library, just tries to load symbols */ | ||||||
|         /* is it correct? if so we have to load library here */ |         /* is it correct? if so we have to load library here */ | ||||||
|   | |||||||
| @@ -351,7 +351,7 @@ static int KMSDRM_WarpMouseGlobal(float x, float y) | |||||||
|         SDL_DisplayData *dispdata = SDL_GetDisplayDriverDataForWindow(window); |         SDL_DisplayData *dispdata = SDL_GetDisplayDriverDataForWindow(window); | ||||||
|  |  | ||||||
|         /* Update internal mouse position. */ |         /* Update internal mouse position. */ | ||||||
|         SDL_SendMouseMotion(0, mouse->focus, mouse->mouseID, 0, x, y); |         SDL_SendMouseMotion(0, mouse->focus, 0, SDL_FALSE, x, y); | ||||||
|  |  | ||||||
|         /* And now update the cursor graphic position on screen. */ |         /* And now update the cursor graphic position on screen. */ | ||||||
|         if (dispdata->cursor_bo) { |         if (dispdata->cursor_bo) { | ||||||
|   | |||||||
| @@ -44,15 +44,15 @@ int HandleWsEvent(SDL_VideoDevice *_this, const TWsEvent &aWsEvent); | |||||||
|  |  | ||||||
| void NGAGE_PumpEvents(SDL_VideoDevice *_this) | void NGAGE_PumpEvents(SDL_VideoDevice *_this) | ||||||
| { | { | ||||||
|     SDL_VideoData *phdata = _this->driverdata; |     SDL_VideoData *data = _this->driverdata; | ||||||
|  |  | ||||||
|     while (phdata->NGAGE_WsEventStatus != KRequestPending) { |     while (data->NGAGE_WsEventStatus != KRequestPending) { | ||||||
|         phdata->NGAGE_WsSession.GetEvent(phdata->NGAGE_WsEvent); |         data->NGAGE_WsSession.GetEvent(data->NGAGE_WsEvent); | ||||||
|  |  | ||||||
|         HandleWsEvent(_this, phdata->NGAGE_WsEvent); |         HandleWsEvent(_this, data->NGAGE_WsEvent); | ||||||
|  |  | ||||||
|         phdata->NGAGE_WsEventStatus = KRequestPending; |         data->NGAGE_WsEventStatus = KRequestPending; | ||||||
|         phdata->NGAGE_WsSession.EventReady(&phdata->NGAGE_WsEventStatus); |         data->NGAGE_WsSession.EventReady(&data->NGAGE_WsEventStatus); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -149,25 +149,25 @@ static SDL_Scancode ConvertScancode(SDL_VideoDevice *_this, int key) | |||||||
|  |  | ||||||
| int HandleWsEvent(SDL_VideoDevice *_this, const TWsEvent &aWsEvent) | int HandleWsEvent(SDL_VideoDevice *_this, const TWsEvent &aWsEvent) | ||||||
| { | { | ||||||
|     SDL_VideoData *phdata = _this->driverdata; |     SDL_VideoData *data = _this->driverdata; | ||||||
|     int posted = 0; |     int posted = 0; | ||||||
|  |  | ||||||
|     switch (aWsEvent.Type()) { |     switch (aWsEvent.Type()) { | ||||||
|     case EEventKeyDown: /* Key events */ |     case EEventKeyDown: /* Key events */ | ||||||
|         SDL_SendKeyboardKey(0, 0, SDL_PRESSED, ConvertScancode(_this, aWsEvent.Key()->iScanCode)); |         SDL_SendKeyboardKey(0, data->keyboardID, SDL_PRESSED, ConvertScancode(_this, aWsEvent.Key()->iScanCode)); | ||||||
|         break; |         break; | ||||||
|     case EEventKeyUp: /* Key events */ |     case EEventKeyUp: /* Key events */ | ||||||
|         SDL_SendKeyboardKey(0, 0, SDL_RELEASED, ConvertScancode(_this, aWsEvent.Key()->iScanCode)); |         SDL_SendKeyboardKey(0, data->keyboardID, SDL_RELEASED, ConvertScancode(_this, aWsEvent.Key()->iScanCode)); | ||||||
|         break; |         break; | ||||||
|     case EEventFocusGained: /* SDL window got focus */ |     case EEventFocusGained: /* SDL window got focus */ | ||||||
|         phdata->NGAGE_IsWindowFocused = ETrue; |         data->NGAGE_IsWindowFocused = ETrue; | ||||||
|         /* Draw window background and screen buffer */ |         /* Draw window background and screen buffer */ | ||||||
|         DisableKeyBlocking(_this); |         DisableKeyBlocking(_this); | ||||||
|         RedrawWindowL(_this); |         RedrawWindowL(_this); | ||||||
|         break; |         break; | ||||||
|     case EEventFocusLost: /* SDL window lost focus */ |     case EEventFocusLost: /* SDL window lost focus */ | ||||||
|     { |     { | ||||||
|         phdata->NGAGE_IsWindowFocused = EFalse; |         data->NGAGE_IsWindowFocused = EFalse; | ||||||
|         RWsSession s; |         RWsSession s; | ||||||
|         s.Connect(); |         s.Connect(); | ||||||
|         RWindowGroup g(s); |         RWindowGroup g(s); | ||||||
| @@ -175,7 +175,7 @@ int HandleWsEvent(SDL_VideoDevice *_this, const TWsEvent &aWsEvent) | |||||||
|         g.EnableReceiptOfFocus(EFalse); |         g.EnableReceiptOfFocus(EFalse); | ||||||
|         RWindow w(s); |         RWindow w(s); | ||||||
|         w.Construct(g, TUint32(&w)); |         w.Construct(g, TUint32(&w)); | ||||||
|         w.SetExtent(TPoint(0, 0), phdata->NGAGE_WsWindow.Size()); |         w.SetExtent(TPoint(0, 0), data->NGAGE_WsWindow.Size()); | ||||||
|         w.SetOrdinalPosition(0); |         w.SetOrdinalPosition(0); | ||||||
|         w.Activate(); |         w.Activate(); | ||||||
|         w.Close(); |         w.Close(); | ||||||
|   | |||||||
| @@ -61,6 +61,8 @@ struct SDL_VideoData | |||||||
|  |  | ||||||
|     CFbsBitGc::TGraphicsOrientation NGAGE_ScreenOrientation; |     CFbsBitGc::TGraphicsOrientation NGAGE_ScreenOrientation; | ||||||
|  |  | ||||||
|  |     SDL_KeyboardID keyboardID; | ||||||
|  |     SDL_MouseID mouseID; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif /* SDL_ngagevideo_h */ | #endif /* SDL_ngagevideo_h */ | ||||||
|   | |||||||
| @@ -33,6 +33,9 @@ typedef struct | |||||||
|     EGLConfig       conf; |     EGLConfig       conf; | ||||||
| } window_impl_t; | } window_impl_t; | ||||||
|  |  | ||||||
|  | #define QNX_KEYBOARD_ID    1 | ||||||
|  | #define QNX_MOUSE_ID       1 | ||||||
|  |  | ||||||
| extern void handleKeyboardEvent(screen_event_t event); | extern void handleKeyboardEvent(screen_event_t event); | ||||||
|  |  | ||||||
| extern int glGetConfig(EGLConfig *pconf, int *pformat); | extern int glGetConfig(EGLConfig *pconf, int *pformat); | ||||||
|   | |||||||
| @@ -125,8 +125,8 @@ void handleKeyboardEvent(screen_event_t event) | |||||||
|     // FIXME: |     // FIXME: | ||||||
|     // Need to handle more key states (such as key combinations). |     // Need to handle more key states (such as key combinations). | ||||||
|     if (val & KEY_DOWN) { |     if (val & KEY_DOWN) { | ||||||
|         SDL_SendKeyboardKey(0, 0, SDL_PRESSED, scancode); |         SDL_SendKeyboardKey(0, QNX_KEYBOARD_ID, SDL_PRESSED, scancode); | ||||||
|     } else { |     } else { | ||||||
|         SDL_SendKeyboardKey(0, 0, SDL_RELEASED, scancode); |         SDL_SendKeyboardKey(0, QNX_KEYBOARD_ID, SDL_RELEASED, scancode); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -20,6 +20,8 @@ | |||||||
| */ | */ | ||||||
| #include "../../SDL_internal.h" | #include "../../SDL_internal.h" | ||||||
| #include "../SDL_sysvideo.h" | #include "../SDL_sysvideo.h" | ||||||
|  | #include "../../events/SDL_keyboard_c.h" | ||||||
|  | #include "../../events/SDL_mouse_c.h" | ||||||
| #include "SDL_qnx.h" | #include "SDL_qnx.h" | ||||||
|  |  | ||||||
| static screen_context_t context; | static screen_context_t context; | ||||||
| @@ -50,7 +52,10 @@ static int videoInit(SDL_VideoDevice *_this) | |||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _this->num_displays = 1; |     /* Assume we have a mouse and keyboard */ | ||||||
|  |     SDL_AddKeyboard(QNX_KEYBOARD_ID, SDL_FALSE); | ||||||
|  |     SDL_AddMouse(QNX_MOUSE_ID, SDL_FALSE); | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -276,7 +276,7 @@ static int RPI_WarpMouseGlobal(float x, float y) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Update internal mouse position. */ |     /* Update internal mouse position. */ | ||||||
|     SDL_SendMouseMotion(0, mouse->focus, mouse->mouseID, 0, x, y); |     SDL_SendMouseMotion(0, mouse->focus, 0, SDL_FALSE, x, y); | ||||||
|  |  | ||||||
|     return RPI_WarpMouseGlobalGraphically(x, y); |     return RPI_WarpMouseGlobalGraphically(x, y); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -58,7 +58,7 @@ void RISCOS_PollKeyboard(SDL_VideoDevice *_this) | |||||||
|     for (i = 0; i < RISCOS_MAX_KEYS_PRESSED; i++) { |     for (i = 0; i < RISCOS_MAX_KEYS_PRESSED; i++) { | ||||||
|         if (driverdata->key_pressed[i] != 255) { |         if (driverdata->key_pressed[i] != 255) { | ||||||
|             if ((_kernel_osbyte(129, driverdata->key_pressed[i] ^ 0xff, 0xff) & 0xff) != 255) { |             if ((_kernel_osbyte(129, driverdata->key_pressed[i] ^ 0xff, 0xff) & 0xff) != 255) { | ||||||
|                 SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_RISCOS_translate_keycode(driverdata->key_pressed[i])); |                 SDL_SendKeyboardKey(0, driverdata->keyboardID, SDL_RELEASED, SDL_RISCOS_translate_keycode(driverdata->key_pressed[i])); | ||||||
|                 driverdata->key_pressed[i] = 255; |                 driverdata->key_pressed[i] = 255; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -81,7 +81,7 @@ void RISCOS_PollKeyboard(SDL_VideoDevice *_this) | |||||||
|             break; |             break; | ||||||
|  |  | ||||||
|         default: |         default: | ||||||
|             SDL_SendKeyboardKey(0, 0, SDL_PRESSED, SDL_RISCOS_translate_keycode(key)); |             SDL_SendKeyboardKey(0, driverdata->keyboardID, SDL_PRESSED, SDL_RISCOS_translate_keycode(key)); | ||||||
|  |  | ||||||
|             /* Record the press so we can detect release later. */ |             /* Record the press so we can detect release later. */ | ||||||
|             for (i = 0; i < RISCOS_MAX_KEYS_PRESSED; i++) { |             for (i = 0; i < RISCOS_MAX_KEYS_PRESSED; i++) { | ||||||
| @@ -126,12 +126,12 @@ void RISCOS_PollMouse(SDL_VideoDevice *_this) | |||||||
|     buttons = regs.r[2]; |     buttons = regs.r[2]; | ||||||
|  |  | ||||||
|     if (mouse->x != x || mouse->y != y) { |     if (mouse->x != x || mouse->y != y) { | ||||||
|         SDL_SendMouseMotion(0, mouse->focus, mouse->mouseID, 0, (float)x, (float)y); |         SDL_SendMouseMotion(0, mouse->focus, driverdata->mouseID, 0, (float)x, (float)y); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (driverdata->last_mouse_buttons != buttons) { |     if (driverdata->last_mouse_buttons != buttons) { | ||||||
|         for (i = 0; i < SDL_arraysize(mouse_button_map); i++) { |         for (i = 0; i < SDL_arraysize(mouse_button_map); i++) { | ||||||
|             SDL_SendMouseButton(0, mouse->focus, mouse->mouseID, (buttons & (1 << i)) ? SDL_PRESSED : SDL_RELEASED, mouse_button_map[i]); |             SDL_SendMouseButton(0, mouse->focus, driverdata->mouseID, (buttons & (1 << i)) ? SDL_PRESSED : SDL_RELEASED, mouse_button_map[i]); | ||||||
|         } |         } | ||||||
|         driverdata->last_mouse_buttons = buttons; |         driverdata->last_mouse_buttons = buttons; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -25,6 +25,8 @@ | |||||||
| #include "../SDL_sysvideo.h" | #include "../SDL_sysvideo.h" | ||||||
| #include "../SDL_pixels_c.h" | #include "../SDL_pixels_c.h" | ||||||
| #include "../../events/SDL_events_c.h" | #include "../../events/SDL_events_c.h" | ||||||
|  | #include "../../events/SDL_keyboard_c.h" | ||||||
|  | #include "../../events/SDL_mouse_c.h" | ||||||
|  |  | ||||||
| #include "SDL_riscosvideo.h" | #include "SDL_riscosvideo.h" | ||||||
| #include "SDL_riscosevents_c.h" | #include "SDL_riscosevents_c.h" | ||||||
| @@ -51,7 +53,7 @@ static void RISCOS_DeleteDevice(SDL_VideoDevice *device) | |||||||
| static SDL_VideoDevice *RISCOS_CreateDevice(void) | static SDL_VideoDevice *RISCOS_CreateDevice(void) | ||||||
| { | { | ||||||
|     SDL_VideoDevice *device; |     SDL_VideoDevice *device; | ||||||
|     SDL_VideoData *phdata; |     SDL_VideoData *data; | ||||||
|  |  | ||||||
|     /* Initialize all variables that we clean on shutdown */ |     /* Initialize all variables that we clean on shutdown */ | ||||||
|     device = (SDL_VideoDevice *)SDL_calloc(1, sizeof(SDL_VideoDevice)); |     device = (SDL_VideoDevice *)SDL_calloc(1, sizeof(SDL_VideoDevice)); | ||||||
| @@ -60,13 +62,13 @@ static SDL_VideoDevice *RISCOS_CreateDevice(void) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* Initialize internal data */ |     /* Initialize internal data */ | ||||||
|     phdata = (SDL_VideoData *)SDL_calloc(1, sizeof(SDL_VideoData)); |     data = (SDL_VideoData *)SDL_calloc(1, sizeof(SDL_VideoData)); | ||||||
|     if (!phdata) { |     if (!data) { | ||||||
|         SDL_free(device); |         SDL_free(device); | ||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     device->driverdata = phdata; |     device->driverdata = data; | ||||||
|  |  | ||||||
|     /* Set the function pointers */ |     /* Set the function pointers */ | ||||||
|     device->VideoInit = RISCOS_VideoInit; |     device->VideoInit = RISCOS_VideoInit; | ||||||
| @@ -96,6 +98,8 @@ VideoBootStrap RISCOS_bootstrap = { | |||||||
|  |  | ||||||
| static int RISCOS_VideoInit(SDL_VideoDevice *_this) | static int RISCOS_VideoInit(SDL_VideoDevice *_this) | ||||||
| { | { | ||||||
|  |     SDL_VideoData *data = _this->driverdata; | ||||||
|  |  | ||||||
|     if (RISCOS_InitEvents(_this) < 0) { |     if (RISCOS_InitEvents(_this) < 0) { | ||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
| @@ -104,6 +108,12 @@ static int RISCOS_VideoInit(SDL_VideoDevice *_this) | |||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /* Assume we have a mouse and keyboard */ | ||||||
|  |     data->keyboardID = SDL_GetNextObjectID(); | ||||||
|  |     SDL_AddKeyboard(data->keyboardID, SDL_FALSE); | ||||||
|  |     data->mouseID = SDL_GetNextObjectID(); | ||||||
|  |     SDL_AddMouse(data->mouseID, SDL_FALSE); | ||||||
|  |  | ||||||
|     if (RISCOS_InitModes(_this) < 0) { |     if (RISCOS_InitModes(_this) < 0) { | ||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -29,6 +29,8 @@ | |||||||
|  |  | ||||||
| struct SDL_VideoData | struct SDL_VideoData | ||||||
| { | { | ||||||
|  |     SDL_KeyboardID keyboardID; | ||||||
|  |     SDL_MouseID mouseID; | ||||||
|     int last_mouse_buttons; |     int last_mouse_buttons; | ||||||
|     Uint8 key_pressed[RISCOS_MAX_KEYS_PRESSED]; |     Uint8 key_pressed[RISCOS_MAX_KEYS_PRESSED]; | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -178,7 +178,7 @@ static void OnGCKeyboardConnected(GCKeyboard *keyboard) API_AVAILABLE(macos(11.0 | |||||||
| { | { | ||||||
|     SDL_KeyboardID keyboardID = (SDL_KeyboardID)(uintptr_t)keyboard; |     SDL_KeyboardID keyboardID = (SDL_KeyboardID)(uintptr_t)keyboard; | ||||||
|  |  | ||||||
|     SDL_PrivateKeyboardAdded(keyboardID); |     SDL_AddKeyboard(keyboardID, SDL_TRUE); | ||||||
|  |  | ||||||
|     keyboard.keyboardInput.keyChangedHandler = ^(GCKeyboardInput *kbrd, GCControllerButtonInput *key, GCKeyCode keyCode, BOOL pressed) { |     keyboard.keyboardInput.keyChangedHandler = ^(GCKeyboardInput *kbrd, GCControllerButtonInput *key, GCKeyCode keyCode, BOOL pressed) { | ||||||
|         SDL_SendKeyboardKey(0, keyboardID, pressed ? SDL_PRESSED : SDL_RELEASED, (SDL_Scancode)keyCode); |         SDL_SendKeyboardKey(0, keyboardID, pressed ? SDL_PRESSED : SDL_RELEASED, (SDL_Scancode)keyCode); | ||||||
| @@ -193,7 +193,7 @@ static void OnGCKeyboardDisconnected(GCKeyboard *keyboard) API_AVAILABLE(macos(1 | |||||||
| { | { | ||||||
|     SDL_KeyboardID keyboardID = (SDL_KeyboardID)(uintptr_t)keyboard; |     SDL_KeyboardID keyboardID = (SDL_KeyboardID)(uintptr_t)keyboard; | ||||||
|  |  | ||||||
|     SDL_PrivateKeyboardRemoved(keyboardID); |     SDL_RemoveKeyboard(keyboardID); | ||||||
|  |  | ||||||
|     keyboard.keyboardInput.keyChangedHandler = nil; |     keyboard.keyboardInput.keyChangedHandler = nil; | ||||||
| } | } | ||||||
| @@ -319,7 +319,7 @@ static void OnGCMouseConnected(GCMouse *mouse) API_AVAILABLE(macos(11.0), ios(14 | |||||||
| { | { | ||||||
|     SDL_MouseID mouseID = (SDL_MouseID)(uintptr_t)mouse; |     SDL_MouseID mouseID = (SDL_MouseID)(uintptr_t)mouse; | ||||||
|  |  | ||||||
|     SDL_PrivateMouseAdded(mouseID); |     SDL_AddMouse(mouseID, SDL_TRUE); | ||||||
|  |  | ||||||
|     mouse.mouseInput.leftButton.pressedChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { |     mouse.mouseInput.leftButton.pressedChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { | ||||||
|       OnGCMouseButtonChanged(mouseID, SDL_BUTTON_LEFT, pressed); |       OnGCMouseButtonChanged(mouseID, SDL_BUTTON_LEFT, pressed); | ||||||
| @@ -385,7 +385,7 @@ static void OnGCMouseDisconnected(GCMouse *mouse) API_AVAILABLE(macos(11.0), ios | |||||||
|  |  | ||||||
|     UpdatePointerLock(); |     UpdatePointerLock(); | ||||||
|  |  | ||||||
|     SDL_PrivateMouseRemoved(mouseID); |     SDL_RemoveMouse(mouseID); | ||||||
| } | } | ||||||
|  |  | ||||||
| void SDL_InitGCMouse(void) | void SDL_InitGCMouse(void) | ||||||
|   | |||||||
| @@ -43,6 +43,10 @@ void VITA_InitKeyboard(void) | |||||||
|     sceSysmoduleLoadModule(SCE_SYSMODULE_IME); /** For PVR OSK Support **/ |     sceSysmoduleLoadModule(SCE_SYSMODULE_IME); /** For PVR OSK Support **/ | ||||||
| #endif | #endif | ||||||
|     sceHidKeyboardEnumerate(&keyboard_hid_handle, 1); |     sceHidKeyboardEnumerate(&keyboard_hid_handle, 1); | ||||||
|  |  | ||||||
|  |     if (keyboard_hid_handle > 0) { | ||||||
|  |         SDL_AddKeyboard((SDL_KeyboardID)keyboard_hid_handle, SDL_FALSE); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void VITA_PollKeyboard(void) | void VITA_PollKeyboard(void) | ||||||
| @@ -53,6 +57,7 @@ void VITA_PollKeyboard(void) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (keyboard_hid_handle > 0) { |     if (keyboard_hid_handle > 0) { | ||||||
|  |         SDL_KeyboardID keyboardID = (SDL_KeyboardID)keyboard_hid_handle; | ||||||
|         int numReports = sceHidKeyboardRead(keyboard_hid_handle, (SceHidKeyboardReport **)&k_reports, SCE_HID_MAX_REPORT); |         int numReports = sceHidKeyboardRead(keyboard_hid_handle, (SceHidKeyboardReport **)&k_reports, SCE_HID_MAX_REPORT); | ||||||
|  |  | ||||||
|         if (numReports < 0) { |         if (numReports < 0) { | ||||||
| @@ -62,40 +67,40 @@ void VITA_PollKeyboard(void) | |||||||
|             // The k_report only reports the state of the LED |             // The k_report only reports the state of the LED | ||||||
|             if (k_reports[numReports - 1].modifiers[1] & 0x1) { |             if (k_reports[numReports - 1].modifiers[1] & 0x1) { | ||||||
|                 if (!(locks & 0x1)) { |                 if (!(locks & 0x1)) { | ||||||
|                     SDL_SendKeyboardKey(0, 0, SDL_PRESSED, SDL_SCANCODE_NUMLOCKCLEAR); |                     SDL_SendKeyboardKey(0, keyboardID, SDL_PRESSED, SDL_SCANCODE_NUMLOCKCLEAR); | ||||||
|                     locks |= 0x1; |                     locks |= 0x1; | ||||||
|                 } |                 } | ||||||
|             } else { |             } else { | ||||||
|                 if (locks & 0x1) { |                 if (locks & 0x1) { | ||||||
|                     SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_NUMLOCKCLEAR); |                     SDL_SendKeyboardKey(0, keyboardID, SDL_RELEASED, SDL_SCANCODE_NUMLOCKCLEAR); | ||||||
|                     SDL_SendKeyboardKey(0, 0, SDL_PRESSED, SDL_SCANCODE_NUMLOCKCLEAR); |                     SDL_SendKeyboardKey(0, keyboardID, SDL_PRESSED, SDL_SCANCODE_NUMLOCKCLEAR); | ||||||
|                     SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_NUMLOCKCLEAR); |                     SDL_SendKeyboardKey(0, keyboardID, SDL_RELEASED, SDL_SCANCODE_NUMLOCKCLEAR); | ||||||
|                     locks &= ~0x1; |                     locks &= ~0x1; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (k_reports[numReports - 1].modifiers[1] & 0x2) { |             if (k_reports[numReports - 1].modifiers[1] & 0x2) { | ||||||
|                 if (!(locks & 0x2)) { |                 if (!(locks & 0x2)) { | ||||||
|                     SDL_SendKeyboardKey(0, 0, SDL_PRESSED, SDL_SCANCODE_CAPSLOCK); |                     SDL_SendKeyboardKey(0, keyboardID, SDL_PRESSED, SDL_SCANCODE_CAPSLOCK); | ||||||
|                     locks |= 0x2; |                     locks |= 0x2; | ||||||
|                 } |                 } | ||||||
|             } else { |             } else { | ||||||
|                 if (locks & 0x2) { |                 if (locks & 0x2) { | ||||||
|                     SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_CAPSLOCK); |                     SDL_SendKeyboardKey(0, keyboardID, SDL_RELEASED, SDL_SCANCODE_CAPSLOCK); | ||||||
|                     SDL_SendKeyboardKey(0, 0, SDL_PRESSED, SDL_SCANCODE_CAPSLOCK); |                     SDL_SendKeyboardKey(0, keyboardID, SDL_PRESSED, SDL_SCANCODE_CAPSLOCK); | ||||||
|                     SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_CAPSLOCK); |                     SDL_SendKeyboardKey(0, keyboardID, SDL_RELEASED, SDL_SCANCODE_CAPSLOCK); | ||||||
|                     locks &= ~0x2; |                     locks &= ~0x2; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (k_reports[numReports - 1].modifiers[1] & 0x4) { |             if (k_reports[numReports - 1].modifiers[1] & 0x4) { | ||||||
|                 if (!(locks & 0x4)) { |                 if (!(locks & 0x4)) { | ||||||
|                     SDL_SendKeyboardKey(0, 0, SDL_PRESSED, SDL_SCANCODE_SCROLLLOCK); |                     SDL_SendKeyboardKey(0, keyboardID, SDL_PRESSED, SDL_SCANCODE_SCROLLLOCK); | ||||||
|                     locks |= 0x4; |                     locks |= 0x4; | ||||||
|                 } |                 } | ||||||
|             } else { |             } else { | ||||||
|                 if (locks & 0x4) { |                 if (locks & 0x4) { | ||||||
|                     SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_SCROLLLOCK); |                     SDL_SendKeyboardKey(0, keyboardID, SDL_RELEASED, SDL_SCANCODE_SCROLLLOCK); | ||||||
|                     locks &= ~0x4; |                     locks &= ~0x4; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @@ -105,58 +110,58 @@ void VITA_PollKeyboard(void) | |||||||
|  |  | ||||||
|                 if (changed_modifiers & 0x01) { |                 if (changed_modifiers & 0x01) { | ||||||
|                     if (prev_modifiers & 0x01) { |                     if (prev_modifiers & 0x01) { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_LCTRL); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_RELEASED, SDL_SCANCODE_LCTRL); | ||||||
|                     } else { |                     } else { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_PRESSED, SDL_SCANCODE_LCTRL); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_PRESSED, SDL_SCANCODE_LCTRL); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 if (changed_modifiers & 0x02) { |                 if (changed_modifiers & 0x02) { | ||||||
|                     if (prev_modifiers & 0x02) { |                     if (prev_modifiers & 0x02) { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_LSHIFT); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_RELEASED, SDL_SCANCODE_LSHIFT); | ||||||
|                     } else { |                     } else { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_PRESSED, SDL_SCANCODE_LSHIFT); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_PRESSED, SDL_SCANCODE_LSHIFT); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 if (changed_modifiers & 0x04) { |                 if (changed_modifiers & 0x04) { | ||||||
|                     if (prev_modifiers & 0x04) { |                     if (prev_modifiers & 0x04) { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_LALT); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_RELEASED, SDL_SCANCODE_LALT); | ||||||
|                     } else { |                     } else { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_PRESSED, SDL_SCANCODE_LALT); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_PRESSED, SDL_SCANCODE_LALT); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 if (changed_modifiers & 0x08) { |                 if (changed_modifiers & 0x08) { | ||||||
|                     if (prev_modifiers & 0x08) { |                     if (prev_modifiers & 0x08) { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_LGUI); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_RELEASED, SDL_SCANCODE_LGUI); | ||||||
|                     } else { |                     } else { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_PRESSED, SDL_SCANCODE_LGUI); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_PRESSED, SDL_SCANCODE_LGUI); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 if (changed_modifiers & 0x10) { |                 if (changed_modifiers & 0x10) { | ||||||
|                     if (prev_modifiers & 0x10) { |                     if (prev_modifiers & 0x10) { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_RCTRL); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_RELEASED, SDL_SCANCODE_RCTRL); | ||||||
|                     } else { |                     } else { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_PRESSED, SDL_SCANCODE_RCTRL); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_PRESSED, SDL_SCANCODE_RCTRL); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 if (changed_modifiers & 0x20) { |                 if (changed_modifiers & 0x20) { | ||||||
|                     if (prev_modifiers & 0x20) { |                     if (prev_modifiers & 0x20) { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_RSHIFT); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_RELEASED, SDL_SCANCODE_RSHIFT); | ||||||
|                     } else { |                     } else { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_PRESSED, SDL_SCANCODE_RSHIFT); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_PRESSED, SDL_SCANCODE_RSHIFT); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 if (changed_modifiers & 0x40) { |                 if (changed_modifiers & 0x40) { | ||||||
|                     if (prev_modifiers & 0x40) { |                     if (prev_modifiers & 0x40) { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_RALT); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_RELEASED, SDL_SCANCODE_RALT); | ||||||
|                     } else { |                     } else { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_PRESSED, SDL_SCANCODE_RALT); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_PRESSED, SDL_SCANCODE_RALT); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 if (changed_modifiers & 0x80) { |                 if (changed_modifiers & 0x80) { | ||||||
|                     if (prev_modifiers & 0x80) { |                     if (prev_modifiers & 0x80) { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_RGUI); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_RELEASED, SDL_SCANCODE_RGUI); | ||||||
|                     } else { |                     } else { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_PRESSED, SDL_SCANCODE_RGUI); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_PRESSED, SDL_SCANCODE_RGUI); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @@ -170,10 +175,10 @@ void VITA_PollKeyboard(void) | |||||||
|                 if (keyCode != prev_keys[i]) { |                 if (keyCode != prev_keys[i]) { | ||||||
|  |  | ||||||
|                     if (prev_keys[i]) { |                     if (prev_keys[i]) { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_RELEASED, prev_keys[i]); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_RELEASED, prev_keys[i]); | ||||||
|                     } |                     } | ||||||
|                     if (keyCode) { |                     if (keyCode) { | ||||||
|                         SDL_SendKeyboardKey(0, 0, SDL_PRESSED, keyCode); |                         SDL_SendKeyboardKey(0, keyboardID, SDL_PRESSED, keyCode); | ||||||
|                     } |                     } | ||||||
|                     prev_keys[i] = keyCode; |                     prev_keys[i] = keyCode; | ||||||
|                 } |                 } | ||||||
|   | |||||||
| @@ -37,6 +37,10 @@ Uint8 prev_buttons = 0; | |||||||
| void VITA_InitMouse(void) | void VITA_InitMouse(void) | ||||||
| { | { | ||||||
|     sceHidMouseEnumerate(&mouse_hid_handle, 1); |     sceHidMouseEnumerate(&mouse_hid_handle, 1); | ||||||
|  |  | ||||||
|  |     if (mouse_hid_handle > 0) { | ||||||
|  |         SDL_AddMouse((SDL_MouseID)mouse_hid_handle, SDL_FALSE); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void VITA_PollMouse(void) | void VITA_PollMouse(void) | ||||||
| @@ -47,6 +51,7 @@ void VITA_PollMouse(void) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (mouse_hid_handle > 0) { |     if (mouse_hid_handle > 0) { | ||||||
|  |         SDL_MouseID mouseID = (SDL_MouseID)mouse_hid_handle; | ||||||
|         int numReports = sceHidMouseRead(mouse_hid_handle, (SceHidMouseReport **)&m_reports, SCE_HID_MAX_REPORT); |         int numReports = sceHidMouseRead(mouse_hid_handle, (SceHidMouseReport **)&m_reports, SCE_HID_MAX_REPORT); | ||||||
|         if (numReports > 0) { |         if (numReports > 0) { | ||||||
|             for (int i = 0; i <= numReports - 1; i++) { |             for (int i = 0; i <= numReports - 1; i++) { | ||||||
| @@ -54,27 +59,27 @@ void VITA_PollMouse(void) | |||||||
|  |  | ||||||
|                 if (changed_buttons & 0x1) { |                 if (changed_buttons & 0x1) { | ||||||
|                     if (prev_buttons & 0x1) |                     if (prev_buttons & 0x1) | ||||||
|                         SDL_SendMouseButton(0, Vita_Window, 0, SDL_RELEASED, SDL_BUTTON_LEFT); |                         SDL_SendMouseButton(0, Vita_Window, mouseID, SDL_RELEASED, SDL_BUTTON_LEFT); | ||||||
|                     else |                     else | ||||||
|                         SDL_SendMouseButton(0, Vita_Window, 0, SDL_PRESSED, SDL_BUTTON_LEFT); |                         SDL_SendMouseButton(0, Vita_Window, mouseID, SDL_PRESSED, SDL_BUTTON_LEFT); | ||||||
|                 } |                 } | ||||||
|                 if (changed_buttons & 0x2) { |                 if (changed_buttons & 0x2) { | ||||||
|                     if (prev_buttons & 0x2) |                     if (prev_buttons & 0x2) | ||||||
|                         SDL_SendMouseButton(0, Vita_Window, 0, SDL_RELEASED, SDL_BUTTON_RIGHT); |                         SDL_SendMouseButton(0, Vita_Window, mouseID, SDL_RELEASED, SDL_BUTTON_RIGHT); | ||||||
|                     else |                     else | ||||||
|                         SDL_SendMouseButton(0, Vita_Window, 0, SDL_PRESSED, SDL_BUTTON_RIGHT); |                         SDL_SendMouseButton(0, Vita_Window, mouseID, SDL_PRESSED, SDL_BUTTON_RIGHT); | ||||||
|                 } |                 } | ||||||
|                 if (changed_buttons & 0x4) { |                 if (changed_buttons & 0x4) { | ||||||
|                     if (prev_buttons & 0x4) |                     if (prev_buttons & 0x4) | ||||||
|                         SDL_SendMouseButton(0, Vita_Window, 0, SDL_RELEASED, SDL_BUTTON_MIDDLE); |                         SDL_SendMouseButton(0, Vita_Window, mouseID, SDL_RELEASED, SDL_BUTTON_MIDDLE); | ||||||
|                     else |                     else | ||||||
|                         SDL_SendMouseButton(0, Vita_Window, 0, SDL_PRESSED, SDL_BUTTON_MIDDLE); |                         SDL_SendMouseButton(0, Vita_Window, mouseID, SDL_PRESSED, SDL_BUTTON_MIDDLE); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 prev_buttons = m_reports[i].buttons; |                 prev_buttons = m_reports[i].buttons; | ||||||
|  |  | ||||||
|                 if (m_reports[i].rel_x || m_reports[i].rel_y) { |                 if (m_reports[i].rel_x || m_reports[i].rel_y) { | ||||||
|                     SDL_SendMouseMotion(0, Vita_Window, 0, 1, (float)m_reports[i].rel_x, (float)m_reports[i].rel_y); |                     SDL_SendMouseMotion(0, Vita_Window, mouseID, SDL_TRUE, (float)m_reports[i].rel_x, (float)m_reports[i].rel_y); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -515,7 +515,7 @@ static void pointer_handle_motion(void *data, struct wl_pointer *pointer, | |||||||
|     if (input->pointer_focus) { |     if (input->pointer_focus) { | ||||||
|         float sx = (float)(wl_fixed_to_double(sx_w) * window_data->pointer_scale.x); |         float sx = (float)(wl_fixed_to_double(sx_w) * window_data->pointer_scale.x); | ||||||
|         float sy = (float)(wl_fixed_to_double(sy_w) * window_data->pointer_scale.y); |         float sy = (float)(wl_fixed_to_double(sy_w) * window_data->pointer_scale.y); | ||||||
|         SDL_SendMouseMotion(Wayland_GetPointerTimestamp(input, time), window_data->sdlwindow, input->pointer_id, 0, sx, sy); |         SDL_SendMouseMotion(Wayland_GetPointerTimestamp(input, time), window_data->sdlwindow, input->pointer_id, SDL_FALSE, sx, sy); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (window && window->hit_test) { |     if (window && window->hit_test) { | ||||||
| @@ -1715,7 +1715,7 @@ static void seat_handle_capabilities(void *data, struct wl_seat *seat, | |||||||
|         wl_pointer_add_listener(input->pointer, &pointer_listener, input); |         wl_pointer_add_listener(input->pointer, &pointer_listener, input); | ||||||
|  |  | ||||||
|         input->pointer_id = SDL_GetNextObjectID(); |         input->pointer_id = SDL_GetNextObjectID(); | ||||||
|         SDL_PrivateMouseAdded(input->pointer_id); |         SDL_AddMouse(input->pointer_id, SDL_TRUE); | ||||||
|     } else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && input->pointer) { |     } else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && input->pointer) { | ||||||
|         if (input->cursor_shape) { |         if (input->cursor_shape) { | ||||||
|             wp_cursor_shape_device_v1_destroy(input->cursor_shape); |             wp_cursor_shape_device_v1_destroy(input->cursor_shape); | ||||||
| @@ -1725,7 +1725,7 @@ static void seat_handle_capabilities(void *data, struct wl_seat *seat, | |||||||
|         input->pointer = NULL; |         input->pointer = NULL; | ||||||
|         input->display->pointer = NULL; |         input->display->pointer = NULL; | ||||||
|  |  | ||||||
|         SDL_PrivateMouseRemoved(input->pointer_id); |         SDL_RemoveMouse(input->pointer_id); | ||||||
|         input->pointer_id = 0; |         input->pointer_id = 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1748,12 +1748,12 @@ static void seat_handle_capabilities(void *data, struct wl_seat *seat, | |||||||
|                                  input); |                                  input); | ||||||
|  |  | ||||||
|         input->keyboard_id = SDL_GetNextObjectID(); |         input->keyboard_id = SDL_GetNextObjectID(); | ||||||
|         SDL_PrivateKeyboardAdded(input->keyboard_id); |         SDL_AddKeyboard(input->keyboard_id, SDL_TRUE); | ||||||
|     } else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && input->keyboard) { |     } else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && input->keyboard) { | ||||||
|         wl_keyboard_destroy(input->keyboard); |         wl_keyboard_destroy(input->keyboard); | ||||||
|         input->keyboard = NULL; |         input->keyboard = NULL; | ||||||
|  |  | ||||||
|         SDL_PrivateKeyboardRemoved(input->keyboard_id); |         SDL_RemoveKeyboard(input->keyboard_id); | ||||||
|         input->keyboard_id = 0; |         input->keyboard_id = 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -2709,7 +2709,7 @@ static void tablet_tool_handle_motion(void *data, struct zwp_tablet_tool_v2 *too | |||||||
|             input->current_pen.update_window = window; |             input->current_pen.update_window = window; | ||||||
|         } else { |         } else { | ||||||
|             /* Plain mouse event */ |             /* Plain mouse event */ | ||||||
|             SDL_SendMouseMotion(0, window->sdlwindow, 0, 0, sx, sy); |             SDL_SendMouseMotion(0, window->sdlwindow, 0, SDL_FALSE, sx, sy); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -3178,7 +3178,7 @@ static void relative_pointer_handle_relative_motion(void *data, | |||||||
|     dy_unaccel = wl_fixed_to_double(dy_unaccel_w); |     dy_unaccel = wl_fixed_to_double(dy_unaccel_w); | ||||||
|  |  | ||||||
|     if (input->pointer_focus && d->relative_mouse_mode) { |     if (input->pointer_focus && d->relative_mouse_mode) { | ||||||
|         SDL_SendMouseMotion(Wayland_GetEventTimestamp(timestamp), window->sdlwindow, input->pointer_id, 1, (float)dx_unaccel, (float)dy_unaccel); |         SDL_SendMouseMotion(Wayland_GetEventTimestamp(timestamp), window->sdlwindow, input->pointer_id, SDL_TRUE, (float)dx_unaccel, (float)dy_unaccel); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -293,6 +293,7 @@ static void WIN_CheckRawMouseButtons(Uint64 timestamp, HANDLE hDevice, ULONG raw | |||||||
|  |  | ||||||
| static void WIN_CheckAsyncMouseRelease(Uint64 timestamp, SDL_WindowData *data) | static void WIN_CheckAsyncMouseRelease(Uint64 timestamp, SDL_WindowData *data) | ||||||
| { | { | ||||||
|  |     SDL_MouseID mouseID = data->videodata->mouseID; | ||||||
|     Uint32 mouseFlags; |     Uint32 mouseFlags; | ||||||
|     SHORT keyState; |     SHORT keyState; | ||||||
|     SDL_bool swapButtons; |     SDL_bool swapButtons; | ||||||
| @@ -305,23 +306,23 @@ static void WIN_CheckAsyncMouseRelease(Uint64 timestamp, SDL_WindowData *data) | |||||||
|  |  | ||||||
|     keyState = GetAsyncKeyState(VK_LBUTTON); |     keyState = GetAsyncKeyState(VK_LBUTTON); | ||||||
|     if (!(keyState & 0x8000)) { |     if (!(keyState & 0x8000)) { | ||||||
|         WIN_CheckWParamMouseButton(timestamp, SDL_FALSE, mouseFlags, swapButtons, data, SDL_BUTTON_LEFT, 0); |         WIN_CheckWParamMouseButton(timestamp, SDL_FALSE, mouseFlags, swapButtons, data, SDL_BUTTON_LEFT, mouseID); | ||||||
|     } |     } | ||||||
|     keyState = GetAsyncKeyState(VK_RBUTTON); |     keyState = GetAsyncKeyState(VK_RBUTTON); | ||||||
|     if (!(keyState & 0x8000)) { |     if (!(keyState & 0x8000)) { | ||||||
|         WIN_CheckWParamMouseButton(timestamp, SDL_FALSE, mouseFlags, swapButtons, data, SDL_BUTTON_RIGHT, 0); |         WIN_CheckWParamMouseButton(timestamp, SDL_FALSE, mouseFlags, swapButtons, data, SDL_BUTTON_RIGHT, mouseID); | ||||||
|     } |     } | ||||||
|     keyState = GetAsyncKeyState(VK_MBUTTON); |     keyState = GetAsyncKeyState(VK_MBUTTON); | ||||||
|     if (!(keyState & 0x8000)) { |     if (!(keyState & 0x8000)) { | ||||||
|         WIN_CheckWParamMouseButton(timestamp, SDL_FALSE, mouseFlags, swapButtons, data, SDL_BUTTON_MIDDLE, 0); |         WIN_CheckWParamMouseButton(timestamp, SDL_FALSE, mouseFlags, swapButtons, data, SDL_BUTTON_MIDDLE, mouseID); | ||||||
|     } |     } | ||||||
|     keyState = GetAsyncKeyState(VK_XBUTTON1); |     keyState = GetAsyncKeyState(VK_XBUTTON1); | ||||||
|     if (!(keyState & 0x8000)) { |     if (!(keyState & 0x8000)) { | ||||||
|         WIN_CheckWParamMouseButton(timestamp, SDL_FALSE, mouseFlags, swapButtons, data, SDL_BUTTON_X1, 0); |         WIN_CheckWParamMouseButton(timestamp, SDL_FALSE, mouseFlags, swapButtons, data, SDL_BUTTON_X1, mouseID); | ||||||
|     } |     } | ||||||
|     keyState = GetAsyncKeyState(VK_XBUTTON2); |     keyState = GetAsyncKeyState(VK_XBUTTON2); | ||||||
|     if (!(keyState & 0x8000)) { |     if (!(keyState & 0x8000)) { | ||||||
|         WIN_CheckWParamMouseButton(timestamp, SDL_FALSE, mouseFlags, swapButtons, data, SDL_BUTTON_X2, 0); |         WIN_CheckWParamMouseButton(timestamp, SDL_FALSE, mouseFlags, swapButtons, data, SDL_BUTTON_X2, mouseID); | ||||||
|     } |     } | ||||||
|     data->mouse_button_flags = (WPARAM)-1; |     data->mouse_button_flags = (WPARAM)-1; | ||||||
| } | } | ||||||
| @@ -363,7 +364,7 @@ static void WIN_UpdateFocus(SDL_Window *window, SDL_bool expect_focus) | |||||||
|         if (!SDL_GetMouse()->relative_mode) { |         if (!SDL_GetMouse()->relative_mode) { | ||||||
|             GetCursorPos(&cursorPos); |             GetCursorPos(&cursorPos); | ||||||
|             ScreenToClient(hwnd, &cursorPos); |             ScreenToClient(hwnd, &cursorPos); | ||||||
|             SDL_SendMouseMotion(WIN_GetEventTimestamp(), window, 0, 0, (float)cursorPos.x, (float)cursorPos.y); |             SDL_SendMouseMotion(WIN_GetEventTimestamp(), window, data->videodata->mouseID, SDL_FALSE, (float)cursorPos.x, (float)cursorPos.y); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         WIN_CheckAsyncMouseRelease(WIN_GetEventTimestamp(), data); |         WIN_CheckAsyncMouseRelease(WIN_GetEventTimestamp(), data); | ||||||
| @@ -504,9 +505,9 @@ WIN_KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) { |     if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) { | ||||||
|         SDL_SendKeyboardKey(0, 0, SDL_PRESSED, scanCode); |         SDL_SendKeyboardKey(0, data->keyboardID, SDL_PRESSED, scanCode); | ||||||
|     } else { |     } else { | ||||||
|         SDL_SendKeyboardKey(0, 0, SDL_RELEASED, scanCode); |         SDL_SendKeyboardKey(0, data->keyboardID, SDL_RELEASED, scanCode); | ||||||
|  |  | ||||||
|         /* If the key was down prior to our hook being installed, allow the |         /* If the key was down prior to our hook being installed, allow the | ||||||
|            key up message to pass normally the first time. This ensures other |            key up message to pass normally the first time. This ensures other | ||||||
| @@ -534,7 +535,7 @@ static void WIN_HandleRawMouseInput(Uint64 timestamp, SDL_WindowData *data, HAND | |||||||
|  |  | ||||||
|     if ((rawmouse->usFlags & 0x01) == MOUSE_MOVE_RELATIVE) { |     if ((rawmouse->usFlags & 0x01) == MOUSE_MOVE_RELATIVE) { | ||||||
|         if (rawmouse->lLastX || rawmouse->lLastY) { |         if (rawmouse->lLastX || rawmouse->lLastY) { | ||||||
|             SDL_SendMouseMotion(timestamp, data->window, mouseID, 1, (float)rawmouse->lLastX, (float)rawmouse->lLastY); |             SDL_SendMouseMotion(timestamp, data->window, mouseID, SDL_TRUE, (float)rawmouse->lLastX, (float)rawmouse->lLastY); | ||||||
|         } |         } | ||||||
|     } else if (rawmouse->lLastX || rawmouse->lLastY) { |     } else if (rawmouse->lLastX || rawmouse->lLastY) { | ||||||
|         /* This is absolute motion, either using a tablet or mouse over RDP |         /* This is absolute motion, either using a tablet or mouse over RDP | ||||||
| @@ -591,7 +592,7 @@ static void WIN_HandleRawMouseInput(Uint64 timestamp, SDL_WindowData *data, HAND | |||||||
|                     const int MAX_RELATIVE_MOTION = (h / 6); |                     const int MAX_RELATIVE_MOTION = (h / 6); | ||||||
|                     if (SDL_abs(relX) < MAX_RELATIVE_MOTION && |                     if (SDL_abs(relX) < MAX_RELATIVE_MOTION && | ||||||
|                         SDL_abs(relY) < MAX_RELATIVE_MOTION) { |                         SDL_abs(relY) < MAX_RELATIVE_MOTION) { | ||||||
|                         SDL_SendMouseMotion(timestamp, data->window, mouseID, 1, (float)relX, (float)relY); |                         SDL_SendMouseMotion(timestamp, data->window, mouseID, SDL_TRUE, (float)relX, (float)relY); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @@ -601,7 +602,7 @@ static void WIN_HandleRawMouseInput(Uint64 timestamp, SDL_WindowData *data, HAND | |||||||
|                 SDL_abs(relY) > MAXIMUM_TABLET_RELATIVE_MOTION) { |                 SDL_abs(relY) > MAXIMUM_TABLET_RELATIVE_MOTION) { | ||||||
|                 /* Ignore this motion, probably a pen lift and drop */ |                 /* Ignore this motion, probably a pen lift and drop */ | ||||||
|             } else { |             } else { | ||||||
|                 SDL_SendMouseMotion(timestamp, data->window, mouseID, 1, (float)relX, (float)relY); |                 SDL_SendMouseMotion(timestamp, data->window, mouseID, SDL_TRUE, (float)relX, (float)relY); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -719,8 +720,9 @@ static SDL_bool HasDeviceID(Uint32 deviceID, Uint32 *list, int count) | |||||||
|     return SDL_FALSE; |     return SDL_FALSE; | ||||||
| } | } | ||||||
|  |  | ||||||
| void WIN_CheckKeyboardAndMouseHotplug(SDL_bool initial_check) | void WIN_CheckKeyboardAndMouseHotplug(SDL_VideoDevice *_this, SDL_bool initial_check) | ||||||
| { | { | ||||||
|  |     SDL_VideoData *data = _this->driverdata; | ||||||
|     PRAWINPUTDEVICELIST raw_devices = NULL; |     PRAWINPUTDEVICELIST raw_devices = NULL; | ||||||
|     UINT raw_device_count = 0; |     UINT raw_device_count = 0; | ||||||
|     int old_keyboard_count = 0; |     int old_keyboard_count = 0; | ||||||
| @@ -731,6 +733,7 @@ void WIN_CheckKeyboardAndMouseHotplug(SDL_bool initial_check) | |||||||
|     SDL_MouseID *old_mice = NULL; |     SDL_MouseID *old_mice = NULL; | ||||||
|     int new_mouse_count = 0; |     int new_mouse_count = 0; | ||||||
|     SDL_MouseID *new_mice = NULL; |     SDL_MouseID *new_mice = NULL; | ||||||
|  |     SDL_bool send_event = !initial_check; | ||||||
|  |  | ||||||
|     /* Check to see if anything has changed */ |     /* Check to see if anything has changed */ | ||||||
|     static Uint64 s_last_device_change; |     static Uint64 s_last_device_change; | ||||||
| @@ -792,28 +795,38 @@ void WIN_CheckKeyboardAndMouseHotplug(SDL_bool initial_check) | |||||||
|     old_keyboards = SDL_GetKeyboards(&old_keyboard_count); |     old_keyboards = SDL_GetKeyboards(&old_keyboard_count); | ||||||
|     for (int i = old_keyboard_count; i--;) { |     for (int i = old_keyboard_count; i--;) { | ||||||
|         if (!HasDeviceID(old_keyboards[i], new_keyboards, new_keyboard_count)) { |         if (!HasDeviceID(old_keyboards[i], new_keyboards, new_keyboard_count)) { | ||||||
|             SDL_PrivateKeyboardRemoved(old_keyboards[i]); |             SDL_RemoveKeyboard(old_keyboards[i]); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     for (int i = 0; i < new_keyboard_count; ++i) { |     for (int i = 0; i < new_keyboard_count; ++i) { | ||||||
|         if (!HasDeviceID(new_keyboards[i], old_keyboards, old_keyboard_count)) { |         if (!HasDeviceID(new_keyboards[i], old_keyboards, old_keyboard_count)) { | ||||||
|             SDL_PrivateKeyboardAdded(new_keyboards[i]); |             SDL_AddKeyboard(new_keyboards[i], send_event); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |     if (new_keyboard_count > 0) { | ||||||
|  |         data->keyboardID = new_keyboards[0]; | ||||||
|  |     } else { | ||||||
|  |         data->keyboardID = 0; | ||||||
|  |     } | ||||||
|     SDL_free(new_keyboards); |     SDL_free(new_keyboards); | ||||||
|     SDL_free(old_keyboards); |     SDL_free(old_keyboards); | ||||||
|  |  | ||||||
|     old_mice = SDL_GetMice(&old_mouse_count); |     old_mice = SDL_GetMice(&old_mouse_count); | ||||||
|     for (int i = old_mouse_count; i--;) { |     for (int i = old_mouse_count; i--;) { | ||||||
|         if (!HasDeviceID(old_mice[i], new_mice, new_mouse_count)) { |         if (!HasDeviceID(old_mice[i], new_mice, new_mouse_count)) { | ||||||
|             SDL_PrivateMouseRemoved(old_mice[i]); |             SDL_RemoveMouse(old_mice[i]); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     for (int i = 0; i < new_mouse_count; ++i) { |     for (int i = 0; i < new_mouse_count; ++i) { | ||||||
|         if (!HasDeviceID(new_mice[i], old_mice, old_mouse_count)) { |         if (!HasDeviceID(new_mice[i], old_mice, old_mouse_count)) { | ||||||
|             SDL_PrivateMouseAdded(new_mice[i]); |             SDL_AddMouse(new_mice[i], send_event); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |     if (new_mouse_count > 0) { | ||||||
|  |         data->mouseID = new_mice[0]; | ||||||
|  |     } else { | ||||||
|  |         data->mouseID = 0; | ||||||
|  |     } | ||||||
|     SDL_free(new_mice); |     SDL_free(new_mice); | ||||||
|     SDL_free(old_mice); |     SDL_free(old_mice); | ||||||
| } | } | ||||||
| @@ -928,7 +941,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara | |||||||
|             /* Only generate mouse events for real mouse */ |             /* Only generate mouse events for real mouse */ | ||||||
|             if (GetMouseMessageSource((ULONG)GetMessageExtraInfo()) != SDL_MOUSE_EVENT_SOURCE_TOUCH && |             if (GetMouseMessageSource((ULONG)GetMessageExtraInfo()) != SDL_MOUSE_EVENT_SOURCE_TOUCH && | ||||||
|                 lParam != data->last_pointer_update) { |                 lParam != data->last_pointer_update) { | ||||||
|                 SDL_SendMouseMotion(WIN_GetEventTimestamp(), data->window, 0, 0, (float)GET_X_LPARAM(lParam), (float)GET_Y_LPARAM(lParam)); |                 SDL_SendMouseMotion(WIN_GetEventTimestamp(), data->window, data->videodata->mouseID, SDL_FALSE, (float)GET_X_LPARAM(lParam), (float)GET_Y_LPARAM(lParam)); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } break; |     } break; | ||||||
| @@ -950,7 +963,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara | |||||||
|         if (!mouse->relative_mode || mouse->relative_mode_warp) { |         if (!mouse->relative_mode || mouse->relative_mode_warp) { | ||||||
|             if (GetMouseMessageSource((ULONG)GetMessageExtraInfo()) != SDL_MOUSE_EVENT_SOURCE_TOUCH && |             if (GetMouseMessageSource((ULONG)GetMessageExtraInfo()) != SDL_MOUSE_EVENT_SOURCE_TOUCH && | ||||||
|                 lParam != data->last_pointer_update) { |                 lParam != data->last_pointer_update) { | ||||||
|                 WIN_CheckWParamMouseButtons(WIN_GetEventTimestamp(), wParam, data, 0); |                 WIN_CheckWParamMouseButtons(WIN_GetEventTimestamp(), wParam, data, data->videodata->mouseID); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } break; |     } break; | ||||||
| @@ -988,9 +1001,9 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara | |||||||
|         short amount = GET_WHEEL_DELTA_WPARAM(wParam); |         short amount = GET_WHEEL_DELTA_WPARAM(wParam); | ||||||
|         float fAmount = (float)amount / WHEEL_DELTA; |         float fAmount = (float)amount / WHEEL_DELTA; | ||||||
|         if (msg == WM_MOUSEWHEEL) { |         if (msg == WM_MOUSEWHEEL) { | ||||||
|             SDL_SendMouseWheel(WIN_GetEventTimestamp(), data->window, 0, 0.0f, fAmount, SDL_MOUSEWHEEL_NORMAL); |             SDL_SendMouseWheel(WIN_GetEventTimestamp(), data->window, data->videodata->mouseID, 0.0f, fAmount, SDL_MOUSEWHEEL_NORMAL); | ||||||
|         } else { |         } else { | ||||||
|             SDL_SendMouseWheel(WIN_GetEventTimestamp(), data->window, 0, fAmount, 0.0f, SDL_MOUSEWHEEL_NORMAL); |             SDL_SendMouseWheel(WIN_GetEventTimestamp(), data->window, data->videodata->mouseID, fAmount, 0.0f, SDL_MOUSEWHEEL_NORMAL); | ||||||
|         } |         } | ||||||
|     } break; |     } break; | ||||||
|  |  | ||||||
| @@ -1003,13 +1016,13 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara | |||||||
|                 ScreenToClient(hwnd, &cursorPos); |                 ScreenToClient(hwnd, &cursorPos); | ||||||
|                 mouse = SDL_GetMouse(); |                 mouse = SDL_GetMouse(); | ||||||
|                 if (!mouse->was_touch_mouse_events) { /* we're not a touch handler causing a mouse leave? */ |                 if (!mouse->was_touch_mouse_events) { /* we're not a touch handler causing a mouse leave? */ | ||||||
|                     SDL_SendMouseMotion(WIN_GetEventTimestamp(), data->window, 0, 0, (float)cursorPos.x, (float)cursorPos.y); |                     SDL_SendMouseMotion(WIN_GetEventTimestamp(), data->window, data->videodata->mouseID, SDL_FALSE, (float)cursorPos.x, (float)cursorPos.y); | ||||||
|                 } else {                                       /* touch handling? */ |                 } else {                                       /* touch handling? */ | ||||||
|                     mouse->was_touch_mouse_events = SDL_FALSE; /* not anymore */ |                     mouse->was_touch_mouse_events = SDL_FALSE; /* not anymore */ | ||||||
|                     if (mouse->touch_mouse_events) {           /* convert touch to mouse events */ |                     if (mouse->touch_mouse_events) {           /* convert touch to mouse events */ | ||||||
|                         SDL_SendMouseMotion(WIN_GetEventTimestamp(), data->window, SDL_TOUCH_MOUSEID, 0, (float)cursorPos.x, (float)cursorPos.y); |                         SDL_SendMouseMotion(WIN_GetEventTimestamp(), data->window, SDL_TOUCH_MOUSEID, SDL_FALSE, (float)cursorPos.x, (float)cursorPos.y); | ||||||
|                     } else { /* normal handling */ |                     } else { /* normal handling */ | ||||||
|                         SDL_SendMouseMotion(WIN_GetEventTimestamp(), data->window, 0, 0, (float)cursorPos.x, (float)cursorPos.y); |                         SDL_SendMouseMotion(WIN_GetEventTimestamp(), data->window, data->videodata->mouseID, SDL_FALSE, (float)cursorPos.x, (float)cursorPos.y); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| @@ -1042,7 +1055,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (code != SDL_SCANCODE_UNKNOWN) { |         if (code != SDL_SCANCODE_UNKNOWN) { | ||||||
|             SDL_SendKeyboardKey(WIN_GetEventTimestamp(), 0, SDL_PRESSED, code); |             SDL_SendKeyboardKey(WIN_GetEventTimestamp(), data->videodata->keyboardID, SDL_PRESSED, code); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1058,9 +1071,9 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara | |||||||
|         if (code != SDL_SCANCODE_UNKNOWN) { |         if (code != SDL_SCANCODE_UNKNOWN) { | ||||||
|             if (code == SDL_SCANCODE_PRINTSCREEN && |             if (code == SDL_SCANCODE_PRINTSCREEN && | ||||||
|                 keyboardState[code] == SDL_RELEASED) { |                 keyboardState[code] == SDL_RELEASED) { | ||||||
|                 SDL_SendKeyboardKey(WIN_GetEventTimestamp(), 0, SDL_PRESSED, code); |                 SDL_SendKeyboardKey(WIN_GetEventTimestamp(), data->videodata->keyboardID, SDL_PRESSED, code); | ||||||
|             } |             } | ||||||
|             SDL_SendKeyboardKey(WIN_GetEventTimestamp(), 0, SDL_RELEASED, code); |             SDL_SendKeyboardKey(WIN_GetEventTimestamp(), data->videodata->keyboardID, SDL_RELEASED, code); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|         returnCode = 0; |         returnCode = 0; | ||||||
| @@ -1777,9 +1790,9 @@ static void WIN_UpdateMouseCapture() | |||||||
|  |  | ||||||
|             if (GetCursorPos(&cursorPos) && ScreenToClient(data->hwnd, &cursorPos)) { |             if (GetCursorPos(&cursorPos) && ScreenToClient(data->hwnd, &cursorPos)) { | ||||||
|                 SDL_bool swapButtons = GetSystemMetrics(SM_SWAPBUTTON) != 0; |                 SDL_bool swapButtons = GetSystemMetrics(SM_SWAPBUTTON) != 0; | ||||||
|                 SDL_MouseID mouseID = SDL_GetMouse()->mouseID; |                 SDL_MouseID mouseID = data->videodata->mouseID; | ||||||
|  |  | ||||||
|                 SDL_SendMouseMotion(WIN_GetEventTimestamp(), data->window, mouseID, 0, (float)cursorPos.x, (float)cursorPos.y); |                 SDL_SendMouseMotion(WIN_GetEventTimestamp(), data->window, mouseID, SDL_FALSE, (float)cursorPos.x, (float)cursorPos.y); | ||||||
|                 SDL_SendMouseButton(WIN_GetEventTimestamp(), data->window, mouseID, GetAsyncKeyState(VK_LBUTTON) & 0x8000 ? SDL_PRESSED : SDL_RELEASED, |                 SDL_SendMouseButton(WIN_GetEventTimestamp(), data->window, mouseID, GetAsyncKeyState(VK_LBUTTON) & 0x8000 ? SDL_PRESSED : SDL_RELEASED, | ||||||
|                                     !swapButtons ? SDL_BUTTON_LEFT : SDL_BUTTON_RIGHT); |                                     !swapButtons ? SDL_BUTTON_LEFT : SDL_BUTTON_RIGHT); | ||||||
|                 SDL_SendMouseButton(WIN_GetEventTimestamp(), data->window, mouseID, GetAsyncKeyState(VK_RBUTTON) & 0x8000 ? SDL_PRESSED : SDL_RELEASED, |                 SDL_SendMouseButton(WIN_GetEventTimestamp(), data->window, mouseID, GetAsyncKeyState(VK_RBUTTON) & 0x8000 ? SDL_PRESSED : SDL_RELEASED, | ||||||
| @@ -1927,10 +1940,10 @@ void WIN_PumpEvents(SDL_VideoDevice *_this) | |||||||
|        and if we think a key is pressed when Windows doesn't, unstick it in SDL's state. */ |        and if we think a key is pressed when Windows doesn't, unstick it in SDL's state. */ | ||||||
|     keystate = SDL_GetKeyboardState(NULL); |     keystate = SDL_GetKeyboardState(NULL); | ||||||
|     if ((keystate[SDL_SCANCODE_LSHIFT] == SDL_PRESSED) && !(GetKeyState(VK_LSHIFT) & 0x8000)) { |     if ((keystate[SDL_SCANCODE_LSHIFT] == SDL_PRESSED) && !(GetKeyState(VK_LSHIFT) & 0x8000)) { | ||||||
|         SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_LSHIFT); |         SDL_SendKeyboardKey(0, _this->driverdata->keyboardID, SDL_RELEASED, SDL_SCANCODE_LSHIFT); | ||||||
|     } |     } | ||||||
|     if ((keystate[SDL_SCANCODE_RSHIFT] == SDL_PRESSED) && !(GetKeyState(VK_RSHIFT) & 0x8000)) { |     if ((keystate[SDL_SCANCODE_RSHIFT] == SDL_PRESSED) && !(GetKeyState(VK_RSHIFT) & 0x8000)) { | ||||||
|         SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_RSHIFT); |         SDL_SendKeyboardKey(0, _this->driverdata->keyboardID, SDL_RELEASED, SDL_SCANCODE_RSHIFT); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* The Windows key state gets lost when using Windows+Space or Windows+G shortcuts and |     /* The Windows key state gets lost when using Windows+Space or Windows+G shortcuts and | ||||||
| @@ -1939,10 +1952,10 @@ void WIN_PumpEvents(SDL_VideoDevice *_this) | |||||||
|     focusWindow = SDL_GetKeyboardFocus(); |     focusWindow = SDL_GetKeyboardFocus(); | ||||||
|     if (!focusWindow || !(focusWindow->flags & SDL_WINDOW_KEYBOARD_GRABBED)) { |     if (!focusWindow || !(focusWindow->flags & SDL_WINDOW_KEYBOARD_GRABBED)) { | ||||||
|         if ((keystate[SDL_SCANCODE_LGUI] == SDL_PRESSED) && !(GetKeyState(VK_LWIN) & 0x8000)) { |         if ((keystate[SDL_SCANCODE_LGUI] == SDL_PRESSED) && !(GetKeyState(VK_LWIN) & 0x8000)) { | ||||||
|             SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_LGUI); |             SDL_SendKeyboardKey(0, _this->driverdata->keyboardID, SDL_RELEASED, SDL_SCANCODE_LGUI); | ||||||
|         } |         } | ||||||
|         if ((keystate[SDL_SCANCODE_RGUI] == SDL_PRESSED) && !(GetKeyState(VK_RWIN) & 0x8000)) { |         if ((keystate[SDL_SCANCODE_RGUI] == SDL_PRESSED) && !(GetKeyState(VK_RWIN) & 0x8000)) { | ||||||
|             SDL_SendKeyboardKey(0, 0, SDL_RELEASED, SDL_SCANCODE_RGUI); |             SDL_SendKeyboardKey(0, _this->driverdata->keyboardID, SDL_RELEASED, SDL_SCANCODE_RGUI); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1952,7 +1965,7 @@ void WIN_PumpEvents(SDL_VideoDevice *_this) | |||||||
|     /* Update mouse capture */ |     /* Update mouse capture */ | ||||||
|     WIN_UpdateMouseCapture(); |     WIN_UpdateMouseCapture(); | ||||||
|  |  | ||||||
|     WIN_CheckKeyboardAndMouseHotplug(SDL_FALSE); |     WIN_CheckKeyboardAndMouseHotplug(_this, SDL_FALSE); | ||||||
|  |  | ||||||
| #endif /*!defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)*/ | #endif /*!defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)*/ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -31,7 +31,7 @@ extern LRESULT CALLBACK WIN_KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lP | |||||||
| extern LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, | extern LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, | ||||||
|                                        LPARAM lParam); |                                        LPARAM lParam); | ||||||
| extern void WIN_PollRawMouseInput(void); | extern void WIN_PollRawMouseInput(void); | ||||||
| extern void WIN_CheckKeyboardAndMouseHotplug(SDL_bool initial_check); | extern void WIN_CheckKeyboardAndMouseHotplug(SDL_VideoDevice *_this, SDL_bool initial_check); | ||||||
| extern void WIN_PumpEvents(SDL_VideoDevice *_this); | extern void WIN_PumpEvents(SDL_VideoDevice *_this); | ||||||
| extern void WIN_SendWakeupEvent(SDL_VideoDevice *_this, SDL_Window *window); | extern void WIN_SendWakeupEvent(SDL_VideoDevice *_this, SDL_Window *window); | ||||||
| extern int WIN_WaitEventTimeout(SDL_VideoDevice *_this, Sint64 timeoutNS); | extern int WIN_WaitEventTimeout(SDL_VideoDevice *_this, Sint64 timeoutNS); | ||||||
|   | |||||||
| @@ -493,7 +493,7 @@ static int WIN_WarpMouse(SDL_Window *window, float x, float y) | |||||||
|     WIN_SetCursorPos(pt.x, pt.y); |     WIN_SetCursorPos(pt.x, pt.y); | ||||||
|  |  | ||||||
|     /* Send the exact mouse motion associated with this warp */ |     /* Send the exact mouse motion associated with this warp */ | ||||||
|     SDL_SendMouseMotion(0, window, SDL_GetMouse()->mouseID, 0, x, y); |     SDL_SendMouseMotion(0, window, data->videodata->mouseID, SDL_FALSE, x, y); | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -457,7 +457,7 @@ int WIN_VideoInit(SDL_VideoDevice *_this) | |||||||
|     WIN_InitKeyboard(_this); |     WIN_InitKeyboard(_this); | ||||||
|     WIN_InitMouse(_this); |     WIN_InitMouse(_this); | ||||||
|     WIN_InitDeviceNotification(); |     WIN_InitDeviceNotification(); | ||||||
|     WIN_CheckKeyboardAndMouseHotplug(SDL_TRUE); |     WIN_CheckKeyboardAndMouseHotplug(_this, SDL_TRUE); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     SDL_AddHintCallback(SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP, UpdateWindowsEnableMessageLoop, NULL); |     SDL_AddHintCallback(SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP, UpdateWindowsEnableMessageLoop, NULL); | ||||||
|   | |||||||
| @@ -373,6 +373,9 @@ struct SDL_VideoData | |||||||
| { | { | ||||||
|     int render; |     int render; | ||||||
|  |  | ||||||
|  |     SDL_KeyboardID keyboardID; | ||||||
|  |     SDL_MouseID mouseID; | ||||||
|  |  | ||||||
|     DWORD clipboard_count; |     DWORD clipboard_count; | ||||||
|  |  | ||||||
| #if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) /* Xbox doesn't support user32/shcore*/ | #if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) /* Xbox doesn't support user32/shcore*/ | ||||||
|   | |||||||
| @@ -24,6 +24,9 @@ extern "C" { | |||||||
| #include "../SDL_sysvideo.h" | #include "../SDL_sysvideo.h" | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #define WINRT_KEYBOARD_ID    1 | ||||||
|  | #define WINRT_MOUSE_ID       1 | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Internal-use, C-style functions: |  * Internal-use, C-style functions: | ||||||
|  */ |  */ | ||||||
|   | |||||||
| @@ -77,7 +77,7 @@ void WINRT_ProcessAcceleratorKeyActivated(Windows::UI::Core::AcceleratorKeyEvent | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     code = WINRT_TranslateKeycode(args->VirtualKey, args->KeyStatus); |     code = WINRT_TranslateKeycode(args->VirtualKey, args->KeyStatus); | ||||||
|     SDL_SendKeyboardKey(0, 0, state, code); |     SDL_SendKeyboardKey(0, WINRT_KEYBOARD_ID, state, code); | ||||||
| } | } | ||||||
|  |  | ||||||
| void WINRT_ProcessCharacterReceivedEvent(SDL_Window *window, Windows::UI::Core::CharacterReceivedEventArgs ^ args) | void WINRT_ProcessCharacterReceivedEvent(SDL_Window *window, Windows::UI::Core::CharacterReceivedEventArgs ^ args) | ||||||
|   | |||||||
| @@ -220,7 +220,7 @@ void WINRT_ProcessPointerPressedEvent(SDL_Window *window, Windows::UI::Input::Po | |||||||
|         Uint8 button, pressed; |         Uint8 button, pressed; | ||||||
|         WINRT_GetSDLButtonForPointerPoint(pointerPoint, &button, &pressed); |         WINRT_GetSDLButtonForPointerPoint(pointerPoint, &button, &pressed); | ||||||
|         SDL_assert(pressed == 1); |         SDL_assert(pressed == 1); | ||||||
|         SDL_SendMouseButton(0, window, 0, SDL_PRESSED, button); |         SDL_SendMouseButton(0, window, WINRT_MOUSE_ID, SDL_PRESSED, button); | ||||||
|     } else { |     } else { | ||||||
|         Windows::Foundation::Point normalizedPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position, NormalizeZeroToOne); |         Windows::Foundation::Point normalizedPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position, NormalizeZeroToOne); | ||||||
|         Windows::Foundation::Point windowPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position, TransformToSDLWindowSize); |         Windows::Foundation::Point windowPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position, TransformToSDLWindowSize); | ||||||
| @@ -249,10 +249,10 @@ void WINRT_ProcessPointerMovedEvent(SDL_Window *window, Windows::UI::Input::Poin | |||||||
|         /* For some odd reason Moved events are used for multiple mouse buttons */ |         /* For some odd reason Moved events are used for multiple mouse buttons */ | ||||||
|         Uint8 button, pressed; |         Uint8 button, pressed; | ||||||
|         if (WINRT_GetSDLButtonForPointerPoint(pointerPoint, &button, &pressed)) { |         if (WINRT_GetSDLButtonForPointerPoint(pointerPoint, &button, &pressed)) { | ||||||
|             SDL_SendMouseButton(0, window, 0, pressed, button); |             SDL_SendMouseButton(0, window, WINRT_MOUSE_ID, pressed, button); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         SDL_SendMouseMotion(0, window, 0, 0, windowPoint.X, windowPoint.Y); |         SDL_SendMouseMotion(0, window, WINRT_MOUSE_ID, SDL_FALSE, windowPoint.X, windowPoint.Y); | ||||||
|     } else { |     } else { | ||||||
|         SDL_SendTouchMotion(0, |         SDL_SendTouchMotion(0, | ||||||
|             WINRT_TouchID, |             WINRT_TouchID, | ||||||
| @@ -274,7 +274,7 @@ void WINRT_ProcessPointerReleasedEvent(SDL_Window *window, Windows::UI::Input::P | |||||||
|         Uint8 button, pressed; |         Uint8 button, pressed; | ||||||
|         WINRT_GetSDLButtonForPointerPoint(pointerPoint, &button, &pressed); |         WINRT_GetSDLButtonForPointerPoint(pointerPoint, &button, &pressed); | ||||||
|         SDL_assert(pressed == 0); |         SDL_assert(pressed == 0); | ||||||
|         SDL_SendMouseButton(0, window, 0, SDL_RELEASED, button); |         SDL_SendMouseButton(0, window, WINRT_MOUSE_ID, SDL_RELEASED, button); | ||||||
|     } else { |     } else { | ||||||
|         Windows::Foundation::Point normalizedPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position, NormalizeZeroToOne); |         Windows::Foundation::Point normalizedPoint = WINRT_TransformCursorPosition(window, pointerPoint->Position, NormalizeZeroToOne); | ||||||
|  |  | ||||||
| @@ -318,7 +318,7 @@ void WINRT_ProcessPointerWheelChangedEvent(SDL_Window *window, Windows::UI::Inpu | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     float motion = (float)pointerPoint->Properties->MouseWheelDelta / WHEEL_DELTA; |     float motion = (float)pointerPoint->Properties->MouseWheelDelta / WHEEL_DELTA; | ||||||
|     SDL_SendMouseWheel(0, window, 0, 0, (float)motion, SDL_MOUSEWHEEL_NORMAL); |     SDL_SendMouseWheel(0, window, WINRT_MOUSE_ID, 0.0f, motion, SDL_MOUSEWHEEL_NORMAL); | ||||||
| } | } | ||||||
|  |  | ||||||
| void WINRT_ProcessMouseMovedEvent(SDL_Window *window, Windows::Devices::Input::MouseEventArgs ^ args) | void WINRT_ProcessMouseMovedEvent(SDL_Window *window, Windows::Devices::Input::MouseEventArgs ^ args) | ||||||
| @@ -383,12 +383,7 @@ void WINRT_ProcessMouseMovedEvent(SDL_Window *window, Windows::Devices::Input::M | |||||||
|     // |     // | ||||||
|     const Windows::Foundation::Point mouseDeltaInDIPs((float)args->MouseDelta.X, (float)args->MouseDelta.Y); |     const Windows::Foundation::Point mouseDeltaInDIPs((float)args->MouseDelta.X, (float)args->MouseDelta.Y); | ||||||
|     const Windows::Foundation::Point mouseDeltaInSDLWindowCoords = WINRT_TransformCursorPosition(window, mouseDeltaInDIPs, TransformToSDLWindowSize); |     const Windows::Foundation::Point mouseDeltaInSDLWindowCoords = WINRT_TransformCursorPosition(window, mouseDeltaInDIPs, TransformToSDLWindowSize); | ||||||
|     SDL_SendMouseMotion(0, |     SDL_SendMouseMotion(0, window, WINRT_MOUSE_ID, SDL_TRUE, mouseDeltaInSDLWindowCoords.X, mouseDeltaInSDLWindowCoords.Y); | ||||||
|         window, |  | ||||||
|         0, |  | ||||||
|         1, |  | ||||||
|         mouseDeltaInSDLWindowCoords.X, |  | ||||||
|         mouseDeltaInSDLWindowCoords.Y); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| #endif // SDL_VIDEO_DRIVER_WINRT | #endif // SDL_VIDEO_DRIVER_WINRT | ||||||
|   | |||||||
| @@ -238,6 +238,11 @@ int WINRT_VideoInit(SDL_VideoDevice *_this) | |||||||
|         /* Initialize screensaver-disabling support */ |         /* Initialize screensaver-disabling support */ | ||||||
|         driverdata->displayRequest = WINRT_CreateDisplayRequest(_this); |         driverdata->displayRequest = WINRT_CreateDisplayRequest(_this); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /* Assume we have a mouse and keyboard */ | ||||||
|  |     SDL_AddKeyboard(WINRT_KEYBOARD_ID, SDL_FALSE); | ||||||
|  |     SDL_AddMouse(WINRT_MOUSE_ID, SDL_FALSE); | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -351,8 +351,8 @@ static void X11_HandleGenericEvent(SDL_VideoDevice *_this, XEvent *xev) | |||||||
|  |  | ||||||
| static unsigned X11_GetNumLockModifierMask(SDL_VideoDevice *_this) | static unsigned X11_GetNumLockModifierMask(SDL_VideoDevice *_this) | ||||||
| { | { | ||||||
|     SDL_VideoData *viddata = _this->driverdata; |     SDL_VideoData *videodata = _this->driverdata; | ||||||
|     Display *display = viddata->display; |     Display *display = videodata->display; | ||||||
|     unsigned num_mask = 0; |     unsigned num_mask = 0; | ||||||
|     int i, j; |     int i, j; | ||||||
|     XModifierKeymap *xmods; |     XModifierKeymap *xmods; | ||||||
| @@ -363,7 +363,7 @@ static unsigned X11_GetNumLockModifierMask(SDL_VideoDevice *_this) | |||||||
|     for (i = 3; i < 8; i++) { |     for (i = 3; i < 8; i++) { | ||||||
|         for (j = 0; j < n; j++) { |         for (j = 0; j < n; j++) { | ||||||
|             KeyCode kc = xmods->modifiermap[i * n + j]; |             KeyCode kc = xmods->modifiermap[i * n + j]; | ||||||
|             if (viddata->key_layout[kc] == SDL_SCANCODE_NUMLOCKCLEAR) { |             if (videodata->key_layout[kc] == SDL_SCANCODE_NUMLOCKCLEAR) { | ||||||
|                 num_mask = 1 << i; |                 num_mask = 1 << i; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
| @@ -376,8 +376,8 @@ static unsigned X11_GetNumLockModifierMask(SDL_VideoDevice *_this) | |||||||
|  |  | ||||||
| static unsigned X11_GetScrollLockModifierMask(SDL_VideoDevice *_this) | static unsigned X11_GetScrollLockModifierMask(SDL_VideoDevice *_this) | ||||||
| { | { | ||||||
|     SDL_VideoData *viddata = _this->driverdata; |     SDL_VideoData *videodata = _this->driverdata; | ||||||
|     Display *display = viddata->display; |     Display *display = videodata->display; | ||||||
|     unsigned num_mask = 0; |     unsigned num_mask = 0; | ||||||
|     int i, j; |     int i, j; | ||||||
|     XModifierKeymap *xmods; |     XModifierKeymap *xmods; | ||||||
| @@ -388,7 +388,7 @@ static unsigned X11_GetScrollLockModifierMask(SDL_VideoDevice *_this) | |||||||
|     for (i = 3; i < 8; i++) { |     for (i = 3; i < 8; i++) { | ||||||
|         for (j = 0; j < n; j++) { |         for (j = 0; j < n; j++) { | ||||||
|             KeyCode kc = xmods->modifiermap[i * n + j]; |             KeyCode kc = xmods->modifiermap[i * n + j]; | ||||||
|             if (viddata->key_layout[kc] == SDL_SCANCODE_SCROLLLOCK) { |             if (videodata->key_layout[kc] == SDL_SCANCODE_SCROLLLOCK) { | ||||||
|                 num_mask = 1 << i; |                 num_mask = 1 << i; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
| @@ -401,8 +401,8 @@ static unsigned X11_GetScrollLockModifierMask(SDL_VideoDevice *_this) | |||||||
|  |  | ||||||
| void X11_ReconcileKeyboardState(SDL_VideoDevice *_this) | void X11_ReconcileKeyboardState(SDL_VideoDevice *_this) | ||||||
| { | { | ||||||
|     SDL_VideoData *viddata = _this->driverdata; |     SDL_VideoData *videodata = _this->driverdata; | ||||||
|     Display *display = viddata->display; |     Display *display = videodata->display; | ||||||
|     char keys[32]; |     char keys[32]; | ||||||
|     int keycode; |     int keycode; | ||||||
|     Window junk_window; |     Window junk_window; | ||||||
| @@ -420,8 +420,8 @@ void X11_ReconcileKeyboardState(SDL_VideoDevice *_this) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     keyboardState = SDL_GetKeyboardState(0); |     keyboardState = SDL_GetKeyboardState(0); | ||||||
|     for (keycode = 0; keycode < SDL_arraysize(viddata->key_layout); ++keycode) { |     for (keycode = 0; keycode < SDL_arraysize(videodata->key_layout); ++keycode) { | ||||||
|         SDL_Scancode scancode = viddata->key_layout[keycode]; |         SDL_Scancode scancode = videodata->key_layout[keycode]; | ||||||
|         SDL_bool x11KeyPressed = (keys[keycode / 8] & (1 << (keycode % 8))) != 0; |         SDL_bool x11KeyPressed = (keys[keycode / 8] & (1 << (keycode % 8))) != 0; | ||||||
|         SDL_bool sdlKeyPressed = keyboardState[scancode] == SDL_PRESSED; |         SDL_bool sdlKeyPressed = keyboardState[scancode] == SDL_PRESSED; | ||||||
|  |  | ||||||
| @@ -437,13 +437,13 @@ void X11_ReconcileKeyboardState(SDL_VideoDevice *_this) | |||||||
|             case SDLK_LGUI: |             case SDLK_LGUI: | ||||||
|             case SDLK_RGUI: |             case SDLK_RGUI: | ||||||
|             case SDLK_MODE: |             case SDLK_MODE: | ||||||
|                 SDL_SendKeyboardKey(0, 0, SDL_PRESSED, scancode); |                 SDL_SendKeyboardKey(0, videodata->keyboardID, SDL_PRESSED, scancode); | ||||||
|                 break; |                 break; | ||||||
|             default: |             default: | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|         } else if (!x11KeyPressed && sdlKeyPressed) { |         } else if (!x11KeyPressed && sdlKeyPressed) { | ||||||
|             SDL_SendKeyboardKey(0, 0, SDL_RELEASED, scancode); |             SDL_SendKeyboardKey(0, videodata->keyboardID, SDL_RELEASED, scancode); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -508,9 +508,9 @@ static void X11_DispatchUnmapNotify(SDL_WindowData *data) | |||||||
|  |  | ||||||
| static void DispatchWindowMove(SDL_VideoDevice *_this, const SDL_WindowData *data, const SDL_Point *point) | static void DispatchWindowMove(SDL_VideoDevice *_this, const SDL_WindowData *data, const SDL_Point *point) | ||||||
| { | { | ||||||
|     SDL_VideoData *viddata = _this->driverdata; |     SDL_VideoData *videodata = _this->driverdata; | ||||||
|     SDL_Window *window = data->window; |     SDL_Window *window = data->window; | ||||||
|     Display *display = viddata->display; |     Display *display = videodata->display; | ||||||
|     XEvent evt; |     XEvent evt; | ||||||
|  |  | ||||||
|     /* !!! FIXME: we need to regrab this if necessary when the drag is done. */ |     /* !!! FIXME: we need to regrab this if necessary when the drag is done. */ | ||||||
| @@ -539,9 +539,9 @@ static void ScheduleWindowMove(SDL_VideoDevice *_this, SDL_WindowData *data, con | |||||||
|  |  | ||||||
| static void InitiateWindowResize(SDL_VideoDevice *_this, const SDL_WindowData *data, const SDL_Point *point, int direction) | static void InitiateWindowResize(SDL_VideoDevice *_this, const SDL_WindowData *data, const SDL_Point *point, int direction) | ||||||
| { | { | ||||||
|     SDL_VideoData *viddata = _this->driverdata; |     SDL_VideoData *videodata = _this->driverdata; | ||||||
|     SDL_Window *window = data->window; |     SDL_Window *window = data->window; | ||||||
|     Display *display = viddata->display; |     Display *display = videodata->display; | ||||||
|     XEvent evt; |     XEvent evt; | ||||||
|  |  | ||||||
|     if (direction < _NET_WM_MOVERESIZE_SIZE_TOPLEFT || direction > _NET_WM_MOVERESIZE_SIZE_LEFT) { |     if (direction < _NET_WM_MOVERESIZE_SIZE_TOPLEFT || direction > _NET_WM_MOVERESIZE_SIZE_LEFT) { | ||||||
| @@ -842,7 +842,7 @@ void X11_HandleButtonPress(SDL_VideoDevice *_this, SDL_WindowData *windowdata, i | |||||||
|     printf("window %p: ButtonPress (X11 button = %d)\n", window, button); |     printf("window %p: ButtonPress (X11 button = %d)\n", window, button); | ||||||
| #endif | #endif | ||||||
|     if (X11_IsWheelEvent(display, button, &xticks, &yticks)) { |     if (X11_IsWheelEvent(display, button, &xticks, &yticks)) { | ||||||
|         SDL_SendMouseWheel(0, window, 0, (float)-xticks, (float)yticks, SDL_MOUSEWHEEL_NORMAL); |         SDL_SendMouseWheel(0, window, videodata->mouseID, (float)-xticks, (float)yticks, SDL_MOUSEWHEEL_NORMAL); | ||||||
|     } else { |     } else { | ||||||
|         SDL_bool ignore_click = SDL_FALSE; |         SDL_bool ignore_click = SDL_FALSE; | ||||||
|         if (button == Button1) { |         if (button == Button1) { | ||||||
| @@ -863,7 +863,7 @@ void X11_HandleButtonPress(SDL_VideoDevice *_this, SDL_WindowData *windowdata, i | |||||||
|             windowdata->last_focus_event_time = 0; |             windowdata->last_focus_event_time = 0; | ||||||
|         } |         } | ||||||
|         if (!ignore_click) { |         if (!ignore_click) { | ||||||
|             SDL_SendMouseButton(0, window, 0, SDL_PRESSED, button); |             SDL_SendMouseButton(0, window, videodata->mouseID, SDL_PRESSED, button); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     X11_UpdateUserTime(windowdata, time); |     X11_UpdateUserTime(windowdata, time); | ||||||
| @@ -884,7 +884,7 @@ void X11_HandleButtonRelease(SDL_VideoDevice *_this, SDL_WindowData *windowdata, | |||||||
|             /* see explanation at case ButtonPress */ |             /* see explanation at case ButtonPress */ | ||||||
|             button -= (8 - SDL_BUTTON_X1); |             button -= (8 - SDL_BUTTON_X1); | ||||||
|         } |         } | ||||||
|         SDL_SendMouseButton(0, window, 0, SDL_RELEASED, button); |         SDL_SendMouseButton(0, window, videodata->mouseID, SDL_RELEASED, button); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -957,9 +957,9 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent) | |||||||
|             videodata->filter_time = xevent->xkey.time; |             videodata->filter_time = xevent->xkey.time; | ||||||
|  |  | ||||||
|             if (orig_event_type == KeyPress) { |             if (orig_event_type == KeyPress) { | ||||||
|                 SDL_SendKeyboardKey(0, 0, SDL_PRESSED, scancode); |                 SDL_SendKeyboardKey(0, videodata->keyboardID, SDL_PRESSED, scancode); | ||||||
|             } else { |             } else { | ||||||
|                 SDL_SendKeyboardKey(0, 0, SDL_RELEASED, scancode); |                 SDL_SendKeyboardKey(0, videodata->keyboardID, SDL_RELEASED, scancode); | ||||||
|             } |             } | ||||||
| #endif | #endif | ||||||
|         } |         } | ||||||
| @@ -1106,7 +1106,7 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent) | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|         if (!mouse->relative_mode) { |         if (!mouse->relative_mode) { | ||||||
|             SDL_SendMouseMotion(0, data->window, 0, 0, (float)xevent->xcrossing.x, (float)xevent->xcrossing.y); |             SDL_SendMouseMotion(0, data->window, videodata->mouseID, SDL_FALSE, (float)xevent->xcrossing.x, (float)xevent->xcrossing.y); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         /* We ungrab in LeaveNotify, so we may need to grab again here */ |         /* We ungrab in LeaveNotify, so we may need to grab again here */ | ||||||
| @@ -1130,7 +1130,7 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent) | |||||||
|         } |         } | ||||||
| #endif | #endif | ||||||
|         if (!SDL_GetMouse()->relative_mode) { |         if (!SDL_GetMouse()->relative_mode) { | ||||||
|             SDL_SendMouseMotion(0, data->window, 0, 0, (float)xevent->xcrossing.x, (float)xevent->xcrossing.y); |             SDL_SendMouseMotion(0, data->window, videodata->mouseID, SDL_FALSE, (float)xevent->xcrossing.x, (float)xevent->xcrossing.y); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (xevent->xcrossing.mode != NotifyGrab && |         if (xevent->xcrossing.mode != NotifyGrab && | ||||||
| @@ -1262,7 +1262,7 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent) | |||||||
|             if (xevent->type == KeyPress) { |             if (xevent->type == KeyPress) { | ||||||
|                 /* Don't send the key if it looks like a duplicate of a filtered key sent by an IME */ |                 /* Don't send the key if it looks like a duplicate of a filtered key sent by an IME */ | ||||||
|                 if (xevent->xkey.keycode != videodata->filter_code || xevent->xkey.time != videodata->filter_time) { |                 if (xevent->xkey.keycode != videodata->filter_code || xevent->xkey.time != videodata->filter_time) { | ||||||
|                     SDL_SendKeyboardKey(0, 0, SDL_PRESSED, videodata->key_layout[keycode]); |                     SDL_SendKeyboardKey(0, videodata->keyboardID, SDL_PRESSED, videodata->key_layout[keycode]); | ||||||
|                 } |                 } | ||||||
|                 if (*text) { |                 if (*text) { | ||||||
|                     SDL_SendKeyboardText(text); |                     SDL_SendKeyboardText(text); | ||||||
| @@ -1272,7 +1272,7 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent) | |||||||
|                     /* We're about to get a repeated key down, ignore the key up */ |                     /* We're about to get a repeated key down, ignore the key up */ | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
|                 SDL_SendKeyboardKey(0, 0, SDL_RELEASED, videodata->key_layout[keycode]); |                 SDL_SendKeyboardKey(0, videodata->keyboardID, SDL_RELEASED, videodata->key_layout[keycode]); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -1525,7 +1525,7 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent) | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|             X11_ProcessHitTest(_this, data, (float)xevent->xmotion.x, (float)xevent->xmotion.y, SDL_FALSE); |             X11_ProcessHitTest(_this, data, (float)xevent->xmotion.x, (float)xevent->xmotion.y, SDL_FALSE); | ||||||
|             SDL_SendMouseMotion(0, data->window, 0, 0, (float)xevent->xmotion.x, (float)xevent->xmotion.y); |             SDL_SendMouseMotion(0, data->window, videodata->mouseID, SDL_FALSE, (float)xevent->xmotion.x, (float)xevent->xmotion.y); | ||||||
|         } |         } | ||||||
|     } break; |     } break; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -110,6 +110,9 @@ struct SDL_VideoData | |||||||
|     SDL_Point global_mouse_position; |     SDL_Point global_mouse_position; | ||||||
|     Uint32 global_mouse_buttons; |     Uint32 global_mouse_buttons; | ||||||
|  |  | ||||||
|  |     SDL_KeyboardID keyboardID; | ||||||
|  |     SDL_MouseID mouseID; | ||||||
|  |  | ||||||
|     SDL_XInput2DeviceInfo *mouse_device_info; |     SDL_XInput2DeviceInfo *mouse_device_info; | ||||||
|  |  | ||||||
|     int xrandr_event_base; |     int xrandr_event_base; | ||||||
|   | |||||||
| @@ -348,7 +348,7 @@ int X11_HandleXinput2Event(SDL_VideoDevice *_this, XGenericEventCookie *cookie) | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         SDL_SendMouseMotion(0, mouse->focus, mouse->mouseID, 1, (float)processed_coords[0], (float)processed_coords[1]); |         SDL_SendMouseMotion(0, mouse->focus, videodata->mouseID, SDL_TRUE, (float)processed_coords[0], (float)processed_coords[1]); | ||||||
|         devinfo->prev_coords[0] = coords[0]; |         devinfo->prev_coords[0] = coords[0]; | ||||||
|         devinfo->prev_coords[1] = coords[1]; |         devinfo->prev_coords[1] = coords[1]; | ||||||
|         return 1; |         return 1; | ||||||
| @@ -468,7 +468,7 @@ int X11_HandleXinput2Event(SDL_VideoDevice *_this, XGenericEventCookie *cookie) | |||||||
|                 SDL_Window *window = xinput2_get_sdlwindow(videodata, xev->event); |                 SDL_Window *window = xinput2_get_sdlwindow(videodata, xev->event); | ||||||
|                 if (window) { |                 if (window) { | ||||||
|                     X11_ProcessHitTest(_this, window->driverdata, (float)xev->event_x, (float)xev->event_y, SDL_FALSE); |                     X11_ProcessHitTest(_this, window->driverdata, (float)xev->event_x, (float)xev->event_y, SDL_FALSE); | ||||||
|                     SDL_SendMouseMotion(0, window, 0, 0, (float)xev->event_x, (float)xev->event_y); |                     SDL_SendMouseMotion(0, window, videodata->mouseID, SDL_FALSE, (float)xev->event_x, (float)xev->event_y); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -72,10 +72,10 @@ | |||||||
| #define SDL_SetMouseFocus         SDL_Mock_SetMouseFocus | #define SDL_SetMouseFocus         SDL_Mock_SetMouseFocus | ||||||
|  |  | ||||||
| /* Mock mouse API */ | /* Mock mouse API */ | ||||||
| static int SDL_SendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, int relative, float x, float y); | static int SDL_SendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, SDL_bool relative, float x, float y); | ||||||
| static int SDL_SendMouseButton(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button); | static int SDL_SendMouseButton(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button); | ||||||
| static SDL_Mouse *SDL_GetMouse(void); | static SDL_Mouse *SDL_GetMouse(void); | ||||||
| static SDL_bool SDL_MousePositionInWindow(SDL_Window *window, SDL_MouseID mouseID, float x, float y); | static SDL_bool SDL_MousePositionInWindow(SDL_Window *window, float x, float y); | ||||||
| static void SDL_SetMouseFocus(SDL_Window *window); | static void SDL_SetMouseFocus(SDL_Window *window); | ||||||
|  |  | ||||||
| /* Import SUT code with macro-renamed function names  */ | /* Import SUT code with macro-renamed function names  */ | ||||||
| @@ -88,7 +88,7 @@ static void SDL_SetMouseFocus(SDL_Window *window); | |||||||
| /* Mock implementations of Pen -> Mouse calls */ | /* Mock implementations of Pen -> Mouse calls */ | ||||||
| /* Not thread-safe! */ | /* Not thread-safe! */ | ||||||
|  |  | ||||||
| static SDL_bool SDL_MousePositionInWindow(SDL_Window *window, SDL_MouseID mouseID, float x, float y) | static SDL_bool SDL_MousePositionInWindow(SDL_Window *window, float x, float y) | ||||||
| { | { | ||||||
|     return SDL_TRUE; |     return SDL_TRUE; | ||||||
| } | } | ||||||
| @@ -98,7 +98,7 @@ static float _mouseemu_last_x = 0.0f; | |||||||
| static float _mouseemu_last_y = 0.0f; | static float _mouseemu_last_y = 0.0f; | ||||||
| static int _mouseemu_last_mouseid = 0; | static int _mouseemu_last_mouseid = 0; | ||||||
| static int _mouseemu_last_button = 0; | static int _mouseemu_last_button = 0; | ||||||
| static int _mouseemu_last_relative = 0; | static SDL_bool _mouseemu_last_relative = SDL_FALSE; | ||||||
| static int _mouseemu_last_focus = -1; | static int _mouseemu_last_focus = -1; | ||||||
|  |  | ||||||
| static int SDL_SendMouseButton(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button) | static int SDL_SendMouseButton(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button) | ||||||
| @@ -111,7 +111,7 @@ static int SDL_SendMouseButton(Uint64 timestamp, SDL_Window *window, SDL_MouseID | |||||||
|     return 1; |     return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int SDL_SendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, int relative, float x, float y) | static int SDL_SendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseID, SDL_bool relative, float x, float y) | ||||||
| { | { | ||||||
|     if (mouseID == SDL_PEN_MOUSEID) { |     if (mouseID == SDL_PEN_MOUSEID) { | ||||||
|         _mouseemu_last_event = SDL_EVENT_MOUSE_MOTION; |         _mouseemu_last_event = SDL_EVENT_MOUSE_MOTION; | ||||||
| @@ -127,9 +127,6 @@ static SDL_Mouse *SDL_GetMouse(void) | |||||||
| { | { | ||||||
|     static SDL_Mouse dummy_mouse; |     static SDL_Mouse dummy_mouse; | ||||||
|  |  | ||||||
|     dummy_mouse.focus = NULL; |  | ||||||
|     dummy_mouse.mouseID = 0; |  | ||||||
|  |  | ||||||
|     return &dummy_mouse; |     return &dummy_mouse; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Sam Lantinga
					Sam Lantinga