1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
|
/* X window system graphics header file. */
#include <memory.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
extern int have_x;
extern int back_ground;
extern void real_window_init();
void logofill(void);
/* Some X-related defines. */
#define BORDER 1
#define FONT "fixed"
#define NUMCOLORS 512
#define NUMINITCOLORS 16
#define EVENT_MASK (StructureNotifyMask | PointerMotionMask \
| ButtonPressMask | ButtonReleaseMask)
#define DEFAULT_HEIGHT 500
#define DEFAULT_WIDTH 500
#define GR_SIZE 60000
#define checkX { \
if (have_x < 0) real_window_init(); \
if (!have_x) { \
err_logo(BAD_GRAPH_INIT,NIL); \
return; \
} \
}
#define prepare_to_draw {checkX; placate_x();}
#define done_drawing XFlush(dpy)
extern void placate_x();
#define prepare_to_draw_turtle nop()
#define done_drawing_turtle nop()
#define screen_left 0
#define screen_right (screen_width-1)
#define screen_top 0
#define screen_bottom (screen_height-1)
/* #define screen_height (1 + screen_bottom - screen_top) */
/* #define screen_width (1 + screen_right - screen_left) */
#define screen_x_center (screen_left + (screen_width)/2)
#define screen_y_center (screen_top + (screen_height)/2)
#define turtle_left_max ((screen_left) - (screen_x_center))
#define turtle_right_max ((screen_right) - (screen_x_center))
#define turtle_top_max ((screen_y_center) - (screen_top))
#define turtle_bottom_max ((screen_y_center) - (screen_bottom))
#define screen_x_coord ((screen_x_center) + turtle_x)
#define screen_y_coord ((screen_y_center) - turtle_y)
#define turtle_height 18
#define turtle_half_bottom 6.0
#define turtle_side 19.0
#define clear_screen XClearWindow(dpy, win)
#define erase_screen() XClearWindow(dpy, win)
#define line_to(a,b) if(xgr_pen.vis==0)\
XDrawLine(dpy,win,xgr_pen.pm,\
xgr_pen.xpos,xgr_pen.ypos,\
(a),(b));\
xgr_pen.xpos=(a);\
xgr_pen.ypos=(b)
#define move_to(a,b) xgr_pen.xpos=(a);\
xgr_pen.ypos=(b)
#define draw_string(s) XDrawString(dpy,win,xgr_pen.pm,\
xgr_pen.xpos,xgr_pen.ypos,\
(s),strlen((s)));
#define set_pen_vis(v) xgr_pen.vis=(v)
#define set_pen_mode(m) xgr_pen.pm=(m)
#define set_pen_color(c) draw_turtle();\
xgr_pen.color=c%NUMCOLORS;\
XSetForeground(dpy,draw_gc,color[2+xgr_pen.color].pixel);\
XSetForeground(dpy,reverse_gc,color[2+xgr_pen.color].pixel);\
draw_turtle();
#define set_back_ground(c) back_ground=c%NUMCOLORS;\
XSetBackground(dpy,draw_gc,color[2+back_ground].pixel);\
XSetBackground(dpy,reverse_gc,color[2+back_ground].pixel);\
XSetBackground(dpy,erase_gc,color[2+back_ground].pixel);\
XSetForeground(dpy,erase_gc,color[2+back_ground].pixel);\
XSetWindowBackground(dpy,win,color[2+back_ground].pixel);\
redraw_graphics();
#define set_pen_width(w) XSetLineAttributes(dpy, draw_gc, w, LineSolid, \
CapProjecting, JoinMiter);\
XSetLineAttributes(dpy, erase_gc, w, LineSolid, \
CapProjecting, JoinMiter);\
XSetLineAttributes(dpy, reverse_gc, w, LineSolid, \
CapProjecting, JoinMiter);\
xgr_pen.pw = w;
#define set_pen_height(h) XSetLineAttributes(dpy, draw_gc, h, LineSolid, \
CapProjecting, JoinMiter);\
XSetLineAttributes(dpy, erase_gc, h, LineSolid, \
CapProjecting, JoinMiter);\
XSetLineAttributes(dpy, reverse_gc, h, LineSolid, \
CapProjecting, JoinMiter);\
xgr_pen.ph = h;
#define set_pen_x(x) nop()
#define set_pen_y(y) nop()
/* pen_info is a stucture type with fields for the various
pen characteristics including the location, size, color,
mode (e.g. XOR or COPY), pattern, visibility (0 = visible) */
typedef struct {
int color;
int xpos;
int ypos;
int vis;
int pw;
int ph;
GC pm;
} pen_info;
extern pen_info xgr_pen;
#define p_info_x(p) (p.xpos)
#define p_info_y(p) (p.ypos)
/* All these should take an argument, like the two just above.
Then we could support multiple turtles.
*/
#define pen_width xgr_pen.pw
#define pen_height xgr_pen.ph
#define pen_color xgr_pen.color
#define pen_mode xgr_pen.pm
#define pen_vis xgr_pen.vis
#define pen_x (xgr_pen.xpos)
#define pen_y (xgr_pen.ypos)
#define get_node_pen_pattern (cons(make_intnode(-1), NIL))
#define pen_reverse pen_mode=reverse_gc
#define pen_erase pen_mode=erase_gc
#define pen_down pen_mode=draw_gc
#define button get_button()
#define mouse_x get_mouse_x()
#define mouse_y get_mouse_y()
/* There seems little point in implementing these unless we put
everything in one window. (Possibly use a slave xterm?)
*/
#define full_screen nop()
#define split_screen nop()
#define text_screen nop()
#define plain_xor_pen() pen_reverse
#define label(s) XDrawImageString(dpy,win,xgr_pen.pm,\
xgr_pen.xpos,xgr_pen.ypos,\
(s), strlen(s))
#define tone(p,d) nop()
#define get_pen_pattern(p) nop()
#define set_pen_pattern(p) nop()
#define set_list_pen_pattern(p) nop()
extern void set_palette(int, unsigned int, unsigned int, unsigned int);
extern void get_palette(int, unsigned int*, unsigned int*, unsigned int*);
/* The sparc has fmod. So I use it. */
/* #define fmod(x,y) x */
extern void nop();
/* Global X variables. */
extern int screen_height, screen_width;
extern Display *dpy; /* X server connection */
extern Window win; /* Window ID */
extern GC draw_gc, /* GC to draw with */
erase_gc, /* GC to draw with */
reverse_gc; /* GC to draw with */
extern XColor color[];
extern XColor dummy;
extern int get_mouse_x(), get_mouse_y();
/* Avoid name conflicts. Note: if xgraphics.c uses True and
False, bad things are likely to happen.
*/
#undef True
#undef False
|