diff --git a/widget/gtk/nsGtkKeyUtils.cpp b/widget/gtk/nsGtkKeyUtils.cpp --- a/widget/gtk/nsGtkKeyUtils.cpp +++ b/widget/gtk/nsGtkKeyUtils.cpp @@ -2424,17 +2424,23 @@ #ifdef MOZ_WAYLAND void KeymapWrapper::SetFocusIn(wl_surface* aFocusSurface, uint32_t aFocusSerial) { + LOGW("KeymapWrapper::SetFocusIn() surface %p ID %d serial %d", aFocusSurface, + aFocusSurface ? wl_proxy_get_id((struct wl_proxy*)aFocusSurface) : 0, + aFocusSerial); + KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance(); keymapWrapper->mFocusSurface = aFocusSurface; keymapWrapper->mFocusSerial = aFocusSerial; } +// aFocusSurface can be null in case that focused surface is already destroyed. void KeymapWrapper::SetFocusOut(wl_surface* aFocusSurface) { KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance(); - if (aFocusSurface == keymapWrapper->mFocusSurface) { - keymapWrapper->mFocusSurface = nullptr; - keymapWrapper->mFocusSerial = 0; - } + LOGW("KeymapWrapper::SetFocusOut surface %p ID %d", aFocusSurface, + aFocusSurface ? wl_proxy_get_id((struct wl_proxy*)aFocusSurface) : 0); + + keymapWrapper->mFocusSurface = nullptr; + keymapWrapper->mFocusSerial = 0; } void KeymapWrapper::GetFocusInfo(wl_surface** aFocusSurface, @@ -2453,7 +2459,6 @@ KeymapWrapper* keymapWrapper = KeymapWrapper::GetInstance(); return keymapWrapper->mSeat; } - #endif } // namespace widget diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h --- a/widget/gtk/nsWindow.h +++ b/widget/gtk/nsWindow.h @@ -386,8 +386,7 @@ #ifdef MOZ_WAYLAND // Use xdg-activation protocol to transfer focus from gFocusWindow to aWindow. - // RequestFocusWaylandWindow needs to be called on focused window only. - void RequestFocusWaylandWindow(RefPtr aWindow); + static void RequestFocusWaylandWindow(RefPtr aWindow); void FocusWaylandWindow(const char* aTokenID); bool GetCSDDecorationOffset(int* aDx, int* aDy); diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp --- a/widget/gtk/nsWindow.cpp +++ b/widget/gtk/nsWindow.cpp @@ -2845,6 +2845,9 @@ return; } + LOG(" requesting xdg-activation, surface ID %d", + wl_proxy_get_id((struct wl_proxy*)surface)); + xdg_activation_v1* xdg_activation = WaylandDisplayGet()->GetXdgActivation(); xdg_activation_v1_activate(xdg_activation, aTokenID, surface); } @@ -2862,12 +2865,17 @@ }; void nsWindow::RequestFocusWaylandWindow(RefPtr aWindow) { - LOG("nsWindow::RequestWindowFocusWayland(%p)", (void*)aWindow); + LOGW("nsWindow::RequestFocusWaylandWindow(%p) gFocusWindow %p", + (void*)aWindow, gFocusWindow); + + if (!gFocusWindow) { + LOGW(" missing gFocusWindow, quit."); + } RefPtr display = WaylandDisplayGet(); xdg_activation_v1* xdg_activation = display->GetXdgActivation(); if (!xdg_activation) { - LOG(" xdg-activation is missing, quit."); + LOGW(" xdg-activation is missing, quit."); return; } @@ -2875,13 +2883,25 @@ uint32_t focusSerial; KeymapWrapper::GetFocusInfo(&focusSurface, &focusSerial); if (!focusSurface) { - LOG(" We're missing focused window, quit."); - return; - } - - LOG(" requesting xdg-activation token, surface ID %d serial %d seat ID %d", - wl_proxy_get_id((struct wl_proxy*)focusSurface), focusSerial, - wl_proxy_get_id((struct wl_proxy*)KeymapWrapper::GetSeat())); + LOGW(" We're missing focused window, quit."); + return; + } + + GdkWindow* gdkWindow = gtk_widget_get_window(gFocusWindow->mShell); + wl_surface* surface = + gdkWindow ? gdk_wayland_window_get_wl_surface(gdkWindow) : nullptr; + if (focusSurface != surface) { + LOGW(" focused surface %p and gFocusWindow surface %p don't match, quit.", + focusSurface, surface); + return; + } + + LOGW( + " requesting xdg-activation token, surface %p ID %d serial %d seat ID " + "%d", + focusSurface, + focusSurface ? wl_proxy_get_id((struct wl_proxy*)focusSurface) : 0, + focusSerial, wl_proxy_get_id((struct wl_proxy*)KeymapWrapper::GetSeat())); // Store activation token at activated window for further release. g_clear_pointer(&aWindow->mXdgToken, xdg_activation_token_v1_destroy);