1 /*
2  *       Copyright 1988 by Evans & Sutherland Computer Corporation,
3  *                          Salt Lake City, Utah
4  *  Portions Copyright 1989 by the Massachusetts Institute of Technology
5  *                        Cambridge, Massachusetts
6  *
7  * $XConsortium: twm.h,v 1.74 91/05/31 17:38:30 dave Exp $
8  *
9  * twm include file
10  *
11  * 28-Oct-87 Thomas E. LaStrange        File created
12  * 10-Oct-90 David M. Sternlicht        Storeing saved colors on root
13  *
14  * Copyright 1992 Claude Lecommandeur.
15  */
16 #ifndef _CTWM_CTWM_H
17 #define _CTWM_CTWM_H
18 
19 /*
20  * Include config first, before anything else.  Including ctwm.h should
21  * be the first action of any of our files, so this happens before
22  * ANYthing else, anywhere.
23  */
24 #include "ctwm_config.h"
25 
26 #ifdef DMALLOC
27 #include <dmalloc.h>
28 #endif
29 
30 #include <stdbool.h>
31 
32 /*
33  * Intrinsic.h is needed for at least the Pixel type, which we use in
34  * this file.  And Intrinsic.h (always?) implicitly brings in Xlib.h
35  * anyway.
36  */
37 //#include <X11/Xlib.h>
38 #include <X11/Intrinsic.h>
39 
40 #include "types.h"
41 #ifdef EWMH
42 #include "ewmh.h"
43 #endif
44 
45 /*
46  * This appears to be the standard way of testing this for portability,
47  * though calling it GNUC is sorta non-portable portability   :)
48  */
49 #ifndef __GNUC__
50 #define  __attribute__(x)  /*NOTHING*/
51 #endif
52 
53 /* signal(3) handlers have been void since c89 */
54 #define SIGNAL_T void
55 
56 #define BW 2                    /* border width */
57 #define BW2 4                   /* border width  * 2 */
58 
59 #define MAX_BUTTONS     11      /* max mouse buttons supported */
60 
61 /* contexts for button presses */
62 #define Alt1Mask        (1<<8)
63 #define Alt2Mask        (1<<9)
64 #define Alt3Mask        (1<<10)
65 #define Alt4Mask        (1<<11)
66 #define Alt5Mask        (1<<12)
67 
68 #define C_NO_CONTEXT    -1
69 #define C_WINDOW        0
70 #define C_TITLE         1
71 #define C_ICON          2
72 #define C_ROOT          3
73 #define C_FRAME         4
74 #define C_ICONMGR       5
75 #define C_NAME          6
76 #define C_IDENTIFY      7
77 #define C_ALTERNATE     8
78 #define C_WORKSPACE     9
79 #define NUM_CONTEXTS    10
80 
81 #define C_WINDOW_BIT    (1 << C_WINDOW)
82 #define C_TITLE_BIT     (1 << C_TITLE)
83 #define C_ICON_BIT      (1 << C_ICON)
84 #define C_ROOT_BIT      (1 << C_ROOT)
85 #define C_FRAME_BIT     (1 << C_FRAME)
86 #define C_ICONMGR_BIT   (1 << C_ICONMGR)
87 #define C_NAME_BIT      (1 << C_NAME)
88 #define C_ALTER_BIT     (1 << C_ALTERNATE)
89 #define C_WORKSPACE_BIT (1 << C_WORKSPACE)
90 
91 #define C_ALL_BITS      (C_WINDOW_BIT | C_TITLE_BIT | C_ICON_BIT |\
92                          C_ROOT_BIT | C_FRAME_BIT | C_ICONMGR_BIT |\
93                          C_WORKSPACE_BIT)
94 
95 /* modifiers for button presses */
96 #define MOD_SIZE        ((ShiftMask | ControlMask | Mod1Mask \
97                           | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask) + 1)
98 
99 /*
100  * Used for TwmWindow.zoomed.  Var holds the number of the function that
101  * caused zooming, if one has, else ZOOM_NONE.  This mirror F_NOP
102  * currently, but that's OK, because f.nop doesn't do anything, so it
103  * can't be a real cause of zooming.
104  */
105 #define ZOOM_NONE 0
106 
107 #define FBF(fix_fore, fix_back, fix_font)\
108     Gcv.foreground = fix_fore;\
109     Gcv.background = fix_back;\
110     Gcv.font = fix_font;\
111     XChangeGC(dpy, Scr->NormalGC, GCFont|GCForeground|GCBackground,&Gcv)
112 
113 #define FB(fix_fore, fix_back)\
114     Gcv.foreground = fix_fore;\
115     Gcv.background = fix_back;\
116     XChangeGC(dpy, Scr->NormalGC, GCForeground|GCBackground,&Gcv)
117 
118 #define MaxSize(a, b)  (((a) < (b)) ? (b) : (a))
119 #define MinSize(a, b)  (((a) > (b)) ? (b) : (a))
120 
121 struct MyFont {
122 	char       *basename;       /* name of the font */
123 	XFontSet    font_set;
124 	int         ascent;
125 	int         descent;
126 	int         height;         /* height of the font */
127 	int         y;              /* Y coordinate to draw characters */
128 	/* Average height, maintained using the extra two auxiliary fields.  */
129 	unsigned int avg_height;
130 	float       avg_fheight;
131 	unsigned int avg_count;
132 };
133 
134 struct ColorPair {
135 	Pixel fore, back, shadc, shadd;
136 };
137 
138 struct TitleButtonFunc {
139 	struct TitleButtonFunc *next;  /* next in the list of function buttons */
140 	int num;                       /* button number */
141 	int mods;                      /* modifiers */
142 	int func;                      /* function to execute */
143 	char *action;                  /* optional action arg */
144 	struct MenuRoot *menuroot;     /* menu to pop on F_MENU */
145 };
146 
147 struct TitleButton {
148 	struct TitleButton *next;           /* next link in chain */
149 	char *name;                         /* bitmap name in case of deferal */
150 	Image *image;                       /* image to display in button */
151 	int srcx, srcy;                     /* from where to start copying */
152 	unsigned int width, height;         /* size of pixmap */
153 	int dstx, dsty;                     /* to where to start copying */
154 	bool rightside;                     /* t: on right, f: on left */
155 	TitleButtonFunc *funs;              /* funcs assoc'd to each button */
156 };
157 
158 struct TBWindow {
159 	Window window;                      /* which window in this frame */
160 	Image *image;                       /* image to display in button */
161 	TitleButton *info;                  /* description of this window */
162 };
163 
164 
165 typedef enum {
166 	SIJ_LEFT,
167 	SIJ_CENTER,
168 	SIJ_RIGHT,
169 } SIJust;
170 
171 struct SqueezeInfo {
172 	SIJust justify;
173 	int num;                            /* signed pixel count or numerator */
174 	int denom;                          /* 0 for pix count or denominator */
175 };
176 
177 
178 /*
179  * Type for IconRegion alignment and config entries relating
180  *
181  * Misspeelt for hysterical raisins
182  */
183 typedef enum {
184 	IRA_UNDEF,
185 	IRA_TOP,
186 	IRA_CENTER,
187 	IRA_BOTTOM,
188 	IRA_BORDER,
189 } IRAlignement;
190 
191 /*
192  * Justification for title stuff.  Window titles (TitleJustification),
193  * icon titles (IconJustification).  _Not_ the same as for
194  * IconRegionJustification.
195  */
196 typedef enum {
197 	TJ_UNDEF,
198 	TJ_LEFT,
199 	TJ_CENTER,
200 	TJ_RIGHT,
201 } TitleJust;
202 
203 /*
204  * And IconRegion Justification's.
205  */
206 typedef enum {
207 	IRJ_UNDEF,
208 	IRJ_LEFT,
209 	IRJ_CENTER,
210 	IRJ_RIGHT,
211 	IRJ_BORDER,
212 } IRJust;
213 
214 
215 /*
216  * Gravity used by IconRegion and WindowRegion.  Strictly, there should
217  * probably be separate vertical/horizontal types, but it'll take some
218  * nontrivial code reshuffling to make that possible because of how the
219  * values are used in the split* functions.
220  */
221 typedef enum {
222 	GRAV_NORTH,
223 	GRAV_EAST,
224 	GRAV_SOUTH,
225 	GRAV_WEST,
226 } RegGravity;
227 
228 
229 /* RandomPlacement bits */
230 typedef enum {
231 	RP_OFF,
232 	RP_ALL,
233 	RP_UNMAPPED,
234 } RandPlac;
235 
236 /* UsePPosition */
237 typedef enum {
238 	PPOS_OFF,
239 	PPOS_ON,
240 	PPOS_NON_ZERO,
241 	/*
242 	 * may eventually want an option for having the PPosition be the
243 	 * initial location for the drag lines.
244 	 */
245 } UsePPoss;
246 
247 
248 /* Colormap window entry for each window in WM_COLORMAP_WINDOWS
249  * ICCCM property.
250  */
251 struct TwmColormap {
252 	Colormap c;                 /* Colormap id */
253 	int state;                  /* install(ability) state */
254 	unsigned long install_req;  /* request number which installed it */
255 	Window w;                   /* window causing load of color table */
256 	int refcnt;
257 };
258 
259 /* TwmColormap.state bit definitions */
260 #define CM_INSTALLABLE          1
261 #define CM_INSTALLED            2
262 #define CM_INSTALL              4
263 
264 
265 struct ColormapWindow {
266 	Window w;                   /* Window id */
267 	TwmColormap *colormap;      /* Colormap for this window */
268 	int visibility;             /* Visibility of this window */
269 	int refcnt;
270 };
271 
272 struct Colormaps {
273 	ColormapWindow **cwins;     /* current list of colormap windows */
274 	int number_cwins;           /* number of elements in current list */
275 	char *scoreboard;           /* conflicts between installable colortables */
276 };
277 
278 #define ColormapsScoreboardLength(cm) ((cm)->number_cwins * \
279                                        ((cm)->number_cwins - 1) / 2)
280 
281 struct WindowRegion {
282 	struct WindowRegion *next;
283 	int                 x, y, w, h;
284 	RegGravity          grav1, grav2;
285 	name_list           *clientlist;
286 	struct WindowEntry  *entries;
287 };
288 
289 struct WindowEntry {
290 	struct WindowEntry  *next;
291 	int                 x, y, w, h;
292 	struct TwmWindow    *twm_win;
293 	bool                used;
294 };
295 
296 struct WindowBox {
297 	struct WindowBox    *next;
298 	char                *name;
299 	char                *geometry;
300 	name_list           *winlist;
301 	Window              window;
302 	struct TwmWindow    *twmwin;
303 };
304 
305 
306 /*
307  * Pull in struct TwmWindow.  Moved to a separate file to ease scanning
308  * through both it and the other stuff in here.
309  */
310 #include "twm_window_struct.h"
311 
312 
313 /* Flags for TwmWindow.protocols */
314 #define DoesWmTakeFocus         (1L << 0)
315 #define DoesWmSaveYourself      (1L << 1)
316 #define DoesWmDeleteWindow      (1L << 2)
317 
318 
319 void Reborder(Time tim);
320 SIGNAL_T Done(int signum) __attribute__((noreturn));
321 void CreateFonts(ScreenInfo *scr);
322 
323 void RestoreWithdrawnLocation(TwmWindow *tmp);
324 extern char *ProgramName;
325 extern Display *dpy;
326 extern XtAppContext appContext;
327 extern Window ResizeWindow;     /* the window we are resizing */
328 extern bool HasShape;           /* this server supports Shape extension */
329 extern int ShapeEventBase, ShapeErrorBase;
330 
331 extern int PreviousScreen;
332 
333 extern Cursor UpperLeftCursor;
334 extern Cursor RightButt;
335 extern Cursor MiddleButt;
336 extern Cursor LeftButt;
337 
338 extern XClassHint NoClass;
339 
340 extern XContext TwmContext;
341 extern XContext MenuContext;
342 extern XContext ScreenContext;
343 extern XContext ColormapContext;
344 
345 extern char *Home;
346 extern int HomeLen;
347 
348 extern bool HandlingEvents;
349 extern Cursor TopCursor, TopLeftCursor, LeftCursor, BottomLeftCursor,
350        BottomCursor, BottomRightCursor, RightCursor, TopRightCursor;
351 
352 /* Junk vars; see comment in ctwm.c about usage */
353 extern Window JunkRoot, JunkChild;
354 extern int JunkX, JunkY;
355 extern unsigned int JunkWidth, JunkHeight, JunkBW, JunkDepth, JunkMask;
356 
357 extern XGCValues Gcv;
358 extern int Argc;
359 extern char **Argv;
360 
361 extern bool RestartPreviousState;
362 
363 extern bool RestartFlag;        /* Flag that is set when SIGHUP is caught */
364 void DoRestart(Time t);         /* Function to perform a restart */
365 
366 #define OCCUPY(w, b) ((b == NULL) ? 1 : (w->occupation & (1 << b->number)))
367 
368 
369 /*
370  * Command-line arg handling bits
371  */
372 typedef struct _ctwm_cl_args {
373 	bool   MultiScreen;        // ! --single, grab multiple screens
374 	bool   Monochrome;         // --mono, force monochrome
375 	bool   cfgchk;             // --cfgchk, check config and exit
376 	char  *InitFile;           // --file, config filename
377 	char  *display_name;       // --display, X server display
378 
379 	bool   PrintErrorMessages; // --verbose, show more debug output
380 	bool   ShowWelcomeWindow;  // ! --nowelcome, show splash screen
381 
382 	bool   is_captive;         // --window (flag), running captive
383 	Window capwin;             // --window (arg), existing window to capture
384 	char  *captivename;        // --name, captive name
385 
386 #ifdef USEM4
387 	bool   KeepTmpFile;        // --keep-defs, keep generated m4 defs
388 	char  *keepM4_filename;    // --keep, keep m4 post-processed output
389 	bool   GoThroughM4;        // ! --nom4, do m4 processing
390 #endif
391 
392 #ifdef EWMH
393 	bool   ewmh_replace;       // --replace, replacing running WM
394 #endif
395 
396 	char  *client_id;          // --clientId, session client id
397 	char  *restore_filename;   // --restore, session filename
398 } ctwm_cl_args;
399 extern ctwm_cl_args CLarg;
400 
401 
402 #endif /* _CTWM_CTWM_H */
403