Hello community,

here is the log from the commit of package remmina for openSUSE:Factory checked 
in at 2018-08-29 12:26:15
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/remmina (Old)
 and      /work/SRC/openSUSE:Factory/.remmina.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "remmina"

Wed Aug 29 12:26:15 2018 rev:28 rq:631905 version:1.2.31.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/remmina/remmina.changes  2018-08-10 
09:49:55.978284929 +0200
+++ /work/SRC/openSUSE:Factory/.remmina.new/remmina.changes     2018-08-29 
12:26:16.003536492 +0200
@@ -1,0 +2,20 @@
+Mon Aug 27 11:35:08 UTC 2018 - [email protected]
+
+- Upgraded to 1.2.31.4
+  * Enhancements
+    - Improving file type hadling.
+  * Fixed bugs
+    - Fix KB grabbing when switching workspace.
+    - Fix some possible crashes when reading a remminafile.
+    - Fixes a crash deleting XDMCP profile.
+    - Fixing libssh deprecations.
+
+- Upgraded to 1.2.31.3
+  * Enhancements
+    - Implement send ctrl+alt+fn keys.
+  * Fixed bugs
+    - Do not send stats if the remmina.pref file is read.
+    - cmake: include libssh_threads only when available.
+    - Set program class to REMMINA_APP_ID
+
+-------------------------------------------------------------------

Old:
----
  Remmina-v1.2.31.2.tar.bz2

New:
----
  Remmina-v1.2.31.4.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ remmina.spec ++++++
--- /var/tmp/diff_new_pack.kB7dRI/_old  2018-08-29 12:26:16.619537842 +0200
+++ /var/tmp/diff_new_pack.kB7dRI/_new  2018-08-29 12:26:16.627537859 +0200
@@ -18,7 +18,7 @@
 
 %bcond_with nx
 Name:           remmina
-Version:        1.2.31.2
+Version:        1.2.31.4
 Release:        0
 Summary:        Versatile Remote Desktop Client
 License:        GPL-2.0-or-later
@@ -190,6 +190,8 @@
 
 %fdupes %{buildroot}%{_datadir}/remmina
 
+%fdupes %{buildroot}%{_datadir}/icons/hicolor/*/actions
+
 %find_lang %{name}
 
 # Begin: all icons/desktop updates only for suse < 1500

++++++ Remmina-v1.2.31.2.tar.bz2 -> Remmina-v1.2.31.4.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/CHANGELOG.md 
new/Remmina-v1.2.31.4/CHANGELOG.md
--- old/Remmina-v1.2.31.2/CHANGELOG.md  2018-07-31 14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/CHANGELOG.md  2018-08-24 15:40:04.000000000 +0200
@@ -1,5 +1,37 @@
 # Changelog
 
+## [v1.2.31.4](https://gitlab.com/Remmina/Remmina/tags/v1.2.31.4) (2018-08-24)
+
+This is a bug fixing release.
+
+**Fixed bugs:**
+
+- Fix KB grabbing when switching workspace.
+- Fix some possible crashes when reading a remminafile.
+- Fixes a crash deleting XDMCP profile.
+- Fixing libssh deprecations.
+
+**Implemented enhancements:**
+
+- Improving file type hadling.
+- flatpak: update libssh from 0.7.5 to 0.8.1
+- flatpak: update freerdp from 2.0.0-rc2 to 2.0.0-rc3
+- Snap: update to libssh 0.8.0.
+
+## [v1.2.31.3](https://gitlab.com/Remmina/Remmina/tags/v1.2.31.3) (2018-08-14)
+
+This is a bug fixing release.
+
+**Fixed bugs:**
+
+- Do not send stats if the remmina.pref file is read-only.
+- cmake: include libssh_threads only when available.
+- Set program class to REMMINA_APP_ID, fixes #1706.
+
+**Implemented enhancements:**
+
+- Implement send ctrl+alt+fn keys. Closes #1707.
+
 ## [v1.2.31.1](https://gitlab.com/Remmina/Remmina/tags/v1.2.31.1) (2018-07-31)
 
 This is a bug fixing release.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/CMakeLists.txt 
new/Remmina-v1.2.31.4/CMakeLists.txt
--- old/Remmina-v1.2.31.2/CMakeLists.txt        2018-07-31 14:53:53.000000000 
+0200
+++ new/Remmina-v1.2.31.4/CMakeLists.txt        2018-08-24 15:40:04.000000000 
+0200
@@ -99,7 +99,7 @@
 set(REMMINA_VERSION_MAJOR "1")
 set(REMMINA_VERSION_MINOR "2")
 set(REMMINA_VERSION_REVISION "31")
-set(REMMINA_VERSION_SUFFIX "2")
+set(REMMINA_VERSION_SUFFIX "4")
 #set(REMMINA_VERSION 
"${REMMINA_VERSION_MAJOR}.${REMMINA_VERSION_MINOR}.${REMMINA_VERSION_REVISION}")
 set(REMMINA_VERSION 
"${REMMINA_VERSION_MAJOR}.${REMMINA_VERSION_MINOR}.${REMMINA_VERSION_REVISION}.${REMMINA_VERSION_SUFFIX}")
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/README.md 
new/Remmina-v1.2.31.4/README.md
--- old/Remmina-v1.2.31.2/README.md     2018-07-31 14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/README.md     2018-08-24 15:40:04.000000000 +0200
@@ -180,7 +180,7 @@
 ### From the source code
 
 Follow the guides available on the wiki:
-* [Wiki and compilation instructions](https://github.com/FreeRDP/Remmina/wiki)
+* [Wiki and compilation 
instructions](https://gitlab.com/Remmina/Remmina/wikis/home)
 
 ## Usage
 
@@ -256,7 +256,7 @@
 
 ## Resources
 
- * [Wiki and compilation instructions](https://github.com/FreeRDP/Remmina/wiki)
+ * [Wiki and compilation 
instructions](https://gitlab.com/Remmina/Remmina/wikis/home)
  * [G+ Remmina 
community](https://plus.google.com/communities/106276095923371962010)
  * [Website](http://www.remmina.org)
  * IRC we are on freenode.net , in the channel #remmina, you can also use a 
[web client](https://webchat.freenode.net/) in case
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/cmake/FindLIBSSH.cmake 
new/Remmina-v1.2.31.4/cmake/FindLIBSSH.cmake
--- old/Remmina-v1.2.31.2/cmake/FindLIBSSH.cmake        2018-07-31 
14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/cmake/FindLIBSSH.cmake        2018-08-24 
15:40:04.000000000 +0200
@@ -51,7 +51,11 @@
 
 find_package_handle_standard_args(LIBSSH DEFAULT_MSG LIBSSH_LIBRARY 
LIBSSH_INCLUDE_DIR)
 
-set(LIBSSH_LIBRARIES ${LIBSSH_LIBRARY} ${LIBSSH_THREADS_LIBRARY})
+if (LIBSSH_THREADS_LIBRARY)
+       set(LIBSSH_LIBRARIES ${LIBSSH_LIBRARY} ${LIBSSH_THREADS_LIBRARY})
+else()
+       set(LIBSSH_LIBRARIES ${LIBSSH_LIBRARY})
+endif()
 set(LIBSSH_INCLUDE_DIRS ${LIBSSH_INCLUDE_DIR})
 
 mark_as_advanced(LIBSSH_INCLUDE_DIR LIBSSH_LIBRARY)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Remmina-v1.2.31.2/data/desktop/remmina-file.desktop.in 
new/Remmina-v1.2.31.4/data/desktop/remmina-file.desktop.in
--- old/Remmina-v1.2.31.2/data/desktop/remmina-file.desktop.in  2018-07-31 
14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/data/desktop/remmina-file.desktop.in  2018-08-24 
15:40:04.000000000 +0200
@@ -1,10 +1,18 @@
 [Desktop Entry]
-Name=Remmina Remote File
+Version=1.0
+Type=Application
+Name=Remmina Connect
 Comment=Access remote desktops with Remmina
+TryExec=@REMMINA_BINARY_PATH@
 Exec=@REMMINA_BINARY_PATH@ --connect %U
 Icon=@REMMINA_ICON@
+MimeType=application/x-remmina;
+Actions=Edit;
 Terminal=false
-Type=Application
 StartupNotify=true
-MimeType=application/x-remmina;
 NoDisplay=true
+X-Desktop-File-Install-Version=0.24
+
+[Desktop Action Edit]
+Name=Remmina Edit
+Exec=@REMMINA_BINARY_PATH@ --edit %U
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/data/desktop/remmina-gnome.1 
new/Remmina-v1.2.31.4/data/desktop/remmina-gnome.1
--- old/Remmina-v1.2.31.2/data/desktop/remmina-gnome.1  2018-07-31 
14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/data/desktop/remmina-gnome.1  2018-08-24 
15:40:04.000000000 +0200
@@ -13,4 +13,3 @@
 .Xr remmina 1
 .Sh AUTHORS
 .An Antenore Gatta Aq Mt [email protected]
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/flatpak/org.remmina.Remmina.json 
new/Remmina-v1.2.31.4/flatpak/org.remmina.Remmina.json
--- old/Remmina-v1.2.31.2/flatpak/org.remmina.Remmina.json      2018-07-31 
14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/flatpak/org.remmina.Remmina.json      2018-08-24 
15:40:04.000000000 +0200
@@ -128,8 +128,8 @@
                 {
                     "type": "git",
                     "url": "https://github.com/FreeRDP/FreeRDP.git";,
-                    "tag": "2.0.0-rc2",
-                    "commit": "7a7b180277a9c04809bf07a54882d7c33eeeb9f9"
+                    "tag": "2.0.0-rc3",
+                    "commit": "a4f147683db7aa99a6075aeaf7c698bc6ba84d11"
                 }
             ],
             "modules": [
@@ -263,8 +263,8 @@
             "sources": [
                 {
                     "type": "archive",
-                    "url": 
"https://git.libssh.org/projects/libssh.git/snapshot/libssh-0.7.5.tar.gz";,
-                    "sha256": 
"d275b1b3622c36efacfac748d5eecaf0e80349a551f72abb6ce5afa8c2e6b784"
+                    "url": 
"https://www.libssh.org/files/0.8/libssh-0.8.1.tar.xz";,
+                    "sha256": 
"d17f1267b4a5e46c0fbe66d39a3e702b8cefe788928f2eb6e339a18bb00b1924"
                 }
             ],
             "modules": [
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/plugins/rdp/rdp_event.c 
new/Remmina-v1.2.31.4/plugins/rdp/rdp_event.c
--- old/Remmina-v1.2.31.2/plugins/rdp/rdp_event.c       2018-07-31 
14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/plugins/rdp/rdp_event.c       2018-08-24 
15:40:04.000000000 +0200
@@ -215,21 +215,24 @@
        *h = sh;
 }
 
-void remmina_rdp_event_update_region(RemminaProtocolWidget* gp, 
RemminaPluginRdpUiObject* ui)
+void remmina_rdp_event_update_regions(RemminaProtocolWidget* gp, 
RemminaPluginRdpUiObject* ui)
 {
        TRACE_CALL(__func__);
        rfContext* rfi = GET_PLUGIN_DATA(gp);
-       gint x, y, w, h;
+       gint x, y, w, h, i;
 
-       x = ui->region.x;
-       y = ui->region.y;
-       w = ui->region.width;
-       h = ui->region.height;
+       for(i = 0; i < ui->reg.ninvalid; i++) {
+               x = ui->reg.ureg[i].x;
+               y = ui->reg.ureg[i].y;
+               w = ui->reg.ureg[i].w;
+               h = ui->reg.ureg[i].h;
 
-       if (rfi->scale == REMMINA_PROTOCOL_WIDGET_SCALE_MODE_SCALED)
-               remmina_rdp_event_scale_area(gp, &x, &y, &w, &h);
+               if (rfi->scale == REMMINA_PROTOCOL_WIDGET_SCALE_MODE_SCALED)
+                       remmina_rdp_event_scale_area(gp, &x, &y, &w, &h);
 
-       gtk_widget_queue_draw_area(rfi->drawing_area, x, y, w, h);
+               gtk_widget_queue_draw_area(rfi->drawing_area, x, y, w, h);
+       }
+       g_free(ui->reg.ureg);
 }
 
 void remmina_rdp_event_update_rect(RemminaProtocolWidget* gp, gint x, gint y, 
gint w, gint h)
@@ -1033,8 +1036,8 @@
 {
        TRACE_CALL(__func__);
        switch (ui->type) {
-       case REMMINA_RDP_UI_UPDATE_REGION:
-               remmina_rdp_event_update_region(gp, ui);
+       case REMMINA_RDP_UI_UPDATE_REGIONS:
+               remmina_rdp_event_update_regions(gp, ui);
                break;
 
        case REMMINA_RDP_UI_CONNECTED:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/plugins/rdp/rdp_plugin.c 
new/Remmina-v1.2.31.4/plugins/rdp/rdp_plugin.c
--- old/Remmina-v1.2.31.2/plugins/rdp/rdp_plugin.c      2018-07-31 
14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/plugins/rdp/rdp_plugin.c      2018-08-24 
15:40:04.000000000 +0200
@@ -24,6 +24,12 @@
 
 #include <string.h>
 
+#ifdef GDK_WINDOWING_X11
+       #include <X11/Xlib.h>
+       #include <X11/XKBlib.h>
+       #include <gdk/gdkx.h>
+#endif
+
 #define REMMINA_RDP_FEATURE_TOOL_REFRESH         1
 #define REMMINA_RDP_FEATURE_SCALE                2
 #define REMMINA_RDP_FEATURE_UNFOCUS              3
@@ -277,11 +283,12 @@
 BOOL rf_end_paint(rdpContext* context)
 {
        TRACE_CALL(__func__);
-       INT32 x, y;
-       UINT32 w, h;
        rdpGdi* gdi;
        rfContext* rfi;
        RemminaPluginRdpUiObject* ui;
+       int i, ninvalid;
+       region *reg;
+       HGDI_RGN cinvalid;
 
        gdi = context->gdi;
        rfi = (rfContext*)context;
@@ -289,23 +296,31 @@
        if (gdi->primary->hdc->hwnd->invalid->null)
                return TRUE;
 
-       x = gdi->primary->hdc->hwnd->invalid->x;
-       y = gdi->primary->hdc->hwnd->invalid->y;
-       w = gdi->primary->hdc->hwnd->invalid->w;
-       h = gdi->primary->hdc->hwnd->invalid->h;
+       if (gdi->primary->hdc->hwnd->ninvalid < 1)
+               return TRUE;
+
+       ninvalid = gdi->primary->hdc->hwnd->ninvalid;
+       cinvalid = gdi->primary->hdc->hwnd->cinvalid;
+       reg = (region *)g_malloc(sizeof(region) * ninvalid);
+       for(i = 0; i < ninvalid; i++) {
+               reg[i].x = cinvalid[i].x;
+               reg[i].y = cinvalid[i].y;
+               reg[i].w = cinvalid[i].w;
+               reg[i].h = cinvalid[i].h;
+       }
 
        ui = g_new0(RemminaPluginRdpUiObject, 1);
-       ui->type = REMMINA_RDP_UI_UPDATE_REGION;
-       ui->region.x = x;
-       ui->region.y = y;
-       ui->region.width = w;
-       ui->region.height = h;
+       ui->type = REMMINA_RDP_UI_UPDATE_REGIONS;
+       ui->reg.ninvalid = ninvalid;
+       ui->reg.ureg = reg;
 
        remmina_rdp_event_queue_ui_async(rfi->protocol_widget, ui);
 
+
        gdi->primary->hdc->hwnd->invalid->null = TRUE;
        gdi->primary->hdc->hwnd->ninvalid = 0;
 
+
        return TRUE;
 }
 
@@ -334,6 +349,64 @@
        return TRUE;
 }
 
+static BOOL rf_play_sound(rdpContext* context, const PLAY_SOUND_UPDATE* 
play_sound)
+{
+       TRACE_CALL(__func__);
+       rfContext* rfi;
+       RemminaProtocolWidget* gp;
+       GdkDisplay* disp;
+
+       rfi = (rfContext*)context;
+       gp = rfi->protocol_widget;
+
+       disp = gtk_widget_get_display(GTK_WIDGET(gp));
+       gdk_display_beep(disp);
+
+       return TRUE;
+}
+
+static BOOL rf_keyboard_set_indicators(rdpContext* context, UINT16 led_flags)
+{
+       TRACE_CALL(__func__);
+       rfContext* rfi;
+       RemminaProtocolWidget* gp;
+       GdkDisplay* disp;
+
+       rfi = (rfContext*)context;
+       gp = rfi->protocol_widget;
+       disp = gtk_widget_get_display(GTK_WIDGET(gp));
+
+#ifdef GDK_WINDOWING_X11
+       if (GDK_IS_X11_DISPLAY(disp)) {
+               /* ToDo: we are not on the main thread. Will Xorg complain ? */
+               Display* x11_display;
+               x11_display = gdk_x11_display_get_xdisplay(disp);
+               XkbLockModifiers(x11_display, XkbUseCoreKbd,
+                       LockMask | Mod2Mask,
+                       (led_flags & KBD_SYNC_CAPS_LOCK ? LockMask : 0) |
+                       (led_flags & KBD_SYNC_NUM_LOCK ? Mod2Mask : 0)
+                       );
+
+               /* ToDo: add support to KANA_LOCK and SCROLL_LOCK */
+       }
+#endif
+
+       return TRUE;
+}
+
+BOOL rf_keyboard_set_ime_status(rdpContext* context, UINT16 imeId, UINT32 
imeState,
+                                UINT32 imeConvMode)
+{
+       TRACE_CALL(__func__);
+       if (!context)
+                       return FALSE;
+
+       /* Unimplemented, we ignore it */
+
+       return TRUE;
+}
+
+
 static BOOL remmina_rdp_pre_connect(freerdp* instance)
 {
        TRACE_CALL(__func__);
@@ -448,6 +521,10 @@
        instance->update->EndPaint = rf_end_paint;
        instance->update->DesktopResize = rf_desktop_resize;
 
+       instance->update->PlaySound = rf_play_sound;
+       instance->update->SetKeyboardIndicators = rf_keyboard_set_indicators;
+       instance->update->SetKeyboardImeStatus = rf_keyboard_set_ime_status;
+
        remmina_rdp_clipboard_init(rfi);
        rfi->connected = True;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/plugins/rdp/rdp_plugin.h 
new/Remmina-v1.2.31.4/plugins/rdp/rdp_plugin.h
--- old/Remmina-v1.2.31.2/plugins/rdp/rdp_plugin.h      2018-07-31 
14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/plugins/rdp/rdp_plugin.h      2018-08-24 
15:40:04.000000000 +0200
@@ -146,7 +146,7 @@
 typedef struct remmina_plugin_rdp_event RemminaPluginRdpEvent;
 
 typedef enum {
-       REMMINA_RDP_UI_UPDATE_REGION = 0,
+       REMMINA_RDP_UI_UPDATE_REGIONS = 0,
        REMMINA_RDP_UI_CONNECTED,
        REMMINA_RDP_UI_RECONNECT_PROGRESS,
        REMMINA_RDP_UI_CURSOR,
@@ -176,6 +176,10 @@
        REMMINA_RDP_UI_EVENT_UPDATE_SCALE
 } RemminaPluginRdpUiEeventType;
 
+typedef struct {
+       gint x, y, w, h;
+} region;
+
 struct remmina_plugin_rdp_ui_object {
        RemminaPluginRdpUiType type;
        gboolean sync;
@@ -184,11 +188,9 @@
        pthread_cond_t sync_wait_cond;
        union {
                struct {
-                       gint x;
-                       gint y;
-                       gint width;
-                       gint height;
-               } region;
+                       region *ureg;
+                       gint ninvalid;
+               } reg;
                struct {
                        rdpContext* context;
                        rfPointer* pointer;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/plugins/spice/spice_plugin.c 
new/Remmina-v1.2.31.4/plugins/spice/spice_plugin.c
--- old/Remmina-v1.2.31.2/plugins/spice/spice_plugin.c  2018-07-31 
14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/plugins/spice/spice_plugin.c  2018-08-24 
15:40:04.000000000 +0200
@@ -41,6 +41,18 @@
        REMMINA_PLUGIN_SPICE_FEATURE_PREF_RESIZEGUEST,
        REMMINA_PLUGIN_SPICE_FEATURE_PREF_DISABLECLIPBOARD,
        REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTDEL,
+       REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF1,
+       REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF2,
+       REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF3,
+       REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF4,
+       REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF5,
+       REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF6,
+       REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF7,
+       REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF8,
+       REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF9,
+       REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF10,
+       REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF11,
+       REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF12,
        REMMINA_PLUGIN_SPICE_FEATURE_TOOL_USBREDIR,
        REMMINA_PLUGIN_SPICE_FEATURE_SCALE
 };
@@ -338,6 +350,126 @@
        remmina_plugin_spice_keystroke(gp, keys, G_N_ELEMENTS(keys));
 }
 
+/* Send CTRL+ALT+F1 keys keystrokes to the plugin socket widget */
+static void remmina_plugin_spice_send_ctrlaltf1(RemminaProtocolWidget *gp)
+{
+       TRACE_CALL(__func__);
+
+       guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_F1 };
+
+       remmina_plugin_spice_keystroke(gp, keys, G_N_ELEMENTS(keys));
+}
+
+/* Send CTRL+ALT+F2 keys keystrokes to the plugin socket widget */
+static void remmina_plugin_spice_send_ctrlaltf2(RemminaProtocolWidget *gp)
+{
+       TRACE_CALL(__func__);
+
+       guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_F2 };
+
+       remmina_plugin_spice_keystroke(gp, keys, G_N_ELEMENTS(keys));
+}
+
+/* Send CTRL+ALT+F3 keys keystrokes to the plugin socket widget */
+static void remmina_plugin_spice_send_ctrlaltf3(RemminaProtocolWidget *gp)
+{
+       TRACE_CALL(__func__);
+
+       guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_F3 };
+
+       remmina_plugin_spice_keystroke(gp, keys, G_N_ELEMENTS(keys));
+}
+
+/* Send CTRL+ALT+F4 keys keystrokes to the plugin socket widget */
+static void remmina_plugin_spice_send_ctrlaltf4(RemminaProtocolWidget *gp)
+{
+       TRACE_CALL(__func__);
+
+       guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_F4 };
+
+       remmina_plugin_spice_keystroke(gp, keys, G_N_ELEMENTS(keys));
+}
+
+/* Send CTRL+ALT+F5 keys keystrokes to the plugin socket widget */
+static void remmina_plugin_spice_send_ctrlaltf5(RemminaProtocolWidget *gp)
+{
+       TRACE_CALL(__func__);
+
+       guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_F5 };
+
+       remmina_plugin_spice_keystroke(gp, keys, G_N_ELEMENTS(keys));
+}
+
+/* Send CTRL+ALT+F6 keys keystrokes to the plugin socket widget */
+static void remmina_plugin_spice_send_ctrlaltf6(RemminaProtocolWidget *gp)
+{
+       TRACE_CALL(__func__);
+
+       guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_F6 };
+
+       remmina_plugin_spice_keystroke(gp, keys, G_N_ELEMENTS(keys));
+}
+
+/* Send CTRL+ALT+F7 keys keystrokes to the plugin socket widget */
+static void remmina_plugin_spice_send_ctrlaltf7(RemminaProtocolWidget *gp)
+{
+       TRACE_CALL(__func__);
+
+       guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_F7 };
+
+       remmina_plugin_spice_keystroke(gp, keys, G_N_ELEMENTS(keys));
+}
+
+/* Send CTRL+ALT+F8 keys keystrokes to the plugin socket widget */
+static void remmina_plugin_spice_send_ctrlaltf8(RemminaProtocolWidget *gp)
+{
+       TRACE_CALL(__func__);
+
+       guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_F8 };
+
+       remmina_plugin_spice_keystroke(gp, keys, G_N_ELEMENTS(keys));
+}
+
+/* Send CTRL+ALT+F9 keys keystrokes to the plugin socket widget */
+static void remmina_plugin_spice_send_ctrlaltf9(RemminaProtocolWidget *gp)
+{
+       TRACE_CALL(__func__);
+
+       guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_F9 };
+
+       remmina_plugin_spice_keystroke(gp, keys, G_N_ELEMENTS(keys));
+}
+
+/* Send CTRL+ALT+F10 keys keystrokes to the plugin socket widget */
+static void remmina_plugin_spice_send_ctrlaltf10(RemminaProtocolWidget *gp)
+{
+       TRACE_CALL(__func__);
+
+       guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_F10 };
+
+       remmina_plugin_spice_keystroke(gp, keys, G_N_ELEMENTS(keys));
+}
+
+/* Send CTRL+ALT+F11 keys keystrokes to the plugin socket widget */
+static void remmina_plugin_spice_send_ctrlaltf11(RemminaProtocolWidget *gp)
+{
+       TRACE_CALL(__func__);
+
+       guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_F11 };
+
+       remmina_plugin_spice_keystroke(gp, keys, G_N_ELEMENTS(keys));
+}
+
+/* Send CTRL+ALT+F12 keys keystrokes to the plugin socket widget */
+static void remmina_plugin_spice_send_ctrlaltf12(RemminaProtocolWidget *gp)
+{
+       TRACE_CALL(__func__);
+
+       guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_F12 };
+
+       remmina_plugin_spice_keystroke(gp, keys, G_N_ELEMENTS(keys));
+}
+
 static void remmina_plugin_spice_update_scale(RemminaProtocolWidget *gp)
 {
        TRACE_CALL(__func__);
@@ -401,6 +533,42 @@
        case REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTDEL:
                remmina_plugin_spice_send_ctrlaltdel(gp);
                break;
+       case REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF1:
+               remmina_plugin_spice_send_ctrlaltf1(gp);
+               break;
+       case REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF2:
+               remmina_plugin_spice_send_ctrlaltf2(gp);
+               break;
+       case REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF3:
+               remmina_plugin_spice_send_ctrlaltf3(gp);
+               break;
+       case REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF4:
+               remmina_plugin_spice_send_ctrlaltf4(gp);
+               break;
+       case REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF5:
+               remmina_plugin_spice_send_ctrlaltf5(gp);
+               break;
+       case REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF6:
+               remmina_plugin_spice_send_ctrlaltf6(gp);
+               break;
+       case REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF7:
+               remmina_plugin_spice_send_ctrlaltf7(gp);
+               break;
+       case REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF8:
+               remmina_plugin_spice_send_ctrlaltf8(gp);
+               break;
+       case REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF9:
+               remmina_plugin_spice_send_ctrlaltf9(gp);
+               break;
+       case REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF10:
+               remmina_plugin_spice_send_ctrlaltf10(gp);
+               break;
+       case REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF11:
+               remmina_plugin_spice_send_ctrlaltf11(gp);
+               break;
+       case REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF12:
+               remmina_plugin_spice_send_ctrlaltf12(gp);
+               break;
        case REMMINA_PLUGIN_SPICE_FEATURE_TOOL_USBREDIR:
                remmina_plugin_spice_select_usb_devices(gp);
                break;
@@ -457,6 +625,18 @@
        { REMMINA_PROTOCOL_FEATURE_TYPE_PREF,  
REMMINA_PLUGIN_SPICE_FEATURE_PREF_RESIZEGUEST,       
GINT_TO_POINTER(REMMINA_PROTOCOL_FEATURE_PREF_CHECK),          "resizeguest",   
    N_("Resize guest to match window size")},
        { REMMINA_PROTOCOL_FEATURE_TYPE_PREF,  
REMMINA_PLUGIN_SPICE_FEATURE_PREF_DISABLECLIPBOARD,  
GINT_TO_POINTER(REMMINA_PROTOCOL_FEATURE_PREF_CHECK),          
"disableclipboard",  N_("Disable clipboard sync")},
        { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL,  
REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTDEL,    N_("Send 
Ctrl+Alt+Delete"),                                    NULL,                
NULL},
+       { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL,  
REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF1,    N_("Send Ctrl+Alt+F1"),     
                                    NULL,                NULL},
+       { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL,  
REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF2,    N_("Send Ctrl+Alt+F2"),     
                                    NULL,                NULL},
+       { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL,  
REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF3,    N_("Send Ctrl+Alt+F3"),     
                                    NULL,                NULL},
+       { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL,  
REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF4,    N_("Send Ctrl+Alt+F4"),     
                                    NULL,                NULL},
+       { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL,  
REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF5,    N_("Send Ctrl+Alt+F5"),     
                                    NULL,                NULL},
+       { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL,  
REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF6,    N_("Send Ctrl+Alt+F6"),     
                                    NULL,                NULL},
+       { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL,  
REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF7,    N_("Send Ctrl+Alt+F7"),     
                                    NULL,                NULL},
+       { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL,  
REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF8,    N_("Send Ctrl+Alt+F8"),     
                                    NULL,                NULL},
+       { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL,  
REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF9,    N_("Send Ctrl+Alt+F9"),     
                                    NULL,                NULL},
+       { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL,  
REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF10,    N_("Send Ctrl+Alt+F10"),   
                                    NULL,                NULL},
+       { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL,  
REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF11,    N_("Send Ctrl+Alt+F11"),   
                                    NULL,                NULL},
+       { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL,  
REMMINA_PLUGIN_SPICE_FEATURE_TOOL_SENDCTRLALTF12,    N_("Send Ctrl+Alt+F12"),   
                                    NULL,                NULL},
        { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL,  
REMMINA_PLUGIN_SPICE_FEATURE_TOOL_USBREDIR,          N_("Select USB devices for 
redirection"),                      NULL,                NULL},
        { REMMINA_PROTOCOL_FEATURE_TYPE_SCALE, 
REMMINA_PLUGIN_SPICE_FEATURE_SCALE,                  NULL,                      
                                    NULL,                NULL},
        { REMMINA_PROTOCOL_FEATURE_TYPE_END,   0,                               
                    NULL,                                                       
   NULL,                NULL}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/plugins/xdmcp/xdmcp_plugin.c 
new/Remmina-v1.2.31.4/plugins/xdmcp/xdmcp_plugin.c
--- old/Remmina-v1.2.31.2/plugins/xdmcp/xdmcp_plugin.c  2018-07-31 
14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/plugins/xdmcp/xdmcp_plugin.c  2018-08-24 
15:40:04.000000000 +0200
@@ -363,8 +363,8 @@
  */
 static const RemminaProtocolSetting remmina_plugin_xdmcp_basic_settings[] =
 {
-       { REMMINA_PROTOCOL_SETTING_TYPE_SERVER,     NULL,            NULL,      
                                 FALSE, NULL,            NULL },
-       { REMMINA_PROTOCOL_SETTING_TYPE_RESOLUTION, NULL,            NULL,      
                                 FALSE, NULL,            NULL },
+       { REMMINA_PROTOCOL_SETTING_TYPE_SERVER,     "server",        NULL,      
                                 FALSE, NULL,            NULL },
+       { REMMINA_PROTOCOL_SETTING_TYPE_RESOLUTION, "resolution",            
NULL,                                       FALSE, NULL,            NULL },
        { REMMINA_PROTOCOL_SETTING_TYPE_SELECT,     "colordepth",    N_("Color 
depth"),                          FALSE, colordepth_list, NULL },
        { REMMINA_PROTOCOL_SETTING_TYPE_TEXT,       "exec",          
N_("Startup program"),                      FALSE, NULL,            NULL },
        { REMMINA_PROTOCOL_SETTING_TYPE_CHECK,      "showcursor",    N_("Use 
local cursor"),                     FALSE, NULL,            NULL },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/snap/snapcraft.yaml 
new/Remmina-v1.2.31.4/snap/snapcraft.yaml
--- old/Remmina-v1.2.31.2/snap/snapcraft.yaml   2018-07-31 14:53:53.000000000 
+0200
+++ new/Remmina-v1.2.31.4/snap/snapcraft.yaml   2018-08-24 15:40:04.000000000 
+0200
@@ -71,10 +71,10 @@
       - -usr/lib/cmake
       - -usr/lib/pkgconfig
 
-  # Remove this (and use again libssh-dev) once libssh-0.7 is available in 
distro
-  libssh-0.7:
+  # Remove this (and use again libssh-dev) once libssh-0.8 is available in 
distro
+  libssh-0.8:
     plugin: cmake
-    source: 
"https://git.libssh.org/projects/libssh.git/snapshot/libssh-0.7.5.tar.gz";
+    source: 
"https://git.libssh.org/projects/libssh.git/snapshot/libssh-0.8.1.tar.gz";
     configflags:
       - -DCMAKE_BUILD_TYPE:STRING=Release
       - -DWITH_GSSAPI=ON
@@ -132,7 +132,7 @@
       - -./usr/share/fonts/**
 
     after:
-      - libssh-0.7
+      - libssh-0.8
       - freerdp
       - desktop-gtk3
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/src/remmina.1 
new/Remmina-v1.2.31.4/src/remmina.1
--- old/Remmina-v1.2.31.2/src/remmina.1 2018-07-31 14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/src/remmina.1 2018-08-24 15:40:04.000000000 +0200
@@ -1,4 +1,4 @@
-.Dd 2016-10-04
+.Dd 2018-08-01
 .Dt REMMINA 1
 .Sh NAME
 .Nm remmina
@@ -19,15 +19,14 @@
 in front of either large monitors or tiny netbooks. Remmina supports multiple
 network protocols in an integrated and consistent user interface.
 Currently RDP, VNC, SPICE, NX, XDMCP and SSH are supported.
-
+.Lp
 Remmina is released in separated source packages:
-
+.Lp
     "remmina", the main GTK+ application
     "remmina-plugins", a set of plugins
-
+.Lp
 Remmina is free and open-source software, released under GNU GPL license.
 .Sh FILES
-.Tp
 \(Do\(lCXDG_CONFIG_DIRS\(rC/remmina.pref or 
\(Do\(lCXDG_CONFIG_HOME\(rC/remmina/remmina.pref :
 .Lp
 Remmina configuration files.
@@ -35,7 +34,6 @@
 At the first Remmina execution the system wide Remmina configuration files,
 will be copied in the \(Do\(lCXDG_CONFIG_HOME\(rC
 .Lp
-.Tp
 \(Do\(lCXDG_DATA_DIRS\(rC/FILE.remmina or 
\(Do\(lCXDG_DATA_HOME\(rC/remmina/FILE.remmina :
 .Lp
 Remmina profiles, the file name is autogenerated, but you can create manually 
your
@@ -46,42 +44,31 @@
 Show help options
 .It Fl a
 Show about dialog
-.Tp
 .It Fl c, -connect\fR=\fIFILE\fR
 Connect to a .remmina file
-.Tp
 .It Fl e, -edit\fR=\fIFILE\fR
 Edit a .remmina file
-.Tp
 .It Fl k, -kiosk\fR
 Start Remmina in kiosk mode (thin client)
-.Tp
 .It Fl n, -new\fR
 Create a new connection profile
-.Tp
 .It Fl p, -pref\fR=\fIPAGENR\fR
 Show preferences dialog page
-.Tp
 .It Fl x, -plugin\fR=\fIPLUGIN\fR
 Execute the plugin
-.Tp
 .It Fl q, -quit\fR
 Quit the application
-.Tp
 .It Fl s, -server\fR=\fISERVER\fR
 Use default server name (for \fB\-\-new\fR)
-.Tp
 .It Fl t, -protocol\fR=\fIPROTOCOL\fR
 Use default protocol (for \fB\-\-new\fR)
-.Tp
 .It Fl i, -icon\fR
 Start as tray icon
-.Tp
 .It Fl v, -version\fR
 Show the application's version
-.Tp
 .It Fl \-display\fR=\fIDISPLAY\fR
 X display to use
+.El
 .Sh SEE ALSO
 .Sh AUTHORS
 Antenore Gatta <antenore at simbiosi dot org> and Giovanni Panozzo <giovanni 
at panozzo dot it>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/src/remmina.c 
new/Remmina-v1.2.31.4/src/remmina.c
--- old/Remmina-v1.2.31.2/src/remmina.c 2018-07-31 14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/src/remmina.c 2018-08-24 15:40:04.000000000 +0200
@@ -225,6 +225,10 @@
        g_set_application_name("Remmina");
        gtk_window_set_default_icon_name(REMMINA_APP_ID);
 
+       /* Setting the X11 program class (WM_CLASS) is necessary to group
+        * windows with .desktop file which has the same StartupWMClass */
+       gdk_set_program_class(REMMINA_APP_ID);
+
        gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(),
                REMMINA_RUNTIME_DATADIR G_DIR_SEPARATOR_S "icons");
        g_application_hold(app);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/src/remmina_connection_window.c 
new/Remmina-v1.2.31.4/src/remmina_connection_window.c
--- old/Remmina-v1.2.31.2/src/remmina_connection_window.c       2018-07-31 
14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/src/remmina_connection_window.c       2018-08-24 
15:40:04.000000000 +0200
@@ -168,6 +168,7 @@
 struct _RemminaConnectionHolder {
        RemminaConnectionWindow* cnnwin;
        gint fullscreen_view_mode;
+       gint grab_retry_eventsourceid;
 
        gboolean hostkey_activated;
        gboolean hostkey_used;
@@ -203,6 +204,7 @@
 static void remmina_connection_holder_grab_focus(GtkNotebook *notebook);
 static GtkWidget* 
remmina_connection_holder_create_toolbar(RemminaConnectionHolder* cnnhld, gint 
mode);
 static void remmina_connection_holder_place_toolbar(GtkToolbar *toolbar, 
GtkGrid *grid, GtkWidget *sibling, int toolbar_placement);
+static void remmina_connection_holder_keyboard_grab(RemminaConnectionHolder* 
cnnhld);
 
 #if FLOATING_TOOLBAR_WIDGET
 static void remmina_connection_window_ftb_drag_begin(GtkWidget *widget, 
GdkDragContext *context, gpointer user_data);
@@ -415,6 +417,11 @@
 #endif
        GdkDevice *keyboard = NULL;
 
+       if (cnnhld->grab_retry_eventsourceid) {
+               g_source_remove(cnnhld->grab_retry_eventsourceid);
+               cnnhld->grab_retry_eventsourceid = 0;
+       }
+
        display = gtk_widget_get_display(GTK_WIDGET(cnnhld->cnnwin));
 #if GTK_CHECK_VERSION(3, 20, 0)
        seat = gdk_display_get_default_seat(display);
@@ -424,7 +431,6 @@
        keyboard = gdk_device_manager_get_client_pointer(manager);
 #endif
 
-
        if (!cnnhld->cnnwin->priv->kbcaptured) {
                return;
        }
@@ -437,16 +443,30 @@
                printf("DEBUG_KB_GRABBING: --- ungrabbing\n");
 #endif
 
-#if GTK_CHECK_VERSION(3, 20, 0)
+#if GTK_CHECK_VERSION(3, 24, 0)
+               /* We can use gtk_seat_grab()/_ungrab() only after GTK 3.24 */
                gdk_seat_ungrab(seat);
 #else
+               G_GNUC_BEGIN_IGNORE_DEPRECATIONS
                gdk_device_ungrab(keyboard, GDK_CURRENT_TIME);
+               G_GNUC_END_IGNORE_DEPRECATIONS
 #endif
                cnnhld->cnnwin->priv->kbcaptured = FALSE;
 
        }
 }
 
+static gboolean remmina_connection_holder_keyboard_grab_retry(gpointer 
user_data)
+{
+       TRACE_CALL(__func__);
+       RemminaConnectionHolder* cnnhld;
+       cnnhld = (RemminaConnectionHolder *)user_data;
+
+       remmina_connection_holder_keyboard_grab(cnnhld);
+       cnnhld->grab_retry_eventsourceid = 0;
+       return G_SOURCE_REMOVE;
+}
+
 static void remmina_connection_holder_keyboard_grab(RemminaConnectionHolder* 
cnnhld)
 {
        TRACE_CALL(__func__);
@@ -457,6 +477,7 @@
 #else
        GdkDeviceManager *manager;
 #endif
+       GdkGrabStatus ggs;
        GdkDevice *keyboard = NULL;
 
        if (cnnhld->cnnwin->priv->kbcaptured || 
!cnnhld->cnnwin->priv->mouse_pointer_entered) {
@@ -480,16 +501,43 @@
 
                if (remmina_file_get_int(cnnobj->remmina_file, "keyboard_grab", 
FALSE)) {
 #if DEBUG_KB_GRABBING
-                       printf("DEBUG_KB_GRABBING: +++ grabbing\n");
+                       printf("DEBUG_KB_GRABBING: profile asks for grabbing, 
let's try.\n");
 #endif
-#if GTK_CHECK_VERSION(3, 20, 0)
-                       if (gdk_seat_grab(seat, 
gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin)),
-                                   GDK_SEAT_CAPABILITY_KEYBOARD, FALSE, NULL, 
NULL, NULL, NULL) == GDK_GRAB_SUCCESS)
+       /* Up to GTK version 3.20 we can grab the keyboard with 
gdk_device_grab().
+        * in GTK 3.20 gdk_seat_grab() should be used instead of 
gdk_device_grab().
+        * There is a bug in GTK up to 3.22: when gdk_device_grab() fails
+        * the widget is hidden:
+        * 
https://gitlab.gnome.org/GNOME/gtk/commit/726ad5a5ae7c4f167e8dd454cd7c250821c400ab
+        * The bug fix will be released with GTK 3.24.
+        * Also pease note that the newer gdk_seat_grab() is still calling 
gdk_device_grab().
+        */
+#if GTK_CHECK_VERSION(3, 24, 0)
+                       ggs = gdk_seat_grab(seat, 
gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin)),
+                               GDK_SEAT_CAPABILITY_KEYBOARD, FALSE, NULL, 
NULL, NULL, NULL);
 #else
-                       if (gdk_device_grab(keyboard, 
gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin)), GDK_OWNERSHIP_WINDOW,
-                                   TRUE, GDK_KEY_PRESS | GDK_KEY_RELEASE, 
NULL, GDK_CURRENT_TIME) == GDK_GRAB_SUCCESS)
+                       G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+                       ggs = gdk_device_grab(keyboard, 
gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin)), GDK_OWNERSHIP_WINDOW,
+                                   TRUE, GDK_KEY_PRESS | GDK_KEY_RELEASE, 
NULL, GDK_CURRENT_TIME);
+                       G_GNUC_END_IGNORE_DEPRECATIONS
 #endif
+                       if ( ggs != GDK_GRAB_SUCCESS )
                        {
+                               /* Failure to GRAB keyboard */
+                               #if DEBUG_KB_GRABBING
+                                       printf("GRAB FAILED. GdkGrabStatus: 
%d\n", (int)ggs);
+                               #endif
+                               /* Reschedule grabbing in half a second if not 
already done */
+                               if (cnnhld->grab_retry_eventsourceid == 0) {
+                                       cnnhld->grab_retry_eventsourceid = 
g_timeout_add(500, (GSourceFunc)remmina_connection_holder_keyboard_grab_retry, 
cnnhld);
+                               }
+                       } else {
+                       #if DEBUG_KB_GRABBING
+                               printf("GRAB SUCCESS\n");
+                       #endif
+                               if (cnnhld->grab_retry_eventsourceid != 0) {
+                                       
g_source_remove(cnnhld->grab_retry_eventsourceid);
+                                       cnnhld->grab_retry_eventsourceid = 0;
+                               }
                                cnnhld->cnnwin->priv->kbcaptured = TRUE;
                        }
                }else {
@@ -3758,7 +3806,7 @@
                return TRUE;
        }else {
                dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, 
GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
-                       _("File %s not found."), filename);
+                       _("File %s is corrupted, unreadable or not found."), 
filename);
                g_signal_connect(G_OBJECT(dialog), "response", 
G_CALLBACK(gtk_widget_destroy), NULL);
                gtk_widget_show(dialog);
                remmina_widget_pool_register(dialog);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/src/remmina_external_tools.c 
new/Remmina-v1.2.31.4/src/remmina_external_tools.c
--- old/Remmina-v1.2.31.2/src/remmina_external_tools.c  2018-07-31 
14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/src/remmina_external_tools.c  2018-08-24 
15:40:04.000000000 +0200
@@ -110,6 +110,8 @@
        g_snprintf(launcher, MAX_PATH_LEN, "%s/launcher.sh", 
REMMINA_RUNTIME_EXTERNAL_TOOLS_DIR);
 
        remminafile = remmina_file_load(filename);
+       if (!remminafile)
+               return FALSE;
        GHashTableIter iter;
        const gchar *key, *value;
        g_hash_table_iter_init(&iter, remminafile->settings);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/src/remmina_file.c 
new/Remmina-v1.2.31.4/src/remmina_file.c
--- old/Remmina-v1.2.31.2/src/remmina_file.c    2018-07-31 14:53:53.000000000 
+0200
+++ new/Remmina-v1.2.31.4/src/remmina_file.c    2018-08-24 15:40:04.000000000 
+0200
@@ -141,7 +141,9 @@
        RemminaFile *remminafile;
 
        remminafile = remmina_file_load(filename);
-       remmina_file_generate_filename(remminafile);
+       if (remminafile) {
+               remmina_file_generate_filename(remminafile);
+       }
 
        return remminafile;
 }
@@ -197,6 +199,7 @@
 
        if (!g_key_file_load_from_file(gkeyfile, filename, G_KEY_FILE_NONE, 
NULL)) {
                g_key_file_free(gkeyfile);
+               g_printf("WARNING: unable to load remmina profile file %s: 
g_key_file_load_from_file() returned NULL.\n", filename);
                return NULL;
        }
 
@@ -257,6 +260,7 @@
                        g_strfreev(keys);
                }
        }else {
+               g_printf("WARNING: unable to load remmina profile file %s: 
cannot find key name= in section remmina.\n", filename);
                remminafile = NULL;
        }
 
@@ -548,8 +552,12 @@
                        if (setting_iter) {
                                while (setting_iter->type != 
REMMINA_PROTOCOL_SETTING_TYPE_END) {
                                        g_debug("setting name: %s", 
setting_iter->name);
-                                       if 
(remmina_plugin_manager_is_encrypted_setting(protocol_plugin, 
setting_iter->name)) {
-                                               
remmina_file_set_string(remminafile, 
remmina_plugin_manager_get_canonical_setting_name(setting_iter), NULL);
+                                       if (setting_iter->name == NULL) {
+                                               g_warning("Internal error: a 
setting name in protocol plugin %s is null. Please fix RemminaProtocolSetting 
struct content.", proto);
+                                       }else {
+                                               if 
(remmina_plugin_manager_is_encrypted_setting(protocol_plugin, 
setting_iter->name)) {
+                                                       
remmina_file_set_string(remminafile, 
remmina_plugin_manager_get_canonical_setting_name(setting_iter), NULL);
+                                               }
                                        }
                                        setting_iter++;
                                }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/src/remmina_file_manager.c 
new/Remmina-v1.2.31.4/src/remmina_file_manager.c
--- old/Remmina-v1.2.31.2/src/remmina_file_manager.c    2018-07-31 
14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/src/remmina_file_manager.c    2018-08-24 
15:40:04.000000000 +0200
@@ -198,11 +198,13 @@
                        continue;
                g_snprintf(filename, MAX_PATH_LEN, "%s/%s", remmina_data_dir, 
name);
                remminafile = remmina_file_load(filename);
-               group = remmina_file_get_string(remminafile, "group");
-               if (group && remmina_string_array_find(array, group) < 0) {
-                       remmina_string_array_add(array, group);
+               if (remminafile) {
+                       group = remmina_file_get_string(remminafile, "group");
+                       if (group && remmina_string_array_find(array, group) < 
0) {
+                               remmina_string_array_add(array, group);
+                       }
+                       remmina_file_free(remminafile);
                }
-               remmina_file_free(remminafile);
        }
        g_dir_close(dir);
        remmina_string_array_sort(array);
@@ -290,9 +292,11 @@
                        continue;
                g_snprintf(filename, MAX_PATH_LEN, "%s/%s", 
remmina_file_get_datadir(), name);
                remminafile = remmina_file_load(filename);
-               group = remmina_file_get_string(remminafile, "group");
-               remmina_file_manager_add_group(root, group);
-               remmina_file_free(remminafile);
+               if (remminafile) {
+                       group = remmina_file_get_string(remminafile, "group");
+                       remmina_file_manager_add_group(root, group);
+                       remmina_file_free(remminafile);
+               }
        }
        g_dir_close(dir);
        return root;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/src/remmina_main.c 
new/Remmina-v1.2.31.4/src/remmina_main.c
--- old/Remmina-v1.2.31.2/src/remmina_main.c    2018-07-31 14:53:53.000000000 
+0200
+++ new/Remmina-v1.2.31.4/src/remmina_main.c    2018-08-24 15:40:04.000000000 
+0200
@@ -1194,9 +1194,10 @@
 {
        remmina_pref.periodic_usage_stats_permission_asked = TRUE;
        remmina_pref.periodic_usage_stats_permitted = TRUE;
-       remmina_pref_save();
        gtk_widget_set_visible(GTK_WIDGET(remminamain->box_ustat), FALSE);
-       remmina_stats_sender_schedule();
+       if (remmina_pref_save()) {
+               remmina_stats_sender_schedule();
+       }
 }
 
 void remmina_main_on_click_ustat_no(GtkWidget *w, gpointer user_data)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/src/remmina_mpchange.c 
new/Remmina-v1.2.31.4/src/remmina_mpchange.c
--- old/Remmina-v1.2.31.2/src/remmina_mpchange.c        2018-07-31 
14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/src/remmina_mpchange.c        2018-08-24 
15:40:04.000000000 +0200
@@ -166,9 +166,11 @@
        RemminaFile* remminafile;
 
        remminafile = remmina_file_load(fname);
-       remmina_file_store_secret_plugin_password(remminafile, "password", 
mpcp->password);
-       remmina_file_free(remminafile);
-       mpcp->changed_passwords_count++;
+       if (remminafile) {
+               remmina_file_store_secret_plugin_password(remminafile, 
"password", mpcp->password);
+               remmina_file_free(remminafile);
+               mpcp->changed_passwords_count++;
+       }
 
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/src/remmina_pref.c 
new/Remmina-v1.2.31.4/src/remmina_pref.c
--- old/Remmina-v1.2.31.2/src/remmina_pref.c    2018-07-31 14:53:53.000000000 
+0200
+++ new/Remmina-v1.2.31.4/src/remmina_pref.c    2018-08-24 15:40:04.000000000 
+0200
@@ -647,10 +647,11 @@
        remmina_pref_init_keymap();
 }
 
-void remmina_pref_save(void)
+gboolean remmina_pref_save(void)
 {
        TRACE_CALL(__func__);
        GKeyFile *gkeyfile;
+       GError *error = NULL;
        gchar *content;
        gsize length;
 
@@ -742,10 +743,19 @@
                        remmina_pref.periodic_usage_stats_uuid_prefix ? 
remmina_pref.periodic_usage_stats_uuid_prefix : "");
 
        content = g_key_file_to_data(gkeyfile, &length, NULL);
-       g_file_set_contents(remmina_pref_file, content, length, NULL);
+       g_file_set_contents(remmina_pref_file, content, length, &error);
 
+       if (error != NULL)
+       {
+               g_print ("%s\n", error->message);
+               g_clear_error (&error);
+               g_key_file_free(gkeyfile);
+               g_free(content);
+               return FALSE;
+       }
        g_key_file_free(gkeyfile);
        g_free(content);
+       return TRUE;
 }
 
 void remmina_pref_add_recent(const gchar *protocol, const gchar *server)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/src/remmina_pref.h 
new/Remmina-v1.2.31.4/src/remmina_pref.h
--- old/Remmina-v1.2.31.2/src/remmina_pref.h    2018-07-31 14:53:53.000000000 
+0200
+++ new/Remmina-v1.2.31.4/src/remmina_pref.h    2018-08-24 15:40:04.000000000 
+0200
@@ -214,7 +214,7 @@
 extern RemminaPref remmina_pref;
 
 void remmina_pref_init(void);
-void remmina_pref_save(void);
+gboolean remmina_pref_save(void);
 
 void remmina_pref_add_recent(const gchar *protocol, const gchar *server);
 gchar* remmina_pref_get_recent(const gchar *protocol);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/src/remmina_ssh.c 
new/Remmina-v1.2.31.4/src/remmina_ssh.c
--- old/Remmina-v1.2.31.2/src/remmina_ssh.c     2018-07-31 14:53:53.000000000 
+0200
+++ new/Remmina-v1.2.31.4/src/remmina_ssh.c     2018-08-24 15:40:04.000000000 
+0200
@@ -1020,14 +1020,21 @@
        case REMMINA_SSH_TUNNEL_XPORT:
                /* Detect the next available port starting from 6010 on the 
server */
                for (i = 10; i <= MAX_X_DISPLAY_NUMBER; i++) {
-                       G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+#if LIBSSH_VERSION_INT >= SSH_VERSION_INT (0, 7, 0)
+                       if 
(ssh_channel_listen_forward(REMMINA_SSH(tunnel)->session, 
(tunnel->bindlocalhost ? "localhost" : NULL), 6000 + i, NULL)) {
+                               continue;
+                       }else  {
+                               tunnel->remotedisplay = i;
+                               break;
+                       }
+#else
                        if (ssh_forward_listen(REMMINA_SSH(tunnel)->session, 
(tunnel->bindlocalhost ? "localhost" : NULL), 6000 + i, NULL)) {
                                continue;
                        }else  {
                                tunnel->remotedisplay = i;
                                break;
                        }
-                       G_GNUC_END_IGNORE_DEPRECATIONS
+#endif
                }
                if (tunnel->remotedisplay < 1) {
                        remmina_ssh_set_error(REMMINA_SSH(tunnel), _("Failed to 
request port forwarding : %s"));
@@ -1050,7 +1057,16 @@
                break;
 
        case REMMINA_SSH_TUNNEL_REVERSE:
-               G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+#if LIBSSH_VERSION_INT >= SSH_VERSION_INT (0, 7, 0)
+               if (ssh_channel_listen_forward(REMMINA_SSH(tunnel)->session, 
NULL, tunnel->port, NULL)) {
+                       remmina_ssh_set_error(REMMINA_SSH (tunnel), _("Failed 
to request port forwarding : %s"));
+                       if (tunnel->disconnect_func) {
+                               (*tunnel->disconnect_func)(tunnel, 
tunnel->callback_data);
+                       }
+                       tunnel->thread = 0;
+                       return NULL;
+               }
+#else
                if (ssh_forward_listen(REMMINA_SSH(tunnel)->session, NULL, 
tunnel->port, NULL)) {
                        remmina_ssh_set_error(REMMINA_SSH (tunnel), _("Failed 
to request port forwarding : %s"));
                        if (tunnel->disconnect_func) {
@@ -1059,7 +1075,7 @@
                        tunnel->thread = 0;
                        return NULL;
                }
-               G_GNUC_END_IGNORE_DEPRECATIONS
+#endif
 
                if (tunnel->init_func &&
                    !(*tunnel->init_func)(tunnel, tunnel->callback_data)) {
@@ -1102,9 +1118,11 @@
                                }
                                if (tunnel->tunnel_type == 
REMMINA_SSH_TUNNEL_REVERSE) {
                                        /* For reverse tunnel, we only need one 
connection. */
-                                       G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+#if LIBSSH_VERSION_INT >= SSH_VERSION_INT (0, 7, 0)
+                                       ssh_channel_cancel_forward(REMMINA_SSH 
(tunnel)->session, NULL, tunnel->port);
+#else
                                        ssh_forward_cancel(REMMINA_SSH 
(tunnel)->session, NULL, tunnel->port);
-                                       G_GNUC_END_IGNORE_DEPRECATIONS
+#endif
                                }
                        }else if (tunnel->tunnel_type != 
REMMINA_SSH_TUNNEL_REVERSE) {
                                /* Poll once per some period of time if no 
incoming connections.
@@ -1421,9 +1439,11 @@
        }
 
        if (tunnel->tunnel_type == REMMINA_SSH_TUNNEL_XPORT && 
tunnel->remotedisplay > 0) {
-               G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+#if LIBSSH_VERSION_INT >= SSH_VERSION_INT (0, 7, 0)
+               ssh_channel_cancel_forward(REMMINA_SSH (tunnel)->session, NULL, 
6000 + tunnel->remotedisplay);
+#else
                ssh_forward_cancel(REMMINA_SSH (tunnel)->session, NULL, 6000 + 
tunnel->remotedisplay);
-               G_GNUC_END_IGNORE_DEPRECATIONS
+#endif
        }
        if (tunnel->server_sock >= 0) {
                close(tunnel->server_sock);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/src/remmina_ssh_plugin.c 
new/Remmina-v1.2.31.4/src/remmina_ssh_plugin.c
--- old/Remmina-v1.2.31.2/src/remmina_ssh_plugin.c      2018-07-31 
14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/src/remmina_ssh_plugin.c      2018-08-24 
15:40:04.000000000 +0200
@@ -579,7 +579,7 @@
  *
  * @see remmina_plugin_ssh_popup_ui
  * @see RemminaProtocolWidget
- * @see 
https://github.com/FreeRDP/Remmina/wiki/Remmina-SSH-Terminal-colour-schemes
+ * @see 
https://gitlab.com/Remmina/Remmina/wikis/Remmina-SSH-Terminal-colour-schemes
  */
 static void
 remmina_plugin_ssh_init(RemminaProtocolWidget *gp)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Remmina-v1.2.31.2/src/remmina_stats_sender.c 
new/Remmina-v1.2.31.4/src/remmina_stats_sender.c
--- old/Remmina-v1.2.31.2/src/remmina_stats_sender.c    2018-07-31 
14:53:53.000000000 +0200
+++ new/Remmina-v1.2.31.4/src/remmina_stats_sender.c    2018-08-24 
15:40:04.000000000 +0200
@@ -292,7 +292,7 @@
 
 gboolean remmina_stat_sender_can_send()
 {
-       if (remmina_pref.periodic_usage_stats_permission_asked && 
remmina_pref.periodic_usage_stats_permitted)
+       if (remmina_pref.periodic_usage_stats_permission_asked && 
remmina_pref.periodic_usage_stats_permitted && remmina_pref_save())
                return TRUE;
        else
                return FALSE;


Reply via email to