diff --git a/src/MainWindow.vala b/src/MainWindow.vala index 924c4b184..a4b9e7608 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -304,7 +304,7 @@ namespace Scratch { plugins = new Scratch.Services.PluginsManager (this); key_controller = new Gtk.EventControllerKey (this) { - propagation_phase = CAPTURE + propagation_phase = TARGET }; key_controller.key_pressed.connect (on_key_pressed); diff --git a/src/Widgets/Terminal.vala b/src/Widgets/Terminal.vala index 2219769a5..5b2d9c428 100644 --- a/src/Widgets/Terminal.vala +++ b/src/Widgets/Terminal.vala @@ -16,6 +16,9 @@ public class Code.Terminal : Gtk.Box { private const string SETTINGS_SCHEMA = "io.elementary.terminal.settings"; public Vte.Terminal terminal { get; construct; } + private Gtk.EventControllerKey key_controller; + private Settings pantheon_terminal_settings; + public SimpleActionGroup actions { get; construct; } private GLib.Pid child_pid; @@ -63,6 +66,11 @@ public class Code.Terminal : Gtk.Box { menu.insert_action_group (ACTION_GROUP, actions); menu.show_all (); + key_controller = new Gtk.EventControllerKey (terminal) { + propagation_phase = BUBBLE + }; + key_controller.key_pressed.connect (key_pressed); + terminal.button_press_event.connect ((event) => { if (event.button == 3) { paste_action.set_enabled (current_clipboard.wait_is_text_available ()); @@ -130,7 +138,7 @@ public class Code.Terminal : Gtk.Box { } private void update_terminal_settings (string settings_schema) { - var pantheon_terminal_settings = new GLib.Settings (settings_schema); + pantheon_terminal_settings = new GLib.Settings (settings_schema); var font_name = pantheon_terminal_settings.get_string ("font"); if (font_name == "") { @@ -207,4 +215,35 @@ public class Code.Terminal : Gtk.Box { public void set_default_font_size () { terminal.font_scale = 1.0; } + + private bool key_pressed (uint keyval, uint keycode, Gdk.ModifierType modifiers) { + // Use hardware keycodes so the key used is unaffected by internationalized layout + bool match_keycode (uint keyval, uint code) { + Gdk.KeymapKey[] keys; + + var keymap = Gdk.Keymap.get_for_display (get_display ()); + if (keymap.get_entries_for_keyval (keyval, out keys)) { + foreach (var key in keys) { + if (code == key.keycode) { + return Gdk.EVENT_STOP; + } + } + } + + return Gdk.EVENT_PROPAGATE; + } + + if (CONTROL_MASK in modifiers && pantheon_terminal_settings.get_boolean ("natural-copy-paste")) { + if (match_keycode (Gdk.Key.c, keycode)) { + actions.activate_action (ACTION_COPY, null); + return Gdk.EVENT_STOP; + } else if (match_keycode (Gdk.Key.v, keycode)) { + actions.activate_action (ACTION_PASTE, null); + return Gdk.EVENT_STOP; + } + } + + + return Gdk.EVENT_PROPAGATE; + } }