1/*****************************************************************************/
2/**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
3/**                          Salt Lake City, Utah                           **/
4/**                                                                         **/
5/**                           All Rights Reserved                           **/
6/**                                                                         **/
7/**    Permission to use, copy, modify, and distribute this software and    **/
8/**    its documentation  for  any  purpose  and  without  fee is hereby    **/
9/**    granted, provided that the above copyright notice appear  in  all    **/
10/**    copies and that both  that  copyright  notice  and  this  permis-    **/
11/**    sion  notice appear in supporting  documentation,  and  that  the    **/
12/**    names of Evans & Sutherland not be used in advertising               **/
13/**    in publicity pertaining to distribution of the  software  without    **/
14/**    specific, written prior permission.                                  **/
15/**                                                                         **/
16/**    EVANS & SUTHERLAND AND DISCLAIMS ALL WARRANTIES WITH REGARD          **/
17/**    TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES  OF  MERCHANT-    **/
18/**    ABILITY  AND  FITNESS,  IN  NO  EVENT SHALL EVANS & SUTHERLAND       **/
19/**    BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL  DAMAGES        **/
20/**    OR  ANY DAMAGES WHATSOEVER  RESULTING FROM LOSS OF USE, DATA         **/
21/**    OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER    **/
22/**    TORTIOUS ACTION, ARISING OUT OF OR IN  CONNECTION  WITH  THE  USE    **/
23/**    OR PERFORMANCE OF THIS SOFTWARE.                                     **/
24/*****************************************************************************/
25/*
26
27Portions Copyright 1989, 1998  The Open Group
28
29Permission to use, copy, modify, distribute, and sell this software and its
30documentation for any purpose is hereby granted without fee, provided that
31the above copyright notice appear in all copies and that both that
32copyright notice and this permission notice appear in supporting
33documentation.
34
35The above copyright notice and this permission notice shall be included
36in all copies or substantial portions of the Software.
37
38THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
39OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
40MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
41IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
42OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
43ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
44OTHER DEALINGS IN THE SOFTWARE.
45
46Except as contained in this notice, the name of The Open Group shall
47not be used in advertising or otherwise to promote the sale, use or
48other dealings in this Software without prior written authorization
49from The Open Group.
50
51*/
52
53/***********************************************************************
54 *
55 * twm include file
56 *
57 * 28-Oct-87 Thomas E. LaStrange        File created
58 * 10-Oct-90 David M. Sternlicht        Storing saved colors on root
59 ***********************************************************************/
60
61#ifndef TWM_H
62#define TWM_H
63/* *INDENT-OFF* */
64
65#ifdef HAVE_CONFIG_H
66#include "config.h"
67#endif
68
69#include <X11/Xlib.h>
70#include <X11/Xutil.h>
71#include <X11/cursorfont.h>
72#include <X11/extensions/shape.h>
73#include <X11/Xfuncs.h>
74#include <X11/StringDefs.h>
75#include <X11/Intrinsic.h>
76
77#ifndef APP_NAME
78#define APP_NAME "twm"
79#endif
80
81#ifndef APP_CLASS
82#define APP_CLASS "twm"
83#endif
84
85#ifndef APP_VERSION
86#define APP_VERSION "unknown"
87#endif
88
89#ifndef DATADIR
90#define DATADIR "/usr/local/share"
91#endif
92
93#ifndef XVENDORNAME
94#define XVENDORNAME "The X.Org Foundation"
95#endif
96
97#ifndef WithdrawnState
98#define WithdrawnState 0
99#endif
100
101#define PIXEL_ALREADY_TYPEDEFED /* for Xmu/Drawing.h */
102
103#define BW 2                    /* border width */
104#define BW2 4                   /* border width  * 2 */
105
106#ifndef TRUE
107#define TRUE    1
108#define FALSE   0
109#endif
110
111#define NULLSTR ((char *) NULL)
112
113#define MAX_BUTTONS     16      /* max mouse buttons supported */
114
115/* info strings defines */
116#define INFO_LINES 30
117#define INFO_SIZE 200
118
119/* contexts for button presses */
120#define C_NO_CONTEXT    -1
121#define C_WINDOW        0
122#define C_TITLE         1
123#define C_ICON          2
124#define C_ROOT          3
125#define C_FRAME         4
126#define C_ICONMGR       5
127#define C_NAME          6
128#define C_IDENTIFY      7
129#define NUM_CONTEXTS    8
130
131#define C_WINDOW_BIT    (1 << C_WINDOW)
132#define C_TITLE_BIT     (1 << C_TITLE)
133#define C_ICON_BIT      (1 << C_ICON)
134#define C_ROOT_BIT      (1 << C_ROOT)
135#define C_FRAME_BIT     (1 << C_FRAME)
136#define C_ICONMGR_BIT   (1 << C_ICONMGR)
137#define C_NAME_BIT      (1 << C_NAME)
138
139#define C_ALL_BITS      (C_WINDOW_BIT | C_TITLE_BIT | C_ICON_BIT |\
140                         C_ROOT_BIT | C_FRAME_BIT | C_ICONMGR_BIT)
141
142/* modifiers for button presses */
143#define MOD_SIZE        ((ShiftMask | ControlMask | Mod1Mask \
144                          | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask) + 1)
145
146#define TITLE_BAR_SPACE         1       /* 2 pixel space bordering chars */
147#define TITLE_BAR_FONT_HEIGHT   15      /* max of 15 pixel high chars */
148#define TITLE_BAR_HEIGHT        (TITLE_BAR_FONT_HEIGHT+(2*TITLE_BAR_SPACE))
149
150/* defines for zooming/unzooming */
151#define ZOOM_NONE 0
152
153#define FB(fix_fore, fix_back)\
154    Gcv.foreground = fix_fore;\
155    Gcv.background = fix_back;\
156    XChangeGC(dpy, Scr->NormalGC, GCForeground|GCBackground,&Gcv)
157
158typedef struct MyFont {
159    const char *name;           /* name of the font */
160    XFontStruct *font;          /* font structure */
161    XFontSet fontset;           /* fontset structure */
162    int height;                 /* height of the font */
163    int y;                      /* Y coordinate to draw characters */
164    int ascent;
165    int descent;
166} MyFont;
167
168typedef struct ColorPair {
169    Pixel fore, back;
170} ColorPair;
171
172typedef struct _TitleButton {
173    struct _TitleButton *next;  /* next link in chain */
174    const char *name;           /* bitmap name in case of deferral */
175    Pixmap bitmap;              /* image to display in button */
176    int srcx, srcy;             /* from where to start copying */
177    unsigned int width, height; /* size of pixmap */
178    int dstx, dsty;             /* to where to start copying */
179    int func;                   /* function to execute */
180    const char *action;         /* optional action arg */
181    struct MenuRoot *menuroot;  /* menu to pop on F_MENU */
182    Bool rightside;             /* t: on right, f: on left */
183} TitleButton;
184
185typedef struct _TBWindow {
186    Window window;              /* which window in this frame */
187    TitleButton *info;          /* description of this window */
188} TBWindow;
189
190typedef struct _SqueezeInfo {
191    int justify;                /* left, center, right */
192    int num;                    /* signed pixel count or numerator */
193    int denom;                  /* 0 for pix count or denominator */
194} SqueezeInfo;
195
196#define J_LEFT                  1
197#define J_CENTER                2
198#define J_RIGHT                 3
199
200/* Colormap window entry for each window in WM_COLORMAP_WINDOWS
201 * ICCCM property.
202 */
203typedef struct TwmColormap {
204    Colormap c;                 /* Colormap id */
205    int state;                  /* install(ability) state */
206    unsigned long install_req;  /* request number which installed it */
207    Window w;                   /* window causing load of color table */
208    int refcnt;
209} TwmColormap;
210
211#define CM_INSTALLABLE          1
212#define CM_INSTALLED            2
213#define CM_INSTALL              4
214
215typedef struct ColormapWindow {
216    Window w;                   /* Window id */
217    TwmColormap *colormap;      /* Colormap for this window */
218    int visibility;             /* Visibility of this window */
219    int refcnt;
220} ColormapWindow;
221
222typedef struct Colormaps {
223    ColormapWindow **cwins;     /* current list of colormap windows */
224    int number_cwins;           /* number of elements in current list */
225    char *scoreboard;           /* conflicts between installable colortables */
226} Colormaps;
227
228#define ColormapsScoreboardLength(cm) (size_t)((cm)->number_cwins * \
229                                               ((cm)->number_cwins - 1) / 2)
230
231/* for each window that is on the display, one of these structures
232 * is allocated and linked into a list
233 */
234typedef struct TwmWindow {
235    struct TwmWindow *next;     /* next twm window */
236    struct TwmWindow *prev;     /* previous twm window */
237    Window w;                   /* the child window */
238    int old_bw;                 /* border width before reparenting */
239    Window frame;               /* the frame window */
240    Window title_w;             /* the title bar window */
241    Window hilite_w;            /* the hilite window */
242    Pixmap gray;
243    Window icon_w;              /* the icon window */
244    Window icon_bm_w;           /* the icon bitmap window */
245    int frame_x;                /* x position of frame */
246    int frame_y;                /* y position of frame */
247    int frame_width;            /* width of frame */
248    int frame_height;           /* height of frame */
249    int frame_bw;               /* borderwidth of frame */
250    int title_x;
251    int title_y;
252    int icon_x;                 /* icon text x coordinate */
253    int icon_y;                 /* icon text y coordinate */
254    int icon_w_width;           /* width of the icon window */
255    int icon_w_height;          /* height of the icon window */
256    int icon_width;             /* width of the icon bitmap */
257    int icon_height;            /* height of the icon bitmap */
258    int title_height;           /* height of the title bar */
259    int title_width;            /* width of the title bar */
260    char *full_name;            /* full name of the window */
261    char *name;                 /* name of the window */
262    char *icon_name;            /* name of the icon */
263    int name_width;             /* width of name text */
264    int highlightx;             /* start of highlight window */
265    int rightx;                 /* start of right buttons */
266    XWindowAttributes attr;     /* the child window attributes */
267    XSizeHints hints;           /* normal hints */
268    XWMHints *wmhints;          /* WM hints */
269    Window group;               /* group ID */
270    XClassHint xclass;
271    struct WList *list;
272    /***********************************************************************
273     * color definitions per window
274     **********************************************************************/
275    Pixel border;               /* border color */
276    Pixel icon_border;          /* border color */
277    ColorPair border_tile;
278    ColorPair title;
279    ColorPair iconc;
280    short iconified;            /* has the window ever been iconified? */
281    short icon;                 /* is the window an icon now ? */
282    short icon_on;              /* is the icon visible */
283    short mapped;               /* is the window mapped ? */
284    short auto_raise;           /* should we auto-raise this window ? */
285    short forced;               /* has had an icon forced upon it */
286    short icon_not_ours;        /* icon pixmap or window supplied to us */
287    short icon_moved;           /* user explicitly moved the icon */
288    short highlight;            /* should highlight this window */
289    short stackmode;            /* honor stackmode requests */
290    short iconify_by_unmapping; /* unmap window to iconify it */
291    short iconmgr;              /* this is an icon manager window */
292    short transient;            /* this is a transient window */
293    Window transientfor;        /* window contained in XA_XM_TRANSIENT_FOR */
294    short titlehighlight;       /* should I highlight the title bar */
295    struct IconMgr *iconmgrp;   /* pointer to it if this is an icon manager */
296    int save_frame_x;           /* x position of frame */
297    int save_frame_y;           /* y position of frame */
298    int save_frame_width;       /* width of frame */
299    int save_frame_height;      /* height of frame */
300    short zoomed;               /* is the window zoomed? */
301    short wShaped;              /* this window has a bounding shape */
302    unsigned long protocols;    /* which protocols this window handles */
303    Colormaps cmaps;            /* colormaps for this application */
304    TBWindow *titlebuttons;
305    SqueezeInfo *squeeze_info;  /* should the title be squeezed? */
306    struct {
307        struct TwmWindow *next, *prev;
308        Bool cursor_valid;
309        int curs_x, curs_y;
310    } ring;
311
312    Bool nameChanged;           /* did WM_NAME ever change? */
313
314    /* did the user ever change the width/height? {yes, no, or unknown} */
315
316    Bool widthEverChangedByUser;
317    Bool heightEverChangedByUser;
318
319} TwmWindow;
320
321typedef struct TWMWinConfigEntry {
322    struct TWMWinConfigEntry *next;
323    int tag;
324    char *client_id;
325    char *window_role;
326    XClassHint xclass;
327    char *wm_name;
328    int wm_command_count;
329    char **wm_command;
330    short x, y;
331    unsigned short width, height;
332    short icon_x, icon_y;
333    Bool iconified;
334    Bool icon_info_present;
335    Bool width_ever_changed_by_user;
336    Bool height_ever_changed_by_user;
337} TWMWinConfigEntry;
338
339#define DoesWmTakeFocus         (1L << 0)
340#define DoesWmSaveYourself      (1L << 1)
341#define DoesWmDeleteWindow      (1L << 2)
342
343#define TBPM_DOT ":dot"         /* name of titlebar pixmap for dot */
344#define TBPM_ICONIFY ":iconify" /* same image as dot */
345#define TBPM_RESIZE ":resize"   /* name of titlebar pixmap for resize button */
346#define TBPM_XLOGO ":xlogo"     /* name of titlebar pixmap for xlogo */
347#define TBPM_DELETE ":delete"   /* same image as xlogo */
348#define TBPM_MENU ":menu"       /* name of titlebar pixmap for menus */
349#define TBPM_QUESTION ":question"       /* name of unknown titlebar pixmap */
350
351#include <X11/Xosdefs.h>
352#include <stdlib.h>
353extern void CreateFonts(void);
354extern void RestoreWithdrawnLocation(TwmWindow *tmp);
355extern void Reborder(Time time);
356extern void
357Done(XtPointer, XtSignalId *) _X_NORETURN;
358extern void
359ComputeCommonTitleOffsets(void);
360extern void
361ComputeTitleLocation(TwmWindow *tmp);
362extern void
363ComputeWindowTitleOffsets(TwmWindow *tmp_win, int width, Bool squeeze);
364extern char *ProgramName;
365extern Display *dpy;
366extern Window ResizeWindow;     /* the window we are resizing */
367extern int HasShape;            /* this server supports Shape extension */
368extern int HasSync;             /* this server supports SYNC extension */
369
370#ifdef HAVE_XRANDR
371extern int HasXrandr;           /* this server supports Xrandr extension */
372#endif
373
374extern int PreviousScreen;
375
376extern Cursor UpperLeftCursor;
377extern Cursor RightButt;
378extern Cursor MiddleButt;
379extern Cursor LeftButt;
380
381extern XClassHint NoClass;
382
383extern XContext TwmContext;
384extern XContext MenuContext;
385extern XContext IconManagerContext;
386extern XContext ScreenContext;
387extern XContext ColormapContext;
388
389extern const char *Home;
390extern int HomeLen;
391extern int ParseError;
392
393extern int HandlingEvents;
394
395extern XGCValues Gcv;
396extern int InfoLines;
397extern char Info[][INFO_SIZE];
398extern int Argc;
399extern char **Argv;
400extern void
401NewFontCursor(Cursor *cp, const char *str);
402extern void
403NewBitmapCursor(Cursor *cp, char *source, char *mask);
404extern Pixmap
405CreateMenuIcon(int height, unsigned int *widthp, unsigned int *heightp);
406
407extern void twmError(const char *, ...) _X_ATTRIBUTE_PRINTF(1,2) _X_NORETURN;
408extern void twmWarning(const char *, ...) _X_ATTRIBUTE_PRINTF(1,2);
409extern void twmVerbose(const char *, ...) _X_ATTRIBUTE_PRINTF(1,2);
410extern void twmMessage(const char *, ...) _X_ATTRIBUTE_PRINTF(1,2);
411
412extern Bool ErrorOccurred;
413extern XErrorEvent LastErrorEvent;
414
415#define ResetError() (ErrorOccurred = False)
416
417extern Bool RestartPreviousState;
418extern Bool
419GetWMState(Window w, int *statep, Window *iwp);
420
421extern void parseWarning(const char *, ...) _X_ATTRIBUTE_PRINTF(1,2);
422
423extern Atom TwmAtoms[];
424
425extern int message_level;
426extern Bool use_fontset;
427
428extern int ShapeEventBase;
429extern int ShapeErrorBase;
430
431#ifdef HAVE_XRANDR
432extern int XrandrEventBase;
433extern int XrandrErrorBase;
434#endif
435
436#define _XA_MIT_PRIORITY_COLORS         TwmAtoms[0]
437#define _XA_WM_CHANGE_STATE             TwmAtoms[1]
438#define _XA_WM_STATE                    TwmAtoms[2]
439#define _XA_WM_COLORMAP_WINDOWS         TwmAtoms[3]
440#define _XA_WM_PROTOCOLS                TwmAtoms[4]
441#define _XA_WM_TAKE_FOCUS               TwmAtoms[5]
442#define _XA_WM_SAVE_YOURSELF            TwmAtoms[6]
443#define _XA_WM_DELETE_WINDOW            TwmAtoms[7]
444#define _XA_SM_CLIENT_ID                TwmAtoms[8]
445#define _XA_WM_CLIENT_LEADER            TwmAtoms[9]
446#define _XA_WM_WINDOW_ROLE              TwmAtoms[10]
447
448/* *INDENT-ON* */
449#endif /* TWM_H */
450