mirror of
https://github.com/Oibaf66/frodo-wii.git
synced 2025-02-27 17:33:37 +01:00
Enough to compile the virtual keyboard (and some untested implementation)
This commit is contained in:
parent
b3fffe82d9
commit
f96f9304ed
4
Makefile
4
Makefile
@ -1,5 +1,5 @@
|
|||||||
OBJS=menu.oo main.oo utils.oo gui.oo dialogue_box.oo menu_messages.oo \
|
OBJS=menu.oo main.oo utils.oo gui.oo dialogue_box.oo menu_messages.oo \
|
||||||
timer.oo game_info.oo widget.oo
|
timer.oo game_info.oo widget.oo virtual_keyboard.oo
|
||||||
|
|
||||||
all: menu
|
all: menu
|
||||||
|
|
||||||
@ -14,6 +14,8 @@ gui.oo: gui.cpp gui.hh Makefile font.hh menu.hh sdl_ttf_font.hh \
|
|||||||
dialogue_box.hh help_box.hh main_menu.cpp disc_menu.cpp \
|
dialogue_box.hh help_box.hh main_menu.cpp disc_menu.cpp \
|
||||||
file_browser.hh timer.hh game_info.hh
|
file_browser.hh timer.hh game_info.hh
|
||||||
|
|
||||||
|
virtual_keyboard.oo: virtual_keyboard.hh virtual_keyboard.cpp widget.hh
|
||||||
|
|
||||||
game_info.oo: game_info.hh game_info.cpp
|
game_info.oo: game_info.hh game_info.cpp
|
||||||
|
|
||||||
utils.oo: utils.cpp utils.hh Makefile
|
utils.oo: utils.cpp utils.hh Makefile
|
||||||
|
@ -12,8 +12,8 @@
|
|||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#include <SDL_ttf.h>
|
#include <SDL_ttf.h>
|
||||||
|
|
||||||
#include "menu.h"
|
|
||||||
#include "virtual_keyboard.hh"
|
#include "virtual_keyboard.hh"
|
||||||
|
#include "utils.hh"
|
||||||
|
|
||||||
typedef struct virtkey
|
typedef struct virtkey
|
||||||
{
|
{
|
||||||
@ -71,13 +71,16 @@ static const char *shifted_names[KEY_COLS * KEY_ROWS] = {
|
|||||||
NULL, NULL, NULL, NULL, NULL, NULL, "f2", "f4", "f6", "f8", "Ins", NULL, NULL, NULL, NULL,
|
NULL, NULL, NULL, NULL, NULL, NULL, "f2", "f4", "f6", "f8", "Ins", NULL, NULL, NULL, NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
VirtualKeyboard::VirtualKeyboard(TTF_Font *font)
|
VirtualKeyboard::VirtualKeyboard(TTF_Font *font) : Widget()
|
||||||
{
|
{
|
||||||
this->font = font;
|
this->font = font;
|
||||||
this->sel_x = 0;
|
this->sel_x = 0;
|
||||||
this->sel_y = 0;
|
this->sel_y = 0;
|
||||||
this->shift_on = false;
|
this->shift_on = false;
|
||||||
|
|
||||||
|
this->is_active = false;
|
||||||
|
this->buf_head = 0;
|
||||||
|
|
||||||
memset(this->buf, 0, sizeof(this->buf));
|
memset(this->buf, 0, sizeof(this->buf));
|
||||||
memset(this->stringListeners, 0, sizeof(this->stringListeners));
|
memset(this->stringListeners, 0, sizeof(this->stringListeners));
|
||||||
memset(this->keyListeners, 0, sizeof(this->keyListeners));
|
memset(this->keyListeners, 0, sizeof(this->keyListeners));
|
||||||
@ -117,10 +120,11 @@ void VirtualKeyboard::draw(SDL_Surface *where, int x, int y, int w, int h)
|
|||||||
if ( (x == this->sel_x && y == this->sel_y) ||
|
if ( (x == this->sel_x && y == this->sel_y) ||
|
||||||
(this->shift_on && key.is_shift))
|
(this->shift_on && key.is_shift))
|
||||||
b = 0;
|
b = 0;
|
||||||
|
#if 0
|
||||||
menu_print_font(where, r, g, b,
|
menu_print_font(where, r, g, b,
|
||||||
x * key_w + border_x, y * key_h + border_y,
|
x * key_w + border_x, y * key_h + border_y,
|
||||||
what);
|
what);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -225,109 +229,6 @@ const char VirtualKeyboard::keycodeToChar(int kc)
|
|||||||
return s[0];
|
return s[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
struct virtkey *VirtualKeyboard::getKeyInternal()
|
|
||||||
{
|
|
||||||
while(1)
|
|
||||||
{
|
|
||||||
uint32_t k;
|
|
||||||
|
|
||||||
this->draw();
|
|
||||||
SDL_Flip(this->screen);
|
|
||||||
|
|
||||||
k = menu_wait_key_press();
|
|
||||||
|
|
||||||
if (k & KEY_UP)
|
|
||||||
this->selectNext(0, -1);
|
|
||||||
else if (k & KEY_DOWN)
|
|
||||||
this->selectNext(0, 1);
|
|
||||||
else if (k & KEY_LEFT)
|
|
||||||
this->selectNext(-1, 0);
|
|
||||||
else if (k & KEY_RIGHT)
|
|
||||||
this->selectNext(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 ];
|
|
||||||
|
|
||||||
if (key->is_shift == true)
|
|
||||||
this->toggleShift();
|
|
||||||
else
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int VirtualKeyboard::getKey()
|
|
||||||
{
|
|
||||||
virtkey_t *key;
|
|
||||||
|
|
||||||
SDL_FillRect(this->screen, 0, SDL_MapRGB(screen->format, 0x00, 0x80, 0x80));
|
|
||||||
|
|
||||||
key = this->getKeyInternal();
|
|
||||||
if (key == NULL)
|
|
||||||
return -2;
|
|
||||||
|
|
||||||
if (this->shift_on)
|
|
||||||
return key->kc | 0x80;
|
|
||||||
return key->kc;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *VirtualKeyboard::getString()
|
|
||||||
{
|
|
||||||
int cnt = 0;
|
|
||||||
|
|
||||||
SDL_FillRect(this->screen, 0, SDL_MapRGB(screen->format, 0x00, 0x80, 0x80));
|
|
||||||
memset(this->buf, 0, sizeof(this->buf));
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
virtkey_t *key = this->getKeyInternal();
|
|
||||||
char c;
|
|
||||||
|
|
||||||
/* Abort */
|
|
||||||
if (key == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* Done */
|
|
||||||
if (key->is_done)
|
|
||||||
return this->buf;
|
|
||||||
/* Skip None */
|
|
||||||
if (key->kc == -1)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* Special-case for delete */
|
|
||||||
if (strcmp(key->name, "Del") == 0)
|
|
||||||
{
|
|
||||||
if (cnt < 1)
|
|
||||||
continue;
|
|
||||||
this->buf[cnt - 1] = ' ';
|
|
||||||
cnt -= 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
c = this->keycodeToChar( this->shift_on ? key->kc | 0x80 : key->kc );
|
|
||||||
|
|
||||||
this->buf[cnt] = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
cnt++;
|
|
||||||
if (cnt >= sizeof(this->buf) - 1)
|
|
||||||
return this->buf;
|
|
||||||
|
|
||||||
/* SDL_Flip is done in get_key_internal() */
|
|
||||||
SDL_FillRect(this->screen, 0, SDL_MapRGB(screen->format, 0x00, 0x80, 0x80));
|
|
||||||
menu_print_font(this->screen, 255, 255, 0,
|
|
||||||
40, screen->h - 50,
|
|
||||||
this->buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Not reachable */
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VirtualKeyboard::registerListener(KeyListener *kl)
|
void VirtualKeyboard::registerListener(KeyListener *kl)
|
||||||
{
|
{
|
||||||
int n_listeners = sizeof(this->keyListeners) / sizeof(*this->keyListeners);
|
int n_listeners = sizeof(this->keyListeners) / sizeof(*this->keyListeners);
|
||||||
@ -376,3 +277,87 @@ void VirtualKeyboard::unregisterListener(StringListener *sl)
|
|||||||
this->stringListeners[i] = NULL;
|
this->stringListeners[i] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VirtualKeyboard::activate()
|
||||||
|
{
|
||||||
|
this->is_active = true;
|
||||||
|
memset(this->buf, 0, sizeof(this->buf));
|
||||||
|
this->buf_head = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void VirtualKeyboard::runLogic()
|
||||||
|
{
|
||||||
|
event_t ev;
|
||||||
|
|
||||||
|
if (!this->is_active)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ev = this->popEvent();
|
||||||
|
if (ev == EVENT_NONE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (ev & KEY_UP)
|
||||||
|
this->selectNext(0, -1);
|
||||||
|
else if (ev & KEY_DOWN)
|
||||||
|
this->selectNext(0, 1);
|
||||||
|
else if (ev & KEY_LEFT)
|
||||||
|
this->selectNext(-1, 0);
|
||||||
|
else if (ev & KEY_RIGHT)
|
||||||
|
this->selectNext(1, 0);
|
||||||
|
else if (ev & KEY_ESCAPE)
|
||||||
|
this->deactivate();
|
||||||
|
else if (ev & KEY_SELECT)
|
||||||
|
{
|
||||||
|
virtkey_t *key = &keys[ this->sel_y * KEY_COLS + this->sel_x ];
|
||||||
|
|
||||||
|
if (!key)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (key->is_shift == true)
|
||||||
|
this->toggleShift();
|
||||||
|
else if (key->is_done)
|
||||||
|
{
|
||||||
|
int n_listeners = sizeof(this->stringListeners) / sizeof(*this->stringListeners);
|
||||||
|
|
||||||
|
for (int i = 0; i < n_listeners; i++)
|
||||||
|
{
|
||||||
|
if (this->stringListeners[i])
|
||||||
|
this->stringListeners[i]->stringCallback(this->buf);
|
||||||
|
}
|
||||||
|
/* We're done! */
|
||||||
|
this->deactivate();
|
||||||
|
}
|
||||||
|
else if (strcmp(key->name, "Del") == 0)
|
||||||
|
{
|
||||||
|
if (this->buf_head > 1)
|
||||||
|
{
|
||||||
|
this->buf[this->buf_head - 1] = ' ';
|
||||||
|
this->buf_head -= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int n_listeners = sizeof(this->keyListeners) / sizeof(*this->keyListeners);
|
||||||
|
char c;
|
||||||
|
|
||||||
|
/* Add to buf */
|
||||||
|
c = this->keycodeToChar( this->shift_on ? key->kc | 0x80 : key->kc );
|
||||||
|
|
||||||
|
this->buf[this->buf_head] = c;
|
||||||
|
|
||||||
|
this->buf_head++;
|
||||||
|
if (this->buf_head >= sizeof(this->buf) - 1)
|
||||||
|
this->buf_head = 0; /* OK, not good, but well... */
|
||||||
|
for (int i = 0; i < n_listeners; i++)
|
||||||
|
{
|
||||||
|
if (this->keyListeners[i])
|
||||||
|
this->keyListeners[i]->keyCallback(this->shift_on,
|
||||||
|
key->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The singleton */
|
||||||
|
VirtualKeyboard *VirtualKeyboard::kbd;
|
||||||
|
@ -9,19 +9,27 @@
|
|||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
#ifndef __VIRTUAL_KEYBORD_HH__
|
||||||
|
#define __VIRTUAL_KEYBORD_HH__
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#include <SDL_ttf.h>
|
#include <SDL_ttf.h>
|
||||||
|
|
||||||
|
#include "widget.hh"
|
||||||
|
|
||||||
struct virtkey;
|
struct virtkey;
|
||||||
|
|
||||||
class KeyListener
|
class KeyListener
|
||||||
{
|
{
|
||||||
void keyCallback(char c);
|
public:
|
||||||
|
/* Each key is a string */
|
||||||
|
virtual void keyCallback(bool shift, const char *str) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class StringListener
|
class StringListener
|
||||||
{
|
{
|
||||||
void stringCallback(const char *str);
|
public:
|
||||||
|
virtual void stringCallback(const char *str) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class VirtualKeyboard : public Widget
|
class VirtualKeyboard : public Widget
|
||||||
@ -35,13 +43,19 @@ public:
|
|||||||
void unregisterListener(StringListener *sl);
|
void unregisterListener(StringListener *sl);
|
||||||
|
|
||||||
/* Conversions */
|
/* Conversions */
|
||||||
int getKey();
|
|
||||||
const char *getString();
|
|
||||||
const char *keycodeToString(int kc);
|
const char *keycodeToString(int kc);
|
||||||
const char keycodeToChar(int kc);
|
const char keycodeToChar(int kc);
|
||||||
int charToKeycode(char c);
|
int charToKeycode(char c);
|
||||||
|
int stringToKeycode(const char *str);
|
||||||
|
|
||||||
void pushEvent(SDL_Event *ev);
|
void activate();
|
||||||
|
|
||||||
|
void deactivate()
|
||||||
|
{
|
||||||
|
this->is_active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void runLogic();
|
||||||
|
|
||||||
void draw(SDL_Surface *where, int x, int y, int w, int h);
|
void draw(SDL_Surface *where, int x, int y, int w, int h);
|
||||||
|
|
||||||
@ -51,7 +65,6 @@ private:
|
|||||||
KeyListener *keyListeners[8];
|
KeyListener *keyListeners[8];
|
||||||
StringListener *stringListeners[8];
|
StringListener *stringListeners[8];
|
||||||
|
|
||||||
struct virtkey *getKeyInternal();
|
|
||||||
void selectNext(int dx, int dy);
|
void selectNext(int dx, int dy);
|
||||||
void toggleShift();
|
void toggleShift();
|
||||||
|
|
||||||
@ -60,5 +73,9 @@ private:
|
|||||||
int sel_y;
|
int sel_y;
|
||||||
bool shift_on;
|
bool shift_on;
|
||||||
|
|
||||||
|
bool is_active;
|
||||||
char buf[255];
|
char buf[255];
|
||||||
|
unsigned buf_head;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif /* __VIRTUAL_KEYBORD_HH__ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user