From f0b2823d9d7f0feda239d58b4d036c2e7ba7cbd1 Mon Sep 17 00:00:00 2001 From: rsn8887 Date: Sun, 25 Dec 2016 09:05:02 -0600 Subject: [PATCH] Vita: - vastly improved virtual keyboard - The new virtual keyboard is now bigger, supports more keys including shifted keys and is transparent - Fixed virtual keyboard not reacting when custom Dpad mode was active - The virtual keyboard can be moved up and down using Start+Dpad Up and Start+ Dpad Down (thanks to ScHlAuChi for the new keyboard image and many ideas) --- CMakeLists.txt | 1 + psp2data/data/vkbdLarge.bmp | Bin 0 -> 21976 bytes psp2data/data/vkbdLargeShift.bmp | Bin 0 -> 21976 bytes psp2data/data/vkbdLargeShift_German.bmp | Bin 0 -> 21976 bytes psp2data/data/vkbdLarge_German.bmp | Bin 0 -> 21976 bytes src/gui.cpp | 27 ++- src/od-joy.cpp | 59 +++-- src/vkbd/vkbd.cpp | 291 +++++++++++++++++++++--- src/vkbd/vkbd.h | 8 +- 9 files changed, 328 insertions(+), 58 deletions(-) create mode 100644 psp2data/data/vkbdLarge.bmp create mode 100644 psp2data/data/vkbdLargeShift.bmp create mode 100644 psp2data/data/vkbdLargeShift_German.bmp create mode 100644 psp2data/data/vkbdLarge_German.bmp diff --git a/CMakeLists.txt b/CMakeLists.txt index 62a0b5a..10fdcac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,6 +40,7 @@ set(FLAGS -DROM_PATH_PREFIX=\"ux0:/data/uae4all/roms/\" -DDATA_PREFIX=\"app0:/data/\" -DSAVE_PREFIX=\"ux0:/data/uae4all/saves/\" -DUSE_UAE4ALL_VKBD -DVKBD_ALWAYS +-DLARGEKEYBOARD -fomit-frame-pointer -Wno-unused -Wno-format -ffast-math -fstrict-aliasing -mstructure-size-boundary=32 -fexpensive-optimizations -fweb -frename-registers -fomit-frame-pointer diff --git a/psp2data/data/vkbdLarge.bmp b/psp2data/data/vkbdLarge.bmp new file mode 100644 index 0000000000000000000000000000000000000000..28dff928431562941e1fa681bd41520e44c1a2ed GIT binary patch literal 21976 zcmeHOL2l*P4RrT7K!EIWiU7Gqb_tMWu9ZbE=4`pkEGDcXi;tw9WPQ(Xk1=RX+fqG} z#bW76{_e*7i{q@(E*B{4S2VP#kULCJrL1Y_YfpY~qy7F$k4ui+i-Z+ZonxJTib`rcvwo;jx4j+d`-+Ip3fc@$$%QY0%p zYOhqQggMsS?v&lFRbf=zQogM|jaP69l5pZ3tkOAt++v$VFw6p^)9xLkYu?Qj451_4 zD_g@VBVI*j*Yuh8m1*Q==k9_VCNZT;Gi2KoZ^Mm2Wyy&_6g!hK-WX_GMAubm^6#ZnrQp-yFv*cSD+2=!8EJ1B+8R_bui(TR$U#s%Vy;!73fm zaD$hI{E4-bPt>DtD1uQmt9x~ejgCnlzT&F7P`f;2)0E=Q*(JSD) z$8Wi1A67etx$b+J%+k8AMz;B<;}Dte_G=ltD4u<9zKgDg9?cIgcam8w>7{^|zK)a< zS?%(wM~PDM?%mFx8J5xONVkgpZHGk+6fZyKOgA)e)VAbSD}ZzKZndiPs6y7W2;FFB z^zd_#Qo&ew7F8@3V#GF%Z2ASWt6J>j0`#RFTxxdFRx5yWsC3>vR4k(qxzSFl6R*@# z^Nqez;o|mH}N1)_^6oOPK7z>0MT*mrRM$aJD_2tajdJCOLs!p|At;J#>jS$SX z8uvLCdZR$53rF|LNWobSeMs@_Vfz;51mE4OoYF@+(+;mR5w2qto_xKmw5W3TUKv&L z8qaWQH3~zV84cNv@B_V)SsHM!9nlzym&F+nNW3qLs-ZKlidzS#mRF&Y%rM6dx&@`} zm@FckyXI3^`f|E-t7s<`&GM_^RcMdZ-j@hlfo^@-yxV(boAXp@{uZ{bgOCisF@WPi^i_duP#)odB?{4N@eyk)MY!5)yLsd z_IT}5a#=gIN3tdwwTqNjJxT;G>F0@8gCSw3I(;-e|MyBxwRdD(Cd(_o!{*hG8d#%0?sAZggs({xc`4Tb+wGVhT+<0Vs=qux2yJ69ACq@V)a|Yz>_HE3o z<^6fb%=yY4)PS9M`lBN5v+oI&I!RXCr|m>}4Z3v~?wOkmEUe8GA3HM--d$NA0oZJNo*)c1ocg~<1Fh{V9XL^M;^;msU z^YSVaPc=t*)M~^H72frBAb*>zphrcdCHF>DRYiHpy?q5LO@s@5 zQI){i2wu6Oi)s-mnj3t_oGQXt5zA*4Kkn5SAz?7Z3o5+2eqUuRR0-gm6NT|SA;3eO z)C!BLF14Qjj^x?szE^a;^>t-al|;oncRpXW0R?aluh1HFPVLtTHGz`%s-pIx=K0xe(H@6IH(5TZZjUt~nBs12$Q&c`UpgNjjA?vq6(pEbdj zc_st%h(;$tRpCW24G*6s<@vD1TpJo_csDz8?qFcyk)7%A z3@%@I71`sRqgR7Rh0?nE+T^>gP|f7V{6_MumDWB|%82l9i1yO=dDTQ>TAx_d)vFO5 zP?hl}9MNki5f^V!5TteS5i3M8l+ke)43b>~d8;RQ1tRALHM-7DE6T(IRk`=7GaqXa z$H9?Sq4VyB}BEg)SFo4`ar9tc8=P{9L`82@)tF(B3pe+l$R?xD|22I zdu{qoxTupEy>omA3lean_L5k=%Q2O$rKj>rwFz9&cW z0UkE6yLDiuQ@-!)|J)8sqp`!@*A&{Jn;`J@3-?vj>Bf}vp|8hUBU^IJWV@`GB*}O}v=iTa zw?Cop6G!+ks)JW|e;fLdcklDn=iXOR7w5hkM)09M*_r+j&)~45PdI||D&DClaO?UF zuf&S8|06YiSm8(*FJVQkQ%#;xmabanE;yoSv-&30bfDrpUXc|=N{$7y5NbHcS5k;g&b6yYCWVCF_-XI$Ry6ssDsDoaipBC(#QB>lOcZdwl z-(Y4$Eqd7jL;=L~3M;J}^8B!DucKsorI4-D=fDNpC5jYfw+dOIC_t~hhAzVUks7g(UIKYKtKL{@c!?)_CEMOnIXSP literal 0 HcmV?d00001 diff --git a/psp2data/data/vkbdLargeShift.bmp b/psp2data/data/vkbdLargeShift.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0a0acff7d1d391f98a4a00dac6a1a4dff27bda4e GIT binary patch literal 21976 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 literal 0 HcmV?d00001 diff --git a/src/gui.cpp b/src/gui.cpp index 9ee49f0..9d5dca2 100755 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -1742,27 +1742,40 @@ if(!vkbd_mode) } #ifdef USE_UAE4ALL_VKBD - if (vkbd_key) + if (vkbd_key!=-1234567) // This means key was selected by user. We cannot test for zero, because that is a valid Amiga keycode { - if (vkbd_keysave==-1234567) + if (vkbd_keysave==-1234567) // the previous vkbd key was released. Press the new key for one frame { - SDL_keysym ks; - ks.sym=vkbd_key; - vkbd_keysave=keycode2amiga(&ks); + vkbd_keysave=vkbd_key; // remember which key we are pressing so we can release it later if (vkbd_keysave >= 0) { if (!uae4all_keystate[vkbd_keysave]) { + if ((vkbd_shift) && uae4all_keystate[AK_LSH] == 0) + { + uae4all_keystate[AK_LSH]=1; + record_key(AK_LSH<<1); + } + if (!(vkbd_shift) && uae4all_keystate[AK_LSH] == 1) + { + uae4all_keystate[AK_LSH]=0; + record_key((AK_LSH<<1)|1); + } uae4all_keystate[vkbd_keysave]=1; - record_key(vkbd_keysave<<1); + record_key(vkbd_keysave<<1); } } } } else if (vkbd_keysave!=-1234567) { - if (vkbd_keysave >= 0) + if (vkbd_keysave >= 0) //turn off shift together with any other key release if it was on { + if (uae4all_keystate[AK_LSH] == 1) + { + uae4all_keystate[AK_LSH]=0; + record_key((AK_LSH<<1)|1); + } uae4all_keystate[vkbd_keysave]=0; record_key((vkbd_keysave << 1) | 1); } diff --git a/src/od-joy.cpp b/src/od-joy.cpp index 861ee31..0b6790d 100755 --- a/src/od-joy.cpp +++ b/src/od-joy.cpp @@ -314,32 +314,51 @@ void read_joystick(int nr, unsigned int *dir, int *button) if (vkbd_mode && nr) { // move around the virtual keyboard instead - if (left) - vkbd_move |= VKBD_LEFT; - else + + // if Start+up or Start+down is pressed: move the keyboard itself + if (buttonStart && (dpadUp || top)) { - vkbd_move &= ~VKBD_LEFT; - if (right) - vkbd_move |= VKBD_RIGHT; - else - vkbd_move &= ~VKBD_RIGHT; + vkbd_displace_up(); } - if (top) - vkbd_move |= VKBD_UP; - else + else if (buttonStart && (dpadDown || bot)) { - vkbd_move &= ~VKBD_UP; - if (bot) - vkbd_move |= VKBD_DOWN; - else - vkbd_move &= ~VKBD_DOWN; + vkbd_displace_down(); } - if (*button) + + else { - vkbd_move=VKBD_BUTTON; - *button=0; + if (left || dpadLeft) + vkbd_move |= VKBD_LEFT; + else + { + vkbd_move &= ~VKBD_LEFT; + if (right || dpadRight) + vkbd_move |= VKBD_RIGHT; + else + vkbd_move &= ~VKBD_RIGHT; + } + if (top || dpadUp) + vkbd_move |= VKBD_UP; + else + { + vkbd_move &= ~VKBD_UP; + if (bot || dpadDown) + vkbd_move |= VKBD_DOWN; + else + vkbd_move &= ~VKBD_DOWN; + } + + if (*button || buttonX) + { + vkbd_move=VKBD_BUTTON; + *button=0; + } + else //button release, make shift toggle possible again. + { + vkbd_can_switch_shift=1; + } + // TODO: add vkbd_button2 mapped to button2 } - // TODO: add vkbd_button2 mapped to button2 } else #endif diff --git a/src/vkbd/vkbd.cpp b/src/vkbd/vkbd.cpp index e68af24..90fa041 100755 --- a/src/vkbd/vkbd.cpp +++ b/src/vkbd/vkbd.cpp @@ -4,14 +4,23 @@ #include "vkbd.h" -#define MENU_FILE_BACKGROUND DATA_PREFIX "background.bmp" +#include "keyboard.h" + #define MIN_VKBD_TIME 100 +extern int keycode2amiga(SDL_keysym *prKeySym); + +static int vkbd_x=VKBD_X; +static int vkbd_y=VKBD_Y; +static int vkbd_just_blinked=0; + +int vkbd_shift=0; +int vkbd_can_switch_shift=0; int vkbd_mode=0; int vkbd_move=0; -SDLKey vkbd_key=(SDLKey)0; -SDLKey vkbd_button2=(SDLKey)0; +int vkbd_key=-1234567; +SDLKey vkbd_button2=(SDLKey)0; //not implemented int vkbd_keysave=-1234567; #if !defined (DREAMCAST) && !defined (GP2X) && !defined (PSP) && !defined (GIZMONDO) @@ -19,15 +28,21 @@ int vkbd_keysave=-1234567; int vkbd_init(void) { return 0; } void vkbd_init_button2(void) { } void vkbd_quit(void) { } -SDLKey vkbd_process(void) { return (SDLKey)0; } - +int vkbd_process(void) { return -1234567; } +void vkbd_displace_up(void) { }; +void vkbd_displace_down(void) { }; #else #define MAX_KEY 110 extern SDL_Surface *prSDLScreen; -static SDL_Surface *ksur, *vkey[MAX_KEY]; +static SDL_Surface *ksur; +#ifdef LARGEKEYBOARD // The new larger keyboard uses transparency and supports shift. +static SDL_Surface *ksurShift; +#else +static SDL_Surface *vkey[MAX_KEY]; +#endif static int vkbd_actual=0, vkbd_color=0; @@ -38,9 +53,16 @@ extern char launchDir [256]; typedef struct{ SDL_Rect rect; unsigned char up,down,left,right; - SDLKey key; +#ifdef LARGEKEYBOARD + int key; +#else + SDLKey key; //Amiga Keycode, defined in keyboard.h, some use shift etc. +#endif } t_vkbd_rect; +//Keyboard parameters +#ifndef LARGEKEYBOARD +//Small Keyboard this is the old one from Pandora version based on SDL keys static t_vkbd_rect vkbd_rect[]= { {{ 8, 3, 6, 6 },89,10, 9, 1, SDLK_F1}, // 0 @@ -143,6 +165,111 @@ static t_vkbd_rect vkbd_rect[]= {{131,34,12, 5 },86,28,91,93, SDLK_KP0}, // 92 {{145,34, 6, 5 },87,29,92,88, SDLK_KP_PERIOD}, // 93 }; +#else +//This is the new keyboard, based directly on amiga-side keys +//last four numbers: next keys in up,down,left,right directions +static t_vkbd_rect vkbd_rect[]= +{ + {{ 1, 1, 29, 11 },85,17,16, 1, AK_ESC}, // 0, row 1 start + {{ 31, 1, 14, 11 },86,18, 0, 2, AK_F1}, // 1 + {{ 46, 1, 14, 11 },87,19, 1, 3, AK_F2}, // 2 + {{ 61, 1, 14, 11 },87,20, 2, 4, AK_F3}, // 3 + {{ 76, 1, 14, 11 },87,21, 3, 5, AK_F4}, // 4 + {{ 91, 1, 14, 11 },87,22, 4, 6, AK_F5}, // 5 + {{106, 1, 14, 11 },87,23, 5, 7, AK_F6}, // 6 + {{121, 1, 14, 11 },87,24, 6, 8, AK_F7}, // 7 + {{136, 1, 14, 11 },87,25, 7, 9, AK_F8}, // 8 + {{151, 1, 14, 11 },87,26, 8,10, AK_F9}, // 9 + {{166, 1, 14, 11 },87,27, 9,11, AK_F10}, // 10 + {{181, 1, 29, 11 },88,28,10,12, AK_DEL}, // 11 + {{211, 1, 29, 11 },90,30,11,13, AK_HELP}, // 12 + {{241, 1, 14, 11 },92,32,12,14, AK_NPLPAREN}, // 13 + {{256, 1, 14, 11 },69,33,13,15, AK_NPRPAREN}, // 14 + {{271, 1, 13, 11 },69,34,14,16, AK_NPDIV}, // 15 + {{286, 1, 13, 11 },69,35,15,0, AK_NPMUL}, // 16 + + {{ 1, 13, 29, 11 }, 0,36,35,18, AK_QUOTE}, // 17, row 2 start + {{ 31, 13, 14, 11 }, 1,37,17,19, AK_1}, // 18 + {{ 46, 13, 14, 11 }, 2,38,18,20, AK_2}, // 19 + {{ 61, 13, 14, 11 }, 3,39,19,21, AK_3}, // 20 + {{ 76, 13, 14, 11 }, 4,40,20,22, AK_4}, // 21 + {{ 91, 13, 14, 11 }, 5,41,21,23, AK_5}, // 22 + {{106, 13, 14, 11 }, 6,42,22,24, AK_6}, // 23 + {{121, 13, 14, 11 }, 7,43,23,25, AK_7}, // 24 + {{136, 13, 14, 11 }, 8,44,24,26, AK_8}, // 25 + {{151, 13, 14, 11 }, 9,45,25,27, AK_9}, // 26 + {{166, 13, 14, 11 },10,46,26,28, AK_0}, // 27 + {{181, 13, 14, 11 },11,47,27,29, AK_MINUS}, // 28 + {{196, 13, 14, 11 },11,48,28,30, AK_EQUAL}, // 29 + {{211, 13, 14, 11 },12,49,29,31, AK_BACKSLASH}, // 30 + {{226, 13, 14, 11 },12,49,30,32, AK_BS}, // 31 + {{241, 13, 14, 11 },13,50,31,33, AK_NP7}, // 32 + {{256, 13, 14, 11 },14,51,32,34, AK_NP8}, // 33 + {{271, 13, 13, 11 },15,52,33,35, AK_NP9}, // 34 + {{285, 13, 13, 11 },16,53,34,17, AK_NPSUB}, // 35 + + {{ 1, 25, 29, 11 }, 17,54,53,37, AK_TAB}, // 36, row 3 start + {{ 31, 25, 14, 11 }, 18,55,36,38, AK_Q}, // 37 + {{ 46, 25, 14, 11 }, 19,56,37,39, AK_W}, // 38 + {{ 61, 25, 14, 11 }, 20,57,38,40, AK_E}, // 39 + {{ 76, 25, 14, 11 }, 21,58,39,41, AK_R}, // 40 + {{ 91, 25, 14, 11 }, 22,59,40,42, AK_T}, // 41 + {{106, 25, 14, 11 }, 23,60,41,43, AK_Y}, // 42 + {{121, 25, 14, 11 }, 24,61,42,44, AK_U}, // 43 + {{136, 25, 14, 11 }, 25,62,43,45, AK_I}, // 44 + {{151, 25, 14, 11 }, 26,63,44,46, AK_O}, // 45 + {{166, 25, 14, 11 }, 27,64,45,47, AK_P}, // 46 + {{181, 25, 14, 11 }, 28,65,46,48, AK_LBRACKET}, // 47 + {{196, 25, 14, 11 }, 29,49,47,49, AK_RBRACKET}, // 48 + {{211, 25, 29, 23 }, 30,81,48,50, AK_RET}, // 49 + {{241, 25, 14, 11 }, 32,66,49,51, AK_NP4}, // 50 + {{256, 25, 14, 11 }, 33,67,50,52, AK_NP5}, // 51 + {{271, 25, 13, 11 }, 34,68,51,53, AK_NP6}, // 52 + {{285, 25, 13, 11 }, 35,69,52,36, AK_NPADD}, // 53 + + {{ 1, 37, 29, 11 }, 36,70,69,55, AK_CTRL}, // 54, row 4 start + {{ 31, 37, 14, 11 }, 37,70,54,56, AK_A}, // 55 + {{ 46, 37, 14, 11 }, 38,71,55,57, AK_S}, // 56 + {{ 61, 37, 14, 11 }, 39,72,56,58, AK_D}, // 57 + {{ 76, 37, 14, 11 }, 40,73,57,59, AK_F}, // 58 + {{ 91, 37, 14, 11 }, 41,74,58,60, AK_G}, // 59 + {{106, 37, 14, 11 }, 42,75,59,61, AK_H}, // 60 + {{121, 37, 14, 11 }, 43,76,60,62, AK_J}, // 61 + {{136, 37, 14, 11 }, 44,77,61,63, AK_K}, // 62 + {{151, 37, 14, 11 }, 45,78,62,64, AK_L}, // 63 + {{166, 37, 14, 11 }, 46,79,63,65, AK_SEMICOLON}, // 64 + {{181, 37, 14, 11 }, 47,80,64,49, AK_BACKQUOTE}, // 65 + {{241, 37, 14, 11 }, 50,83,49,67, AK_NP1}, // 66 + {{256, 37, 14, 11 }, 51,83,66,68, AK_NP2}, // 67 + {{271, 37, 13, 11 }, 52,84,67,69, AK_NP3}, // 68 + {{285, 37, 13, 34 }, 53,16,68,54, AK_ENT}, // 69 + + {{ 1, 49, 44, 11 }, 54,85,84,71, AK_LSH}, // 70, row 5 start + {{ 46, 49, 14, 11 }, 56,87,70,72, AK_Z}, // 71 + {{ 61, 49, 14, 11 }, 57,87,71,73, AK_X}, // 72 + {{ 76, 49, 14, 11 }, 58,87,72,74, AK_C}, // 73 + {{ 91, 49, 14, 11 }, 59,87,73,75, AK_V}, // 74 + {{106, 49, 14, 11 }, 60,87,74,76, AK_B}, // 75 + {{121, 49, 14, 11 }, 61,87,75,77, AK_N}, // 76 + {{136, 49, 14, 11 }, 62,87,76,78, AK_M}, // 77 + {{151, 49, 14, 11 }, 63,87,77,79, AK_COMMA}, // 78 + {{166, 49, 14, 11 }, 64,87,78,80, AK_PERIOD}, // 79 + {{181, 49, 14, 11 }, 65,88,79,81, AK_SLASH}, // 80 + {{196, 49, 29, 11 }, 49,89,80,82, AK_RSH}, // 81 + {{226, 49, 14, 11 }, 49,91,81,83, AK_UP}, // 82 + {{241, 49, 27, 11 }, 66,92,82,84, AK_NP0}, // 83 + {{271, 49, 13, 11 }, 67,69,83,69, AK_NPDEL}, // 84 + + {{ 1, 61, 29, 11 }, 70,0,69,86, AK_LALT}, // 85, row 6 start + {{ 31, 61, 14, 11 }, 70,1,85,87, AK_LAMI}, // 86 + {{ 46, 61,134, 11 }, 71,2,86,88, AK_SPC}, // 87 + {{181, 61, 14, 11 }, 80,11,87,89, AK_RAMI}, // 88 + {{196, 61, 14, 11 }, 81,11,88,90, AK_RALT}, // 89 + {{211, 61, 14, 11 }, 81,12,89,91, AK_LF}, // 90 + {{226, 61, 14, 11 }, 82,12,90,92, AK_DN}, // 91 + {{241, 61, 14, 11 }, 83,13,91,69, AK_RT}, // 92 +}; +#endif void vkbd_init_button2(void) { @@ -153,24 +280,29 @@ int vkbd_init(void) { int i; char tmpchar[256]; + char vkbdFileName[256]; +#ifdef LARGEKEYBOARD + snprintf(vkbdFileName, 256, "vkbdLarge.bmp"); +#else + snprintf(vkbdFileName, 256, "vkbd.bmp"); +#endif + #ifdef __PSP2__ -// if (!vkbd_screen) -// { //vkbd_screen=SDL_CreateRGBSurface(prSDLScreen->flags,prSDLScreen->w,prSDLScreen->h,prSDLScreen->format->BitsPerPixel,prSDLScreen->format->Rmask,prSDLScreen->format->Gmask,prSDLScreen->format->Bmask,prSDLScreen->format->Amask); -// } - SDL_Surface *tmp=SDL_LoadBMP(DATA_PREFIX "vkbd.bmp"); -// SDL_Surface *tmp=SDL_LoadBMP("app0:/data/vkbd.bmp"); + snprintf(tmpchar, 256, "%s%s", DATA_PREFIX, vkbdFileName); #else #ifdef GP2X - snprintf(tmpchar, 256, "%s/data/vkbd.bmp", launchDir); - SDL_Surface *tmp = SDL_LoadBMP(tmpchar); + snprintf(tmpchar, 256, "%s/data/%s", launchDir, vkbdFileName); #else #ifdef GIZMONDO - SDL_Surface *tmp = SDL_LoadBMP("\\SD Card\\uae4all\\data\\vkbd.bmp"); + snprintf(tmpchar, 256, "%s", "\\SD Card\\uae4all\\data\\%s",vkbdFileName); #else - SDL_Surface *tmp=SDL_LoadBMP(DATA_PREFIX "vkbd.bmp"); + snprintf(tmpchar, 256, "%s%s", DATA_PREFIX, vkbdFileName); #endif #endif #endif //__PSP2__ + + SDL_Surface *tmp = SDL_LoadBMP(tmpchar); + if (tmp==NULL) { printf("Virtual Keyboard Bitmap Error: %s\n",SDL_GetError()); @@ -178,6 +310,39 @@ int vkbd_init(void) } ksur=SDL_DisplayFormat(tmp); SDL_FreeSurface(tmp); + +//for large keyboard, use another image for shifted keys, and transparency +#ifdef LARGEKEYBOARD + char vkbdShiftFileName[256]; + snprintf(vkbdShiftFileName, 256, "vkbdLargeShift.bmp"); +#ifdef __PSP2__ + snprintf(tmpchar, 256, "%s%s", DATA_PREFIX, vkbdShiftFileName); +#else +#ifdef GP2X + snprintf(tmpchar, 256, "%s/data/%s", launchDir, vkbdShiftFileName); +#else +#ifdef GIZMONDO + snprintf(tmpchar, 256, "%s", "\\SD Card\\uae4all\\data\\%s",vkbdShiftFileName); +#else + snprintf(tmpchar, 256, "%s%s", DATA_PREFIX, vkbdShiftFileName); +#endif +#endif +#endif //__PSP2__ + + tmp = SDL_LoadBMP(tmpchar); + + if (tmp==NULL) + { + printf("Virtual Keyboard Bitmap Error: %s\n",SDL_GetError()); + return -1; + } + ksurShift=SDL_DisplayFormat(tmp); + SDL_FreeSurface(tmp); + + SDL_SetAlpha(ksur, SDL_SRCALPHA | SDL_RLEACCEL, 125); + SDL_SetAlpha(ksurShift, SDL_SRCALPHA | SDL_RLEACCEL, 125); +#else //LARGEKEYBOARD +//if using the small keyboard, load in the zoomed keys instead for(i=0;iw-ksur->w)/2; + vkbd_y=prSDLScreen->h-ksur->h; +#else + vkbd_x=VKBD_X; + vkbd_y=(prSDLScreen->h-ksur->h); #endif vkbd_mode=0; vkbd_move=0; - vkbd_key=(SDLKey)0; + vkbd_key=0; vkbd_button2=(SDLKey)0; vkbd_keysave=-1234567; return 0; @@ -216,23 +392,56 @@ int vkbd_init(void) void vkbd_quit(void) { int i; +#ifdef LARGEKEYBOARD + SDL_FreeSurface(ksurShift); +#else for(i=0;ih-40; + + if (vkbd_y>prSDLScreen->h-ksur->h) + vkbd_y=prSDLScreen->h-ksur->h; + + r.x=vkbd_x; + r.y=vkbd_y; r.w=ksur->w; r.h=ksur->h; + +#ifdef LARGEKEYBOARD + if (!vkbd_shift) + SDL_BlitSurface(ksur,NULL,prSDLScreen,&r); + else + SDL_BlitSurface(ksurShift,NULL,prSDLScreen,&r); +#else SDL_BlitSurface(ksur,NULL,prSDLScreen,&r); +#endif } -SDLKey vkbd_process(void) +void vkbd_displace_up(void) +{ + if (vkbd_y>3) + vkbd_y-=4; + else + vkbd_y=0; +} + +void vkbd_displace_down(void) +{ + if (vkbd_yh-ksur->h-3) + vkbd_y+=4; + else + vkbd_y=prSDLScreen->h-ksur->h; +} + +int vkbd_process(void) { static Uint32 last_time=0; Uint32 now=SDL_GetTicks(); @@ -246,15 +455,30 @@ SDLKey vkbd_process(void) if (vkbd_move&VKBD_BUTTON) { vkbd_move=0; - return vkbd_rect[vkbd_actual].key; +#ifndef LARGEKEYBOARD //the old small keyboard struct contains SDL codes + SDL_keysym ks; + ks.sym=vkbd_rect[vkbd_actual].key; + return keycode2amiga(&ks); +#else //the large keyboard struct contains Amiga key codes + int amigaKeyCode=vkbd_rect[vkbd_actual].key; + if ((amigaKeyCode == AK_LSH || amigaKeyCode == AK_RSH) && vkbd_can_switch_shift) + { + vkbd_shift=!vkbd_shift; + vkbd_can_switch_shift=0; + amigaKeyCode=-1234567; //shift is handled as part of the other keypress + } + return amigaKeyCode; +#endif } + /* else - if (vkbd_move&VKBD_BUTTON2) + if (vkbd_move&VKBD_BUTTON2) // not implemented yet { vkbd_move=0; vkbd_button2=vkbd_rect[vkbd_actual].key; return (SDLKey)0; } + */ if (canmove) { last_time=now; @@ -267,14 +491,22 @@ SDLKey vkbd_process(void) else if (vkbd_move&VKBD_DOWN) vkbd_actual=vkbd_rect[vkbd_actual].down; } - r.x=VKBD_X+vkbd_rect[vkbd_actual].rect.x; - r.y=prSDLScreen->h-40+vkbd_rect[vkbd_actual].rect.y; + r.x=vkbd_x+vkbd_rect[vkbd_actual].rect.x; + r.y=vkbd_y+vkbd_rect[vkbd_actual].rect.y; r.w=vkbd_rect[vkbd_actual].rect.w; r.h=vkbd_rect[vkbd_actual].rect.h; - - SDL_FillRect(prSDLScreen,&r,vkbd_color); - vkbd_color = ~vkbd_color; - + if (!vkbd_just_blinked) + { + SDL_FillRect(prSDLScreen,&r,vkbd_color); + vkbd_just_blinked=1; + //vkbd_color = ~vkbd_color; + } + else + { + vkbd_just_blinked=0; + } +//Draw the zoomed in key preview, only do this when using the small keyboard +#ifndef LARGEKEYBOARD #ifndef VKBD_ALWAYS if (vkbd_move && vkey[vkbd_actual]!=NULL) { @@ -287,6 +519,7 @@ SDLKey vkbd_process(void) #ifndef VKBD_ALWAYS } #endif - return (SDLKey)0; +#endif //!LARGEKEYBOARD + return -1234567; //nothing on the vkbd was pressed } #endif diff --git a/src/vkbd/vkbd.h b/src/vkbd/vkbd.h index d6f7b62..7cbc058 100755 --- a/src/vkbd/vkbd.h +++ b/src/vkbd/vkbd.h @@ -13,12 +13,16 @@ int vkbd_init(void); void vkbd_quit(void); void vkbd_redraw(void); -SDLKey vkbd_process(void); +int vkbd_process(void); void vkbd_init_button2(void); +void vkbd_displace_up(void); +void vkbd_displace_down(void); extern int vkbd_mode; extern int vkbd_move; -extern SDLKey vkbd_key; +extern int vkbd_shift; +extern int vkbd_can_switch_shift; +extern int vkbd_key; extern int vkbd_keysave; extern SDLKey vkbd_button2; extern int keymappings[10][3];