[gnome-control-center] wacom: Update for CcWacomPage changes
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center] wacom: Update for CcWacomPage changes
- Date: Thu, 24 Nov 2011 19:16:01 +0000 (UTC)
commit 87fc4c9a60e85beece8f04856a6f74f4ed28fb1c
Author: Bastien Nocera <hadess hadess net>
Date: Thu Nov 24 19:00:44 2011 +0000
wacom: Update for CcWacomPage changes
Pages are now created dynamically, and the UI supports multiple
different types of tablets (even though GsdWacomDevice doesn't, and
we don't have any UI to switch devices).
panels/wacom/cc-wacom-panel.c | 213 +++++++++++++++++++++++++++++++++--------
1 files changed, 172 insertions(+), 41 deletions(-)
---
diff --git a/panels/wacom/cc-wacom-panel.c b/panels/wacom/cc-wacom-panel.c
index c9add43..7c67de8 100644
--- a/panels/wacom/cc-wacom-panel.c
+++ b/panels/wacom/cc-wacom-panel.c
@@ -27,6 +27,7 @@
#include "cc-wacom-panel.h"
#include "cc-wacom-page.h"
+#include "gsd-wacom-device.h"
#define WID(x) (GtkWidget *) gtk_builder_get_object (priv->builder, x)
@@ -37,17 +38,25 @@ G_DEFINE_DYNAMIC_TYPE (CcWacomPanel, cc_wacom_panel, CC_TYPE_PANEL)
struct _CcWacomPanelPrivate
{
- GtkBuilder *builder;
- GtkWidget *notebook;
- /* The UI doesn't support cursor/pad at the moment */
+ GtkBuilder *builder;
+ GtkWidget *notebook;
+ GHashTable *devices; /* key=GdkDevice, value=GsdWacomDevice */
+ GHashTable *pages; /* key=device name, value=GtkWidget */
GdkDeviceManager *manager;
guint device_added_id;
guint device_removed_id;
};
+typedef struct {
+ const char *name;
+ GsdWacomDevice *pad;
+ GsdWacomDevice *stylus;
+ GsdWacomDevice *eraser;
+} Tablet;
+
enum {
- PLUG_IN_PAGE,
- WACOM_PAGE
+ WACOM_PAGE = -1,
+ PLUG_IN_PAGE = 0,
};
/* Boilerplate code goes below */
@@ -96,6 +105,18 @@ cc_wacom_panel_dispose (GObject *object)
priv->manager = NULL;
}
+ if (priv->devices)
+ {
+ g_hash_table_destroy (priv->devices);
+ priv->devices = NULL;
+ }
+
+ if (priv->pages)
+ {
+ g_hash_table_destroy (priv->pages);
+ priv->pages = NULL;
+ }
+
G_OBJECT_CLASS (cc_wacom_panel_parent_class)->dispose (object);
}
@@ -116,44 +137,144 @@ cc_wacom_panel_class_finalize (CcWacomPanelClass *klass)
{
}
-static gboolean
-has_wacom_tablet (CcWacomPanel *self)
+static void
+remove_page (GtkNotebook *notebook,
+ GtkWidget *widget)
{
- GList *list, *l;
- gboolean retval;
+ int num_pages, i;
+
+ num_pages = gtk_notebook_get_n_pages (notebook);
+ g_return_if_fail (num_pages > 1);
+ for (i = 1; i < num_pages; i++) {
+ if (gtk_notebook_get_nth_page (notebook, i) == widget) {
+ gtk_notebook_remove_page (notebook, i);
+ return;
+ }
+ }
+}
- retval = FALSE;
- list = gdk_device_manager_list_devices (self->priv->manager,
- GDK_DEVICE_TYPE_SLAVE);
- for (l = list; l != NULL; l = l->next)
- {
- GdkDevice *device = l->data;
- GdkInputSource source;
-
- source = gdk_device_get_source (device);
- if (source == GDK_SOURCE_PEN ||
- source == GDK_SOURCE_ERASER)
- {
- retval = TRUE;
+static void
+update_current_page (CcWacomPanel *self)
+{
+ GHashTable *ht;
+ GList *devices, *tablets, *l;
+ gboolean changed;
+ CcWacomPanelPrivate *priv;
+
+ priv = self->priv;
+ changed = FALSE;
+
+ ht = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
+ devices = g_hash_table_get_values (priv->devices);
+ for (l = devices; l; l = l->next) {
+ Tablet *tablet;
+ GsdWacomDevice *device;
+
+ device = l->data;
+ tablet = g_hash_table_lookup (ht, gsd_wacom_device_get_name (device));
+ if (tablet == NULL) {
+ tablet = g_new0 (Tablet, 1);
+ tablet->name = gsd_wacom_device_get_name (device);
+ g_hash_table_insert (ht, (gpointer) tablet->name, tablet);
+ }
+
+ switch (gsd_wacom_device_get_device_type (device)) {
+ case WACOM_TYPE_PAD:
+ tablet->pad = device;
+ break;
+ case WACOM_TYPE_STYLUS:
+ tablet->stylus = device;
break;
+ case WACOM_TYPE_ERASER:
+ tablet->eraser = device;
+ break;
+ default:
+ /* Nothing */
+ ;
}
}
- g_list_free (list);
- return retval;
+ g_list_free (devices);
+
+ /* We now have a list of Tablet structs,
+ * see which ones are full tablets */
+ tablets = g_hash_table_get_values (ht);
+ for (l = tablets; l; l = l->next) {
+ Tablet *tablet;
+
+ tablet = l->data;
+ if (tablet->pad == NULL ||
+ tablet->stylus == NULL ||
+ tablet->eraser == NULL) {
+ GtkWidget *page;
+
+ page = g_hash_table_lookup (priv->pages, tablet->name);
+ if (page != NULL) {
+ remove_page (GTK_NOTEBOOK (priv->notebook), page);
+ g_hash_table_remove (priv->pages, tablet->name);
+
+ changed = TRUE;
+ }
+ continue;
+ }
+
+ if (g_hash_table_lookup (priv->pages, tablet->name) == NULL) {
+ GtkWidget *page;
+ page = cc_wacom_page_new (tablet->pad, tablet->stylus, tablet->eraser);
+ gtk_widget_show (page);
+ gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), page, NULL);
+ g_hash_table_insert (priv->pages, g_strdup (tablet->name), page);
+
+ changed = TRUE;
+ }
+ }
+ g_list_free (tablets);
+
+ g_hash_table_destroy (ht);
+
+ if (changed == TRUE) {
+ int num_pages;
+
+ num_pages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (priv->notebook));
+ if (num_pages > 1)
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), WACOM_PAGE);
+ }
}
static void
-update_current_page (CcWacomPanel *self)
+add_known_device (CcWacomPanel *self,
+ GdkDevice *gdk_device)
{
- gtk_notebook_set_current_page (GTK_NOTEBOOK (self->priv->notebook),
- has_wacom_tablet (self) ? WACOM_PAGE : PLUG_IN_PAGE);
+ CcWacomPanelPrivate *priv;
+ GsdWacomDevice *device;
+
+ priv = self->priv;
+
+ device = gsd_wacom_device_new (gdk_device);
+ if (gsd_wacom_device_get_device_type (device) == WACOM_TYPE_INVALID) {
+ g_object_unref (device);
+ return;
+ }
+ g_debug ("Adding device '%s' (type: '%s') to known devices list",
+ gsd_wacom_device_get_tool_name (device),
+ gsd_wacom_device_type_to_string (gsd_wacom_device_get_device_type (device)));
+ g_hash_table_insert (priv->devices, (gpointer) gdk_device, device);
}
static void
-device_changed_cb (GdkDeviceManager *manager,
- GdkDevice *device,
+device_removed_cb (GdkDeviceManager *manager,
+ GdkDevice *gdk_device,
CcWacomPanel *self)
{
+ g_hash_table_remove (self->priv->devices, gdk_device);
+ update_current_page (self);
+}
+
+static void
+device_added_cb (GdkDeviceManager *manager,
+ GdkDevice *device,
+ CcWacomPanel *self)
+{
+ add_known_device (self, device);
update_current_page (self);
}
@@ -190,7 +311,8 @@ cc_wacom_panel_init (CcWacomPanel *self)
{
CcWacomPanelPrivate *priv;
GtkNotebook *notebook;
- GtkWidget *widget, *wacom_page;
+ GtkWidget *widget;
+ GList *devices, *l;
GError *error = NULL;
char *objects[] = {
"main-box",
@@ -213,30 +335,39 @@ cc_wacom_panel_init (CcWacomPanel *self)
return;
}
+ /* Notebook */
notebook = GTK_NOTEBOOK (gtk_notebook_new ());
priv->notebook = GTK_WIDGET (notebook);
+
gtk_notebook_set_show_tabs (notebook, FALSE);
+ gtk_widget_set_vexpand (GTK_WIDGET (notebook), TRUE);
+ gtk_container_set_border_width (GTK_CONTAINER (notebook), 24);
+
+ gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (notebook));
gtk_widget_show (priv->notebook);
+ /* No tablets page */
widget = WID ("main-box");
+ enbiggen_label (GTK_LABEL (WID ("advice-label1")));
gtk_notebook_append_page (notebook, widget, NULL);
- wacom_page = cc_wacom_page_new ();
- gtk_widget_show (wacom_page);
- gtk_notebook_append_page (notebook, wacom_page, NULL);
+ g_signal_connect (G_OBJECT (WID ("linkbutton")), "activate-link",
+ G_CALLBACK (link_activated), self);
- gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (notebook));
- gtk_widget_set_vexpand (GTK_WIDGET (notebook), TRUE);
- gtk_container_set_border_width (GTK_CONTAINER (notebook), 24);
+ priv->devices = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_object_unref);
+ priv->pages = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
- enbiggen_label (GTK_LABEL (WID ("advice-label1")));
priv->manager = gdk_display_get_device_manager (gdk_display_get_default ());
priv->device_added_id = g_signal_connect (G_OBJECT (priv->manager), "device-added",
- G_CALLBACK (device_changed_cb), self);
+ G_CALLBACK (device_added_cb), self);
priv->device_removed_id = g_signal_connect (G_OBJECT (priv->manager), "device-removed",
- G_CALLBACK (device_changed_cb), self);
- g_signal_connect (G_OBJECT (WID ("linkbutton")), "activate-link",
- G_CALLBACK (link_activated), self);
+ G_CALLBACK (device_removed_cb), self);
+
+ devices = gdk_device_manager_list_devices (priv->manager, GDK_DEVICE_TYPE_SLAVE);
+ for (l = devices; l ; l = l->next)
+ add_known_device (self, l->data);
+ g_list_free (devices);
+
update_current_page (self);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]