~ctwm/ctwm/trunk

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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
/**
 * \file
 * TwmWindow struct definition.
 *
 * This previously lived in ctwm.h, but was moved out here to make it a
 * bit easier to scan either this struct or all the other stuff in
 * ctwm.h, without so much rooting around.  It's \#include'd in ctwm.h,
 * and shouldn't be included elsewhere; it's split out purely for
 * dev ease.
 */
#ifndef _CTWM_TWM_WINDOW_STRUCT_H
#define _CTWM_TWM_WINDOW_STRUCT_H

/* Needed for doxygen to get at the #define's for config (like EMWH) */
#ifdef DOXYGEN
# include "ctwm_config.h"
#endif


/**
 * Info and control for every X Window we take over.
 *
 * As a window manager, our job is to...  y'know.  Manage windows.  Every
 * other window on the screen we wrap and control (as well as a few of
 * our internal windows) gets one of these structs put around it to hold
 * the various config and state info we track about it.  They get put
 * into various linked lists for each screen and workspace, and
 * references get stashed in X Contexts so we can find the window that
 * events happen on.
 *
 * Much of this is initially setup in AddWindow() when we find out about
 * and take over a window.
 */
struct TwmWindow {
	struct TwmWindow *next;  ///< Next TwmWindow on the Screen
	struct TwmWindow *prev;  ///< Previous TwmWindow on the Screen

	/// OTP control info for stacking.  Created in OtpAdd().
	OtpWinList *otp;

	/// The actual X Window handle
	Window w;

	/// Original window border width before we took it over and made our
	/// own bordering.  This comes from the XWindowAttributes we get from
	/// XGetWindowAttributes().
	int old_bw;

	/**
	 * \defgroup win_frame Window frame bits
	 * These fields are related to the "frame" window; the decoration we
	 * put around the application's own window (the thing in TwmWindow.w
	 * above) to display borders, titlebars, etc.
	 * @{
	 */
	Window frame;      ///< The X window for the overall frame
	Window title_w;    ///< The title bar Window
	Window hilite_wl;  ///< Left hilite window in titlebar
	Window hilite_wr;  ///< Right hilite window in titlebar
	Window lolite_wl;  ///< Left lolite window in titlebar
	Window lolite_wr;  ///< Right lolite window in titlebar

	/// Current resize cursor.  This changes depending on where on the
	/// frame you are, if we're making them.  \sa
	/// ScreenInfo.BorderCursors
	Cursor curcurs;

	/// Pixmap to which the border is set to when window isn't focused.
	/// \sa TwmWindow.borderC  \sa SetFocusVisualAttributes()
	/// \todo See the XXX in SetFocusVisualAttributes()
	Pixmap gray;

	/// @}

	struct Icon *icon;     ///< The current icon.  \sa CreateIconWindow()
	name_list *iconslist;  ///< The current list of potential icons

	/// \addtogroup win_frame Window frame bits
	/// @{
	int frame_x;                ///< X position on screen of frame
	int frame_y;                ///< Y position on screen of frame
	unsigned int frame_width;   ///< Width of frame
	unsigned int frame_height;  ///< Height of frame

	/// 2d border width.  \sa ScreenInfo.BorderWidth
	int frame_bw;
	/// 3d border width.  \sa ScreenInfo.ThreeDBorderWidth
	int frame_bw3D;

	int actual_frame_x;         ///< Saved frame_x when squeezed
	int actual_frame_y;         ///< Saved frame_y when squeezed
	unsigned int actual_frame_width;  ///< Saved frame_width when squeezed
	unsigned int actual_frame_height; ///< Saved frame_height when squeezed

	/// X coord of window title relative to title_w.
	/// \sa ComputeTitleLocation()
	int title_x;
	/// Y coord of window title relative to title_w.
	/// \sa ComputeTitleLocation()
	int title_y;

	unsigned int title_height;  ///< Height of the full title bar
	unsigned int title_width;   ///< Width of the full title bar

	/// @}

	char *name;       ///< Current window name.  Points into TwmWindow::names.
	char *icon_name;  ///< Current icon name. Points into TwmWindow::names.

