gnome-shell/subprojects/extensions-tool/src/command-disable.c
Florian Müllner 007778880b extension-tool: Fix falling back to GSettings
When we switched the tool to the public Extensions service, the
fallback to GSettings broke in the case GNOME is installed but
not running (because the service can be autostarted, albeit it'll
fail later).

Fix this by also falling back when we don't get a response from
gnome-shell.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6127

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2552>
2023-02-03 17:23:42 +00:00

127 lines
3.4 KiB
C

/* command-disable.c
*
* Copyright 2018 Florian Müllner <fmuellner@gnome.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#include <glib/gi18n.h>
#include <gio/gio.h>
#include "commands.h"
#include "common.h"
#include "config.h"
static gboolean
disable_extension_gsettings (const char *uuid)
{
g_autoptr(GSettings) settings = get_shell_settings ();
if (settings == NULL)
return FALSE;
return settings_list_remove (settings, "enabled-extensions", uuid) &&
settings_list_add (settings, "disabled-extensions", uuid);
}
static gboolean
disable_extension_dbus (GDBusProxy *proxy,
const char *uuid)
{
g_autoptr (GVariant) response = NULL;
g_autoptr (GError) error = NULL;
gboolean success = FALSE;
response = g_dbus_proxy_call_sync (proxy,
"DisableExtension",
g_variant_new ("(s)", uuid),
0,
-1,
NULL,
&error);
if (response == NULL)
return disable_extension_gsettings (uuid);
g_variant_get (response, "(b)", &success);
if (!success)
g_printerr (_("Extension “%s” does not exist\n"), uuid);
return success;
}
static gboolean
disable_extension (const char *uuid)
{
g_autoptr (GDBusProxy) proxy = NULL;
g_autoptr (GError) error = NULL;
proxy = get_shell_proxy (&error);
if (proxy != NULL)
return disable_extension_dbus (proxy, uuid);
else
return disable_extension_gsettings (uuid);
}
int
handle_disable (int argc, char *argv[], gboolean do_help)
{
g_autoptr (GOptionContext) context = NULL;
g_autoptr (GError) error = NULL;
g_auto(GStrv) uuids = NULL;
GOptionEntry entries[] = {
{ .long_name = G_OPTION_REMAINING,
.arg_description = "UUID",
.arg = G_OPTION_ARG_STRING_ARRAY, .arg_data = &uuids },
{ NULL }
};
g_set_prgname ("gnome-extensions disable");
context = g_option_context_new (NULL);
g_option_context_set_help_enabled (context, FALSE);
g_option_context_set_summary (context, _("Disable an extension"));
g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
g_option_context_add_group (context, get_option_group());
if (do_help)
{
show_help (context, NULL);
return 0;
}
if (!g_option_context_parse (context, &argc, &argv, &error))
{
show_help (context, error->message);
return 1;
}
if (uuids == NULL)
{
show_help (context, _("No UUID given"));
return 1;
}
else if (g_strv_length (uuids) > 1)
{
show_help (context, _("More than one UUID given"));
return 1;
}
return disable_extension (*uuids) ? 0 : 2;
}