mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Allow xwayland views to become urgent when on a non-visible workspace
This removes the urgency stuff from the commit handler and puts it in a new set_hints handler instead. This allows the xwayland surface to become urgent without having to commit (which doesn't happen if it's on an non-visible workspace).
This commit is contained in:
		
							parent
							
								
									4931d0ddc5
								
							
						
					
					
						commit
						63d6233fcb
					
				
					 2 changed files with 18 additions and 4 deletions
				
			
		| 
						 | 
					@ -140,6 +140,7 @@ struct sway_xwayland_view {
 | 
				
			||||||
	struct wl_listener set_title;
 | 
						struct wl_listener set_title;
 | 
				
			||||||
	struct wl_listener set_class;
 | 
						struct wl_listener set_class;
 | 
				
			||||||
	struct wl_listener set_window_type;
 | 
						struct wl_listener set_window_type;
 | 
				
			||||||
 | 
						struct wl_listener set_hints;
 | 
				
			||||||
	struct wl_listener map;
 | 
						struct wl_listener map;
 | 
				
			||||||
	struct wl_listener unmap;
 | 
						struct wl_listener unmap;
 | 
				
			||||||
	struct wl_listener destroy;
 | 
						struct wl_listener destroy;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -290,10 +290,6 @@ static void handle_commit(struct wl_listener *listener, void *data) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	view_damage_from(view);
 | 
						view_damage_from(view);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (view->allow_request_urgent) {
 | 
					 | 
				
			||||||
		view_set_urgent(view, (bool)xsurface->hints_urgency);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void handle_destroy(struct wl_listener *listener, void *data) {
 | 
					static void handle_destroy(struct wl_listener *listener, void *data) {
 | 
				
			||||||
| 
						 | 
					@ -312,6 +308,7 @@ static void handle_destroy(struct wl_listener *listener, void *data) {
 | 
				
			||||||
	wl_list_remove(&xwayland_view->set_title.link);
 | 
						wl_list_remove(&xwayland_view->set_title.link);
 | 
				
			||||||
	wl_list_remove(&xwayland_view->set_class.link);
 | 
						wl_list_remove(&xwayland_view->set_class.link);
 | 
				
			||||||
	wl_list_remove(&xwayland_view->set_window_type.link);
 | 
						wl_list_remove(&xwayland_view->set_window_type.link);
 | 
				
			||||||
 | 
						wl_list_remove(&xwayland_view->set_hints.link);
 | 
				
			||||||
	wl_list_remove(&xwayland_view->map.link);
 | 
						wl_list_remove(&xwayland_view->map.link);
 | 
				
			||||||
	wl_list_remove(&xwayland_view->unmap.link);
 | 
						wl_list_remove(&xwayland_view->unmap.link);
 | 
				
			||||||
	view_destroy(&xwayland_view->view);
 | 
						view_destroy(&xwayland_view->view);
 | 
				
			||||||
| 
						 | 
					@ -437,6 +434,19 @@ static void handle_set_window_type(struct wl_listener *listener, void *data) {
 | 
				
			||||||
	view_execute_criteria(view);
 | 
						view_execute_criteria(view);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void handle_set_hints(struct wl_listener *listener, void *data) {
 | 
				
			||||||
 | 
						struct sway_xwayland_view *xwayland_view =
 | 
				
			||||||
 | 
							wl_container_of(listener, xwayland_view, set_hints);
 | 
				
			||||||
 | 
						struct sway_view *view = &xwayland_view->view;
 | 
				
			||||||
 | 
						struct wlr_xwayland_surface *xsurface = view->wlr_xwayland_surface;
 | 
				
			||||||
 | 
						if (!xsurface->mapped) {
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (view->allow_request_urgent) {
 | 
				
			||||||
 | 
							view_set_urgent(view, (bool)xsurface->hints_urgency);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sway_view *view_from_wlr_xwayland_surface(
 | 
					struct sway_view *view_from_wlr_xwayland_surface(
 | 
				
			||||||
		struct wlr_xwayland_surface *xsurface) {
 | 
							struct wlr_xwayland_surface *xsurface) {
 | 
				
			||||||
	return xsurface->data;
 | 
						return xsurface->data;
 | 
				
			||||||
| 
						 | 
					@ -489,6 +499,9 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) {
 | 
				
			||||||
			&xwayland_view->set_window_type);
 | 
								&xwayland_view->set_window_type);
 | 
				
			||||||
	xwayland_view->set_window_type.notify = handle_set_window_type;
 | 
						xwayland_view->set_window_type.notify = handle_set_window_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wl_signal_add(&xsurface->events.set_hints, &xwayland_view->set_hints);
 | 
				
			||||||
 | 
						xwayland_view->set_hints.notify = handle_set_hints;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wl_signal_add(&xsurface->events.unmap, &xwayland_view->unmap);
 | 
						wl_signal_add(&xsurface->events.unmap, &xwayland_view->unmap);
 | 
				
			||||||
	xwayland_view->unmap.notify = handle_unmap;
 | 
						xwayland_view->unmap.notify = handle_unmap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue