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;
