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
|
#ifdef XWindows
#define DRAWOP_AND GXand
#define DRAWOP_ANDINVERTED GXandInverted
#define DRAWOP_ANDREVERSE GXandReverse
#define DRAWOP_CLEAR GXclear
#define DRAWOP_COPY GXcopy
#define DRAWOP_COPYINVERTED GXcopyInverted
#define DRAWOP_EQUIV GXequiv
#define DRAWOP_INVERT GXinvert
#define DRAWOP_NAND GXnand
#define DRAWOP_NOOP GXnoop
#define DRAWOP_NOR GXnor
#define DRAWOP_OR GXor
#define DRAWOP_ORINVERTED GXorInverted
#define DRAWOP_ORREVERSE GXorReverse
#define DRAWOP_REVERSE 0x10
#define DRAWOP_SET GXset
#define DRAWOP_XOR GXxor
#define XLFD_Foundry 1
#define XLFD_Family 2
#define XLFD_Weight 3
#define XLFD_Slant 4
#define XLFD_SetWidth 5
#define XLFD_AddStyle 6
#define XLFD_Size 7
#define XLFD_PointSize 8
#define XLFD_Spacing 11
#define XLFD_CharSet 13
#define TEXTWIDTH(w,s,n) XTextWidth((w)->context->font->fsp, s, n)
#define SCREENDEPTH(w)\
DefaultDepth((w)->window->display->display, w->window->display->screen)
#define ASCENT(w) ((w)->context->font->fsp->ascent)
#define DESCENT(w) ((w)->context->font->fsp->descent)
#define LEADING(w) ((w)->context->leading)
#define FHEIGHT(w) ((w)->context->font->height)
#define FWIDTH(w) ((w)->context->font->fsp->max_bounds.width)
#define LINEWIDTH(w) ((w)->context->linewidth)
#define DISPLAYHEIGHT(w)\
DisplayHeight(w->window->display->display, w->window->display->screen)
#define DISPLAYWIDTH(w)\
DisplayWidth(w->window->display->display, w->window->display->screen)
#define FS_SOLID FillSolid
#define FS_STIPPLE FillStippled
#define hidecrsr(x) /* noop */
#define UpdateCursorPos(x, y) /* noop */
#define showcrsr(x) /* noop */
#define SysColor XColor
#define ARCWIDTH(arc) ((arc).width)
#define ARCHEIGHT(arc) ((arc).height)
#define RECX(rec) ((rec).x)
#define RECY(rec) ((rec).y)
#define RECWIDTH(rec) ((rec).width)
#define RECHEIGHT(rec) ((rec).height)
#define ANGLE(ang) (-(ang) * 180 / Pi * 64)
#define EXTENT(ang) (-(ang) * 180 / Pi * 64)
#define ISICONIC(w) ((w)->window->iconic == IconicState)
#define ISFULLSCREEN(w) (0)
#define ISROOTWIN(w) ((w)->window->iconic == RootState)
#define ISNORMALWINDOW(w) ((w)->window->iconic == NormalState)
#define ICONFILENAME(w) ((w)->window->iconimage)
#define ICONLABEL(w) ((w)->window->iconlabel)
#define WINDOWLABEL(w) ((w)->window->windowlabel)
#define RootState IconicState+1
#define MaximizedState IconicState+2
#define HiddenState IconicState+3
/*
* The following constants define limitations in the system, gradually being
* removed as this code is rewritten to use dynamic allocation.
*/
#define WMAXCOLORS 256
#define MAXCOLORNAME 40
#define MAXDISPLAYNAME 64
#define CSHARED 0
#define CMUTABLE 1
#define NUMCURSORSYMS 78
/*
* Macros to ease coding in which every X call must be done twice.
*/
#define RENDER2(func,v1,v2) {\
if (stdwin) func(stddpy, stdwin, stdgc, v1, v2); \
func(stddpy, stdpix, stdgc, v1, v2);}
#define RENDER3(func,v1,v2,v3) {\
if (stdwin) func(stddpy, stdwin, stdgc, v1, v2, v3); \
func(stddpy, stdpix, stdgc, v1, v2, v3);}
#define RENDER4(func,v1,v2,v3,v4) {\
if (stdwin) func(stddpy, stdwin, stdgc, v1, v2, v3, v4); \
func(stddpy, stdpix, stdgc, v1, v2, v3, v4);}
#define RENDER6(func,v1,v2,v3,v4,v5,v6) {\
if (stdwin) func(stddpy, stdwin, stdgc, v1, v2, v3, v4, v5, v6); \
func(stddpy, stdpix, stdgc, v1, v2, v3, v4, v5, v6);}
#define RENDER7(func,v1,v2,v3,v4,v5,v6,v7) {\
if (stdwin) func(stddpy, stdwin, stdgc, v1, v2, v3, v4, v5, v6, v7); \
func(stddpy, stdpix, stdgc, v1, v2, v3, v4, v5, v6, v7);}
#define MAXDESCENDER(w) (w->context->font->fsp->max_bounds.descent)
/*
* Macros to perform direct window system calls from graphics routines
*/
#define STDLOCALS(w) \
wcp wc = (w)->context; \
wsp ws = (w)->window; \
wdp wd = ws->display; \
GC stdgc = wc->gc; \
Display *stddpy = wd->display; \
Window stdwin = ws->win; \
Pixmap stdpix = ws->pix;
#define drawarcs(w, arcs, narcs) \
{ STDLOCALS(w); RENDER2(XDrawArcs,arcs,narcs); }
#define drawlines(w, points, npoints) \
{ STDLOCALS(w); RENDER3(XDrawLines,points,npoints,CoordModeOrigin); }
#define drawpoints(w, points, npoints) \
{ STDLOCALS(w); RENDER3(XDrawPoints,points,npoints,CoordModeOrigin); }
#define drawrectangles(w, recs, nrecs) { \
STDLOCALS(w); \
for(i=0; i<nrecs; i++) { \
RENDER4(XDrawRectangle,recs[i].x,recs[i].y,recs[i].width,recs[i].height);\
}}
#define drawsegments(w, segs, nsegs) \
{ STDLOCALS(w); RENDER2(XDrawSegments,segs,nsegs); }
#define drawstrng(w, x, y, s, slen) \
{ STDLOCALS(w); RENDER4(XDrawString, x, y, s, slen); }
#define fillarcs(w, arcs, narcs) \
{ STDLOCALS(w); RENDER2(XFillArcs, arcs, narcs); }
#define fillpolygon(w, points, npoints) \
{ STDLOCALS(w); RENDER4(XFillPolygon, points, npoints, Complex, CoordModeOrigin); }
/*
* "get" means remove them from the Icon list and put them on the ghost queue
*/
#define EVQUEGET(w,d) { \
int i;\
wsp ws = (w)->window; \
if (!c_get((struct b_list *)BlkLoc(ws->listp),&d)) fatalerr(0,NULL); \
if (Qual(d)) {\
ws->eventQueue[ws->eQfront++] = *StrLoc(d); \
if (ws->eQfront >= EQUEUELEN) ws->eQfront = 0; \
ws->eQback = ws->eQfront; \
} \
}
#define EVQUEEMPTY(w) (BlkLoc((w)->window->listp)->list.size == 0)
/*
* Colors. These are allocated within displays. Pointers
* into the display's color table are also kept on a per-window
* basis so that they may be (de)allocated when a window is cleared.
* Colors are aliased by r,g,b value. Allocations by name and r,g,b
* share when appropriate.
*
* Color (de)allocation comprises a simple majority of the space
* requirements of the current implementation. A monochrome-only
* version would take a lot less space.
*
* The name field is the string returned by WAttrib. For a mutable
* color this is of the form "-47" followed by a second C string
* containing the current color setting.
*/
typedef struct wcolor {
unsigned long c; /* X pixel value */
int refcount; /* reference count */
int type; /* CSHARED or CMUTABLE */
int next; /* next entry in hash chain */
unsigned short r, g, b; /* rgb for colorsearch */
char name[6+MAXCOLORNAME]; /* name for WAttrib & WColor reads */
} *wclrp;
/*
* macros performing row/column to pixel y,x translations
* computation is 1-based and depends on the current font's size.
* exception: XTOCOL as defined is 0-based, because that's what its
* clients seem to need.
*/
#define ROWTOY(w,row) ((row-1) * LEADING(w) + ASCENT(w))
#define COLTOX(w,col) ((col-1) * FWIDTH(w))
#define YTOROW(w,y) ((y>0) ? ((y) / LEADING(w) + 1) : ((y) / LEADING(w)))
#define XTOCOL(w,x) (!FWIDTH(w) ? (x) : ((x) / FWIDTH(w)))
#define STDLOCALS(w) \
wcp wc = (w)->context; \
wsp ws = (w)->window; \
wdp wd = ws->display; \
GC stdgc = wc->gc; \
Display *stddpy = wd->display; \
Window stdwin = ws->win; \
Pixmap stdpix = ws->pix;
#endif /* XWindows */
|