| tsimplified several portions of code through replacing rect structs with x,y,h,… | |
| git clone git://src.adamsgaard.dk/dwm | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit dfd84f9bf3b9d949412a73bc62a43109b340d395 | |
| parent 7696c89c90c926f6371b1ee3ec1b13dd2414aa40 | |
| Author: Anselm R. Garbe <[email protected]> | |
| Date: Wed, 12 Jul 2006 15:17:22 +0200 | |
| simplified several portions of code through replacing rect structs with x,y,h,w… | |
| Diffstat: | |
| M bar.c | 17 ++++++++--------- | |
| M client.c | 64 ++++++++++++++++++++---------… | |
| M cmd.c | 12 +++++++----- | |
| M config.h | 8 ++++---- | |
| M draw.c | 45 ++++++++++++++++-------------… | |
| M draw.h | 8 ++++---- | |
| M event.c | 17 ++++++----------- | |
| D font.c | 81 ------------------------------ | |
| M menu.c | 97 +++++++++++++++--------------… | |
| M mouse.c | 20 ++++++++++---------- | |
| M wm.c | 23 ++++++++++------------- | |
| M wm.h | 7 ++++--- | |
| 12 files changed, 164 insertions(+), 235 deletions(-) | |
| --- | |
| diff --git a/bar.c b/bar.c | |
| t@@ -8,23 +8,22 @@ | |
| void | |
| draw_bar() | |
| { | |
| - brush.rect = barrect; | |
| - brush.rect.x = brush.rect.y = 0; | |
| + brush.x = brush.y = 0; | |
| + brush.w = bw; | |
| + brush.h = bh; | |
| draw(dpy, &brush, False, NULL); | |
| if(stack) { | |
| - brush.rect.width = textwidth(&brush.font, stack->name) + label… | |
| + brush.w = textw(&brush.font, stack->name) + bh; | |
| swap((void **)&brush.fg, (void **)&brush.bg); | |
| draw(dpy, &brush, True, stack->name); | |
| swap((void **)&brush.fg, (void **)&brush.bg); | |
| - brush.rect.x += brush.rect.width; | |
| + brush.x += brush.w; | |
| } | |
| - brush.rect.width = textwidth(&brush.font, statustext) + labelheight(&b… | |
| - brush.rect.x = barrect.x + barrect.width - brush.rect.width; | |
| + brush.w = textw(&brush.font, statustext) + bh; | |
| + brush.x = bx + bw - brush.w; | |
| draw(dpy, &brush, False, statustext); | |
| - | |
| - XCopyArea(dpy, brush.drawable, barwin, brush.gc, 0, 0, barrect.width, | |
| - barrect.height, 0, 0); | |
| + XCopyArea(dpy, brush.drawable, barwin, brush.gc, 0, 0, bw, bh, 0, 0); | |
| XFlush(dpy); | |
| } | |
| diff --git a/client.c b/client.c | |
| t@@ -10,7 +10,16 @@ | |
| #include "util.h" | |
| #include "wm.h" | |
| -#define CLIENT_MASK (StructureNotifyMask | PropertyChangeMask |… | |
| +static void | |
| +resize_title(Client *c) | |
| +{ | |
| + c->tw = textw(&brush.font, c->name) + bh; | |
| + if(c->tw > c->w) | |
| + c->tw = c->w + 2; | |
| + c->tx = c->x + c->w - c->tw + 2; | |
| + c->ty = c->y; | |
| + XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th); | |
| +} | |
| void | |
| update_name(Client *c) | |
| t@@ -37,6 +46,7 @@ update_name(Client *c) | |
| } | |
| } | |
| XFree(name.value); | |
| + resize_title(c); | |
| } | |
| void | |
| t@@ -74,26 +84,37 @@ update_size(Client *c) | |
| } | |
| void | |
| +raise(Client *c) | |
| +{ | |
| + XRaiseWindow(dpy, c->win); | |
| + XRaiseWindow(dpy, c->title); | |
| +} | |
| + | |
| +void | |
| +lower(Client *c) | |
| +{ | |
| + XLowerWindow(dpy, c->title); | |
| + XLowerWindow(dpy, c->win); | |
| +} | |
| + | |
| +void | |
| focus(Client *c) | |
| { | |
| Client **l, *old; | |
| old = stack; | |
| - for(l=&stack; *l && *l != c; l=&(*l)->snext); | |
| + for(l = &stack; *l && *l != c; l = &(*l)->snext); | |
| eassert(*l == c); | |
| *l = c->snext; | |
| c->snext = stack; | |
| stack = c; | |
| - XRaiseWindow(dpy, c->win); | |
| - XRaiseWindow(dpy, c->title); | |
| - XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); | |
| if(old && old != c) { | |
| XMapWindow(dpy, old->title); | |
| draw_client(old); | |
| } | |
| XUnmapWindow(dpy, c->title); | |
| - draw_bar(); | |
| - discard_events(EnterWindowMask); | |
| + draw_client(old); | |
| + XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); | |
| XFlush(dpy); | |
| } | |
| t@@ -107,13 +128,16 @@ manage(Window w, XWindowAttributes *wa) | |
| c->win = w; | |
| c->tx = c->x = wa->x; | |
| c->ty = c->y = wa->y; | |
| + if(c->y < bh) | |
| + c->ty = c->y += bh; | |
| c->tw = c->w = wa->width; | |
| c->h = wa->height; | |
| - c->th = barrect.height; | |
| + c->th = bh; | |
| update_size(c); | |
| XSetWindowBorderWidth(dpy, c->win, 1); | |
| XSetWindowBorder(dpy, c->win, brush.border); | |
| - XSelectInput(dpy, c->win, CLIENT_MASK); | |
| + XSelectInput(dpy, c->win, | |
| + StructureNotifyMask | PropertyChangeMask | EnterWindow… | |
| XGetTransientForHint(dpy, c->win, &c->trans); | |
| twa.override_redirect = 1; | |
| twa.background_pixmap = ParentRelative; | |
| t@@ -130,8 +154,8 @@ manage(Window w, XWindowAttributes *wa) | |
| *l = c; | |
| c->snext = stack; | |
| stack = c; | |
| - XMapWindow(dpy, c->win); | |
| - XMapWindow(dpy, c->title); | |
| + XMapRaised(dpy, c->win); | |
| + XMapRaised(dpy, c->title); | |
| XGrabButton(dpy, Button1, Mod1Mask, c->win, False, ButtonPressMask, | |
| GrabModeAsync, GrabModeSync, None, None); | |
| XGrabButton(dpy, Button2, Mod1Mask, c->win, False, ButtonPressMask, | |
| t@@ -147,6 +171,7 @@ resize(Client *c) | |
| { | |
| XConfigureEvent e; | |
| + resize_title(c); | |
| XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); | |
| e.type = ConfigureNotify; | |
| e.event = c->win; | |
| t@@ -158,9 +183,7 @@ resize(Client *c) | |
| e.border_width = 0; | |
| e.above = None; | |
| e.override_redirect = False; | |
| - XSelectInput(dpy, c->win, CLIENT_MASK & ~StructureNotifyMask); | |
| XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e); | |
| - XSelectInput(dpy, c->win, CLIENT_MASK); | |
| XFlush(dpy); | |
| } | |
| t@@ -219,17 +242,14 @@ getclient(Window w) | |
| void | |
| draw_client(Client *c) | |
| { | |
| - if(c == stack) | |
| + if(c == stack) { | |
| draw_bar(); | |
| + return; | |
| + } | |
| - c->tw = textwidth(&brush.font, c->name) + labelheight(&brush.font); | |
| - c->tx = c->x + c->w - c->tw + 2; | |
| - c->ty = c->y; | |
| - XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th); | |
| - | |
| - brush.rect.x = brush.rect.y = 0; | |
| - brush.rect.width = c->tw; | |
| - brush.rect.height = c->th; | |
| + brush.x = brush.y = 0; | |
| + brush.w = c->tw; | |
| + brush.h = c->th; | |
| draw(dpy, &brush, True, c->name); | |
| XCopyArea(dpy, brush.drawable, c->title, brush.gc, | |
| diff --git a/cmd.c b/cmd.c | |
| t@@ -23,16 +23,18 @@ void | |
| sel(void *aux) | |
| { | |
| const char *arg = aux; | |
| - Client *c; | |
| + Client *c = NULL; | |
| if(!arg || !stack) | |
| return; | |
| if(!strncmp(arg, "next", 5)) | |
| - focus(stack->snext ? stack->snext : stack); | |
| - else if(!strncmp(arg, "prev", 5)) { | |
| + c = stack->snext ? stack->snext : stack; | |
| + else if(!strncmp(arg, "prev", 5)) | |
| for(c = stack; c && c->snext; c = c->snext); | |
| - focus(c ? c : stack); | |
| - } | |
| + if(!c) | |
| + c = stack; | |
| + raise(c); | |
| + focus(c); | |
| } | |
| void | |
| diff --git a/config.h b/config.h | |
| t@@ -4,7 +4,7 @@ | |
| */ | |
| #define FONT "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*" | |
| -#define BGCOLOR "#0c0c33" | |
| -#define FGCOLOR "#b2c8cd" | |
| -#define BORDERCOLOR "#3030c0" | |
| -#define STATUSDELAY 10 /* milliseconds */ | |
| +#define BGCOLOR "#666699" | |
| +#define FGCOLOR "#ffffff" | |
| +#define BORDERCOLOR "#9999CC" | |
| +#define STATUSDELAY 10 /* seconds */ | |
| diff --git a/draw.c b/draw.c | |
| t@@ -15,16 +15,16 @@ drawborder(Display *dpy, Brush *b) | |
| XPoint points[5]; | |
| XSetLineAttributes(dpy, b->gc, 1, LineSolid, CapButt, JoinMiter); | |
| XSetForeground(dpy, b->gc, b->border); | |
| - points[0].x = b->rect.x; | |
| - points[0].y = b->rect.y; | |
| - points[1].x = b->rect.width - 1; | |
| + points[0].x = b->x; | |
| + points[0].y = b->y; | |
| + points[1].x = b->w - 1; | |
| points[1].y = 0; | |
| points[2].x = 0; | |
| - points[2].y = b->rect.height - 1; | |
| - points[3].x = -(b->rect.width - 1); | |
| + points[2].y = b->h - 1; | |
| + points[3].x = -(b->w - 1); | |
| points[3].y = 0; | |
| points[4].x = 0; | |
| - points[4].y = -(b->rect.height - 1); | |
| + points[4].y = -(b->h - 1); | |
| XDrawLines(dpy, b->drawable, b->gc, points, 5, CoordModePrevious); | |
| } | |
| t@@ -34,9 +34,10 @@ draw(Display *dpy, Brush *b, Bool border, const char *text) | |
| unsigned int x, y, w, h, len; | |
| static char buf[256]; | |
| XGCValues gcv; | |
| + XRectangle r = { b->x, b->y, b->w, b->h }; | |
| XSetForeground(dpy, b->gc, b->bg); | |
| - XFillRectangles(dpy, b->drawable, b->gc, &b->rect, 1); | |
| + XFillRectangles(dpy, b->drawable, b->gc, &r, 1); | |
| if(border) | |
| drawborder(dpy, b); | |
| t@@ -51,14 +52,14 @@ draw(Display *dpy, Brush *b, Bool border, const char *text) | |
| buf[len] = 0; | |
| h = b->font.ascent + b->font.descent; | |
| - y = b->rect.y + (b->rect.height / 2) - (h / 2) + b->font.ascent; | |
| - x = b->rect.x + (h / 2); | |
| + y = b->y + (b->h / 2) - (h / 2) + b->font.ascent; | |
| + x = b->x + (h / 2); | |
| /* shorten text if necessary */ | |
| - while(len && (w = textwidth_l(&b->font, buf, len)) > b->rect.width - h) | |
| + while(len && (w = textnw(&b->font, buf, len)) > b->w - h) | |
| buf[--len] = 0; | |
| - if(w > b->rect.width) | |
| + if(w > b->w) | |
| return; /* too long */ | |
| gcv.foreground = b->fg; | |
| t@@ -94,20 +95,26 @@ loadcolors(Display *dpy, int screen, Brush *b, | |
| } | |
| unsigned int | |
| -textwidth_l(Fnt *font, char *text, unsigned int len) | |
| +textnw(Fnt *font, char *text, unsigned int len) | |
| { | |
| + XRectangle r; | |
| if(font->set) { | |
| - XRectangle r; | |
| - XmbTextExtents(font->set, text, len, 0, &r); | |
| + XmbTextExtents(font->set, text, len, NULL, &r); | |
| return r.width; | |
| } | |
| return XTextWidth(font->xfont, text, len); | |
| } | |
| unsigned int | |
| -textwidth(Fnt *font, char *text) | |
| +textw(Fnt *font, char *text) | |
| { | |
| - return textwidth_l(font, text, strlen(text)); | |
| + return textnw(font, text, strlen(text)); | |
| +} | |
| + | |
| +unsigned int | |
| +texth(Fnt *font) | |
| +{ | |
| + return font->height + 4; | |
| } | |
| void | |
| t@@ -162,9 +169,3 @@ loadfont(Display *dpy, Fnt *font, const char *fontstr) | |
| } | |
| font->height = font->ascent + font->descent; | |
| } | |
| - | |
| -unsigned int | |
| -labelheight(Fnt *font) | |
| -{ | |
| - return font->height + 4; | |
| -} | |
| diff --git a/draw.h b/draw.h | |
| t@@ -20,7 +20,7 @@ struct Fnt { | |
| struct Brush { | |
| GC gc; | |
| Drawable drawable; | |
| - XRectangle rect; | |
| + int x, y, w, h; | |
| Fnt font; | |
| unsigned long bg; | |
| unsigned long fg; | |
| t@@ -31,6 +31,6 @@ extern void draw(Display *dpy, Brush *b, Bool border, const … | |
| extern void loadcolors(Display *dpy, int screen, Brush *b, | |
| const char *bg, const char *fg, const char *bo); | |
| extern void loadfont(Display *dpy, Fnt *font, const char *fontstr); | |
| -extern unsigned int textwidth_l(Fnt *font, char *text, unsigned int len); | |
| -extern unsigned int textwidth(Fnt *font, char *text); | |
| -extern unsigned int labelheight(Fnt *font); | |
| +extern unsigned int textnw(Fnt *font, char *text, unsigned int len); | |
| +extern unsigned int textw(Fnt *font, char *text); | |
| +extern unsigned int texth(Fnt *font); | |
| diff --git a/event.c b/event.c | |
| t@@ -37,13 +37,11 @@ void (*handler[LASTEvent]) (XEvent *) = { | |
| [UnmapNotify] = unmapnotify | |
| }; | |
| -unsigned int | |
| +void | |
| discard_events(long even_mask) | |
| { | |
| XEvent ev; | |
| - unsigned int n = 0; | |
| - while(XCheckMaskEvent(dpy, even_mask, &ev)) n++; | |
| - return n; | |
| + while(XCheckMaskEvent(dpy, even_mask, &ev)); | |
| } | |
| static void | |
| t@@ -53,6 +51,7 @@ buttonpress(XEvent *e) | |
| Client *c; | |
| if((c = getclient(ev->window))) { | |
| + raise(c); | |
| switch(ev->button) { | |
| default: | |
| break; | |
| t@@ -60,7 +59,7 @@ buttonpress(XEvent *e) | |
| mmove(c); | |
| break; | |
| case Button2: | |
| - XLowerWindow(dpy, c->win); | |
| + lower(c); | |
| break; | |
| case Button3: | |
| mresize(c); | |
| t@@ -122,10 +121,8 @@ enternotify(XEvent *e) | |
| if((c = getclient(ev->window))) | |
| focus(c); | |
| - else if(ev->window == root) { | |
| + else if(ev->window == root) | |
| sel_screen = True; | |
| - /*draw_frames();*/ | |
| - } | |
| } | |
| static void | |
| t@@ -133,10 +130,8 @@ leavenotify(XEvent *e) | |
| { | |
| XCrossingEvent *ev = &e->xcrossing; | |
| - if((ev->window == root) && !ev->same_screen) { | |
| + if((ev->window == root) && !ev->same_screen) | |
| sel_screen = True; | |
| - /*draw_frames();*/ | |
| - } | |
| } | |
| static void | |
| diff --git a/font.c b/font.c | |
| t@@ -1,81 +0,0 @@ | |
| -/* | |
| - * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com> | |
| - * See LICENSE file for license details. | |
| - */ | |
| - | |
| -#include <stdio.h> | |
| -#include <stdlib.h> | |
| -#include <string.h> | |
| -#include <locale.h> | |
| - | |
| -unsigned int | |
| -textwidth_l(BlitzFont *font, char *text, unsigned int len) | |
| -{ | |
| - if(font->set) { | |
| - XRectangle r; | |
| - XmbTextExtents(font->set, text, len, nil, &r); | |
| - return r.width; | |
| - } | |
| - return XTextWidth(font->xfont, text, len); | |
| -} | |
| - | |
| -unsigned int | |
| -textwidth(BlitzFont *font, char *text) | |
| -{ | |
| - return blitz_textwidth_l(font, text, strlen(text)); | |
| -} | |
| - | |
| -void | |
| -loadfont(Blitz *blitz, BlitzFont *font) | |
| -{ | |
| - char *fontname = font->fontstr; | |
| - char **missing = nil, *def = "?"; | |
| - int n; | |
| - | |
| - setlocale(LC_ALL, ""); | |
| - if(font->set) | |
| - XFreeFontSet(blitz->dpy, font->set); | |
| - font->set = XCreateFontSet(blitz->dpy, fontname, &missing, &n, &def); | |
| - if(missing) { | |
| - while(n--) | |
| - fprintf(stderr, "missing fontset: %s\n", missing[n]); | |
| - XFreeStringList(missing); | |
| - if(font->set) { | |
| - XFreeFontSet(blitz->dpy, font->set); | |
| - font->set = nil; | |
| - } | |
| - } | |
| - if(font->set) { | |
| - XFontSetExtents *font_extents; | |
| - XFontStruct **xfonts; | |
| - char **font_names; | |
| - unsigned int i; | |
| - | |
| - font->ascent = font->descent = 0; | |
| - font_extents = XExtentsOfFontSet(font->set); | |
| - n = XFontsOfFontSet(font->set, &xfonts, &font_names); | |
| - for(i = 0, font->ascent = 0, font->descent = 0; i < n; i++) { | |
| - if(font->ascent < (*xfonts)->ascent) | |
| - font->ascent = (*xfonts)->ascent; | |
| - if(font->descent < (*xfonts)->descent) | |
| - font->descent = (*xfonts)->descent; | |
| - xfonts++; | |
| - } | |
| - } | |
| - else { | |
| - if(font->xfont) | |
| - XFreeFont(blitz->dpy, font->xfont); | |
| - font->xfont = nil; | |
| - font->xfont = XLoadQueryFont(blitz->dpy, fontname); | |
| - if (!font->xfont) { | |
| - fontname = "fixed"; | |
| - font->xfont = XLoadQueryFont(blitz->dpy, fontname); | |
| - } | |
| - if (!font->xfont) { | |
| - fprintf(stderr, "%s", "error, cannot load 'fixed' font… | |
| - exit(1); | |
| - } | |
| - font->ascent = font->xfont->ascent; | |
| - font->descent = font->xfont->descent; | |
| - } | |
| -} | |
| diff --git a/menu.c b/menu.c | |
| t@@ -31,7 +31,6 @@ struct Item { | |
| static Display *dpy; | |
| static Window root; | |
| static Window win; | |
| -static XRectangle rect; | |
| static Bool done = False; | |
| static Item *allitem = NULL; /* first of all items */ | |
| t@@ -41,14 +40,14 @@ static Item *nextoff = NULL; | |
| static Item *prevoff = NULL; | |
| static Item *curroff = NULL; | |
| -static int screen; | |
| +static int screen, mx, my, mw, mh; | |
| static char *title = NULL; | |
| static char text[4096]; | |
| static int ret = 0; | |
| static int nitem = 0; | |
| static unsigned int cmdw = 0; | |
| -static unsigned int twidth = 0; | |
| -static unsigned int cwidth = 0; | |
| +static unsigned int tw = 0; | |
| +static unsigned int cw = 0; | |
| static const int seek = 30; /* 30px */ | |
| static Brush brush = {0}; | |
| t@@ -74,21 +73,21 @@ update_offsets() | |
| return; | |
| for(nextoff = curroff; nextoff; nextoff=nextoff->right) { | |
| - tw = textwidth(&brush.font, nextoff->text); | |
| - if(tw > rect.width / 3) | |
| - tw = rect.width / 3; | |
| + tw = textw(&brush.font, nextoff->text); | |
| + if(tw > mw / 3) | |
| + tw = mw / 3; | |
| w += tw + brush.font.height; | |
| - if(w > rect.width) | |
| + if(w > mw) | |
| break; | |
| } | |
| w = cmdw + 2 * seek; | |
| for(prevoff = curroff; prevoff && prevoff->left; prevoff=prevoff->left… | |
| - tw = textwidth(&brush.font, prevoff->left->text); | |
| - if(tw > rect.width / 3) | |
| - tw = rect.width / 3; | |
| + tw = textw(&brush.font, prevoff->left->text); | |
| + if(tw > mw / 3) | |
| + tw = mw / 3; | |
| w += tw + brush.font.height; | |
| - if(w > rect.width) | |
| + if(w > mw) | |
| break; | |
| } | |
| } | |
| t@@ -103,9 +102,9 @@ update_items(char *pattern) | |
| return; | |
| if(!title || *pattern) | |
| - cmdw = cwidth; | |
| + cmdw = cw; | |
| else | |
| - cmdw = twidth; | |
| + cmdw = tw; | |
| item = j = NULL; | |
| nitem = 0; | |
| t@@ -143,42 +142,40 @@ update_items(char *pattern) | |
| static void | |
| draw_menu() | |
| { | |
| - unsigned int offx = 0; | |
| Item *i; | |
| - brush.rect = rect; | |
| - brush.rect.x = 0; | |
| - brush.rect.y = 0; | |
| + brush.x = 0; | |
| + brush.y = 0; | |
| + brush.w = mw; | |
| + brush.h = mh; | |
| draw(dpy, &brush, False, 0); | |
| /* print command */ | |
| if(!title || text[0]) { | |
| - cmdw = cwidth; | |
| + cmdw = cw; | |
| if(cmdw && item) | |
| - brush.rect.width = cmdw; | |
| + brush.w = cmdw; | |
| draw(dpy, &brush, False, text); | |
| } | |
| else { | |
| - cmdw = twidth; | |
| - brush.rect.width = cmdw; | |
| + cmdw = tw; | |
| + brush.w = cmdw; | |
| draw(dpy, &brush, False, title); | |
| } | |
| - offx += brush.rect.width; | |
| + brush.x += brush.w; | |
| if(curroff) { | |
| - brush.rect.x = offx; | |
| - brush.rect.width = seek; | |
| - offx += brush.rect.width; | |
| + brush.w = seek; | |
| draw(dpy, &brush, False, (curroff && curroff->left) ? "<" : 0); | |
| + brush.x += brush.w; | |
| /* determine maximum items */ | |
| for(i = curroff; i != nextoff; i=i->right) { | |
| brush.border = False; | |
| - brush.rect.x = offx; | |
| - brush.rect.width = textwidth(&brush.font, i->text); | |
| - if(brush.rect.width > rect.width / 3) | |
| - brush.rect.width = rect.width / 3; | |
| - brush.rect.width += brush.font.height; | |
| + brush.w = textw(&brush.font, i->text); | |
| + if(brush.w > mw / 3) | |
| + brush.w = mw / 3; | |
| + brush.w += brush.font.height; | |
| if(sel == i) { | |
| swap((void **)&brush.fg, (void **)&brush.bg); | |
| draw(dpy, &brush, True, i->text); | |
| t@@ -186,15 +183,14 @@ draw_menu() | |
| } | |
| else | |
| draw(dpy, &brush, False, i->text); | |
| - offx += brush.rect.width; | |
| + brush.x += brush.w; | |
| } | |
| - brush.rect.x = rect.width - seek; | |
| - brush.rect.width = seek; | |
| + brush.x = mw - seek; | |
| + brush.w = seek; | |
| draw(dpy, &brush, False, nextoff ? ">" : 0); | |
| } | |
| - XCopyArea(dpy, brush.drawable, win, brush.gc, 0, 0, rect.width, | |
| - rect.height, 0, 0); | |
| + XCopyArea(dpy, brush.drawable, win, brush.gc, 0, 0, mw, mh, 0, 0); | |
| XFlush(dpy); | |
| } | |
| t@@ -399,36 +395,35 @@ main(int argc, char *argv[]) | |
| wa.background_pixmap = ParentRelative; | |
| wa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask; | |
| - rect.width = DisplayWidth(dpy, screen); | |
| - rect.height = labelheight(&brush.font); | |
| - rect.y = DisplayHeight(dpy, screen) - rect.height; | |
| - rect.x = 0; | |
| + mx = my = 0; | |
| + mw = DisplayWidth(dpy, screen); | |
| + mh = texth(&brush.font); | |
| - win = XCreateWindow(dpy, root, rect.x, rect.y, | |
| - rect.width, rect.height, 0, DefaultDepth(dpy, screen), | |
| - CopyFromParent, DefaultVisual(dpy, screen), | |
| + win = XCreateWindow(dpy, root, mx, my, mw, mh, 0, | |
| + DefaultDepth(dpy, screen), CopyFromParent, | |
| + DefaultVisual(dpy, screen), | |
| CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); | |
| XDefineCursor(dpy, win, XCreateFontCursor(dpy, XC_xterm)); | |
| XFlush(dpy); | |
| /* pixmap */ | |
| brush.gc = XCreateGC(dpy, root, 0, 0); | |
| - brush.drawable = XCreatePixmap(dpy, win, rect.width, rect.height, | |
| + brush.drawable = XCreatePixmap(dpy, win, mw, mh, | |
| DefaultDepth(dpy, screen)); | |
| XFlush(dpy); | |
| if(maxname) | |
| - cwidth = textwidth(&brush.font, maxname) + brush.font.height; | |
| - if(cwidth > rect.width / 3) | |
| - cwidth = rect.width / 3; | |
| + cw = textw(&brush.font, maxname) + brush.font.height; | |
| + if(cw > mw / 3) | |
| + cw = mw / 3; | |
| if(title) { | |
| - twidth = textwidth(&brush.font, title) + brush.font.height; | |
| - if(twidth > rect.width / 3) | |
| - twidth = rect.width / 3; | |
| + tw = textw(&brush.font, title) + brush.font.height; | |
| + if(tw > mw / 3) | |
| + tw = mw / 3; | |
| } | |
| - cmdw = title ? twidth : cwidth; | |
| + cmdw = title ? tw : cw; | |
| text[0] = 0; | |
| update_items(text); | |
| diff --git a/mouse.c b/mouse.c | |
| t@@ -45,21 +45,21 @@ mresize(Client *c) | |
| if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAs… | |
| None, cursor[CurResize], CurrentTime) != GrabS… | |
| return; | |
| - XGrabServer(dpy); | |
| XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h); | |
| for(;;) { | |
| - XMaskEvent(dpy, MouseMask, &ev); | |
| + XMaskEvent(dpy, MouseMask | ExposureMask, &ev); | |
| switch(ev.type) { | |
| default: break; | |
| + case Expose: | |
| + handler[Expose](&ev); | |
| + break; | |
| case MotionNotify: | |
| - XUngrabServer(dpy); | |
| + XFlush(dpy); | |
| mmatch(c, old_cx, old_cy, ev.xmotion.x, ev.xmotion.y); | |
| XResizeWindow(dpy, c->win, c->w, c->h); | |
| - XGrabServer(dpy); | |
| break; | |
| case ButtonRelease: | |
| resize(c); | |
| - XUngrabServer(dpy); | |
| XUngrabPointer(dpy, CurrentTime); | |
| return; | |
| } | |
| t@@ -80,21 +80,21 @@ mmove(Client *c) | |
| None, cursor[CurMove], CurrentTime) != GrabSuc… | |
| return; | |
| XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); | |
| - XGrabServer(dpy); | |
| for(;;) { | |
| - XMaskEvent(dpy, MouseMask, &ev); | |
| + XMaskEvent(dpy, MouseMask | ExposureMask, &ev); | |
| switch (ev.type) { | |
| default: break; | |
| + case Expose: | |
| + handler[Expose](&ev); | |
| + break; | |
| case MotionNotify: | |
| - XUngrabServer(dpy); | |
| + XFlush(dpy); | |
| c->x = old_cx + (ev.xmotion.x - x1); | |
| c->y = old_cy + (ev.xmotion.y - y1); | |
| XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); | |
| - XGrabServer(dpy); | |
| break; | |
| case ButtonRelease: | |
| resize(c); | |
| - XUngrabServer(dpy); | |
| XUngrabPointer(dpy, CurrentTime); | |
| return; | |
| } | |
| diff --git a/wm.c b/wm.c | |
| t@@ -23,12 +23,11 @@ Display *dpy; | |
| Window root, barwin; | |
| Atom wm_atom[WMLast], net_atom[NetLast]; | |
| Cursor cursor[CurLast]; | |
| -XRectangle rect, barrect; | |
| Bool running = True; | |
| Bool sel_screen; | |
| char statustext[1024], tag[256]; | |
| -int screen; | |
| +int screen, sx, sy, sw, sh, bx, by, bw, bh; | |
| Brush brush = {0}; | |
| Client *clients = NULL; | |
| t@@ -39,7 +38,7 @@ static const char version[] = "gridwm - " VERSION ", (C)opyr… | |
| static int (*x_error_handler) (Display *, XErrorEvent *); | |
| static const char *status[] = { | |
| - "sh", "-c", "echo -n `date '+%Y/%m/%d %H:%M'`" | |
| + "sh", "-c", "echo -n `date '+%Y-%m-%d %H:%M'`" | |
| " `uptime | sed 's/.*://; s/,//g'`" | |
| " `acpi | awk '{print $4}' | sed 's/,//'`", 0 | |
| }; | |
| t@@ -220,9 +219,9 @@ main(int argc, char *argv[]) | |
| if(other_wm_running) | |
| error("gridwm: another window manager is already running\n"); | |
| - rect.x = rect.y = 0; | |
| - rect.width = DisplayWidth(dpy, screen); | |
| - rect.height = DisplayHeight(dpy, screen); | |
| + sx = sy = 0; | |
| + sw = DisplayWidth(dpy, screen); | |
| + sh = DisplayHeight(dpy, screen); | |
| sel_screen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask); | |
| XSetErrorHandler(0); | |
| t@@ -253,18 +252,16 @@ main(int argc, char *argv[]) | |
| wa.background_pixmap = ParentRelative; | |
| wa.event_mask = ExposureMask; | |
| - barrect = rect; | |
| - barrect.height = labelheight(&brush.font); | |
| - barrect.y = rect.height - barrect.height; | |
| - barwin = XCreateWindow(dpy, root, barrect.x, barrect.y, | |
| - barrect.width, barrect.height, 0, DefaultDepth(dpy, sc… | |
| + bx = by = 0; | |
| + bw = sw; | |
| + bh = texth(&brush.font); | |
| + barwin = XCreateWindow(dpy, root, bx, by, bw, bh, 0, DefaultDepth(dpy,… | |
| CopyFromParent, DefaultVisual(dpy, screen), | |
| CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); | |
| XDefineCursor(dpy, barwin, cursor[CurNormal]); | |
| XMapRaised(dpy, barwin); | |
| - brush.drawable = XCreatePixmap(dpy, root, rect.width, barrect.height, | |
| - DefaultDepth(dpy, screen)); | |
| + brush.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, sc… | |
| brush.gc = XCreateGC(dpy, root, 0, 0); | |
| pipe_spawn(statustext, sizeof(statustext), dpy, (char **)status); | |
| diff --git a/wm.h b/wm.h | |
| t@@ -46,11 +46,10 @@ extern Display *dpy; | |
| extern Window root, barwin; | |
| extern Atom wm_atom[WMLast], net_atom[NetLast]; | |
| extern Cursor cursor[CurLast]; | |
| -extern XRectangle rect, barrect; | |
| extern Bool running, sel_screen, grid; | |
| extern void (*handler[LASTEvent]) (XEvent *); | |
| -extern int screen; | |
| +extern int screen, sx, sy, sw, sh, bx, by, bw, bh; | |
| extern char statustext[1024], tag[256]; | |
| extern Brush brush; | |
| t@@ -75,9 +74,11 @@ extern void draw_client(Client *c); | |
| extern void resize(Client *c); | |
| extern void update_size(Client *c); | |
| extern Client *gettitle(Window w); | |
| +extern void raise(Client *c); | |
| +extern void lower(Client *c); | |
| /* event.c */ | |
| -extern unsigned int discard_events(long even_mask); | |
| +extern void discard_events(long even_mask); | |
| /* key.c */ | |
| extern void update_keys(); |