Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
210 changes: 150 additions & 60 deletions src/Widgets/Terminal.vala
Original file line number Diff line number Diff line change
Expand Up @@ -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; }

Expand All @@ -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);
Expand Down Expand Up @@ -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 () {
Expand Down Expand Up @@ -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;
Expand Down