Merge pull request #373 from sce/per_panel_config

Per panel config
This commit is contained in:
Drew DeVault 2015-12-20 12:05:32 -05:00
commit 3082245243
4 changed files with 34 additions and 15 deletions

View file

@ -9,13 +9,18 @@
struct background_config { struct background_config {
wlc_handle output; wlc_handle output;
wlc_resource surface; wlc_resource surface;
struct wl_resource *resource; // we need the wl_resource of the surface in the destructor
struct wl_resource *wl_surface_res;
}; };
struct panel_config { struct panel_config {
// wayland resource used in callbacks, is used to track this panel
struct wl_resource *wl_resource;
wlc_handle output; wlc_handle output;
wlc_resource surface; wlc_resource surface;
struct wl_resource *resource; // we need the wl_resource of the surface in the destructor
struct wl_resource *wl_surface_res;
enum desktop_shell_panel_position panel_position;
}; };
struct desktop_shell_state { struct desktop_shell_state {
@ -23,7 +28,6 @@ struct desktop_shell_state {
list_t *panels; list_t *panels;
list_t *lock_surfaces; list_t *lock_surfaces;
bool is_locked; bool is_locked;
enum desktop_shell_panel_position panel_position;
struct wlc_size panel_size; struct wlc_size panel_size;
}; };

View file

@ -9,12 +9,27 @@
struct desktop_shell_state desktop_shell; 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) { void background_surface_destructor(struct wl_resource *resource) {
sway_log(L_DEBUG, "Background surface killed"); sway_log(L_DEBUG, "Background surface killed");
int i; int i;
for (i = 0; i < desktop_shell.backgrounds->length; ++i) { for (i = 0; i < desktop_shell.backgrounds->length; ++i) {
struct background_config *config = desktop_shell.backgrounds->items[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); list_del(desktop_shell.backgrounds, i);
break; break;
} }
@ -26,7 +41,7 @@ void panel_surface_destructor(struct wl_resource *resource) {
int i; int i;
for (i = 0; i < desktop_shell.panels->length; ++i) { for (i = 0; i < desktop_shell.panels->length; ++i) {
struct panel_config *config = desktop_shell.panels->items[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); list_del(desktop_shell.panels, i);
arrange_windows(&root_container, -1, -1); arrange_windows(&root_container, -1, -1);
break; 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)); struct background_config *config = malloc(sizeof(struct background_config));
config->output = output; config->output = output;
config->surface = wlc_resource_from_wl_surface_resource(surface); config->surface = wlc_resource_from_wl_surface_resource(surface);
config->resource = surface; config->wl_surface_res = surface;
list_add(desktop_shell.backgrounds, config); list_add(desktop_shell.backgrounds, config);
wl_resource_set_destructor(surface, background_surface_destructor); 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) { if (!output) {
return; return;
} }
sway_log(L_DEBUG, "Setting surface %p as panel for output %d", surface, (int)output); sway_log(L_DEBUG, "Setting surface %p as panel for output %d (wl_resource: %p)", surface, (int)output, resource);
struct panel_config *config = malloc(sizeof(struct panel_config)); struct panel_config *config = find_or_create_panel_config(resource);
config->output = output; config->output = output;
config->surface = wlc_resource_from_wl_surface_resource(surface); config->surface = wlc_resource_from_wl_surface_resource(surface);
config->resource = surface; config->wl_surface_res = surface;
list_add(desktop_shell.panels, config);
wl_resource_set_destructor(surface, panel_surface_destructor); wl_resource_set_destructor(surface, panel_surface_destructor);
desktop_shell.panel_size = *wlc_surface_get_size(config->surface); desktop_shell.panel_size = *wlc_surface_get_size(config->surface);
arrange_windows(&root_container, -1, -1); 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) { 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); 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); wl_global_create(wlc_get_wl_display(), &desktop_shell_interface, 3, NULL, desktop_shell_bind);
desktop_shell.backgrounds = create_list(); desktop_shell.backgrounds = create_list();
desktop_shell.panels = create_list(); desktop_shell.panels = create_list();
desktop_shell.panel_position = DESKTOP_SHELL_PANEL_POSITION_BOTTOM;
desktop_shell.lock_surfaces = create_list(); desktop_shell.lock_surfaces = create_list();
desktop_shell.is_locked = false; desktop_shell.is_locked = false;
wl_global_create(wlc_get_wl_display(), &lock_interface, 1, NULL, swaylock_bind); wl_global_create(wlc_get_wl_display(), &lock_interface, 1, NULL, swaylock_bind);

View file

@ -90,7 +90,7 @@ static void handle_output_pre_render(wlc_handle output) {
struct wlc_geometry geo = { struct wlc_geometry geo = {
.size = size .size = size
}; };
switch (desktop_shell.panel_position) { switch (config->panel_position) {
case DESKTOP_SHELL_PANEL_POSITION_TOP: case DESKTOP_SHELL_PANEL_POSITION_TOP:
geo.origin = (struct wlc_point){ 0, 0 }; geo.origin = (struct wlc_point){ 0, 0 };
break; break;

View file

@ -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]; struct panel_config *config = desktop_shell.panels->items[i];
if (config->output == output->handle) { if (config->output == output->handle) {
struct wlc_size size = *wlc_surface_get_size(config->surface); 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); sway_log(L_DEBUG, "-> Found panel for this workspace: %ux%u, position: %u", size.w, size.h, config->panel_position);
switch (desktop_shell.panel_position) { switch (config->panel_position) {
case DESKTOP_SHELL_PANEL_POSITION_TOP: case DESKTOP_SHELL_PANEL_POSITION_TOP:
y += size.h; height -= size.h; y += size.h; height -= size.h;
break; break;