Skip to content

Commit 8870187

Browse files
committed
Fixed crashes and compilation problems on some X11/Linux systems.
1 parent d247ca9 commit 8870187

File tree

9 files changed

+66
-54
lines changed

9 files changed

+66
-54
lines changed

Makefile.64

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,16 @@ LFLAGS = -lX11 -lXpm -lXm -lXt
99
#LFLAGS = -lX11 -lXm -lXt
1010
#LFLAGS = -lX11 -lXpm -lSDL2 -lXm -lXt
1111
AFLAGS = -f elf64
12+
# If you get an error saying "recompile with -fPIE", uncomment the following
13+
#NOPIE = -no-pie
1214

1315
all: fractald fractalf
1416

1517
fractald: fractald.o routinesd.o
16-
$(LD) fractald.o routinesd.o -o fractald $(LFLAGS)
18+
$(LD) fractald.o routinesd.o -o fractald $(LFLAGS) $(NOPIE)
1719

1820
fractalf: fractalf.o routinesf.o
19-
$(LD) fractalf.o routinesf.o -o fractalf $(LFLAGS)
21+
$(LD) fractalf.o routinesf.o -o fractalf $(LFLAGS) $(NOPIE)
2022

2123
routinesd.o: routinesd.asm
2224
$(AS) $(AFLAGS) routinesd.asm

README.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ what I mean).
3131
## Running
3232

3333
Start from either command line or icon.
34-
Once started, press 'h' to see the various keyboard controls. Or press
34+
*Once started, press 'h' to see the various keyboard controls.* Or press
3535
'0' through '9', '-', or 'a' to go to preset areas of the fractals. To zoom,
3636
press either 'z' for zoom by opposing corners or 'x' for zoom by center to
3737
corner. Then click (and hold) left mouse button to select first point and
@@ -78,6 +78,10 @@ for the 64-bit version.
7878

7979
These will make both the double and float versions of the fractal program.
8080

81+
While compiling, if you get an error message saying "... recompile with -fPIE",
82+
uncomment the *NOPIE = -no-pie* line in the Makefile.64 file. This might be
83+
necessary due to changes in newer versions of gcc.
84+
8185
## Special Linux Version Notes
8286

8387
I had wanted to make this program as simple as possible, so at first, I didn't
@@ -111,7 +115,7 @@ why it has to be horrendous, but I don't like it.
111115
<tr><td>Makefile</td><td>Makefile for 32-bit version</td></tr>
112116
<tr><td>Makefile.64</td><td>Makefile for 64-bit version</td></tr>
113117
<tr><td>&nbsp;</td><td>&nbsp;</td></tr>
114-
<tr><td>fractalb.asm</td><td>My original fractal program for my CPU design</td></tr>
118+
<tr><td>fractalb_not_x86.asm</td><td>My original fractal program for my CPU design</td></tr>
115119
<tr><td>&nbsp;</td><td>&nbsp;</td></tr>
116120
<tr><td>fractald</td><td>ELF 32-bit Linux executable (double version)</td></tr>
117121
<tr><td>fractalf</td><td>ELF 32-bit Linux executable (float version)</td></tr>

bin/fractald

66 Bytes
Binary file not shown.

bin/fractald64

32 Bytes
Binary file not shown.

bin/fractalf

66 Bytes
Binary file not shown.

bin/fractalf64

32 Bytes
Binary file not shown.
File renamed without changes.

