Event handling

This commit is contained in:
simon.kagstrom 2009-11-19 19:23:37 +00:00
parent adb9f867da
commit 68c8a20e35
2 changed files with 94 additions and 14 deletions

View File

@ -480,6 +480,78 @@ const char *menu_select_file(const char *dir_path)
32, 32, FULL_DISPLAY_X/2, FULL_DISPLAY_Y - 32); 32, 32, FULL_DISPLAY_X/2, FULL_DISPLAY_Y - 32);
} }
event_t Menu::popEvent()
{
event_t out;
if (this->ev_head == this->ev_tail)
return EVENT_NONE;
out = this->event_stack[this->ev_tail];
this->ev_tail = (this->ev_tail + 1) % 8;
return out;
}
void Menu::pushEvent(event_t ev)
{
/* Push... */
this->event_stack[this->ev_head] = ev;
/* ... and update */
this->ev_head = (this->ev_head + 1) % 8;
if (this->ev_head == this->ev_tail)
this->ev_tail = (this->ev_tail + 1) % 8;
}
void Menu::pushEvent(SDL_Event *ev)
{
int keys = 0;
switch(ev->type)
{
case SDL_KEYDOWN:
switch (ev->key.keysym.sym)
{
case SDLK_UP:
keys |= KEY_UP;
break;
case SDLK_DOWN:
keys |= KEY_DOWN;
break;
case SDLK_LEFT:
keys |= KEY_LEFT;
break;
case SDLK_RIGHT:
keys |= KEY_RIGHT;
break;
case SDLK_PAGEDOWN:
keys |= KEY_PAGEDOWN;
break;
case SDLK_PAGEUP:
keys |= KEY_PAGEUP;
break;
case SDLK_RETURN:
case SDLK_SPACE:
keys |= KEY_SELECT;
break;
case SDLK_HOME:
case SDLK_ESCAPE:
keys |= KEY_ESCAPE;
break;
default:
break;
}
break;
case SDL_QUIT:
exit(0);
break;
default:
break;
}
break;
}
void Menu::setText(const char *messages) void Menu::setText(const char *messages)
{ {
int submenu; int submenu;
@ -542,10 +614,11 @@ Menu::Menu(TTF_Font *font, SDL_Color clr, int w, int h)
this->n_submenus = 0; this->n_submenus = 0;
this->cur_sel = 0; this->cur_sel = 0;
this->hover_callback = NULL;
this->selection_callback = NULL;
this->mouse_x = -1; this->mouse_x = -1;
this->mouse_y = -1; this->mouse_y = -1;
memset(this->event_stack, 0, sizeof(this->event_stack));
this->ev_head = this->ev_tail = 0;
} }
Menu::~Menu() Menu::~Menu()

31
menu.hh
View File

@ -17,15 +17,16 @@
#include <stdint.h> #include <stdint.h>
enum { enum {
KEY_UP, EVENT_NONE = 0,
KEY_DOWN, KEY_UP = 1,
KEY_LEFT, KEY_DOWN = 2,
KEY_RIGHT, KEY_LEFT = 4,
KEY_SELECT, KEY_RIGHT = 8,
KEY_ESCAPE, KEY_SELECT = 16,
KEY_PAGEDOWN, KEY_ESCAPE = 32,
KEY_PAGEUP, KEY_PAGEDOWN = 64,
KEY_HELP, KEY_PAGEUP = 128,
KEY_HELP = 256,
}; };
@ -36,6 +37,8 @@ typedef struct
int sel; int sel;
} submenu_t; } submenu_t;
typedef int event_t;
class Menu class Menu
{ {
public: public:
@ -53,14 +56,15 @@ public:
~Menu(); ~Menu();
private: private:
void pushEvent(event_t ev);
event_t popEvent();
const char *title; const char *title;
const char **pp_msgs; const char **pp_msgs;
TTF_Font *font; TTF_Font *font;
SDL_Color text_color; SDL_Color text_color;
int (*hover_callback)(Menu *me, int index);
int (*selection_callback)(Menu *me, int index);
/* Width and height */ /* Width and height */
int w, h; int w, h;
@ -73,6 +77,9 @@ private:
int cur_sel; /* Main selection */ int cur_sel; /* Main selection */
int start_entry_visible; int start_entry_visible;
int n_entries; int n_entries;
int ev_head, ev_tail;
event_t event_stack[8];
}; };
#endif /* !__MENU_H__ */ #endif /* !__MENU_H__ */