aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/wlr/types/wlr_surface.h12
-rw-r--r--types/wlr_surface.c11
2 files changed, 23 insertions, 0 deletions
diff --git a/include/wlr/types/wlr_surface.h b/include/wlr/types/wlr_surface.h
index c8e3761a..9f88d044 100644
--- a/include/wlr/types/wlr_surface.h
+++ b/include/wlr/types/wlr_surface.h
@@ -77,6 +77,10 @@ struct wlr_surface {
struct wl_listener compositor_listener;
void *compositor_data;
+ // surface commit callback for the role that runs before all others
+ void (*role_committed)(struct wlr_surface *surface, void *role_data);
+ void *role_data;
+
// subsurface properties
struct wlr_subsurface *subsurface;
struct wl_list subsurface_list; // wlr_subsurface::parent_link
@@ -146,4 +150,12 @@ void wlr_surface_send_leave(struct wlr_surface *surface,
void wlr_surface_send_frame_done(struct wlr_surface *surface,
const struct timespec *when);
+/**
+ * Set a callback for surface commit that runs before all the other callbacks.
+ * This is intended for use by the surface role.
+ */
+void wlr_surface_set_role_committed(struct wlr_surface *surface,
+ void (*role_committed)(struct wlr_surface *surface, void *role_data),
+ void *role_data);
+
#endif
diff --git a/types/wlr_surface.c b/types/wlr_surface.c
index ad0c6f68..8e024177 100644
--- a/types/wlr_surface.c
+++ b/types/wlr_surface.c
@@ -428,6 +428,10 @@ static void wlr_surface_commit_pending(struct wlr_surface *surface) {
}
}
+ if (surface->role_committed) {
+ surface->role_committed(surface, surface->role_data);
+ }
+
// TODO: add the invalid bitfield to this callback
wl_signal_emit(&surface->events.commit, surface);
}
@@ -943,3 +947,10 @@ void wlr_surface_send_frame_done(struct wlr_surface *surface,
wl_resource_destroy(cb->resource);
}
}
+
+void wlr_surface_set_role_committed(struct wlr_surface *surface,
+ void (*role_committed)(struct wlr_surface *surface, void *role_data),
+ void *role_data) {
+ surface->role_committed = role_committed;
+ surface->role_data = role_data;
+}