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 <joshua@froggi.es>
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 */
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);
}
} 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);
} 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);
}
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);
}
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);
}
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;
}
activated_any = true;
activated_any_frame |= mousebind->context == LAB_SSD_FRAME;
- action(server, mousebind->action,
+ action(view, server, mousebind->action,
mousebind->command, resize_edges);
}
}
}
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);
}
activated_any = true;
activated_any_frame |= mousebind->context == LAB_SSD_FRAME;
- action(server, mousebind->action,
+ action(view, server, mousebind->action,
mousebind->command, resize_edges);
}
}
/* 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;
}
/* 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;
}
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 */
}
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;
}
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) {