pidgin/gtkprefs.c

changeset 40547
86e0c5080a58
parent 40542
8079731c8ef9
child 40552
eb0f386cea6b
--- a/pidgin/gtkprefs.c	Thu Oct 08 03:25:28 2020 -0500
+++ b/pidgin/gtkprefs.c	Thu Oct 08 23:31:08 2020 -0500
@@ -225,7 +225,8 @@
 		struct {
 			PidginPrefCombo input;
 			PidginPrefCombo output;
-			GtkWidget *drawing_area;
+			GtkWidget *frame;
+			GtkWidget *sink_widget;
 			GtkWidget *test;
 			GstElement *pipeline;
 		} video;
@@ -2525,57 +2526,20 @@
 }
 
 static void
-window_id_cb(GstBus *bus, GstMessage *msg, gulong window_id)
-{
-	if (GST_MESSAGE_TYPE(msg) != GST_MESSAGE_ELEMENT ||
-	    !gst_is_video_overlay_prepare_window_handle_message(msg)) {
-		return;
-	}
-
-	g_signal_handlers_disconnect_matched(bus,
-	                                     G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
-	                                     0, 0, NULL, window_id_cb,
-	                                     (gpointer)window_id);
-
-	gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(GST_MESSAGE_SRC(msg)),
-	                                    window_id);
-}
-
-static void
 enable_video_test(PidginPrefsWindow *win)
 {
-	GstBus *bus;
-	GdkWindow *window = gtk_widget_get_window(win->vv.video.drawing_area);
-	gulong window_id = 0;
-
-#ifdef GDK_WINDOWING_WIN32
-	if (GDK_IS_WIN32_WINDOW(window))
-		window_id = GPOINTER_TO_UINT(GDK_WINDOW_HWND(window));
-	else
-#endif
-#ifdef GDK_WINDOWING_X11
-	if (GDK_IS_X11_WINDOW(window))
-		window_id = gdk_x11_window_get_xid(window);
-	else
-#endif
-#ifdef GDK_WINDOWING_QUARTZ
-	if (GDK_IS_QUARTZ_WINDOW(window))
-		window_id = (gulong)gdk_quartz_window_get_nsview(window);
-	else
-#endif
-		g_warning("Unsupported GDK backend");
-#if !(defined(GDK_WINDOWING_WIN32) \
-   || defined(GDK_WINDOWING_X11) \
-   || defined(GDK_WINDOWING_QUARTZ))
-#	error "Unsupported GDK windowing system"
-#endif
+	GtkWidget *video = NULL;
+	GstElement *sink = NULL;
 
 	win->vv.video.pipeline = create_video_pipeline();
-	bus = gst_pipeline_get_bus(GST_PIPELINE(win->vv.video.pipeline));
-	gst_bus_set_sync_handler(bus, gst_bus_sync_signal_handler, NULL, NULL);
-	g_signal_connect(bus, "sync-message::element",
-	                 G_CALLBACK(window_id_cb), (gpointer)window_id);
-	gst_object_unref(bus);
+
+	sink = g_object_get_data(G_OBJECT(win->vv.video.pipeline), "sink");
+	g_object_get(sink, "widget", &video, NULL);
+	gtk_widget_show(video);
+
+	g_clear_pointer(&win->vv.video.sink_widget, gtk_widget_destroy);
+	gtk_container_add(GTK_CONTAINER(win->vv.video.frame), video);
+	win->vv.video.sink_widget = video;
 
 	gst_element_set_state(GST_ELEMENT(win->vv.video.pipeline),
 	                      GST_STATE_PLAYING);
@@ -2601,27 +2565,10 @@
 static void
 bind_video_test(PidginPrefsWindow *win, GtkBuilder *builder)
 {
-	GtkWidget *video;
 	GObject *test;
-	GdkRGBA color = {0.0, 0.0, 0.0, 1.0};
-
-	win->vv.video.drawing_area = video = GTK_WIDGET(
-	        gtk_builder_get_object(builder, "vv.video.test_area"));
-	gtk_widget_override_background_color(video, GTK_STATE_FLAG_NORMAL,
-	                                     &color);
-
-	/* In order to enable client shadow decorations, GtkDialog from GTK+ 3.0
-	 * uses ARGB visual which by default gets inherited by its child
-	 * widgets. XVideo adaptors on the other hand often support just depth
-	 * 24 and rendering video through xvimagesink onto a widget inside a
-	 * GtkDialog then results in no visible output.
-	 *
-	 * This ensures the default system visual of the drawing area doesn't
-	 * get overridden by the widget's parent.
-	 */
-	gtk_widget_set_visual(video, gdk_screen_get_system_visual(
-	                                     gtk_widget_get_screen(video)));
-
+
+	win->vv.video.frame = GTK_WIDGET(
+	        gtk_builder_get_object(builder, "vv.video.frame"));
 	test = gtk_builder_get_object(builder, "vv.video.test");
 	g_signal_connect(test, "toggled",
 	                 G_CALLBACK(toggle_video_test_cb), win);
@@ -3142,6 +3089,8 @@
 void
 pidgin_prefs_update_old(void)
 {
+	const gchar *video_sink = NULL;
+
 	/* Rename some old prefs */
 	purple_prefs_rename(PIDGIN_PREFS_ROOT "/logging/log_ims", "/purple/logging/log_ims");
 	purple_prefs_rename(PIDGIN_PREFS_ROOT "/logging/log_chats", "/purple/logging/log_chats");
@@ -3270,6 +3219,18 @@
 				purple_prefs_get_string("/plugins/gtk/vvconfig/video/sink/device"));
 	}
 
+	video_sink = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/vvconfig/video/sink/device");
+	if (purple_strequal(video_sink, "glimagesink") || purple_strequal(video_sink, "directdrawsink")) {
+		/* Accelerated sinks move to GTK GL. */
+		video_sink = "gtkglsink";
+		/* FIXME: I haven't been able to get gtkglsink to work yet: */
+		video_sink = "gtksink";
+	} else {
+		/* Everything else, including default will be moved to GTK sink. */
+		video_sink = "gtksink";
+	}
+	purple_prefs_set_string(PIDGIN_PREFS_ROOT "/vvconfig/video/sink/device", video_sink);
+
 	purple_prefs_remove("/plugins/core/vvconfig");
 	purple_prefs_remove("/plugins/gtk/vvconfig");
 

mercurial