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 */
|