aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/input/seat.h1
-rw-r--r--include/sway/tree/workspace.h2
-rw-r--r--include/sway/xwayland.h5
-rw-r--r--sway/commands/move.c8
-rw-r--r--sway/commands/swap.c8
-rw-r--r--sway/commands/workspace.c5
-rw-r--r--sway/criteria.c10
-rw-r--r--sway/desktop/xwayland.c5
-rw-r--r--sway/input/seat.c2
-rw-r--r--sway/tree/view.c4
-rw-r--r--sway/tree/workspace.c35
11 files changed, 52 insertions, 33 deletions
diff --git a/include/sway/input/seat.h b/include/sway/input/seat.h
index ef65810c..bef2af77 100644
--- a/include/sway/input/seat.h
+++ b/include/sway/input/seat.h
@@ -51,6 +51,7 @@ struct sway_seat {
bool has_focus;
struct wl_list focus_stack; // list of containers in focus order
struct sway_workspace *workspace;
+ char *prev_workspace_name; // for workspace back_and_forth
// If the focused layer is set, views cannot receive keyboard focus
struct wlr_layer_surface_v1 *focused_layer;
diff --git a/include/sway/tree/workspace.h b/include/sway/tree/workspace.h
index efdae5a1..b5ae92f3 100644
--- a/include/sway/tree/workspace.h
+++ b/include/sway/tree/workspace.h
@@ -45,8 +45,6 @@ struct sway_workspace {
struct sway_workspace_state current;
};
-extern char *prev_workspace_name;
-
struct workspace_config *workspace_find_config(const char *ws_name);
struct sway_output *workspace_get_initial_output(const char *name);
diff --git a/include/sway/xwayland.h b/include/sway/xwayland.h
index 121edad3..93055c46 100644
--- a/include/sway/xwayland.h
+++ b/include/sway/xwayland.h
@@ -10,6 +10,11 @@ enum atom_name {
NET_WM_WINDOW_TYPE_UTILITY,
NET_WM_WINDOW_TYPE_TOOLBAR,
NET_WM_WINDOW_TYPE_SPLASH,
+ NET_WM_WINDOW_TYPE_MENU,
+ NET_WM_WINDOW_TYPE_DROPDOWN_MENU,
+ NET_WM_WINDOW_TYPE_POPUP_MENU,
+ NET_WM_WINDOW_TYPE_TOOLTIP,
+ NET_WM_WINDOW_TYPE_NOTIFICATION,
NET_WM_STATE_MODAL,
ATOM_LAST,
};
diff --git a/sway/commands/move.c b/sway/commands/move.c
index 941b284a..a5b7f661 100644
--- a/sway/commands/move.c
+++ b/sway/commands/move.c
@@ -429,8 +429,8 @@ static struct cmd_results *cmd_move_container(int argc, char **argv) {
ws = workspace_by_name(argv[2]);
} else if (strcasecmp(argv[2], "back_and_forth") == 0) {
if (!(ws = workspace_by_name(argv[2]))) {
- if (prev_workspace_name) {
- ws_name = strdup(prev_workspace_name);
+ if (seat->prev_workspace_name) {
+ ws_name = strdup(seat->prev_workspace_name);
} else {
return cmd_results_new(CMD_FAILURE, "move",
"No workspace was previously active.");
@@ -455,13 +455,13 @@ static struct cmd_results *cmd_move_container(int argc, char **argv) {
}
if (!no_auto_back_and_forth && config->auto_back_and_forth &&
- prev_workspace_name) {
+ seat->prev_workspace_name) {
// auto back and forth move
if (old_ws && old_ws->name &&
strcmp(old_ws->name, ws_name) == 0) {
// if target workspace is the current one
free(ws_name);
- ws_name = strdup(prev_workspace_name);
+ ws_name = strdup(seat->prev_workspace_name);
ws = workspace_by_name(ws_name);
}
}
diff --git a/sway/commands/swap.c b/sway/commands/swap.c
index 6062724d..afe11a47 100644
--- a/sway/commands/swap.c
+++ b/sway/commands/swap.c
@@ -116,8 +116,8 @@ static void container_swap(struct sway_container *con1,
output_get_active_workspace(con2->workspace->output);
char *stored_prev_name = NULL;
- if (prev_workspace_name) {
- stored_prev_name = strdup(prev_workspace_name);
+ if (seat->prev_workspace_name) {
+ stored_prev_name = strdup(seat->prev_workspace_name);
}
swap_places(con1, con2);
@@ -132,8 +132,8 @@ static void container_swap(struct sway_container *con1,
swap_focus(con1, con2, seat, focus);
if (stored_prev_name) {
- free(prev_workspace_name);
- prev_workspace_name = stored_prev_name;
+ free(seat->prev_workspace_name);
+ seat->prev_workspace_name = stored_prev_name;
}
if (fs1) {
diff --git a/sway/commands/workspace.c b/sway/commands/workspace.c
index da597f8a..745b40c7 100644
--- a/sway/commands/workspace.c
+++ b/sway/commands/workspace.c
@@ -142,12 +142,13 @@ struct cmd_results *cmd_workspace(int argc, char **argv) {
strcasecmp(argv[0], "current") == 0) {
ws = workspace_by_name(argv[0]);
} else if (strcasecmp(argv[0], "back_and_forth") == 0) {
- if (!prev_workspace_name) {
+ struct sway_seat *seat = config->handler_context.seat;
+ if (!seat->prev_workspace_name) {
return cmd_results_new(CMD_INVALID, "workspace",
"There is no previous workspace");
}
if (!(ws = workspace_by_name(argv[0]))) {
- ws = workspace_create(NULL, prev_workspace_name);
+ ws = workspace_create(NULL, seat->prev_workspace_name);
}
} else {
char *name = join_args(argv, argc);
diff --git a/sway/criteria.c b/sway/criteria.c
index e00d638c..89630d90 100644
--- a/sway/criteria.c
+++ b/sway/criteria.c
@@ -286,6 +286,16 @@ static enum atom_name parse_window_type(const char *type) {
return NET_WM_WINDOW_TYPE_TOOLBAR;
} else if (strcasecmp(type, "splash") == 0) {
return NET_WM_WINDOW_TYPE_SPLASH;
+ } else if (strcasecmp(type, "menu") == 0) {
+ return NET_WM_WINDOW_TYPE_MENU;
+ } else if (strcasecmp(type, "dropdown_menu") == 0) {
+ return NET_WM_WINDOW_TYPE_DROPDOWN_MENU;
+ } else if (strcasecmp(type, "popup_menu") == 0) {
+ return NET_WM_WINDOW_TYPE_POPUP_MENU;
+ } else if (strcasecmp(type, "tooltip") == 0) {
+ return NET_WM_WINDOW_TYPE_TOOLTIP;
+ } else if (strcasecmp(type, "notification") == 0) {
+ return NET_WM_WINDOW_TYPE_NOTIFICATION;
}
return ATOM_LAST; // ie. invalid
}
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c
index 58cb4d07..b8ac8434 100644
--- a/sway/desktop/xwayland.c
+++ b/sway/desktop/xwayland.c
@@ -23,6 +23,11 @@ static const char *atom_map[ATOM_LAST] = {
"_NET_WM_WINDOW_TYPE_UTILITY",
"_NET_WM_WINDOW_TYPE_TOOLBAR",
"_NET_WM_WINDOW_TYPE_SPLASH",
+ "_NET_WM_WINDOW_TYPE_MENU",
+ "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU",
+ "_NET_WM_WINDOW_TYPE_POPUP_MENU",
+ "_NET_WM_WINDOW_TYPE_TOOLTIP",
+ "_NET_WM_WINDOW_TYPE_NOTIFICATION",
"_NET_WM_STATE_MODAL",
};
diff --git a/sway/input/seat.c b/sway/input/seat.c
index 2e352b19..16acc8a5 100644
--- a/sway/input/seat.c
+++ b/sway/input/seat.c
@@ -51,6 +51,8 @@ void seat_destroy(struct sway_seat *seat) {
wl_list_remove(&seat->new_drag_icon.link);
wl_list_remove(&seat->link);
wlr_seat_destroy(seat->wlr_seat);
+ free(seat->prev_workspace_name);
+ free(seat);
}
static struct sway_seat_node *seat_node_from_node(
diff --git a/sway/tree/view.c b/sway/tree/view.c
index 85afbb87..b23afb97 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -465,8 +465,8 @@ static struct sway_workspace *select_workspace(struct sway_view *view) {
if (!ws) {
if (strcasecmp(criteria->target, "back_and_forth") == 0) {
- if (prev_workspace_name) {
- ws = workspace_create(NULL, prev_workspace_name);
+ if (seat->prev_workspace_name) {
+ ws = workspace_create(NULL, seat->prev_workspace_name);
}
} else {
ws = workspace_create(NULL, criteria->target);
diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c
index fff16515..65284679 100644
--- a/sway/tree/workspace.c
+++ b/sway/tree/workspace.c
@@ -140,13 +140,6 @@ void workspace_consider_destroy(struct sway_workspace *ws) {
workspace_begin_destroy(ws);
}
-char *prev_workspace_name = NULL;
-
-void next_name_map(struct sway_container *ws, void *data) {
- int *count = data;
- ++count;
-}
-
static bool workspace_valid_on_output(const char *output_name,
const char *ws_name) {
struct workspace_config *wsc = workspace_find_config(ws_name);
@@ -309,9 +302,12 @@ struct sway_workspace *workspace_by_name(const char *name) {
} else if (strcmp(name, "current") == 0) {
return current;
} else if (strcasecmp(name, "back_and_forth") == 0) {
- return prev_workspace_name ?
- root_find_workspace(_workspace_by_name, (void*)prev_workspace_name)
- : NULL;
+ struct sway_seat *seat = input_manager_current_seat();
+ if (!seat->prev_workspace_name) {
+ return NULL;
+ }
+ return root_find_workspace(_workspace_by_name,
+ (void*)seat->prev_workspace_name);
} else {
return root_find_workspace(_workspace_by_name, (void*)name);
}
@@ -380,23 +376,24 @@ bool workspace_switch(struct sway_workspace *workspace,
struct sway_workspace *active_ws = seat_get_focused_workspace(seat);
if (!no_auto_back_and_forth && config->auto_back_and_forth
- && active_ws == workspace
- && prev_workspace_name) {
- struct sway_workspace *new_ws = workspace_by_name(prev_workspace_name);
+ && active_ws == workspace && seat->prev_workspace_name) {
+ struct sway_workspace *new_ws =
+ workspace_by_name(seat->prev_workspace_name);
workspace = new_ws ?
new_ws :
- workspace_create(NULL, prev_workspace_name);
+ workspace_create(NULL, seat->prev_workspace_name);
}
- if (!prev_workspace_name || (strcmp(prev_workspace_name, active_ws->name)
+ if (!seat->prev_workspace_name ||
+ (strcmp(seat->prev_workspace_name, active_ws->name)
&& active_ws != workspace)) {
- free(prev_workspace_name);
- prev_workspace_name = malloc(strlen(active_ws->name) + 1);
- if (!prev_workspace_name) {
+ free(seat->prev_workspace_name);
+ seat->prev_workspace_name = malloc(strlen(active_ws->name) + 1);
+ if (!seat->prev_workspace_name) {
wlr_log(WLR_ERROR, "Unable to allocate previous workspace name");
return false;
}
- strcpy(prev_workspace_name, active_ws->name);
+ strcpy(seat->prev_workspace_name, active_ws->name);
}
wlr_log(WLR_DEBUG, "Switching to workspace %p:%s",