From 8bdf3b1b0275d53cee8538777f12461603b0a751 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Tue, 5 Dec 2017 11:02:31 -0500 Subject: [PATCH] view set position --- include/sway/view.h | 2 ++ sway/desktop/wl_shell.c | 9 +++++++++ sway/desktop/xdg_shell_v6.c | 9 +++++++++ sway/desktop/xwayland.c | 33 ++++++++++++++++++++++++++++++++- sway/tree/container.c | 5 +++++ sway/tree/layout.c | 6 ++---- 6 files changed, 59 insertions(+), 5 deletions(-) diff --git a/include/sway/view.h b/include/sway/view.h index 83ac8285..18e964f3 100644 --- a/include/sway/view.h +++ b/include/sway/view.h @@ -87,6 +87,8 @@ struct sway_view { enum sway_view_prop prop); void (*set_size)(struct sway_view *view, int width, int height); + void (*set_position)(struct sway_view *view, + double ox, double oy); } iface; }; diff --git a/sway/desktop/wl_shell.c b/sway/desktop/wl_shell.c index 9641b911..b2e026ef 100644 --- a/sway/desktop/wl_shell.c +++ b/sway/desktop/wl_shell.c @@ -37,6 +37,14 @@ static void set_size(struct sway_view *view, int width, int height) { wlr_wl_shell_surface_configure(view->wlr_wl_shell_surface, 0, width, height); } +static void set_position(struct sway_view *view, double ox, double oy) { + if (!assert_wl_shell(view)) { + return; + } + view->swayc->x = ox; + view->swayc->y = oy; +} + static void handle_commit(struct wl_listener *listener, void *data) { struct sway_wl_shell_surface *sway_surface = wl_container_of(listener, sway_surface, commit); @@ -87,6 +95,7 @@ void handle_wl_shell_surface(struct wl_listener *listener, void *data) { sway_view->type = SWAY_WL_SHELL_VIEW; sway_view->iface.get_prop = get_prop; sway_view->iface.set_size = set_size; + sway_view->iface.set_position = set_position; sway_view->wlr_wl_shell_surface = shell_surface; sway_view->sway_wl_shell_surface = sway_surface; sway_view->surface = shell_surface->surface; diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c index 2545d1a6..37e39f37 100644 --- a/sway/desktop/xdg_shell_v6.c +++ b/sway/desktop/xdg_shell_v6.c @@ -37,6 +37,14 @@ static void set_size(struct sway_view *view, int width, int height) { wlr_xdg_toplevel_v6_set_size(view->wlr_xdg_surface_v6, width, height); } +static void set_position(struct sway_view *view, double ox, double oy) { + if (!assert_xdg(view)) { + return; + } + view->swayc->x = ox; + view->swayc->y = oy; +} + static void handle_commit(struct wl_listener *listener, void *data) { struct sway_xdg_surface_v6 *sway_surface = wl_container_of(listener, sway_surface, commit); @@ -87,6 +95,7 @@ void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data) { sway_view->type = SWAY_XDG_SHELL_V6_VIEW; sway_view->iface.get_prop = get_prop; sway_view->iface.set_size = set_size; + sway_view->iface.set_position = set_position; sway_view->wlr_xdg_surface_v6 = xdg_surface; sway_view->sway_xdg_surface_v6 = sway_surface; sway_view->surface = xdg_surface->surface; diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index 04ec118d..266a5869 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -3,14 +3,17 @@ #include #include #include +#include +#include #include "sway/container.h" #include "sway/layout.h" #include "sway/server.h" #include "sway/view.h" +#include "sway/output.h" #include "log.h" static bool assert_xwayland(struct sway_view *view) { - return sway_assert(view->type == SWAY_XWAYLAND_VIEW, + return sway_assert(view->type == SWAY_XWAYLAND_VIEW && view->wlr_xwayland_surface, "Expected xwayland view!"); } @@ -40,6 +43,33 @@ static void set_size(struct sway_view *view, int width, int height) { width, height); } +static void set_position(struct sway_view *view, double ox, double oy) { + if (!assert_xwayland(view)) { + return; + } + swayc_t *output = swayc_parent_by_type(view->swayc, C_OUTPUT); + if (!sway_assert(output, "view must be within tree to set position")) { + return; + } + swayc_t *root = swayc_parent_by_type(output, C_ROOT); + if (!sway_assert(root, "output must be within tree to set position")) { + return; + } + struct wlr_output_layout *layout = root->output_layout; + struct wlr_output_layout_output *loutput = + wlr_output_layout_get(layout, output->sway_output->wlr_output); + if (!sway_assert(loutput, "output must be within layout to set position")) { + return; + } + + view->swayc->x = ox; + view->swayc->y = oy; + + wlr_xwayland_surface_configure(view->wlr_xwayland_surface, + ox + loutput->x, oy + loutput->y, + view->width, view->height); +} + static void handle_commit(struct wl_listener *listener, void *data) { struct sway_xwayland_surface *sway_surface = wl_container_of(listener, sway_surface, commit); @@ -102,6 +132,7 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) { sway_view->type = SWAY_XWAYLAND_VIEW; sway_view->iface.get_prop = get_prop; sway_view->iface.set_size = set_size; + sway_view->iface.set_position = set_position; sway_view->wlr_xwayland_surface = xsurface; sway_view->sway_xwayland_surface = sway_surface; // TODO remove from the tree when the surface goes away (unmapped) diff --git a/sway/tree/container.c b/sway/tree/container.c index c7bce38a..e205fbcf 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "sway/container.h" #include "sway/layout.h" #include "sway/output.h" @@ -53,6 +54,10 @@ swayc_t *new_output(struct sway_output *sway_output) { output->width = size.width; output->height = size.width; + // TODO configure output layout position + wlr_output_layout_add_auto(root_container.output_layout, + sway_output->wlr_output); + add_child(&root_container, output); // Create workspace diff --git a/sway/tree/layout.c b/sway/tree/layout.c index 2d442f2a..cb39a361 100644 --- a/sway/tree/layout.c +++ b/sway/tree/layout.c @@ -215,8 +215,7 @@ static void apply_horiz_layout(swayc_t *container, sway_log(L_DEBUG, "Calculating arrangement for %p:%d (will scale %f by %f)", child, child->type, width, scale); - child->x = child_x; - child->y = y; + child->sway_view->iface.set_position(child->sway_view, child_x, y); if (i == end - 1) { double remaining_width = x + width - child_x; @@ -266,8 +265,7 @@ void apply_vert_layout(swayc_t *container, sway_log(L_DEBUG, "Calculating arrangement for %p:%d (will scale %f by %f)", child, child->type, height, scale); - child->x = x; - child->y = child_y; + child->sway_view->iface.set_position(child->sway_view, x, child_y); if (i == end - 1) { double remaining_height = y + height - child_y;