summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2023-04-04 03:14:21 +0000
committerMatthias Clasen <mclasen@redhat.com>2023-04-04 03:14:21 +0000
commit6a2f715250b5ff15f8bbf5f805a957010f3627dd (patch)
tree71944c8a4240e17d1b51d2c10afe5f1c0c7c8b92
parent7723045e9acf1b4785c43e44bae5883aee6b7e49 (diff)
parentb1f0ca7dc4c74fb34c5c9455cae197ef1464ac82 (diff)
downloadgtk+-6a2f715250b5ff15f8bbf5f805a957010f3627dd.tar.gz
Merge branch 'glarea-allowed-apis' into 'main'
glarea: Add GtkGLArea::allowed-apis Closes #5330 See merge request GNOME/gtk!5786
-rw-r--r--demos/gtk-demo/glarea.c5
-rw-r--r--demos/gtk-demo/gtkgears.c7
-rw-r--r--gtk/gtkglarea.c156
-rw-r--r--gtk/gtkglarea.h13
4 files changed, 159 insertions, 22 deletions
diff --git a/demos/gtk-demo/glarea.c b/demos/gtk-demo/glarea.c
index 430f44cde0..43942f5f7e 100644
--- a/demos/gtk-demo/glarea.c
+++ b/demos/gtk-demo/glarea.c
@@ -221,16 +221,13 @@ static void
realize (GtkWidget *widget)
{
const char *vertex_path, *fragment_path;
- GdkGLContext *context;
gtk_gl_area_make_current (GTK_GL_AREA (widget));
if (gtk_gl_area_get_error (GTK_GL_AREA (widget)) != NULL)
return;
- context = gtk_gl_area_get_context (GTK_GL_AREA (widget));
-
- if (gdk_gl_context_get_use_es (context))
+ if (gtk_gl_area_get_api (GTK_GL_AREA (widget)) == GDK_GL_API_GLES)
{
vertex_path = "/glarea/glarea-gles.vs.glsl";
fragment_path = "/glarea/glarea-gles.fs.glsl";
diff --git a/demos/gtk-demo/gtkgears.c b/demos/gtk-demo/gtkgears.c
index 10a80b18e8..0c0ea3398a 100644
--- a/demos/gtk-demo/gtkgears.c
+++ b/demos/gtk-demo/gtkgears.c
@@ -737,7 +737,6 @@ gtk_gears_realize (GtkWidget *widget)
GtkGLArea *glarea = GTK_GL_AREA (widget);
GtkGears *gears = GTK_GEARS (widget);
GtkGearsPrivate *priv = gtk_gears_get_instance_private (gears);
- GdkGLContext *context;
GLuint vao, v, f, program;
const char *p;
char msg[512];
@@ -748,8 +747,6 @@ gtk_gears_realize (GtkWidget *widget)
if (gtk_gl_area_get_error (glarea) != NULL)
return;
- context = gtk_gl_area_get_context (glarea);
-
glEnable (GL_CULL_FACE);
glEnable (GL_DEPTH_TEST);
@@ -759,7 +756,7 @@ gtk_gears_realize (GtkWidget *widget)
priv->vao = vao;
/* Compile the vertex shader */
- if (gdk_gl_context_get_use_es (context))
+ if (gtk_gl_area_get_api (glarea) == GDK_GL_API_GLES)
p = vertex_shader_gles;
else
p = vertex_shader_gl;
@@ -770,7 +767,7 @@ gtk_gears_realize (GtkWidget *widget)
g_debug ("vertex shader info: %s\n", msg);
/* Compile the fragment shader */
- if (gdk_gl_context_get_use_es (context))
+ if (gtk_gl_area_get_api (glarea) == GDK_GL_API_GLES)
p = fragment_shader_gles;
else
p = fragment_shader_gl;
diff --git a/gtk/gtkglarea.c b/gtk/gtkglarea.c
index 110accdcf3..cbd18aebf7 100644
--- a/gtk/gtkglarea.c
+++ b/gtk/gtkglarea.c
@@ -169,6 +169,7 @@ typedef struct {
gboolean needs_render;
gboolean auto_render;
gboolean use_es;
+ GdkGLAPI allowed_apis;
} GtkGLAreaPrivate;
enum {
@@ -178,6 +179,8 @@ enum {
PROP_HAS_DEPTH_BUFFER,
PROP_HAS_STENCIL_BUFFER,
PROP_USE_ES,
+ PROP_ALLOWED_APIS,
+ PROP_API,
PROP_AUTO_RENDER,
@@ -224,7 +227,13 @@ gtk_gl_area_set_property (GObject *gobject,
break;
case PROP_USE_ES:
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
gtk_gl_area_set_use_es (self, g_value_get_boolean (value));
+G_GNUC_END_IGNORE_DEPRECATIONS
+ break;
+
+ case PROP_ALLOWED_APIS:
+ gtk_gl_area_set_allowed_apis (self, g_value_get_flags (value));
break;
default:
@@ -259,7 +268,17 @@ gtk_gl_area_get_property (GObject *gobject,
break;
case PROP_USE_ES:
- g_value_set_boolean (value, priv->use_es);
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ g_value_set_boolean (value, gtk_gl_area_get_use_es (GTK_GL_AREA (gobject)));
+G_GNUC_END_IGNORE_DEPRECATIONS
+ break;
+
+ case PROP_ALLOWED_APIS:
+ g_value_set_flags (value, priv->allowed_apis);
+ break;
+
+ case PROP_API:
+ g_value_set_flags (value, gtk_gl_area_get_api (GTK_GL_AREA (gobject)));
break;
default:
@@ -321,7 +340,7 @@ gtk_gl_area_real_create_context (GtkGLArea *area)
return NULL;
}
- gdk_gl_context_set_allowed_apis (context, priv->use_es ? GDK_GL_API_GLES : GDK_GL_API_GL);
+ gdk_gl_context_set_allowed_apis (context, priv->allowed_apis);
gdk_gl_context_set_required_version (context,
priv->required_gl_version / 10,
priv->required_gl_version % 10);
@@ -502,7 +521,7 @@ gtk_gl_area_allocate_texture (GtkGLArea *area)
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- if (gdk_gl_context_get_use_es (priv->context))
+ if (gdk_gl_context_get_api (priv->context) == GDK_GL_API_GLES)
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
else
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
@@ -859,6 +878,8 @@ gtk_gl_area_class_init (GtkGLAreaClass *klass)
*
* If set to %TRUE the widget will try to create a `GdkGLContext` using
* OpenGL ES instead of OpenGL.
+ *
+ * Deprecated: 4.12: Use [property@Gtk.GLArea:allowed-apis]
*/
obj_props[PROP_USE_ES] =
g_param_spec_boolean ("use-es", NULL, NULL,
@@ -867,6 +888,36 @@ gtk_gl_area_class_init (GtkGLAreaClass *klass)
G_PARAM_STATIC_STRINGS |
G_PARAM_EXPLICIT_NOTIFY);
+ /**
+ * GdkGLArea:allowed-apis: (attributes org.gtk.Property.get=gtk_gl_area_get_allowed_apis org.gtk.Property.set=gtk_gl_area_set_allowed_apis)
+ *
+ * The allowed APIs.
+ *
+ * Since: 4.12
+ */
+ obj_props[PROP_ALLOWED_APIS] =
+ g_param_spec_flags ("allowed-apis", NULL, NULL,
+ GDK_TYPE_GL_API,
+ GDK_GL_API_GL | GDK_GL_API_GLES,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS |
+ G_PARAM_EXPLICIT_NOTIFY);
+
+ /**
+ * GdkGLArea:api: (attributes org.gtk.Property.get=gtk_gl_area_get_api)
+ *
+ * The API currently in use.
+ *
+ * Since: 4.12
+ */
+ obj_props[PROP_API] =
+ g_param_spec_flags ("api", NULL, NULL,
+ GDK_TYPE_GL_API,
+ 0,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS |
+ G_PARAM_EXPLICIT_NOTIFY);
+
gobject_class->set_property = gtk_gl_area_set_property;
gobject_class->get_property = gtk_gl_area_get_property;
gobject_class->notify = gtk_gl_area_notify;
@@ -968,6 +1019,7 @@ gtk_gl_area_init (GtkGLArea *area)
priv->auto_render = TRUE;
priv->needs_render = TRUE;
priv->required_gl_version = 0;
+ priv->allowed_apis = GDK_GL_API_GL | GDK_GL_API_GLES;
}
/**
@@ -1034,6 +1086,8 @@ gtk_gl_area_get_error (GtkGLArea *area)
*
* You should check the capabilities of the `GdkGLContext` before drawing
* with either API.
+ *
+ * Deprecated: 4.12: Use [method@Gtk.GLArea.set_allowed_apis]
*/
void
gtk_gl_area_set_use_es (GtkGLArea *area,
@@ -1044,14 +1098,10 @@ gtk_gl_area_set_use_es (GtkGLArea *area,
g_return_if_fail (GTK_IS_GL_AREA (area));
g_return_if_fail (!gtk_widget_get_realized (GTK_WIDGET (area)));
- use_es = !!use_es;
+ priv->allowed_apis = use_es ? GDK_GL_API_GLES : GDK_GL_API_GL;
- if (priv->use_es != use_es)
- {
- priv->use_es = use_es;
-
- g_object_notify_by_pspec (G_OBJECT (area), obj_props[PROP_USE_ES]);
- }
+ g_object_notify_by_pspec (G_OBJECT (area), obj_props[PROP_USE_ES]);
+ g_object_notify_by_pspec (G_OBJECT (area), obj_props[PROP_ALLOWED_APIS]);
}
/**
@@ -1064,6 +1114,8 @@ gtk_gl_area_set_use_es (GtkGLArea *area,
*
* Returns: %TRUE if the `GtkGLArea` should create an OpenGL ES context
* and %FALSE otherwise
+ *
+ * Deprecated: 4.12: Use [method@Gtk.GLArea.get_api]
*/
gboolean
gtk_gl_area_get_use_es (GtkGLArea *area)
@@ -1072,7 +1124,89 @@ gtk_gl_area_get_use_es (GtkGLArea *area)
g_return_val_if_fail (GTK_IS_GL_AREA (area), FALSE);
- return priv->use_es;
+ if (priv->context)
+ return gdk_gl_context_get_api (priv->context) == GDK_GL_API_GLES;
+ else
+ return priv->allowed_apis == GDK_GL_API_GLES;
+}
+
+/**
+ * gtk_gl_area_set_allowed_apis:
+ * @area: a `GtkGLArea`
+ * @apis: the allowed APIs
+ *
+ * Sets the allowed APIs to create a context with.
+ *
+ * You should check [property@Gtk.GLArea:api] before drawing
+ * with either API.
+ *
+ * By default, all APIs are allowed.
+ *
+ * Since: 4.12
+ */
+void
+gtk_gl_area_set_allowed_apis (GtkGLArea *area,
+ GdkGLAPI apis)
+{
+ GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area);
+
+ g_return_if_fail (GTK_IS_GL_AREA (area));
+ g_return_if_fail (!gtk_widget_get_realized (GTK_WIDGET (area)));
+
+ if (priv->allowed_apis == apis)
+ return;
+
+ priv->allowed_apis = apis;
+
+ g_object_notify_by_pspec (G_OBJECT (area), obj_props[PROP_USE_ES]);
+ g_object_notify_by_pspec (G_OBJECT (area), obj_props[PROP_ALLOWED_APIS]);
+}
+
+/**
+ * gtk_gl_area_get_allowed_apis:
+ * @area: a `GtkGLArea`
+ *
+ * Gets the allowed APIs.
+ *
+ * See [method@Gtk.GLArea.set_allowed_apis].
+ *
+ * Returns: the allowed APIs
+ *
+ * Since: 4.12
+ */
+GdkGLAPI
+gtk_gl_area_get_allowed_apis (GtkGLArea *area)
+{
+ GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area);
+
+ g_return_val_if_fail (GTK_IS_GL_AREA (area), 0);
+
+ return priv->allowed_apis;
+}
+
+/**
+ * gtk_gl_area_get_api:
+ * @area: a `GtkGLArea`
+ *
+ * Gets the API that is currently in use.
+ *
+ * If the GL area has not been realized yet, 0 is returned.
+ *
+ * Returns: the currently used API
+ *
+ * Since: 4.12
+ */
+GdkGLAPI
+gtk_gl_area_get_api (GtkGLArea *area)
+{
+ GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area);
+
+ g_return_val_if_fail (GTK_IS_GL_AREA (area), 0);
+
+ if (priv->context)
+ return gdk_gl_context_get_api (priv->context);
+ else
+ return 0;
}
/**
diff --git a/gtk/gtkglarea.h b/gtk/gtkglarea.h
index 3458746b81..4bf1adc8de 100644
--- a/gtk/gtkglarea.h
+++ b/gtk/gtkglarea.h
@@ -75,11 +75,20 @@ GType gtk_gl_area_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_ALL
GtkWidget * gtk_gl_area_new (void);
-GDK_AVAILABLE_IN_ALL
+GDK_AVAILABLE_IN_4_12
+void gtk_gl_area_set_allowed_apis (GtkGLArea *area,
+ GdkGLAPI apis);
+GDK_AVAILABLE_IN_4_12
+GdkGLAPI gtk_gl_area_get_allowed_apis (GtkGLArea *area);
+GDK_AVAILABLE_IN_4_12
+GdkGLAPI gtk_gl_area_get_api (GtkGLArea *area);
+
+GDK_DEPRECATED_IN_4_12_FOR(gtk_gl_area_set_allowed_apis)
void gtk_gl_area_set_use_es (GtkGLArea *area,
gboolean use_es);
-GDK_AVAILABLE_IN_ALL
+GDK_DEPRECATED_IN_4_12_FOR(gtk_gl_area_get_api)
gboolean gtk_gl_area_get_use_es (GtkGLArea *area);
+
GDK_AVAILABLE_IN_ALL
void gtk_gl_area_set_required_version (GtkGLArea *area,
int major,