Skip to content

Commit 34ba8fb

Browse files
authored
Rework terminal settings (#1585)
Fixes #1586 Fixes #276 - Handle absence of pantheon terminal settings schema better - Monitor settings for changes, Terminal settings falling back to Gnome settings for "audible-bell" - Always monitor default Gnome font setting - Always follow Gnome cursor-blink setting - Terminal pane does not crash if neither Terminal nor Gnome settings schemas found (may need to be addressed for Code as whole but out of scope for this PR) The behaviour with regard to Terminal/System style settings is unchanged - this will be addressed in a separate PR. The Terminal pane only responds to changes in the Terminal "foreground", "background" and "palette" keys but not "window-style" or "cursor-color".
1 parent 0dde465 commit 34ba8fb

File tree

1 file changed

+150
-60
lines changed

1 file changed

+150
-60
lines changed

src/Widgets/Terminal.vala

Lines changed: 150 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,23 @@ public class Code.Terminal : Gtk.Box {
1414
private const double MIN_SCALE = 0.2;
1515
private const string LEGACY_SETTINGS_SCHEMA = "org.pantheon.terminal.settings";
1616
private const string SETTINGS_SCHEMA = "io.elementary.terminal.settings";
17+
private const string GNOME_DESKTOP_INTERFACE_SCHEMA = "org.gnome.desktop.interface";
18+
private const string GNOME_DESKTOP_WM_PREFERENCES_SCHEMA = "org.gnome.desktop.wm.preferences";
19+
private const string TERMINAL_FONT_KEY = "font";
20+
private const string TERMINAL_BELL_KEY = "audible-bell";
21+
private const string TERMINAL_CURSOR_KEY = "cursor-shape";
22+
private const string TERMINAL_FOREGROUND_KEY = "foreground";
23+
private const string TERMINAL_BACKGROUND_KEY = "background";
24+
private const string TERMINAL_PALETTE_KEY = "palette";
25+
private const string GNOME_FONT_KEY = "monospace-font-name";
26+
private const string GNOME_BELL_KEY = "audible-bell";
1727

1828
public Vte.Terminal terminal { get; construct; }
1929
private Gtk.EventControllerKey key_controller;
20-
private Settings pantheon_terminal_settings;
30+
31+
private Settings? terminal_settings = null;
32+
private Settings? gnome_interface_settings = null;
33+
private Settings? gnome_wm_settings = null;
2134

2235
public SimpleActionGroup actions { get; construct; }
2336

@@ -28,21 +41,80 @@ public class Code.Terminal : Gtk.Box {
2841
terminal = new Vte.Terminal () {
2942
hexpand = true,
3043
vexpand = true,
31-
scrollback_lines = -1
44+
scrollback_lines = -1,
45+
cursor_blink_mode = SYSTEM // There is no Terminal setting so follow Gnome
3246
};
3347

3448
// Set font, allow-bold, audible-bell, background, foreground, and palette of pantheon-terminal
3549
var schema_source = SettingsSchemaSource.get_default ();
3650
var terminal_schema = schema_source.lookup (SETTINGS_SCHEMA, true);
51+
if (terminal_schema == null) {
52+
terminal_schema = schema_source.lookup (LEGACY_SETTINGS_SCHEMA, true);
53+
}
54+
3755
if (terminal_schema != null) {
38-
update_terminal_settings (SETTINGS_SCHEMA);
56+
terminal_settings = new Settings.full (terminal_schema, null, null);
57+
terminal_settings.changed.connect ((key) => {
58+
switch (key) {
59+
case TERMINAL_FONT_KEY:
60+
update_font ();
61+
break;
62+
case TERMINAL_BELL_KEY:
63+
update_audible_bell ();
64+
break;
65+
case TERMINAL_CURSOR_KEY:
66+
update_cursor ();
67+
break;
68+
case TERMINAL_FOREGROUND_KEY:
69+
case TERMINAL_BACKGROUND_KEY:
70+
case TERMINAL_PALETTE_KEY:
71+
update_colors ();
72+
break;
73+
default:
74+
//TODO Handle other relevant terminal settings?
75+
// "theme"
76+
// "prefer-dark-style"
77+
break;
78+
}
79+
});
3980
} else {
40-
var legacy_terminal_schema = schema_source.lookup (LEGACY_SETTINGS_SCHEMA, true);
41-
if (legacy_terminal_schema != null) {
42-
update_terminal_settings (LEGACY_SETTINGS_SCHEMA);
81+
var gnome_wm_settings_schema = schema_source.lookup (GNOME_DESKTOP_WM_PREFERENCES_SCHEMA, true);
82+
if (gnome_wm_settings_schema != null) {
83+
gnome_wm_settings = new Settings.full (gnome_wm_settings_schema, null, null);
84+
gnome_wm_settings.changed.connect ((key) => {
85+
switch (key) {
86+
case GNOME_BELL_KEY:
87+
update_audible_bell ();
88+
break;
89+
default:
90+
break;
91+
}
92+
});
4393
}
94+
//TODO monitor changes in relevant system settings?
95+
// "org.gnome.desktop.interface.color-scheme"
4496
}
4597

98+
// Always monitor changes in default font as that is what Terminal usually follows
99+
var gnome_interface_settings_schema = schema_source.lookup (GNOME_DESKTOP_INTERFACE_SCHEMA, true);
100+
if (gnome_interface_settings_schema != null) {
101+
gnome_interface_settings = new Settings.full (gnome_interface_settings_schema, null, null);
102+
gnome_interface_settings.changed.connect ((key) => {
103+
switch (key) {
104+
case GNOME_FONT_KEY:
105+
update_font ();
106+
break;
107+
default:
108+
break;
109+
}
110+
});
111+
}
112+
113+
update_font ();
114+
update_audible_bell ();
115+
update_cursor ();
116+
update_colors ();
117+
46118
terminal.child_exited.connect (() => {
47119
//Hide the exited terminal
48120
var win_group = get_action_group (Scratch.MainWindow.ACTION_GROUP);
@@ -143,71 +215,87 @@ public class Code.Terminal : Gtk.Box {
143215
}
144216
}
145217

146-
private void update_terminal_settings (string settings_schema) {
147-
pantheon_terminal_settings = new GLib.Settings (settings_schema);
218+
private void update_font () {
219+
var font_name = "";
220+
if (terminal_settings != null) {
221+
font_name = terminal_settings.get_string (TERMINAL_FONT_KEY);
222+
}
148223

149-
var font_name = pantheon_terminal_settings.get_string ("font");
150-
if (font_name == "") {
151-
var system_settings = new GLib.Settings ("org.gnome.desktop.interface");
152-
font_name = system_settings.get_string ("monospace-font-name");
224+
if (font_name == "" && gnome_interface_settings != null) {
225+
font_name = gnome_interface_settings.get_string (GNOME_FONT_KEY);
153226
}
154227

155228
var fd = Pango.FontDescription.from_string (font_name);
156229
terminal.set_font (fd);
230+
}
157231

158-
bool audible_bell_setting = pantheon_terminal_settings.get_boolean ("audible-bell");
159-
this.terminal.set_audible_bell (audible_bell_setting);
160-
161-
string cursor_shape_setting = pantheon_terminal_settings.get_string ("cursor-shape");
162-
163-
switch (cursor_shape_setting) {
164-
case "Block":
165-
this.terminal.cursor_shape = Vte.CursorShape.BLOCK;
166-
break;
167-
case "I-Beam":
168-
this.terminal.cursor_shape = Vte.CursorShape.IBEAM;
169-
break;
170-
case "Underline":
171-
this.terminal.cursor_shape = Vte.CursorShape.UNDERLINE;
172-
break;
232+
private void update_audible_bell () {
233+
var audible_bell = false;
234+
if (terminal_settings != null) {
235+
audible_bell = terminal_settings.get_boolean (TERMINAL_BELL_KEY);
236+
} else if (gnome_wm_settings != null) {
237+
audible_bell = gnome_wm_settings.get_boolean (GNOME_BELL_KEY);
173238
}
174239

175-
string background_setting = pantheon_terminal_settings.get_string ("background");
176-
Gdk.RGBA background_color = Gdk.RGBA ();
177-
background_color.parse (background_setting);
178-
179-
string foreground_setting = pantheon_terminal_settings.get_string ("foreground");
180-
Gdk.RGBA foreground_color = Gdk.RGBA ();
181-
foreground_color.parse (foreground_setting);
182-
183-
string palette_setting = pantheon_terminal_settings.get_string ("palette");
184-
185-
string[] hex_palette = {"#000000", "#FF6C60", "#A8FF60", "#FFFFCC", "#96CBFE",
186-
"#FF73FE", "#C6C5FE", "#EEEEEE", "#000000", "#FF6C60",
187-
"#A8FF60", "#FFFFB6", "#96CBFE", "#FF73FE", "#C6C5FE",
188-
"#EEEEEE"};
189-
190-
string current_string = "";
191-
int current_color = 0;
192-
for (var i = 0; i < palette_setting.length; i++) {
193-
if (palette_setting[i] == ':') {
194-
hex_palette[current_color] = current_string;
195-
current_string = "";
196-
current_color++;
197-
} else {
198-
current_string += palette_setting[i].to_string ();
240+
terminal.set_audible_bell (audible_bell);
241+
}
242+
243+
private void update_cursor () {
244+
if (terminal_settings != null) {
245+
var cursor_shape_setting = terminal_settings.get_string (TERMINAL_CURSOR_KEY);
246+
switch (cursor_shape_setting) {
247+
case "Block":
248+
terminal.cursor_shape = Vte.CursorShape.BLOCK;
249+
break;
250+
case "I-Beam":
251+
terminal.cursor_shape = Vte.CursorShape.IBEAM;
252+
break;
253+
case "Underline":
254+
terminal.cursor_shape = Vte.CursorShape.UNDERLINE;
255+
break;
256+
}
257+
} //No corresponding system keymap
258+
}
259+
260+
private void update_colors () {
261+
if (terminal_settings != null) {
262+
string background_setting = terminal_settings.get_string (TERMINAL_BACKGROUND_KEY);
263+
Gdk.RGBA background_color = Gdk.RGBA ();
264+
background_color.parse (background_setting);
265+
266+
string foreground_setting = terminal_settings.get_string (TERMINAL_FOREGROUND_KEY);
267+
Gdk.RGBA foreground_color = Gdk.RGBA ();
268+
foreground_color.parse (foreground_setting);
269+
270+
string palette_setting = terminal_settings.get_string (TERMINAL_PALETTE_KEY);
271+
272+
string[] hex_palette = {"#000000", "#FF6C60", "#A8FF60", "#FFFFCC", "#96CBFE",
273+
"#FF73FE", "#C6C5FE", "#EEEEEE", "#000000", "#FF6C60",
274+
"#A8FF60", "#FFFFB6", "#96CBFE", "#FF73FE", "#C6C5FE",
275+
"#EEEEEE"};
276+
277+
string current_string = "";
278+
int current_color = 0;
279+
for (var i = 0; i < palette_setting.length; i++) {
280+
if (palette_setting[i] == ':') {
281+
hex_palette[current_color] = current_string;
282+
current_string = "";
283+
current_color++;
284+
} else {
285+
current_string += palette_setting[i].to_string ();
286+
}
199287
}
200-
}
201288

202-
Gdk.RGBA[] palette = new Gdk.RGBA[16];
289+
Gdk.RGBA[] palette = new Gdk.RGBA[16];
203290

204-
for (int i = 0; i < hex_palette.length; i++) {
205-
Gdk.RGBA new_color = Gdk.RGBA ();
206-
new_color.parse (hex_palette[i]);
207-
palette[i] = new_color;
208-
}
291+
for (int i = 0; i < hex_palette.length; i++) {
292+
Gdk.RGBA new_color = Gdk.RGBA ();
293+
new_color.parse (hex_palette[i]);
294+
palette[i] = new_color;
295+
}
209296

210-
this.terminal.set_colors (foreground_color, background_color, palette);
297+
terminal.set_colors (foreground_color, background_color, palette);
298+
} //No suitable system keys
211299
}
212300

213301
public void increment_size () {
@@ -239,7 +327,9 @@ public class Code.Terminal : Gtk.Box {
239327
return Gdk.EVENT_PROPAGATE;
240328
}
241329

242-
if (CONTROL_MASK in modifiers && pantheon_terminal_settings.get_boolean ("natural-copy-paste")) {
330+
if (CONTROL_MASK in modifiers && (SHIFT_MASK in modifiers ||
331+
terminal_settings != null && terminal_settings.get_boolean ("natural-copy-paste"))) {
332+
243333
if (match_keycode (Gdk.Key.c, keycode) && terminal.get_has_selection ()) {
244334
actions.activate_action (ACTION_COPY, null);
245335
return Gdk.EVENT_STOP;

0 commit comments

Comments
 (0)