The support right now is extremely cheesy. It depends on two
external programs (xli and killall), and also uses system()
to execute them with the shell (ick). Oh, and it will also
indiscriminately kill any innocent xli processes that happen
to get in the way. Clearly it's a pretty ugly hack.
CATEGORY_ORDER_SEQUENTIAL
} category_order_t;
CATEGORY_ORDER_SEQUENTIAL
} category_order_t;
+typedef enum {
+ CHALLENGE_TYPE_TEXT,
+ CHALLENGE_TYPE_IMAGE
+} challenge_type_t;
+
typedef struct _category {
char *name;
int items_size;
typedef struct _category {
char *name;
int items_size;
/* Support categories where responses are timed (0.0 == disable). */
double time_limit;
int bin_zero_head;
/* Support categories where responses are timed (0.0 == disable). */
double time_limit;
int bin_zero_head;
+ /* Support challenges of non-text types (image, audio, etc.) */
+ challenge_type_t challenge_type;
} category_t;
typedef struct _mnemon {
} category_t;
typedef struct _mnemon {
category->order = CATEGORY_ORDER_RANDOM;
category->time_limit = 0.0;
category->bin_zero_head = 0;
category->order = CATEGORY_ORDER_RANDOM;
category->time_limit = 0.0;
category->bin_zero_head = 0;
+ category->challenge_type = CHALLENGE_TYPE_TEXT;
fprintf (file, "time = %f\n\n",
category->time_limit);
fprintf (file, "time = %f\n\n",
category->time_limit);
+ fprintf (file, "challenge = ");
+ switch (category->challenge_type) {
+ case CHALLENGE_TYPE_TEXT:
+ fprintf (file, "text");
+ break;
+ case CHALLENGE_TYPE_IMAGE:
+ fprintf (file, "image");
+ break;
+ }
+ fprintf (file, "\n\n");
+
for (i = 0; i < category->num_items; i++) {
item = &category->items[i];
if (i != 0)
for (i = 0; i < category->num_items; i++) {
item = &category->items[i];
if (i != 0)
value, path, line_count);
exit (1);
}
value, path, line_count);
exit (1);
}
+ } else if (strcmp (name, "challenge") == 0) {
+ if (strcmp (value, "text") == 0) {
+ category->challenge_type = CHALLENGE_TYPE_TEXT;
+ } else if (strcmp (value, "image") == 0) {
+ category->challenge_type = CHALLENGE_TYPE_IMAGE;
+ } else {
+ fprintf (stderr, "Unknown value for \"challenge\" option \"%s\" at %s:%d\n",
+ value, path, line_count);
+ exit (1);
+ }
} else {
fprintf (stderr, "Unknown option %s at %s:%d\n",
name, path, line_count);
} else {
fprintf (stderr, "Unknown option %s at %s:%d\n",
name, path, line_count);
bin_add_item (bin, item);
}
bin_add_item (bin, item);
}
+static void
+mnemon_show_image (mnemon_t *mnemon, const char *filename)
+{
+ char *command;
+
+ /* XXX: Yes, shelling out to system is total cheese. The planned
+ * fix here is to bring graphical display in process, (or at least
+ * have a custom external program that accepts image filenames on
+ * stdin.
+ */
+ xasprintf (&command, "xli -gamma 2.2 %s >/dev/null 2>&1 &",
+ filename);
+ system (command);
+ free (command);
+}
+
+static void
+mnemon_hide_image (mnemon_t *mnemon)
+{
+ char * command;
+
+ /* XXX: And this is just embarrassing (obviously wrong in several
+ * ways). Hopefully I'll amend away any commit that includes this.
+ */
+ xasprintf (&command, "killall xli");
+ system (command);
+ free (command);
+}
+
static void
mnemon_do_challenges (mnemon_t *mnemon)
{
static void
mnemon_do_challenges (mnemon_t *mnemon)
{
response = readline ("The next one is timed. Press enter when ready:");
free (response);
}
response = readline ("The next one is timed. Press enter when ready:");
free (response);
}
-
- printf ("%s\n", item->challenge);
+
+ switch (category->challenge_type) {
+ case CHALLENGE_TYPE_TEXT:
+ printf ("%s\n", item->challenge);
+ break;
+ case CHALLENGE_TYPE_IMAGE:
+ {
+ char *absolute_filename;
+
+ xasprintf (&absolute_filename, "%s/%s",
+ mnemon->dir_name, item->challenge);
+ mnemon_show_image (mnemon, absolute_filename);
+ free (absolute_filename);
+ }
+ break;
+ }
gettimeofday (&start, NULL);
response = readline ("> ");
gettimeofday (&end, NULL);
gettimeofday (&start, NULL);
response = readline ("> ");
gettimeofday (&end, NULL);
+ if (category->challenge_type == CHALLENGE_TYPE_IMAGE)
+ mnemon_hide_image (mnemon);
+
/* Terminate on EOF */
if (response == NULL) {
printf ("\n");
/* Terminate on EOF */
if (response == NULL) {
printf ("\n");