allow to resize mwfact with mouse

This commit is contained in:
Julien Danjou 2007-12-28 17:11:20 +01:00
parent 48f92f60d1
commit 6dde3eaf16
1 changed files with 60 additions and 21 deletions

67
mouse.c
View File

@ -28,6 +28,7 @@
#include "window.h" #include "window.h"
#include "statusbar.h" #include "statusbar.h"
#include "layouts/floating.h" #include "layouts/floating.h"
#include "layouts/tile.h"
extern AwesomeConf globalconf; extern AwesomeConf globalconf;
@ -116,38 +117,59 @@ uicb_client_movemouse(int screen, char *arg __attribute__ ((unused)))
void void
uicb_client_resizemouse(int screen, char *arg __attribute__ ((unused))) uicb_client_resizemouse(int screen, char *arg __attribute__ ((unused)))
{ {
int ocx, ocy, nw, nh; int ocx, ocy, nw, nh, n;
XEvent ev; XEvent ev;
Client *c = globalconf.focus->client; Client *c = globalconf.focus->client;
Tag **curtags = get_current_tags(screen); Tag **curtags = get_current_tags(screen);
Area area;
double mwfact;
if(!c) /* only handle floating and tiled layouts */
return; if(c)
{
if((curtags[0]->layout->arrange != layout_floating) if((curtags[0]->layout->arrange == layout_floating) || c->isfloating)
&& !c->isfloating) {
uicb_client_togglefloating(screen, NULL);
else
restack(screen); restack(screen);
p_delete(&curtags);
ocx = c->x; ocx = c->x;
ocy = c->y; ocy = c->y;
c->ismax = False;
}
else if (curtags[0]->layout->arrange == layout_tile
|| curtags[0]->layout->arrange == layout_tileleft)
{
for(n = 0, c = globalconf.clients; c; c = c->next)
if(IS_TILED(c, screen))
n++;
if(n <= curtags[0]->nmaster) return;
for(c = globalconf.clients; c && !IS_TILED(c, screen); c = c->next);
if(!c) return;
area = get_screen_area(screen,
globalconf.screens[c->screen].statusbar,
&globalconf.screens[c->screen].padding);
}
}
else
return;
if(XGrabPointer(globalconf.display, RootWindow(globalconf.display, c->phys_screen), if(XGrabPointer(globalconf.display, RootWindow(globalconf.display, c->phys_screen),
False, MOUSEMASK, GrabModeAsync, GrabModeAsync, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
None, globalconf.cursor[CurResize], CurrentTime) != GrabSuccess) None, globalconf.cursor[CurResize], CurrentTime) != GrabSuccess)
return; return;
c->ismax = False;
statusbar_draw(c->screen); if(curtags[0]->layout->arrange == layout_tileleft)
XWarpPointer(globalconf.display, None, c->win, 0, 0, 0, 0, 0, c->h + c->border - 1);
else
XWarpPointer(globalconf.display, None, c->win, 0, 0, 0, 0, c->w + c->border - 1, c->h + c->border - 1); XWarpPointer(globalconf.display, None, c->win, 0, 0, 0, 0, c->w + c->border - 1, c->h + c->border - 1);
for(;;) for(;;)
{ {
XMaskEvent(globalconf.display, MOUSEMASK | ExposureMask | SubstructureRedirectMask, &ev); XMaskEvent(globalconf.display, MOUSEMASK | ExposureMask | SubstructureRedirectMask, &ev);
switch (ev.type) switch (ev.type)
{ {
case ButtonRelease: case ButtonRelease:
XWarpPointer(globalconf.display, None, c->win, 0, 0, 0, 0, c->w + c->border - 1, c->h + c->border - 1);
XUngrabPointer(globalconf.display, CurrentTime); XUngrabPointer(globalconf.display, CurrentTime);
while(XCheckMaskEvent(globalconf.display, EnterWindowMask, &ev)); while(XCheckMaskEvent(globalconf.display, EnterWindowMask, &ev));
return; return;
@ -161,14 +183,31 @@ uicb_client_resizemouse(int screen, char *arg __attribute__ ((unused)))
handle_event_maprequest(&ev); handle_event_maprequest(&ev);
break; break;
case MotionNotify: case MotionNotify:
if(curtags[0]->layout->arrange == layout_floating || c->isfloating)
{
if((nw = ev.xmotion.x - ocx - 2 * c->border + 1) <= 0) if((nw = ev.xmotion.x - ocx - 2 * c->border + 1) <= 0)
nw = 1; nw = 1;
if((nh = ev.xmotion.y - ocy - 2 * c->border + 1) <= 0) if((nh = ev.xmotion.y - ocy - 2 * c->border + 1) <= 0)
nh = 1; nh = 1;
client_resize(c, c->x, c->y, nw, nh, True, False); client_resize(c, c->x, c->y, nw, nh, True, False);
}
else if(curtags[0]->layout->arrange == layout_tile
|| curtags[0]->layout->arrange == layout_tileleft)
{
if(curtags[0]->layout->arrange == layout_tile)
mwfact = (double) (ev.xmotion.x - area.x) / area.width;
else
mwfact = 1 - (double) (ev.xmotion.x - area.x) / area.width;
if(mwfact < 0.1) mwfact = 0.1;
else if(mwfact > 0.9) mwfact = 0.9;
curtags[0]->mwfact = mwfact;
arrange(screen);
}
break; break;
} }
} }
p_delete(&curtags);
} }