|
@@ -1219,14 +1219,23 @@ typedef enum sapp_mousebutton {
|
|
|
} sapp_mousebutton;
|
|
|
|
|
|
/*
|
|
|
- These are currently pressed modifier keys which are passed in the
|
|
|
- struct field sapp_event.modifiers.
|
|
|
+ These are currently pressed modifier keys (and mouse buttons) which are
|
|
|
+ passed in the event struct field sapp_event.modifiers.
|
|
|
+
|
|
|
+ NOTE: do not depend on the presence or absence of a modifier flag in
|
|
|
+ "their own" KEY_UP/DOWN and MOUSE_UP/DOWN events! For instance in the
|
|
|
+ X11 backend, SAPP_MODIFIER_CTRL will not be set in the KEY_DOWN event
|
|
|
+ of the Ctrl key, instead the KEY_UP event of the Ctrl-key will have
|
|
|
+ the SAPP_MODIFIER_CTRL bit set. Same for mouse buttons.
|
|
|
*/
|
|
|
enum {
|
|
|
- SAPP_MODIFIER_SHIFT = 0x1,
|
|
|
- SAPP_MODIFIER_CTRL = 0x2,
|
|
|
- SAPP_MODIFIER_ALT = 0x4,
|
|
|
- SAPP_MODIFIER_SUPER = 0x8
|
|
|
+ SAPP_MODIFIER_SHIFT = 0x1, // left or right shift key
|
|
|
+ SAPP_MODIFIER_CTRL = 0x2, // left or right control key
|
|
|
+ SAPP_MODIFIER_ALT = 0x4, // left or right alt key
|
|
|
+ SAPP_MODIFIER_SUPER = 0x8, // left or right 'super' key
|
|
|
+ SAPP_MODIFIER_LMB = 0x100, // left mouse button
|
|
|
+ SAPP_MODIFIER_RMB = 0x200, // right mouse button
|
|
|
+ SAPP_MODIFIER_MMB = 0x400, // middle mouse button
|
|
|
};
|
|
|
|
|
|
/*
|
|
@@ -1866,6 +1875,7 @@ typedef struct {
|
|
|
bool wants_show_keyboard;
|
|
|
bool wants_hide_keyboard;
|
|
|
bool mouse_lock_requested;
|
|
|
+ uint16_t mouse_buttons;
|
|
|
#if defined(SOKOL_WGPU)
|
|
|
_sapp_wgpu_t wgpu;
|
|
|
#endif
|
|
@@ -2836,7 +2846,9 @@ int main(int argc, char* argv[]) {
|
|
|
}
|
|
|
#endif /* SOKOL_NO_ENTRY */
|
|
|
|
|
|
-_SOKOL_PRIVATE uint32_t _sapp_macos_mod(NSEventModifierFlags f) {
|
|
|
+_SOKOL_PRIVATE uint32_t _sapp_macos_mods(NSEvent* ev) {
|
|
|
+ const NSEventModifierFlags f = ev.modifierFlags;
|
|
|
+ const NSUInteger b = NSEvent.pressedMouseButtons;
|
|
|
uint32_t m = 0;
|
|
|
if (f & NSEventModifierFlagShift) {
|
|
|
m |= SAPP_MODIFIER_SHIFT;
|
|
@@ -2850,6 +2862,15 @@ _SOKOL_PRIVATE uint32_t _sapp_macos_mod(NSEventModifierFlags f) {
|
|
|
if (f & NSEventModifierFlagCommand) {
|
|
|
m |= SAPP_MODIFIER_SUPER;
|
|
|
}
|
|
|
+ if (0 != (b & (1<<0))) {
|
|
|
+ m |= SAPP_MODIFIER_LMB;
|
|
|
+ }
|
|
|
+ if (0 != (b & (1<<1))) {
|
|
|
+ m |= SAPP_MODIFIER_RMB;
|
|
|
+ }
|
|
|
+ if (0 != (b & (1<<2))) {
|
|
|
+ m |= SAPP_MODIFIER_MMB;
|
|
|
+ }
|
|
|
return m;
|
|
|
}
|
|
|
|
|
@@ -3387,46 +3408,46 @@ _SOKOL_PRIVATE void _sapp_macos_poll_input_events() {
|
|
|
on Windows while SetCapture is active
|
|
|
*/
|
|
|
if (0 == _sapp.macos.mouse_buttons) {
|
|
|
- _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_ENTER, SAPP_MOUSEBUTTON_INVALID, _sapp_macos_mod(event.modifierFlags));
|
|
|
+ _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_ENTER, SAPP_MOUSEBUTTON_INVALID, _sapp_macos_mods(event));
|
|
|
}
|
|
|
}
|
|
|
- (void)mouseExited:(NSEvent*)event {
|
|
|
_sapp_macos_update_mouse(event);
|
|
|
if (0 == _sapp.macos.mouse_buttons) {
|
|
|
- _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_LEAVE, SAPP_MOUSEBUTTON_INVALID, _sapp_macos_mod(event.modifierFlags));
|
|
|
+ _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_LEAVE, SAPP_MOUSEBUTTON_INVALID, _sapp_macos_mods(event));
|
|
|
}
|
|
|
}
|
|
|
- (void)mouseDown:(NSEvent*)event {
|
|
|
_sapp_macos_update_mouse(event);
|
|
|
- _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_DOWN, SAPP_MOUSEBUTTON_LEFT, _sapp_macos_mod(event.modifierFlags));
|
|
|
+ _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_DOWN, SAPP_MOUSEBUTTON_LEFT, _sapp_macos_mods(event));
|
|
|
_sapp.macos.mouse_buttons |= (1<<SAPP_MOUSEBUTTON_LEFT);
|
|
|
}
|
|
|
- (void)mouseUp:(NSEvent*)event {
|
|
|
_sapp_macos_update_mouse(event);
|
|
|
- _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_UP, SAPP_MOUSEBUTTON_LEFT, _sapp_macos_mod(event.modifierFlags));
|
|
|
+ _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_UP, SAPP_MOUSEBUTTON_LEFT, _sapp_macos_mods(event));
|
|
|
_sapp.macos.mouse_buttons &= ~(1<<SAPP_MOUSEBUTTON_LEFT);
|
|
|
}
|
|
|
- (void)rightMouseDown:(NSEvent*)event {
|
|
|
_sapp_macos_update_mouse(event);
|
|
|
- _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_DOWN, SAPP_MOUSEBUTTON_RIGHT, _sapp_macos_mod(event.modifierFlags));
|
|
|
+ _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_DOWN, SAPP_MOUSEBUTTON_RIGHT, _sapp_macos_mods(event));
|
|
|
_sapp.macos.mouse_buttons |= (1<<SAPP_MOUSEBUTTON_RIGHT);
|
|
|
}
|
|
|
- (void)rightMouseUp:(NSEvent*)event {
|
|
|
_sapp_macos_update_mouse(event);
|
|
|
- _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_UP, SAPP_MOUSEBUTTON_RIGHT, _sapp_macos_mod(event.modifierFlags));
|
|
|
+ _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_UP, SAPP_MOUSEBUTTON_RIGHT, _sapp_macos_mods(event));
|
|
|
_sapp.macos.mouse_buttons &= ~(1<<SAPP_MOUSEBUTTON_RIGHT);
|
|
|
}
|
|
|
- (void)otherMouseDown:(NSEvent*)event {
|
|
|
_sapp_macos_update_mouse(event);
|
|
|
if (2 == event.buttonNumber) {
|
|
|
- _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_DOWN, SAPP_MOUSEBUTTON_MIDDLE, _sapp_macos_mod(event.modifierFlags));
|
|
|
+ _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_DOWN, SAPP_MOUSEBUTTON_MIDDLE, _sapp_macos_mods(event));
|
|
|
_sapp.macos.mouse_buttons |= (1<<SAPP_MOUSEBUTTON_MIDDLE);
|
|
|
}
|
|
|
}
|
|
|
- (void)otherMouseUp:(NSEvent*)event {
|
|
|
_sapp_macos_update_mouse(event);
|
|
|
if (2 == event.buttonNumber) {
|
|
|
- _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_UP, SAPP_MOUSEBUTTON_MIDDLE, _sapp_macos_mod(event.modifierFlags));
|
|
|
+ _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_UP, SAPP_MOUSEBUTTON_MIDDLE, _sapp_macos_mods(event));
|
|
|
_sapp.macos.mouse_buttons &= (1<<SAPP_MOUSEBUTTON_MIDDLE);
|
|
|
}
|
|
|
}
|
|
@@ -3437,7 +3458,7 @@ _SOKOL_PRIVATE void _sapp_macos_poll_input_events() {
|
|
|
_sapp.mouse.dx = [event deltaX];
|
|
|
_sapp.mouse.dy = [event deltaY];
|
|
|
}
|
|
|
- _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_MIDDLE, _sapp_macos_mod(event.modifierFlags));
|
|
|
+ _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID, _sapp_macos_mods(event));
|
|
|
}
|
|
|
}
|
|
|
- (void)mouseMoved:(NSEvent*)event {
|
|
@@ -3446,7 +3467,7 @@ _SOKOL_PRIVATE void _sapp_macos_poll_input_events() {
|
|
|
_sapp.mouse.dx = [event deltaX];
|
|
|
_sapp.mouse.dy = [event deltaY];
|
|
|
}
|
|
|
- _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID , _sapp_macos_mod(event.modifierFlags));
|
|
|
+ _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID , _sapp_macos_mods(event));
|
|
|
}
|
|
|
- (void)mouseDragged:(NSEvent*)event {
|
|
|
_sapp_macos_update_mouse(event);
|
|
@@ -3454,7 +3475,7 @@ _SOKOL_PRIVATE void _sapp_macos_poll_input_events() {
|
|
|
_sapp.mouse.dx = [event deltaX];
|
|
|
_sapp.mouse.dy = [event deltaY];
|
|
|
}
|
|
|
- _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID , _sapp_macos_mod(event.modifierFlags));
|
|
|
+ _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID , _sapp_macos_mods(event));
|
|
|
}
|
|
|
- (void)rightMouseDragged:(NSEvent*)event {
|
|
|
_sapp_macos_update_mouse(event);
|
|
@@ -3462,7 +3483,7 @@ _SOKOL_PRIVATE void _sapp_macos_poll_input_events() {
|
|
|
_sapp.mouse.dx = [event deltaX];
|
|
|
_sapp.mouse.dy = [event deltaY];
|
|
|
}
|
|
|
- _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID, _sapp_macos_mod(event.modifierFlags));
|
|
|
+ _sapp_macos_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID, _sapp_macos_mods(event));
|
|
|
}
|
|
|
- (void)scrollWheel:(NSEvent*)event {
|
|
|
_sapp_macos_update_mouse(event);
|
|
@@ -3475,7 +3496,7 @@ _SOKOL_PRIVATE void _sapp_macos_poll_input_events() {
|
|
|
}
|
|
|
if ((_sapp_absf(dx) > 0.0f) || (_sapp_absf(dy) > 0.0f)) {
|
|
|
_sapp_init_event(SAPP_EVENTTYPE_MOUSE_SCROLL);
|
|
|
- _sapp.event.modifiers = _sapp_macos_mod(event.modifierFlags);
|
|
|
+ _sapp.event.modifiers = _sapp_macos_mods(event);
|
|
|
_sapp.event.scroll_x = dx;
|
|
|
_sapp.event.scroll_y = dy;
|
|
|
_sapp_call_event(&_sapp.event);
|
|
@@ -3484,7 +3505,7 @@ _SOKOL_PRIVATE void _sapp_macos_poll_input_events() {
|
|
|
}
|
|
|
- (void)keyDown:(NSEvent*)event {
|
|
|
if (_sapp_events_enabled()) {
|
|
|
- const uint32_t mods = _sapp_macos_mod(event.modifierFlags);
|
|
|
+ const uint32_t mods = _sapp_macos_mods(event);
|
|
|
/* NOTE: macOS doesn't send keyUp events while the Cmd key is pressed,
|
|
|
as a workaround, to prevent key presses from sticking we'll send
|
|
|
a keyup event following right after the keydown if SUPER is also pressed
|
|
@@ -3520,7 +3541,7 @@ _SOKOL_PRIVATE void _sapp_macos_poll_input_events() {
|
|
|
_sapp_macos_key_event(SAPP_EVENTTYPE_KEY_UP,
|
|
|
_sapp_translate_key(event.keyCode),
|
|
|
event.isARepeat,
|
|
|
- _sapp_macos_mod(event.modifierFlags));
|
|
|
+ _sapp_macos_mods(event));
|
|
|
}
|
|
|
- (void)flagsChanged:(NSEvent*)event {
|
|
|
const uint32_t old_f = _sapp.macos.flags_changed_store;
|
|
@@ -3548,7 +3569,7 @@ _SOKOL_PRIVATE void _sapp_macos_poll_input_events() {
|
|
|
_sapp_macos_key_event(down ? SAPP_EVENTTYPE_KEY_DOWN : SAPP_EVENTTYPE_KEY_UP,
|
|
|
key_code,
|
|
|
false,
|
|
|
- _sapp_macos_mod(event.modifierFlags));
|
|
|
+ _sapp_macos_mods(event));
|
|
|
}
|
|
|
}
|
|
|
- (void)cursorUpdate:(NSEvent*)event {
|
|
@@ -4272,6 +4293,44 @@ _SOKOL_PRIVATE void _sapp_emsc_wgpu_surfaces_create(void);
|
|
|
_SOKOL_PRIVATE void _sapp_emsc_wgpu_surfaces_discard(void);
|
|
|
#endif
|
|
|
|
|
|
+_SOKOL_PRIVATE uint32_t _sapp_emsc_mouse_button_mods(uint16_t buttons) {
|
|
|
+ uint32_t m = 0;
|
|
|
+ if (0 != (buttons & (1<<0))) { m |= SAPP_MODIFIER_LMB; }
|
|
|
+ if (0 != (buttons & (1<<1))) { m |= SAPP_MODIFIER_RMB; } // not a bug
|
|
|
+ if (0 != (buttons & (1<<2))) { m |= SAPP_MODIFIER_MMB; } // not a bug
|
|
|
+ return m;
|
|
|
+}
|
|
|
+
|
|
|
+_SOKOL_PRIVATE uint32_t _sapp_emsc_mouse_event_mods(const EmscriptenMouseEvent* ev) {
|
|
|
+ uint32_t m = 0;
|
|
|
+ if (ev->ctrlKey) { m |= SAPP_MODIFIER_CTRL; }
|
|
|
+ if (ev->shiftKey) { m |= SAPP_MODIFIER_SHIFT; }
|
|
|
+ if (ev->altKey) { m |= SAPP_MODIFIER_ALT; }
|
|
|
+ if (ev->metaKey) { m |= SAPP_MODIFIER_SUPER; }
|
|
|
+ m |= _sapp_emsc_mouse_button_mods(_sapp.emsc.mouse_buttons);
|
|
|
+ return m;
|
|
|
+}
|
|
|
+
|
|
|
+_SOKOL_PRIVATE uint32_t _sapp_emsc_key_event_mods(const EmscriptenKeyboardEvent* ev) {
|
|
|
+ uint32_t m = 0;
|
|
|
+ if (ev->ctrlKey) { m |= SAPP_MODIFIER_CTRL; }
|
|
|
+ if (ev->shiftKey) { m |= SAPP_MODIFIER_SHIFT; }
|
|
|
+ if (ev->altKey) { m |= SAPP_MODIFIER_ALT; }
|
|
|
+ if (ev->metaKey) { m |= SAPP_MODIFIER_SUPER; }
|
|
|
+ m |= _sapp_emsc_mouse_button_mods(_sapp.emsc.mouse_buttons);
|
|
|
+ return m;
|
|
|
+}
|
|
|
+
|
|
|
+_SOKOL_PRIVATE uint32_t _sapp_emsc_touch_event_mods(const EmscriptenTouchEvent* ev) {
|
|
|
+ uint32_t m = 0;
|
|
|
+ if (ev->ctrlKey) { m |= SAPP_MODIFIER_CTRL; }
|
|
|
+ if (ev->shiftKey) { m |= SAPP_MODIFIER_SHIFT; }
|
|
|
+ if (ev->altKey) { m |= SAPP_MODIFIER_ALT; }
|
|
|
+ if (ev->metaKey) { m |= SAPP_MODIFIER_SUPER; }
|
|
|
+ m |= _sapp_emsc_mouse_button_mods(_sapp.emsc.mouse_buttons);
|
|
|
+ return m;
|
|
|
+}
|
|
|
+
|
|
|
_SOKOL_PRIVATE EM_BOOL _sapp_emsc_size_changed(int event_type, const EmscriptenUiEvent* ui_event, void* user_data) {
|
|
|
_SOKOL_UNUSED(event_type);
|
|
|
_SOKOL_UNUSED(user_data);
|
|
@@ -4330,6 +4389,7 @@ _SOKOL_PRIVATE EM_BOOL _sapp_emsc_size_changed(int event_type, const EmscriptenU
|
|
|
|
|
|
_SOKOL_PRIVATE EM_BOOL _sapp_emsc_mouse_cb(int emsc_type, const EmscriptenMouseEvent* emsc_event, void* user_data) {
|
|
|
_SOKOL_UNUSED(user_data);
|
|
|
+ _sapp.emsc.mouse_buttons = emsc_event->buttons;
|
|
|
if (_sapp.mouse.locked) {
|
|
|
_sapp.mouse.dx = (float) emsc_event->movementX;
|
|
|
_sapp.mouse.dy = (float) emsc_event->movementY;
|
|
@@ -4372,18 +4432,7 @@ _SOKOL_PRIVATE EM_BOOL _sapp_emsc_mouse_cb(int emsc_type, const EmscriptenMouseE
|
|
|
}
|
|
|
if (type != SAPP_EVENTTYPE_INVALID) {
|
|
|
_sapp_init_event(type);
|
|
|
- if (emsc_event->ctrlKey) {
|
|
|
- _sapp.event.modifiers |= SAPP_MODIFIER_CTRL;
|
|
|
- }
|
|
|
- if (emsc_event->shiftKey) {
|
|
|
- _sapp.event.modifiers |= SAPP_MODIFIER_SHIFT;
|
|
|
- }
|
|
|
- if (emsc_event->altKey) {
|
|
|
- _sapp.event.modifiers |= SAPP_MODIFIER_ALT;
|
|
|
- }
|
|
|
- if (emsc_event->metaKey) {
|
|
|
- _sapp.event.modifiers |= SAPP_MODIFIER_SUPER;
|
|
|
- }
|
|
|
+ _sapp.event.modifiers = _sapp_emsc_mouse_event_mods(emsc_event);
|
|
|
if (is_button_event) {
|
|
|
switch (emsc_event->button) {
|
|
|
case 0: _sapp.event.mouse_button = SAPP_MOUSEBUTTON_LEFT; break;
|
|
@@ -4409,20 +4458,10 @@ _SOKOL_PRIVATE EM_BOOL _sapp_emsc_mouse_cb(int emsc_type, const EmscriptenMouseE
|
|
|
_SOKOL_PRIVATE EM_BOOL _sapp_emsc_wheel_cb(int emsc_type, const EmscriptenWheelEvent* emsc_event, void* user_data) {
|
|
|
_SOKOL_UNUSED(emsc_type);
|
|
|
_SOKOL_UNUSED(user_data);
|
|
|
+ _sapp.emsc.mouse_buttons = emsc_event->mouse.buttons;
|
|
|
if (_sapp_events_enabled()) {
|
|
|
_sapp_init_event(SAPP_EVENTTYPE_MOUSE_SCROLL);
|
|
|
- if (emsc_event->mouse.ctrlKey) {
|
|
|
- _sapp.event.modifiers |= SAPP_MODIFIER_CTRL;
|
|
|
- }
|
|
|
- if (emsc_event->mouse.shiftKey) {
|
|
|
- _sapp.event.modifiers |= SAPP_MODIFIER_SHIFT;
|
|
|
- }
|
|
|
- if (emsc_event->mouse.altKey) {
|
|
|
- _sapp.event.modifiers |= SAPP_MODIFIER_ALT;
|
|
|
- }
|
|
|
- if (emsc_event->mouse.metaKey) {
|
|
|
- _sapp.event.modifiers |= SAPP_MODIFIER_SUPER;
|
|
|
- }
|
|
|
+ _sapp.event.modifiers = _sapp_emsc_mouse_event_mods(&emsc_event->mouse);
|
|
|
/* see https://github.com/floooh/sokol/issues/339 */
|
|
|
float scale;
|
|
|
switch (emsc_event->deltaMode) {
|
|
@@ -4463,18 +4502,7 @@ _SOKOL_PRIVATE EM_BOOL _sapp_emsc_key_cb(int emsc_type, const EmscriptenKeyboard
|
|
|
bool send_keyup_followup = false;
|
|
|
_sapp_init_event(type);
|
|
|
_sapp.event.key_repeat = emsc_event->repeat;
|
|
|
- if (emsc_event->ctrlKey) {
|
|
|
- _sapp.event.modifiers |= SAPP_MODIFIER_CTRL;
|
|
|
- }
|
|
|
- if (emsc_event->shiftKey) {
|
|
|
- _sapp.event.modifiers |= SAPP_MODIFIER_SHIFT;
|
|
|
- }
|
|
|
- if (emsc_event->altKey) {
|
|
|
- _sapp.event.modifiers |= SAPP_MODIFIER_ALT;
|
|
|
- }
|
|
|
- if (emsc_event->metaKey) {
|
|
|
- _sapp.event.modifiers |= SAPP_MODIFIER_SUPER;
|
|
|
- }
|
|
|
+ _sapp.event.modifiers = _sapp_emsc_key_event_mods(emsc_event);
|
|
|
if (type == SAPP_EVENTTYPE_CHAR) {
|
|
|
_sapp.event.char_code = emsc_event->charCode;
|
|
|
/* workaround to make Cmd+V work on Safari */
|
|
@@ -4603,18 +4631,7 @@ _SOKOL_PRIVATE EM_BOOL _sapp_emsc_touch_cb(int emsc_type, const EmscriptenTouchE
|
|
|
}
|
|
|
if (type != SAPP_EVENTTYPE_INVALID) {
|
|
|
_sapp_init_event(type);
|
|
|
- if (emsc_event->ctrlKey) {
|
|
|
- _sapp.event.modifiers |= SAPP_MODIFIER_CTRL;
|
|
|
- }
|
|
|
- if (emsc_event->shiftKey) {
|
|
|
- _sapp.event.modifiers |= SAPP_MODIFIER_SHIFT;
|
|
|
- }
|
|
|
- if (emsc_event->altKey) {
|
|
|
- _sapp.event.modifiers |= SAPP_MODIFIER_ALT;
|
|
|
- }
|
|
|
- if (emsc_event->metaKey) {
|
|
|
- _sapp.event.modifiers |= SAPP_MODIFIER_SUPER;
|
|
|
- }
|
|
|
+ _sapp.event.modifiers = _sapp_emsc_touch_event_mods(emsc_event);
|
|
|
_sapp.event.num_touches = emsc_event->numTouches;
|
|
|
if (_sapp.event.num_touches > SAPP_MAX_TOUCHPOINTS) {
|
|
|
_sapp.event.num_touches = SAPP_MAX_TOUCHPOINTS;
|
|
@@ -5925,6 +5942,16 @@ _SOKOL_PRIVATE uint32_t _sapp_win32_mods(void) {
|
|
|
if ((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & (1<<15)) {
|
|
|
mods |= SAPP_MODIFIER_SUPER;
|
|
|
}
|
|
|
+ const bool swapped = (TRUE == GetSystemMetrics(SM_SWAPBUTTON));
|
|
|
+ if (GetAsyncKeyState(VK_LBUTTON)) {
|
|
|
+ mods |= swapped ? SAPP_MODIFIER_RMB : SAPP_MODIFIER_LMB;
|
|
|
+ }
|
|
|
+ if (GetAsyncKeyState(VK_RBUTTON)) {
|
|
|
+ mods |= swapped ? SAPP_MODIFIER_LMB : SAPP_MODIFIER_RMB;
|
|
|
+ }
|
|
|
+ if (GetAsyncKeyState(VK_MBUTTON)) {
|
|
|
+ mods |= SAPP_MODIFIER_MMB;
|
|
|
+ }
|
|
|
return mods;
|
|
|
}
|
|
|
|
|
@@ -6703,6 +6730,15 @@ _SOKOL_PRIVATE uint32_t _sapp_uwp_mods(winrt::Windows::UI::Core::CoreWindow cons
|
|
|
{
|
|
|
mods |= SAPP_MODIFIER_SUPER;
|
|
|
}
|
|
|
+ if (0 != (_sapp.uwp.mouse_buttons & (1<<SAPP_MOUSEBUTTON_LEFT))) {
|
|
|
+ mods |= SAPP_MODIFIER_LMB;
|
|
|
+ }
|
|
|
+ if (0 != (_sapp.uwp.mouse_buttons & (1<<SAPP_MOUSEBUTTON_MIDDLE))) {
|
|
|
+ mods |= SAPP_MODIFIER_MMB;
|
|
|
+ }
|
|
|
+ if (0 != (_sapp.uwp.mouse_buttons & (1<<SAPP_MOUSEBUTTON_RIGHT))) {
|
|
|
+ mods |= SAPP_MODIFIER_RMB;
|
|
|
+ }
|
|
|
return mods;
|
|
|
}
|
|
|
|
|
@@ -9772,7 +9808,7 @@ _SOKOL_PRIVATE int _sapp_x11_get_window_state(void) {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
-_SOKOL_PRIVATE uint32_t _sapp_x11_mod(uint32_t x11_mods) {
|
|
|
+_SOKOL_PRIVATE uint32_t _sapp_x11_mods(uint32_t x11_mods) {
|
|
|
uint32_t mods = 0;
|
|
|
if (x11_mods & ShiftMask) {
|
|
|
mods |= SAPP_MODIFIER_SHIFT;
|
|
@@ -9786,6 +9822,15 @@ _SOKOL_PRIVATE uint32_t _sapp_x11_mod(uint32_t x11_mods) {
|
|
|
if (x11_mods & Mod4Mask) {
|
|
|
mods |= SAPP_MODIFIER_SUPER;
|
|
|
}
|
|
|
+ if (x11_mods & Button1Mask) {
|
|
|
+ mods |= SAPP_MODIFIER_LMB;
|
|
|
+ }
|
|
|
+ if (x11_mods & Button2Mask) {
|
|
|
+ mods |= SAPP_MODIFIER_MMB;
|
|
|
+ }
|
|
|
+ if (x11_mods & Button3Mask) {
|
|
|
+ mods |= SAPP_MODIFIER_RMB;
|
|
|
+ }
|
|
|
return mods;
|
|
|
}
|
|
|
|
|
@@ -10126,7 +10171,7 @@ _SOKOL_PRIVATE void _sapp_x11_process_event(XEvent* event) {
|
|
|
if (XIMaskIsSet(re->valuators.mask, 1)) {
|
|
|
_sapp.mouse.dy = (float) *values;
|
|
|
}
|
|
|
- _sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mod(event->xmotion.state));
|
|
|
+ _sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mods(event->xmotion.state));
|
|
|
}
|
|
|
}
|
|
|
XFreeEventData(_sapp.x11.display, &event->xcookie);
|
|
@@ -10146,7 +10191,7 @@ _SOKOL_PRIVATE void _sapp_x11_process_event(XEvent* event) {
|
|
|
const sapp_keycode key = _sapp_x11_translate_key(keycode);
|
|
|
bool repeat = _sapp_x11_keycodes[keycode & 0xFF];
|
|
|
_sapp_x11_keycodes[keycode & 0xFF] = true;
|
|
|
- const uint32_t mods = _sapp_x11_mod(event->xkey.state);
|
|
|
+ const uint32_t mods = _sapp_x11_mods(event->xkey.state);
|
|
|
if (key != SAPP_KEYCODE_INVALID) {
|
|
|
_sapp_x11_key_event(SAPP_EVENTTYPE_KEY_DOWN, key, repeat, mods);
|
|
|
}
|
|
@@ -10164,7 +10209,7 @@ _SOKOL_PRIVATE void _sapp_x11_process_event(XEvent* event) {
|
|
|
const sapp_keycode key = _sapp_x11_translate_key(keycode);
|
|
|
_sapp_x11_keycodes[keycode & 0xFF] = false;
|
|
|
if (key != SAPP_KEYCODE_INVALID) {
|
|
|
- const uint32_t mods = _sapp_x11_mod(event->xkey.state);
|
|
|
+ const uint32_t mods = _sapp_x11_mods(event->xkey.state);
|
|
|
_sapp_x11_key_event(SAPP_EVENTTYPE_KEY_UP, key, false, mods);
|
|
|
}
|
|
|
}
|
|
@@ -10172,7 +10217,7 @@ _SOKOL_PRIVATE void _sapp_x11_process_event(XEvent* event) {
|
|
|
case ButtonPress:
|
|
|
{
|
|
|
const sapp_mousebutton btn = _sapp_x11_translate_button(event);
|
|
|
- const uint32_t mods = _sapp_x11_mod(event->xbutton.state);
|
|
|
+ const uint32_t mods = _sapp_x11_mods(event->xbutton.state);
|
|
|
if (btn != SAPP_MOUSEBUTTON_INVALID) {
|
|
|
_sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_DOWN, btn, mods);
|
|
|
_sapp.x11.mouse_buttons |= (1 << btn);
|
|
@@ -10192,7 +10237,8 @@ _SOKOL_PRIVATE void _sapp_x11_process_event(XEvent* event) {
|
|
|
{
|
|
|
const sapp_mousebutton btn = _sapp_x11_translate_button(event);
|
|
|
if (btn != SAPP_MOUSEBUTTON_INVALID) {
|
|
|
- _sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_UP, btn, _sapp_x11_mod(event->xbutton.state));
|
|
|
+ const uint32_t mods = _sapp_x11_mods(event->xbutton.state);
|
|
|
+ _sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_UP, btn, mods);
|
|
|
_sapp.x11.mouse_buttons &= ~(1 << btn);
|
|
|
}
|
|
|
}
|
|
@@ -10200,12 +10246,12 @@ _SOKOL_PRIVATE void _sapp_x11_process_event(XEvent* event) {
|
|
|
case EnterNotify:
|
|
|
/* don't send enter/leave events while mouse button held down */
|
|
|
if (0 == _sapp.x11.mouse_buttons) {
|
|
|
- _sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_ENTER, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mod(event->xcrossing.state));
|
|
|
+ _sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_ENTER, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mods(event->xcrossing.state));
|
|
|
}
|
|
|
break;
|
|
|
case LeaveNotify:
|
|
|
if (0 == _sapp.x11.mouse_buttons) {
|
|
|
- _sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_LEAVE, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mod(event->xcrossing.state));
|
|
|
+ _sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_LEAVE, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mods(event->xcrossing.state));
|
|
|
}
|
|
|
break;
|
|
|
case MotionNotify:
|
|
@@ -10219,7 +10265,7 @@ _SOKOL_PRIVATE void _sapp_x11_process_event(XEvent* event) {
|
|
|
_sapp.mouse.x = new_x;
|
|
|
_sapp.mouse.y = new_y;
|
|
|
_sapp.mouse.pos_valid = true;
|
|
|
- _sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mod(event->xmotion.state));
|
|
|
+ _sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mods(event->xmotion.state));
|
|
|
}
|
|
|
break;
|
|
|
case ConfigureNotify:
|