|  |  |  | @ -2,6 +2,7 @@ | 
			
		
	
		
			
				
					|  |  |  |  | #include <wlc/wlc.h> | 
			
		
	
		
			
				
					|  |  |  |  | #include <wlc/wlc-wayland.h> | 
			
		
	
		
			
				
					|  |  |  |  | #include "wayland-desktop-shell-server-protocol.h" | 
			
		
	
		
			
				
					|  |  |  |  | #include "wayland-swaylock-server-protocol.h" | 
			
		
	
		
			
				
					|  |  |  |  | #include "layout.h" | 
			
		
	
		
			
				
					|  |  |  |  | #include "log.h" | 
			
		
	
		
			
				
					|  |  |  |  | #include "extensions.h" | 
			
		
	
	
		
			
				
					|  |  |  | @ -33,6 +34,20 @@ void panel_surface_destructor(struct wl_resource *resource) { | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lock_surface_destructor(struct wl_resource *resource) { | 
			
		
	
		
			
				
					|  |  |  |  | 	sway_log(L_DEBUG, "Lock surface killed"); | 
			
		
	
		
			
				
					|  |  |  |  | 	int i; | 
			
		
	
		
			
				
					|  |  |  |  | 	for (i = 0; i < desktop_shell.lock_surfaces->length; ++i) { | 
			
		
	
		
			
				
					|  |  |  |  | 		struct wl_resource *surface = desktop_shell.lock_surfaces->items[i]; | 
			
		
	
		
			
				
					|  |  |  |  | 		if (surface == resource) { | 
			
		
	
		
			
				
					|  |  |  |  | 			list_del(desktop_shell.lock_surfaces, i); | 
			
		
	
		
			
				
					|  |  |  |  | 			arrange_windows(&root_container, -1, -1); | 
			
		
	
		
			
				
					|  |  |  |  | 			desktop_shell.is_locked = false; | 
			
		
	
		
			
				
					|  |  |  |  | 			break; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void set_background(struct wl_client *client, struct wl_resource *resource, | 
			
		
	
		
			
				
					|  |  |  |  | 		struct wl_resource *_output, struct wl_resource *surface) { | 
			
		
	
		
			
				
					|  |  |  |  | 	wlc_handle output = wlc_handle_from_wl_output_resource(_output); | 
			
		
	
	
		
			
				
					|  |  |  | @ -65,14 +80,23 @@ static void set_panel(struct wl_client *client, struct wl_resource *resource, | 
			
		
	
		
			
				
					|  |  |  |  | 	arrange_windows(&root_container, -1, -1); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void set_lock_surface(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface) { | 
			
		
	
		
			
				
					|  |  |  |  | static void desktop_set_lock_surface(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface) { | 
			
		
	
		
			
				
					|  |  |  |  | 	sway_log(L_ERROR, "desktop_set_lock_surface is not currently supported"); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void unlock(struct wl_client *client, struct wl_resource *resource) { | 
			
		
	
		
			
				
					|  |  |  |  | static void desktop_unlock(struct wl_client *client, struct wl_resource *resource) { | 
			
		
	
		
			
				
					|  |  |  |  | 	sway_log(L_ERROR, "desktop_unlock is not currently supported"); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void set_lock_surface(struct wl_client *client, struct wl_resource *resource, | 
			
		
	
		
			
				
					|  |  |  |  | 		struct wl_resource *output, struct wl_resource *surface) { | 
			
		
	
		
			
				
					|  |  |  |  | 	sway_log(L_ERROR, "set_lock_surface is not currently supported"); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void unlock(struct wl_client *client, struct wl_resource *resource) { | 
			
		
	
		
			
				
					|  |  |  |  | 	sway_log(L_ERROR, "unlock is not currently supported"); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void set_grab_surface(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface) { | 
			
		
	
		
			
				
					|  |  |  |  | 	sway_log(L_ERROR, "desktop_set_grab_surface is not currently supported"); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | @ -89,13 +113,18 @@ static void set_panel_position(struct wl_client *client, struct wl_resource *res | 
			
		
	
		
			
				
					|  |  |  |  | static struct desktop_shell_interface desktop_shell_implementation = { | 
			
		
	
		
			
				
					|  |  |  |  | 	.set_background = set_background, | 
			
		
	
		
			
				
					|  |  |  |  | 	.set_panel = set_panel, | 
			
		
	
		
			
				
					|  |  |  |  | 	.set_lock_surface = set_lock_surface, | 
			
		
	
		
			
				
					|  |  |  |  | 	.unlock = unlock, | 
			
		
	
		
			
				
					|  |  |  |  | 	.set_lock_surface = desktop_set_lock_surface, | 
			
		
	
		
			
				
					|  |  |  |  | 	.unlock = desktop_unlock, | 
			
		
	
		
			
				
					|  |  |  |  | 	.set_grab_surface = set_grab_surface, | 
			
		
	
		
			
				
					|  |  |  |  | 	.desktop_ready = desktop_ready, | 
			
		
	
		
			
				
					|  |  |  |  | 	.set_panel_position = set_panel_position | 
			
		
	
		
			
				
					|  |  |  |  | }; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static struct lock_interface swaylock_implementation = { | 
			
		
	
		
			
				
					|  |  |  |  | 	.set_lock_surface = set_lock_surface, | 
			
		
	
		
			
				
					|  |  |  |  | 	.unlock = unlock | 
			
		
	
		
			
				
					|  |  |  |  | }; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void desktop_shell_bind(struct wl_client *client, void *data, | 
			
		
	
		
			
				
					|  |  |  |  | 		unsigned int version, unsigned int id) { | 
			
		
	
		
			
				
					|  |  |  |  | 	if (version > 3) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -111,9 +140,27 @@ static void desktop_shell_bind(struct wl_client *client, void *data, | 
			
		
	
		
			
				
					|  |  |  |  | 	wl_resource_set_implementation(resource, &desktop_shell_implementation, NULL, NULL); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void swaylock_bind(struct wl_client *client, void *data, | 
			
		
	
		
			
				
					|  |  |  |  | 		unsigned int version, unsigned int id) { | 
			
		
	
		
			
				
					|  |  |  |  | 	if (version > 1) { | 
			
		
	
		
			
				
					|  |  |  |  | 		// Unsupported version
 | 
			
		
	
		
			
				
					|  |  |  |  | 		return; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wl_resource *resource = wl_resource_create(client, &lock_interface, version, id); | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!resource) { | 
			
		
	
		
			
				
					|  |  |  |  | 		wl_client_post_no_memory(client); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	wl_resource_set_implementation(resource, &swaylock_implementation, NULL, NULL); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void register_extensions(void) { | 
			
		
	
		
			
				
					|  |  |  |  | 	wl_global_create(wlc_get_wl_display(), &desktop_shell_interface, 3, NULL, desktop_shell_bind); | 
			
		
	
		
			
				
					|  |  |  |  | 	desktop_shell.backgrounds = create_list(); | 
			
		
	
		
			
				
					|  |  |  |  | 	desktop_shell.panels = create_list(); | 
			
		
	
		
			
				
					|  |  |  |  | 	desktop_shell.panel_position = DESKTOP_SHELL_PANEL_POSITION_BOTTOM; | 
			
		
	
		
			
				
					|  |  |  |  | 	desktop_shell.lock_surfaces = create_list(); | 
			
		
	
		
			
				
					|  |  |  |  | 	desktop_shell.is_locked = false; | 
			
		
	
		
			
				
					|  |  |  |  | 	wl_global_create(wlc_get_wl_display(), &lock_interface, 3, NULL, swaylock_bind); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |