+static gboolean
+on_key_press_event (GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer user_data)
+{
+ int i, x, y;
+ char guess_letter;
+ rack_t *rack = user_data;
+
+ if (event->keyval == GDK_space) {
+ for (i = 0; i < rack->num_tiles; i++) {
+ if (rack->tiles[i]->guessed) {
+ rack_tile_position (rack->tiles[i]->rack_index, &x, &y);
+ tile_glide_to (rack->tiles[i], x, y);
+ rack->tiles[i]->guessed = FALSE;
+ }
+ }
+ the_guess_index = 0;
+ rack_shuffle (rack);
+ return TRUE;
+ }
+
+ if (event->keyval == GDK_BackSpace) {
+ gboolean found = FALSE;
+ int found_index;
+ x = 0;
+ for (i = 0; i < rack->num_tiles; i++) {
+ /* XXX: evil stuff here... please refactor a lot */
+ if (the_guess[the_guess_index-1] == rack->tiles[i]->letter &&
+ rack->tiles[i]->guessed &&
+ rack->tiles[i]->x > x)
+ {
+ found = TRUE;
+ found_index = i;
+ }
+ }
+ if (found) {
+ rack_tile_position (rack->tiles[found_index]->rack_index, &x, &y);
+ tile_glide_to (rack->tiles[found_index], x, y);
+ rack->tiles[found_index]->guessed = FALSE;
+ the_guess_index--;
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+ /* XXX: event->string is deprecated, but the non-deprecated
+ * input-method stuff (GtkIMContext) is extremely non-obvious to
+ * use. */
+ guess_letter = tolower (event->string[0]);
+ for (i = 0; i < rack->num_tiles; i++) {
+ if (guess_letter == rack->tiles[i]->letter &&
+ ! rack->tiles[i]->guessed)
+ {
+ guess_tile_position (the_guess_index, &x, &y);
+ tile_glide_to (rack->tiles[i], x, y);
+ rack->tiles[i]->guessed = TRUE;
+ the_guess[the_guess_index++] = guess_letter;
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static GtkWidget *
+create_window (void)
+{
+ GtkWidget *window, *scrolled_window;
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_default_size (GTK_WINDOW (window), 500, 500);
+ gtk_widget_show (window);
+ g_signal_connect (window, "delete_event",
+ (GtkSignalFunc) on_delete_event, NULL);
+
+ gtk_widget_add_events (window, GDK_KEY_PRESS_MASK);
+ g_signal_connect (window, "key_press_event",
+ (GtkSignalFunc) on_key_press_event, &the_rack);
+
+ scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window),
+ GTK_SHADOW_IN);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+ gtk_widget_show (scrolled_window);
+ gtk_container_add (GTK_CONTAINER (window), scrolled_window);
+
+ return scrolled_window;
+}
+