diff options
author | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-10-21 11:26:22 +1000 |
---|---|---|
committer | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-10-21 11:26:22 +1000 |
commit | c5a6c37275978ddc8c221ca73ae1a39254dd68f5 (patch) | |
tree | 2255d845647357cdbe6fdfcb1c6a40210a69ddb7 /sway/tree/workspace.c | |
parent | 3f02218b54645a68a7496eb15b7bb16d26b75ae2 (diff) |
Make workspace back_and_forth seat-specific
* When using multiple seats, each seat has its own prev_workspace_name
for the purpose of workspace back_and_forth.
* Removes prev_workspace_name global variable.
* Removes unused next_name_map function in tree/workspace.c.
* Fixes memory leak in seat_destroy (seat was not freed).
Diffstat (limited to 'sway/tree/workspace.c')
-rw-r--r-- | sway/tree/workspace.c | 35 |
1 files changed, 16 insertions, 19 deletions
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", |