Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package gnome-remote-desktop for openSUSE:Factory checked in at 2021-11-05 22:58:41 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gnome-remote-desktop (Old) and /work/SRC/openSUSE:Factory/.gnome-remote-desktop.new.1890 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gnome-remote-desktop" Fri Nov 5 22:58:41 2021 rev:6 rq:929586 version:41.1 Changes: -------- --- /work/SRC/openSUSE:Factory/gnome-remote-desktop/gnome-remote-desktop.changes 2021-09-29 20:20:00.199083209 +0200 +++ /work/SRC/openSUSE:Factory/.gnome-remote-desktop.new.1890/gnome-remote-desktop.changes 2021-11-05 22:58:59.784295619 +0100 @@ -1,0 +2,18 @@ +Sat Oct 30 14:40:59 UTC 2021 - bjorn....@gmail.com + +- Update to version 41.1: + + vnc-pipewire-stream: Take frame data from pending frame, when + needed + + rdp-pipewire-stream: Take frame data from pending frame, when + needed + + rdp/rdpgfx: Unref surface serial after looking up surface + context + + rdp-graphics-pipeline: Fix small style issue + + rdp-fuse-clipboard: + - Fix potential race when accessing FuseFile path + - Fix small style issue + + clipboard-rdp: Always check return value of ConvertFromUnicode + + session-rdp: Only signal GCond, when all encode jobs are + complete + +------------------------------------------------------------------- Old: ---- gnome-remote-desktop-41.0.obscpio New: ---- _servicedata gnome-remote-desktop-41.1.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gnome-remote-desktop.spec ++++++ --- /var/tmp/diff_new_pack.if4jY2/_old 2021-11-05 22:59:00.400295998 +0100 +++ /var/tmp/diff_new_pack.if4jY2/_new 2021-11-05 22:59:00.404296000 +0100 @@ -21,7 +21,7 @@ %define freerdp_version 2.2.0 Name: gnome-remote-desktop -Version: 41.0 +Version: 41.1 Release: 0 Summary: GNOME Remote Desktop screen sharing service License: GPL-2.0-or-later ++++++ _service ++++++ --- /var/tmp/diff_new_pack.if4jY2/_old 2021-11-05 22:59:00.428296015 +0100 +++ /var/tmp/diff_new_pack.if4jY2/_new 2021-11-05 22:59:00.432296018 +0100 @@ -2,7 +2,7 @@ <service name="obs_scm" mode="disabled"> <param name="url">https://gitlab.gnome.org/GNOME/gnome-remote-desktop.git</param> <param name="scm">git</param> - <param name="revision">refs/tags/41.0</param> + <param name="revision">refs/tags/41.1</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">enable</param> </service> ++++++ _servicedata ++++++ <servicedata> <service name="tar_scm"> <param name="url">https://gitlab.gnome.org/GNOME/gnome-remote-desktop.git</param> <param name="changesrevision">f895c2b28b3341af54cb2ce24ce76af8f3e1513d</param></service></servicedata>++++++ gnome-remote-desktop-41.0.obscpio -> gnome-remote-desktop-41.1.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/meson.build new/gnome-remote-desktop-41.1/meson.build --- old/gnome-remote-desktop-41.0/meson.build 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/meson.build 2021-10-30 16:37:19.000000000 +0200 @@ -1,5 +1,5 @@ project('gnome-remote-desktop', 'c', - version: '41.0', + version: '41.1', meson_version: '>= 0.47.0', default_options: ['warning_level=1', 'buildtype=debugoptimized']) @@ -19,7 +19,7 @@ gio_dep = dependency('gio-2.0') gio_unix_dep = dependency('gio-unix-2.0') pipewire_dep = dependency('libpipewire-0.3', version: '>= 0.3.0') -systemd_dep = dependency('systemd') +systemd_dep = dependency('systemd', required: get_option('systemd')) libsecret_dep = dependency('libsecret-1') libnotify_dep = dependency('libnotify') @@ -80,12 +80,14 @@ configinc = include_directories('.') servicedir = get_option('systemd_user_unit_dir') -if servicedir == '' - servicedir = systemd_dep.get_pkgconfig_variable('systemduserunitdir') -endif +if systemd_dep.found() + if servicedir == '' + servicedir = systemd_dep.get_pkgconfig_variable('systemduserunitdir') + endif -if servicedir == '' - error('Couldn\'t determine systemd user unit service directory') + if servicedir == '' + error('Couldn\'t determine systemd user unit service directory') + endif endif top_srcdir = meson.current_source_dir() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/meson_options.txt new/gnome-remote-desktop-41.1/meson_options.txt --- old/gnome-remote-desktop-41.0/meson_options.txt 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/meson_options.txt 2021-10-30 16:37:19.000000000 +0200 @@ -13,6 +13,11 @@ value: true, description: 'Build with support for hardware acceleration using NVENC and CUDA') +option('systemd', + type: 'boolean', + value: true, + description: 'Enable systemd support') + option('systemd_user_unit_dir', type: 'string', value: '', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/po/LINGUAS new/gnome-remote-desktop-41.1/po/LINGUAS --- old/gnome-remote-desktop-41.0/po/LINGUAS 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/po/LINGUAS 2021-10-30 16:37:19.000000000 +0200 @@ -1,5 +1,6 @@ # please keep this list sorted alphabetically # +bg ca cs de @@ -28,6 +29,7 @@ ru sk sl +sr sv tr uk diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/po/bg.po new/gnome-remote-desktop-41.1/po/bg.po --- old/gnome-remote-desktop-41.0/po/bg.po 1970-01-01 01:00:00.000000000 +0100 +++ new/gnome-remote-desktop-41.1/po/bg.po 2021-10-30 16:37:19.000000000 +0200 @@ -0,0 +1,102 @@ +# Bulgarian translation of gnome-remote-desktop po-file. +# Copyright (C) 2021 Alexander Shopov. +# This file is distributed under the same license as the gnome-remote-desktop package. +# Alexander Shopov <a...@kambanaria.org>, 2012, 2015, 2016, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-remote-desktop master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-remote-desktop/" +"issues\n" +"POT-Creation-Date: 2021-10-03 17:07+0000\n" +"PO-Revision-Date: 2021-10-04 09:59+0200\n" +"Last-Translator: Alexander Shopov <a...@kambanaria.org>\n" +"Language-Team: Bulgarian <d...@fsa-bg.org>\n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/grd-daemon.c:365 +msgid "GNOME Remote Desktop" +msgstr "???????????????????? ?????????????? ?????????? ???? GNOME" + +#: src/grd-prompt.c:124 +#, c-format +msgid "Do you want to share your desktop?" +msgstr "???????????? ???? ???? ?????????????????? ?????????????????? ???????????" + +#: src/grd-prompt.c:125 +#, c-format +msgid "" +"A user on the computer '%s' is trying to remotely view or control your " +"desktop." +msgstr "" +"???????????????????? ???? ?????????????????? ???%s??? ???? ???????????? ???? ?????????????????? ???????????????????? ?????????????????? ???? " +"??????????." + +#: src/grd-prompt.c:131 +msgid "Refuse" +msgstr "??????????????????" + +#: src/grd-prompt.c:136 +msgid "Accept" +msgstr "????????????????" + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:7 +msgid "Path to the certificate file" +msgstr "?????? ?????? ?????????? ?????? ????????????????????" + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:8 +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:16 +msgid "" +"In order to be able to use RDP with TLS Security, both the private key file " +"and the certificate file need to be provided to the RDP server." +msgstr "" +"???? ???? ???????????????? RDP ?????? ???????????? TLS, ???????????? ???? ???????????????????????? ???? ?????????????? ???? RDP " +"?????????? ?????????????? ????????, ???????? ?? ??????????????????????." + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:15 +msgid "Path to the private key file" +msgstr "?????? ?????? ?????????? ?? ?????????????? ????????" + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:23 +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:33 +msgid "Only allow remote connections to view the screen content" +msgstr "" +"?????????????????????? ???????? ???? ???????????????????????? ???????????? ???? ???????????? ???????????????????????? ???? ????????????" + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:24 +msgid "" +"When view-only is true, remote RDP connections cannot manipulate input " +"devices (e.g. mouse and keyboard)." +msgstr "" +"???????????? ?? ????????????????, ???????????????????????? ???????????? ???? RDP ???? ???????????????????? ???????????????? " +"???????????????????? (???????? ?????????? ?? ????????????????????)." + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:34 +msgid "" +"When view-only is true, remote VNC connections cannot manipulate input " +"devices (e.g. mouse and keyboard)." +msgstr "" +"???????????? ?? ????????????????, ???????????????????????? ???????????? ???? VNC ???? ???????????????????? ???????????????? " +"???????????????????? (???????? ?????????? ?? ????????????????????)." + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:41 +msgid "Method used to authenticate VNC connections" +msgstr "?????????? ???? ?????????????????????????? ???? ???????????????? ???? VNC" + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:42 +msgid "" +"The VNC authentication method describes how a remote connection is " +"authenticated. It can currently be done in two different ways: * prompt - by " +"prompting the user for each new connection, requiring a person with physical " +"access to the workstation to explicitly approve the new connection. * " +"password - by requiring the remote client to provide a known password" +msgstr "" +"?????????????? ???? ?????????????????????????? ???? VNC ???????????? ?????? ???? ???? ???? ?????????????? ?????? ???????????????????????? " +"???? ????????????. ?? ?????????????? ?????? ?????? ????????????: ??? ???????????? ??? ???????????????????????? ???????? ?????????????? " +"?????????? ?????? ?????????? ???????? ????????????, ?????????? ?????????????????? ?????????? ?? ?????????????????? ???????????? ???? " +"???????????????? ???? ???????????? ????????????????; ??? ???????????? ??? ???????????????????????? ???????????????????? ???????????? ???? ???? " +"???????????????????????? ???????? ?????????????????????????? ?????????????????? ????????????" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/po/ca.po new/gnome-remote-desktop-41.1/po/ca.po --- old/gnome-remote-desktop-41.0/po/ca.po 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/po/ca.po 2021-10-30 16:37:19.000000000 +0200 @@ -62,7 +62,7 @@ #: src/org.gnome.desktop.remote-desktop.gschema.xml.in:33 msgid "Only allow remote connections to view the screen content" msgstr "" -"Permet nom??s a les connexions remotes per veure el contingut de la pantalla" +"Permet nom??s a les connexions remotes per a veure el contingut de la pantalla" #: src/org.gnome.desktop.remote-desktop.gschema.xml.in:24 msgid "" @@ -92,7 +92,7 @@ "access to the workstation to explicitly approve the new connection. * " "password - by requiring the remote client to provide a known password" msgstr "" -"El m??tode d'autenticaci?? VNC descriu com s'ha autentica una connexi?? remota. " +"El m??tode d'autenticaci?? VNC descriu com s'autentica una connexi?? remota. " "Actualment, es pot fer de dues maneres diferents: * ??prompt?? - demanant a " "l'usuari per a cada nova connexi??, requerint a una persona amb acc??s f??sic a " "l'estaci?? de treball que aprovi expl??citament la nova connexi??. * ??password?? " diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/po/he.po new/gnome-remote-desktop-41.1/po/he.po --- old/gnome-remote-desktop-41.0/po/he.po 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/po/he.po 2021-10-30 16:37:19.000000000 +0200 @@ -8,8 +8,9 @@ "Project-Id-Version: gnome-remote-desktop master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-remote-desktop/" "issues\n" -"POT-Creation-Date: 2021-06-18 11:30+0000\n" -"PO-Revision-Date: 2021-06-21 20:33+0300\n" +"POT-Creation-Date: 2021-06-24 07:32+0000\n" +"PO-Revision-Date: 2021-09-28 23:34+0300\n" +"Last-Translator: Yaron Shahrabani <sh.ya...@gmail.com>\n" "Language-Team: Hebrew <h...@li.org>\n" "Language: he\n" "MIME-Version: 1.0\n" @@ -17,7 +18,6 @@ "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==2 ? 1 : n>10 && n%10==0 ? " "2 : 3);\n" -"Last-Translator: Yaron Shahrabani <sh.ya...@gmail.com>\n" "X-Generator: Poedit 3.0\n" #: src/grd-daemon.c:351 @@ -51,7 +51,7 @@ #: src/org.gnome.desktop.remote-desktop.gschema.xml.in:8 #: src/org.gnome.desktop.remote-desktop.gschema.xml.in:16 msgid "" -"In Order to be able to use RDP with TLS Security, both the private key file " +"In order to be able to use RDP with TLS Security, both the private key file " "and the certificate file need to be provided to the RDP server." msgstr "" "?????? ?????????? ?????????? ????RDP ???? ?????????? TLS, ???? ???????? ???????? ????RDP ???? ???? ???????? ?????????? " diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/po/oc.po new/gnome-remote-desktop-41.1/po/oc.po --- old/gnome-remote-desktop-41.0/po/oc.po 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/po/oc.po 2021-10-30 16:37:19.000000000 +0200 @@ -8,14 +8,14 @@ "Project-Id-Version: gnome-remote-desktop master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-remote-desktop/" "issues\n" -"POT-Creation-Date: 2021-07-16 05:29+0000\n" -"PO-Revision-Date: 2021-07-22 19:48+0200\n" +"POT-Creation-Date: 2021-07-22 17:48+0000\n" +"PO-Revision-Date: 2021-10-03 19:06+0200\n" +"Last-Translator: Quentin PAG??S\n" "Language-Team: Occitan <tote...@gmail.com>\n" "Language: oc\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Last-Translator: Quentin PAG??S\n" "X-Generator: Poedit 3.0\n" #: src/grd-daemon.c:351 @@ -54,6 +54,8 @@ "In order to be able to use RDP with TLS Security, both the private key file " "and the certificate file need to be provided to the RDP server." msgstr "" +"Per poder utilizar RDP amb la seguretat TLS, tan lo fichi??r de la clau " +"privada que lo fichi??r de certificat devon ??sser fornits al servidor RDP." #: src/org.gnome.desktop.remote-desktop.gschema.xml.in:15 msgid "Path to the private key file" @@ -63,18 +65,23 @@ #: src/org.gnome.desktop.remote-desktop.gschema.xml.in:33 msgid "Only allow remote connections to view the screen content" msgstr "" +"Sonque autorizar las connexions distantas per veire lo contengut de l???ecran" #: src/org.gnome.desktop.remote-desktop.gschema.xml.in:24 msgid "" "When view-only is true, remote RDP connections cannot manipulate input " "devices (e.g. mouse and keyboard)." msgstr "" +"Se view-only es definit a ??true??, las connexion distantas RDP p??don pas " +"manipular las entradas dels aparelhs (ex la mirga e lo clavi??r)." #: src/org.gnome.desktop.remote-desktop.gschema.xml.in:34 msgid "" "When view-only is true, remote VNC connections cannot manipulate input " "devices (e.g. mouse and keyboard)." msgstr "" +"Se view-only es definit a ??true??, las connexion distantas VNC p??don pas " +"manipular las entradas dels aparelhs (ex la mirga e lo clavi??r)." #: src/org.gnome.desktop.remote-desktop.gschema.xml.in:41 msgid "Method used to authenticate VNC connections" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/po/sr.po new/gnome-remote-desktop-41.1/po/sr.po --- old/gnome-remote-desktop-41.0/po/sr.po 1970-01-01 01:00:00.000000000 +0100 +++ new/gnome-remote-desktop-41.1/po/sr.po 2021-10-30 16:37:19.000000000 +0200 @@ -0,0 +1,103 @@ +# Serbian translation for gnome-remote-desktop. +# Copyright (C) 2021 gnome-remote-desktop's COPYRIGHT HOLDER +# This file is distributed under the same license as the gnome-remote-desktop package. +# ?????????? ???????????? <marko.m.kos...@gmail.com>, 2021. +# +msgid "" +msgstr "" +"Project-Id-Version: gnome-remote-desktop master\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-remote-desktop/" +"issues\n" +"POT-Creation-Date: 2021-09-28 20:35+0000\n" +"PO-Revision-Date: 2021-10-02 09:29+0200\n" +"Language-Team: Serbian <gnome...@googlegroups.com>\n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Last-Translator: ?????????? ??. ???????????? <marko.m.kos...@gmail.com>\n" +"X-Generator: Poedit 3.0\n" + +#: src/grd-daemon.c:365 +msgid "GNOME Remote Desktop" +msgstr "?????????????? ?????????????? ??????????" + +#: src/grd-prompt.c:124 +#, c-format +msgid "Do you want to share your desktop?" +msgstr "???? ???? ???????????? ???????????????? ?????????????? ?????????? ?????????????" + +#: src/grd-prompt.c:125 +#, c-format +msgid "" +"A user on the computer '%s' is trying to remotely view or control your " +"desktop." +msgstr "" +"???????????????? ???? ???????????????? ???%s??? ???????? ???? ?????????????? ???????????????? ?? ?????????????? ?????????? ???????????? " +"??????????????????." + +#: src/grd-prompt.c:131 +msgid "Refuse" +msgstr "??????????" + +#: src/grd-prompt.c:136 +msgid "Accept" +msgstr "????????????????" + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:7 +msgid "Path to the certificate file" +msgstr "???????????? ???? ???????????????? ??????????????????????" + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:8 +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:16 +msgid "" +"In order to be able to use RDP with TLS Security, both the private key file " +"and the certificate file need to be provided to the RDP server." +msgstr "" +"???? ?????????? ?????????????????? ?????? ???? ?????? ??????????????????????, ???????????? ???????? ???????????????? ?????????????????? " +"?????????? ?? ???????????????? ?????????????????????? ?????? ??????????????." + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:15 +msgid "Path to the private key file" +msgstr "???????????? ???? ???????????????? ?????????????????? ??????????" + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:23 +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:33 +msgid "Only allow remote connections to view the screen content" +msgstr "???????? ?????????????? ???????????????? ???????????? ???????????????????? ???????????????? ????????????" + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:24 +msgid "" +"When view-only is true, remote RDP connections cannot manipulate input " +"devices (e.g. mouse and keyboard)." +msgstr "" +"???????? ???? ???????? ?????????????? ??????????????????, ?????????????? ?????? ???????? ???? ???????? ?????????????????? ???????????? " +"?????????????? (??????.: ???????? ?? ??????????????????)." + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:34 +msgid "" +"When view-only is true, remote VNC connections cannot manipulate input " +"devices (e.g. mouse and keyboard)." +msgstr "" +"???????? ???? ???????? ?????????????? ??????????????????, ?????????????? ?????? ???????? ???? ???????? ?????????????????? ???????????? " +"?????????????? (??????.: ???????? ?? ??????????????????)." + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:41 +msgid "Method used to authenticate VNC connections" +msgstr "?????????? ?????????????? ???????????????????? ?????? ????????" + +#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:42 +msgid "" +"The VNC authentication method describes how a remote connection is " +"authenticated. It can currently be done in two different ways: * prompt - by " +"prompting the user for each new connection, requiring a person with physical " +"access to the workstation to explicitly approve the new connection. * " +"password - by requiring the remote client to provide a known password" +msgstr "" +"?????????? ?????????????? ???????????????????? ?????? ???????? ?????????????? ???????? ???? ?????????????? ???????? " +"??????????????????????????. ???????????????? ???? ???? ???????? ?????????????? ???? ?????? ????????????: * prompt - ???????? " +"?????????????????? ???? ?????????? ???????? ????????, ?????????????? ?????????? ???? ???????????????? ?????????????????? ???????????? " +"?????????????? ???? ???? ???? ?????????? ???????? ???????? ?????????????????????? ????????????????. * password - ?????????????? " +"???? ???????????????? ???????????????? ???? ?????????????? ?????????????????? ??????????????" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/src/grd-clipboard-rdp.c new/gnome-remote-desktop-41.1/src/grd-clipboard-rdp.c --- old/gnome-remote-desktop-41.0/src/grd-clipboard-rdp.c 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/src/grd-clipboard-rdp.c 2021-10-30 16:37:19.000000000 +0200 @@ -565,7 +565,7 @@ FILEDESCRIPTORW *files = NULL; FILEDESCRIPTORW *file; uint32_t n_files = 0; - char *clip_data_dir_name; + g_autofree char *clip_data_dir_name = NULL; char *filename = NULL; char *escaped_name; char *file_uri; @@ -576,6 +576,7 @@ g_strdup_printf ("%u", clip_data_id) : g_strdup_printf ("%lu", GRD_RDP_FUSE_CLIPBOARD_NO_CLIP_DATA_ID); + *dst_size = 0; dst_data = g_array_new (TRUE, TRUE, sizeof (char)); cliprdr_parse_file_list (src_data, src_size, &files, &n_files); @@ -583,8 +584,13 @@ { file = &files[i]; - ConvertFromUnicode (CP_UTF8, 0, file->cFileName, -1, &filename, 0, NULL, - NULL); + if (ConvertFromUnicode (CP_UTF8, 0, file->cFileName, -1, &filename, + 0, NULL, NULL) <= 0) + { + g_array_free (dst_data, TRUE); + g_free (files); + return NULL; + } if (strchr (filename, '\\')) { g_free (filename); @@ -607,7 +613,6 @@ *dst_size = dst_data->len; g_free (files); - g_free (clip_data_dir_name); return (uint8_t *) g_array_free (dst_data, FALSE); } @@ -699,7 +704,7 @@ FILEDESCRIPTORW *file; uint32_t n_files = 0; gboolean result; - char *clip_data_dir_name; + g_autofree char *clip_data_dir_name = NULL; char *filename = NULL; char *escaped_name; char *full_filepath; @@ -742,8 +747,15 @@ { file = &files[i]; - ConvertFromUnicode (CP_UTF8, 0, file->cFileName, -1, &filename, - 0, NULL, NULL); + if (ConvertFromUnicode (CP_UTF8, 0, file->cFileName, -1, &filename, + 0, NULL, NULL) <= 0) + { + g_array_free (data_nautilus, TRUE); + grd_rdp_fuse_clipboard_clear_no_cdi_selection (rdp_fuse_clipboard); + g_free (files); + g_free (dst_data); + return NULL; + } if (strchr (filename, '\\')) { g_free (filename); @@ -798,7 +810,6 @@ GUINT_TO_POINTER (second_mime_type), format_data); - g_free (clip_data_dir_name); g_free (files); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/src/grd-daemon.c new/gnome-remote-desktop-41.1/src/grd-daemon.c --- old/gnome-remote-desktop-41.0/src/grd-daemon.c 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/src/grd-daemon.c 2021-10-30 16:37:19.000000000 +0200 @@ -68,18 +68,19 @@ } #ifdef HAVE_RDP -static void +static gboolean init_rdp_server (GrdDaemon *daemon) { GrdSettings *settings = grd_context_get_settings (daemon->context); g_autoptr (GError) error = NULL; + gboolean result = FALSE; daemon->rdp_server = NULL; if (!g_access (grd_settings_get_rdp_server_cert (settings), F_OK) && !g_access (grd_settings_get_rdp_server_key (settings), F_OK)) { daemon->rdp_server = grd_rdp_server_new (daemon->context); - if (!grd_rdp_server_start (daemon->rdp_server, &error)) + if (!(result = grd_rdp_server_start (daemon->rdp_server, &error))) g_warning ("Failed to initialize RDP server: %s\n", error->message); else g_message ("Initialized RDP server"); @@ -88,36 +89,49 @@ { g_message ("Didn't initialize RDP server: not configured"); } + + return result; } #endif /* HAVE_RDP */ #ifdef HAVE_VNC -static void +static gboolean init_vnc_server (GrdDaemon *daemon) { g_autoptr (GError) error = NULL; + gboolean result; daemon->vnc_server = grd_vnc_server_new (daemon->context); - if (!grd_vnc_server_start (daemon->vnc_server, &error)) + if (!(result = grd_vnc_server_start (daemon->vnc_server, &error))) g_warning ("Failed to initialize VNC server: %s\n", error->message); else g_message ("Initialized VNC server"); + + return result; } #endif /* HAVE_VNC */ static void maybe_enable_services (GrdDaemon *daemon) { + gboolean has_one_backend = FALSE; + if (!is_daemon_ready (daemon)) return; #ifdef HAVE_RDP - init_rdp_server (daemon); + has_one_backend = init_rdp_server (daemon) || has_one_backend; #endif #ifdef HAVE_VNC - init_vnc_server (daemon); + has_one_backend = init_vnc_server (daemon) || has_one_backend; #endif + + if (!has_one_backend) + { + g_warning ("No backend initialized successfully. Exiting"); + g_application_release (G_APPLICATION (daemon)); + } } static void diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/src/grd-rdp-event-queue.c new/gnome-remote-desktop-41.1/src/grd-rdp-event-queue.c --- old/gnome-remote-desktop-41.0/src/grd-rdp-event-queue.c 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/src/grd-rdp-event-queue.c 2021-10-30 16:37:19.000000000 +0200 @@ -356,7 +356,7 @@ flush_source = g_source_new (&flush_source_funcs, sizeof (GSource)); g_source_set_callback (flush_source, flush_rdp_events, rdp_event_queue, NULL); g_source_set_ready_time (flush_source, -1); - g_source_attach (flush_source, g_main_context_get_thread_default ()); + g_source_attach (flush_source, NULL); rdp_event_queue->flush_source = flush_source; return rdp_event_queue; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/src/grd-rdp-fuse-clipboard.c new/gnome-remote-desktop-41.1/src/grd-rdp-fuse-clipboard.c --- old/gnome-remote-desktop-41.0/src/grd-rdp-fuse-clipboard.c 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/src/grd-rdp-fuse-clipboard.c 2021-10-30 16:37:19.000000000 +0200 @@ -1083,6 +1083,7 @@ { GrdRdpFuseClipboard *rdp_fuse_clipboard = fuse_req_userdata (fuse_req); FuseFile *fuse_file; + g_autofree char *filename_with_root = NULL; g_mutex_lock (&rdp_fuse_clipboard->filesystem_mutex); if (!(fuse_file = get_fuse_file_by_ino (rdp_fuse_clipboard, fuse_ino))) @@ -1097,6 +1098,8 @@ fuse_reply_err (fuse_req, EISDIR); return; } + + filename_with_root = g_strdup (fuse_file->filename_with_root); g_mutex_unlock (&rdp_fuse_clipboard->filesystem_mutex); if ((file_info->flags & O_ACCMODE) != O_RDONLY) @@ -1108,7 +1111,7 @@ /* Using direct_io also increases FUSE_MAX_PAGES_PER_REQ */ file_info->direct_io = 1; - g_debug ("[FUSE Clipboard] Opening file \"%s\"", fuse_file->filename_with_root); + g_debug ("[FUSE Clipboard] Opening file \"%s\"", filename_with_root); fuse_reply_open (fuse_req, file_info); } @@ -1157,6 +1160,7 @@ { GrdRdpFuseClipboard *rdp_fuse_clipboard = fuse_req_userdata (fuse_req); FuseFile *fuse_file; + g_autofree char *filename_with_root = NULL; g_mutex_lock (&rdp_fuse_clipboard->filesystem_mutex); if (!(fuse_file = get_fuse_file_by_ino (rdp_fuse_clipboard, fuse_ino))) @@ -1171,6 +1175,8 @@ fuse_reply_err (fuse_req, ENOTDIR); return; } + + filename_with_root = g_strdup (fuse_file->filename_with_root); g_mutex_unlock (&rdp_fuse_clipboard->filesystem_mutex); if ((file_info->flags & O_ACCMODE) != O_RDONLY) @@ -1179,8 +1185,7 @@ return; } - g_debug ("[FUSE Clipboard] Opening directory \"%s\"", - fuse_file->filename_with_root); + g_debug ("[FUSE Clipboard] Opening directory \"%s\"", filename_with_root); fuse_reply_open (fuse_req, file_info); } @@ -1377,8 +1382,10 @@ GrdRdpFuseClipboard *rdp_fuse_clipboard = GRD_RDP_FUSE_CLIPBOARD (object); if (rdp_fuse_clipboard->timeout_reset_source) - g_source_destroy (rdp_fuse_clipboard->timeout_reset_source); - g_clear_pointer (&rdp_fuse_clipboard->timeout_reset_source, g_source_unref); + { + g_source_destroy (rdp_fuse_clipboard->timeout_reset_source); + g_clear_pointer (&rdp_fuse_clipboard->timeout_reset_source, g_source_unref); + } if (rdp_fuse_clipboard->fuse_thread) { @@ -1533,7 +1540,7 @@ g_source_set_callback (timeout_reset_source, reset_clip_data_entry_timeouts, rdp_fuse_clipboard, NULL); g_source_set_ready_time (timeout_reset_source, -1); - g_source_attach (timeout_reset_source, g_main_context_get_thread_default ()); + g_source_attach (timeout_reset_source, NULL); rdp_fuse_clipboard->timeout_reset_source = timeout_reset_source; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/src/grd-rdp-gfx-surface.c new/gnome-remote-desktop-41.1/src/grd-rdp-gfx-surface.c --- old/gnome-remote-desktop-41.0/src/grd-rdp-gfx-surface.c 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/src/grd-rdp-gfx-surface.c 2021-10-30 16:37:19.000000000 +0200 @@ -331,6 +331,7 @@ GrdRdpGfxSurface * grd_rdp_gfx_surface_new (GrdRdpGraphicsPipeline *graphics_pipeline, GrdSessionRdp *session_rdp, + GMainContext *pipeline_context, GrdRdpSurface *rdp_surface, uint16_t surface_id, uint32_t serial) @@ -356,7 +357,7 @@ g_source_set_callback (gfx_surface->pending_encode_source, maybe_encode_pending_frame, gfx_surface, NULL); g_source_set_ready_time (gfx_surface->pending_encode_source, -1); - g_source_attach (gfx_surface->pending_encode_source, NULL); + g_source_attach (gfx_surface->pending_encode_source, pipeline_context); return gfx_surface; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/src/grd-rdp-gfx-surface.h new/gnome-remote-desktop-41.1/src/grd-rdp-gfx-surface.h --- old/gnome-remote-desktop-41.0/src/grd-rdp-gfx-surface.h 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/src/grd-rdp-gfx-surface.h 2021-10-30 16:37:19.000000000 +0200 @@ -31,6 +31,7 @@ GrdRdpGfxSurface *grd_rdp_gfx_surface_new (GrdRdpGraphicsPipeline *graphics_pipeline, GrdSessionRdp *session_rdp, + GMainContext *pipeline_context, GrdRdpSurface *rdp_surface, uint16_t surface_id, uint32_t serial); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/src/grd-rdp-graphics-pipeline.c new/gnome-remote-desktop-41.1/src/grd-rdp-graphics-pipeline.c --- old/gnome-remote-desktop-41.0/src/grd-rdp-graphics-pipeline.c 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/src/grd-rdp-graphics-pipeline.c 2021-10-30 16:37:19.000000000 +0200 @@ -26,11 +26,12 @@ #include "grd-rdp-frame-info.h" #include "grd-rdp-gfx-surface.h" #include "grd-rdp-network-autodetection.h" +#include "grd-rdp-surface.h" +#include "grd-session-rdp.h" + #ifdef HAVE_NVENC #include "grd-rdp-nvenc.h" #endif /* HAVE_NVENC */ -#include "grd-rdp-surface.h" -#include "grd-session-rdp.h" #define ENC_TIMES_CHECK_INTERVAL_MS 1000 #define MAX_TRACKED_ENC_FRAMES 1000 @@ -71,6 +72,7 @@ uint32_t initial_version; GrdSessionRdp *session_rdp; + GMainContext *pipeline_context; GrdRdpNetworkAutodetection *network_autodetection; wStream *encode_stream; RFX_CONTEXT *rfx_context; @@ -879,7 +881,8 @@ g_timeout_source_new (ENC_TIMES_CHECK_INTERVAL_MS); g_source_set_callback (graphics_pipeline->rtt_pause_source, maybe_slow_down_rtts, graphics_pipeline, NULL); - g_source_attach (graphics_pipeline->rtt_pause_source, NULL); + g_source_attach (graphics_pipeline->rtt_pause_source, + graphics_pipeline->pipeline_context); } void @@ -910,8 +913,8 @@ if (!rdp_surface->gfx_surface) { rdp_surface->gfx_surface = grd_rdp_gfx_surface_new ( - graphics_pipeline, session_rdp, rdp_surface, - get_next_free_surface_id (graphics_pipeline), + graphics_pipeline, session_rdp, graphics_pipeline->pipeline_context, + rdp_surface, get_next_free_surface_id (graphics_pipeline), get_next_free_serial (graphics_pipeline)); map_surface_to_output (graphics_pipeline, rdp_surface->gfx_surface); } @@ -1133,8 +1136,6 @@ uint32_t surface_serial; surface_serial = GPOINTER_TO_UINT (value); - surface_serial_unref (graphics_pipeline, surface_serial); - if (!g_hash_table_lookup_extended (graphics_pipeline->serial_surface_table, GUINT_TO_POINTER (surface_serial), NULL, (gpointer *) &surface_context)) @@ -1146,6 +1147,8 @@ frame_acknowledge->frameId, g_get_monotonic_time ()); } + + surface_serial_unref (graphics_pipeline, surface_serial); } if (frame_acknowledge->queueDepth == SUSPEND_FRAME_ACKNOWLEDGEMENT) @@ -1203,6 +1206,7 @@ GrdRdpGraphicsPipeline * grd_rdp_graphics_pipeline_new (GrdSessionRdp *session_rdp, + GMainContext *pipeline_context, HANDLE vcm, HANDLE stop_event, rdpContext *rdp_context, @@ -1221,6 +1225,7 @@ graphics_pipeline->rdpgfx_context = rdpgfx_context; graphics_pipeline->stop_event = stop_event; graphics_pipeline->session_rdp = session_rdp; + graphics_pipeline->pipeline_context = pipeline_context; graphics_pipeline->network_autodetection = network_autodetection; graphics_pipeline->encode_stream = encode_stream; graphics_pipeline->rfx_context = rfx_context; @@ -1504,7 +1509,7 @@ g_source_set_callback (protocol_reset_source, reset_protocol, graphics_pipeline, NULL); g_source_set_ready_time (protocol_reset_source, -1); - g_source_attach (protocol_reset_source, NULL); + g_source_attach (protocol_reset_source, graphics_pipeline->pipeline_context); graphics_pipeline->protocol_reset_source = protocol_reset_source; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/src/grd-rdp-graphics-pipeline.h new/gnome-remote-desktop-41.1/src/grd-rdp-graphics-pipeline.h --- old/gnome-remote-desktop-41.0/src/grd-rdp-graphics-pipeline.h 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/src/grd-rdp-graphics-pipeline.h 2021-10-30 16:37:19.000000000 +0200 @@ -31,6 +31,7 @@ GRD, RDP_GRAPHICS_PIPELINE, GObject); GrdRdpGraphicsPipeline *grd_rdp_graphics_pipeline_new (GrdSessionRdp *session_rdp, + GMainContext *pipeline_context, HANDLE vcm, HANDLE stop_event, rdpContext *rdp_context, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/src/grd-rdp-nvenc.c new/gnome-remote-desktop-41.1/src/grd-rdp-nvenc.c --- old/gnome-remote-desktop-41.0/src/grd-rdp-nvenc.c 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/src/grd-rdp-nvenc.c 2021-10-30 16:37:19.000000000 +0200 @@ -55,6 +55,21 @@ G_DEFINE_TYPE (GrdRdpNvenc, grd_rdp_nvenc, G_TYPE_OBJECT); +void +grd_rdp_nvenc_push_cuda_context (GrdRdpNvenc *rdp_nvenc) +{ + if (rdp_nvenc->cuda_funcs->cuCtxPushCurrent (rdp_nvenc->cu_context) != CUDA_SUCCESS) + g_error ("[HWAccel.CUDA] Failed to push CUDA context"); +} + +void +grd_rdp_nvenc_pop_cuda_context (GrdRdpNvenc *rdp_nvenc) +{ + CUcontext cu_context; + + rdp_nvenc->cuda_funcs->cuCtxPopCurrent (&cu_context); +} + static uint32_t get_next_free_encode_session_id (GrdRdpNvenc *rdp_nvenc) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/src/grd-rdp-nvenc.h new/gnome-remote-desktop-41.1/src/grd-rdp-nvenc.h --- old/gnome-remote-desktop-41.0/src/grd-rdp-nvenc.h 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/src/grd-rdp-nvenc.h 2021-10-30 16:37:19.000000000 +0200 @@ -29,6 +29,10 @@ GrdRdpNvenc *grd_rdp_nvenc_new (void); +void grd_rdp_nvenc_push_cuda_context (GrdRdpNvenc *rdp_nvenc); + +void grd_rdp_nvenc_pop_cuda_context (GrdRdpNvenc *rdp_nvenc); + gboolean grd_rdp_nvenc_create_encode_session (GrdRdpNvenc *rdp_nvenc, uint32_t *encode_session_id, uint16_t surface_width, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/src/grd-rdp-pipewire-stream.c new/gnome-remote-desktop-41.1/src/grd-rdp-pipewire-stream.c --- old/gnome-remote-desktop-41.0/src/grd-rdp-pipewire-stream.c 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/src/grd-rdp-pipewire-stream.c 2021-10-30 16:37:19.000000000 +0200 @@ -47,6 +47,7 @@ uint16_t width; uint16_t height; + gboolean has_pointer_data; uint8_t *pointer_bitmap; uint16_t pointer_hotspot_x; uint16_t pointer_hotspot_y; @@ -67,6 +68,7 @@ struct spa_hook pipewire_core_listener; + GSource *render_source; GMutex frame_mutex; GrdRdpFrame *pending_frame; @@ -82,6 +84,69 @@ G_TYPE_OBJECT) static gboolean +do_render (gpointer user_data) +{ + GrdRdpPipeWireStream *stream = GRD_RDP_PIPEWIRE_STREAM (user_data); + GrdRdpFrame *frame; + + g_mutex_lock (&stream->frame_mutex); + frame = g_steal_pointer (&stream->pending_frame); + g_mutex_unlock (&stream->frame_mutex); + + if (!frame) + return G_SOURCE_CONTINUE; + + if (frame->data) + { + grd_session_rdp_take_buffer (stream->session_rdp, frame->data, + frame->width, frame->height); + } + + if (frame->pointer_bitmap) + { + grd_session_rdp_update_pointer (stream->session_rdp, + frame->pointer_hotspot_x, + frame->pointer_hotspot_y, + frame->pointer_width, + frame->pointer_height, + frame->pointer_bitmap); + } + else if (frame->pointer_is_hidden) + { + grd_session_rdp_hide_pointer (stream->session_rdp); + } + + g_free (frame); + + return G_SOURCE_CONTINUE; +} + +static gboolean +render_source_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + g_source_set_ready_time (source, -1); + + return callback (user_data); +} + +static GSourceFuncs render_source_funcs = +{ + .dispatch = render_source_dispatch, +}; + +static void +create_render_source (GrdRdpPipeWireStream *stream, + GMainContext *render_context) +{ + stream->render_source = g_source_new (&render_source_funcs, sizeof (GSource)); + g_source_set_callback (stream->render_source, do_render, stream, NULL); + g_source_set_ready_time (stream->render_source, -1); + g_source_attach (stream->render_source, render_context); +} + +static gboolean pipewire_loop_source_prepare (GSource *base, int *timeout) { @@ -177,8 +242,6 @@ GrdRdpPipeWireStream *stream = GRD_RDP_PIPEWIRE_STREAM (user_data); uint8_t params_buffer[1024]; struct spa_pod_builder pod_builder; - int width; - int height; const struct spa_pod *params[3]; if (!format || id != SPA_PARAM_Format) @@ -188,11 +251,6 @@ pod_builder = SPA_POD_BUILDER_INIT (params_buffer, sizeof (params_buffer)); - width = stream->spa_format.size.width; - height = stream->spa_format.size.height; - - grd_session_rdp_resize_framebuffer (stream->session_rdp, width, height); - params[0] = spa_pod_builder_add_object ( &pod_builder, SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers, @@ -219,49 +277,6 @@ params, G_N_ELEMENTS (params)); } -static int -do_render (struct spa_loop *loop, - bool async, - uint32_t seq, - const void *data, - size_t size, - void *user_data) -{ - GrdRdpPipeWireStream *stream = GRD_RDP_PIPEWIRE_STREAM (user_data); - GrdRdpFrame *frame; - - g_mutex_lock (&stream->frame_mutex); - frame = g_steal_pointer (&stream->pending_frame); - g_mutex_unlock (&stream->frame_mutex); - - if (!frame) - return 0; - - if (frame->data) - { - grd_session_rdp_take_buffer (stream->session_rdp, frame->data, - frame->width, frame->height); - } - - if (frame->pointer_bitmap) - { - grd_session_rdp_update_pointer (stream->session_rdp, - frame->pointer_hotspot_x, - frame->pointer_hotspot_y, - frame->pointer_width, - frame->pointer_height, - frame->pointer_bitmap); - } - else if (frame->pointer_is_hidden) - { - grd_session_rdp_hide_pointer (stream->session_rdp); - } - - g_free (frame); - - return 0; -} - static GrdRdpFrame * process_buffer (GrdRdpPipeWireStream *stream, struct spa_buffer *buffer) @@ -379,10 +394,12 @@ frame->pointer_hotspot_y = spa_meta_cursor->hotspot.y; frame->pointer_width = spa_meta_bitmap->size.width; frame->pointer_height = spa_meta_bitmap->size.height; + frame->has_pointer_data = TRUE; } else if (spa_meta_bitmap) { frame->pointer_is_hidden = TRUE; + frame->has_pointer_data = TRUE; } } @@ -390,11 +407,33 @@ } static void +take_frame_data_from (GrdRdpFrame *src_frame, + GrdRdpFrame *dst_frame) +{ + dst_frame->data = g_steal_pointer (&src_frame->data); + dst_frame->width = src_frame->width; + dst_frame->height = src_frame->height; +} + +static void +take_pointer_data_from (GrdRdpFrame *src_frame, + GrdRdpFrame *dst_frame) +{ + g_assert (!dst_frame->pointer_bitmap); + dst_frame->pointer_bitmap = g_steal_pointer (&src_frame->pointer_bitmap); + + dst_frame->pointer_hotspot_x = src_frame->pointer_hotspot_x; + dst_frame->pointer_hotspot_y = src_frame->pointer_hotspot_y; + dst_frame->pointer_width = src_frame->pointer_width; + dst_frame->pointer_height = src_frame->pointer_height; + dst_frame->pointer_is_hidden = src_frame->pointer_is_hidden; + dst_frame->has_pointer_data = TRUE; +} + +static void on_stream_process (void *user_data) { GrdRdpPipeWireStream *stream = GRD_RDP_PIPEWIRE_STREAM (user_data); - GrdPipeWireSource *pipewire_source = - (GrdPipeWireSource *) stream->pipewire_source; struct pw_buffer *next_buffer; struct pw_buffer *buffer = NULL; GrdRdpFrame *frame; @@ -417,6 +456,11 @@ g_mutex_lock (&stream->frame_mutex); if (stream->pending_frame) { + if (!frame->data && stream->pending_frame->data) + take_frame_data_from (stream->pending_frame, frame); + if (!frame->has_pointer_data && stream->pending_frame->has_pointer_data) + take_pointer_data_from (stream->pending_frame, frame); + g_free (stream->pending_frame->data); g_free (stream->pending_frame->pointer_bitmap); g_clear_pointer (&stream->pending_frame, g_free); @@ -426,9 +470,7 @@ pw_stream_queue_buffer (stream->pipewire_stream, buffer); - pw_loop_invoke (pipewire_source->pipewire_loop, do_render, - SPA_ID_INVALID, NULL, 0, - false, stream); + g_source_set_ready_time (stream->render_source, 0); } static const struct pw_stream_events stream_events = { @@ -523,6 +565,7 @@ GrdRdpPipeWireStream * grd_rdp_pipewire_stream_new (GrdSessionRdp *session_rdp, + GMainContext *render_context, uint32_t src_node_id, uint32_t refresh_rate, GError **error) @@ -536,6 +579,8 @@ stream->session_rdp = session_rdp; stream->src_node_id = src_node_id; + create_render_source (stream, render_context); + pipewire_source = create_pipewire_source (); if (!pipewire_source) { @@ -593,6 +638,19 @@ g_clear_pointer (&stream->pipewire_source, g_source_unref); } + if (stream->render_source) + { + g_source_destroy (stream->render_source); + g_clear_pointer (&stream->render_source, g_source_unref); + } + + if (stream->pending_frame) + { + g_free (stream->pending_frame->data); + g_free (stream->pending_frame->pointer_bitmap); + g_clear_pointer (&stream->pending_frame, g_free); + } + G_OBJECT_CLASS (grd_rdp_pipewire_stream_parent_class)->finalize (object); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/src/grd-rdp-pipewire-stream.h new/gnome-remote-desktop-41.1/src/grd-rdp-pipewire-stream.h --- old/gnome-remote-desktop-41.0/src/grd-rdp-pipewire-stream.h 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/src/grd-rdp-pipewire-stream.h 2021-10-30 16:37:19.000000000 +0200 @@ -31,6 +31,7 @@ GObject) GrdRdpPipeWireStream *grd_rdp_pipewire_stream_new (GrdSessionRdp *session_rdp, + GMainContext *render_context, uint32_t src_node_id, uint32_t refresh_rate, GError **error); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/src/grd-session-rdp.c new/gnome-remote-desktop-41.1/src/grd-session-rdp.c --- old/gnome-remote-desktop-41.0/src/grd-session-rdp.c 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/src/grd-session-rdp.c 2021-10-30 16:37:19.000000000 +0200 @@ -42,6 +42,10 @@ #include "grd-settings.h" #include "grd-stream.h" +#ifdef HAVE_NVENC +#include "grd-rdp-nvenc.h" +#endif /* HAVE_NVENC */ + #define DISCRETE_SCROLL_STEP 10.0 typedef enum _RdpPeerFlag @@ -124,6 +128,9 @@ HANDLE start_event; HANDLE stop_event; + GThread *graphics_thread; + GMainContext *graphics_context; + GrdRdpSurface *rdp_surface; Pointer *last_pointer; GHashTable *pointer_cache; @@ -143,10 +150,11 @@ #ifdef HAVE_NVENC GrdRdpNvenc *rdp_nvenc; -#endif /*HAVE_NVENC*/ +#endif /* HAVE_NVENC */ GSource *pending_encode_source; + GMutex close_session_mutex; unsigned int close_session_idle_id; GrdRdpPipeWireStream *pipewire_stream; @@ -214,10 +222,10 @@ g_source_set_ready_time (session_rdp->pending_encode_source, 0); } -void -grd_session_rdp_resize_framebuffer (GrdSessionRdp *session_rdp, - uint32_t width, - uint32_t height) +static void +maybe_resize_graphics_output_buffer (GrdSessionRdp *session_rdp, + uint32_t width, + uint32_t height) { freerdp_peer *peer = session_rdp->peer; rdpSettings *rdp_settings = peer->settings; @@ -247,6 +255,7 @@ cairo_region_t *region; g_clear_pointer (&rdp_surface->pending_frame, g_free); + maybe_resize_graphics_output_buffer (session_rdp, width, height); if (is_rdp_peer_flag_set (session_rdp, RDP_PEER_ALL_SURFACES_INVALID)) { @@ -564,11 +573,16 @@ static void maybe_queue_close_session_idle (GrdSessionRdp *session_rdp) { + g_mutex_lock (&session_rdp->close_session_mutex); if (session_rdp->close_session_idle_id) - return; + { + g_mutex_unlock (&session_rdp->close_session_mutex); + return; + } session_rdp->close_session_idle_id = g_idle_add (close_session_idle, session_rdp); + g_mutex_unlock (&session_rdp->close_session_mutex); SetEvent (session_rdp->stop_event); } @@ -788,7 +802,9 @@ g_mutex_lock (thread_pool_context->pending_jobs_mutex); --thread_pool_context->pending_job_count; - g_cond_signal (thread_pool_context->pending_jobs_cond); + + if (!thread_pool_context->pending_job_count) + g_cond_signal (thread_pool_context->pending_jobs_cond); g_mutex_unlock (thread_pool_context->pending_jobs_mutex); } @@ -962,7 +978,9 @@ g_mutex_lock (thread_pool_context->pending_jobs_mutex); --thread_pool_context->pending_job_count; - g_cond_signal (thread_pool_context->pending_jobs_cond); + + if (!thread_pool_context->pending_job_count) + g_cond_signal (thread_pool_context->pending_jobs_cond); g_mutex_unlock (thread_pool_context->pending_jobs_mutex); } @@ -1603,7 +1621,8 @@ rdp_settings->PointerCacheSize = MIN (rdp_settings->PointerCacheSize, 100); session_rdp->rdp_surface = g_malloc0 (sizeof (GrdRdpSurface)); - session_rdp->rdp_surface->refresh_rate = 30; + session_rdp->rdp_surface->refresh_rate = rdp_settings->SupportGraphicsPipeline ? 60 + : 30; if (rdp_settings->SupportGraphicsPipeline && !rdp_settings->NetworkAutoDetect) @@ -1625,6 +1644,7 @@ rdp_peer_context->graphics_pipeline = grd_rdp_graphics_pipeline_new (session_rdp, + session_rdp->graphics_context, rdp_peer_context->vcm, session_rdp->stop_event, peer->context, @@ -1899,6 +1919,27 @@ return NULL; } +static gpointer +graphics_thread_func (gpointer data) +{ + GrdSessionRdp *session_rdp = data; + +#ifdef HAVE_NVENC + if (session_rdp->rdp_nvenc) + grd_rdp_nvenc_push_cuda_context (session_rdp->rdp_nvenc); +#endif /* HAVE_NVENC */ + + while (WaitForSingleObject (session_rdp->stop_event, 0) == WAIT_TIMEOUT) + g_main_context_iteration (session_rdp->graphics_context, TRUE); + +#ifdef HAVE_NVENC + if (session_rdp->rdp_nvenc) + grd_rdp_nvenc_pop_cuda_context (session_rdp->rdp_nvenc); +#endif /* HAVE_NVENC */ + + return NULL; +} + GrdSessionRdp * grd_session_rdp_new (GrdRdpServer *rdp_server, GSocketConnection *connection, @@ -1938,24 +1979,13 @@ #ifdef HAVE_NVENC session_rdp->rdp_nvenc = rdp_nvenc; #endif /* HAVE_NVENC */ - session_rdp->start_event = CreateEvent (NULL, TRUE, FALSE, NULL); - session_rdp->stop_event = CreateEvent (NULL, TRUE, FALSE, NULL); session_rdp->socket_thread = g_thread_new ("RDP socket thread", socket_thread_func, session_rdp); - if (!session_rdp->socket_thread) - { - g_warning ("Failed to create socket thread"); - - g_clear_pointer (&session_rdp->stop_event, CloseHandle); - g_clear_pointer (&session_rdp->start_event, CloseHandle); - g_object_unref (connection); - g_free (password); - g_free (username); - - return NULL; - } + session_rdp->graphics_thread = g_thread_new ("RDP graphics thread", + graphics_thread_func, + session_rdp); init_rdp_session (session_rdp, username, password); @@ -2006,6 +2036,15 @@ rdp_peer_context->network_autodetection); } + if (session_rdp->graphics_thread) + { + g_assert (session_rdp->graphics_context); + g_assert (WaitForSingleObject (session_rdp->stop_event, 0) != WAIT_TIMEOUT); + + g_main_context_wakeup (session_rdp->graphics_context); + g_clear_pointer (&session_rdp->graphics_thread, g_thread_join); + } + g_clear_object (&session_rdp->pipewire_stream); g_clear_object (&rdp_peer_context->clipboard_rdp); @@ -2042,9 +2081,6 @@ clear_pointer_bitmap, NULL); - g_clear_pointer (&session_rdp->stop_event, CloseHandle); - g_clear_pointer (&session_rdp->start_event, CloseHandle); - g_clear_handle_id (&session_rdp->close_session_idle_id, g_source_remove); } @@ -2086,6 +2122,7 @@ GrdStream *stream) { GrdSessionRdp *session_rdp = GRD_SESSION_RDP (session); + GMainContext *graphics_context = session_rdp->graphics_context; uint32_t pipewire_node_id; uint16_t refresh_rate; g_autoptr (GError) error = NULL; @@ -2093,6 +2130,7 @@ pipewire_node_id = grd_stream_get_pipewire_node_id (stream); refresh_rate = session_rdp->rdp_surface->refresh_rate; session_rdp->pipewire_stream = grd_rdp_pipewire_stream_new (session_rdp, + graphics_context, pipewire_node_id, refresh_rate, &error); @@ -2138,10 +2176,16 @@ g_clear_pointer (&session_rdp->pending_encode_source, g_source_unref); } + g_assert (!session_rdp->graphics_thread); + g_clear_pointer (&session_rdp->graphics_context, g_main_context_unref); + g_clear_pointer (&session_rdp->pressed_unicode_keys, g_hash_table_unref); g_clear_pointer (&session_rdp->pressed_keys, g_hash_table_unref); g_clear_pointer (&session_rdp->pointer_cache, g_hash_table_unref); + g_clear_pointer (&session_rdp->stop_event, CloseHandle); + g_clear_pointer (&session_rdp->start_event, CloseHandle); + G_OBJECT_CLASS (grd_session_rdp_parent_class)->dispose (object); } @@ -2201,6 +2245,9 @@ static void grd_session_rdp_init (GrdSessionRdp *session_rdp) { + session_rdp->start_event = CreateEvent (NULL, TRUE, FALSE, NULL); + session_rdp->stop_event = CreateEvent (NULL, TRUE, FALSE, NULL); + session_rdp->pointer_cache = g_hash_table_new (NULL, are_pointer_bitmaps_equal); session_rdp->pressed_keys = g_hash_table_new (NULL, NULL); session_rdp->pressed_unicode_keys = g_hash_table_new (NULL, NULL); @@ -2208,15 +2255,19 @@ g_cond_init (&session_rdp->pending_jobs_cond); g_mutex_init (&session_rdp->pending_jobs_mutex); g_mutex_init (&session_rdp->rdp_flags_mutex); + g_mutex_init (&session_rdp->close_session_mutex); session_rdp->rdp_event_queue = grd_rdp_event_queue_new (session_rdp); + session_rdp->graphics_context = g_main_context_new (); + session_rdp->pending_encode_source = g_source_new (&pending_encode_source_funcs, sizeof (GSource)); g_source_set_callback (session_rdp->pending_encode_source, encode_pending_frames, session_rdp, NULL); g_source_set_ready_time (session_rdp->pending_encode_source, -1); - g_source_attach (session_rdp->pending_encode_source, NULL); + g_source_attach (session_rdp->pending_encode_source, + session_rdp->graphics_context); } static void diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/src/grd-session-rdp.h new/gnome-remote-desktop-41.1/src/grd-session-rdp.h --- old/gnome-remote-desktop-41.0/src/grd-session-rdp.h 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/src/grd-session-rdp.h 2021-10-30 16:37:19.000000000 +0200 @@ -49,10 +49,6 @@ int grd_session_rdp_get_stride_for_width (GrdSessionRdp *session_rdp, int width); -void grd_session_rdp_resize_framebuffer (GrdSessionRdp *session_rdp, - uint32_t width, - uint32_t height); - void grd_session_rdp_take_buffer (GrdSessionRdp *session_rdp, void *data, uint16_t width, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnome-remote-desktop-41.0/src/grd-vnc-pipewire-stream.c new/gnome-remote-desktop-41.1/src/grd-vnc-pipewire-stream.c --- old/gnome-remote-desktop-41.0/src/grd-vnc-pipewire-stream.c 2021-09-19 16:03:51.000000000 +0200 +++ new/gnome-remote-desktop-41.1/src/grd-vnc-pipewire-stream.c 2021-10-30 16:37:19.000000000 +0200 @@ -427,6 +427,17 @@ g_mutex_lock (&stream->frame_mutex); if (stream->pending_frame) { + if (!frame->data && stream->pending_frame->data) + frame->data = g_steal_pointer (&stream->pending_frame->data); + if (!frame->rfb_cursor && stream->pending_frame->rfb_cursor) + frame->rfb_cursor = g_steal_pointer (&stream->pending_frame->rfb_cursor); + if (!frame->cursor_moved && stream->pending_frame->cursor_moved) + { + frame->cursor_x = stream->pending_frame->cursor_x; + frame->cursor_y = stream->pending_frame->cursor_y; + frame->cursor_moved = TRUE; + } + g_free (stream->pending_frame->data); g_clear_pointer (&stream->pending_frame, g_free); } ++++++ gnome-remote-desktop.obsinfo ++++++ --- /var/tmp/diff_new_pack.if4jY2/_old 2021-11-05 22:59:00.592296116 +0100 +++ /var/tmp/diff_new_pack.if4jY2/_new 2021-11-05 22:59:00.592296116 +0100 @@ -1,5 +1,5 @@ name: gnome-remote-desktop -version: 41.0 -mtime: 1632060231 -commit: 240489f399df798228128c4c2cf29afba1208481 +version: 41.1 +mtime: 1635604639 +commit: f895c2b28b3341af54cb2ce24ce76af8f3e1513d