1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
struct mouse_event_registerer
{
typedef void (*prototype)(int button, int state, int x, int y);
static void do_register(prototype p)
{
glutMouseFunc(p);
}
};
template <
class Handler>
struct handler_traits
{
typedef Handler handler_type;
typedef typename handler_type::registerer_type hander_registerer;
typedef typename handler_registerer::prototype handler_prototype;
static void do_register(handler_prototype p)
{
hander_registerer::do_register(p);
}
};
// les handlers d'évènement souris vont dériver de ce type, ce qui
// va importer registerer_type dans le handler. Dans le cas contraire,
// on va simplement définir registerer_type dans la class handler,
// quitte à donner un type qui n'est pas prévu par glut, pour faire
// d'autres choses.
struct generic_mouse_handler
{
typedef mouse_event_registerer registerer_type;
};
// les struct héritent en public par défaut
struct null_mouse_handler : generic_mouse_handler
{
void execute(int button, int state, int x, int y)
{ }
};
template <
class WinEventHandler,
class MouseHandle = null_mouse_handler,
class KbHandler = null_kb_handler>
class glut_window
{
public:
typedef WinEventHandler winevent_handle_type;
typedef MouseHandler mouse_handler_type;
typedef KbHandler kb_handler_type;
private:
static void handle_mouse_event(int button, int state, int x, int y)
{
mouse_handler_type::execute(button, state, x, y);
}
...
public:
glut_window()
{
event_traits<mouse_handler_type>::do_register(handle_mouse_event);
}
}; |
Partager