~mdw
/
sgt
/
puzzles
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Now _this_ is what Undo ought to be doing in a Minesweeper clone.
[sgt/puzzles]
/
gtk.c
diff --git
a/gtk.c
b/gtk.c
index
55bc179
..
742c18c
100644
(file)
--- a/
gtk.c
+++ b/
gtk.c
@@
-82,10
+82,10
@@
struct frontend {
void get_random_seed(void **randseed, int *randseedsize)
{
void get_random_seed(void **randseed, int *randseedsize)
{
-
time_t *tp = snew(time_t
);
-
time(tp
);
- *randseed = (void *)tp;
- *randseedsize = sizeof(
time_t
);
+
struct timeval *tvp = snew(struct timeval
);
+
gettimeofday(tvp, NULL
);
+ *randseed = (void *)t
v
p;
+ *randseedsize = sizeof(
struct timeval
);
}
void frontend_default_colour(frontend *fe, float *output)
}
void frontend_default_colour(frontend *fe, float *output)
@@
-98,10
+98,14
@@
void frontend_default_colour(frontend *fe, float *output)
void status_bar(frontend *fe, char *text)
{
void status_bar(frontend *fe, char *text)
{
+ char *rewritten;
+
assert(fe->statusbar);
assert(fe->statusbar);
+ rewritten = midend_rewrite_statusbar(fe->me, text);
gtk_statusbar_pop(GTK_STATUSBAR(fe->statusbar), fe->statusctx);
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)
}
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;
{
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)
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)
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)
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)
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)
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);
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;
}
return TRUE;
}
@@
-1005,7
+1011,11
@@
static frontend *new_window(char *game_id, char **error)
fe = snew(frontend);
fe = snew(frontend);
+ fe->timer_active = FALSE;
+ fe->timer_id = -1;
+
fe->me = midend_new(fe, &thegame);
fe->me = midend_new(fe, &thegame);
+
if (game_id) {
*error = midend_game_id(fe->me, game_id);
if (*error) {
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->fonts = NULL;
fe->nfonts = fe->fontsize = 0;
- fe->timer_active = FALSE;
-
fe->paste_data = NULL;
fe->paste_data_len = 0;
fe->paste_data = NULL;
fe->paste_data_len = 0;
@@
-1236,6
+1244,12
@@
int main(int argc, char **argv)
char *pname = argv[0];
char *error;
char *pname = argv[0];
char *error;
+ if (argc > 1 && !strcmp(argv[1], "--version")) {
+ printf("%s, from Simon Tatham's Portable Puzzle Collection\n%s\n",
+ thegame.name, ver);
+ return 0;
+ }
+
/*
* Special standalone mode for generating puzzle IDs on the
* command line. Useful for generating puzzles to be printed
/*
* Special standalone mode for generating puzzle IDs on the
* command line. Useful for generating puzzles to be printed
@@
-1274,7
+1288,10
@@
int main(int argc, char **argv)
if ( (seed = strchr(params, '#')) != NULL )
*seed++ = '\0';
thegame.decode_params(par, params);
if ( (seed = strchr(params, '#')) != NULL )
*seed++ = '\0';
thegame.decode_params(par, params);
- } else {
+ }
+ if ((error = thegame.validate_params(par)) != NULL) {
+ fprintf(stderr, "%s: %s\n", pname, error);
+ return 1;
}
parstr = thegame.encode_params(par, FALSE);
}
parstr = thegame.encode_params(par, FALSE);
@@
-1292,7
+1309,7
@@
int main(int argc, char **argv)
while (n-- > 0) {
game_aux_info *aux = NULL;
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)
printf("%s:%s\n", parstr, desc);
sfree(desc);
if (aux)