[gtk/wip/otte/gleanup: 46/70] gdk: Allow GdkDrawContext with a %NULL surface
- From: Chun-wei Fan <fanchunwei src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/otte/gleanup: 46/70] gdk: Allow GdkDrawContext with a %NULL surface
- Date: Mon, 19 Jul 2021 02:52:50 +0000 (UTC)
commit 588e6c072219a1de2a0a38c2e9d64bf6bd44b836
Author: Benjamin Otte <otte redhat com>
Date: Sun Jul 4 02:43:49 2021 +0200
gdk: Allow GdkDrawContext with a %NULL surface
This is not used yet, but it allows surfaceless GL contexts.
For that purpose, we need to make the display a construct-only property,
so that it can be set when the surface isn't.
This adds a bunch of very picky checks in the constructor so nothing bad
can happen.
gdk/gdkdrawcontext.c | 32 ++++++++++++++++++++++++++++----
1 file changed, 28 insertions(+), 4 deletions(-)
---
diff --git a/gdk/gdkdrawcontext.c b/gdk/gdkdrawcontext.c
index d377c227a2..d1c5cd0960 100644
--- a/gdk/gdkdrawcontext.c
+++ b/gdk/gdkdrawcontext.c
@@ -43,6 +43,7 @@
typedef struct _GdkDrawContextPrivate GdkDrawContextPrivate;
struct _GdkDrawContextPrivate {
+ GdkDisplay *display;
GdkSurface *surface;
cairo_region_t *frame_region;
@@ -77,6 +78,7 @@ gdk_draw_context_dispose (GObject *gobject)
priv->surface->draw_contexts = g_slist_remove (priv->surface->draw_contexts, context);
g_clear_object (&priv->surface);
}
+ g_clear_object (&priv->display);
G_OBJECT_CLASS (gdk_draw_context_parent_class)->dispose (gobject);
}
@@ -92,10 +94,31 @@ gdk_draw_context_set_property (GObject *gobject,
switch (prop_id)
{
+ case PROP_DISPLAY:
+ if (priv->display != NULL)
+ {
+ g_assert (g_value_get_object (value) == NULL);
+ }
+ else
+ {
+ priv->display = g_value_dup_object (value);
+ }
+ break;
+
case PROP_SURFACE:
priv->surface = g_value_dup_object (value);
- g_assert (priv->surface != NULL);
- priv->surface->draw_contexts = g_slist_prepend (priv->surface->draw_contexts, context);
+ if (priv->surface)
+ {
+ priv->surface->draw_contexts = g_slist_prepend (priv->surface->draw_contexts, context);
+ if (priv->display)
+ {
+ g_assert (priv->display == gdk_surface_get_display (priv->surface));
+ }
+ else
+ {
+ priv->display = g_object_ref (gdk_surface_get_display (priv->surface));
+ }
+ }
break;
default:
@@ -148,7 +171,8 @@ gdk_draw_context_class_init (GdkDrawContextClass *klass)
P_("Display"),
P_("The GDK display used to create the context"),
GDK_TYPE_DISPLAY,
- G_PARAM_READABLE |
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
/**
@@ -228,7 +252,7 @@ gdk_draw_context_get_display (GdkDrawContext *context)
g_return_val_if_fail (GDK_IS_DRAW_CONTEXT (context), NULL);
- return priv->surface ? gdk_surface_get_display (priv->surface) : NULL;
+ return priv->display;
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]