]> git.mdlowis.com Git - proto/labwc.git/commitdiff
Prepare OSD for reimplementation of the preview feature
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Tue, 26 Apr 2022 20:06:22 +0000 (22:06 +0200)
committerConsolatis <35009135+Consolatis@users.noreply.github.com>
Sun, 28 Aug 2022 18:40:29 +0000 (20:40 +0200)
include/labwc.h
src/action.c
src/keyboard.c
src/osd.c
src/view.c

index 794b2671b208a6b197d3e6eda4afa51a13db7fd6..5b9c25bb3ea305046ca503d18972c4a0e6f93e80 100644 (file)
@@ -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;
 
index 3b6dd4d405b636ef3fea10fcd70485738f45ecda..9604c306da0f3b0c312e4666be54b46dbd737f8f 100644 (file)
@@ -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:
index 93d9107135e8e7a3f11937cecfd6099ec3a8fead..2cad76fcf867be50c1fb6fda19cbe74cd93db249 100644 (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 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);
                        }
                }
index 529818a5bebc275976dbff3ff5d5dac7a6885609..9cfc9ccbda07814ec0e849f17007c527c4cd14a9 100644 (file)
--- 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);
index 843c5c9821adfbd5201abd311b32948b2d5ba182..e8c556487fb0c4754e99c29cab7911ac0c66048d 100644 (file)
@@ -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);
        }