diff options
Diffstat (limited to 'sway/tree/view.c')
-rw-r--r-- | sway/tree/view.c | 35 |
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 | ||
643 | static 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 | |||
642 | static void view_child_handle_surface_commit(struct wl_listener *listener, | 650 | static 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 | ||
650 | static void view_child_handle_surface_new_subsurface( | 657 | static 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 | ||
687 | static 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 | |||
694 | static 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 | |||
680 | void view_child_init(struct sway_view_child *child, | 701 | void 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 | ||
707 | void view_child_destroy(struct sway_view_child *child) { | 729 | void 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); |