screen.h revision df1c27a6
1/*
2 * twm per-screen data include file
3 *
4 *
5 * Copyright 1989 Massachusetts Institute of Technology
6 *
7 * $XConsortium: screen.h,v 1.62 91/05/01 17:33:09 keith Exp $
8 *
9 * 11-3-88 Dave Payne, Apple Computer                   File created
10 *
11 * Copyright 1992 Claude Lecommandeur.
12 */
13
14#ifndef _CTWM_SCREEN_H
15#define _CTWM_SCREEN_H
16
17/* Needed for doxygen to get at the #define's for config (like EMWH) */
18#ifdef DOXYGEN
19# include "ctwm_config.h"
20#endif
21
22#include "menus.h"  // embedded MouseButton/Func{Button,Key}
23#include "workspace_structs.h"  // embedded ScreenInfo.workSpaceMgr
24
25
26/**
27 * Type for iconification styles.  Options correspond to the values in
28 * IconifyStyle config var.  \sa ScreenInfo.IconifyStyle   \todo Maybe
29 * should just be moved inline in ScreenInfo struct, since it's never
30 * directly used elsewhere.
31 */
32typedef enum {
33	ICONIFY_NORMAL,
34	ICONIFY_MOSAIC,
35	ICONIFY_ZOOMIN,
36	ICONIFY_ZOOMOUT,
37	ICONIFY_FADE,
38	ICONIFY_SWEEP,
39} IcStyle;
40
41
42/**
43 * Information about some XStandardColormap we're using.  See Xlib docs
44 * for details.
45 */
46struct StdCmap {
47	struct StdCmap *next;               /* next link in chain */
48	Atom atom;                          /* property from which this came */
49	int nmaps;                          /* number of maps below */
50	XStandardColormap *maps;            /* the actual maps */
51};
52
53
54/**
55 * Internal padding in the size window.  \sa ScreenInfo.SizeWindow
56 * \todo Possibly these should be in another header...
57 */
58#define SIZE_HINDENT 10
59#define SIZE_VINDENT 2  ///< \copydoc #SIZE_HINDENT
60
61
62/**
63 * Stash for memoizing various pixmaps used in titlebars.
64 * \sa the TBPM_* constants in image.h
65 * \todo This probably doesn't need to live on its own, since it only
66 * exists to define a member in the ScreenInfo struct.  Maybe it should
67 * just be moved to being defined nested in there...
68 */
69struct TitlebarPixmaps {
70	Pixmap xlogo;    ///< #TBPM_XLOGO
71	Pixmap resize;   ///< #TBPM_RESIZE
72	Pixmap question; ///< #TBPM_QUESTION
73	Pixmap menu;     ///< #TBPM_MENU
74	Pixmap delete;   ///< #TBPM_DOT
75};
76
77
78/**
79 * Info and control for each X Screen we control.
80 *
81 * We start up on an X Display (e.g., ":0"), and by default try to take
82 * over each X Screen on that display (e.g, ":0.0", ":0.1", ...).  Each
83 * of those Screens will have its own ScreenInfo.
84 *
85 * This contains pure physical or X info (size, coordinates, color
86 * depth), ctwm info (lists of windows on it, window rings, how it fits
87 * with other Screens we control), most of the config file settings which
88 * may differ from Screen to Screen, menus, special windows (Occupy,
89 * Identify, etc), and piles of other stuff.
90 *
91 * \note
92 * Possibly this should be broken up somewhat.  e.g., much of the
93 * config-related bits pulled out into their own structure, which could
94 * allow decoupling the config parsing from the X screens a bit.
95 */
96struct ScreenInfo {
97	int screen;       ///< Which screen (i.e., the x after the dot in ":0.x")
98
99	int d_depth;      ///< Copy of DefaultDepth(dpy, screen)
100	Visual *d_visual; ///< Copy of DefaultVisual(dpy, screen)
101	int Monochrome;   ///< Is the display monochrome?
102
103	/**
104	 * The x coordinate of the root window relative to RealRoot.  This is
105	 * usually 0, except in the case of captive mode where it shows where
106	 * we are on the real screen, or when we have VirtualScreens and are
107	 * positioning our real Screens on a virtual RealRoot.
108	 */
109	int rootx;
110	/// The y coordinate of the root window relative to RealRoot.
111	/// \copydetails rootx
112	int rooty;
113
114	int rootw; ///< Copy of DisplayWidth(dpy, screen)
115	int rooth; ///< Copy of DisplayHeight(dpy, screen)
116
117	int mm_w;  ///< Physical mm width of the root
118	int mm_h;  ///< Physical mm height of the root
119
120#ifdef CAPTIVE
121	/**
122	 * \defgroup scr_captive_bits Captive ctwm bits
123	 * These are various fields related to running a captive ctwm (i.e.,
124	 * with \--window).  They'll generally be empty for non-captive
125	 * invocations, or describe our position inside the "outside" world
126	 * if we are.
127	 * @{
128	 */
129	/// The name of the captive root window if any.  Autogen'd or set
130	/// with \--name
131	char *captivename;
132	/// The x coordinate of the captive root window if any.
133	int crootx;
134	/// The y coordinate of the captive root window if any.
135	int crooty;
136	/// Initially copy of DisplayWidth(dpy, screen).  See also
137	/// ConfigureCaptiveRootWindow()
138	int crootw;
139	/// Initially copy of DisplayHeight(dpy, screen).
140	/// \copydetails crootw
141	int crooth;
142	/// @}
143#endif
144
145	int MaxWindowWidth;   ///< Largest window width to allow
146	int MaxWindowHeight;  ///< Largest window height to allow
147
148	/// The head of the screen's twm window list.  This is used for
149	/// places where we need to iterate over the TwmWindow's in a single
150	/// Screen, by following the TwmWindow.next pointers.
151	TwmWindow *FirstWindow;
152
153	Colormaps RootColormaps;  ///< The colormaps of the root window
154
155
156	/**
157	 * \defgroup scr_roots Various root and pseudo-root Windows.
158	 * These are the various forms of root and almost-root windows that
159	 * things on this Screen reside in.  It's probable that there's a lot
160	 * of confusion of these, and they get set, reset, and used
161	 * incorrectly in a lot of places.  We mostly get away with it
162	 * because in normal usage, they're often all identical.
163	 *
164	 * \verbatim
165	 *
166	 *  +--RealRoot-----------------------------------------------------------+
167	 *  | the root of the display (most uses of this are probably incorrect!) |
168	 *  |                                                                     |
169	 *  |   +--CaptiveRoot--------------------------------------------------+ |
170	 *  |   | when captive window is used (most uses are likely incorrect!) | |
171	 *  |   |                                                               | |
172	 *  |   | +--XineramaRoot---------------------------------------------+ | |
173	 *  |   | | the root that encompasses all virtual screens             | | |
174	 *  |   | |                                                           | | |
175	 *  |   | | +--Root-----------+ +--Root--------+ +--Root------------+ | | |
176	 *  |   | | | one or more     | | Most cases   | |                  | | | |
177	 *  |   | | | virtual screens | | use Root.    | |                  | | | |
178	 *  |   | | |                 | |              | |                  | | | |
179	 *  |   | | |                 | |              | |                  | | | |
180	 *  |   | | +-----------------+ +--------------+ +------------------+ | | |
181	 *  |   | +-----------------------------------------------------------+ | |
182	 *  |   +---------------------------------------------------------------+ |
183	 *  +---------------------------------------------------------------------+
184	 * \endverbatim
185	 *
186	 * @{
187	 */
188
189	/**
190	 * Root window for the current vscreen.  Initially either the real X
191	 * RootWindow(), or the existing or created Window for a captive
192	 * ctwm.  Gets reset to a vscreen's window in InitVirtualScreens().
193	 */
194	Window Root;
195
196	/**
197	 * Root window holding our vscreens.  Initialized to the same value
198	 * as ScreenInfo.Root, and isn't changed afterward.
199	 */
200	Window XineramaRoot;
201#ifdef CAPTIVE
202	/// The captive root window, if any, or None
203	Window CaptiveRoot;
204#endif
205	/// The actual X root window of the display.  This is always X's
206	/// RootWindow().
207	Window RealRoot;
208	/// @}
209
210	/// Layout of our roow window and monitor(s).
211	RLayout *Layout;
212	/// Layout taking into account Border{Top,Left,Right,Bottom} config
213	/// params.
214	RLayout *BorderedLayout;
215
216	/**
217	 * Dimensions/coordinates window.  This is the small window (usually
218	 * in the upper left of the screen, unless
219	 * ScreenInfo.CenterFeedbackWindow is set) that shows
220	 * dimensions/coordinates for resize/move operations.
221	 */
222	Window SizeWindow;
223
224	/**
225	 * Window info window.  This is the window that pops up with the
226	 * various information when you f.identify a window, and also the
227	 * truncated version of that that f.version pulls up.
228	 */
229	struct _InfoWindow {
230		Window       win;          ///< Actual X window
231		bool         mapped;       ///< Whether it's currently up
232		int          lines;        ///< Current number of lines
233		unsigned int width;        ///< Current size
234		unsigned int height;       ///< Current size
235	} InfoWindow; ///< \copydoc ScreenInfo::_InfoWindow
236	/*
237	 * Naming this struct type is pointless, but necessary for doxygen to
238	 * not barf on it.  The copydoc is needed so the desc shows up in the
239	 * ScreenInfo docs as well as the struct's own.
240	 */
241
242	/**
243	 * \defgroup scr_maskwin Screen masking window stuff
244	 * These are bits for a window that covers up everything on the
245	 * screen during startup if we're showing the "Welcome window"
246	 * splash screen.  That is, if ScreenInfo.ShowWelcomeWindow is true.
247	 * @{
248	 */
249	/// Startup splash screen masking window if
250	/// ScreenInfo.ShowWelcomeWindow
251	Window WindowMask;
252	/// Utility window for animated icons
253	Window ShapeWindow;
254	/// Image to show on ScreenInfo.WindowMask
255	Image *WelcomeImage;
256	/// GC for drawing ScreenInfo.WelcomeImage on ScreenInfo.WindowMask
257	GC     WelcomeGC;
258	/// Colormap for ScreenInfo.WindowMask
259	Colormap WelcomeCmap;
260	/// @}
261
262	name_list *ImageCache;  ///< Cached pixmaps used in image loading
263	TitlebarPixmaps tbpm;   ///< Memoized titlebar pixmaps
264	Image *UnknownImage;    ///< Fallback icon pixmap
265	Pixmap siconifyPm;      ///< In-icon manager iconifed marker pixmap
266	Pixmap pullPm;          ///< In-menu submenu item marker icon
267	unsigned int pullW;     ///< Dimensions of ScreenInfo.pullPm
268	unsigned int pullH;     ///< Dimensions of ScreenInfo.pullPm
269
270	/**
271	 * Name of titlebar focus hilite image if any.  This is an
272	 * alternative to the builtin shading on the titlebar when a window
273	 * has focus.  See Pixmaps config var.
274	 */
275	char *HighlightPixmapName;
276
277	/// \defgroup scr_menu_bits Various menus
278	/// These hold references to the various menus on the Screen.
279	/// @{
280	MenuRoot *MenuList;    ///< Head of the menu list
281	MenuRoot *LastMenu;    ///< Temp var used in creating the Screen's menus
282	MenuRoot *Windows;     ///< f.menu TwmWindows
283	MenuRoot *Icons;       ///< f.menu TwmIcons
284	MenuRoot *Workspaces;  ///< f.menu TwmWorkspaces
285	MenuRoot *AllWindows;  ///< f.menu TwmAllWindows
286
287	/*Added by dl 2004 */
288	MenuRoot *AllIcons;    ///< f.menu TwmAllIcons
289
290	/* Added by Dan Lilliehorn (dl@dl.nu) 2000-02-29)     */
291	MenuRoot *Keys;        ///< f.menu TwmKeys
292	MenuRoot *Visible;     ///< f.menu TwmVisible
293
294	/// @}
295
296	TwmWindow *Ring;       ///< One of the windows in the Screen's ring
297	TwmWindow *RingLeader; ///< Current window in ring
298
299	MouseButton DefaultFunction;   ///< DefaultFunction config var
300	MouseButton WindowFunction;    ///< WindowFunction config var
301	MouseButton ChangeWorkspaceFunction; ///< ChangeWorkspaceFunction config var
302	MouseButton DeIconifyFunction; ///< DeIconifyFunction config var
303	MouseButton IconifyFunction;   ///< IconifyFunction config var
304
305	/// Various colormaps used on the Screen.  These probably have little
306	/// effect in a world where 24bpp is a baseline...
307	struct _cmapInfo {
308		Colormaps *cmaps;  ///< Current list of colormap windows
309		int maxCmaps;      ///< Maximum number of installed colormaps
310		/// seq # for first XInstallColormap() req in pass thru loading a
311		/// colortable list
312		unsigned long first_req;
313		/// current push level to install root colormap windows
314		int root_pushes;
315		/// saved colormaps to install when pushes drops to zero
316		Colormaps *pushed_cmaps;
317	} cmapInfo; ///< \copydoc ScreenInfo::_cmapInfo
318	///< \todo Somebody needs to understand and document this better.
319	// x-ref trailing comment on InfoWindow above
320
321	/**
322	 * Various XStandardColormaps on the screen.  See Xlib documentation
323	 * for XStandardColormaps (e.g.,
324	 * <https://www.x.org/releases/X11R7.7/doc/libX11/libX11/libX11.html#Standard_Colormaps>)
325	 * if you need to make sense of it.
326	 */
327	struct _StdCmapInfo {
328		StdCmap *head;         ///< list of maps
329		StdCmap *tail;         ///< list of maps
330		StdCmap *mru;          ///< Most recently used in list
331		int mruindex;          ///< index of mru in entry
332	} StdCmapInfo; ///< \copydoc ScreenInfo::_StdCmapInfo
333	///< \todo Somebody needs to understand and document this better.
334	// x-ref trailing comment on InfoWindow above
335
336	/**
337	 * Various titlebar buttons that will be put in the window
338	 * decorations for the screen.  This is setup by
339	 * InitTitlebarButtons() and possibly added to via
340	 * Left/RightTitleButton config vars.
341	 * \sa CreateWindowTitlebarButtons() where this gets used to build
342	 * the titlebar of an individual window.
343	 */
344	struct _TBInfo {
345		int nleft;         ///< numbers of buttons on left side
346		int nright;        ///< numbers of buttons on right side
347		TitleButton *head; ///< start of list
348		int border;        ///< button border
349		int pad;           ///< button-padding
350		int width;         ///< width of single button & border
351		int leftx;         ///< start of left buttons
352		int titlex;        ///< start of title
353		int rightoff;      ///< offset back from right edge
354		int titlew;        ///< width of title part
355	} TBInfo; ///< \copydoc ScreenInfo::_TBInfo
356	// x-ref trailing comment on InfoWindow above
357
358	/**
359	 * \defgroup scr_color_bits Various color definitions.
360	 * These define various colors we use for things on the screen.
361	 * They tend to come from things inside a Color {} section in the
362	 * config.  There are often correspondences between the "simple"
363	 * ColorPair or Pixel values (for the "normal" colors of each type)
364	 * and a name_list (for per-window settings of that type).
365	 * @{
366	 */
367	/// Border tile colors.  \sa ScreenInfo.BorderTileForegroundL
368	/// \sa ScreenInfo.BorderTileBackgroundL
369	ColorPair BorderTileC;
370
371	/// Titlebar colors  \sa ScreenInfo.TitleForegroundL
372	/// \sa ScreenInfo.TitleBackgroundL
373	ColorPair TitleC;
374
375	/// Menu colors
376	ColorPair MenuC;
377
378	/// Menu title colors
379	ColorPair MenuTitleC;
380
381	/// %Icon colors.  \sa ScreenInfo.IconForegroundL
382	/// \sa ScreenInfo.IconBackgroundL
383	ColorPair IconC;
384
385	/// %Icon manager colors.  \sa ScreenInfo.IconManagerFL
386	/// \sa ScreenInfo.IconManagerBL
387	ColorPair IconManagerC;
388
389	/// Default colors
390	ColorPair DefaultC;
391
392	/// Color of window borders.  \sa ScreenInfo.BorderColorL
393	ColorPair BorderColorC;
394
395	/// Specialized border colors for windows.  From BorderColor config
396	/// var.  \sa ScreenInfo.BorderColorC
397	name_list *BorderColorL;
398
399	/// Specialized border colors for icons.  From IconBorderColor config
400	/// var.  \sa ScreenInfo.IconBorderColor
401	name_list *IconBorderColorL;
402
403	/// Specialized border coloring.  From BorderTileForeground config
404	/// var.  \sa ScreenInfo.BorderTileC
405	name_list *BorderTileForegroundL;
406
407	/// \copydoc ScreenInfo::BorderTileForegroundL
408	name_list *BorderTileBackgroundL;
409
410	/// Specialized titlebar foreground coloring.  From TitleForeground
411	/// config var.  \sa ScreenInfo.TitleC
412	name_list *TitleForegroundL;
413
414	/// Specialized titlebar background coloring.  From TitleBackground
415	/// config var.  \sa ScreenInfo.TitleC
416	name_list *TitleBackgroundL;
417
418	/// Specialized icon foreground coloring.  From IconForeground
419	/// config var.  \sa ScreenInfo.IconC
420	name_list *IconForegroundL;
421
422	/// Specialized icon background coloring.  From IconBackground
423	/// config var.  \sa ScreenInfo.IconC
424	name_list *IconBackgroundL;
425
426	/// Specialized icon manager foreground coloring.  From
427	/// IconManagerForeground config var.  \sa ScreenInfo.IconManagerC
428	name_list *IconManagerFL;
429
430	/// Specialized icon manager background coloring.  From
431	/// IconManagerBackground config var.  \sa ScreenInfo.IconManagerC
432	name_list *IconManagerBL;
433
434	/// Color to highlight focused windows in icon manager.
435	/// \sa ScreenInfo.IconManagerHighlight
436	name_list *IconManagerHighlightL;
437
438	/// Menu shadow color
439	Pixel MenuShadowColor;
440
441	/// %Icon border color.  \sa ScreenInfo.IconBorderColorL
442	Pixel IconBorderColor;
443
444	/// %Icon manager highlight color.
445	/// \sa ScreenInfo.IconManagerHighlightL
446	Pixel IconManagerHighlight;
447
448	/// The contrast of the clear shadow
449	short ClearShadowContrast;
450
451	/// The contrast of the dark shadow
452	short DarkShadowContrast;
453	/// @}
454
455	/**
456	 * \defgroup scr_icon_bits Various icon control bits.
457	 * Various configurations for how icons get displayed and laid out.
458	 * @{
459	 */
460	/// How icon images/titles are aligned.  From IconJustification
461	/// config var.  X-ref IconRegion.TitleJustification.
462	TitleJust IconJustification;
463
464	/// How icons are laid out horizontally inside a region.  From
465	/// IconRegionJustificationconfig var.
466	IRJust IconRegionJustification;
467
468	/// How icons are laid out vertically inside a region.  From
469	/// IconRegionAlignement config var.
470	IRAlignement IconRegionAlignement;
471
472	/// How to animate window iconification, if any.  From IconifyStyle
473	/// config var.
474	IcStyle IconifyStyle;       /* ICONIFY_* */
475	/// Limit on icon title size.  From MaxIconTitleWidth config var.
476	int MaxIconTitleWidth;
477#ifdef EWMH
478	int PreferredIconWidth;     ///< Width from IconSize config var
479	int PreferredIconHeight;    ///< Height from IconSize config var
480#endif
481	/// @}
482
483	/// How title text is aligned in window titlebars.  From
484	/// TitleJustification config var.  \note Despite the naming
485	/// similarity, this is *not* related to
486	/// IconRegion.TitleJustification.  That comes instead from
487	/// ScreenInfo.IconJustification.
488	TitleJust TitleJustification;
489
490	/// \defgroup scr_cursors Various cursors used on the screen.
491	/// These all come from the Cursors config var, or defaults.
492	/// @{
493	Cursor TitleCursor;    ///< title bar cursor
494	Cursor FrameCursor;    ///< frame cursor
495	Cursor IconCursor;     ///< icon cursor
496	Cursor IconMgrCursor;  ///< icon manager cursor
497	Cursor ButtonCursor;   ///< title bar button cursor
498	Cursor MoveCursor;     ///< move cursor
499	Cursor ResizeCursor;   ///< resize cursor
500	Cursor WaitCursor;     ///< wait a while cursor
501	Cursor MenuCursor;     ///< menu cursor
502	Cursor SelectCursor;   ///< dot cursor for f.move, etc. from menus
503	Cursor DestroyCursor;  ///< skull and cross bones, f.destroy
504	Cursor AlterCursor;    ///< cursor for alternate keymaps
505	/// @}
506
507	/// Info about the WorkSpaceManager (and Occupy window) for the screen.
508	WorkSpaceMgr workSpaceMgr;
509	bool workSpaceManagerActive; ///< Whether the WSM is being shown
510
511	/// \defgroup scr_vscreen_bits VScreen bits
512	/// @{
513	VirtualScreen *vScreenList;    ///< Linked list of per-VS info
514	VirtualScreen *currentvs;      ///< Currently active VS
515#ifdef VSCREEN
516	name_list     *VirtualScreens; ///< List of defined VS's
517	int           numVscreens;     ///< Number of defined VS's
518#endif
519	/// @}
520
521	name_list   *OccupyAll;       ///< OccupyAll config var
522	name_list   *UnmapByMovingFarAway; ///< UnmapByMovingFarAway config var
523	name_list   *DontSetInactive; ///< DontSetInactive config var
524	name_list   *AutoSqueeze;     ///< AutoSqueeze config var
525	name_list   *StartSqueezed;   ///< StartSqueezed config var
526
527	bool  use3Dmenus;        ///< UseThreeDMenus config var
528	bool  use3Dtitles;       ///< UseThreeDTitles config var
529	bool  use3Diconmanagers; ///< UseThreeDIconManagers config var
530	bool  use3Dborders;      ///< UseThreeDBorders config var
531	bool  use3Dwmap;         ///< UseThreeDWMap config var
532	bool  SunkFocusWindowTitle;  ///< SunkFocusWindowTitle config var
533	short WMgrVertButtonIndent;  ///< WMgrVertButtonIndent config var
534	short WMgrHorizButtonIndent; ///< WMgrHorizButtonIndent config var
535	short WMgrButtonShadowDepth; ///< WMgrButtonShadowDepth config var
536	bool  BeNiceToColormap; ///< BeNiceToColormap config var
537	bool  BorderCursors;    ///< BorderResizeCursors config var
538	/// AutoPopup config flag.  \sa ScreenInfo.AutoPopupL
539	bool  AutoPopup;
540	short BorderShadowDepth;      ///< BorderShadowDepth config var
541	short TitleButtonShadowDepth; ///< TitleButtonShadowDepth config var
542	short TitleShadowDepth;       ///< TitleShadowDepth config var
543	short MenuShadowDepth;        ///< MenuShadowDepth config var
544	short IconManagerShadowDepth; ///< IconManagerShadowDepth config var
545	/// ReallyMoveInWorkspaceManager config var
546	bool  ReallyMoveInWorkspaceManager;
547	/// AlwaysShowWindowWhenMovingFromWorkspaceManager config var
548	bool  ShowWinWhenMovingInWmgr;
549	bool  ReverseCurrentWorkspace; ///< ReverseCurrentWorkspace config var
550	bool  DontWarpCursorInWMap;  ///< DontWarpCursorInWMap config var
551	short XMoveGrid;             ///< XMoveGrid config var
552	short YMoveGrid;             ///< YMoveGrid config var
553	bool  CenterFeedbackWindow;  ///< CenterFeedbackWindow config var
554	bool  ShrinkIconTitles;      ///< ShrinkIconTitles config var
555	bool  AutoRaiseIcons;        ///< AutoRaiseIcons config var
556	bool  AutoFocusToTransients; ///< AutoFocusToTransients config var
557	bool  PackNewWindows;        ///< PackNewWindows config var
558
559	/// Stash of various OTP info about the windows on the screen.  This
560	/// is only used internally in various otp.c code; nothing else
561	/// currently references it.
562	struct OtpPreferences *OTP;
563	/// Stash of OTP info about icons on the screen. \copydetails OTP
564	struct OtpPreferences *IconOTP;
565	/// Pointer to the start of the OTP winlists for the screen.
566	struct OtpWinList *bottomOwl;
567
568	/// From IconManagers config var.  This is a mapping from the window
569	/// name pattern to the IconMgr structure it should go in.  All the
570	/// IM's for the screen wind up in the iconmgr element.
571	/// \sa ScreenInfo.iconmgr
572	name_list *IconMgrs;
573
574	/// AutoPopup config var (list).  Windows that popup when changed.
575	/// \sa ScreenInfo.AutoPopup
576	name_list *AutoPopupL;
577
578	/// NoBorder config var.  Windows without borders.
579	name_list *NoBorder;
580
581	/// NoIconTitle config var (list).  Windows to not show a title on
582	/// the icons for.  \sa ScreenInfo.NoIconTitlebar
583	name_list *NoIconTitle;
584
585	/// NoTitle config var (list).  Windows to not put a titlebar on.
586	/// \sa ScreenInfo.NoTitlebar
587	name_list *NoTitle;
588
589	/// MakeTitle config var.  Windows to pup a titlebar on when general
590	/// NoTitle is set.  \sa ScreenInfo.NoTitlebar \sa ScreenInfo.NoTitle
591	name_list *MakeTitle;
592
593	/// AutoRaise config var (list).  Windows to automatically raise when
594	/// pointed to (possible after a delay).
595	/// \sa ScreenInfo.AutoRaiseDefault \sa ScreenInfo.RaiseDelay
596	name_list *AutoRaise;
597
598	/// WarpOnDeIconify config var.  Windows to occupy over to current
599	/// workspace on deiconification.  \note Minor nomenclature issue;
600	/// 'Warp' in name suggests we move to the win, but it actually means
601	/// move the win to us.
602	name_list *WarpOnDeIconify;
603
604	/// AutoLower config var (list).  Windows to automatically lower when
605	/// pointed away from.  \sa ScreenInfo.AutoLowerDefault
606	name_list *AutoLower;
607
608	/// Icons config var.  Manually specified icons for particular
609	/// windows.
610	name_list *IconNames;
611
612	/// NoHightlight config var (list).  Windows to not highlight border
613	/// of when focused.  \sa ScreenInfo.Highlight
614	name_list *NoHighlight;
615
616	/// NoStackMode config var (list).  Windows to ignore
617	/// application-initiated restacking requests from.
618	/// \sa ScreenInfo.StackMode
619	name_list *NoStackModeL;
620
621	/// NoTitleHighlight config var (list).  Windows to not highlight in
622	/// titlevar when focused.  \sa ScreenInfo.TitleHighlight
623	name_list *NoTitleHighlight;
624
625	/// DontIconifyByUnmapping config var.  Windows to iconify by making
626	/// an icon for, overriding IconifyByUnmapping setting.
627	name_list *DontIconify;
628
629	/// IconManagerDontShow config var (list).
630	/// \sa ScreenInfo.IconManagerDontShow
631	name_list *IconMgrNoShow;
632
633	/// IconManagerShow config var.  Windows to show in icon manager even
634	/// if global IconManagerDontShow is set.
635	name_list *IconMgrShow;
636
637	/// IconifyByUnmapping config var (list).  \sa ScreenInfo.IconifyByUnmapping
638	name_list *IconifyByUn;
639
640	/// StartIconified config var.
641	name_list *StartIconified;
642
643	/// SqueezeTitle config var (list).  \sa ScreenInfo.SqueezeTitle
644	name_list *SqueezeTitleL;
645
646	/// DontSqueezeTitle config var (list).  \sa ScreenInfo.SqueezeTitle
647	name_list *DontSqueezeTitleL;
648
649	/// AlwaysSqueezeToGravity config var (list).
650	/// \sa ScreenInfo.AlwaysSqueezeToGravity
651	name_list *AlwaysSqueezeToGravityL;
652
653	/// WindowRing config var (list).  Windows to put in warp ring.
654	/// \sa ScreenInfo.WindowRingAll
655	name_list *WindowRingL;
656
657	/// WindowRingExclude config var.  Windows to exclude from warp ring.
658	name_list *WindowRingExcludeL;
659
660	/// WarpCursor config var (list).  Windows to warp to on deiconify.
661	/// \sa ScreenInfo.WarpCursor
662	name_list *WarpCursorL;
663
664	/// DontSave config var.  Windows to not save info in session manager.
665	name_list *DontSave;
666
667	/// WindowGeometries config var.  Default geometries for windows.
668	name_list *WindowGeometries;
669
670	/// IgnoreTransient config var.  Windows that we should pretend
671	/// aren't transient even if they are.
672	name_list *IgnoreTransientL;
673
674	/// OpaqueMove config var (list).  Windows to move opaquely rather
675	/// than in outline.  \sa ScreenInfo.DoOpaqueMove
676	name_list *OpaqueMoveList;
677
678	/// NoOpaqueMove config var (list).  Windows to not move opaquely.
679	/// \sa ScreenInfo.DoOpaqueMove
680	name_list *NoOpaqueMoveList;
681
682	/// OpaqueResize config var (list).  Windows to resize opaquely
683	/// rather than in outline.  \sa ScreenInfo.DoOpaqueResize
684	name_list *OpaqueResizeList;
685
686	/// NoOpaqueResize config var (list).  Windows to not resize
687	/// opaquely.  \sa ScreenInfo.DoOpaqueResize
688	name_list *NoOpaqueResizeList;
689
690	/// IconMenuDontShow config var.  Windows whose icons to not list in
691	/// TwmIcons menu.
692	name_list *IconMenuDontShow;
693
694
695	/**
696	 * \defgroup scr_gc_bits Various graphics contexts
697	 * These are X Graphics Contexts, which are used for various sorts of
698	 * drawing in X.  Stuff that needs to draw lines, or write out text,
699	 * all needs to use a GC.  X-ref
700	 * <https://www.x.org/releases/X11R7.7/doc/libX11/libX11/libX11.html#Graphics_Context_Functions>
701	 * for upstream details.
702	 * @{
703	 */
704	GC NormalGC; ///< normal GC for everything
705	GC MenuGC;   ///< GC for menus
706	GC DrawGC;   ///< GC to draw lines for move and resize
707	GC BorderGC; ///< GC for drawing 3D borders
708	GC rootGC;   ///< GC for internal pixmaps in image.c / image_bitmap.c
709	/// @}
710
711	Pixel Black; ///< Stash of "Black" X color for the screen
712	Pixel White; ///< Stash of "White" X color for the screen
713	unsigned long XORvalue;  ///< XorValue config var, or default
714
715	/// \defgroup scr_font_bits Various font settings
716	/// Definitions of various fonts to use on the Screen.
717	/// @{
718	MyFont TitleBarFont;     ///< TitleFont config var
719	MyFont MenuFont;         ///< MenuFont config var
720	MyFont IconFont;         ///< IconFont config var
721	MyFont SizeFont;         ///< SizeFont config var
722	MyFont IconManagerFont;  ///< IconManagerFont config var
723	MyFont DefaultFont;      ///< Hardcoded fallback font
724	/// @}
725
726	/// Head of linked list of Screen's icon managers.  The head is also
727	/// the default icon manager for the screen.  \sa ScreenInfo.IconMgrs
728	IconMgr *iconmgr;
729
730	/// Head of the list of IconRegion structs on the Screen.  Built out
731	/// from %IconRegion config var.
732	struct IconRegion *FirstRegion;
733
734	/// Tail of the list of IconRegion structs on the Screen.  Used as an
735	/// optimization in configuring the list on startup.  \todo Is this
736	/// actually necessary?  Does the order matter?
737	struct IconRegion *LastRegion;
738
739	/// Pointer to head of list of window regions on screen.  Built from
740	/// %WindowRegion config var.
741	struct WindowRegion *FirstWindowRegion;
742
743#ifdef WINBOX
744	/// Pointer to head of list of windowboxes on screen.  Built from
745	/// %WindowBox config var.
746	WindowBox *FirstWindowBox;
747#endif
748
749	char *IconDirectory;    ///< IconDirectory config var
750	char *PixmapDirectory;  ///< PixmapDirectory config var
751
752	int SizeStringOffset;   ///< X offset in size window for drawing
753	int SizeStringWidth;    ///< Minimum width of size window
754
755	int BorderWidth;        ///< BorderWidth config var
756	int BorderLeft;         ///< BorderLeft config var
757	int BorderRight;        ///< BorderRight config var
758	int BorderTop;          ///< BorderTop config var
759	int BorderBottom;       ///< BorderBottom config var
760	int ThreeDBorderWidth;  ///< ThreeDBorderWidth config var
761	int IconBorderWidth;    ///< IconBorderWidth config var
762
763	/// Height of the title bar window.  Calculated from font height and
764	/// padding.  \todo Maybe this should be in ScreenInfo.TBInfo above?
765	/// Same can be said for a number of following fields that are
766	/// titlebar related...
767	int TitleHeight;
768
769	TwmWindow *Focus;    ///< The twm window that has focus.
770	int EntryHeight;     ///< Menu entry height.  Calc'd from font height.
771
772	/// FramePadding config var.  Distance between titlebar contents and
773	/// frame.
774	int FramePadding;
775	/// TitlePadding config var.  Distance between items in titlebar.
776	int TitlePadding;
777
778	/// ButtonIndent config var.  Amount to shrink titlebar buttons.
779	int ButtonIndent;
780	int NumAutoRaises;   ///< Number of autoraise windows on screen
781	int NumAutoLowers;   ///< Number of autolower windows on screen
782	int TransientOnTop;  ///< TransientOnTop config var
783
784	/// AutoRaise config flag.  \sa ScreenInfo.AutoRaise
785	bool AutoRaiseDefault;
786
787	/// AutoLower config flag.  \sa ScreenInfo.AutoLower
788	bool AutoLowerDefault;
789
790	bool NoDefaults;    ///< NoDefaults config var
791	UsePPoss UsePPosition;     ///< UsePPosition config var
792	bool UseSunkTitlePixmap;  ///< UseSunkTitlePixmap config var
793	bool AutoRelativeResize;  ///< AutoRelativeResize config var
794
795	/// Whether focus is allowed to move.  At one point this allegedly
796	/// meant something like "is the input focus on the root?".  In
797	/// current use, however, it's used as a flag for whether to
798	/// auto-move focus to a new window; it's set to false in the
799	/// ClickToFocus case, as well as when f.focus is called on a window,
800	/// and then prevents Enter notifications from setting focus on new
801	/// windows.
802	/// \todo Rename to something better fitting.
803	bool  FocusRoot;
804
805	bool WarpCursor;    ///< WarpCursor config var.  \sa ScreenInfo.WarpCursorL
806	bool ForceIcon;     ///< ForceIcons config var
807	bool NoGrabServer;  ///< NoGrabServer config var
808	bool NoRaiseMove;   ///< NoRaiseOnMove config var
809	bool NoRaiseResize; ///< NoRaiseOnResize config var
810	bool NoRaiseDeicon; ///< NoRaiseOnDeiconify config var
811	bool RaiseOnWarp;   ///< NoRaiseOnWarp config var (inverse)
812	bool DontMoveOff;   ///< DontMoveOff config var
813	int MoveOffResistance;  ///< MoveOffResistence config var
814	int MovePackResistance; ///< MovePackResistence config var
815
816	/// Whether we're animating [de]iconification zooms.  From Zoom
817	/// config var.  \sa ScreenInfo.ZoomCount
818	bool DoZoom;
819
820	bool TitleFocus;       ///< NoTitleFocus config var (inverse)
821	bool IconManagerFocus; ///< NoIconManagerFocus config var (inverse)
822
823	/// NoIconTitle config var.  \sa ScreenInfo.NoIconTitle
824	bool NoIconTitlebar;
825
826	/// NoTitle config var.  \sa ScreenInfo.NoTitle
827	bool NoTitlebar;
828
829	bool DecorateTransients; ///< DecorateTransients config var
830
831	/// IconifyByUnmapping config var.  \sa ScreenInfo.IconifyByUn
832	bool IconifyByUnmapping;
833
834	bool ShowIconManager; ///< ShowIconManager config var
835	bool ShowWorkspaceManager; ///< ShowWorkSpaceManager config var
836
837	/// IconManagerDontShow config var.  \sa ScreenInfo.IconMgrNoShow
838	bool IconManagerDontShow;
839
840	bool AutoOccupy;   ///< AutoOccupy config var
841	bool AutoPriority; ///< AutoPriority config var
842	bool TransientHasOccupation; ///< TransientHasOccupation config var
843	bool DontPaintRootWindow;    ///< DontPaintRootWindow config var
844	bool BackingStore; ///< BackingStore config var
845	bool SaveUnder;    ///< NoSaveUnders config var (inverse)
846	RandPlac RandomPlacement;  ///< RandomPlacement config var (1st arg)
847	short RandomDisplacementX; ///< RandomPlacement config var (2nd arg)
848	short RandomDisplacementY; ///< RandomPlacement config var (2nd arg)
849
850	/// Whether we're doing a window opaque move.  This is set at runtime
851	/// for each particular move we start doing, acting as a "what are we
852	/// in the middle of" flag.  It will get figured based on various
853	/// things, like TwmWindow.OpaqueMove and
854	/// ScreenInfo.OpaqueMoveThreshold.
855	bool OpaqueMove;
856
857	/// OpaqueMove config var.  \sa ScreenInfo.OpaqueMoveList
858	bool DoOpaqueMove;
859
860	unsigned short OpaqueMoveThreshold;  ///< OpaqueMoveThreshold config var
861
862	/// OpaqueResize config var.  \sa ScreenInfo.OpaqueResizeList
863	bool DoOpaqueResize;
864
865	/// Whether we're in the midst of an opaque resizing.  Transiently
866	/// set at runtime based on things like TwmWindow.OpaqueResize and
867	/// ScreenInfo.OpaqueResizeThreshold.  X-ref ScreenInfo.OpaqueMove
868	/// for its counterpart in the window-moving department.
869	bool OpaqueResize;
870
871	unsigned short OpaqueResizeThreshold; ///< OpaqueResizeThreshold config var
872
873	/// NoHighlight config var (inverse).  \sa ScreenInfo.NoHighlight
874	bool Highlight;
875
876	/// NoStackMode config var (inverse).  \sa ScreenInfo.NoStackModeL
877	bool StackMode;
878
879	/// NoTitleHighlight config var (inverse).  \sa ScreenInfo.NoTitleHighlight
880	bool TitleHighlight;
881
882	/// MoveDelta config var.  Number of pixels before f.move starts
883	short MoveDelta;
884
885	/// Zoom config var.  Number of animated steps in [de]iconifying.
886	short ZoomCount;
887
888	bool SortIconMgr;  ///< SortIconManager config var
889	bool Shadow;       ///< NoMenuShadows config var (inverse)
890	bool InterpolateMenuColors;  ///< InterpolateMenuColors config var
891	bool StayUpMenus;  ///< StayUpMenus config var
892	bool WarpToDefaultMenuEntry; ///< WarpToDefaultMenuEntry config var
893	bool ClickToFocus; ///< ClickToFocus config var
894	bool SloppyFocus;  ///< SloppyFocus config var
895	bool SaveWorkspaceFocus; ///< SaveWorkspaceFocus config var
896	bool NoIconManagers;     ///< NoIconManagers config var
897	bool ClientBorderWidth;  ///< ClientBorderWidth config var
898
899	/// SqueezeTitle and/or DontSqueezeTitle config vars.
900	/// \sa ScreenInfo.SqueezeTitleL  \sa ScreenInfo.DontSqueezeTitleL
901	bool SqueezeTitle;
902
903	/// AlwaysSqueezeToGravity config var.
904	/// \sa ScreenInfo.AlwaysSqueezeToGravityL
905	bool AlwaysSqueezeToGravity;
906
907	/// Whether fonts have been loaded yet in the startup process
908	bool HaveFonts;
909
910	/// Some sort of attempt to determine whether this is the first
911	/// config file we've parsed for this screen (which is bogus, since
912	/// we only parse one file for each screen!), but also used in some
913	/// color getting for obscure reasons.  This needs careful
914	/// consideration and auditing; it may be just bogus.  X-ref work
915	/// vtwm did in adjusting its use in GetColor() to avoid all the
916	/// save/restore dances on calls around it, and the \#ifdef inside
917	/// GetColor().  \todo Evaulate to determine whether it should exist.
918	bool FirstTime;
919
920	bool  CaseSensitive; ///< NoCaseSensitive config var (inverse)
921	bool  WarpUnmapped;  ///< WarpUnmapped config var
922	bool  WindowRingAll; ///< WindowRing config var.  \sa ScreenInfo.WindowRingL
923	bool  WarpRingAnyWhere;       ///< WarpRingOnScreen config var (inverse)
924	bool  ShortAllWindowsMenus;   ///< ShortAllWindowsMenus config var
925	short OpenWindowTimeout;      ///< OpenWindowTimeout config var
926	bool  RaiseWhenAutoUnSqueeze; ///< RaiseWhenAutoUnSqueeze config var
927	bool  RaiseOnClick;           ///< RaiseOnClick config var
928	short RaiseOnClickButton;     ///< RaiseOnClickButton config var
929	unsigned int IgnoreModifier;  ///< IgnoreModifier config var
930	bool IgnoreCaseInMenuSelection;  ///< IgnoreCaseInMenuSelection config var
931	bool NoWarpToMenuTitle;          ///< NoWarpToMenuTitle config var
932	bool NoImagesInWorkSpaceManager; ///< NoImagesInWorkSpaceManager config var
933
934	/// DontToggleWorkspaceManagerState config var
935	bool DontToggleWorkspaceManagerState;
936
937	/// Whether to show the welcome window.  Related to the
938	/// DontShowWelcomeWindow config var or the \--nowelcome command-line
939	/// arg.  \ingroup scr_maskwin
940	bool ShowWelcomeWindow;
941
942	bool NameDecorations;  ///< DontNameDecorations config var (inverse)
943
944	/// Whether to be strict about what encoding of window naming
945	/// properties (WM_NAME etc) we accept.  From StrictWinNameEncoding
946	/// config var.
947	bool StrictWinNameEncoding;
948
949	/// ForceFocus config var.  Forcing focus-setting on windows.
950	/// \sa ScreenInfo.ForceFocusL
951	bool      ForceFocus;
952	/// \copybrief ForceFocus \sa ScreenInfo.ForceFocus
953	name_list *ForceFocusL;
954
955	FuncKey FuncKeyRoot;       ///< Key bindings
956	FuncButton FuncButtonRoot; ///< Mouse click bindings
957
958#ifdef EWMH
959	/// Special-purpose window for WM_S<screennum> window selection.  See
960	/// ICCCM sections 4.3, 2.8.
961	Window icccm_Window;
962
963	/// List of known client windows.  Stashed in _NET_CLIENT_LIST
964	/// property.
965	long *ewmh_CLIENT_LIST;
966	int ewmh_CLIENT_LIST_size; ///< Allocated ScreenInfo.ewmh_CLIENT_LIST memory
967	int ewmh_CLIENT_LIST_used; ///< Used ScreenInfo.ewmh_CLIENT_LIST slots
968
969	/// List of EWMH struts.  From _NET_WM_STRUT properties.  EWMH config
970	/// for windows that reserve spaces at the sides of a screen (e.g.,
971	/// taskbars, panels, etc).
972	EwmhStrut *ewmhStruts;
973
974	name_list *EWMHIgnore; ///< EWMHIgnore config var.  Messages to ignore.
975#endif /* EWMH */
976
977	name_list *MWMIgnore; ///< Motif WM messages to ignore
978};
979
980
981
982/*
983 * A few global vars that talk about Screen stuff
984 */
985extern int NumScreens;  ///< How many Screens are on our display
986extern ScreenInfo **ScreenList; ///< List of ScreenInfo structs for each Screen
987extern ScreenInfo *Scr; ///< The ScreenInfo struct for the current Screen
988
989
990#endif /* _CTWM_SCREEN_H */
991