From b4fdb6db4ff7a0a261947ad7b350122e9ba7890b Mon Sep 17 00:00:00 2001 From: Thomas Wood Date: Tue, 18 May 2010 16:09:26 +0100 Subject: [PATCH] Add libgnome-control-center with two new classes: CcShell and CcPanel CcShell is an abstract class that represents an instance of a control center shell. It provides access to some of the properties of the shell that panels will need to read or change. When a panel is created it has an instance of CcShell available that represents the current shell. 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. --- Makefile.am | 5 +- autogen.sh | 2 + configure.ac | 15 +- docs/Makefile.am | 3 + docs/reference/Makefile.am | 3 + .../libgnome-control-center/Makefile.am | 102 ++++++ .../libgnome-control-center-docs.sgml | 35 ++ .../libgnome-control-center-sections.txt | 43 +++ .../libgnome-control-center/version.xml.in | 1 + libgnome-control-center/Makefile.am | 47 +++ libgnome-control-center/cc-panel.c | 303 ++++++++++++++++++ libgnome-control-center/cc-panel.h | 86 +++++ libgnome-control-center/cc-shell.c | 211 ++++++++++++ libgnome-control-center/cc-shell.h | 100 ++++++ .../libgnome-control-center.pc.in | 12 + 15 files changed, 965 insertions(+), 3 deletions(-) create mode 100644 docs/Makefile.am create mode 100644 docs/reference/Makefile.am create mode 100644 docs/reference/libgnome-control-center/Makefile.am create mode 100644 docs/reference/libgnome-control-center/libgnome-control-center-docs.sgml create mode 100644 docs/reference/libgnome-control-center/libgnome-control-center-sections.txt create mode 100644 docs/reference/libgnome-control-center/version.xml.in create mode 100644 libgnome-control-center/Makefile.am create mode 100644 libgnome-control-center/cc-panel.c create mode 100644 libgnome-control-center/cc-panel.h create mode 100644 libgnome-control-center/cc-shell.c create mode 100644 libgnome-control-center/cc-shell.h create mode 100644 libgnome-control-center/libgnome-control-center.pc.in diff --git a/Makefile.am b/Makefile.am index ae0e6d8ba..866da2d6a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,5 @@ -SUBDIRS = po libwindow-settings capplets font-viewer help +SUBDIRS = po libwindow-settings libgnome-control-center capplets font-viewer \ + help docs DIST_SUBDIRS = po libwindow-settings capplets font-viewer help libslab shell typing-break if HAVE_LIBSLAB_DEPS @@ -50,7 +51,7 @@ EXTRA_DIST = \ MAINTAINERS \ gnome-doc-utils.make -DISTCHECK_CONFIGURE_FLAGS = --disable-scrollkeeper --disable-update-mimedb +DISTCHECK_CONFIGURE_FLAGS = --disable-scrollkeeper --disable-update-mimedb --enable-gtk-doc GITIGNOREFILES=m4 diff --git a/autogen.sh b/autogen.sh index 77a952a65..a01ce9579 100755 --- a/autogen.sh +++ b/autogen.sh @@ -24,4 +24,6 @@ if ! which gnome-autogen.sh ; then exit 1 fi +gtkdocize || exit 1 + REQUIRED_AUTOMAKE_VERSION=1.9 . gnome-autogen.sh diff --git a/configure.ac b/configure.ac index 02284f463..3f609edc9 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,5 @@ -AC_INIT([gnome-control-center], [2.31.1], +m4_define([gnome_control_center_version], 2.31.1) +AC_INIT([gnome-control-center], [gnome_control_center_version], [http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-control-center]) AC_CONFIG_MACRO_DIR([m4]) @@ -314,6 +315,12 @@ AC_ARG_ENABLE(update-mimedb, enable_update_mimedb=yes) AM_CONDITIONAL(ENABLE_UPDATE_MIMEDB, test x$enable_update_mimedb = xyes) +# check for gtk-doc +GTK_DOC_CHECK([1.9]) + +CONTROL_CENTER_VERSION=gnome_control_center_version +AC_SUBST(CONTROL_CENTER_VERSION) + AC_CONFIG_FILES([ Makefile @@ -347,9 +354,15 @@ capplets/network/Makefile capplets/network/gnome-network-properties.desktop.in capplets/windows/Makefile capplets/windows/window-properties.desktop.in +docs/Makefile +docs/reference/Makefile +docs/reference/libgnome-control-center/Makefile +docs/reference/libgnome-control-center/version.xml font-viewer/Makefile font-viewer/gnome-font-viewer.desktop.in help/Makefile +libgnome-control-center/Makefile +libgnome-control-center/libgnome-control-center.pc libwindow-settings/Makefile libwindow-settings/gnome-window-settings-2.0.pc po/Makefile.in diff --git a/docs/Makefile.am b/docs/Makefile.am new file mode 100644 index 000000000..372c2a7a1 --- /dev/null +++ b/docs/Makefile.am @@ -0,0 +1,3 @@ +SUBDIRS=reference + +-include $(top_srcdir)/git.mk diff --git a/docs/reference/Makefile.am b/docs/reference/Makefile.am new file mode 100644 index 000000000..9917ad725 --- /dev/null +++ b/docs/reference/Makefile.am @@ -0,0 +1,3 @@ +SUBDIRS=libgnome-control-center + +-include $(top_srcdir)/git.mk diff --git a/docs/reference/libgnome-control-center/Makefile.am b/docs/reference/libgnome-control-center/Makefile.am new file mode 100644 index 000000000..c6e6ccd61 --- /dev/null +++ b/docs/reference/libgnome-control-center/Makefile.am @@ -0,0 +1,102 @@ +## Process this file with automake to produce Makefile.in + +# We require automake 1.6 at least. +AUTOMAKE_OPTIONS = 1.6 + +# This is a blank Makefile.am for using gtk-doc. +# Copy this to your project's API docs directory and modify the variables to +# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples +# of using the various options. + +# The name of the module, e.g. 'glib'. +DOC_MODULE=libgnome-control-center + +# Uncomment for versioned docs and specify the version of the module, e.g. '2'. +#DOC_MODULE_VERSION=2 + + +# The top-level SGML file. You can change this if you want to. +DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml + +# Directories containing the source code, relative to $(srcdir). +# gtk-doc will search all .c and .h files beneath these paths +# for inline comments documenting functions and macros. +# e.g. DOC_SOURCE_DIR=../../../gtk ../../../gdk +DOC_SOURCE_DIR=../../../libgnome-control-center + +# Extra options to pass to gtkdoc-scangobj. Not normally needed. +SCANGOBJ_OPTIONS= + +# Extra options to supply to gtkdoc-scan. +# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" +SCAN_OPTIONS= + +# Extra options to supply to gtkdoc-mkdb. +# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml +MKDB_OPTIONS=--sgml-mode --output-format=xml + +# Extra options to supply to gtkdoc-mktmpl +# e.g. MKTMPL_OPTIONS=--only-section-tmpl +MKTMPL_OPTIONS= + +# Extra options to supply to gtkdoc-mkhtml +MKHTML_OPTIONS= + +# Extra options to supply to gtkdoc-fixref. Not normally needed. +# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html +FIXXREF_OPTIONS= + +# Used for dependencies. The docs will be rebuilt if any of these change. +# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h +# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c +HFILE_GLOB=$(top_srcdir)/libgnome-control-center/*.h +CFILE_GLOB=$(top_srcdir)/libgnome-control-center/*.c + +# Extra header to include when scanning, which are not under DOC_SOURCE_DIR +# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h +EXTRA_HFILES= + +# Header files to ignore when scanning. Use base file name, no paths +# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h +IGNORE_HFILES= + +# Images to copy into HTML directory. +# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png +HTML_IMAGES= + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +# e.g. content_files=running.sgml building.sgml changes-2.0.sgml +content_files= + +# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded +# These files must be listed here *and* in content_files +# e.g. expand_content_files=running.sgml +expand_content_files= + +# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. +# Only needed if you are using gtkdoc-scangobj to dynamically query widget +# signals and properties. +# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) +# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) +GTKDOC_CFLAGS=$(CAPPLET_CFLAGS) +GTKDOC_LIBS=$(CAPPLET_LIBS) $(top_builddir)/libgnome-control-center/libgnome-control-center.la + +# This includes the standard gtk-doc make rules, copied by gtkdocize. +include $(top_srcdir)/gtk-doc.make + +# Other files to distribute +# e.g. EXTRA_DIST += version.xml.in +EXTRA_DIST += version.xml.in + +# Files not to distribute +# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types +# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt +#DISTCLEANFILES += + +# Comment this out if you want your docs-status tested during 'make check' +if ENABLE_GTK_DOC +#TESTS_ENVIRONMENT = cd $(srcsrc) && +#TESTS = $(GTKDOC_CHECK) +endif + +-include $(top_srcdir)/git.mk diff --git a/docs/reference/libgnome-control-center/libgnome-control-center-docs.sgml b/docs/reference/libgnome-control-center/libgnome-control-center-docs.sgml new file mode 100644 index 000000000..7609382c1 --- /dev/null +++ b/docs/reference/libgnome-control-center/libgnome-control-center-docs.sgml @@ -0,0 +1,35 @@ + + + +]> + + + libgnome-control-center Reference Manual + + for libgnome-control-center &version;. + + + + + + libgnome-control-center + + + + + Object Hierarchy + + + + API Index + + + + + diff --git a/docs/reference/libgnome-control-center/libgnome-control-center-sections.txt b/docs/reference/libgnome-control-center/libgnome-control-center-sections.txt new file mode 100644 index 000000000..fcd1ba1d5 --- /dev/null +++ b/docs/reference/libgnome-control-center/libgnome-control-center-sections.txt @@ -0,0 +1,43 @@ +
+cc-shell +CcShell +CcShell +CcShellClass +cc_shell_get_active_panel +cc_shell_set_active_panel +cc_shell_set_active_panel_from_id + +CC_SHELL +CC_IS_SHELL +CC_TYPE_SHELL +cc_shell_get_type +CC_SHELL_CLASS +CC_IS_SHELL_CLASS +CC_SHELL_GET_CLASS + +CcShellPrivate +
+ +
+cc-panel +CcPanel +CcPanel +CcPanelClass +cc_panel_get_id +cc_panel_get_shell +cc_panel_get_display_name +cc_panel_set_display_name +cc_panel_get_active +cc_panel_set_active + +CC_PANEL +CC_IS_PANEL +CC_TYPE_PANEL +cc_panel_get_type +CC_PANEL_CLASS +CC_IS_PANEL_CLASS +CC_PANEL_GET_CLASS + +CcPanelPrivate +
+ diff --git a/docs/reference/libgnome-control-center/version.xml.in b/docs/reference/libgnome-control-center/version.xml.in new file mode 100644 index 000000000..a5c3beba0 --- /dev/null +++ b/docs/reference/libgnome-control-center/version.xml.in @@ -0,0 +1 @@ +@CONTROL_CENTER_VERSION@ diff --git a/libgnome-control-center/Makefile.am b/libgnome-control-center/Makefile.am new file mode 100644 index 000000000..0622e2b94 --- /dev/null +++ b/libgnome-control-center/Makefile.am @@ -0,0 +1,47 @@ +NULL = + +uidir = $(pkgdatadir)/ui + +INCLUDES = \ + $(CAPPLET_CFLAGS) \ + $(NULL) + +lib_LTLIBRARIES = libgnome-control-center.la + +libgnome_control_center_include_HEADERS = \ + cc-panel.h \ + cc-shell.h \ + $(NULL) + +libgnome_control_center_la_SOURCES = \ + cc-panel.c \ + cc-panel.h \ + cc-shell.c \ + cc-shell.h \ + $(NULL) + +libgnome_control_center_la_LDFLAGS = \ + no-undefined \ + $(NULL) + +libgnome_control_center_la_LIBADD = \ + $(CAPPLET_LIBS) \ + $(NULL) + +libgnome_control_center_la_LIBTOOLFLAGS = --tag=disable-static + +libgnome_control_center_includedir = $(includedir)/gnome-control-center-1/libgnome-control-center + +pkgconfigdir=$(libdir)/pkgconfig +pkgconfig_DATA=libgnome-control-center.pc + +EXTRA_DIST = \ + libgnome-control-center.pc.in \ + $(NULL) + +AM_CPPFLAGS = \ + -DGNOMELOCALEDIR="\"$(datadir)/locale\"" \ + -DUIDIR="\"$(uidir)\"" \ + -DMENUDIR="\"$(menudir)\"" + +-include $(top_srcdir)/git.mk diff --git a/libgnome-control-center/cc-panel.c b/libgnome-control-center/cc-panel.c new file mode 100644 index 000000000..c803e3cc4 --- /dev/null +++ b/libgnome-control-center/cc-panel.c @@ -0,0 +1,303 @@ +/* -*- 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Authors: William Jon McCann + * Thomas Wood + * + */ + +/** + * 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 +#include + +#include +#include + +#define CC_PANEL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_PANEL, CcPanelPrivate)) + +struct CcPanelPrivate +{ + gchar *id; + gchar *display_name; + gchar *category; + gchar *current_location; + + gboolean is_active; + CcShell *shell; +}; + +enum +{ + PROP_ID = 1, + PROP_DISPLAY_NAME, + PROP_SHELL, + PROP_ACTIVE +}; + +G_DEFINE_ABSTRACT_TYPE (CcPanel, cc_panel, GTK_TYPE_ALIGNMENT) + +static void +cc_panel_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + CcPanel *panel; + + panel = CC_PANEL (object); + + switch (prop_id) + { + case PROP_ID: + /* construct only property */ + g_free (panel->priv->id); + panel->priv->id = g_value_dup_string (value); + break; + + case PROP_DISPLAY_NAME: + cc_panel_set_display_name (panel, g_value_get_string (value)); + break; + + case PROP_SHELL: + /* construct only property */ + panel->priv->shell = g_value_get_object (value); + 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) +{ + CcPanel *panel; + + panel = CC_PANEL (object); + + switch (prop_id) + { + case PROP_ID: + g_value_set_string (value, panel->priv->id); + break; + + case PROP_DISPLAY_NAME: + g_value_set_string (value, panel->priv->display_name); + break; + + case PROP_SHELL: + g_value_set_object (value, panel->priv->shell); + break; + + case PROP_ACTIVE: + g_value_set_boolean (value, panel->priv->is_active); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +cc_panel_finalize (GObject *object) +{ + CcPanel *panel; + + g_return_if_fail (object != NULL); + g_return_if_fail (CC_IS_PANEL (object)); + + panel = CC_PANEL (object); + + g_free (panel->priv->id); + g_free (panel->priv->display_name); + + G_OBJECT_CLASS (cc_panel_parent_class)->finalize (object); +} + + +static void +cc_panel_class_init (CcPanelClass *klass) +{ + GParamSpec *pspec; + 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; + + g_type_class_add_private (klass, sizeof (CcPanelPrivate)); + + pspec = g_param_spec_string ("id", + "id", + "Unique id of the Panel", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + g_object_class_install_property (object_class, PROP_ID, pspec ); + + pspec = g_param_spec_string ("display-name", + "display name", + "Display name of the Panel", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_DISPLAY_NAME, pspec); + + pspec = g_param_spec_object ("shell", + "Shell", + "Shell the Panel resides in", + CC_TYPE_SHELL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS + | G_PARAM_CONSTRUCT_ONLY); + g_object_class_install_property (object_class, PROP_SHELL, pspec); + + pspec = g_param_spec_boolean ("active", + "Active", + "Whether the panel is currently the active" + " panel of the shell", + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_ACTIVE, pspec); +} + +static void +cc_panel_init (CcPanel *panel) +{ + panel->priv = CC_PANEL_GET_PRIVATE (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) +{ + return panel->priv->shell; +} + +/** + * cc_panel_get_id: + * @panel: A #CcPanel + * + * Get the value of the #CcPanel:id property + * + * Returns: value of the id property, owned by the panel + */ +const gchar* +cc_panel_get_id (CcPanel *panel) +{ + g_return_val_if_fail (CC_IS_PANEL (panel), NULL); + + return panel->priv->id; +} + + +/** + * cc_panel_get_active: + * @panel: A #CcPanel + * + * Get the current value of the #CcPanel:active property + * + * Returns: #TRUE if the panel is marked as active + */ +gboolean +cc_panel_get_active (CcPanel *panel) +{ + g_return_val_if_fail (CC_IS_PANEL (panel), FALSE); + + return panel->priv->is_active; +} + +/** + * cc_panel_set_active: + * @panel: A #CcPanel + * @is_active: #TRUE if the panel is now active + * + * Mark the panel as active. This should only be called by CcShell + * implementations. + * + */ +void +cc_panel_set_active (CcPanel *panel, + gboolean is_active) +{ + g_return_if_fail (CC_IS_PANEL (panel)); + + if (panel->priv->is_active != is_active) + { + gtk_widget_queue_resize (GTK_WIDGET (panel)); + + g_object_notify (G_OBJECT (panel), "active"); + } +} + +/** + * cc_panel_set_display_name: + * @panel: A #CcPanel + * @display_name: Display name of the panel + * + * Set the value of the #CcPanel:display-name property. + * + */ +void +cc_panel_set_display_name (CcPanel *panel, + const gchar *display_name) +{ + g_return_if_fail (CC_IS_PANEL (panel)); + g_return_if_fail (display_name != NULL); + + g_free (panel->priv->display_name); + panel->priv->display_name = g_strdup (display_name); +} + +/** + * cc_panel_get_display_name: + * @panel: A #CcPanel + * + * Get the value of the #CcPanel:display-name property. + * + * Returns: the display name, owned by the panel + */ +const gchar* +cc_panel_get_display_name (CcPanel *panel) +{ + g_return_val_if_fail (CC_IS_PANEL (panel), NULL); + + return panel->priv->display_name; +} diff --git a/libgnome-control-center/cc-panel.h b/libgnome-control-center/cc-panel.h new file mode 100644 index 000000000..28942b467 --- /dev/null +++ b/libgnome-control-center/cc-panel.h @@ -0,0 +1,86 @@ +/* -*- 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Authors: William Jon McCann + * Thomas Wood + */ + + +#ifndef __CC_PANEL_H +#define __CC_PANEL_H + +#include +#include + + +G_BEGIN_DECLS + +#define CC_TYPE_PANEL (cc_panel_get_type ()) +#define CC_PANEL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), CC_TYPE_PANEL, CcPanel)) +#define CC_PANEL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), CC_TYPE_PANEL, CcPanelClass)) +#define CC_IS_PANEL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), CC_TYPE_PANEL)) +#define CC_IS_PANEL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), CC_TYPE_PANEL)) +#define CC_PANEL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), CC_TYPE_PANEL, CcPanelClass)) + +typedef struct CcPanelPrivate CcPanelPrivate; + +typedef struct _CcPanel CcPanel; +typedef struct _CcPanelClass CcPanelClass; + +/* cc-shell.h requires CcPanel, so make sure it is defined first */ +#include "cc-shell.h" + +/** + * CcPanel: + * + * The contents of this struct are private should not be accessed directly. + */ +struct _CcPanel +{ + /*< private >*/ + GtkAlignment parent; + CcPanelPrivate *priv; +}; +/** + * CcPanelClass: + * + * The contents of this struct are private should not be accessed directly. + */ +struct _CcPanelClass +{ + /*< private >*/ + GtkAlignmentClass parent_class; +}; + +GType cc_panel_get_type (void); + +const gchar* cc_panel_get_id (CcPanel *panel); +CcShell* cc_panel_get_shell (CcPanel *panel); + +const gchar* cc_panel_get_display_name (CcPanel *panel); +void cc_panel_set_display_name (CcPanel *panel, + const gchar *display_name); +gboolean cc_panel_get_active (CcPanel *panel); +void cc_panel_set_active (CcPanel *panel, + gboolean is_active); + + +G_END_DECLS + +#endif /* __CC_PANEL_H */ diff --git a/libgnome-control-center/cc-shell.c b/libgnome-control-center/cc-shell.c new file mode 100644 index 000000000..eda83b782 --- /dev/null +++ b/libgnome-control-center/cc-shell.c @@ -0,0 +1,211 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * + * Copyright (c) 2010 Intel, Inc. + * + * The Control Center 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. + * + * The Control Center 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 the Control Center; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: Thomas Wood + */ + +/** + * SECTION:cc-shell + * @short_description: Abstract class representing the Control Center shell + * + * CcShell is an abstract class that represents an instance of a control + * center shell. It provides access to some of the properties of the shell + * that panels will need to read or change. When a panel is created it has an + * instance of CcShell available that represents the current shell. + */ + + +#include "cc-shell.h" +#include "cc-panel.h" + +G_DEFINE_ABSTRACT_TYPE (CcShell, cc_shell, G_TYPE_OBJECT) + +#define SHELL_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_SHELL, CcShellPrivate)) + +struct _CcShellPrivate +{ + CcPanel *active_panel; +}; + +enum +{ + PROP_ACTIVE_PANEL = 1 +}; + + +static void +cc_shell_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + CcShell *shell = CC_SHELL (object); + + switch (property_id) + { + case PROP_ACTIVE_PANEL: + g_value_set_object (value, shell->priv->active_panel); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +cc_shell_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + CcShell *shell = CC_SHELL (object); + + switch (property_id) + { + case PROP_ACTIVE_PANEL: + cc_shell_set_active_panel (shell, g_value_get_object (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +cc_shell_dispose (GObject *object) +{ + /* remove and unref the active shell */ + cc_shell_set_active_panel (CC_SHELL (object), NULL); + + G_OBJECT_CLASS (cc_shell_parent_class)->dispose (object); +} + +static void +cc_shell_class_init (CcShellClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GParamSpec *pspec; + + g_type_class_add_private (klass, sizeof (CcShellPrivate)); + + object_class->get_property = cc_shell_get_property; + object_class->set_property = cc_shell_set_property; + object_class->dispose = cc_shell_dispose; + + pspec = g_param_spec_object ("active-panel", + "active panel", + "The currently active Panel", + CC_TYPE_PANEL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_ACTIVE_PANEL, pspec); +} + +static void +cc_shell_init (CcShell *self) +{ + self->priv = SHELL_PRIVATE (self); +} + +/** + * cc_shell_get_active_panel: + * @shell: A #CcShell + * + * Get the current active panel + * + * Returns: a #CcPanel or NULL if no panel is active + */ +CcPanel* +cc_shell_get_active_panel (CcShell *shell) +{ + g_return_val_if_fail (CC_IS_SHELL (shell), NULL); + + return shell->priv->active_panel; +} + +/** + * cc_shell_set_active_panel: + * @shell: A #CcShell + * @panel: A #CcPanel + * + * Set the current active panel. If @panel is NULL, then the shell is returned + * to a state where no panel is being displayed (for example, the list of panels + * may be shown instead). + * + */ +void +cc_shell_set_active_panel (CcShell *shell, + CcPanel *panel) +{ + g_return_if_fail (CC_IS_SHELL (shell)); + g_return_if_fail (panel == NULL || CC_IS_PANEL (panel)); + + if (panel != shell->priv->active_panel) + { + /* remove the old panel */ + cc_panel_set_active (shell->priv->active_panel, FALSE); + g_object_unref (shell->priv->active_panel); + shell->priv->active_panel = NULL; + + /* set the new panel */ + if (panel) + { + cc_panel_set_active (shell->priv->active_panel, TRUE); + shell->priv->active_panel = g_object_ref (panel); + } + + g_object_notify (G_OBJECT (shell), "active-panel"); + } +} + +/** + * cc_shell_set_active_panel_from_id: + * @shell: A #CcShell + * @id: the ID of the panel to set as active + * @error: A #GError + * + * Find a panel corresponding to the specified id and set it as active. + * + * Returns: #TRUE if the panel was found and set as the active panel + */ +gboolean +cc_shell_set_active_panel_from_id (CcShell *shell, + const gchar *id, + GError **error) +{ + CcShellClass *class; + + g_return_val_if_fail (CC_IS_SHELL (shell), FALSE); + + + class = (CcShellClass *) G_OBJECT_GET_CLASS (shell); + + if (!class->set_active_panel_from_id) + { + g_warning ("Object of type \"%s\" does not implement required virtual" + " function \"set_active_panel_from_id\",", + G_OBJECT_TYPE_NAME (shell)); + return FALSE; + } + else + { + return class->set_active_panel_from_id (shell, id, error); + } +} + + diff --git a/libgnome-control-center/cc-shell.h b/libgnome-control-center/cc-shell.h new file mode 100644 index 000000000..2615b2005 --- /dev/null +++ b/libgnome-control-center/cc-shell.h @@ -0,0 +1,100 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * + * Copyright (c) 2010 Intel, Inc. + * + * The Control Center 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. + * + * The Control Center 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 the Control Center; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: Thomas Wood + */ + +#ifndef _CC_SHELL_H +#define _CC_SHELL_H + +#include + +G_BEGIN_DECLS + +#define CC_TYPE_SHELL cc_shell_get_type() + +#define CC_SHELL(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + CC_TYPE_SHELL, CcShell)) + +#define CC_SHELL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), \ + CC_TYPE_SHELL, CcShellClass)) + +#define CC_IS_SHELL(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ + CC_TYPE_SHELL)) + +#define CC_IS_SHELL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), \ + CC_TYPE_SHELL)) + +#define CC_SHELL_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), \ + CC_TYPE_SHELL, CcShellClass)) + +typedef struct _CcShell CcShell; +typedef struct _CcShellClass CcShellClass; +typedef struct _CcShellPrivate CcShellPrivate; + +/* cc-panel.h requires CcShell, so make sure they are defined first */ +#include "cc-panel.h" + +/** + * CcShell: + * + * The contents of this struct are private should not be accessed directly. + */ +struct _CcShell +{ + /*< private >*/ + GObject parent; + + CcShellPrivate *priv; +}; + +/** + * CcShellClass: + * @set_active_panel_from_id: virtual function to set the active panel from an + * id string + * + */ +struct _CcShellClass +{ + /*< private >*/ + GObjectClass parent_class; + + /*< public >*/ + /* vfuncs */ + gboolean (*set_active_panel_from_id) (CcShell *shell, + const gchar *id, + GError **error); +}; + +GType cc_shell_get_type (void) G_GNUC_CONST; + +CcPanel* cc_shell_get_active_panel (CcShell *shell); +void cc_shell_set_active_panel (CcShell *shell, + CcPanel *panel); +gboolean cc_shell_set_active_panel_from_id (CcShell *shell, + const gchar *id, + GError **error); + +G_END_DECLS + +#endif /* _CC_SHELL_H */ diff --git a/libgnome-control-center/libgnome-control-center.pc.in b/libgnome-control-center/libgnome-control-center.pc.in new file mode 100644 index 000000000..baf79dff0 --- /dev/null +++ b/libgnome-control-center/libgnome-control-center.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +extensiondir=@libdir@/control-center-1/panels + +Name: libgnome-control-center +Description: A library to create GNOME Control Center extensions +Version: @VERSION@ +Requires: glib-2.0 gio-2.0 gtk+-2.0 +Libs: -L${libdir} -lgnome-control-center +Cflags: -I${includedir}/gnome-control-center-1