3 #include "ecore_private.h"
4 #include "ecore_evas_private.h"
5 #include "Ecore_Evas.h"
6 #ifdef BUILD_ECORE_EVAS_DIRECTFB
7 #include "Ecore_DirectFB.h"
11 #ifdef BUILD_ECORE_EVAS_DIRECTFB
12 static int _ecore_evas_init_count = 0;
13 static int _ecore_evas_fps_debug = 0;
14 static Ecore_Event_Handler *ecore_evas_event_handlers[13];
16 static Ecore_Evas *ecore_evases = NULL;
17 static Evas_Hash *ecore_evases_hash = NULL;
19 static Ecore_Idle_Enterer *ecore_evas_directfb_idle_enterer = NULL;
22 _ecore_evas_directfb_render(Ecore_Evas *ee)
24 Evas_List *updates, *ll;
26 #ifdef BUILD_ECORE_EVAS_BUFFER
27 for (ll = ee->sub_ecore_evas; ll; ll = ll->next)
32 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
33 _ecore_evas_buffer_render(ee2);
34 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
37 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
38 updates = evas_render_updates(ee->evas);
41 evas_render_updates_free(updates);
42 _ecore_evas_idle_timeout_update(ee);
44 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
48 _ecore_evas_directfb_idle_enter(void *data __UNUSED__)
54 if (_ecore_evas_fps_debug)
56 t1 = ecore_time_get();
58 for (l = (Ecore_List2 *)ecore_evases; l; l = l->next)
63 _ecore_evas_directfb_render(ee);
65 if (_ecore_evas_fps_debug)
67 t2 = ecore_time_get();
68 _ecore_evas_fps_debug_rendertime_add(t2 - t1);
74 _ecore_evas_directfb_winid_str_get(Ecore_X_Window win)
76 const char *vals = "qWeRtYuIoP5-$&<~";
79 val = (unsigned int)win;
80 id[0] = vals[(val >> 28) & 0xf];
81 id[1] = vals[(val >> 24) & 0xf];
82 id[2] = vals[(val >> 20) & 0xf];
83 id[3] = vals[(val >> 16) & 0xf];
84 id[4] = vals[(val >> 12) & 0xf];
85 id[5] = vals[(val >> 8) & 0xf];
86 id[6] = vals[(val >> 4) & 0xf];
87 id[7] = vals[(val ) & 0xf];
94 _ecore_evas_directfb_match(DFBWindowID win)
98 ee = evas_hash_find(ecore_evases_hash, _ecore_evas_directfb_winid_str_get(win));
103 _ecore_evas_directfb_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp)
108 if (ee->prop.cursor.object)
110 evas_object_show(ee->prop.cursor.object);
111 if (ee->rotation == 0)
112 evas_object_move(ee->prop.cursor.object,x - ee->prop.cursor.hot.x,y - ee->prop.cursor.hot.y);
113 else if (ee->rotation == 90)
114 evas_object_move(ee->prop.cursor.object,
115 ee->h - y - 1 - ee->prop.cursor.hot.x,
116 x - ee->prop.cursor.hot.y);
117 else if (ee->rotation == 180)
118 evas_object_move(ee->prop.cursor.object,
119 ee->w - x - 1 - ee->prop.cursor.hot.x,
120 ee->h - y - 1 - ee->prop.cursor.hot.y);
121 else if (ee->rotation == 270)
122 evas_object_move(ee->prop.cursor.object,
123 y - ee->prop.cursor.hot.x,
124 ee->w - x - 1 - ee->prop.cursor.hot.y);
126 if (ee->rotation == 0)
127 evas_event_feed_mouse_move(ee->evas, x, y, timestamp, NULL);
128 else if (ee->rotation == 90)
129 evas_event_feed_mouse_move(ee->evas, ee->h - y - 1, x, timestamp, NULL);
130 else if (ee->rotation == 180)
131 evas_event_feed_mouse_move(ee->evas, ee->w - x - 1, ee->h - y - 1, timestamp, NULL);
132 else if (ee->rotation == 270)
133 evas_event_feed_mouse_move(ee->evas, y, ee->w - x - 1, timestamp, NULL);
138 _ecore_evas_directfb_event_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
141 Ecore_DirectFB_Event_Key_Down *e;
144 ee = _ecore_evas_directfb_match(e->win);
146 if (!ee) return 1; /* pass on event */
147 evas_event_feed_key_down(ee->evas, e->name, NULL, e->string, e->key_compose, e->time, NULL);
152 _ecore_evas_directfb_event_key_up(void *data __UNUSED__, int type __UNUSED__, void *event)
155 Ecore_DirectFB_Event_Key_Up *e;
158 ee = _ecore_evas_directfb_match(e->win);
160 if (!ee) return 1; /* pass on event */
161 evas_event_feed_key_up(ee->evas, e->name, NULL, e->string, e->key_compose, e->time, NULL);
166 _ecore_evas_directfb_event_motion(void *data __UNUSED__, int type __UNUSED__, void *event)
169 Ecore_DirectFB_Event_Motion *e;
172 ee = _ecore_evas_directfb_match(e->win);
174 if (!ee) return 1; /* pass on event */
175 _ecore_evas_directfb_mouse_move_process(ee, e->x, e->y, e->time);
180 _ecore_evas_directfb_event_button_down(void *data __UNUSED__, int type __UNUSED__, void *event)
183 Ecore_DirectFB_Event_Button_Down *e;
186 ee = _ecore_evas_directfb_match(e->win);
188 if (!ee) return 1; /* pass on event */
189 // _ecore_evas_directfb_mouse_move_process(ee, e->x, e->y, e->time);
190 evas_event_feed_mouse_down(ee->evas, e->button, EVAS_BUTTON_NONE, e->time, NULL);
195 _ecore_evas_directfb_event_button_up(void *data __UNUSED__, int type __UNUSED__, void *event)
198 Ecore_DirectFB_Event_Button_Up *e;
199 Evas_Button_Flags flags = EVAS_BUTTON_NONE;
202 ee = _ecore_evas_directfb_match(e->win);
204 if (!ee) return 1; /* pass on event */
205 //_ecore_evas_directfb_mouse_move_process(ee, e->x, e->y, e->time);
206 evas_event_feed_mouse_up(ee->evas, e->button, flags, e->time, NULL);
211 _ecore_evas_directfb_event_enter(void *data __UNUSED__, int type __UNUSED__, void *event)
214 Ecore_DirectFB_Event_Enter *e;
217 ee = _ecore_evas_directfb_match(e->win);
219 if (!ee) return 1; /* pass on event */
220 evas_event_feed_mouse_in(ee->evas, e->time, NULL);
221 //_ecore_evas_directfb_mouse_move_process(ee, e->x, e->y, e->time);
226 _ecore_evas_directfb_event_leave(void *data __UNUSED__, int type __UNUSED__, void *event)
229 Ecore_DirectFB_Event_Leave *e;
232 ee = _ecore_evas_directfb_match(e->win);
234 if (!ee) return 1; /* pass on event */
235 evas_event_feed_mouse_out(ee->evas, e->time, NULL);
236 //_ecore_evas_directfb_mouse_move_process(ee, e->x, e->y, e->time);
237 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
238 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
243 _ecore_evas_directfb_event_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
246 Ecore_DirectFB_Event_Wheel *e;
249 ee = _ecore_evas_directfb_match(e->win);
251 if (!ee) return 1; /* pass on event */
252 evas_event_feed_mouse_wheel(ee->evas, e->direction, e->z, e->time, NULL);
257 _ecore_evas_directfb_event_got_focus(void *data __UNUSED__, int type __UNUSED__, void *event)
260 Ecore_DirectFB_Event_Got_Focus *e;
263 ee = _ecore_evas_directfb_match(e->win);
265 if (!ee) return 1; /* pass on event */
266 ee->prop.focused = 1;
271 _ecore_evas_directfb_event_lost_focus(void *data __UNUSED__, int type __UNUSED__, void *event)
274 Ecore_DirectFB_Event_Lost_Focus *e;
277 ee = _ecore_evas_directfb_match(e->win);
279 if (!ee) return 1; /* pass on event */
280 ee->prop.focused = 0;
285 _ecore_evas_directfb_shutdown(void)
287 _ecore_evas_init_count--;
288 if (_ecore_evas_init_count == 0)
292 while (ecore_evases) _ecore_evas_free(ecore_evases);
293 for (i = 0; i < 8; i++)
294 ecore_event_handler_del(ecore_evas_event_handlers[i]);
295 ecore_idle_enterer_del(ecore_evas_directfb_idle_enterer);
296 ecore_evas_directfb_idle_enterer = NULL;
297 if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
299 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
300 return _ecore_evas_init_count;
308 _ecore_evas_directfb_init(void)
310 _ecore_evas_init_count++;
311 if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
312 if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1;
313 ecore_evas_directfb_idle_enterer = ecore_idle_enterer_add(_ecore_evas_directfb_idle_enter, NULL);
314 if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init();
316 ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_KEY_DOWN, _ecore_evas_directfb_event_key_down, NULL);
317 ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_KEY_UP, _ecore_evas_directfb_event_key_up, NULL);
318 ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_BUTTON_DOWN, _ecore_evas_directfb_event_button_down, NULL);
319 ecore_evas_event_handlers[3] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_BUTTON_UP, _ecore_evas_directfb_event_button_up, NULL);
320 ecore_evas_event_handlers[4] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_MOTION, _ecore_evas_directfb_event_motion, NULL);
321 ecore_evas_event_handlers[5] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_ENTER, _ecore_evas_directfb_event_enter, NULL);
322 ecore_evas_event_handlers[6] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_LEAVE, _ecore_evas_directfb_event_leave, NULL);
323 ecore_evas_event_handlers[7] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_WHEEL, _ecore_evas_directfb_event_wheel, NULL);
324 ecore_evas_event_handlers[8] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_GOT_FOCUS, _ecore_evas_directfb_event_got_focus, NULL);
325 ecore_evas_event_handlers[9] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_LOST_FOCUS, _ecore_evas_directfb_event_lost_focus, NULL);
326 ecore_evas_event_handlers[10] = NULL;
327 ecore_evas_event_handlers[11] = NULL;
328 ecore_evas_event_handlers[12] = NULL;
330 return _ecore_evas_init_count;
333 /* engine functions */
334 /********************/
337 _ecore_evas_directfb_free(Ecore_Evas *ee)
339 ecore_evases_hash = evas_hash_del(ecore_evases_hash, _ecore_evas_directfb_winid_str_get(ee->engine.directfb.window->id), ee);
340 ecore_directfb_window_del(ee->engine.directfb.window);
341 ecore_evases = _ecore_list2_remove(ecore_evases, ee);
342 _ecore_evas_directfb_shutdown();
343 ecore_directfb_shutdown();
347 _ecore_evas_directfb_move(Ecore_Evas *ee, int x, int y)
349 ecore_directfb_window_move(ee->engine.directfb.window, x, y);
353 _ecore_evas_directfb_resize(Ecore_Evas *ee, int w, int h)
355 if ((w == ee->w) && (h == ee->h)) return;
356 ecore_directfb_window_resize(ee->engine.directfb.window, w, h);
359 if ((ee->rotation == 90) || (ee->rotation == 270))
361 evas_output_size_set(ee->evas, ee->h, ee->w);
362 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
366 evas_output_size_set(ee->evas, ee->w, ee->h);
367 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
372 _ecore_evas_directfb_focus_set(Ecore_Evas *ee, int on __UNUSED__)
374 ecore_directfb_window_focus(ee->engine.directfb.window);
378 _ecore_evas_directfb_hide(Ecore_Evas *ee)
380 ecore_directfb_window_hide(ee->engine.directfb.window);
381 ee->should_be_visible = 0;
385 _ecore_evas_directfb_show(Ecore_Evas *ee)
387 ecore_directfb_window_show(ee->engine.directfb.window);
388 ee->should_be_visible = 1;
392 _ecore_evas_directfb_shaped_set(Ecore_Evas *ee, int shaped)
394 if (((ee->shaped) && (shaped)) || ((!ee->shaped) && (!shaped)))
398 ecore_directfb_window_shaped_set(ee->engine.directfb.window, 1);
400 ecore_directfb_window_shaped_set(ee->engine.directfb.window, 0);
405 _ecore_evas_directfb_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
409 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
413 ee->prop.cursor.object = NULL;
414 ee->prop.cursor.layer = 0;
415 ee->prop.cursor.hot.x = 0;
416 ee->prop.cursor.hot.y = 0;
417 ecore_directfb_window_cursor_show(ee->engine.directfb.window, 1);
422 ee->prop.cursor.object = obj;
423 ee->prop.cursor.layer = layer;
424 ee->prop.cursor.hot.x = hot_x;
425 ee->prop.cursor.hot.y = hot_y;
427 ecore_directfb_window_cursor_show(ee->engine.directfb.window, 0);
429 evas_pointer_output_xy_get(ee->evas, &x, &y);
430 evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
431 evas_object_move(ee->prop.cursor.object,x - ee->prop.cursor.hot.x,y - ee->prop.cursor.hot.y);
432 evas_object_pass_events_set(ee->prop.cursor.object, 1);
433 if (evas_pointer_inside_get(ee->evas))
434 evas_object_show(ee->prop.cursor.object);
438 _ecore_evas_directfb_fullscreen_set(Ecore_Evas *ee, int on)
440 Evas_Engine_Info_DirectFB *einfo;
445 if (((ee->prop.fullscreen) && (on)) || ((!ee->prop.fullscreen) && (!on)))
449 ecore_directfb_window_fullscreen_set(ee->engine.directfb.window, 1);
451 ecore_directfb_window_fullscreen_set(ee->engine.directfb.window, 0);
452 /* set the new size of the evas */
453 ecore_directfb_window_size_get(ee->engine.directfb.window, &w, &h);
454 if( (ee->w != w) || (ee->h != h))
459 if ((ee->rotation == 90) || (ee->rotation == 270))
461 evas_output_size_set(ee->evas, ee->h, ee->w);
462 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
466 evas_output_size_set(ee->evas, ee->w, ee->h);
467 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
470 einfo = (Evas_Engine_Info_DirectFB *)evas_engine_info_get(ee->evas);
473 einfo->info.surface = ee->engine.directfb.window->surface;
474 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
476 ee->prop.fullscreen = on;
479 if(ee->func.fn_resize) ee->func.fn_resize(ee);
485 _ecore_evas_directfb_window_get(Ecore_Evas *ee)
487 #ifdef BUILD_ECORE_EVAS_DIRECTFB
488 return ee->engine.directfb.window;
494 #ifdef BUILD_ECORE_EVAS_DIRECTFB
495 static const Ecore_Evas_Engine_Func _ecore_directfb_engine_func =
497 _ecore_evas_directfb_free, /* free an ecore_evas */
498 NULL, /* cb resize */
502 NULL, /* cb delete request */
503 NULL, /* cb destroy */
504 NULL, /* cb focus in */
505 NULL, /* cb focus out */
506 NULL, /* cb sticky */
507 NULL, /* cb unsticky */
508 NULL, /* cb mouse in */
509 NULL, /* cb mouse out */
510 NULL, /* cb pre render */
511 NULL, /* cb post render */
512 _ecore_evas_directfb_move, /* move */
513 NULL, /* managed move */
514 _ecore_evas_directfb_resize, /* resize */
515 NULL, /* move resize */
516 NULL,//_ecore_evas_directfb_rotation_set,/* rotation */
517 _ecore_evas_directfb_shaped_set, /* shaped */
518 _ecore_evas_directfb_show, /* show */
519 _ecore_evas_directfb_hide, /* hide */
523 NULL, /* title set */
524 NULL, /* name class set */
527 NULL, /* size base */
528 NULL, /* size step */
529 _ecore_evas_directfb_object_cursor_set, /* set cursor to an evas object */
530 NULL, /* layer set */
531 _ecore_evas_directfb_focus_set, /* focus */
532 NULL, /* iconified */
533 NULL, /* borderless */
535 NULL, /* maximized */
536 _ecore_evas_directfb_fullscreen_set,/* fullscreen */
537 NULL, /* avoid damage */
538 NULL, /* withdrawn */
540 NULL, /* ignore events */
542 _ecore_evas_directfb_window_get /* window_get */
549 Ecore_DirectFB_Window *
550 ecore_evas_directfb_window_get(Ecore_Evas *ee)
552 return (Ecore_DirectFB_Window *) _ecore_evas_directfb_window_get(ee);
556 ecore_evas_directfb_new(const char *disp_name, int windowed, int x, int y, int w, int h)
558 #ifdef BUILD_ECORE_EVAS_DIRECTFB
559 Evas_Engine_Info_DirectFB *einfo;
561 Ecore_DirectFB_Window *window;
564 rmethod = evas_render_method_lookup("directfb");
565 if (!rmethod) return NULL;
566 if (!ecore_directfb_init(disp_name)) return NULL;
567 ee = calloc(1, sizeof(Ecore_Evas));
568 if (!ee) return NULL;
570 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
571 _ecore_evas_directfb_init();
572 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_directfb_engine_func;
574 ee->driver = "directfb";
575 if (disp_name) ee->name = strdup(disp_name);
587 ee->prop.fullscreen = 0;
590 ee->evas = evas_new();
591 evas_data_attach_set(ee->evas, ee);
592 evas_output_method_set(ee->evas, rmethod);
593 evas_output_size_set(ee->evas, w, h);
594 evas_output_viewport_set(ee->evas, 0, 0, w, h);
595 einfo = (Evas_Engine_Info_DirectFB *)evas_engine_info_get(ee->evas);
597 window = ecore_directfb_window_new(x,y,w,h);
598 ee->engine.directfb.window = window;
601 einfo->info.dfb = ecore_directfb_interface_get();
602 einfo->info.surface = window->surface;
603 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
605 ecore_evases = _ecore_list2_prepend(ecore_evases, ee);
606 ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_directfb_winid_str_get(ee->engine.directfb.window->id), ee);
611 windowed = x = y = w = h = 0;