-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtinywm.vala
58 lines (52 loc) · 2.2 KB
/
tinywm.vala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*
* SPDX-License-Identifier: Unlicense
*/
public static int main (string[] args) {
var dpy = new X.Display ();
if (dpy == null) {
return 1;
}
X.Window root = dpy.default_root_window ();
dpy.grab_key (dpy.keysym_to_keycode (X.string_to_keysym ("F1")), X.KeyMask.Mod1Mask,
root, true, X.GrabMode.Async, X.GrabMode.Async);
dpy.grab_button (1, X.KeyMask.Mod1Mask, root, true,
X.EventMask.ButtonPressMask | X.EventMask.ButtonReleaseMask | X.EventMask.PointerMotionMask, X.GrabMode.Async, X.GrabMode.Async, X.None, (uint) X.None);
dpy.grab_button (3, X.KeyMask.Mod1Mask, root, true,
X.EventMask.ButtonPressMask | X.EventMask.ButtonReleaseMask | X.EventMask.PointerMotionMask, X.GrabMode.Async, X.GrabMode.Async, X.None, (uint) X.None);
var attr = X.WindowAttributes ();
var start = X.ButtonEvent () {
subwindow = X.None
};
var ev = X.Event ();
for (;;) {
dpy.next_event (ref ev);
switch (ev.type) {
case X.EventType.KeyPress:
if (ev.xkey.subwindow != X.None) {
dpy.raise_window (ev.xkey.subwindow);
}
break;
case X.EventType.ButtonPress:
if (ev.xbutton.subwindow != X.None) {
dpy.get_window_attributes (ev.xbutton.subwindow, out attr);
start = ev.xbutton;
}
break;
case X.EventType.MotionNotify:
if (start.subwindow != X.None) {
int xdiff = ev.xbutton.x_root - start.x_root;
int ydiff = ev.xbutton.y_root - start.y_root;
dpy.move_resize_window (start.subwindow,
attr.x + (start.button == 1 ? xdiff : 0),
attr.y + (start.button == 1 ? ydiff : 0),
uint.max (1, attr.width + (start.button == 3 ? xdiff : 0)),
uint.max (1, attr.height + (start.button == 3 ? ydiff : 0))
);
}
break;
case X.EventType.ButtonRelease:
start.subwindow = X.None;
break;
}
}
}