gchar *response = g_string_free(priv->response, FALSE);
priv->response = g_string_new("");
+ gdk_threads_enter();
g_signal_emit_by_name(glk, "command", priv->input, response);
+ gdk_threads_leave();
g_free(priv->input);
g_free(response);
priv->interpreter = CHIMARA_IF_INTERPRETER_NONE;
}
+static void
+chimara_if_char_input(ChimaraGlk *glk, guint32 win_rock, guint keysym)
+{
+ CHIMARA_IF_USE_PRIVATE(glk, priv);
+ g_assert(priv->input == NULL);
+
+ gchar outbuf[6];
+ gint outbuflen = g_unichar_to_utf8(gdk_keyval_to_unicode(keysym), outbuf);
+ priv->input = g_strndup(outbuf, outbuflen);
+}
+
static void
chimara_if_line_input(ChimaraGlk *glk, guint32 win_rock, gchar *input)
{
/* Connect to signals of ChimaraGlk parent */
g_signal_connect(self, "stopped", G_CALLBACK(chimara_if_stopped), NULL);
g_signal_connect(self, "waiting", G_CALLBACK(chimara_if_waiting), NULL);
+ g_signal_connect(self, "char-input", G_CALLBACK(chimara_if_char_input), NULL);
g_signal_connect(self, "line-input", G_CALLBACK(chimara_if_line_input), NULL);
g_signal_connect(self, "text-buffer-output", G_CALLBACK(chimara_if_text_buffer_output), NULL);
}
/**
* ChimaraIF::command:
* @self: The widget that received the signal
- * @input: The command typed into the game
+ * @input: The command typed into the game, or %NULL
* @response: The game's response to the command
*
* Emitted once for each input-response cycle of an interactive fiction
* game. Note that games with nontraditional input systems (i.e. not all
* taking place in the same text buffer window) may confuse this signal.
+ *
+ * It may happen that @input is %NULL, in which case @response is not due to
+ * a user command, but contains the text printed at the beginning of the
+ * game, up until the first prompt.
*/
chimara_if_signals[COMMAND] = g_signal_new("command",
G_OBJECT_CLASS_TYPE(klass), 0,
G_STRUCT_OFFSET(ChimaraIFClass, command), NULL, NULL,
- chimara_marshal_VOID__STRING_STRING,
+ _chimara_marshal_VOID__STRING_STRING,
G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING);
/* Properties */