Implementing a print output mode and ability to not simulate keypresses for X -… | |
git clone git://git.suckless.org/svkbd | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 3be1e21c9f7174f7cca2b8a099990a745f657a92 | |
parent e9208cb0888cbb694644905611f368ed5259923c | |
Author: Maarten van Gompel <[email protected]> | |
Date: Sat, 6 Mar 2021 15:07:55 +0100 | |
Implementing a print output mode and ability to not simulate keypresses for X | |
Diffstat: | |
M svkbd.c | 38 +++++++++++++++++++++++++++++… | |
1 file changed, 37 insertions(+), 1 deletion(-) | |
--- | |
diff --git a/svkbd.c b/svkbd.c | |
@@ -78,6 +78,7 @@ static void setlayer(); | |
static void togglelayer(); | |
static void unpress(Key *k, KeySym mod); | |
static void updatekeys(); | |
+static void printkey(Key *k, KeySym mod); | |
/* variables */ | |
static int screen; | |
@@ -106,6 +107,8 @@ static KeySym overlaykeysym = 0; /* keysym for which the ov… | |
static int releaseprotect = 0; /* set to 1 after overlay is shown, protecting … | |
static int tmp_keycode = 1; | |
static int rows = 0, ww = 0, wh = 0, wx = 0, wy = 0; | |
+static int simulateoutput = 1; /* simulate key presses for X */ | |
+static int printoutput = 0; /* print key pressed to stdout */ | |
static char *name = "svkbd"; | |
static int debug = 0; | |
static int numlayers = 0; | |
@@ -415,6 +418,7 @@ press(Key *k, KeySym mod) | |
simulate_keypress(mod); | |
} | |
simulate_keypress(k->keysym); | |
+ if (printoutput) printkey(k, mod); | |
for (i = 0; i < numkeys; i++) { | |
if (keys[i].pressed && IsModifierKey(keys[i].k… | |
@@ -436,8 +440,23 @@ tmp_remap(KeySym keysym) | |
} | |
void | |
+printkey(Key *k, KeySym mod) { | |
+ if (k->keysym == XK_Cancel) return; | |
+ const char *l = 0; | |
+ if ((mod == XK_Shift_L) || (mod == XK_Shift_R) || (mod == XK_Shift_Loc… | |
+ KeySym upper = 0; | |
+ XConvertCase(k->keysym, NULL, &upper); | |
+ l = XKeysymToString(upper); | |
+ } else { | |
+ l = XKeysymToString(k->keysym); | |
+ } | |
+ if (l != 0) printf("%s",l); | |
+} | |
+ | |
+void | |
simulate_keypress(KeySym keysym) | |
{ | |
+ if (!simulateoutput) return; | |
KeyCode code = XKeysymToKeycode(dpy, keysym); | |
if (code == 0) | |
code = tmp_remap(keysym); | |
@@ -447,6 +466,7 @@ simulate_keypress(KeySym keysym) | |
void | |
simulate_keyrelease(KeySym keysym) | |
{ | |
+ if (!simulateoutput) return; | |
KeyCode code = XKeysymToKeycode(dpy, keysym); | |
if (code == 0) | |
code = tmp_remap(keysym); | |
@@ -502,6 +522,7 @@ unpress(Key *k, KeySym mod) | |
simulate_keypress(mod); | |
} | |
simulate_keypress(k->keysym); | |
+ if (printoutput) printkey(k, mod); | |
pressbegin.tv_sec = 0; | |
pressbegin.tv_usec = 0; | |
} | |
@@ -778,11 +799,14 @@ updatekeys(void) | |
void | |
usage(char *argv0) | |
{ | |
- fprintf(stderr, "usage: %s [-hdvDO] [-g geometry] [-fn font] [-l layer… | |
+ fprintf(stderr, "usage: %s [-hdnovDOR] [-g geometry] [-fn font] [-l la… | |
fprintf(stderr, "Options:\n"); | |
fprintf(stderr, " -d - Set Dock Window Type\n"); | |
fprintf(stderr, " -D - Enable debug\n"); | |
fprintf(stderr, " -O - Disable overlays\n"); | |
+ fprintf(stderr, " -R - Disable press-on-release\n"); | |
+ fprintf(stderr, " -n - Do not simulate key presses for X\n"); | |
+ fprintf(stderr, " -o - Print to standard output\n"); | |
fprintf(stderr, " -l - Comma separated list of layers to enab… | |
fprintf(stderr, " -s - Layer to select on program start\n"); | |
fprintf(stderr, " -H [int] - Height fraction, one key row takes 1/x… | |
@@ -956,6 +980,9 @@ main(int argc, char *argv[]) | |
if ((tmp = getenv("SVKBD_HEIGHTFACTOR"))) | |
heightfactor = atoi(tmp); | |
+ if ((tmp = getenv("SVKBD_PRESSONRELEASE"))) /* defaults to 1 */ | |
+ pressonrelease = atoi(tmp); | |
+ | |
/* parse command line arguments */ | |
for (i = 1; argv[i]; i++) { | |
if (!strcmp(argv[i], "-v")) { | |
@@ -989,6 +1016,12 @@ main(int argc, char *argv[]) | |
usage(argv[0]); | |
} else if (!strcmp(argv[i], "-O")) { | |
enableoverlays = 0; | |
+ } else if (!strcmp(argv[i], "-o")) { | |
+ printoutput = 1; | |
+ } else if (!strcmp(argv[i], "-n")) { | |
+ simulateoutput = 0; | |
+ } else if (!strcmp(argv[i], "-R")) { | |
+ pressonrelease = 0; | |
} else if (!strcmp(argv[i], "-l")) { | |
if (i >= argc - 1) | |
continue; | |
@@ -1009,6 +1042,9 @@ main(int argc, char *argv[]) | |
} | |
} | |
+ if (printoutput) | |
+ setbuf(stdout, NULL); //unbuffered output | |
+ | |
if (heightfactor <= 0) | |
die("height factor must be a positive integer"); | |