topinambour 2.0.4 → 2.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/topinambour +22 -24
- data/data/gschemas.compiled +0 -0
- data/data/prefs-dialog.ui +6 -6
- data/data/topinambour.css +7 -46
- data/data/topinambour.gresource +0 -0
- data/data/topinambour.gresource.xml +0 -1
- data/data/topinambour.gschema.xml +4 -4
- data/lib/about.rb +46 -0
- data/lib/actions.rb +2 -0
- data/lib/application.rb +80 -83
- data/lib/color_selector.rb +148 -22
- data/lib/font_selector.rb +43 -21
- data/lib/preferences.rb +6 -2
- data/lib/profile.rb +62 -0
- data/lib/shortcuts.rb +2 -5
- data/lib/terminal.rb +87 -70
- data/lib/terminal_regex.rb +9 -0
- data/lib/version.rb +25 -0
- data/lib/window.rb +67 -95
- metadata +28 -8
- data/data/window.ui +0 -58
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c051e0f90536143f79f773b54aaf57a26f7e547273a7df6c47969d46f20f7c95
|
4
|
+
data.tar.gz: ae1f7425d773901cfbc676e74a62f65e3a24073f3e944391fc9b07e0383b956c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8487cfb2100b779913d4cc1e735c1adb88b120a2f98040f22996ba22762c932a956bc1aa013a53365faf5edd0f7931d7c316ce1415f9e621d50cc3beacb6fc03
|
7
|
+
data.tar.gz: b6f1ccc359cf0ae366f44ad4460a9052fc8efe86810b518ee8a5fc35a5695a0f9a6a6ab96bd31b31b869c609e0b0c8539f867d9a91137700b2e22dcf2a277166
|
data/bin/topinambour
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# Copyright 2015-
|
2
|
+
# Copyright 2015-2018 Cedric LE MOIGNE, cedlemo@gmx.com
|
3
3
|
# This file is part of Topinambour.
|
4
4
|
#
|
5
5
|
# Topinambour is free software: you can redistribute it and/or modify
|
@@ -19,39 +19,37 @@
|
|
19
19
|
# vte 3 bindings.
|
20
20
|
# Author:: Cedlemo (mailto:cedlemo@gmx.com)
|
21
21
|
|
22
|
-
require
|
23
|
-
require
|
22
|
+
require 'vte3'
|
23
|
+
require 'fileutils'
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
err_msg = "\tTopinambour processus pid = #{Process.pid} has been "
|
26
|
+
|
27
|
+
Signal.trap('INT') do
|
28
|
+
STDERR.puts err_msg + 'interrupted with Ctrl-C'
|
27
29
|
exit
|
28
|
-
|
30
|
+
end
|
29
31
|
|
30
|
-
Signal.trap(
|
31
|
-
STDERR.puts
|
32
|
+
Signal.trap('TERM') do
|
33
|
+
STDERR.puts err_msg + 'has been killed'
|
32
34
|
exit
|
33
|
-
|
35
|
+
end
|
34
36
|
|
35
|
-
CURRENT_PATH =
|
36
|
-
LIB_PATH = "#{CURRENT_PATH}/../lib"
|
37
|
-
DATA_PATH = "#{CURRENT_PATH}/../data"
|
37
|
+
CURRENT_PATH = __dir__
|
38
|
+
LIB_PATH = "#{CURRENT_PATH}/../lib".freeze
|
39
|
+
DATA_PATH = "#{CURRENT_PATH}/../data".freeze
|
38
40
|
CONFIG_DIR = File.expand_path("#{ENV['HOME']}/.config/topinambour")
|
39
|
-
|
40
|
-
|
41
|
+
DATA_HOME_DIR = File.expand_path("#{ENV['HOME']}/.local/share/topinambour")
|
42
|
+
USR_CSS = "#{CONFIG_DIR}/topinambour.css".freeze
|
43
|
+
USR_LIB_PATH = "#{CONFIG_DIR}/lib".freeze
|
41
44
|
gresource_bin = "#{DATA_PATH}/topinambour.gresource"
|
42
|
-
|
43
45
|
resource = Gio::Resource.load(gresource_bin)
|
44
46
|
Gio::Resources.register(resource)
|
45
|
-
# Load default libraries !!WARNING!! loading order matters
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
else
|
53
|
-
require "#{LIB_PATH}/#{l}.rb"
|
54
|
-
end
|
48
|
+
# Load default libraries !!WARNING!! loading order matters
|
49
|
+
%w[version about actions application rgb_names_regexes
|
50
|
+
terminal_regex terminal color_selector font_selector
|
51
|
+
shortcuts window preferences].each do |l|
|
52
|
+
require "#{LIB_PATH}/#{l}.rb"
|
55
53
|
end
|
56
54
|
|
57
55
|
topinambour = TopinambourApplication.new
|
data/data/gschemas.compiled
CHANGED
Binary file
|
data/data/prefs-dialog.ui
CHANGED
@@ -3,14 +3,14 @@
|
|
3
3
|
<interface>
|
4
4
|
<requires lib="gtk+" version="3.20"/>
|
5
5
|
<object class="GtkAdjustment" id="width_adjustment">
|
6
|
-
<property name="upper">
|
7
|
-
<property name="step_increment">
|
8
|
-
<property name="page_increment">
|
6
|
+
<property name="upper">500</property>
|
7
|
+
<property name="step_increment">1</property>
|
8
|
+
<property name="page_increment">1</property>
|
9
9
|
</object>
|
10
10
|
<object class="GtkAdjustment" id="height_adjustment">
|
11
|
-
<property name="upper">
|
12
|
-
<property name="step_increment">
|
13
|
-
<property name="page_increment">
|
11
|
+
<property name="upper">500</property>
|
12
|
+
<property name="step_increment">1</property>
|
13
|
+
<property name="page_increment">1</property>
|
14
14
|
</object>
|
15
15
|
<template class="TopinambourPreferences" parent="GtkWindow">
|
16
16
|
<property name="can_focus">False</property>
|
data/data/topinambour.css
CHANGED
@@ -1,73 +1,34 @@
|
|
1
1
|
*{
|
2
|
-
/* Default css properties
|
3
|
-
-TopinambourTerminal-foreground: #aeafad;
|
4
|
-
-TopinambourTerminal-background: #323232;
|
5
|
-
-TopinambourTerminal-black: #000000;
|
6
|
-
-TopinambourTerminal-red: #b9214f;
|
7
|
-
-TopinambourTerminal-green: #A6E22E;
|
8
|
-
-TopinambourTerminal-yellow: #ff9800;
|
9
|
-
-TopinambourTerminal-blue: #3399ff;
|
10
|
-
-TopinambourTerminal-magenta: #8e33ff;
|
11
|
-
-TopinambourTerminal-cyan: #06a2dc;
|
12
|
-
-TopinambourTerminal-white: #B0B0B0;
|
13
|
-
-TopinambourTerminal-brightblack: #5D5D5D;
|
14
|
-
-TopinambourTerminal-brightred: #ff5c8d;
|
15
|
-
-TopinambourTerminal-brightgreen: #CDEE69;
|
16
|
-
-TopinambourTerminal-brightyellow: #ffff00;
|
17
|
-
-TopinambourTerminal-brightblue: #9CD9F0;
|
18
|
-
-TopinambourTerminal-brightmagenta: #FBB1F9;
|
19
|
-
-TopinambourTerminal-brightcyan: #77DFD8;
|
20
|
-
-TopinambourTerminal-brightwhite: #F7F7F7;
|
21
|
-
-TopinambourTerminal-font: Monospace 11;
|
22
|
-
-TopinambourWindow-shell: "/usr/bin/fish";
|
23
|
-
-TopinambourWindow-css-editor-style: "monokai-extended";
|
24
|
-
-TopinambourWindow-height: 500;
|
25
|
-
-TopinambourWindow-width: 1000;*/
|
26
2
|
}
|
27
3
|
|
28
|
-
#topinambour-
|
29
|
-
background-color: rgba(
|
30
|
-
border-radius: 6px 0px 0px 6px;
|
4
|
+
#topinambour-window {
|
5
|
+
background-color: rgba(0,0,0,0);
|
31
6
|
}
|
32
7
|
|
33
8
|
#topinambour-headerbar {
|
34
|
-
background-color: #
|
9
|
+
background-color: #282828;
|
35
10
|
border: none;
|
36
11
|
box-shadow: none;
|
37
12
|
}
|
38
|
-
|
39
13
|
#topinambour-headerbar:backdrop {
|
40
14
|
background-color: rgba(50,50,50,0.7);
|
41
15
|
border: none;
|
42
16
|
box-shadow: none;
|
43
17
|
}
|
44
18
|
|
45
|
-
#topinambour-scrollbar{
|
19
|
+
#topinambour-scrollbar {
|
46
20
|
background-color: rgba(0,0,0,0);
|
47
21
|
border: none;
|
48
22
|
}
|
49
|
-
|
50
23
|
#topinambour-scrollbar trough{
|
51
24
|
background-color: rgba(0,0,0,0);
|
52
25
|
border: none;
|
53
26
|
}
|
54
|
-
|
55
27
|
#topinambour-scrollbar slider{
|
56
|
-
margin-left: 8px;
|
57
|
-
background-color: rgba(49,150,188,0.5);
|
58
|
-
}
|
59
|
-
|
60
|
-
#topinambour-tab-term {
|
61
|
-
background-color: rgba(0,0,0,0);
|
62
|
-
}
|
63
|
-
|
64
|
-
grid button image {
|
65
|
-
border: solid 3px rgba(0, 0, 0, 0.0);
|
66
28
|
margin: 0px;
|
67
|
-
|
29
|
+
background-color: rgba(255,255,255,0.1);
|
68
30
|
}
|
69
31
|
|
70
|
-
|
71
|
-
|
72
|
-
padding: 0px;
|
32
|
+
#topinambour-term-box {
|
33
|
+
background-color: #282828;
|
73
34
|
}
|
data/data/topinambour.gresource
CHANGED
Binary file
|
@@ -1,7 +1,6 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
2
|
<gresources>
|
3
3
|
<gresource prefix="/com/github/cedlemo/topinambour">
|
4
|
-
<file preprocess="xml-stripblanks">window.ui</file>
|
5
4
|
<file preprocess="xml-stripblanks">app-menu.ui</file>
|
6
5
|
<file preprocess="xml-stripblanks">window-menu.ui</file>
|
7
6
|
<file preprocess="xml-stripblanks">terminal-menu.ui</file>
|
@@ -25,12 +25,12 @@
|
|
25
25
|
<summary>Font of the terminal.</summary>
|
26
26
|
</key>
|
27
27
|
<key name="width" type="i">
|
28
|
-
<range min="1" max="
|
29
|
-
<default>
|
28
|
+
<range min="1" max="500"/>
|
29
|
+
<default>80</default>
|
30
30
|
</key>
|
31
31
|
<key name="height" type="i">
|
32
|
-
<range min="1" max="
|
33
|
-
<default>
|
32
|
+
<range min="1" max="500"/>
|
33
|
+
<default>20</default>
|
34
34
|
</key>
|
35
35
|
<key name="custom-css" type="b">
|
36
36
|
<default>false</default>
|
data/lib/about.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# Copyright 2018 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
|
+
require "#{__dir__}/version"
|
18
|
+
## About stores metainformation about Topinambour.
|
19
|
+
module About
|
20
|
+
AUTHORS = ["Cedric Le Moigne <cedlemo@gmx.com>"].freeze
|
21
|
+
SUMMARY = "Vte3 Terminal emulator in ruby.".freeze
|
22
|
+
COMMENTS =
|
23
|
+
"Terminal Emulator based on the ruby bindings of Gtk3 and Vte3".freeze
|
24
|
+
COPYRIGHT = "Copyright (C) 2015-2018 Cedric Le Moigne".freeze
|
25
|
+
LICENSE = "GPL-3.0".freeze
|
26
|
+
LICENSE_COMMENTS =
|
27
|
+
"This program is licenced under the licence GPL-3.0 and later.".freeze
|
28
|
+
LOGO_ICON_NAME = "utilities-terminal-symbolic".freeze
|
29
|
+
PROGRAM_NAME = "topinambour".freeze
|
30
|
+
VERSION = Version::STRING
|
31
|
+
WEBSITE = "https://github.com/cedlemo/topinambour".freeze
|
32
|
+
WEBSITE_LABEL = "Topinambour github repository".freeze
|
33
|
+
|
34
|
+
def self.dialog(parent)
|
35
|
+
Gtk::AboutDialog.show(parent,
|
36
|
+
"authors" => AUTHORS,
|
37
|
+
"comments" => COMMENTS,
|
38
|
+
"copyright" => COPYRIGHT,
|
39
|
+
"license" => LICENSE,
|
40
|
+
"logo_icon_name" => LOGO_ICON_NAME,
|
41
|
+
"program_name" => PROGRAM_NAME,
|
42
|
+
"version" => VERSION,
|
43
|
+
"website" => WEBSITE,
|
44
|
+
"website_label" => WEBSITE_LABEL)
|
45
|
+
end
|
46
|
+
end
|
data/lib/actions.rb
CHANGED
@@ -14,6 +14,8 @@
|
|
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
|
+
# Those are all the actions that can be called via the interface with
|
18
|
+
# the label 'app.my_action' for a method my_action.
|
17
19
|
module TopinambourActions
|
18
20
|
def self.generate_action(name)
|
19
21
|
action = Gio::SimpleAction.new(name)
|
data/lib/application.rb
CHANGED
@@ -14,41 +14,51 @@
|
|
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
|
-
require
|
17
|
+
require 'optparse'
|
18
|
+
require 'fileutils'
|
18
19
|
|
20
|
+
## Gtk::Application class for topinambour
|
21
|
+
#
|
19
22
|
class TopinambourApplication < Gtk::Application
|
20
23
|
attr_accessor :settings
|
21
24
|
def initialize
|
22
25
|
@options = {}
|
23
26
|
@exit_status = 0
|
27
|
+
@app_id = 'com.github.cedlemo.topinambour'
|
28
|
+
@app_path = '/com/github/cedlemo/topinambour'
|
24
29
|
|
25
|
-
super(
|
30
|
+
super(@app_id, %i[non_unique handles_command_line])
|
26
31
|
|
27
|
-
signal_connect
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
+
signal_connect 'startup' do |application|
|
33
|
+
GLib.set_application_name('topinambout')
|
34
|
+
GLib.set_prgname('topinambour')
|
35
|
+
parent_schema = Gio::SettingsSchemaSource.default
|
36
|
+
schema_source =
|
37
|
+
Gio::SettingsSchemaSource.new(DATA_PATH, parent_schema, true)
|
38
|
+
schema = schema_source.lookup(@app_id, true)
|
39
|
+
@settings = Gio::Settings.new(schema: schema,
|
40
|
+
path: @app_path + '/preferences/')
|
32
41
|
|
33
42
|
TopinambourActions.add_actions_to(application)
|
34
|
-
|
43
|
+
initialize_css_provider
|
44
|
+
create_xdg_dirs
|
45
|
+
load_css_config
|
46
|
+
load_menu_ui(application)
|
35
47
|
end
|
36
48
|
|
37
|
-
signal_connect
|
38
|
-
|
49
|
+
signal_connect 'activate' do |application|
|
39
50
|
window = TopinambourWindow.new(application)
|
40
|
-
window.present
|
41
51
|
|
42
52
|
if @options[:execute]
|
43
53
|
window.add_terminal(@options[:execute])
|
44
54
|
else
|
45
55
|
window.add_terminal
|
46
56
|
end
|
47
|
-
window.
|
57
|
+
window.show_all
|
58
|
+
window.present
|
48
59
|
end
|
49
60
|
|
50
|
-
|
51
|
-
signal_connect "command-line" do |_application, command_line|
|
61
|
+
signal_connect 'command-line' do |_application, command_line|
|
52
62
|
begin
|
53
63
|
parse_command_line(command_line.arguments)
|
54
64
|
rescue SystemExit => error
|
@@ -68,42 +78,41 @@ class TopinambourApplication < Gtk::Application
|
|
68
78
|
end
|
69
79
|
|
70
80
|
def reload_css_config
|
71
|
-
error_popup = nil
|
72
81
|
bad_css = nil
|
73
82
|
css_file = check_css_file_path
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
83
|
+
return unless css_file
|
84
|
+
|
85
|
+
@provider.signal_connect 'parsing-error' do |_css_prov, section, _error|
|
86
|
+
buf = Gtk::TextBuffer.new
|
87
|
+
buf.text = @css_content
|
88
|
+
start_i = buf.get_iter_at(line: section.start_line,
|
89
|
+
index: section.start_position)
|
90
|
+
end_i = buf.get_iter_at(line: section.start_line + 10,
|
91
|
+
index: section.end_position)
|
92
|
+
bad_css = ''
|
93
|
+
buf.get_text(start_i, end_i, true).lines.each_with_index do |line, i|
|
94
|
+
bad_css += "#{section.start_line + 1 + i} #{line}"
|
86
95
|
end
|
96
|
+
end
|
87
97
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
end
|
98
|
+
begin
|
99
|
+
load_custom_css(css_file)
|
100
|
+
rescue => e
|
101
|
+
windows.first.exit_overlay_mode
|
102
|
+
# TODO : deal with the preferences window which is a transient one
|
103
|
+
# that keeps the focus even when the popup shows up.
|
104
|
+
error_popup = TopinambourCssErrorPopup.new(windows.first)
|
105
|
+
error_popup.transient_for = windows.first
|
106
|
+
error_popup.message = e.message + "\n\n" + bad_css
|
107
|
+
error_popup.show_all
|
99
108
|
end
|
100
109
|
end
|
101
110
|
|
102
111
|
def check_css_file_path
|
103
|
-
css_file = if File.exist?(@settings[
|
104
|
-
@settings[
|
112
|
+
css_file = if File.exist?(@settings['css-file'])
|
113
|
+
@settings['css-file']
|
105
114
|
else
|
106
|
-
"#{CONFIG_DIR}/#{@settings[
|
115
|
+
"#{CONFIG_DIR}/#{@settings['css-file']}"
|
107
116
|
end
|
108
117
|
File.exist?(css_file) ? css_file : nil
|
109
118
|
end
|
@@ -112,12 +121,22 @@ class TopinambourApplication < Gtk::Application
|
|
112
121
|
|
113
122
|
def parse_command_line(arguments)
|
114
123
|
parser = OptionParser.new
|
115
|
-
parser.on(
|
124
|
+
parser.on('-e', '--execute COMMAND', String, 'Run a command') do |cmd|
|
116
125
|
@options[:execute] = cmd
|
117
126
|
end
|
118
127
|
parser.parse(arguments)
|
119
128
|
end
|
120
129
|
|
130
|
+
def load_menu_ui(application)
|
131
|
+
builder = Gtk::Builder.new(resource: @app_path + '/app-menu.ui')
|
132
|
+
app_menu = builder['appmenu']
|
133
|
+
application.app_menu = app_menu
|
134
|
+
end
|
135
|
+
|
136
|
+
#########################
|
137
|
+
# CSS related functions #
|
138
|
+
#########################
|
139
|
+
|
121
140
|
def initialize_css_provider
|
122
141
|
screen = Gdk::Display.default.default_screen
|
123
142
|
@provider = Gtk::CssProvider.new
|
@@ -126,61 +145,39 @@ class TopinambourApplication < Gtk::Application
|
|
126
145
|
Gtk::StyleProvider::PRIORITY_USER)
|
127
146
|
end
|
128
147
|
|
129
|
-
def load_menu_ui_in(application)
|
130
|
-
builder = Gtk::Builder.new(:resource => "/com/github/cedlemo/topinambour/app-menu.ui")
|
131
|
-
app_menu = builder["appmenu"]
|
132
|
-
application.app_menu = app_menu
|
133
|
-
end
|
134
|
-
|
135
|
-
def load_custom_css(file)
|
136
|
-
if @settings["custom-css"]
|
137
|
-
@css_content = File.open(file, "r").read
|
138
|
-
@provider.load(:data => @css_content)
|
139
|
-
else
|
140
|
-
@provider.load(:data => "")
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
148
|
def load_css_config
|
145
|
-
return unless @settings[
|
146
|
-
css_file = check_css_file_path
|
147
|
-
if css_file
|
149
|
+
return unless @settings['custom-css']
|
150
|
+
if (css_file = check_css_file_path)
|
148
151
|
begin
|
149
152
|
load_custom_css(css_file)
|
150
153
|
rescue => e
|
151
|
-
|
152
|
-
error_popup = TopinambourCssErrorPopup.new(self.windows.first)
|
154
|
+
error_popup = TopinambourCssErrorPopup.new(windows.first)
|
153
155
|
error_popup.message = e.message + "\n\nBad css file using default css"
|
154
156
|
error_popup.show_all
|
155
157
|
end
|
156
158
|
else
|
157
|
-
puts
|
159
|
+
puts 'No custom CSS, using default theme'
|
158
160
|
end
|
159
161
|
end
|
160
162
|
|
161
|
-
def
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
def initialize(parent)
|
169
|
-
super(:parent => parent, :flags => 0,
|
170
|
-
:type => Gtk::MessageType::ERROR,
|
171
|
-
:buttons_type => Gtk::ButtonsType::CLOSE,
|
172
|
-
:message => "Css Error")
|
173
|
-
|
174
|
-
@message = Gtk::Label.new("")
|
175
|
-
content_area.add(@message)
|
176
|
-
signal_connect("response") { |widget| widget.destroy }
|
163
|
+
def load_custom_css(file)
|
164
|
+
if @settings['custom-css']
|
165
|
+
@css_content = File.open(file, 'r').read
|
166
|
+
@provider.load(data: @css_content)
|
167
|
+
else
|
168
|
+
@provider.load(data: '')
|
169
|
+
end
|
177
170
|
end
|
178
171
|
|
179
|
-
|
180
|
-
|
172
|
+
#########################
|
173
|
+
# Misc #
|
174
|
+
#########################
|
175
|
+
def create_xdg_dirs
|
176
|
+
create_dir_if_absent(CONFIG_DIR)
|
177
|
+
create_dir_if_absent(DATA_HOME_DIR)
|
181
178
|
end
|
182
179
|
|
183
|
-
def
|
184
|
-
|
180
|
+
def create_dir_if_absent(path)
|
181
|
+
FileUtils.mkdir_p path unless File.exist?(path)
|
185
182
|
end
|
186
183
|
end
|