|
@@ -10119,11 +10119,14 @@ _SOKOL_PRIVATE sapp_mousebutton _sapp_x11_translate_button(const XEvent* event)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-_SOKOL_PRIVATE void _sapp_x11_mouse_update(int x, int y) {
|
|
|
|
|
|
+_SOKOL_PRIVATE void _sapp_x11_mouse_update(int x, int y, bool clear_dxdy) {
|
|
if (!_sapp.mouse.locked) {
|
|
if (!_sapp.mouse.locked) {
|
|
const float new_x = (float) x;
|
|
const float new_x = (float) x;
|
|
const float new_y = (float) y;
|
|
const float new_y = (float) y;
|
|
- if (_sapp.mouse.pos_valid) {
|
|
|
|
|
|
+ if (clear_dxdy) {
|
|
|
|
+ _sapp.mouse.dx = 0.0f;
|
|
|
|
+ _sapp.mouse.dy = 0.0f;
|
|
|
|
+ } else if (_sapp.mouse.pos_valid) {
|
|
_sapp.mouse.dx = new_x - _sapp.mouse.x;
|
|
_sapp.mouse.dx = new_x - _sapp.mouse.x;
|
|
_sapp.mouse.dy = new_y - _sapp.mouse.y;
|
|
_sapp.mouse.dy = new_y - _sapp.mouse.y;
|
|
}
|
|
}
|
|
@@ -10512,7 +10515,7 @@ _SOKOL_PRIVATE void _sapp_x11_process_event(XEvent* event) {
|
|
break;
|
|
break;
|
|
case ButtonPress:
|
|
case ButtonPress:
|
|
{
|
|
{
|
|
- _sapp_x11_mouse_update(event->xbutton.x, event->xbutton.y);
|
|
|
|
|
|
+ _sapp_x11_mouse_update(event->xbutton.x, event->xbutton.y, false);
|
|
const sapp_mousebutton btn = _sapp_x11_translate_button(event);
|
|
const sapp_mousebutton btn = _sapp_x11_translate_button(event);
|
|
uint32_t mods = _sapp_x11_mods(event->xbutton.state);
|
|
uint32_t mods = _sapp_x11_mods(event->xbutton.state);
|
|
// X11 doesn't set modifier bit on button down, so emulate that
|
|
// X11 doesn't set modifier bit on button down, so emulate that
|
|
@@ -10534,7 +10537,7 @@ _SOKOL_PRIVATE void _sapp_x11_process_event(XEvent* event) {
|
|
break;
|
|
break;
|
|
case ButtonRelease:
|
|
case ButtonRelease:
|
|
{
|
|
{
|
|
- _sapp_x11_mouse_update(event->xbutton.x, event->xbutton.y);
|
|
|
|
|
|
+ _sapp_x11_mouse_update(event->xbutton.x, event->xbutton.y, false);
|
|
const sapp_mousebutton btn = _sapp_x11_translate_button(event);
|
|
const sapp_mousebutton btn = _sapp_x11_translate_button(event);
|
|
if (btn != SAPP_MOUSEBUTTON_INVALID) {
|
|
if (btn != SAPP_MOUSEBUTTON_INVALID) {
|
|
uint32_t mods = _sapp_x11_mods(event->xbutton.state);
|
|
uint32_t mods = _sapp_x11_mods(event->xbutton.state);
|
|
@@ -10548,19 +10551,19 @@ _SOKOL_PRIVATE void _sapp_x11_process_event(XEvent* event) {
|
|
case EnterNotify:
|
|
case EnterNotify:
|
|
/* don't send enter/leave events while mouse button held down */
|
|
/* don't send enter/leave events while mouse button held down */
|
|
if (0 == _sapp.x11.mouse_buttons) {
|
|
if (0 == _sapp.x11.mouse_buttons) {
|
|
- _sapp_x11_mouse_update(event->xcrossing.x, event->xcrossing.y);
|
|
|
|
|
|
+ _sapp_x11_mouse_update(event->xcrossing.x, event->xcrossing.y, true);
|
|
_sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_ENTER, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mods(event->xcrossing.state));
|
|
_sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_ENTER, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mods(event->xcrossing.state));
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
case LeaveNotify:
|
|
case LeaveNotify:
|
|
if (0 == _sapp.x11.mouse_buttons) {
|
|
if (0 == _sapp.x11.mouse_buttons) {
|
|
- _sapp_x11_mouse_update(event->xcrossing.x, event->xcrossing.y);
|
|
|
|
|
|
+ _sapp_x11_mouse_update(event->xcrossing.x, event->xcrossing.y, true);
|
|
_sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_LEAVE, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mods(event->xcrossing.state));
|
|
_sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_LEAVE, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mods(event->xcrossing.state));
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
case MotionNotify:
|
|
case MotionNotify:
|
|
if (!_sapp.mouse.locked) {
|
|
if (!_sapp.mouse.locked) {
|
|
- _sapp_x11_mouse_update(event->xmotion.x, event->xmotion.y);
|
|
|
|
|
|
+ _sapp_x11_mouse_update(event->xmotion.x, event->xmotion.y, false);
|
|
_sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mods(event->xmotion.state));
|
|
_sapp_x11_mouse_event(SAPP_EVENTTYPE_MOUSE_MOVE, SAPP_MOUSEBUTTON_INVALID, _sapp_x11_mods(event->xmotion.state));
|
|
}
|
|
}
|
|
break;
|
|
break;
|