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 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
|
/*
* lwm, a window manager for X11
* Copyright (C) 1997-2003 Elliott Hughes, James Carter
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* --- Administrator-configurable defaults. --- */
#define DEFAULT_TITLE_FONT "-*-lucida-bold-r-normal-sans-14-*-*-*-p-*-iso10646-1"
#define DEFAULT_POPUP_FONT "-*-lucida-medium-r-normal-sans-12-*-*-*-p-*-iso10646-1"
#define DEFAULT_TERMINAL "x-terminal-emulator"
#define DEFAULT_BORDER 6
#define HIDE_BUTTON Button3
#define MOVE_BUTTON Button2
#define RESHAPE_BUTTON Button1
#define EDGE_RESIST 32
/* --- End of administrator-configurable defaults. --- */
/*
* Window manager mode. wm is in one of five modes: it's either getting
* user input to move/reshape a window, getting user input to make a
* selection from the menu, waiting for user input to confirm a window close
* (by releasing a mouse button after prssing it in a window's box),
* waiting for user input to confirm a window hide (by releasing a mouse
* button after prssing it in a window's frame),
* or it's `idle' --- responding to events arriving
* from the server, but not directly interacting with the user.
* OK, so I lied: there's a sixth mode so that we can tell when wm's still
* initialising.
*/
typedef enum {
wm_initialising,
wm_idle,
wm_reshaping,
wm_menu_up,
wm_closing_window,
wm_hiding_window
} Mode;
/** Window internal state. Yuck. */
typedef enum {
IPendingReparenting, INormal
} IState ;
/**
* Focus mode, may me (and defaults to) enter where entering a window gives
* that window input focus, or click where a window must be explicitly clicked
* to give it the focus.
*/
typedef enum {
focus_enter, focus_click
} FocusMode;
/**
* Window edge, used in resizing. The `edge' ENone is used to signify a
* window move rather than a resize. The code is sufficiently similar that
* this isn't a special case to be treated separately.
*/
typedef enum {
ETopLeft, ETop, ETopRight,
ERight, ENone, ELeft,
EBottomLeft, EBottom, EBottomRight,
E_LAST
} Edge ;
/**
* EWMH direction for _NET_WM_MOVERESIZE
*/
typedef enum {
DSizeTopLeft, DSizeTop, DSizeTopRight,
DSizeRight, DSizeBottomRight, DSizeBottom,
DSizeBottomLeft, DSizeLeft, DMove,
DSizeKeyboard, DMoveKeyboard
} EWMHDirection;
/**
* EWMH window type. See section 5.6 of the EWMH specification (1.2).
* WTypeNone indicates that no EWMH window type as been set and MOTIF
* hints should be used instead.
*/
typedef enum {
WTypeDesktop, WTypeDock, WTypeToolbar,
WTypeMenu, WTypeUtility, WTypeSplash,
WTypeDialog, WTypeNormal, WTypeNone
} EWMHWindowType;
/**
* EWMH window state, See section 5.7 of the EWMH specification (1.2).
* lwm does not support all states. _NET_WM_STATE_HIDDEN is taken from
* Client.hidden.
*/
typedef struct {
Bool skip_taskbar;
Bool skip_pager;
Bool fullscreen;
Bool above;
Bool below;
} EWMHWindowState;
/**
* EWMH "strut", or area on each edge of the screen reserved for docking
* bars/panels.
*/
typedef struct {
unsigned int left;
unsigned int right;
unsigned int top;
unsigned int bottom;
} EWMHStrut;
/**
* Screen information.
*/
typedef struct ScreenInfo ScreenInfo;
struct ScreenInfo {
Window root;
Window popup;
Window ewmh_compat;
int display_width; /* The width of the screen. */
int display_height; /* The height of the screen. */
EWMHStrut strut; /* reserved areas */
GC gc; /* The default GC. */
GC gc_thin; /* The default GC but with thinner lines. */
GC menu_gc; /* The GC for the popup window (menu). */
GC size_gc; /* The GC for the popup window (sizing). */
unsigned long black; /* Black pixel value. */
unsigned long white; /* White pixel value. */
unsigned long gray; /* Gray pixel value. */
Cursor root_cursor;
Cursor box_cursor;
Cursor cursor_map[E_LAST];
Bool ewmh_set_client_list; /* hack to prevent recursion */
char * display_spec;
};
typedef struct Client Client;
struct Client {
Window window; /* Client's window. */
Window parent; /* Window manager frame. */
Window trans; /* Window that client is a transient for. */
Bool framed; /* True is lwm is maintaining a frame */
Client * next; /* Next window in client list. */
int border; /* Client's original border width. */
XSizeHints size; /* Client's current geometry information. */
XSizeHints return_size; /* Client's old geometry information. */
int state; /* Window state. See ICCCM and <X11/Xutil.h> */
Bool hidden; /* True if this client is hidden. */
IState internal_state;
int proto;
int accepts_focus; /* Does this window want keyboard events? */
char * name; /* Name used for title in frame. */
int namelen;
char * menu_name; /* Name used in root popup */
int menu_namelen;
Bool name_utf8;
ScreenInfo * screen;
Edge cursor; /* indicates which cursor is being used for parent window */
EWMHWindowType wtype;
EWMHWindowState wstate;
EWMHStrut strut; /* reserved areas */
/* Colourmap scum. */
Colormap cmap;
int ncmapwins;
Window * cmapwins;
Colormap * wmcmaps;
};
/*
* c->proto is a bitarray of these
*/
enum {
Pdelete = 1,
Ptakefocus = 2
};
/*
* This should really have been in X.h --- if you select both ButtonPress
* and ButtonRelease events, the server makes an automatic grab on the
* pressed button for you. This is almost always exactly what you want.
*/
#define ButtonMask (ButtonPressMask | ButtonReleaseMask)
/* lwm.c */
extern Mode mode;
extern int start_x;
extern int start_y;
extern Display * dpy;
extern int screen_count;
extern ScreenInfo * screens;
extern ScreenInfo * current_screen;
extern XFontSet font_set;
extern XFontSetExtents *font_set_ext;
extern XFontSet popup_font_set;
extern XFontSetExtents *popup_font_set_ext;
extern Atom _mozilla_url;
extern Atom motif_wm_hints;
extern Atom wm_state;
extern Atom wm_change_state;
extern Atom wm_protocols;
extern Atom wm_delete;
extern Atom wm_take_focus;
extern Atom wm_colormaps;
extern Atom compound_text;
extern Bool shape;
extern int shape_event;
extern char *argv0;
extern void shell(ScreenInfo *, int, int, int);
extern void sendConfigureNotify(Client *);
extern int titleHeight(void);
extern int titleWidth(XFontSet font_set, Client *c);
extern int popupHeight(void);
extern int popupWidth(char *string, int string_length);
extern int ascent(XFontSetExtents *font_set_ext);
extern ScreenInfo * getScreenFromRoot(Window);
extern void scanWindowTree(int);
/* client.c */
extern Client *client_head(void);
extern Edge interacting_edge;
extern Client *Client_Get(Window);
extern Client *Client_Add(Window, Window);
extern void Client_MakeSane(Client *, Edge, int *, int *, int *, int *);
extern void Client_DrawBorder(Client *, int);
extern void setactive(Client *, int, long);
extern void Client_SizeFeedback(void);
extern void size_expose(void);
extern void Client_ReshapeEdge(Client *, Edge);
extern void Client_Move(Client*);
extern void Client_SetState(Client *, int);
extern void Client_Raise(Client *);
extern void Client_Lower(Client *);
extern void Client_Close(Client *);
extern void Client_Remove(Client *);
extern void Client_FreeAll(void);
extern void Client_ColourMap(XEvent*);
extern void Client_EnterFullScreen(Client *c);
extern void Client_ExitFullScreen(Client *c);
extern void Client_Focus(Client *c, Time time);
extern void Client_ResetAllCursors(void);
extern void Client_Name(Client *c, const char *name, Bool is_utf8);
extern int hidden(Client *);
extern int withdrawn(Client *);
extern int normal(Client *);
extern void update_client_list(ScreenInfo *screen);
extern Client *current;
/* cursor.c */
extern Cursor getEdgeCursor(Edge edge);
extern void initialiseCursors(int);
/* disp.c */
extern void dispatch(XEvent *);
extern void reshaping_motionnotify(XEvent *);
/* error.c */
extern int ignore_badwindow;
extern int errorHandler(Display *, XErrorEvent *);
extern void panic(char*);
/* manage.c */
extern void getWindowName(Client *);
extern void getNormalHints(Client *);
extern Bool motifWouldDecorate(Client *);
extern void manage(Client *, int);
extern void withdraw(Client *);
extern void cmapfocus(Client *);
extern void getColourmaps(Client *);
extern void getTransientFor(Client *);
extern void Terminate(int);
/* mouse.c */
extern void getMousePosition(int *, int *);
extern void hide(Client *);
extern void unhidec(Client *, int);
extern int menu_whichitem(int, int);
extern void menuhit(XButtonEvent *);
extern void unhide(int, int);
extern void menu_expose(void);
extern void menu_motionnotify(XEvent *);
extern void menu_buttonrelease(XEvent *);
/* shape.c */
extern int shapeEvent(XEvent *);
extern int serverSupportsShapes(void);
extern int isShaped(Window);
extern void setShape(Client *);
/* resource.c */
extern char *font_name;
extern char *popup_font_name;
extern char *btn1_command;
extern char *btn2_command;
extern int border;
extern FocusMode focus_mode;
extern char * sdup(char *);
extern void parseResources(void);
/* session.c */
extern int ice_fd;
extern void session_init(int argc, char *argv[]);
extern void session_process(void);
extern void session_end(void);
/* ewmh.c */
extern Atom ewmh_atom[];
extern void ewmh_init(void);
extern void ewmh_init_screens(void);
extern EWMHWindowType ewmh_get_window_type(Window w);
extern Bool ewmh_get_window_name(Client *c);
extern Bool ewmh_hasframe(Client *c);
extern void ewmh_set_state(Client *c);
extern void ewmh_get_state(Client *c);
extern void ewmh_change_state(Client *c, unsigned long action,
unsigned long atom);
extern void ewmh_set_allowed(Client *c);
extern void ewmh_set_client_list(ScreenInfo *screen);
extern void ewmh_get_strut(Client *c);
extern void ewmh_set_strut(ScreenInfo *screen);
|