[gnome-control-center] wacom: Barebones mapping panel implementation



commit 2d0bf044e5a4cd32984a28e8f3c42953c1d717e7
Author: Jason Gerecke <killertofu gmail com>
Date:   Fri Jan 20 15:08:27 2012 -0800

    wacom: Barebones mapping panel implementation
    
    Provides a barebones implementation of a panel for selecting the
    display to map a tablet to. This implementation uses a combo box
    instead of the Display-panel-like UI specified by the mockup since
    my Cairo and GTK-fu are weak.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=668546

 panels/wacom/Makefile.am              |    4 +
 panels/wacom/cc-wacom-mapping-panel.c |  283 +++++++++++++++++++++++++++++++++
 panels/wacom/cc-wacom-mapping-panel.h |   77 +++++++++
 3 files changed, 364 insertions(+), 0 deletions(-)
---
diff --git a/panels/wacom/Makefile.am b/panels/wacom/Makefile.am
index b31a775..192ef83 100644
--- a/panels/wacom/Makefile.am
+++ b/panels/wacom/Makefile.am
@@ -30,6 +30,8 @@ libwacom_properties_la_SOURCES =	\
 	gsd-input-helper.h		\
 	cc-wacom-nav-button.c		\
 	cc-wacom-nav-button.h		\
+	cc-wacom-mapping-panel.c	\
+	cc-wacom-mapping-panel.h	\
 	gsd-enums.h
 
 libwacom_properties_la_LIBADD = $(PANEL_LIBS) $(WACOM_PANEL_LIBS) $(builddir)/calibrator/libwacom-calibrator.la
@@ -45,6 +47,8 @@ test_wacom_SOURCES =			\
 	cc-wacom-stylus-page.h		\
 	cc-wacom-nav-button.c		\
 	cc-wacom-nav-button.h		\
+	cc-wacom-mapping-panel.c	\
+	cc-wacom-mapping-panel.h	\
 	gsd-wacom-device.c		\
 	gsd-wacom-device.h		\
 	gsd-input-helper.c		\
