static void run(void);
static void scan(void);
static Bool sendevent(Client *c, Atom proto);
-static void send_keycode(KeyCode key, unsigned int state);
static void sendmon(Client *c, Monitor *m);
static void setclientstate(Client *c, long state);
static void setfocus(Client *c);
static void zoom(const Arg *arg);
/* variables */
-typedef struct {
- KeyCode keycode;
- unsigned int state;
-} BufferedKey;
-static BufferedKey key_buffer[200];
-static int key_buffer_len = 0;
static Bool key_buffering = False;
static const char broken[] = "broken";
static char stext[256];
grabkeys(void) {
updatenumlockmask();
//XUngrabKey(dpy, AnyKey, AnyModifier, root);
- XGrabKey(dpy, AnyKey, AnyModifier, root, True, GrabModeAsync, GrabModeAsync);
+ {
+ unsigned int i, j;
+ unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
+ KeyCode code;
+
+ XUngrabKey(dpy, AnyKey, AnyModifier, root);
+ for(i = 0; i < LENGTH(keys); i++)
+ if((code = XKeysymToKeycode(dpy, keys[i].keysym)))
+ for(j = 0; j < LENGTH(modifiers); j++)
+ XGrabKey(dpy, code, keys[i].mod | modifiers[j], root,
+ True, GrabModeAsync,
+ keys[i].func == kbspawn ? GrabModeSync : GrabModeAsync);
+ }
}
void
#endif /* XINERAMA */
void
-send_keycode(KeyCode key, unsigned int state) {
- XKeyEvent event;
- if(!selmon->sel) {
- return;
- }
- event.display = dpy;
- event.root = root;
- event.window = selmon->sel->win;
- event.subwindow = None;
- event.same_screen = True;
- event.x = 1;
- event.y = 1;
- event.x_root = 1;
- event.y_root = 1;
- event.time = CurrentTime;
- event.state = state; // modifiers
- event.keycode = key;
- event.type = KeyPress;
- XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
- event.type = KeyRelease;
- XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);
-}
-
-void
keypress(XEvent *e) {
unsigned int i;
KeySym keysym;
XKeyEvent *ev;
- Bool called = False;
ev = &e->xkey;
keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
- for(i = 0; i < LENGTH(keys); i++)
+ for(i = 0; i < LENGTH(keys); i++) {
if(keysym == keys[i].keysym
&& CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)
&& keys[i].func) {
keys[i].func(&(keys[i].arg));
- called = True;
- }
- if(!called) {
- if(key_buffering) {
- if(key_buffer_len == LENGTH(key_buffer)) {
- // buffer full, bail
- key_buffer_len = 0;
- key_buffering = False;
- } else {
- key_buffer[key_buffer_len].keycode = (KeyCode)ev->keycode;
- key_buffer[key_buffer_len].state = (KeyCode)ev->state;
- key_buffer_len += 1;
- }
- } else {
- send_keycode(ev->keycode, ev->state);
}
}
}
Client *c, *t = NULL;
Window trans = None;
XWindowChanges wc;
- int i;
if(!(c = calloc(1, sizeof(Client))))
die("fatal: could not malloc() %u bytes\n", sizeof(Client));
XMapWindow(dpy, c->win);
focus(c);
if(key_buffering) {
- if(key_buffer_len > 0) {
- for(i = 0; i < key_buffer_len; ++i) {
- send_keycode(key_buffer[i].keycode, key_buffer[i].state);
- }
- }
- key_buffer_len = 0;
key_buffering = False;
+ XAllowEvents(dpy, AsyncKeyboard, CurrentTime);
}
}
void
mappingnotify(XEvent *e) {
XMappingEvent *ev = &e->xmapping;
+ // fprintf(stderr, "MapNotify\n");
XRefreshKeyboardMapping(ev);
if(ev->request == MappingKeyboard)
static XWindowAttributes wa;
XMapRequestEvent *ev = &e->xmaprequest;
+ // fprintf(stderr, "MapRequest\n");
if(!XGetWindowAttributes(dpy, ev->window, &wa))
return;
if(wa.override_redirect) {
- key_buffer_len = 0;
- key_buffering = False;
return;
}
if(!wintoclient(ev->window))
XEvent ev;
/* main event loop */
XSync(dpy, False);
- while(running && !XNextEvent(dpy, &ev))
- if(handler[ev.type])
+ while(running && !XNextEvent(dpy, &ev)) {
+ if(handler[ev.type]) {
+ // fprintf(stderr, "handling event type %i\n", ev.type);
handler[ev.type](&ev); /* call handler */
+ } else {
+ // fprintf(stderr, "evt type %i\n", ev.type);
+ }
+ }
}
void
void
kbspawn(const Arg *arg) {
key_buffering = True;
- key_buffer_len = 0;
spawn(arg);
}
void
spawn(const Arg *arg) {
int tag = 0, i;
- if(arg->v == termcmd) {
+ if(arg->v == termcmd || arg->v == runcmd) {
for(i = 0; i < 32; ++i) {
if(selmon->tagset[selmon->seltags] & (1 << i)) {
tag = i;
}
}
WORKSPACE_NUMBER[17] = workspace_numbers_str[tag][0];
- WORKSPACE_NUMBER[18] = workspace_numbers_str[tag][1];
+ WORKSPACE_NUMBER[18] = workspace_numbers_str[tag][1]; // 2nd digit or null
}
if(arg->v == dmenucmd)
dmenumon[0] = '0' + selmon->num;
#define TAB_HEIGHT 19
#define TAB_PAD 7
+#define GUTTER_PX 8
void
jason_layout(Monitor *m) {
} else {
mw = m->ww;
}
- right_width = m->ww - mw;
+ right_width = m->ww - mw - GUTTER_PX;
tab_count = &(tab_counts[0]);
tab_top = m->wy - (m->wh - (2 * (TAB_HEIGHT + TAB_PAD))) + TAB_HEIGHT;
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
resize(c, m->wx, m->wy, mw, m->wh, False, 0);
} else {
if (c == vis_slave) {
- resize(c, m->wx + mw, m->wy + TAB_HEIGHT + TAB_PAD, right_width, m->wh - 2 * (TAB_HEIGHT + TAB_PAD), False, base);
+ resize(c, m->wx + mw + GUTTER_PX, m->wy + TAB_HEIGHT + TAB_PAD, right_width, m->wh - 2 * (TAB_HEIGHT + TAB_PAD), False, base);
tab_count = &(tab_counts[1]);
tab_top = m->wy + m->wh - TAB_HEIGHT;
cur_tab = 0;
} else {
// this function does not get called when focus changes
// resize(c, m->wx + m->ww, m->wy, m->ww - mw, m->wh, False);
- resize(c, m->wx + mw + right_width * cur_tab / (*tab_count), tab_top, right_width, m->wh - 2 * (TAB_HEIGHT + TAB_PAD), False, base);
+ resize(c, m->wx + mw + GUTTER_PX + right_width * cur_tab / (*tab_count), tab_top, right_width, m->wh - 2 * (TAB_HEIGHT + TAB_PAD), False, base);
cur_tab += 1;
}
}