aboutsummaryrefslogtreecommitdiff
path: root/src/anastasis/anastasis-gtk_autocomplete.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/anastasis/anastasis-gtk_autocomplete.c')
-rw-r--r--src/anastasis/anastasis-gtk_autocomplete.c100
1 files changed, 93 insertions, 7 deletions
diff --git a/src/anastasis/anastasis-gtk_autocomplete.c b/src/anastasis/anastasis-gtk_autocomplete.c
index 1e3da34..c941d25 100644
--- a/src/anastasis/anastasis-gtk_autocomplete.c
+++ b/src/anastasis/anastasis-gtk_autocomplete.c
@@ -50,12 +50,41 @@ lookup_autocomplete (GtkEditable *editable)
50 } 50 }
51 json_array_foreach (ra, index, a) 51 json_array_foreach (ra, index, a)
52 { 52 {
53 const char *widget_name = json_string_value (json_object_get (a, 53 const char *autocomplete = NULL;
54 "widget")); 54 const char *widget_name = NULL;
55 if (editable == 55 const char *type = NULL;
56 GTK_EDITABLE (GCG_get_main_window_object (ai[i].widget_name))) 56 char *data_name;
57 return json_string_value (json_object_get (a, 57 bool match;
58 "autocomplete")); 58 struct GNUNET_JSON_Specification spec[] = {
59 GNUNET_JSON_spec_mark_optional (
60 GNUNET_JSON_spec_string ("widget",
61 &widget_name)),
62 GNUNET_JSON_spec_mark_optional (
63 GNUNET_JSON_spec_string ("autocomplete",
64 &autocomplete)),
65 GNUNET_JSON_spec_string ("type",
66 &type),
67 GNUNET_JSON_spec_end ()
68 };
69
70 if (GNUNET_OK !=
71 GNUNET_JSON_parse (a,
72 spec,
73 NULL, NULL))
74 {
75 GNUNET_break (0);
76 continue;
77 }
78 if ( (NULL == autocomplete) ||
79 (NULL == widget_name) )
80 continue;
81 data_name = AG_expand_name (widget_name,
82 type);
83 match = (editable ==
84 GTK_EDITABLE (GCG_get_main_window_object (data_name)));
85 GNUNET_free (data_name);
86 if (match)
87 return autocomplete;
59 } 88 }
60 GNUNET_break (0); 89 GNUNET_break (0);
61 return NULL; 90 return NULL;
@@ -115,10 +144,10 @@ anastasis_gtk_autocomplete_insert_text (GtkEditable *editable,
115 void *user_data) 144 void *user_data)
116{ 145{
117 const char *ac; 146 const char *ac;
118 (void) user_data;
119 gint pos; 147 gint pos;
120 char *replacement; 148 char *replacement;
121 149
150 (void) user_data;
122 ac = lookup_autocomplete (editable); 151 ac = lookup_autocomplete (editable);
123 if (NULL == ac) 152 if (NULL == ac)
124 return; 153 return;
@@ -141,3 +170,60 @@ anastasis_gtk_autocomplete_insert_text (GtkEditable *editable,
141 GNUNET_free (replacement); 170 GNUNET_free (replacement);
142 } 171 }
143} 172}
173
174
175/**
176 * Function called from an auto-completed PIN widget upon text insertion.
177 *
178 * @param editable the widget
179 * @param new_text inserted text
180 * @param new_text_length number of bytes in @a new_text
181 * @param position insertion position
182 * @param user_data unused
183 */
184void
185anastasis_gtk_pin_autocomplete_insert_text (GtkEditable *editable,
186 const char *new_text,
187 int new_text_length,
188 gpointer position,
189 void *user_data)
190{
191 /* Use \? to break up trigraphs */
192 const char *acn = "????\?-??\?-???\?-??\?";
193 const char *aca = "A-????\?-??\?-???\?-??\?";
194 const char *ac;
195 gint pos;
196 char *replacement;
197 gchar *pfx;
198
199 (void) user_data;
200 pfx = gtk_editable_get_chars (editable,
201 0,
202 2);
203 if (0 == strncasecmp (pfx,
204 "A-",
205 2))
206 ac = aca;
207 else
208 ac = acn;
209 g_free (pfx);
210
211 pos = gtk_editable_get_position (editable);
212 if (strlen (ac) <= pos + new_text_length)
213 return;
214 if (ac[pos+new_text_length] != '?')
215 {
216 g_signal_stop_emission_by_name (editable,
217 "insert-text");
218 GNUNET_asprintf (&replacement,
219 "%.*s%c",
220 new_text_length,
221 new_text,
222 ac[pos+new_text_length]);
223 gtk_editable_insert_text (editable,
224 replacement,
225 -1,
226 position);
227 GNUNET_free (replacement);
228 }
229}