[gnome-bluetooth] Add PIN options dialog
- From: Bastien Nocera <hadess src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-bluetooth] Add PIN options dialog
- Date: Wed, 14 Oct 2009 12:58:26 +0000 (UTC)
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]