diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 14:36:24 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 14:36:24 +0000 |
commit | 9b6d8e63db85c30007b463e91f91a791969fa83f (patch) | |
tree | 0899af51d73c1bf986f73ae39a03c4436083018a /shell/cc-panel.c | |
parent | Initial commit. (diff) | |
download | gnome-control-center-9b6d8e63db85c30007b463e91f91a791969fa83f.tar.xz gnome-control-center-9b6d8e63db85c30007b463e91f91a791969fa83f.zip |
Adding upstream version 1:3.38.4.upstream/1%3.38.4upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'shell/cc-panel.c')
-rw-r--r-- | shell/cc-panel.c | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/shell/cc-panel.c b/shell/cc-panel.c new file mode 100644 index 0000000..df9a7f3 --- /dev/null +++ b/shell/cc-panel.c @@ -0,0 +1,257 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * + * Copyright (C) 2010 Red Hat, Inc. + * Copyright (C) 2010 Intel, Inc + * + * 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 2 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/>. + * + * Authors: William Jon McCann <jmccann@redhat.com> + * Thomas Wood <thomas.wood@intel.com> + * + */ + +/** + * SECTION:cc-panel + * @short_description: An abstract class for Control Center panels + * + * CcPanel is an abstract class used to implement panels for the shell. A + * panel contains a collection of related settings that are displayed within + * the shell window. + */ + +#include "config.h" + +#include "cc-panel.h" + +#include <stdlib.h> +#include <stdio.h> + +#include <gtk/gtk.h> +#include <gio/gio.h> + +typedef struct +{ + CcShell *shell; + GCancellable *cancellable; +} CcPanelPrivate; + +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (CcPanel, cc_panel, GTK_TYPE_BIN) + +enum +{ + SIDEBAR_ACTIVATED, + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_SHELL, + PROP_PARAMETERS, + N_PROPS +}; + +static GParamSpec *properties [N_PROPS]; + +static guint signals [LAST_SIGNAL] = { 0 }; + +static void +cc_panel_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + CcPanelPrivate *priv = cc_panel_get_instance_private (CC_PANEL (object)); + + switch (prop_id) + { + case PROP_SHELL: + /* construct only property */ + priv->shell = g_value_get_object (value); + break; + + case PROP_PARAMETERS: + { + g_autoptr(GVariant) v = NULL; + GVariant *parameters; + gsize n_parameters; + + parameters = g_value_get_variant (value); + + if (parameters == NULL) + return; + + n_parameters = g_variant_n_children (parameters); + if (n_parameters == 0) + return; + + g_variant_get_child (parameters, 0, "v", &v); + + if (!g_variant_is_of_type (v, G_VARIANT_TYPE_DICTIONARY)) + g_warning ("Wrong type for the first argument GVariant, expected 'a{sv}' but got '%s'", + (gchar *)g_variant_get_type (v)); + else if (g_variant_n_children (v) > 0) + g_warning ("Ignoring additional flags"); + + if (n_parameters > 1) + g_warning ("Ignoring additional parameters"); + + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +cc_panel_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + CcPanelPrivate *priv = cc_panel_get_instance_private (CC_PANEL (object)); + + switch (prop_id) + { + case PROP_SHELL: + g_value_set_object (value, priv->shell); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +cc_panel_finalize (GObject *object) +{ + CcPanelPrivate *priv = cc_panel_get_instance_private (CC_PANEL (object)); + + g_cancellable_cancel (priv->cancellable); + g_clear_object (&priv->cancellable); + + G_OBJECT_CLASS (cc_panel_parent_class)->finalize (object); +} + +static void +cc_panel_class_init (CcPanelClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = cc_panel_get_property; + object_class->set_property = cc_panel_set_property; + object_class->finalize = cc_panel_finalize; + + signals[SIDEBAR_ACTIVATED] = g_signal_new ("sidebar-activated", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + properties[PROP_SHELL] = g_param_spec_object ("shell", + "Shell", + "Shell the Panel resides in", + CC_TYPE_SHELL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + properties[PROP_PARAMETERS] = g_param_spec_variant ("parameters", + "Structured parameters", + "Additional parameters passed externally (ie. command line, D-Bus activation)", + G_VARIANT_TYPE ("av"), + NULL, + G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, N_PROPS, properties); +} + +static void +cc_panel_init (CcPanel *panel) +{ +} + +/** + * cc_panel_get_shell: + * @panel: A #CcPanel + * + * Get the shell that the panel resides in + * + * Returns: a #CcShell + */ +CcShell * +cc_panel_get_shell (CcPanel *panel) +{ + CcPanelPrivate *priv; + + g_return_val_if_fail (CC_IS_PANEL (panel), NULL); + + priv = cc_panel_get_instance_private (panel); + + return priv->shell; +} + +const gchar* +cc_panel_get_help_uri (CcPanel *panel) +{ + CcPanelClass *class = CC_PANEL_GET_CLASS (panel); + + if (class->get_help_uri) + return class->get_help_uri (panel); + + return NULL; +} + +GtkWidget * +cc_panel_get_title_widget (CcPanel *panel) +{ + CcPanelClass *class = CC_PANEL_GET_CLASS (panel); + + if (class->get_title_widget) + return class->get_title_widget (panel); + + return NULL; +} + +GtkWidget* +cc_panel_get_sidebar_widget (CcPanel *panel) +{ + CcPanelClass *class = CC_PANEL_GET_CLASS (panel); + + if (class->get_sidebar_widget) + { + GtkWidget *sidebar_widget; + + sidebar_widget = class->get_sidebar_widget (panel); + g_assert (sidebar_widget != NULL); + + return sidebar_widget; + } + + return NULL; +} + +GCancellable * +cc_panel_get_cancellable (CcPanel *panel) +{ + CcPanelPrivate *priv = cc_panel_get_instance_private (panel); + + g_return_val_if_fail (CC_IS_PANEL (panel), NULL); + + if (priv->cancellable == NULL) + priv->cancellable = g_cancellable_new (); + + return priv->cancellable; +} |