Introduce surface_{enter,leave}_output()

We can centralize all output-related surface events from there.
This commit is contained in:
Simon Ser 2023-02-08 15:25:14 +01:00 committed by Kenny Levinsen
parent 8e4b659578
commit 1cab17ada2
6 changed files with 30 additions and 11 deletions

View file

@ -15,4 +15,9 @@ struct sway_surface {
struct wl_event_source *frame_done_timer; struct wl_event_source *frame_done_timer;
}; };
void surface_enter_output(struct wlr_surface *surface,
struct sway_output *output);
void surface_leave_output(struct wlr_surface *surface,
struct sway_output *output);
#endif #endif

View file

@ -13,6 +13,7 @@
#include "sway/layers.h" #include "sway/layers.h"
#include "sway/output.h" #include "sway/output.h"
#include "sway/server.h" #include "sway/server.h"
#include "sway/surface.h"
#include "sway/tree/arrange.h" #include "sway/tree/arrange.h"
#include "sway/tree/workspace.h" #include "sway/tree/workspace.h"
@ -382,8 +383,7 @@ static void handle_map(struct wl_listener *listener, void *data) {
struct sway_output *output = wlr_output->data; struct sway_output *output = wlr_output->data;
output_damage_surface(output, sway_layer->geo.x, sway_layer->geo.y, output_damage_surface(output, sway_layer->geo.x, sway_layer->geo.y,
sway_layer->layer_surface->surface, true); sway_layer->layer_surface->surface, true);
wlr_surface_send_enter(sway_layer->layer_surface->surface, surface_enter_output(sway_layer->layer_surface->surface, output);
sway_layer->layer_surface->output);
cursor_rebase_all(); cursor_rebase_all();
} }
@ -510,7 +510,7 @@ static void popup_handle_map(struct wl_listener *listener, void *data) {
struct sway_layer_surface *layer = popup_get_layer(popup); struct sway_layer_surface *layer = popup_get_layer(popup);
struct wlr_output *wlr_output = layer->layer_surface->output; struct wlr_output *wlr_output = layer->layer_surface->output;
sway_assert(wlr_output, "wlr_layer_surface_v1 has null output"); sway_assert(wlr_output, "wlr_layer_surface_v1 has null output");
wlr_surface_send_enter(popup->wlr_popup->base->surface, wlr_output); surface_enter_output(popup->wlr_popup->base->surface, wlr_output->data);
popup_damage(popup, true); popup_damage(popup, true);
} }

View file

@ -4,6 +4,7 @@
#include <wlr/types/wlr_compositor.h> #include <wlr/types/wlr_compositor.h>
#include "sway/server.h" #include "sway/server.h"
#include "sway/surface.h" #include "sway/surface.h"
#include "sway/output.h"
static void handle_destroy(struct wl_listener *listener, void *data) { static void handle_destroy(struct wl_listener *listener, void *data) {
struct sway_surface *surface = wl_container_of(listener, surface, destroy); struct sway_surface *surface = wl_container_of(listener, surface, destroy);
@ -44,3 +45,13 @@ void handle_compositor_new_surface(struct wl_listener *listener, void *data) {
wl_resource_post_no_memory(wlr_surface->resource); wl_resource_post_no_memory(wlr_surface->resource);
} }
} }
void surface_enter_output(struct wlr_surface *surface,
struct sway_output *output) {
wlr_surface_send_enter(surface, output->wlr_output);
}
void surface_leave_output(struct wlr_surface *surface,
struct sway_output *output) {
wlr_surface_send_leave(surface, output->wlr_output);
}

View file

