3 Commits

Author SHA1 Message Date
Rafał Dzięgiel
eb2e760de2 clapper-gtk: video: Fix checks when inhibiting session 2025-04-26 23:12:40 +02:00
Rafał Dzięgiel
d3a169fccd clapper-gtk: video: Fix sink property type checks
Sometimes property might return a subclass type when object is subclassed.
This especially happens with custom GdkPaintable implementations.
For this reason instead of comparing object type, check if it inherits what we want.
2025-01-22 20:27:02 +01:00
Rafał Dzięgiel
0cee4e90a5 clapper: server: Fix missing include of <sys/socket.h>
We need it for "AF_INET" symbols. Otherwise build fails on some systems.
2025-01-21 22:53:47 +01:00
2 changed files with 13 additions and 8 deletions

View File

@@ -909,7 +909,7 @@ _set_inhibit_session (ClapperGtkVideo *self, gboolean inhibit)
root = gtk_widget_get_root (GTK_WIDGET (self)); root = gtk_widget_get_root (GTK_WIDGET (self));
if (!root && !GTK_IS_WINDOW (root)) { if (!root || !GTK_IS_WINDOW (root)) {
GST_WARNING_OBJECT (self, "Cannot %sinhibit session " GST_WARNING_OBJECT (self, "Cannot %sinhibit session "
"without root window", (inhibit) ? "" : "un"); "without root window", (inhibit) ? "" : "un");
return; return;
@@ -919,7 +919,7 @@ _set_inhibit_session (ClapperGtkVideo *self, gboolean inhibit)
* as it goes away early when unrooting */ * as it goes away early when unrooting */
app = g_application_get_default (); app = g_application_get_default ();
if (!app && !GTK_IS_APPLICATION (app)) { if (!app || !GTK_IS_APPLICATION (app)) {
GST_WARNING_OBJECT (self, "Cannot %sinhibit session " GST_WARNING_OBJECT (self, "Cannot %sinhibit session "
"without window application set", (inhibit) ? "" : "un"); "without window application set", (inhibit) ? "" : "un");
return; return;
@@ -977,21 +977,25 @@ _get_widget_from_video_sink (GstElement *vsink)
GParamSpec *pspec; GParamSpec *pspec;
if ((pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (vsink), "widget")) if ((pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (vsink), "widget"))
&& pspec->value_type == GTK_TYPE_WIDGET) { && g_type_is_a (pspec->value_type, GTK_TYPE_WIDGET)) {
GST_DEBUG ("Video sink provides a widget"); GST_DEBUG ("Video sink provides a widget");
g_object_get (vsink, "widget", &widget, NULL); g_object_get (vsink, "widget", &widget, NULL);
} else if ((pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (vsink), "paintable")) } else if ((pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (vsink), "paintable"))
&& pspec->value_type == GDK_TYPE_PAINTABLE) { && g_type_is_a (pspec->value_type, G_TYPE_OBJECT)) {
GdkPaintable *paintable = NULL; GObject *paintable = NULL;
GST_DEBUG ("Video sink provides a paintable"); GST_DEBUG ("Video sink provides a paintable");
g_object_get (vsink, "paintable", &paintable, NULL); g_object_get (vsink, "paintable", &paintable, NULL);
if (G_LIKELY (paintable != NULL)) {
if (GDK_IS_PAINTABLE (paintable)) {
widget = g_object_ref_sink (gtk_picture_new ()); widget = g_object_ref_sink (gtk_picture_new ());
gtk_picture_set_paintable (GTK_PICTURE (widget), paintable); gtk_picture_set_paintable (GTK_PICTURE (widget), GDK_PAINTABLE (paintable));
}
g_object_unref (paintable); g_object_unref (paintable);
} }
}
return widget; return widget;
} }

View File

@@ -18,6 +18,7 @@
*/ */
#include <gst/gst.h> #include <gst/gst.h>
#include <sys/socket.h>
#include "clapper-server-mdns-private.h" #include "clapper-server-mdns-private.h"