#include <sys/queue.h>
#include <sys/param.h>
#include <sys/select.h>
+#if defined(__linux__)
+#include "tree.h"
+#elif defined(__OpenBSD__)
+#include <sys/tree.h>
+#elif defined(__FreeBSD__)
+#include <sys/tree.h>
+#else
+#include <sys/tree.h>
+#endif
#include <X11/cursorfont.h>
#include <X11/keysym.h>
#ifdef SWM_DEBUG
#define DPRINTF(x...) do { if (swm_debug) fprintf(stderr, x); } while (0)
#define DNPRINTF(n,x...) do { if (swm_debug & n) fprintf(stderr, x); } while (0)
-#define SWM_D_MISC 0x0001
-#define SWM_D_EVENT 0x0002
-#define SWM_D_WS 0x0004
-#define SWM_D_FOCUS 0x0008
-#define SWM_D_MOVE 0x0010
-#define SWM_D_STACK 0x0020
-#define SWM_D_MOUSE 0x0040
-#define SWM_D_PROP 0x0080
-#define SWM_D_CLASS 0x0100
+#define SWM_D_MISC 0x0001
+#define SWM_D_EVENT 0x0002
+#define SWM_D_WS 0x0004
+#define SWM_D_FOCUS 0x0008
+#define SWM_D_MOVE 0x0010
+#define SWM_D_STACK 0x0020
+#define SWM_D_MOUSE 0x0040
+#define SWM_D_PROP 0x0080
+#define SWM_D_CLASS 0x0100
#define SWM_D_KEY 0x0200
#define SWM_D_QUIRK 0x0400
#define SWM_D_SPAWN 0x0800
x = SWM_BAR_OFFSET;
DRAWSTRING(display, r->bar_window, bar_fs, r->s->bar_gc,
- x, (bar_fs_extents->max_logical_extent.height - lbox.height) / 2 -
+ x, (bar_fs_extents->max_logical_extent.height - lbox.height) / 2 -
lbox.y, s, len);
}
DNPRINTF(SWM_D_PROP, "send_to_ws: set property: _SWM_WS: %s\n",
ws_idx_str);
XChangeProperty(display, win->id, ws_idx_atom, XA_STRING, 8,
- PropModeReplace, ws_idx_str, SWM_PROPLEN);
+ PropModeReplace, ws_idx_str, strlen((char *)ws_idx_str));
}
stack();
}
/* horizontal */
- if (left)
+ if (left)
dx = -dx;
if (args->id == SWM_ARG_ID_CENTER) {
{ "invalid key func", NULL, {0} },
};
struct key {
- TAILQ_ENTRY(key) entry;
+ RB_ENTRY(key) entry;
unsigned int mod;
KeySym keysym;
enum keyfuncid funcid;
char *spawn_name;
};
-TAILQ_HEAD(key_list, key);
-struct key_list keys = TAILQ_HEAD_INITIALIZER(keys);
+RB_HEAD(key_list, key);
+
+int
+key_cmp(struct key *kp1, struct key *kp2)
+{
+ if (kp1->keysym < kp2->keysym)
+ return (-1);
+ if (kp1->keysym > kp2->keysym)
+ return (1);
+
+ if (kp1->mod < kp2->mod)
+ return (-1);
+ if (kp1->mod > kp2->mod)
+ return (1);
+
+ return (0);
+}
+
+RB_GENERATE_STATIC(key_list, key, entry, key_cmp);
+struct key_list keys;
/* mouse */
enum { client_click, root_click };
struct key *kp;
mod_key = mod;
- TAILQ_FOREACH(kp, &keys, entry)
+ RB_FOREACH(kp, key_list, &keys)
if (kp->mod & ShiftMask)
kp->mod = mod | ShiftMask;
else
kp->keysym = ks;
kp->funcid = kfid;
kp->spawn_name = strdupsafe(spawn_name);
- TAILQ_INSERT_TAIL(&keys, kp, entry);
+ RB_INSERT(key_list, &keys, kp);
DNPRINTF(SWM_D_KEY, "key_insert: leave\n");
}
+struct key *
+key_lookup(unsigned int mod, KeySym ks)
+{
+ struct key kp;
+
+ kp.keysym = ks;
+ kp.mod = mod;
+
+ return (RB_FIND(key_list, &keys, &kp));
+}
+
void
key_remove(struct key *kp)
{
DNPRINTF(SWM_D_KEY, "key_remove: %s\n", keyfuncs[kp->funcid].name);
- TAILQ_REMOVE(&keys, kp, entry);
+ RB_REMOVE(key_list, &keys, kp);
free(kp->spawn_name);
free(kp);
DNPRINTF(SWM_D_KEY, "setkeybinding: enter %s [%s]\n",
keyfuncs[kfid].name, spawn_name);
- TAILQ_FOREACH(kp, &keys, entry) {
- if (kp->mod == mod && kp->keysym == ks) {
- if (kfid == kf_invalid)
- key_remove(kp);
- else
- key_replace(kp, mod, ks, kfid, spawn_name);
- DNPRINTF(SWM_D_KEY, "setkeybinding: leave\n");
- return;
- }
+ if ((kp = key_lookup(mod, ks)) != NULL) {
+ if (kfid == kf_invalid)
+ key_remove(kp);
+ else
+ key_replace(kp, mod, ks, kfid, spawn_name);
+ DNPRINTF(SWM_D_KEY, "setkeybinding: leave\n");
+ return;
}
if (kfid == kf_invalid) {
warnx("error: setkeybinding: cannot find mod/key combination");
void
clear_keys(void)
{
- struct key *kp_loop, *kp_next;
+ struct key *kp;
- kp_loop = TAILQ_FIRST(&keys);
- while (kp_loop != NULL) {
- kp_next = TAILQ_NEXT(kp_loop, entry);
- key_remove(kp_loop);
- kp_loop = kp_next;
+ while (RB_EMPTY(&keys) == 0) {
+ kp = RB_ROOT(&keys);
+ key_remove(kp);
}
}
if (TAILQ_EMPTY(&screens[k].rl))
continue;
XUngrabKey(display, AnyKey, AnyModifier, screens[k].root);
- TAILQ_FOREACH(kp, &keys, entry) {
+ RB_FOREACH(kp, key_list, &keys) {
if ((code = XKeysymToKeycode(display, kp->keysym)))
for (j = 0; j < LENGTH(modifiers); j++)
XGrabKey(display, code,
DNPRINTF(SWM_D_PROP, "manage_window: set _SWM_WS: %s\n",
ws_idx_str);
XChangeProperty(display, win->id, ws_idx_atom, XA_STRING, 8,
- PropModeReplace, ws_idx_str, SWM_PROPLEN);
+ PropModeReplace, ws_idx_str, strlen((char *)ws_idx_str));
}
if (prop)
XFree(prop);
KeySym keysym;
XKeyEvent *ev = &e->xkey;
struct key *kp;
+ struct swm_region *r;
keysym = XKeycodeToKeysym(display, (KeyCode)ev->keycode, 0);
- TAILQ_FOREACH(kp, &keys, entry)
- if (keysym == kp->keysym
- && CLEANMASK(kp->mod) == CLEANMASK(ev->state)
- && keyfuncs[kp->funcid].func) {
- if (kp->funcid == kf_spawn_custom)
- spawn_custom(
- root_to_region(ev->root),
- &(keyfuncs[kp->funcid].args),
- kp->spawn_name
- );
- else
- keyfuncs[kp->funcid].func(
- root_to_region(ev->root),
- &(keyfuncs[kp->funcid].args)
- );
- }
+ if ((kp = key_lookup(CLEANMASK(ev->state), keysym)) == NULL)
+ return;
+ if (keyfuncs[kp->funcid].func == NULL)
+ return;
+
+ r = root_to_region(ev->root);
+ if (kp->funcid == kf_spawn_custom)
+ spawn_custom(r, &(keyfuncs[kp->funcid].args), kp->spawn_name);
+ else
+ keyfuncs[kp->funcid].func(r, &(keyfuncs[kp->funcid].args));
}
void