topinambour 1.0.8 → 1.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +40 -46
- data/bin/topinambour +11 -3
- data/data/headerbar.ui +173 -0
- data/data/prefs-dialog.ui +576 -0
- data/data/topinambour.css +16 -0
- data/data/topinambour.gresource +0 -0
- data/data/topinambour.gresource.xml +2 -0
- data/data/window-menu.ui +1 -0
- data/lib/actions.rb +14 -4
- data/lib/application.rb +6 -6
- data/lib/color_selector.rb +3 -6
- data/lib/css_editor.rb +1 -1
- data/lib/css_handler.rb +12 -7
- data/lib/font_selector.rb +2 -4
- data/lib/notebook.rb +9 -1
- data/lib/preferences.rb +185 -0
- data/lib/resize_message.rb +1 -1
- data/lib/rgb_names_regexes.rb +3 -0
- data/lib/searchbar.rb +54 -0
- data/lib/shortcuts.rb +27 -8
- data/lib/style_properties.rb +48 -37
- data/lib/terminal.rb +3 -1
- data/lib/terminal_chooser.rb +26 -19
- data/lib/terminal_regex.rb +3 -2
- data/lib/window.rb +100 -35
- metadata +12 -9
- data/lib/headerbar.rb +0 -126
data/lib/actions.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2016
|
1
|
+
# Copyright 2016 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
|
@@ -37,9 +37,19 @@ module TopinambourActions
|
|
37
37
|
action
|
38
38
|
end
|
39
39
|
|
40
|
+
def self.generate_css_editor_action(application)
|
41
|
+
action = generate_action("css_editor") do |_act, _param|
|
42
|
+
application.windows[0].show_css_editor
|
43
|
+
end
|
44
|
+
action
|
45
|
+
end
|
46
|
+
|
40
47
|
def self.generate_preferences_action(application)
|
41
48
|
action = generate_action("preferences") do |_act, _param|
|
42
|
-
|
49
|
+
dialog = TopinambourPreferences.generate_dialog(application.windows.first)
|
50
|
+
|
51
|
+
dialog.run
|
52
|
+
application.windows.first.notebook.current.grab_focus
|
43
53
|
end
|
44
54
|
action
|
45
55
|
end
|
@@ -61,7 +71,7 @@ module TopinambourActions
|
|
61
71
|
term.copy_clipboard
|
62
72
|
else
|
63
73
|
clipboard = Gtk::Clipboard.get_default(Gdk::Display.default)
|
64
|
-
clipboard.text = term.last_match
|
74
|
+
clipboard.text = term.last_match unless term.last_match.nil?
|
65
75
|
end
|
66
76
|
end
|
67
77
|
action
|
@@ -75,7 +85,7 @@ module TopinambourActions
|
|
75
85
|
end
|
76
86
|
|
77
87
|
def self.add_actions_to(application)
|
78
|
-
%w(about preferences quit term_copy term_paste).each do |name|
|
88
|
+
%w(about preferences quit term_copy term_paste css_editor).each do |name|
|
79
89
|
add_action_to(name, application)
|
80
90
|
end
|
81
91
|
end
|
data/lib/application.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2016
|
1
|
+
# Copyright 2016 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
|
@@ -47,9 +47,9 @@ class TopinambourApplication < Gtk::Application
|
|
47
47
|
|
48
48
|
begin
|
49
49
|
load_custom_css_config
|
50
|
-
rescue
|
51
|
-
puts "Bad css file using default css"
|
52
|
-
load_default_css_config
|
50
|
+
rescue => e
|
51
|
+
puts "Bad css file using default css, #{e.message}"
|
52
|
+
load_default_css_config # Use last workin Css instead
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
@@ -90,8 +90,8 @@ class TopinambourApplication < Gtk::Application
|
|
90
90
|
if File.exist?(USR_CSS)
|
91
91
|
begin
|
92
92
|
load_custom_css_config
|
93
|
-
rescue
|
94
|
-
puts "Bad css file using default css"
|
93
|
+
rescue => e
|
94
|
+
puts "Bad css file using default css #{e.message}"
|
95
95
|
load_default_css_config
|
96
96
|
end
|
97
97
|
else
|
data/lib/color_selector.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2015-2016
|
1
|
+
# Copyright 2015-2016 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
|
@@ -55,11 +55,8 @@ class TopinambourColorSelector < Gtk::Box
|
|
55
55
|
|
56
56
|
def apply_new_css_properties(toplevel, props)
|
57
57
|
toplevel.application.update_css(props)
|
58
|
-
toplevel.notebook.
|
59
|
-
|
60
|
-
tab.colors = @colors
|
61
|
-
tab.apply_colors
|
62
|
-
end
|
58
|
+
toplevel.notebook.send_to_all_terminals("colors=", [@colors])
|
59
|
+
toplevel.notebook.send_to_all_terminals("apply_colors", nil)
|
63
60
|
end
|
64
61
|
|
65
62
|
def generate_save_button
|
data/lib/css_editor.rb
CHANGED
data/lib/css_handler.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2016
|
1
|
+
# Copyright 2016 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
|
@@ -72,14 +72,19 @@ module CssHandler
|
|
72
72
|
parsed_color ? true : false
|
73
73
|
end
|
74
74
|
|
75
|
-
def self.
|
76
|
-
|
77
|
-
"#{
|
75
|
+
def self.value_to_css_value(value)
|
76
|
+
if value.class == String && color_property?(value)
|
77
|
+
"#{value}"
|
78
78
|
elsif value.class == String
|
79
|
-
%(
|
79
|
+
%("#{value}")
|
80
80
|
else
|
81
|
-
"#{
|
81
|
+
"#{value}"
|
82
82
|
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.property_to_css_instructions(name, value)
|
87
|
+
"#{name}: #{value_to_css_value(value)}"
|
83
88
|
end
|
84
89
|
|
85
90
|
def self.props_with_name(tree, prop_name)
|
@@ -116,7 +121,7 @@ module CssHandler
|
|
116
121
|
else
|
117
122
|
tmp = ""
|
118
123
|
if line_number == start_range.line
|
119
|
-
tmp += line[0..(start_range.offset - 2)] + value
|
124
|
+
tmp += line[0..(start_range.offset - 2)] + value_to_css_value(value)
|
120
125
|
end
|
121
126
|
tmp += line[(end_range.offset - 1)..-1] if line_number == end_range.line
|
122
127
|
tmp
|
data/lib/font_selector.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2015-2016
|
1
|
+
# Copyright 2015-2016 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
|
@@ -45,9 +45,7 @@ class TopinambourFontSelector < Gtk::Box
|
|
45
45
|
font = @window.notebook.current.font
|
46
46
|
new_props["-TopinambourTerminal-font"] = font.to_s
|
47
47
|
toplevel.application.update_css(new_props)
|
48
|
-
toplevel.notebook.
|
49
|
-
tab.set_font(font) if tab.class == TopinambourTerminal
|
50
|
-
end
|
48
|
+
toplevel.notebook.send_to_all_terminals("set_font", font)
|
51
49
|
toplevel.exit_overlay_mode
|
52
50
|
end
|
53
51
|
pack_start(save_button, :expand => false, :fill => false, :padding => 0)
|
data/lib/notebook.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2015-2016
|
1
|
+
# Copyright 2015-2016 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
|
@@ -40,6 +40,7 @@ class TopinambourNotebook < Gtk::Notebook
|
|
40
40
|
end
|
41
41
|
|
42
42
|
set_show_tabs(false)
|
43
|
+
set_show_border(false)
|
43
44
|
end
|
44
45
|
|
45
46
|
def remove_all_pages
|
@@ -83,4 +84,11 @@ class TopinambourNotebook < Gtk::Notebook
|
|
83
84
|
pix = surface.to_pixbuf(0, 0, w, h)
|
84
85
|
current.preview = pix if pix
|
85
86
|
end
|
87
|
+
|
88
|
+
def send_to_all_terminals(method_name, values)
|
89
|
+
each do |tab|
|
90
|
+
next unless tab.class == TopinambourTerminal
|
91
|
+
tab.send(method_name, *values)
|
92
|
+
end
|
93
|
+
end
|
86
94
|
end
|
data/lib/preferences.rb
ADDED
@@ -0,0 +1,185 @@
|
|
1
|
+
# Copyright 2016 Cedric LE MOIGNE, cedlemo@gmx.com
|
2
|
+
# This file is part of Topinambour.
|
3
|
+
#
|
4
|
+
# Topinambour is free software: you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
7
|
+
# any later version.
|
8
|
+
#
|
9
|
+
# Topinambour is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU General Public License
|
15
|
+
# along with Topinambour. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
require "gtksourceview3"
|
17
|
+
|
18
|
+
module TopinambourPreferences
|
19
|
+
def self.generate_dialog(parent)
|
20
|
+
resource_file = "/com/github/cedlemo/topinambour/prefs-dialog.ui"
|
21
|
+
builder = Gtk::Builder.new(:resource => resource_file)
|
22
|
+
dialog = builder["Preferences_dialog"]
|
23
|
+
dialog.transient_for = parent
|
24
|
+
add_source_view_style_chooser(builder, parent)
|
25
|
+
add_actions(builder, parent)
|
26
|
+
connect_response(dialog, builder)
|
27
|
+
dialog
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.connect_response(dialog, builder)
|
31
|
+
dialog.signal_connect "response" do |widget, response|
|
32
|
+
case response
|
33
|
+
when 1
|
34
|
+
on_apply_response(widget, builder)
|
35
|
+
else
|
36
|
+
widget.destroy
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.on_apply_response(widget, builder)
|
42
|
+
props = get_all_properties(widget, builder)
|
43
|
+
toplevel = widget.transient_for
|
44
|
+
toplevel.application.update_css(props)
|
45
|
+
widget.destroy
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.get_all_properties(widget, builder)
|
49
|
+
props = {}
|
50
|
+
props.merge!(get_source_view_style(builder))
|
51
|
+
props.merge!(get_entry_value(builder))
|
52
|
+
props.merge!(get_switch_values(builder))
|
53
|
+
props.merge!(get_spin_values(widget))
|
54
|
+
props.merge!(get_combo_values(builder))
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.add_actions(builder, parent)
|
58
|
+
%w(audible_bell allow_bold scroll_on_output
|
59
|
+
scroll_on_keystroke rewrap_on_resize mouse_autohide).each do |prop_name|
|
60
|
+
gen_switch_actions(prop_name, builder, parent)
|
61
|
+
end
|
62
|
+
gen_entry_actions("shell", builder, parent)
|
63
|
+
%w(cursor_shape cursor_blink_mode backspace_binding
|
64
|
+
delete_binding).each do |prop_name|
|
65
|
+
gen_combobox_actions(prop_name, builder, parent)
|
66
|
+
end
|
67
|
+
gen_spinbuttons_actions(builder, parent)
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.gen_switch_actions(property_name, builder, parent)
|
71
|
+
switch = builder["#{property_name}_switch"]
|
72
|
+
switch.active = parent.notebook.current.send("#{property_name}?")
|
73
|
+
switch.signal_connect "state-set" do |_widget, state|
|
74
|
+
parent.notebook.send_to_all_terminals("#{property_name}=", state)
|
75
|
+
false
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.gen_entry_actions(property_name, builder, parent)
|
80
|
+
entry = builder["#{property_name}_entry"]
|
81
|
+
entry.text = parent.shell
|
82
|
+
entry.set_icon_from_icon_name(:secondary, "edit-clear")
|
83
|
+
entry.signal_connect("activate") { |widget| parent.shell = widget.text }
|
84
|
+
|
85
|
+
entry.signal_connect "icon-release" do |widget, position|
|
86
|
+
if position == :secondary
|
87
|
+
parent.shell = widget.text = parent.style_get_property(property_name)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.gen_combobox_actions(property_name, builder, parent)
|
93
|
+
combobox = builder["#{property_name}_sel"]
|
94
|
+
id = parent.notebook.current.send("#{property_name}").nick + "_id"
|
95
|
+
combobox.active_id = id
|
96
|
+
combobox.signal_connect "changed" do |widget|
|
97
|
+
value = widget.active_id.gsub(/_id/, "").to_sym
|
98
|
+
parent.notebook.send_to_all_terminals("#{property_name}=", value)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.gen_spinbuttons_actions(builder, parent)
|
103
|
+
width_spin = builder["width_spin"]
|
104
|
+
height_spin = builder["height_spin"]
|
105
|
+
width_spin.set_range(0, 2000)
|
106
|
+
height_spin.set_range(0, 1000)
|
107
|
+
width_spin.value, height_spin.value = parent.size
|
108
|
+
gen_width_button_action(width_spin, parent)
|
109
|
+
gen_height_button_action(height_spin, parent)
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.gen_width_button_action(spin_widget, parent)
|
113
|
+
spin_widget.signal_connect "value-changed" do |widget|
|
114
|
+
_, h = parent.size
|
115
|
+
parent.resize(widget.value, h)
|
116
|
+
w, _h = parent.size
|
117
|
+
widget.value = w if widget.value + 1 < w
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.gen_height_button_action(spin_widget, parent)
|
122
|
+
spin_widget.signal_connect "value-changed" do |widget|
|
123
|
+
w, _h = parent.size
|
124
|
+
parent.resize(w, widget.value)
|
125
|
+
_, h = parent.size
|
126
|
+
widget.value = h if widget.value + 1 < h
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# Hack because when added via glade, the builder fail to load the ui.
|
131
|
+
def self.add_source_view_style_chooser(builder, parent)
|
132
|
+
box = builder["gen_prefs_box"]
|
133
|
+
button = GtkSource::StyleSchemeChooserButton.new
|
134
|
+
sm = GtkSource::StyleSchemeManager.default
|
135
|
+
button.style_scheme = sm.get_scheme(parent.css_editor_style)
|
136
|
+
button.show
|
137
|
+
button.signal_connect "style-updated" do |widget|
|
138
|
+
parent.css_editor_style = widget.style_scheme.id
|
139
|
+
end
|
140
|
+
box.pack_start(button, :expand => true, :fill => false)
|
141
|
+
end
|
142
|
+
|
143
|
+
def self.get_source_view_style(builder)
|
144
|
+
box = builder["gen_prefs_box"]
|
145
|
+
penultimate = box.children.size - 2
|
146
|
+
style = box.children[penultimate].style_scheme.id
|
147
|
+
{ "-TopinambourWindow-css-editor-style" => style }
|
148
|
+
end
|
149
|
+
|
150
|
+
def self.get_entry_value(builder)
|
151
|
+
text = builder["shell_entry"].text
|
152
|
+
{ "-TopinambourWindow-shell" => text }
|
153
|
+
end
|
154
|
+
|
155
|
+
def self.get_switch_values(builder)
|
156
|
+
props = {}
|
157
|
+
%w(audible_bell allow_bold scroll_on_output
|
158
|
+
scroll_on_keystroke rewrap_on_resize mouse_autohide).each do |prop_name|
|
159
|
+
switch = builder["#{prop_name}_switch"]
|
160
|
+
name = prop_name.tr("_", "-")
|
161
|
+
props["-TopinambourTerminal-#{name}"] = switch.active?
|
162
|
+
end
|
163
|
+
props
|
164
|
+
end
|
165
|
+
|
166
|
+
def self.get_combo_values(builder)
|
167
|
+
props = {}
|
168
|
+
%w(cursor_shape cursor_blink_mode backspace_binding
|
169
|
+
delete_binding).each do |prop_name|
|
170
|
+
combobox = builder["#{prop_name}_sel"]
|
171
|
+
value = combobox.active_id.gsub(/_id\z/, "")
|
172
|
+
name = prop_name.tr("_", "-")
|
173
|
+
props["-TopinambourTerminal-#{name}"] = value.to_sym
|
174
|
+
end
|
175
|
+
props
|
176
|
+
end
|
177
|
+
|
178
|
+
def self.get_spin_values(widget)
|
179
|
+
props = {}
|
180
|
+
w, h = widget.transient_for.size
|
181
|
+
props["-TopinambourWindow-width"] = w
|
182
|
+
props["-TopinambourWindow-height"] = h
|
183
|
+
props
|
184
|
+
end
|
185
|
+
end
|
data/lib/resize_message.rb
CHANGED
@@ -0,0 +1,3 @@
|
|
1
|
+
module RgbNames
|
2
|
+
COLOR_NAMES = "(snow|ghost white|GhostWhite|white smoke|WhiteSmoke|gainsboro|floral white|FloralWhite|old lace|OldLace|linen|antique white|AntiqueWhite|papaya whip|PapayaWhip|blanched almond|BlanchedAlmond|bisque|peach puff|PeachPuff|navajo white|NavajoWhite|moccasin|cornsilk|ivory|lemon chiffon|LemonChiffon|seashell|honeydew|mint cream|MintCream|azure|alice blue|AliceBlue|lavender|lavender blush|LavenderBlush|misty rose|MistyRose|white|black|dark slate gray|DarkSlateGray|dark slate grey|DarkSlateGrey|dim gray|DimGray|dim grey|DimGrey|slate gray|SlateGray|slate grey|SlateGrey|light slate gray|LightSlateGray|light slate grey|LightSlateGrey|gray|grey|light grey|LightGrey|light gray|LightGray|midnight blue|MidnightBlue|navy|navy blue|NavyBlue|cornflower blue|CornflowerBlue|dark slate blue|DarkSlateBlue|slate blue|SlateBlue|medium slate blue|MediumSlateBlue|light slate blue|LightSlateBlue|medium blue|MediumBlue|royal blue|RoyalBlue|blue|dodger blue|DodgerBlue|deep sky blue|DeepSkyBlue|sky blue|SkyBlue|light sky blue|LightSkyBlue|steel blue|SteelBlue|light steel blue|LightSteelBlue|light blue|LightBlue|powder blue|PowderBlue|pale turquoise|PaleTurquoise|dark turquoise|DarkTurquoise|medium turquoise|MediumTurquoise|turquoise|cyan|light cyan|LightCyan|cadet blue|CadetBlue|medium aquamarine|MediumAquamarine|aquamarine|dark green|DarkGreen|dark olive green|DarkOliveGreen|dark sea green|DarkSeaGreen|sea green|SeaGreen|medium sea green|MediumSeaGreen|light sea green|LightSeaGreen|pale green|PaleGreen|spring green|SpringGreen|lawn green|LawnGreen|green|chartreuse|medium spring green|MediumSpringGreen|green yellow|GreenYellow|lime green|LimeGreen|yellow green|YellowGreen|forest green|ForestGreen|olive drab|OliveDrab|dark khaki|DarkKhaki|khaki|pale goldenrod|PaleGoldenrod|light goldenrod yellow|LightGoldenrodYellow|light yellow|LightYellow|yellow|gold|light goldenrod|LightGoldenrod|goldenrod|dark goldenrod|DarkGoldenrod|rosy brown|RosyBrown|indian red|IndianRed|saddle brown|SaddleBrown|sienna|peru|burlywood|beige|wheat|sandy brown|SandyBrown|tan|chocolate|firebrick|brown|dark salmon|DarkSalmon|salmon|light salmon|LightSalmon|orange|dark orange|DarkOrange|coral|light coral|LightCoral|tomato|orange red|OrangeRed|red|hot pink|HotPink|deep pink|DeepPink|pink|light pink|LightPink|pale violet red|PaleVioletRed|maroon|medium violet red|MediumVioletRed|violet red|VioletRed|magenta|violet|plum|orchid|medium orchid|MediumOrchid|dark orchid|DarkOrchid|dark violet|DarkViolet|blue violet|BlueViolet|purple|medium purple|MediumPurple|thistle|snow1|snow2|snow3|snow4|seashell1|seashell2|seashell3|seashell4|AntiqueWhite1|AntiqueWhite2|AntiqueWhite3|AntiqueWhite4|bisque1|bisque2|bisque3|bisque4|PeachPuff1|PeachPuff2|PeachPuff3|PeachPuff4|NavajoWhite1|NavajoWhite2|NavajoWhite3|NavajoWhite4|LemonChiffon1|LemonChiffon2|LemonChiffon3|LemonChiffon4|cornsilk1|cornsilk2|cornsilk3|cornsilk4|ivory1|ivory2|ivory3|ivory4|honeydew1|honeydew2|honeydew3|honeydew4|LavenderBlush1|LavenderBlush2|LavenderBlush3|LavenderBlush4|MistyRose1|MistyRose2|MistyRose3|MistyRose4|azure1|azure2|azure3|azure4|SlateBlue1|SlateBlue2|SlateBlue3|SlateBlue4|RoyalBlue1|RoyalBlue2|RoyalBlue3|RoyalBlue4|blue1|blue2|blue3|blue4|DodgerBlue1|DodgerBlue2|DodgerBlue3|DodgerBlue4|SteelBlue1|SteelBlue2|SteelBlue3|SteelBlue4|DeepSkyBlue1|DeepSkyBlue2|DeepSkyBlue3|DeepSkyBlue4|SkyBlue1|SkyBlue2|SkyBlue3|SkyBlue4|LightSkyBlue1|LightSkyBlue2|LightSkyBlue3|LightSkyBlue4|SlateGray1|SlateGray2|SlateGray3|SlateGray4|LightSteelBlue1|LightSteelBlue2|LightSteelBlue3|LightSteelBlue4|LightBlue1|LightBlue2|LightBlue3|LightBlue4|LightCyan1|LightCyan2|LightCyan3|LightCyan4|PaleTurquoise1|PaleTurquoise2|PaleTurquoise3|PaleTurquoise4|CadetBlue1|CadetBlue2|CadetBlue3|CadetBlue4|turquoise1|turquoise2|turquoise3|turquoise4|cyan1|cyan2|cyan3|cyan4|DarkSlateGray1|DarkSlateGray2|DarkSlateGray3|DarkSlateGray4|aquamarine1|aquamarine2|aquamarine3|aquamarine4|DarkSeaGreen1|DarkSeaGreen2|DarkSeaGreen3|DarkSeaGreen4|SeaGreen1|SeaGreen2|SeaGreen3|SeaGreen4|PaleGreen1|PaleGreen2|PaleGreen3|PaleGreen4|SpringGreen1|SpringGreen2|SpringGreen3|SpringGreen4|green1|green2|green3|green4|chartreuse1|chartreuse2|chartreuse3|chartreuse4|OliveDrab1|OliveDrab2|OliveDrab3|OliveDrab4|DarkOliveGreen1|DarkOliveGreen2|DarkOliveGreen3|DarkOliveGreen4|khaki1|khaki2|khaki3|khaki4|LightGoldenrod1|LightGoldenrod2|LightGoldenrod3|LightGoldenrod4|LightYellow1|LightYellow2|LightYellow3|LightYellow4|yellow1|yellow2|yellow3|yellow4|gold1|gold2|gold3|gold4|goldenrod1|goldenrod2|goldenrod3|goldenrod4|DarkGoldenrod1|DarkGoldenrod2|DarkGoldenrod3|DarkGoldenrod4|RosyBrown1|RosyBrown2|RosyBrown3|RosyBrown4|IndianRed1|IndianRed2|IndianRed3|IndianRed4|sienna1|sienna2|sienna3|sienna4|burlywood1|burlywood2|burlywood3|burlywood4|wheat1|wheat2|wheat3|wheat4|tan1|tan2|tan3|tan4|chocolate1|chocolate2|chocolate3|chocolate4|firebrick1|firebrick2|firebrick3|firebrick4|brown1|brown2|brown3|brown4|salmon1|salmon2|salmon3|salmon4|LightSalmon1|LightSalmon2|LightSalmon3|LightSalmon4|orange1|orange2|orange3|orange4|DarkOrange1|DarkOrange2|DarkOrange3|DarkOrange4|coral1|coral2|coral3|coral4|tomato1|tomato2|tomato3|tomato4|OrangeRed1|OrangeRed2|OrangeRed3|OrangeRed4|red1|red2|red3|red4|DebianRed|DeepPink1|DeepPink2|DeepPink3|DeepPink4|HotPink1|HotPink2|HotPink3|HotPink4|pink1|pink2|pink3|pink4|LightPink1|LightPink2|LightPink3|LightPink4|PaleVioletRed1|PaleVioletRed2|PaleVioletRed3|PaleVioletRed4|maroon1|maroon2|maroon3|maroon4|VioletRed1|VioletRed2|VioletRed3|VioletRed4|magenta1|magenta2|magenta3|magenta4|orchid1|orchid2|orchid3|orchid4|plum1|plum2|plum3|plum4|MediumOrchid1|MediumOrchid2|MediumOrchid3|MediumOrchid4|DarkOrchid1|DarkOrchid2|DarkOrchid3|DarkOrchid4|purple1|purple2|purple3|purple4|MediumPurple1|MediumPurple2|MediumPurple3|MediumPurple4|thistle1|thistle2|thistle3|thistle4|gray0|grey0|gray1|grey1|gray2|grey2|gray3|grey3|gray4|grey4|gray5|grey5|gray6|grey6|gray7|grey7|gray8|grey8|gray9|grey9|gray10|grey10|gray11|grey11|gray12|grey12|gray13|grey13|gray14|grey14|gray15|grey15|gray16|grey16|gray17|grey17|gray18|grey18|gray19|grey19|gray20|grey20|gray21|grey21|gray22|grey22|gray23|grey23|gray24|grey24|gray25|grey25|gray26|grey26|gray27|grey27|gray28|grey28|gray29|grey29|gray30|grey30|gray31|grey31|gray32|grey32|gray33|grey33|gray34|grey34|gray35|grey35|gray36|grey36|gray37|grey37|gray38|grey38|gray39|grey39|gray40|grey40|gray41|grey41|gray42|grey42|gray43|grey43|gray44|grey44|gray45|grey45|gray46|grey46|gray47|grey47|gray48|grey48|gray49|grey49|gray50|grey50|gray51|grey51|gray52|grey52|gray53|grey53|gray54|grey54|gray55|grey55|gray56|grey56|gray57|grey57|gray58|grey58|gray59|grey59|gray60|grey60|gray61|grey61|gray62|grey62|gray63|grey63|gray64|grey64|gray65|grey65|gray66|grey66|gray67|grey67|gray68|grey68|gray69|grey69|gray70|grey70|gray71|grey71|gray72|grey72|gray73|grey73|gray74|grey74|gray75|grey75|gray76|grey76|gray77|grey77|gray78|grey78|gray79|grey79|gray80|grey80|gray81|grey81|gray82|grey82|gray83|grey83|gray84|grey84|gray85|grey85|gray86|grey86|gray87|grey87|gray88|grey88|gray89|grey89|gray90|grey90|gray91|grey91|gray92|grey92|gray93|grey93|gray94|grey94|gray95|grey95|gray96|grey96|gray97|grey97|gray98|grey98|gray99|grey99|gray100|grey100|dark grey|DarkGrey|dark gray|DarkGray|dark blue|DarkBlue|dark cyan|DarkCyan|dark magenta|DarkMagenta|dark red|DarkRed|light green|LightGreen)"
|
3
|
+
end
|
data/lib/searchbar.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
# Copyright 2016 Cedric LE MOIGNE, cedlemo@gmx.com
|
2
|
+
# This file is part of Topinambour.
|
3
|
+
#
|
4
|
+
# Topinambour is free software: you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
7
|
+
# any later version.
|
8
|
+
#
|
9
|
+
# Topinambour is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU General Public License
|
15
|
+
# along with Topinambour. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
|
17
|
+
class TopinambourSearchBar < Gtk::SearchBar
|
18
|
+
def initialize(window)
|
19
|
+
super()
|
20
|
+
|
21
|
+
generate_search_entry(window)
|
22
|
+
set_halign(:center)
|
23
|
+
set_valign(:start)
|
24
|
+
set_hexpand(false)
|
25
|
+
set_vexpand(true)
|
26
|
+
connect_entry(@entry)
|
27
|
+
set_show_close_button = true
|
28
|
+
add(@entry)
|
29
|
+
end
|
30
|
+
|
31
|
+
def generate_search_entry(window)
|
32
|
+
@entry = Gtk::SearchEntry.new
|
33
|
+
term = window.notebook.current
|
34
|
+
@entry.signal_connect "next-match" do |entry|
|
35
|
+
puts "next-match"
|
36
|
+
term.search_find_next if @regex
|
37
|
+
end
|
38
|
+
|
39
|
+
@entry.signal_connect "previous-match" do |entry|
|
40
|
+
puts "prev match"
|
41
|
+
term.search_find_previous if @regex
|
42
|
+
end
|
43
|
+
|
44
|
+
@entry.signal_connect "search-changed" do |entry|
|
45
|
+
puts "search changed"
|
46
|
+
pattern = entry.buffer.text
|
47
|
+
if pattern != ""
|
48
|
+
@regex = GLib::Regex.new(pattern)
|
49
|
+
term.search_set_gregex(@regex, @regex.match_flags)
|
50
|
+
term.search_find_next
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/shortcuts.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2016
|
1
|
+
# Copyright 2016 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
|
@@ -21,8 +21,9 @@ module TopinambourShortcuts
|
|
21
21
|
(Gdk::ModifierType::CONTROL_MASK | Gdk::ModifierType::SHIFT_MASK)
|
22
22
|
end
|
23
23
|
|
24
|
-
def self.handle_simple(
|
25
|
-
|
24
|
+
def self.handle_simple(event, window)
|
25
|
+
overlay_mode = window.in_overlay_mode?
|
26
|
+
case event.keyval
|
26
27
|
when Gdk::Keyval::KEY_Escape # escape from overlay mode
|
27
28
|
if window.in_overlay_mode?
|
28
29
|
window.exit_overlay_mode
|
@@ -32,8 +33,8 @@ module TopinambourShortcuts
|
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
35
|
-
def self.handle_ctrl_shift(
|
36
|
-
case keyval
|
36
|
+
def self.handle_ctrl_shift(event, window)
|
37
|
+
case event.keyval
|
37
38
|
when Gdk::Keyval::KEY_W # close the current tab
|
38
39
|
window.close_current_tab
|
39
40
|
true
|
@@ -61,16 +62,34 @@ module TopinambourShortcuts
|
|
61
62
|
when Gdk::Keyval::KEY_E
|
62
63
|
window.show_css_editor
|
63
64
|
true
|
65
|
+
when Gdk::Keyval::KEY_slash
|
66
|
+
window.show_searchbar
|
67
|
+
true
|
68
|
+
when Gdk::Keyval::KEY_Up
|
69
|
+
window.toggle_shrink
|
70
|
+
true
|
64
71
|
end
|
65
72
|
end
|
66
73
|
|
67
74
|
def self.handle_key_press(window, event)
|
68
75
|
keyval = event.keyval
|
69
|
-
#puts "#{Gdk::Keyval.to_name(keyval)} = #{keyval}"
|
70
76
|
if ctrl_shift?(event)
|
71
|
-
handle_ctrl_shift(
|
77
|
+
handle_ctrl_shift(event, window)
|
72
78
|
else
|
73
|
-
handle_simple(
|
79
|
+
handle_simple(event, window)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.handle_scroll(window, event)
|
84
|
+
if ctrl_shift?(event)
|
85
|
+
case event.direction
|
86
|
+
when Gdk::ScrollDirection::UP
|
87
|
+
window.opacity = window.opacity + 0.05
|
88
|
+
true
|
89
|
+
when Gdk::ScrollDirection::DOWN
|
90
|
+
window.opacity = window.opacity - 0.05
|
91
|
+
true
|
92
|
+
end
|
74
93
|
end
|
75
94
|
end
|
76
95
|
end
|
data/lib/style_properties.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2016
|
1
|
+
# Copyright 2016 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
|
@@ -24,6 +24,15 @@ module TopinambourStyleProperties
|
|
24
24
|
GLib::Param::WRITABLE)
|
25
25
|
end
|
26
26
|
|
27
|
+
def generate_boolean_rw_property(name, args)
|
28
|
+
GLib::Param::Boolean.new(name.downcase,
|
29
|
+
name.capitalize,
|
30
|
+
name.upcase,
|
31
|
+
args,
|
32
|
+
GLib::Param::READABLE |
|
33
|
+
GLib::Param::WRITABLE)
|
34
|
+
end
|
35
|
+
|
27
36
|
def generate_int_rw_property(name, args)
|
28
37
|
GLib::Param::Int.new(name.downcase,
|
29
38
|
name.capitalize,
|
@@ -33,6 +42,15 @@ module TopinambourStyleProperties
|
|
33
42
|
GLib::Param::WRITABLE)
|
34
43
|
end
|
35
44
|
|
45
|
+
def generate_enum_rw_property(name, args)
|
46
|
+
GLib::Param::Enum.new(name.downcase,
|
47
|
+
name.capitalize,
|
48
|
+
name.upcase,
|
49
|
+
*args,
|
50
|
+
GLib::Param::READABLE |
|
51
|
+
GLib::Param::WRITABLE)
|
52
|
+
end
|
53
|
+
|
36
54
|
def generate_boxed_rw_property(name, args)
|
37
55
|
GLib::Param::Boxed.new(name.downcase,
|
38
56
|
name.capitalize,
|
@@ -62,42 +80,9 @@ TERMINAL_COLOR_NAMES = [:foreground, :background, :black, :red, :green, :yellow,
|
|
62
80
|
]
|
63
81
|
DEFAULT_TERMINAL_COLORS = %w(#aeafad #323232 #000000 #b9214f #A6E22E #ff9800
|
64
82
|
#3399ff #8e33ff #06a2dc #B0B0B0 #5D5D5D #ff5c8d
|
65
|
-
#CDEE69 #ffff00 #9CD9F0 #FBB1F9 #77DFD8 #F7F7F7
|
66
|
-
)
|
83
|
+
#CDEE69 #ffff00 #9CD9F0 #FBB1F9 #77DFD8 #F7F7F7)
|
67
84
|
DEFAULT_TERMINAL_FONT = "Monospace 11"
|
68
85
|
|
69
|
-
# boolean :
|
70
|
-
#
|
71
|
-
# audible_bell
|
72
|
-
# allow_bold
|
73
|
-
# scroll_on_output
|
74
|
-
# scroll_on_keystroke
|
75
|
-
# rewrap_on_resize
|
76
|
-
# mouse_autohide
|
77
|
-
#
|
78
|
-
# VteCursorShape :
|
79
|
-
# cursor_shape
|
80
|
-
# VTE_CURSOR_SHAPE_BLOCK Draw a block cursor. This is the default.
|
81
|
-
# VTE_CURSOR_SHAPE_IBEAM Draw a vertical bar on the left side of character.
|
82
|
-
# This is similar to the default cursor for other GTK+ widgets.
|
83
|
-
# VTE_CURSOR_SHAPE_UNDERLINE Draw a horizontal bar below the character.
|
84
|
-
#
|
85
|
-
# VteCursorBlinkMode
|
86
|
-
# cursor_blink_mode
|
87
|
-
# VTE_CURSOR_BLINK_SYSTEM Follow GTK+ settings for cursor blinking.
|
88
|
-
# VTE_CURSOR_BLINK_ON Cursor blinks.
|
89
|
-
# VTE_CURSOR_BLINK_OFF Cursor does not blink.
|
90
|
-
#
|
91
|
-
# VteEraseBinding
|
92
|
-
# backspace_binding
|
93
|
-
# delete_binding
|
94
|
-
# VTE_ERASE_AUTO For backspace, attempt to determine the right value from the
|
95
|
-
# terminal's IO settings. For delete, use the control sequence.
|
96
|
-
# VTE_ERASE_ASCII_BACKSPACE Send an ASCII backspace character (0x08).
|
97
|
-
# VTE_ERASE_ASCII_DELETE Send an ASCII delete character (0x7F).
|
98
|
-
# VTE_ERASE_DELETE_SEQUENCE Send the "@7 " control sequence.
|
99
|
-
# VTE_ERASE_TTY Send terminal's "erase" setting.
|
100
|
-
|
101
86
|
class TopinambourTerminal < Vte::Terminal
|
102
87
|
extend TopinambourStyleProperties
|
103
88
|
type_register
|
@@ -107,9 +92,31 @@ class TopinambourTerminal < Vte::Terminal
|
|
107
92
|
name,
|
108
93
|
GLib::Type["GdkRGBA"])
|
109
94
|
end
|
110
|
-
install_style("boxed",
|
111
|
-
"font",
|
95
|
+
install_style("boxed", "font",
|
112
96
|
GLib::Type["PangoFontDescription"])
|
97
|
+
install_style("boolean", "audible-bell", false)
|
98
|
+
install_style("boolean", "allow-bold", true)
|
99
|
+
install_style("boolean", "scroll-on-output", true)
|
100
|
+
install_style("boolean", "scroll-on-keystroke", true)
|
101
|
+
install_style("boolean", "rewrap-on-resize", true)
|
102
|
+
install_style("boolean", "mouse-autohide", true)
|
103
|
+
install_style("enum", "cursor-shape", [GLib::Type["VteCursorShape"],
|
104
|
+
Vte::CursorShape::BLOCK])
|
105
|
+
install_style("enum", "cursor-blink-mode", [GLib::Type["VteCursorBlinkMode"],
|
106
|
+
Vte::CursorBlinkMode::SYSTEM])
|
107
|
+
install_style("enum", "backspace-binding", [GLib::Type["VteEraseBinding"],
|
108
|
+
Vte::EraseBinding::AUTO])
|
109
|
+
install_style("enum", "delete-binding", [GLib::Type["VteEraseBinding"],
|
110
|
+
Vte::EraseBinding::AUTO])
|
111
|
+
def load_properties
|
112
|
+
%w(audible_bell allow_bold scroll_on_output scroll_on_keystroke
|
113
|
+
rewrap_on_resize mouse_autohide).each do |prop|
|
114
|
+
send("#{prop}=", style_get_property(prop.gsub(/_/,"-")))
|
115
|
+
end
|
116
|
+
%w(cursor_shape cursor_blink_mode backspace_binding delete_binding).each do |prop|
|
117
|
+
send("#{prop}=", style_get_property(prop.gsub(/_/,"-")))
|
118
|
+
end
|
119
|
+
end
|
113
120
|
end
|
114
121
|
|
115
122
|
class TopinambourWindow < Gtk::ApplicationWindow
|
@@ -119,4 +126,8 @@ class TopinambourWindow < Gtk::ApplicationWindow
|
|
119
126
|
install_style("int", "width", [-1, 2000, 1000])
|
120
127
|
install_style("int", "height", [-1, 2000, 500])
|
121
128
|
install_style("string", "css-editor-style", "classic")
|
129
|
+
|
130
|
+
def load_properties
|
131
|
+
|
132
|
+
end
|
122
133
|
end
|
data/lib/terminal.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2015-2016
|
1
|
+
# Copyright 2015-2016 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
|
@@ -104,9 +104,11 @@ class TopinambourTerminal
|
|
104
104
|
def configure
|
105
105
|
set_rewrap_on_resize(true)
|
106
106
|
set_scrollback_lines(-1)
|
107
|
+
search_set_wrap_around(true)
|
107
108
|
@colors = css_colors
|
108
109
|
set_font(css_font)
|
109
110
|
apply_colors
|
111
|
+
load_properties
|
110
112
|
add_matches
|
111
113
|
end
|
112
114
|
|