00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00035
00036 #include <errno.h>
00037 #include <string.h>
00038 #include <sys/types.h>
00039 #include <sys/stat.h>
00040 #include <ctype.h>
00041
00042 #include <gdk/gdk.h>
00043 #include <gtk/gtk.h>
00044 #include <gdk/gdkkeysyms.h>
00045
00046
00047 #include <liberdm/display.h>
00048 #include <liberdm/erdm.h>
00049 #include <libergtk/ergtk.h>
00050 #include <liberipc/eripctoolbar.h>
00051
00052
00053 #include "setupLog.h"
00054 #include "displayStatus.h"
00055 #include "gtkPincodeEntry.h"
00056
00057
00058
00059 static void gtk_pincode_entry_class_init(GtkPincodeEntryClass* klass);
00060 static void gtk_pincode_entry_init(GtkPincodeEntry* input_entry);
00061
00062 static void on_gtk_pincode_entry_insert_text(GtkWidget* widget,
00063 const gchar* text, gint length, gint* position, gpointer user_data);
00064
00065
00066 GtkWidget* gtk_pincode_entry_new()
00067 {
00068 GtkPincodeEntry* pincode_entry = (GtkPincodeEntry*) g_object_new(GTK_PINCODE_ENTRY_TYPE, NULL);
00069
00070 return GTK_WIDGET(pincode_entry);
00071 }
00072
00073 GType gtk_pincode_entry_get_type(void)
00074 {
00075 static GType pincode_entry_type = 0;
00076
00077 if (!pincode_entry_type)
00078 {
00079 static const GTypeInfo pincode_entry_info = {
00080 sizeof(GtkPincodeEntryClass),
00081 NULL,
00082 NULL,
00083 (GClassInitFunc) gtk_pincode_entry_class_init,
00084 NULL,
00085 NULL,
00086 sizeof(GtkPincodeEntry),
00087 0,
00088 (GInstanceInitFunc) gtk_pincode_entry_init,
00089 };
00090
00091 pincode_entry_type = g_type_register_static(ERGTK_ENTRY_TYPE, "PincodeEntry", &pincode_entry_info, 0);
00092 }
00093 return pincode_entry_type;
00094 }
00095
00096
00097 static void gtk_pincode_entry_class_init(GtkPincodeEntryClass* klass)
00098 {
00099 return;
00100 }
00101
00102
00103 static void gtk_pincode_entry_init(GtkPincodeEntry* pincode_entry)
00104 {
00105 g_return_if_fail(pincode_entry != NULL);
00106
00107 GtkWidget* widget = (GtkWidget*)pincode_entry;
00108 GtkEntry* entry = (GtkEntry* )pincode_entry;
00109
00110 gtk_widget_set_size_request(widget, PINCODE_INPUT_ENTRY_WIDTH, PINCODE_INPUT_ENTRY_HEIGHT);
00111 gtk_entry_set_max_length(entry, PINCODE_UI_MAX_LENGTH);
00112 gtk_entry_set_visibility(entry, FALSE);
00113
00114 gtk_signal_connect(GTK_OBJECT(entry), "insert_text", GTK_SIGNAL_FUNC(on_gtk_pincode_entry_insert_text), NULL);
00115 }
00116
00117
00118
00119
00120 gboolean gtk_pincode_entry_check_text(GtkPincodeEntry* pincode_entry)
00121 {
00122 const gchar *text = NULL;
00123 int i, len;
00124 gboolean entry_ok = FALSE;
00125
00126 g_return_val_if_fail((pincode_entry!= NULL), FALSE);
00127 g_return_val_if_fail(IS_GTK_PINCODE_ENTRY(pincode_entry), FALSE);
00128
00129 GtkEntry* entry = (GtkEntry*)pincode_entry;
00130
00131 text = gtk_entry_get_text(entry);
00132 if (text == NULL)
00133 {
00134 text = "";
00135 }
00136
00137 len = strlen(text);
00138 if ( len >= PINCODE_UI_MIN_LENGTH
00139 && len <= PINCODE_UI_MAX_LENGTH )
00140 {
00141 entry_ok = TRUE;
00142 for (i = 0; i < len; i++)
00143 {
00144 if ( !isdigit(text[i]) )
00145 {
00146 entry_ok = FALSE;
00147 }
00148 }
00149 }
00150
00151 return entry_ok;
00152 }
00153
00154
00155
00156 static void on_gtk_pincode_entry_insert_text(GtkWidget* widget,
00157 const gchar* text, gint length, gint* position, gpointer user_data)
00158 {
00159 GtkEditable *editable = GTK_EDITABLE(widget);
00160 int i, count = 0;
00161 gchar *result = g_new(gchar, length);
00162
00163 for (i = 0; i < length; i++)
00164 {
00165 if (!isdigit(text[i]))
00166 continue;
00167 result[count++] = text[i];
00168 }
00169 if (count > 0)
00170 {
00171 gtk_signal_handler_block_by_func(GTK_OBJECT(editable),
00172 GTK_SIGNAL_FUNC(on_gtk_pincode_entry_insert_text), user_data);
00173 gtk_editable_insert_text(editable, result, count, position);
00174 gtk_signal_handler_unblock_by_func(GTK_OBJECT(editable),
00175 GTK_SIGNAL_FUNC(on_gtk_pincode_entry_insert_text), user_data);
00176 }
00177 gtk_signal_emit_stop_by_name(GTK_OBJECT(editable), "insert_text");
00178
00179 g_free(result);
00180 }
00181