Introduction
Introduction Statistics Contact Development Disclaimer Help
Implemented key output option to stdout - svkbd - simple virtual keyboard
git clone git://git.suckless.org/svkbd
Log
Files
Refs
README
LICENSE
---
commit 174c86d8fa3be12802af5127aee0381b5aa3f83e
parent d06db9eb4fb8f1de5f5d144f5b8fb3bbf4cce84c
Author: Maarten van Gompel <[email protected]>
Date: Sat, 6 Mar 2021 21:40:40 +0100
Implemented key output option to stdout
Diffstat:
M svkbd.c | 62 +++++++++++++++++++++--------…
1 file changed, 42 insertions(+), 20 deletions(-)
---
diff --git a/svkbd.c b/svkbd.c
@@ -10,6 +10,7 @@
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
+#include <ctype.h>
#include <X11/keysym.h>
#include <X11/keysymdef.h>
@@ -171,7 +172,7 @@ motionnotify(XEvent *e)
if ((lostfocus != -1) && (gainedfocus != -1) && (lostfocus != gainedfo…
if (debug) printdbg("Clicking new key that gained focus\n");
- press(&keys[gainedfocus], keys[gainedfocus].keysym);
+ press(&keys[gainedfocus], 0);
}
}
@@ -440,7 +441,7 @@ press(Key *k, KeySym mod)
record_press_begin(k->keysym);
//}
} else {
- if (debug) printdbg("Simulating press: %ld\n", k->keys…
+ 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);
@@ -474,22 +475,43 @@ 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);
+ int shift = (mod == XK_Shift_L) || (mod == XK_Shift_R) || (mod == XK_S…
+ if (!shift) {
+ for (int i = 0; i < numkeys; i++) {
+ if ((keys[i].pressed) && ((keys[i].keysym == XK_Shift_…
+ shift = True;
+ break;
+ }
+ }
}
- if (l != 0) printf("%s",l);
+ if (debug) printdbg("Printing key %ld (shift=%d)\n", k->keysym, shift);
+ if (k->keysym == XK_Cancel) return;
+ KeySym * keysym = &(k->keysym);
+ XIM xim = XOpenIM(dpy, 0, 0, 0);
+ XIC xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNo…
+
+ XKeyPressedEvent event;
+ event.type = KeyPress;
+ event.display = dpy;
+ event.state = ShiftMask ? shift : 0;
+ event.keycode = XKeysymToKeycode(dpy, *keysym);
+ if (event.keycode == 0)
+ event.keycode = tmp_remap(*keysym);
+
+ char buffer[32];
+ KeySym ignore;
+ Status return_status;
+ Xutf8LookupString(xic, &event, buffer, 32, &ignore, &return_status);
+
+ XDestroyIC(xic);
+ XCloseIM(xim);
+ printf("%s", buffer);
}
void
simulate_keypress(KeySym keysym)
{
- if (!simulateoutput) return;
+ if (!simulateoutput) return;
KeyCode code = XKeysymToKeycode(dpy, keysym);
if (code == 0)
code = tmp_remap(keysym);
@@ -499,7 +521,7 @@ simulate_keypress(KeySym keysym)
void
simulate_keyrelease(KeySym keysym)
{
- if (!simulateoutput) return;
+ if (!simulateoutput) return;
KeyCode code = XKeysymToKeycode(dpy, keysym);
if (code == 0)
code = tmp_remap(keysym);
@@ -514,8 +536,8 @@ get_press_duration(void)
gettimeofday(&now, NULL);
return (double) ((now.tv_sec * 1000000L + now.tv_usec) -
- (pressbegin.tv_sec * 1000000L + pressbegin.tv_usec)) /
- (double) 1000000L;
+ (pressbegin.tv_sec * 1000000L + pressbegin.tv_usec)) /
+ (double) 1000000L;
}
void
@@ -654,11 +676,11 @@ run(void)
if (r == -1 || sigtermd) {
/* an error occurred or we received a signal */
/* E.g. Generally in scripts we want to call SIGTERM o…
- if the user is holding for example the enter k…
- the kill or script that does the kill), that c…
- since then X doesn't know the keyup is never c…
- process will be dead before finger lifts - in …
- just trigger out fake up presses for all keys …
+ if the user is holding for example the…
+ the kill or script that does the kill)…
+ since then X doesn't know the keyup is…
+ process will be dead before finger lif…
+ just trigger out fake up presses for a…
if (debug) printdbg("signal received, releasing all ke…
for (i = 0; i < numkeys; i++) {
XTestFakeKeyEvent(dpy, XKeysymToKeycode(dpy, k…
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.