From 52df69665705ec678bdc6aa2305b4f12e9399266 Mon Sep 17 00:00:00 2001 From: dschmenk Date: Tue, 11 Jun 2013 13:11:37 -0700 Subject: [PATCH] Switch to using Apple II "Any Key Down" Using AKD gives rudimentary key up/down events. Required for things like MineCraft. --- src/A2PI.PO | Bin 143360 -> 143360 bytes src/a2pid.c | 71 +++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 51 insertions(+), 20 deletions(-) diff --git a/src/A2PI.PO b/src/A2PI.PO index 994c2d1cd047114eb79314542ebe347df1c934f1..184d0a69319b7fb71d497d8aafab1413c44668fe 100755 GIT binary patch delta 776 zcmYk3T}V@57{_L$Fgo06h1I9Cxg?IyZX2+2OkF2rF?%y=O^ zd6Q7DQ<-PmncGfKk{6!2MXQ`Ix+o)Jk(jL*i(~`^_3lIHaL)5S|KI;S|M%q_cSdk$ zgfPQes!e-9VcC6*t{-IIbBdd_>YHspPU`HL-wai3^z6|-&PXl2N-XL1AEp^=`{j-+ zSFhdZyy?^#Yk?7$@aWj{7{agP2A&}41vQ#+SsW!<9z%FBZD2Z2m$Y(j`EIR&*PYop zvhE-pOC|K&@+n3+woyW@LMC9E^oV@ z_TN4Tr;T^|^_5-b8rAUds>#D4AD{_9Dj+|gfKrpKJK+N-j{;z&7v-cD+ag@@FoAKN zzFDGv@CfRRXTu6V&L>}xfGZe){2{zu(nSm^Bk4+4)?ue&TTzHXKM=Frtc+*(GR;ad zySrPn&!9=bcOrsQ$eZP~NWt7BkcLzk$SU4Khr*v|=v1c#1!3x!1!;h{QmO@EqXwk0 zKNqtmNbfJLO%Iy<9Tz|2r4c{-98WaIX+usUpGodI@Lpfd8X^Q~) hoQeYZD4Rj)DAa7CV6_OQDY(Sl8Yw&(DKITZ{sAU&X#W5J delta 669 zcmXX?Ur19?7~gffe_9K6KFXFEUC1J-2ZbK&C4wkcTo9y(5d_kcl8me%3!-IBY;eLn zwfyht)~HKPyxxb9dYIFqOF9nbgGR(a8!|&iiG@AXxpRkezH@$m&Ue1^MY2jHtBeVv z$Lo5Dh$tQuo>@o4FOqQ5l6;$|MLM0PW8)2fh4J$zI<5Mzrckj+pTGE!#&l+SlD=Z| zb4K_|>(y)5Z?xUC1n+ObLfMdqv@gee3-r_b#q>0$=~>%4^!<$B{XEaP^wi88CYN)^ z-17^Q)>3YtyL&BMZcIjH!xfcq9Pm@XJ%D=w_mT2^)u}jC%eW7`d~lvsP@gH;wG0w6 zcNW=Rh$==Zx-BOsWcwp~9UAF_!cn?M)e!|lP<3)UAMkUq+W}~#7noZMl0^Q15F~bf z{~h|kRH~JNTbn|ou2fB3W(e3S-O0UU%RJXan+Ny9#2*hH0J@8_$$r=|0IaU4$<>kB zK`6Y{TF^s(%4k<(NR6Nv-?IHIk-U`h)1*I@{N={$ZeET{(~)tXt2~Jl2S5$PkftI$ z2u8=&<>a6vX)B~_wd!IV3Kbo4(CLmTMWxX=jPyX0(xwtP9B8a-q@AW>cd_mIBefjV zTF}mc-OYSD*@7Xh73{}sul~fr1VT#C7~?lQZ10;yB)MM~igN+<0Sd2=&KFM6CP|w2c;w diff --git a/src/a2pid.c b/src/a2pid.c index a8d2538..3282440 100755 --- a/src/a2pid.c +++ b/src/a2pid.c @@ -40,11 +40,15 @@ struct a2request { /* * ASCII to scancode conversion */ -#define MOD_ALT 0x40 +#define MOD_FN 0x80 #define MOD_CTRL 0x8000 -#define MOD_SHIFT 0x4000 +#define MOD_ALT 0x4000 +#define MOD_SHIFT 0x2000 +#define KEY_CODE 0x03FF +#define KEY_PRESS 0x80 +#define KEY_ASCII 0x7F -int scancode[256] = { +int keycode[256] = { /* * normal scancode */ @@ -313,60 +317,85 @@ int accel[32] = { 0, 1, 4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, volatile int stop = FALSE, isdaemon = FALSE; struct input_event evkey, evrelx, evrely, evsync; -void sendkey(int fd, int mod, int key) +void sendkeycodedown(int fd, int code) { - int code = scancode[(mod & 0x80) | (key & 0x7F)]; /* * press keys */ - if (mod & MOD_ALT) + evkey.value = 1; + if (code & MOD_ALT) { - evkey.code = KEY_LEFTALT; - evkey.value = 1; + evkey.code = KEY_LEFTALT; write(fd, &evkey, sizeof(evkey)); } if (code & MOD_CTRL) { - evkey.code = KEY_LEFTCTRL; - evkey.value = 1; + evkey.code = KEY_LEFTCTRL; write(fd, &evkey, sizeof(evkey)); } if (code & MOD_SHIFT) { - evkey.code = KEY_LEFTSHIFT; - evkey.value = 1; + evkey.code = KEY_LEFTSHIFT; write(fd, &evkey, sizeof(evkey)); } - evkey.code = code & 0x3FF; - evkey.value = 1; + evkey.code = code & KEY_CODE; write(fd, &evkey, sizeof(evkey)); write(fd, &evsync, sizeof(evsync)); +} +void sendkeycodeup(int fd, int code) +{ /* * release keys */ - evkey.code = code & 0x3FF; + evkey.code = code & KEY_CODE; evkey.value = 0; write(fd, &evkey, sizeof(evkey)); if (code & MOD_SHIFT) { evkey.code = KEY_LEFTSHIFT; - evkey.value = 0; write(fd, &evkey, sizeof(evkey)); } if (code & MOD_CTRL) { evkey.code = KEY_LEFTCTRL; - evkey.value = 0; write(fd, &evkey, sizeof(evkey)); } - if (mod & MOD_ALT) + if (code & MOD_ALT) { evkey.code = KEY_LEFTALT; - evkey.value = 0; write(fd, &evkey, sizeof(evkey)); } write(fd, &evsync, sizeof(evsync)); } +void sendkey(int fd, int mod, int key) +{ + static int prevcode = -1; + int code = keycode[(mod & MOD_FN) | (key & KEY_ASCII)] + | ((mod << 8) & MOD_ALT); + + if (prevcode >= 0) + { + sendkeycodeup(fd, prevcode); + if (!(key & KEY_PRESS) && ((code & KEY_CODE) != (prevcode & KEY_CODE))) + /* + * missed a key down event + * synthesize one + */ + sendkeycodedown(fd, code); + (key & KEY_PRESS) ? sendkeycodedown(fd, code) : sendkeycodeup(fd, code); + } + else + { + sendkeycodedown(fd, code); + if (!(key & KEY_PRESS)) + /* + * missed a key down event + * already synthesized one + */ + sendkeycodeup(fd, code); + } + prevcode = (key & KEY_PRESS) ? code : -1; +} void sendbttn(int fd, int mod, int bttn) { static int lastbtn = 0; @@ -555,6 +584,8 @@ void main(int argc, char **argv) die("error: uinput open"); if (ioctl(kbdfd, UI_SET_EVBIT, EV_KEY) < 0) die("error: uinput ioctl EV_KEY"); + if (ioctl(kbdfd, UI_SET_EVBIT, EV_REP) < 0) + die("error: uinput ioctl EV_REP"); for (i = KEY_ESC; i <= KEY_F10; i++) if (ioctl(kbdfd, UI_SET_KEYBIT, i) < 0) die("error: uinput ioctl SET_KEYBITs"); @@ -685,7 +716,7 @@ void main(int argc, char **argv) { if (read(a2fd, iopkt, 3) == 3) { - //printf("a2pi: Event [0x%02X] [0x%02X] [0x%02X]\n", iopkt[0], iopkt[1], iopkt[2]); + // printf("a2pi: Event [0x%02X] [0x%02X] [0x%02X]\n", iopkt[0], iopkt[1], iopkt[2]); switch (iopkt[0]) { case 0x80: /* sync */