@@ -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