diff --git a/ion/drivers/fltkkbd/fltkkbd.cpp b/ion/drivers/fltkkbd/fltkkbd.cpp index 04c0e7555..48028d8e7 100644 --- a/ion/drivers/fltkkbd/fltkkbd.cpp +++ b/ion/drivers/fltkkbd/fltkkbd.cpp @@ -1,9 +1,34 @@ #include "fltkkbd.h" +#include "fltkkbdbutton.h" +#include -FltkKBD::FltkKBD(int x, int y, int w, int h) : - Fl_Group(x, y, w, h) { +void FltkKbdButtonCallback(Fl_Widget * w, void * context) { + FltkKbd * kbd = (FltkKbd *)context; + FltkKbdButton * button = (FltkKbdButton *)w; + kbd->register_key_state(button->m_key, button->value()); + printf("Register state %d at %d\n", button->m_key, button->value()); } -bool FltkKBD::scankey(ion_key_t key) { - return false; +FltkKbd::FltkKbd(int x, int y, int w, int h) : Fl_Group(x, y, w, h) { + m_keyState = new bool[ION_NUMBER_OF_KEYS]; + for (int i=0; im_key = (ion_key_t)k; + b->when(FL_WHEN_CHANGED); + b->callback(FltkKbdButtonCallback, (void *)this); + } + end(); +} + +// FIXME: Destructor: delete[] m_keyState + +bool FltkKbd::scankey(ion_key_t key) { + return m_keyState[key]; +} + +void FltkKbd::register_key_state(ion_key_t key, bool active) { + m_keyState[key] = active; } diff --git a/ion/drivers/fltkkbd/fltkkbd.h b/ion/drivers/fltkkbd/fltkkbd.h index 87ad7f6a3..a088913a5 100644 --- a/ion/drivers/fltkkbd/fltkkbd.h +++ b/ion/drivers/fltkkbd/fltkkbd.h @@ -6,10 +6,14 @@ extern "C" { #include } -class FltkKBD : public Fl_Group { - public: - FltkKBD(int x, int y, int w, int h); - bool scankey(ion_key_t key); +class FltkKbd : public Fl_Group { + friend void FltkKbdButtonCallback(Fl_Widget * w, void * context); +public: + FltkKbd(int x, int y, int w, int h); + bool scankey(ion_key_t key); +private: + bool * m_keyState; + void register_key_state(ion_key_t key, bool active); }; #endif diff --git a/ion/drivers/fltkkbd/fltkkbdbutton.cpp b/ion/drivers/fltkkbd/fltkkbdbutton.cpp new file mode 100644 index 000000000..ca63ffa5b --- /dev/null +++ b/ion/drivers/fltkkbd/fltkkbdbutton.cpp @@ -0,0 +1,5 @@ +#include "fltkkbdbutton.h" + +FltkKbdButton::FltkKbdButton(int x, int y, int w, int h, const char * label) : + Fl_Button(x, y, w, h, label) { +} diff --git a/ion/drivers/fltkkbd/fltkkbdbutton.h b/ion/drivers/fltkkbd/fltkkbdbutton.h new file mode 100644 index 000000000..9dc009c2d --- /dev/null +++ b/ion/drivers/fltkkbd/fltkkbdbutton.h @@ -0,0 +1,15 @@ +#ifndef ION_FLTK_KBD_BUTTON +#define ION_FLTK_KBD_BUTTON + +#include +extern "C" { +#include +} + +class FltkKbdButton : public Fl_Button { + public: + FltkKbdButton(int x, int y, int w, int h, const char * label = 0); + ion_key_t m_key; +}; + +#endif diff --git a/ion/include/ion/keyboard.h b/ion/include/ion/keyboard.h index 9ea13dbc4..0970d66a3 100644 --- a/ion/include/ion/keyboard.h +++ b/ion/include/ion/keyboard.h @@ -7,7 +7,8 @@ typedef enum { ION_KEY_1, ION_KEY_2, ION_KEY_PLUS, - ION_KEY_MINUS + ION_KEY_MINUS, + ION_NUMBER_OF_KEYS // Should be defined last } ion_key_t; bool ion_scankey(ion_key_t key); diff --git a/ion/platform/simulator/Makefile b/ion/platform/simulator/Makefile index 352a6d724..2c71df0b1 100644 --- a/ion/platform/simulator/Makefile +++ b/ion/platform/simulator/Makefile @@ -1,5 +1,5 @@ objs += $(addprefix ion/platform/simulator/, init.o keyboard.o platform.o) -objs += $(addprefix ion/drivers/, fltklcd/fltklcd.o fltkkbd/fltkkbd.o) +objs += $(addprefix ion/drivers/, fltklcd/fltklcd.o fltkkbd/fltkkbd.o fltkkbd/fltkkbdbutton.o) #SFLAGS += -I/usr/local/Cellar/fltk/1.3.3/include -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT LDFLAGS += -L/usr/local/Cellar/fltk/1.3.3/lib -lfltk -lpthread -framework Cocoa diff --git a/ion/platform/simulator/init.cpp b/ion/platform/simulator/init.cpp index a574a1d74..d07e89c27 100644 --- a/ion/platform/simulator/init.cpp +++ b/ion/platform/simulator/init.cpp @@ -7,7 +7,6 @@ extern "C" { #include #include #include -#include #include #include @@ -21,10 +20,9 @@ void ion_init() { Platform.display = lcd; PlatformFramebuffer = lcd->m_framebuffer; - FltkKBD * kbd = new FltkKBD(0,0,100,100); + FltkKbd * kbd = new FltkKbd(0,0,100,100); Platform.keyboard = kbd; - Fl_Button *button = new Fl_Button(margin, ION_FRAMEBUFFER_HEIGHT+2*margin+margin, 40, 40, "A"); window->end(); window->show(NULL, NULL); diff --git a/ion/platform/simulator/platform.h b/ion/platform/simulator/platform.h index 599881fee..4864b6263 100644 --- a/ion/platform/simulator/platform.h +++ b/ion/platform/simulator/platform.h @@ -9,7 +9,7 @@ extern "C" { typedef struct { FltkLCD * display; - FltkKBD * keyboard; + FltkKbd * keyboard; } platform_t; extern platform_t Platform;