aewl

diff mouse.c @ 18:1efa34c6e1b6

added mouse-based resizals
author Anselm R. Garbe <garbeam@wmii.de>
date Tue, 11 Jul 2006 21:24:10 +0200
parents
children b5510d0c6d43
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/mouse.c	Tue Jul 11 21:24:10 2006 +0200
     1.3 @@ -0,0 +1,100 @@
     1.4 +/*
     1.5 + * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
     1.6 + * (C)opyright MMVI Kris Maglione <fbsdaemon@gmail.com>
     1.7 + * See LICENSE file for license details.
     1.8 + */
     1.9 +
    1.10 +#include <stdlib.h>
    1.11 +#include <string.h>
    1.12 +#include <unistd.h>
    1.13 +
    1.14 +#include "wm.h"
    1.15 +
    1.16 +#define ButtonMask      (ButtonPressMask | ButtonReleaseMask)
    1.17 +#define MouseMask       (ButtonMask | PointerMotionMask)
    1.18 +
    1.19 +static void
    1.20 +mmatch(Client *c, int x1, int y1, int x2, int y2)
    1.21 +{
    1.22 +	c->r[RFloat].width = abs(x1 - x2);
    1.23 +	c->r[RFloat].height = abs(y1 - y2);
    1.24 +	c->r[RFloat].width -=
    1.25 +		(c->r[RFloat].width - c->size.base_width) % c->size.width_inc;
    1.26 +	c->r[RFloat].height -=
    1.27 +		(c->r[RFloat].height - c->size.base_height) % c->size.height_inc;
    1.28 +	if(c->size.min_width && c->r[RFloat].width < c->size.min_width)
    1.29 +		c->r[RFloat].width = c->size.min_width;
    1.30 +	if(c->size.min_height && c->r[RFloat].height < c->size.min_height)
    1.31 +		c->r[RFloat].height = c->size.min_height;
    1.32 +	if(c->size.max_width && c->r[RFloat].width > c->size.max_width)
    1.33 +		c->r[RFloat].width = c->size.max_width;
    1.34 +	if(c->size.max_height && c->r[RFloat].height > c->size.max_height)
    1.35 +		c->r[RFloat].height = c->size.max_height;
    1.36 +	c->r[RFloat].x = (x1 <= x2) ? x1 : x1 - c->r[RFloat].width;
    1.37 +	c->r[RFloat].y = (y1 <= y2) ? y1 : y1 - c->r[RFloat].height;
    1.38 +}
    1.39 +
    1.40 +void
    1.41 +mresize(Client *c)
    1.42 +{
    1.43 +	XEvent ev;
    1.44 +	int old_cx, old_cy;
    1.45 +
    1.46 +	old_cx = c->r[RFloat].x;
    1.47 +	old_cy = c->r[RFloat].y;
    1.48 +	if(XGrabPointer(dpy, c->win, False, MouseMask, GrabModeAsync, GrabModeAsync,
    1.49 +				None, cursor[CurResize], CurrentTime) != GrabSuccess)
    1.50 +		return;
    1.51 +	XGrabServer(dpy);
    1.52 +	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0,
    1.53 +			c->r[RFloat].width, c->r[RFloat].height);
    1.54 +	for(;;) {
    1.55 +		XMaskEvent(dpy, MouseMask, &ev);
    1.56 +		switch(ev.type) {
    1.57 +		default: break;
    1.58 +		case MotionNotify:
    1.59 +			XUngrabServer(dpy);
    1.60 +			mmatch(c, old_cx, old_cy, ev.xmotion.x, ev.xmotion.y);
    1.61 +			resize(c);
    1.62 +			XGrabServer(dpy);
    1.63 +			break;
    1.64 +		case ButtonRelease:
    1.65 +			XUngrabPointer(dpy, CurrentTime);
    1.66 +			return;
    1.67 +		}
    1.68 +	}
    1.69 +}
    1.70 +
    1.71 +void
    1.72 +mmove(Client *c)
    1.73 +{
    1.74 +	XEvent ev;
    1.75 +	int x1, y1, old_cx, old_cy, di;
    1.76 +	unsigned int dui;
    1.77 +	Window dummy;
    1.78 +
    1.79 +	old_cx = c->r[RFloat].x;
    1.80 +	old_cy = c->r[RFloat].y;
    1.81 +	if(XGrabPointer(dpy, c->win, False, MouseMask, GrabModeAsync, GrabModeAsync,
    1.82 +				None, cursor[CurMove], CurrentTime) != GrabSuccess)
    1.83 +		return;
    1.84 +	XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
    1.85 +	XGrabServer(dpy);
    1.86 +	for(;;) {
    1.87 +		XMaskEvent(dpy, MouseMask, &ev);
    1.88 +		switch (ev.type) {
    1.89 +		default: break;
    1.90 +		case MotionNotify:
    1.91 +			XUngrabServer(dpy);
    1.92 +			c->r[RFloat].x = old_cx + (ev.xmotion.x - x1);
    1.93 +			c->r[RFloat].y = old_cy + (ev.xmotion.y - y1);
    1.94 +			resize(c);
    1.95 +			XGrabServer(dpy);
    1.96 +			break;
    1.97 +		case ButtonRelease:
    1.98 +			XUngrabServer(dpy);
    1.99 +			XUngrabPointer(dpy, CurrentTime);
   1.100 +			return;
   1.101 +		}
   1.102 +	}
   1.103 +}