Skip to content

Commit d7ffd1b

Browse files
Merge pull request #419 from Hedgehogsoft/main
fix mouse hold/unhold on focus/unfocus
2 parents 5399761 + 95930e9 commit d7ffd1b

File tree

1 file changed

+34
-4
lines changed

1 file changed

+34
-4
lines changed

RGFW.h

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

77567765
static 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
1277912800
EM_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
1279212817
EM_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

Comments
 (0)