topinambour 2.0.4 → 2.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|