seat: ignore focus change to unmanaged surface belonging to same PID

If an xwayland-unmanaged surface was focused belonging to the same
application as the focused view, allow the view to remain active. This
fixes an issue with menus immediately closing in some X11 apps (try
LibreOffice with SAL_USE_VCLPLUGIN=gen).

Fixes: 4028a9482f
("seat: use focus_change event to update focused/active view")
This commit is contained in:
John Lindgren 2023-10-14 12:41:31 -04:00
parent 125bab4796
commit 259d6d0c71

View file

@ -13,6 +13,10 @@
#include "labwc.h"
#include "view.h"
#if HAVE_XWAYLAND
#include <wlr/xwayland.h>
#endif
static void
input_device_destroy(struct wl_listener *listener, void *data)
{
@ -353,6 +357,31 @@ focus_change_notify(struct wl_listener *listener, void *data)
struct view *view = event->new_surface ?
view_from_wlr_surface(event->new_surface) : NULL;
#if HAVE_XWAYLAND
/*
* If an xwayland-unmanaged surface was focused belonging to the
* same application as the focused view, allow the view to remain
* active. This fixes an issue with menus immediately closing in
* some X11 apps (try LibreOffice with SAL_USE_VCLPLUGIN=gen).
*/
struct wlr_surface *old_surface =
server->focused_view ? server->focused_view->surface : NULL;
if (old_surface && event->new_surface && !view
&& wlr_surface_is_xwayland_surface(old_surface)
&& wlr_surface_is_xwayland_surface(event->new_surface)) {
struct wlr_xwayland_surface *old_xsurface =
wlr_xwayland_surface_from_wlr_surface(old_surface);
struct wlr_xwayland_surface *new_xsurface =
wlr_xwayland_surface_from_wlr_surface(event->new_surface);
if (old_xsurface && new_xsurface
&& old_xsurface->pid == new_xsurface->pid) {
return;
}
}
#endif
if (view != server->focused_view) {
if (server->focused_view) {
view_set_activated(server->focused_view, false);