diff options
author | Drew DeVault <sir@cmpwn.com> | 2018-08-02 09:05:46 -0400 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2018-08-02 09:05:46 -0400 |
commit | 9aa258d33a9baa42895214da7e82f4568fcb8f76 (patch) | |
tree | 229419214ed67a2e4237b36cf0d1185f1406dad1 /sway | |
parent | Merge pull request #2404 from RyanDwyer/move-containers-when-workspace-focused (diff) | |
download | sway-9aa258d33a9baa42895214da7e82f4568fcb8f76.tar.gz sway-9aa258d33a9baa42895214da7e82f4568fcb8f76.tar.zst sway-9aa258d33a9baa42895214da7e82f4568fcb8f76.zip |
Revert "Fix popups"
This reverts commit de86d65627e96cffe77f4abf11c4a0b982326ff9.
Diffstat (limited to 'sway')
-rw-r--r-- | sway/desktop/output.c | 19 | ||||
-rw-r--r-- | sway/desktop/render.c | 37 | ||||
-rw-r--r-- | sway/desktop/xdg_shell.c | 9 | ||||
-rw-r--r-- | sway/desktop/xdg_shell_v6.c | 10 | ||||
-rw-r--r-- | sway/input/cursor.c | 3 | ||||
-rw-r--r-- | sway/tree/container.c | 134 | ||||
-rw-r--r-- | sway/tree/view.c | 10 |
7 files changed, 46 insertions, 176 deletions
diff --git a/sway/desktop/output.c b/sway/desktop/output.c index 66747a3f..31b53213 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c | |||
@@ -119,7 +119,7 @@ static void output_for_each_surface_iterator(struct wlr_surface *surface, | |||
119 | data->user_data); | 119 | data->user_data); |
120 | } | 120 | } |
121 | 121 | ||
122 | void output_surface_for_each_surface(struct sway_output *output, | 122 | static void output_surface_for_each_surface(struct sway_output *output, |
123 | struct wlr_surface *surface, double ox, double oy, | 123 | struct wlr_surface *surface, double ox, double oy, |
124 | sway_surface_iterator_func_t iterator, void *user_data) { | 124 | sway_surface_iterator_func_t iterator, void *user_data) { |
125 | struct surface_iterator_data data = { | 125 | struct surface_iterator_data data = { |
@@ -155,23 +155,6 @@ void output_view_for_each_surface(struct sway_output *output, | |||
155 | output_for_each_surface_iterator, &data); | 155 | output_for_each_surface_iterator, &data); |
156 | } | 156 | } |
157 | 157 | ||
158 | void output_view_for_each_popup(struct sway_output *output, | ||
159 | struct sway_view *view, sway_surface_iterator_func_t iterator, | ||
160 | void *user_data) { | ||
161 | struct surface_iterator_data data = { | ||
162 | .user_iterator = iterator, | ||
163 | .user_data = user_data, | ||
164 | .output = output, | ||
165 | .ox = view->swayc->current.view_x - output->swayc->current.swayc_x, | ||
166 | .oy = view->swayc->current.view_y - output->swayc->current.swayc_y, | ||
167 | .width = view->swayc->current.view_width, | ||
168 | .height = view->swayc->current.view_height, | ||
169 | .rotation = 0, // TODO | ||
170 | }; | ||
171 | |||
172 | view_for_each_popup(view, output_for_each_surface_iterator, &data); | ||
173 | } | ||
174 | |||
175 | void output_layer_for_each_surface(struct sway_output *output, | 158 | void output_layer_for_each_surface(struct sway_output *output, |
176 | struct wl_list *layer_surfaces, sway_surface_iterator_func_t iterator, | 159 | struct wl_list *layer_surfaces, sway_surface_iterator_func_t iterator, |
177 | void *user_data) { | 160 | void *user_data) { |
diff --git a/sway/desktop/render.c b/sway/desktop/render.c index 1f374740..f0e47c95 100644 --- a/sway/desktop/render.c +++ b/sway/desktop/render.c | |||
@@ -186,36 +186,13 @@ static void premultiply_alpha(float color[4], float opacity) { | |||
186 | color[2] *= color[3]; | 186 | color[2] *= color[3]; |
187 | } | 187 | } |
188 | 188 | ||
189 | static void render_view_toplevels(struct sway_view *view, | 189 | static void render_view_surfaces(struct sway_view *view, |
190 | struct sway_output *output, pixman_region32_t *damage, float alpha) { | 190 | struct sway_output *output, pixman_region32_t *damage, float alpha) { |
191 | struct render_data data = { | 191 | struct render_data data = { |
192 | .damage = damage, | 192 | .damage = damage, |
193 | .alpha = alpha, | 193 | .alpha = alpha, |
194 | }; | 194 | }; |
195 | // Render all toplevels without descending into popups | 195 | output_view_for_each_surface(output, view, render_surface_iterator, &data); |
196 | output_surface_for_each_surface(output, view->surface, | ||
197 | view->swayc->current.view_x, view->swayc->current.view_y, | ||
198 | render_surface_iterator, &data); | ||
199 | } | ||
200 | |||
201 | static void render_popup_iterator(struct sway_output *output, | ||
202 | struct wlr_surface *surface, struct wlr_box *box, float rotation, | ||
203 | void *data) { | ||
204 | // Render this popup's surface | ||
205 | render_surface_iterator(output, surface, box, rotation, data); | ||
206 | |||
207 | // Render this popup's child toplevels | ||
208 | output_surface_for_each_surface(output, surface, box->x, box->y, | ||
209 | render_surface_iterator, data); | ||
210 | } | ||
211 | |||
212 | static void render_view_popups(struct sway_view *view, | ||
213 | struct sway_output *output, pixman_region32_t *damage, float alpha) { | ||
214 | struct render_data data = { | ||
215 | .damage = damage, | ||
216 | .alpha = alpha, | ||
217 | }; | ||
218 | output_view_for_each_popup(output, view, render_popup_iterator, &data); | ||
219 | } | 196 | } |
220 | 197 | ||
221 | static void render_saved_view(struct sway_view *view, | 198 | static void render_saved_view(struct sway_view *view, |
@@ -262,7 +239,7 @@ static void render_view(struct sway_output *output, pixman_region32_t *damage, | |||
262 | if (view->saved_buffer) { | 239 | if (view->saved_buffer) { |
263 | render_saved_view(view, output, damage, view->swayc->alpha); | 240 | render_saved_view(view, output, damage, view->swayc->alpha); |
264 | } else { | 241 | } else { |
265 | render_view_toplevels(view, output, damage, view->swayc->alpha); | 242 | render_view_surfaces(view, output, damage, view->swayc->alpha); |
266 | } | 243 | } |
267 | 244 | ||
268 | if (view->using_csd) { | 245 | if (view->using_csd) { |
@@ -866,7 +843,7 @@ void output_render(struct sway_output *output, struct timespec *when, | |||
866 | render_saved_view(fullscreen_con->sway_view, | 843 | render_saved_view(fullscreen_con->sway_view, |
867 | output, damage, 1.0f); | 844 | output, damage, 1.0f); |
868 | } else { | 845 | } else { |
869 | render_view_toplevels(fullscreen_con->sway_view, | 846 | render_view_surfaces(fullscreen_con->sway_view, |
870 | output, damage, 1.0f); | 847 | output, damage, 1.0f); |
871 | } | 848 | } |
872 | } else { | 849 | } else { |
@@ -902,12 +879,6 @@ void output_render(struct sway_output *output, struct timespec *when, | |||
902 | &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]); | 879 | &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]); |
903 | } | 880 | } |
904 | 881 | ||
905 | struct sway_seat *seat = input_manager_current_seat(input_manager); | ||
906 | struct sway_container *focus = seat_get_focus(seat); | ||
907 | if (focus && focus->type == C_VIEW) { | ||
908 | render_view_popups(focus->sway_view, output, damage, focus->alpha); | ||
909 | } | ||
910 | |||
911 | render_overlay: | 882 | render_overlay: |
912 | render_layer(output, damage, | 883 | render_layer(output, damage, |
913 | &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY]); | 884 | &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY]); |
diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c index b364663d..9d6b27e5 100644 --- a/sway/desktop/xdg_shell.c +++ b/sway/desktop/xdg_shell.c | |||
@@ -179,14 +179,6 @@ static void for_each_surface(struct sway_view *view, | |||
179 | user_data); | 179 | user_data); |
180 | } | 180 | } |
181 | 181 | ||
182 | static void for_each_popup(struct sway_view *view, | ||
183 | wlr_surface_iterator_func_t iterator, void *user_data) { | ||
184 | if (xdg_shell_view_from_view(view) == NULL) { | ||
185 | return; | ||
186 | } | ||
187 | wlr_xdg_surface_for_each_popup(view->wlr_xdg_surface, iterator, user_data); | ||
188 | } | ||
189 | |||
190 | static void _close(struct sway_view *view) { | 182 | static void _close(struct sway_view *view) { |
191 | if (xdg_shell_view_from_view(view) == NULL) { | 183 | if (xdg_shell_view_from_view(view) == NULL) { |
192 | return; | 184 | return; |
@@ -227,7 +219,6 @@ static const struct sway_view_impl view_impl = { | |||
227 | .set_fullscreen = set_fullscreen, | 219 | .set_fullscreen = set_fullscreen, |
228 | .wants_floating = wants_floating, | 220 | .wants_floating = wants_floating, |
229 | .for_each_surface = for_each_surface, | 221 | .for_each_surface = for_each_surface, |
230 | .for_each_popup = for_each_popup, | ||
231 | .close = _close, | 222 | .close = _close, |
232 | .close_popups = close_popups, | 223 | .close_popups = close_popups, |
233 | .destroy = destroy, | 224 | .destroy = destroy, |
diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c index ffea03ad..6e4aae62 100644 --- a/sway/desktop/xdg_shell_v6.c +++ b/sway/desktop/xdg_shell_v6.c | |||
@@ -175,15 +175,6 @@ static void for_each_surface(struct sway_view *view, | |||
175 | user_data); | 175 | user_data); |
176 | } | 176 | } |
177 | 177 | ||
178 | static void for_each_popup(struct sway_view *view, | ||
179 | wlr_surface_iterator_func_t iterator, void *user_data) { | ||
180 | if (xdg_shell_v6_view_from_view(view) == NULL) { | ||
181 | return; | ||
182 | } | ||
183 | wlr_xdg_surface_v6_for_each_popup(view->wlr_xdg_surface_v6, iterator, | ||
184 | user_data); | ||
185 | } | ||
186 | |||
187 | static void _close(struct sway_view *view) { | 178 | static void _close(struct sway_view *view) { |
188 | if (xdg_shell_v6_view_from_view(view) == NULL) { | 179 | if (xdg_shell_v6_view_from_view(view) == NULL) { |
189 | return; | 180 | return; |
@@ -224,7 +215,6 @@ static const struct sway_view_impl view_impl = { | |||
224 | .set_fullscreen = set_fullscreen, | 215 | .set_fullscreen = set_fullscreen, |
225 | .wants_floating = wants_floating, | 216 | .wants_floating = wants_floating, |
226 | .for_each_surface = for_each_surface, | 217 | .for_each_surface = for_each_surface, |
227 | .for_each_popup = for_each_popup, | ||
228 | .close = _close, | 218 | .close = _close, |
229 | .close_popups = close_popups, | 219 | .close_popups = close_popups, |
230 | .destroy = destroy, | 220 | .destroy = destroy, |
diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 79f6ec46..d6fdc1da 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c | |||
@@ -109,6 +109,9 @@ static struct sway_container *container_at_coords( | |||
109 | } | 109 | } |
110 | 110 | ||
111 | struct sway_container *c; | 111 | struct sway_container *c; |
112 | if ((c = floating_container_at(lx, ly, surface, sx, sy))) { | ||
113 | return c; | ||
114 | } | ||
112 | if ((c = container_at(ws, lx, ly, surface, sx, sy))) { | 115 | if ((c = container_at(ws, lx, ly, surface, sx, sy))) { |
113 | return c; | 116 | return c; |
114 | } | 117 | } |
diff --git a/sway/tree/container.c b/sway/tree/container.c index b980c5e9..b6ff4d30 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c | |||
@@ -569,15 +569,10 @@ static struct sway_container *container_at_view(struct sway_container *swayc, | |||
569 | *sx = _sx; | 569 | *sx = _sx; |
570 | *sy = _sy; | 570 | *sy = _sy; |
571 | *surface = _surface; | 571 | *surface = _surface; |
572 | return swayc; | ||
573 | } | 572 | } |
574 | return NULL; | 573 | return swayc; |
575 | } | 574 | } |
576 | 575 | ||
577 | static struct sway_container *tiling_container_at( | ||
578 | struct sway_container *con, double lx, double ly, | ||
579 | struct wlr_surface **surface, double *sx, double *sy); | ||
580 | |||
581 | /** | 576 | /** |
582 | * container_at for a container with layout L_TABBED. | 577 | * container_at for a container with layout L_TABBED. |
583 | */ | 578 | */ |
@@ -604,7 +599,7 @@ static struct sway_container *container_at_tabbed(struct sway_container *parent, | |||
604 | // Surfaces | 599 | // Surfaces |
605 | struct sway_container *current = seat_get_active_child(seat, parent); | 600 | struct sway_container *current = seat_get_active_child(seat, parent); |
606 | 601 | ||
607 | return tiling_container_at(current, lx, ly, surface, sx, sy); | 602 | return container_at(current, lx, ly, surface, sx, sy); |
608 | } | 603 | } |
609 | 604 | ||
610 | /** | 605 | /** |
@@ -629,7 +624,7 @@ static struct sway_container *container_at_stacked( | |||
629 | // Surfaces | 624 | // Surfaces |
630 | struct sway_container *current = seat_get_active_child(seat, parent); | 625 | struct sway_container *current = seat_get_active_child(seat, parent); |
631 | 626 | ||
632 | return tiling_container_at(current, lx, ly, surface, sx, sy); | 627 | return container_at(current, lx, ly, surface, sx, sy); |
633 | } | 628 | } |
634 | 629 | ||
635 | /** | 630 | /** |
@@ -647,13 +642,45 @@ static struct sway_container *container_at_linear(struct sway_container *parent, | |||
647 | .height = child->height, | 642 | .height = child->height, |
648 | }; | 643 | }; |
649 | if (wlr_box_contains_point(&box, lx, ly)) { | 644 | if (wlr_box_contains_point(&box, lx, ly)) { |
650 | return tiling_container_at(child, lx, ly, surface, sx, sy); | 645 | return container_at(child, lx, ly, surface, sx, sy); |
651 | } | 646 | } |
652 | } | 647 | } |
653 | return NULL; | 648 | return NULL; |
654 | } | 649 | } |
655 | 650 | ||
656 | static struct sway_container *floating_container_at(double lx, double ly, | 651 | struct sway_container *container_at(struct sway_container *parent, |
652 | double lx, double ly, | ||
653 | struct wlr_surface **surface, double *sx, double *sy) { | ||
654 | if (!sway_assert(parent->type >= C_WORKSPACE, | ||
655 | "Expected workspace or deeper")) { | ||
656 | return NULL; | ||
657 | } | ||
658 | if (parent->type == C_VIEW) { | ||
659 | return container_at_view(parent, lx, ly, surface, sx, sy); | ||
660 | } | ||
661 | if (!parent->children->length) { | ||
662 | return NULL; | ||
663 | } | ||
664 | |||
665 | switch (parent->layout) { | ||
666 | case L_HORIZ: | ||
667 | case L_VERT: | ||
668 | return container_at_linear(parent, lx, ly, surface, sx, sy); | ||
669 | case L_TABBED: | ||
670 | return container_at_tabbed(parent, lx, ly, surface, sx, sy); | ||
671 | case L_STACKED: | ||
672 | return container_at_stacked(parent, lx, ly, surface, sx, sy); | ||
673 | case L_FLOATING: | ||
674 | sway_assert(false, "Didn't expect to see floating here"); | ||
675 | return NULL; | ||
676 | case L_NONE: | ||
677 | return NULL; | ||
678 | } | ||
679 | |||
680 | return NULL; | ||
681 | } | ||
682 | |||
683 | struct sway_container *floating_container_at(double lx, double ly, | ||
657 | struct wlr_surface **surface, double *sx, double *sy) { | 684 | struct wlr_surface **surface, double *sx, double *sy) { |
658 | for (int i = 0; i < root_container.children->length; ++i) { | 685 | for (int i = 0; i < root_container.children->length; ++i) { |
659 | struct sway_container *output = root_container.children->items[i]; | 686 | struct sway_container *output = root_container.children->items[i]; |
@@ -675,8 +702,7 @@ static struct sway_container *floating_container_at(double lx, double ly, | |||
675 | .height = floater->height, | 702 | .height = floater->height, |
676 | }; | 703 | }; |
677 | if (wlr_box_contains_point(&box, lx, ly)) { | 704 | if (wlr_box_contains_point(&box, lx, ly)) { |
678 | return tiling_container_at(floater, lx, ly, | 705 | return container_at(floater, lx, ly, surface, sx, sy); |
679 | surface, sx, sy); | ||
680 | } | 706 | } |
681 | } | 707 | } |
682 | } | 708 | } |
@@ -684,90 +710,6 @@ static struct sway_container *floating_container_at(double lx, double ly, | |||
684 | return NULL; | 710 | return NULL; |
685 | } | 711 | } |
686 | 712 | ||
687 | static struct sway_container *tiling_container_at( | ||
688 | struct sway_container *con, double lx, double ly, | ||
689 | struct wlr_surface **surface, double *sx, double *sy) { | ||
690 | if (con->type == C_VIEW) { | ||
691 | return container_at_view(con, lx, ly, surface, sx, sy); | ||
692 | } | ||
693 | if (!con->children->length) { | ||
694 | return NULL; | ||
695 | } | ||
696 | |||
697 | switch (con->layout) { | ||
698 | case L_HORIZ: | ||
699 | case L_VERT: | ||
700 | return container_at_linear(con, lx, ly, surface, sx, sy); | ||
701 | case L_TABBED: | ||
702 | return container_at_tabbed(con, lx, ly, surface, sx, sy); | ||
703 | case L_STACKED: | ||
704 | return container_at_stacked(con, lx, ly, surface, sx, sy); | ||
705 | case L_FLOATING: | ||
706 | sway_assert(false, "Didn't expect to see floating here"); | ||
707 | return NULL; | ||
708 | case L_NONE: | ||
709 | return NULL; | ||
710 | } | ||
711 | return NULL; | ||
712 | } | ||
713 | |||
714 | static bool surface_is_popup(struct wlr_surface *surface) { | ||
715 | if (wlr_surface_is_xdg_surface(surface)) { | ||
716 | struct wlr_xdg_surface *xdg_surface = | ||
717 | wlr_xdg_surface_from_wlr_surface(surface); | ||
718 | while (xdg_surface) { | ||
719 | if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) { | ||
720 | return true; | ||
721 | } | ||
722 | xdg_surface = xdg_surface->toplevel->parent; | ||
723 | } | ||
724 | return false; | ||
725 | } | ||
726 | |||
727 | if (wlr_surface_is_xdg_surface_v6(surface)) { | ||
728 | struct wlr_xdg_surface_v6 *xdg_surface_v6 = | ||
729 | wlr_xdg_surface_v6_from_wlr_surface(surface); | ||
730 | while (xdg_surface_v6) { | ||
731 | if (xdg_surface_v6->role == WLR_XDG_SURFACE_V6_ROLE_POPUP) { | ||
732 | return true; | ||
733 | } | ||
734 | xdg_surface_v6 = xdg_surface_v6->toplevel->parent; | ||
735 | } | ||
736 | return false; | ||
737 | } | ||
738 | |||
739 | return false; | ||
740 | } | ||
741 | |||
742 | struct sway_container *container_at(struct sway_container *workspace, | ||
743 | double lx, double ly, | ||
744 | struct wlr_surface **surface, double *sx, double *sy) { | ||
745 | if (!sway_assert(workspace->type == C_WORKSPACE, "Expected a workspace")) { | ||
746 | return NULL; | ||
747 | } | ||
748 | struct sway_container *c; | ||
749 | // Focused view's popups | ||
750 | struct sway_seat *seat = input_manager_current_seat(input_manager); | ||
751 | struct sway_container *focus = | ||
752 | seat_get_focus_inactive(seat, &root_container); | ||
753 | if (focus && focus->type == C_VIEW) { | ||
754 | container_at_view(focus, lx, ly, surface, sx, sy); | ||
755 | if (*surface && surface_is_popup(*surface)) { | ||
756 | return focus; | ||
757 | } | ||
758 | *surface = NULL; | ||
759 | } | ||
760 | // Floating | ||
761 | if ((c = floating_container_at(lx, ly, surface, sx, sy))) { | ||
762 | return c; | ||
763 | } | ||
764 | // Tiling | ||
765 | if ((c = tiling_container_at(workspace, lx, ly, surface, sx, sy))) { | ||
766 | return c; | ||
767 | } | ||
768 | return NULL; | ||
769 | } | ||
770 | |||
771 | void container_for_each_descendant_dfs(struct sway_container *container, | 713 | void container_for_each_descendant_dfs(struct sway_container *container, |
772 | void (*f)(struct sway_container *container, void *data), | 714 | void (*f)(struct sway_container *container, void *data), |
773 | void *data) { | 715 | void *data) { |
diff --git a/sway/tree/view.c b/sway/tree/view.c index 97318daa..27a6a8bd 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c | |||
@@ -339,16 +339,6 @@ void view_for_each_surface(struct sway_view *view, | |||
339 | } | 339 | } |
340 | } | 340 | } |
341 | 341 | ||
342 | void view_for_each_popup(struct sway_view *view, | ||
343 | wlr_surface_iterator_func_t iterator, void *user_data) { | ||
344 | if (!view->surface) { | ||
345 | return; | ||
346 | } | ||
347 | if (view->impl->for_each_popup) { | ||
348 | view->impl->for_each_popup(view, iterator, user_data); | ||
349 | } | ||
350 | } | ||
351 | |||
352 | static void view_subsurface_create(struct sway_view *view, | 342 | static void view_subsurface_create(struct sway_view *view, |
353 | struct wlr_subsurface *subsurface); | 343 | struct wlr_subsurface *subsurface); |
354 | 344 | ||