mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	compositor.c: implement xdg-toplevel-v6 request events
This commit is contained in:
		
							parent
							
								
									0f865c547a
								
							
						
					
					
						commit
						c912de6390
					
				
					 1 changed files with 86 additions and 1 deletions
				
			
		| 
						 | 
					@ -60,6 +60,16 @@ struct sample_state {
 | 
				
			||||||
	struct wl_listener new_xdg_surface_v6;
 | 
						struct wl_listener new_xdg_surface_v6;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct example_xdg_surface_v6 {
 | 
				
			||||||
 | 
						struct wlr_xdg_surface_v6 *surface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct wl_listener destroy_listener;
 | 
				
			||||||
 | 
						struct wl_listener request_minimize_listener;
 | 
				
			||||||
 | 
						struct wl_listener request_move_listener;
 | 
				
			||||||
 | 
						struct wl_listener request_resize_listener;
 | 
				
			||||||
 | 
						struct wl_listener request_show_window_menu_listener;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Convert timespec to milliseconds
 | 
					 * Convert timespec to milliseconds
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					@ -88,12 +98,87 @@ static void output_frame_handle_surface(struct sample_state *sample,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void handle_xdg_surface_v6_destroy(struct wl_listener *listener,
 | 
				
			||||||
 | 
							void *data) {
 | 
				
			||||||
 | 
						struct example_xdg_surface_v6 *example_surface =
 | 
				
			||||||
 | 
							wl_container_of(listener, example_surface, destroy_listener);
 | 
				
			||||||
 | 
						wl_list_remove(&example_surface->destroy_listener.link);
 | 
				
			||||||
 | 
						wl_list_remove(&example_surface->request_move_listener.link);
 | 
				
			||||||
 | 
						wl_list_remove(&example_surface->request_resize_listener.link);
 | 
				
			||||||
 | 
						wl_list_remove(&example_surface->request_show_window_menu_listener.link);
 | 
				
			||||||
 | 
						wl_list_remove(&example_surface->request_minimize_listener.link);
 | 
				
			||||||
 | 
						free(example_surface);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void handle_xdg_surface_v6_request_move(struct wl_listener *listener,
 | 
				
			||||||
 | 
							void *data) {
 | 
				
			||||||
 | 
						struct example_xdg_surface_v6 *example_surface =
 | 
				
			||||||
 | 
							wl_container_of(listener, example_surface, request_move_listener);
 | 
				
			||||||
 | 
						struct wlr_xdg_toplevel_v6_move_event *e = data;
 | 
				
			||||||
 | 
						wlr_log(L_DEBUG, "TODO: surface requested move: %s", e->surface->title);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void handle_xdg_surface_v6_request_resize(struct wl_listener *listener,
 | 
				
			||||||
 | 
							void *data) {
 | 
				
			||||||
 | 
						struct example_xdg_surface_v6 *example_surface =
 | 
				
			||||||
 | 
							wl_container_of(listener, example_surface, request_resize_listener);
 | 
				
			||||||
 | 
						struct wlr_xdg_toplevel_v6_resize_event *e = data;
 | 
				
			||||||
 | 
						wlr_log(L_DEBUG, "TODO: surface requested resize: %s", e->surface->title);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void handle_xdg_surface_v6_request_show_window_menu(
 | 
				
			||||||
 | 
							struct wl_listener *listener, void *data) {
 | 
				
			||||||
 | 
						struct example_xdg_surface_v6 *example_surface =
 | 
				
			||||||
 | 
							wl_container_of(listener, example_surface,
 | 
				
			||||||
 | 
								request_show_window_menu_listener);
 | 
				
			||||||
 | 
						struct wlr_xdg_toplevel_v6_show_window_menu_event *e = data;
 | 
				
			||||||
 | 
						wlr_log(L_DEBUG, "TODO: surface requested to show window menu: %s",
 | 
				
			||||||
 | 
							e->surface->title);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void handle_xdg_surface_v6_request_minimize(
 | 
				
			||||||
 | 
							struct wl_listener *listener, void *data) {
 | 
				
			||||||
 | 
						struct example_xdg_surface_v6 *example_surface =
 | 
				
			||||||
 | 
							wl_container_of(listener, example_surface, request_minimize_listener);
 | 
				
			||||||
 | 
						wlr_log(L_DEBUG, "TODO: surface requested to be minimized: %s",
 | 
				
			||||||
 | 
							example_surface->surface->title);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void handle_new_xdg_surface_v6(struct wl_listener *listener,
 | 
					static void handle_new_xdg_surface_v6(struct wl_listener *listener,
 | 
				
			||||||
		void *data) {
 | 
							void *data) {
 | 
				
			||||||
	struct wlr_xdg_surface_v6 *surface = data;
 | 
						struct wlr_xdg_surface_v6 *surface = data;
 | 
				
			||||||
	wlr_log(L_DEBUG, "new xdg surface: title=%s, app_id=%s",
 | 
						wlr_log(L_DEBUG, "new xdg surface: title=%s, app_id=%s",
 | 
				
			||||||
		surface->title, surface->app_id);
 | 
							surface->title, surface->app_id);
 | 
				
			||||||
	// configure the surface and add it to data structures here
 | 
					
 | 
				
			||||||
 | 
						struct example_xdg_surface_v6 *esurface =
 | 
				
			||||||
 | 
							calloc(1, sizeof(struct example_xdg_surface_v6));
 | 
				
			||||||
 | 
						if (esurface == NULL) {
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						esurface->surface = surface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wl_signal_add(&surface->events.destroy, &esurface->destroy_listener);
 | 
				
			||||||
 | 
						esurface->destroy_listener.notify = handle_xdg_surface_v6_destroy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wl_signal_add(&surface->events.request_move,
 | 
				
			||||||
 | 
							&esurface->request_move_listener);
 | 
				
			||||||
 | 
						esurface->request_move_listener.notify = handle_xdg_surface_v6_request_move;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wl_signal_add(&surface->events.request_resize,
 | 
				
			||||||
 | 
							&esurface->request_resize_listener);
 | 
				
			||||||
 | 
						esurface->request_resize_listener.notify =
 | 
				
			||||||
 | 
							handle_xdg_surface_v6_request_resize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wl_signal_add(&surface->events.request_show_window_menu,
 | 
				
			||||||
 | 
							&esurface->request_show_window_menu_listener);
 | 
				
			||||||
 | 
						esurface->request_show_window_menu_listener.notify =
 | 
				
			||||||
 | 
							handle_xdg_surface_v6_request_show_window_menu;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wl_signal_add(&surface->events.request_minimize,
 | 
				
			||||||
 | 
							&esurface->request_minimize_listener);
 | 
				
			||||||
 | 
						esurface->request_minimize_listener.notify =
 | 
				
			||||||
 | 
							handle_xdg_surface_v6_request_minimize;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void handle_output_frame(struct output_state *output,
 | 
					static void handle_output_frame(struct output_state *output,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue