aboutsummaryrefslogtreecommitdiffstats
path: root/sway/tree/view.c
diff options
context:
space:
mode:
authorLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-10-06 14:49:33 +1000
committerLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-10-07 11:07:29 +1000
commit1059e173f4c0139e909c7d8b5d450f30c0adad0e (patch)
treef14474b2d5118151129593443e5f8f785c3f6ab0 /sway/tree/view.c
parentMerge pull request #2778 from emersion/swaybar-seat-pointer (diff)
downloadsway-1059e173f4c0139e909c7d8b5d450f30c0adad0e.tar.gz
sway-1059e173f4c0139e909c7d8b5d450f30c0adad0e.tar.zst
sway-1059e173f4c0139e909c7d8b5d450f30c0adad0e.zip
Only damage popups when popups have damage
The previous behaviour was to damage the entire view, which would recurse into each popup. This patch makes it damage only the popup's surface, and respect the surface damage given by the client. This adds listeners to the popup's map and unmap events rather than doing the damage in the create and destroy functions. To get the popup's position relative to the view, a new child_impl function get_root_coords has been introduced, which traverses up the parents.
Diffstat (limited to 'sway/tree/view.c')
-rw-r--r--sway/tree/view.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/sway/tree/view.c b/sway/tree/view.c
index 73ce55ac..50d25c4f 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -15,6 +15,7 @@
15#include "log.h" 15#include "log.h"
16#include "sway/criteria.h" 16#include "sway/criteria.h"
17#include "sway/commands.h" 17#include "sway/commands.h"
18#include "sway/desktop.h"
18#include "sway/desktop/transaction.h" 19#include "sway/desktop/transaction.h"
19#include "sway/input/cursor.h" 20#include "sway/input/cursor.h"
20#include "sway/ipc-server.h" 21#include "sway/ipc-server.h"
@@ -639,12 +640,18 @@ static void view_subsurface_create(struct sway_view *view,
639 view_child_init(child, NULL, view, subsurface->surface); 640 view_child_init(child, NULL, view, subsurface->surface);
640} 641}
641 642
643static void view_child_damage(struct sway_view_child *child, bool whole) {
644 int sx, sy;
645 child->impl->get_root_coords(child, &sx, &sy);
646 desktop_damage_surface(child->surface,
647 child->view->x + sx, child->view->y + sy, whole);
648}
649
642static void view_child_handle_surface_commit(struct wl_listener *listener, 650static void view_child_handle_surface_commit(struct wl_listener *listener,
643 void *data) { 651 void *data) {
644 struct sway_view_child *child = 652 struct sway_view_child *child =
645 wl_container_of(listener, child, surface_commit); 653 wl_container_of(listener, child, surface_commit);
646 // TODO: only accumulate damage from the child 654 view_child_damage(child, false);
647 view_damage_from(child->view);
648} 655}
649 656
650static void view_child_handle_surface_new_subsurface( 657static void view_child_handle_surface_new_subsurface(
@@ -677,6 +684,20 @@ static void view_init_subsurfaces(struct sway_view *view,
677 } 684 }
678} 685}
679 686
687static void view_child_handle_surface_map(struct wl_listener *listener,
688 void *data) {
689 struct sway_view_child *child =
690 wl_container_of(listener, child, surface_map);
691 view_child_damage(child, true);
692}
693
694static void view_child_handle_surface_unmap(struct wl_listener *listener,
695 void *data) {
696 struct sway_view_child *child =
697 wl_container_of(listener, child, surface_unmap);
698 view_child_damage(child, true);
699}
700
680void view_child_init(struct sway_view_child *child, 701void view_child_init(struct sway_view_child *child,
681 const struct sway_view_child_impl *impl, struct sway_view *view, 702 const struct sway_view_child_impl *impl, struct sway_view *view,
682 struct wlr_surface *surface) { 703 struct wlr_surface *surface) {
@@ -692,6 +713,10 @@ void view_child_init(struct sway_view_child *child,
692 view_child_handle_surface_new_subsurface; 713 view_child_handle_surface_new_subsurface;
693 wl_signal_add(&surface->events.destroy, &child->surface_destroy); 714 wl_signal_add(&surface->events.destroy, &child->surface_destroy);
694 child->surface_destroy.notify = view_child_handle_surface_destroy; 715 child->surface_destroy.notify = view_child_handle_surface_destroy;
716
717 child->surface_map.notify = view_child_handle_surface_map;
718 child->surface_unmap.notify = view_child_handle_surface_unmap;
719
695 wl_signal_add(&view->events.unmap, &child->view_unmap); 720 wl_signal_add(&view->events.unmap, &child->view_unmap);
696 child->view_unmap.notify = view_child_handle_view_unmap; 721 child->view_unmap.notify = view_child_handle_view_unmap;
697 722
@@ -699,15 +724,9 @@ void view_child_init(struct sway_view_child *child,
699 wlr_surface_send_enter(child->surface, output->wlr_output); 724 wlr_surface_send_enter(child->surface, output->wlr_output);
700 725
701 view_init_subsurfaces(child->view, surface); 726 view_init_subsurfaces(child->view, surface);
702
703 // TODO: only damage the whole child
704 container_damage_whole(child->view->container);
705} 727}
706 728
707void view_child_destroy(struct sway_view_child *child) { 729void view_child_destroy(struct sway_view_child *child) {
708 // TODO: only damage the whole child
709 container_damage_whole(child->view->container);
710
711 wl_list_remove(&child->surface_commit.link); 730 wl_list_remove(&child->surface_commit.link);
712 wl_list_remove(&child->surface_destroy.link); 731 wl_list_remove(&child->surface_destroy.link);
713 wl_list_remove(&child->view_unmap.link); 732 wl_list_remove(&child->view_unmap.link);