diff --git a/0001_paste_as_keystrokes_fix_git_partial_eb3d59fb.patch b/0001_paste_as_keystrokes_fix_git_partial_eb3d59fb.patch new file mode 100644 index 0000000..2005df9 --- /dev/null +++ b/0001_paste_as_keystrokes_fix_git_partial_eb3d59fb.patch @@ -0,0 +1,86 @@ +diff --git a/src/rcw.c b/src/rcw.c +index d4093d3b4d91142290015adde0c8dece083d8fcd..27eb3bad1b7a4f4fa49639bd5040d12bea0c138c 100644 +--- a/src/rcw.c ++++ b/src/rcw.c +@@ -2060,6 +2060,14 @@ static void rcw_toolbar_tools(GtkToolItem *toggle, RemminaConnectionWindow *cnnw + g_strfreev(keystroke_values); + } + menuitem = gtk_menu_item_new_with_label(_("Send clipboard content as keystrokes")); ++ static gchar k_tooltip[] = ++ N_("CAUTION! We send hardware codes from your local keyboard,\nmany characters can be different from the original text.\n" ++ "\n" ++ " • To get the best result, set the same keyboard on the client and server.\n" ++ "\n" ++ " • Non composable characters using your keyboard will not be transferred.\n" ++ "\n"); ++ gtk_widget_set_tooltip_text(menuitem, k_tooltip); + gtk_menu_shell_append(GTK_MENU_SHELL(submenu_keystrokes), menuitem); + g_signal_connect_swapped(G_OBJECT(menuitem), "activate", + G_CALLBACK(remmina_protocol_widget_send_clipboard), +diff --git a/src/remmina_protocol_widget.c b/src/remmina_protocol_widget.c +index 1c590b0fceaef6b024eb37d4d8ba2c9391b9976c..e4adfd2a6bc28b2d23ed5a17ae9c964fc141f139 100644 +--- a/src/remmina_protocol_widget.c ++++ b/src/remmina_protocol_widget.c +@@ -597,7 +597,7 @@ void remmina_protocol_widget_send_clip_strokes(GtkClipboard *clipboard, const gc + { + TRACE_CALL(__func__); + RemminaProtocolWidget *gp = REMMINA_PROTOCOL_WIDGET(data); +- gchar *text = g_strdup(clip_text); ++ gchar *text = g_utf8_normalize(clip_text, -1, G_NORMALIZE_DEFAULT_COMPOSE); + guint *keyvals; + gint i; + GdkKeymap *keymap = gdk_keymap_get_for_display(gdk_display_get_default()); +@@ -634,18 +634,22 @@ void remmina_protocol_widget_send_clip_strokes(GtkClipboard *clipboard, const gc + REMMINA_DEBUG("Text clipboard after replacement is \'%s\'", text); + } + gchar *iter = g_strdup(text); ++ REMMINA_DEBUG("Iter: %s", iter), + keyvals = (guint *)g_malloc(strlen(text)); + while (TRUE) { + /* Process each character in the keystrokes */ + character = g_utf8_get_char_validated(iter, -1); ++ REMMINA_DEBUG("Char: U+%04" G_GINT32_FORMAT"X", character); + if (character == 0) + break; + keyval = gdk_unicode_to_keyval(character); ++ REMMINA_DEBUG("Keyval: %u", keyval); + /* Replace all the special character with its keyval */ + for (i = 0; text_replaces[i].replace; i++) { + if (character == text_replaces[i].replace[0]) { + keys = g_new0(GdkKeymapKey, 1); + keyval = text_replaces[i].keyval; ++ REMMINA_DEBUG("Special Keyval: %u", keyval); + /* A special character was generated, no keyval lookup needed */ + character = 0; + break; +@@ -655,7 +659,7 @@ void remmina_protocol_widget_send_clip_strokes(GtkClipboard *clipboard, const gc + if (character) { + /* get keyval without modifications */ + if (!gdk_keymap_get_entries_for_keyval(keymap, keyval, &keys, &n_keys)) { +- g_warning("keyval 0x%04x has no keycode!", keyval); ++ REMMINA_WARNING("keyval 0x%04x has no keycode!", keyval); + iter = g_utf8_find_next_char(iter, NULL); + continue; + } +@@ -2111,6 +2115,7 @@ void remmina_protocol_widget_send_keys_signals(GtkWidget *widget, const guint *k + event.keyval = keyvals[i]; + event.hardware_keycode = remmina_public_get_keycode_for_keyval(keymap, event.keyval); + event.is_modifier = (int)remmina_public_get_modifier_for_keycode(keymap, event.hardware_keycode); ++ REMMINA_DEBUG("Sending keyval: %u, hardware_keycode: %u", event.keyval, event.hardware_keycode); + g_signal_emit_by_name(G_OBJECT(widget), "key-press-event", &event, &result); + } + } +diff --git a/src/remmina_public.c b/src/remmina_public.c +index 02ff5c7d997e132598583fe415149856fee90111..5c5c4640df669705be008db0e3103329d5e6092c 100644 +--- a/src/remmina_public.c ++++ b/src/remmina_public.c +@@ -541,7 +541,8 @@ guint16 remmina_public_get_keycode_for_keyval(GdkKeymap *keymap, guint keyval) + gboolean remmina_public_get_modifier_for_keycode(GdkKeymap *keymap, guint16 keycode) + { + TRACE_CALL(__func__); +- g_return_val_if_fail(keycode > 0, FALSE); ++ //g_return_val_if_fail(keycode > 0, FALSE); ++ if (keycode > 0) return FALSE; + #ifdef GDK_WINDOWING_X11 + return gdk_x11_keymap_key_is_modifier(keymap, keycode); + #else diff --git a/remmina.spec b/remmina.spec index fbadcf7..5a73d6d 100644 --- a/remmina.spec +++ b/remmina.spec @@ -18,6 +18,9 @@ Source0: https://gitlab.com/Remmina/Remmina/-/archive/v%{version}/Remmina-%{vers # So we can't use it directly only as instructions. Source1: pluginBuild-CMakeLists.txt +# Patches. +Patch0: 0001_paste_as_keystrokes_fix_git_partial_eb3d59fb.patch + BuildRequires: cmake BuildRequires: cups-devel BuildRequires: desktop-file-utils @@ -340,7 +343,8 @@ appstream-util validate-relax --nonet %{buildroot}/%{_datadir}/metainfo/*.appdat %{_mandir}/man1/remmina-gnome.1.* %changelog -* Sun May 22 2022 Phil Wyett - 1.4.26-3 +* Mon Jun 06 2022 Phil Wyett - 1.4.26-3 +- Add patch: 0001_paste_as_keystrokes_fix_git_partial_eb3d59fb.patch - Add libssh BuildRequires minimum required version of 0.8.0. - Remove EL7 build support due to new libssh minimum required version. - Remove telepathy plugin activation switch as no longer required.