cleanup and reworking some of the logic - svkbd - simple virtual keyboard | |
git clone git://git.suckless.org/svkbd | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 444ceabde3307690d6ad3699069260acd12991ce | |
parent a43bf5c4c159a07f3350eeca8b0119e661359cf6 | |
Author: Maarten van Gompel <[email protected]> | |
Date: Mon, 15 Mar 2021 11:43:48 +0100 | |
cleanup and reworking some of the logic | |
Diffstat: | |
M svkbd.c | 216 +++++++++++++++--------------… | |
1 file changed, 107 insertions(+), 109 deletions(-) | |
--- | |
diff --git a/svkbd.c b/svkbd.c | |
@@ -101,7 +101,6 @@ static Drw *drw; | |
static Window root, win; | |
static Clr* scheme[SchemeLast]; | |
static Bool running = True, isdock = False; | |
-static KeySym pressedmod = 0; | |
static struct timeval pressbegin; | |
static int currentlayer = 0; | |
static int enableoverlays = 1; | |
@@ -152,24 +151,24 @@ motionnotify(XEvent *e) | |
if (keys[i].highlighted != True) { | |
if (ispressing) { | |
gainedfocus = i; | |
- keys[i].pressed = True; | |
} else { | |
keys[i].highlighted = True; | |
} | |
drawkey(&keys[i]); | |
} | |
continue; | |
+ } else if (keys[i].highlighted == True) { | |
+ keys[i].highlighted = False; | |
+ drawkey(&keys[i]); | |
} | |
+ } | |
- if (!IsModifierKey(keys[i].keysym) && keys[i].pressed == True)… | |
+ for (i = 0; i < numkeys; i++) { | |
+ if (!IsModifierKey(keys[i].keysym) && keys[i].pressed == True … | |
if (debug) printdbg("Pressed key lost focus: %ld\n", k… | |
lostfocus = i; | |
ispressingkeysym = 0; | |
- unpress(&keys[i], 0); | |
- drawkey(&keys[i]); | |
- } | |
- if (keys[i].highlighted == True) { | |
- keys[i].highlighted = False; | |
+ keys[i].pressed = 0; | |
drawkey(&keys[i]); | |
} | |
} | |
@@ -177,6 +176,7 @@ motionnotify(XEvent *e) | |
if ((lostfocus != -1) && (gainedfocus != -1) && (lostfocus != gainedfo… | |
if (debug) printdbg("Clicking new key that gained focus\n"); | |
press(&keys[gainedfocus], 0); | |
+ keys[gainedfocus].pressed = True; | |
keys[gainedfocus].highlighted = True; | |
} | |
@@ -426,7 +426,7 @@ record_press_begin(KeySym ks) | |
} | |
void | |
-press(Key *k, KeySym mod) | |
+press(Key *k, KeySym buttonmod) | |
{ | |
int i; | |
int overlayidx = -1; | |
@@ -442,23 +442,20 @@ press(Key *k, KeySym mod) | |
if (enableoverlays && currentoverlay == -1) | |
overlayidx = hasoverlay(k->keysym); | |
if ((pressonrelease) || (enableoverlays && overlayidx != -1)) { | |
- //if (!pressbegin.tv_sec && !pressbegin.tv_usec) { | |
- /*record the begin of the press, don't simulat… | |
- record_press_begin(k->keysym); | |
- //} | |
+ /*record the begin of the press, don't simulate the ac… | |
+ record_press_begin(k->keysym); | |
} else { | |
- if (debug) printdbg("Simulating press: %ld (mod %ld)\n… | |
+ if (debug) printdbg("Simulating press: %ld (mod %ld)\n… | |
for (i = 0; i < numkeys; i++) { | |
if (keys[i].pressed && IsModifierKey(keys[i].k… | |
simulate_keypress(keys[i].keysym); | |
} | |
} | |
- pressedmod = mod; | |
- if (pressedmod) { | |
- simulate_keypress(mod); | |
+ if (buttonmod) { | |
+ simulate_keypress(buttonmod); | |
} | |
simulate_keypress(k->keysym); | |
- if (printoutput) printkey(k, mod); | |
+ if (printoutput) printkey(k, buttonmod); | |
for (i = 0; i < numkeys; i++) { | |
if (keys[i].pressed && IsModifierKey(keys[i].k… | |
@@ -549,7 +546,7 @@ get_press_duration(void) | |
} | |
void | |
-unpress(Key *k, KeySym mod) | |
+unpress(Key *k, KeySym buttonmod) | |
{ | |
int i; | |
@@ -573,19 +570,19 @@ unpress(Key *k, KeySym mod) | |
} | |
if ((pressbegin.tv_sec || pressbegin.tv_usec) && (enableoverlays || pr… | |
- if (debug) printdbg("Delayed simulation of pre… | |
- /* simulate the press event, as we postponed i… | |
- for (i = 0; i < numkeys; i++) { | |
- if (keys[i].pressed && IsModifierKey(k… | |
- simulate_keypress(keys[i].keys… | |
- } | |
- } | |
- if (mod) { | |
- simulate_keypress(mod); | |
- } | |
- simulate_keypress(k->keysym); | |
- pressbegin.tv_sec = 0; | |
- pressbegin.tv_usec = 0; | |
+ if (debug) printdbg("Delayed simulation of press after release… | |
+ /* simulate the press event, as we postponed it earlier in pre… | |
+ for (i = 0; i < numkeys; i++) { | |
+ if (keys[i].pressed && IsModifierKey(keys[i].keysym)) { | |
+ simulate_keypress(keys[i].keysym); | |
+ } | |
+ } | |
+ if (buttonmod) { | |
+ simulate_keypress(buttonmod); | |
+ } | |
+ simulate_keypress(k->keysym); | |
+ pressbegin.tv_sec = 0; | |
+ pressbegin.tv_usec = 0; | |
} | |
if (debug) { | |
@@ -600,18 +597,19 @@ unpress(Key *k, KeySym mod) | |
for (i = 0; i < numkeys; i++) { | |
if (keys[i].pressed && !IsModifierKey(keys[i].keysym)) { | |
simulate_keyrelease(keys[i].keysym); | |
- if ((printoutput) && (ispressingkeysym == keys[i].keys… | |
+ if (printoutput) printkey(&keys[i], buttonmod); | |
keys[i].pressed = 0; | |
drawkey(&keys[i]); | |
} | |
} | |
- if (i != numkeys) { | |
- if (mod) { | |
- simulate_keyrelease(mod); | |
- } | |
+ if (buttonmod) { | |
+ simulate_keyrelease(buttonmod); | |
+ } | |
+ | |
+ if ((k == NULL) || (!IsModifierKey(k->keysym))) { | |
for (i = 0; i < numkeys; i++) { | |
- if (keys[i].pressed) { | |
+ if (keys[i].pressed && IsModifierKey(keys[i].keysym)) { | |
simulate_keyrelease(keys[i].keysym); | |
keys[i].pressed = 0; | |
drawkey(&keys[i]); | |
@@ -697,70 +695,70 @@ run(void) | |
void | |
readxresources(void) { | |
- XrmInitialize(); | |
- | |
- char* xrm; | |
- if ((xrm = XResourceManagerString(drw->dpy))) { | |
- char *type; | |
- XrmDatabase xdb = XrmGetStringDatabase(xrm); | |
- XrmValue xval; | |
- | |
- if (XrmGetResource(xdb, "svkbd.font", "*", &type, &xval) && !f… | |
- fonts[0] = strdup(xval.addr); | |
- | |
- if (XrmGetResource(xdb, "svkbd.background", "*", &type, &xval)… | |
- colors[SchemeNorm][ColBg] = strdup(xval.addr); | |
- if (XrmGetResource(xdb, "svkbd.foreground", "*", &type, &xval)… | |
- colors[SchemeNorm][ColFg] = strdup(xval.addr); | |
- | |
- if (XrmGetResource(xdb, "svkbd.shiftforeground", "*", &type, &… | |
- colors[SchemeNormShift][ColFg] = strdup(xval.addr); | |
- if (XrmGetResource(xdb, "svkbd.shiftbackground", "*", &type, &… | |
- colors[SchemeNormShift][ColBg] = strdup(xval.addr); | |
- | |
- if (XrmGetResource(xdb, "svkbd.ABCforeground", "*", &type, &xv… | |
- colors[SchemeNormABC][ColFg] = strdup(xval.addr); | |
- if (XrmGetResource(xdb, "svkbd.ABCbackground", "*", &type, &xv… | |
- colors[SchemeNormABC][ColBg] = strdup(xval.addr); | |
- | |
- if (XrmGetResource(xdb, "svkbd.ABCshiftforeground", "*", &type… | |
- colors[SchemeNormShift][ColFg] = strdup(xval.addr); | |
- if (XrmGetResource(xdb, "svkbd.ABCshiftbackground", "*", &type… | |
- colors[SchemeNormShift][ColBg] = strdup(xval.addr); | |
- | |
- if (XrmGetResource(xdb, "svkbd.pressbackground", "*", &type, &… | |
- colors[SchemePress][ColBg] = strdup(xval.addr); | |
- if (XrmGetResource(xdb, "svkbd.pressforeground", "*", &type, &… | |
- colors[SchemePress][ColFg] = strdup(xval.addr); | |
- | |
- if (XrmGetResource(xdb, "svkbd.pressshiftbackground", "*", &ty… | |
- colors[SchemePressShift][ColBg] = strdup(xval.addr); | |
- if (XrmGetResource(xdb, "svkbd.pressshiftforeground", "*", &ty… | |
- colors[SchemePressShift][ColFg] = strdup(xval.addr); | |
- | |
- if (XrmGetResource(xdb, "svkbd.highlightbackground", "*", &typ… | |
- colors[SchemeHighlight][ColBg] = strdup(xval.addr); | |
- if (XrmGetResource(xdb, "svkbd.highlightforeground", "*", &typ… | |
- colors[SchemeHighlight][ColFg] = strdup(xval.addr); | |
- | |
- if (XrmGetResource(xdb, "svkbd.highlightshiftbackground", "*",… | |
- colors[SchemeHighlightShift][ColBg] = strdup(xval.addr… | |
- if (XrmGetResource(xdb, "svkbd.highlightshiftforeground", "*",… | |
- colors[SchemeHighlightShift][ColFg] = strdup(xval.addr… | |
- | |
- if (XrmGetResource(xdb, "svkbd.overlaybackground", "*", &type,… | |
- colors[SchemeOverlay][ColBg] = strdup(xval.addr); | |
- if (XrmGetResource(xdb, "svkbd.overlayforeground", "*", &type,… | |
- colors[SchemeOverlay][ColFg] = strdup(xval.addr); | |
- | |
- if (XrmGetResource(xdb, "svkbd.overlayshiftbackground", "*", &… | |
- colors[SchemeOverlayShift][ColBg] = strdup(xval.addr); | |
- if (XrmGetResource(xdb, "svkbd.overlayshiftforeground", "*", &… | |
- colors[SchemeOverlayShift][ColFg] = strdup(xval.addr); | |
- | |
- | |
- XrmDestroyDatabase(xdb); | |
- } | |
+ XrmInitialize(); | |
+ | |
+ char* xrm; | |
+ if ((xrm = XResourceManagerString(drw->dpy))) { | |
+ char *type; | |
+ XrmDatabase xdb = XrmGetStringDatabase(xrm); | |
+ XrmValue xval; | |
+ | |
+ if (XrmGetResource(xdb, "svkbd.font", "*", &type, &xval) && !f… | |
+ fonts[0] = strdup(xval.addr); | |
+ | |
+ if (XrmGetResource(xdb, "svkbd.background", "*", &type, &xval)… | |
+ colors[SchemeNorm][ColBg] = strdup(xval.addr); | |
+ if (XrmGetResource(xdb, "svkbd.foreground", "*", &type, &xval)… | |
+ colors[SchemeNorm][ColFg] = strdup(xval.addr); | |
+ | |
+ if (XrmGetResource(xdb, "svkbd.shiftforeground", "*", &type, &… | |
+ colors[SchemeNormShift][ColFg] = strdup(xval.a… | |
+ if (XrmGetResource(xdb, "svkbd.shiftbackground", "*", &type, &… | |
+ colors[SchemeNormShift][ColBg] = strdup(xval.a… | |
+ | |
+ if (XrmGetResource(xdb, "svkbd.ABCforeground", "*", &type, &xv… | |
+ colors[SchemeNormABC][ColFg] = strdup(xval.add… | |
+ if (XrmGetResource(xdb, "svkbd.ABCbackground", "*", &type, &xv… | |
+ colors[SchemeNormABC][ColBg] = strdup(xval.add… | |
+ | |
+ if (XrmGetResource(xdb, "svkbd.ABCshiftforeground", "*", &type… | |
+ colors[SchemeNormShift][ColFg] = strdup(xval.a… | |
+ if (XrmGetResource(xdb, "svkbd.ABCshiftbackground", "*", &type… | |
+ colors[SchemeNormShift][ColBg] = strdup(xval.a… | |
+ | |
+ if (XrmGetResource(xdb, "svkbd.pressbackground", "*", &type, &… | |
+ colors[SchemePress][ColBg] = strdup(xval.addr); | |
+ if (XrmGetResource(xdb, "svkbd.pressforeground", "*", &type, &… | |
+ colors[SchemePress][ColFg] = strdup(xval.addr); | |
+ | |
+ if (XrmGetResource(xdb, "svkbd.pressshiftbackground", "*", &ty… | |
+ colors[SchemePressShift][ColBg] = strdup(xval.… | |
+ if (XrmGetResource(xdb, "svkbd.pressshiftforeground", "*", &ty… | |
+ colors[SchemePressShift][ColFg] = strdup(xval.… | |
+ | |
+ if (XrmGetResource(xdb, "svkbd.highlightbackground", "*", &typ… | |
+ colors[SchemeHighlight][ColBg] = strdup(xval.a… | |
+ if (XrmGetResource(xdb, "svkbd.highlightforeground", "*", &typ… | |
+ colors[SchemeHighlight][ColFg] = strdup(xval.a… | |
+ | |
+ if (XrmGetResource(xdb, "svkbd.highlightshiftbackground", "*",… | |
+ colors[SchemeHighlightShift][ColBg] = strdup(x… | |
+ if (XrmGetResource(xdb, "svkbd.highlightshiftforeground", "*",… | |
+ colors[SchemeHighlightShift][ColFg] = strdup(x… | |
+ | |
+ if (XrmGetResource(xdb, "svkbd.overlaybackground", "*", &type,… | |
+ colors[SchemeOverlay][ColBg] = strdup(xval.add… | |
+ if (XrmGetResource(xdb, "svkbd.overlayforeground", "*", &type,… | |
+ colors[SchemeOverlay][ColFg] = strdup(xval.add… | |
+ | |
+ if (XrmGetResource(xdb, "svkbd.overlayshiftbackground", "*", &… | |
+ colors[SchemeOverlayShift][ColBg] = strdup(xva… | |
+ if (XrmGetResource(xdb, "svkbd.overlayshiftforeground", "*", &… | |
+ colors[SchemeOverlayShift][ColFg] = strdup(xva… | |
+ | |
+ | |
+ XrmDestroyDatabase(xdb); | |
+ } | |
} | |
@@ -798,17 +796,17 @@ setup(void) | |
readxresources(); | |
- /* Apply defaults to font and colors*/ | |
- if ( !fonts[0] ) | |
- fonts[0] = strdup(defaultfonts[0]); | |
- for (i = 0; i < SchemeLast; ++i){ | |
+ /* Apply defaults to font and colors*/ | |
+ if ( !fonts[0] ) | |
+ fonts[0] = strdup(defaultfonts[0]); | |
+ for (i = 0; i < SchemeLast; ++i){ | |
for (j = 0; j < 2; ++j){ | |
if ( !colors[i][j] ) | |
colors[i][j] = strdup(defaultcolors[i][j]); | |
} | |
- } | |
+ } | |
- if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) | |
+ if (!drw_fontset_create(drw, (const char **) fonts, LENGTH(fonts))) | |
die("no fonts could be loaded"); | |
free(fonts[0]); | |
@@ -842,7 +840,7 @@ setup(void) | |
/* init appearance */ | |
for (j = 0; j < SchemeLast; j++) | |
- scheme[j] = drw_scm_create(drw, colors[j], 2); | |
+ scheme[j] = drw_scm_create(drw, (const char **) colors[j], 2); | |
for (j = 0; j < SchemeLast; ++j) { | |
free(colors[j][ColFg]); |