[gnome-control-center/wip/libgnome-control-center: 1/6] Add libgnome-control-center with two new classes: CcShell and CcPanel



commit b4fdb6db4ff7a0a261947ad7b350122e9ba7890b
Author: Thomas Wood <thomas wood intel com>
Date:   Tue May 18 16:09:26 2010 +0100

    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 +
 docs/reference/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(-)
---
diff --git a/Makefile.am b/Makefile.am
index ae0e6d8..866da2d 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 77a952a..a01ce95 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 02284f4..3f609ed 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 0000000..372c2a7
--- /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 0000000..9917ad7
--- /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 0000000..c6e6ccd
--- /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 0000000..7609382
--- /dev/null
+++ b/docs/reference/libgnome-control-center/libgnome-control-center-docs.sgml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+               "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd";
+[
+  <!ENTITY % local.common.attrib "xmlns:xi  CDATA  #FIXED 'http://www.w3.org/2003/XInclude'">
+  <!ENTITY version SYSTEM "version.xml">
+]>
+<book id="index">
+  <bookinfo>
+    <title>libgnome-control-center Reference Manual</title>
+    <releaseinfo>
+      for libgnome-control-center &version;.
+      <!--
+      The latest version of this documentation can be found on-line at
+      <ulink role="online-location" url="http://[SERVER]/libgnome-control-center/index.html";>http://[SERVER]/libgnome-control-center/</ulink>.
+      -->
+    </releaseinfo>
+  </bookinfo>
+
+  <chapter>
+    <title>libgnome-control-center</title>
+    <xi:include href="xml/cc-shell.xml"/>
+    <xi:include href="xml/cc-panel.xml"/>
+  </chapter>
+  <chapter id="object-tree">
+    <title>Object Hierarchy</title>
+     <xi:include href="xml/tree_index.sgml"/>
+  </chapter>
+  <index id="api-index-full">
+    <title>API Index</title>
+    <xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
+  </index>
+
+  <xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
+</book>
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 0000000..fcd1ba1
--- /dev/null
+++ b/docs/reference/libgnome-control-center/libgnome-control-center-sections.txt
@@ -0,0 +1,43 @@
+<SECTION>
+<FILE>cc-shell</FILE>
+<TITLE>CcShell</TITLE>
+CcShell
+CcShellClass
+cc_shell_get_active_panel
+cc_shell_set_active_panel
+cc_shell_set_active_panel_from_id
+<SUBSECTION Standard>
+CC_SHELL
+CC_IS_SHELL
+CC_TYPE_SHELL
+cc_shell_get_type
+CC_SHELL_CLASS
+CC_IS_SHELL_CLASS
+CC_SHELL_GET_CLASS
+<SUBSECTION Private>
+CcShellPrivate
+</SECTION>
+
+<SECTION>
+<FILE>cc-panel</FILE>
+<TITLE>CcPanel</TITLE>
+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
+<SUBSECTION Standard>
+CC_PANEL
+CC_IS_PANEL
+CC_TYPE_PANEL
+cc_panel_get_type
+CC_PANEL_CLASS
+CC_IS_PANEL_CLASS
+CC_PANEL_GET_CLASS
+<SUBSECTION Private>
+CcPanelPrivate
+</SECTION>
+
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 0000000..a5c3beb
--- /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 0000000..0622e2b
--- /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 0000000..c803e3c
--- /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 <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>
+
+#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 0000000..28942b4
--- /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 <jmccann redhat com>
+ *          Thomas Wood <thomas wood intel com>
+ */
+
+
+#ifndef __CC_PANEL_H
+#define __CC_PANEL_H
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+
+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 0000000..eda83b7
--- /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 <thos gnome org>
+ */
+
+/**
+ * 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 0000000..2615b20
--- /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 <thos gnome org>
+ */
+
+#ifndef _CC_SHELL_H
+#define _CC_SHELL_H
+
+#include <glib-object.h>
+
+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 0000000..baf79df
--- /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



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]