From 9c9ee3e4ef9d4e57ec801a79e0b2da1bd2a6d46e Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Sat, 30 Jun 2018 22:39:37 +0900 Subject: find prev/next output/workspace: add NULL check These could be called with NULL if there is no focus Found through static analysis. --- sway/tree/workspace.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'sway/tree/workspace.c') diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 5eb4be0f..3a311cd1 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -271,6 +271,9 @@ struct sway_container *workspace_by_name(const char *name) { */ struct sway_container *workspace_output_prev_next_impl( struct sway_container *output, bool next) { + if (!output) { + return NULL; + } if (!sway_assert(output->type == C_OUTPUT, "Argument must be an output, is %d", output->type)) { return NULL; @@ -303,6 +306,9 @@ struct sway_container *workspace_output_prev_next_impl( */ struct sway_container *workspace_prev_next_impl( struct sway_container *workspace, bool next) { + if (!workspace) { + return NULL; + } if (!sway_assert(workspace->type == C_WORKSPACE, "Argument must be a workspace, is %d", workspace->type)) { return NULL; -- cgit v1.2.3 From c78ab67877e15e4bbbdfd4e8bb7f94309980489b Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Sun, 1 Jul 2018 22:46:48 +0900 Subject: workspace_next_name: fix string length for ws_num >= 100 The check didn't include && ws_num < 100 so l would always be 1 or 2 Instead of fixing logic it's simpler to just call snprintf twice to get length and use that. Also change malloc failure check to sway_assert because both callers of this function do not do null check and would segfault... Found through static analysis. --- sway/tree/workspace.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'sway/tree/workspace.c') diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 3a311cd1..2db06a31 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -109,7 +109,6 @@ static bool workspace_valid_on_output(const char *output_name, char *workspace_next_name(const char *output_name) { wlr_log(L_DEBUG, "Workspace: Generating new workspace name for output %s", output_name); - int l = 1; // Scan all workspace bindings to find the next available workspace name, // if none are found/available then default to a number struct sway_mode *mode = config->current_mode; @@ -202,14 +201,9 @@ char *workspace_next_name(const char *output_name) { // As a fall back, get the current number of active workspaces // and return that + 1 for the next workspace's name int ws_num = root_container.children->length; - if (ws_num >= 10) { - l = 2; - } else if (ws_num >= 100) { - l = 3; - } + int l = snprintf(NULL, 0, "%d", ws_num); char *name = malloc(l + 1); - if (!name) { - wlr_log(L_ERROR, "Could not allocate workspace name"); + if (!sway_assert(name, "Cloud not allocate workspace name")) { return NULL; } sprintf(name, "%d", ws_num++); -- cgit v1.2.3 From 9314c45c418c97fa415ef86cf834c3c87499d100 Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Wed, 4 Jul 2018 18:51:21 +0900 Subject: workspace_next_name: free targets later than these already found in order --- sway/tree/workspace.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'sway/tree/workspace.c') diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 2db06a31..51f0fcb4 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -191,6 +191,8 @@ char *workspace_next_name(const char *output_name) { free(target); target = _target; wlr_log(L_DEBUG, "Workspace: Found free name %s", _target); + } else { + free(_target); } } free(dup); -- cgit v1.2.3 From 63b4bf500020cf35cebfdce2d73f8e359ff495c2 Mon Sep 17 00:00:00 2001 From: emersion Date: Mon, 9 Jul 2018 22:54:30 +0100 Subject: Update for swaywm/wlroots#1126 --- sway/tree/workspace.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'sway/tree/workspace.c') diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 51f0fcb4..50f9400a 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -49,7 +49,7 @@ struct sway_container *workspace_create(struct sway_container *output, output = get_workspace_initial_output(name); } - wlr_log(L_DEBUG, "Added workspace %s for output %s", name, output->name); + wlr_log(WLR_DEBUG, "Added workspace %s for output %s", name, output->name); struct sway_container *workspace = container_create(C_WORKSPACE); workspace->x = output->x; @@ -107,7 +107,7 @@ static bool workspace_valid_on_output(const char *output_name, } char *workspace_next_name(const char *output_name) { - wlr_log(L_DEBUG, "Workspace: Generating new workspace name for output %s", + wlr_log(WLR_DEBUG, "Workspace: Generating new workspace name for output %s", output_name); // Scan all workspace bindings to find the next available workspace name, // if none are found/available then default to a number @@ -135,7 +135,7 @@ char *workspace_next_name(const char *output_name) { while (isspace(*_target)) { memmove(_target, _target+1, strlen(_target+1)); } - wlr_log(L_DEBUG, "Got valid workspace command for target: '%s'", + wlr_log(WLR_DEBUG, "Got valid workspace command for target: '%s'", _target); // Make sure that the command references an actual workspace @@ -161,7 +161,7 @@ char *workspace_next_name(const char *output_name) { temp[length - 1] = '\0'; free(_target); _target = temp; - wlr_log(L_DEBUG, "Isolated name from workspace number: '%s'", _target); + wlr_log(WLR_DEBUG, "Isolated name from workspace number: '%s'", _target); // Make sure the workspace number doesn't already exist if (workspace_by_number(_target)) { @@ -190,7 +190,7 @@ char *workspace_next_name(const char *output_name) { order = binding->order; free(target); target = _target; - wlr_log(L_DEBUG, "Workspace: Found free name %s", _target); + wlr_log(WLR_DEBUG, "Workspace: Found free name %s", _target); } else { free(_target); } @@ -387,7 +387,7 @@ bool workspace_switch(struct sway_container *workspace) { free(prev_workspace_name); prev_workspace_name = malloc(strlen(active_ws->name) + 1); if (!prev_workspace_name) { - wlr_log(L_ERROR, "Unable to allocate previous workspace name"); + wlr_log(WLR_ERROR, "Unable to allocate previous workspace name"); return false; } strcpy(prev_workspace_name, active_ws->name); @@ -409,7 +409,7 @@ bool workspace_switch(struct sway_container *workspace) { } } - wlr_log(L_DEBUG, "Switching to workspace %p:%s", + wlr_log(WLR_DEBUG, "Switching to workspace %p:%s", workspace, workspace->name); struct sway_container *next = seat_get_focus_inactive(seat, workspace); if (next == NULL) { -- cgit v1.2.3 From 2032f85d94f2f222282b242116b3e827dd458f6c Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 14 Jul 2018 23:14:55 +1000 Subject: Simplify transactions by utilising a dirty flag on containers This PR changes the way we handle transactions to a more simple method. The new method is to mark containers as dirty from low level code (eg. arranging, or container_destroy, and eventually seat_set_focus), then call transaction_commit_dirty which picks up those containers and runs them through a transaction. The old methods of using transactions (arrange_and_commit, or creating one manually) are now no longer possible. The highest-level code (execute_command and view implementation handlers) will call transaction_commit_dirty, so most other code just needs to set containers as dirty. This is done by arranging, but can also be done by calling container_set_dirty. --- sway/tree/workspace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sway/tree/workspace.c') diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 50f9400a..2a2d834a 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -427,7 +427,7 @@ bool workspace_switch(struct sway_container *workspace) { } seat_set_focus(seat, next); struct sway_container *output = container_parent(workspace, C_OUTPUT); - arrange_and_commit(output); + arrange_windows(output); return true; } -- cgit v1.2.3 From 315d5311b2004b9e148e7b52a7de161b6dfe3878 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 15 Jul 2018 22:43:33 +1000 Subject: Implement urgency base functionality Introduces a command to manually set urgency, as well as rendering of urgent views, sending the IPC event, removing urgency after focused for one second, and matching urgent views via criteria. --- sway/tree/workspace.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'sway/tree/workspace.c') diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 2a2d834a..d71b0a53 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -11,6 +11,7 @@ #include "sway/ipc-server.h" #include "sway/tree/arrange.h" #include "sway/tree/container.h" +#include "sway/tree/view.h" #include "sway/tree/workspace.h" #include "list.h" #include "log.h" @@ -518,3 +519,12 @@ struct sway_container *workspace_output_get_highest_available( return NULL; } + +static bool find_urgent_iterator(struct sway_container *con, + void *data) { + return con->type == C_VIEW && view_is_urgent(con->sway_view); +} + +bool workspace_is_urgent(struct sway_container *workspace) { + return container_find(workspace, find_urgent_iterator, NULL); +} -- cgit v1.2.3 From 5f0a4bb6a46cf359dd270e3c448ca1e112331f9d Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 16 Jul 2018 13:15:35 +1000 Subject: Update workspace urgent state when views close or move workspaces --- sway/tree/workspace.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'sway/tree/workspace.c') diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index d71b0a53..d14f01eb 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -525,6 +525,11 @@ static bool find_urgent_iterator(struct sway_container *con, return con->type == C_VIEW && view_is_urgent(con->sway_view); } -bool workspace_is_urgent(struct sway_container *workspace) { - return container_find(workspace, find_urgent_iterator, NULL); +void workspace_detect_urgent(struct sway_container *workspace) { + bool new_urgent = container_find(workspace, find_urgent_iterator, NULL); + + if (workspace->sway_workspace->urgent != new_urgent) { + workspace->sway_workspace->urgent = new_urgent; + ipc_event_workspace(NULL, workspace, "urgent"); + } } -- cgit v1.2.3 From be28c18ad5a3271aad537a5356662d57f16d9703 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 16 Jul 2018 14:30:31 +1000 Subject: Mark containers as urgent in IPC if they have urgent views --- sway/tree/workspace.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'sway/tree/workspace.c') diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index d14f01eb..00b479ec 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -520,13 +520,8 @@ struct sway_container *workspace_output_get_highest_available( return NULL; } -static bool find_urgent_iterator(struct sway_container *con, - void *data) { - return con->type == C_VIEW && view_is_urgent(con->sway_view); -} - void workspace_detect_urgent(struct sway_container *workspace) { - bool new_urgent = container_find(workspace, find_urgent_iterator, NULL); + bool new_urgent = container_has_urgent_child(workspace); if (workspace->sway_workspace->urgent != new_urgent) { workspace->sway_workspace->urgent = new_urgent; -- cgit v1.2.3 From af5f736277559398d3d3df20adbb3a90ff88dbd0 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 16 Jul 2018 18:22:27 +1000 Subject: Render containers as urgent if they have an urgent child --- sway/tree/workspace.c | 1 + 1 file changed, 1 insertion(+) (limited to 'sway/tree/workspace.c') diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 00b479ec..622f01ec 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -526,5 +526,6 @@ void workspace_detect_urgent(struct sway_container *workspace) { if (workspace->sway_workspace->urgent != new_urgent) { workspace->sway_workspace->urgent = new_urgent; ipc_event_workspace(NULL, workspace, "urgent"); + container_damage_whole(workspace); } } -- cgit v1.2.3