diff --git a/include/labwc.h b/include/labwc.h index 794b2671..5b9c25bb 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -231,7 +231,11 @@ struct server { struct wl_listener new_constraint; /* Set when in cycle (alt-tab) mode */ - struct view *cycle_view; + struct osd_state { + struct view *cycle_view; + struct wlr_scene_node *preview_node; + struct wlr_scene_node *preview_anchor; + } osd_state; struct theme *theme; diff --git a/src/action.c b/src/action.c index 3b6dd4d4..9604c306 100644 --- a/src/action.c +++ b/src/action.c @@ -235,13 +235,13 @@ actions_run(struct view *activator, struct server *server, } break; case ACTION_TYPE_NEXT_WINDOW: - server->cycle_view = desktop_cycle_view(server, - server->cycle_view, LAB_CYCLE_DIR_FORWARD); + server->osd_state.cycle_view = desktop_cycle_view(server, + server->osd_state.cycle_view, LAB_CYCLE_DIR_FORWARD); osd_update(server); break; case ACTION_TYPE_PREVIOUS_WINDOW: - server->cycle_view = desktop_cycle_view(server, - server->cycle_view, LAB_CYCLE_DIR_BACKWARD); + server->osd_state.cycle_view = desktop_cycle_view(server, + server->osd_state.cycle_view, LAB_CYCLE_DIR_BACKWARD); osd_update(server); break; case ACTION_TYPE_RECONFIGURE: diff --git a/src/keyboard.c b/src/keyboard.c index 93d91071..2cad76fc 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -39,18 +39,18 @@ keyboard_modifiers_notify(struct wl_listener *listener, void *data) struct seat *seat = wl_container_of(listener, seat, keyboard_modifiers); struct server *server = seat->server; - if (server->cycle_view || seat->workspace_osd_shown_by_modifier) { + if (server->osd_state.cycle_view || seat->workspace_osd_shown_by_modifier) { struct wlr_keyboard_key_event *event = data; struct wlr_keyboard *keyboard = &seat->keyboard_group->keyboard; if (event->state == WL_KEYBOARD_KEY_STATE_RELEASED && !keyboard_any_modifiers_pressed(keyboard)) { - if (server->cycle_view) { + if (server->osd_state.cycle_view) { /* end cycle */ desktop_focus_and_activate_view(&server->seat, - server->cycle_view); - desktop_move_to_front(server->cycle_view); - server->cycle_view = NULL; + server->osd_state.cycle_view); + desktop_move_to_front(server->osd_state.cycle_view); + /* osd_finish() additionally resets cycle_view to NULL */ osd_finish(server); } if (seat->workspace_osd_shown_by_modifier) { @@ -145,12 +145,12 @@ handle_compositor_keybindings(struct wl_listener *listener, } } - if (server->cycle_view) { + if (server->osd_state.cycle_view) { if (event->state == WL_KEYBOARD_KEY_STATE_PRESSED) { for (int i = 0; i < nsyms; i++) { if (syms[i] == XKB_KEY_Escape) { /* cancel */ - server->cycle_view = NULL; + /* osd_finish() additionally resets cycle_view to NULL */ osd_finish(server); return true; } @@ -168,8 +168,8 @@ handle_compositor_keybindings(struct wl_listener *listener, enum lab_cycle_dir dir = backwards ? LAB_CYCLE_DIR_BACKWARD : LAB_CYCLE_DIR_FORWARD; - server->cycle_view = desktop_cycle_view(server, - server->cycle_view, dir); + server->osd_state.cycle_view = desktop_cycle_view(server, + server->osd_state.cycle_view, dir); osd_update(server); } } diff --git a/src/osd.c b/src/osd.c index 529818a5..9cfc9ccb 100644 --- a/src/osd.c +++ b/src/osd.c @@ -109,6 +109,8 @@ osd_update_preview_outlines(struct view *view) void osd_finish(struct server *server) { + server->osd_state.cycle_view = NULL; + struct output *output; wl_list_for_each(output, &server->outputs, link) { destroy_osd_nodes(output); @@ -185,7 +187,7 @@ osd_update(struct server *server) if (!isfocusable(view)) { continue; } - if (view == server->cycle_view) { + if (view == server->osd_state.cycle_view) { set_cairo_color(cairo, theme->osd_label_text_color); cairo_rectangle(cairo, OSD_BORDER_WIDTH, y, OSD_ITEM_WIDTH, OSD_ITEM_HEIGHT); diff --git a/src/view.c b/src/view.c index 843c5c98..e8c55648 100644 --- a/src/view.c +++ b/src/view.c @@ -808,25 +808,26 @@ view_destroy(struct view *view) server->focused_view = NULL; } - if (server->cycle_view == view) { + struct osd_state *osd_state = &view->server->osd_state; + if (osd_state->cycle_view == view) { /* * If we are the current OSD selected view, cycle * to the next because we are dying. */ - server->cycle_view = desktop_cycle_view(server, - server->cycle_view, LAB_CYCLE_DIR_BACKWARD); + osd_state->cycle_view = desktop_cycle_view(server, + osd_state->cycle_view, LAB_CYCLE_DIR_BACKWARD); /* * If we cycled back to ourselves, then we have no windows. * just remove it and close the OSD for good. */ - if (server->cycle_view == view || !server->cycle_view) { - server->cycle_view = NULL; + if (osd_state->cycle_view == view || !osd_state->cycle_view) { + /* osd_finish() additionally resets cycle_view to NULL */ osd_finish(server); } } - if (server->cycle_view) { + if (osd_state->cycle_view) { /* Update the OSD to reflect the view has now gone. */ osd_update(server); }