diff --git a/include/labwc.h b/include/labwc.h index dfbf7393..5946c495 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -376,6 +376,8 @@ void view_for_each_surface(struct view *view, wlr_surface_iterator_func_t iterator, void *user_data); void view_for_each_popup_surface(struct view *view, wlr_surface_iterator_func_t iterator, void *data); +void view_output_enter(struct view *view, struct wlr_output *wlr_output); +void view_output_leave(struct view *view, struct wlr_output *wlr_output); void view_move_to_edge(struct view *view, const char *direction); void view_snap_to_edge(struct view *view, const char *direction); const char *view_get_string_prop(struct view *view, const char *prop); diff --git a/src/view.c b/src/view.c index 1e560e8e..fdbeb842 100644 --- a/src/view.c +++ b/src/view.c @@ -254,6 +254,44 @@ view_border(struct view *view) return border; } +void +surface_enter_for_each_surface(struct wlr_surface *surface, int sx, int sy, + void *user_data) +{ + struct wlr_output *wlr_output = user_data; + wlr_surface_send_enter(surface, wlr_output); +} + +void +surface_leave_for_each_surface(struct wlr_surface *surface, int sx, int sy, + void *user_data) +{ + struct wlr_output *wlr_output = user_data; + wlr_surface_send_leave(surface, wlr_output); +} + +void +view_output_enter(struct view *view, struct wlr_output *wlr_output) +{ + view_for_each_surface(view, surface_enter_for_each_surface, + wlr_output); + if (view->toplevel_handle) { + wlr_foreign_toplevel_handle_v1_output_enter( + view->toplevel_handle, wlr_output); + } +} + +void +view_output_leave(struct view *view, struct wlr_output *wlr_output) +{ + view_for_each_surface(view, surface_leave_for_each_surface, + wlr_output); + if (view->toplevel_handle) { + wlr_foreign_toplevel_handle_v1_output_leave( + view->toplevel_handle, wlr_output); + } +} + void view_move_to_edge(struct view *view, const char *direction) { diff --git a/src/xdg.c b/src/xdg.c index 6ad5b6d6..c63167ae 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -343,6 +343,8 @@ xdg_toplevel_view_map(struct view *view) current.link) { view_subsurface_create(view, subsurface); } + struct wlr_output *wlr_output = view_wlr_output(view); + view_output_enter(view, wlr_output); view->been_mapped = true; } diff --git a/src/xwayland.c b/src/xwayland.c index 08846303..f74c1b6c 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -256,6 +256,9 @@ map(struct view *view) view->x = box.x; view->y = box.y; view_center(view); + + struct wlr_output *wlr_output = view_wlr_output(view); + view_output_enter(view, wlr_output); view->been_mapped = true; }