shell: Make the main app window a subclass of GtkApplicationWindow

This allows for better encapsulation of window logic. In order to
do this CcShell was made an interface instead of an abstract base
class.

https://bugzilla.gnome.org/show_bug.cgi?id=692174
This commit is contained in:
William Jon McCann 2013-02-17 00:30:43 -05:00 committed by Bastien Nocera
parent 64467d7f0a
commit 408ae4a87c
5 changed files with 165 additions and 262 deletions

View file

@ -21,9 +21,9 @@
/**
* SECTION:cc-shell
* @short_description: Abstract class representing the Control Center shell
* @short_description: Interface representing the Control Center shell
*
* CcShell is an abstract class that represents an instance of a control
* CcShell is an interface 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.
@ -33,93 +33,17 @@
#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
};
G_DEFINE_INTERFACE (CcShell, cc_shell, GTK_TYPE_WIDGET)
static void
cc_shell_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
cc_shell_default_init (CcShellInterface *iface)
{
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);
g_object_interface_install_property (iface,
g_param_spec_object ("active-panel",
"active panel",
"The currently active Panel",
CC_TYPE_PANEL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}
/**
@ -130,12 +54,16 @@ cc_shell_init (CcShell *self)
*
* Returns: a #CcPanel or NULL if no panel is active
*/
CcPanel*
CcPanel *
cc_shell_get_active_panel (CcShell *shell)
{
CcPanel *panel = NULL;
g_return_val_if_fail (CC_IS_SHELL (shell), NULL);
return shell->priv->active_panel;
g_object_get (shell, "active-panel", &panel, NULL);
return panel;
}
/**
@ -155,18 +83,7 @@ cc_shell_set_active_panel (CcShell *shell,
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 */
g_clear_object (&shell->priv->active_panel);
/* set the new panel */
if (panel)
{
shell->priv->active_panel = g_object_ref (panel);
}
g_object_notify (G_OBJECT (shell), "active-panel");
}
g_object_set (shell, "active-panel", panel, NULL);
}
/**
@ -185,23 +102,22 @@ cc_shell_set_active_panel_from_id (CcShell *shell,
const gchar **argv,
GError **error)
{
CcShellClass *class;
CcShellInterface *iface;
g_return_val_if_fail (CC_IS_SHELL (shell), FALSE);
iface = CC_SHELL_GET_IFACE (shell);
class = (CcShellClass *) G_OBJECT_GET_CLASS (shell);
if (!class->set_active_panel_from_id)
if (!iface->set_active_panel_from_id)
{
g_warning ("Object of type \"%s\" does not implement required virtual"
" function \"set_active_panel_from_id\",",
g_warning ("Object of type \"%s\" does not implement required interface"
" method \"set_active_panel_from_id\",",
G_OBJECT_TYPE_NAME (shell));
return FALSE;
}
else
{
return class->set_active_panel_from_id (shell, id, argv, error);
return iface->set_active_panel_from_id (shell, id, argv, error);
}
}
@ -216,19 +132,19 @@ cc_shell_set_active_panel_from_id (CcShell *shell,
GtkWidget *
cc_shell_get_toplevel (CcShell *shell)
{
CcShellClass *klass;
CcShellInterface *iface;
g_return_val_if_fail (CC_IS_SHELL (shell), NULL);
klass = CC_SHELL_GET_CLASS (shell);
iface = CC_SHELL_GET_IFACE (shell);
if (klass->get_toplevel)
if (iface->get_toplevel)
{
return klass->get_toplevel (shell);
return iface->get_toplevel (shell);
}
g_warning ("Object of type \"%s\" does not implement required virtual"
" function \"get_toplevel\",",
g_warning ("Object of type \"%s\" does not implement required interface"
" method \"get_toplevel\",",
G_OBJECT_TYPE_NAME (shell));
return NULL;
@ -237,20 +153,20 @@ cc_shell_get_toplevel (CcShell *shell)
void
cc_shell_embed_widget_in_header (CcShell *shell, GtkWidget *widget)
{
CcShellClass *class;
CcShellInterface *iface;
g_return_if_fail (CC_IS_SHELL (shell));
class = (CcShellClass *) G_OBJECT_GET_CLASS (shell);
iface = CC_SHELL_GET_IFACE (shell);
if (!class->embed_widget_in_header)
if (!iface->embed_widget_in_header)
{
g_warning ("Object of type \"%s\" does not implement required virtual"
" function \"embed_widget_in_header\",",
g_warning ("Object of type \"%s\" does not implement required interface"
" method \"embed_widget_in_header\",",
G_OBJECT_TYPE_NAME (shell));
}
else
{
class->embed_widget_in_header (shell, widget);
iface->embed_widget_in_header (shell, widget);
}
}