Home | History | Annotate | Line # | Download | only in dist
      1 /**
      2  * \file
      3  * TwmWindow struct definition.
      4  *
      5  * This previously lived in ctwm.h, but was moved out here to make it a
      6  * bit easier to scan either this struct or all the other stuff in
      7  * ctwm.h, without so much rooting around.  It's \#include'd in ctwm.h,
      8  * and shouldn't be included elsewhere; it's split out purely for
      9  * dev ease.
     10  */
     11 #ifndef _CTWM_TWM_WINDOW_STRUCT_H
     12 #define _CTWM_TWM_WINDOW_STRUCT_H
     13 
     14 /* Needed for doxygen to get at the #define's for config (like EMWH) */
     15 #ifdef DOXYGEN
     16 # include "ctwm_config.h"
     17 #endif
     18 
     19 
     20 /**
     21  * Info and control for every X Window we take over.
     22  *
     23  * As a window manager, our job is to...  y'know.  Manage windows.  Every
     24  * other window on the screen we wrap and control (as well as a few of
     25  * our internal windows) gets one of these structs put around it to hold
     26  * the various config and state info we track about it.  They get put
     27  * into various linked lists for each screen and workspace, and
     28  * references get stashed in X Contexts so we can find the window that
     29  * events happen on.
     30  *
     31  * Much of this is initially setup in AddWindow() when we find out about
     32  * and take over a window.
     33  */
     34 struct TwmWindow {
     35 	struct TwmWindow *next;  ///< Next TwmWindow on the Screen
     36 	struct TwmWindow *prev;  ///< Previous TwmWindow on the Screen
     37 
     38 	/// OTP control info for stacking.  Created in OtpAdd().
     39 	OtpWinList *otp;
     40 
     41 	/// The actual X Window handle
     42 	Window w;
     43 
     44 	/// Original window border width before we took it over and made our
     45 	/// own bordering.  This comes from the XWindowAttributes we get from
     46 	/// XGetWindowAttributes().
     47 	int old_bw;
     48 
     49 	/**
     50 	 * \defgroup win_frame Window frame bits
     51 	 * These fields are related to the "frame" window; the decoration we
     52 	 * put around the application's own window (the thing in TwmWindow.w
     53 	 * above) to display borders, titlebars, etc.
     54 	 * @{
     55 	 */
     56 	Window frame;      ///< The X window for the overall frame
     57 	Window title_w;    ///< The title bar Window
     58 	Window hilite_wl;  ///< Left hilite window in titlebar
     59 	Window hilite_wr;  ///< Right hilite window in titlebar
     60 	Window lolite_wl;  ///< Left lolite window in titlebar
     61 	Window lolite_wr;  ///< Right lolite window in titlebar
     62 
     63 	/// Current resize cursor.  This changes depending on where on the
     64 	/// frame you are, if we're making them.  \sa
     65 	/// ScreenInfo.BorderCursors
     66 	Cursor curcurs;
     67 
     68 	/// Pixmap to which the border is set to when window isn't focused.
     69 	/// \sa TwmWindow.borderC  \sa SetFocusVisualAttributes()
     70 	/// \todo See the XXX in SetFocusVisualAttributes()
     71 	Pixmap gray;
     72 
     73 	/// @}
     74 
     75 	struct Icon *icon;     ///< The current icon.  \sa CreateIconWindow()
     76 	name_list *iconslist;  ///< The current list of potential icons
     77 
     78 	/// \addtogroup win_frame Window frame bits
     79 	/// @{
     80 	int frame_x;                ///< X position on screen of frame
     81 	int frame_y;                ///< Y position on screen of frame
     82 	unsigned int frame_width;   ///< Width of frame
     83 	unsigned int frame_height;  ///< Height of frame
     84 
     85 	/// 2d border width.  \sa ScreenInfo.BorderWidth
     86 	int frame_bw;
     87 	/// 3d border width.  \sa ScreenInfo.ThreeDBorderWidth
     88 	int frame_bw3D;
     89 
     90 	int actual_frame_x;         ///< Saved frame_x when squeezed
     91 	int actual_frame_y;         ///< Saved frame_y when squeezed
     92 	unsigned int actual_frame_width;  ///< Saved frame_width when squeezed
     93 	unsigned int actual_frame_height; ///< Saved frame_height when squeezed
     94 
     95 	/// X coord of window title relative to title_w.
     96 	/// \sa ComputeTitleLocation()
     97 	int title_x;
     98 	/// Y coord of window title relative to title_w.
     99 	/// \sa ComputeTitleLocation()
    100 	int title_y;
    101 
    102 	unsigned int title_height;  ///< Height of the full title bar
    103 	unsigned int title_width;   ///< Width of the full title bar
    104 
    105 	/// @}
    106 
    107 	char *name;       ///< Current window name.  Points into TwmWindow::names.
    108 	char *icon_name;  ///< Current icon name. Points into TwmWindow::names.
    109 
    110 	/// Various sources of window/icon names.  These are the values from
    111 	/// the various window properties we look at to get the results.  The
    112 	/// TwmWindow::name and TwmWindow::icon_name point to the currently
    113 	/// active element in here.
    114 	struct _names {
    115 		char *ctwm_wm_name; ///< Name from override CTWM_WM_NAME property
    116 #ifdef EWMH
    117 		char *net_wm_name;  ///< Name from EWMH _NET_WM_NAME property
    118 #endif
    119 		char *wm_name;      ///< Name from ICCCM WM_NAME property
    120 
    121 		/// Icon name from override CTWM_WM_ICON_NAME property
    122 		char *ctwm_wm_icon_name;
    123 #ifdef EWMH
    124 		/// Icon name from EWMH _NET_WM_ICON_NAME property
    125 		char *net_wm_icon_name;
    126 #endif
    127 		char *wm_icon_name; ///< Icon name from WM_ICON_NAME property
    128 
    129 		/// Whether an icon name property has been set.  Since we default
    130 		/// the icon name to the window name when nothing is given, this
    131 		/// flag allows the window-name-setting code to know when it
    132 		/// needs to re-kick the icon-name-setting.
    133 		bool icon_set;
    134 	} names; ///< \copydoc TwmWindow::_names
    135 
    136 	/// \addtogroup win_frame Window frame bits
    137 	/// @{
    138 
    139 	/// Position of window title text, relative to title_w.  Starts from
    140 	/// \ref title_x, but may be pushed over due to TitleJustification
    141 	/// config.
    142 	int name_x;
    143 	unsigned int name_width; ///< width of name text
    144 	int highlightxl;         ///< Position of \ref hilite_wl and \ref lolite_wl
    145 	int highlightxr;         ///< Position of \ref hilite_wr and \ref lolite_wr
    146 	int rightx;              ///< Position of of right titlebar buttons
    147 	/// @}
    148 
    149 	/// Window attributes from XGetWindowAttributes()
    150 	XWindowAttributes attr;
    151 	/// Window size hints.  From WM_NORMAL_HINTS property.
    152 	/// \sa GetWindowSizeHints()
    153 	XSizeHints hints;
    154 	/// Window manager hints.  From WM_HINTS property, filled in via
    155 	/// XGetWMHints().
    156 	XWMHints *wmhints;
    157 	Window group;      ///< Window group, from WM hints.
    158 	XClassHint class;  ///< Window class info.  From XGetClassHint().
    159 
    160 	/// List of the icon managers the window is in.  \sa AddIconManager()
    161 	struct WList *iconmanagerlist;
    162 
    163 	ColorPair borderC;     ///< ColorPair for focused window borders
    164 	ColorPair border_tile; ///< ColorPair for non-focused window borders
    165 	ColorPair title;       ///< ColorPair for various other titlebar bits
    166 
    167 	/// Has the window ever been iconified?
    168 	/// \todo This is almost write-only, and the one reader seems bogus
    169 	/// in light of what it does.  Investigate further and possibly
    170 	/// remove.
    171 	bool iconified;
    172 
    173 	bool isicon;     ///< Is the window an icon now ?
    174 	bool icon_on;    ///< Is the icon visible
    175 	bool mapped;     ///< Is the window mapped ?
    176 	bool squeezed;   ///< Is the window squeezed ?
    177 	bool auto_raise; ///< Should we auto-raise this window ?
    178 	bool auto_lower; ///< Should we auto-lower this window ?
    179 	bool forced;     ///< Has had an icon forced upon it
    180 	bool icon_moved; ///< User explicitly moved the icon
    181 	bool highlight;  ///< Should highlight this window
    182 	bool stackmode;  ///< Honor stackmode requests.  \sa ScreenInfo.StackMode
    183 	bool iconify_by_unmapping;  ///< Unmap window to iconify it
    184 	bool isiconmgr;  ///< This is an icon manager window
    185 	bool iswspmgr;   ///< This is a workspace manager window
    186 	bool isoccupy;   ///< This is an Occupy window
    187 
    188 	bool istransient;    ///< This is a transient window
    189 	/// What window it's transient for.  From XGetTransientForHint() and
    190 	/// XM_TRANSIENT_FOR property.
    191 	Window transientfor;
    192 
    193 	bool titlehighlight;      ///< Should I highlight the title bar?
    194 
    195 	/// Pointer to the icon manager structure, for windows that are icon
    196 	/// managers.  Currently also set for some other window types to
    197 	/// various things, but is only ever used for icon manager windows
    198 	/// (\ref isiconmgr = true).
    199 	struct IconMgr *iconmgrp;
    200 
    201 	int save_frame_x;        ///< x position of frame  (saved from zoom)
    202 	int save_frame_y;        ///< y position of frame  (saved from zoom)
    203 	unsigned int save_frame_width;  ///< width of frame   (saved from zoom)
    204 	unsigned int save_frame_height; ///< height of frame  (saved from zoom)
    205 	int zoomed;                ///< ZOOM_NONE || function causing zoom
    206 	bool wShaped;              ///< This window is Shape'd
    207 	/// Which protocols this window handles.  From WM_PROTOCOLS property
    208 	/// via XGetWMProtocols()
    209 	unsigned long protocols;
    210 	Colormaps cmaps;           ///< colormaps for this application
    211 	/// Button windows in the titlebar.  \ingroup win_frame
    212 	TBWindow *titlebuttons;
    213 	SqueezeInfo *squeeze_info;  ///< Control info for title squeezing
    214 	bool squeeze_info_copied;   ///< Should ->squeeze_info be free()'d?
    215 
    216 	/// Window ring connectivity
    217 	struct _ring {
    218 		struct TwmWindow *next; ///< Next window in the ring
    219 		struct TwmWindow *prev; ///< Previous window in the ring
    220 		bool cursor_valid;  ///< Whether curs_x and curs_y are usable
    221 		int curs_x;         ///< Stored cursor position in the window
    222 		int curs_y;         ///< Stored cursor position in the window
    223 	} ring; ///< \copydoc TwmWindow::_ring
    224 	// x-ref ScreenInfo.InfoWindow about doxygen hackery
    225 
    226 	// Many of these are just the window's particular casing of various
    227 	// config params, inherited from the screen's info.  In most cases,
    228 	// they're essentially a read-only cache.
    229 	bool OpaqueMove;      ///< Move opaquely.  \sa ScreenInfo.DoOpaqueMove
    230 	bool OpaqueResize;    ///< Resize opaquely.  \sa ScreenInfo.DoOpaqueResize
    231 	bool UnmapByMovingFarAway;  ///< \sa ScreenInfo.UnmapByMovingFarAway
    232 	bool AutoSqueeze;     ///< \sa ScreenInfo.AutoSqueeze
    233 	bool StartSqueezed;   ///< \sa ScreenInfo.StartSqueezed
    234 	bool AlwaysSqueezeToGravity; ///< \sa ScreenInfo.AlwaysSqueezeToGravity
    235 	bool DontSetInactive; ///< \sa ScreenInfo.DontSetInactive
    236 
    237 	bool hasfocusvisible; ///< The window visibly has focus
    238 
    239 	int occupation;  ///< Workspaces the window is in (bitmap)
    240 
    241 	Image *HiliteImage; ///< Titlebar hilite backround.  \ingroup win_frame
    242 	Image *LoliteImage; ///< Titlebar lolite backround.  \ingroup win_frame
    243 
    244 	/// WindowRegion containing this window.  \todo Write-only?  Reap?
    245 	WindowRegion *wr;
    246 #ifdef WINBOX
    247 	WindowBox *winbox; ///< WindowBox containing this window.
    248 	bool iswinbox;     ///< This is a WindowBox window.
    249 #endif
    250 
    251 	/// Saved window geometry.  Used in f.savegeometry and
    252 	/// f.restoregeometry.
    253 	struct _savegeometry {
    254 		int x;  ///< Saved x coord
    255 		int y;  ///< Saved y coord
    256 		unsigned int width;  ///< Saved width
    257 		unsigned int height; ///< Saved height
    258 	} savegeometry; ///< \copydoc TwmWindow::_savegeometry
    259 
    260 	/// Where the window is currently mapped (may be NULL)
    261 	struct VirtualScreen *vs;
    262 	/// Where the window is parented.  Always set.
    263 	struct VirtualScreen *parent_vs;
    264 
    265 	/// Where the window would be.  Used only by f.showbackground.
    266 	/// \sa ShowBackground()
    267 	struct VirtualScreen *savevs;
    268 
    269 	/// Has \ref TwmWindow::name ever changed?  Used only in session saving.
    270 	bool nameChanged;
    271 	/// Has \ref TwmWindow::attr width ever changed?  Used only in sessions.
    272 	bool widthEverChangedByUser;
    273 	/// Has \ref TwmWindow::attr height ever changed?  Used only in sessions.
    274 	bool heightEverChangedByUser;
    275 
    276 #ifdef EWMH
    277 	EwmhWindowType ewmhWindowType; ///< EWMH-defined window type
    278 	int ewmhFlags; ///< EWMH-defined window stats. Mostly from _NET_WM_STATE.
    279 #endif /* EWMH */
    280 };
    281 
    282 #endif /* _CTWM_TWM_WINDOW_STRUCT_H */
    283