openbsd-ports/games/xmine/patches/patch-aa

221 lines
5.6 KiB
Plaintext

--- xmine.c.orig Fri May 11 02:41:41 2001
+++ xmine.c Fri May 11 00:49:10 2001
@@ -78,6 +78,13 @@
#define GSPACEX 16
#define GSPACEY 16
+/* some systems might be better off with using "random()" instead of "rand()"*/
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
+# define USE_RANDOM 1
+#else
+# define USE_RANDOM 0
+#endif
+
#define SCORE_FILE "~/.xmine_scores"
#define TOPMARGIN 60
#define BOTMARGIN 12
@@ -119,6 +126,7 @@
Display *disp;
Window win;
int colordisp;
+Atom delw;
#define COL_BLUE 0
#define COL_LIMEGREEN 1
@@ -239,6 +247,7 @@
int cant_write_score_file P ((void));
void fix_size P ((void));
void relax_size P ((void));
+void GlobalProtoHandler P ((Widget w, XEvent *xev, String *params, Cardinal *n));
Pixmap fillface;
XtAppContext app;
@@ -271,7 +280,7 @@
XColor unused;
int i;
- XtActionsRec actions[3];
+ XtActionsRec actions[4];
String translations =
"<Btn1Down>: search(down)\n\
<Btn1Up>: search(up)\n\
@@ -284,6 +293,8 @@
toplevel = XtVaAppInitialize(&app, "Xmine", NULL, 0,
&argc, argv, fallbacks, NULL);
+ delw = XInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW", False);
+
main_w = XtVaCreateManagedWidget("main_w", boxWidgetClass, toplevel,
XtNorientation, XtorientVertical,
NULL);
@@ -383,7 +394,13 @@
actions[1].proc = search_action;
actions[2].string = "mark";
actions[2].proc = mark_action;
- XtAppAddActions(app, actions, 3);
+ actions[3].string = "GlobalProtoHandler";
+ actions[3].proc = GlobalProtoHandler;
+
+ XtAppAddActions(app, actions, 4);
+ XtOverrideTranslations(toplevel, XtParseTranslationTable(
+ "<Message>WM_PROTOCOLS : GlobalProtoHandler()")
+ );
drawing_a = XtVaCreateManagedWidget
("drawing_a",
@@ -404,6 +421,7 @@
XtAddEventHandler(toplevel,
StructureNotifyMask, False, resize_handler, 0);
XtRealizeWidget(toplevel);
+ XSetWMProtocols(XtDisplay(toplevel), XtWindow(toplevel), &delw, 1);
fillface = XCreateBitmapFromData(XtDisplay(main_w),
XtWindow(main_w), fillface_bits,
fillface_width, fillface_height);
@@ -461,13 +479,15 @@
if (xg == armed_x && yg == armed_y) {
if (!armed) {
set_face(FACE_OHNO);
- draw_blank_square(armed_x, armed_y, True);
+ if (gridview[xg][yg] == COVERED)
+ draw_blank_square(armed_x, armed_y, True);
armed = True;
}
} else {
if (armed) {
set_face(FACE_HAPPY);
- draw_button(armed_x, armed_y);
+ if (gridview[armed_x][armed_y] == COVERED)
+ draw_button(armed_x, armed_y);
armed = False;
}
}
@@ -628,11 +648,12 @@
set_face(armit ? FACE_OHNO : FACE_HAPPY);
for (dx = -1; dx <= 1; dx++)
for (dy = -1; dy <= 1; dy++)
- if (is_state(x+dx, y+dy, COVERED))
+ if (is_state(x+dx, y+dy, COVERED)) {
if (armit)
draw_blank_square(x+dx, y+dy, True);
else
draw_button(x+dx, y+dy);
+ }
}
#if NeedFunctionPrototypes
@@ -911,12 +932,21 @@
{
int i, x, y, xd, yd, tries;
+#if USE_RANDOM
+ srandom((unsigned) time(0));
+#else
srand((unsigned int) time(0));
+#endif
for (i = 0; i != mine_count; i++) {
tries = 1000;
do {
+#if USE_RANDOM
+ x = (random()>>1) % gsizex;
+ y = (random()>>1) % gsizey;
+#else
x = (rand()>>1) % gsizex;
y = (rand()>>1) % gsizey;
+#endif
tries--;
} while (tries && (grid[x][y] ||
!(x < fx-1 || x > fx+1 || y < fy-1
@@ -1069,6 +1099,7 @@
for (y = 0; y != gsizey; y++)
if (gridview[x][y] == COVERED) {
gridview[x][y] = MARKED;
+ marked_count++;
redrawsquare(x, y);
}
draw_digits(0, 0);
@@ -1346,6 +1377,10 @@
XtAddCallback(w, XtNcallback, dialog_ok, NULL);
XtManageChild(pane);
XtPopup(custom, XtGrabExclusive);
+ XtOverrideTranslations(custom, XtParseTranslationTable(
+ "<Message>WM_PROTOCOLS : GlobalProtoHandler()")
+ );
+ XSetWMProtocols(XtDisplay(custom), XtWindow(custom), &delw, 1);
dialog_up = True;
while (dialog_up) {
XtAppProcessEvent(app, XtIMAll);
@@ -1391,7 +1426,6 @@
str = XawDialogGetValueString(w);
if (!str) return;
if (atoi(str)) *val = atoi(str);
- XawAsciiSourceFreeString(w);
}
/* ARGSUSED */
@@ -1510,6 +1544,10 @@
if (cant_write_score_file()) XtSetSensitive(w, False);
XtManageChild(pane);
XtPopup(best, XtGrabExclusive);
+ XtOverrideTranslations(best, XtParseTranslationTable(
+ "<Message>WM_PROTOCOLS : GlobalProtoHandler()")
+ );
+ XSetWMProtocols(XtDisplay(best), XtWindow(best), &delw, 1);
dialog_up = True;
while (dialog_up) {
XtAppProcessEvent(app, XtIMAll);
@@ -1554,6 +1592,10 @@
XtAddCallback(w, XtNcallback, dialog_ok, NULL);
XtManageChild(pane);
XtPopup(about, XtGrabExclusive);
+ XtOverrideTranslations(about, XtParseTranslationTable(
+ "<Message>WM_PROTOCOLS : GlobalProtoHandler()")
+ );
+ XSetWMProtocols(XtDisplay(about), XtWindow(about), &delw, 1);
dialog_up = True;
while (dialog_up) {
XtAppProcessEvent(app, XtIMAll);
@@ -1659,6 +1701,10 @@
XtManageChild(pane);
XtPopup(custom, XtGrabExclusive);
+ XtOverrideTranslations(custom, XtParseTranslationTable(
+ "<Message>WM_PROTOCOLS : GlobalProtoHandler()")
+ );
+ XSetWMProtocols(XtDisplay(custom), XtWindow(custom), &delw, 1);
dialog_up = True;
while (dialog_up) {
@@ -1672,7 +1718,6 @@
sc->times[level] = timer;
write_scores(sc);
}
- if (str) XawAsciiSourceFreeString(pane);
best_times(NULL, NULL, NULL);
}
@@ -1814,3 +1859,24 @@
{
exit(0);
}
+
+#if NeedFunctionPrototypes
+void
+GlobalProtoHandler(Widget w, XEvent *xev, String *params, Cardinal *n)
+#else
+void
+GlobalProtoHandler(w, xev, params, n)
+ Widget w;
+ XEvent *xev;
+ String *params;
+ Cardinal *n;
+#endif
+{
+ if(xev->xclient.data.l[0] == delw) {
+ if(w == toplevel)
+ exit(0);
+ else
+ XtPopdown(w);
+ }
+}
+