From 5fa7457171479ce9ec7913d2d50c68685e47aea3 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 27 Oct 2023 21:46:40 -0400 Subject: [PATCH] gdk: Add private subsurface api Add api to allow creating subsurfaces, and attaching textures to them. This is just the api, there is no implementation yet. --- gdk/gdksurface.c | 44 +++++++++++++++++++++++++++++++++++++++++ gdk/gdksurfaceprivate.h | 35 ++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/gdk/gdksurface.c b/gdk/gdksurface.c index 89938bffb6..296c91e562 100644 --- a/gdk/gdksurface.c +++ b/gdk/gdksurface.c @@ -493,6 +493,12 @@ gdk_surface_real_get_scale (GdkSurface *surface) return 1.0; } +static GdkSubsurface * +gdk_surface_real_create_subsurface (GdkSurface *surface) +{ + return NULL; +} + static void gdk_surface_constructed (GObject *object) { @@ -515,6 +521,7 @@ gdk_surface_class_init (GdkSurfaceClass *klass) klass->beep = gdk_surface_real_beep; klass->get_scale = gdk_surface_real_get_scale; + klass->create_subsurface = gdk_surface_real_create_subsurface; /** * GdkSurface:cursor: (attributes org.gtk.Property.get=gdk_surface_get_cursor org.gtk.Property.set=gdk_surface_set_cursor) @@ -3054,3 +3061,40 @@ gdk_surface_leave_monitor (GdkSurface *surface, { g_signal_emit (surface, signals[LEAVE_MONITOR], 0, monitor); } + +GdkSubsurface * +gdk_surface_create_subsurface (GdkSurface *surface) +{ + return GDK_SURFACE_GET_CLASS (surface)->create_subsurface (surface); +} + +void +gdk_subsurface_destroy (GdkSubsurface *subsurface) +{ + subsurface->class->destroy (subsurface); +} + +void +gdk_subsurface_attach (GdkSubsurface *subsurface, + GdkTexture *texture, + const graphene_rect_t *bounds) +{ + subsurface->class->attach (subsurface, texture, bounds); +} + +/* If sibling is NULL, place the subsurface above its parent */ +void +gdk_subsurface_place_above (GdkSubsurface *subsurface, + GdkSubsurface *sibling) +{ + subsurface->class->place_above (subsurface, sibling); +} + +/* If sibling is NULL, place the subsurface below its parent */ +void +gdk_subsurface_place_below (GdkSubsurface *subsurface, + GdkSubsurface *sibling) +{ + subsurface->class->place_below (subsurface, sibling); +} + diff --git a/gdk/gdksurfaceprivate.h b/gdk/gdksurfaceprivate.h index 1bf930822f..368a42a877 100644 --- a/gdk/gdksurfaceprivate.h +++ b/gdk/gdksurfaceprivate.h @@ -23,9 +23,14 @@ #include "gdkenumtypes.h" #include "gdksurface.h" #include "gdktoplevel.h" +#include G_BEGIN_DECLS +typedef struct _GdkSubsurface GdkSubsurface; + +typedef struct _GskRenderNode GskRenderNode; + struct _GdkSurface { GObject parent_instance; @@ -146,6 +151,9 @@ struct _GdkSurfaceClass cairo_region_t *region); void (* request_layout) (GdkSurface *surface); gboolean (* compute_size) (GdkSurface *surface); + + GdkSubsurface * + (* create_subsurface) (GdkSurface *surface); }; #define GDK_SURFACE_DESTROYED(d) (((GdkSurface *)(d))->destroyed) @@ -334,7 +342,34 @@ void gdk_surface_request_motion (GdkSurface *surface); gboolean gdk_surface_supports_edge_constraints (GdkSurface *surface); +GdkSubsurface * gdk_surface_create_subsurface (GdkSurface *surface); +typedef struct _GdkSubsurfaceClass GdkSubsurfaceClass; +struct _GdkSubsurfaceClass +{ + void (* destroy) (GdkSubsurface *subsurface); + void (* attach) (GdkSubsurface *subsurface, + GdkTexture *texture, + const graphene_rect_t *bounds); + void (* place_above) (GdkSubsurface *subsurface, + GdkSubsurface *sibling); + void (* place_below) (GdkSubsurface *subsurface, + GdkSubsurface *sibling); +}; + +struct _GdkSubsurface +{ + const GdkSubsurfaceClass *class; +}; + +void gdk_subsurface_destroy (GdkSubsurface *subsurface); +void gdk_subsurface_attach (GdkSubsurface *subsurface, + GdkTexture *texture, + const graphene_rect_t *bounds); +void gdk_subsurface_place_above (GdkSubsurface *subsurface, + GdkSubsurface *sibling); +void gdk_subsurface_place_below (GdkSubsurface *subsurface, + GdkSubsurface *sibling); G_END_DECLS