Some grabbox fixes, and, it seems, several changes I forgot to commit.

This commit is contained in:
Kris Maglione 2007-05-10 13:14:39 -04:00
parent fda2ca35cc
commit b645346147
13 changed files with 182 additions and 207 deletions

8
TODO
View File

@ -4,11 +4,9 @@
* Switch to mk for building
4.0
* Get rid of col modes
* Get rid of colmodes
* (Multi line) Tag bars
* Replace bar with master tag bar
* New event system
* Resizable managed area
* Sticky clients
* Regex-based tag strings
* New dmenu(with real cursor and using Bio)
* Depend on plan9-corelibs
* Use libbio, libfmt, libregex9

View File

@ -296,7 +296,7 @@ place_frame(Frame *f) {
if(c->trans)
return;
if(c->fullscreen || c->w.hints->position)
if(c->fullscreen || c->w.hints->position || starting)
return;
if(!field) {
mx = Dx(screen->r) / dx;

View File

@ -104,14 +104,14 @@ manage_client(Client *c) {
r = c->w.r;
p.x = def.border;
p.y = labelh(def.font);
reparent_client(c, c->framewin, ZP);
reparentwindow(&c->w, c->framewin, p);
if(!strlen(c->tags))
apply_rules(c);
else
apply_tags(c, c->tags);
if(c->w.hints->position) {
if(c->w.hints->position || starting) {
r = gravclient(c, r);
if(c->sel->area->floating)
resize_client(c, &r);
@ -138,7 +138,7 @@ destroy_client(Client *c) {
Rectangle r;
char *dummy;
Client **tc;
XEvent ev;
Bool hide;
Debug fprintf(stderr, "client.c:destroy_client(%p) %s\n", c, c->name);
@ -148,37 +148,39 @@ destroy_client(Client *c) {
break;
}
r = c->w.r;
if(c->sel) {
r = gravclient(c, ZR);
r = frame2client(c->sel, r);
}
hide = False;
if(!c->sel || c->sel->view != screen->sel)
hide = True;
XGrabServer(display);
/* In case the client is already unmapped */
handler = XSetErrorHandler(ignoreerrors);
if(c->sel) {
r = gravclient(c, ZR);
r = frame2client(nil, r);
}
dummy = nil;
update_client_views(c, &dummy);
unmap_client(c, WithdrawnState);
reparent_client(c, &scr.root, r.min);
write_event("DestroyClient 0x%x\n", (uint)c->w.w);
destroywindow(c->framewin);
unmap_client(c, IconicState);
sethandler(&c->w, nil);
if(hide)
reparentwindow(&c->w, &scr.root, screen->r.max);
else
reparentwindow(&c->w, &scr.root, r.min);
destroywindow(c->framewin);
XSync(display, False);
XSetErrorHandler(handler);
XUngrabServer(display);
write_event("DestroyClient 0x%x\n", clientwin(c));
flushevents(EnterWindowMask, False);
while(XCheckMaskEvent(display, StructureNotifyMask, &ev))
if(ev.type != UnmapNotify || ev.xunmap.window != c->w.w)
dispatch_event(&ev);
free(c);
}
@ -325,14 +327,15 @@ focus_client(Client *c) {
if(screen->focus != c) {
Debug fprintf(stderr, "\t%s => %s\n", clientname(screen->focus), clientname(c));
if(c)
setfocus(&c->w, RevertToParent);
else
setfocus(screen->barwin, RevertToParent);
XSync(display, False);
}
flushevents(FocusChangeMask, True);
XSync(display, False);
flushevents(FocusChangeMask, True);
}
}
void
@ -364,13 +367,8 @@ resize_client(Client *c, Rectangle *r) {
map_frame(c);
configure_client(c);
}
flushevents(FocusChangeMask|ExposureMask, True);
}
void
reparent_client(Client *c, Window *w, Point pt) {
reparentwindow(&c->w, w, pt);
flushevents(FocusChangeMask|ExposureMask, True);
}
void
@ -500,6 +498,8 @@ update_client_name(Client *c) {
free(str);
update_class(c);
if(c->sel)
draw_frame(c->sel);
}
static void
@ -546,13 +546,15 @@ prop_client(Client *c, Atom a) {
char **class;
int n;
if(a == xatom("WM_PROTOCOLS"))
if(a == xatom("WM_PROTOCOLS")) {
c->proto = winprotocols(&c->w);
else if(a == xatom("_NET_WM_NAME"))
}
else if(a == xatom("_NET_WM_NAME")) {
goto wmname;
else if(a == xatom("_MOTIF_WM_HINTS"))
}
else if(a == xatom("_MOTIF_WM_HINTS")) {
updatemwm(c);
else switch (a) {
}else switch (a) {
case XA_WM_TRANSIENT_FOR:
XGetTransientForHint(display, c->w.w, &c->trans);
break;
@ -579,8 +581,6 @@ prop_client(Client *c, Atom a) {
case XA_WM_NAME:
wmname:
update_client_name(c);
if(c->frame)
draw_frame(c->sel);
break;
}
}
@ -611,7 +611,8 @@ configreq_event(Window *w, XConfigureRequestEvent *e) {
r = rectaddpt(r, p);
r = gravclient(c, r);
if((Dx(r) == Dx(screen->r)) && (Dy(r) == Dy(screen->r))) {
if((Dx(r) == Dx(screen->r))
&& (Dy(r) == Dy(screen->r))) {
c->fullscreen = True;
if(f) {
if(!f->area->floating)
@ -666,27 +667,22 @@ focusin_event(Window *w, XFocusChangeEvent *e) {
if(c != old) {
if(c->sel)
draw_frame(c->sel);
if(old && old->sel)
draw_frame(old->sel);
}
}
static void
focusout_event(Window *w, XFocusChangeEvent *e) {
Client *c;
c = w->aux;
c = w->aux;
if((e->mode == NotifyWhileGrabbed) && (screen->hasgrab != &c_root)) {
if((screen->focus) && (screen->hasgrab != screen->focus))
screen->hasgrab = screen->focus;
if(screen->hasgrab == c)
return;
}else if(e->mode != NotifyGrab) {
if(screen->focus == c) {
print_focus(&c_magic, "<magic>");
screen->focus = &c_magic;
}
}else if(screen->focus == c) {
print_focus(&c_magic, "<magic>");
screen->focus = &c_magic;
if(c->sel)
draw_frame(c->sel);
}

View File

@ -204,13 +204,6 @@ scale_column(Area *a) {
if(!a->frame)
return;
/* This works by comparing heights based on a surplus of their
* minimum size. We start by subtracting the minimum size, then
* scale the surplus, and add back the minimum size later. This
* is based on the size of the client, rather than the frame, so
* increment gaps can be equalized later */
/* Frames that can't be accomodated are pushed to the floating layer */
minh = labelh(def.font);
colh = labelh(def.font);
uncolh = minh + colh +1;
@ -253,11 +246,6 @@ scale_column(Area *a) {
f = *fp;
if(f == a->sel)
i++, j++;
if(!f->collapsed) {
if(j < 0 && (f != a->sel))
f->collapsed = True;
j--;
}
if(f->collapsed) {
if(i < 0 && (f != a->sel)) {
f->collapsed = False;
@ -265,6 +253,10 @@ scale_column(Area *a) {
continue;
}
i--;
}else {
if(j < 0 && (f != a->sel))
f->collapsed = True;
j--;
}
/* Doesn't change if we 'continue' */
fp=&f->anext;
@ -281,8 +273,8 @@ scale_column(Area *a) {
}else {
f->r.max.y = uncolh;
dy += Dy(f->crect);
surplus += Dy(f->r);
}
surplus += Dy(f->r);
}
for(f = a->frame; f; f = f->anext)
f->ratio = (float)Dy(f->crect)/dy;
@ -293,11 +285,9 @@ scale_column(Area *a) {
j = surplus;
dy = 0;
for(f=a->frame; f; f=f->anext) {
if(!f->collapsed) {
if(!f->collapsed)
f->r.max.y += f->ratio * surplus;
resize_frame(f, f->r);
f->r.max.y = Dy(f->crect) + labelh(def.font) + 1;
}
resize_frame(f, f->r);
dy += Dy(f->r);
}
surplus = Dy(a->r) - dy;
@ -336,11 +326,9 @@ arrange_column(Area *a, Bool dirty) {
switch(a->mode) {
case Coldefault:
for(f=a->frame; f; f=f->anext) {
f->collapsed = False;
if(dirty)
if(dirty)
for(f=a->frame; f; f=f->anext)
f->r = Rect(0, 0, 100, 100);
}
break;
case Colstack:
for(f=a->frame; f; f=f->anext)

View File

@ -15,6 +15,8 @@ dispatch_event(XEvent *e) {
handler[e->type](e);
}
#define handle(w, fn, ev) ((w)->handler->fn ? (w)->handler->fn((w), ev) : (void)0)
uint
flushevents(long event_mask, Bool dispatch) {
XEvent ev;
@ -35,8 +37,7 @@ buttonrelease(XEvent *e) {
ev = &e->xbutton;
if((w = findwin(ev->window)))
if(w->handler->bup)
w->handler->bup(w, ev);
handle(w, bup, ev);
}
static void
@ -45,10 +46,8 @@ buttonpress(XEvent *e) {
Window *w;
ev = &e->xbutton;
if((w = findwin(ev->window))) {
if(w->handler->bdown)
w->handler->bdown(w, ev);
}
if((w = findwin(ev->window)))
handle(w, bdown, ev);
else
XAllowEvents(display, ReplayPointer, ev->time);
}
@ -60,10 +59,9 @@ configurerequest(XEvent *e) {
Window *w;
ev = &e->xconfigurerequest;
if((w = findwin(ev->window))) {
if(w->handler->configreq)
w->handler->configreq(w, ev);
}else{
if((w = findwin(ev->window)))
handle(w, configreq, ev);
else{
wc.x = ev->x;
wc.y = ev->y;
wc.width = ev->width;
@ -71,7 +69,6 @@ configurerequest(XEvent *e) {
wc.border_width = ev->border_width;
wc.sibling = ev->above;
wc.stack_mode = ev->detail;
//ev->value_mask &= ~(CWStackMode|CWSibling);
XConfigureWindow(display, ev->window, ev->value_mask, &wc);
}
}
@ -83,10 +80,9 @@ destroynotify(XEvent *e) {
Client *c;
ev = &e->xdestroywindow;
if((w = findwin(ev->window))) {
if(w->handler->destroy)
w->handler->destroy(w, ev);
}else {
if((w = findwin(ev->window)))
handle(w, destroy, ev);
else {
Debug fprintf(stderr, "DestroyWindow(%x) (no handler)\n", (uint)ev->window);
if((c = win2client(ev->window)))
fprintf(stderr, "Badness: Unhandled DestroyNotify: "
@ -103,10 +99,8 @@ enternotify(XEvent *e) {
if(ev->mode != NotifyNormal)
return;
if((w = findwin(ev->window))) {
if(w->handler->enter)
w->handler->enter(w, ev);
}
if((w = findwin(ev->window)))
handle(w, enter, ev);
else if(ev->window == scr.root.w) {
sel_screen = True;
draw_frames();
@ -164,21 +158,15 @@ focusin(XEvent *e) {
print_focus(nil, "<nil>");
screen->focus = nil;
}
else if((w = findwin(ev->window))) {
if(w->handler->focusin)
w->handler->focusin(w, ev);
}
else if((w = findwin(ev->window)))
handle(w, focusin, ev);
else if(ev->mode == NotifyGrab) {
if(ev->window == scr.root.w)
if(XCheckMaskEvent(display, KeyPressMask, &me)) {
/* wmii has grabbed focus */
c = screen->focus;
screen->hasgrab = &c_root;
screen->focus = &c_magic;
if(c)
draw_frame(c->sel);
flushevents(FocusChangeMask, True);
dispatch_event(&me);
return;
}
/* Some unmanaged window has grabbed focus */
if((c = screen->focus)) {
@ -197,15 +185,16 @@ focusout(XEvent *e) {
ev = &e->xfocus;
if(!((ev->detail == NotifyNonlinear)
||(ev->detail == NotifyNonlinearVirtual)))
||(ev->detail == NotifyNonlinearVirtual)
||(ev->detail == NotifyVirtual)
||(ev->detail == NotifyInferior)
||(ev->detail == NotifyAncestor)))
return;
if(ev->mode == NotifyUngrab)
screen->hasgrab = nil;
if((w = findwin(ev->window))) {
if(w->handler->focusout)
w->handler->focusout(w, ev);
}
if((w = findwin(ev->window)))
handle(w, focusout, ev);
}
static void
@ -215,10 +204,8 @@ expose(XEvent *e) {
ev = &e->xexpose;
if(ev->count == 0) {
if((w = findwin(ev->window))) {
if(w->handler->expose)
w->handler->expose(w, ev);
}
if((w = findwin(ev->window)))
handle(w, expose, ev);
}
}
@ -271,10 +258,8 @@ motionnotify(XEvent *e) {
Window *w;
ev = &e->xmotion;
if((w = findwin(ev->window))) {
if(w->handler->motion)
w->handler->motion(w, ev);
}
if((w = findwin(ev->window)))
handle(w, motion, ev);
}
static void
@ -283,10 +268,8 @@ propertynotify(XEvent *e) {
Window *w;
ev = &e->xproperty;
if((w = findwin(ev->window))) {
if(w->handler->property)
w->handler->property(w, ev);
}
if((w = findwin(ev->window)))
handle(w, property, ev);
}
static void
@ -295,10 +278,8 @@ mapnotify(XEvent *e) {
Window *w;
ev = &e->xmap;
if((w = findwin(ev->window))) {
if(w->handler->map)
w->handler->map(w, ev);
}
if((w = findwin(ev->window)))
handle(w, map, ev);
}
static void
@ -309,28 +290,27 @@ unmapnotify(XEvent *e) {
ev = &e->xunmap;
if((w = findwin(ev->window)) && (ev->event == w->parent->w)) {
if(ev->send_event || w->unmapped-- == 0)
if(w->handler->unmap)
w->handler->unmap(w, ev);
handle(w, unmap, ev);
}
}
void (*handler[LASTEvent]) (XEvent *) = {
[ButtonPress] = buttonpress,
[ButtonRelease] = buttonrelease,
[ConfigureRequest]=configurerequest,
[DestroyNotify] = destroynotify,
[EnterNotify] = enternotify,
[Expose] = expose,
[FocusIn] = focusin,
[FocusOut] = focusout,
[KeyPress] = keypress,
[LeaveNotify] = leavenotify,
[MapNotify] = mapnotify,
[MapRequest] = maprequest,
[MappingNotify] = mappingnotify,
[MotionNotify] = motionnotify,
[PropertyNotify]= propertynotify,
[UnmapNotify] = unmapnotify,
[ButtonPress] = buttonpress,
[ButtonRelease] = buttonrelease,
[ConfigureRequest] = configurerequest,
[DestroyNotify] = destroynotify,
[EnterNotify] = enternotify,
[Expose] = expose,
[FocusIn] = focusin,
[FocusOut] = focusout,
[KeyPress] = keypress,
[LeaveNotify] = leavenotify,
[MapNotify] = mapnotify,
[MapRequest] = maprequest,
[MappingNotify] = mappingnotify,
[MotionNotify] = motionnotify,
[PropertyNotify] = propertynotify,
[UnmapNotify] = unmapnotify,
};
void

View File

@ -133,7 +133,7 @@ bdown_event(Window *w, XButtonEvent *e) {
XAllowEvents(display, ReplayPointer, e->time);
break;
}
XAllowEvents(display, AsyncPointer, e->time);
XUngrabPointer(display, e->time);
}else{
if(e->button == Button1) {
if(frame_to_top(f))
@ -267,6 +267,13 @@ resize_frame(Frame *f, Rectangle r) {
f->crect = frame2client(f, f->crect);
f->crect = rectsubpt(f->crect, f->crect.min);
if(!f->area->floating && f->area->mode == Coldefault) {
if(Dy(f->r) < 2 * labelh(def.font))
f->collapsed = True;
else
f->collapsed = False;
}
if(Dx(f->crect) < labelh(def.font)) {
f->r.max.x = f->r.min.x + frame_delta_h();
f->collapsed = True;
@ -313,34 +320,29 @@ set_frame_cursor(Frame *f, Point pt) {
void
swap_frames(Frame *fa, Frame *fb) {
Rectangle trect;
Area *a;
Frame *an, *ap, *bn, *bp;
Frame **fp;
Client *c;
if(fa == fb) return;
an = fa->anext;
ap = fa->aprev;
bn = fb->anext;
bp = fb->aprev;
fb->anext = an;
fb->aprev = ap;
fa->anext = bn;
fa->aprev = bp;
for(fp = &fa->client->frame; *fp; fp = &(*fp)->cnext)
if(*fp == fa) break;
*fp = (*fp)->cnext;
if(fb->area->sel == fb)
fb->area->sel = fa;
if(fa->area->sel == fa)
fa->area->sel = fb;
for(fp = &fb->client->frame; *fp; fp = &(*fp)->cnext)
if(*fp == fb) break;
*fp = (*fp)->cnext;
c = fa->client;
fa->client = fb->client;
fb->client = c;
a = fb->area;
fb->area = fa->area;
fa->area = a;
fb->cnext = c->frame;
c->frame = fb;
trect = fa->r;
fa->r = fb->r;
fb->r = trect;
c = fa->client;
fa->cnext = c->frame;
c->frame = fa;
}
void

View File

@ -664,7 +664,7 @@ fs_read(Ixp9Req *r) {
respond(r, nil);
return;
case FsFTindex:
buf = (char *)view_index(f->p.view);
buf = (char*)view_index(f->p.view);
n = strlen(buf);
write_buf(r, buf, n);
respond(r, nil);

View File

@ -219,19 +219,8 @@ init_screen(WMScreen *screen) {
static void
cleanup() {
Point p;
Client *c;
for(c=client; c; c=c->next) {
p = ZP;
if(c->sel)
p = c->sel->r.min;
reparent_client(c, &scr.root, p);
if(c->sel && c->sel->view != screen->sel)
unmap_client(c, IconicState);
}
XSync(display, False);
XCloseDisplay(display);
while(client)
destroy_client(client);
ixp_server_close(&srv);
close(sleeperfd);
}
@ -250,7 +239,7 @@ struct {
/*
* There's no way to check accesses to destroyed windows, thus
* those cases are ignored (especially on UnmapNotify's).
* those cases are ignored (especially on UnmapNotifys).
* Other types of errors call Xlib's default error handler, which
* calls exit().
*/
@ -269,6 +258,8 @@ errorhandler(Display *dpy, XErrorEvent *error) {
fprintf(stderr, "%s: fatal error: Xrequest code=%d, Xerror code=%d\n",
argv0, error->request_code, error->error_code);
/* Try to cleanup, but only try once, in case we're called again */
if(!dead++)
cleanup();
return xlib_errorhandler(display, error); /* calls exit() */
@ -377,12 +368,17 @@ spawn_command(const char *cmd) {
}
}
void
static void
check_9pcon(IxpConn *c) {
serve_9pcon(c);
check_x_event(nil);
}
static void
closedisplay(IxpConn *c) {
XCloseDisplay(display);
}
int
main(int argc, char *argv[]) {
char *wmiirc, *str;
@ -447,7 +443,7 @@ main(int argc, char *argv[]) {
init_lock_keys();
ixp_listen(&srv, sock, &p9srv, check_9pcon, nil);
ixp_listen(&srv, ConnectionNumber(display), nil, check_x_event, nil);
ixp_listen(&srv, ConnectionNumber(display), nil, check_x_event, closedisplay);
def.font = loadfont(FONT);
def.border = 1;
@ -508,7 +504,6 @@ main(int argc, char *argv[]) {
if(exitsignal)
raise(exitsignal);
fprintf(stderr, "execstr: %s\n", execstr);
if(execstr)
execl("/bin/sh", "sh", "-c", execstr, nil);
if(errstr)

View File

@ -107,6 +107,7 @@ hashrm(Map *map, char *str) {
MapEnt **e, *te;
void *ret;
ret = nil;
e = hashgetp(map, str, 0);
if(*e) {
te = *e;

View File

@ -9,10 +9,11 @@
#include "dat.h"
#include "fns.h"
static char Ebadcmd[] = "bad command",
static char
Ebadcmd[] = "bad command",
Ebadvalue[] = "bad value";
/* Edit s/"([^"]+)"/L\1/g Edit |tr 'a-z' 'A-Z' */
/* Edit |sort Edit s/"([^"]+)"/L\1/g Edit |tr 'a-z' 'A-Z' */
enum {
LNOTURGENT,
LURGENT,
@ -388,7 +389,7 @@ send_frame(Frame *f, int sym, Bool swap) {
insert_frame(fp, f);
}
arrange_column(a, False);
arrange_view(f->view);
flushevents(EnterWindowMask, False);
focus_frame(f, True);
@ -471,6 +472,7 @@ send_client(View *v, Message *m, Bool swap) {
flushevents(EnterWindowMask, False);
focus_frame(f, True);
arrange_view(v);
update_views();
return nil;
}
@ -494,6 +496,8 @@ select_frame(Frame *f, int sym) {
if(fp == nil)
fp = a->frame;
break;
default:
assert(!"can't get here");
}
focus_frame(fp, False);

View File

@ -30,7 +30,6 @@ struct Framewin {
Point pt;
int or;
int n;
int before;
};
static Rectangle
@ -63,7 +62,6 @@ frameadjust(Framewin *f, Point pt, int or, int n) {
f->or = or;
f->n = n;
f->pt = pt;
reshapewin(f->w, framerect(f));
}
static Framewin*
@ -81,6 +79,7 @@ framewin(Frame *f, Point pt, int or, int n) {
fw->f = f;
fw->gb = f->grabbox;
frameadjust(fw, pt, or, n);
reshapewin(fw->w, framerect(fw));
mapwin(fw->w);
raisewin(fw->w);
@ -136,33 +135,34 @@ vplace(Framewin *fw, Point pt) {
int hr;
v = screen->sel;
r = fw->w->r;
hr = Dy(r)/2;
fw->n = pt.y;
fw->before = 1;
for(a = v->area->next; a->next; a = a->next)
if(pt.x < a->r.max.x)
break;
fw->ra = a;
for(f = a->frame; f->anext; f = f->anext) {
if(f == fw->f)
fw->before = 0;
pt.x = a->r.min.x;
frameadjust(fw, pt, OHoriz, Dx(a->r));
r = fw->w->r;
hr = Dy(r)/2;
fw->n = pt.y;
for(f = a->frame; f->anext; f = f->anext)
if(pt.y < f->r.max.y)
break;
}
if(!f->collapsed) {
fw->fp = f;
fw->fr = fw->fp->r;
if(f == fw->f) {
fw->fp = f->aprev;
fw->fr.max = f->r.max;
if(_vsnap(fw, f->r.min.y+hr))
goto done;
}
if(_vsnap(fw, f->r.max.y - hr)) {
fw->fr.min.y = f->r.max.y - labelh(def.font);
goto done;
@ -175,26 +175,27 @@ vplace(Framewin *fw, Point pt) {
_vsnap(fw, f->r.min.y);
else if(_vsnap(fw, f->r.min.y-hr))
fw->fp = f->aprev;
fw->fr.min.y = fw->n - hr;
fw->fr.min.y = pt.y - hr;
if(fw->fp && fw->fp->anext == fw->f)
fw->fr.max = fw->f->r.max;
goto done;
}
if(pt.y < f->r.min.y + hr) {
fw->n = f->r.min.y;
pt.y = f->r.min.y;
if(f->aprev && !f->aprev->collapsed)
fw->n -= hr;
pt.y -= hr;
}else {
fw->n = f->r.max.y;
pt.y = f->r.max.y;
if(f->anext == fw->f)
fw->n += hr;
pt.y += hr;
}
done:
pt.x = a->r.min.x;
pt.y = fw->n;
frameadjust(fw, pt, OHoriz, Dx(a->r));
frameadjust(fw, pt, OHoriz, Dx(a->r));
reshapewin(fw->w, framerect(fw));
}
static void
@ -221,7 +222,8 @@ hplace(Framewin *fw, Point pt) {
}
pt.y = a->r.min.y;
frameadjust(fw, pt, OVert, Dy(a->r));
frameadjust(fw, pt, OVert, Dy(a->r));
reshapewin(fw->w, framerect(fw));
}
static void
@ -232,7 +234,7 @@ do_managed_move(Client *c) {
Framewin *fw;
Window *cwin;
Frame *f;
Point pt;
Point pt, pt2;
int y;
focus(c, False);
@ -240,8 +242,9 @@ do_managed_move(Client *c) {
pt = querypointer(&scr.root);
pt.x = f->area->r.min.x;
fw = framewin(f, pt, OHoriz, Dx(f->area->r));
pt2.x = f->area->r.min.x;
pt2.y = pt.y;
fw = framewin(f, pt2, OHoriz, Dx(f->area->r));
r = screen->r;
r.min.y += fw->gb.min.y + Dy(fw->gb)/2;
@ -272,7 +275,7 @@ horiz:
case ButtonRelease:
switch(ev.xbutton.button) {
case 1:
if(f->anext && (!f->aprev || (fw->fp != 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);
}
@ -352,6 +355,11 @@ done:
XUngrabPointer(display, CurrentTime);
framedestroy(fw);
destroywindow(cwin);
pt = addpt(f->r.min, f->grabbox.min);
pt.x += Dx(f->grabbox)/2;
pt.y += Dy(f->grabbox)/2;
warppointer(pt);
}
static Window *

View File

@ -171,6 +171,8 @@ void
reparentwindow(Window *w, Window *par, Point p) {
XReparentWindow(display, w->w, par->w, p.x, p.y);
w->parent = par;
w->r = rectsubpt(w->r, w->r.min);
w->r = rectaddpt(w->r, p);
}
void

View File

@ -13,7 +13,8 @@ INCPATH = .:${ROOT}/include:${INCLUDE}:/usr/include
LIBS = -L/usr/lib -lc
# Flags
CFLAGS += -g -O0 -Wall
include ${ROOT}/mk/gcc.mk
CFLAGS += -g -O0
LDFLAGS += -g ${LIBS}
STATIC = -static
MKDEP = cpp -M