[gnome-bluetooth] Add PIN options dialog



commit 881bb3ab082fbb290f2681f50c539002509dd3d8
Author: Joshua Lock <josh linux intel com>
Date:   Wed Oct 14 12:36:23 2009 +0100

    Add PIN options dialog
    
    Add a pin.ui file which is just a copy/paste of the pin options dialog from
    wizard.ui. Lazy-load the UI when the PIN options button is clicked.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=598411

 moblin/Makefile.am    |    5 +-
 moblin/moblin-panel.c |  161 ++++++++++++++++++++++++++++++++++++++++++++-
 moblin/pin.ui         |  176 +++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 339 insertions(+), 3 deletions(-)
---
diff --git a/moblin/Makefile.am b/moblin/Makefile.am
index 6ae4928..5d7f872 100644
--- a/moblin/Makefile.am
+++ b/moblin/Makefile.am
@@ -19,10 +19,13 @@ autostart_in_files = bluetooth-panel.desktop.in
 
 autostart_DATA = $(autostart_in_files:.desktop.in=.desktop)
 
+ui_DATA = pin.ui
+uidir = $(pkgdatadir)
+
 @INTLTOOL_DESKTOP_RULE@
 
 CLEANFILES = $(autostart_DATA)
 
-EXTRA_DIST = $(autostart_in_in_files)
+EXTRA_DIST = $(autostart_in_in_files) $(ui_DATA)
 
 MAINTAINERCLEANFILES = Makefile.in
diff --git a/moblin/moblin-panel.c b/moblin/moblin-panel.c
index b039f78..4197281 100644
--- a/moblin/moblin-panel.c
+++ b/moblin/moblin-panel.c
@@ -29,7 +29,7 @@
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 #include <math.h>
-
+#include <gdk/gdkkeysyms.h>
 #include <nbtk/nbtk-gtk.h>
 
 #include "bluetooth-client.h"
@@ -67,10 +67,20 @@ struct _MoblinPanelPrivate
 	GtkWidget *display;
 	GtkWidget *send_button;
 	GtkWidget *add_new_button;
+	/* Widgets for use in lazy-loading the pin options dialog from the GtkBuilder UI file */
 	GtkTreeModel *chooser_model;
 
+	/* Widgets for use in lazy-loading the pin options dialog from the GtkBuilder UI file */
+	GtkWidget *pin_dialog;
+	GtkWidget *entry_custom;
+	GtkWidget *radio_auto;
+	GtkWidget *radio_0000;
+	GtkWidget *radio_1111;
+	GtkWidget *radio_1234;
+	GtkWidget *radio_custom;
 	gchar *pincode;
 
+	gchar *user_pincode;
 	gboolean connecting;
 };
 
@@ -235,11 +245,158 @@ send_file_button_clicked_cb (GtkButton *button,
 	g_ptr_array_free (a, TRUE);
 }
 