diff --git a/panels/wacom/cc-wacom-mapping-panel.c b/panels/wacom/cc-wacom-mapping-panel.c
new file mode 100644
index 0000000..5a2af24
--- /dev/null
+++ b/panels/wacom/cc-wacom-mapping-panel.c
@@ -0,0 +1,283 @@
+/*
+ * Copyright  2012 Wacom.
+ *
+ * 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: Jason Gerecke <killertofu gmail com>
+ *
+ */
+
+#include <config.h>
+
+#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+#define GNOME_DESKTOP_USE_UNSTABLE_API
+#include <libgnome-desktop/gnome-rr.h>
+#include <libgnome-desktop/gnome-rr-config.h>
+
+#include <string.h>
+
+#include "gsd-wacom-device.h"
+#include "cc-wacom-mapping-panel.h"
+
+G_DEFINE_TYPE (CcWacomMappingPanel, cc_wacom_mapping_panel, GTK_TYPE_BOX)
+
+#define WACOM_MAPPING_PANEL_PRIVATE(o) \
+  (G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_WACOM_MAPPING_PANEL, CcWacomMappingPanelPrivate))
+
+struct _CcWacomMappingPanelPrivate
+{
+	GsdWacomDevice *device;
+	GtkWidget      *label;
+	GtkWidget      *combobox;
+	GtkWidget      *checkbutton;
+};
+
+
+static GnomeRROutputInfo**
+get_rr_outputs ()
+{
+	GError *error = NULL;
+	GnomeRRScreen *rr_screen;
+	GnomeRRConfig *rr_config;
+
+	/* TODO: Check the value of 'error' */
+	rr_screen = gnome_rr_screen_new (gdk_screen_get_default (), &error);
+	rr_config = gnome_rr_config_new_current (rr_screen, &error);
+	return gnome_rr_config_get_outputs (rr_config);
+}
+
+/* Update the display of available monitors based on the latest
+ * information from RandR. At the moment the chooser is just a
+ * a combobox crudely listing available outputs. The UI mockup
+ * has something more akin to the Display panel, with the ability
+ * to do rubber-band selection of multiple outputs (note: the
+ * g-s-d backend can only handle a single output at the moment)
+ */
+static void
+update_monitor_chooser (CcWacomMappingPanel *self)
+{
+	GtkListStore *store;
+	GnomeRROutputInfo **outputs;
+	GdkRectangle geom;
+	gint monitor;
+
+	store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
+	gtk_combo_box_set_model (GTK_COMBO_BOX(self->priv->combobox), GTK_TREE_MODEL(store));
+
+	if (self->priv->device == NULL)
+	{
+		gtk_widget_set_sensitive (GTK_WIDGET(self->priv->combobox), FALSE);
+		return;
+	}
+
+	monitor = gsd_wacom_device_get_display_monitor (self->priv->device);
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(self->priv->checkbutton), monitor == -1);
+	if (monitor >= 0)
+		gdk_screen_get_monitor_geometry (gdk_screen_get_default (), monitor, &geom);
+
+	for (outputs = get_rr_outputs (); *outputs != NULL; outputs++)
+	{
+		if (gnome_rr_output_info_is_active (*outputs))
+		{
+			GtkTreeIter iter;
+			gchar *name, *disp_name, *text;
+			int x, y, w, h;
+			int mon_at_point;
+
+			name = gnome_rr_output_info_get_name (*outputs);
+			disp_name = gnome_rr_output_info_get_display_name (*outputs);
+			text = g_strdup_printf ("%s (%s)", name, disp_name);
+
+			gnome_rr_output_info_get_geometry (*outputs, &x, &y, &w, &h);
+			mon_at_point = gdk_screen_get_monitor_at_point (gdk_screen_get_default (), x, y);
+			gtk_list_store_append (store, &iter);
+			gtk_list_store_set (store, &iter, 0, text, 1, mon_at_point, -1);
+
+			if (x == geom.x && y == geom.y && w == geom.width && h == geom.height)
+				gtk_combo_box_set_active_iter (GTK_COMBO_BOX(self->priv->combobox), &iter);
+
+			g_free (text);
+		}
+	}
+}
+
+static void
+update_ui (CcWacomMappingPanel *self)
+{
+	if (self->priv->device == NULL)
+	{
+		gtk_widget_set_sensitive (GTK_WIDGET(self->priv->checkbutton), FALSE);
+		gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON(self->priv->checkbutton), TRUE);
+	}
+	else
+	{
+		gboolean is_screen_tablet;
+
+		is_screen_tablet = gsd_wacom_device_is_screen_tablet (self->priv->device);
+		gtk_widget_set_sensitive (GTK_WIDGET(self->priv->checkbutton), !is_screen_tablet);
+		gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON(self->priv->checkbutton), FALSE);
+	}
+
+	update_monitor_chooser (self);
+}
+
+static void
+update_mapping (CcWacomMappingPanel *self)
+{
+	int monitor = -1;
+
+	if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->priv->checkbutton)))
+	{
+		GtkTreeIter iter;
+		GtkTreeModel *model;
+		char *name;
+
+		model = gtk_combo_box_get_model (GTK_COMBO_BOX (self->priv->combobox));
+		if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (self->priv->combobox), &iter))
+		{
+			g_warning ("Map to desktop unchecked, but no screen selected.");
+			return;
+		}
+
+		gtk_tree_model_get (model, &iter, 0, &name, 1, &monitor, -1);
+	}
+
+	gsd_wacom_device_set_display (self->priv->device, monitor);
+}
+
+void
+cc_wacom_mapping_panel_set_device (CcWacomMappingPanel *self,
+                                   GsdWacomDevice *device)
+{
+	self->priv->device = device;
+	update_ui(self);
+}
+
+static void
+checkbutton_toggled_cb (GtkWidget *widget,
+                        gpointer  data)
+{
+	CcWacomMappingPanel *self = data;
+	gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
+	gtk_widget_set_sensitive (GTK_WIDGET(self->priv->combobox), !active);
+	update_mapping (self);
+}
+
+static void
+combobox_changed_cb (GtkWidget *widget,
+                     gpointer  data)
+{
+	CcWacomMappingPanel *self = data;
+	update_mapping (self);
+}
+
+static void
+cc_wacom_mapping_panel_init (CcWacomMappingPanel *self)
+{
+	CcWacomMappingPanelPrivate *priv;
+	GtkWidget *vbox, *hbox;
+	GtkCellRenderer *renderer;
+
+	priv = self->priv = WACOM_MAPPING_PANEL_PRIVATE (self);
+
+	vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8);
+	gtk_container_add (GTK_CONTAINER (self), vbox);
+	gtk_widget_set_vexpand (GTK_WIDGET (vbox), TRUE);
+	gtk_widget_set_hexpand (GTK_WIDGET (vbox), TRUE);
+
+	/* Output Combobox */
+	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
+	priv->label = gtk_label_new ("Output:");
+	priv->combobox = gtk_combo_box_new ();
+	g_signal_connect (G_OBJECT (priv->combobox), "changed",
+	                      G_CALLBACK (combobox_changed_cb), self);
+	renderer = gtk_cell_renderer_text_new ();
+	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(priv->combobox), renderer, TRUE);
+	gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(priv->combobox), renderer, "text", 0);
+	gtk_box_pack_start (GTK_BOX(hbox), GTK_WIDGET(priv->label),
+				FALSE, FALSE, 8);
+	gtk_box_pack_start (GTK_BOX(hbox), GTK_WIDGET(priv->combobox),
+				FALSE, FALSE, 0);
+
+	/* Whole-desktop checkbox */
+	priv->checkbutton = gtk_check_button_new_with_label ("Map to entire desktop");
+	g_signal_connect (G_OBJECT (priv->checkbutton), "toggled",
+                      G_CALLBACK (checkbutton_toggled_cb), self);
+
+	gtk_box_pack_start (GTK_BOX(vbox), GTK_WIDGET(hbox),
+				FALSE, FALSE, 8);
+	gtk_box_pack_start (GTK_BOX(vbox), GTK_WIDGET(priv->checkbutton),
+				FALSE, FALSE, 0);
+
+	/* Update display */
+	cc_wacom_mapping_panel_set_device (self, NULL);
+	gtk_widget_show_all(GTK_WIDGET(self));
+}
+
+GtkWidget *
+cc_wacom_mapping_panel_new ()
+{
+	CcWacomMappingPanel *panel;
+
+	panel = CC_WACOM_MAPPING_PANEL(g_object_new (CC_TYPE_WACOM_MAPPING_PANEL, NULL));
+	panel->priv->device = NULL;
+
+	return GTK_WIDGET(panel);
+}
+
+static void
+cc_wacom_mapping_panel_get_property (GObject    *object,
+                                     guint       property_id,
+                                     GValue     *value,
+                                     GParamSpec *pspec)
+{
+	switch (property_id)
+	{
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+	}
+}
+
+static void
+cc_wacom_mapping_panel_set_property (GObject      *object,
+                                     guint         property_id,
+                                     const GValue *value,
+                                     GParamSpec   *pspec)
+{
+	switch (property_id)
+	{
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+	}
+}
+
+static void
+cc_wacom_mapping_panel_dispose (GObject *object)
+{
+	G_OBJECT_CLASS (cc_wacom_mapping_panel_parent_class)->dispose (object);
+}
+
+static void
+cc_wacom_mapping_panel_class_init (CcWacomMappingPanelClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+	g_type_class_add_private (klass, sizeof (CcWacomMappingPanelPrivate));
+
+	object_class->get_property = cc_wacom_mapping_panel_get_property;
+	object_class->set_property = cc_wacom_mapping_panel_set_property;
+	object_class->dispose = cc_wacom_mapping_panel_dispose;
+}
diff --git a/panels/wacom/cc-wacom-mapping-panel.h b/panels/wacom/cc-wacom-mapping-panel.h
new file mode 100644
index 0000000..f49994d
--- /dev/null
+++ b/panels/wacom/cc-wacom-mapping-panel.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright  2012 Wacom.
+ *
+ * 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: Jason Gerecke <killertofu gmail com>
+ *
+ */
+
+#ifndef CC_WACOM_MAPPING_PANEL_H_
+#define CC_WACOM_MAPPING_PANEL_H_
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define CC_TYPE_WACOM_MAPPING_PANEL cc_wacom_mapping_panel_get_type()
+
+#define CC_WACOM_MAPPING_PANEL(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+  CC_TYPE_WACOM_MAPPING_PANEL, CcWacomMappingPanel))
+
+#define CC_WACOM_MAPPING_PANEL_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST ((klass), \
+  CC_TYPE_WACOM_MAPPING_PANEL, CcWacomMappignPanelClass))
+
+#define CC_IS_WACOM_MAPPING_PANEL(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+  CC_TYPE_WACOM_MAPPING_PANEL))
+
+#define CC_IS_WACOM_MAPPING_PANEL_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+  CC_TYPE_WACOM_MAPPING_PANEL))
+
+#define CC_WACOM_MAPPING_PANEL_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+  CC_TYPE_WACOM_MAPPING_PANEL, CcWacomMappingPanelClass))
+
+typedef struct _CcWacomMappingPanel CcWacomMappingPanel;
+typedef struct _CcWacomMappingPanelClass CcWacomMappingPanelClass;
+typedef struct _CcWacomMappingPanelPrivate CcWacomMappingPanelPrivate;
+
+struct _CcWacomMappingPanel
+{
+  GtkBox parent;
+
+  CcWacomMappingPanelPrivate *priv;
+};
+
+struct _CcWacomMappingPanelClass
+{
+  GtkBoxClass parent_class;
+};
+
+GType cc_wacom_mapping_panel_get_type (void) G_GNUC_CONST;
+
+GtkWidget * cc_wacom_mapping_panel_new (void);
+
+
+void cc_wacom_mapping_panel_set_device (CcWacomMappingPanel *self,
+                                        GsdWacomDevice *device);
+
+G_END_DECLS
+
+#endif /* CC_WACOM_MAPPING_PANEL_H_ */



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