diff --git a/Makefile.host b/Makefile.host index c1e33de..e390398 100644 --- a/Makefile.host +++ b/Makefile.host @@ -32,7 +32,7 @@ SRCS := $(filter-out src/compemu_raw_x86.c src/compemu_fpp.c src/compemu_support src/readdisk.c src/gengenblitter.c src/scsiemul.c src/tui.c src/linetoscr.c, $(SRCS)) # Library object files. -OBJS := $(subst $(SRC_DIR),$(OBJ_DIR),$(SRCS:.c=.o)) +OBJS := $(subst $(SRC_DIR),$(OBJ_DIR),$(SRCS:.c=.o)) $(OBJ_DIR)/guidep/VirtualKeyboard.o # Test source files. # It can be useful to switch this variable around to select individual tests which are problematic. @@ -125,11 +125,14 @@ uae-host.elf: $(SYMLINKS) src/target.h src/md-fpp.h src/sysconfig.h $(OBJS) @echo Linking $@ @-mkdir -p $(dir $@) g++ -o $@ $(OBJS) $(LDFLAGS) - #keep elf for debugging - #cp $@ /tmp/elf # How to compile C file (SDL library). $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c @echo Compiling $< @-mkdir -p $(dir $@) gcc $(CFLAGS) -c $< -o $@ $(PIPE_TO_SED) + +$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp + @echo Compiling $< + @-mkdir -p $(dir $@) + g++ $(CFLAGS) -c $< -o $@ $(PIPE_TO_SED) diff --git a/Makefile.wii b/Makefile.wii index ccbaf45..5e73bf9 100644 --- a/Makefile.wii +++ b/Makefile.wii @@ -37,7 +37,7 @@ SRCS := $(filter-out src/compemu_raw_x86.c src/compemu_fpp.c src/compemu_support src/readdisk.c src/gengenblitter.c src/scsiemul.c src/tui.c src/linetoscr.c, $(SRCS)) # Library object files. -OBJS := $(subst $(SRC_DIR),$(OBJ_DIR),$(SRCS:.c=.o)) +OBJS := $(subst $(SRC_DIR),$(OBJ_DIR),$(SRCS:.c=.o)) $(OBJ_DIR)/guidep/VirtualKeyboard.o # Test source files. # It can be useful to switch this variable around to select individual tests which are problematic. @@ -157,3 +157,8 @@ $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c @echo Compiling $< @-mkdir -p $(dir $@) @powerpc-gekko-gcc $(CFLAGS) -c $< -o $@ $(PIPE_TO_SED) + +$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp + @echo Compiling $< + @-mkdir -p $(dir $@) + @powerpc-gekko-g++ $(CFLAGS) -c $< -o $@ $(PIPE_TO_SED) diff --git a/src/gui-sdl/VirtualKeyboard.cpp b/src/gui-sdl/VirtualKeyboard.cpp new file mode 100644 index 0000000..103f245 --- /dev/null +++ b/src/gui-sdl/VirtualKeyboard.cpp @@ -0,0 +1,198 @@ +/********************************************************************* + * + * Copyright (C) 2009, Simon Kagstrom + * + * Filename: VirtualKeyboard.c + * Author: Simon Kagstrom + * Description: A virtual keyboard + * + * $Id$ + * + ********************************************************************/ +#include +#include + +#include "menu.h" +#include "VirtualKeyboard.hh" + + +struct virtkey; + +class VirtualKeyboard +{ +public: + VirtualKeyboard(SDL_Surface *screen, TTF_Font *font); + const char* get_key(); + +private: + struct virtkey *get_key_internal(); + void draw(); + void select_next(int dx, int dy); + void toggle_shift(); + + SDL_Surface *screen; + TTF_Font *font; + int sel_x; + int sel_y; + + char buf[255]; +}; + +typedef struct virtkey +{ + const char *name; + const char *ev_name; + bool is_done; +} virtkey_t; + +#define K(name) \ + { name, "KEY_"name, false } +#define N(name, key_name) \ + { name, "KEY_"key_name, false } +#define D(name) \ + { name, "", true } +#define KNL() \ + { NULL, NULL, false } + +#define KEY_COLS 14 +#define KEY_ROWS 6 + +static virtkey_t keys[KEY_COLS * KEY_ROWS] = { + N("Esc", "ESC"), KNL(), K("F1"),K("F2"),K("F3"),K("F4"),K("F5"),K("F6"),K("F7"),K("F8"),K("F9"),KNL(), N("Del","DEL"),N("Help", "HELP"), + N("~`","BACKQUOTE"),KNL(),K("1"), K("2"), K("3"), K("4"), K("5"), K("6"), K("7"), K("8"), K("9"), K("0"), N("-", "SUB"),N("+", "PLUS"), + N("Tab", "TAB"), KNL(), K("Q"), K("W"), K("R"), K("T"), K("Y"), K("U"), K("I"), K("O"), K("P"),N("[", "LEFTBRACKET"),N("]","RIGHTBRACKET"),D("Done"), + N("Sft","SHIFT_LEFT"),KNL(), K("A"), K("D"), K("F"), K("G"), K("H"), K("J"), K("K"), K("L"), N(":;", "SEMICOLON"), N("@#", "??"), N("Sft", "SHIFT_RIGHT"),K("Ret"), + N("Ctrl","CTRL"),KNL(),K("Z"),K("X"), K("C"), K("V"), K("B"), K("N"), K("M"),N("<,", "COMMA"),N(">.", "PERIOD"), N("\\","KEY_BACKSLASH"),N("Up", "CURSOR_UP"), N("/", "SLASH"), + N("Alt","ALT_LEFT"),KNL(), N("Amg","AMIGA_LEFT"),KNL(),N("space", "SPACE"),KNL(),KNL(),N("Amg","AMIGA_RIGHT"),KNL(),N("Alt","ALT_RIGHT"),KNL(),N("Lft", "CURSOR_LEFT"),N("Dwn", "CURSOR_DOWN"), N("Rgt", "CURSOR_RIGHT") +}; + +VirtualKeyboard::VirtualKeyboard(SDL_Surface *screen, TTF_Font *font) +{ + this->screen = screen; + this->font = font; + this->sel_x = 0; + this->sel_y = 0; + + memset(this->buf, 0, sizeof(this->buf)); +} + +void VirtualKeyboard::draw() +{ + int screen_w = this->screen->w; + int screen_h = this->screen->h; + int key_w = 36; + int key_h = 36; + int border_x = (screen_w - (key_w * KEY_COLS)) / 2; + int border_y = (screen_h - (key_h * KEY_ROWS)) / 2; + SDL_Rect bg_rect = {border_x, border_y, + key_w * KEY_COLS, key_h * KEY_ROWS}; + + SDL_FillRect(this->screen, &bg_rect, + SDL_MapRGB(screen->format, 0x00, 0x80, 0x80)); + + for (int y = 0; y < KEY_ROWS; y++ ) + { + for (int x = 0; x < KEY_COLS; x++ ) + { + int which = y * KEY_COLS + x; + virtkey_t key = keys[which]; + int r = 255, g = 255, b = 255; + const char *what = key.name; + + /* Skip empty positions */ + if (key.name == NULL) + continue; + + if ( key.is_done ) + r = 0; + if ( (x == this->sel_x && y == this->sel_y)) + b = 0; + + menu_print_font(this->screen, r, g, b, + x * key_w + border_x, y * key_h + border_y, + what); + } + } +} + +void VirtualKeyboard::select_next(int dx, int dy) +{ + int next_x = (this->sel_x + dx) % KEY_COLS; + int next_y = (this->sel_y + dy) % KEY_ROWS; + virtkey_t key; + + if (next_x < 0) + next_x = KEY_COLS + next_x; + if (next_y < 0) + next_y = KEY_ROWS + next_y; + this->sel_x = next_x; + this->sel_y = next_y; + + key = keys[ next_y * KEY_COLS + next_x ]; + + /* Skip the empty spots */ + if (key.name == NULL) + { + if (dy != 0) /* Look left */ + this->select_next(-1, 0); + else + this->select_next(dx, dy); + } +} + +struct virtkey *VirtualKeyboard::get_key_internal() +{ + while(1) + { + uint32_t k; + + this->draw(); + SDL_Flip(this->screen); + + k = menu_wait_key_press(); + + if (k & KEY_UP) + this->select_next(0, -1); + else if (k & KEY_DOWN) + this->select_next(0, 1); + else if (k & KEY_LEFT) + this->select_next(-1, 0); + else if (k & KEY_RIGHT) + this->select_next(1, 0); + else if (k & KEY_ESCAPE) + return NULL; + else if (k & KEY_SELECT) + { + virtkey_t *key = &keys[ this->sel_y * KEY_COLS + this->sel_x ]; + + return key; + } + } + + return NULL; +} + +const char* VirtualKeyboard::get_key() +{ + virtkey_t *key; + + SDL_FillRect(this->screen, 0, SDL_MapRGB(screen->format, 0x00, 0x80, 0x80)); + + key = this->get_key_internal(); + if (key == NULL) + return NULL; + + return key->ev_name; +} + +/* C interface */ +static VirtualKeyboard *virtual_keyboard; +void virtkbd_init(SDL_Surface *surf, TTF_Font *fnt) +{ + virtual_keyboard = new VirtualKeyboard(surf, fnt); +} + +const char *virtkbd_get_key(void) +{ + return virtual_keyboard->get_key(); +} diff --git a/src/gui-sdl/VirtualKeyboard.hh b/src/gui-sdl/VirtualKeyboard.hh new file mode 100644 index 0000000..8cfb41f --- /dev/null +++ b/src/gui-sdl/VirtualKeyboard.hh @@ -0,0 +1,24 @@ +/********************************************************************* + * + * Copyright (C) 2009, Simon Kagstrom + * + * Filename: VirtualKeyboard.c + * Author: Simon Kagstrom + * Description: A virtual keyboard + * + * $Id$ + * + ********************************************************************/ +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +extern void virtkbd_init(SDL_Surface *surf, TTF_Font *fnt); +extern const char *virtkbd_get_key(void); + +#if defined(__cplusplus) +}; +#endif diff --git a/src/gui-sdl/menu.c b/src/gui-sdl/menu.c index 452d5bb..0f7caf2 100644 --- a/src/gui-sdl/menu.c +++ b/src/gui-sdl/menu.c @@ -18,6 +18,7 @@ #include "sysconfig.h" #include "menu.h" +#include "VirtualKeyboard.hh" #define FULL_DISPLAY_X 640 #define FULL_DISPLAY_Y 480 @@ -992,6 +993,7 @@ void menu_init(SDL_Surface *screen) menu_font64 = read_font(FONT_ALT_PATH); real_screen = screen; + virtkbd_init(screen, menu_font64); is_inited = 1; } diff --git a/src/gui-sdl/menu.h b/src/gui-sdl/menu.h index 99737be..75e4bef 100644 --- a/src/gui-sdl/menu.h +++ b/src/gui-sdl/menu.h @@ -16,6 +16,10 @@ #include #include +#if defined(__cplusplus) +extern "C" { +#endif + #define KEY_UP 1 #define KEY_DOWN 2 #define KEY_LEFT 4 @@ -46,4 +50,9 @@ void menu_init(SDL_Surface *screen); int menu_is_inited(void); + +#if defined(__cplusplus) +} +#endif + #endif /* !__MENU_H__ */