Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • jbicha/gnome-remote-desktop
  • ubuntu-desktop-helper/gnome-remote-desktop
  • jardon/gnome-remote-desktop
  • bandali/gnome-remote-desktop
  • BenTheTechGuy/gnome-remote-desktop
  • jssotomdz/gnome-remote-desktop
  • nteodosio/gnome-remote-desktop
  • gnome-team/gnome-remote-desktop
8 results
Select Git revision
Show changes
Commits on Source (35)
Showing
with 376 additions and 145 deletions
gnome-remote-desktop (42.7-0ubuntu1) jammy; urgency=medium
* New upstream release (LP: #1998966)
-- Jeremy Bicha <jbicha@ubuntu.com> Tue, 06 Dec 2022 16:34:29 -0500
gnome-remote-desktop (42.4-0ubuntu1) jammy; urgency=medium
* New upstream version (LP: #1983788)
......
......@@ -2,7 +2,7 @@
pristine-tar = True
debian-branch = ubuntu/jammy
debian-tag=ubuntu/%(version)s
upstream-branch = upstream/latest
upstream-branch = upstream/42.x
[buildpackage]
sign-tags = True
......
version=4
opts="searchmode=plain, uversionmangle=s/\.(alpha|beta|rc)/~$1/, downloadurlmangle=s|cache.json||" \
https://download.gnome.org/sources/@PACKAGE@/cache.json \
[\d.]+/@PACKAGE@-([\d.]+)@ARCHIVE_EXT@
42/@PACKAGE@-([\d.]+)@ARCHIVE_EXT@
project('gnome-remote-desktop', 'c',
version: '42.4',
version: '42.7',
meson_version: '>= 0.47.0',
default_options: ['warning_level=1',
'buildtype=debugoptimized'])
......
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Sveinn í Felli <sv1@fellsnet.is>, 2021.
# Sveinn í Felli <sv1@fellsnet.is>, 2021, 2022.
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-remote-desktop/issu"
"es\n"
"POT-Creation-Date: 2021-12-08 10:00+0000\n"
"PO-Revision-Date: 2021-12-15 09:17+0000\n"
"POT-Creation-Date: 2022-08-02 15:36+0000\n"
"PO-Revision-Date: 2022-09-05 10:04+0000\n"
"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
"Language-Team: Icelandic <translation-team-is@lists.sourceforge.org>\n"
"Language-Team: Icelandic\n"
"Language: is\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"
"X-Generator: Lokalize 19.12.3\n"
"X-Generator: Lokalize 21.12.3\n"
#: src/grd-daemon.c:367
#: src/grd-daemon.c:480
msgid "GNOME Remote Desktop"
msgstr "Fjartengt GNOME skjáborð"
......@@ -33,8 +33,8 @@ msgid ""
"A user on the computer '%s' is trying to remotely view or control your "
"desktop."
msgstr ""
"Notandi á fjartengdu tölvunni '%s' er að reyna að skoða eða stýra skjáborðinu"
" þínu."
"Notandi á fjartengdu tölvunni '%s' er að reyna að skoða eða stýra "
"skjáborðinu þínu."
#: src/grd-prompt.c:131
msgid "Refuse"
......@@ -44,12 +44,94 @@ msgstr "Hafna"
msgid "Accept"
msgstr "Samþykkja"
#: src/grd-ctl.c:44
#, c-format
msgid "Usage: %s [OPTIONS...] COMMAND [SUBCOMMAND]...\n"
msgstr ""
#: src/grd-ctl.c:383
msgid "Commands:\n"
msgstr "Skipanir:\n"
#: src/grd-ctl.c:388
msgid ""
" rdp - RDP subcommands:\n"
" enable - Enable the RDP backend\n"
" disable - Disable the RDP backend\n"
" set-tls-cert <path-to-cert> - Set path to TLS certificate\n"
" set-tls-key <path-to-key> - Set path to TLS key\n"
" set-credentials <username> <password> - Set username and password\n"
" credentials\n"
" clear-credentials - Clear username and password\n"
" credentials\n"
" enable-view-only - Disable remote control of "
"input\n"
" devices\n"
" disable-view-only - Enable remote control of "
"input\n"
" devices\n"
"\n"
msgstr ""
#: src/grd-ctl.c:407
msgid ""
" vnc - VNC subcommands:\n"
" enable - Enable the VNC backend\n"
" disable - Disable the VNC backend\n"
" set-password <password> - Set the VNC password\n"
" clear-password - Clear the VNC password\n"
" set-auth-method password|prompt - Set the authorization method\n"
" enable-view-only - Disable remote control of "
"input\n"
" devices\n"
" disable-view-only - Enable remote control of "
"input\n"
" devices\n"
"\n"
msgstr ""
#: src/grd-ctl.c:422
msgid ""
" status [--show-credentials] - Show current status\n"
"\n"
"Options:\n"
" --help - Print this help text\n"
msgstr ""
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:7
msgid "Whether the RDP backend is enabled or not"
msgstr "Hvort RDP-bakendinn sé virkur eða ekki"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:8
msgid "If set to to 'true' the RDP backend will be initialized."
msgstr "Ef þetta er stillt á 'satt' verður RDP-bakendinn virkjaður."
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:14
msgid "Screenshare mode of RDP connections"
msgstr "Skjádeilingarhamur RDP-tenginga"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:15
msgid ""
"The screenshare mode specifies, whether the RDP backend mirrors the primary "
"screen, or whether a virtual monitor is created. For the initial resolution "
"of the virtual monitor, the RDP backend uses either the client core data "
"([MS-RDPBCGR] 2.2.1.3.2) or the client monitor data ([MS-RDPBCGR] "
"2.2.1.3.6), depending on what is available. When using a remote desktop "
"session with a virtual monitor, clients can resize the resolution of the "
"virtual monitor during a session with the Display Control Channel Extension "
"([MS-RDPEDISP]). Allowed screenshare modes include: * mirror-primary - "
"Record the primary monitor of the current user session. * extend - Create a "
"new virtual monitor and use it for the remote desktop session. The "
"resolution of this virtual monitor is derived from the monitor "
"configuration, submitted by the remote desktop client."
msgstr ""
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:41
msgid "Path to the certificate file"
msgstr "Slóð að skilríkjaskránni"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:8
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:16
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:42
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:50
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."
......@@ -57,16 +139,16 @@ msgstr ""
"Til að geta notað RDP með TLS-öryggi, verður að gefa upp slóð á einkalykils- "
"og skilríkjaskránna til RDP-þjónsins."
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:15
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:49
msgid "Path to the private key file"
msgstr "Slóð að einkalykilskránni"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:23
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:33
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:57
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:74
msgid "Only allow remote connections to view the screen content"
msgstr "Einungis leyfa fjartengingum að skoða efni á skjánum"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:24
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:58
msgid ""
"When view-only is true, remote RDP connections cannot manipulate input "
"devices (e.g. mouse and keyboard)."
......@@ -74,7 +156,15 @@ msgstr ""
"Þegar einungis-skoða er virkt, geta fjartengdir RDP-notendur ekki stjórnað "
"inntakstækjum (t.d. mús og lyklaborði)."
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:34
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:67
msgid "Whether the VNC backend is enabled or not"
msgstr "Hvort VNC-bakendinn sé virkur eða ekki"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:68
msgid "If set to to 'true' the VNC backend will be initialized."
msgstr "Ef þetta er stillt á 'satt' verður VNC-bakendinn virkjaður."
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:75
msgid ""
"When view-only is true, remote VNC connections cannot manipulate input "
"devices (e.g. mouse and keyboard)."
......@@ -82,11 +172,11 @@ msgstr ""
"Þegar einungis-skoða er virkt, geta fjartengdir VNC-notendur ekki stjórnað "
"inntakstækjum (t.d. mús og lyklaborði)."
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:41
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:82
msgid "Method used to authenticate VNC connections"
msgstr "Aðferð notuð við auðkenningu VNC-tenginga"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:42
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:83
msgid ""
"The VNC authentication method describes how a remote connection is "
"authenticated. It can currently be done in two different ways: * prompt - by "
......@@ -98,5 +188,5 @@ msgstr ""
"auðkennd. Eins og er má gera það á tvo mismunandi vegu: * prompt - biðja "
"notandann að staðfesta allar nýjar tengingar, sem krefst þess að raunveruleg "
"manneskja hafi aðgang að viðkomandi tölvu og samþykki sérstakleg nýju "
" tenginguna. * "
"password - þar sem fjartengdi notandinn þarf að gefa upp þekkt lykilorð"
"tenginguna. * password - þar sem fjartengdi notandinn þarf að gefa upp þekkt "
"lykilorð"
......@@ -5,19 +5,19 @@
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-remote-desktop\n"
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-remote-desktop/"
"issues\n"
"POT-Creation-Date: 2022-05-10 16:53+0000\n"
"PO-Revision-Date: 2022-05-13 06:48+0200\n"
"POT-Creation-Date: 2022-08-07 20:41+0000\n"
"PO-Revision-Date: 2022-08-15 21:31+0200\n"
"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
"Language-Team: Georgian <(nothing)>\n"
"Language-Team: \n"
"Language: ka\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 3.0.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.1.1\n"
#: src/grd-daemon.c:480
msgid "GNOME Remote Desktop"
......@@ -50,11 +50,11 @@ msgstr "დასტური"
msgid "Usage: %s [OPTIONS...] COMMAND [SUBCOMMAND]...\n"
msgstr "გამოყენება: %s [პარამეტრები...] ბრძანება [ქვებრძანება]...\n"
#: src/grd-ctl.c:383
#: src/grd-ctl.c:405
msgid "Commands:\n"
msgstr "ბრძანებები:\n"
#: src/grd-ctl.c:388
#: src/grd-ctl.c:410
msgid ""
" rdp - RDP subcommands:\n"
" enable - Enable the RDP backend\n"
......@@ -94,7 +94,7 @@ msgstr ""
"უფლების მიცემა\n"
"\n"
#: src/grd-ctl.c:407
#: src/grd-ctl.c:429
msgid ""
" vnc - VNC subcommands:\n"
" enable - Enable the VNC backend\n"
......@@ -124,7 +124,7 @@ msgstr ""
" უფლების მიცემა\n"
"\n"
#: src/grd-ctl.c:422
#: src/grd-ctl.c:444
msgid ""
" status [--show-credentials] - Show current status\n"
"\n"
......@@ -141,7 +141,7 @@ msgid "Whether the RDP backend is enabled or not"
msgstr "ჩართულია RDP უკანა ბოლო თუ არა"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:8
msgid "If set to 'true' the RDP backend will be initialized."
msgid "If set to to 'true' the RDP backend will be initialized."
msgstr "თუ ჩართულია, გამოყენებული იქნება RDP უკანაბოლო."
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:14
......@@ -209,7 +209,7 @@ msgid "Whether the VNC backend is enabled or not"
msgstr "ჩართულია VNC-ის უკანაბოლო თუ არა"
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:68
msgid "If set to 'true' the VNC backend will be initialized."
msgid "If set to to 'true' the VNC backend will be initialized."
msgstr "თუ ჩართულია, გამოყენებული იქნება VNC უკანაბოლო."
#: src/org.gnome.desktop.remote-desktop.gschema.xml.in:75
......
......@@ -589,7 +589,10 @@ maybe_send_next_mime_type_content_request (GrdClipboardRdp *clipboard_rdp)
g_free (mime_type_table);
maybe_send_next_mime_type_content_request (clipboard_rdp);
return;
}
g_free (mime_type_table);
}
static gboolean
......@@ -1628,6 +1631,23 @@ extract_format_data_response (GrdClipboardRdp *clipboard_rdp,
return response_ok && *data;
}
static gboolean
filedescriptorw_filename_is_valid (const WCHAR *filename)
{
uint16_t i;
if (filename[0] == L'\0')
return FALSE;
for (i = 1; i < 260; ++i)
{
if (filename[i] == L'\0')
return TRUE;
}
return FALSE;
}
static uint8_t *
get_uri_list_from_packet_file_list (GrdClipboardRdp *clipboard_rdp,
uint8_t *src_data,
......@@ -1636,7 +1656,7 @@ get_uri_list_from_packet_file_list (GrdClipboardRdp *clipboard_rdp,
gboolean has_clip_data_id,
uint32_t clip_data_id)
{
FILEDESCRIPTORW *files = NULL;
g_autofree FILEDESCRIPTORW *files = NULL;
FILEDESCRIPTORW *file;
uint32_t n_files = 0;
g_autofree char *clip_data_dir_name = NULL;
......@@ -1658,11 +1678,15 @@ get_uri_list_from_packet_file_list (GrdClipboardRdp *clipboard_rdp,
{
file = &files[i];
if (!filedescriptorw_filename_is_valid (file->cFileName))
{
g_array_free (dst_data, TRUE);
return 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, '\\'))
......@@ -1686,8 +1710,6 @@ get_uri_list_from_packet_file_list (GrdClipboardRdp *clipboard_rdp,
*dst_size = dst_data->len;
g_free (files);
return (uint8_t *) g_array_free (dst_data, FALSE);
}
......
......@@ -311,8 +311,7 @@ grd_clipboard_request_server_content_for_mime_type_async (GrdClipboard *clipboar
g_return_if_fail (klass->submit_requested_server_content);
if (!priv->enabled)
return;
g_assert (priv->enabled);
g_debug ("Clipboard[SelectionRead]: Requesting data from servers clipboard"
" (mime type: %s)", grd_mime_type_to_string (mime_type));
......@@ -375,7 +374,6 @@ grd_clipboard_update_client_mime_type_list (GrdClipboard *clipboard,
{
GrdClipboardClass *klass = GRD_CLIPBOARD_GET_CLASS (clipboard);
GrdClipboardPrivate *priv = grd_clipboard_get_instance_private (clipboard);
GList *l;
/**
* Ensure that the response with the read mime type content is sent to the
......@@ -388,8 +386,7 @@ grd_clipboard_update_client_mime_type_list (GrdClipboard *clipboard,
if (!klass->update_client_mime_type_list)
return;
for (l = mime_type_list; l; l = l->next)
g_hash_table_remove (priv->client_mime_type_tables, l->data);
g_hash_table_remove_all (priv->client_mime_type_tables);
g_debug ("Clipboard[SelectionOwnerChanged]: Updating clients clipboard");
klass->update_client_mime_type_list (clipboard, mime_type_list);
......
......@@ -116,13 +116,36 @@ grd_hwaccel_nvidia_get_cuda_damage_kernels (GrdHwAccelNvidia *hwaccel_nvidia,
*cu_simplify_dmg_arr = hwaccel_nvidia->cu_simplify_dmg_arr;
}
static const char *
get_cuda_error_string (GrdHwAccelNvidia *hwaccel_nvidia,
CUresult cu_result)
{
CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
const char *error_string = NULL;
CUresult local_cu_result;
g_assert (cuda_funcs);
g_assert (cuda_funcs->cuGetErrorString);
local_cu_result = cuda_funcs->cuGetErrorString (cu_result, &error_string);
if (G_UNLIKELY (local_cu_result != CUDA_SUCCESS))
g_warning ("[HWAccel.CUDA] cuGetErrorString() failed: %i", local_cu_result);
return error_string;
}
void
grd_hwaccel_nvidia_push_cuda_context (GrdHwAccelNvidia *hwaccel_nvidia)
{
CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
CUresult cu_result;
if (cuda_funcs->cuCtxPushCurrent (hwaccel_nvidia->cu_context) != CUDA_SUCCESS)
g_error ("[HWAccel.CUDA] Failed to push CUDA context");
cu_result = cuda_funcs->cuCtxPushCurrent (hwaccel_nvidia->cu_context);
if (cu_result != CUDA_SUCCESS)
{
g_error ("[HWAccel.CUDA] Failed to push CUDA context: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
}
}
void
......@@ -139,12 +162,15 @@ grd_hwaccel_nvidia_register_read_only_gl_buffer (GrdHwAccelNvidia *hwaccel_nvi
uint32_t buffer)
{
ExtraCudaFunctions *extra_cuda_funcs = hwaccel_nvidia->extra_cuda_funcs;
CUresult cu_result;
if (extra_cuda_funcs->cuGraphicsGLRegisterBuffer (
cuda_resource, buffer,
CU_GRAPHICS_REGISTER_FLAGS_READ_ONLY) != CUDA_SUCCESS)
cu_result =
extra_cuda_funcs->cuGraphicsGLRegisterBuffer (cuda_resource, buffer,
CU_GRAPHICS_REGISTER_FLAGS_READ_ONLY);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to register GL buffer");
g_warning ("[HWAccel.CUDA] Failed to register GL buffer: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
return FALSE;
}
......@@ -169,17 +195,22 @@ grd_hwaccel_nvidia_map_cuda_resource (GrdHwAccelNvidia *hwaccel_nvidia,
{
CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
ExtraCudaFunctions *extra_cuda_funcs = hwaccel_nvidia->extra_cuda_funcs;
CUresult cu_result;
if (cuda_funcs->cuGraphicsMapResources (1, &cuda_resource,
cuda_stream) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuGraphicsMapResources (1, &cuda_resource,
cuda_stream);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to map resources");
g_warning ("[HWAccel.CUDA] Failed to map resources: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
return FALSE;
}
if (extra_cuda_funcs->cuGraphicsResourceGetMappedPointer (dev_ptr, size,
cuda_resource) != CUDA_SUCCESS)
cu_result = extra_cuda_funcs->cuGraphicsResourceGetMappedPointer (dev_ptr, size,
cuda_resource);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to get mapped pointer");
g_warning ("[HWAccel.CUDA] Failed to get mapped pointer: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
cuda_funcs->cuGraphicsUnmapResources (1, &cuda_resource, cuda_stream);
return FALSE;
}
......@@ -201,11 +232,13 @@ grd_hwaccel_nvidia_create_cuda_stream (GrdHwAccelNvidia *hwaccel_nvidia,
CUstream *cuda_stream)
{
CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
CUresult cu_result;
if (cuda_funcs->cuStreamCreate (cuda_stream,
CU_STREAM_NON_BLOCKING) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuStreamCreate (cuda_stream, CU_STREAM_NON_BLOCKING);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to create stream");
g_warning ("[HWAccel.CUDA] Failed to create stream: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
return FALSE;
}
......@@ -226,10 +259,13 @@ grd_hwaccel_nvidia_alloc_mem (GrdHwAccelNvidia *hwaccel_nvidia,
size_t size)
{
CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
CUresult cu_result;
if (cuda_funcs->cuMemAlloc (device_ptr, size) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuMemAlloc (device_ptr, size);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to allocate memory");
g_warning ("[HWAccel.CUDA] Failed to allocate memory: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
return FALSE;
}
......@@ -261,6 +297,18 @@ get_next_free_encode_session_id (GrdHwAccelNvidia *hwaccel_nvidia)
return encode_session_id;
}
static const char *
get_last_nvenc_error_string (GrdHwAccelNvidia *hwaccel_nvidia,
void *encoder)
{
NV_ENCODE_API_FUNCTION_LIST *nvenc_api = &hwaccel_nvidia->nvenc_api;
g_assert (nvenc_api);
g_assert (nvenc_api->nvEncGetLastErrorString);
return nvenc_api->nvEncGetLastErrorString (encoder);
}
gboolean
grd_hwaccel_nvidia_create_nvenc_session (GrdHwAccelNvidia *hwaccel_nvidia,
uint32_t *encode_session_id,
......@@ -292,7 +340,8 @@ grd_hwaccel_nvidia_create_nvenc_session (GrdHwAccelNvidia *hwaccel_nvidia,
if (hwaccel_nvidia->nvenc_api.nvEncOpenEncodeSessionEx (
&open_params, &encode_session->encoder) != NV_ENC_SUCCESS)
{
g_debug ("[HWAccel.NVENC] Failed to open encode session");
g_debug ("[HWAccel.NVENC] Failed to open encode session: %s",
get_last_nvenc_error_string (hwaccel_nvidia, encode_session->encoder));
g_free (encode_session);
return FALSE;
}
......@@ -326,7 +375,8 @@ grd_hwaccel_nvidia_create_nvenc_session (GrdHwAccelNvidia *hwaccel_nvidia,
{
NV_ENC_PIC_PARAMS pic_params = {0};
g_warning ("[HWAccel.NVENC] Failed to initialize encoder");
g_warning ("[HWAccel.NVENC] Failed to initialize encoder: %s",
get_last_nvenc_error_string (hwaccel_nvidia, encode_session->encoder));
pic_params.encodePicFlags = NV_ENC_PIC_FLAG_EOS;
hwaccel_nvidia->nvenc_api.nvEncEncodePicture (encode_session->encoder,
&pic_params);
......@@ -342,7 +392,8 @@ grd_hwaccel_nvidia_create_nvenc_session (GrdHwAccelNvidia *hwaccel_nvidia,
{
NV_ENC_PIC_PARAMS pic_params = {0};
g_warning ("[HWAccel.NVENC] Failed to create bitstream buffer");
g_warning ("[HWAccel.NVENC] Failed to create bitstream buffer: %s",
get_last_nvenc_error_string (hwaccel_nvidia, encode_session->encoder));
pic_params.encodePicFlags = NV_ENC_PIC_FLAG_EOS;
hwaccel_nvidia->nvenc_api.nvEncEncodePicture (encode_session->encoder,
&pic_params);
......@@ -407,6 +458,7 @@ grd_hwaccel_nvidia_avc420_encode_bgrx_frame (GrdHwAccelNvidia *hwaccel_nvidia,
uint16_t aligned_height,
CUstream cuda_stream)
{
CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
NvEncEncodeSession *encode_session;
NV_ENC_REGISTER_RESOURCE register_res = {0};
NV_ENC_MAP_INPUT_RESOURCE map_input_res = {0};
......@@ -414,6 +466,7 @@ grd_hwaccel_nvidia_avc420_encode_bgrx_frame (GrdHwAccelNvidia *hwaccel_nvidia,
unsigned int grid_dim_x, grid_dim_y, grid_dim_z;
unsigned int block_dim_x, block_dim_y, block_dim_z;
void *args[7];
CUresult cu_result;
if (!g_hash_table_lookup_extended (hwaccel_nvidia->encode_sessions,
GUINT_TO_POINTER (encode_session_id),
......@@ -450,17 +503,22 @@ grd_hwaccel_nvidia_avc420_encode_bgrx_frame (GrdHwAccelNvidia *hwaccel_nvidia,
args[5] = &aligned_height;
args[6] = &aligned_width;
if (hwaccel_nvidia->cuda_funcs->cuLaunchKernel (
hwaccel_nvidia->cu_bgrx_to_yuv420, grid_dim_x, grid_dim_y, grid_dim_z,
block_dim_x, block_dim_y, block_dim_z, 0, cuda_stream, args, NULL) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuLaunchKernel (hwaccel_nvidia->cu_bgrx_to_yuv420,
grid_dim_x, grid_dim_y, grid_dim_z,
block_dim_x, block_dim_y, block_dim_z,
0, cuda_stream, args, NULL);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to launch BGRX_TO_YUV420 kernel");
g_warning ("[HWAccel.CUDA] Failed to launch BGRX_TO_YUV420 kernel: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
return FALSE;
}
if (hwaccel_nvidia->cuda_funcs->cuStreamSynchronize (cuda_stream) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuStreamSynchronize (cuda_stream);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to synchronize stream");
g_warning ("[HWAccel.CUDA] Failed to synchronize stream: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
return FALSE;
}
......@@ -476,7 +534,8 @@ grd_hwaccel_nvidia_avc420_encode_bgrx_frame (GrdHwAccelNvidia *hwaccel_nvidia,
if (hwaccel_nvidia->nvenc_api.nvEncRegisterResource (
encode_session->encoder, &register_res) != NV_ENC_SUCCESS)
{
g_warning ("[HWAccel.NVENC] Failed to register resource");
g_warning ("[HWAccel.NVENC] Failed to register resource: %s",
get_last_nvenc_error_string (hwaccel_nvidia, encode_session->encoder));
return FALSE;
}
......@@ -486,7 +545,8 @@ grd_hwaccel_nvidia_avc420_encode_bgrx_frame (GrdHwAccelNvidia *hwaccel_nvidia,
if (hwaccel_nvidia->nvenc_api.nvEncMapInputResource (
encode_session->encoder, &map_input_res) != NV_ENC_SUCCESS)
{
g_warning ("[HWAccel.NVENC] Failed to map input resource");
g_warning ("[HWAccel.NVENC] Failed to map input resource: %s",
get_last_nvenc_error_string (hwaccel_nvidia, encode_session->encoder));
hwaccel_nvidia->nvenc_api.nvEncUnregisterResource (encode_session->encoder,
register_res.registeredResource);
return FALSE;
......@@ -504,7 +564,8 @@ grd_hwaccel_nvidia_avc420_encode_bgrx_frame (GrdHwAccelNvidia *hwaccel_nvidia,
if (hwaccel_nvidia->nvenc_api.nvEncEncodePicture (
encode_session->encoder, &pic_params) != NV_ENC_SUCCESS)
{
g_warning ("[HWAccel.NVENC] Failed to encode frame");
g_warning ("[HWAccel.NVENC] Failed to encode frame: %s",
get_last_nvenc_error_string (hwaccel_nvidia, encode_session->encoder));
hwaccel_nvidia->nvenc_api.nvEncUnmapInputResource (encode_session->encoder,
map_input_res.mappedResource);
hwaccel_nvidia->nvenc_api.nvEncUnregisterResource (encode_session->encoder,
......@@ -543,7 +604,8 @@ grd_hwaccel_nvidia_avc420_retrieve_bitstream (GrdHwAccelNvidia *hwaccel_nvidia,
if (nvenc_api->nvEncLockBitstream (encode_session->encoder,
&lock_bitstream) != NV_ENC_SUCCESS)
{
g_warning ("[HWAccel.NVENC] Failed to lock bitstream");
g_warning ("[HWAccel.NVENC] Failed to lock bitstream: %s",
get_last_nvenc_error_string (hwaccel_nvidia, encode_session->encoder));
goto out;
}
......@@ -697,10 +759,13 @@ load_cuda_module (GrdHwAccelNvidia *hwaccel_nvidia,
const char *ptx_instructions)
{
CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
CUresult cu_result;
if (cuda_funcs->cuModuleLoadData (module, ptx_instructions) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuModuleLoadData (module, ptx_instructions);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to load %s module", name);
g_warning ("[HWAccel.CUDA] Failed to load %s module: %s",
name, get_cuda_error_string (hwaccel_nvidia, cu_result));
return FALSE;
}
......@@ -714,10 +779,13 @@ load_cuda_function (GrdHwAccelNvidia *hwaccel_nvidia,
const char *name)
{
CudaFunctions *cuda_funcs = hwaccel_nvidia->cuda_funcs;
CUresult cu_result;
if (cuda_funcs->cuModuleGetFunction (function, module, name) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuModuleGetFunction (function, module, name);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to get kernel %s", name);
g_warning ("[HWAccel.CUDA] Failed to get kernel %s: %s",
name, get_cuda_error_string (hwaccel_nvidia, cu_result));
return FALSE;
}
......@@ -739,6 +807,7 @@ grd_hwaccel_nvidia_new (GrdEglThread *egl_thread)
g_autofree char *avc_ptx_path = NULL;
g_autofree char *avc_ptx_instructions = NULL;
g_autoptr (GError) error = NULL;
CUresult cu_result;
unsigned int i;
hwaccel_nvidia = g_object_new (GRD_TYPE_HWACCEL_NVIDIA, NULL);
......@@ -761,9 +830,11 @@ grd_hwaccel_nvidia_new (GrdEglThread *egl_thread)
cuda_funcs = hwaccel_nvidia->cuda_funcs;
nvenc_funcs = hwaccel_nvidia->nvenc_funcs;
if (cuda_funcs->cuInit (0) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuInit (0);
if (cu_result != CUDA_SUCCESS)
{
g_debug ("[HWAccel.CUDA] Failed to initialize CUDA");
g_debug ("[HWAccel.CUDA] Failed to initialize CUDA: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
return NULL;
}
if (!get_cuda_devices_from_gl_context (hwaccel_nvidia, egl_thread,
......@@ -798,10 +869,12 @@ grd_hwaccel_nvidia_new (GrdEglThread *egl_thread)
}
hwaccel_nvidia->cu_device = cu_device;
if (cuda_funcs->cuDevicePrimaryCtxRetain (&hwaccel_nvidia->cu_context,
hwaccel_nvidia->cu_device) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuDevicePrimaryCtxRetain (&hwaccel_nvidia->cu_context,
hwaccel_nvidia->cu_device);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to retain CUDA context");
g_warning ("[HWAccel.CUDA] Failed to retain CUDA context: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
return NULL;
}
......@@ -813,9 +886,11 @@ grd_hwaccel_nvidia_new (GrdEglThread *egl_thread)
return NULL;
}
if (cuda_funcs->cuCtxPushCurrent (hwaccel_nvidia->cu_context) != CUDA_SUCCESS)
cu_result = cuda_funcs->cuCtxPushCurrent (hwaccel_nvidia->cu_context);
if (cu_result != CUDA_SUCCESS)
{
g_warning ("[HWAccel.CUDA] Failed to push CUDA context");
g_warning ("[HWAccel.CUDA] Failed to push CUDA context: %s",
get_cuda_error_string (hwaccel_nvidia, cu_result));
cuda_funcs->cuDevicePrimaryCtxRelease (hwaccel_nvidia->cu_device);
return NULL;
}
......
......@@ -579,6 +579,9 @@ is_fuse_file_parent (gpointer key,
FuseFile *fuse_file = value;
const char *parent_path = user_data;
if (!fuse_file->is_directory)
return FALSE;
if (strcmp (parent_path, fuse_file->filename_with_root) == 0)
return TRUE;
......
......@@ -40,6 +40,8 @@ struct _GrdRdpGfxSurface
uint16_t width;
uint16_t height;
gboolean is_auxiliary_surface;
GrdRdpGfxSurface *render_surface;
GrdRdpGfxFrameController *frame_controller;
......@@ -83,6 +85,12 @@ grd_rdp_gfx_surface_get_height (GrdRdpGfxSurface *gfx_surface)
return gfx_surface->height;
}
gboolean
grd_rdp_gfx_surface_is_auxiliary_surface (GrdRdpGfxSurface *gfx_surface)
{
return gfx_surface->is_auxiliary_surface;
}
gboolean
grd_rdp_gfx_surface_disallows_hwaccel_sessions (GrdRdpGfxSurface *gfx_surface)
{
......@@ -105,6 +113,7 @@ grd_rdp_gfx_surface_override_render_surface (GrdRdpGfxSurface *gfx_surface,
g_assert (!gfx_surface->render_surface);
gfx_surface->render_surface = render_surface;
render_surface->is_auxiliary_surface = TRUE;
}
GrdRdpGfxFrameController *
......
......@@ -65,6 +65,8 @@ uint16_t grd_rdp_gfx_surface_get_width (GrdRdpGfxSurface *gfx_surface);
uint16_t grd_rdp_gfx_surface_get_height (GrdRdpGfxSurface *gfx_surface);
gboolean grd_rdp_gfx_surface_is_auxiliary_surface (GrdRdpGfxSurface *gfx_surface);
gboolean grd_rdp_gfx_surface_disallows_hwaccel_sessions (GrdRdpGfxSurface *gfx_surface);
GrdRdpGfxSurface *grd_rdp_gfx_surface_get_render_surface (GrdRdpGfxSurface *gfx_surface);
......
......@@ -169,6 +169,8 @@ grd_rdp_graphics_pipeline_create_surface (GrdRdpGraphicsPipeline *graphics_pipel
uint16_t aligned_width;
uint16_t aligned_height;
g_debug ("[RDP.RDPGFX] Creating surface with id %u", surface_id);
surface_context = g_malloc0 (sizeof (GfxSurfaceContext));
g_mutex_lock (&graphics_pipeline->gfx_mutex);
......@@ -193,7 +195,7 @@ grd_rdp_graphics_pipeline_create_surface (GrdRdpGraphicsPipeline *graphics_pipel
uint16_t aligned_width_16;
uint16_t aligned_height_16;
g_debug ("[RDP.RDPGFX] Creating NVENC session for surface %u", surface_id);
g_debug ("[RDP.RDPGFX] Created NVENC session for surface %u", surface_id);
aligned_width_16 = grd_get_aligned_size (surface_width, 16);
aligned_height_16 = grd_get_aligned_size (surface_height, 16);
......@@ -223,9 +225,6 @@ grd_rdp_graphics_pipeline_create_surface (GrdRdpGraphicsPipeline *graphics_pipel
g_autoptr (GrdRdpGfxSurface) render_surface = NULL;
GrdRdpGfxSurfaceDescriptor surface_descriptor = {};
g_debug ("[RDP.RDPGFX] Creating separate render surface for surface %u",
surface_id);
surface_descriptor.flags = GRD_RDP_GFX_SURFACE_FLAG_ALIGNED_SIZE |
GRD_RDP_GFX_SURFACE_FLAG_NO_HWACCEL_SESSIONS;
surface_descriptor.surface_id = get_next_free_surface_id (graphics_pipeline);
......@@ -235,6 +234,9 @@ grd_rdp_graphics_pipeline_create_surface (GrdRdpGraphicsPipeline *graphics_pipel
surface_descriptor.aligned_width = aligned_width;
surface_descriptor.aligned_height = aligned_height;
g_debug ("[RDP.RDPGFX] Creating separate render surface (id %u) for "
"surface %u", surface_descriptor.surface_id, surface_id);
render_surface = grd_rdp_gfx_surface_new (graphics_pipeline,
&surface_descriptor);
grd_rdp_gfx_surface_override_render_surface (gfx_surface,
......@@ -264,6 +266,8 @@ grd_rdp_graphics_pipeline_delete_surface (GrdRdpGraphicsPipeline *graphics_pipel
codec_context_id = grd_rdp_gfx_surface_get_codec_context_id (gfx_surface);
surface_serial = grd_rdp_gfx_surface_get_serial (gfx_surface);
g_debug ("[RDP.RDPGFX] Deleting surface with id %u", surface_id);
g_mutex_lock (&graphics_pipeline->gfx_mutex);
if (!g_hash_table_lookup_extended (graphics_pipeline->serial_surface_table,
GUINT_TO_POINTER (surface_serial),
......@@ -313,6 +317,23 @@ grd_rdp_graphics_pipeline_delete_surface (GrdRdpGraphicsPipeline *graphics_pipel
rdpgfx_context->DeleteSurface (rdpgfx_context, &delete_surface);
}
static GList *
get_main_surfaces_from_surface_list (GList *surfaces)
{
GList *main_surfaces = NULL;
GList *l;
for (l = surfaces; l; l = l->next)
{
GrdRdpGfxSurface *gfx_surface = l->data;
if (!grd_rdp_gfx_surface_is_auxiliary_surface (gfx_surface))
main_surfaces = g_list_append (main_surfaces, gfx_surface);
}
return main_surfaces;
}
void
grd_rdp_graphics_pipeline_reset_graphics (GrdRdpGraphicsPipeline *graphics_pipeline,
uint32_t width,
......@@ -322,6 +343,7 @@ grd_rdp_graphics_pipeline_reset_graphics (GrdRdpGraphicsPipeline *graphics_pipel
{
RdpgfxServerContext *rdpgfx_context = graphics_pipeline->rdpgfx_context;
RDPGFX_RESET_GRAPHICS_PDU reset_graphics = {0};
GList *main_surfaces;
GList *surfaces;
GList *l;
......@@ -333,7 +355,10 @@ grd_rdp_graphics_pipeline_reset_graphics (GrdRdpGraphicsPipeline *graphics_pipel
g_hash_table_steal_all (graphics_pipeline->surface_table);
g_mutex_unlock (&graphics_pipeline->gfx_mutex);
for (l = surfaces; l; l = l->next)
main_surfaces = get_main_surfaces_from_surface_list (surfaces);
g_list_free (surfaces);
for (l = main_surfaces; l; l = l->next)
{
GrdRdpGfxSurface *gfx_surface = l->data;
GrdRdpSurface *rdp_surface;
......@@ -341,7 +366,7 @@ grd_rdp_graphics_pipeline_reset_graphics (GrdRdpGraphicsPipeline *graphics_pipel
rdp_surface = grd_rdp_gfx_surface_get_rdp_surface (gfx_surface);
g_clear_object (&rdp_surface->gfx_surface);
}
g_list_free (surfaces);
g_list_free (main_surfaces);
/*
* width and height refer here to the size of the Graphics Output Buffer
......@@ -1466,6 +1491,7 @@ grd_rdp_graphics_pipeline_new (GrdSessionRdp *session_rdp,
static void
reset_graphics_pipeline (GrdRdpGraphicsPipeline *graphics_pipeline)
{
GList *main_surfaces;
GList *surfaces;
GList *l;
......@@ -1478,7 +1504,10 @@ reset_graphics_pipeline (GrdRdpGraphicsPipeline *graphics_pipeline)
frame_serial_free, graphics_pipeline);
g_mutex_unlock (&graphics_pipeline->gfx_mutex);
for (l = surfaces; l; l = l->next)
main_surfaces = get_main_surfaces_from_surface_list (surfaces);
g_list_free (surfaces);
for (l = main_surfaces; l; l = l->next)
{
GrdRdpGfxSurface *gfx_surface = l->data;
GrdRdpSurface *rdp_surface;
......@@ -1486,7 +1515,7 @@ reset_graphics_pipeline (GrdRdpGraphicsPipeline *graphics_pipeline)
rdp_surface = grd_rdp_gfx_surface_get_rdp_surface (gfx_surface);
g_clear_object (&rdp_surface->gfx_surface);
}
g_list_free (surfaces);
g_list_free (main_surfaces);
g_mutex_lock (&graphics_pipeline->gfx_mutex);
graphics_pipeline->frame_acks_suspended = FALSE;
......
......@@ -147,7 +147,7 @@ verify_monitor_config (GrdRdpMonitorConfig *monitor_config)
for (i = 0; i < monitor_config->monitor_count; ++i)
{
rect.x = monitor_config->virtual_monitors[i].pos_x;
rect.y = monitor_config->virtual_monitors[i].pos_x;
rect.y = monitor_config->virtual_monitors[i].pos_y;
rect.width = monitor_config->virtual_monitors[i].width;
rect.height = monitor_config->virtual_monitors[i].height;
......
......@@ -183,8 +183,10 @@ update_ping_source (GrdRdpNetworkAutodetection *network_autodetection)
else
new_ping_interval_type = PING_INTERVAL_LOW;
if (network_autodetection->ping_interval != new_ping_interval_type &&
network_autodetection->ping_source)
if (network_autodetection->ping_interval == new_ping_interval_type)
return;
if (network_autodetection->ping_source)
{
g_source_destroy (network_autodetection->ping_source);
g_clear_pointer (&network_autodetection->ping_source, g_source_unref);
......@@ -343,7 +345,7 @@ track_round_trip_time (GrdRdpNetworkAutodetection *network_autodetection,
RTTInfo *rtt_info;
rtt_info = g_malloc0 (sizeof (RTTInfo));
rtt_info->round_trip_time_us = MIN (pong_time_us - ping_time_us, G_USEC_PER_SEC);
rtt_info->round_trip_time_us = pong_time_us - ping_time_us;
rtt_info->response_time_us = pong_time_us;
g_queue_push_tail (network_autodetection->round_trip_times, rtt_info);
......
......@@ -132,8 +132,6 @@ struct _GrdRdpPipeWireStream
uint32_t src_node_id;
struct spa_video_info_raw spa_format;
gboolean destroyed;
};
G_DEFINE_TYPE (GrdRdpPipeWireStream, grd_rdp_pipewire_stream,
......@@ -907,7 +905,7 @@ process_frame_data (GrdRdpPipeWireStream *stream,
}
else
{
callback (stream, g_steal_pointer (&frame), TRUE, user_data);
g_assert_not_reached ();
}
}
......@@ -978,9 +976,6 @@ on_stream_process (void *user_data)
struct pw_buffer *last_frame_buffer = NULL;
struct pw_buffer *next_buffer;
if (stream->destroyed)
return;
while ((next_buffer = pw_stream_dequeue_buffer (stream->pipewire_stream)))
{
if (grd_pipewire_buffer_has_pointer_bitmap (next_buffer))
......@@ -1289,21 +1284,15 @@ grd_rdp_pipewire_stream_finalize (GObject *object)
GrdContext *context = grd_session_get_context (session);
GrdEglThread *egl_thread;
stream->destroyed = TRUE;
/* Setting a PipeWire stream inactive will wait for the data thread to end */
if (stream->pipewire_stream)
pw_stream_flush (stream->pipewire_stream, false);
pw_stream_set_active (stream->pipewire_stream, false);
egl_thread = grd_context_get_egl_thread (context);
if (egl_thread && stream->pipewire_stream)
sync_egl_thread (egl_thread);
/*
* We can't clear stream->pipewire_stream before destroying it, as the data
* thread in PipeWire might access the variable during destruction.
*/
if (stream->pipewire_stream)
pw_stream_destroy (stream->pipewire_stream);
g_clear_pointer (&stream->pipewire_stream, pw_stream_destroy);
g_clear_pointer (&stream->pipewire_core, pw_core_disconnect);
g_clear_pointer (&stream->pipewire_context, pw_context_destroy);
......
......@@ -31,7 +31,6 @@
#include "grd-hwaccel-nvidia.h"
#include "grd-session-rdp.h"
enum
{
PROP_0,
......
......@@ -1659,6 +1659,14 @@ rdp_peer_capabilities (freerdp_peer *peer)
session_rdp->monitor_config->monitor_count = 1;
}
if ((rdp_settings->SupportGraphicsPipeline || rdp_settings->RemoteFxCodec ||
rdp_settings->NSCodec) &&
rdp_settings->ColorDepth != 32)
{
g_debug ("[RDP] Fixing invalid colour depth set by client");
rdp_settings->ColorDepth = 32;
}
switch (rdp_settings->ColorDepth)
{
case 32:
......@@ -1818,6 +1826,7 @@ rdp_peer_context_free (freerdp_peer *peer,
if (!rdp_peer_context)
return;
if (rdp_peer_context->vcm != INVALID_HANDLE_VALUE)
g_clear_pointer (&rdp_peer_context->vcm, WTSCloseServer);
if (rdp_peer_context->encode_stream)
......@@ -1860,9 +1869,9 @@ rdp_peer_context_new (freerdp_peer *peer,
rdp_peer_context->planar_flags |= PLANAR_FORMAT_HEADER_RLE;
rdp_peer_context->vcm = WTSOpenServerA ((LPSTR) peer->context);
if (!rdp_peer_context->vcm)
if (!rdp_peer_context->vcm || rdp_peer_context->vcm == INVALID_HANDLE_VALUE)
{
g_warning ("[RDP] Failed to retrieve VCM handle");
g_warning ("[RDP] Failed to create virtual channel manager");
rdp_peer_context_free (peer, rdp_peer_context);
return FALSE;
}
......
......@@ -480,8 +480,6 @@ grd_session_enable_clipboard (GrdSession *session,
if (!priv->remote_desktop_session)
return FALSE;
priv->clipboard = clipboard;
options_variant = serialize_clipboard_options (mime_type_tables);
if (!grd_dbus_remote_desktop_session_call_enable_clipboard_sync (
priv->remote_desktop_session, options_variant, NULL, &error))
......@@ -489,6 +487,7 @@ grd_session_enable_clipboard (GrdSession *session,
g_warning ("Failed to enable clipboard: %s", error->message);
return FALSE;
}
priv->clipboard = clipboard;
return TRUE;
}
......