From df751680c32b52138f207985a34f90adc934bfb9 Mon Sep 17 00:00:00 2001 From: Yann Ramin Date: Tue, 2 Oct 2007 20:38:22 -0700 Subject: [PATCH] Softwedge alpha 1.0 version - basic functionality, forking, etc, but it works Signed-off-by: Yann Ramin --- softwedge.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++---------- softwedge.h | 3 ++ 2 files changed, 101 insertions(+), 18 deletions(-) create mode 100644 softwedge.h diff --git a/softwedge.c b/softwedge.c index 403ac11..5be20ba 100644 --- a/softwedge.c +++ b/softwedge.c @@ -7,11 +7,19 @@ #include #include #include +#include +#include +#include +#include "softwedge.h" + +int serialPort; + void xtest_key_press(Display *dpy, unsigned char letter) { unsigned int shiftcode = XKeysymToKeycode(dpy, XStringToKeysym("Shift_L")); int upper = 0; + int skip_lookup = 0; char s[2]; s[0] = letter; s[1] = 0; @@ -25,26 +33,41 @@ void xtest_key_press(Display *dpy, unsigned char letter) { } + if (sym == '\n') { + sym = XK_Return; + skip_lookup = 1; - keycode = XKeysymToKeycode(dpy, sym); - - - KeySym *syms; - int keysyms_per_keycode; - syms = XGetKeyboardMapping(dpy, keycode, 1, &keysyms_per_keycode); - int i = 0; - for (i = 0; i <= keysyms_per_keycode; i++) { - if (syms[i] == 0) - break; + } else if (sym == '\t') { + sym = XK_Tab; + skip_lookup = 1; + } - if (i == 0 && syms[i] != letter) - upper = 1; - + keycode = XKeysymToKeycode(dpy, sym); + if (keycode == 0) { + sym = 0xff00 | letter; + keycode = XKeysymToKeycode(dpy, sym); } - - + if (!skip_lookup) { + // Here we try to determine if a keysym + // needs a modifier key (shift), such as a + // shifted letter or symbol. + // The second keysym should be the shifted char + KeySym *syms; + int keysyms_per_keycode; + syms = XGetKeyboardMapping(dpy, keycode, 1, &keysyms_per_keycode); + int i = 0; + for (i = 0; i <= keysyms_per_keycode; i++) { + if (syms[i] == 0) + break; + + if (i == 0 && syms[i] != letter) + upper = 1; + + + } + } if (upper) XTestFakeKeyEvent(dpy, shiftcode, True, 0); @@ -57,7 +80,7 @@ void xtest_key_press(Display *dpy, unsigned char letter) { XTestFakeKeyEvent(dpy, shiftcode, False, 0); - XFlush(dpy); + } void press_keys(Display *dpy, char* string) { @@ -66,14 +89,58 @@ void press_keys(Display *dpy, char* string) { for (i = 0; i < len; i++) { xtest_key_press(dpy, string[i]); } + XFlush(dpy); } + +int sw_open_serial(const char *port) { + serialPort = open(port, O_RDONLY); + if (serialPort < 0) { + fprintf(stderr, "Can't open serial port: %s\n", port); + exit(-1); + } + + return 0; +} + + int main(int argc, char**argv) { Display *dpy; /* X server connection */ int xtest_major_version = 0; int xtest_minor_version = 0; int dummy; + int c; + char *sport = NULL; + + while ((c = getopt (argc, argv, "vc:")) != -1) + switch (c) + { + case 'v': + fprintf(stderr, "softwedge v %s: The serial softwedge X11 helper. ", SOFTWEDGE_VERSION); + fprintf(stderr, "(c) 2007 Yann Ramin \n(Exiting...)\n"); + exit(0); + case 'c': + sport = optarg; + break; + case '?': + if (optopt == 'c') + fprintf (stderr, "Option -%c requires an argument.\n", optopt); + else if (isprint (optopt)) + fprintf (stderr, "Unknown option `-%c'.\n", optopt); + else + fprintf (stderr, + "Unknown option character `\\x%x'.\n", + optopt); + return 1; + default: + abort (); + } + + if (sport == NULL) + sport = DEFAULT_SERIAL; + + /* * Open the display using the $DISPLAY environment variable to locate @@ -93,7 +160,10 @@ int main(int argc, char**argv) exit(1); } - char s[] = "Hello world!"; + + sw_open_serial(sport); + + if(fork()) { @@ -105,9 +175,19 @@ int main(int argc, char**argv) close(2); - press_keys(dpy, s); + char readbuf[2]; + readbuf[1] = 0; + + while(read(serialPort, readbuf, 1) > 0) { + + press_keys(dpy, readbuf); + + } + + return 0; } + diff --git a/softwedge.h b/softwedge.h new file mode 100644 index 0000000..208d78e --- /dev/null +++ b/softwedge.h @@ -0,0 +1,3 @@ + +#define DEFAULT_SERIAL "/dev/rfcomm0" +#define SOFTWEDGE_VERSION "1.0" -- 2.11.4.GIT