svn update: 48958 (latest:48959)
[framework/uifw/ecore.git] / src / lib / ecore_directfb / ecore_directfb.c
1 /*
2  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3  */
4
5 #ifdef HAVE_CONFIG_H
6 # include <config.h>
7 #endif
8
9 #include <stdio.h>
10 #include <string.h>
11
12 #include "Ecore_DirectFB.h"
13 #include "ecore_directfb_private.h"
14 #include "ecore_directfb_keys.h"
15 #include "Ecore.h"
16 #include "ecore_private.h"
17
18 /* ecore_directfb */
19 /******************/
20 /* About */
21 /* with this you can create windows of directfb and handle events through ecore
22  * TODO:
23  * - handle all event types
24  * - 
25  * */
26 int _ecore_directfb_log_dom = -1;
27
28
29 static int _ecore_directfb_init_count = 0;
30
31 static int _window_event_fd = 0;
32 static int _input_event_fd = 0;
33
34 static int _ecore_directfb_fullscreen_window_id = 0;
35 static int _cursor_x = 0;
36 static int _cursor_y = 0;
37
38 EAPI int ECORE_DIRECTFB_EVENT_POSITION = 0;
39 EAPI int ECORE_DIRECTFB_EVENT_SIZE = 0;
40 EAPI int ECORE_DIRECTFB_EVENT_CLOSE = 0;
41 EAPI int ECORE_DIRECTFB_EVENT_DESTROYED = 0;
42 EAPI int ECORE_DIRECTFB_EVENT_GOT_FOCUS = 0;
43 EAPI int ECORE_DIRECTFB_EVENT_LOST_FOCUS = 0;
44 EAPI int ECORE_DIRECTFB_EVENT_KEY_DOWN = 0;
45 EAPI int ECORE_DIRECTFB_EVENT_KEY_UP = 0;
46 EAPI int ECORE_DIRECTFB_EVENT_BUTTON_DOWN = 0;
47 EAPI int ECORE_DIRECTFB_EVENT_BUTTON_UP = 0;
48 EAPI int ECORE_DIRECTFB_EVENT_MOTION = 0;
49 EAPI int ECORE_DIRECTFB_EVENT_ENTER = 0;
50 EAPI int ECORE_DIRECTFB_EVENT_LEAVE = 0;
51 EAPI int ECORE_DIRECTFB_EVENT_WHEEL = 0;
52
53
54 static Ecore_Fd_Handler *_window_event_fd_handler_handle = NULL;
55 static Ecore_Fd_Handler *_input_event_fd_handler_handle = NULL;
56
57 /* this hash is to store all the possible key names for fast lookup */
58 static Eina_Hash *_ecore_directfb_key_symbols_hash = NULL;
59
60
61 static IDirectFB *_dfb = NULL;                  // the main interface
62 static IDirectFBEventBuffer *_window_event;     // the main event buffer (all windows are attached to this)
63 static IDirectFBEventBuffer *_input_event;      // the main event buffer (all windows are attached to this)
64 static IDirectFBDisplayLayer *_layer;           // the main layer
65 static DFBResult _err;                          // usefull for DFBCHECK
66
67
68 /*******************/
69 /* local functions */
70 /*******************/
71
72 /* free ecore directfb events functions */
73 /****************************************/
74
75 static void 
76 _ecore_directfb_event_free_key_down(void *data __UNUSED__, void *ev)
77 {
78    Ecore_DirectFB_Event_Key_Up *e;
79    
80    e = ev;
81    if(e->name) free(e->name);
82    if (e->string) free(e->string);
83    if (e->key_compose) free(e->key_compose);
84    free(e);
85 }
86
87 static void
88 _ecore_directfb_event_free_key_up(void *data __UNUSED__, void *ev)
89 {
90    Ecore_DirectFB_Event_Key_Up *e;
91    
92    e = ev;
93    if(e->name) free(e->name);
94    if (e->string) free(e->string);
95    if (e->key_compose) free(e->key_compose);
96    free(e);
97 }
98
99
100 /* directfb window input events handler */
101 /****************************************/
102
103 static void
104 _ecore_directfb_event_handle_motion(DFBEvent *evt)
105 {
106
107         Ecore_DirectFB_Event_Motion *e;
108         e = calloc(1, sizeof(Ecore_DirectFB_Event_Motion));
109
110         switch(evt->clazz)
111         {
112                 case DFEC_INPUT:
113                         e->modifiers = 0;
114                         switch(evt->input.axis)
115                         {
116                                 case DIAI_X:
117                                         e->x = _cursor_x = evt->input.axisabs;
118                                         e->y = _cursor_y;
119                                         break;
120                                 case DIAI_Y:
121                                         e->y = _cursor_y = evt->input.axisabs;
122                                         e->x = _cursor_x;
123                                         break;
124                                 case DIAI_Z:
125                                         //_ecore_directfb_event_handle_wheel(evt);
126                                         return;
127                                 default:
128                                         return;
129                         }
130                         e->win = _ecore_directfb_fullscreen_window_id;
131                         e->time = 0;
132                         break;
133               
134                 case DFEC_WINDOW:
135                         e->modifiers = 0;
136                         e->x = evt->window.x;
137                         e->y = evt->window.y;
138                         e->win = evt->window.window_id;
139                         e->time = 0;
140                         break;
141                 default:
142                         break;
143         }
144         ecore_event_add(ECORE_DIRECTFB_EVENT_MOTION, e, NULL, NULL);
145 }
146 static void
147 _ecore_directfb_event_handle_key_down(DFBEvent *evt)
148 {
149
150         Ecore_DirectFB_Event_Key_Down *e;
151         unsigned int key_symbol;
152         struct keymap *k;
153         
154         e = calloc(1, sizeof(Ecore_DirectFB_Event_Key_Down));
155         
156         switch(evt->clazz)
157         {
158                 case DFEC_INPUT:
159                         key_symbol = evt->input.key_symbol;
160                         k = eina_hash_find(_ecore_directfb_key_symbols_hash, &key_symbol);
161
162                         if(!k) 
163                         {
164                                 ERR("error en el numero, %0X", evt->input.key_symbol);
165                                 return;
166                         }
167                         e->name = strdup(k->name);
168                         e->string = strdup(k->string);
169                         e->key_compose = NULL;
170                         e->win = _ecore_directfb_fullscreen_window_id;
171                         e->time = 0;
172                         break;
173               
174                 case DFEC_WINDOW:
175                         key_symbol = evt->window.key_symbol;
176                         k = eina_hash_find(_ecore_directfb_key_symbols_hash, &key_symbol);
177
178                         if(!k) 
179                         {
180                                 ERR("error en el numero, %0X", evt->window.key_symbol);
181                                 return;
182                         }
183                         e->name = strdup(k->name);
184                         e->string = strdup(k->string);
185                         e->key_compose = NULL;
186                         e->win = evt->window.window_id;
187                         e->time = 0;
188                         break;
189                 default:
190                         break;
191         }
192                                 
193         ecore_event_add(ECORE_DIRECTFB_EVENT_KEY_DOWN, e, _ecore_directfb_event_free_key_down, NULL);
194 }
195 static void
196 _ecore_directfb_event_handle_key_up(DFBEvent *evt)
197 {
198         Ecore_DirectFB_Event_Key_Up *e;
199         unsigned int key_symbol;
200         struct keymap *k;
201         
202         e = calloc(1, sizeof(Ecore_DirectFB_Event_Key_Up));
203         
204         switch(evt->clazz)
205         {
206                 case DFEC_INPUT:
207                         key_symbol = evt->input.key_symbol;
208                         k = eina_hash_find(_ecore_directfb_key_symbols_hash, &key_symbol);
209
210                         
211                         if(!k) 
212                         {
213                                 ERR("error en el numero, %0X", evt->input.key_symbol);
214                                 return;
215                         }
216                         e->name = strdup(k->name);
217                         e->string = strdup(k->string);
218                         e->key_compose = NULL;
219                         e->win = _ecore_directfb_fullscreen_window_id;
220                         e->time = 0;
221                         break;
222               
223                 case DFEC_WINDOW:
224                         key_symbol = evt->window.key_symbol;
225                         k = eina_hash_find(_ecore_directfb_key_symbols_hash, &key_symbol);
226
227                         if(!k) 
228                         {
229                                 ERR("error en el numero, %0X", evt->window.key_symbol);
230                                 return;
231                         }
232                         e->name = strdup(k->name);
233                         e->string = strdup(k->string);
234                         e->key_compose = NULL;
235                         e->win = evt->window.window_id;
236                         e->time = 0;
237                         break;
238                 default:
239                         break;
240         }
241         ecore_event_add(ECORE_DIRECTFB_EVENT_KEY_UP, e, _ecore_directfb_event_free_key_up, NULL);
242
243 }
244
245 static void
246 _ecore_directfb_event_handle_button_down(DFBEvent *evt)
247 {
248         Ecore_DirectFB_Event_Button_Down *e;
249         e = calloc(1, sizeof(Ecore_DirectFB_Event_Button_Down));
250
251         switch(evt->clazz)
252         {
253                 case DFEC_INPUT:
254                         e->button = evt->input.button + 1;
255                         e->modifiers = 0;
256                         DFBCHECK(_layer->GetCursorPosition(_layer,&e->x,&e->y));
257                         e->x = _cursor_x;
258                         e->y = _cursor_y;
259                         e->win = _ecore_directfb_fullscreen_window_id;
260                         e->time = 0;
261                         
262                         break;
263               
264                 case DFEC_WINDOW:
265                         e->button = evt->window.button + 1;
266                         e->modifiers = 0;
267                         e->x = evt->window.x;
268                         e->y = evt->window.y;
269                         e->win = evt->window.window_id;
270                         e->time = 0;
271                         break;
272                 default:
273                         break;
274         }
275                         
276         ecore_event_add(ECORE_DIRECTFB_EVENT_BUTTON_DOWN, e, NULL, NULL);
277
278 }
279
280 static void
281 _ecore_directfb_event_handle_button_up(DFBEvent *evt)
282 {
283         Ecore_DirectFB_Event_Button_Up *e;
284         e = calloc(1, sizeof(Ecore_DirectFB_Event_Button_Up));
285
286         switch(evt->clazz)
287         {
288                 case DFEC_INPUT:
289                         e->button = evt->input.button + 1;
290                         e->modifiers = 0;
291                         e->x = _cursor_x;
292                         e->y = _cursor_y; 
293                         e->win = _ecore_directfb_fullscreen_window_id;
294                         e->time = 0;
295                         
296                         break;
297               
298                 case DFEC_WINDOW:
299                         e->button = evt->window.button + 1;
300                         e->modifiers = 0;
301                         e->x = evt->window.x;
302                         e->y = evt->window.y;
303                         e->win = evt->window.window_id;
304                         e->time = 0;
305                         break;
306                 default:
307                         break;
308         }
309         ecore_event_add(ECORE_DIRECTFB_EVENT_BUTTON_UP, e, NULL, NULL);
310
311 }
312
313 static void
314 _ecore_directfb_event_handle_enter(DFBWindowEvent *evt)
315 {
316         Ecore_DirectFB_Event_Enter *e;
317         e = calloc(1, sizeof(Ecore_DirectFB_Event_Enter));
318
319         e->modifiers = 0;
320         e->x = evt->x;
321         e->y = evt->y;
322         e->win = evt->window_id;
323         e->time = 0;
324                         
325         ecore_event_add(ECORE_DIRECTFB_EVENT_ENTER, e, NULL, NULL);
326
327 }
328
329 static void
330 _ecore_directfb_event_handle_leave(DFBWindowEvent *evt)
331 {
332         Ecore_DirectFB_Event_Leave *e;
333         e = calloc(1, sizeof(Ecore_DirectFB_Event_Leave));
334
335         e->modifiers = 0;
336         e->x = evt->x;
337         e->y = evt->y;
338         e->win = evt->window_id;
339         e->time = 0;
340                         
341         ecore_event_add(ECORE_DIRECTFB_EVENT_LEAVE, e, NULL, NULL);
342
343 }
344
345 static void
346 _ecore_directfb_event_handle_wheel(DFBWindowEvent *evt)
347 {
348         Ecore_DirectFB_Event_Wheel *e;
349         e = calloc(1, sizeof(Ecore_DirectFB_Event_Wheel));
350
351         // currently there's no direction (only up/down);
352         e->direction = 0;
353         e->z = evt->step;
354         e->modifiers = 0;
355         e->win = evt->window_id;
356         e->time = 0;
357                         
358         ecore_event_add(ECORE_DIRECTFB_EVENT_WHEEL, e, NULL, NULL);
359
360 }
361
362 static void
363 _ecore_directfb_event_handle_got_focus(DFBWindowEvent *evt)
364 {
365         Ecore_DirectFB_Event_Got_Focus *e;
366         e = calloc(1, sizeof(Ecore_DirectFB_Event_Got_Focus));
367
368         e->win = evt->window_id;
369         e->time = 0;
370                         
371         ecore_event_add(ECORE_DIRECTFB_EVENT_GOT_FOCUS, e, NULL, NULL);
372
373 }
374
375 static void
376 _ecore_directfb_event_handle_lost_focus(DFBWindowEvent *evt)
377 {
378         Ecore_DirectFB_Event_Lost_Focus *e;
379         e = calloc(1, sizeof(Ecore_DirectFB_Event_Lost_Focus));
380
381         e->win = evt->window_id;
382         e->time = 0;
383                         
384         ecore_event_add(ECORE_DIRECTFB_EVENT_LOST_FOCUS, e, NULL, NULL);
385
386 }
387
388
389 /* inputs and windows fds handlers */
390 /***********************************/
391 /* TODO fix this to handle windows and input events (fullscreen/window mode)
392  * in fullscreen theres no window_id so get the id from a global var (only one fullscreen
393  * window at a time */
394
395
396 static int
397 _ecore_directfb_input_event_fd_handler(void *data __UNUSED__,Ecore_Fd_Handler *fd_handler __UNUSED__)
398 {
399         DFBEvent evt;
400         int v = 0;
401                 
402         v = read(_input_event_fd, &evt, sizeof(DFBEvent));
403         if (v < 0) return 1;
404         if (v < 1) return 1;
405         
406         /* we are getting duplicate events, only parse if we are in fullscreen */
407         //if(_ecore_directfb_fullscreen_window_id == 0) break;
408         if(evt.input.type == DIET_KEYPRESS)
409                 _ecore_directfb_event_handle_key_down(&evt);
410         if(evt.input.type == DIET_KEYRELEASE)
411                 _ecore_directfb_event_handle_key_up(&evt);
412         if(evt.input.type == DIET_BUTTONPRESS)
413                 _ecore_directfb_event_handle_button_down(&evt);
414         if(evt.input.type == DIET_BUTTONRELEASE)
415                 _ecore_directfb_event_handle_button_up(&evt);
416         if(evt.input.type == DIET_AXISMOTION)
417                 _ecore_directfb_event_handle_motion(&evt);
418
419         return 1;
420 }
421         
422 static int
423 _ecore_directfb_window_event_fd_handler(void *data __UNUSED__,Ecore_Fd_Handler *fd_handler __UNUSED__)
424 {
425         DFBEvent evt;
426         int v = 0;
427                 
428         v = read(_window_event_fd, &evt, sizeof(DFBEvent));
429         if (v < 0) return 1;
430         if (v < 1) return 1;
431                         
432         if(evt.window.type & DWET_POSITION)
433                 INF("position");
434         if(evt.window.type & DWET_SIZE)
435                 INF("size");
436         if(evt.window.type & DWET_CLOSE)
437                 INF("close");
438         if(evt.window.type & DWET_DESTROYED)
439                 INF("destroyed");
440         if(evt.window.type & DWET_GOTFOCUS)
441                 _ecore_directfb_event_handle_got_focus(&evt.window);
442         if(evt.window.type & DWET_LOSTFOCUS)
443                 _ecore_directfb_event_handle_lost_focus(&evt.window);
444         if(evt.window.type & DWET_KEYDOWN)
445                 _ecore_directfb_event_handle_key_down(&evt);
446         if(evt.window.type & DWET_KEYUP)
447                 _ecore_directfb_event_handle_key_up(&evt);
448         if(evt.window.type & DWET_BUTTONDOWN)
449                 _ecore_directfb_event_handle_button_down(&evt);
450         if(evt.window.type & DWET_BUTTONUP)
451                 _ecore_directfb_event_handle_button_up(&evt);
452         if(evt.window.type & DWET_MOTION)
453                 _ecore_directfb_event_handle_motion(&evt);
454         if(evt.window.type & DWET_ENTER)
455                 _ecore_directfb_event_handle_enter(&evt.window);
456         if(evt.window.type & DWET_LEAVE)
457                 _ecore_directfb_event_handle_leave(&evt.window);
458         if(evt.window.type & DWET_WHEEL)
459                 _ecore_directfb_event_handle_wheel(&evt.window);
460         return 1;
461 }
462         
463 /* api functions */
464 /*****************/
465
466
467 EAPI IDirectFB *
468 ecore_directfb_interface_get(void)
469 {
470         return _dfb;
471 }
472
473
474
475 EAPI Ecore_DirectFB_Window *
476 ecore_directfb_window_new(int x, int y, int w, int h)
477 {
478         Ecore_DirectFB_Window *window;
479         IDirectFBWindow *dfb_window;
480         IDirectFBSurface *dfb_surface = NULL;
481         DFBWindowDescription desc;
482         DFBWindowID id;
483         
484         memset(&desc, 0, sizeof(DFBWindowDescription));
485         desc.flags = (DWDESC_POSX | DWDESC_POSY | DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_CAPS);
486         desc.posx = x;
487         desc.posy = y;
488         desc.width = w;
489         desc.height = h;
490         desc.caps = DWCAPS_ALPHACHANNEL;
491         
492         DFBCHECK(_layer->CreateWindow(_layer, &desc, &dfb_window));
493         
494         dfb_window->AttachEventBuffer(dfb_window, _window_event);
495         dfb_window->SetOptions(dfb_window,DWOP_NONE);
496         dfb_window->SetOpacity(dfb_window, 0xFF);
497         
498         DFBCHECK(dfb_window->GetID(dfb_window, &id));
499         DFBCHECK(dfb_window->GetSurface(dfb_window,&dfb_surface));
500         
501         window = malloc(sizeof(Ecore_DirectFB_Window)); 
502         window->id = id;
503         window->window = dfb_window;
504         window->surface = dfb_surface;
505         window->cursor = NULL;
506
507         return window;
508 }
509
510 EAPI void
511 ecore_directfb_window_free(Ecore_DirectFB_Window *ecore_window)
512 {
513         DFBCHECK(ecore_window->surface->Release(ecore_window->surface));
514         DFBCHECK(ecore_window->window->Release(ecore_window->window));
515         free(ecore_window);
516 }
517
518
519 EAPI void
520 ecore_directfb_window_move(Ecore_DirectFB_Window *ecore_window, int x, int y)
521 {
522         DFBCHECK(ecore_window->window->MoveTo(ecore_window->window, x, y));
523 }
524
525 EAPI void
526 ecore_directfb_window_resize(Ecore_DirectFB_Window *ecore_window, int w, int h)
527 {
528         DFBCHECK(ecore_window->window->Resize(ecore_window->window, w, h));
529 }
530
531 EAPI void 
532 ecore_directfb_window_focus(Ecore_DirectFB_Window *ecore_window)
533 {       
534         DFBCHECK(ecore_window->window->RequestFocus(ecore_window->window));     
535 }
536
537 EAPI void 
538 ecore_directfb_window_hide(Ecore_DirectFB_Window *ecore_window)
539 {
540         DFBCHECK(ecore_window->window->SetOpacity(ecore_window->window,0));
541
542 }
543
544 EAPI void
545 ecore_directfb_window_show(Ecore_DirectFB_Window *ecore_window)
546 {
547         DFBCHECK(ecore_window->window->SetOpacity(ecore_window->window, 0xFF));
548 }
549
550 EAPI void
551 ecore_directfb_window_shaped_set(Ecore_DirectFB_Window *ecore_window, int set)
552 {
553         DFBWindowOptions opts;
554         
555         DFBCHECK(ecore_window->window->GetOptions(ecore_window->window, &opts));
556         if(set)
557         {
558                 opts |= DWOP_SHAPED;
559                 opts |= DWOP_ALPHACHANNEL;
560                 DFBCHECK(ecore_window->window->SetOptions(ecore_window->window, opts));
561         }
562         else
563         {
564                 opts &= ~DWOP_SHAPED;
565                 opts &= ~DWOP_ALPHACHANNEL;
566                 DFBCHECK(ecore_window->window->SetOptions(ecore_window->window, opts));
567         }
568 }
569
570 EAPI void
571 ecore_directfb_window_cursor_show(Ecore_DirectFB_Window *ecore_window, int show)
572 {
573         if(!show)
574         {
575                 /* create an empty cursor and set it */
576                 IDirectFBSurface *cursor;
577                 DFBSurfaceDescription desc;
578                         
579                 memset(&desc, 0, sizeof(DFBSurfaceDescription));
580                 desc.flags = (DSDESC_HEIGHT | DSDESC_WIDTH | DSDESC_PIXELFORMAT);
581                 desc.width = 1;
582                 desc.height = 1;
583                 desc.pixelformat = DSPF_A1;
584                         
585                 DFBCHECK(_dfb->CreateSurface(_dfb,&desc,&cursor));
586                 DFBCHECK(cursor->Clear(cursor,0,0,0,0));
587                 DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, cursor, 0, 0));
588         }
589         else
590         {
591                 /* we already have a cursor surface so set it*/
592                 if(ecore_window->cursor)
593                 {
594                         DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, ecore_window->cursor->surface, ecore_window->cursor->hot_x, ecore_window->cursor->hot_y));
595                 }
596                 /* or just set the default directfb cursor */
597                 else
598                 {
599                         DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, NULL, 0, 0));
600                 }
601                         
602         }
603 }
604
605 EAPI void
606 ecore_directfb_window_cursor_set(Ecore_DirectFB_Window *ecore_window, Ecore_DirectFB_Cursor *cursor)
607 {
608         if( (!cursor) && (ecore_window->cursor))
609         {
610                 ecore_window->cursor = NULL;
611                 DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, NULL, 0, 0));
612                 return;
613         }
614         if(cursor)      
615         {
616                 ecore_window->cursor = cursor;
617                 DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, cursor->surface, cursor->hot_x, cursor->hot_y));
618                 
619         }
620
621 }
622
623 EAPI void 
624 ecore_directfb_window_fullscreen_set(Ecore_DirectFB_Window *ecore_window, int on)
625 {
626         // always release the surface (we are going to get a new one in both cases)
627         DFBCHECK(ecore_window->surface->Release(ecore_window->surface));
628         if(on)
629         {
630                 DFBCHECK(_layer->SetCooperativeLevel(_layer,DLSCL_EXCLUSIVE));
631                 DFBCHECK(_layer->GetSurface(_layer,&ecore_window->surface));
632                 DFBCHECK(_dfb->CreateInputEventBuffer(_dfb, DICAPS_ALL, DFB_FALSE, &_input_event));
633                 DFBCHECK(_input_event->CreateFileDescriptor(_input_event,&_input_event_fd));
634                 /* the event of axismove sends one axis at a time, so we must store both */
635                 DFBCHECK(_layer->GetCursorPosition(_layer,&_cursor_x,&_cursor_y));
636                 
637                 _input_event_fd_handler_handle = ecore_main_fd_handler_add(_input_event_fd,ECORE_FD_READ,_ecore_directfb_input_event_fd_handler, NULL,NULL,NULL);
638                 _ecore_directfb_fullscreen_window_id = ecore_window->id;
639         }
640         else
641         {
642                 DFBCHECK(_input_event->Release(_input_event));  
643                 DFBCHECK(_layer->SetCooperativeLevel(_layer,DLSCL_SHARED));
644                 DFBCHECK(ecore_window->window->GetSurface(ecore_window->window, &ecore_window->surface));
645                 ecore_main_fd_handler_del(_input_event_fd_handler_handle);
646                 _ecore_directfb_fullscreen_window_id = 0;
647         }
648                 
649 }
650
651 EAPI void
652 ecore_directfb_window_size_get(Ecore_DirectFB_Window *ecore_window, int *w, int *h)
653 {
654         DFBCHECK(ecore_window->surface->GetSize(ecore_window->surface,w,h));
655         return;
656 }
657
658 EAPI int
659 ecore_directfb_init(const char *name __UNUSED__)
660 {
661         int i = 0;
662         
663         if (++_ecore_directfb_init_count != 1) return _ecore_directfb_init_count;
664         _ecore_directfb_log_dom = eina_log_domain_register("EcoreDirectFB", ECORE_DIRECTFB_DEFAULT_LOG_COLOR);
665         if(_ecore_directfb_log_dom < 0) 
666           {
667             EINA_LOG_ERR("Impossible to create a log domain for the Ecore directFB module.");
668             return _ecore_directfb_init_count--;
669           }
670         DFBCHECK(DirectFBInit(NULL,NULL));
671         DFBCHECK(DirectFBCreate(&_dfb));
672         
673         DFBCHECK(_dfb->GetDisplayLayer(_dfb, DLID_PRIMARY, &_layer));
674         DFBCHECK(_layer->SetCooperativeLevel(_layer, DLSCL_SHARED));
675         
676         
677         /* window events and fd */
678         DFBCHECK(_dfb->CreateEventBuffer(_dfb, &_window_event));
679         DFBCHECK(_window_event->CreateFileDescriptor(_window_event,&_window_event_fd));
680         _window_event_fd_handler_handle = ecore_main_fd_handler_add(_window_event_fd,ECORE_FD_READ,_ecore_directfb_window_event_fd_handler, NULL,NULL,NULL);
681         
682         /* register ecore directfb events */
683         ECORE_DIRECTFB_EVENT_POSITION   = ecore_event_type_new();
684         ECORE_DIRECTFB_EVENT_SIZE = ecore_event_type_new();;
685         ECORE_DIRECTFB_EVENT_CLOSE = ecore_event_type_new();;
686         ECORE_DIRECTFB_EVENT_DESTROYED = ecore_event_type_new();;
687         ECORE_DIRECTFB_EVENT_GOT_FOCUS = ecore_event_type_new();;
688         ECORE_DIRECTFB_EVENT_LOST_FOCUS = ecore_event_type_new();;
689         ECORE_DIRECTFB_EVENT_KEY_DOWN = ecore_event_type_new();;
690         ECORE_DIRECTFB_EVENT_KEY_UP = ecore_event_type_new();;
691         ECORE_DIRECTFB_EVENT_BUTTON_DOWN = ecore_event_type_new();;
692         ECORE_DIRECTFB_EVENT_BUTTON_UP = ecore_event_type_new();;
693         ECORE_DIRECTFB_EVENT_MOTION = ecore_event_type_new();;
694         ECORE_DIRECTFB_EVENT_ENTER = ecore_event_type_new();;
695         ECORE_DIRECTFB_EVENT_LEAVE = ecore_event_type_new();;
696         ECORE_DIRECTFB_EVENT_WHEEL = ecore_event_type_new();;
697
698         /* create the hash table for the keynames */
699         _ecore_directfb_key_symbols_hash = eina_hash_int32_new(free);
700         for(i=0; i<_ecore_directfb_key_symbols_count; i++)
701         {
702                 struct keymap *k;
703                 k = malloc(sizeof(struct keymap));
704                 k->name = _ecore_directfb_key_symbols[i].name;
705                 k->string = _ecore_directfb_key_symbols[i].string;
706                 eina_hash_add(_ecore_directfb_key_symbols_hash, &_ecore_directfb_key_symbols[i].id, k);
707         }
708         /* create the hash for the windows(key = windowid, val = Ecore_DirectFB_Window struct) */
709         return _ecore_directfb_init_count;
710 }
711
712 EAPI int
713 ecore_directfb_shutdown(void)
714 {
715         if (--_ecore_directfb_init_count != 0) return _ecore_directfb_init_count;
716
717         ecore_main_fd_handler_del(_window_event_fd_handler_handle);
718         eina_hash_free(_ecore_directfb_key_symbols_hash);
719
720         if(_ecore_directfb_fullscreen_window_id)
721         {
722                 DFBCHECK(_input_event->Release(_input_event));  
723                 ecore_main_fd_handler_del(_input_event_fd_handler_handle);
724         }
725         DFBCHECK(_window_event->Release(_window_event));        
726         DFBCHECK(_layer->Release(_layer));
727         DFBCHECK(_dfb->Release(_dfb));
728         eina_log_domain_unregister(_ecore_directfb_log_dom);
729         _ecore_directfb_log_dom = -1;
730         return _ecore_directfb_init_count;
731 }