Configuration of dwm for Mac Computers
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
6.0 KiB

18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
18 years ago
  1. /* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
  2. * See LICENSE file for license details.
  3. *
  4. * dynamic window manager is designed like any other X client as well. It is
  5. * driven through handling X events. In contrast to other X clients, a window
  6. * manager selects for SubstructureRedirectMask on the root window, to receive
  7. * events about window (dis-)appearance. Only one X connection at a time is
  8. * allowed to select for this event mask.
  9. *
  10. * Calls to fetch an X event from the event queue are blocking. Due reading
  11. * status text from standard input, a select()-driven main loop has been
  12. * implemented which selects for reads on the X connection and STDIN_FILENO to
  13. * handle all data smoothly. The event handlers of dwm are organized in an
  14. * array which is accessed whenever a new event has been fetched. This allows
  15. * event dispatching in O(1) time.
  16. *
  17. * Each child of the root window is called a client, except windows which have
  18. * set the override_redirect flag. Clients are organized in a global
  19. * doubly-linked client list, the focus history is remembered through a global
  20. * stack list. Each client contains an array of Bools of the same size as the
  21. * global tags array to indicate the tags of a client. For each client dwm
  22. * creates a small title window, which is resized whenever the (_NET_)WM_NAME
  23. * properties are updated or the client is moved/resized.
  24. *
  25. * Keys and tagging rules are organized as arrays and defined in the config.h
  26. * file. These arrays are kept static in event.o and tag.o respectively,
  27. * because no other part of dwm needs access to them. The current layout is
  28. * represented by the lt pointer.
  29. *
  30. * To understand everything else, start reading main.c:main().
  31. */
  32. #include "config.h"
  33. #include <X11/Xlib.h>
  34. /* mask shorthands, used in event.c and client.c */
  35. #define BUTTONMASK (ButtonPressMask | ButtonReleaseMask)
  36. enum { NetSupported, NetWMName, NetLast }; /* EWMH atoms */
  37. enum { WMProtocols, WMDelete, WMState, WMLast }; /* default atoms */
  38. enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
  39. enum { ColBorder, ColFG, ColBG, ColLast }; /* color */
  40. typedef struct Client Client;
  41. struct Client {
  42. char name[256];
  43. int x, y, w, h;
  44. int rx, ry, rw, rh; /* revert geometry */
  45. int basew, baseh, incw, inch, maxw, maxh, minw, minh;
  46. int minax, maxax, minay, maxay;
  47. long flags;
  48. unsigned int border;
  49. Bool isbanned, isfixed, ismax, isfloating;
  50. Bool *tags;
  51. Client *next;
  52. Client *prev;
  53. Client *snext;
  54. Window win;
  55. };
  56. typedef struct {
  57. int x, y, w, h;
  58. unsigned long norm[ColLast];
  59. unsigned long sel[ColLast];
  60. Drawable drawable;
  61. GC gc;
  62. struct {
  63. int ascent;
  64. int descent;
  65. int height;
  66. XFontSet set;
  67. XFontStruct *xfont;
  68. } font;
  69. } DC; /* draw context */
  70. typedef struct {
  71. const char *symbol;
  72. void (*arrange)(void);
  73. } Layout;
  74. extern const char *tags[]; /* all tags */
  75. char stext[256]; /* status text */
  76. int screen, sx, sy, sw, sh; /* screen geometry */
  77. int wax, way, wah, waw; /* windowarea geometry */
  78. unsigned int bh, blw; /* bar height, bar layout label width */
  79. unsigned int ntags, numlockmask; /* number of tags, dynamic lock mask */
  80. void (*handler[LASTEvent])(XEvent *); /* event handler */
  81. Atom wmatom[WMLast], netatom[NetLast];
  82. Bool selscreen, *seltag; /* seltag is array of Bool */
  83. Client *clients, *sel, *stack; /* global client list and stack */
  84. Cursor cursor[CurLast];
  85. DC dc; /* global draw context */
  86. Display *dpy;
  87. Layout *lt;
  88. Window root, barwin;
  89. /* client.c */
  90. void attach(Client *c); /* attaches c to global client list */
  91. void configure(Client *c); /* send synthetic configure event */
  92. void detach(Client *c); /* detaches c from global client list */
  93. void focus(Client *c); /* focus c, c may be NULL */
  94. void killclient(const char *arg); /* kill c nicely */
  95. void manage(Window w, XWindowAttributes *wa); /* manage new client */
  96. void resize(Client *c, int x, int y,
  97. int w, int h, Bool sizehints); /* resize with given coordinates c*/
  98. void togglefloating(const char *arg); /* toggles focused client between floating/tiled state */
  99. void updatesizehints(Client *c); /* update the size hint variables of c */
  100. void updatetitle(Client *c); /* update the name of c */
  101. void unmanage(Client *c); /* destroy c */
  102. /* draw.c */
  103. void drawstatus(void); /* draw the bar */
  104. void drawtext(const char *text, unsigned long col[ColLast]); /* draw text */
  105. unsigned int textw(const char *text); /* return the width of text in px*/
  106. /* event.c */
  107. void grabkeys(void); /* grab all keys defined in config.h */
  108. /* layout.c */
  109. void floating(void); /* arranges all windows floating */
  110. void focusclient(const char *arg); /* focuses next(1)/previous(-1) visible client */
  111. void incmasterw(const char *arg); /* increments the master width with arg's index value */
  112. void incnmaster(const char *arg); /* increments nmaster with arg's index value */
  113. void initlayouts(void); /* initialize layout array */
  114. Client *nexttiled(Client *c); /* returns tiled successor of c */
  115. void restack(void); /* restores z layers of all clients */
  116. void setlayout(const char *arg); /* sets layout, -1 toggles */
  117. void togglemax(const char *arg); /* toggles maximization of floating client */
  118. void zoom(const char *arg); /* zooms the focused client to master area, arg is ignored */
  119. /* main.c */
  120. void quit(const char *arg); /* quit dwm nicely */
  121. int xerror(Display *dsply, XErrorEvent *ee); /* dwm's X error handler */
  122. /* tag.c */
  123. void compileregs(void); /* initialize regexps of rules defined in config.h */
  124. Bool isvisible(Client *c); /* returns True if client is visible */
  125. void settags(Client *c, Client *trans); /* sets tags of c */
  126. void tag(const char *arg); /* tags c with arg's index */
  127. void toggletag(const char *arg); /* toggles c tags with arg's index */
  128. void toggleview(const char *arg); /* toggles the tag with arg's index (in)visible */
  129. void view(const char *arg); /* views the tag with arg's index */
  130. /* util.c */
  131. void *emallocz(unsigned int size); /* allocates zero-initialized memory, exits on error */
  132. void eprint(const char *errstr, ...); /* prints errstr and exits with 1 */
  133. void spawn(const char *arg); /* forks a new subprocess with arg's cmd */