From f156a25e64736909fd0f33942a0a4dba202c431c Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Wed, 4 Jul 2018 20:10:47 +1000 Subject: Only call view_set_tiled when switching floating mode Otherwise it repeatedly sets the view's border to the config's default. --- sway/tree/view.c | 4 ---- 1 file changed, 4 deletions(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index 06e9edc5..c2826f6f 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -164,9 +164,6 @@ void view_init_floating(struct sway_view *view) { view->border_left = view->border_right = true; container_set_geometry_from_floating_view(view->swayc); - - // Don't maximize floating windows - view_set_tiled(view, false); } void view_autoconfigure(struct sway_view *view) { @@ -278,7 +275,6 @@ void view_autoconfigure(struct sway_view *view) { view->y = y; view->width = width; view->height = height; - view_set_tiled(view, true); } void view_set_activated(struct sway_view *view, bool activated) { -- cgit v1.2.3 From fc826b921f26f0f68e687114ee1f761e03bc19f4 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 5 Jul 2018 09:04:15 +1000 Subject: Call view_set_tiled for mapping non-floating views Fixes #2209. --- sway/tree/view.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index c2826f6f..6b4daa82 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -532,6 +532,8 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface) { if (view->impl->wants_floating && view->impl->wants_floating(view)) { container_set_floating(view->swayc, true); + } else { + view_set_tiled(view, true); } input_manager_set_focus(input_manager, cont); -- cgit v1.2.3 From 785ed4383be2c781748c9f60e2d6460200a1abeb Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Wed, 4 Jul 2018 18:50:31 +0900 Subject: view_map: free criterias as the list it is --- sway/tree/view.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index 6b4daa82..bca8ef8a 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -514,7 +514,7 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface) { if (container_is_floating(focus)) { focus = focus->parent->parent; } - free(criterias); + list_free(criterias); cont = container_view_create(focus, view); view->surface = wlr_surface; -- cgit v1.2.3 From 9a9d9116be4109f733a3309d7f9a7c9edd8db4ae Mon Sep 17 00:00:00 2001 From: emersion Date: Fri, 6 Jul 2018 19:33:10 +0100 Subject: Make view_update_* update live props as well --- sway/tree/view.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index bca8ef8a..e46cb327 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -574,6 +574,8 @@ void view_update_position(struct sway_view *view, double lx, double ly) { container_damage_whole(view->swayc); view->x = lx; view->y = ly; + view->swayc->current.view_x = lx; + view->swayc->current.view_y = ly; if (container_is_floating(view->swayc)) { container_set_geometry_from_floating_view(view->swayc); } @@ -587,6 +589,8 @@ void view_update_size(struct sway_view *view, int width, int height) { container_damage_whole(view->swayc); view->width = width; view->height = height; + view->swayc->current.view_width = width; + view->swayc->current.view_height = height; if (container_is_floating(view->swayc)) { container_set_geometry_from_floating_view(view->swayc); } -- cgit v1.2.3 From 0046eed96903c745142208c40aa5f10d0b5931cb Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 7 Jul 2018 15:49:51 +1000 Subject: Fix titles when container titles contain UTF-8 characters The title and marks textures would have their height set from the config's computed max font height, but the textures were not regenerated when the config's max font height changed which made a gap appear. Rather than making it regenerate the title textures every time the config font height was changed, I've changed it to just make the textures the height of the title itself and fill any gap when rendering. Also, the title_width and marks_width variables have been renamed to make it more obvious that they are in output-buffer-local coordinates. Fixes #1936. --- sway/tree/view.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index e46cb327..3ef79fa8 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -923,7 +923,7 @@ static void update_marks_texture(struct sway_view *view, double scale = output->sway_output->wlr_output->scale; int width = 0; - int height = config->font_height * scale; + int height = view->swayc->title_height * scale; cairo_t *c = cairo_create(NULL); get_text_size(c, config->font, &width, NULL, scale, false, "%s", buffer); -- 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/view.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index 3ef79fa8..c96b6a97 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -462,17 +462,17 @@ void view_execute_criteria(struct sway_view *view) { list_t *criterias = criteria_for_view(view, CT_COMMAND); for (int i = 0; i < criterias->length; i++) { struct criteria *criteria = criterias->items[i]; - wlr_log(L_DEBUG, "Checking criteria %s", criteria->raw); + wlr_log(WLR_DEBUG, "Checking criteria %s", criteria->raw); if (view_has_executed_criteria(view, criteria)) { - wlr_log(L_DEBUG, "Criteria already executed"); + wlr_log(WLR_DEBUG, "Criteria already executed"); continue; } - wlr_log(L_DEBUG, "for_window '%s' matches view %p, cmd: '%s'", + wlr_log(WLR_DEBUG, "for_window '%s' matches view %p, cmd: '%s'", criteria->raw, view, criteria->cmdlist); list_add(view->executed_criteria, criteria); struct cmd_results *res = execute_command(criteria->cmdlist, NULL); if (res->status != CMD_SUCCESS) { - wlr_log(L_ERROR, "Command '%s' failed: %s", res->input, res->error); + wlr_log(WLR_ERROR, "Command '%s' failed: %s", res->input, res->error); } free_cmd_results(res); // view must be focused for commands to affect it, @@ -601,7 +601,7 @@ static void view_subsurface_create(struct sway_view *view, struct wlr_subsurface *subsurface) { struct sway_view_child *child = calloc(1, sizeof(struct sway_view_child)); if (child == NULL) { - wlr_log(L_ERROR, "Allocation failed"); + wlr_log(WLR_ERROR, "Allocation failed"); return; } view_child_init(child, NULL, view, subsurface->surface); @@ -721,7 +721,7 @@ struct sway_view *view_from_wlr_surface(struct wlr_surface *wlr_surface) { return NULL; } - wlr_log(L_DEBUG, "Surface of unknown type (role %s): %p", + wlr_log(WLR_DEBUG, "Surface of unknown type (role %s): %p", wlr_surface->role, wlr_surface); return NULL; } @@ -789,7 +789,7 @@ static char *escape_title(char *buffer) { char *escaped_title = calloc(length + 1, sizeof(char)); int result = escape_markup_text(buffer, escaped_title, length); if (result != length) { - wlr_log(L_ERROR, "Could not escape title: %s", buffer); + wlr_log(WLR_ERROR, "Could not escape title: %s", buffer); free(escaped_title); return buffer; } -- cgit v1.2.3 From f2d1cf3ceb9ca7198aba89245fafad42f16edb8e Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Wed, 11 Jul 2018 22:16:48 +1000 Subject: Implement floating_minimum_size and floating_maximum_size --- sway/tree/view.c | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index c96b6a97..f99def6c 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -150,12 +150,43 @@ uint32_t view_configure(struct sway_view *view, double lx, double ly, int width, void view_init_floating(struct sway_view *view) { struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE); - int max_width = ws->width * 0.6666; - int max_height = ws->height * 0.6666; - view->width = - view->natural_width > max_width ? max_width : view->natural_width; - view->height = - view->natural_height > max_height ? max_height : view->natural_height; + int min_width, min_height; + int max_width, max_height; + + if (config->floating_minimum_width == -1) { // no minimum + min_width = 0; + } else if (config->floating_minimum_width == 0) { // automatic + min_width = 75; + } else { + min_width = config->floating_minimum_width; + } + + if (config->floating_minimum_height == -1) { // no minimum + min_height = 0; + } else if (config->floating_minimum_height == 0) { // automatic + min_height = 50; + } else { + min_height = config->floating_minimum_height; + } + + if (config->floating_maximum_width == -1) { // no maximum + max_width = INT_MAX; + } else if (config->floating_maximum_width == 0) { // automatic + max_width = ws->width * 0.6666; + } else { + max_width = config->floating_maximum_width; + } + + if (config->floating_maximum_height == -1) { // no maximum + max_height = INT_MAX; + } else if (config->floating_maximum_height == 0) { // automatic + max_height = ws->height * 0.6666; + } else { + max_height = config->floating_maximum_height; + } + + view->width = fmax(min_width, fmin(view->natural_width, max_width)); + view->height = fmax(min_height, fmin(view->natural_height, max_height)); view->x = ws->x + (ws->width - view->width) / 2; view->y = ws->y + (ws->height - view->height) / 2; -- cgit v1.2.3 From 60fdb71a1f65d3c4f8516b4216f08a2347f1c3b7 Mon Sep 17 00:00:00 2001 From: emersion Date: Mon, 9 Jul 2018 22:59:57 +0100 Subject: Updates for swaywm/wlroots#1116 --- sway/tree/view.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index f99def6c..20cbaf1c 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -752,8 +752,9 @@ struct sway_view *view_from_wlr_surface(struct wlr_surface *wlr_surface) { return NULL; } + const char *role = wlr_surface->role ? wlr_surface->role->name : NULL; wlr_log(WLR_DEBUG, "Surface of unknown type (role %s): %p", - wlr_surface->role, wlr_surface); + role, wlr_surface); return NULL; } -- cgit v1.2.3 From 9b16227ec3cfc648f177f186d29b9f0002b7bbde Mon Sep 17 00:00:00 2001 From: emersion Date: Thu, 12 Jul 2018 20:01:33 +0100 Subject: Don't disable borders for xwayland floating views --- sway/tree/view.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index 20cbaf1c..b356183c 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -315,7 +315,11 @@ void view_set_activated(struct sway_view *view, bool activated) { } void view_set_tiled(struct sway_view *view, bool tiled) { - view->border = tiled ? config->border : B_NONE; + bool csd = true; + if (view->impl->has_client_side_decorations) { + csd = view->impl->has_client_side_decorations(view); + } + view->border = tiled || !csd ? config->border : B_NONE; if (view->impl->set_tiled) { view->impl->set_tiled(view, tiled); } -- 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/view.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index b356183c..bf380d98 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -594,11 +594,12 @@ void view_unmap(struct sway_view *view) { ws->sway_workspace->fullscreen = NULL; container_destroy(view->swayc); - arrange_and_commit(ws->parent); + arrange_windows(ws->parent); } else { struct sway_container *parent = container_destroy(view->swayc); - arrange_and_commit(parent); + arrange_windows(parent); } + transaction_commit_dirty(); view->surface = NULL; } -- 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/view.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index bf380d98..a2dbe92c 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -25,6 +25,7 @@ void view_init(struct sway_view *view, enum sway_view_type type, view->impl = impl; view->executed_criteria = create_list(); view->marks = create_list(); + view->allow_request_urgent = true; wl_signal_init(&view->events.unmap); } @@ -589,6 +590,11 @@ void view_unmap(struct sway_view *view) { wl_list_remove(&view->surface_new_subsurface.link); wl_list_remove(&view->container_reparent.link); + if (view->urgent_timer) { + wl_event_source_remove(view->urgent_timer); + view->urgent_timer = NULL; + } + if (view->is_fullscreen) { struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE); ws->sway_workspace->fullscreen = NULL; @@ -1047,3 +1053,27 @@ bool view_is_visible(struct sway_view *view) { } return true; } + +void view_set_urgent(struct sway_view *view, bool enable) { + if (enable) { + struct sway_seat *seat = input_manager_current_seat(input_manager); + if (seat_get_focus(seat) == view->swayc) { + return; + } + clock_gettime(CLOCK_MONOTONIC, &view->urgent); + } else { + view->urgent = (struct timespec){ 0 }; + if (view->urgent_timer) { + wl_event_source_remove(view->urgent_timer); + view->urgent_timer = NULL; + } + } + container_damage_whole(view->swayc); + + struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE); + ipc_event_workspace(ws, NULL, "urgent"); +} + +bool view_is_urgent(struct sway_view *view) { + return view->urgent.tv_sec || view->urgent.tv_nsec; +} -- cgit v1.2.3 From f86087d78f25575ddadaa4d3496b34e62b545d2e Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 16 Jul 2018 08:13:58 +1000 Subject: Fix urgency IPC events --- sway/tree/view.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index a2dbe92c..ae520b07 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -1070,8 +1070,10 @@ void view_set_urgent(struct sway_view *view, bool enable) { } container_damage_whole(view->swayc); + ipc_event_window(view->swayc, "urgent"); + struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE); - ipc_event_workspace(ws, NULL, "urgent"); + ipc_event_workspace(NULL, ws, "urgent"); } bool view_is_urgent(struct sway_view *view) { -- 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/view.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index ae520b07..b5b73408 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -595,16 +595,21 @@ void view_unmap(struct sway_view *view) { view->urgent_timer = NULL; } + struct sway_container *parent; + struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE); + if (view->is_fullscreen) { - struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE); ws->sway_workspace->fullscreen = NULL; - container_destroy(view->swayc); + parent = container_destroy(view->swayc); arrange_windows(ws->parent); } else { struct sway_container *parent = container_destroy(view->swayc); arrange_windows(parent); } + if (parent->type >= C_WORKSPACE) { // if the workspace still exists + workspace_detect_urgent(ws); + } transaction_commit_dirty(); view->surface = NULL; } @@ -1073,7 +1078,7 @@ void view_set_urgent(struct sway_view *view, bool enable) { ipc_event_window(view->swayc, "urgent"); struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE); - ipc_event_workspace(NULL, ws, "urgent"); + workspace_detect_urgent(ws); } bool view_is_urgent(struct sway_view *view) { -- cgit v1.2.3 From fc2484095a71206fe82f5042c0d127458a8da3bc Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 16 Jul 2018 22:18:12 +1000 Subject: Implement no_focus command --- sway/tree/view.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index bf380d98..bc66a701 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -518,6 +518,26 @@ void view_execute_criteria(struct sway_view *view) { seat_set_focus(seat, prior_focus); } +static bool should_focus(struct sway_view *view) { + // If the view is the only one in the focused workspace, it'll get focus + // regardless of any no_focus criteria. + struct sway_container *parent = view->swayc->parent; + struct sway_seat *seat = input_manager_current_seat(input_manager); + if (parent->type == C_WORKSPACE && seat_get_focus(seat) == parent) { + size_t num_children = parent->children->length + + parent->sway_workspace->floating->children->length; + if (num_children == 1) { + return true; + } + } + + // Check no_focus criteria + list_t *criterias = criteria_for_view(view, CT_NO_FOCUS); + size_t len = criterias->length; + list_free(criterias); + return len == 0; +} + void view_map(struct sway_view *view, struct wlr_surface *wlr_surface) { if (!sway_assert(view->surface == NULL, "cannot map mapped view")) { return; @@ -571,9 +591,11 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface) { view_set_tiled(view, true); } - input_manager_set_focus(input_manager, cont); - if (workspace) { - workspace_switch(workspace); + if (should_focus(view)) { + input_manager_set_focus(input_manager, cont); + if (workspace) { + workspace_switch(workspace); + } } view_update_title(view, false); -- cgit v1.2.3 From e2f28c023c8c5e9e847e2e9495a009b645bc60fc Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 16 Jul 2018 22:27:11 +1000 Subject: Focus view before running criteria when mapping --- sway/tree/view.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index bc66a701..10c97518 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -504,15 +504,13 @@ void view_execute_criteria(struct sway_view *view) { } wlr_log(WLR_DEBUG, "for_window '%s' matches view %p, cmd: '%s'", criteria->raw, view, criteria->cmdlist); + seat_set_focus(seat, view->swayc); list_add(view->executed_criteria, criteria); struct cmd_results *res = execute_command(criteria->cmdlist, NULL); if (res->status != CMD_SUCCESS) { wlr_log(WLR_ERROR, "Command '%s' failed: %s", res->input, res->error); } free_cmd_results(res); - // view must be focused for commands to affect it, - // so always refocus in-between command lists - seat_set_focus(seat, view->swayc); } list_free(criterias); seat_set_focus(seat, prior_focus); -- cgit v1.2.3 From 75c699db62e63e2a3c2aa652c9ba9482a8f13ec3 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Tue, 17 Jul 2018 10:14:33 +1000 Subject: Implement default_floating_border command and adjust CSD behaviour --- sway/tree/view.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index 76e0f42c..d9938130 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -316,11 +316,15 @@ void view_set_activated(struct sway_view *view, bool activated) { } void view_set_tiled(struct sway_view *view, bool tiled) { - bool csd = true; - if (view->impl->has_client_side_decorations) { - csd = view->impl->has_client_side_decorations(view); + if (!tiled) { + view->using_csd = true; + if (view->impl->has_client_side_decorations) { + view->using_csd = view->impl->has_client_side_decorations(view); + } + } else { + view->using_csd = false; } - view->border = tiled || !csd ? config->border : B_NONE; + if (view->impl->set_tiled) { view->impl->set_tiled(view, tiled); } @@ -573,8 +577,6 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface) { view->surface = wlr_surface; view->swayc = cont; - view->border = config->border; - view->border_thickness = config->border_thickness; view_init_subsurfaces(view, wlr_surface); wl_signal_add(&wlr_surface->events.new_subsurface, @@ -585,8 +587,12 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface) { view->container_reparent.notify = view_handle_container_reparent; if (view->impl->wants_floating && view->impl->wants_floating(view)) { + view->border = config->floating_border; + view->border_thickness = config->floating_border_thickness; container_set_floating(view->swayc, true); } else { + view->border = config->border; + view->border_thickness = config->border_thickness; view_set_tiled(view, true); } -- cgit v1.2.3 From 9cbff272cbb776defe8f45fd7d909be618c0ce22 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Tue, 17 Jul 2018 10:27:03 +1000 Subject: Remove superfluous IPC urgent events When an xwayland view is mapped, the IPC urgent event was being sent on every surface commit. I had intentionally ommitted the check because I figured an urgent surface could update its urgent timestamp by sending urgent a second time. But that's not how it works in xwayland's case, and it makes for more complicated code. --- sway/tree/view.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index 76e0f42c..8d8d213a 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -1080,6 +1080,9 @@ bool view_is_visible(struct sway_view *view) { } void view_set_urgent(struct sway_view *view, bool enable) { + if (view_is_urgent(view) == enable) { + return; + } if (enable) { struct sway_seat *seat = input_manager_current_seat(input_manager); if (seat_get_focus(seat) == view->swayc) { -- cgit v1.2.3 From b3014f7b168eb074bd071ee7cb930d74158a2895 Mon Sep 17 00:00:00 2001 From: frsfnrrg Date: Tue, 17 Jul 2018 10:42:48 -0400 Subject: Fix uninitialized pointer in view_unmap Otherwise, sway crashes due to uninitialized pointer dereference when AddressSanitizer is active. --- sway/tree/view.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index 70ab9364..fc31699c 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -621,16 +621,16 @@ void view_unmap(struct sway_view *view) { view->urgent_timer = NULL; } - struct sway_container *parent; struct sway_container *ws = container_parent(view->swayc, C_WORKSPACE); + struct sway_container *parent; if (view->is_fullscreen) { ws->sway_workspace->fullscreen = NULL; parent = container_destroy(view->swayc); arrange_windows(ws->parent); } else { - struct sway_container *parent = container_destroy(view->swayc); + parent = container_destroy(view->swayc); arrange_windows(parent); } if (parent->type >= C_WORKSPACE) { // if the workspace still exists -- cgit v1.2.3 From 54b00d351e50e82cb664c57b2a416b7a37963759 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 19 Jul 2018 22:30:19 +1000 Subject: Implement assign to output Eg. assign [class="Firefox"] output foo --- sway/tree/view.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index fc31699c..7881e6d7 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -564,7 +564,11 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface) { } focus = seat_get_focus_inactive(seat, workspace); } else { - // TODO: CT_ASSIGN_OUTPUT + // CT_ASSIGN_OUTPUT + struct sway_container *output = output_by_name(criteria->target); + if (output) { + focus = seat_get_focus_inactive(seat, output); + } } } // If we're about to launch the view into the floating container, then -- cgit v1.2.3 From 9fbe13b9be18c732b58033a57a22a299af91a170 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Wed, 18 Jul 2018 16:13:28 +1000 Subject: Implement floating_modifier and mouse operations for floating views This implements the following: * `floating_modifier` configuration directive * Drag a floating window by its title bar * Hold mod + drag a floating window from anywhere * Resize a floating view by dragging the border * Resize a floating view by holding mod and right clicking anywhere on the view * Resize a floating view and keep aspect ratio by holding shift while resizing using either method * Mouse cursor turns into resize when hovering floating border or corner --- sway/tree/view.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index 7881e6d7..24594950 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -387,6 +387,8 @@ void view_set_fullscreen(struct sway_view *view, bool fullscreen) { } } + container_end_mouse_operation(view->swayc); + ipc_event_window(view->swayc, "fullscreen_mode"); } -- cgit v1.2.3 From 011d1ebfa4219eb666487529a5a5e7189c14fd40 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 21 Jul 2018 12:13:00 +1000 Subject: Consider view's min/max sizes when resizing --- sway/tree/view.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index 24594950..89150a69 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -141,6 +141,19 @@ const char *view_get_shell(struct sway_view *view) { return "unknown"; } +void view_get_constraints(struct sway_view *view, double *min_width, + double *max_width, double *min_height, double *max_height) { + if (view->impl->get_constraints) { + view->impl->get_constraints(view, + min_width, max_width, min_height, max_height); + } else { + *min_width = DBL_MIN; + *max_width = DBL_MAX; + *min_height = DBL_MIN; + *max_height = DBL_MAX; + } +} + uint32_t view_configure(struct sway_view *view, double lx, double ly, int width, int height) { if (view->impl->configure) { -- cgit v1.2.3 From 81e8f31cc6f284b54ab206e14af7ecbc1a9ed1bb Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 22 Jul 2018 14:10:40 +1000 Subject: Implement scratchpad Implements the following commands: * move scratchpad * scratchpad show * [criteria] scratchpad show Also fixes these: * Fix memory leak when executing command with criteria (use `list_free(views)` instead of `free(views)`) * Fix crash when running `move to` with no further arguments --- sway/tree/view.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sway/tree/view.c') diff --git a/sway/tree/view.c b/sway/tree/view.c index 89150a69..9d88d7aa 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -1065,7 +1065,7 @@ void view_update_marks_textures(struct sway_view *view) { } bool view_is_visible(struct sway_view *view) { - if (!view->swayc || view->swayc->destroying) { + if (!view->swayc || view->swayc->destroying || !view->swayc->parent) { return false; } struct sway_container *workspace = -- cgit v1.2.3