topinambour 1.0.11 → 1.0.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +121 -30
- data/bin/topinambour +12 -11
- data/data/app-menu.ui +8 -4
- data/data/gschemas.compiled +0 -0
- data/data/headerbar.ui +6 -64
- data/data/main-menu-popover.ui +131 -0
- data/data/prefs-dialog.ui +405 -505
- data/data/shortcuts.ui +130 -0
- data/data/topinambour.gresource +0 -0
- data/data/topinambour.gresource.xml +2 -19
- data/data/topinambour.gschema.xml +72 -0
- data/lib/actions.rb +12 -13
- data/lib/application.rb +73 -60
- data/lib/color_selector.rb +16 -14
- data/lib/font_selector.rb +8 -14
- data/lib/notebook.rb +22 -11
- data/lib/preferences.rb +159 -114
- data/lib/shortcuts.rb +6 -18
- data/lib/terminal.rb +76 -33
- data/lib/terminal_chooser.rb +247 -110
- data/lib/window.rb +48 -47
- metadata +7 -34
- data/data/#app-menu.ui# +0 -11
- data/data/application-exit-symbolic.svg +0 -32
- data/data/color-select-symbolic.svg +0 -34
- data/data/emblem-photos-symbolic.svg +0 -33
- data/data/font-select-symbolic.svg +0 -33
- data/data/pan-end-symbolic.svg +0 -31
- data/data/pan-start-symbolic.svg +0 -31
- data/data/tab-new-symbolic.svg +0 -34
- data/data/window-close-symbolic.svg +0 -28
- data/lib/css_handler.rb +0 -241
- data/lib/style_properties.rb +0 -171
data/lib/terminal_chooser.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2017 Cedric LE MOIGNE, cedlemo@gmx.com
|
2
2
|
# This file is part of Topinambour.
|
3
3
|
#
|
4
4
|
# Topinambour is free software: you can redistribute it and/or modify
|
@@ -17,59 +17,227 @@ class TopinambourTermChooser < Gtk::ScrolledWindow
|
|
17
17
|
def initialize(window)
|
18
18
|
super(nil, nil)
|
19
19
|
@window = window
|
20
|
+
@notebook = @window.notebook
|
21
|
+
@notebook.generate_tab_preview
|
22
|
+
initialize_list_box
|
23
|
+
initialize_hidden_list_box
|
24
|
+
initialize_main_box
|
25
|
+
configure_window
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def configure_window
|
20
31
|
set_halign(:end)
|
21
32
|
set_valign(:center)
|
22
33
|
set_policy(:never, :automatic)
|
23
34
|
set_name("terminal_chooser")
|
35
|
+
add(@box)
|
36
|
+
set_size_request(-1, @notebook.current.term.allocation.to_a[3] - 8)
|
37
|
+
end
|
24
38
|
|
25
|
-
|
26
|
-
generate_grid
|
27
|
-
fill_grid
|
28
|
-
|
39
|
+
def initialize_main_box
|
29
40
|
@box = Gtk::Box.new(:vertical, 4)
|
30
41
|
@box.name = "topinambour-overview-box"
|
31
|
-
@box.pack_start(
|
32
|
-
|
33
|
-
|
42
|
+
@box.pack_start(main_title, :expand => false, :fill => true, :padding => 6)
|
43
|
+
@box.pack_start(@listbox, :expand => true, :fill => true, :padding => 12)
|
44
|
+
@box.pack_start(box_title("Hidden terminals"),
|
45
|
+
:expand => false, :fill => true, :padding => 6)
|
46
|
+
@box.pack_start(@listbox_hidden, :expand => true, :fill => true,
|
47
|
+
:padding => 12)
|
34
48
|
end
|
35
49
|
|
36
|
-
|
50
|
+
def main_title
|
51
|
+
hbox = Gtk::Box.new(:horizontal, 6)
|
52
|
+
hbox.pack_start(box_title("Terminals"),
|
53
|
+
:expand => true, :fill => true, :padding => 6)
|
54
|
+
hbox.pack_start(box_close_button,
|
55
|
+
:expand => false, :fill => false, :padding => 6)
|
56
|
+
hbox
|
57
|
+
end
|
37
58
|
|
38
|
-
def
|
39
|
-
|
40
|
-
|
41
|
-
|
59
|
+
def box_title(label)
|
60
|
+
title = Gtk::Label.new("> #{label} :")
|
61
|
+
title.halign = :start
|
62
|
+
title
|
42
63
|
end
|
43
64
|
|
44
|
-
def
|
45
|
-
|
46
|
-
|
65
|
+
def box_close_button
|
66
|
+
button = Gtk::Button.new(:icon_name => "window-close-symbolic",
|
67
|
+
:size => :button)
|
68
|
+
button.relief = :none
|
69
|
+
button.signal_connect("clicked") { @window.exit_overlay_mode }
|
70
|
+
button
|
71
|
+
end
|
72
|
+
|
73
|
+
def initialize_list_box
|
74
|
+
@listbox = Gtk::ListBox.new
|
75
|
+
@listbox.margin = 12
|
76
|
+
@listbox.selection_mode = :single
|
77
|
+
fill_list_box
|
78
|
+
end
|
79
|
+
|
80
|
+
def initialize_hidden_list_box
|
81
|
+
@listbox_hidden = Gtk::ListBox.new
|
82
|
+
@listbox_hidden.placeholder = Gtk::Label.new("Hidden terminals")
|
83
|
+
@listbox_hidden.margin = 12
|
84
|
+
@listbox_hidden.show_all
|
85
|
+
@listbox_hidden.selection_mode = :single
|
86
|
+
fill_hidden_list_box
|
87
|
+
end
|
88
|
+
|
89
|
+
def fill_list_box
|
90
|
+
@listbox.signal_connect "row-selected" do |_list, row|
|
91
|
+
@notebook.current_page = row.nil? ? @notebook.children.size : row.index
|
92
|
+
end
|
93
|
+
|
94
|
+
@notebook.children.each_with_index do |child, i|
|
95
|
+
row = generate_list_box_row(child.term, i)
|
96
|
+
@listbox.insert(row, i)
|
97
|
+
end
|
98
|
+
current_row = @listbox.get_row_at_index(@notebook.current_page)
|
99
|
+
@listbox.select_row(current_row)
|
100
|
+
current_row.grab_focus
|
101
|
+
end
|
102
|
+
|
103
|
+
def fill_hidden_list_box
|
104
|
+
@notebook.hidden.each_with_index do |child, i|
|
105
|
+
row = generate_hidden_list_box_row(child.term, i)
|
106
|
+
@listbox_hidden.insert(row, i)
|
47
107
|
end
|
48
|
-
@grid.attach(generate_separator, 0, @window.notebook.n_pages, 2, 1)
|
49
|
-
button = generate_quit_button
|
50
|
-
@grid.attach(button, 0, @window.notebook.n_pages + 1, 2, 1)
|
51
108
|
end
|
52
109
|
|
53
|
-
def
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
button
|
58
|
-
|
110
|
+
def generate_list_box_row(term, index)
|
111
|
+
list_box_row = Gtk::ListBoxRow.new
|
112
|
+
hbox = _generate_hbox_list_box_row(list_box_row, term, index)
|
113
|
+
button = generate_hide_button(list_box_row)
|
114
|
+
hbox.pack_start(button, :expand => false, :fill => false, :padding => 6)
|
115
|
+
list_box_row.add(hbox)
|
116
|
+
end
|
117
|
+
|
118
|
+
def generate_hidden_list_box_row(term, index)
|
119
|
+
list_box_row = Gtk::ListBoxRow.new
|
120
|
+
hbox = _generate_hbox_list_box_row(list_box_row, term, index)
|
121
|
+
button = generate_show_button(list_box_row)
|
122
|
+
hbox.pack_start(button, :expand => false, :fill => false, :padding => 6)
|
123
|
+
list_box_row.add(hbox)
|
124
|
+
end
|
125
|
+
|
126
|
+
def _generate_hbox_list_box_row(list_box_row, term, index)
|
127
|
+
hbox = Gtk::Box.new(:horizontal, 6)
|
128
|
+
label = leaning_label(index)
|
129
|
+
hbox.pack_start(label, :expand => false, :fill => false, :padding => 6)
|
130
|
+
button = generate_preview_button(term, list_box_row)
|
59
131
|
add_drag_and_drop_functionalities(button)
|
132
|
+
hbox.pack_start(button, :expand => false, :fill => false, :padding => 6)
|
60
133
|
label = generate_label(term)
|
61
|
-
|
62
|
-
button =
|
63
|
-
|
134
|
+
hbox.pack_start(label, :expand => true, :fill => false, :padding => 6)
|
135
|
+
button = generate_hidden_list_box_row_close(list_box_row)
|
136
|
+
hbox.pack_start(button, :expand => false, :fill => false, :padding => 6)
|
137
|
+
hbox
|
64
138
|
end
|
65
139
|
|
66
|
-
def
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
140
|
+
def generate_hidden_list_box_row_close(list_box_row)
|
141
|
+
button = Gtk::Button.new(:icon_name => "window-close-symbolic",
|
142
|
+
:size => :button)
|
143
|
+
button.relief = :none
|
144
|
+
button.signal_connect "clicked" do
|
145
|
+
@notebook.hidden.delete_at(list_box_row.index)
|
146
|
+
list_box_row.destroy
|
72
147
|
end
|
148
|
+
button
|
149
|
+
end
|
150
|
+
|
151
|
+
def leaning_label(index)
|
152
|
+
label = Gtk::Label.new("tab. #{index + 1}")
|
153
|
+
label.angle = 45
|
154
|
+
label
|
155
|
+
end
|
156
|
+
|
157
|
+
def generate_preview_button(child, list_box_row)
|
158
|
+
button = Gtk::Button.new
|
159
|
+
button.image = generate_preview_image(child.preview)
|
160
|
+
button.signal_connect("clicked") do
|
161
|
+
if list_box_row.parent == @listbox
|
162
|
+
@notebook.current_page = list_box_row.index
|
163
|
+
end
|
164
|
+
end
|
165
|
+
button
|
166
|
+
end
|
167
|
+
|
168
|
+
def generate_preview_image(pixbuf)
|
169
|
+
# scaled_pix = pixbuf.scale(150, 75, :bilinear)
|
170
|
+
scaled_pix = pixbuf.scale(200, 100, :bilinear)
|
171
|
+
img = Gtk::Image.new(:pixbuf => scaled_pix)
|
172
|
+
img.show
|
173
|
+
img
|
174
|
+
end
|
175
|
+
|
176
|
+
def generate_hide_button(list_box_row)
|
177
|
+
button = Gtk::Button.new(:label => "Hide")
|
178
|
+
button.valign = :center
|
179
|
+
button.vexpand = false
|
180
|
+
button.signal_connect "clicked" do
|
181
|
+
num = list_box_row.index
|
182
|
+
@notebook.n_pages == 1 ? @window.quit_gracefully : @notebook.hide(num)
|
183
|
+
list_box_row_bkp = change_button_hide_to_show(list_box_row)
|
184
|
+
@listbox.remove(list_box_row)
|
185
|
+
@listbox_hidden.insert(list_box_row_bkp, -1)
|
186
|
+
update_tabs_num_labels
|
187
|
+
end
|
188
|
+
button
|
189
|
+
end
|
190
|
+
|
191
|
+
def generate_show_button(list_box_row)
|
192
|
+
button = Gtk::Button.new(:label => "Show")
|
193
|
+
button.valign = :center
|
194
|
+
button.vexpand = false
|
195
|
+
button.signal_connect "clicked" do
|
196
|
+
tab_num = list_box_row.index
|
197
|
+
@window.notebook.unhide(tab_num)
|
198
|
+
list_box_row_bkp = change_button_show_to_hide(list_box_row)
|
199
|
+
@listbox_hidden.remove(list_box_row)
|
200
|
+
@listbox.insert(list_box_row_bkp, -1)
|
201
|
+
update_tabs_num_labels
|
202
|
+
end
|
203
|
+
button
|
204
|
+
end
|
205
|
+
|
206
|
+
def change_button_hide_to_show(list_box_row)
|
207
|
+
list_box_row_bkp = list_box_row
|
208
|
+
container = list_box_row_bkp.children[0]
|
209
|
+
hide_button = list_box_row_bkp.children[0].children[4]
|
210
|
+
container.remove(hide_button)
|
211
|
+
show_button = generate_show_button(list_box_row_bkp)
|
212
|
+
show_button.show
|
213
|
+
container.pack_start(show_button,
|
214
|
+
:expand => false, :fill => false, :padding => 6)
|
215
|
+
list_box_row_bkp
|
216
|
+
end
|
217
|
+
|
218
|
+
def change_button_show_to_hide(list_box_row)
|
219
|
+
list_box_row_bkp = list_box_row
|
220
|
+
container = list_box_row_bkp.children[0]
|
221
|
+
show_button = list_box_row_bkp.children[0].children[4]
|
222
|
+
container.remove(show_button)
|
223
|
+
hide_button = generate_hide_button(list_box_row_bkp)
|
224
|
+
hide_button.show
|
225
|
+
container.pack_start(hide_button,
|
226
|
+
:expand => false, :fill => false, :padding => 6)
|
227
|
+
list_box_row_bkp
|
228
|
+
end
|
229
|
+
|
230
|
+
def generate_close_tab_button(list_box_row)
|
231
|
+
button = Gtk::Button.new(:icon_name => "window-close-symbolic",
|
232
|
+
:size => :button)
|
233
|
+
button.relief = :none
|
234
|
+
button.signal_connect "clicked" do
|
235
|
+
tab = @notebook.get_nth_page(list_box_row.index)
|
236
|
+
@notebook.n_pages == 1 ? @window.quit_gracefully : @notebook.remove(tab)
|
237
|
+
list_box_row.destroy
|
238
|
+
update_tabs_num_labels
|
239
|
+
end
|
240
|
+
button
|
73
241
|
end
|
74
242
|
|
75
243
|
def add_label_popup_entry_icon_release(entry, label, term)
|
@@ -83,22 +251,38 @@ class TopinambourTermChooser < Gtk::ScrolledWindow
|
|
83
251
|
end
|
84
252
|
end
|
85
253
|
|
254
|
+
def add_label_popup_entry_activate_signal(entry, popup, label, term)
|
255
|
+
entry.signal_connect "activate" do |widget|
|
256
|
+
label.text = widget.buffer.text
|
257
|
+
term.custom_title = widget.buffer.text
|
258
|
+
popup.destroy
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
86
262
|
def generate_label_popup(label, event, term)
|
87
|
-
entry =
|
88
|
-
entry.max_width_chars = 50
|
89
|
-
entry.buffer.text = label.text
|
90
|
-
entry.set_icon_from_icon_name(:secondary, "edit-clear")
|
263
|
+
entry = initialize_entry_popup(label)
|
91
264
|
pp = Gtk::Popover.new
|
92
265
|
add_label_popup_entry_activate_signal(entry, pp, label, term)
|
93
266
|
add_label_popup_entry_icon_release(entry, label, term)
|
94
|
-
|
95
267
|
pp.add(entry)
|
268
|
+
set_popup_position(pp, label, event)
|
269
|
+
end
|
270
|
+
|
271
|
+
def initialize_entry_popup(label)
|
272
|
+
entry = Gtk::Entry.new
|
273
|
+
entry.max_width_chars = 50
|
274
|
+
entry.buffer.text = label.text
|
275
|
+
entry.set_icon_from_icon_name(:secondary, "edit-clear-symbolic")
|
276
|
+
entry
|
277
|
+
end
|
278
|
+
|
279
|
+
def set_popup_position(popup, label, event)
|
96
280
|
x, y = event.window.coords_to_parent(event.x, event.y)
|
97
281
|
rect = Gdk::Rectangle.new(x - label.allocation.x, y - label.allocation.y,
|
98
282
|
1, 1)
|
99
|
-
|
100
|
-
|
101
|
-
|
283
|
+
popup.pointing_to = rect
|
284
|
+
popup.relative_to = label
|
285
|
+
popup.show_all
|
102
286
|
end
|
103
287
|
|
104
288
|
def generate_label(term)
|
@@ -111,69 +295,23 @@ class TopinambourTermChooser < Gtk::ScrolledWindow
|
|
111
295
|
label
|
112
296
|
end
|
113
297
|
|
114
|
-
def
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
button.add(image)
|
120
|
-
button.hexpand = false
|
121
|
-
button.vexpand = false
|
122
|
-
button.valign = :start
|
123
|
-
button.halign = :center
|
124
|
-
button.signal_connect "button_press_event" do
|
125
|
-
n = @grid.child_get_property(button, "top-attach")
|
126
|
-
tab = @window.notebook.get_nth_page(n)
|
127
|
-
if @window.notebook.n_pages == 1
|
128
|
-
@window.quit_gracefully
|
129
|
-
else
|
130
|
-
remove_tab(tab, n)
|
131
|
-
end
|
298
|
+
def update_tabs_num_labels
|
299
|
+
@listbox.children.each_with_index do |row, i|
|
300
|
+
hbox = row.children[0]
|
301
|
+
label = hbox.children[0]
|
302
|
+
label.text = "tab. #{i + 1}"
|
132
303
|
end
|
133
|
-
|
304
|
+
update_hidden_tabs_num_labels
|
134
305
|
end
|
135
306
|
|
136
|
-
def
|
137
|
-
@
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
end
|
142
|
-
|
143
|
-
def update_tab_num_label(range)
|
144
|
-
range.each do |j|
|
145
|
-
@grid.get_child_at(0, j).text = "tab. #{(j + 1)}"
|
307
|
+
def update_hidden_tabs_num_labels
|
308
|
+
@listbox_hidden.children.each_with_index do |row, i|
|
309
|
+
hbox = row.children[0]
|
310
|
+
label = hbox.children[0]
|
311
|
+
label.text = "tab. #{i + 1}"
|
146
312
|
end
|
147
313
|
end
|
148
314
|
|
149
|
-
def generate_preview_button(child, i)
|
150
|
-
button = Gtk::Button.new
|
151
|
-
button.image = generate_preview_image(child.preview)
|
152
|
-
button.signal_connect("clicked") { @window.notebook.current_page = i }
|
153
|
-
button
|
154
|
-
end
|
155
|
-
|
156
|
-
def generate_preview_image(pixbuf)
|
157
|
-
scaled_pix = pixbuf.scale(150, 75, :bilinear)
|
158
|
-
img = Gtk::Image.new(:pixbuf => scaled_pix)
|
159
|
-
img.show
|
160
|
-
img
|
161
|
-
end
|
162
|
-
|
163
|
-
def generate_separator
|
164
|
-
Gtk::Separator.new(:horizontal)
|
165
|
-
end
|
166
|
-
|
167
|
-
def generate_quit_button
|
168
|
-
button = Gtk::EventBox.new
|
169
|
-
button.tooltip_text = "Quit Topinambour"
|
170
|
-
image = Gtk::Image.new(:icon_name => "application-exit-symbolic",
|
171
|
-
:size => :dialog)
|
172
|
-
button.add(image)
|
173
|
-
button.signal_connect("button_press_event") { @window.quit_gracefully }
|
174
|
-
button
|
175
|
-
end
|
176
|
-
|
177
315
|
def add_drag_and_drop_functionalities(button)
|
178
316
|
add_dnd_source(button)
|
179
317
|
add_dnd_destination(button)
|
@@ -182,7 +320,7 @@ class TopinambourTermChooser < Gtk::ScrolledWindow
|
|
182
320
|
def add_dnd_source(button)
|
183
321
|
button.drag_source_set(Gdk::ModifierType::BUTTON1_MASK |
|
184
322
|
Gdk::ModifierType::BUTTON2_MASK,
|
185
|
-
[["
|
323
|
+
[["drag_term", Gtk::TargetFlags::SAME_APP, 12_345]],
|
186
324
|
Gdk::DragAction::COPY |
|
187
325
|
Gdk::DragAction::MOVE)
|
188
326
|
# Drag source signals
|
@@ -198,7 +336,7 @@ class TopinambourTermChooser < Gtk::ScrolledWindow
|
|
198
336
|
end
|
199
337
|
|
200
338
|
button.signal_connect("drag-data-get") do |widget, _, selection_data, _, _|
|
201
|
-
index =
|
339
|
+
index = widget.parent.parent.index
|
202
340
|
selection_data.set(Gdk::Selection::TYPE_INTEGER, index.to_s)
|
203
341
|
end
|
204
342
|
# button.signal_connect "drag-data-delete" do
|
@@ -212,7 +350,7 @@ class TopinambourTermChooser < Gtk::ScrolledWindow
|
|
212
350
|
def add_dnd_destination(button)
|
213
351
|
button.drag_dest_set(Gtk::DestDefaults::MOTION |
|
214
352
|
Gtk::DestDefaults::HIGHLIGHT,
|
215
|
-
[["
|
353
|
+
[["drag_term", :same_app, 12_345]],
|
216
354
|
Gdk::DragAction::COPY |
|
217
355
|
Gdk::DragAction::MOVE)
|
218
356
|
|
@@ -229,10 +367,11 @@ class TopinambourTermChooser < Gtk::ScrolledWindow
|
|
229
367
|
end
|
230
368
|
|
231
369
|
button.signal_connect("drag-data-received") do |widget, context, _x, _y, selection_data|
|
232
|
-
index =
|
370
|
+
index = widget.parent.parent.index
|
233
371
|
index_of_dragged_object = index
|
234
372
|
context.targets.each do |target|
|
235
|
-
next unless target.name == "
|
373
|
+
next unless target.name == "drag_term" ||
|
374
|
+
selection_data.type == :type_integer
|
236
375
|
data_len = selection_data.data.size
|
237
376
|
index_of_dragged_object = selection_data.data.pack("C#{data_len}").to_i
|
238
377
|
end
|
@@ -246,12 +385,10 @@ class TopinambourTermChooser < Gtk::ScrolledWindow
|
|
246
385
|
dragged = @window.notebook.get_nth_page(src_index)
|
247
386
|
@window.notebook.reorder_child(dragged, dest_index)
|
248
387
|
@window.notebook.children.each_with_index do |child, i|
|
249
|
-
@
|
250
|
-
|
388
|
+
list_box_row = @listbox.get_row_at_index(i)
|
389
|
+
row_h_box = list_box_row.children[0]
|
390
|
+
row_h_box.children[1].image = generate_preview_image(child.term.preview)
|
391
|
+
row_h_box.children[2].text = child.term.terminal_title
|
251
392
|
end
|
252
393
|
end
|
253
|
-
|
254
|
-
def grid_line_of(widget)
|
255
|
-
@grid.child_get_property(widget, "top-attach")
|
256
|
-
end
|
257
394
|
end
|
data/lib/window.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2015-
|
1
|
+
# Copyright 2015-2017 Cedric LE MOIGNE, cedlemo@gmx.com
|
2
2
|
# This file is part of Topinambour.
|
3
3
|
#
|
4
4
|
# Topinambour is free software: you can redistribute it and/or modify
|
@@ -14,14 +14,13 @@
|
|
14
14
|
# You should have received a copy of the GNU General Public License
|
15
15
|
# along with Topinambour. If not, see <http://www.gnu.org/licenses/>.
|
16
16
|
|
17
|
-
class TopinambourWindow
|
17
|
+
class TopinambourWindow < Gtk::ApplicationWindow
|
18
18
|
attr_reader :notebook, :bar, :overlay, :current_label, :current_tab
|
19
|
-
attr_accessor :shell
|
20
19
|
def initialize(application)
|
21
|
-
super(
|
20
|
+
super(application)
|
22
21
|
set_icon_name("utilities-terminal-symbolic")
|
23
22
|
set_name("topinambour-window")
|
24
|
-
|
23
|
+
load_settings
|
25
24
|
set_position(:center)
|
26
25
|
create_header_bar
|
27
26
|
create_containers
|
@@ -29,20 +28,19 @@ class TopinambourWindow
|
|
29
28
|
signal_connect "key-press-event" do |widget, event|
|
30
29
|
TopinambourShortcuts.handle_key_press(widget, event)
|
31
30
|
end
|
32
|
-
signal_connect "scroll-event" do |widget, event|
|
33
|
-
TopinambourShortcuts.handle_scroll(widget, event)
|
34
|
-
end
|
35
31
|
end
|
36
32
|
|
37
|
-
def add_terminal(cmd =
|
33
|
+
def add_terminal(cmd = nil)
|
34
|
+
cmd = cmd || application.settings["default-shell"]
|
35
|
+
|
38
36
|
exit_overlay_mode
|
39
37
|
working_dir = nil
|
40
38
|
working_dir = @notebook.current.term.pid_dir if @notebook.current
|
41
|
-
|
42
39
|
terminal = TopinambourTabTerm.new(cmd, working_dir)
|
43
40
|
terminal.show_all
|
44
41
|
|
45
42
|
@notebook.append_page(terminal)
|
43
|
+
terminal.term.load_settings
|
46
44
|
@notebook.set_tab_reorderable(terminal, true)
|
47
45
|
@notebook.set_page(@notebook.n_pages - 1)
|
48
46
|
@notebook.current.term.grab_focus
|
@@ -78,10 +76,6 @@ class TopinambourWindow
|
|
78
76
|
toggle_overlay(TopinambourTermChooser)
|
79
77
|
end
|
80
78
|
|
81
|
-
def show_terminal_chooser2
|
82
|
-
toggle_overlay(TopinambourTermChooserb)
|
83
|
-
end
|
84
|
-
|
85
79
|
def exit_overlay_mode
|
86
80
|
@overlay.children[1].destroy if in_overlay_mode?
|
87
81
|
end
|
@@ -94,7 +88,7 @@ class TopinambourWindow
|
|
94
88
|
"license" => "This program is licenced under the licence GPL-3.0 and later.",
|
95
89
|
"logo_icon_name" => "utilities-terminal-symbolic",
|
96
90
|
"program_name" => "Topinambour",
|
97
|
-
"version" => "1.0.
|
91
|
+
"version" => "1.0.12",
|
98
92
|
"website" => "https://github.com/cedlemo/topinambour",
|
99
93
|
"website_label" => "Topinambour github repository"
|
100
94
|
)
|
@@ -126,8 +120,22 @@ class TopinambourWindow
|
|
126
120
|
end
|
127
121
|
end
|
128
122
|
|
123
|
+
def show_shortcuts
|
124
|
+
resource_file = "/com/github/cedlemo/topinambour/shortcuts.ui"
|
125
|
+
builder = Gtk::Builder.new(:resource => resource_file)
|
126
|
+
shortcuts_win = builder["shortcuts-window"]
|
127
|
+
shortcuts_win.transient_for = self
|
128
|
+
shortcuts_win.show
|
129
|
+
end
|
130
|
+
|
129
131
|
private
|
130
132
|
|
133
|
+
def load_settings
|
134
|
+
height = application.settings["height"]
|
135
|
+
width = application.settings["width"]
|
136
|
+
resize(width, height)
|
137
|
+
end
|
138
|
+
|
131
139
|
def add_overlay(widget)
|
132
140
|
@overlay.add_overlay(widget)
|
133
141
|
@overlay.set_overlay_pass_through(widget, false)
|
@@ -146,13 +154,17 @@ class TopinambourWindow
|
|
146
154
|
headerbar = builder["headerbar"]
|
147
155
|
headerbar.name = "topinambour-headerbar"
|
148
156
|
set_titlebar(headerbar)
|
157
|
+
# Text is modified when notebook switch tabs or
|
158
|
+
# Vte::Terminal command change and if it is the current Vte.
|
149
159
|
@current_label = builder["current_label"]
|
150
160
|
current_label_signals
|
161
|
+
# Value is changed when notebook switch tabs or notebook add tab.
|
151
162
|
@current_tab = builder["current_tab"]
|
163
|
+
headerbar.remove(@current_label)
|
164
|
+
headerbar.custom_title = @current_label
|
152
165
|
next_prev_new_signals(builder)
|
153
|
-
|
166
|
+
overview_signal(builder)
|
154
167
|
main_menu_signal(builder)
|
155
|
-
reload_css_conf_signal(builder)
|
156
168
|
end
|
157
169
|
|
158
170
|
def current_label_signals
|
@@ -162,9 +174,7 @@ class TopinambourWindow
|
|
162
174
|
end
|
163
175
|
|
164
176
|
@current_label.signal_connect "icon-release" do |entry, position|
|
165
|
-
if position == :
|
166
|
-
close_current_tab
|
167
|
-
elsif position == :secondary
|
177
|
+
if position == :secondary
|
168
178
|
@notebook.current.term.custom_title = nil
|
169
179
|
entry.text = @notebook.current.term.window_title
|
170
180
|
end
|
@@ -185,44 +195,35 @@ class TopinambourWindow
|
|
185
195
|
end
|
186
196
|
end
|
187
197
|
|
188
|
-
def
|
198
|
+
def overview_signal(builder)
|
189
199
|
builder["term_overv_button"].signal_connect "clicked" do
|
190
200
|
show_terminal_chooser
|
191
201
|
end
|
192
|
-
|
193
|
-
builder["font_sel_button"].signal_connect "clicked" do
|
194
|
-
show_font_selector
|
195
|
-
end
|
196
|
-
|
197
|
-
builder["colors_sel_button"].signal_connect "clicked" do
|
198
|
-
show_color_selector
|
199
|
-
end
|
200
202
|
end
|
201
203
|
|
202
204
|
def main_menu_signal(builder)
|
203
|
-
builder["menu_button"]
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
rect = Gdk::Rectangle.new(x - button.allocation.x,
|
211
|
-
y - button.allocation.y,
|
212
|
-
1, 1)
|
213
|
-
menu.set_pointing_to(rect)
|
214
|
-
menu.show
|
215
|
-
end
|
205
|
+
button = builder["menu_button"]
|
206
|
+
ui_file = "/com/github/cedlemo/topinambour/main-menu-popover.ui"
|
207
|
+
menu_builder = Gtk::Builder.new(:resource => ui_file)
|
208
|
+
main_menu = menu_builder["main_menu_popover"]
|
209
|
+
button.set_popover(main_menu)
|
210
|
+
button.popover.modal = true
|
211
|
+
add_theme_menu_buttons_signals(menu_builder)
|
216
212
|
end
|
217
213
|
|
218
|
-
def
|
219
|
-
|
220
|
-
button.signal_connect "clicked" do
|
214
|
+
def add_theme_menu_buttons_signals(builder)
|
215
|
+
builder["css_reload_button"].signal_connect "clicked" do
|
221
216
|
application.reload_css_config
|
222
|
-
notebook.each { |tab| tab.term.load_properties }
|
223
|
-
load_properties
|
224
217
|
queue_draw
|
225
218
|
end
|
219
|
+
|
220
|
+
builder["font_sel_button"].signal_connect "clicked" do
|
221
|
+
show_font_selector
|
222
|
+
end
|
223
|
+
|
224
|
+
builder["colors_sel_button"].signal_connect "clicked" do
|
225
|
+
show_color_selector
|
226
|
+
end
|
226
227
|
end
|
227
228
|
|
228
229
|
def toggle_overlay(klass)
|