From 923b73786a5e82e8e410935dc5216c4b0779678f Mon Sep 17 00:00:00 2001 From: "fabio.olimpieri" Date: Sat, 5 Jan 2013 06:43:46 +0000 Subject: [PATCH] Automatic virtual keyboard --- src/VirtualKeyboard.c | 8 ++++---- src/VirtualKeyboard.h | 4 ++-- src/computer.c | 38 +++++++++++++++++++++++++++++++++----- src/computer.h | 5 +++-- src/emulator.c | 14 +++++++++++--- src/gui_sdl.c | 27 ++++++++++++++++----------- src/menu_sdl.c | 30 ++++++++++++++++++++++++------ src/menu_sdl.h | 2 +- 8 files changed, 94 insertions(+), 34 deletions(-) diff --git a/src/VirtualKeyboard.c b/src/VirtualKeyboard.c index 21b403e..d71e135 100644 --- a/src/VirtualKeyboard.c +++ b/src/VirtualKeyboard.c @@ -116,7 +116,7 @@ void draw() } -struct virtkey *get_key_internal() +struct virtkey *get_key_internal(int vk) { while(1) { @@ -132,7 +132,7 @@ struct virtkey *get_key_internal() SDL_ShowCursor(SDL_ENABLE); - k = menu_wait_key_press(); + k = menu_wait_key_press(vk); SDL_ShowCursor(SDL_DISABLE); @@ -170,7 +170,7 @@ struct virtkey *get_key_internal() return NULL; } -struct virtkey* get_key() +struct virtkey* get_key(int vk) { virtkey_t *key; @@ -179,7 +179,7 @@ struct virtkey* get_key() keys[3 * KEY_COLS + 0 ].is_on = 0; //Caps Shit keys[3 * KEY_COLS + 8 ].is_on = 0; //Sym Shift - key = get_key_internal(); + key = get_key_internal(vk); return key; } diff --git a/src/VirtualKeyboard.h b/src/VirtualKeyboard.h index 0e08958..381100b 100644 --- a/src/VirtualKeyboard.h +++ b/src/VirtualKeyboard.h @@ -45,8 +45,8 @@ struct Virtual_Keyboard } VirtualKeyboard; void VirtualKeyboard_init(SDL_Surface *screen); -struct virtkey* get_key(); -struct virtkey* get_key_internal(); +struct virtkey* get_key(int vk); +struct virtkey* get_key_internal(int vk); void draw(); void select_next_kb(int dx, int dy); void toggle_shift(); diff --git a/src/computer.c b/src/computer.c index c8b1595..f39d5ce 100644 --- a/src/computer.c +++ b/src/computer.c @@ -106,6 +106,7 @@ void computer_init () { //Called only on start-up ordenador.videosystem = 0; //PAL ordenador.joystick[0] = 1; //Kemposton ordenador.joystick[1] = 0; // Cursor + ordenador.vk_auto = 0; //Vk called by + ordenador.rumble[0] = 0; ordenador.rumble[1] = 0; ordenador.turbo = 0; @@ -1057,6 +1058,8 @@ inline void read_keyboard () { fire_on[0]=0; fire_on[1]=0; + static int countdown_kb; + ordenador.k8 = ordenador.k9 = ordenador.k10 = ordenador.k11 = ordenador.k12 = ordenador.k13 = ordenador.k14 = ordenador.k15 = 0; @@ -1072,6 +1075,22 @@ inline void read_keyboard () { SDL_JoystickUpdate(); + + if (ordenador.vk_auto) + { + if (countdown_kb>0) countdown_kb--; + + #ifdef GEKKO + WPADData *wd; + wd = WPAD_Data(0); + if ((wd->ir.valid)&&(!countdown_kb)) {virtual_keyboard();countdown_kb=30;} + #else + int x=0,y=0 ; + SDL_GetRelativeMouseState(&x,&y); + if ((x||y)&&(!countdown_kb)) {virtual_keyboard();countdown_kb=30;} + #endif + } + for(joy_n=0;joy_n 16384) ordenador.joy_axis_x_state[joy_n] = JOY_RIGHT; else if (joy_axis_x[joy_n] < -16384) ordenador.joy_axis_x_state[joy_n] = JOY_LEFT; @@ -1096,12 +1116,20 @@ inline void read_keyboard () { joybutton_matrix[joy_n][(ordenador.joybuttonkey[joy_n][joybutton_n])] = SDL_JoystickGetButton(ordenador.joystick_sdl[joy_n], joybutton_n); } - + for(joybutton_n=7;joybutton_n<18;joybutton_n++) { joybutton_matrix[joy_n][(ordenador.joybuttonkey[joy_n][joybutton_n])] = SDL_JoystickGetButton(ordenador.joystick_sdl[joy_n], joybutton_n); } + + if (ordenador.vk_auto) { //Check if it is possible to put in the loop + joybutton_matrix[joy_n][(ordenador.joybuttonkey[joy_n][5])] = + SDL_JoystickGetButton(ordenador.joystick_sdl[joy_n], 5); + joybutton_matrix[joy_n][(ordenador.joybuttonkey[joy_n][18])] = + SDL_JoystickGetButton(ordenador.joystick_sdl[joy_n], 18); + } + //JOY HAT status_hat[joy_n] = SDL_JoystickGetHat(ordenador.joystick_sdl[joy_n], 0); if(!ordenador.joypad_as_joystick[joy_n]) @@ -1487,8 +1515,8 @@ void ResetComputer () { ordenador.s15|=0x1F; ordenador.js=0; - ordenador.updown=0; - ordenador.leftright=0; + //ordenador.updown=0; + //ordenador.leftright=0; ordenador.wr=0; ordenador.r_fetch = 0; diff --git a/src/computer.h b/src/computer.h index 6129404..c987380 100644 --- a/src/computer.h +++ b/src/computer.h @@ -105,8 +105,8 @@ struct computer { // Linux joystick private global variables - unsigned char use_js; - unsigned char updown,leftright; + //unsigned char use_js; + //unsigned char updown,leftright; // sound global variables @@ -231,6 +231,7 @@ struct computer { unsigned int joybuttonkey[2][22]; unsigned char joypad_as_joystick[2]; unsigned char rumble[2]; + unsigned char vk_auto; unsigned char port; //SD, USB, SMB or FTP unsigned char smb_enable; unsigned char SmbUser[32]; diff --git a/src/emulator.c b/src/emulator.c index ff048e6..003a17c 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -486,11 +486,11 @@ int retorno, bucle; } if (SDL_InitSubSystem(SDL_INIT_JOYSTICK)) { - ordenador.use_js=0; + //ordenador.use_js=0; printf("Can't initialize JoyStick subsystem\n"); } else { printf("JoyStick subsystem initialized\n"); - ordenador.use_js=1; + //ordenador.use_js=1; if(SDL_NumJoysticks()>0){ // Open joystick ordenador.joystick_number = SDL_NumJoysticks(); @@ -663,6 +663,7 @@ int save_config(struct computer *object, char *filename) { fprintf(fconfig,"port=%c%c",48+object->port,10); fprintf(fconfig,"autoconf=%c%c",48+object->autoconf,10); fprintf(fconfig,"turbo=%c%c",48+object->turbo,10); + fprintf(fconfig,"vk_auto=%c%c",48+object->vk_auto,10); for (joy_n=0; joy_n<2; joy_n++) @@ -831,7 +832,7 @@ int load_config(struct computer *object, char *filename) { FILE *fconfig; unsigned char volume=255,mode128k=255,issue=255,ntsc=255, joystick1=255,joystick2=255,ay_emul=255,mdr_active=255, dblscan=255,framerate =255, screen =255, text=255, precision=255, bw=255, tap_fast=255, audio_mode=255, - joypad1=255, joypad2=255, rumble1=255, rumble2=255, joy_n=255, key_n=255, port=255, autoconf=255, turbo=225; + joypad1=255, joypad2=255, rumble1=255, rumble2=255, joy_n=255, key_n=255, port=255, autoconf=255, turbo=225, vk_auto=255; if (filename) strcpy(config_path,filename); else return -2; @@ -957,6 +958,10 @@ int load_config(struct computer *object, char *filename) { turbo=line[6]-'0'; continue; } + if (!strncmp(line,"vk_auto=",8)) { + vk_auto=line[8]-'0'; + continue; + } if (!strncmp(line,"joybutton_",10)) { sscanf(line, "joybutton_%c_%c=%3d",&joy_n ,&key_n, &key_sdl); if ((joy_n<50) && (joy_n>47) && (key_n<119) && (key_n>96)) @@ -1035,6 +1040,9 @@ int load_config(struct computer *object, char *filename) { if (turbo<2) { object->turbo=turbo; } + if (vk_auto<2) { + object->vk_auto=vk_auto; + } fclose(fconfig); return 0; diff --git a/src/gui_sdl.c b/src/gui_sdl.c index c2d1b15..3bc0b80 100644 --- a/src/gui_sdl.c +++ b/src/gui_sdl.c @@ -119,11 +119,11 @@ static const char *input_messages[] = { /*00*/ "Joystick type", /*01*/ "^|Cursor|Kempston|Sinclair1|Sinclair2", /*02*/ "Bind key to Wiimote", - /*03*/ "^|A|B|1|2|-", + /*03*/ "^|A|B|1|2|-|+", /*04*/ "Bind key to Nunchuk", /*05*/ "^|Z|C", /*06*/ "Bind key to Classic", - /*07*/ "^|a|b|x|y|L|R|Zl|Zr|-", + /*07*/ "^|a|b|x|y|L|R|Zl|Zr|-|+", /*08*/ "Bind key to Pad", /*09*/ "^|Up|Down|Left|Right", /*10*/ "Use Joypad as Joystick", @@ -156,7 +156,10 @@ static const char *tools_messages[] = { /*07*/ "Port", /*08*/ "^|sd|usb|smb|ftp", /*09*/ " ", - /*10*/ "Help", + /*10*/ "Auto virtual keyboard", + /*11*/ "^|on|off", + /*12*/ " ", + /*13*/ "Help", NULL }; @@ -674,9 +677,9 @@ static void setup_joystick(int joy, unsigned int sdl_key, int joy_key) static void input_options(int joy) { - const unsigned int wiimote_to_sdl[] = {0, 1, 2, 3, 4}; + const unsigned int wiimote_to_sdl[] = {0, 1, 2, 3, 4,5}; const unsigned int nunchuk_to_sdl[] = {7, 8}; - const unsigned int classic_to_sdl[] = {9, 10, 11, 12, 13, 14, 15, 16, 17}; + const unsigned int classic_to_sdl[] = {9, 10, 11, 12, 13, 14, 15, 16, 17,18}; const unsigned int pad_to_sdl[] = {18, 19, 20, 21}; int joy_key = 1; unsigned int sdl_key; @@ -707,7 +710,7 @@ static void input_options(int joy) VirtualKeyboard.sel_x = 64; VirtualKeyboard.sel_y = 90; - virtualkey = get_key(); + virtualkey = get_key(0); if (virtualkey == NULL) return; sdl_key = virtualkey->sdl_code; @@ -1290,7 +1293,7 @@ int parse_poke (const char *filename) k=0; while (!((k & KEY_ESCAPE)||(k & KEY_SELECT))) - {k = menu_wait_key_press();} + {k = menu_wait_key_press(0);} banner.y=y; @@ -1361,7 +1364,7 @@ int parse_poke (const char *filename) k=0; while (!(k & KEY_ESCAPE)&&(ritorno==0)) - {k = menu_wait_key_press();} + {k = menu_wait_key_press(0);} fclose(fpoke); if (ritorno==0) strcpy(ordenador.last_selected_poke_file,filename); @@ -1439,7 +1442,7 @@ switch (which) static int tools() { int opt , retorno; - int submenus[2]; + int submenus[3]; memset(submenus, 0, sizeof(submenus)); @@ -1447,6 +1450,7 @@ static int tools() retorno=-1; //Exit from menu as default submenus[1] = ordenador.port; + submenus[2] = !ordenador.vk_auto; opt = menu_select_title("Tools menu", tools_messages, submenus); @@ -1454,6 +1458,7 @@ static int tools() return 0; set_port(submenus[1]); + ordenador.vk_auto = !submenus[2]; switch(opt) { @@ -1466,7 +1471,7 @@ static int tools() case 5: // Load poke file retorno = load_poke_file(); break; - case 10: + case 13: help(); retorno = -1; break; @@ -1485,7 +1490,7 @@ void virtual_keyboard(void) VirtualKeyboard.sel_x = 64; VirtualKeyboard.sel_y = 90; - virtkey_t *key =get_key(); + virtkey_t *key =get_key(1); if (key) {key_code = key->sdl_code;} else return; ordenador.kbd_buffer_pointer=1; diff --git a/src/menu_sdl.c b/src/menu_sdl.c index 3a996fb..befb594 100644 --- a/src/menu_sdl.c +++ b/src/menu_sdl.c @@ -42,6 +42,10 @@ #include "minizip/unzip.h" +#if defined(GEKKO) +# include +#endif + #ifdef DEBUG extern FILE *fdebug; #define printf(...) fprintf(fdebug,__VA_ARGS__) @@ -138,7 +142,7 @@ int msgInfo(char *text, int duration, SDL_Rect *irc) SDL_FillRect(real_screen, &brc, SDL_MapRGB(real_screen->format, 0x00, 0x80, 0x00)); menu_print_font(real_screen, 0,0,0, FULL_DISPLAY_X/2-12/RATIO, Y+42/RATIO, "OK",20); SDL_UpdateRect(real_screen, brc.x, brc.y, brc.w, brc.h); - while (!(KEY_SELECT & menu_wait_key_press())) {} + while (!(KEY_SELECT & menu_wait_key_press(0))) {} } @@ -212,7 +216,7 @@ int msgYesNo(char *text, int default_opt, int x, int y) SDL_UpdateRect(real_screen, brc.x, brc.y, brc.w,brc.h); //SDL_Flip(real_screen); - key = menu_wait_key_press(); + key = menu_wait_key_press(0); if (key & KEY_SELECT) { return default_opt; @@ -915,7 +919,7 @@ static void menu_fini(menu_t *p_menu) free(p_menu->p_submenus); } -uint32_t menu_wait_key_press(void) +uint32_t menu_wait_key_press(int vk) { SDL_Event ev; uint32_t keys = 0; @@ -928,6 +932,20 @@ uint32_t menu_wait_key_press(void) static int joy_keys_last; static int joy_bottons_last[2][8]; SDL_JoystickUpdate(); + + if (ordenador.vk_auto) + { + #ifdef GEKKO + WPADData *wd; + wd = WPAD_Data(0); + if (vk&&!(wd->ir.valid)) return KEY_ESCAPE; + #else + int x=0,y=0 ; + SDL_GetRelativeMouseState(&x,&y); + if ((x<20||y<20||(x>FULL_DISPLAY_X-20)||y>FULL_DISPLAY_Y-20)) return KEY_ESCAPE; + #endif + } + /* Wii-specific, sorry */ for (nr = 0; nr < ordenador.joystick_number; nr++) { joy = ordenador.joystick_sdl[nr]; @@ -1069,7 +1087,7 @@ static int menu_select_internal(SDL_Surface *screen, menu_draw(screen, p_menu, 0, font_size, draw_scr); SDL_Flip(screen); - keys = menu_wait_key_press(); + keys = menu_wait_key_press(0); if (keys & KEY_UP) select_next(p_menu, 0, -1, 1); @@ -1424,7 +1442,7 @@ int ask_value_sdl(int *final_value,int y_coord,int max_value) { VirtualKeyboard.sel_x = 64; VirtualKeyboard.sel_y = 155; - virtualkey = get_key(); + virtualkey = get_key(0); if (virtualkey == NULL) return(0); if (virtualkey->sdl_code==1) break; //done, retorno -1 sdl_key = virtualkey->sdl_code; @@ -1553,7 +1571,7 @@ int ask_filename_sdl(char *nombre_final,int y_coord,char *extension, char *path, VirtualKeyboard.sel_x = 64; VirtualKeyboard.sel_y = 155; - virtualkey = get_key(); + virtualkey = get_key(0); if (virtualkey == NULL) return(2); sdl_key = virtualkey->sdl_code; diff --git a/src/menu_sdl.h b/src/menu_sdl.h index f15b502..f8960bc 100644 --- a/src/menu_sdl.h +++ b/src/menu_sdl.h @@ -54,7 +54,7 @@ int menu_select(const char **pp_msgs, int *p_submenus); const char *menu_select_file(const char *dir_path,const char *selected_file, int draw_scr); -uint32_t menu_wait_key_press(void); +uint32_t menu_wait_key_press(int vk); void msgKill(SDL_Rect *rc); int msgInfo(char *text, int duration, SDL_Rect *rc);