1/* -*- Mode: Vala; indent-tabs-mode: nil; tab-width: 4 -*-
2 *
3 * Copyright (C) 2011,2012 Canonical Ltd
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation.
8 *
9 * This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
16 *
17 * Authors: Robert Ancell <robert.ancell@canonical.com>
18 *          Michael Terry <michael.terry@canonical.com>
19 */
20
21public class UGSettings
22{
23    public const string KEY_BACKGROUND = "background";
24    public const string KEY_BACKGROUND_COLOR = "background-color";
25    public const string KEY_BACKGROUND_STRETCH = "stretch-background-across-monitors";
26    public const string KEY_DRAW_USER_BACKGROUNDS = "draw-user-backgrounds";
27    public const string KEY_DRAW_GRID = "draw-grid";
28    public const string KEY_SHOW_HOSTNAME = "show-hostname";
29    public const string KEY_SHOW_POWER = "show-power";
30    public const string KEY_SHOW_A11Y = "show-a11y";
31    public const string KEY_SHOW_CLOCK = "show-clock";
32    public const string KEY_SHOW_KEYBOARD = "show-keyboard";
33    public const string KEY_SHOW_QUIT = "show-quit";
34    public const string KEY_LOGO = "logo";
35    public const string KEY_OTHER_MONITORS_LOGO = "other-monitors-logo";
36    public const string KEY_THEME_NAME = "theme-name";
37    public const string KEY_ICON_THEME_NAME = "icon-theme-name";
38    public const string KEY_FONT_NAME = "font-name";
39    public const string KEY_XFT_ANTIALIAS = "xft-antialias";
40    public const string KEY_XFT_DPI = "xft-dpi";
41    public const string KEY_XFT_HINTSTYLE = "xft-hintstyle";
42    public const string KEY_XFT_RGBA = "xft-rgba";
43    public const string KEY_ONSCREEN_KEYBOARD = "onscreen-keyboard";
44    public const string KEY_HIGH_CONTRAST = "high-contrast";
45    public const string KEY_SCREEN_READER = "screen-reader";
46    public const string KEY_PLAY_READY_SOUND = "play-ready-sound";
47    public const string KEY_HIDDEN_USERS = "hidden-users";
48    public const string KEY_GROUP_FILTER = "group-filter";
49    public const string KEY_ENABLE_HIDPI = "enable-hidpi";
50    public const string KEY_ACTIVATE_NUMLOCK = "activate-numlock";
51    public const string KEY_ONLY_ON_MONITOR = "only-on-monitor";
52    public const string KEY_CLOCK_FORMAT = "clock-format";
53
54    public static bool get_boolean (string key)
55    {
56        var gsettings = new Settings (SCHEMA);
57        return gsettings.get_boolean (key);
58    }
59
60    /* LP: 1006497 - utility function to make sure we have the key before trying to read it (which will segfault if the key isn't there) */
61    public static bool safe_get_boolean (string key, bool default)
62    {
63        var gsettings = new Settings (SCHEMA);
64        string[] keys = gsettings.list_keys ();
65        foreach (var k in keys)
66            if (k == key)
67                return gsettings.get_boolean (key);
68
69        /* key not in child list */
70        return default;
71    }
72
73    public static int get_integer (string key)
74    {
75        var gsettings = new Settings (SCHEMA);
76        return gsettings.get_int (key);
77    }
78
79    public static double get_double (string key)
80    {
81        var gsettings = new Settings (SCHEMA);
82        return gsettings.get_double (key);
83    }
84
85    public static string get_string (string key)
86    {
87        var gsettings = new Settings (SCHEMA);
88        return gsettings.get_string (key);
89    }
90
91    public static bool set_boolean (string key, bool value)
92    {
93        var gsettings = new Settings (SCHEMA);
94        return gsettings.set_boolean (key, value);
95    }
96
97    public static string[] get_strv (string key)
98    {
99        var gsettings = new Settings (SCHEMA);
100        return gsettings.get_strv (key);
101    }
102
103    public static bool set_strv (string key, string[] value)
104    {
105        var gsettings = new Settings (SCHEMA);
106        return gsettings.set_strv (key, value);
107    }
108
109    public static void apply_conf_settings ()
110    {
111        try {
112            var path = "/usr/local/etc/lightdm/slick-greeter.conf";
113            var gsettings = new Settings (SCHEMA);
114            var keyfile = new KeyFile ();
115
116            if (FileUtils.test (path, FileTest.EXISTS))
117            {
118                keyfile.load_from_file (path, KeyFileFlags.NONE);
119            }
120
121            var string_keys = new List<string> ();
122            string_keys.append (KEY_BACKGROUND);
123            string_keys.append (KEY_BACKGROUND_COLOR);
124            string_keys.append (KEY_LOGO);
125            string_keys.append (KEY_OTHER_MONITORS_LOGO);
126            string_keys.append (KEY_THEME_NAME);
127            string_keys.append (KEY_ICON_THEME_NAME);
128            string_keys.append (KEY_FONT_NAME);
129            string_keys.append (KEY_PLAY_READY_SOUND);
130            string_keys.append (KEY_XFT_HINTSTYLE);
131            string_keys.append (KEY_XFT_RGBA);
132            string_keys.append (KEY_ENABLE_HIDPI);
133            string_keys.append (KEY_ONLY_ON_MONITOR);
134            string_keys.append (KEY_CLOCK_FORMAT);
135
136            var bool_keys = new List<string> ();
137            bool_keys.append (KEY_DRAW_USER_BACKGROUNDS);
138            bool_keys.append (KEY_BACKGROUND_STRETCH);
139            bool_keys.append (KEY_DRAW_GRID);
140            bool_keys.append (KEY_SHOW_HOSTNAME);
141            bool_keys.append (KEY_SHOW_POWER);
142            bool_keys.append (KEY_SHOW_A11Y);
143            bool_keys.append (KEY_SHOW_CLOCK);
144            bool_keys.append (KEY_SHOW_KEYBOARD);
145            bool_keys.append (KEY_SHOW_QUIT);
146            bool_keys.append (KEY_XFT_ANTIALIAS);
147            bool_keys.append (KEY_ACTIVATE_NUMLOCK);
148
149            var int_keys = new List<string> ();
150            int_keys.append (KEY_XFT_DPI);
151
152            var strv_keys = new List<string> ();
153            strv_keys.append (KEY_HIDDEN_USERS);
154            strv_keys.append (KEY_GROUP_FILTER);
155
156            foreach (string key in string_keys)
157            {
158                if (keyfile.has_group (GROUP_NAME) && keyfile.has_key (GROUP_NAME, key)) {
159                    try {
160                        var value = keyfile.get_string (GROUP_NAME, key);
161                        debug ("Overriding dconf setting for %s with %s", key, value);
162                        gsettings.set_string (key, value);
163                        }
164                    catch (Error e) {
165                        warning ("Failed to apply %s from configuration file: %s", key, e.message);
166                    }
167                }
168                else {
169                    gsettings.reset(key);
170                    debug ("Resetting dconf setting for %s to default", key);
171                }
172            }
173
174            foreach (string key in bool_keys)
175            {
176                if (keyfile.has_group (GROUP_NAME) && keyfile.has_key (GROUP_NAME, key)) {
177                    try {
178                        var value = keyfile.get_boolean (GROUP_NAME, key);
179                        debug ("Overriding dconf setting for %s", key);
180                        gsettings.set_boolean (key, value);
181                    }
182                    catch (Error e) {
183                        warning ("Failed to apply %s from configuration file: %s", key, e.message);
184                    }
185                }
186                else {
187                    gsettings.reset(key);
188                    debug ("Resetting dconf setting for %s to default", key);
189                }
190            }
191
192            foreach (string key in int_keys)
193            {
194                if (keyfile.has_group (GROUP_NAME) && keyfile.has_key (GROUP_NAME, key)) {
195                    try {
196                        var value = keyfile.get_integer (GROUP_NAME, key);
197                        debug ("Overriding dconf setting for %s with %d", key, value);
198                        gsettings.set_int (key, value);
199                    }
200                    catch (Error e) {
201                        warning ("Failed to apply %s from configuration file: %s", key, e.message);
202                    }
203                }
204                else {
205                    gsettings.reset(key);
206                    debug ("Resetting dconf setting for %s to default", key);
207                }
208            }
209
210            foreach (string key in strv_keys)
211            {
212                if (keyfile.has_group (GROUP_NAME) && keyfile.has_key (GROUP_NAME, key)) {
213                    try {
214                        var value = keyfile.get_string_list (GROUP_NAME, key);
215                        debug ("Overriding dconf setting for %s", key);
216                        gsettings.set_strv (key, value);
217                    }
218                    catch (Error e) {
219                        warning ("Failed to apply %s from configuration file: %s", key, e.message);
220                    }
221                }
222                else {
223                    gsettings.reset(key);
224                    debug ("Resetting dconf setting for %s to default", key);
225                }
226            }
227        }
228        catch (Error e) {
229            warning ("Error in apply_conf_settings (): %s", e.message);
230        }
231    }
232    private const string SCHEMA = "x.dm.slick-greeter";
233    private const string GROUP_NAME = "Greeter";
234}
235