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