30
30
#include "gsm-shell-extensions.h"
33
struct _GsmShellExtension
43
gsm_shell_extension_free (gpointer data)
45
GsmShellExtension *extension = (GsmShellExtension *)data;
47
g_free (extension->uuid);
48
g_free (extension->name);
49
g_free (extension->description);
53
gsm_shell_extension_get_uuid (GsmShellExtension *extension)
55
return extension->uuid;
59
gsm_shell_extension_get_name (GsmShellExtension *extension)
61
return extension->name;
65
gsm_shell_extension_get_description (GsmShellExtension *extension)
67
return extension->description;
71
gsm_shell_extension_get_is_enabled (GsmShellExtension *extension)
73
return extension->enabled;
76
32
#define SHELL_SCHEMA "org.gnome.shell"
77
33
#define ENABLED_EXTENSIONS_KEY "enabled-extensions"
136
gsm_shell_extensions_fetch_enabled (GsmShellExtensions *self)
138
gchar **enabled_uuids;
141
enabled_uuids = g_settings_get_strv (self->priv->settings, ENABLED_EXTENSIONS_KEY);
143
uuids = enabled_uuids;
144
while (*uuids != '\0')
146
GsmShellExtension *extension;
147
extension = g_hash_table_lookup (self->priv->uuid_to_extension, *uuids);
148
if (extension != NULL)
149
extension->enabled = TRUE;
154
g_strfreev (enabled_uuids);
158
84
gsm_shell_extensions_scan_dir (GsmShellExtensions *self,
176
102
while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL)) != NULL)
178
GsmShellExtension *extension = g_slice_new (GsmShellExtension);
179
104
gchar *metadata_filename;
180
gchar *metadata_uuid;
105
const gchar *metadata_uuid;
181
107
JsonObject *metadata_root;
183
extension->uuid = (char *) g_file_info_get_name (info);
109
dir_uuid = (char *) g_file_info_get_name (info);
185
111
metadata_filename = g_build_filename (g_file_get_path (dir),
195
121
metadata_root = json_node_get_object (json_parser_get_root (metadata_parser));
197
metadata_uuid = g_strdup (json_object_get_string_member (metadata_root, "uuid"));
198
if (!g_str_equal (metadata_uuid, extension->uuid))
123
metadata_uuid = json_object_get_string_member (metadata_root, "uuid");
124
if (!g_str_equal (metadata_uuid, dir_uuid))
200
126
g_warning ("Extension with dirname '%s' does not match metadata's UUID of '%s'. Skipping.",
127
dir_uuid, metadata_uuid);
206
extension->enabled = FALSE;
207
extension->name = g_strdup (json_object_get_string_member (metadata_root, "name"));
208
extension->description = g_strdup (json_object_get_string_member (metadata_root, "description"));
210
g_hash_table_insert (self->priv->uuid_to_extension,
211
g_strdup (extension->uuid), extension);
131
self->priv->num_extensions++;
270
if (self->priv->settings)
272
self->priv->uuid_to_extension = g_hash_table_new_full (g_str_hash,
275
gsm_shell_extension_free);
276
gsm_shell_extensions_scan (self);
277
gsm_shell_extensions_fetch_enabled (self);
190
if (self->priv->settings != NULL)
191
gsm_shell_extensions_scan (self);
282
gsm_shell_extensions_set_enabled (GsmShellExtensions *self,
288
const gchar **new_uuids;
289
GsmShellExtension *extension;
291
if (self->priv->settings == NULL)
294
extension = g_hash_table_lookup (self->priv->uuid_to_extension,
297
if (extension == NULL)
300
if (extension->enabled == enabled)
303
uuids = g_settings_get_strv (self->priv->settings, ENABLED_EXTENSIONS_KEY);
304
length = g_strv_length (uuids);
308
new_uuids = g_new (const gchar *, length + 2); /* New key, NULL */
309
for (i = 0; i < length; i ++)
310
new_uuids[i] = g_strdup (uuids[i]);
312
new_uuids[i++] = g_strdup (uuid);
318
new_uuids = g_new (const gchar *, length);
319
for (i = 0; i < length; i ++)
321
if (g_str_equal (uuids[i], uuid))
324
new_uuids[j] = g_strdup (uuids[i]);
333
if (g_settings_set_strv (self->priv->settings,
334
ENABLED_EXTENSIONS_KEY,
337
extension->enabled = enabled;
345
gsm_shell_extensions_foreach (GsmShellExtensions *self,
346
GsmShellExtensionFunc func,
350
GsmShellExtension *extension;
352
if (self->priv->settings == NULL)
355
g_hash_table_iter_init (&iter, self->priv->uuid_to_extension);
356
while (g_hash_table_iter_next (&iter, NULL, (gpointer) &extension))
357
(*func) (self, extension, user_data);
361
gsm_shell_extensions_get_for_uuid (GsmShellExtensions *self,
364
if (self->priv->settings == NULL)
367
return g_hash_table_lookup (self->priv->uuid_to_extension, uuid);
195
gsm_shell_extensions_disable_all (GsmShellExtensions *self)
197
return g_settings_set_strv (self->priv->settings,
198
ENABLED_EXTENSIONS_KEY,