fractald.c

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ double xres1 = 512.0, yres1 = 512.0, xres = 512.0, yres = 512.0;
7575
double xres2 = 256.0, yres2 = 256.0;
7676
double one = 1.0, two = 2.0, converge = 4.0, popped;
7777
double m, n, xgap, ygap, ac, bc, az, bz, sizev, temp, tempb;
78-
double aedge, bedge, xdelta, ydelta;
78+
double aedge = -2.0, bedge = -1.25, xdelta = 3.0, ydelta = 2.5;
7979
int numpixels = 512*512*4, numpixels1 = 512*512*4, numpixels2 = 512*256*4;
8080
int off = 0, ncols = 255, count, limit = 1023;
8181
int pixel, cyinc = 2, cydir = 1;
@@ -347,7 +347,7 @@ unsigned char Colors[256*3] = {
347347
double aedgeUndo, bedgeUndo, xdeltaUndo, ydeltaUndo; /* zoom undo vars */
348348
int zoomgetpoint = 0, zoomtype, keepitsquare = 1; /* zoom vars */
349349
int speed = 0, dspeed = 10, pauseit = 0, cycle = 0; /* color cycle vars */
350-
int fractaltype;
350+
int fractaltype = MANDELBROT;
351351

352352
int graphinit(), graphterm(), ProcessEvents();
353353
void SaveImage();
@@ -668,39 +668,41 @@ sprintf(str2, "ls -al %s", name); system(str2);
668668
int main(int argc, char *argv[])
669669
{
670670
int i, l;
671-
char str[8];
671+
char str[8], cmd[256];
672672
XEvent event;
673673
XKeyEvent kev;
674674

675675
graphinit();
676-
if (argc == 1) { Choice1(); } // start with first location
676+
if (argc == 1) { _Mandelbrot(); } // compute 1st location if no commandline args
677677
// Wait for window to popup
678-
do { XNextEvent(dpy, &event); } while (event.type != Expose);
678+
// Some X11 systems will crash if the window hasn't been mapped yet, so wait
679+
// for MapNotify event rather than Expose
680+
do { XNextEvent(dpy, &event); } while (event.type != MapNotify);
681+
//do { XNextEvent(dpy, &event); } while (event.type != Expose);
679682
// fake keypresses so user can initialize the way they want
680-
if (argc > 1)
683+
if (argc > 1) { strcpy(cmd, argv[1]); }
684+
else { strcpy(cmd, "i"); } // just show computed image if no commandline args
685+
kev.display = dpy;
686+
kev.window = win;
687+
kev.state = 0;
688+
str[1] = '\0';
689+
l = strlen(cmd);
690+
for (i=0; i<l; i++)
681691
{
682-
kev.display = dpy;
683-
kev.window = win;
684-
str[1] = '\0';
685-
l = strlen(argv[1]); // putting strlen in "for" didn't work
686-
for (i=0; i<l; i++)
692+
kev.type = KeyPress;
693+
str[0] = cmd[i];
694+
// handle cases that don't work with Keysym/Keycode
695+
switch (str[0])
687696
{
688-
kev.type = KeyPress;
689-
str[0] = argv[1][i];
690-
// handle cases that don't work with Keysym/Keycode
691-
switch (str[0])
692-
{
693-
case '-': kev.keycode = 20; break;
694-
case '.': kev.keycode = 60; break;
695-
case ',': kev.keycode = 59; break;
696-
default: kev.keycode = XKeysymToKeycode(dpy, XStringToKeysym(str));
697-
}
698-
XSendEvent(dpy, win, True, KeyPressMask, (XEvent *)&kev);
699-
kev.type = KeyRelease;
700-
XSendEvent(dpy, win, True, KeyPressMask, (XEvent *)&kev);
697+
case '-': kev.keycode = 20; break;
698+
case '.': kev.keycode = 60; break;
699+
case ',': kev.keycode = 59; break;
700+
default: kev.keycode = XKeysymToKeycode(dpy, XStringToKeysym(str));
701701
}
702+
XSendEvent(dpy, win, True, KeyPressMask, (XEvent *)&kev);
703+
kev.type = KeyRelease;
704+
XSendEvent(dpy, win, True, KeyPressMask, (XEvent *)&kev);
702705
}
703-
else { XPutImage(dpy, win, gc, ximage, 0, 0, 0, 0, ximage->width, ximage->height); }
704706
XFlush(dpy);
705707
while (1)
706708
{
@@ -863,6 +865,7 @@ if (XCheckTypedWindowEvent(dpy, win, KeyPress, &event))
863865
case 'k': keepitsquare = !keepitsquare; break;
864866
case 'p': parameters(); break;
865867
case 'r': if (fractaltype == MANDELBROT) { Mandelbrot(); } else { Julia(); } break;
868+
case 'i': XPutImage(dpy, win, gc, ximage, 0, 0, 0, 0, ximage->width, ximage->height); break;
866869
case 's': SaveImage(NULL); break;
867870
case 'h':
868871
#ifdef HAVE_SDL2

fractalf.c

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ float xres1 = 512.0, yres1 = 512.0, xres = 512.0, yres = 512.0;
7575
float xres2 = 256.0, yres2 = 256.0;
7676
float one = 1.0, two = 2.0, converge = 4.0, popped;
7777
float m, n, xgap, ygap, ac, bc, az, bz, sizev, temp, tempb;
78-
float aedge, bedge, xdelta, ydelta;
78+
float aedge = -2.0, bedge = -1.25, xdelta = 3.0, ydelta = 2.5;
7979
int numpixels = 512*512*4, numpixels1 = 512*512*4, numpixels2 = 512*256*4;
8080
int off = 0, ncols = 255, count, limit = 1023;
8181
int pixel, cyinc = 2, cydir = 1;
@@ -347,7 +347,7 @@ unsigned char Colors[256*3] = {
347347
float aedgeUndo, bedgeUndo, xdeltaUndo, ydeltaUndo; /* zoom undo vars */
348348
int zoomgetpoint = 0, zoomtype, keepitsquare = 1; /* zoom vars */
349349
int speed = 0, dspeed = 10, pauseit = 0, cycle = 0; /* color cycle vars */
350-
int fractaltype;
350+
int fractaltype = MANDELBROT;
351351

352352
int graphinit(), graphterm(), ProcessEvents();
353353
void SaveImage();
@@ -668,39 +668,41 @@ sprintf(str2, "ls -al %s", name); system(str2);
668668
int main(int argc, char *argv[])
669669
{
670670
int i, l;
671-
char str[8];
671+
char str[8], cmd[256];
672672
XEvent event;
673673
XKeyEvent kev;
674674

675675
graphinit();
676-
if (argc == 1) { Choice1(); } // start with first location
676+
if (argc == 1) { _Mandelbrot(); } // compute 1st location if no commandline args
677677
// Wait for window to popup
678-
do { XNextEvent(dpy, &event); } while (event.type != Expose);
678+
// Some X11 systems will crash if the window hasn't been mapped yet, so wait
679+
// for MapNotify event rather than Expose
680+
do { XNextEvent(dpy, &event); } while (event.type != MapNotify);
681+
//do { XNextEvent(dpy, &event); } while (event.type != Expose);
679682
// fake keypresses so user can initialize the way they want
680-
if (argc > 1)
683+
if (argc > 1) { strcpy(cmd, argv[1]); }
684+
else { strcpy(cmd, "i"); } // just show computed image if no commandline args
685+
kev.display = dpy;
686+
kev.window = win;
687+
kev.state = 0;
688+
str[1] = '\0';
689+
l = strlen(cmd);
690+
for (i=0; i<l; i++)
681691
{
682-
kev.display = dpy;
683-
kev.window = win;
684-
str[1] = '\0';
685-
l = strlen(argv[1]); // putting strlen in "for" didn't work
686-
for (i=0; i<l; i++)
692+
kev.type = KeyPress;
693+
str[0] = cmd[i];
694+
// handle cases that don't work with Keysym/Keycode
695+
switch (str[0])
687696
{
688-
kev.type = KeyPress;
689-
str[0] = argv[1][i];
690-
// handle cases that don't work with Keysym/Keycode
691-
switch (str[0])
692-
{
693-
case '-': kev.keycode = 20; break;
694-
case '.': kev.keycode = 60; break;
695-
case ',': kev.keycode = 59; break;
696-
default: kev.keycode = XKeysymToKeycode(dpy, XStringToKeysym(str));
697-
}
698-
XSendEvent(dpy, win, True, KeyPressMask, (XEvent *)&kev);
699-
kev.type = KeyRelease;
700-
XSendEvent(dpy, win, True, KeyPressMask, (XEvent *)&kev);
697+
case '-': kev.keycode = 20; break;
698+
case '.': kev.keycode = 60; break;
699+
case ',': kev.keycode = 59; break;
700+
default: kev.keycode = XKeysymToKeycode(dpy, XStringToKeysym(str));
701701
}
702+
XSendEvent(dpy, win, True, KeyPressMask, (XEvent *)&kev);
703+
kev.type = KeyRelease;
704+
XSendEvent(dpy, win, True, KeyPressMask, (XEvent *)&kev);
702705
}
703-
else { XPutImage(dpy, win, gc, ximage, 0, 0, 0, 0, ximage->width, ximage->height); }
704706
XFlush(dpy);
705707
while (1)
706708
{
@@ -863,6 +865,7 @@ if (XCheckTypedWindowEvent(dpy, win, KeyPress, &event))
863865
case 'k': keepitsquare = !keepitsquare; break;
864866
case 'p': parameters(); break;
865867
case 'r': if (fractaltype == MANDELBROT) { Mandelbrot(); } else { Julia(); } break;
868+
case 'i': XPutImage(dpy, win, gc, ximage, 0, 0, 0, 0, ximage->width, ximage->height); break;
866869
case 's': SaveImage(NULL); break;
867870
case 'h':
868871
#ifdef HAVE_SDL2

0 commit comments

Comments
 (0)