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;
}
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:
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) {
}
}
- 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;
}
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);
}
}
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);
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);
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);
}