examples/scene-graph: demonstrate scene_rect node type
Add RECT nodes to the scene-graph demo to illustrate how they are used. Here, we add a solid rectangle behind each surface as a quick-and-dirty border, handling surface.commit in order to size it appropriately.
This commit is contained in:
		
							parent
							
								
									9ed16e39fa
								
							
						
					
					
						commit
						e2e68ff680
					
				|  | @ -20,6 +20,8 @@ | |||
|  * | ||||
|  * New surfaces are stacked on top of the existing ones as they appear. */ | ||||
| 
 | ||||
| static const int border_width = 3; | ||||
| 
 | ||||
| struct server { | ||||
| 	struct wl_display *display; | ||||
| 	struct wlr_backend *backend; | ||||
|  | @ -35,8 +37,10 @@ struct server { | |||
| struct surface { | ||||
| 	struct wlr_surface *wlr; | ||||
| 	struct wlr_scene_surface *scene_surface; | ||||
| 	struct wlr_scene_rect *border; | ||||
| 	struct wl_list link; | ||||
| 
 | ||||
| 	struct wl_listener commit; | ||||
| 	struct wl_listener destroy; | ||||
| }; | ||||
| 
 | ||||
|  | @ -102,9 +106,17 @@ static void server_handle_new_output(struct wl_listener *listener, void *data) { | |||
| 	wlr_output_create_global(wlr_output); | ||||
| } | ||||
| 
 | ||||
| static void surface_handle_commit(struct wl_listener *listener, void *data) { | ||||
| 	struct surface *surface = wl_container_of(listener, surface, commit); | ||||
| 	wlr_scene_rect_set_size(surface->border, | ||||
| 			surface->wlr->current.width + 2 * border_width, | ||||
| 			surface->wlr->current.height + 2 * border_width); | ||||
| } | ||||
| 
 | ||||
| static void surface_handle_destroy(struct wl_listener *listener, void *data) { | ||||
| 	struct surface *surface = wl_container_of(listener, surface, destroy); | ||||
| 	wlr_scene_node_destroy(&surface->scene_surface->node); | ||||
| 	wlr_scene_node_destroy(&surface->border->node); | ||||
| 	wl_list_remove(&surface->destroy.link); | ||||
| 	wl_list_remove(&surface->link); | ||||
| 	free(surface); | ||||
|  | @ -119,13 +131,22 @@ static void server_handle_new_surface(struct wl_listener *listener, | |||
| 
 | ||||
| 	struct surface *surface = calloc(1, sizeof(struct surface)); | ||||
| 	surface->wlr = wlr_surface; | ||||
| 	surface->commit.notify = surface_handle_commit; | ||||
| 	wl_signal_add(&wlr_surface->events.commit, &surface->commit); | ||||
| 	surface->destroy.notify = surface_handle_destroy; | ||||
| 	wl_signal_add(&wlr_surface->events.destroy, &surface->destroy); | ||||
| 
 | ||||
| 	/* Border dimensions will be set in surface.commit handler */ | ||||
| 	surface->border = wlr_scene_rect_create(&server->scene->node, | ||||
| 			0, 0, (float[4]){ 0.5f, 0.5f, 0.5f, 1 }); | ||||
| 	wlr_scene_node_set_position(&surface->border->node, pos, pos); | ||||
| 
 | ||||
| 	surface->scene_surface = | ||||
| 		wlr_scene_surface_create(&server->scene->node, wlr_surface); | ||||
| 	wl_list_insert(server->surfaces.prev, &surface->link); | ||||
| 
 | ||||
| 	wlr_scene_node_set_position(&surface->scene_surface->node, pos, pos); | ||||
| 	wlr_scene_node_set_position(&surface->scene_surface->node, | ||||
| 			pos + border_width, pos + border_width); | ||||
| } | ||||
| 
 | ||||
| int main(int argc, char *argv[]) { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue