diff --git a/src/Widgets/Terminal.vala b/src/Widgets/Terminal.vala index ee28946f3..8b22da3aa 100644 --- a/src/Widgets/Terminal.vala +++ b/src/Widgets/Terminal.vala @@ -14,10 +14,23 @@ public class Code.Terminal : Gtk.Box { private const double MIN_SCALE = 0.2; private const string LEGACY_SETTINGS_SCHEMA = "org.pantheon.terminal.settings"; private const string SETTINGS_SCHEMA = "io.elementary.terminal.settings"; + private const string GNOME_DESKTOP_INTERFACE_SCHEMA = "org.gnome.desktop.interface"; + private const string GNOME_DESKTOP_WM_PREFERENCES_SCHEMA = "org.gnome.desktop.wm.preferences"; + private const string TERMINAL_FONT_KEY = "font"; + private const string TERMINAL_BELL_KEY = "audible-bell"; + private const string TERMINAL_CURSOR_KEY = "cursor-shape"; + private const string TERMINAL_FOREGROUND_KEY = "foreground"; + private const string TERMINAL_BACKGROUND_KEY = "background"; + private const string TERMINAL_PALETTE_KEY = "palette"; + private const string GNOME_FONT_KEY = "monospace-font-name"; + private const string GNOME_BELL_KEY = "audible-bell"; public Vte.Terminal terminal { get; construct; } private Gtk.EventControllerKey key_controller; - private Settings pantheon_terminal_settings; + + private Settings? terminal_settings = null; + private Settings? gnome_interface_settings = null; + private Settings? gnome_wm_settings = null; public SimpleActionGroup actions { get; construct; } @@ -28,21 +41,80 @@ public class Code.Terminal : Gtk.Box { terminal = new Vte.Terminal () { hexpand = true, vexpand = true, - scrollback_lines = -1 + scrollback_lines = -1, + cursor_blink_mode = SYSTEM // There is no Terminal setting so follow Gnome }; // Set font, allow-bold, audible-bell, background, foreground, and palette of pantheon-terminal var schema_source = SettingsSchemaSource.get_default (); var terminal_schema = schema_source.lookup (SETTINGS_SCHEMA, true); + if (terminal_schema == null) { + terminal_schema = schema_source.lookup (LEGACY_SETTINGS_SCHEMA, true); + } + if (terminal_schema != null) { - update_terminal_settings (SETTINGS_SCHEMA); + terminal_settings = new Settings.full (terminal_schema, null, null); + terminal_settings.changed.connect ((key) => { + switch (key) { + case TERMINAL_FONT_KEY: + update_font (); + break; + case TERMINAL_BELL_KEY: + update_audible_bell (); + break; + case TERMINAL_CURSOR_KEY: + update_cursor (); + break; + case TERMINAL_FOREGROUND_KEY: + case TERMINAL_BACKGROUND_KEY: + case TERMINAL_PALETTE_KEY: + update_colors (); + break; + default: + //TODO Handle other relevant terminal settings? + // "theme" + // "prefer-dark-style" + break; + } + }); } else { - var legacy_terminal_schema = schema_source.lookup (LEGACY_SETTINGS_SCHEMA, true); - if (legacy_terminal_schema != null) { - update_terminal_settings (LEGACY_SETTINGS_SCHEMA); + var gnome_wm_settings_schema = schema_source.lookup (GNOME_DESKTOP_WM_PREFERENCES_SCHEMA, true); + if (gnome_wm_settings_schema != null) { + gnome_wm_settings = new Settings.full (gnome_wm_settings_schema, null, null); + gnome_wm_settings.changed.connect ((key) => { + switch (key) { + case GNOME_BELL_KEY: + update_audible_bell (); + break; + default: + break; + } + }); } + //TODO monitor changes in relevant system settings? + // "org.gnome.desktop.interface.color-scheme" } + // Always monitor changes in default font as that is what Terminal usually follows + var gnome_interface_settings_schema = schema_source.lookup (GNOME_DESKTOP_INTERFACE_SCHEMA, true); + if (gnome_interface_settings_schema != null) { + gnome_interface_settings = new Settings.full (gnome_interface_settings_schema, null, null); + gnome_interface_settings.changed.connect ((key) => { + switch (key) { + case GNOME_FONT_KEY: + update_font (); + break; + default: + break; + } + }); + } + + update_font (); + update_audible_bell (); + update_cursor (); + update_colors (); + terminal.child_exited.connect (() => { //Hide the exited terminal var win_group = get_action_group (Scratch.MainWindow.ACTION_GROUP); @@ -143,71 +215,87 @@ public class Code.Terminal : Gtk.Box { } } - private void update_terminal_settings (string settings_schema) { - pantheon_terminal_settings = new GLib.Settings (settings_schema); + private void update_font () { + var font_name = ""; + if (terminal_settings != null) { + font_name = terminal_settings.get_string (TERMINAL_FONT_KEY); + } - var font_name = pantheon_terminal_settings.get_string ("font"); - if (font_name == "") { - var system_settings = new GLib.Settings ("org.gnome.desktop.interface"); - font_name = system_settings.get_string ("monospace-font-name"); + if (font_name == "" && gnome_interface_settings != null) { + font_name = gnome_interface_settings.get_string (GNOME_FONT_KEY); } var fd = Pango.FontDescription.from_string (font_name); terminal.set_font (fd); + } - bool audible_bell_setting = pantheon_terminal_settings.get_boolean ("audible-bell"); - this.terminal.set_audible_bell (audible_bell_setting); - - string cursor_shape_setting = pantheon_terminal_settings.get_string ("cursor-shape"); - - switch (cursor_shape_setting) { - case "Block": - this.terminal.cursor_shape = Vte.CursorShape.BLOCK; - break; - case "I-Beam": - this.terminal.cursor_shape = Vte.CursorShape.IBEAM; - break; - case "Underline": - this.terminal.cursor_shape = Vte.CursorShape.UNDERLINE; - break; + private void update_audible_bell () { + var audible_bell = false; + if (terminal_settings != null) { + audible_bell = terminal_settings.get_boolean (TERMINAL_BELL_KEY); + } else if (gnome_wm_settings != null) { + audible_bell = gnome_wm_settings.get_boolean (GNOME_BELL_KEY); } - string background_setting = pantheon_terminal_settings.get_string ("background"); - Gdk.RGBA background_color = Gdk.RGBA (); - background_color.parse (background_setting); - - string foreground_setting = pantheon_terminal_settings.get_string ("foreground"); - Gdk.RGBA foreground_color = Gdk.RGBA (); - foreground_color.parse (foreground_setting); - - string palette_setting = pantheon_terminal_settings.get_string ("palette"); - - string[] hex_palette = {"#000000", "#FF6C60", "#A8FF60", "#FFFFCC", "#96CBFE", - "#FF73FE", "#C6C5FE", "#EEEEEE", "#000000", "#FF6C60", - "#A8FF60", "#FFFFB6", "#96CBFE", "#FF73FE", "#C6C5FE", - "#EEEEEE"}; - - string current_string = ""; - int current_color = 0; - for (var i = 0; i < palette_setting.length; i++) { - if (palette_setting[i] == ':') { - hex_palette[current_color] = current_string; - current_string = ""; - current_color++; - } else { - current_string += palette_setting[i].to_string (); + terminal.set_audible_bell (audible_bell); + } + + private void update_cursor () { + if (terminal_settings != null) { + var cursor_shape_setting = terminal_settings.get_string (TERMINAL_CURSOR_KEY); + switch (cursor_shape_setting) { + case "Block": + terminal.cursor_shape = Vte.CursorShape.BLOCK; + break; + case "I-Beam": + terminal.cursor_shape = Vte.CursorShape.IBEAM; + break; + case "Underline": + terminal.cursor_shape = Vte.CursorShape.UNDERLINE; + break; + } + } //No corresponding system keymap + } + + private void update_colors () { + if (terminal_settings != null) { + string background_setting = terminal_settings.get_string (TERMINAL_BACKGROUND_KEY); + Gdk.RGBA background_color = Gdk.RGBA (); + background_color.parse (background_setting); + + string foreground_setting = terminal_settings.get_string (TERMINAL_FOREGROUND_KEY); + Gdk.RGBA foreground_color = Gdk.RGBA (); + foreground_color.parse (foreground_setting); + + string palette_setting = terminal_settings.get_string (TERMINAL_PALETTE_KEY); + + string[] hex_palette = {"#000000", "#FF6C60", "#A8FF60", "#FFFFCC", "#96CBFE", + "#FF73FE", "#C6C5FE", "#EEEEEE", "#000000", "#FF6C60", + "#A8FF60", "#FFFFB6", "#96CBFE", "#FF73FE", "#C6C5FE", + "#EEEEEE"}; + + string current_string = ""; + int current_color = 0; + for (var i = 0; i < palette_setting.length; i++) { + if (palette_setting[i] == ':') { + hex_palette[current_color] = current_string; + current_string = ""; + current_color++; + } else { + current_string += palette_setting[i].to_string (); + } } - } - Gdk.RGBA[] palette = new Gdk.RGBA[16]; + Gdk.RGBA[] palette = new Gdk.RGBA[16]; - for (int i = 0; i < hex_palette.length; i++) { - Gdk.RGBA new_color = Gdk.RGBA (); - new_color.parse (hex_palette[i]); - palette[i] = new_color; - } + for (int i = 0; i < hex_palette.length; i++) { + Gdk.RGBA new_color = Gdk.RGBA (); + new_color.parse (hex_palette[i]); + palette[i] = new_color; + } - this.terminal.set_colors (foreground_color, background_color, palette); + terminal.set_colors (foreground_color, background_color, palette); + } //No suitable system keys } public void increment_size () { @@ -239,7 +327,9 @@ public class Code.Terminal : Gtk.Box { return Gdk.EVENT_PROPAGATE; } - if (CONTROL_MASK in modifiers && pantheon_terminal_settings.get_boolean ("natural-copy-paste")) { + if (CONTROL_MASK in modifiers && (SHIFT_MASK in modifiers || + terminal_settings != null && terminal_settings.get_boolean ("natural-copy-paste"))) { + if (match_keycode (Gdk.Key.c, keycode) && terminal.get_has_selection ()) { actions.activate_action (ACTION_COPY, null); return Gdk.EVENT_STOP;