commit - c85d4bf338efd6371825dfe51680c62ee65be408
commit + c21d6eaf97dbcc03bbf6bd90096349dba8e1b071
blob - 1bfeb83ff93c564131f3b33e7cced7fa172bd3c6
blob + 03c56368be172e377ef948d27abdff49bfa924d4
--- star-platinum.c
+++ star-platinum.c
main(int argc, char **argv)
{
int status = 0, dump_config = 0, conftest = 0, ch;
- struct group *g;
- struct rule *r;
XEvent e;
Window root;
root = DefaultRootWindow(d);
- /* grab all the keys */
- for (g = config; g != NULL; g = g->next)
- for (r = g->rules; r != NULL; r = r->next)
- grabkey(r->key, root);
+ grabkey_matching_windows();
- XSelectInput(d, root, KeyPressMask);
+ XSelectInput(d, root, SubstructureNotifyMask | KeyPressMask);
XFlush(d);
pledge("stdio proc exec", NULL);
process_event(config, (XKeyEvent*)&e);
break;
+ case MapNotify: {
+ XMapEvent *ev = (XMapEvent*)&e;
+ grab_matching_keys(ev->window);
+ break;
+ }
+
+ case UnmapNotify:
+ case ConfigureNotify:
+ case CreateNotify:
+ case DestroyNotify:
+ case ClientMessage:
+ /* ignored */
+ break;
+
default:
printf("Unknown event %d\n", e.type);
break;
XGrabKey(d, XKeysymToKeycode(d, k.key),
k.modifier | ignored_modifiers[i],
w, False, GrabModeAsync, GrabModeAsync);
+ }
+}
+
+void
+grab_matching_keys(Window w)
+{
+ XClassHint ch;
+ struct group *g;
+ struct rule *r;
+
+ if (!XGetClassHint(d, w, &ch))
+ return;
+
+ for (g = config; g != NULL; g = g->next) {
+ if (!group_match(g, w))
+ continue;
+
+ for (r = g->rules; r != NULL; r = r->next)
+ grabkey(r->key, w);
}
+}
+
+int
+grabkey_matching_windows()
+{
+ Window root, parent, *children;
+ unsigned int len, i;
+
+ root = DefaultRootWindow(d);
+ if (!XQueryTree(d, root, &root, &parent, &children, &len))
+ return 0;
+
+ for (i = 0; i < len; ++i)
+ grab_matching_keys(children[i]);
+
+ return 1;
}
KeySym
blob - 96277b5de8bfaf10a929c1180880cf9968434770
blob + b92ba21cc0b1deba1173fa6d36119ab63c25a0af
--- star-platinum.h
+++ star-platinum.h
/* xlib-related */
int error_handler(Display*, XErrorEvent*);
void grabkey(struct key, Window);
+void grab_matching_keys(Window);
+int grabkey_matching_windows();
KeySym keycode_to_keysym(unsigned int);
Window focused_window();
void send_fake(Window, struct key, XKeyEvent*);