@ -5,6 +5,7 @@
#include "sway/input/seat.h" #include "sway/input/seat.h"
#include "sway/output.h" #include "sway/output.h"
#include "sway/server.h" #include "sway/server.h"
#include "sway/surface.h"
struct sway_session_lock_surface { struct sway_session_lock_surface {
struct wlr_session_lock_surface_v1 *lock_surface; struct wlr_session_lock_surface_v1 *lock_surface;
@ -31,7 +32,7 @@ static void handle_surface_map(struct wl_listener *listener, void *data) {
if (server.session_lock.focused == NULL) { if (server.session_lock.focused == NULL) {
set_lock_focused_surface(surf->surface); set_lock_focused_surface(surf->surface);
} }
wlr_surface_send_enter(surf->surface, surf->output->wlr_output); surface_enter_output(surf->surface, surf->output);
output_damage_whole(surf->output); output_damage_whole(surf->output);
} }

View file

@ -18,6 +18,7 @@
#include "sway/ipc-server.h" #include "sway/ipc-server.h"
#include "sway/output.h" #include "sway/output.h"
#include "sway/server.h" #include "sway/server.h"
#include "sway/surface.h"
#include "sway/tree/arrange.h" #include "sway/tree/arrange.h"
#include "sway/tree/view.h" #include "sway/tree/view.h"
#include "sway/tree/workspace.h" #include "sway/tree/workspace.h"
@ -1265,14 +1266,14 @@ bool container_is_fullscreen_or_child(struct sway_container *container) {
static void surface_send_enter_iterator(struct wlr_surface *surface, static void surface_send_enter_iterator(struct wlr_surface *surface,
int x, int y, void *data) { int x, int y, void *data) {
struct wlr_output *wlr_output = data; struct sway_output *output = data;
wlr_surface_send_enter(surface, wlr_output); surface_enter_output(surface, output);
} }
static void surface_send_leave_iterator(struct wlr_surface *surface, static void surface_send_leave_iterator(struct wlr_surface *surface,
int x, int y, void *data) { int x, int y, void *data) {
struct wlr_output *wlr_output = data; struct sway_output *output = data;
wlr_surface_send_leave(surface, wlr_output); surface_leave_output(surface, output);
} }
void container_discover_outputs(struct sway_container *con) { void container_discover_outputs(struct sway_container *con) {
@ -1298,7 +1299,7 @@ void container_discover_outputs(struct sway_container *con) {
sway_log(SWAY_DEBUG, "Container %p entered output %p", con, output); sway_log(SWAY_DEBUG, "Container %p entered output %p", con, output);
if (con->view) { if (con->view) {
view_for_each_surface(con->view, view_for_each_surface(con->view,
surface_send_enter_iterator, output->wlr_output); surface_send_enter_iterator, output);
if (con->view->foreign_toplevel) { if (con->view->foreign_toplevel) {
wlr_foreign_toplevel_handle_v1_output_enter( wlr_foreign_toplevel_handle_v1_output_enter(
con->view->foreign_toplevel, output->wlr_output); con->view->foreign_toplevel, output->wlr_output);
@ -1310,7 +1311,7 @@ void container_discover_outputs(struct sway_container *con) {
sway_log(SWAY_DEBUG, "Container %p left output %p", con, output); sway_log(SWAY_DEBUG, "Container %p left output %p", con, output);
if (con->view) { if (con->view) {
view_for_each_surface(con->view, view_for_each_surface(con->view,
surface_send_leave_iterator, output->wlr_output); surface_send_leave_iterator, output);
if (con->view->foreign_toplevel) { if (con->view->foreign_toplevel) {
wlr_foreign_toplevel_handle_v1_output_leave( wlr_foreign_toplevel_handle_v1_output_leave(
con->view->foreign_toplevel, output->wlr_output); con->view->foreign_toplevel, output->wlr_output);

View file

@ -25,6 +25,7 @@
#include "sway/output.h" #include "sway/output.h"
#include "sway/input/seat.h" #include "sway/input/seat.h"
#include "sway/server.h" #include "sway/server.h"
#include "sway/surface.h"
#include "sway/tree/arrange.h" #include "sway/tree/arrange.h"
#include "sway/tree/container.h" #include "sway/tree/container.h"
#include "sway/tree/view.h" #include "sway/tree/view.h"
@ -1148,7 +1149,7 @@ void view_child_init(struct sway_view_child *child,
if (container != NULL) { if (container != NULL) {
struct sway_workspace *workspace = container->pending.workspace; struct sway_workspace *workspace = container->pending.workspace;
if (workspace) { if (workspace) {
wlr_surface_send_enter(child->surface, workspace->output->wlr_output); surface_enter_output(child->surface, workspace->output);
} }
} }