mirror of
				https://github.com/labwc/labwc.git
				synced 2025-11-03 09:01:51 -05:00 
			
		
		
		
	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:
		
							parent
							
								
									125bab4796
								
							
						
					
					
						commit
						259d6d0c71
					
				
					 1 changed files with 29 additions and 0 deletions
				
			
		
							
								
								
									
										29
									
								
								src/seat.c
									
										
									
									
									
								
							
							
						
						
									
										29
									
								
								src/seat.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue