diff options
author | Tony Crisci <tony@dubstepdish.com> | 2018-01-21 18:24:53 -0500 |
---|---|---|
committer | Tony Crisci <tony@dubstepdish.com> | 2018-01-21 18:24:53 -0500 |
commit | 41832714758c003c557da30193c6b02a2afe54b2 (patch) | |
tree | 962cfcd132d57b0a711e3a74364a05d7dbb50ef0 /rootston/desktop.c | |
parent | d13114520acef63f9293ff313b8a549bc81be30c (diff) |
make it work with rotation
Diffstat (limited to 'rootston/desktop.c')
-rw-r--r-- | rootston/desktop.c | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/rootston/desktop.c b/rootston/desktop.c index 1ec1d552..2632eebd 100644 --- a/rootston/desktop.c +++ b/rootston/desktop.c @@ -19,6 +19,7 @@ #include "rootston/server.h" #include "rootston/seat.h" #include "rootston/xcursor.h" +#include "rootston/view.h" void view_get_box(const struct roots_view *view, struct wlr_box *box) { box->x = view->x; @@ -43,6 +44,43 @@ void view_get_deco_box(const struct roots_view *view, struct wlr_box *box) { box->height += (view->border_width * 2 + view->titlebar_height); } +enum wlr_deco_part view_get_deco_part(struct roots_view *view, double sx, double sy) { + if (!view->decorated) { + return WLR_DECO_PART_NONE; + } + + int sw = view->wlr_surface->current->width; + int sh = view->wlr_surface->current->height; + int bw = view->border_width; + int titlebar_h = view->titlebar_height; + + if (sx > 0 && sx < sw && sy < 0 && sy > -view->titlebar_height) { + return WLR_DECO_PART_TITLEBAR; + } + + enum wlr_deco_part parts = 0; + if (sy >= -(titlebar_h + bw) && + sy <= sh + bw) { + if (sx < 0 && sx > -bw) { + parts |= WLR_DECO_PART_LEFT_BORDER; + } else if (sx > sw && sx < sw + bw) { + parts |= WLR_DECO_PART_RIGHT_BORDER; + } + } + + if (sx >= -bw && sx <= sw + bw) { + if (sy > sh && sy <= sh + bw) { + parts |= WLR_DECO_PART_BOTTOM_BORDER; + } else if (sy >= -(titlebar_h + bw) && sy < 0) { + parts |= WLR_DECO_PART_TOP_BORDER; + } + } + + // TODO corners + + return parts; +} + static void view_update_output(const struct roots_view *view, const struct wlr_box *before) { struct roots_desktop *desktop = view->desktop; @@ -359,6 +397,12 @@ static bool view_at(struct roots_view *view, double lx, double ly, return true; } + if (view_get_deco_part(view, view_sx, view_sy)) { + *sx = view_sx; + *sy = view_sy; + return view; + } + if (wlr_box_contains_point(&box, view_sx, view_sy) && pixman_region32_contains_point(&view->wlr_surface->current->input, view_sx, view_sy, NULL)) { @@ -392,14 +436,6 @@ struct roots_view *desktop_view_at(struct roots_desktop *desktop, double lx, if (view_at(view, lx, ly, surface, sx, sy)) { return view; } - - if (view->decorated) { - struct wlr_box deco_box; - view_get_deco_box(view, &deco_box); - if (wlr_box_contains_point(&deco_box, lx, ly)) { - return view; - } - } } return NULL; } |