[gnome-control-center] wacom: Add navigation button
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center] wacom: Add navigation button
- Date: Mon, 28 Nov 2011 18:27:08 +0000 (UTC)
commit 46a3b9697bcd004241d311edfe98774544b8d3ba
Author: Bastien Nocera <hadess hadess net>
Date: Mon Nov 28 18:23:05 2011 +0000
wacom: Add navigation button
panels/wacom/Makefile.am | 6 +-
panels/wacom/cc-wacom-nav-button.c | 233 ++++++++++++++++++++++++++++++++++++
panels/wacom/cc-wacom-nav-button.h | 73 +++++++++++
3 files changed, 311 insertions(+), 1 deletions(-)
---
diff --git a/panels/wacom/Makefile.am b/panels/wacom/Makefile.am
index 67a6cce..ee66cc1 100644
--- a/panels/wacom/Makefile.am
+++ b/panels/wacom/Makefile.am
@@ -21,7 +21,9 @@ libwacom_properties_la_SOURCES = \
cc-wacom-page.c \
cc-wacom-page.h \
gsd-wacom-device.c \
- gsd-wacom-device.h
+ gsd-wacom-device.h \
+ cc-wacom-nav-button.c \
+ cc-wacom-nav-button.h
libwacom_properties_la_LIBADD = $(PANEL_LIBS) $(WACOM_PANEL_LIBS)
libwacom_properties_la_LDFLAGS = $(PANEL_LDFLAGS)
@@ -32,6 +34,8 @@ test_wacom_SOURCES = \
test-wacom.c \
cc-wacom-page.c \
cc-wacom-page.h \
+ cc-wacom-nav-button.c \
+ cc-wacom-nav-button.h \
gsd-wacom-device.c \
gsd-wacom-device.h
diff --git a/panels/wacom/cc-wacom-nav-button.c b/panels/wacom/cc-wacom-nav-button.c
new file mode 100644
index 0000000..e63a680
--- /dev/null
+++ b/panels/wacom/cc-wacom-nav-button.c
@@ -0,0 +1,233 @@
+/*
+ * Copyright  2011 Red Hat, 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: Bastien Nocera <hadess hadess net>
+ *
+ */
+
+#include <config.h>
+
+#include "cc-wacom-nav-button.h"
+#include <gtk/gtk.h>
+
+G_DEFINE_TYPE (CcWacomNavButton, cc_wacom_nav_button, GTK_TYPE_BOX)
+
+#define WACOM_NAV_BUTTON_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_WACOM_NAV_BUTTON, CcWacomNavButtonPrivate))
+
+struct _CcWacomNavButtonPrivate
+{
+ GtkNotebook *notebook;
+ GtkWidget *prev;
+ GtkWidget *next;
+ guint page_added_id;
+ guint page_removed_id;
+ guint page_switched_id;
+ gboolean ignore_first_page;
+};
+
+enum {
+ PROP_0,
+ PROP_NOTEBOOK,
+ PROP_IGNORE_FIRST
+};
+
+static void
+cc_wacom_nav_button_update (CcWacomNavButton *nav)
+{
+ CcWacomNavButtonPrivate *priv = nav->priv;
+ int num_pages;
+
+ if (priv->notebook == NULL) {
+ gtk_widget_hide (GTK_WIDGET (nav));
+ return;
+ }
+
+ num_pages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (priv->notebook));
+ if (num_pages == 0)
+ return;
+ if (priv->ignore_first_page && num_pages == 1)
+ return;
+
+ if (priv->ignore_first_page)
+ num_pages--;
+
+ g_assert (num_pages >= 1);
+
+ if (num_pages == 1) {
+ gtk_widget_hide (GTK_WIDGET (nav));
+ } else {
+ int current_page;
+
+ gtk_widget_show (GTK_WIDGET (nav));
+ current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (priv->notebook));
+ if (current_page < 0)
+ return;
+ if (priv->ignore_first_page)
+ current_page--;
+ gtk_widget_set_sensitive (priv->prev, current_page == 0 ? FALSE : TRUE);
+ gtk_widget_set_sensitive (priv->next, current_page + 1 == num_pages ? FALSE : TRUE);
+ }
+}
+
+static void
+pages_changed (GtkNotebook *notebook,
+ GtkWidget *child,
+ guint page_num,
+ CcWacomNavButton *nav)
+{
+ cc_wacom_nav_button_update (nav);
+}
+
+static void
+page_switched (GtkNotebook *notebook,
+ GParamSpec *pspec,
+ CcWacomNavButton *nav)
+{
+ cc_wacom_nav_button_update (nav);
+}
+
+static void
+next_clicked (GtkButton *button,
+ CcWacomNavButton *nav)
+{
+ int current_page;
+
+ current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (nav->priv->notebook));
+ current_page++;
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (nav->priv->notebook), current_page);
+}
+
+static void
+prev_clicked (GtkButton *button,
+ CcWacomNavButton *nav)
+{
+ int current_page;
+
+ current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (nav->priv->notebook));
+ current_page--;
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (nav->priv->notebook), current_page--);
+}
+
+static void
+cc_wacom_nav_button_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ CcWacomNavButton *nav = CC_WACOM_NAV_BUTTON (object);
+ CcWacomNavButtonPrivate *priv = nav->priv;
+
+ switch (property_id) {
+ case PROP_NOTEBOOK:
+ if (priv->notebook) {
+ g_signal_handler_disconnect (priv->notebook, priv->page_added_id);
+ g_signal_handler_disconnect (priv->notebook, priv->page_removed_id);
+ g_signal_handler_disconnect (priv->notebook, priv->page_switched_id);
+ g_object_unref (priv->notebook);
+ }
+ priv->notebook = g_value_dup_object (value);
+ priv->page_added_id = g_signal_connect (G_OBJECT (priv->notebook), "page-added",
+ G_CALLBACK (pages_changed), nav);
+ priv->page_removed_id = g_signal_connect (G_OBJECT (priv->notebook), "page-removed",
+ G_CALLBACK (pages_changed), nav);
+ priv->page_switched_id = g_signal_connect (G_OBJECT (priv->notebook), "notify::page",
+ G_CALLBACK (page_switched), nav);
+ cc_wacom_nav_button_update (nav);
+ break;
+ case PROP_IGNORE_FIRST:
+ priv->ignore_first_page = g_value_get_boolean (value);
+ cc_wacom_nav_button_update (nav);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+cc_wacom_nav_button_dispose (GObject *object)
+{
+ CcWacomNavButtonPrivate *priv = CC_WACOM_NAV_BUTTON (object)->priv;
+
+ if (priv->notebook) {
+ g_signal_handler_disconnect (priv->notebook, priv->page_added_id);
+ priv->page_added_id = 0;
+ g_signal_handler_disconnect (priv->notebook, priv->page_removed_id);
+ priv->page_removed_id = 0;
+ g_signal_handler_disconnect (priv->notebook, priv->page_switched_id);
+ priv->page_switched_id = 0;
+ g_object_unref (priv->notebook);
+ priv->notebook = NULL;
+ }
+
+ G_OBJECT_CLASS (cc_wacom_nav_button_parent_class)->dispose (object);
+}
+
+static void
+cc_wacom_nav_button_class_init (CcWacomNavButtonClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (CcWacomNavButtonPrivate));
+
+ object_class->set_property = cc_wacom_nav_button_set_property;
+ object_class->dispose = cc_wacom_nav_button_dispose;
+
+ g_object_class_install_property (object_class, PROP_NOTEBOOK,
+ g_param_spec_object ("notebook", "notebook", "notebook",
+ GTK_TYPE_NOTEBOOK,
+ G_PARAM_WRITABLE));
+ g_object_class_install_property (object_class, PROP_IGNORE_FIRST,
+ g_param_spec_boolean ("ignore-first", "ignore-first", "ignore-first",
+ FALSE,
+ G_PARAM_WRITABLE));
+}
+
+static void
+cc_wacom_nav_button_init (CcWacomNavButton *self)
+{
+ CcWacomNavButtonPrivate *priv;
+ GtkWidget *image;
+
+ priv = self->priv = WACOM_NAV_BUTTON_PRIVATE (self);
+
+ priv->prev = gtk_button_new ();
+ image = gtk_image_new_from_icon_name ("go-previous-symbolic", GTK_ICON_SIZE_MENU);
+ gtk_container_add (GTK_CONTAINER (priv->prev), image);
+ g_signal_connect (G_OBJECT (priv->prev), "clicked",
+ G_CALLBACK (prev_clicked), self);
+
+ priv->next = gtk_button_new ();
+ image = gtk_image_new_from_icon_name ("go-next-symbolic", GTK_ICON_SIZE_MENU);
+ gtk_container_add (GTK_CONTAINER (priv->next), image);
+ g_signal_connect (G_OBJECT (priv->next), "clicked",
+ G_CALLBACK (next_clicked), self);
+
+ gtk_box_pack_start (GTK_BOX (self), priv->prev,
+ FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (self), priv->next,
+ FALSE, FALSE, 0);
+
+ gtk_widget_show (priv->prev);
+ gtk_widget_show (priv->next);
+}
+
+GtkWidget *
+cc_wacom_nav_button_new (void)
+{
+ return GTK_WIDGET (g_object_new (CC_TYPE_WACOM_NAV_BUTTON, NULL));
+}
diff --git a/panels/wacom/cc-wacom-nav-button.h b/panels/wacom/cc-wacom-nav-button.h
new file mode 100644
index 0000000..bc58b01
--- /dev/null
+++ b/panels/wacom/cc-wacom-nav-button.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright  2011 Red Hat, 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: Bastien Nocera <hadess hadess net>
+ */
+
+
+#ifndef _CC_WACOM_NAV_BUTTON_H
+#define _CC_WACOM_NAV_BUTTON_H
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define CC_TYPE_WACOM_NAV_BUTTON cc_wacom_nav_button_get_type()
+
+#define CC_WACOM_NAV_BUTTON(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ CC_TYPE_WACOM_NAV_BUTTON, CcWacomNavButton))
+
+#define CC_WACOM_NAV_BUTTON_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), \
+ CC_TYPE_WACOM_NAV_BUTTON, CcWacomNavButtonClass))
+
+#define CC_IS_WACOM_NAV_BUTTON(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+ CC_TYPE_WACOM_NAV_BUTTON))
+
+#define CC_IS_WACOM_NAV_BUTTON_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+ CC_TYPE_WACOM_NAV_BUTTON))
+
+#define CC_WACOM_NAV_BUTTON_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ CC_TYPE_WACOM_NAV_BUTTON, CcWacomNavButtonClass))
+
+typedef struct _CcWacomNavButton CcWacomNavButton;
+typedef struct _CcWacomNavButtonClass CcWacomNavButtonClass;
+typedef struct _CcWacomNavButtonPrivate CcWacomNavButtonPrivate;
+
+struct _CcWacomNavButton
+{
+ GtkBox parent;
+
+ CcWacomNavButtonPrivate *priv;
+};
+
+struct _CcWacomNavButtonClass
+{
+ GtkBoxClass parent_class;
+};
+
+GType cc_wacom_nav_button_get_type (void) G_GNUC_CONST;
+
+GtkWidget * cc_wacom_nav_button_new (void);
+
+G_END_DECLS
+
+#endif /* _CC_WACOM_NAV_BUTTON_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]