sway

i3-compatible Wayland compositor
git clone https://git.awy.one/sway
Log | Files | Refs | README | LICENSE

commit 51204b33c18b6f7c248f558fbaeb7198efb32900
parent 2f540576238320b0921f2b4bc69e785693f9992c
Author: David Eklov <david.eklov@gmail.com>
Date:   Mon,  4 Jul 2016 16:53:03 -0500

Enable backgrounds and panels to be shell surfaces

Prior to this commit all windows (e.g. shell surfaces) were handled the same
way in handle_view_created. Since backgrounds and panels have to be treated
differently, they could not be shell surfaces. This changes checks whether
a client is a background or a panel in handle_view_created and exists to
let them be dealt with elsewhere.

Diffstat:
Minclude/extensions.h | 4++++
Msway/extensions.c | 2++
Msway/handlers.c | 26++++++++++++++++++++++++++
3 files changed, 32 insertions(+), 0 deletions(-)

diff --git a/include/extensions.h b/include/extensions.h @@ -11,6 +11,8 @@ struct background_config { 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 { @@ -21,6 +23,8 @@ struct panel_config { // 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 { diff --git 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 @@ -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);