From 0043cd3bfad9ecc6189d870e5805853ecaf9633e Mon Sep 17 00:00:00 2001 From: Christian Glombek Date: Tue, 5 Nov 2024 01:08:01 +0100 Subject: [PATCH 1/7] window: Move some code up --- src/nd-window.c | 114 ++++++++++++++++++++++++------------------------ 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/src/nd-window.c b/src/nd-window.c index 046c55c..43ef9e3 100644 --- a/src/nd-window.c +++ b/src/nd-window.c @@ -300,6 +300,63 @@ transform_str_is_set_to_bool (GBinding *binding, return TRUE; } +static void +nd_screencast_started_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GError) error = NULL; + XdpSession *session = (XdpSession *) source_object; + NdWindow *window = ND_WINDOW (user_data); + + window->session = session; + if (!xdp_session_start_finish (window->session, result, &error)) + { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + { + g_warning ("Error initializing screencast portal: %s", error->message); + + /* Unknown method means the portal does not exist, give a slightly + * more specific warning then. + */ + if (g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD)) + g_warning ("Screencasting portal is unavailable! It is required to select the monitor to stream!"); + + g_warning ("Falling back to X11! You need to fix your setup to avoid issues (XDG Portals and/or mutter screencasting support)!"); + window->use_x11 = TRUE; + } + + g_warning ("Failed to start screencast session: %s", error->message); + g_clear_object (&window->session); + return; + } + g_debug ("Created screencast session"); +} + +static void +nd_screencast_init_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(GError) error = NULL; + XdpPortal *portal = XDP_PORTAL (source_object); + NdWindow *window = ND_WINDOW (user_data); + XdpParent *parent = NULL; + + window->portal = portal; + window->session = xdp_portal_create_screencast_session_finish (window->portal, result, &error); + if (window->session == NULL) + { + g_warning ("Failed to create screencast session: %s", error->message); + window->use_x11 = TRUE; + return; + } + + parent = xdp_parent_new_gtk (GTK_WINDOW (window)); + xdp_session_start (window->session, parent, NULL, nd_screencast_started_cb, window); + xdp_parent_free (parent); +} + static void find_sink_list_row_activated_cb (NdWindow *self, NdSinkRow *row, GtkListBox *sink_list) { @@ -478,63 +535,6 @@ gnome_nd_window_class_init (NdWindowClass *klass) gtk_widget_class_bind_template_child (widget_class, NdWindow, error_return); } -static void -nd_screencast_started_cb (GObject *source_object, - GAsyncResult *result, - gpointer user_data) -{ - g_autoptr(GError) error = NULL; - XdpSession *session = (XdpSession *) source_object; - NdWindow *window = ND_WINDOW (user_data); - - window->session = session; - if (!xdp_session_start_finish (window->session, result, &error)) - { - if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - { - g_warning ("Error initializing screencast portal: %s", error->message); - - /* Unknown method means the portal does not exist, give a slightly - * more specific warning then. - */ - if (g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD)) - g_warning ("Screencasting portal is unavailable! It is required to select the monitor to stream!"); - - g_warning ("Falling back to X11! You need to fix your setup to avoid issues (XDG Portals and/or mutter screencasting support)!"); - window->use_x11 = TRUE; - } - - g_warning ("Failed to start screencast session: %s", error->message); - g_clear_object (&window->session); - return; - } - g_debug ("Created screencast session"); -} - -static void -nd_screencast_init_cb (GObject *source_object, - GAsyncResult *result, - gpointer user_data) -{ - g_autoptr(GError) error = NULL; - XdpPortal *portal = XDP_PORTAL (source_object); - NdWindow *window = ND_WINDOW (user_data); - XdpParent *parent = NULL; - - window->portal = portal; - window->session = xdp_portal_create_screencast_session_finish (window->portal, result, &error); - if (window->session == NULL) - { - g_warning ("Failed to create screencast session: %s", error->message); - window->use_x11 = TRUE; - return; - } - - parent = xdp_parent_new_gtk (GTK_WINDOW (window)); - xdp_session_start (window->session, parent, NULL, nd_screencast_started_cb, window); - xdp_parent_free (parent); -} - static void nd_pulseaudio_init_async_cb (GObject *source_object, GAsyncResult *res, -- GitLab From dfddf225aceb22530eab6c03a28bd47909d0287c Mon Sep 17 00:00:00 2001 From: Christian Glombek Date: Tue, 5 Nov 2024 01:48:06 +0100 Subject: [PATCH 2/7] window: Re-create portal session when needed Listen to the portal session's closed signal to stop the stream. This signal is e.g. emitted when the "stop screencast" button on GNOME shell's top bar is clicked. Re-create the portal session if none exists when clicking on a sink row. For now, one has to click on the sink row a second time in order to start the actual stream. --- src/nd-window.c | 58 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/src/nd-window.c b/src/nd-window.c index 43ef9e3..50bf3c0 100644 --- a/src/nd-window.c +++ b/src/nd-window.c @@ -96,6 +96,9 @@ nd_window_screencast_get_source (NdWindow * self) guint32 node_id; guint32 screencast_type; + if (!self->session) + g_error ("XDP session not found!"); + streams = xdp_session_get_streams (self->session); if (streams == NULL) g_error ("XDP session streams not found!"); @@ -333,6 +336,16 @@ nd_screencast_started_cb (GObject *source_object, g_debug ("Created screencast session"); } +static void +session_closed_cb (NdWindow *self) +{ + g_debug ("Session closed"); + if (self->stream_sink) + nd_sink_stop_stream (self->stream_sink); + + g_clear_object (&self->session); +} + static void nd_screencast_init_cb (GObject *source_object, GAsyncResult *result, @@ -348,10 +361,15 @@ nd_screencast_init_cb (GObject *source_object, if (window->session == NULL) { g_warning ("Failed to create screencast session: %s", error->message); - window->use_x11 = TRUE; return; } + g_signal_connect_object (window->session, + "closed", + (GCallback) session_closed_cb, + window, + G_CONNECT_SWAPPED); + parent = xdp_parent_new_gtk (GTK_WINDOW (window)); xdp_session_start (window->session, parent, NULL, nd_screencast_started_cb, window); xdp_parent_free (parent); @@ -362,12 +380,27 @@ find_sink_list_row_activated_cb (NdWindow *self, NdSinkRow *row, GtkListBox *sin { NdSink *sink; - if (!self->portal && !self->use_x11) + if (!self->use_x11 && !self->portal) { g_warning ("Cannot start streaming right now as we don't have a portal!"); return; } + if (!self->use_x11 && self->portal && !self->session) + { + xdp_portal_create_screencast_session (self->portal, + XDP_OUTPUT_MONITOR | XDP_OUTPUT_WINDOW | XDP_OUTPUT_VIRTUAL, + XDP_SCREENCAST_FLAG_NONE, + XDP_CURSOR_MODE_EMBEDDED, + XDP_PERSIST_MODE_NONE, + NULL, + self->cancellable, + nd_screencast_init_cb, + self); + g_debug ("NdWindow: Re-creating portal session!"); + return; + } + g_assert (ND_IS_SINK_ROW (row)); sink = nd_sink_row_get_sink (row); @@ -658,15 +691,18 @@ gnome_nd_window_init (NdWindow *self) } if (self->portal) - xdp_portal_create_screencast_session (self->portal, - XDP_OUTPUT_MONITOR | XDP_OUTPUT_WINDOW | XDP_OUTPUT_VIRTUAL, - XDP_SCREENCAST_FLAG_NONE, - XDP_CURSOR_MODE_EMBEDDED, - XDP_PERSIST_MODE_NONE, - NULL, - self->cancellable, - nd_screencast_init_cb, - self); + { + xdp_portal_create_screencast_session (self->portal, + XDP_OUTPUT_MONITOR | XDP_OUTPUT_WINDOW | XDP_OUTPUT_VIRTUAL, + XDP_SCREENCAST_FLAG_NONE, + XDP_CURSOR_MODE_EMBEDDED, + XDP_PERSIST_MODE_NONE, + NULL, + self->cancellable, + nd_screencast_init_cb, + self); + g_debug ("NdWindow: Creating portal session!"); + } pulse = nd_pulseaudio_new (); g_async_initable_init_async (G_ASYNC_INITABLE (pulse), -- GitLab From 5dacea464f4005c44fac879573141bb444c89e49 Mon Sep 17 00:00:00 2001 From: Christian Glombek Date: Wed, 30 Oct 2024 13:48:23 +0100 Subject: [PATCH 3/7] wfd: Shorten session id to 10 chars Ids longer than that my cause problems on some devices. Fixes https://gitlab.gnome.org/GNOME/gnome-network-displays/-/issues/420 --- src/wfd/wfd-session-pool.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wfd/wfd-session-pool.c b/src/wfd/wfd-session-pool.c index bd3c251..84d32ee 100644 --- a/src/wfd/wfd-session-pool.c +++ b/src/wfd/wfd-session-pool.c @@ -42,17 +42,17 @@ static const gchar session_id_charset[] = static gchar * create_session_id (GstRTSPSessionPool * pool) { - gchar id[15]; + gchar id[10]; gint i; - for (i = 0; i < 15; i++) + for (i = 0; i < 10; i++) { id[i] = session_id_charset[g_random_int_range (0, G_N_ELEMENTS (session_id_charset))]; } - return g_strndup (id, 15); + return g_strndup (id, 10); } static void -- GitLab From 95dcf6f3d9723e8a63eb1e8de13e4585448fe8e0 Mon Sep 17 00:00:00 2001 From: Christian Glombek Date: Wed, 6 Nov 2024 22:37:17 +0100 Subject: [PATCH 4/7] cc: VAH264 fixups --- src/cc/cc-media-factory.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/cc/cc-media-factory.c b/src/cc/cc-media-factory.c index c2235c8..21876e6 100644 --- a/src/cc/cc-media-factory.c +++ b/src/cc/cc-media-factory.c @@ -116,9 +116,7 @@ cc_media_factory_create_video_element (CcMediaFactory *self) case ELEMENT_VAH264: encoder = gst_element_factory_make ("vah264enc", "cc-video-encoder"); g_object_set (encoder, - "prediction-type", 1, "rate-control", 2, - "compliance-mode", 0, NULL); parser = gst_element_factory_make ("h264parse", "cc-h264parse"); -- GitLab From 346e2904069da678366c313b0f419573c9e0399a Mon Sep 17 00:00:00 2001 From: Christian Glombek Date: Tue, 12 Nov 2024 22:52:57 +0100 Subject: [PATCH 5/7] Update potfile --- po/gnome-network-displays.pot | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/po/gnome-network-displays.pot b/po/gnome-network-displays.pot index 2ecb074..64bfe55 100644 --- a/po/gnome-network-displays.pot +++ b/po/gnome-network-displays.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gnome-network-displays\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-13 16:10+0200\n" +"POT-Creation-Date: 2024-11-12 22:40+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -26,6 +26,10 @@ msgstr "" msgid "Screencasting for GNOME" msgstr "" +#: data/org.gnome.NetworkDisplays.appdata.xml.in:14 +msgid "Benjamin Berg, Christian Glombek" +msgstr "" + #: data/org.gnome.NetworkDisplays.appdata.xml.in:24 msgid "" "GNOME Network Displays allows you to cast your desktop to a remote display. " @@ -111,19 +115,19 @@ msgstr "" msgid "Please install one of the following GStreamer plugins by clicking below" msgstr "" -#: src/nd-window.c:230 +#: src/nd-window.c:233 msgid "Checking and installing required firewall zones." msgstr "" -#: src/nd-window.c:237 +#: src/nd-window.c:240 msgid "Making P2P connection" msgstr "" -#: src/nd-window.c:244 +#: src/nd-window.c:247 msgid "Establishing connection to sink" msgstr "" -#: src/nd-window.c:251 +#: src/nd-window.c:254 msgid "Starting to stream" msgstr "" -- GitLab From f8d408f287b16412ae083a2e03c6e655c2aa1ed8 Mon Sep 17 00:00:00 2001 From: Christian Glombek Date: Tue, 12 Nov 2024 23:05:53 +0100 Subject: [PATCH 6/7] flatpak: Update dependencies --- .../flatpak/files/NetworkManager/NetworkManager.json | 4 ++-- build-aux/flatpak/files/firewalld/firewalld.json | 4 ++-- .../files/gst-plugins-ugly/gst-plugins-ugly.json | 6 +++--- .../files/gst-rtsp-server/gst-rtsp-server.json | 6 +++--- build-aux/flatpak/files/libportal/libportal.json | 4 ++-- build-aux/flatpak/org.gnome.NetworkDisplays.json | 11 ----------- 6 files changed, 12 insertions(+), 23 deletions(-) diff --git a/build-aux/flatpak/files/NetworkManager/NetworkManager.json b/build-aux/flatpak/files/NetworkManager/NetworkManager.json index 1ddf41d..c558408 100644 --- a/build-aux/flatpak/files/NetworkManager/NetworkManager.json +++ b/build-aux/flatpak/files/NetworkManager/NetworkManager.json @@ -67,8 +67,8 @@ { "type": "git", "url": "https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git", - "tag": "1.48.8", - "commit": "575134dd6732f1e1fe685bbc9af92c5553797c0c", + "tag": "1.50.0", + "commit": "acc9926e1da6aa58152e519abad4d80b9f371b3b", "x-checker-data": { "type": "git", "tag-pattern": "^([\\d.]+)$" diff --git a/build-aux/flatpak/files/firewalld/firewalld.json b/build-aux/flatpak/files/firewalld/firewalld.json index 7852937..f544abb 100644 --- a/build-aux/flatpak/files/firewalld/firewalld.json +++ b/build-aux/flatpak/files/firewalld/firewalld.json @@ -26,8 +26,8 @@ "sources": [ { "type": "archive", - "url": "https://github.com/firewalld/firewalld/releases/download/v2.2.1/firewalld-2.2.1.tar.bz2", - "sha256": "5215ba30236ee1e3df2c2292465a9ff605b9c445dcab2e37da4961cb27c7f36e", + "url": "https://github.com/firewalld/firewalld/releases/download/v2.3.0/firewalld-2.3.0.tar.bz2", + "sha256": "f6ba846c92fc08aebda8dfd2856e6c6224d170a5288a2ae1c181d6a43036c009", "x-checker-data": { "type": "json", "url": "https://api.github.com/repos/firewalld/firewalld/releases/latest", diff --git a/build-aux/flatpak/files/gst-plugins-ugly/gst-plugins-ugly.json b/build-aux/flatpak/files/gst-plugins-ugly/gst-plugins-ugly.json index 50987d8..fc4895c 100644 --- a/build-aux/flatpak/files/gst-plugins-ugly/gst-plugins-ugly.json +++ b/build-aux/flatpak/files/gst-plugins-ugly/gst-plugins-ugly.json @@ -13,11 +13,11 @@ "sources": [ { "type": "archive", - "url": "https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.22.12.tar.xz", - "sha256": "d59a1aaf8dd2cc416dc5b5c0b7aecd02b1811bf1229aa724e6c2a503d3799083", + "url": "https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.24.9.tar.xz", + "sha256": "4b6b30110f38cd05eb67422297142b75a55fe00003105f48b13603e6761cc3b6", "x-checker-data": { "type": "json", - "url": "https://gitlab.freedesktop.org/api/v4/projects/1357/repository/tags?search=^1.22.", + "url": "https://gitlab.freedesktop.org/api/v4/projects/1357/repository/tags?search=^1.24.", "version-query": ".[0].name", "url-query": "\"https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-\" + $version + \".tar.xz\"" } diff --git a/build-aux/flatpak/files/gst-rtsp-server/gst-rtsp-server.json b/build-aux/flatpak/files/gst-rtsp-server/gst-rtsp-server.json index 620e7ad..df28af8 100644 --- a/build-aux/flatpak/files/gst-rtsp-server/gst-rtsp-server.json +++ b/build-aux/flatpak/files/gst-rtsp-server/gst-rtsp-server.json @@ -15,11 +15,11 @@ "sources": [ { "type": "archive", - "url": "https://gstreamer.freedesktop.org/src/gst-rtsp-server/gst-rtsp-server-1.22.12.tar.xz", - "sha256": "bf6c7871e7cf3528e4ec87ddc2f2949691cd269f98e536482ae744c1405cf451", + "url": "https://gstreamer.freedesktop.org/src/gst-rtsp-server/gst-rtsp-server-1.24.9.tar.xz", + "sha256": "299c9aafac3c91bbebe4cd481ed4e4ade8cb2b0677097bc4a8dcf6d4364c9804", "x-checker-data": { "type": "json", - "url": "https://gitlab.freedesktop.org/api/v4/projects/1357/repository/tags?search=^1.22.", + "url": "https://gitlab.freedesktop.org/api/v4/projects/1357/repository/tags?search=^1.24.", "version-query": ".[0].name", "url-query": "\"https://gstreamer.freedesktop.org/src/gst-rtsp-server/gst-rtsp-server-\" + $version + \".tar.xz\"" } diff --git a/build-aux/flatpak/files/libportal/libportal.json b/build-aux/flatpak/files/libportal/libportal.json index 49ad788..f8541d3 100644 --- a/build-aux/flatpak/files/libportal/libportal.json +++ b/build-aux/flatpak/files/libportal/libportal.json @@ -18,8 +18,8 @@ "sources": [ { "type": "archive", - "url": "https://github.com/flatpak/libportal/releases/download/0.7.1/libportal-0.7.1.tar.xz", - "sha256": "297b90b263fad22190a26b8c7e8ea938fe6b18fb936265e588927179920d3805", + "url": "https://github.com/flatpak/libportal/releases/download/0.8.1/libportal-0.8.1.tar.xz", + "sha256": "281e54e4f8561125a65d20658f1462ab932b2b1258c376fed2137718441825ac", "x-checker-data": { "type": "json", "url": "https://api.github.com/repos/flatpak/libportal/releases/latest", diff --git a/build-aux/flatpak/org.gnome.NetworkDisplays.json b/build-aux/flatpak/org.gnome.NetworkDisplays.json index 89e758a..00ab636 100644 --- a/build-aux/flatpak/org.gnome.NetworkDisplays.json +++ b/build-aux/flatpak/org.gnome.NetworkDisplays.json @@ -15,17 +15,6 @@ "--system-talk-name=org.freedesktop.NetworkManager", "--system-talk-name=org.fedoraproject.FirewallD1" ], - "add-extensions": { - "org.freedesktop.Platform.GStreamer.gstreamer-vaapi": { - "directory": "lib/gstreamer-1.0", - "version": 23.08, - "autodelete": false, - "no-autodownload": true, - "add-ld-path": "lib", - "download-if": "have-intel-gpu", - "autoprune-unless": "have-intel-gpu" - } - }, "modules": [ "files/intltool/intltool.json", "files/avahi/avahi.json", -- GitLab From 569907dee8339daffddf393e9014942a977b0231 Mon Sep 17 00:00:00 2001 From: Christian Glombek Date: Wed, 13 Nov 2024 00:08:15 +0100 Subject: [PATCH 7/7] window: Log GND version on start --- src/nd-window.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/nd-window.c b/src/nd-window.c index 50bf3c0..14c9c6b 100644 --- a/src/nd-window.c +++ b/src/nd-window.c @@ -617,6 +617,8 @@ gnome_nd_window_init (NdWindow *self) g_autoptr(GError) error = NULL; NdPulseaudio *pulse; + g_debug ("GNOME Network Displays v%s started", PACKAGE_VERSION); + gtk_widget_init_template (GTK_WIDGET (self)); self->meta_provider = nd_meta_provider_new (); -- GitLab