├── Makefile
├── README.md
├── configs
├── simple.yml
└── test.yml
├── defaults.yml
├── dump
└── load
/Makefile:
--------------------------------------------------------------------------------
1 | prefix := $(HOME)/.local
2 | bindir := $(prefix)/bin
3 | sharedir := $(prefix)/share/xfconf-helper
4 |
5 | all:
6 |
7 | D = $(DESTDIR)
8 |
9 | install:
10 | install -d -m 755 $(D)$(bindir)/
11 | install -m 755 load $(D)$(bindir)/xfconf-load
12 | install -m 755 dump $(D)$(bindir)/xfconf-dump
13 | install -d -m 755 $(D)$(sharedir)/
14 | install -m 644 defaults.yml $(D)$(sharedir)/defaults.yml
15 |
16 | .PHONY: all install
17 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | This project attempts to simplify the configuration of Xfce, by using YAML files instead of XML
2 | files.
3 |
4 | In order to maintain your configuration, you would need an XML file like:
5 |
6 | ```xml
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | ```
20 |
21 | Of course, the moment you change any other configuration this file immediately is filled with noise,
22 | and then it becomes hard to keep track what are the defaults, and what are your changes.
23 |
24 | Instead, we use a much less verbose YAML file:
25 |
26 | ```yaml
27 | shorcuts:
28 | wm:
29 | left_workspace: "Left"
30 | right_workspace: "Right"
31 | up_workspace: "Up"
32 | down_workspace: "Down"
33 | ```
34 |
35 | This format is not only less verbose and more readable, but it also maps conceptually to what a
36 | human wants to do: map `right_workspace` to a key, not a key to `right_workspace_key`.
37 |
38 | Additionally, all configurations can be stored in the same file:
39 |
40 | ```yaml
41 | ---
42 | shortcuts:
43 | commands:
44 | "Return": xfce4-terminal
45 | wm:
46 | left_workspace: "Left"
47 | right_workspace: "Right"
48 | up_workspace: "Up"
49 | down_workspace: "Down"
50 | settings:
51 | xfwm4:
52 | "/general/easy_click": Super
53 | xfce4-session:
54 | "/general/PromptOnLogout": false
55 | xfce4-desktop:
56 | "/desktop-icons/style": 0
57 | panels:
58 | - position: p=10;x=0;y=0
59 | plugins:
60 | - - whiskermenu
61 | - - tasklist
62 | - - pager
63 | ```
64 |
65 | Even the configuration of the panels is understandable, as opposed to the XML one.
66 |
67 | To load a configuration:
68 |
69 | ```sh
70 | xfconf-load config.yml
71 | ```
72 |
73 | The configuration is loaded using D-Bus, so it's immediately activated.
74 |
75 | To store your current current configuration:
76 |
77 | ```sh
78 | xfconf-dump > config.yml
79 | ```
80 |
81 | Known defaults will be skipped in order to better visualize the actual configuration.
82 |
83 | If you want to see a diff, you can specify the original config to minimize the
84 | differences.
85 |
86 | ```sh
87 | xfconf-dump original-config.yml > new-config.yml
88 | diff -u original-config.yml new-config.yml
89 | ```
90 |
91 | ## Prerequisites
92 |
93 | To use you will need `ruby` and the `ruby-dbus` gem, which you can install with:
94 |
95 | ```sh
96 | gem install ruby-dbus
97 | ```
98 |
99 | ## Install
100 |
101 | Simply run `make install` (and make sure `~/.local/bin` is in your `$PATH`).
102 |
103 | If you are using Arch Linux, you can install xfce-config-helper from AUR.
104 |
105 | ```sh
106 | yay -Sy xfce-config-helper
107 | ```
108 |
--------------------------------------------------------------------------------
/configs/simple.yml:
--------------------------------------------------------------------------------
1 | ---
2 | shortcuts:
3 | commands:
4 | "Return": exo-open --launch TerminalEmulator
5 | wm:
6 | left_workspace: "Left"
7 | right_workspace: "Right"
8 | up_workspace: "Up"
9 | down_workspace: "Down"
10 | workspace_1: "1"
11 | workspace_2: "2"
12 | workspace_3: "3"
13 | workspace_4: "4"
14 | settings:
15 | xfwm4:
16 | "/general/easy_click": Super
17 | "/general/cycle_preview": false
18 | xfce4-session:
19 | "/general/PromptOnLogout": false
20 | xfce4-desktop:
21 | "/desktop-icons/style": 0
22 | xfce4-panel:
23 | "/panels/dark-mode": true
24 | panels:
25 | - size: 30
26 | length: 100
27 | length-adjust: false
28 | position: p=10;x=0;y=0
29 | position-locked: true
30 | icon-size: 16
31 | plugins:
32 | - - whiskermenu
33 | - - tasklist
34 | - - separator
35 | - expand: true
36 | style: 0
37 | - - windowmenu
38 | - - separator
39 | - style: 0
40 | - - pager
41 | - rows: 2
42 | - - separator
43 | - style: 0
44 | - - systray
45 | - icon-size: 16
46 | square-icons: true
47 | - - pulseaudio
48 | - - power-manager-plugin
49 | - - notification-plugin
50 | - - clock
51 | - digital-format: "%R"
52 |
--------------------------------------------------------------------------------
/configs/test.yml:
--------------------------------------------------------------------------------
1 | ---
2 | shortcuts:
3 | commands:
4 | "Return": xfce4-terminal
5 | "b": chromium
6 | wm:
7 | left_workspace: "Left"
8 | right_workspace: "Right"
9 | up_workspace: "Up"
10 | down_workspace: "Down"
11 | settings:
12 | xfwm4:
13 | "/general/easy_click": Super
14 | "/general/cycle_tabwin_mode": 1
15 | xfce4-session:
16 | "/general/PromptOnLogout": false
17 | xfce4-desktop:
18 | "/desktop-icons/style": 0
19 | panels:
20 | - plugins:
21 | - - whiskermenu
22 | - - tasklist
23 | - - pager
24 |
--------------------------------------------------------------------------------
/defaults.yml:
--------------------------------------------------------------------------------
1 | shortcuts:
2 | commands:
3 | "F1": xfce4-popup-applicationsmenu
4 | "F2": xfce4-appfinder --collapsed
5 | "F2/startup-notify": true
6 | "F3": xfce4-appfinder
7 | "F3/startup-notify": true
8 | "Delete": xfce4-session-logout
9 | "l": xflock4
10 | "t": exo-open --launch TerminalEmulator
11 | XF86Display: xfce4-display-settings --minimal
12 | "p": xfce4-display-settings --minimal
13 | "Escape": xfdesktop --menu
14 | XF86WWW: exo-open --launch WebBrowser
15 | HomePage: exo-open --launch WebBrowser
16 | XF86Mail: exo-open --launch MailReader
17 | Print: xfce4-screenshooter
18 | "Print": xfce4-screenshooter -w
19 | "Print": xfce4-screenshooter -r
20 | "e": thunar
21 | "f": thunar
22 | "Escape": xkill
23 | "Escape": xfce4-taskmanager
24 | "r": xfce4-appfinder -c
25 | "r/startup-notify": true
26 | "s": orca
27 | wm:
28 | add_workspace: "Insert"
29 | cancel: Escape
30 | left: Left
31 | right: Right
32 | up: Up
33 | down: Down
34 | cycle_windows: "Tab"
35 | cycle_reverse_windows: "Tab"
36 | del_workspace: "Delete"
37 | down_workspace: "Down"
38 | left_workspace: "Left"
39 | lower_window: "Page_Down"
40 | close_window: "F4"
41 | stick_window: "F6"
42 | move_window: "F7"
43 | resize_window: "F8"
44 | hide_window: "F9"
45 | maximize_window: "F10"
46 | fullscreen: "F11"
47 | above: "F12"
48 | move_window_left: "Left"
49 | move_window_next_workspace: "End"
50 | move_window_prev_workspace: "Home"
51 | move_window_right: "Right"
52 | move_window_up: "Up"
53 | move_window_workspace_1: "KP_1"
54 | move_window_workspace_2: "KP_2"
55 | move_window_workspace_3: "KP_3"
56 | move_window_workspace_4: "KP_4"
57 | move_window_workspace_5: "KP_5"
58 | move_window_workspace_6: "KP_6"
59 | move_window_workspace_7: "KP_7"
60 | move_window_workspace_8: "KP_8"
61 | move_window_workspace_9: "KP_9"
62 | popup_menu: "space"
63 | raise_window: "Page_Up"
64 | right_workspace: "Right"
65 | show_desktop: "d"
66 | up_workspace: "Up"
67 | switch_window: "Tab"
68 | workspace_1: "F1"
69 | workspace_2: "F2"
70 | workspace_3: "F3"
71 | workspace_4: "F4"
72 | workspace_5: "F5"
73 | workspace_6: "F6"
74 | workspace_7: "F7"
75 | workspace_8: "F8"
76 | workspace_9: "F9"
77 | workspace_10: "F10"
78 | workspace_11: "F11"
79 | workspace_12: "F12"
80 | tile_left: "KP_Left"
81 | tile_right: "KP_Right"
82 | tile_down: "KP_Down"
83 | tile_up: "KP_Up"
84 | tile_up_right: "KP_Page_Up"
85 | tile_up_left: "KP_Home"
86 | tile_down_left: "KP_End"
87 | tile_down_right: "KP_Next"
88 |
89 | settings:
90 | xsettings:
91 | "/Gdk/WindowScalingFactor": 1
92 | "/Gtk/ButtonImages": true
93 | "/Gtk/CanChangeAccels": false
94 | "/Gtk/ColorPalette": black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90
95 | "/Gtk/CursorThemeName": ''
96 | "/Gtk/CursorThemeSize": 0
97 | "/Gtk/DecorationLayout": menu:minimize,maximize,close
98 | "/Gtk/DialogsUseHeader": false
99 | "/Gtk/FontName": Sans 10
100 | "/Gtk/IconSizes": ''
101 | "/Gtk/KeyThemeName": ''
102 | "/Gtk/MenuBarAccel": F10
103 | "/Gtk/MenuImages": true
104 | "/Gtk/MonospaceFontName": Monospace 10
105 | "/Gtk/TitlebarMiddleClick": lower
106 | "/Gtk/ToolbarIconSize": 3
107 | "/Gtk/ToolbarStyle": icons
108 | "/Net/CursorBlink": true
109 | "/Net/CursorBlinkTime": 1200
110 | "/Net/DndDragThreshold": 8
111 | "/Net/DoubleClickDistance": 5
112 | "/Net/DoubleClickTime": 400
113 | "/Net/EnableEventSounds": false
114 | "/Net/EnableInputFeedbackSounds": false
115 | "/Net/IconThemeName": null
116 | "/Net/SoundThemeName": default
117 | "/Net/ThemeName": null
118 | "/Xft/Antialias": -1
119 | "/Xft/HintStyle": hintnone
120 | "/Xft/Hinting": -1
121 | "/Xft/RGBA": none
122 | xfwm4:
123 | "/general/activate_action": bring
124 | "/general/borderless_maximize": true
125 | "/general/box_move": false
126 | "/general/box_resize": false
127 | "/general/button_layout": O|SHMC
128 | "/general/button_offset": 0
129 | "/general/button_spacing": 0
130 | "/general/click_to_focus": true
131 | "/general/cycle_apps_only": false
132 | "/general/cycle_draw_frame": true
133 | "/general/cycle_hidden": true
134 | "/general/cycle_minimized": false
135 | "/general/cycle_minimum": true
136 | "/general/cycle_preview": true
137 | "/general/cycle_raise": false
138 | "/general/cycle_tabwin_mode": 0
139 | "/general/cycle_workspaces": false
140 | "/general/double_click_action": maximize
141 | "/general/double_click_distance": 5
142 | "/general/double_click_time": 250
143 | "/general/easy_click": Alt
144 | "/general/focus_delay": 250
145 | "/general/focus_hint": true
146 | "/general/focus_new": true
147 | "/general/frame_border_top": 0
148 | "/general/frame_opacity": 100
149 | "/general/full_width_title": true
150 | "/general/horiz_scroll_opacity": false
151 | "/general/inactive_opacity": 100
152 | "/general/margin_bottom": 0
153 | "/general/margin_left": 0
154 | "/general/margin_right": 0
155 | "/general/margin_top": 0
156 | "/general/maximized_offset": 0
157 | "/general/mousewheel_rollup": true
158 | "/general/move_opacity": 100
159 | "/general/placement_mode": center
160 | "/general/placement_ratio": 20
161 | "/general/popup_opacity": 100
162 | "/general/prevent_focus_stealing": false
163 | "/general/raise_delay": 250
164 | "/general/raise_on_click": true
165 | "/general/raise_on_focus": false
166 | "/general/raise_with_any_button": true
167 | "/general/repeat_urgent_blink": false
168 | "/general/resize_opacity": 100
169 | "/general/scroll_workspaces": true
170 | "/general/shadow_delta_height": 0
171 | "/general/shadow_delta_width": 0
172 | "/general/shadow_delta_x": 0
173 | "/general/shadow_delta_y": -3
174 | "/general/shadow_opacity": 50
175 | "/general/show_app_icon": false
176 | "/general/show_dock_shadow": true
177 | "/general/show_frame_shadow": true
178 | "/general/show_popup_shadow": false
179 | "/general/snap_resist": false
180 | "/general/snap_to_border": true
181 | "/general/snap_to_windows": false
182 | "/general/snap_width": 10
183 | "/general/theme": Default
184 | "/general/tile_on_move": true
185 | "/general/title_alignment": center
186 | "/general/title_font": Sans Bold 9
187 | "/general/title_horizontal_offset": 0
188 | "/general/title_shadow_active": 'false'
189 | "/general/title_shadow_inactive": 'false'
190 | "/general/title_vertical_offset_active": 0
191 | "/general/title_vertical_offset_inactive": 0
192 | "/general/titleless_maximize": false
193 | "/general/toggle_workspaces": false
194 | "/general/unredirect_overlays": true
195 | "/general/urgent_blink": false
196 | "/general/use_compositing": true
197 | "/general/vblank_mode": auto
198 | "/general/workspace_count": 4
199 | "/general/workspace_names":
200 | - Workspace 1
201 | - Workspace 2
202 | - Workspace 3
203 | - Workspace 4
204 | "/general/wrap_cycle": true
205 | "/general/wrap_layout": true
206 | "/general/wrap_resistance": 10
207 | "/general/wrap_windows": true
208 | "/general/wrap_workspaces": false
209 | "/general/zoom_desktop": true
210 | "/general/zoom_pointer": true
211 | xfce4-session:
212 | "/chooser/AlwaysDisplay": false
213 | "/compat/LaunchGNOME": false
214 | "/compat/LaunchKDE": false
215 | "/general/AutoSave": false
216 | "/general/FailsafeSessionName": Failsafe
217 | "/general/PromptOnLogout": true
218 | "/general/SessionName": Default
219 | "/security/EnableTcp": false
220 | "/shutdown/LockScreen": true
221 | keyboards:
222 | "/Default/RestoreNumlock": false
223 | xfce4-power-manager:
224 | "/xfce4-power-manager/battery-button-action": 0
225 | "/xfce4-power-manager/brightness-exponential": false
226 | "/xfce4-power-manager/brightness-level-on-ac": 80
227 | "/xfce4-power-manager/brightness-level-on-battery": 20
228 | "/xfce4-power-manager/brightness-on-ac": 9
229 | "/xfce4-power-manager/brightness-on-battery": 9
230 | "/xfce4-power-manager/brightness-step-count": 10
231 | "/xfce4-power-manager/brightness-switch": -1
232 | "/xfce4-power-manager/brightness-switch-restore-on-exit": -1
233 | "/xfce4-power-manager/critical-power-action": 0
234 | "/xfce4-power-manager/critical-power-level": 10
235 | "/xfce4-power-manager/dpms-enabled": true
236 | "/xfce4-power-manager/general-notification": false
237 | "/xfce4-power-manager/handle-brightness-keys": true
238 | "/xfce4-power-manager/hibernate-button-action": 0
239 | "/xfce4-power-manager/inactivity-on-ac": 14
240 | "/xfce4-power-manager/inactivity-on-battery": 14
241 | "/xfce4-power-manager/inactivity-sleep-mode-on-ac": 1
242 | "/xfce4-power-manager/inactivity-sleep-mode-on-battery": 2
243 | "/xfce4-power-manager/lid-action-on-ac": 3
244 | "/xfce4-power-manager/lid-action-on-battery": 3
245 | "/xfce4-power-manager/lock-screen-suspend-hibernate": true
246 | "/xfce4-power-manager/power-button-action": 0
247 | "/xfce4-power-manager/presentation-mode": false
248 | "/xfce4-power-manager/show-tray-icon": false
249 | "/xfce4-power-manager/sleep-button-action": 0
250 | xfce4-notifyd:
251 | "/date-time-custom-format": "%a %H:%M:%S"
252 | "/date-time-format": locale-default
253 | "/do-fadeout": true
254 | "/do-not-disturb": false
255 | "/do-slideout": false
256 | "/expire-timeout": 10
257 | "/expire-timeout-allow-override": true
258 | "/expire-timeout-enabled": true
259 | "/gauge-ignores-dnd": true
260 | "/initial-opacity": 0.9
261 | "/log-level": not-fully-shown
262 | "/log-level-apps": all
263 | "/log-max-size": 1000
264 | "/log-max-size-enabled": true
265 | "/min-width": 150
266 | "/min-width-enabled": false
267 | "/mute-sounds": false
268 | "/notification-display-fields": full
269 | "/notification-log": false
270 | "/notify-location": top-right
271 | "/show-notifications-on": active-monitor
272 | "/show-text-with-gauge": false
273 | "/theme": Default
274 | xfce4-screensaver:
275 | "/lock/sleep-activation": true
276 |
--------------------------------------------------------------------------------
/dump:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 |
3 | require 'yaml'
4 |
5 | begin
6 | require 'dbus'
7 | rescue LoadError
8 | $stderr.puts 'ruby-dbus needs to be installed'
9 | exit 1
10 | end
11 |
12 | $ignore = %w[
13 | /xfce4-session/sessions/Failsafe
14 | /xfce4-desktop/backdrop
15 | /xfce4-appfinder/actions
16 | /xfce4-notifyd/applications/known_applications
17 | /displays
18 | /xfce4-desktop/last
19 | /xfce4-appfinder/last
20 | /xfce4-settings-manager/last
21 | /xfce4-settings-editor/last
22 | /xfce4-mime-settings/last
23 | /thunar/last
24 | ]
25 |
26 | $xfconf = DBus.session_bus['org.xfce.Xfconf']['/org/xfce/Xfconf']['org.xfce.Xfconf']
27 |
28 | $data = ARGV[0] ? YAML.load(File.read(ARGV[0])) : {}
29 |
30 | $shortcuts = $data['shortcuts'] ||= { 'commands' => {}, 'wm' => {} }
31 | $settings = $data['settings'] ||= {}
32 | $panels = $data['panels'] = []
33 |
34 | channels = $xfconf.ListChannels()
35 |
36 | channels.each do |channel|
37 | props = $xfconf.GetAllProperties(channel, '/')
38 | case channel
39 | when 'xfce4-keyboard-shortcuts'
40 | props.each do |k, v|
41 | case k
42 | when %r{^/commands/custom/(.+)}
43 | next if $1 == 'override'
44 | $shortcuts['commands'][$1] = v
45 | when %r{^/xfwm4/custom/(.+)}
46 | next if $1 == 'override'
47 | t = v.slice(..-5)
48 | $shortcuts['wm'][t] = $1
49 | end
50 | end
51 | when 'xfce4-panel'
52 | panels = Hash.new { |h,k| h[k] = Hash.new }
53 | plugins = Hash.new { |h,k| h[k] = Array.new }
54 | props.sort.each do |k, v|
55 | case k
56 | when %r{^/panels/panel-(\d+)/(.+)$}
57 | panels[$1.to_i][$2] = v
58 | when %r{^/plugins/plugin-(\d+)$}
59 | plugins[$1.to_i][0] = v
60 | when %r{^/plugins/plugin-(\d+)/(.+)$}
61 | plugins[$1.to_i][1] ||= Hash.new
62 | plugins[$1.to_i][1][$2] = v
63 | end
64 | end
65 | panels.each_value do |panel|
66 | plugin_ids = panel.delete('plugin-ids')
67 | panel['plugins'] = plugin_ids.map { |id| plugins[id] }
68 | $panels << panel
69 | end
70 | else
71 | props.reject! { |k, v| ('/' + channel + k).start_with?(*$ignore) }
72 | next if props.empty?
73 | $settings[channel] ||= {}
74 | $settings[channel].merge!(props.sort.to_h)
75 | end
76 | end
77 |
78 | prefixes = [ Dir.home + '/.local', '/usr' ]
79 | $prefix = prefixes.find { |e| File.exist?(e + '/share/xfconf-helper/defaults.yml') }
80 |
81 | if $prefix
82 | $defaults = YAML.load(File.read($prefix + '/share/xfconf-helper/defaults.yml'))
83 |
84 | $data.each do |group,settings|
85 | next if group == 'panels'
86 | settings.each do |channel,props|
87 | defaults = $defaults[group][channel]
88 | props.reject! { |k,v| defaults[k] == v } if defaults
89 | end
90 | end
91 | else
92 | $stderr.puts "Couldn't find defaults"
93 | end
94 |
95 | puts YAML.dump($data)
96 |
--------------------------------------------------------------------------------
/load:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 |
3 | require 'yaml'
4 |
5 | begin
6 | require 'dbus'
7 | rescue LoadError
8 | $stderr.puts 'ruby-dbus needs to be installed'
9 | exit 1
10 | end
11 |
12 | if !ARGV[0]
13 | puts "usage: #{$0} config.yml"
14 | exit 1
15 | end
16 |
17 | YAML.add_domain_type('xfconf', 'uint') do |_, v|
18 | DBus.variant('u', v)
19 | end
20 |
21 | $data = YAML.load(File.read(ARGV[0]))
22 | $xfconf = DBus.session_bus['org.xfce.Xfconf']['/org/xfce/Xfconf']['org.xfce.Xfconf']
23 |
24 | def set(channel, key, value, base: nil)
25 | key = base + '/' + key if base
26 | if not value.nil?
27 | puts "#{channel}:#{key} = #{value}"
28 | $xfconf.SetProperty(channel, key, value)
29 | else
30 | puts "del #{channel}:#{key}"
31 | $xfconf.ResetProperty(channel, key, false)
32 | end
33 | end
34 |
35 | def set_each(channel, list, base: nil)
36 | return unless list
37 | list.each do |key,value|
38 | set(channel, key, value, base: base)
39 | end
40 | end
41 |
42 | if shortcuts = $data['shortcuts']
43 |
44 | # Command keyboard shortcuts
45 | set_each('xfce4-keyboard-shortcuts', shortcuts['commands'], base: '/commands/custom')
46 |
47 | # WM keyboard shortcuts
48 | actions = shortcuts['wm'] || {}
49 | list = actions.invert.map { |k, v| [ '/xfwm4/custom/' + k, v + '_key' ] }.to_h
50 |
51 | current = $xfconf.GetAllProperties('xfce4-keyboard-shortcuts', '/xfwm4/custom')
52 | clear = current.filter_map { |k,v| list.has_value?(v) && [k, nil] }.to_h
53 | list.merge!(clear) { |_,cur,_| cur }
54 |
55 | set_each('xfce4-keyboard-shortcuts', list)
56 |
57 | end
58 |
59 | # Panels
60 | if panels = $data['panels']
61 | $xfconf.ResetProperty('xfce4-panel', '/panels', true)
62 | $xfconf.ResetProperty('xfce4-panel', '/plugins', true)
63 |
64 | panels.each_with_index do |panel,panel_id|
65 | plugins = panel.delete('plugins')
66 | plugins.each_with_index do |(name,params),plugin_id|
67 | plugin_base = "/plugins/plugin-#{plugin_id + 1}"
68 | set('xfce4-panel', plugin_base, name)
69 | set_each('xfce4-panel', params, base: plugin_base)
70 | end
71 |
72 | panel['plugin-ids'] = (1..plugins.length).to_a
73 | set_each('xfce4-panel', panel, base: "/panels/panel-#{panel_id + 1}")
74 | end
75 |
76 | set('xfce4-panel', '/panels', (1..panels.length).to_a)
77 |
78 | system('xfce4-panel', '--restart')
79 | end
80 |
81 | # General settings
82 | if settings = $data['settings']
83 | settings.each do |channel,list|
84 | set_each(channel, list)
85 | end
86 | end
87 |
--------------------------------------------------------------------------------