aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2016-07-05 08:09:22 -0400
committerGitHub <noreply@github.com>2016-07-05 08:09:22 -0400
commit58804a044f782a397302173deb1416e47b3c3357 (patch)
tree9e155febd82e37ba6cb7b9e1b8ee7fda044d5147
parentc3373c6815b5c8cff8f48d1acb46be08b9654331 (diff)
parentd9bcea381a69ebc6367aede7816b8e27d5fc9417 (diff)
Merge pull request #738 from deklov/panel-as-shell-02
Make swaybar and swaybg shell surfaces, take 2
-rw-r--r--include/client/window.h1
-rw-r--r--include/extensions.h40
-rw-r--r--sway/extensions.c2
-rw-r--r--sway/handlers.c26
-rw-r--r--swaybar/bar.c2
-rw-r--r--swaybg/main.c1
-rw-r--r--wayland/window.c10
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);