mirror of https://github.com/0intro/wmii
Bunch of fixes. Redraw divs when updated without waiting for expose.
This commit is contained in:
parent
9e3cd5d606
commit
391cf8e49a
|
@ -23,8 +23,9 @@ area_selclient(Area *a) {
|
|||
Area *
|
||||
create_area(View *v, Area *pos, uint w) {
|
||||
static ushort id = 1;
|
||||
uint areanum, colnum, i;
|
||||
uint areanum, i;
|
||||
uint minwidth;
|
||||
int colnum;
|
||||
Area *a;
|
||||
|
||||
minwidth = Dx(screen->r)/NCOL;
|
||||
|
@ -36,10 +37,10 @@ create_area(View *v, Area *pos, uint w) {
|
|||
for(a = v->area; a; a = a->next)
|
||||
areanum++;
|
||||
|
||||
colnum = max((areanum - 1), 0);
|
||||
colnum = areanum - 1;
|
||||
if(w == 0) {
|
||||
if(colnum) {
|
||||
w = newcolw(v, max(i-1, 0));
|
||||
if(colnum >= 0) {
|
||||
w = newcolw(v, i);
|
||||
if (w == 0)
|
||||
w = Dx(screen->r) / (colnum + 1);
|
||||
}
|
||||
|
@ -63,8 +64,9 @@ create_area(View *v, Area *pos, uint w) {
|
|||
a->sel = nil;
|
||||
|
||||
a->r = screen->r;
|
||||
a->r.max.x = a->r.min.x + w;
|
||||
a->r.max.x = screen->brect.min.y;
|
||||
a->r.min.x = 0;
|
||||
a->r.max.x = w;
|
||||
a->r.max.y = screen->brect.min.y;
|
||||
|
||||
if(pos) {
|
||||
a->next = pos->next;
|
||||
|
@ -300,10 +302,7 @@ place_frame(Frame *f) {
|
|||
|
||||
if(c->trans)
|
||||
return;
|
||||
if(Dx(c->r) >= Dx(a->r)
|
||||
|| Dy(c->r) >= Dy(a->r)
|
||||
|| c->size.flags & USPosition
|
||||
|| c->size.flags & PPosition)
|
||||
if(c->fullscreen || c->w.hints->position)
|
||||
return;
|
||||
if(!field) {
|
||||
mx = Dx(screen->r) / dx;
|
||||
|
|
|
@ -36,6 +36,7 @@ create_client(XWindow w, XWindowAttributes *wa) {
|
|||
|
||||
c = emallocz(sizeof(Client));
|
||||
c->border = wa->border_width;
|
||||
|
||||
c->r.min = Pt(wa->x, wa->y);
|
||||
c->r.max = addpt(c->r.min, Pt(wa->width, wa->height));
|
||||
|
||||
|
@ -124,7 +125,7 @@ destroy_client(Client *c) {
|
|||
Client **tc;
|
||||
XEvent ev;
|
||||
|
||||
if(verbose) fprintf(stderr, "client.c:destroy_client(%p) %s\n", c, c->name);
|
||||
Debug fprintf(stderr, "client.c:destroy_client(%p) %s\n", c, c->name);
|
||||
|
||||
for(tc=&client; *tc; tc=&(*tc)->next)
|
||||
if(*tc == c) {
|
||||
|
@ -179,6 +180,7 @@ manage_client(Client *c) {
|
|||
|
||||
free(tags);
|
||||
|
||||
r = c->w.r;
|
||||
reparent_client(c, c->framewin, Pt(def.border, labelh(def.font)));
|
||||
|
||||
if(!strlen(c->tags))
|
||||
|
@ -186,11 +188,13 @@ manage_client(Client *c) {
|
|||
else
|
||||
apply_tags(c, c->tags);
|
||||
|
||||
r = gravclient(c, c->w.r);
|
||||
if(c->sel->area->floating)
|
||||
resize_client(c, &r);
|
||||
else
|
||||
c->sel->revert = r;
|
||||
if(c->w.hints->position) {
|
||||
r = gravclient(c, r);
|
||||
if(c->sel->area->floating)
|
||||
resize_client(c, &r);
|
||||
else
|
||||
c->sel->revert = r;
|
||||
}
|
||||
|
||||
if(!starting)
|
||||
update_views();
|
||||
|
@ -246,7 +250,7 @@ configreq_event(Window *w, XConfigureRequestEvent *e) {
|
|||
|
||||
static void
|
||||
destroy_event(Window *w, XDestroyWindowEvent *e) {
|
||||
if(verbose) fprintf(stderr, "client.c:destroy_event(%x)\n", (uint)w->w);
|
||||
Debug fprintf(stderr, "client.c:destroy_event(%x)\n", (uint)w->w);
|
||||
destroy_client(w->aux);
|
||||
}
|
||||
|
||||
|
@ -257,11 +261,11 @@ enter_event(Window *w, XCrossingEvent *e) {
|
|||
c = w->aux;
|
||||
if(e->detail != NotifyInferior) {
|
||||
if(screen->focus != c) {
|
||||
if(verbose) fprintf(stderr, "enter_notify(c) => %s\n", c->name);
|
||||
Debug fprintf(stderr, "enter_notify(c) => %s\n", c->name);
|
||||
focus(c, False);
|
||||
}
|
||||
set_cursor(c, cursor[CurNormal]);
|
||||
}else if(verbose)
|
||||
}else Debug
|
||||
fprintf(stderr, "enter_notify(c[NotifyInferior]) => %s\n", c->name);
|
||||
}
|
||||
|
||||
|
@ -658,13 +662,10 @@ void
|
|||
focus_client(Client *c) {
|
||||
flushevents(FocusChangeMask, True);
|
||||
|
||||
if(verbose)
|
||||
fprintf(stderr, "focus_client(%p[%x]) => %s\n", c, clientwin(c), clientname(c));
|
||||
Debug fprintf(stderr, "focus_client(%p[%x]) => %s\n", c, clientwin(c), clientname(c));
|
||||
|
||||
if(screen->focus != c) {
|
||||
if(verbose)
|
||||
fprintf(stderr, "\t%s => %s\n",
|
||||
clientname(screen->focus), clientname(c));
|
||||
Debug fprintf(stderr, "\t%s => %s\n", clientname(screen->focus), clientname(c));
|
||||
if(c)
|
||||
setfocus(&c->w, RevertToParent);
|
||||
else
|
||||
|
@ -879,8 +880,10 @@ apply_tags(Client *c, const char *tags) {
|
|||
buf[0] = 0;
|
||||
for(n = 0; tags[n]; n++)
|
||||
if(tags[n] != ' ' && tags[n] != '\t') break;
|
||||
|
||||
if(tags[n] == '+' || tags[n] == '-')
|
||||
strncpy(buf, c->tags, sizeof(c->tags));
|
||||
|
||||
strlcat(buf, &tags[n], sizeof(buf));
|
||||
trim(buf, " \t/");
|
||||
|
||||
|
@ -895,9 +898,7 @@ apply_tags(Client *c, const char *tags) {
|
|||
}
|
||||
while(buf[n] && n < sizeof(buf) && j < 32) {
|
||||
for(i = n; i < sizeof(buf) - 1; i++)
|
||||
if(buf[i] == '+'
|
||||
|| buf[i] == '-'
|
||||
|| buf[i] == '\0')
|
||||
if(buf[i] == '+' || buf[i] == '-' || buf[i] == '\0')
|
||||
break;
|
||||
last = buf[i];
|
||||
buf[i] = '\0';
|
||||
|
@ -907,9 +908,9 @@ apply_tags(Client *c, const char *tags) {
|
|||
c->floating = add;
|
||||
else if(!strncmp(&buf[n], "!", 2))
|
||||
cur = view ? screen->sel->name : "nil";
|
||||
else if(strncmp(&buf[n], "sel", 4)
|
||||
&& strncmp(&buf[n], ".", 2)
|
||||
&& strncmp(&buf[n], "..", 3))
|
||||
else if(strcmp(&buf[n], "sel")
|
||||
&& strcmp(&buf[n], ".")
|
||||
&& strcmp(&buf[n], ".."))
|
||||
cur = &buf[n];
|
||||
|
||||
n = i + 1;
|
||||
|
|
|
@ -31,7 +31,7 @@ str2colmode(const char *str) {
|
|||
}
|
||||
|
||||
static Divide*
|
||||
get_div(Divide **dp) {
|
||||
getdiv(Divide **dp) {
|
||||
WinAttr wa;
|
||||
Divide *d;
|
||||
|
||||
|
@ -59,12 +59,12 @@ get_div(Divide **dp) {
|
|||
}
|
||||
|
||||
static void
|
||||
map_div(Divide *d) {
|
||||
mapdiv(Divide *d) {
|
||||
mapwin(d->w);
|
||||
}
|
||||
|
||||
static void
|
||||
unmap_div(Divide *d) {
|
||||
unmapdiv(Divide *d) {
|
||||
unmapwin(d->w);
|
||||
}
|
||||
|
||||
|
@ -77,11 +77,11 @@ setdiv(Divide *d, int x) {
|
|||
r.max.y = screen->brect.min.y;
|
||||
|
||||
reshapewin(d->w, r);
|
||||
map_div(d);
|
||||
mapdiv(d);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_img(Image *img, ulong cbg, ulong cborder) {
|
||||
drawimg(Image *img, ulong cbg, ulong cborder) {
|
||||
Point pt[6];
|
||||
|
||||
pt[0] = Pt(0, 0);
|
||||
|
@ -97,8 +97,15 @@ draw_img(Image *img, ulong cbg, ulong cborder) {
|
|||
drawpoly(img, pt, nelem(pt), CapNotLast, 1, cborder);
|
||||
}
|
||||
|
||||
void
|
||||
drawdiv(Divide *d) {
|
||||
copyimage(d->w, divimg->r, divimg, ZP);
|
||||
setshapemask(d->w, divmask, ZP);
|
||||
}
|
||||
|
||||
void
|
||||
update_imgs() {
|
||||
Divide *d;
|
||||
int w, h;
|
||||
|
||||
w = 2 * (labelh(def.font) / 3);
|
||||
|
@ -118,8 +125,11 @@ update_imgs() {
|
|||
divc = def.normcolor;
|
||||
|
||||
fill(divmask, divmask->r, 0);
|
||||
draw_img(divmask, 1, 1);
|
||||
draw_img(divimg, divc.bg, divc.border);
|
||||
drawimg(divmask, 1, 1);
|
||||
drawimg(divimg, divc.bg, divc.border);
|
||||
|
||||
for(d = divs; d && d->w->mapped; d = d->next)
|
||||
drawdiv(d);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -133,24 +143,18 @@ update_divs() {
|
|||
v = screen->sel;
|
||||
dp = &divs;
|
||||
for(a = v->area->next; a; a = a->next) {
|
||||
d = get_div(dp);
|
||||
d = getdiv(dp);
|
||||
dp = &d->next;
|
||||
setdiv(d, a->r.min.x);
|
||||
|
||||
if(!a->next) {
|
||||
d = get_div(dp);
|
||||
d = getdiv(dp);
|
||||
dp = &d->next;
|
||||
setdiv(d, a->r.max.x);
|
||||
}
|
||||
}
|
||||
for(d = *dp; d; d = d->next)
|
||||
unmap_div(d);
|
||||
}
|
||||
|
||||
void
|
||||
draw_div(Divide *d) {
|
||||
copyimage(d->w, divimg->r, divimg, ZP);
|
||||
setshapemask(d->w, divmask, ZP);
|
||||
unmapdiv(d);
|
||||
}
|
||||
|
||||
/* Div Handlers */
|
||||
|
@ -167,7 +171,7 @@ expose_event(Window *w, XExposeEvent *e) {
|
|||
Divide *d;
|
||||
|
||||
d = w->aux;
|
||||
draw_div(d);
|
||||
drawdiv(d);
|
||||
}
|
||||
|
||||
static Handlers divhandler = {
|
||||
|
|
|
@ -243,3 +243,6 @@ Bool starting;
|
|||
Bool verbose;
|
||||
char *user;
|
||||
char *execstr;
|
||||
|
||||
#define Debug if(verbose)
|
||||
|
||||
|
|
|
@ -10,8 +10,7 @@
|
|||
|
||||
void
|
||||
dispatch_event(XEvent *e) {
|
||||
if(verbose)
|
||||
printevent(e);
|
||||
Debug printevent(e);
|
||||
if(handler[e->type])
|
||||
handler[e->type](e);
|
||||
}
|
||||
|
@ -88,8 +87,7 @@ destroynotify(XEvent *e) {
|
|||
if(w->handler->destroy)
|
||||
w->handler->destroy(w, ev);
|
||||
}else {
|
||||
if(verbose)
|
||||
fprintf(stderr, "DestroyWindow(%x) (no handler)\n", (uint)ev->window);
|
||||
Debug fprintf(stderr, "DestroyWindow(%x) (no handler)\n", (uint)ev->window);
|
||||
if((c = win2client(ev->window)))
|
||||
fprintf(stderr, "Badness: Unhandled DestroyNotify: "
|
||||
"Client: %p, Window: %x, Name: %s\n", c, (uint)c->w.w, c->name);
|
||||
|
@ -130,7 +128,7 @@ leavenotify(XEvent *e) {
|
|||
|
||||
void
|
||||
print_focus(Client *c, char *to) {
|
||||
if(verbose) {
|
||||
Debug {
|
||||
fprintf(stderr, "screen->focus: %p[%x] => %p[%x]\n",
|
||||
screen->focus, clientwin(screen->focus), c, clientwin(c));
|
||||
fprintf(stderr, "\t%s => %s\n", clientname(screen->focus), to);
|
||||
|
|
|
@ -170,7 +170,7 @@ enter_event(Window *w, XCrossingEvent *e) {
|
|||
c = w->aux;
|
||||
f = c->sel;
|
||||
if(screen->focus != c) {
|
||||
if(verbose) fprintf(stderr, "enter_notify(f) => %s\n", f->client->name);
|
||||
Debug fprintf(stderr, "enter_notify(f) => %s\n", f->client->name);
|
||||
if(f->area->floating || !f->collapsed)
|
||||
focus(f->client, False);
|
||||
}
|
||||
|
|
|
@ -811,6 +811,7 @@ fs_write(Ixp9Req *r) {
|
|||
{ uint n;
|
||||
char *p, *toks[32];
|
||||
|
||||
errstr = nil;
|
||||
p = toutf8n(r->ifcall.data, r->ifcall.count);
|
||||
n = tokenize(toks, 32, p, '\n');
|
||||
for(i = 0; i < n; i++) {
|
||||
|
@ -821,14 +822,9 @@ fs_write(Ixp9Req *r) {
|
|||
}
|
||||
free(p);
|
||||
}
|
||||
if(screen->sel)
|
||||
focus_view(screen, screen->sel);
|
||||
if(errstr) {
|
||||
respond(r, errstr);
|
||||
return;
|
||||
}
|
||||
focus_view(screen, screen->sel);
|
||||
r->ofcall.count = r->ifcall.count;
|
||||
respond(r, nil);
|
||||
respond(r, errstr);
|
||||
return;
|
||||
case FsFEvent:
|
||||
if(r->ifcall.data[r->ifcall.count-1] == '\n')
|
||||
|
|
|
@ -272,17 +272,18 @@ horiz:
|
|||
case ButtonRelease:
|
||||
switch(ev.xbutton.button) {
|
||||
case 1:
|
||||
if(f->anext && (f->aprev && fw->fp != f->aprev->aprev)) {
|
||||
if(f->anext && (!f->aprev || fw->fp != f->aprev || fw->fp != f->aprev->aprev)) {
|
||||
f->anext->r.min.y = f->r.min.y;
|
||||
resize_frame(f->anext, f->anext->r);
|
||||
}
|
||||
else if(f->aprev && fw->fp == f->aprev->aprev) {
|
||||
fw->fp = f->aprev->aprev;
|
||||
f->aprev->r = f->r;
|
||||
else if(f->aprev) {
|
||||
if(fw->fp == f->aprev->aprev) {
|
||||
fw->fp = f->aprev->aprev;
|
||||
f->aprev->r = f->r;
|
||||
}else
|
||||
f->aprev->r.max.y = f->r.max.y;
|
||||
resize_frame(f->aprev, f->aprev->r);
|
||||
}
|
||||
else
|
||||
f->aprev->r.max.y = f->r.max.y;
|
||||
resize_frame(f->aprev, f->aprev->r);
|
||||
|
||||
remove_frame(f);
|
||||
f->area = fw->ra;
|
||||
|
|
|
@ -230,50 +230,50 @@ restack_view(View *v) {
|
|||
|
||||
void
|
||||
scale_view(View *v, int w) {
|
||||
uint xoff, num_col;
|
||||
uint min_width;
|
||||
uint xoff, numcol;
|
||||
uint minwidth;
|
||||
Area *a;
|
||||
float scale, dx;
|
||||
int wdiff;
|
||||
float scale;
|
||||
int wdiff, dx;
|
||||
|
||||
min_width = Dx(screen->r)/NCOL;
|
||||
minwidth = Dx(screen->r)/NCOL;
|
||||
|
||||
if(!v->area->next)
|
||||
return;
|
||||
|
||||
num_col = 0;
|
||||
numcol = 0;
|
||||
dx = 0;
|
||||
for(a=v->area->next; a; a=a->next) {
|
||||
num_col++;
|
||||
numcol++;
|
||||
dx += Dx(a->r);
|
||||
}
|
||||
|
||||
scale = (float)w / dx;
|
||||
xoff = 0;
|
||||
for(a=v->area->next; a; a=a->next) {
|
||||
a->r.min.x = xoff;
|
||||
a->r.max.x = xoff + Dx(a->r) * scale;
|
||||
a->r.min.x = xoff;
|
||||
if(!a->next)
|
||||
a->r.max.x = w;
|
||||
xoff = a->r.max.x;
|
||||
}
|
||||
|
||||
/* min_width can only be respected when there is enough space;
|
||||
/* minwidth can only be respected when there is enough space;
|
||||
* the caller should guarantee this */
|
||||
if(num_col * min_width > w)
|
||||
if(numcol * minwidth > w)
|
||||
return;
|
||||
|
||||
dx = numcol * minwidth;
|
||||
xoff = 0;
|
||||
for(a=v->area->next, num_col--; a; a=a->next, num_col--) {
|
||||
for(a=v->area->next, numcol--; a; a=a->next, numcol--) {
|
||||
a->r.min.x = xoff;
|
||||
|
||||
if(Dx(a->r) < min_width)
|
||||
a->r.max.x = xoff + min_width;
|
||||
else if((wdiff = xoff + Dx(a->r) - w + num_col * min_width) > 0)
|
||||
|
||||
if(Dx(a->r) < minwidth)
|
||||
a->r.max.x = xoff + minwidth;
|
||||
else if((wdiff = xoff + Dx(a->r) - w + dx) > 0)
|
||||
a->r.max.x -= wdiff;
|
||||
if(!a->next)
|
||||
a->r.max.x = w;
|
||||
|
||||
xoff = a->r.max.x;
|
||||
}
|
||||
}
|
||||
|
@ -492,11 +492,12 @@ newcolw(View *v, int num) {
|
|||
char buf[sizeof r->value];
|
||||
char *toks[16];
|
||||
|
||||
strncpy(buf, r->value, sizeof(buf));
|
||||
strcpy(buf, r->value);
|
||||
|
||||
n = tokenize(toks, 16, buf, '+');
|
||||
if(n > num)
|
||||
if(num < n)
|
||||
if(sscanf(toks[num], "%u", &n) == 1)
|
||||
return Dx(screen->r) * ((double)n / 100);
|
||||
return Dx(screen->r) * (n / 100.0);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -660,18 +660,17 @@ sethints(Window *w) {
|
|||
Point p;
|
||||
long size;
|
||||
|
||||
if(!XGetWMNormalHints(display, w->w, &xs, &size)) {
|
||||
free(w->hints);
|
||||
w->hints = nil;
|
||||
return;
|
||||
}
|
||||
|
||||
if(w->hints == nil)
|
||||
w->hints = emalloc(sizeof *h);
|
||||
|
||||
h = w->hints;
|
||||
memset(h, 0, sizeof *h);
|
||||
|
||||
h->max = Pt(MaxInt, MaxInt);
|
||||
|
||||
if(!XGetWMNormalHints(display, w->w, &xs, &size))
|
||||
return;
|
||||
|
||||
if(xs.flags&PMinSize) {
|
||||
p.x = xs.min_width;
|
||||
p.y = xs.min_height;
|
||||
|
@ -705,6 +704,8 @@ sethints(Window *w) {
|
|||
p.y = xs.max_aspect.y;
|
||||
h->aspect.max = p;
|
||||
}
|
||||
|
||||
h->position = ((xs.flags&(USPosition|PPosition)) != 0);
|
||||
|
||||
p = ZP;
|
||||
if((xs.flags&PWinGravity) == 0)
|
||||
|
@ -733,7 +734,10 @@ sethints(Window *w) {
|
|||
Rectangle
|
||||
sizehint(WinHints *h, Rectangle r) {
|
||||
Point p, p2, o;
|
||||
|
||||
|
||||
if(h == nil)
|
||||
return r;
|
||||
|
||||
o = r.min;
|
||||
r = rectsubpt(r, o);
|
||||
|
||||
|
|
|
@ -50,6 +50,7 @@ struct WinHints {
|
|||
Rectangle aspect;
|
||||
Point grav;
|
||||
Bool gravstatic;
|
||||
Bool position;
|
||||
};
|
||||
|
||||
struct Handlers {
|
||||
|
|
Loading…
Reference in New Issue