extensions-tool: Split out get_extension_property() helper

For the prefs command, we first fetch the extension info to check
whether the extension exists and actually has preferences. This
pattern can be useful for other commands and properties, so split
out a generic helper function.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/2391
This commit is contained in:
Florian Müllner 2020-03-14 11:38:24 +01:00
parent 23e382dd33
commit 636ab4b0e9
3 changed files with 44 additions and 25 deletions

View File

@ -29,9 +29,7 @@ static gboolean
launch_extension_prefs (const char *uuid) launch_extension_prefs (const char *uuid)
{ {
g_autoptr (GDBusProxy) proxy = NULL; g_autoptr (GDBusProxy) proxy = NULL;
g_autoptr (GVariant) response = NULL; g_autoptr (GVariant) info = NULL;
g_autoptr (GVariant) asv = NULL;
g_autoptr (GVariantDict) info = NULL;
g_autoptr (GError) error = NULL; g_autoptr (GError) error = NULL;
gboolean has_prefs; gboolean has_prefs;
@ -39,29 +37,11 @@ launch_extension_prefs (const char *uuid)
if (proxy == NULL) if (proxy == NULL)
return FALSE; return FALSE;
response = g_dbus_proxy_call_sync (proxy, info = get_extension_property (proxy, uuid, "hasPrefs");
"GetExtensionInfo", if (info == NULL)
g_variant_new ("(s)", uuid), return FALSE;
0,
-1,
NULL,
&error);
if (response == NULL)
{
g_printerr (_("Failed to connect to GNOME Shell"));
return FALSE;
}
asv = g_variant_get_child_value (response, 0); has_prefs = g_variant_get_boolean (info);
info = g_variant_dict_new (asv);
if (!g_variant_dict_contains (info, "uuid"))
{
g_printerr (_("Extension “%s” doesn't exist\n"), uuid);
return FALSE;
}
g_variant_dict_lookup (info, "hasPrefs", "b", &has_prefs);
if (!has_prefs) if (!has_prefs)
{ {
g_printerr (_("Extension “%s” doesn't have preferences\n"), uuid); g_printerr (_("Extension “%s” doesn't have preferences\n"), uuid);

View File

@ -54,6 +54,10 @@ void print_extension_info (GVariantDict *info,
DisplayFormat format); DisplayFormat format);
GDBusProxy *get_shell_proxy (GError **error); GDBusProxy *get_shell_proxy (GError **error);
GVariant *get_extension_property (GDBusProxy *proxy,
const char *uuid,
const char *property);
GSettings *get_shell_settings (void); GSettings *get_shell_settings (void);
gboolean settings_list_add (GSettings *settings, gboolean settings_list_add (GSettings *settings,

View File

@ -124,6 +124,41 @@ get_shell_settings (void)
return g_settings_new_full (schema, NULL, NULL); return g_settings_new_full (schema, NULL, NULL);
} }
GVariant *
get_extension_property (GDBusProxy *proxy,
const char *uuid,
const char *property)
{
g_autoptr (GVariant) response = NULL;
g_autoptr (GVariant) asv = NULL;
g_autoptr (GVariantDict) info = NULL;
g_autoptr (GError) error = NULL;
response = g_dbus_proxy_call_sync (proxy,
"GetExtensionInfo",
g_variant_new ("(s)", uuid),
0,
-1,
NULL,
&error);
if (response == NULL)
{
g_printerr (_("Failed to connect to GNOME Shell"));
return NULL;
}
asv = g_variant_get_child_value (response, 0);
info = g_variant_dict_new (asv);
if (!g_variant_dict_contains (info, "uuid"))
{
g_printerr (_("Extension “%s” doesn't exist\n"), uuid);
return NULL;
}
return g_variant_dict_lookup_value (info, property, NULL);
}
gboolean gboolean
settings_list_add (GSettings *settings, settings_list_add (GSettings *settings,
const char *key, const char *key,