2d9d3168a2b25209656a9321ea1b26c47347b6f5
[framework/uifw/ecore.git] / src / lib / ecore_sdl / ecore_sdl.c
1 #include <SDL/SDL.h>
2
3 #include "Ecore_Sdl.h"
4 #include "ecore_private.h"
5 #include "Ecore.h"
6 #include "Ecore_Data.h"
7 #include "Ecore_Sdl_Keys.h"
8
9 EAPI int ECORE_SDL_EVENT_KEY_DOWN = 0;
10 EAPI int ECORE_SDL_EVENT_KEY_UP = 0;
11 EAPI int ECORE_SDL_EVENT_MOUSE_BUTTON_DOWN = 0;
12 EAPI int ECORE_SDL_EVENT_MOUSE_BUTTON_UP = 0;
13 EAPI int ECORE_SDL_EVENT_MOUSE_MOVE = 0;
14 EAPI int ECORE_SDL_EVENT_MOUSE_WHEEL = 0;
15 EAPI int ECORE_SDL_EVENT_GOT_FOCUS = 0;
16 EAPI int ECORE_SDL_EVENT_LOST_FOCUS = 0;
17 EAPI int ECORE_SDL_EVENT_RESIZE = 0;
18 EAPI int ECORE_SDL_EVENT_EXPOSE = 0;
19
20 static int _ecore_sdl_init_count = 0;
21
22 /**
23  * @defgroup Ecore_Sdl_Library_Group Framebuffer Library Functions
24  *
25  * Functions used to set up and shut down the Ecore_Framebuffer functions.
26  */
27
28 /**
29  * Sets up the Ecore_Sdl library.
30  * @param   name device target name
31  * @return  @c 0 on failure.  Otherwise, the number of times the library has
32  *          been initialised without being shut down.
33  * @ingroup Ecore_SDL_Library_Group
34  */
35 EAPI int
36 ecore_sdl_init(const char *name __UNUSED__)
37 {
38         if(!_ecore_sdl_init_count)
39         {
40                 ECORE_SDL_EVENT_KEY_DOWN          = ecore_event_type_new();
41                 ECORE_SDL_EVENT_KEY_UP            = ecore_event_type_new();
42                 ECORE_SDL_EVENT_MOUSE_BUTTON_DOWN = ecore_event_type_new();
43                 ECORE_SDL_EVENT_MOUSE_BUTTON_UP   = ecore_event_type_new();
44                 ECORE_SDL_EVENT_MOUSE_MOVE        = ecore_event_type_new();
45                 ECORE_SDL_EVENT_MOUSE_WHEEL       = ecore_event_type_new();
46                 ECORE_SDL_EVENT_GOT_FOCUS         = ecore_event_type_new();
47                 ECORE_SDL_EVENT_LOST_FOCUS        = ecore_event_type_new();
48                 ECORE_SDL_EVENT_RESIZE            = ecore_event_type_new();
49                 ECORE_SDL_EVENT_EXPOSE            = ecore_event_type_new();
50         }
51         return ++_ecore_sdl_init_count;
52 }
53
54 /**
55  * Shuts down the Ecore_Sdl library.
56  * @return  @c The number of times the system has been initialised without
57  *             being shut down.
58  * @ingroup Ecore_SDL_Library_Group
59  */
60 EAPI int
61 ecore_sdl_shutdown(void)
62 {
63         _ecore_sdl_init_count--;
64         return _ecore_sdl_init_count;
65 }
66
67 EAPI void
68 ecore_sdl_feed_events(void)
69 {
70    SDL_Event    event;
71    unsigned int time;
72
73    while(SDL_PollEvent(&event))
74      {
75         time = (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff);
76         switch(event.type)
77           {
78           case SDL_MOUSEMOTION:
79           {
80              Ecore_Sdl_Event_Mouse_Move *ev;
81
82              ev = malloc(sizeof(Ecore_Sdl_Event_Mouse_Move));
83              ev->x = event.motion.x;
84              ev->y = event.motion.y;
85              ev->time = time;
86
87              ecore_event_add(ECORE_SDL_EVENT_MOUSE_MOVE, ev, NULL, NULL);
88              break;
89           }
90           case SDL_MOUSEBUTTONDOWN:
91           {
92              if (event.button.button == SDL_BUTTON_WHEELUP ||
93                  event.button.button == SDL_BUTTON_WHEELDOWN)
94                {
95                   Ecore_Sdl_Event_Mouse_Wheel   *ev;
96
97                   ev = malloc(sizeof (Ecore_Sdl_Event_Mouse_Wheel));
98                   ev->x = event.button.x;
99                   ev->y = event.button.y;
100                   ev->direction = 0;
101                   ev->wheel = event.button.button == SDL_BUTTON_WHEELDOWN ? -1 : 1;
102                   ev->time = time;
103
104                   ecore_event_add(ECORE_SDL_EVENT_MOUSE_WHEEL, ev, NULL, NULL);
105                }
106              else
107                {
108                   Ecore_Sdl_Event_Mouse_Button_Down  *ev;
109
110                   ev = malloc(sizeof (Ecore_Sdl_Event_Mouse_Button_Down));
111                   ev->x = event.button.x;
112                   ev->y = event.button.y;
113                   ev->button = event.button.button;
114                   ev->double_click = 0;
115                   ev->triple_click = 0;
116                   ev->time = time;
117
118                   ecore_event_add(ECORE_SDL_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);
119                }
120              break;
121           }
122           case SDL_MOUSEBUTTONUP:
123           {
124              Ecore_Sdl_Event_Mouse_Button_Up  *ev;
125
126              ev = malloc(sizeof (Ecore_Sdl_Event_Mouse_Button_Up));
127              ev->x = event.button.x;
128              ev->y = event.button.y;
129              ev->button = event.button.button;
130              ev->double_click = 0;
131              ev->triple_click = 0;
132              ev->time = time;
133
134              ecore_event_add(ECORE_SDL_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);
135              break;
136           }
137           case SDL_VIDEORESIZE:
138           {
139              Ecore_Sdl_Event_Video_Resize       *ev;
140
141              ev = malloc(sizeof (Ecore_Sdl_Event_Video_Resize));
142              ev->w = event.resize.w;
143              ev->h = event.resize.h;
144
145              ecore_event_add(ECORE_SDL_EVENT_RESIZE, ev, NULL, NULL);
146              break;
147           }
148           case SDL_VIDEOEXPOSE:
149              ecore_event_add(ECORE_SDL_EVENT_EXPOSE, NULL, NULL, NULL);
150              break;
151           case SDL_QUIT:
152              ecore_main_loop_quit();
153              break;
154
155           case SDL_KEYDOWN:
156           {
157              Ecore_Sdl_Event_Key_Down   *ev;
158              unsigned int               i;
159
160              ev = malloc(sizeof (Ecore_Sdl_Event_Key_Down));
161              ev->time = time;
162
163              for (i = 0; i < sizeof (keystable) / sizeof (struct _ecore_sdl_keys_s); ++i)
164                if (keystable[i].code == event.key.keysym.sym)
165                  {
166                     ev->keyname = keystable[i].name;
167                     ev->keycompose = keystable[i].compose;
168
169                     ecore_event_add(ECORE_SDL_EVENT_KEY_DOWN, ev, NULL, NULL);
170                     return ;
171                  }
172
173              free(ev);
174              break;
175           }
176           case SDL_KEYUP:
177           {
178              Ecore_Sdl_Event_Key_Up     *ev;
179              unsigned int               i;
180
181              ev = malloc(sizeof (Ecore_Sdl_Event_Key_Up));
182              ev->time = time;
183
184              for (i = 0; i < sizeof (keystable) / sizeof (struct _ecore_sdl_keys_s); ++i)
185                if (keystable[i].code == event.key.keysym.sym)
186                  {
187                     ev->keyname = keystable[i].name;
188                     ev->keycompose = keystable[i].compose;
189
190                     ecore_event_add(ECORE_SDL_EVENT_KEY_UP, ev, NULL, NULL);
191                     return ;
192                  }
193
194              free(ev);
195              break;
196           }
197           case SDL_ACTIVEEVENT:
198              /* FIXME: Focus gain. */
199              break;
200           case SDL_SYSWMEVENT:
201           case SDL_USEREVENT:
202           case SDL_JOYAXISMOTION:
203           case SDL_JOYBALLMOTION:
204           case SDL_JOYHATMOTION:
205           case SDL_JOYBUTTONDOWN:
206           case SDL_JOYBUTTONUP:
207           default:
208              break;
209           }
210      }
211 }