1 /**
2  * このモジュールをユーザーが直接使用することはありません。
3  */
4 
5 module grape.event;
6 
7 import derelict.sdl2.sdl;
8 
9 enum {
10   /*
11   SDL_FIRSTEVENT,
12   SDL_QUIT,
13   SDL_WINDOWEVENT,
14   SDL_SYSWMEVENT,
15   */
16   KeyDown = SDL_KEYDOWN,
17   KeyUp = SDL_KEYUP,
18   /*
19   SDL_TEXTEDITING,
20   SDL_TEXTINPUT,
21   */
22   MouseMotion = SDL_MOUSEMOTION,
23   MouseButtonDown = SDL_MOUSEBUTTONDOWN,
24   MouseButtonUp = SDL_MOUSEBUTTONUP,
25   MouseWheel = SDL_MOUSEWHEEL,
26   JoyAxisMotion = SDL_JOYAXISMOTION,
27   JoyBallMotion = SDL_JOYBALLMOTION,
28   JoyHatMotion = SDL_JOYHATMOTION,
29   JoyButtonDown = SDL_JOYBUTTONDOWN,
30   JoyButtonUp = SDL_JOYBUTTONUP,
31   JoyDeviceAdded = SDL_JOYDEVICEADDED,
32   JoyDeviceRemoved = SDL_JOYDEVICEREMOVED,
33   /*
34   SDL_CONTROLLERAXISMOTION,
35   SDL_CONTROLLERBUTTONDOWN,
36   SDL_CONTROLLERBUTTONUP,
37   SDL_CONTROLLERDEVICEADDED,
38   SDL_CONTROLLERDEVICEREMOVED,
39   SDL_CONTROLLERDEVICEREMAPPED,
40   SDL_FINGERDOWN,
41   SDL_FINGERUP,
42   SDL_FINGERMOTION,
43   SDL_DOLLARGESTURE,
44   SDL_DOLLARRECORD,
45   SDL_MULTIGESTURE,
46   SDL_CLIPBOARDUPDATE,
47   SDL_DROPFILE,
48   SDL_USEREVENT,
49   SDL_LASTEVENT
50   */
51 }
52 
53 class Event {
54   private @disable this() {}
55 
56   public:
57     @property {
58       static bool is_happening() {
59         return SDL_PollEvent(&_event) ? true : false;
60       }
61 
62       static Uint32 type() {
63         return _event.type;
64       }
65 
66       mixin KeyEvent;
67       mixin JoyEvent;
68     }
69 
70   private:
71     static SDL_Event _event;
72 }
73 
74 mixin template KeyEvent() {
75   static SDL_Keysym keysym() {
76     return _event.key.keysym;
77   }
78 
79   static SDL_Scancode scancode() {
80     return keysym.scancode;
81   }
82 
83   static SDL_Keycode keycode() {
84     return keysym.sym;
85   }
86 }
87 
88 mixin template JoyEvent() {
89   static Uint8 button() {
90     return _event.jbutton.button;
91   }
92 
93   static Uint8 hat() {
94     return _event.jhat.hat;
95   }
96 
97   static Uint8 axis() {
98     return _event.jaxis.axis;
99   }
100 }
101