+static gboolean
+entry_custom_event (GtkWidget *entry, GdkEventKey *event)
+{
+	if (event->length == 0)
+		return FALSE;
+
+	if ((event->keyval >= GDK_0 && event->keyval <= GDK_9) ||
+	    (event->keyval >= GDK_KP_0 && event->keyval <= GDK_KP_9))
+		return FALSE;
+
+	return TRUE;
+}
+
+static void
+entry_custom_changed (GtkWidget *entry, gpointer user_data)
+{
+	MoblinPanelPrivate *priv = MOBLIN_PANEL_GET_PRIVATE (user_data);
+	priv->user_pincode = g_strdup (gtk_entry_get_text(GTK_ENTRY(entry)));
+	gtk_dialog_set_response_sensitive (GTK_DIALOG (priv->pin_dialog),
+					   GTK_RESPONSE_ACCEPT,
+					   gtk_entry_get_text_length (GTK_ENTRY (entry)) >= 1);
+}
+
+static void
+toggle_set_sensitive (GtkWidget *button, gpointer user_data)
+{
+	MoblinPanelPrivate *priv = MOBLIN_PANEL_GET_PRIVATE (user_data);
+	gboolean active;
+
+	active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
+	gtk_widget_set_sensitive(priv->entry_custom, active);
+	/* When selecting another PIN, make sure the "Close" button is sensitive */
+	if (!active)
+		gtk_dialog_set_response_sensitive (GTK_DIALOG (priv->pin_dialog),
+						   GTK_RESPONSE_ACCEPT, TRUE);
+}
+
+static void
+set_user_pincode (GtkWidget *button, gpointer user_data)
+{
+	MoblinPanelPrivate *priv = MOBLIN_PANEL_GET_PRIVATE (user_data);
+	GSList *list, *l;
+
+	list = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
+	for (l = list; l ; l = l->next) {
+		GtkEntry *entry;
+		GtkWidget *radio;
+		const char *pin;
+
+		if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
+			continue;
+
+		/* Is it radio_fixed that changed? */
+		radio = g_object_get_data (G_OBJECT (button), "button");
+		if (radio != NULL) {
+			set_user_pincode (radio, user_data);
+			return;
+		}
+
+		pin = g_object_get_data (G_OBJECT (button), "pin");
+		entry = g_object_get_data (G_OBJECT (button), "entry");
+
+		if (entry != NULL) {
+			g_free (priv->user_pincode);
+			priv->user_pincode = g_strdup (gtk_entry_get_text(entry));
+			gtk_dialog_set_response_sensitive (GTK_DIALOG (priv->pin_dialog),
+							   GTK_RESPONSE_ACCEPT,
+							   gtk_entry_get_text_length (entry) >= 1);
+		} else if (pin != NULL) {
+			g_free (priv->user_pincode);
+			if (*pin == '\0')
+				priv->user_pincode = NULL;
+			else
+				priv->user_pincode = g_strdup (pin);
+		}
+
+		break;
+	}
+}
+
 static void
 pin_options_button_clicked_cb (GtkButton *button,
                              gpointer   user_data)
 {
-	g_debug ("PIN options clicked.");
+	MoblinPanel *self = MOBLIN_PANEL (user_data);
+	MoblinPanelPrivate *priv = MOBLIN_PANEL_GET_PRIVATE (self);
+	GtkWidget *radio;
+	gchar *oldpin;
+	GtkBuilder *builder;
+	GError *err = NULL;
+
+	if (priv->pin_dialog == NULL) {
+		builder = gtk_builder_new ();
+		if (gtk_builder_add_from_file (builder, "pin.ui", NULL) == 0) {
+			if (gtk_builder_add_from_file (builder, PKGDATADIR "/pin.ui", &err) == 0) {
+				g_warning ("Could not load PIN dialog UI form %s: %s",
+					PKGDATADIR "/pin.ui", err->message);
+				g_error_free (err);
+			}
+		}
+
+		priv->pin_dialog = GTK_WIDGET (gtk_builder_get_object (builder, "pin_dialog"));
+		priv->radio_auto  = GTK_WIDGET (gtk_builder_get_object (builder, "radio_auto"));
+		g_signal_connect (priv->radio_auto, "toggled", G_CALLBACK (set_user_pincode), self);
+		priv->radio_0000 = GTK_WIDGET (gtk_builder_get_object (builder, "radio_0000"));
+		g_signal_connect (priv->radio_0000, "toggled", G_CALLBACK (set_user_pincode), self);
+		priv->radio_1111 = GTK_WIDGET (gtk_builder_get_object (builder, "radio_1111"));
+		g_signal_connect (priv->radio_1111, "toggled", G_CALLBACK (set_user_pincode), self);
+		priv->radio_1234 = GTK_WIDGET (gtk_builder_get_object (builder, "radio_1234"));
+		g_signal_connect (priv->radio_1234, "toggled", G_CALLBACK (set_user_pincode), self);
+		priv->radio_custom = GTK_WIDGET (gtk_builder_get_object (builder, "radio_custom"));
+		g_signal_connect (priv->radio_custom, "toggled", G_CALLBACK (set_user_pincode), self);
+		g_signal_connect (priv->radio_custom, "toggled", G_CALLBACK (toggle_set_sensitive), self);
+		priv->entry_custom = GTK_WIDGET (gtk_builder_get_object (builder, "entry_custom"));
+		g_signal_connect (priv->entry_custom, "key-press-event", G_CALLBACK (entry_custom_event), self);
+		g_signal_connect (priv->entry_custom, "changed", G_CALLBACK (entry_custom_changed), self);
+
+		g_object_set_data (G_OBJECT (priv->radio_auto), "pin", "");
+		g_object_set_data (G_OBJECT (priv->radio_0000), "pin", "0000");
+		g_object_set_data (G_OBJECT (priv->radio_1111), "pin", "1111");
+		g_object_set_data (G_OBJECT (priv->radio_1234), "pin", "1234");
+		g_object_set_data (G_OBJECT (priv->radio_custom), "entry", priv->entry_custom);
+	}
+
+	oldpin = priv->user_pincode;
+	priv->user_pincode = NULL;
+
+	gtk_window_present (GTK_WINDOW (priv->pin_dialog));
+
+	if (oldpin == NULL)
+		radio = priv->radio_auto;
+	else if (g_str_equal (oldpin, "0000"))
+		radio = priv->radio_0000;
+	else if (g_str_equal (oldpin, "1111"))
+		radio = priv->radio_1111;
+	else if (g_str_equal (oldpin, "1234"))
+		radio = priv->radio_1234;
+	else
+		radio = priv->radio_custom;
+
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), TRUE);
+	if (radio == priv->radio_custom)
+		gtk_entry_set_text (GTK_ENTRY (priv->entry_custom), oldpin);
+
+	if (gtk_dialog_run (GTK_DIALOG (priv->pin_dialog)) != GTK_RESPONSE_ACCEPT) {
+		g_free (priv->user_pincode);
+		priv->user_pincode = oldpin;
+	} else {
+		g_free (oldpin);
+	}
+
+	gtk_widget_hide (priv->pin_dialog);
 }
 
 /*
diff --git a/moblin/pin.ui b/moblin/pin.ui
new file mode 100644
index 0000000..8b7e1d6
--- /dev/null
+++ b/moblin/pin.ui
@@ -0,0 +1,176 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <object class="GtkDialog" id="pin_dialog">
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">PIN Options</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="type_hint">normal</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="dialog-vbox1">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+        <child>
+          <object class="GtkVBox" id="vbox1">
+            <property name="visible">True</property>
+            <property name="border_width">12</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">6</property>
+            <child>
+              <object class="GtkRadioButton" id="radio_auto">
+                <property name="label" translatable="yes">_Automatic PIN selection</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="use_underline">True</property>
+                <property name="active">True</property>
+                <property name="draw_indicator">True</property>
+                <signal name="toggled" handler="set_user_pincode"/>
+              </object>
+              <packing>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label3">
+                <property name="visible">True</property>
+                <property name="xalign">0</property>
+                <property name="label" translatable="yes" comments="Translators: this is a PIN with a set value, such as 1111, or 0000">Fixed PIN</property>
+                <attributes>
+                  <attribute name="weight" value="bold"/>
+                </attributes>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkRadioButton" id="radio_0000">
+                <property name="label" translatable="yes">'0000' (most headsets, mice and GPS devices)</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="active">True</property>
+                <property name="draw_indicator">True</property>
+                <property name="group">radio_auto</property>
+                <signal name="toggled" handler="set_user_pincode"/>
+              </object>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkRadioButton" id="radio_1111">
+                <property name="label" translatable="yes">'1111'</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="active">True</property>
+                <property name="draw_indicator">True</property>
+                <property name="group">radio_auto</property>
+                <signal name="toggled" handler="set_user_pincode"/>
+              </object>
+              <packing>
+                <property name="position">3</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkRadioButton" id="radio_1234">
+                <property name="label" translatable="yes">'1234'</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="active">True</property>
+                <property name="draw_indicator">True</property>
+                <property name="group">radio_auto</property>
+                <signal name="toggled" handler="set_user_pincode"/>
+              </object>
+              <packing>
+                <property name="position">4</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox1">
+                <property name="visible">True</property>
+                <property name="spacing">12</property>
+                <child>
+                  <object class="GtkRadioButton" id="radio_custom">
+                    <property name="label" translatable="yes">Custom PIN:</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                    <property name="group">radio_auto</property>
+                    <signal name="toggled" handler="set_user_pincode"/>
+                    <signal name="toggled" handler="toggle_set_sensitive"/>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="entry_custom">
+                    <property name="visible">True</property>
+                    <property name="sensitive">False</property>
+                    <property name="can_focus">True</property>
+                    <property name="max_length">20</property>
+                    <property name="width_chars">20</property>
+                    <signal name="key-press-event" handler="entry_custom_event"/>
+                    <signal name="changed" handler="entry_custom_changed"/>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">5</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="padding">6</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area1">
+            <property name="visible">True</property>
+            <property name="layout_style">end</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <object class="GtkButton" id="button1">
+                <property name="label">gtk-close</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-3">button1</action-widget>
+    </action-widgets>
+  </object>
+</interface>



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