From 969b9c65520d388ea9e5c4a9eb42cf928a7debd5 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Thu, 30 Oct 2014 19:18:05 +0100 Subject: [PATCH] GtkGLArea: Add profile property This lets you force a core 3.2 context if you want --- gtk/gtkglarea.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++- gtk/gtkglarea.h | 5 ++++ 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/gtk/gtkglarea.c b/gtk/gtkglarea.c index f23f9bdd92..49b2273b76 100644 --- a/gtk/gtkglarea.c +++ b/gtk/gtkglarea.c @@ -118,6 +118,7 @@ */ typedef struct { + GdkGLProfile profile; GdkGLContext *context; GdkWindow *event_window; GError *error; @@ -141,11 +142,13 @@ enum { PROP_0, PROP_CONTEXT, + PROP_PROFILE, PROP_HAS_ALPHA, PROP_HAS_DEPTH_BUFFER, PROP_HAS_STENCIL_BUFFER, PROP_AUTO_RENDER, + LAST_PROP }; @@ -202,6 +205,11 @@ gtk_gl_area_set_property (GObject *gobject, g_value_get_boolean (value)); break; + case PROP_PROFILE: + gtk_gl_area_set_profile (GTK_GL_AREA(gobject), + g_value_get_enum (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); } @@ -237,6 +245,10 @@ gtk_gl_area_get_property (GObject *gobject, g_value_set_object (value, priv->context); break; + case PROP_PROFILE: + g_value_set_enum (value, priv->profile); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); } @@ -267,7 +279,7 @@ gtk_gl_area_realize (GtkWidget *widget) gtk_widget_register_window (widget, priv->event_window); priv->context = gdk_window_create_gl_context (gtk_widget_get_window (widget), - GDK_GL_PROFILE_DEFAULT, + priv->profile, &priv->error); } @@ -654,6 +666,23 @@ gtk_gl_area_class_init (GtkGLAreaClass *klass) G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + /** + * GdkGLArea:profile: + * + * The #GdkGLProfile to use to create the GL context for the area + * + * Since: 3.16 + */ + obj_props[PROP_PROFILE] = + g_param_spec_enum ("profile", + P_("Profile"), + P_("The GL profile to use for the GL context"), + GDK_TYPE_GL_PROFILE, + GDK_GL_PROFILE_DEFAULT, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS); + /** * GtkGLArea:auto-render: * @@ -764,6 +793,7 @@ gtk_gl_area_init (GtkGLArea *area) gtk_widget_set_has_window (GTK_WIDGET (area), FALSE); gtk_widget_set_app_paintable (GTK_WIDGET (area), TRUE); + priv->profile = GDK_GL_PROFILE_DEFAULT; priv->auto_render = TRUE; priv->needs_render = TRUE; } @@ -783,6 +813,52 @@ gtk_gl_area_new (void) return g_object_new (GTK_TYPE_GL_AREA, NULL); } +/** + * gtk_gl_area_get_profile: + * @area: a #GtkGLArea + * + * Returns the profile that will be used to create the GL context for the area. + * + * Returns: a #GdkGLProfile + * + * Since: 3.16 + */ +GdkGLProfile +gtk_gl_area_get_profile (GtkGLArea *area) +{ + GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area); + + g_return_val_if_fail (GTK_IS_GL_AREA (area), FALSE); + + return priv->profile; +} + +/** + * gtk_gl_area_set_profile: + * @area: a #GtkGLArea + * @profile: a #GdkGLProfile + * + * Sets the profile type to be used when creating the context for the widget. + * This must be called before the are has been realized. + * + * Since: 3.16 + */ +void +gtk_gl_area_set_profile (GtkGLArea *area, + GdkGLProfile profile) +{ + GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area); + + g_return_if_fail (GTK_IS_GL_AREA (area)); + + if (priv->profile != profile) + { + priv->profile = profile; + + g_object_notify (G_OBJECT (area), "profile"); + } +} + /** * gtk_gl_area_get_has_alpha: * @area: a #GtkGLArea diff --git a/gtk/gtkglarea.h b/gtk/gtkglarea.h index 511cede12e..87fb453c72 100644 --- a/gtk/gtkglarea.h +++ b/gtk/gtkglarea.h @@ -79,6 +79,11 @@ GType gtk_gl_area_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_3_16 GtkWidget * gtk_gl_area_new (void); +GDK_AVAILABLE_IN_3_16 +GdkGLProfile gtk_gl_area_get_profile (GtkGLArea *area); +GDK_AVAILABLE_IN_3_16 +void gtk_gl_area_set_profile (GtkGLArea *area, + GdkGLProfile profile); GDK_AVAILABLE_IN_3_16 gboolean gtk_gl_area_get_has_alpha (GtkGLArea *area);