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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
From caf61ed5c47b32938bea4a0577f4f6953ddd1578 Mon Sep 17 00:00:00 2001
From: Casey Fitzpatrick <kcghost@gmail.com>
Date: Fri, 27 Jan 2023 19:46:05 -0500
Subject: [PATCH] Support draggable tabs
---
tabbed.c | 39 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 38 insertions(+), 1 deletion(-)
diff --git a/tabbed.c b/tabbed.c
index eafe28a..2e3b61a 100644
--- a/tabbed.c
+++ b/tabbed.c
@@ -88,6 +88,7 @@ typedef struct {
/* function declarations */
static void buttonpress(const XEvent *e);
+static void motionnotify(const XEvent *e);
static void cleanup(void);
static void clientmessage(const XEvent *e);
static void configurenotify(const XEvent *e);
@@ -151,6 +152,7 @@ static void (*handler[LASTEvent]) (const XEvent *) = {
[KeyPress] = keypress,
[MapRequest] = maprequest,
[PropertyNotify] = propertynotify,
+ [MotionNotify] = motionnotify,
};
static int bh, obh, wx, wy, ww, wh;
static unsigned int numlockmask;
@@ -209,6 +211,41 @@ buttonpress(const XEvent *e)
}
}
+void
+motionnotify(const XEvent *e)
+{
+ const XMotionEvent *ev = &e->xmotion;
+ int i, fc;
+ Arg arg;
+
+ if (ev->y < 0 || ev->y > bh)
+ return;
+
+ if (! (ev->state & Button1Mask)) {
+ return;
+ }
+
+ if (((fc = getfirsttab()) > 0 && ev->x < TEXTW(before)) || ev->x < 0)
+ return;
+
+ if (sel < 0)
+ return;
+
+ for (i = fc; i < nclients; i++) {
+ if (clients[i]->tabx > ev->x) {
+ if (i == sel+1) {
+ arg.i = 1;
+ movetab(&arg);
+ }
+ if (i == sel-1) {
+ arg.i = -1;
+ movetab(&arg);
+ }
+ break;
+ }
+ }
+}
+
void
cleanup(void)
{
@@ -1046,7 +1083,7 @@ setup(void)
XSelectInput(dpy, win, SubstructureNotifyMask | FocusChangeMask |
ButtonPressMask | ExposureMask | KeyPressMask |
PropertyChangeMask | StructureNotifyMask |
- SubstructureRedirectMask);
+ SubstructureRedirectMask | ButtonMotionMask);
xerrorxlib = XSetErrorHandler(xerror);
class_hint.res_name = wmname;
--
2.25.1
|