diff options
author | Martin Stransky <stransky@redhat.com> | 2022-01-11 19:49:24 +0100 |
---|---|---|
committer | Martin Stransky <stransky@redhat.com> | 2022-01-11 19:49:24 +0100 |
commit | bacd3c42004883a03e03f64416cc07ca18ccc695 (patch) | |
tree | 76c052738e3b21901ffc5d8e66773d102fa203d7 /D133209.diff | |
parent | Rebuilt for https://fedoraproject.org/wiki/Changes/LIBFFI34 (diff) | |
parent | Update to Firefox 96 (diff) | |
download | librewolf-fedora-ff-bacd3c42004883a03e03f64416cc07ca18ccc695.tar.gz librewolf-fedora-ff-bacd3c42004883a03e03f64416cc07ca18ccc695.tar.bz2 librewolf-fedora-ff-bacd3c42004883a03e03f64416cc07ca18ccc695.zip |
merge
Diffstat (limited to 'D133209.diff')
-rw-r--r-- | D133209.diff | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/D133209.diff b/D133209.diff new file mode 100644 index 0000000..81908f9 --- /dev/null +++ b/D133209.diff @@ -0,0 +1,197 @@ +diff --git a/widget/gtk/nsGtkKeyUtils.h b/widget/gtk/nsGtkKeyUtils.h +--- a/widget/gtk/nsGtkKeyUtils.h ++++ b/widget/gtk/nsGtkKeyUtils.h +@@ -202,6 +202,22 @@ + * from xkb_keymap. We call that from Wayland backend routines. + */ + static void SetModifierMasks(xkb_keymap* aKeymap); ++ ++ /** ++ * Wayland global focus handlers ++ */ ++ static void SetFocusIn(wl_surface* aFocusSurface, uint32_t aFocusSerial); ++ static void SetFocusOut(wl_surface* aFocusSurface); ++ static void GetFocusInfo(wl_surface** aFocusSurface, uint32_t* aFocusSerial); ++ ++ static void SetSeat(wl_seat* aSeat); ++ static wl_seat* GetSeat(); ++ ++ /** ++ * EnsureInstance() is provided on Wayland to register Wayland callbacks ++ * early. ++ */ ++ static void EnsureInstance(); + #endif + + /** +@@ -467,6 +483,12 @@ + void SetModifierMask(xkb_keymap* aKeymap, ModifierIndex aModifierIndex, + const char* aModifierName); + #endif ++ ++#ifdef MOZ_WAYLAND ++ wl_seat* mSeat = nullptr; ++ wl_surface* mFocusSurface = nullptr; ++ uint32_t mFocusSerial = 0; ++#endif + }; + + } // namespace widget +diff --git a/widget/gtk/nsGtkKeyUtils.cpp b/widget/gtk/nsGtkKeyUtils.cpp +--- a/widget/gtk/nsGtkKeyUtils.cpp ++++ b/widget/gtk/nsGtkKeyUtils.cpp +@@ -331,6 +331,10 @@ + return sInstance; + } + ++#ifdef MOZ_WAYLAND ++void KeymapWrapper::EnsureInstance() { (void)GetInstance(); } ++#endif ++ + /* static */ + void KeymapWrapper::Shutdown() { + if (sInstance) { +@@ -720,10 +724,15 @@ + + static void keyboard_handle_enter(void* data, struct wl_keyboard* keyboard, + uint32_t serial, struct wl_surface* surface, +- struct wl_array* keys) {} ++ struct wl_array* keys) { ++ KeymapWrapper::SetFocusIn(surface, serial); ++} ++ + static void keyboard_handle_leave(void* data, struct wl_keyboard* keyboard, + uint32_t serial, struct wl_surface* surface) { ++ KeymapWrapper::SetFocusOut(surface); + } ++ + static void keyboard_handle_key(void* data, struct wl_keyboard* keyboard, + uint32_t serial, uint32_t time, uint32_t key, + uint32_t state) {} +@@ -760,6 +769,7 @@ + if (strcmp(interface, "wl_seat") == 0) { + auto* seat = + WaylandRegistryBind<wl_seat>(registry, id, &wl_seat_interface, 1); ++ KeymapWrapper::SetSeat(seat); + wl_seat_add_listener(seat, &seat_listener, data); + } + } +@@ -2411,5 +2421,40 @@ + altLatinCharCodes.mShiftedCharCode)); + } + ++#ifdef MOZ_WAYLAND ++void KeymapWrapper::SetFocusIn(wl_surface* aFocusSurface, ++ uint32_t aFocusSerial) { ++ KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance(); ++ keymapWrapper->mFocusSurface = aFocusSurface; ++ keymapWrapper->mFocusSerial = aFocusSerial; ++} ++ ++void KeymapWrapper::SetFocusOut(wl_surface* aFocusSurface) { ++ KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance(); ++ if (aFocusSurface == keymapWrapper->mFocusSurface) { ++ keymapWrapper->mFocusSurface = nullptr; ++ keymapWrapper->mFocusSerial = 0; ++ } ++} ++ ++void KeymapWrapper::GetFocusInfo(wl_surface** aFocusSurface, ++ uint32_t* aFocusSerial) { ++ KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance(); ++ *aFocusSurface = keymapWrapper->mFocusSurface; ++ *aFocusSerial = keymapWrapper->mFocusSerial; ++} ++ ++void KeymapWrapper::SetSeat(wl_seat* aSeat) { ++ KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance(); ++ keymapWrapper->mSeat = aSeat; ++} ++ ++wl_seat* KeymapWrapper::GetSeat() { ++ KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance(); ++ return keymapWrapper->mSeat; ++} ++ ++#endif ++ + } // namespace widget + } // namespace mozilla +diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp +--- a/widget/gtk/nsWindow.cpp ++++ b/widget/gtk/nsWindow.cpp +@@ -2862,8 +2862,7 @@ + }; + + void nsWindow::RequestFocusWaylandWindow(RefPtr<nsWindow> aWindow) { +- LOG("nsWindow::RequestWindowFocusWayland(%p) gFocusWindow [%p]", +- (void*)aWindow, gFocusWindow); ++ LOG("nsWindow::RequestWindowFocusWayland(%p)", (void*)aWindow); + + RefPtr<nsWaylandDisplay> display = WaylandDisplayGet(); + xdg_activation_v1* xdg_activation = display->GetXdgActivation(); +@@ -2872,17 +2871,11 @@ + return; + } + +- // We use xdg-activation protocol to transfer focus from gFocusWindow to +- // aWindow. Quit if no window is focused. +- if (gFocusWindow != this) { +- LOG(" there isn't any focused window to transfer focus from, quit."); +- return; +- } +- +- wl_surface* surface = +- mGdkWindow ? gdk_wayland_window_get_wl_surface(mGdkWindow) : nullptr; +- if (!surface) { +- LOG(" requesting window is hidden/unmapped, quit."); ++ wl_surface* focusSurface; ++ uint32_t focusSerial; ++ KeymapWrapper::GetFocusInfo(&focusSurface, &focusSerial); ++ if (!focusSurface) { ++ LOG(" We're missing focused window, quit."); + return; + } + +@@ -2894,9 +2887,9 @@ + // callback. + xdg_activation_token_v1_add_listener(aWindow->mXdgToken, &token_listener, + do_AddRef(aWindow).take()); +- xdg_activation_token_v1_set_serial(aWindow->mXdgToken, GetLastUserInputTime(), +- display->GetSeat()); +- xdg_activation_token_v1_set_surface(aWindow->mXdgToken, surface); ++ xdg_activation_token_v1_set_serial(aWindow->mXdgToken, focusSerial, ++ KeymapWrapper::GetSeat()); ++ xdg_activation_token_v1_set_surface(aWindow->mXdgToken, focusSurface); + xdg_activation_token_v1_commit(aWindow->mXdgToken); + } + #endif +@@ -2959,11 +2952,7 @@ + + #ifdef MOZ_WAYLAND + if (GdkIsWaylandDisplay()) { +- if (gFocusWindow) { +- gFocusWindow->RequestFocusWaylandWindow(toplevelWindow); +- } else { +- LOG(" RequestFocusWaylandWindow(): we're missing focused window!"); +- } ++ RequestFocusWaylandWindow(toplevelWindow); + } + #endif + if (GTKToolkit) GTKToolkit->SetFocusTimestamp(0); +@@ -5359,6 +5348,14 @@ + a11y::PreInit(); + #endif + ++#ifdef MOZ_WAYLAND ++ // Ensure that KeymapWrapper is created on Wayland as we need it for ++ // keyboard focus tracking. ++ if (GdkIsWaylandDisplay()) { ++ KeymapWrapper::EnsureInstance(); ++ } ++#endif ++ + // Ensure that the toolkit is created. + nsGTKToolkit::GetToolkit(); + + |