Index: minefield.h =================================================================== --- minefield.h (revision 6891) +++ minefield.h (working copy) @@ -58,7 +58,7 @@ struct _GtkMineField { GtkWidget widget; - guint xsize, ysize; + gint xsize, ysize; guint mcount; mine *mines; guint flag_count; @@ -108,8 +108,8 @@ GType gtk_minefield_get_type (void); GtkWidget *gtk_minefield_new (void); - void gtk_minefield_set_size (GtkMineField * mfield, guint xsize, - guint ysize); + void gtk_minefield_set_size (GtkMineField * mfield, gint xsize, + gint ysize); void gtk_minefield_restart (GtkMineField * mfield); void gtk_minefield_set_use_question_marks (GtkMineField * mfield, gboolean use_question_marks); Index: gnomine.c =================================================================== --- gnomine.c (revision 6891) +++ gnomine.c (working copy) @@ -166,7 +166,7 @@ char *val; val = - g_strdup_printf (_("Flags: %d/%d"), mfield->flag_count, mfield->mcount); + g_strdup_printf (_("Clear: %d/%d"), mfield->shown, mfield->xsize*mfield->ysize-mfield->mcount); gtk_label_set_text (GTK_LABEL (flabel), val); g_free (val); } Index: minefield.c =================================================================== --- minefield.c (revision 6891) +++ minefield.c (working copy) @@ -87,11 +87,11 @@ static GtkWidgetClass *parent_class; /* Prototypes */ -static inline gint cell_idx_no_checks (GtkMineField * mfield, guint x, - guint y); -static gint cell_idx (GtkMineField * mfield, guint x, guint y); +static inline gint cell_idx_no_checks (GtkMineField * mfield, gint x, + gint y); +static gint cell_idx (GtkMineField * mfield, gint x, gint y); static void setup_sign (sign * signp, const char *file, guint minesize); -static void gtk_mine_draw (GtkMineField * mfield, guint x, guint y); +static void gtk_mine_draw (GtkMineField * mfield, gint x, gint y); static gint gtk_minefield_button_press (GtkWidget * widget, GdkEventButton * event); static gint gtk_minefield_button_release (GtkWidget * widget, @@ -103,27 +103,27 @@ static void gtk_minefield_lose (GtkMineField * mfield); static gint gtk_minefield_motion_notify (GtkWidget * widget, GdkEventMotion * event); -static void gtk_minefield_multi_release (GtkMineField * mfield, guint x, - guint y, guint c, guint really); +static void gtk_minefield_multi_release (GtkMineField * mfield, gint x, + gint y, guint c, guint really); static void gtk_minefield_randomize (GtkMineField * mfield, int curloc); static void gtk_minefield_realize (GtkWidget * widget); static void gtk_minefield_setup_signs (GtkMineField * mfield); -static void gtk_minefield_show (GtkMineField * mfield, guint x, guint y); +static void gtk_minefield_show (GtkMineField * mfield, gint x, gint y); static void gtk_minefield_size_allocate (GtkWidget * widget, GtkAllocation * allocation); static void gtk_minefield_size_request (GtkWidget * widget, GtkRequisition * requisition); -static void gtk_minefield_set_mark (GtkMineField * mfield, guint x, - guint y, int mark); -static void gtk_minefield_toggle_mark (GtkMineField * mfield, guint x, - guint y); +static void gtk_minefield_set_mark (GtkMineField * mfield, gint x, + gint y, int mark); +static void gtk_minefield_toggle_mark (GtkMineField * mfield, gint x, + gint y); static void gtk_minefield_unrealize (GtkWidget * widget); static void gtk_minefield_win (GtkMineField * mfield); -static int gtk_minefield_check_cell (GtkMineField * mfield, guint x, guint y); -static void gtk_minefield_multi_press (GtkMineField * mfield, guint x, - guint y, gint c); -static gboolean gtk_minefield_solve_square (GtkMineField * mfield, guint x, - guint y, guint c); +static int gtk_minefield_check_cell (GtkMineField * mfield, gint x, gint y); +static void gtk_minefield_multi_press (GtkMineField * mfield, gint x, + gint y, gint c); +static gboolean gtk_minefield_solve_square (GtkMineField * mfield, gint x, + gint y, guint c); /* end prototypes */ @@ -131,8 +131,17 @@ code that does no checking, use it sparsely. If in doubt, use cell_idx instead. */ static inline gint -cell_idx_no_checks (GtkMineField * mfield, guint x, guint y) +cell_idx_no_checks (GtkMineField * mfield, gint x, gint y) { + while (x < 0) + x += mfield->xsize; + while (x >= mfield->xsize) + x -= mfield->xsize; + while (y < 0) + y += mfield->ysize; + while (y >= mfield->ysize) + y -= mfield->ysize; + return x + y * mfield->xsize; } @@ -141,9 +150,9 @@ coordinates. If the coordinates are not valid then it returns -1. */ static gint -cell_idx (GtkMineField * mfield, guint x, guint y) +cell_idx (GtkMineField * mfield, gint x, gint y) { - if (x >= 0 && x < mfield->xsize && y >= 0 && y < mfield->ysize) + /*if (x >= 0 && x < mfield->xsize && y >= 0 && y < mfield->ysize)*/ return cell_idx_no_checks (mfield, x, y); return -1; @@ -379,11 +388,11 @@ mfield = GTK_MINEFIELD (widget); if (GTK_WIDGET_REALIZED (widget)) { - minesize = MIN (allocation->width / mfield->xsize, - allocation->height / mfield->ysize); + minesize = MIN (allocation->width / (mfield->xsize+2), + allocation->height / (mfield->ysize+2)); mfield->minesize = minesize; - width = mfield->xsize * minesize; - height = mfield->ysize * minesize; + width = (mfield->xsize+2) * minesize; + height = (mfield->ysize+2) * minesize; xofs = allocation->x + (allocation->width - width) / 2; yofs = allocation->y + (allocation->height - height) / 2; @@ -409,7 +418,7 @@ } static void -gtk_mine_draw (GtkMineField * mfield, guint x, guint y) +_gtk_mine_draw (GtkMineField * mfield, gint x, gint y) { int c = cell_idx (mfield, x, y); int noshadow; @@ -551,6 +560,20 @@ } } +static void +gtk_mine_draw (GtkMineField * mfield, gint x, gint y) +{ + x = x%mfield->xsize; + y = y%mfield->ysize; + _gtk_mine_draw(mfield, x, y); + if (x < 2) + _gtk_mine_draw(mfield, x+mfield->xsize, y); + if (y < 2) + _gtk_mine_draw(mfield, x, y+mfield->ysize); + if ((x < 2) && (y < 2)) + _gtk_mine_draw(mfield, x+mfield->xsize, y+mfield->ysize); +} + static gint gtk_minefield_expose (GtkWidget * widget, GdkEventExpose * event) { @@ -559,7 +582,7 @@ g_return_val_if_fail (event != NULL, FALSE); if (GTK_WIDGET_DRAWABLE (widget)) { - guint x1, y1, x2, y2, x, y; + gint x1, y1, x2, y2, x, y; GtkMineField *mfield = GTK_MINEFIELD (widget); GdkRectangle *area = &event->area; @@ -594,7 +617,7 @@ } static int -gtk_minefield_check_cell (GtkMineField * mfield, guint x, guint y) +gtk_minefield_check_cell (GtkMineField * mfield, gint x, gint y) { guint changed; gint c; @@ -638,14 +661,14 @@ x2 = cx2 + 1; y2 = cy2 + 1; - if (x1 < 0) + /*if (x1 < 0) x1 = 0; if (y1 < 0) y1 = 0; if (x2 >= mfield->xsize) x2 = mfield->xsize - 1; if (y2 >= mfield->ysize) - y2 = mfield->ysize - 1; + y2 = mfield->ysize - 1;*/ changed = 0; for (x = x1; x <= x2; x++) { @@ -696,7 +719,7 @@ static void gtk_minefield_win (GtkMineField * mfield) { - guint x, y, c; + gint x, y, c; /* mark any unmarked mines and update displayed total */ for (x = 0; x < mfield->xsize; x++) { @@ -727,7 +750,7 @@ gtk_minefield_randomize (GtkMineField * mfield, int curloc) { guint i, j; - guint x, y; + gint x, y; guint n; gint cidx; gboolean adj_found; @@ -782,7 +805,7 @@ } static void -gtk_minefield_show (GtkMineField * mfield, guint x, guint y) +gtk_minefield_show (GtkMineField * mfield, gint x, gint y) { int c = cell_idx (mfield, x, y); @@ -802,12 +825,13 @@ gtk_minefield_lose (mfield); } else { gtk_minefield_check_field (mfield, x, y); + g_signal_emit(GTK_OBJECT(mfield), minefield_signals[MARKS_CHANGED_SIGNAL], 0, NULL); } } } static void -gtk_minefield_set_mark (GtkMineField * mfield, guint x, guint y, int mark) +gtk_minefield_set_mark (GtkMineField * mfield, gint x, gint y, int mark) { int c = cell_idx (mfield, x, y); int change_count, i, nx, ny, c2; @@ -861,7 +885,7 @@ } static void -gtk_minefield_toggle_mark (GtkMineField * mfield, guint x, guint y) +gtk_minefield_toggle_mark (GtkMineField * mfield, gint x, gint y) { int mark = MINE_NOMARK, c = cell_idx (mfield, x, y); @@ -886,7 +910,7 @@ } static void -gtk_minefield_multi_press (GtkMineField * mfield, guint x, guint y, gint c) +gtk_minefield_multi_press (GtkMineField * mfield, gint x, gint y, gint c) { guint i; gint nx, ny, c2; @@ -905,7 +929,7 @@ } static gboolean -gtk_minefield_solve_square (GtkMineField * mfield, guint x, guint y, guint c) +gtk_minefield_solve_square (GtkMineField * mfield, gint x, gint y, guint c) { gint nc, i, nx, ny, empty_count = 0, unknown[8][2], set_count = 0; @@ -936,7 +960,7 @@ } static void -gtk_minefield_multi_release (GtkMineField * mfield, guint x, guint y, guint c, +gtk_minefield_multi_release (GtkMineField * mfield, gint x, gint y, guint c, guint really) { gint nx, ny, i, c2; @@ -972,6 +996,7 @@ gtk_minefield_lose (mfield); } else if (really) { gtk_minefield_check_field (mfield, x, y); + g_signal_emit(GTK_OBJECT(mfield), minefield_signals[MARKS_CHANGED_SIGNAL], 0, NULL); } } @@ -979,7 +1004,7 @@ gtk_minefield_motion_notify (GtkWidget * widget, GdkEventMotion * event) { GtkMineField *mfield; - guint x, y; + gint x, y; gint c; guint multi; guint minesize; @@ -1029,7 +1054,7 @@ gtk_minefield_button_press (GtkWidget * widget, GdkEventButton * event) { GtkMineField *mfield; - guint x, y; + gint x, y; gint c; guint minesize; @@ -1052,6 +1077,8 @@ c = cell_idx (mfield, x, y); if (c == -1) return FALSE; + //if ((x<0)||(y<0)||(x>=(mfield->xsize+2))||(y>=(mfield->ysize+2))) + // return FALSE; /* If this is the first button pressed (on a cell), * record where it was pressed. */ @@ -1237,7 +1264,7 @@ } void -gtk_minefield_set_size (GtkMineField * mfield, guint xsize, guint ysize) +gtk_minefield_set_size (GtkMineField * mfield, gint xsize, gint ysize) { g_return_if_fail (mfield != NULL); g_return_if_fail (GTK_IS_MINEFIELD (mfield));