about summary refs log tree commit diff stats
BranchCommit messageAuthorAge
bongkeys: st-xterm compatAcid Bong3 years
masterbump version to 6.4Hiltjo Posthuma3 years
musldmenumon fixAcid Bong3 years
 
TagDownloadAuthorAge
6.4dwm-6.4.tar.gz  Hiltjo Posthuma3 years
6.3dwm-6.3.tar.gz  Hiltjo Posthuma4 years
6.2dwm-6.2.tar.gz  Anselm R Garbe7 years
6.1dwm-6.1.tar.gz  Hiltjo Posthuma10 years
6.0dwm-6.0.tar.gz  anselm@garbe.us14 years
5.9dwm-5.9.tar.gz  garbeam@gmail.com14 years
5.8.2dwm-5.8.2.tar.gz  Anselm R Garbe15 years
5.8.1dwm-5.8.1.tar.gz  Anselm R Garbe15 years
5.8dwm-5.8.tar.gz  anselm@garbe.us15 years
5.7.2dwm-5.7.2.tar.gz  Anselm R Garbe16 years
5.7.1dwm-5.7.1.tar.gz  Anselm R Garbe16 years
5.7dwm-5.7.tar.gz  Anselm R Garbe16 years
5.6.1dwm-5.6.1.tar.gz  Anselm R Garbe16 years
5.6dwm-5.6.tar.gz  Anselm R Garbe16 years
5.5dwm-5.5.tar.gz  Anselm R Garbe16 years
5.4.1dwm-5.4.1.tar.gz  a@null17 years
5.4dwm-5.4.tar.gz  a@null17 years
5.3.1dwm-5.3.1.tar.gz  Anselm R Garbe17 years
5.3dwm-5.3.tar.gz  Anselm R Garbe17 years
5.2dwm-5.2.tar.gz  Anselm R Garbe17 years
5.1dwm-5.1.tar.gz  Anselm R Garbe17 years
5.0dwm-5.0.tar.gz  Anselm R Garbe17 years
4.9dwm-4.9.tar.gz  Anselm R Garbe17 years
4.8dwm-4.8.tar.gz  Anselm R Garbe17 years
4.7dwm-4.7.tar.gz  Anselm R. Garbe18 years
4.6dwm-4.6.tar.gz  arg@suckless.org18 years
4.5dwm-4.5.tar.gz  Anselm R. Garbe18 years
4.4.1dwm-4.4.1.tar.gz  Anselm R. Garbe18 years
4.4dwm-4.4.tar.gz  Anselm R. Garbe18 years
4.3dwm-4.3.tar.gz  arg@f00b4r18 years
4.2dwm-4.2.tar.gz  Anselm R. Garbe18 years
4.1dwm-4.1.tar.gz  Anselm R. Garbe18 years
4.0dwm-4.0.tar.gz  Anselm R. Garbe18 years
3.9dwm-3.9.tar.gz  Anselm R. Garbe18 years
3.8dwm-3.8.tar.gz  Anselm R. Garbe18 years
3.7dwm-3.7.tar.gz  Anselm R. Garbe18 years
3.6.1dwm-3.6.1.tar.gz  Anselm R. Garbe18 years
3.6dwm-3.6.tar.gz  Anselm R. Garbe18 years
3.5dwm-3.5.tar.gz  Anselm R. Garbe18 years
3.4dwm-3.4.tar.gz  Anselm R. Garbe19 years
3.3dwm-3.3.tar.gz  Anselm R. Garbe19 years
3.2.2dwm-3.2.2.tar.gz  Anselm R. Garbe19 years
3.2.1dwm-3.2.1.tar.gz  Anselm R. Garbe19 years
3.2dwm-3.2.tar.gz  Anselm R. Garbe19 years
3.1dwm-3.1.tar.gz  Anselm R. Garbe19 years
3.0dwm-3.0.tar.gz  Anselm R. Garbe19 years
2.9dwm-2.9.tar.gz  Anselm R. Garbe19 years
2.8dwm-2.8.tar.gz  arg@mig2919 years
2.7dwm-2.7.tar.gz  arg@mig2919 years
2.6dwm-2.6.tar.gz  arg@mig2919 years
2.5.1dwm-2.5.1.tar.gz  arg@mig2919 years
2.5dwm-2.5.tar.gz  arg@mig2919 years
2.4dwm-2.4.tar.gz  arg@mig2919 years
2.3dwm-2.3.tar.gz  arg@mig2919 years
2.2dwm-2.2.tar.gz  arg@mig2919 years
2.1dwm-2.1.tar.gz  arg@mig2919 years
2.0dwm-2.0.tar.gz  arg@mig2919 years
1.9dwm-1.9.tar.gz  Anselm R. Garbe19 years
1.8dwm-1.8.tar.gz  Anselm R. Garbe19 years
1.7.1dwm-1.7.1.tar.gz  Anselm R. Garbe19 years
1.7dwm-1.7.tar.gz  arg@mmvi19 years
1.6dwm-1.6.tar.gz  arg@mmvi19 years
1.5dwm-1.5.tar.gz  Anselm R. Garbe19 years
1.4dwm-1.4.tar.gz  Anselm R. Garbe19 years
1.3dwm-1.3.tar.gz  Anselm R. Garbe19 years
1.2dwm-1.2.tar.gz  Anselm R. Garbe19 years
1.1dwm-1.1.tar.gz  Anselm R. Garbe19 years
1.0dwm-1.0.tar.gz  Anselm R. Garbe19 years
0.9dwm-0.9.tar.gz  Anselm R.Garbe19 years
0.8dwm-0.8.tar.gz  Anselm R.Garbe19 years
0.7dwm-0.7.tar.gz  arg@10ksloc.org19 years
0.6dwm-0.6.tar.gz  arg@10ksloc.org19 years
0.5dwm-0.5.tar.gz  arg@10ksloc.org19 years
0.4dwm-0.4.tar.gz  arg@10ksloc.org19 years
0.3dwm-0.3.tar.gz  arg@10ksloc.org19 years
0.2dwm-0.2.tar.gz  Anselm R. Garbe19 years
0.1dwm-0.1.tar.gz  Anselm R. Garbe19 years
ass="w"> if(focused) { XGrabButton(dpy, Button1, MODKEY, c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); XGrabButton(dpy, Button1, MODKEY | LockMask, c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); XGrabButton(dpy, Button1, MODKEY | numlockmask, c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); XGrabButton(dpy, Button1, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); XGrabButton(dpy, Button2, MODKEY, c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); XGrabButton(dpy, Button2, MODKEY | LockMask, c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); XGrabButton(dpy, Button2, MODKEY | numlockmask, c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); XGrabButton(dpy, Button2, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); XGrabButton(dpy, Button3, MODKEY, c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); XGrabButton(dpy, Button3, MODKEY | LockMask, c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); XGrabButton(dpy, Button3, MODKEY | numlockmask, c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); XGrabButton(dpy, Button3, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); } else XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); } static Bool isprotodel(Client *c) { int i, n; Atom *protocols; Bool ret = False; if(XGetWMProtocols(dpy, c->win, &protocols, &n)) { for(i = 0; !ret && i < n; i++) if(protocols[i] == wmatom[WMDelete]) ret = True; XFree(protocols); } return ret; } static void setclientstate(Client *c, long state) { long data[] = {state, None}; XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, PropModeReplace, (unsigned char *)data, 2); } static int xerrordummy(Display *dsply, XErrorEvent *ee) { return 0; } /* extern */ void attach(Client *c) { if(clients) clients->prev = c; c->next = clients; clients = c; } void configure(Client *c) { XConfigureEvent ce; ce.type = ConfigureNotify; ce.display = dpy; ce.event = c->win; ce.window = c->win; ce.x = c->x; ce.y = c->y; ce.width = c->w; ce.height = c->h; ce.border_width = c->border; ce.above = None; ce.override_redirect = False; XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce); } void detach(Client *c) { if(c->prev) c->prev->next = c->next; if(c->next) c->next->prev = c->prev; if(c == clients) clients = c->next; c->next = c->prev = NULL; } void focus(Client *c) { if(c && !isvisible(c)) return; if(sel && sel != c) { grabbuttons(sel, False); XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]); } if(c) { detachstack(c); attachstack(c); grabbuttons(c, True); } sel = c; drawstatus(); if(!selscreen) return; if(c) { XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]); XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); } else XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); } void killclient(const char *arg) { XEvent ev; if(!sel) return; if(isprotodel(sel)) { ev.type = ClientMessage; ev.xclient.window = sel->win; ev.xclient.message_type = wmatom[WMProtocols]; ev.xclient.format = 32; ev.xclient.data.l[0] = wmatom[WMDelete]; ev.xclient.data.l[1] = CurrentTime; XSendEvent(dpy, sel->win, False, NoEventMask, &ev); } else XKillClient(dpy, sel->win); } void manage(Window w, XWindowAttributes *wa) { Client *c, *t = NULL; Window trans; Status rettrans; XWindowChanges wc; c = emallocz(sizeof(Client)); c->tags = emallocz(ntags * sizeof(Bool)); c->win = w; c->x = wa->x; c->y = wa->y; c->w = wa->width; c->h = wa->height; c->oldborder = wa->border_width; if(c->w == sw && c->h == sh) { c->x = sx; c->y = sy; c->border = wa->border_width; } else { if(c->x + c->w + 2 * c->border > wax + waw) c->x = wax + waw - c->w - 2 * c->border; if(c->y + c->h + 2 * c->border > way + wah) c->y = way + wah - c->h - 2 * c->border; if(c->x < wax) c->x = wax; if(c->y < way) c->y = way; c->border = BORDERPX; } wc.border_width = c->border; XConfigureWindow(dpy, w, CWBorderWidth, &wc); XSetWindowBorder(dpy, w, dc.norm[ColBorder]); configure(c); /* propagates border_width, if size doesn't change */ updatesizehints(c); XSelectInput(dpy, w, StructureNotifyMask | PropertyChangeMask | EnterWindowMask); grabbuttons(c, False); updatetitle(c); if((rettrans = XGetTransientForHint(dpy, w, &trans) == Success)) for(t = clients; t && t->win != trans; t = t->next); settags(c, t); if(!c->isfloating) c->isfloating = (rettrans == Success) || c->isfixed; attach(c); attachstack(c); c->isbanned = True; XMoveWindow(dpy, w, c->x + 2 * sw, c->y); XMapWindow(dpy, w); setclientstate(c, NormalState); if(isvisible(c)) focus(c); lt->arrange(); } void resize(Client *c, int x, int y, int w, int h, Bool sizehints) { float dx, dy, max, min, ratio; XWindowChanges wc; if(w <= 0 || h <= 0) return; if(sizehints) { if(c->minay > 0 && c->maxay > 0 && (h - c->baseh) > 0) { dx = (float)(w - c->basew); dy = (float)(h - c->baseh); min = (float)(c->minax) / (float)(c->minay); max = (float)(c->maxax) / (float)(c->maxay); ratio = dx / dy; if(max > 0 && min > 0 && ratio > 0) { if(ratio < min) { dy = (dx * min + dy) / (min * min + 1); dx = dy * min; w = (int)dx + c->basew; h = (int)dy + c->baseh; } else if(ratio > max) { dy = (dx * min + dy) / (max * max + 1); dx = dy * min; w = (int)dx + c->basew; h = (int)dy + c->baseh; } } } if(c->minw && w < c->minw) w = c->minw; if(c->minh && h < c->minh) h = c->minh; if(c->maxw && w > c->maxw) w = c->maxw; if(c->maxh && h > c->maxh) h = c->maxh; if(c->incw) w -= (w - c->basew) % c->incw; if(c->inch) h -= (h - c->baseh) % c->inch; } if(w <= 0 || h <= 0) return; /* offscreen appearance fixes */ if(x > sw) x = sw - w - 2 * c->border; if(y > sh) y = sh - h - 2 * c->border; if(x + w + 2 * c->border < sx) x = sx; if(y + h + 2 * c->border < sy) y = sy; if(c->x != x || c->y != y || c->w != w || c->h != h) { c->x = wc.x = x; c->y = wc.y = y; c->w = wc.width = w; c->h = wc.height = h; wc.border_width = c->border; XConfigureWindow(dpy, c->win, CWX | CWY | CWWidth | CWHeight | CWBorderWidth, &wc); configure(c); XSync(dpy, False); } } void togglefloating(const char *arg) { if(!sel || lt->arrange == floating) return; sel->isfloating = !sel->isfloating; lt->arrange(); } void updatesizehints(Client *c) { long msize; XSizeHints size; if(!XGetWMNormalHints(dpy, c->win, &size, &msize) || !size.flags) size.flags = PSize; c->flags = size.flags; if(c->flags & PBaseSize) { c->basew = size.base_width; c->baseh = size.base_height; } else if(c->flags & PMinSize) { c->basew = size.min_width; c->baseh = size.min_height; } else c->basew = c->baseh = 0; if(c->flags & PResizeInc) { c->incw = size.width_inc; c->inch = size.height_inc; } else c->incw = c->inch = 0; if(c->flags & PMaxSize) { c->maxw = size.max_width; c->maxh = size.max_height; } else c->maxw = c->maxh = 0; if(c->flags & PMinSize) { c->minw = size.min_width; c->minh = size.min_height; } else if(c->flags & PBaseSize) { c->minw = size.base_width; c->minh = size.base_height; } else c->minw = c->minh = 0; if(c->flags & PAspect) { c->minax = size.min_aspect.x; c->maxax = size.max_aspect.x; c->minay = size.min_aspect.y; c->maxay = size.max_aspect.y; } else c->minax = c->maxax = c->minay = c->maxay = 0; c->isfixed = (c->maxw && c->minw && c->maxh && c->minh && c->maxw == c->minw && c->maxh == c->minh); } void updatetitle(Client *c) { char **list = NULL; int n; XTextProperty name; name.nitems = 0; c->name[0] = 0; XGetTextProperty(dpy, c->win, &name, netatom[NetWMName]); if(!name.nitems) XGetWMName(dpy, c->win, &name); if(!name.nitems) return; if(name.encoding == XA_STRING) strncpy(c->name, (char *)name.value, sizeof c->name); else { if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) { strncpy(c->name, *list, sizeof c->name); XFreeStringList(list); } } XFree(name.value); } void unmanage(Client *c) { Client *nc; XWindowChanges wc; wc.border_width = c->oldborder; /* The server grab construct avoids race conditions. */ XGrabServer(dpy); XSetErrorHandler(xerrordummy); XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ detach(c); detachstack(c); if(sel == c) { for(nc = stack; nc && !isvisible(nc); nc = nc->snext); focus(nc); } XUngrabButton(dpy, AnyButton, AnyModifier, c->win); setclientstate(c, WithdrawnState); free(c->tags); free(c); XSync(dpy, False); XSetErrorHandler(xerror); XUngrabServer(dpy); lt->arrange(); }