|
|
@@ -43,13 +43,199 @@
|
|
|
#include <X11/Xproto.h>
|
|
|
#include <X11/Xutil.h>
|
|
|
|
|
|
-#include "dwm.h"
|
|
|
-
|
|
|
/* macros */
|
|
|
#define BUTTONMASK (ButtonPressMask | ButtonReleaseMask)
|
|
|
#define CLEANMASK(mask) (mask & ~(numlockmask | LockMask))
|
|
|
#define MOUSEMASK (BUTTONMASK | PointerMotionMask)
|
|
|
|
|
|
+/* enums */
|
|
|
+enum { BarTop, BarBot, BarOff }; /* bar position */
|
|
|
+enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
|
|
|
+enum { ColBorder, ColFG, ColBG, ColLast }; /* color */
|
|
|
+enum { NetSupported, NetWMName, NetLast }; /* EWMH atoms */
|
|
|
+enum { WMProtocols, WMDelete, WMName, WMState, WMLast };/* default atoms */
|
|
|
+
|
|
|
+/* typedefs */
|
|
|
+typedef struct Client Client;
|
|
|
+struct Client {
|
|
|
+ char name[256];
|
|
|
+ int x, y, w, h;
|
|
|
+ int rx, ry, rw, rh; /* revert geometry */
|
|
|
+ int basew, baseh, incw, inch, maxw, maxh, minw, minh;
|
|
|
+ int minax, maxax, minay, maxay;
|
|
|
+ long flags;
|
|
|
+ unsigned int border, oldborder;
|
|
|
+ Bool isbanned, isfixed, ismax, isfloating, wasfloating;
|
|
|
+ Bool *tags;
|
|
|
+ Client *next;
|
|
|
+ Client *prev;
|
|
|
+ Client *snext;
|
|
|
+ Window win;
|
|
|
+};
|
|
|
+
|
|
|
+typedef struct {
|
|
|
+ int x, y, w, h;
|
|
|
+ unsigned long norm[ColLast];
|
|
|
+ unsigned long sel[ColLast];
|
|
|
+ Drawable drawable;
|
|
|
+ GC gc;
|
|
|
+ struct {
|
|
|
+ int ascent;
|
|
|
+ int descent;
|
|
|
+ int height;
|
|
|
+ XFontSet set;
|
|
|
+ XFontStruct *xfont;
|
|
|
+ } font;
|
|
|
+} DC; /* draw context */
|
|
|
+
|
|
|
+typedef struct {
|
|
|
+ unsigned long mod;
|
|
|
+ KeySym keysym;
|
|
|
+ void (*func)(const char *arg);
|
|
|
+ const char *arg;
|
|
|
+} Key;
|
|
|
+
|
|
|
+typedef struct {
|
|
|
+ const char *symbol;
|
|
|
+ void (*arrange)(void);
|
|
|
+} Layout;
|
|
|
+
|
|
|
+typedef struct {
|
|
|
+ const char *prop;
|
|
|
+ const char *tags;
|
|
|
+ Bool isfloating;
|
|
|
+} Rule;
|
|
|
+
|
|
|
+typedef struct {
|
|
|
+ regex_t *propregex;
|
|
|
+ regex_t *tagregex;
|
|
|
+} Regs;
|
|
|
+
|
|
|
+/* functions */
|
|
|
+void applyrules(Client *c);
|
|
|
+void arrange(void);
|
|
|
+void attach(Client *c);
|
|
|
+void attachstack(Client *c);
|
|
|
+void ban(Client *c);
|
|
|
+void buttonpress(XEvent *e);
|
|
|
+void checkotherwm(void);
|
|
|
+void cleanup(void);
|
|
|
+void compileregs(void);
|
|
|
+void configure(Client *c);
|
|
|
+void configurenotify(XEvent *e);
|
|
|
+void configurerequest(XEvent *e);
|
|
|
+void destroynotify(XEvent *e);
|
|
|
+void detach(Client *c);
|
|
|
+void detachstack(Client *c);
|
|
|
+void drawbar(void);
|
|
|
+void drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]);
|
|
|
+void drawtext(const char *text, unsigned long col[ColLast]);
|
|
|
+void *emallocz(unsigned int size);
|
|
|
+void enternotify(XEvent *e);
|
|
|
+void eprint(const char *errstr, ...);
|
|
|
+void expose(XEvent *e);
|
|
|
+void floating(void); /* default floating layout */
|
|
|
+void focus(Client *c);
|
|
|
+void focusnext(const char *arg);
|
|
|
+void focusprev(const char *arg);
|
|
|
+Client *getclient(Window w);
|
|
|
+unsigned long getcolor(const char *colstr);
|
|
|
+long getstate(Window w);
|
|
|
+Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
|
|
|
+void grabbuttons(Client *c, Bool focused);
|
|
|
+unsigned int idxoftag(const char *tag);
|
|
|
+void initfont(const char *fontstr);
|
|
|
+Bool isarrange(void (*func)());
|
|
|
+Bool isoccupied(unsigned int t);
|
|
|
+Bool isprotodel(Client *c);
|
|
|
+Bool isvisible(Client *c);
|
|
|
+void keypress(XEvent *e);
|
|
|
+void killclient(const char *arg);
|
|
|
+void leavenotify(XEvent *e);
|
|
|
+void manage(Window w, XWindowAttributes *wa);
|
|
|
+void mappingnotify(XEvent *e);
|
|
|
+void maprequest(XEvent *e);
|
|
|
+void movemouse(Client *c);
|
|
|
+Client *nexttiled(Client *c);
|
|
|
+void propertynotify(XEvent *e);
|
|
|
+void quit(const char *arg);
|
|
|
+void resize(Client *c, int x, int y, int w, int h, Bool sizehints);
|
|
|
+void resizemouse(Client *c);
|
|
|
+void restack(void);
|
|
|
+void run(void);
|
|
|
+void scan(void);
|
|
|
+void setclientstate(Client *c, long state);
|
|
|
+void setlayout(const char *arg);
|
|
|
+void setmwfact(const char *arg);
|
|
|
+void setup(void);
|
|
|
+void spawn(const char *arg);
|
|
|
+void tag(const char *arg);
|
|
|
+unsigned int textnw(const char *text, unsigned int len);
|
|
|
+unsigned int textw(const char *text);
|
|
|
+void tile(void);
|
|
|
+void togglebar(const char *arg);
|
|
|
+void togglefloating(const char *arg);
|
|
|
+void togglemax(const char *arg);
|
|
|
+void toggletag(const char *arg);
|
|
|
+void toggleview(const char *arg);
|
|
|
+void unban(Client *c);
|
|
|
+void unmanage(Client *c);
|
|
|
+void unmapnotify(XEvent *e);
|
|
|
+void updatebarpos(void);
|
|
|
+void updatesizehints(Client *c);
|
|
|
+void updatetitle(Client *c);
|
|
|
+void view(const char *arg);
|
|
|
+void viewprevtag(const char *arg); /* views previous selected tags */
|
|
|
+int xerror(Display *dpy, XErrorEvent *ee);
|
|
|
+int xerrordummy(Display *dsply, XErrorEvent *ee);
|
|
|
+int xerrorstart(Display *dsply, XErrorEvent *ee);
|
|
|
+void zoom(const char *arg);
|
|
|
+
|
|
|
+/* variables */
|
|
|
+char stext[256];
|
|
|
+double mwfact;
|
|
|
+int screen, sx, sy, sw, sh, wax, way, waw, wah;
|
|
|
+int (*xerrorxlib)(Display *, XErrorEvent *);
|
|
|
+unsigned int bh, bpos;
|
|
|
+unsigned int blw = 0;
|
|
|
+unsigned int ltidx = 0; /* default */
|
|
|
+unsigned int nlayouts = 0;
|
|
|
+unsigned int nrules = 0;
|
|
|
+unsigned int numlockmask = 0;
|
|
|
+void (*handler[LASTEvent]) (XEvent *) = {
|
|
|
+ [ButtonPress] = buttonpress,
|
|
|
+ [ConfigureRequest] = configurerequest,
|
|
|
+ [ConfigureNotify] = configurenotify,
|
|
|
+ [DestroyNotify] = destroynotify,
|
|
|
+ [EnterNotify] = enternotify,
|
|
|
+ [LeaveNotify] = leavenotify,
|
|
|
+ [Expose] = expose,
|
|
|
+ [KeyPress] = keypress,
|
|
|
+ [MappingNotify] = mappingnotify,
|
|
|
+ [MapRequest] = maprequest,
|
|
|
+ [PropertyNotify] = propertynotify,
|
|
|
+ [UnmapNotify] = unmapnotify
|
|
|
+};
|
|
|
+Atom wmatom[WMLast], netatom[NetLast];
|
|
|
+Bool otherwm, readin;
|
|
|
+Bool running = True;
|
|
|
+Bool selscreen = True;
|
|
|
+Client *clients = NULL;
|
|
|
+Client *sel = NULL;
|
|
|
+Client *stack = NULL;
|
|
|
+Cursor cursor[CurLast];
|
|
|
+Display *dpy;
|
|
|
+DC dc = {0};
|
|
|
+Window barwin, root;
|
|
|
+Regs *regs = NULL;
|
|
|
+
|
|
|
+/* configuration, allows nested code to access above variables */
|
|
|
+#include "config.h"
|
|
|
+
|
|
|
+/* statically define the number of tags. */
|
|
|
+unsigned int ntags = sizeof tags / sizeof tags[0];
|
|
|
+Bool seltags[sizeof tags / sizeof tags[0]] = {[0] = True};
|
|
|
+Bool prevtags[sizeof tags / sizeof tags[0]] = {[0] = True};
|
|
|
void
|
|
|
applyrules(Client *c) {
|
|
|
static char buf[512];
|