mouse.c
author Anselm R. Garbe <garbeam@wmii.de>
Thu, 13 Jul 2006 01:04:38 +0200
changeset 31 386649deb651
parent 26 e8f627998d6f
child 41 fc9ccd34b8ab
permissions -rw-r--r--
before leaning things up
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
     1
/*
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
     2
 * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
     3
 * (C)opyright MMVI Kris Maglione <fbsdaemon@gmail.com>
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
     4
 * See LICENSE file for license details.
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
     5
 */
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
     6
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
     7
#include <stdlib.h>
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
     8
#include <string.h>
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
     9
#include <unistd.h>
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    10
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    11
#include "wm.h"
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    12
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    13
#define ButtonMask      (ButtonPressMask | ButtonReleaseMask)
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    14
#define MouseMask       (ButtonMask | PointerMotionMask)
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    15
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    16
void
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    17
mresize(Client *c)
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    18
{
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    19
	XEvent ev;
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    20
	int old_cx, old_cy;
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    21
20
4560e0882c1d made code more readable
Anselm R. Garbe <garbeam@wmii.de>
parents: 19
diff changeset
    22
	old_cx = c->x;
4560e0882c1d made code more readable
Anselm R. Garbe <garbeam@wmii.de>
parents: 19
diff changeset
    23
	old_cy = c->y;
19
b5510d0c6d43 added basic mouse support (actually we don't need more)
Anselm R. Garbe <garbeam@wmii.de>
parents: 18
diff changeset
    24
	if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
18
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    25
				None, cursor[CurResize], CurrentTime) != GrabSuccess)
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    26
		return;
20
4560e0882c1d made code more readable
Anselm R. Garbe <garbeam@wmii.de>
parents: 19
diff changeset
    27
	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
18
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    28
	for(;;) {
26
e8f627998d6f simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents: 20
diff changeset
    29
		XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
18
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    30
		switch(ev.type) {
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    31
		default: break;
26
e8f627998d6f simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents: 20
diff changeset
    32
		case Expose:
e8f627998d6f simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents: 20
diff changeset
    33
			handler[Expose](&ev);
e8f627998d6f simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents: 20
diff changeset
    34
			break;
18
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    35
		case MotionNotify:
26
e8f627998d6f simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents: 20
diff changeset
    36
			XFlush(dpy);
31
386649deb651 before leaning things up
Anselm R. Garbe <garbeam@wmii.de>
parents: 26
diff changeset
    37
			c->w = abs(old_cx - ev.xmotion.x);
386649deb651 before leaning things up
Anselm R. Garbe <garbeam@wmii.de>
parents: 26
diff changeset
    38
			c->h = abs(old_cy - ev.xmotion.y);
386649deb651 before leaning things up
Anselm R. Garbe <garbeam@wmii.de>
parents: 26
diff changeset
    39
			c->x = (old_cx <= ev.xmotion.x) ? old_cx : old_cx - c->w;
386649deb651 before leaning things up
Anselm R. Garbe <garbeam@wmii.de>
parents: 26
diff changeset
    40
			c->y = (old_cy <= ev.xmotion.y) ? old_cy : old_cy - c->h;
386649deb651 before leaning things up
Anselm R. Garbe <garbeam@wmii.de>
parents: 26
diff changeset
    41
			resize(c);
18
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    42
			break;
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    43
		case ButtonRelease:
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    44
			XUngrabPointer(dpy, CurrentTime);
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    45
			return;
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    46
		}
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    47
	}
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    48
}
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    49
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    50
void
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    51
mmove(Client *c)
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    52
{
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    53
	XEvent ev;
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    54
	int x1, y1, old_cx, old_cy, di;
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    55
	unsigned int dui;
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    56
	Window dummy;
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    57
20
4560e0882c1d made code more readable
Anselm R. Garbe <garbeam@wmii.de>
parents: 19
diff changeset
    58
	old_cx = c->x;
4560e0882c1d made code more readable
Anselm R. Garbe <garbeam@wmii.de>
parents: 19
diff changeset
    59
	old_cy = c->y;
19
b5510d0c6d43 added basic mouse support (actually we don't need more)
Anselm R. Garbe <garbeam@wmii.de>
parents: 18
diff changeset
    60
	if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
18
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    61
				None, cursor[CurMove], CurrentTime) != GrabSuccess)
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    62
		return;
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    63
	XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    64
	for(;;) {
26
e8f627998d6f simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents: 20
diff changeset
    65
		XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
18
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    66
		switch (ev.type) {
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    67
		default: break;
26
e8f627998d6f simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents: 20
diff changeset
    68
		case Expose:
e8f627998d6f simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents: 20
diff changeset
    69
			handler[Expose](&ev);
e8f627998d6f simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents: 20
diff changeset
    70
			break;
18
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    71
		case MotionNotify:
26
e8f627998d6f simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents: 20
diff changeset
    72
			XFlush(dpy);
20
4560e0882c1d made code more readable
Anselm R. Garbe <garbeam@wmii.de>
parents: 19
diff changeset
    73
			c->x = old_cx + (ev.xmotion.x - x1);
4560e0882c1d made code more readable
Anselm R. Garbe <garbeam@wmii.de>
parents: 19
diff changeset
    74
			c->y = old_cy + (ev.xmotion.y - y1);
31
386649deb651 before leaning things up
Anselm R. Garbe <garbeam@wmii.de>
parents: 26
diff changeset
    75
			resize(c);
18
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    76
			break;
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    77
		case ButtonRelease:
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    78
			XUngrabPointer(dpy, CurrentTime);
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    79
			return;
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    80
		}
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    81
	}
1efa34c6e1b6 added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
diff changeset
    82
}