	/// Various sources of window/icon names.  These are the values from
	/// the various window properties we look at to get the results.  The
	/// TwmWindow::name and TwmWindow::icon_name point to the currently
	/// active element in here.
	struct _names {
		char *ctwm_wm_name; ///< Name from override CTWM_WM_NAME property
#ifdef EWMH
		char *net_wm_name;  ///< Name from EWMH _NET_WM_NAME property
#endif
		char *wm_name;      ///< Name from ICCCM WM_NAME property

		/// Icon name from override CTWM_WM_ICON_NAME property
		char *ctwm_wm_icon_name;
#ifdef EWMH
		/// Icon name from EWMH _NET_WM_ICON_NAME property
		char *net_wm_icon_name;
#endif
		char *wm_icon_name; ///< Icon name from WM_ICON_NAME property

		/// Whether an icon name property has been set.  Since we default
		/// the icon name to the window name when nothing is given, this
		/// flag allows the window-name-setting code to know when it
		/// needs to re-kick the icon-name-setting.
		bool icon_set;
	} names; ///< \copydoc TwmWindow::_names

	/// \addtogroup win_frame Window frame bits
	/// @{

	/// Position of window title text, relative to title_w.  Starts from
	/// \ref title_x, but may be pushed over due to TitleJustification
	/// config.
	int name_x;
	unsigned int name_width; ///< width of name text
	int highlightxl;         ///< Position of \ref hilite_wl and \ref lolite_wl
	int highlightxr;         ///< Position of \ref hilite_wr and \ref lolite_wr
	int rightx;              ///< Position of of right titlebar buttons
	/// @}

	/// Window attributes from XGetWindowAttributes()
	XWindowAttributes attr;
	/// Window size hints.  From WM_NORMAL_HINTS property.
	/// \sa GetWindowSizeHints()
	XSizeHints hints;
	/// Window manager hints.  From WM_HINTS property, filled in via
	/// XGetWMHints().
	XWMHints *wmhints;
	Window group;      ///< Window group, from WM hints.
	XClassHint class;  ///< Window class info.  From XGetClassHint().

	/// List of the icon managers the window is in.  \sa AddIconManager()
	struct WList *iconmanagerlist;

	ColorPair borderC;     ///< ColorPair for focused window borders
	ColorPair border_tile; ///< ColorPair for non-focused window borders
	ColorPair title;       ///< ColorPair for various other titlebar bits

	/// Has the window ever been iconified?
	/// \todo This is almost write-only, and the one reader seems bogus
	/// in light of what it does.  Investigate further and possibly
	/// remove.
	bool iconified;

	bool isicon;     ///< Is the window an icon now ?
	bool icon_on;    ///< Is the icon visible
	bool mapped;     ///< Is the window mapped ?
	bool squeezed;   ///< Is the window squeezed ?
	bool auto_raise; ///< Should we auto-raise this window ?
	bool auto_lower; ///< Should we auto-lower this window ?
	bool forced;     ///< Has had an icon forced upon it
	bool icon_moved; ///< User explicitly moved the icon
	bool highlight;  ///< Should highlight this window
	bool stackmode;  ///< Honor stackmode requests.  \sa ScreenInfo.StackMode
	bool iconify_by_unmapping;  ///< Unmap window to iconify it
	bool isiconmgr;  ///< This is an icon manager window
	bool iswspmgr;   ///< This is a workspace manager window
	bool isoccupy;   ///< This is an Occupy window

	bool istransient;    ///< This is a transient window
	/// What window it's transient for.  From XGetTransientForHint() and
	/// XM_TRANSIENT_FOR property.
	Window transientfor;

	bool titlehighlight;      ///< Should I highlight the title bar?

	/// Pointer to the icon manager structure, for windows that are icon
	/// managers.  Currently also set for some other window types to
	/// various things, but is only ever used for icon manager windows
	/// (\ref isiconmgr = true).
	struct IconMgr *iconmgrp;

