|  |  | @ -3,7 +3,7 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <stdio.h> |  |  |  | #include <stdio.h> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <wlr/types/wlr_output_layout.h> |  |  |  | #include <wlr/types/wlr_output_layout.h> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <wlr/types/wlr_output.h> |  |  |  | #include <wlr/types/wlr_output.h> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <wlr/types/wlr_xdg_output.h> |  |  |  | #include <wlr/types/wlr_xdg_output_v1.h> | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | #include <wlr/util/log.h> |  |  |  | #include <wlr/util/log.h> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include "xdg-output-unstable-v1-protocol.h" |  |  |  | #include "xdg-output-unstable-v1-protocol.h" | 
			
		
	
		
		
			
				
					
					|  |  |  | #include "util/signal.h" |  |  |  | #include "util/signal.h" | 
			
		
	
	
		
		
			
				
					|  |  | @ -23,7 +23,7 @@ static void output_handle_resource_destroy(struct wl_resource *resource) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	wl_list_remove(wl_resource_get_link(resource)); |  |  |  | 	wl_list_remove(wl_resource_get_link(resource)); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void output_send_details(struct wlr_xdg_output *xdg_output, |  |  |  | static void output_send_details(struct wlr_xdg_output_v1 *xdg_output, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		struct wl_resource *resource) { |  |  |  | 		struct wl_resource *resource) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_output *output = xdg_output->layout_output->output; |  |  |  | 	struct wlr_output *output = xdg_output->layout_output->output; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -46,7 +46,7 @@ static void output_send_details(struct wlr_xdg_output *xdg_output, | 
			
		
	
		
		
			
				
					
					|  |  |  | 	zxdg_output_v1_send_done(resource); |  |  |  | 	zxdg_output_v1_send_done(resource); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void output_update(struct wlr_xdg_output *xdg_output) { |  |  |  | static void output_update(struct wlr_xdg_output_v1 *xdg_output) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_output_layout_output *layout_output = xdg_output->layout_output; |  |  |  | 	struct wlr_output_layout_output *layout_output = xdg_output->layout_output; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	bool updated = false; |  |  |  | 	bool updated = false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -72,7 +72,7 @@ static void output_update(struct wlr_xdg_output *xdg_output) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void output_destroy(struct wlr_xdg_output *output) { |  |  |  | static void output_destroy(struct wlr_xdg_output_v1 *output) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	struct wl_resource *resource, *tmp; |  |  |  | 	struct wl_resource *resource, *tmp; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	wl_resource_for_each_safe(resource, tmp, &output->resources) { |  |  |  | 	wl_resource_for_each_safe(resource, tmp, &output->resources) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		wl_list_remove(wl_resource_get_link(resource)); |  |  |  | 		wl_list_remove(wl_resource_get_link(resource)); | 
			
		
	
	
		
		
			
				
					|  |  | @ -98,7 +98,7 @@ static void output_manager_handle_get_xdg_output(struct wl_client *client, | 
			
		
	
		
		
			
				
					
					|  |  |  | 	assert(wl_resource_instance_of(resource, &zxdg_output_manager_v1_interface, |  |  |  | 	assert(wl_resource_instance_of(resource, &zxdg_output_manager_v1_interface, | 
			
		
	
		
		
			
				
					
					|  |  |  | 		&output_manager_implementation)); |  |  |  | 		&output_manager_implementation)); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_xdg_output_manager *manager = |  |  |  | 	struct wlr_xdg_output_manager_v1 *manager = | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		wl_resource_get_user_data(resource); |  |  |  | 		wl_resource_get_user_data(resource); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_output_layout *layout = manager->layout; |  |  |  | 	struct wlr_output_layout *layout = manager->layout; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_output *output = wlr_output_from_resource(output_resource); |  |  |  | 	struct wlr_output *output = wlr_output_from_resource(output_resource); | 
			
		
	
	
		
		
			
				
					|  |  | @ -107,7 +107,7 @@ static void output_manager_handle_get_xdg_output(struct wl_client *client, | 
			
		
	
		
		
			
				
					
					|  |  |  | 		wlr_output_layout_get(layout, output); |  |  |  | 		wlr_output_layout_get(layout, output); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	assert(layout_output); |  |  |  | 	assert(layout_output); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_xdg_output *_xdg_output, *xdg_output = NULL; |  |  |  | 	struct wlr_xdg_output_v1 *_xdg_output, *xdg_output = NULL; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	wl_list_for_each(_xdg_output, &manager->outputs, link) { |  |  |  | 	wl_list_for_each(_xdg_output, &manager->outputs, link) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (_xdg_output->layout_output == layout_output) { |  |  |  | 		if (_xdg_output->layout_output == layout_output) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			xdg_output = _xdg_output; |  |  |  | 			xdg_output = _xdg_output; | 
			
		
	
	
		
		
			
				
					|  |  | @ -144,7 +144,7 @@ static void output_manager_handle_resource_destroy( | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void output_manager_bind(struct wl_client *wl_client, void *data, |  |  |  | static void output_manager_bind(struct wl_client *wl_client, void *data, | 
			
		
	
		
		
			
				
					
					|  |  |  | 		uint32_t version, uint32_t id) { |  |  |  | 		uint32_t version, uint32_t id) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_xdg_output_manager *manager = data; |  |  |  | 	struct wlr_xdg_output_manager_v1 *manager = data; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wl_resource *resource = wl_resource_create(wl_client, |  |  |  | 	struct wl_resource *resource = wl_resource_create(wl_client, | 
			
		
	
		
		
			
				
					
					|  |  |  | 		&zxdg_output_manager_v1_interface, version, id); |  |  |  | 		&zxdg_output_manager_v1_interface, version, id); | 
			
		
	
	
		
		
			
				
					|  |  | @ -158,13 +158,13 @@ static void output_manager_bind(struct wl_client *wl_client, void *data, | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void handle_output_destroy(struct wl_listener *listener, void *data) { |  |  |  | static void handle_output_destroy(struct wl_listener *listener, void *data) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_xdg_output *output = wl_container_of(listener, output, destroy); |  |  |  | 	struct wlr_xdg_output_v1 *output = wl_container_of(listener, output, destroy); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	output_destroy(output); |  |  |  | 	output_destroy(output); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void add_output(struct wlr_xdg_output_manager *manager, |  |  |  | static void add_output(struct wlr_xdg_output_manager_v1 *manager, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		struct wlr_output_layout_output *layout_output) { |  |  |  | 		struct wlr_output_layout_output *layout_output) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_xdg_output *output = calloc(1, sizeof(struct wlr_xdg_output)); |  |  |  | 	struct wlr_xdg_output_v1 *output = calloc(1, sizeof(struct wlr_xdg_output_v1)); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	if (output == NULL) { |  |  |  | 	if (output == NULL) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return; |  |  |  | 		return; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
	
		
		
			
				
					|  |  | @ -178,37 +178,37 @@ static void add_output(struct wlr_xdg_output_manager *manager, | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void output_manager_send_details( |  |  |  | static void output_manager_send_details( | 
			
		
	
		
		
			
				
					
					|  |  |  | 		struct wlr_xdg_output_manager *manager) { |  |  |  | 		struct wlr_xdg_output_manager_v1 *manager) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_xdg_output *output; |  |  |  | 	struct wlr_xdg_output_v1 *output; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	wl_list_for_each(output, &manager->outputs, link) { |  |  |  | 	wl_list_for_each(output, &manager->outputs, link) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		output_update(output); |  |  |  | 		output_update(output); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void handle_layout_add(struct wl_listener *listener, void *data) { |  |  |  | static void handle_layout_add(struct wl_listener *listener, void *data) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_xdg_output_manager *manager = |  |  |  | 	struct wlr_xdg_output_manager_v1 *manager = | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		wl_container_of(listener, manager, layout_add); |  |  |  | 		wl_container_of(listener, manager, layout_add); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_output_layout_output *layout_output = data; |  |  |  | 	struct wlr_output_layout_output *layout_output = data; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	add_output(manager, layout_output); |  |  |  | 	add_output(manager, layout_output); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void handle_layout_change(struct wl_listener *listener, void *data) { |  |  |  | static void handle_layout_change(struct wl_listener *listener, void *data) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_xdg_output_manager *manager = |  |  |  | 	struct wlr_xdg_output_manager_v1 *manager = | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		wl_container_of(listener, manager, layout_change); |  |  |  | 		wl_container_of(listener, manager, layout_change); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	output_manager_send_details(manager); |  |  |  | 	output_manager_send_details(manager); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void handle_layout_destroy(struct wl_listener *listener, void *data) { |  |  |  | static void handle_layout_destroy(struct wl_listener *listener, void *data) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_xdg_output_manager *manager = |  |  |  | 	struct wlr_xdg_output_manager_v1 *manager = | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		wl_container_of(listener, manager, layout_destroy); |  |  |  | 		wl_container_of(listener, manager, layout_destroy); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	wlr_xdg_output_manager_destroy(manager); |  |  |  | 	wlr_xdg_output_manager_v1_destroy(manager); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | struct wlr_xdg_output_manager *wlr_xdg_output_manager_create( |  |  |  | struct wlr_xdg_output_manager_v1 *wlr_xdg_output_manager_v1_create( | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		struct wl_display *display, struct wlr_output_layout *layout) { |  |  |  | 		struct wl_display *display, struct wlr_output_layout *layout) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	assert(display && layout); |  |  |  | 	assert(display && layout); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_xdg_output_manager *manager = |  |  |  | 	struct wlr_xdg_output_manager_v1 *manager = | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		calloc(1, sizeof(struct wlr_xdg_output_manager)); |  |  |  | 		calloc(1, sizeof(struct wlr_xdg_output_manager_v1)); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	if (manager == NULL) { |  |  |  | 	if (manager == NULL) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return NULL; |  |  |  | 		return NULL; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
	
		
		
			
				
					|  |  | @ -239,8 +239,8 @@ struct wlr_xdg_output_manager *wlr_xdg_output_manager_create( | 
			
		
	
		
		
			
				
					
					|  |  |  | 	return manager; |  |  |  | 	return manager; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void wlr_xdg_output_manager_destroy(struct wlr_xdg_output_manager *manager) { |  |  |  | void wlr_xdg_output_manager_v1_destroy(struct wlr_xdg_output_manager_v1 *manager) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_xdg_output *output, *output_tmp; |  |  |  | 	struct wlr_xdg_output_v1 *output, *output_tmp; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	wl_list_for_each_safe(output, output_tmp, &manager->outputs, link) { |  |  |  | 	wl_list_for_each_safe(output, output_tmp, &manager->outputs, link) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		output_destroy(output); |  |  |  | 		output_destroy(output); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} |