added basic mouse support (actually we don't need more) 48b6e9a3
Anselm R. Garbe · 2006-07-11 21:41 4 file(s) · +15 −24
client.c +7 −4
70 70
	c->r[RFloat].y = wa->y;
71 71
	c->r[RFloat].width = wa->width;
72 72
	c->r[RFloat].height = wa->height;
73 -
	c->border = wa->border_width;
74 -
	XSetWindowBorderWidth(dpy, c->win, 0);
73 +
	XSetWindowBorderWidth(dpy, c->win, 1);
75 74
	XSelectInput(dpy, c->win, CLIENT_MASK);
76 75
	XGetTransientForHint(dpy, c->win, &c->trans);
77 76
	if(!XGetWMNormalHints(dpy, c->win, &c->size, &msize) || !c->size.flags)
97 96
	c->snext = stack;
98 97
	stack = c;
99 98
	XMapWindow(dpy, c->win);
100 -
	XGrabButton(dpy, AnyButton, Mod1Mask, c->win, False, ButtonPressMask,
99 +
	XGrabButton(dpy, Button1, Mod1Mask, c->win, False, ButtonPressMask,
100 +
			GrabModeAsync, GrabModeSync, None, None);
101 +
	XGrabButton(dpy, Button2, Mod1Mask, c->win, False, ButtonPressMask,
102 +
			GrabModeAsync, GrabModeSync, None, None);
103 +
	XGrabButton(dpy, Button3, Mod1Mask, c->win, False, ButtonPressMask,
101 104
			GrabModeAsync, GrabModeSync, None, None);
102 105
	focus(c);
103 106
}
116 119
	e.y = c->r[RFloat].y;
117 120
	e.width = c->r[RFloat].width;
118 121
	e.height = c->r[RFloat].height;
119 -
	e.border_width = c->border;
122 +
	e.border_width = 0;
120 123
	e.above = None;
121 124
	e.override_redirect = False;
122 125
	XSelectInput(dpy, c->win, CLIENT_MASK & ~StructureNotifyMask);
event.c +0 −2
86 86
			c->r[RFloat].width = ev->width;
87 87
		if(ev->value_mask & CWHeight)
88 88
			c->r[RFloat].height = ev->height;
89 -
		if(ev->value_mask & CWBorderWidth)
90 -
			c->border = ev->border_width;
91 89
	}
92 90
93 91
	wc.x = ev->x;
mouse.c +8 −4
42 42
43 43
	old_cx = c->r[RFloat].x;
44 44
	old_cy = c->r[RFloat].y;
45 -
	if(XGrabPointer(dpy, c->win, False, MouseMask, GrabModeAsync, GrabModeAsync,
45 +
	if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
46 46
				None, cursor[CurResize], CurrentTime) != GrabSuccess)
47 47
		return;
48 48
	XGrabServer(dpy);
55 55
		case MotionNotify:
56 56
			XUngrabServer(dpy);
57 57
			mmatch(c, old_cx, old_cy, ev.xmotion.x, ev.xmotion.y);
58 -
			resize(c);
58 +
			XResizeWindow(dpy, c->win, c->r[RFloat].width, c->r[RFloat].height);
59 59
			XGrabServer(dpy);
60 60
			break;
61 61
		case ButtonRelease:
62 +
			resize(c);
63 +
			XUngrabServer(dpy);
62 64
			XUngrabPointer(dpy, CurrentTime);
63 65
			return;
64 66
		}
75 77
76 78
	old_cx = c->r[RFloat].x;
77 79
	old_cy = c->r[RFloat].y;
78 -
	if(XGrabPointer(dpy, c->win, False, MouseMask, GrabModeAsync, GrabModeAsync,
80 +
	if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
79 81
				None, cursor[CurMove], CurrentTime) != GrabSuccess)
80 82
		return;
81 83
	XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
88 90
			XUngrabServer(dpy);
89 91
			c->r[RFloat].x = old_cx + (ev.xmotion.x - x1);
90 92
			c->r[RFloat].y = old_cy + (ev.xmotion.y - y1);
91 -
			resize(c);
93 +
			XMoveResizeWindow(dpy, c->win, c->r[RFloat].x, c->r[RFloat].y,
94 +
					c->r[RFloat].width, c->r[RFloat].height);
92 95
			XGrabServer(dpy);
93 96
			break;
94 97
		case ButtonRelease:
98 +
			resize(c);
95 99
			XUngrabServer(dpy);
96 100
			XUngrabPointer(dpy, CurrentTime);
97 101
			return;
wm.h +0 −14
13 13
14 14
typedef struct Client Client;
15 15
typedef struct Key Key;
16 -
typedef enum Align Align;
17 -
18 -
enum Align {
19 -
	NORTH = 0x01,
20 -
	EAST  = 0x02,
21 -
	SOUTH = 0x04,
22 -
	WEST  = 0x08,
23 -
	NEAST = NORTH | EAST,
24 -
	NWEST = NORTH | WEST,
25 -
	SEAST = SOUTH | EAST,
26 -
	SWEST = SOUTH | WEST,
27 -
	CENTER = NEAST | SWEST
28 -
};
29 16
30 17
/* atoms */
31 18
enum { WMProtocols, WMDelete, WMLast };
40 27
struct Client {
41 28
	char name[256];
42 29
	char tag[256];
43 -
	unsigned int border;
44 30
	int proto;
45 31
	Bool fixedsize;
46 32
	Window win;