@@ -6067,7 +6067,9 @@ void RGFW_XHandleEvent(void) {
60676067 if ((win->internal.flags & RGFW_windowFullscreen))
60686068 RGFW_window_raise(win);
60696069
6070- if ((win->internal.holdMouse)) RGFW_window_holdMouse(win);
6070+ if ((win->internal.holdMouse) && win == _RGFW->mouseOwner) {
6071+ RGFW_window_holdMouse(win);
6072+ }
60716073
60726074 if (!(win->internal.enabledEvents & RGFW_focusInFlag)) return;
60736075 win->internal.inFocus = RGFW_TRUE;
@@ -6076,6 +6078,11 @@ void RGFW_XHandleEvent(void) {
60766078
60776079 break;
60786080 case FocusOut:
6081+ if ((win->internal.holdMouse) && win == _RGFW->mouseOwner) {
6082+ RGFW_window_unholdMouse(win);
6083+ win->internal.holdMouse = RGFW_TRUE;
6084+ }
6085+
60796086 if (!(win->internal.enabledEvents & RGFW_focusOutFlag)) return;
60806087 event.type = RGFW_focusOut;
60816088 RGFW_focusCallback(win, 0);
@@ -7736,6 +7743,10 @@ static void RGFW_wl_keyboard_enter(void* data, struct wl_keyboard *keyboard, u32
77367743 RGFW_window* win = (RGFW_window*)wl_surface_get_user_data(surface);
77377744 RGFW->kbOwner = win;
77387745
7746+ if ((win->internal.holdMouse) && win == _RGFW->mouseOwner) {
7747+ RGFW_window_holdMouse(win);
7748+ }
7749+
77397750 // this is to prevent race conditions
77407751 if (RGFW->data_device != NULL && win->src.data_source != NULL) {
77417752 wl_data_device_set_selection(RGFW->data_device, win->src.data_source, serial);
@@ -7749,8 +7760,6 @@ static void RGFW_wl_keyboard_enter(void* data, struct wl_keyboard *keyboard, u32
77497760 win->internal.inFocus = RGFW_TRUE;
77507761 RGFW_eventQueuePushEx(e.type = RGFW_focusIn; e.common.win = win);
77517762 RGFW_focusCallback(win, RGFW_TRUE);
7752-
7753- if ((win->internal.holdMouse)) RGFW_window_holdMouse(win);
77547763}
77557764
77567765static void RGFW_wl_keyboard_leave(void* data, struct wl_keyboard *keyboard, u32 serial, struct wl_surface *surface) {
@@ -7761,6 +7770,11 @@ static void RGFW_wl_keyboard_leave(void* data, struct wl_keyboard *keyboard, u32
77617770 if (RGFW->kbOwner == win)
77627771 RGFW->kbOwner = NULL;
77637772
7773+ if ((win->internal.holdMouse) && win == _RGFW->mouseOwner) {
7774+ RGFW_window_unholdMouse(win);
7775+ win->internal.holdMouse = RGFW_TRUE;
7776+ }
7777+
77647778 if (!(win->internal.enabledEvents & RGFW_focusOutFlag)) return;
77657779
77667780 RGFW_eventQueuePushEx(e.type = RGFW_focusOut; e.common.win = win);
@@ -11288,9 +11302,11 @@ static void RGFW__osxWindowBecameKey(id self, SEL sel) {
1128811302 object_getInstanceVariable(self, "RGFW_window", (void**)&win);
1128911303 if (win == NULL) return;
1129011304
11305+ if ((win->internal.holdMouse) && win == _RGFW->mouseOwner) {
11306+ RGFW_window_holdMouse(win);
11307+ }
1129111308
1129211309 win->internal.inFocus = RGFW_TRUE;
11293- if ((win->internal.holdMouse)) RGFW_window_holdMouse(win);
1129411310 if (!(win->internal.enabledEvents & RGFW_focusInFlag)) return;
1129511311
1129611312 RGFW_eventQueuePushEx(e.type = RGFW_focusIn; e.common.win = win);
@@ -11303,6 +11319,11 @@ static void RGFW__osxWindowResignKey(id self, SEL sel) {
1130311319 object_getInstanceVariable(self, "RGFW_window", (void**)&win);
1130411320 if (win == NULL) return;
1130511321
11322+ if ((win->internal.holdMouse) && win == _RGFW->mouseOwner) {
11323+ RGFW_window_unholdMouse(win);
11324+ win->internal.holdMouse = RGFW_TRUE;
11325+ }
11326+
1130611327 RGFW_window_focusLost(win);
1130711328 if (!(win->internal.enabledEvents & RGFW_focusOutFlag)) return;
1130811329
@@ -12779,6 +12800,10 @@ EM_BOOL Emscripten_on_fullscreenchange(int eventType, const EmscriptenFullscreen
1277912800EM_BOOL Emscripten_on_focusin(int eventType, const EmscriptenFocusEvent* E, void* userData) {
1278012801 RGFW_UNUSED(eventType); RGFW_UNUSED(userData); RGFW_UNUSED(E);
1278112802
12803+ if (_RGFW->root->internal.holdMouse) {
12804+ RGFW_window_holdMouse(_RGFW->root);
12805+ }
12806+
1278212807 if (!(_RGFW->root->internal.enabledEvents & RGFW_focusInFlag)) return EM_TRUE;
1278312808
1278412809 RGFW_eventQueuePushEx(e.type = RGFW_focusIn; e.common.win = _RGFW->root);
@@ -12792,6 +12817,11 @@ EM_BOOL Emscripten_on_focusin(int eventType, const EmscriptenFocusEvent* E, void
1279212817EM_BOOL Emscripten_on_focusout(int eventType, const EmscriptenFocusEvent* E, void* userData) {
1279312818 RGFW_UNUSED(eventType); RGFW_UNUSED(userData); RGFW_UNUSED(E);
1279412819
12820+ if ((_RGFW->root->internal.holdMouse) && _RGFW->root == _RGFW->mouseOwner) {
12821+ RGFW_window_unholdMouse(_RGFW->root);
12822+ _RGFW->root->internal.holdMouse = RGFW_TRUE;
12823+ }
12824+
1279512825 if (!(_RGFW->root->internal.enabledEvents & RGFW_focusOutFlag)) return EM_TRUE;
1279612826
1279712827 RGFW_eventQueuePushEx(e.type = RGFW_focusOut; e.common.win = _RGFW->root);
0 commit comments