From 37065cd0c4faa6757f1f53bfd5c2bf8b521edc7c Mon Sep 17 00:00:00 2001 From: Nicolas Cornu Date: Thu, 6 Oct 2016 20:23:46 +0200 Subject: [PATCH] add click on title_bar to focus a container --- include/sway/container.h | 4 ++++ sway/container.c | 19 +++++++++++++++++++ sway/handlers.c | 15 +++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/include/sway/container.h b/include/sway/container.h index 67b747a0..5e251885 100644 --- a/include/sway/container.h +++ b/include/sway/container.h @@ -243,6 +243,10 @@ swayc_t *swayc_active_workspace_for(swayc_t *view); * Finds the container currently underneath the pointer. */ swayc_t *container_under_pointer(void); +/** + * Finds the first container following a callback. + */ +swayc_t *container_find(swayc_t *container, bool (*f)(swayc_t *, const void *), const void *data); /** * Returns true if a container is fullscreen. diff --git a/sway/container.c b/sway/container.c index 73b627ec..9d5e2690 100644 --- a/sway/container.c +++ b/sway/container.c @@ -722,6 +722,25 @@ swayc_t *container_under_pointer(void) { return lookup; } +swayc_t *container_find(swayc_t *container, bool (*f)(swayc_t *, const void *), const void *data) { + if (container->children == NULL || container->children->length == 0) { + return NULL; + } + + for (int i = 0; i < container->children->length; ++i) { + if (f(container->children->items[i], data)) { + return container->children->items[i]; + } + + swayc_t *find = container_find(container->children->items[i], f, data); + if (find != NULL) { + return find; + } + } + + return NULL; +} + // Container information bool swayc_is_fullscreen(swayc_t *view) { diff --git a/sway/handlers.c b/sway/handlers.c index 1afdcbbb..b6bc11c0 100644 --- a/sway/handlers.c +++ b/sway/handlers.c @@ -776,6 +776,14 @@ static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct return EVENT_PASSTHROUGH; } +bool swayc_border_check(swayc_t *c, const void *_origin) { + const struct wlc_point *origin = _origin; + if (origin->x >= c->title_bar_geometry.origin.x && origin->y >= c->title_bar_geometry.origin.y + && origin->x < (c->title_bar_geometry.origin.x + (int)c->title_bar_geometry.size.w) && origin->y < (c->title_bar_geometry.origin.y + (int)c->title_bar_geometry.size.h)) { + return true; + } + return false; +} static bool handle_pointer_button(wlc_handle view, uint32_t time, const struct wlc_modifiers *modifiers, uint32_t button, enum wlc_button_state state, const struct wlc_point *origin) { @@ -840,6 +848,13 @@ static bool handle_pointer_button(wlc_handle view, uint32_t time, const struct w // Check whether to change focus swayc_t *pointer = pointer_state.view; if (pointer) { + swayc_t *ws = swayc_parent_by_type(focused, C_WORKSPACE); + swayc_t *find = container_find(ws, &swayc_border_check, origin); + if (find != NULL) { + set_focused_container(find); + return EVENT_HANDLED; + } + if (focused != pointer) { set_focused_container(pointer_state.view); }