	int save_frame_x;        ///< x position of frame  (saved from zoom)
	int save_frame_y;        ///< y position of frame  (saved from zoom)
	unsigned int save_frame_width;  ///< width of frame   (saved from zoom)
	unsigned int save_frame_height; ///< height of frame  (saved from zoom)
	int zoomed;                ///< ZOOM_NONE || function causing zoom
	bool wShaped;              ///< This window is Shape'd
	/// Which protocols this window handles.  From WM_PROTOCOLS property
	/// via XGetWMProtocols()
	unsigned long protocols;
	Colormaps cmaps;           ///< colormaps for this application
	/// Button windows in the titlebar.  \ingroup win_frame
	TBWindow *titlebuttons;
	SqueezeInfo *squeeze_info;  ///< Control info for title squeezing
	bool squeeze_info_copied;   ///< Should ->squeeze_info be free()'d?

	/// Window ring connectivity
	struct _ring {
		struct TwmWindow *next; ///< Next window in the ring
		struct TwmWindow *prev; ///< Previous window in the ring
		bool cursor_valid;  ///< Whether curs_x and curs_y are usable
		int curs_x;         ///< Stored cursor position in the window
		int curs_y;         ///< Stored cursor position in the window
	} ring; ///< \copydoc TwmWindow::_ring
	// x-ref ScreenInfo.InfoWindow about doxygen hackery

	// Many of these are just the window's particular casing of various
	// config params, inherited from the screen's info.  In most cases,
	// they're essentially a read-only cache.
	bool OpaqueMove;      ///< Move opaquely.  \sa ScreenInfo.DoOpaqueMove
	bool OpaqueResize;    ///< Resize opaquely.  \sa ScreenInfo.DoOpaqueResize
	bool UnmapByMovingFarAway;  ///< \sa ScreenInfo.UnmapByMovingFarAway
	bool AutoSqueeze;     ///< \sa ScreenInfo.AutoSqueeze
	bool StartSqueezed;   ///< \sa ScreenInfo.StartSqueezed
	bool AlwaysSqueezeToGravity; ///< \sa ScreenInfo.AlwaysSqueezeToGravity
	bool DontSetInactive; ///< \sa ScreenInfo.DontSetInactive

	bool hasfocusvisible; ///< The window visibly has focus

	int occupation;  ///< Workspaces the window is in (bitmap)

	Image *HiliteImage; ///< Titlebar hilite backround.  \ingroup win_frame
	Image *LoliteImage; ///< Titlebar lolite backround.  \ingroup win_frame

	/// WindowRegion containing this window.  \todo Write-only?  Reap?
	WindowRegion *wr;
#ifdef WINBOX
	WindowBox *winbox; ///< WindowBox containing this window.
	bool iswinbox;     ///< This is a WindowBox window.
#endif

	/// Saved window geometry.  Used in f.savegeometry and
	/// f.restoregeometry.
	struct _savegeometry {
		int x;  ///< Saved x coord
		int y;  ///< Saved y coord
		unsigned int width;  ///< Saved width
		unsigned int height; ///< Saved height
	} savegeometry; ///< \copydoc TwmWindow::_savegeometry

	/// Where the window is currently mapped (may be NULL)
	struct VirtualScreen *vs;
	/// Where the window is parented.  Always set.
	struct VirtualScreen *parent_vs;

	/// Where the window would be.  Used only by f.showbackground.
	/// \sa ShowBackground()
	struct VirtualScreen *savevs;

	/// Has \ref TwmWindow::name ever changed?  Used only in session saving.
	bool nameChanged;
	/// Has \ref TwmWindow::attr width ever changed?  Used only in sessions.
	bool widthEverChangedByUser;
	/// Has \ref TwmWindow::attr height ever changed?  Used only in sessions.
	bool heightEverChangedByUser;

#ifdef EWMH
	EwmhWindowType ewmhWindowType; ///< EWMH-defined window type
	int ewmhFlags; ///< EWMH-defined window stats. Mostly from _NET_WM_STATE.
#endif /* EWMH */
};

#endif /* _CTWM_TWM_WINDOW_STRUCT_H */