diff options
| author | Drew DeVault <sir@cmpwn.com> | 2016-07-05 08:09:22 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-07-05 08:09:22 -0400 | 
| commit | 58804a044f782a397302173deb1416e47b3c3357 (patch) | |
| tree | 9e155febd82e37ba6cb7b9e1b8ee7fda044d5147 | |
| parent | c3373c6815b5c8cff8f48d1acb46be08b9654331 (diff) | |
| parent | d9bcea381a69ebc6367aede7816b8e27d5fc9417 (diff) | |
| download | sway-58804a044f782a397302173deb1416e47b3c3357.tar.xz | |
Merge pull request #738 from deklov/panel-as-shell-02
Make swaybar and swaybg shell surfaces, take 2
| -rw-r--r-- | include/client/window.h | 1 | ||||
| -rw-r--r-- | include/extensions.h | 40 | ||||
| -rw-r--r-- | sway/extensions.c | 2 | ||||
| -rw-r--r-- | sway/handlers.c | 26 | ||||
| -rw-r--r-- | swaybar/bar.c | 2 | ||||
| -rw-r--r-- | swaybg/main.c | 1 | ||||
| -rw-r--r-- | wayland/window.c | 10 | 
7 files changed, 61 insertions, 21 deletions
diff --git a/include/client/window.h b/include/client/window.h index eff9032d..e48ec4f3 100644 --- a/include/client/window.h +++ b/include/client/window.h @@ -42,5 +42,6 @@ struct window *window_setup(struct registry *registry, uint32_t width, uint32_t  void window_teardown(struct window *state);  int window_prerender(struct window *state);  int window_render(struct window *state); +void window_make_shell(struct window *window);  #endif diff --git a/include/extensions.h b/include/extensions.h index 158a40a2..7c508b5e 100644 --- a/include/extensions.h +++ b/include/extensions.h @@ -7,33 +7,37 @@  #include "list.h"  struct background_config { -        wlc_handle output; -        wlc_resource surface; -        // we need the wl_resource of the surface in the destructor -        struct wl_resource *wl_surface_res; +	wlc_handle output; +	wlc_resource surface; +	// we need the wl_resource of the surface in the destructor +	struct wl_resource *wl_surface_res; +	// used to determine if client is a background +	struct wl_client *client;  };  struct panel_config { -        // wayland resource used in callbacks, is used to track this panel -        struct wl_resource *wl_resource; -        wlc_handle output; -        wlc_resource surface; -        // we need the wl_resource of the surface in the destructor -        struct wl_resource *wl_surface_res; -        enum desktop_shell_panel_position panel_position; +	// wayland resource used in callbacks, is used to track this panel +	struct wl_resource *wl_resource; +	wlc_handle output; +	wlc_resource surface; +	// we need the wl_resource of the surface in the destructor +	struct wl_resource *wl_surface_res; +	enum desktop_shell_panel_position panel_position; +	// used to determine if client is a panel +	struct wl_client *client;  };  struct desktop_shell_state { -        list_t *backgrounds; -        list_t *panels; -        list_t *lock_surfaces; -        bool is_locked; +	list_t *backgrounds; +	list_t *panels; +	list_t *lock_surfaces; +	bool is_locked;  };  struct swaylock_state { -        bool active; -        wlc_handle output; -        wlc_resource surface; +	bool active; +	wlc_handle output; +	wlc_resource surface;  };  extern struct desktop_shell_state desktop_shell; diff --git a/sway/extensions.c b/sway/extensions.c index 7bc9bbe4..1fe15ac5 100644 --- a/sway/extensions.c +++ b/sway/extensions.c @@ -73,6 +73,7 @@ static void set_background(struct wl_client *client, struct wl_resource *resourc  	}  	sway_log(L_DEBUG, "Setting surface %p as background for output %d", surface, (int)output);  	struct background_config *config = malloc(sizeof(struct background_config)); +	config->client = client;  	config->output = output;  	config->surface = wlc_resource_from_wl_surface_resource(surface);  	config->wl_surface_res = surface; @@ -91,6 +92,7 @@ static void set_panel(struct wl_client *client, struct wl_resource *resource,  	sway_log(L_DEBUG, "Setting surface %p as panel for output %d (wl_resource: %p)", surface, (int)output, resource);  	struct panel_config *config = find_or_create_panel_config(resource);  	config->output = output; +	config->client = client;  	config->surface = wlc_resource_from_wl_surface_resource(surface);  	config->wl_surface_res = surface;  	wl_resource_set_destructor(surface, panel_surface_destructor); diff --git a/sway/handlers.c b/sway/handlers.c index b7bb1fde..8f2f8a21 100644 --- a/sway/handlers.c +++ b/sway/handlers.c @@ -176,6 +176,28 @@ static void handle_output_focused(wlc_handle output, bool focus) {  	}  } +static bool client_is_background(struct wl_client *client) { +	int i; +	for (i = 0; i < desktop_shell.backgrounds->length; i++) { +		struct background_config *config = desktop_shell.backgrounds->items[i]; +		if (config->client == client) { +			return true; +		} +	} +	return false; +} + +static bool client_is_panel(struct wl_client *client) { +	int i; +	for (i = 0; i < desktop_shell.panels->length; i++) { +		struct panel_config *config = desktop_shell.panels->items[i]; +		if (config->client == client) { +			return true; +		} +	} +	return false; +} +  static bool handle_view_created(wlc_handle handle) {  	// if view is child of another view, the use that as focused container  	wlc_handle parent = wlc_view_get_parent(handle); @@ -186,6 +208,10 @@ static bool handle_view_created(wlc_handle handle) {  	struct wl_client *client = wlc_view_get_wl_client(handle);  	pid_t pid; +	if (client_is_background(client) || client_is_panel(client)) { +		return true; +	} +  	// Get parent container, to add view in  	if (parent) {  		focused = swayc_by_handle(parent); diff --git a/swaybar/bar.c b/swaybar/bar.c index 957e5bdf..6d858f92 100644 --- a/swaybar/bar.c +++ b/swaybar/bar.c @@ -87,6 +87,8 @@ void bar_setup(struct bar *bar, const char *socket_path, const char *bar_id) {  		desktop_shell_set_panel(bar_output->registry->desktop_shell, output->output, bar_output->window->surface);  		desktop_shell_set_panel_position(bar_output->registry->desktop_shell, bar->config->position); +		window_make_shell(bar_output->window); +  		/* set font */  		bar_output->window->font = bar->config->font; diff --git a/swaybg/main.c b/swaybg/main.c index fbd0d16b..4e0cc4b3 100644 --- a/swaybg/main.c +++ b/swaybg/main.c @@ -54,6 +54,7 @@ int main(int argc, const char **argv) {  		sway_abort("Failed to create surfaces.");  	}  	desktop_shell_set_background(registry->desktop_shell, output->output, window->surface); +	window_make_shell(window);  	list_add(surfaces, window);  #ifdef WITH_GDK_PIXBUF diff --git a/wayland/window.c b/wayland/window.c index ba64cb60..7ca9e4ec 100644 --- a/wayland/window.c +++ b/wayland/window.c @@ -59,6 +59,12 @@ static const struct wl_shell_surface_listener surface_listener = {  	.configure = shell_surface_configure  }; +void window_make_shell(struct window *window) { +	window->shell_surface = wl_shell_get_shell_surface(window->registry->shell, window->surface); +	wl_shell_surface_add_listener(window->shell_surface, &surface_listener, window); +	wl_shell_surface_set_toplevel(window->shell_surface); +} +  struct window *window_setup(struct registry *registry, uint32_t width, uint32_t height, bool shell_surface) {  	struct window *window = malloc(sizeof(struct window));  	memset(window, 0, sizeof(struct window)); @@ -69,9 +75,7 @@ struct window *window_setup(struct registry *registry, uint32_t width, uint32_t  	window->surface = wl_compositor_create_surface(registry->compositor);  	if (shell_surface) { -		window->shell_surface = wl_shell_get_shell_surface(registry->shell, window->surface); -		wl_shell_surface_add_listener(window->shell_surface, &surface_listener, window); -		wl_shell_surface_set_toplevel(window->shell_surface); +		window_make_shell(window);  	}  	if (registry->pointer) {  		wl_pointer_add_listener(registry->pointer, &pointer_listener, window);  | 
