mirror of https://github.com/0intro/wmii
Ameliorate the mouse.c rat's nest.
This commit is contained in:
parent
ba3b4bd5a2
commit
cc6103ca99
|
@ -185,7 +185,8 @@ bool setdebug(int);
|
||||||
void vdebug(int, const char*, va_list);
|
void vdebug(int, const char*, va_list);
|
||||||
|
|
||||||
/* mouse.c */
|
/* mouse.c */
|
||||||
void mouse_resize(Client*, bool opaque, Align);
|
void mouse_movegrabbox(Client*);
|
||||||
|
void mouse_resize(Client*, Align);
|
||||||
void mouse_resizecol(Divide*);
|
void mouse_resizecol(Divide*);
|
||||||
void grab_button(XWindow, uint button, ulong mod);
|
void grab_button(XWindow, uint button, ulong mod);
|
||||||
Align snap_rect(Rectangle *rects, int num, Rectangle *current, Align *mask, int snapw);
|
Align snap_rect(Rectangle *rects, int num, Rectangle *current, Align *mask, int snapw);
|
||||||
|
|
|
@ -154,7 +154,7 @@ bdown_event(Window *w, XButtonEvent *e) {
|
||||||
switch(e->button) {
|
switch(e->button) {
|
||||||
case Button1:
|
case Button1:
|
||||||
focus(c, false);
|
focus(c, false);
|
||||||
mouse_resize(c, false, Center);
|
mouse_resize(c, Center);
|
||||||
break;
|
break;
|
||||||
case Button2:
|
case Button2:
|
||||||
frame_restack(f, nil);
|
frame_restack(f, nil);
|
||||||
|
@ -163,7 +163,7 @@ bdown_event(Window *w, XButtonEvent *e) {
|
||||||
break;
|
break;
|
||||||
case Button3:
|
case Button3:
|
||||||
focus(c, false);
|
focus(c, false);
|
||||||
mouse_resize(c, false, quadrant(f->r, Pt(e->x_root, e->y_root)));
|
mouse_resize(c, quadrant(f->r, Pt(e->x_root, e->y_root)));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
XAllowEvents(display, ReplayPointer, e->time);
|
XAllowEvents(display, ReplayPointer, e->time);
|
||||||
|
@ -178,10 +178,10 @@ bdown_event(Window *w, XButtonEvent *e) {
|
||||||
view_restack(f->view);
|
view_restack(f->view);
|
||||||
}
|
}
|
||||||
if(rect_haspoint_p(Pt(e->x, e->y), f->grabbox))
|
if(rect_haspoint_p(Pt(e->x, e->y), f->grabbox))
|
||||||
mouse_resize(c, true, Center);
|
mouse_movegrabbox(c);
|
||||||
else if(f->area->floating)
|
else if(f->area->floating)
|
||||||
if(!e->subwindow && !rect_haspoint_p(Pt(e->x, e->y), f->titlebar))
|
if(!e->subwindow && !rect_haspoint_p(Pt(e->x, e->y), f->titlebar))
|
||||||
mouse_resize(c, false, quadrant(f->r, Pt(e->x_root, e->y_root)));
|
mouse_resize(c, quadrant(f->r, Pt(e->x_root, e->y_root)));
|
||||||
|
|
||||||
if(f->client != selclient())
|
if(f->client != selclient())
|
||||||
focus(c, false);
|
focus(c, false);
|
||||||
|
|
830
cmd/wmii/mouse.c
830
cmd/wmii/mouse.c
|
@ -68,9 +68,11 @@ framewin(Frame *f, Point pt, int orientation, int n) {
|
||||||
Framewin *fw;
|
Framewin *fw;
|
||||||
|
|
||||||
fw = emallocz(sizeof *fw);
|
fw = emallocz(sizeof *fw);
|
||||||
wa.override_redirect = True;
|
wa.override_redirect = true;
|
||||||
wa.event_mask = ExposureMask;
|
wa.event_mask = ExposureMask;
|
||||||
fw->w = createwindow(&scr.root, Rect(0, 0, 1, 1), scr.depth, InputOutput, &wa, CWEventMask);
|
fw->w = createwindow(&scr.root, Rect(0, 0, 1, 1),
|
||||||
|
scr.depth, InputOutput,
|
||||||
|
&wa, CWEventMask);
|
||||||
fw->w->aux = fw;
|
fw->w->aux = fw;
|
||||||
sethandler(fw->w, &handlers);
|
sethandler(fw->w, &handlers);
|
||||||
|
|
||||||
|
@ -226,149 +228,6 @@ hplace(Framewin *fw, Point pt) {
|
||||||
reshapewin(fw->w, framerect(fw));
|
reshapewin(fw->w, framerect(fw));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
do_managed_move(Client *c) {
|
|
||||||
Rectangle r;
|
|
||||||
WinAttr wa;
|
|
||||||
XEvent ev;
|
|
||||||
Framewin *fw;
|
|
||||||
Window *cwin;
|
|
||||||
Frame *f, *fprev, *fnext;
|
|
||||||
Point pt, pt2;
|
|
||||||
int y;
|
|
||||||
|
|
||||||
focus(c, false);
|
|
||||||
f = c->sel;
|
|
||||||
|
|
||||||
pt = querypointer(&scr.root);
|
|
||||||
|
|
||||||
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->grabbox.min.y + Dy(fw->grabbox)/2;
|
|
||||||
r.max.y = r.min.y + 1;
|
|
||||||
cwin = createwindow(&scr.root, r, 0, InputOnly, &wa, 0);
|
|
||||||
mapwin(cwin);
|
|
||||||
|
|
||||||
horiz:
|
|
||||||
ungrabpointer();
|
|
||||||
if(!grabpointer(&scr.root, nil, cursor[CurIcon], MouseMask))
|
|
||||||
goto done;
|
|
||||||
warppointer(pt);
|
|
||||||
vplace(fw, pt);
|
|
||||||
for(;;) {
|
|
||||||
XMaskEvent(display, MouseMask | ExposureMask, &ev);
|
|
||||||
switch (ev.type) {
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
case Expose:
|
|
||||||
dispatch_event(&ev);
|
|
||||||
break;
|
|
||||||
case MotionNotify:
|
|
||||||
pt.x = ev.xmotion.x_root;
|
|
||||||
pt.y = ev.xmotion.y_root;
|
|
||||||
|
|
||||||
vplace(fw, pt);
|
|
||||||
break;
|
|
||||||
case ButtonRelease:
|
|
||||||
switch(ev.xbutton.button) {
|
|
||||||
case 1:
|
|
||||||
/* TODO: Fix... Tangled, broken mess. */
|
|
||||||
fprev = f->aprev;
|
|
||||||
fnext = f->anext;
|
|
||||||
column_remove(f);
|
|
||||||
if(fnext
|
|
||||||
&& (!fprev || (fw->fprev != fprev)
|
|
||||||
&& (fw->fprev != fprev->aprev))) {
|
|
||||||
fnext->r.min.y = f->r.min.y;
|
|
||||||
frame_resize(fnext, fnext->r);
|
|
||||||
}
|
|
||||||
else if(fprev) {
|
|
||||||
if(fw->fprev == fprev->aprev) {
|
|
||||||
fw->fprev = fprev->aprev;
|
|
||||||
fprev->r = f->r;
|
|
||||||
}else
|
|
||||||
fprev->r.max.y = f->r.max.y;
|
|
||||||
frame_resize(fprev, fprev->r);
|
|
||||||
}
|
|
||||||
|
|
||||||
column_insert(fw->ra, f, fw->fprev);
|
|
||||||
|
|
||||||
r = fw->fprev_r;
|
|
||||||
if(f->aprev) {
|
|
||||||
f->aprev->r.max.y = r.min.y;
|
|
||||||
frame_resize(f->aprev, f->aprev->r);
|
|
||||||
}else
|
|
||||||
r.min.y = f->area->r.min.y;
|
|
||||||
|
|
||||||
if(f->anext)
|
|
||||||
r.max.y = f->anext->r.min.y;
|
|
||||||
else
|
|
||||||
r.max.y = f->area->r.max.y;
|
|
||||||
|
|
||||||
frame_resize(f, fw->fprev_r);
|
|
||||||
|
|
||||||
view_arrange(f->view);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ButtonPress:
|
|
||||||
switch(ev.xbutton.button) {
|
|
||||||
case 2:
|
|
||||||
goto vert;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
vert:
|
|
||||||
y = pt.y;
|
|
||||||
ungrabpointer();
|
|
||||||
if(!grabpointer(&scr.root, cwin, cursor[CurIcon], MouseMask))
|
|
||||||
goto done;
|
|
||||||
hplace(fw, pt);
|
|
||||||
for(;;) {
|
|
||||||
XMaskEvent(display, MouseMask | ExposureMask, &ev);
|
|
||||||
switch (ev.type) {
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
case Expose:
|
|
||||||
dispatch_event(&ev);
|
|
||||||
break;
|
|
||||||
case MotionNotify:
|
|
||||||
pt.x = ev.xmotion.x_root;
|
|
||||||
pt.y = ev.xmotion.y_root;
|
|
||||||
|
|
||||||
hplace(fw, pt);
|
|
||||||
break;
|
|
||||||
case ButtonRelease:
|
|
||||||
switch(ev.xbutton.button) {
|
|
||||||
case 1:
|
|
||||||
if(fw->ra) {
|
|
||||||
fw->ra = column_new(f->view, fw->ra, 0);
|
|
||||||
area_moveto(fw->ra, f);
|
|
||||||
view_arrange(f->view); /* I hate this. */
|
|
||||||
}
|
|
||||||
goto done;
|
|
||||||
case 2:
|
|
||||||
pt.y = y;
|
|
||||||
goto horiz;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
done:
|
|
||||||
ungrabpointer();
|
|
||||||
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*
|
static Window*
|
||||||
gethsep(Rectangle r) {
|
gethsep(Rectangle r) {
|
||||||
Window *w;
|
Window *w;
|
||||||
|
@ -381,193 +240,6 @@ gethsep(Rectangle r) {
|
||||||
return w;
|
return w;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
mouse_resizecolframe(Frame *f, Align align) {
|
|
||||||
WinAttr wa;
|
|
||||||
XEvent ev;
|
|
||||||
Window *cwin, *hwin;
|
|
||||||
Divide *d;
|
|
||||||
View *v;
|
|
||||||
Area *a;
|
|
||||||
Rectangle r;
|
|
||||||
Point pt, min;
|
|
||||||
|
|
||||||
assert((align&(East|West)) != (East|West));
|
|
||||||
assert((align&(North|South)) != (North|South));
|
|
||||||
|
|
||||||
v = screen->sel;
|
|
||||||
for(a = v->area->next, d = divs; a; a = a->next, d = d->next)
|
|
||||||
if(a == f->area) break;
|
|
||||||
|
|
||||||
if(align&East)
|
|
||||||
d = d->next;
|
|
||||||
|
|
||||||
min.x = Dx(v->r)/NCOL;
|
|
||||||
min.y = /*frame_delta_h() +*/ labelh(def.font);
|
|
||||||
if(align&North) {
|
|
||||||
if(f->aprev) {
|
|
||||||
r.min.y = f->aprev->r.min.y + min.y;
|
|
||||||
r.max.y = f->r.max.y - min.y;
|
|
||||||
}else {
|
|
||||||
r.min.y = a->r.min.y;
|
|
||||||
r.max.y = r.min.y + 1;
|
|
||||||
}
|
|
||||||
}else {
|
|
||||||
if(f->anext) {
|
|
||||||
r.max.y = f->anext->r.max.y - min.y;
|
|
||||||
r.min.y = f->r.min.y + min.y;
|
|
||||||
}else {
|
|
||||||
r.max.y = a->r.max.y;
|
|
||||||
r.min.y = r.max.y - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(align&West) {
|
|
||||||
if(a->prev != v->area) {
|
|
||||||
r.min.x = a->prev->r.min.x + min.x;
|
|
||||||
r.max.x = a->r.max.x - min.x;
|
|
||||||
}else {
|
|
||||||
r.min.x = a->r.min.x;
|
|
||||||
r.max.x = r.min.x + 1;
|
|
||||||
}
|
|
||||||
}else {
|
|
||||||
if(a->next) {
|
|
||||||
r.max.x = a->next->r.max.x - min.x;
|
|
||||||
r.min.x = a->r.min.x + min.x;
|
|
||||||
}else {
|
|
||||||
r.max.x = a->r.max.x;
|
|
||||||
r.min.x = r.max.x - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cwin = createwindow(&scr.root, r, 0, InputOnly, &wa, 0);
|
|
||||||
mapwin(cwin);
|
|
||||||
|
|
||||||
r = f->r;
|
|
||||||
if(align&North)
|
|
||||||
r.min.y--;
|
|
||||||
else
|
|
||||||
r.min.y = r.max.y - 1;
|
|
||||||
r.max.y = r.min.y + 2;
|
|
||||||
|
|
||||||
hwin = gethsep(r);
|
|
||||||
|
|
||||||
if(!grabpointer(&scr.root, cwin, cursor[CurSizing], MouseMask))
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
pt.x = ((align&West) ? f->r.min.x : f->r.max.x);
|
|
||||||
pt.y = ((align&North) ? f->r.min.y : f->r.max.y);
|
|
||||||
warppointer(pt);
|
|
||||||
|
|
||||||
for(;;) {
|
|
||||||
XMaskEvent(display, MouseMask | ExposureMask, &ev);
|
|
||||||
switch (ev.type) {
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
case Expose:
|
|
||||||
dispatch_event(&ev);
|
|
||||||
break;
|
|
||||||
case MotionNotify:
|
|
||||||
pt.x = ev.xmotion.x_root;
|
|
||||||
pt.y = ev.xmotion.y_root;
|
|
||||||
|
|
||||||
if(align&West)
|
|
||||||
r.min.x = pt.x;
|
|
||||||
else
|
|
||||||
r.max.x = pt.x;
|
|
||||||
r.min.y = ((align&South) ? pt.y : pt.y-1);
|
|
||||||
r.max.y = r.min.y+2;
|
|
||||||
|
|
||||||
div_set(d, pt.x);
|
|
||||||
reshapewin(hwin, r);
|
|
||||||
break;
|
|
||||||
case ButtonRelease:
|
|
||||||
r = f->r;
|
|
||||||
if(align&West)
|
|
||||||
r.min.x = pt.x;
|
|
||||||
else
|
|
||||||
r.max.x = pt.x;
|
|
||||||
if(align&North)
|
|
||||||
r.min.y = pt.y;
|
|
||||||
else
|
|
||||||
r.max.y = pt.y;
|
|
||||||
column_resizeframe(f, r);
|
|
||||||
|
|
||||||
/* XXX: Magic number... */
|
|
||||||
if(align&West)
|
|
||||||
pt.x = f->r.min.x + 4;
|
|
||||||
else
|
|
||||||
pt.x = f->r.max.x - 4;
|
|
||||||
if(align&North)
|
|
||||||
pt.y = f->r.min.y + 4;
|
|
||||||
else
|
|
||||||
pt.y = f->r.max.y - 4;
|
|
||||||
warppointer(pt);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
done:
|
|
||||||
ungrabpointer();
|
|
||||||
destroywindow(cwin);
|
|
||||||
destroywindow(hwin);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
mouse_resizecol(Divide *d) {
|
|
||||||
WinAttr wa;
|
|
||||||
XEvent ev;
|
|
||||||
Window *cwin;
|
|
||||||
Divide *dp;
|
|
||||||
View *v;
|
|
||||||
Area *a;
|
|
||||||
Rectangle r;
|
|
||||||
Point pt;
|
|
||||||
uint minw;
|
|
||||||
|
|
||||||
v = screen->sel;
|
|
||||||
|
|
||||||
for(a = v->area->next, dp = divs; a; a = a->next, dp = dp->next)
|
|
||||||
if(dp->next == d) break;
|
|
||||||
|
|
||||||
/* Fix later */
|
|
||||||
if(a == nil || a->next == nil)
|
|
||||||
return;
|
|
||||||
|
|
||||||
pt = querypointer(&scr.root);
|
|
||||||
|
|
||||||
minw = Dx(v->r)/NCOL;
|
|
||||||
r.min.x = a->r.min.x + minw;
|
|
||||||
r.max.x = a->next->r.max.x - minw;
|
|
||||||
r.min.y = pt.y;
|
|
||||||
r.max.y = pt.y+1;
|
|
||||||
|
|
||||||
cwin = createwindow(&scr.root, r, 0, InputOnly, &wa, 0);
|
|
||||||
mapwin(cwin);
|
|
||||||
|
|
||||||
if(!grabpointer(&scr.root, cwin, cursor[CurNone], MouseMask))
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
for(;;) {
|
|
||||||
XMaskEvent(display, MouseMask | ExposureMask, &ev);
|
|
||||||
switch (ev.type) {
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
case Expose:
|
|
||||||
dispatch_event(&ev);
|
|
||||||
break;
|
|
||||||
case MotionNotify:
|
|
||||||
pt.x = ev.xmotion.x_root;
|
|
||||||
div_set(d, pt.x);
|
|
||||||
break;
|
|
||||||
case ButtonRelease:
|
|
||||||
column_resize(a, pt.x - a->r.min.x);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
done:
|
|
||||||
ungrabpointer();
|
|
||||||
destroywindow(cwin);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rect_morph(Rectangle *r, Point d, Align *mask) {
|
rect_morph(Rectangle *r, Point d, Align *mask) {
|
||||||
int n;
|
int n;
|
||||||
|
@ -672,24 +344,383 @@ snap_rect(Rectangle *rects, int num, Rectangle *r, Align *mask, int snap) {
|
||||||
return ret ^ *mask;
|
return ret ^ *mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Grumble... Messy... TODO: Rewrite. */
|
static int
|
||||||
void
|
readmouse(Point *p, uint *button) {
|
||||||
mouse_resize(Client *c, bool grabbox, Align align) {
|
|
||||||
XEvent ev;
|
XEvent ev;
|
||||||
|
|
||||||
|
for(;;) {
|
||||||
|
XMaskEvent(display, MouseMask|ExposureMask, &ev);
|
||||||
|
switch(ev.type) {
|
||||||
|
case Expose:
|
||||||
|
dispatch_event(&ev);
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
case ButtonPress:
|
||||||
|
case ButtonRelease:
|
||||||
|
*button = ev.xbutton.button;
|
||||||
|
case MotionNotify:
|
||||||
|
p->x = ev.xmotion.x_root;
|
||||||
|
p->y = ev.xmotion.y_root;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ev.type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
readmotion(Point *p) {
|
||||||
|
uint button;
|
||||||
|
|
||||||
|
for(;;)
|
||||||
|
switch(readmouse(p, &button)) {
|
||||||
|
case MotionNotify:
|
||||||
|
return true;
|
||||||
|
case ButtonRelease:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_managed_move(Client *c) {
|
||||||
|
Rectangle r;
|
||||||
|
WinAttr wa;
|
||||||
|
Framewin *fw;
|
||||||
|
Window *cwin;
|
||||||
|
Frame *f, *fprev, *fnext;
|
||||||
|
Area *a;
|
||||||
|
Point pt, pt2;
|
||||||
|
uint button;
|
||||||
|
int y;
|
||||||
|
|
||||||
|
focus(c, false);
|
||||||
|
f = c->sel;
|
||||||
|
|
||||||
|
pt = querypointer(&scr.root);
|
||||||
|
|
||||||
|
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->grabbox.min.y + Dy(fw->grabbox)/2;
|
||||||
|
r.max.y = r.min.y + 1;
|
||||||
|
cwin = createwindow(&scr.root, r, 0, InputOnly, &wa, 0);
|
||||||
|
mapwin(cwin);
|
||||||
|
|
||||||
|
horiz:
|
||||||
|
ungrabpointer();
|
||||||
|
if(!grabpointer(&scr.root, nil, cursor[CurIcon], MouseMask))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
warppointer(pt);
|
||||||
|
vplace(fw, pt);
|
||||||
|
for(;;)
|
||||||
|
switch (readmouse(&pt, &button)) {
|
||||||
|
case MotionNotify:
|
||||||
|
vplace(fw, pt);
|
||||||
|
break;
|
||||||
|
case ButtonRelease:
|
||||||
|
if(button != 1)
|
||||||
|
continue;
|
||||||
|
/* TODO: Fix... Tangled, broken mess. */
|
||||||
|
fprev = f->aprev;
|
||||||
|
fnext = f->anext;
|
||||||
|
a = f->area;
|
||||||
|
column_remove(f);
|
||||||
|
if(fnext
|
||||||
|
&& (!fprev || (fw->fprev != fprev)
|
||||||
|
&& (fw->fprev != fprev->aprev))) {
|
||||||
|
fnext->r.min.y = f->r.min.y;
|
||||||
|
frame_resize(fnext, fnext->r);
|
||||||
|
}
|
||||||
|
else if(fprev) {
|
||||||
|
if(fw->fprev == fprev->aprev) {
|
||||||
|
fw->fprev = fprev->aprev;
|
||||||
|
fprev->r = f->r;
|
||||||
|
}else
|
||||||
|
fprev->r.max.y = f->r.max.y;
|
||||||
|
frame_resize(fprev, fprev->r);
|
||||||
|
}
|
||||||
|
|
||||||
|
column_insert(fw->ra, f, fw->fprev);
|
||||||
|
|
||||||
|
r = fw->fprev_r;
|
||||||
|
if(f->aprev) {
|
||||||
|
f->aprev->r.max.y = r.min.y;
|
||||||
|
frame_resize(f->aprev, f->aprev->r);
|
||||||
|
}else
|
||||||
|
r.min.y = f->area->r.min.y;
|
||||||
|
|
||||||
|
if(f->anext)
|
||||||
|
r.max.y = f->anext->r.min.y;
|
||||||
|
else
|
||||||
|
r.max.y = f->area->r.max.y;
|
||||||
|
|
||||||
|
frame_resize(f, fw->fprev_r);
|
||||||
|
|
||||||
|
if(!a->frame)
|
||||||
|
area_destroy(a);
|
||||||
|
view_arrange(f->view);
|
||||||
|
goto done;
|
||||||
|
case ButtonPress:
|
||||||
|
if(button == 2)
|
||||||
|
goto vert;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
vert:
|
||||||
|
y = pt.y;
|
||||||
|
ungrabpointer();
|
||||||
|
if(!grabpointer(&scr.root, cwin, cursor[CurIcon], MouseMask))
|
||||||
|
goto done;
|
||||||
|
hplace(fw, pt);
|
||||||
|
for(;;)
|
||||||
|
switch (readmouse(&pt, &button)) {
|
||||||
|
case MotionNotify:
|
||||||
|
hplace(fw, pt);
|
||||||
|
continue;
|
||||||
|
case ButtonPress:
|
||||||
|
if(button == 2) {
|
||||||
|
pt.y = y;
|
||||||
|
goto horiz;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
case ButtonRelease:
|
||||||
|
if(button != 1)
|
||||||
|
continue;
|
||||||
|
if(fw->ra) {
|
||||||
|
fw->ra = column_new(f->view, fw->ra, 0);
|
||||||
|
area_moveto(fw->ra, f);
|
||||||
|
view_arrange(f->view); /* I hate this. */
|
||||||
|
}
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
ungrabpointer();
|
||||||
|
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 void
|
||||||
|
mouse_resizecolframe(Frame *f, Align align) {
|
||||||
|
WinAttr wa;
|
||||||
|
Window *cwin, *hwin;
|
||||||
|
Divide *d;
|
||||||
|
View *v;
|
||||||
|
Area *a;
|
||||||
|
Rectangle r;
|
||||||
|
Point pt, min;
|
||||||
|
|
||||||
|
assert((align&(East|West)) != (East|West));
|
||||||
|
assert((align&(North|South)) != (North|South));
|
||||||
|
|
||||||
|
v = screen->sel;
|
||||||
|
for(a = v->area->next, d = divs; a; a = a->next, d = d->next)
|
||||||
|
if(a == f->area) break;
|
||||||
|
|
||||||
|
if(align&East)
|
||||||
|
d = d->next;
|
||||||
|
|
||||||
|
min.x = Dx(v->r)/NCOL;
|
||||||
|
min.y = /*frame_delta_h() +*/ labelh(def.font);
|
||||||
|
if(align&North) {
|
||||||
|
if(f->aprev) {
|
||||||
|
r.min.y = f->aprev->r.min.y + min.y;
|
||||||
|
r.max.y = f->r.max.y - min.y;
|
||||||
|
}else {
|
||||||
|
r.min.y = a->r.min.y;
|
||||||
|
r.max.y = r.min.y + 1;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
if(f->anext) {
|
||||||
|
r.max.y = f->anext->r.max.y - min.y;
|
||||||
|
r.min.y = f->r.min.y + min.y;
|
||||||
|
}else {
|
||||||
|
r.max.y = a->r.max.y;
|
||||||
|
r.min.y = r.max.y - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(align&West) {
|
||||||
|
if(a->prev != v->area) {
|
||||||
|
r.min.x = a->prev->r.min.x + min.x;
|
||||||
|
r.max.x = a->r.max.x - min.x;
|
||||||
|
}else {
|
||||||
|
r.min.x = a->r.min.x;
|
||||||
|
r.max.x = r.min.x + 1;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
if(a->next) {
|
||||||
|
r.max.x = a->next->r.max.x - min.x;
|
||||||
|
r.min.x = a->r.min.x + min.x;
|
||||||
|
}else {
|
||||||
|
r.max.x = a->r.max.x;
|
||||||
|
r.min.x = r.max.x - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cwin = createwindow(&scr.root, r, 0, InputOnly, &wa, 0);
|
||||||
|
mapwin(cwin);
|
||||||
|
|
||||||
|
r = f->r;
|
||||||
|
if(align&North)
|
||||||
|
r.min.y--;
|
||||||
|
else
|
||||||
|
r.min.y = r.max.y - 1;
|
||||||
|
r.max.y = r.min.y + 2;
|
||||||
|
|
||||||
|
hwin = gethsep(r);
|
||||||
|
|
||||||
|
if(!grabpointer(&scr.root, cwin, cursor[CurSizing], MouseMask))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
pt.x = ((align&West) ? f->r.min.x : f->r.max.x);
|
||||||
|
pt.y = ((align&North) ? f->r.min.y : f->r.max.y);
|
||||||
|
warppointer(pt);
|
||||||
|
|
||||||
|
while(readmotion(&pt)) {
|
||||||
|
if(align&West)
|
||||||
|
r.min.x = pt.x;
|
||||||
|
else
|
||||||
|
r.max.x = pt.x;
|
||||||
|
r.min.y = ((align&South) ? pt.y : pt.y-1);
|
||||||
|
r.max.y = r.min.y+2;
|
||||||
|
|
||||||
|
div_set(d, pt.x);
|
||||||
|
reshapewin(hwin, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
r = f->r;
|
||||||
|
if(align&West)
|
||||||
|
r.min.x = pt.x;
|
||||||
|
else
|
||||||
|
r.max.x = pt.x;
|
||||||
|
if(align&North)
|
||||||
|
r.min.y = pt.y;
|
||||||
|
else
|
||||||
|
r.max.y = pt.y;
|
||||||
|
column_resizeframe(f, r);
|
||||||
|
|
||||||
|
/* XXX: Magic number... */
|
||||||
|
if(align&West)
|
||||||
|
pt.x = f->r.min.x + 4;
|
||||||
|
else
|
||||||
|
pt.x = f->r.max.x - 4;
|
||||||
|
if(align&North)
|
||||||
|
pt.y = f->r.min.y + 4;
|
||||||
|
else
|
||||||
|
pt.y = f->r.max.y - 4;
|
||||||
|
warppointer(pt);
|
||||||
|
|
||||||
|
done:
|
||||||
|
ungrabpointer();
|
||||||
|
destroywindow(cwin);
|
||||||
|
destroywindow(hwin);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mouse_resizecol(Divide *d) {
|
||||||
|
WinAttr wa;
|
||||||
|
Window *cwin;
|
||||||
|
Divide *dp;
|
||||||
|
View *v;
|
||||||
|
Area *a;
|
||||||
|
Rectangle r;
|
||||||
|
Point pt;
|
||||||
|
uint minw;
|
||||||
|
|
||||||
|
v = screen->sel;
|
||||||
|
|
||||||
|
for(a = v->area->next, dp = divs; a; a = a->next, dp = dp->next)
|
||||||
|
if(dp->next == d) break;
|
||||||
|
|
||||||
|
/* Fix later */
|
||||||
|
if(a == nil || a->next == nil)
|
||||||
|
return;
|
||||||
|
|
||||||
|
pt = querypointer(&scr.root);
|
||||||
|
|
||||||
|
minw = Dx(v->r)/NCOL;
|
||||||
|
r.min.x = a->r.min.x + minw;
|
||||||
|
r.max.x = a->next->r.max.x - minw;
|
||||||
|
r.min.y = pt.y;
|
||||||
|
r.max.y = pt.y+1;
|
||||||
|
|
||||||
|
cwin = createwindow(&scr.root, r, 0, InputOnly, &wa, 0);
|
||||||
|
mapwin(cwin);
|
||||||
|
|
||||||
|
if(!grabpointer(&scr.root, cwin, cursor[CurNone], MouseMask))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
while(readmotion(&pt))
|
||||||
|
div_set(d, pt.x);
|
||||||
|
|
||||||
|
column_resize(a, pt.x - a->r.min.x);
|
||||||
|
|
||||||
|
done:
|
||||||
|
ungrabpointer();
|
||||||
|
destroywindow(cwin);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mouse_movegrabbox(Client *c) {
|
||||||
|
Rectangle *rects;
|
||||||
|
Rectangle frect, origin;
|
||||||
|
Point pt, pt1;
|
||||||
|
Frame *f;
|
||||||
|
Align align, grav;
|
||||||
|
uint nrect;
|
||||||
|
|
||||||
|
f = c->sel;
|
||||||
|
if(!f->area->floating) {
|
||||||
|
do_managed_move(c);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!grabpointer(c->framewin, nil, cursor[CurMove], MouseMask))
|
||||||
|
return;
|
||||||
|
|
||||||
|
rects = view_rects(f->view, &nrect, f);
|
||||||
|
origin = f->r;
|
||||||
|
frect = f->r;
|
||||||
|
|
||||||
|
pt1 = querypointer(&scr.root);
|
||||||
|
for(; readmotion(&pt); pt1=pt) {
|
||||||
|
origin = rectaddpt(origin, subpt(pt, pt1));
|
||||||
|
origin = constrain(origin);
|
||||||
|
frect = origin;
|
||||||
|
|
||||||
|
align = Center;
|
||||||
|
grav = snap_rect(rects, nrect, &frect, &align, def.snap);
|
||||||
|
|
||||||
|
frect = frame_hints(f, frect, Center);
|
||||||
|
frect = constrain(frect);
|
||||||
|
client_resize(c, frect);
|
||||||
|
}
|
||||||
|
client_resize(c, frect);
|
||||||
|
|
||||||
|
free(rects);
|
||||||
|
ungrabpointer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mouse_resize(Client *c, Align align) {
|
||||||
Rectangle *rects;
|
Rectangle *rects;
|
||||||
Rectangle frect, origin;
|
Rectangle frect, origin;
|
||||||
Align grav;
|
Align grav;
|
||||||
Cursor cur;
|
Cursor cur;
|
||||||
Point d, pt, hr;
|
Point d, pt, hr;
|
||||||
float rx, ry, hrx, hry;
|
float rx, ry, hrx, hry;
|
||||||
uint num;
|
uint nrect;
|
||||||
Frame *f;
|
Frame *f;
|
||||||
|
|
||||||
f = c->sel;
|
f = c->sel;
|
||||||
|
|
||||||
if(f->client->fullscreen)
|
if(f->client->fullscreen)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(!f->area->floating) {
|
if(!f->area->floating) {
|
||||||
if(align==Center)
|
if(align==Center)
|
||||||
do_managed_move(c);
|
do_managed_move(c);
|
||||||
|
@ -698,30 +729,28 @@ mouse_resize(Client *c, bool grabbox, Align align) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
origin = f->r;
|
|
||||||
frect = f->r;
|
|
||||||
rects = view_rects(f->area->view, &num, c->frame);
|
|
||||||
|
|
||||||
cur = quad_cursor(align);
|
cur = quad_cursor(align);
|
||||||
if((align==Center) && !grabbox)
|
if(align == Center)
|
||||||
cur = cursor[CurSizing];
|
cur = cursor[CurSizing];
|
||||||
|
|
||||||
pt = querypointer(c->framewin);
|
|
||||||
rx = (float)pt.x / Dx(frect);
|
|
||||||
ry = (float)pt.y /Dy(frect);
|
|
||||||
|
|
||||||
if(!grabpointer(c->framewin, nil, cur, MouseMask))
|
if(!grabpointer(c->framewin, nil, cur, MouseMask))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pt = querypointer(&scr.root);
|
origin = f->r;
|
||||||
|
frect = f->r;
|
||||||
|
rects = view_rects(f->area->view, &nrect, c->frame);
|
||||||
|
|
||||||
hr = subpt(frect.max, frect.min);
|
pt = querypointer(c->framewin);
|
||||||
hr = divpt(hr, Pt(2, 2));
|
rx = (float)pt.x / Dx(frect);
|
||||||
|
ry = (float)pt.y / Dy(frect);
|
||||||
|
|
||||||
|
pt = querypointer(&scr.root);
|
||||||
|
|
||||||
SET(hrx);
|
SET(hrx);
|
||||||
SET(hry);
|
SET(hry);
|
||||||
|
|
||||||
if(align != Center) {
|
if(align != Center) {
|
||||||
|
hr = subpt(frect.max, frect.min);
|
||||||
|
hr = divpt(hr, Pt(2, 2));
|
||||||
d = hr;
|
d = hr;
|
||||||
if(align&North) d.y -= hr.y;
|
if(align&North) d.y -= hr.y;
|
||||||
if(align&South) d.y += hr.y;
|
if(align&South) d.y += hr.y;
|
||||||
|
@ -730,12 +759,15 @@ mouse_resize(Client *c, bool grabbox, Align align) {
|
||||||
|
|
||||||
pt = addpt(d, f->r.min);
|
pt = addpt(d, f->r.min);
|
||||||
warppointer(pt);
|
warppointer(pt);
|
||||||
}
|
}else {
|
||||||
else if(!grabbox) {
|
hrx = (double)(Dx(screen->r)
|
||||||
hrx = (double)(Dx(screen->r) + Dx(frect) - 2 * labelh(def.font))
|
+ Dx(frect)
|
||||||
/ Dx(screen->r);
|
- 2 * labelh(def.font))
|
||||||
hry = (double)(Dy(screen->r) + Dy(frect) - 3 * labelh(def.font))
|
/ Dx(screen->r);
|
||||||
/ Dy(screen->r);
|
hry = (double)(Dy(screen->r)
|
||||||
|
+ Dy(frect)
|
||||||
|
- 3 * labelh(def.font))
|
||||||
|
/ Dy(screen->r);
|
||||||
|
|
||||||
pt.x = frect.max.x - labelh(def.font);
|
pt.x = frect.max.x - labelh(def.font);
|
||||||
pt.y = frect.max.y - labelh(def.font);
|
pt.y = frect.max.y - labelh(def.font);
|
||||||
|
@ -743,67 +775,51 @@ mouse_resize(Client *c, bool grabbox, Align align) {
|
||||||
d.y = pt.y / hry;
|
d.y = pt.y / hry;
|
||||||
|
|
||||||
warppointer(d);
|
warppointer(d);
|
||||||
flushevents(PointerMotionMask, False);
|
}
|
||||||
|
sync();
|
||||||
|
flushevents(PointerMotionMask, false);
|
||||||
|
|
||||||
|
while(readmotion(&d)) {
|
||||||
|
if(align == Center) {
|
||||||
|
d.x = (d.x * hrx) - pt.x;
|
||||||
|
d.y = (d.y * hry) - pt.y;
|
||||||
|
}else
|
||||||
|
d = subpt(d, pt);
|
||||||
|
pt = addpt(pt, d);
|
||||||
|
|
||||||
|
rect_morph(&origin, d, &align);
|
||||||
|
origin = constrain(origin);
|
||||||
|
frect = origin;
|
||||||
|
|
||||||
|
grav = snap_rect(rects, nrect, &frect, &align, def.snap);
|
||||||
|
|
||||||
|
frect = frame_hints(f, frect, grav);
|
||||||
|
frect = constrain(frect);
|
||||||
|
|
||||||
|
client_resize(c, frect);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(;;) {
|
pt = addpt(c->framewin->r.min,
|
||||||
XMaskEvent(display, MouseMask | ExposureMask, &ev);
|
Pt(Dx(frect) * rx,
|
||||||
switch (ev.type) {
|
Dy(frect) * ry));
|
||||||
default:
|
if(pt.y > f->view->r.max.y)
|
||||||
break;
|
pt.y = f->view->r.max.y - 1;
|
||||||
case Expose:
|
warppointer(pt);
|
||||||
dispatch_event(&ev);
|
|
||||||
break;
|
|
||||||
case MotionNotify:
|
|
||||||
d.x = ev.xmotion.x_root;
|
|
||||||
d.y = ev.xmotion.y_root;
|
|
||||||
|
|
||||||
if(align == Center && !grabbox) {
|
free(rects);
|
||||||
d.x = (d.x * hrx) - pt.x;
|
ungrabpointer();
|
||||||
d.y = (d.y * hry) - pt.y;
|
|
||||||
}else
|
|
||||||
d = subpt(d, pt);
|
|
||||||
pt = addpt(pt, d);
|
|
||||||
|
|
||||||
rect_morph(&origin, d, &align);
|
|
||||||
origin = constrain(origin);
|
|
||||||
frect = origin;
|
|
||||||
|
|
||||||
grav = snap_rect(rects, num, &frect, &align, def.snap);
|
|
||||||
|
|
||||||
frect = frame_hints(f, frect, grav);
|
|
||||||
frect = constrain(frect);
|
|
||||||
|
|
||||||
//reshapewin(c->framewin, frect);
|
|
||||||
client_resize(c, frect);
|
|
||||||
break;
|
|
||||||
case ButtonRelease:
|
|
||||||
client_resize(c, frect);
|
|
||||||
|
|
||||||
if(!grabbox) {
|
|
||||||
pt = translate(c->framewin, &scr.root,
|
|
||||||
Pt(Dx(frect)*rx, Dy(frect)*ry));
|
|
||||||
if(pt.y > screen->brect.min.y)
|
|
||||||
pt.y = screen->brect.min.y - 1;
|
|
||||||
warppointer(pt);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(rects);
|
|
||||||
ungrabpointer();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Doesn't belong here */
|
/* Doesn't belong here */
|
||||||
void
|
void
|
||||||
grab_button(XWindow w, uint button, ulong mod) {
|
grab_button(XWindow w, uint button, ulong mod) {
|
||||||
XGrabButton(display, button, mod, w, False, ButtonMask,
|
XGrabButton(display, button, mod, w, false, ButtonMask,
|
||||||
GrabModeSync, GrabModeSync, None, None);
|
GrabModeSync, GrabModeSync, None, None);
|
||||||
if((mod != AnyModifier) && (numlock_mask != 0)) {
|
if((mod != AnyModifier) && (numlock_mask != 0)) {
|
||||||
XGrabButton(display, button, mod | numlock_mask, w, False, ButtonMask,
|
XGrabButton(display, button, mod | numlock_mask, w, false, ButtonMask,
|
||||||
GrabModeSync, GrabModeAsync, None, None);
|
GrabModeSync, GrabModeAsync, None, None);
|
||||||
XGrabButton(display, button, mod | numlock_mask | LockMask, w, False,
|
XGrabButton(display, button, mod | numlock_mask | LockMask, w, false,
|
||||||
ButtonMask, GrabModeSync, GrabModeAsync, None, None);
|
ButtonMask, GrabModeSync, GrabModeAsync, None, None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,6 +106,17 @@ rectsubpt(Rectangle r, Point p) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Rectangle
|
||||||
|
rectsetorigin(Rectangle r, Point p) {
|
||||||
|
Rectangle ret;
|
||||||
|
|
||||||
|
ret.min.x = p.x;
|
||||||
|
ret.min.y = p.y;
|
||||||
|
ret.max.x = p.x + Dx(r);
|
||||||
|
ret.max.y = p.y + Dy(r);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Formatters */
|
/* Formatters */
|
||||||
static int
|
static int
|
||||||
Afmt(Fmt *f) {
|
Afmt(Fmt *f) {
|
||||||
|
|
|
@ -239,6 +239,7 @@ XRectangle XRect(Rectangle);
|
||||||
Rectangle gravitate(Rectangle dst, Rectangle src, Point grav);
|
Rectangle gravitate(Rectangle dst, Rectangle src, Point grav);
|
||||||
Rectangle insetrect(Rectangle, int);
|
Rectangle insetrect(Rectangle, int);
|
||||||
Rectangle rectaddpt(Rectangle, Point);
|
Rectangle rectaddpt(Rectangle, Point);
|
||||||
|
Rectangle rectsetorigin(Rectangle, Point);
|
||||||
Rectangle rectsubpt(Rectangle, Point);
|
Rectangle rectsubpt(Rectangle, Point);
|
||||||
Handlers* sethandler(Window*, Handlers*);
|
Handlers* sethandler(Window*, Handlers*);
|
||||||
Rectangle sizehint(WinHints*, Rectangle);
|
Rectangle sizehint(WinHints*, Rectangle);
|
||||||
|
|
Loading…
Reference in New Issue