From 1e9aaa54a85e98d6b46ca594b4f50770f71047ea Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 13 May 2018 08:16:36 +1000 Subject: Revert "Revert "Merge pull request #1943 from RyanDwyer/criteria-improvements"" This reverts commit 32a572cecfd0f6072a78ce0a381a2f8365f9010a. This reimplements the criteria overhaul in preparation for fixing a known bug. --- sway/desktop/wl_shell.c | 4 +-- sway/desktop/xdg_shell_v6.c | 4 +-- sway/desktop/xwayland.c | 69 +++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 70 insertions(+), 7 deletions(-) (limited to 'sway/desktop') diff --git a/sway/desktop/wl_shell.c b/sway/desktop/wl_shell.c index 99e8947b..cb3774f7 100644 --- a/sway/desktop/wl_shell.c +++ b/sway/desktop/wl_shell.c @@ -20,7 +20,7 @@ static struct sway_wl_shell_view *wl_shell_view_from_view( return (struct sway_wl_shell_view *)view; } -static const char *get_prop(struct sway_view *view, enum sway_view_prop prop) { +static const char *get_string_prop(struct sway_view *view, enum sway_view_prop prop) { if (wl_shell_view_from_view(view) == NULL) { return NULL; } @@ -70,7 +70,7 @@ static void set_fullscreen(struct sway_view *view, bool fullscreen) { } static const struct sway_view_impl view_impl = { - .get_prop = get_prop, + .get_string_prop = get_string_prop, .configure = configure, .close = _close, .destroy = destroy, diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c index e9051b6c..d098c797 100644 --- a/sway/desktop/xdg_shell_v6.c +++ b/sway/desktop/xdg_shell_v6.c @@ -72,7 +72,7 @@ static struct sway_xdg_shell_v6_view *xdg_shell_v6_view_from_view( return (struct sway_xdg_shell_v6_view *)view; } -static const char *get_prop(struct sway_view *view, enum sway_view_prop prop) { +static const char *get_string_prop(struct sway_view *view, enum sway_view_prop prop) { if (xdg_shell_v6_view_from_view(view) == NULL) { return NULL; } @@ -150,7 +150,7 @@ static void destroy(struct sway_view *view) { } static const struct sway_view_impl view_impl = { - .get_prop = get_prop, + .get_string_prop = get_string_prop, .configure = configure, .set_activated = set_activated, .set_fullscreen = set_fullscreen, diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index 1d3c857d..6a99a66a 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -122,7 +122,7 @@ static struct sway_xwayland_view *xwayland_view_from_view( return (struct sway_xwayland_view *)view; } -static const char *get_prop(struct sway_view *view, enum sway_view_prop prop) { +static const char *get_string_prop(struct sway_view *view, enum sway_view_prop prop) { if (xwayland_view_from_view(view) == NULL) { return NULL; } @@ -131,11 +131,27 @@ static const char *get_prop(struct sway_view *view, enum sway_view_prop prop) { return view->wlr_xwayland_surface->title; case VIEW_PROP_CLASS: return view->wlr_xwayland_surface->class; + case VIEW_PROP_INSTANCE: + return view->wlr_xwayland_surface->instance; default: return NULL; } } +static uint32_t get_int_prop(struct sway_view *view, enum sway_view_prop prop) { + if (xwayland_view_from_view(view) == NULL) { + return 0; + } + switch (prop) { + case VIEW_PROP_X11_WINDOW_ID: + return view->wlr_xwayland_surface->window_id; + case VIEW_PROP_WINDOW_TYPE: + return *view->wlr_xwayland_surface->window_type; + default: + return 0; + } +} + static void configure(struct sway_view *view, double ox, double oy, int width, int height) { struct sway_xwayland_view *xwayland_view = xwayland_view_from_view(view); @@ -196,13 +212,17 @@ static void destroy(struct sway_view *view) { wl_list_remove(&xwayland_view->destroy.link); wl_list_remove(&xwayland_view->request_configure.link); wl_list_remove(&xwayland_view->request_fullscreen.link); + wl_list_remove(&xwayland_view->set_title.link); + wl_list_remove(&xwayland_view->set_class.link); + wl_list_remove(&xwayland_view->set_window_type.link); wl_list_remove(&xwayland_view->map.link); wl_list_remove(&xwayland_view->unmap.link); free(xwayland_view); } static const struct sway_view_impl view_impl = { - .get_prop = get_prop, + .get_string_prop = get_string_prop, + .get_int_prop = get_int_prop, .configure = configure, .set_activated = set_activated, .set_fullscreen = set_fullscreen, @@ -219,7 +239,6 @@ static void handle_commit(struct wl_listener *listener, void *data) { view_update_size(view, xwayland_view->pending_width, xwayland_view->pending_height); view_damage_from(view); - view_update_title(view, false); } static void handle_unmap(struct wl_listener *listener, void *data) { @@ -281,6 +300,40 @@ static void handle_request_fullscreen(struct wl_listener *listener, void *data) view_set_fullscreen(view, xsurface->fullscreen); } +static void handle_set_title(struct wl_listener *listener, void *data) { + struct sway_xwayland_view *xwayland_view = + wl_container_of(listener, xwayland_view, set_title); + struct sway_view *view = &xwayland_view->view; + struct wlr_xwayland_surface *xsurface = view->wlr_xwayland_surface; + if (!xsurface->mapped) { + return; + } + view_update_title(view, false); + view_execute_criteria(view); +} + +static void handle_set_class(struct wl_listener *listener, void *data) { + struct sway_xwayland_view *xwayland_view = + wl_container_of(listener, xwayland_view, set_class); + struct sway_view *view = &xwayland_view->view; + struct wlr_xwayland_surface *xsurface = view->wlr_xwayland_surface; + if (!xsurface->mapped) { + return; + } + view_execute_criteria(view); +} + +static void handle_set_window_type(struct wl_listener *listener, void *data) { + struct sway_xwayland_view *xwayland_view = + wl_container_of(listener, xwayland_view, set_window_type); + struct sway_view *view = &xwayland_view->view; + struct wlr_xwayland_surface *xsurface = view->wlr_xwayland_surface; + if (!xsurface->mapped) { + return; + } + view_execute_criteria(view); +} + void handle_xwayland_surface(struct wl_listener *listener, void *data) { struct sway_server *server = wl_container_of(listener, server, xwayland_surface); @@ -319,6 +372,16 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) { &xwayland_view->request_fullscreen); xwayland_view->request_fullscreen.notify = handle_request_fullscreen; + wl_signal_add(&xsurface->events.set_title, &xwayland_view->set_title); + xwayland_view->set_title.notify = handle_set_title; + + wl_signal_add(&xsurface->events.set_class, &xwayland_view->set_class); + xwayland_view->set_class.notify = handle_set_class; + + wl_signal_add(&xsurface->events.set_window_type, + &xwayland_view->set_window_type); + xwayland_view->set_window_type.notify = handle_set_window_type; + wl_signal_add(&xsurface->events.unmap, &xwayland_view->unmap); xwayland_view->unmap.notify = handle_unmap; -- cgit v1.2.3 From 8432d8a15e4191d602d72efdcb82ea241dd30b86 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 14 May 2018 11:47:39 +1000 Subject: xdg_shell: Replace get_prop with get_string_prop --- sway/desktop/xdg_shell.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sway/desktop') diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c index 48b659f2..9a0d282b 100644 --- a/sway/desktop/xdg_shell.c +++ b/sway/desktop/xdg_shell.c @@ -72,7 +72,7 @@ static struct sway_xdg_shell_view *xdg_shell_view_from_view( return (struct sway_xdg_shell_view *)view; } -static const char *get_prop(struct sway_view *view, enum sway_view_prop prop) { +static const char *get_string_prop(struct sway_view *view, enum sway_view_prop prop) { if (xdg_shell_view_from_view(view) == NULL) { return NULL; } @@ -150,7 +150,7 @@ static void destroy(struct sway_view *view) { } static const struct sway_view_impl view_impl = { - .get_prop = get_prop, + .get_string_prop = get_string_prop, .configure = configure, .set_activated = set_activated, .set_fullscreen = set_fullscreen, -- cgit v1.2.3 From 95a10dd4f35c6ffc14d23fa3a19a784e85a31724 Mon Sep 17 00:00:00 2001 From: emersion Date: Sun, 29 Apr 2018 09:40:58 +0100 Subject: Kill wl_shell --- include/sway/server.h | 1 - include/sway/tree/view.h | 15 ----- sway/commands/fullscreen.c | 1 - sway/desktop/output.c | 1 - sway/desktop/wl_shell.c | 165 --------------------------------------------- sway/meson.build | 1 - sway/server.c | 10 +-- sway/tree/container.c | 6 -- sway/tree/view.c | 2 - 9 files changed, 2 insertions(+), 200 deletions(-) delete mode 100644 sway/desktop/wl_shell.c (limited to 'sway/desktop') diff --git a/include/sway/server.h b/include/sway/server.h index d04ea896..c95ee0f3 100644 --- a/include/sway/server.h +++ b/include/sway/server.h @@ -58,6 +58,5 @@ void handle_layer_shell_surface(struct wl_listener *listener, void *data); void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data); void handle_xdg_shell_surface(struct wl_listener *listener, void *data); void handle_xwayland_surface(struct wl_listener *listener, void *data); -void handle_wl_shell_surface(struct wl_listener *listener, void *data); #endif diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h index 7c07842b..9af13004 100644 --- a/include/sway/tree/view.h +++ b/include/sway/tree/view.h @@ -10,7 +10,6 @@ struct sway_container; enum sway_view_type { - SWAY_VIEW_WL_SHELL, SWAY_VIEW_XDG_SHELL_V6, SWAY_VIEW_XDG_SHELL, SWAY_VIEW_XWAYLAND, @@ -139,20 +138,6 @@ struct sway_xwayland_unmanaged { struct wl_listener destroy; }; -struct sway_wl_shell_view { - struct sway_view view; - - struct wl_listener commit; - struct wl_listener request_move; - struct wl_listener request_resize; - struct wl_listener request_maximize; - struct wl_listener request_fullscreen; - struct wl_listener set_state; - struct wl_listener destroy; - - int pending_width, pending_height; -}; - struct sway_view_child; struct sway_view_child_impl { diff --git a/sway/commands/fullscreen.c b/sway/commands/fullscreen.c index 8692e92d..ec9ec276 100644 --- a/sway/commands/fullscreen.c +++ b/sway/commands/fullscreen.c @@ -1,4 +1,3 @@ -#include #include "log.h" #include "sway/commands.h" #include "sway/config.h" diff --git a/sway/desktop/output.c b/sway/desktop/output.c index 974cd56c..3f89f5cc 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include "log.h" #include "sway/config.h" diff --git a/sway/desktop/wl_shell.c b/sway/desktop/wl_shell.c deleted file mode 100644 index cb3774f7..00000000 --- a/sway/desktop/wl_shell.c +++ /dev/null @@ -1,165 +0,0 @@ -#define _POSIX_C_SOURCE 199309L -#include -#include -#include -#include -#include "sway/tree/container.h" -#include "sway/tree/layout.h" -#include "sway/server.h" -#include "sway/tree/view.h" -#include "sway/input/seat.h" -#include "sway/input/input-manager.h" -#include "log.h" - -static struct sway_wl_shell_view *wl_shell_view_from_view( - struct sway_view *view) { - if (!sway_assert(view->type == SWAY_VIEW_WL_SHELL, - "Expected wl_shell view")) { - return NULL; - } - return (struct sway_wl_shell_view *)view; -} - -static const char *get_string_prop(struct sway_view *view, enum sway_view_prop prop) { - if (wl_shell_view_from_view(view) == NULL) { - return NULL; - } - switch (prop) { - case VIEW_PROP_TITLE: - return view->wlr_wl_shell_surface->title; - case VIEW_PROP_CLASS: - return view->wlr_wl_shell_surface->class; - default: - return NULL; - } -} - -static void configure(struct sway_view *view, double ox, double oy, int width, - int height) { - struct sway_wl_shell_view *wl_shell_view = wl_shell_view_from_view(view); - if (wl_shell_view == NULL) { - return; - } - wl_shell_view->pending_width = width; - wl_shell_view->pending_height = height; - wlr_wl_shell_surface_configure(view->wlr_wl_shell_surface, 0, width, height); -} - -static void _close(struct sway_view *view) { - if (wl_shell_view_from_view(view) == NULL) { - return; - } - - wl_client_destroy(view->wlr_wl_shell_surface->client); -} - -static void destroy(struct sway_view *view) { - struct sway_wl_shell_view *wl_shell_view = wl_shell_view_from_view(view); - if (wl_shell_view == NULL) { - return; - } - wl_list_remove(&wl_shell_view->commit.link); - wl_list_remove(&wl_shell_view->destroy.link); - wl_list_remove(&wl_shell_view->request_fullscreen.link); - wl_list_remove(&wl_shell_view->set_state.link); - free(wl_shell_view); -} - -static void set_fullscreen(struct sway_view *view, bool fullscreen) { - // TODO -} - -static const struct sway_view_impl view_impl = { - .get_string_prop = get_string_prop, - .configure = configure, - .close = _close, - .destroy = destroy, - .set_fullscreen = set_fullscreen, -}; - -static void handle_commit(struct wl_listener *listener, void *data) { - struct sway_wl_shell_view *wl_shell_view = - wl_container_of(listener, wl_shell_view, commit); - struct sway_view *view = &wl_shell_view->view; - // NOTE: We intentionally discard the view's desired width here - // TODO: Let floating views do whatever - view_update_size(view, wl_shell_view->pending_width, - wl_shell_view->pending_height); - view_damage_from(view); -} - -static void handle_destroy(struct wl_listener *listener, void *data) { - struct sway_wl_shell_view *wl_shell_view = - wl_container_of(listener, wl_shell_view, destroy); - view_destroy(&wl_shell_view->view); -} - -static void handle_request_fullscreen(struct wl_listener *listener, void *data) { - struct sway_wl_shell_view *wl_shell_view = - wl_container_of(listener, wl_shell_view, request_fullscreen); - view_set_fullscreen(&wl_shell_view->view, true); -} - -static void handle_set_state(struct wl_listener *listener, void *data) { - struct sway_wl_shell_view *wl_shell_view = - wl_container_of(listener, wl_shell_view, set_state); - struct sway_view *view = &wl_shell_view->view; - struct wlr_wl_shell_surface *surface = view->wlr_wl_shell_surface; - if (view->is_fullscreen && - surface->state != WLR_WL_SHELL_SURFACE_STATE_FULLSCREEN) { - view_set_fullscreen(view, false); - } -} - -void handle_wl_shell_surface(struct wl_listener *listener, void *data) { - struct sway_server *server = wl_container_of(listener, server, - wl_shell_surface); - struct wlr_wl_shell_surface *shell_surface = data; - - if (shell_surface->state == WLR_WL_SHELL_SURFACE_STATE_POPUP) { - // popups don't get views - wlr_log(L_DEBUG, "New wl_shell popup"); - return; - } - - // TODO: make transient windows floating - - wlr_log(L_DEBUG, "New wl_shell toplevel title='%s' app_id='%s'", - shell_surface->title, shell_surface->class); - wlr_wl_shell_surface_ping(shell_surface); - - struct sway_wl_shell_view *wl_shell_view = - calloc(1, sizeof(struct sway_wl_shell_view)); - if (!sway_assert(wl_shell_view, "Failed to allocate view")) { - return; - } - - view_init(&wl_shell_view->view, SWAY_VIEW_WL_SHELL, &view_impl); - wl_shell_view->view.wlr_wl_shell_surface = shell_surface; - - // TODO: - // - Wire up listeners - // - Look up pid and open on appropriate workspace - // - Set new view to maximized so it behaves nicely - // - Criteria - - wl_shell_view->commit.notify = handle_commit; - wl_signal_add(&shell_surface->surface->events.commit, - &wl_shell_view->commit); - - wl_shell_view->destroy.notify = handle_destroy; - wl_signal_add(&shell_surface->events.destroy, &wl_shell_view->destroy); - - wl_shell_view->request_fullscreen.notify = handle_request_fullscreen; - wl_signal_add(&shell_surface->events.request_fullscreen, - &wl_shell_view->request_fullscreen); - - wl_shell_view->set_state.notify = handle_set_state; - wl_signal_add(&shell_surface->events.set_state, &wl_shell_view->set_state); - - view_map(&wl_shell_view->view, shell_surface->surface); - - if (shell_surface->state == WLR_WL_SHELL_SURFACE_STATE_FULLSCREEN) { - view_set_fullscreen(&wl_shell_view->view, true); - } -} diff --git a/sway/meson.build b/sway/meson.build index 570d4783..67c2a422 100644 --- a/sway/meson.build +++ b/sway/meson.build @@ -12,7 +12,6 @@ sway_sources = files( 'desktop/desktop.c', 'desktop/layer_shell.c', 'desktop/output.c', - 'desktop/wl_shell.c', 'desktop/xdg_shell_v6.c', 'desktop/xdg_shell.c', 'desktop/xwayland.c', diff --git a/sway/server.c b/sway/server.c index 6147a39d..050ddf56 100644 --- a/sway/server.c +++ b/sway/server.c @@ -8,15 +8,14 @@ #include #include #include -#include +#include #include +#include #include #include #include #include #include -#include -#include #include // TODO WLR: make Xwayland optional #include @@ -88,11 +87,6 @@ bool server_init(struct sway_server *server) { &server->xdg_shell_surface); server->xdg_shell_surface.notify = handle_xdg_shell_surface; - server->wl_shell = wlr_wl_shell_create(server->wl_display); - wl_signal_add(&server->wl_shell->events.new_surface, - &server->wl_shell_surface); - server->wl_shell_surface.notify = handle_wl_shell_surface; - // TODO make xwayland optional server->xwayland = wlr_xwayland_create(server->wl_display, server->compositor, true); diff --git a/sway/tree/container.c b/sway/tree/container.c index 9f7294db..a17b20f7 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include "cairo.h" @@ -446,11 +445,6 @@ struct sway_container *container_at(struct sway_container *parent, _surface = wlr_surface_surface_at(sview->surface, view_sx, view_sy, &_sx, &_sy); break; - case SWAY_VIEW_WL_SHELL: - _surface = wlr_wl_shell_surface_surface_at( - sview->wlr_wl_shell_surface, - view_sx, view_sy, &_sx, &_sy); - break; case SWAY_VIEW_XDG_SHELL_V6: // the top left corner of the sway container is the // coordinate of the top left corner of the window geometry diff --git a/sway/tree/view.c b/sway/tree/view.c index 41dee1c4..e0e3c110 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -97,8 +97,6 @@ uint32_t view_get_window_type(struct sway_view *view) { const char *view_get_type(struct sway_view *view) { switch(view->type) { - case SWAY_VIEW_WL_SHELL: - return "wl_shell"; case SWAY_VIEW_XDG_SHELL_V6: return "xdg_shell_v6"; case SWAY_VIEW_XDG_SHELL: -- cgit v1.2.3