From d568c60003805d225abadb58414b672fc1315283 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Fri, 3 Dec 2021 16:37:53 +0000 Subject: [PATCH] action: If we have a view that is an activator, use that instead of the current focus window If we don't switch focus, we want the close button to close the window associated with it, not the current focus window. Signed-off-by: Joshua Ashton --- include/labwc.h | 2 +- src/action.c | 24 +++++++++++++++--------- src/cursor.c | 16 ++++++++-------- src/keyboard.c | 2 +- src/menu/menu.c | 2 +- 5 files changed, 26 insertions(+), 20 deletions(-) diff --git a/include/labwc.h b/include/labwc.h index 341fc5a1..ceeb40a1 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -472,7 +472,7 @@ void server_init(struct server *server); void server_start(struct server *server); void server_finish(struct server *server); -void action(struct server *server, const char *action, const char *command, +void action(struct view *activator, struct server *server, const char *action, const char *command, uint32_t resize_edges); /* update onscreen display 'alt-tab' texture */ diff --git a/src/action.c b/src/action.c index 74af2568..692d9f21 100644 --- a/src/action.c +++ b/src/action.c @@ -19,13 +19,19 @@ show_menu(struct server *server, const char *menu) damage_all_outputs(server); } +static struct view * +activator_or_focused_view(struct view *activator, struct server *server) +{ + return activator ? activator : desktop_focused_view(server); +} + void -action(struct server *server, const char *action, const char *command, uint32_t resize_edges) +action(struct view *activator, struct server *server, const char *action, const char *command, uint32_t resize_edges) { if (!action) return; if (!strcasecmp(action, "Close")) { - struct view *view = desktop_focused_view(server); + struct view *view = activator_or_focused_view(activator, server); if (view) { view->impl->close(view); } @@ -41,9 +47,9 @@ action(struct server *server, const char *action, const char *command, uint32_t } else if (!strcasecmp(action, "Exit")) { wl_display_terminate(server->wl_display); } else if (!strcasecmp(action, "MoveToEdge")) { - view_move_to_edge(desktop_focused_view(server), command); + view_move_to_edge(activator_or_focused_view(activator, server), command); } else if (!strcasecmp(action, "SnapToEdge")) { - view_snap_to_edge(desktop_focused_view(server), command); + view_snap_to_edge(activator_or_focused_view(activator, server), command); } else if (!strcasecmp(action, "NextWindow")) { server->cycle_view = desktop_cycle_view(server, server->cycle_view, LAB_CYCLE_DIR_NONE); @@ -53,17 +59,17 @@ action(struct server *server, const char *action, const char *command, uint32_t } else if (!strcasecmp(action, "ShowMenu")) { show_menu(server, command); } else if (!strcasecmp(action, "ToggleMaximize")) { - struct view *view = desktop_focused_view(server); + struct view *view = activator_or_focused_view(activator, server); if (view) { view_toggle_maximize(view); } } else if (!strcasecmp(action, "ToggleFullscreen")) { - struct view *view = desktop_focused_view(server); + struct view *view = activator_or_focused_view(activator, server); if (view) { view_toggle_fullscreen(view); } } else if (!strcasecmp(action, "ToggleDecorations")) { - struct view *view = desktop_focused_view(server); + struct view *view = activator_or_focused_view(activator, server); if (view) { view_toggle_decorations(view); } @@ -74,7 +80,7 @@ action(struct server *server, const char *action, const char *command, uint32_t damage_all_outputs(server); } } else if (!strcasecmp(action, "Iconify")) { - struct view *view = desktop_focused_view(server); + struct view *view = activator_or_focused_view(activator, server); if (view) { view_minimize(view, true); } @@ -84,7 +90,7 @@ action(struct server *server, const char *action, const char *command, uint32_t interactive_begin(view, LAB_INPUT_STATE_MOVE, 0); } } else if (!strcasecmp(action, "Raise")) { - struct view *view = desktop_focused_view(server); + struct view *view = activator_or_focused_view(activator, server); if (view) { desktop_raise_view(view); damage_all_outputs(server); diff --git a/src/cursor.c b/src/cursor.c index 118a982f..115dfe4c 100644 --- a/src/cursor.c +++ b/src/cursor.c @@ -426,7 +426,7 @@ cursor_motion_absolute(struct wl_listener *listener, void *data) } static bool -handle_release_mousebinding(struct server *server, uint32_t button, uint32_t modifiers, enum ssd_part_type view_area, uint32_t resize_edges) +handle_release_mousebinding(struct view *view, struct server *server, uint32_t button, uint32_t modifiers, enum ssd_part_type view_area, uint32_t resize_edges) { struct mousebind *mousebind; bool activated_any = false; @@ -450,7 +450,7 @@ handle_release_mousebinding(struct server *server, uint32_t button, uint32_t mod } activated_any = true; activated_any_frame |= mousebind->context == LAB_SSD_FRAME; - action(server, mousebind->action, + action(view, server, mousebind->action, mousebind->command, resize_edges); } } @@ -481,7 +481,7 @@ is_double_click(long double_click_speed, uint32_t button) } static bool -handle_press_mousebinding(struct server *server, uint32_t button, uint32_t modifiers, enum ssd_part_type view_area, uint32_t resize_edges) +handle_press_mousebinding(struct view *view, struct server *server, uint32_t button, uint32_t modifiers, enum ssd_part_type view_area, uint32_t resize_edges) { struct mousebind *mousebind; bool double_click = is_double_click(rc.doubleclick_time, button); @@ -507,7 +507,7 @@ handle_press_mousebinding(struct server *server, uint32_t button, uint32_t modif } activated_any = true; activated_any_frame |= mousebind->context == LAB_SSD_FRAME; - action(server, mousebind->action, + action(view, server, mousebind->action, mousebind->command, resize_edges); } } @@ -557,7 +557,7 @@ cursor_button(struct wl_listener *listener, void *data) /* Handle _release_ on root window */ if (!view) { - handle_release_mousebinding(server, event->button, modifiers, LAB_SSD_ROOT, 0); + handle_release_mousebinding(NULL, server, event->button, modifiers, LAB_SSD_ROOT, 0); } goto mousebindings; } @@ -586,7 +586,7 @@ cursor_button(struct wl_listener *listener, void *data) /* Handle _press_ on root window */ if (!view) { - handle_press_mousebinding(server, event->button, modifiers, LAB_SSD_ROOT, 0); + handle_press_mousebinding(NULL, server, event->button, modifiers, LAB_SSD_ROOT, 0); return; } @@ -603,9 +603,9 @@ cursor_button(struct wl_listener *listener, void *data) mousebindings: if (event->state == WLR_BUTTON_RELEASED) { - triggered_frame_binding |= handle_release_mousebinding(server, event->button, modifiers, view_area, resize_edges); + triggered_frame_binding |= handle_release_mousebinding(view, server, event->button, modifiers, view_area, resize_edges); } else if (event->state == WLR_BUTTON_PRESSED) { - triggered_frame_binding |= handle_press_mousebinding(server, event->button, modifiers, view_area, resize_edges); + triggered_frame_binding |= handle_press_mousebinding(view, server, event->button, modifiers, view_area, resize_edges); } if (!triggered_frame_binding) { /* Notify client with pointer focus of button press */ diff --git a/src/keyboard.c b/src/keyboard.c index dfbbac2a..91e1aeca 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -64,7 +64,7 @@ handle_keybinding(struct server *server, uint32_t modifiers, xkb_keysym_t sym) } for (size_t i = 0; i < keybind->keysyms_len; i++) { if (xkb_keysym_to_lower(sym) == keybind->keysyms[i]) { - action(server, keybind->action, + action(NULL, server, keybind->action, keybind->command, 0); return true; } diff --git a/src/menu/menu.c b/src/menu/menu.c index fb5f826c..e4c4201e 100644 --- a/src/menu/menu.c +++ b/src/menu/menu.c @@ -416,7 +416,7 @@ menu_action_selected(struct server *server, struct menu *menu) struct menuitem *menuitem; wl_list_for_each (menuitem, &menu->menuitems, link) { if (menuitem->selected && !menuitem->submenu) { - action(server, menuitem->action, menuitem->command, 0); + action(NULL, server, menuitem->action, menuitem->command, 0); break; } if (menuitem->submenu) { -- 2.52.0