Fix a couple of robustness issues.
[sgt/puzzles] / gtk.c
diff --git a/gtk.c b/gtk.c
index ab10a11..742c18c 100644 (file)
--- a/gtk.c
+++ b/gtk.c
@@ -98,10 +98,14 @@ void frontend_default_colour(frontend *fe, float *output)
 
 void status_bar(frontend *fe, char *text)
 {
+    char *rewritten;
+
     assert(fe->statusbar);
 
+    rewritten = midend_rewrite_statusbar(fe->me, text);
     gtk_statusbar_pop(GTK_STATUSBAR(fe->statusbar), fe->statusctx);
-    gtk_statusbar_push(GTK_STATUSBAR(fe->statusbar), fe->statusctx, text);
+    gtk_statusbar_push(GTK_STATUSBAR(fe->statusbar), fe->statusctx, rewritten);
+    sfree(rewritten);
 }
 
 void start_draw(frontend *fe)
@@ -317,24 +321,26 @@ static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
     frontend *fe = (frontend *)data;
     int keyval;
+    int shift = (event->state & GDK_SHIFT_MASK) ? MOD_SHFT : 0;
+    int ctrl = (event->state & GDK_CONTROL_MASK) ? MOD_CTRL : 0;
 
     if (!fe->pixmap)
         return TRUE;
 
     if (event->keyval == GDK_Up)
-        keyval = CURSOR_UP;
+        keyval = shift | ctrl | CURSOR_UP;
     else if (event->keyval == GDK_KP_Up || event->keyval == GDK_KP_8)
        keyval = MOD_NUM_KEYPAD | '8';
     else if (event->keyval == GDK_Down)
-        keyval = CURSOR_DOWN;
+        keyval = shift | ctrl | CURSOR_DOWN;
     else if (event->keyval == GDK_KP_Down || event->keyval == GDK_KP_2)
        keyval = MOD_NUM_KEYPAD | '2';
     else if (event->keyval == GDK_Left)
-        keyval = CURSOR_LEFT;
+        keyval = shift | ctrl | CURSOR_LEFT;
     else if (event->keyval == GDK_KP_Left || event->keyval == GDK_KP_4)
        keyval = MOD_NUM_KEYPAD | '4';
     else if (event->keyval == GDK_Right)
-        keyval = CURSOR_RIGHT;
+        keyval = shift | ctrl | CURSOR_RIGHT;
     else if (event->keyval == GDK_KP_Right || event->keyval == GDK_KP_6)
        keyval = MOD_NUM_KEYPAD | '6';
     else if (event->keyval == GDK_KP_Home || event->keyval == GDK_KP_7)
@@ -462,7 +468,7 @@ static gint configure_area(GtkWidget *widget,
     gdk_draw_rectangle(fe->pixmap, gc, 1, 0, 0, fe->w, fe->h);
     gdk_gc_unref(gc);
 
-    midend_redraw(fe->me);
+    midend_force_redraw(fe->me);
 
     return TRUE;
 }
@@ -1005,7 +1011,11 @@ static frontend *new_window(char *game_id, char **error)
 
     fe = snew(frontend);
 
+    fe->timer_active = FALSE;
+    fe->timer_id = -1;
+
     fe->me = midend_new(fe, &thegame);
+
     if (game_id) {
         *error = midend_game_id(fe->me, game_id);
         if (*error) {
@@ -1194,8 +1204,6 @@ static frontend *new_window(char *game_id, char **error)
     fe->fonts = NULL;
     fe->nfonts = fe->fontsize = 0;
 
-    fe->timer_active = FALSE;
-
     fe->paste_data = NULL;
     fe->paste_data_len = 0;
 
@@ -1301,7 +1309,7 @@ int main(int argc, char **argv)
 
        while (n-- > 0) {
            game_aux_info *aux = NULL;
-           char *desc = thegame.new_desc(par, rs, &aux);
+           char *desc = thegame.new_desc(par, rs, &aux, FALSE);
            printf("%s:%s\n", parstr, desc);
            sfree(desc);
            if (aux)