patched keychord, bye bye keychain :(
This commit is contained in:
parent
cfb8627a80
commit
8ff05305b4
70
dwm.c
70
dwm.c
@ -101,9 +101,14 @@ struct Client {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
unsigned int mod;
|
unsigned int mod;
|
||||||
KeySym keysym;
|
KeySym keysym;
|
||||||
|
} Key;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned int n;
|
||||||
|
const Key keys[5];
|
||||||
void (*func)(const Arg *);
|
void (*func)(const Arg *);
|
||||||
const Arg arg;
|
const Arg arg;
|
||||||
} Key;
|
} Keychord;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char *symbol;
|
const char *symbol;
|
||||||
@ -266,6 +271,7 @@ static Display *dpy;
|
|||||||
static Drw *drw;
|
static Drw *drw;
|
||||||
static Monitor *mons, *selmon;
|
static Monitor *mons, *selmon;
|
||||||
static Window root, wmcheckwin;
|
static Window root, wmcheckwin;
|
||||||
|
unsigned int currentkey = 0;
|
||||||
|
|
||||||
/* configuration, allows nested code to access above variables */
|
/* configuration, allows nested code to access above variables */
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
@ -953,7 +959,8 @@ grabkeys(void)
|
|||||||
{
|
{
|
||||||
updatenumlockmask();
|
updatenumlockmask();
|
||||||
{
|
{
|
||||||
unsigned int i, j, k;
|
/* unsigned int i, j, k; */
|
||||||
|
unsigned int i, c, k;
|
||||||
unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
|
unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
|
||||||
int start, end, skip;
|
int start, end, skip;
|
||||||
KeySym *syms;
|
KeySym *syms;
|
||||||
@ -963,15 +970,18 @@ grabkeys(void)
|
|||||||
syms = XGetKeyboardMapping(dpy, start, end - start + 1, &skip);
|
syms = XGetKeyboardMapping(dpy, start, end - start + 1, &skip);
|
||||||
if (!syms)
|
if (!syms)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (k = start; k <= end; k++)
|
for (k = start; k <= end; k++)
|
||||||
for (i = 0; i < LENGTH(keys); i++)
|
for (i = 0; i < LENGTH(keychords); i++)
|
||||||
/* skip modifier codes, we do that ourselves */
|
/* skip modifier codes, we do that ourselves */
|
||||||
if (keys[i].keysym == syms[(k - start) * skip])
|
if (keychords[i]->keys[currentkey].keysym == syms[(k - start) * skip])
|
||||||
for (j = 0; j < LENGTH(modifiers); j++)
|
for (c = 0; c < LENGTH(modifiers); c++)
|
||||||
XGrabKey(dpy, k,
|
XGrabKey(dpy, k,
|
||||||
keys[i].mod | modifiers[j],
|
keychords[i]->keys[currentkey].mod | modifiers[c],
|
||||||
root, True,
|
root, True,
|
||||||
GrabModeAsync, GrabModeAsync);
|
GrabModeAsync, GrabModeAsync);
|
||||||
|
if(currentkey > 0)
|
||||||
|
XGrabKey(dpy, XKeysymToKeycode(dpy, XK_Escape), AnyModifier, root, True, GrabModeAsync, GrabModeAsync);
|
||||||
XFree(syms);
|
XFree(syms);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -998,17 +1008,51 @@ isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info)
|
|||||||
void
|
void
|
||||||
keypress(XEvent *e)
|
keypress(XEvent *e)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
/* unsigned int i; */
|
||||||
|
XEvent event = *e;
|
||||||
|
unsigned int ran = 0;
|
||||||
KeySym keysym;
|
KeySym keysym;
|
||||||
XKeyEvent *ev;
|
XKeyEvent *ev;
|
||||||
|
|
||||||
ev = &e->xkey;
|
Keychord *arr1[sizeof(keychords) / sizeof(Keychord*)];
|
||||||
|
Keychord *arr2[sizeof(keychords) / sizeof(Keychord*)];
|
||||||
|
memcpy(arr1, keychords, sizeof(keychords));
|
||||||
|
Keychord **rpointer = arr1;
|
||||||
|
Keychord **wpointer = arr2;
|
||||||
|
|
||||||
|
size_t r = sizeof(keychords)/ sizeof(Keychord*);
|
||||||
|
|
||||||
|
while(1){
|
||||||
|
ev = &event.xkey;
|
||||||
keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
|
keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
|
||||||
for (i = 0; i < LENGTH(keys); i++)
|
size_t w = 0;
|
||||||
if (keysym == keys[i].keysym
|
for (int i = 0; i < r; i++){
|
||||||
&& CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)
|
if(keysym == (*(rpointer + i))->keys[currentkey].keysym
|
||||||
&& keys[i].func)
|
&& CLEANMASK((*(rpointer + i))->keys[currentkey].mod) == CLEANMASK(ev->state)
|
||||||
keys[i].func(&(keys[i].arg));
|
&& (*(rpointer + i))->func){
|
||||||
|
if((*(rpointer + i))->n == currentkey +1){
|
||||||
|
(*(rpointer + i))->func(&((*(rpointer + i))->arg));
|
||||||
|
ran = 1;
|
||||||
|
}else{
|
||||||
|
*(wpointer + w) = *(rpointer + i);
|
||||||
|
w++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
currentkey++;
|
||||||
|
if(w == 0 || ran == 1)
|
||||||
|
break;
|
||||||
|
grabkeys();
|
||||||
|
while (running && !XNextEvent(dpy, &event) && !ran)
|
||||||
|
if(event.type == KeyPress)
|
||||||
|
break;
|
||||||
|
r = w;
|
||||||
|
Keychord **holder = rpointer;
|
||||||
|
rpointer = wpointer;
|
||||||
|
wpointer = holder;
|
||||||
|
}
|
||||||
|
currentkey = 0;
|
||||||
|
grabkeys();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user