diff options
author | Drew DeVault <sir@cmpwn.com> | 2015-12-20 12:05:32 -0500 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2015-12-20 12:05:32 -0500 |
commit | 3082245243689e978186d6a6ba69972b050fb288 (patch) | |
tree | 364472d861aac5192e964a4984e1e63752e16c90 /sway | |
parent | fdb9ce52ef7e8b4abce0e0d3b86c0bc67d7d943a (diff) | |
parent | e45fd9b6c5dfb858c6f86277351bc216574d8200 (diff) |
Merge pull request #373 from sce/per_panel_config
Per panel config
Diffstat (limited to 'sway')
-rw-r--r-- | sway/extensions.c | 33 | ||||
-rw-r--r-- | sway/handlers.c | 2 | ||||
-rw-r--r-- | sway/layout.c | 4 |
3 files changed, 27 insertions, 12 deletions
diff --git a/sway/extensions.c b/sway/extensions.c index 5e09bdbb..00a72a80 100644 --- a/sway/extensions.c +++ b/sway/extensions.c @@ -9,12 +9,27 @@ struct desktop_shell_state desktop_shell; +static struct panel_config *find_or_create_panel_config(struct wl_resource *resource) { + for (int i = 0; i < desktop_shell.panels->length; i++) { + struct panel_config *conf = desktop_shell.panels->items[i]; + if (conf->wl_resource == resource) { + sway_log(L_DEBUG, "Found existing panel config for resource %p", resource); + return conf; + } + } + sway_log(L_DEBUG, "Creating panel config for resource %p", resource); + struct panel_config *config = calloc(1, sizeof(struct panel_config)); + list_add(desktop_shell.panels, config); + config->wl_resource = resource; + return config; +} + void background_surface_destructor(struct wl_resource *resource) { sway_log(L_DEBUG, "Background surface killed"); int i; for (i = 0; i < desktop_shell.backgrounds->length; ++i) { struct background_config *config = desktop_shell.backgrounds->items[i]; - if (config->resource == resource) { + if (config->wl_surface_res == resource) { list_del(desktop_shell.backgrounds, i); break; } @@ -26,7 +41,7 @@ void panel_surface_destructor(struct wl_resource *resource) { int i; for (i = 0; i < desktop_shell.panels->length; ++i) { struct panel_config *config = desktop_shell.panels->items[i]; - if (config->resource == resource) { + if (config->wl_surface_res == resource) { list_del(desktop_shell.panels, i); arrange_windows(&root_container, -1, -1); break; @@ -58,7 +73,7 @@ static void set_background(struct wl_client *client, struct wl_resource *resourc struct background_config *config = malloc(sizeof(struct background_config)); config->output = output; config->surface = wlc_resource_from_wl_surface_resource(surface); - config->resource = surface; + config->wl_surface_res = surface; list_add(desktop_shell.backgrounds, config); wl_resource_set_destructor(surface, background_surface_destructor); } @@ -69,12 +84,11 @@ static void set_panel(struct wl_client *client, struct wl_resource *resource, if (!output) { return; } - sway_log(L_DEBUG, "Setting surface %p as panel for output %d", surface, (int)output); - struct panel_config *config = malloc(sizeof(struct panel_config)); + 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->surface = wlc_resource_from_wl_surface_resource(surface); - config->resource = surface; - list_add(desktop_shell.panels, config); + config->wl_surface_res = surface; wl_resource_set_destructor(surface, panel_surface_destructor); desktop_shell.panel_size = *wlc_surface_get_size(config->surface); arrange_windows(&root_container, -1, -1); @@ -121,7 +135,9 @@ static void desktop_ready(struct wl_client *client, struct wl_resource *resource } static void set_panel_position(struct wl_client *client, struct wl_resource *resource, uint32_t position) { - desktop_shell.panel_position = position; + struct panel_config *config = find_or_create_panel_config(resource); + sway_log(L_DEBUG, "Panel position for wl_resource %p changed %d => %d", resource, config->panel_position, position); + config->panel_position = position; arrange_windows(&root_container, -1, -1); } @@ -174,7 +190,6 @@ 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, 1, NULL, swaylock_bind); diff --git a/sway/handlers.c b/sway/handlers.c index 3161c677..751e894c 100644 --- a/sway/handlers.c +++ b/sway/handlers.c @@ -90,7 +90,7 @@ static void handle_output_pre_render(wlc_handle output) { struct wlc_geometry geo = { .size = size }; - switch (desktop_shell.panel_position) { + switch (config->panel_position) { case DESKTOP_SHELL_PANEL_POSITION_TOP: geo.origin = (struct wlc_point){ 0, 0 }; break; diff --git a/sway/layout.c b/sway/layout.c index 5b7dc486..6d82921c 100644 --- a/sway/layout.c +++ b/sway/layout.c @@ -455,8 +455,8 @@ static void arrange_windows_r(swayc_t *container, double width, double height) { struct panel_config *config = desktop_shell.panels->items[i]; if (config->output == output->handle) { struct wlc_size size = *wlc_surface_get_size(config->surface); - sway_log(L_DEBUG, "-> Found panel for this workspace: %ux%u, position: %u", size.w, size.h, desktop_shell.panel_position); - switch (desktop_shell.panel_position) { + sway_log(L_DEBUG, "-> Found panel for this workspace: %ux%u, position: %u", size.w, size.h, config->panel_position); + switch (config->panel_position) { case DESKTOP_SHELL_PANEL_POSITION_TOP: y += size.h; height -= size.h; break; |