mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-10-29 05:40:12 -04:00 
			
		
		
		
	scene_output_layout: make output adding explicit
Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3709
This commit is contained in:
		
							parent
							
								
									91f813ffb7
								
							
						
					
					
						commit
						f5917f0247
					
				
					 3 changed files with 27 additions and 37 deletions
				
			
		|  | @ -30,6 +30,7 @@ | ||||||
| 
 | 
 | ||||||
| struct wlr_output; | struct wlr_output; | ||||||
| struct wlr_output_layout; | struct wlr_output_layout; | ||||||
|  | struct wlr_output_layout_output; | ||||||
| struct wlr_xdg_surface; | struct wlr_xdg_surface; | ||||||
| struct wlr_layer_surface_v1; | struct wlr_layer_surface_v1; | ||||||
| struct wlr_drag_icon; | struct wlr_drag_icon; | ||||||
|  | @ -37,6 +38,7 @@ struct wlr_surface; | ||||||
| 
 | 
 | ||||||
| struct wlr_scene_node; | struct wlr_scene_node; | ||||||
| struct wlr_scene_buffer; | struct wlr_scene_buffer; | ||||||
|  | struct wlr_scene_output_layout; | ||||||
| 
 | 
 | ||||||
| struct wlr_presentation; | struct wlr_presentation; | ||||||
| struct wlr_linux_dmabuf_v1; | struct wlr_linux_dmabuf_v1; | ||||||
|  | @ -515,14 +517,22 @@ struct wlr_scene_output *wlr_scene_get_scene_output(struct wlr_scene *scene, | ||||||
| /**
 | /**
 | ||||||
|  * Attach an output layout to a scene. |  * Attach an output layout to a scene. | ||||||
|  * |  * | ||||||
|  * Adding, removing, or repositioning an output in the output layout |  * With an attached `wlr_scene_output_layout`, removing or repositioning an output in the output | ||||||
|  * will respectively add, remove or reposition a corresponding |  * layout will respectively remove or reposition a corresponding scene-graph output. When the output | ||||||
|  * scene-graph output. When the output layout is destroyed, scene-graph |  * layout is destroyed, scene-graph outputs which were attached to this helper will be destroyed. | ||||||
|  * outputs which were created by this helper will be destroyed. |  * | ||||||
|  |  * When adding an output to the output_layout, users must also create a `wlr_scene_output` and pass | ||||||
|  |  * it to wlr_scene_output_layout_add_output(). | ||||||
|  */ |  */ | ||||||
| bool wlr_scene_attach_output_layout(struct wlr_scene *scene, | struct wlr_scene_output_layout *wlr_scene_attach_output_layout(struct wlr_scene *scene, | ||||||
| 	struct wlr_output_layout *output_layout); | 	struct wlr_output_layout *output_layout); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * Add an output to the scene, with its positioning defined by the output layout. | ||||||
|  |  */ | ||||||
|  | void wlr_scene_output_layout_add_output(struct wlr_scene_output_layout *sol, | ||||||
|  | 	struct wlr_output_layout_output *lo, struct wlr_scene_output *so); | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Add a node displaying a surface and all of its sub-surfaces to the |  * Add a node displaying a surface and all of its sub-surfaces to the | ||||||
|  * scene-graph. |  * scene-graph. | ||||||
|  |  | ||||||
|  | @ -39,6 +39,7 @@ struct tinywl_server { | ||||||
| 	struct wlr_renderer *renderer; | 	struct wlr_renderer *renderer; | ||||||
| 	struct wlr_allocator *allocator; | 	struct wlr_allocator *allocator; | ||||||
| 	struct wlr_scene *scene; | 	struct wlr_scene *scene; | ||||||
|  | 	struct wlr_scene_output_layout *scene_layout; | ||||||
| 
 | 
 | ||||||
| 	struct wlr_xdg_shell *xdg_shell; | 	struct wlr_xdg_shell *xdg_shell; | ||||||
| 	struct wl_listener new_xdg_surface; | 	struct wl_listener new_xdg_surface; | ||||||
|  | @ -646,7 +647,10 @@ static void server_new_output(struct wl_listener *listener, void *data) { | ||||||
| 	 * display, which Wayland clients can see to find out information about the | 	 * display, which Wayland clients can see to find out information about the | ||||||
| 	 * output (such as DPI, scale factor, manufacturer, etc). | 	 * output (such as DPI, scale factor, manufacturer, etc). | ||||||
| 	 */ | 	 */ | ||||||
| 	wlr_output_layout_add_auto(server->output_layout, wlr_output); | 	struct wlr_output_layout_output *l_output = wlr_output_layout_add_auto(server->output_layout, | ||||||
|  | 		wlr_output); | ||||||
|  | 	struct wlr_scene_output *scene_output = wlr_scene_output_create(server->scene, wlr_output); | ||||||
|  | 	wlr_scene_output_layout_add_output(server->scene_layout, l_output, scene_output); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void xdg_toplevel_map(struct wl_listener *listener, void *data) { | static void xdg_toplevel_map(struct wl_listener *listener, void *data) { | ||||||
|  | @ -906,7 +910,7 @@ int main(int argc, char *argv[]) { | ||||||
| 	 * necessary. | 	 * necessary. | ||||||
| 	 */ | 	 */ | ||||||
| 	server.scene = wlr_scene_create(); | 	server.scene = wlr_scene_create(); | ||||||
| 	wlr_scene_attach_output_layout(server.scene, server.output_layout); | 	server.scene_layout = wlr_scene_attach_output_layout(server.scene, server.output_layout); | ||||||
| 
 | 
 | ||||||
| 	/* Set up xdg-shell version 3. The xdg-shell is a Wayland protocol which is
 | 	/* Set up xdg-shell version 3. The xdg-shell is a Wayland protocol which is
 | ||||||
| 	 * used for application windows. For more detail on shells, refer to my | 	 * used for application windows. For more detail on shells, refer to my | ||||||
|  |  | ||||||
|  | @ -8,7 +8,6 @@ struct wlr_scene_output_layout { | ||||||
| 
 | 
 | ||||||
| 	struct wl_list outputs; // wlr_scene_output_layout_output.link
 | 	struct wl_list outputs; // wlr_scene_output_layout_output.link
 | ||||||
| 
 | 
 | ||||||
| 	struct wl_listener layout_add; |  | ||||||
| 	struct wl_listener layout_change; | 	struct wl_listener layout_change; | ||||||
| 	struct wl_listener layout_destroy; | 	struct wl_listener layout_destroy; | ||||||
| 	struct wl_listener scene_destroy; | 	struct wl_listener scene_destroy; | ||||||
|  | @ -53,7 +52,6 @@ static void scene_output_layout_destroy(struct wlr_scene_output_layout *sol) { | ||||||
| 	wl_list_for_each_safe(solo, tmp, &sol->outputs, link) { | 	wl_list_for_each_safe(solo, tmp, &sol->outputs, link) { | ||||||
| 		scene_output_layout_output_destroy(solo); | 		scene_output_layout_output_destroy(solo); | ||||||
| 	} | 	} | ||||||
| 	wl_list_remove(&sol->layout_add.link); |  | ||||||
| 	wl_list_remove(&sol->layout_change.link); | 	wl_list_remove(&sol->layout_change.link); | ||||||
| 	wl_list_remove(&sol->layout_destroy.link); | 	wl_list_remove(&sol->layout_destroy.link); | ||||||
| 	wl_list_remove(&sol->scene_destroy.link); | 	wl_list_remove(&sol->scene_destroy.link); | ||||||
|  | @ -72,19 +70,14 @@ static void scene_output_layout_handle_layout_change( | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void scene_output_layout_add(struct wlr_scene_output_layout *sol, | void wlr_scene_output_layout_add_output(struct wlr_scene_output_layout *sol, | ||||||
| 		struct wlr_output_layout_output *lo) { | 		struct wlr_output_layout_output *lo, struct wlr_scene_output *so) { | ||||||
| 	struct wlr_scene_output_layout_output *solo = calloc(1, sizeof(*solo)); | 	struct wlr_scene_output_layout_output *solo = calloc(1, sizeof(*solo)); | ||||||
| 	if (solo == NULL) { | 	if (solo == NULL) { | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	solo->scene_output = wlr_scene_output_create(sol->scene, lo->output); | 	solo->scene_output = so; | ||||||
| 	if (solo->scene_output == NULL) { |  | ||||||
| 		free(solo); |  | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	solo->layout_output = lo; | 	solo->layout_output = lo; | ||||||
| 
 | 
 | ||||||
| 	solo->layout_output_destroy.notify = | 	solo->layout_output_destroy.notify = | ||||||
|  | @ -101,15 +94,6 @@ static void scene_output_layout_add(struct wlr_scene_output_layout *sol, | ||||||
| 	wlr_scene_output_set_position(solo->scene_output, lo->x, lo->y); | 	wlr_scene_output_set_position(solo->scene_output, lo->x, lo->y); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void scene_output_layout_handle_layout_add( |  | ||||||
| 		struct wl_listener *listener, void *data) { |  | ||||||
| 	struct wlr_scene_output_layout *sol = |  | ||||||
| 		wl_container_of(listener, sol, layout_add); |  | ||||||
| 	struct wlr_output_layout_output *lo = data; |  | ||||||
| 
 |  | ||||||
| 	scene_output_layout_add(sol, lo); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void scene_output_layout_handle_layout_destroy( | static void scene_output_layout_handle_layout_destroy( | ||||||
| 		struct wl_listener *listener, void *data) { | 		struct wl_listener *listener, void *data) { | ||||||
| 	struct wlr_scene_output_layout *sol = | 	struct wlr_scene_output_layout *sol = | ||||||
|  | @ -124,11 +108,11 @@ static void scene_output_layout_handle_scene_destroy( | ||||||
| 	scene_output_layout_destroy(sol); | 	scene_output_layout_destroy(sol); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool wlr_scene_attach_output_layout(struct wlr_scene *scene, | struct wlr_scene_output_layout *wlr_scene_attach_output_layout(struct wlr_scene *scene, | ||||||
| 		struct wlr_output_layout *output_layout) { | 		struct wlr_output_layout *output_layout) { | ||||||
| 	struct wlr_scene_output_layout *sol = calloc(1, sizeof(*sol)); | 	struct wlr_scene_output_layout *sol = calloc(1, sizeof(*sol)); | ||||||
| 	if (sol == NULL) { | 	if (sol == NULL) { | ||||||
| 		return false; | 		return NULL; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	sol->scene = scene; | 	sol->scene = scene; | ||||||
|  | @ -142,16 +126,8 @@ bool wlr_scene_attach_output_layout(struct wlr_scene *scene, | ||||||
| 	sol->layout_change.notify = scene_output_layout_handle_layout_change; | 	sol->layout_change.notify = scene_output_layout_handle_layout_change; | ||||||
| 	wl_signal_add(&output_layout->events.change, &sol->layout_change); | 	wl_signal_add(&output_layout->events.change, &sol->layout_change); | ||||||
| 
 | 
 | ||||||
| 	sol->layout_add.notify = scene_output_layout_handle_layout_add; |  | ||||||
| 	wl_signal_add(&output_layout->events.add, &sol->layout_add); |  | ||||||
| 
 |  | ||||||
| 	sol->scene_destroy.notify = scene_output_layout_handle_scene_destroy; | 	sol->scene_destroy.notify = scene_output_layout_handle_scene_destroy; | ||||||
| 	wl_signal_add(&scene->tree.node.events.destroy, &sol->scene_destroy); | 	wl_signal_add(&scene->tree.node.events.destroy, &sol->scene_destroy); | ||||||
| 
 | 
 | ||||||
| 	struct wlr_output_layout_output *lo; | 	return sol; | ||||||
| 	wl_list_for_each(lo, &output_layout->outputs, link) { |  | ||||||
| 		scene_output_layout_add(sol, lo); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return true; |  | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Rose Hudson
						Rose Hudson