diff options
Diffstat (limited to 'src/anastasis/anastasis-gtk_autocomplete.c')
-rw-r--r-- | src/anastasis/anastasis-gtk_autocomplete.c | 100 |
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 | */ | ||
184 | void | ||
185 | anastasis_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 | } | ||