From bf3e4aa8d5ecdd85d7185e05325886a1109cecd6 Mon Sep 17 00:00:00 2001 From: Johan Malm Date: Thu, 3 Sep 2020 20:50:35 +0100 Subject: [PATCH] Add view_impl .map and .unmap Hook up iconify button to view->impl->unmap --- include/labwc.h | 2 ++ src/cursor.c | 3 +++ src/keyboard.c | 1 - src/view.c | 13 ++++++++-- src/xdg.c | 46 ++++++++++++++++++++++-------------- src/xwl.c | 63 +++++++++++++++++++++++++++---------------------- 6 files changed, 79 insertions(+), 49 deletions(-) diff --git a/include/labwc.h b/include/labwc.h index ce442432..204c952d 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -107,6 +107,8 @@ enum deco_part { struct view_impl { void (*configure)(struct view *view, struct wlr_box geo); void (*close)(struct view *view); + void (*map)(struct view *view); + void (*unmap)(struct view *view); }; struct view { diff --git a/src/cursor.c b/src/cursor.c index 5c0abc37..5298ad7d 100644 --- a/src/cursor.c +++ b/src/cursor.c @@ -201,6 +201,9 @@ void cursor_button(struct wl_listener *listener, void *data) case LAB_DECO_BUTTON_CLOSE: view->impl->close(view); break; + case LAB_DECO_BUTTON_ICONIFY: + view->impl->unmap(view); + break; case LAB_DECO_PART_TITLE: interactive_begin(view, LAB_CURSOR_MOVE, 0); break; diff --git a/src/keyboard.c b/src/keyboard.c index 9510fcc0..2ca9009e 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -66,7 +66,6 @@ static void keyboard_handle_key(struct wl_listener *listener, void *data) } else if (event->state == WLR_KEY_PRESSED) { /* cycle to next */ server->cycle_view = next_toplevel(server->cycle_view); - info("cycle_view=%p", (void *)server->cycle_view); return; } } diff --git a/src/view.c b/src/view.c index cd887c94..8f8e6c7a 100644 --- a/src/view.c +++ b/src/view.c @@ -140,15 +140,24 @@ static void move_xwayland_decendants_to_front(struct view *parent) } } +/** + * Note that if 'view' is not a toplevel view, the 'front' toplevel view + * will be focussed on; but if 'view' is a toplevel view, the 'next' + * will be focussed on. + */ void view_focus(struct view *view) { /* Note: this function only deals with keyboard focus. */ - if (!view || !view->surface) + if (!view) + return; + if (!view->mapped) { + view->impl->map(view); return; + } + struct server *server = view->server; struct wlr_seat *seat = server->seat; struct wlr_surface *prev_surface; - prev_surface = seat->keyboard_state.focused_surface; if (prev_surface == view->surface) { /* Don't re-focus an already focused surface. */ diff --git a/src/xdg.c b/src/xdg.c index 81cbe703..67e436dc 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -13,7 +13,6 @@ static void xdg_deco_destroy(struct wl_listener *listener, void *data) { struct xdg_deco *xdg_deco = wl_container_of(listener, xdg_deco, destroy); - wl_list_remove(&xdg_deco->destroy.link); wl_list_remove(&xdg_deco->request_mode.link); free(xdg_deco); @@ -76,25 +75,13 @@ static void handle_commit(struct wl_listener *listener, void *data) void xdg_surface_map(struct wl_listener *listener, void *data) { struct view *view = wl_container_of(listener, view, map); - view->mapped = true; - view->surface = view->xdg_surface->surface; - if (!view->been_mapped) { - view->show_server_side_deco = has_ssd(view); - view_init_position(view); - } - view->been_mapped = true; - wl_signal_add(&view->xdg_surface->surface->events.commit, - &view->commit); - view->commit.notify = handle_commit; - view_focus(view); + view->impl->map(view); } void xdg_surface_unmap(struct wl_listener *listener, void *data) { struct view *view = wl_container_of(listener, view, unmap); - view->mapped = false; - wl_list_remove(&view->commit.link); - view_focus(next_toplevel(view)); + view->impl->unmap(view); } void xdg_surface_destroy(struct wl_listener *listener, void *data) @@ -142,9 +129,33 @@ static void xdg_toplevel_view_close(struct view *view) wlr_xdg_toplevel_send_close(view->xdg_surface); } +static void xdg_toplevel_view_map(struct view *view) +{ + view->mapped = true; + view->surface = view->xdg_surface->surface; + if (!view->been_mapped) { + view->show_server_side_deco = has_ssd(view); + view_init_position(view); + } + view->been_mapped = true; + wl_signal_add(&view->xdg_surface->surface->events.commit, + &view->commit); + view->commit.notify = handle_commit; + view_focus(view); +} + +static void xdg_toplevel_view_unmap(struct view *view) +{ + view->mapped = false; + wl_list_remove(&view->commit.link); + view_focus(next_toplevel(view)); +} + static const struct view_impl xdg_toplevel_view_impl = { .configure = xdg_toplevel_view_configure, - .close = xdg_toplevel_view_close, + .close = xdg_toplevel_view_close, + .map = xdg_toplevel_view_map, + .unmap = xdg_toplevel_view_unmap, }; void xdg_surface_new(struct wl_listener *listener, void *data) @@ -152,9 +163,8 @@ void xdg_surface_new(struct wl_listener *listener, void *data) struct server *server = wl_container_of(listener, server, new_xdg_surface); struct wlr_xdg_surface *xdg_surface = data; - if (xdg_surface->role != WLR_XDG_SURFACE_ROLE_TOPLEVEL) { + if (xdg_surface->role != WLR_XDG_SURFACE_ROLE_TOPLEVEL) return; - } struct view *view = calloc(1, sizeof(struct view)); view->server = server; diff --git a/src/xwl.c b/src/xwl.c index 960dc960..04df2692 100644 --- a/src/xwl.c +++ b/src/xwl.c @@ -25,39 +25,13 @@ static void handle_commit(struct wl_listener *listener, void *data) void xwl_surface_map(struct wl_listener *listener, void *data) { struct view *view = wl_container_of(listener, view, map); - view->mapped = true; - view->x = view->xwayland_surface->x; - view->y = view->xwayland_surface->y; - view->surface = view->xwayland_surface->surface; - if (!view->been_mapped) { - view->show_server_side_deco = has_ssd(view); - view_init_position(view); - wl_list_insert(&view->server->views, &view->link); - } - view->been_mapped = true; - - /* - * Add commit listener here, because xwayland map/unmap can change - * the wlr_surface - */ - wl_signal_add(&view->xwayland_surface->surface->events.commit, - &view->commit); - view->commit.notify = handle_commit; - - view_focus(view); + view->impl->map(view); } void xwl_surface_unmap(struct wl_listener *listener, void *data) { struct view *view = wl_container_of(listener, view, unmap); - view->mapped = false; - wl_list_remove(&view->commit.link); - /* - * Note that if 'view' is not a toplevel view, the 'front' toplevel view - * will be focussed on; but if 'view' is a toplevel view, the 'next' - * will be focussed on. - */ - view_focus(next_toplevel(view)); + view->impl->unmap(view); } void xwl_surface_destroy(struct wl_listener *listener, void *data) @@ -92,9 +66,42 @@ static void xwl_view_close(struct view *view) wlr_xwayland_surface_close(view->xwayland_surface); } +static void xwl_view_map(struct view *view) +{ + view->mapped = true; + view->x = view->xwayland_surface->x; + view->y = view->xwayland_surface->y; + view->surface = view->xwayland_surface->surface; + if (!view->been_mapped) { + view->show_server_side_deco = has_ssd(view); + view_init_position(view); + wl_list_insert(&view->server->views, &view->link); + } + view->been_mapped = true; + + /* + * Add commit listener here, because xwayland map/unmap can change + * the wlr_surface + */ + wl_signal_add(&view->xwayland_surface->surface->events.commit, + &view->commit); + view->commit.notify = handle_commit; + + view_focus(view); +} + +static void xwl_view_unmap(struct view *view) +{ + view->mapped = false; + wl_list_remove(&view->commit.link); + view_focus(next_toplevel(view)); +} + static const struct view_impl xwl_view_impl = { .configure = xwl_view_configure, .close = xwl_view_close, + .map = xwl_view_map, + .unmap = xwl_view_unmap, }; void xwl_surface_new(struct wl_listener *listener, void *data) -- 2.52.0