summaryrefslogtreecommitdiff
path: root/x11-misc/dunst-1.0.0/dunst-1.0.0-numlock.patch
blob: e6b4d9a70c2a4096f273c79525c3b8c546f9fc74 (plain)
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
diff --git a/x.c b/x.c
index 2ad74d3..4248082 100644
--- a/x.c
+++ b/x.c
@@ -458,6 +458,53 @@ static void setopacity(Window win, unsigned long opacity)
 
 
 
+        /*
+         * Returns the modifier which is NumLock.
+         */
+static KeySym x_numlock_mod()
+{
+        const KeyCode nl = XKeysymToKeycode(xctx.dpy, XStringToKeysym("Num_Lock"));
+
+        int mod;
+        KeySym sym = 0;
+        XModifierKeymap * map = XGetModifierMapping(xctx.dpy);
+
+        for (mod = 0; mod < 8; mod++) {
+                for (int j = 0; j < map->max_keypermod; j++) {
+                        if (map->modifiermap[mod*map->max_keypermod+j] == nl) {
+                                switch (mod) {
+                                        case ShiftMapIndex:
+                                                sym = ShiftMask;
+                                                break;
+                                        case LockMapIndex:
+                                                sym = LockMask;
+                                                break;
+                                        case ControlMapIndex:
+                                                sym = ControlMask;
+                                                break;
+                                        case Mod1MapIndex:
+                                                sym = Mod1Mask;
+                                                break;
+                                        case Mod2MapIndex:
+                                                sym = Mod2Mask;
+                                                break;
+                                        case Mod3MapIndex:
+                                                sym = Mod3Mask;
+                                                break;
+                                        case Mod4MapIndex:
+                                                sym = Mod4Mask;
+                                                break;
+                                        case Mod5MapIndex:
+                                                sym = Mod5Mask;
+                                                break;
+                                }
+                        }
+                }
+        }
+
+        XFreeModifiermap(map);
+        return sym;
+}
 
         /*
          * Helper function to use glib's mainloop mechanic
@@ -488,6 +535,7 @@ gboolean x_mainloop_fd_dispatch(GSource * source, GSourceFunc callback,
                                 gpointer user_data)
 {
         XEvent ev;
+        unsigned int state;
         while (XPending(xctx.dpy) > 0) {
                 XNextEvent(xctx.dpy, &ev);
                 switch (ev.type) {
@@ -508,10 +556,13 @@ gboolean x_mainloop_fd_dispatch(GSource * source, GSourceFunc callback,
                         }
                         break;
                 case KeyPress:
+                        state = ev.xkey.state;
+                        /* NumLock is also encoded in the state. Remove it. */
+                        state &= ~x_numlock_mod();
                         if (settings.close_ks.str
                             && XLookupKeysym(&ev.xkey,
                                              0) == settings.close_ks.sym
-                            && settings.close_ks.mask == ev.xkey.state) {
+                            && settings.close_ks.mask == state) {
                                 if (displayed) {
                                         notification *n = g_queue_peek_head(displayed);
                                         if (n)
@@ -521,19 +572,19 @@ gboolean x_mainloop_fd_dispatch(GSource * source, GSourceFunc callback,
                         if (settings.history_ks.str
                             && XLookupKeysym(&ev.xkey,
                                              0) == settings.history_ks.sym
-                            && settings.history_ks.mask == ev.xkey.state) {
+                            && settings.history_ks.mask == state) {
                                 history_pop();
                         }
                         if (settings.close_all_ks.str
                             && XLookupKeysym(&ev.xkey,
                                              0) == settings.close_all_ks.sym
-                            && settings.close_all_ks.mask == ev.xkey.state) {
+                            && settings.close_all_ks.mask == state) {
                                 move_all_to_history();
                         }
                         if (settings.context_ks.str
                             && XLookupKeysym(&ev.xkey,
                                              0) == settings.context_ks.sym
-                            && settings.context_ks.mask == ev.xkey.state) {
+                            && settings.context_ks.mask == state) {
                                 context_menu();
                         }
                         break;
@@ -926,9 +977,12 @@ int x_shortcut_grab(keyboard_shortcut * ks)
 
         x_shortcut_setup_error_handler();
 
-        if (ks->is_valid)
+        if (ks->is_valid) {
                 XGrabKey(xctx.dpy, ks->code, ks->mask, root,
                          true, GrabModeAsync, GrabModeAsync);
+                XGrabKey(xctx.dpy, ks->code, ks->mask | x_numlock_mod() , root,
+                         true, GrabModeAsync, GrabModeAsync);
+        }
 
         if (x_shortcut_tear_down_error_handler()) {
                 fprintf(stderr, "Unable to grab key \"%s\"\n", ks->str);
@@ -945,8 +999,10 @@ void x_shortcut_ungrab(keyboard_shortcut * ks)
 {
         Window root;
         root = RootWindow(xctx.dpy, DefaultScreen(xctx.dpy));
-        if (ks->is_valid)
+        if (ks->is_valid) {
                 XUngrabKey(xctx.dpy, ks->code, ks->mask, root);
+                XUngrabKey(xctx.dpy, ks->code, ks->mask | x_numlock_mod(), root);
+        }
 }
 
         /*