Prepare OSD for reimplementation of the preview feature

This commit is contained in:
Consolatis 2022-04-26 22:06:22 +02:00
parent a32e1ff8f9
commit 296e58079f
5 changed files with 28 additions and 21 deletions

View file

@ -231,7 +231,11 @@ struct server {
struct wl_listener new_constraint; struct wl_listener new_constraint;
/* Set when in cycle (alt-tab) mode */ /* Set when in cycle (alt-tab) mode */
struct osd_state {
struct view *cycle_view; struct view *cycle_view;
struct wlr_scene_node *preview_node;
struct wlr_scene_node *preview_anchor;
} osd_state;
struct theme *theme; struct theme *theme;

View file

@ -235,13 +235,13 @@ actions_run(struct view *activator, struct server *server,
} }
break; break;
case ACTION_TYPE_NEXT_WINDOW: case ACTION_TYPE_NEXT_WINDOW:
server->cycle_view = desktop_cycle_view(server, server->osd_state.cycle_view = desktop_cycle_view(server,
server->cycle_view, LAB_CYCLE_DIR_FORWARD); server->osd_state.cycle_view, LAB_CYCLE_DIR_FORWARD);
osd_update(server); osd_update(server);
break; break;
case ACTION_TYPE_PREVIOUS_WINDOW: case ACTION_TYPE_PREVIOUS_WINDOW:
server->cycle_view = desktop_cycle_view(server, server->osd_state.cycle_view = desktop_cycle_view(server,
server->cycle_view, LAB_CYCLE_DIR_BACKWARD); server->osd_state.cycle_view, LAB_CYCLE_DIR_BACKWARD);
osd_update(server); osd_update(server);
break; break;
case ACTION_TYPE_RECONFIGURE: case ACTION_TYPE_RECONFIGURE:

View file

@ -39,18 +39,18 @@ keyboard_modifiers_notify(struct wl_listener *listener, void *data)
struct seat *seat = wl_container_of(listener, seat, keyboard_modifiers); struct seat *seat = wl_container_of(listener, seat, keyboard_modifiers);
struct server *server = seat->server; 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_key_event *event = data;
struct wlr_keyboard *keyboard = &seat->keyboard_group->keyboard; struct wlr_keyboard *keyboard = &seat->keyboard_group->keyboard;
if (event->state == WL_KEYBOARD_KEY_STATE_RELEASED if (event->state == WL_KEYBOARD_KEY_STATE_RELEASED
&& !keyboard_any_modifiers_pressed(keyboard)) { && !keyboard_any_modifiers_pressed(keyboard)) {
if (server->cycle_view) { if (server->osd_state.cycle_view) {
/* end cycle */ /* end cycle */
desktop_focus_and_activate_view(&server->seat, desktop_focus_and_activate_view(&server->seat,
server->cycle_view); server->osd_state.cycle_view);
desktop_move_to_front(server->cycle_view); desktop_move_to_front(server->osd_state.cycle_view);
server->cycle_view = NULL; /* osd_finish() additionally resets cycle_view to NULL */
osd_finish(server); osd_finish(server);
} }
if (seat->workspace_osd_shown_by_modifier) { 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) { if (event->state == WL_KEYBOARD_KEY_STATE_PRESSED) {
for (int i = 0; i < nsyms; i++) { for (int i = 0; i < nsyms; i++) {
if (syms[i] == XKB_KEY_Escape) { if (syms[i] == XKB_KEY_Escape) {
/* cancel */ /* cancel */
server->cycle_view = NULL; /* osd_finish() additionally resets cycle_view to NULL */
osd_finish(server); osd_finish(server);
return true; return true;
} }
@ -168,8 +168,8 @@ handle_compositor_keybindings(struct wl_listener *listener,
enum lab_cycle_dir dir = backwards enum lab_cycle_dir dir = backwards
? LAB_CYCLE_DIR_BACKWARD ? LAB_CYCLE_DIR_BACKWARD
: LAB_CYCLE_DIR_FORWARD; : LAB_CYCLE_DIR_FORWARD;
server->cycle_view = desktop_cycle_view(server, server->osd_state.cycle_view = desktop_cycle_view(server,
server->cycle_view, dir); server->osd_state.cycle_view, dir);
osd_update(server); osd_update(server);
} }
} }

View file

@ -109,6 +109,8 @@ osd_update_preview_outlines(struct view *view)
void void
osd_finish(struct server *server) osd_finish(struct server *server)
{ {
server->osd_state.cycle_view = NULL;
struct output *output; struct output *output;
wl_list_for_each(output, &server->outputs, link) { wl_list_for_each(output, &server->outputs, link) {
destroy_osd_nodes(output); destroy_osd_nodes(output);
@ -185,7 +187,7 @@ osd_update(struct server *server)
if (!isfocusable(view)) { if (!isfocusable(view)) {
continue; continue;
} }
if (view == server->cycle_view) { if (view == server->osd_state.cycle_view) {
set_cairo_color(cairo, theme->osd_label_text_color); set_cairo_color(cairo, theme->osd_label_text_color);
cairo_rectangle(cairo, OSD_BORDER_WIDTH, y, cairo_rectangle(cairo, OSD_BORDER_WIDTH, y,
OSD_ITEM_WIDTH, OSD_ITEM_HEIGHT); OSD_ITEM_WIDTH, OSD_ITEM_HEIGHT);

View file

@ -808,25 +808,26 @@ view_destroy(struct view *view)
server->focused_view = NULL; 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 * If we are the current OSD selected view, cycle
* to the next because we are dying. * to the next because we are dying.
*/ */
server->cycle_view = desktop_cycle_view(server, osd_state->cycle_view = desktop_cycle_view(server,
server->cycle_view, LAB_CYCLE_DIR_BACKWARD); osd_state->cycle_view, LAB_CYCLE_DIR_BACKWARD);
/* /*
* If we cycled back to ourselves, then we have no windows. * If we cycled back to ourselves, then we have no windows.
* just remove it and close the OSD for good. * just remove it and close the OSD for good.
*/ */
if (server->cycle_view == view || !server->cycle_view) { if (osd_state->cycle_view == view || !osd_state->cycle_view) {
server->cycle_view = NULL; /* osd_finish() additionally resets cycle_view to NULL */
osd_finish(server); osd_finish(server);
} }
} }
if (server->cycle_view) { if (osd_state->cycle_view) {
/* Update the OSD to reflect the view has now gone. */ /* Update the OSD to reflect the view has now gone. */
osd_update(server); osd_update(server);
} }