11 #include "ecore_evas_private.h"
12 #include "Ecore_Evas.h"
14 #ifdef BUILD_ECORE_EVAS_X11
15 static int _ecore_evas_init_count = 0;
17 static Ecore_Event_Handler *ecore_evas_event_handlers[13];
19 static int leader_ref = 0;
20 static Ecore_X_Window leader_win = 0;
23 _ecore_evas_x_hints_update(Ecore_Evas *ee)
25 ecore_x_icccm_hints_set
27 !ee->prop.focus_skip /* accepts_focus */,
28 ee->prop.iconified ? ECORE_X_WINDOW_STATE_HINT_ICONIC :
29 ee->prop.withdrawn ? ECORE_X_WINDOW_STATE_HINT_WITHDRAWN :
30 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
34 ee->prop.group_ee_win /* window_group */,
35 ee->prop.urgent /* is_urgent */);
39 _ecore_evas_x_group_leader_set(Ecore_Evas *ee)
47 ecore_x_window_override_new(ee->engine.x.win_root, 1234, 5678, 1, 2);
48 ecore_x_window_defaults_set(leader_win);
49 if ((id = getenv("DESKTOP_STARTUP_ID")))
50 ecore_x_netwm_startup_id_set(leader_win,id);
51 ecore_x_icccm_client_leader_set(leader_win, leader_win);
53 ee->engine.x.leader = leader_win;
54 ecore_x_icccm_client_leader_set(ee->prop.window, leader_win);
58 _ecore_evas_x_group_leader_unset(Ecore_Evas *ee)
60 ecore_x_window_prop_property_del(ee->prop.window,
61 ECORE_X_ATOM_WM_CLIENT_LEADER);
62 if (ee->engine.x.leader == leader_win)
67 ecore_x_window_free(leader_win);
70 ee->engine.x.leader = 0;
75 _ecore_evas_x_group_leader_update(Ecore_Evas *ee)
77 if (ee->engine.x.leader)
78 ecore_x_icccm_client_leader_set(ee->prop.window, ee->engine.x.leader);
82 _ecore_evas_x_protocols_set(Ecore_Evas *ee)
84 Ecore_X_Atom protos[3];
85 unsigned int num = 0, tmp = 0;
87 if (ee->func.fn_delete_request)
88 protos[num++] = ECORE_X_ATOM_WM_DELETE_WINDOW;
89 protos[num++] = ECORE_X_ATOM_NET_WM_PING;
90 protos[num++] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
91 ecore_x_icccm_protocol_atoms_set(ee->prop.window, protos, num);
93 if (!ee->engine.x.netwm_sync_counter)
94 ee->engine.x.netwm_sync_counter = ecore_x_sync_counter_new(0);
96 tmp = ee->engine.x.netwm_sync_counter;
97 ecore_x_window_prop_card32_set(ee->prop.window,
98 ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
103 _ecore_evas_x_sync_set(Ecore_Evas *ee)
105 Ecore_X_Sync_Counter sync_counter = ee->engine.x.sync_counter;
107 if (((ee->should_be_visible) || (ee->visible)) &&
108 ((ecore_x_e_comp_sync_supported_get(ee->engine.x.win_root)) &&
109 (!ee->no_comp_sync) && (_ecore_evas_app_comp_sync)))
111 if (!ee->engine.x.sync_counter)
112 ee->engine.x.sync_counter = ecore_x_sync_counter_new(0);
116 if (ee->engine.x.sync_counter)
118 ecore_x_sync_counter_free(ee->engine.x.sync_counter);
119 ee->engine.x.sync_val = 0;
121 ee->engine.x.sync_counter = 0;
123 if (sync_counter != ee->engine.x.sync_counter)
124 ecore_x_e_comp_sync_counter_set(ee->prop.window, ee->engine.x.sync_counter);
128 _ecore_evas_x_sync_clear(Ecore_Evas *ee)
130 if (!ee->engine.x.sync_counter) return;
131 ecore_x_sync_counter_free(ee->engine.x.sync_counter);
132 ee->engine.x.sync_val = 0;
133 ee->engine.x.sync_counter = 0;
136 # ifdef BUILD_ECORE_EVAS_OPENGL_X11
137 static Ecore_X_Window
138 _ecore_evas_x_gl_window_new(Ecore_Evas *ee, Ecore_X_Window parent, int x, int y, int w, int h, int override, int argb, const int *opt)
140 Evas_Engine_Info_GL_X11 *einfo;
143 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
152 for (op = 0; opt[op]; op++)
154 if (opt[op] == ECORE_EVAS_GL_X11_OPT_INDIRECT)
157 einfo->indirect = opt[op];
159 else if (opt[op] == ECORE_EVAS_GL_X11_OPT_VSYNC)
162 einfo->vsync = opt[op];
167 /* FIXME: this is inefficient as its 1 or more round trips */
168 screen = ecore_x_screen_index_get(ecore_x_default_screen_get());
169 if (ecore_x_screen_count_get() > 1)
171 Ecore_X_Window *roots;
175 roots = ecore_x_window_root_list(&num);
180 root = ecore_x_window_root_get(parent);
181 for (i = 0; i < num; i++)
183 if (root == roots[i])
193 einfo->info.display = ecore_x_display_get();
194 einfo->info.screen = screen;
196 einfo->info.destination_alpha = argb;
198 einfo->info.visual = einfo->func.best_visual_get(einfo);
199 einfo->info.colormap = einfo->func.best_colormap_get(einfo);
200 einfo->info.depth = einfo->func.best_depth_get(einfo);
202 if ((!einfo->info.visual) ||
203 (!einfo->info.colormap) || (!einfo->info.depth))
205 WRN("OpenGL X11 init engine '%s' failed - no visual, colormap or depth.", ee->driver);
206 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
208 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
216 win = ecore_x_window_override_argb_new(parent, x, y, w, h);
218 win = ecore_x_window_argb_new(parent, x, y, w, h);
223 win = ecore_x_window_override_new(parent, x, y, w, h);
225 win = ecore_x_window_new(parent, x, y, w, h);
228 ecore_x_window_pixel_gravity_set(win, ECORE_X_GRAVITY_FORGET);
230 /* attr.backing_store = NotUseful; */
231 /* attr.override_redirect = override; */
232 /* attr.colormap = einfo->info.colormap; */
233 /* attr.border_pixel = 0; */
234 /* attr.background_pixmap = None; */
235 /* attr.event_mask = */
236 /* KeyPressMask | KeyReleaseMask | */
237 /* ExposureMask | ButtonPressMask | ButtonReleaseMask | */
238 /* EnterWindowMask | LeaveWindowMask | */
239 /* PointerMotionMask | StructureNotifyMask | VisibilityChangeMask | */
240 /* FocusChangeMask | PropertyChangeMask | ColormapChangeMask; */
241 /* attr.bit_gravity = ForgetGravity; */
244 /* XCreateWindow(einfo->info.display, parent, x, y, w, h, 0, */
245 /* einfo->info.depth, InputOutput, einfo->info.visual, */
246 /* CWBackingStore | CWColormap | CWBackPixmap | */
247 /* CWBorderPixel | CWBitGravity | CWEventMask | */
248 /* CWOverrideRedirect, &attr); */
250 einfo->info.drawable = win;
252 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
254 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
255 ecore_x_window_free(win);
267 _ecore_evas_x_render(Ecore_Evas *ee)
270 Eina_List *updates = NULL;
274 if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync) &&
275 (ee->engine.x.sync_counter) && (!ee->engine.x.sync_began) &&
276 (!ee->engine.x.sync_cancel))
279 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
281 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
282 if (ee2->engine.func->fn_render)
283 rend |= ee2->engine.func->fn_render(ee2);
284 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
287 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
288 updates = evas_render_updates(ee->evas);
289 if (ee->prop.avoid_damage)
291 if (ee->engine.x.using_bg_pixmap)
298 EINA_LIST_FOREACH(updates, l, r)
299 ecore_x_window_area_clear(ee->prop.window,
300 r->x, r->y, r->w, r->h);
303 #ifdef EVAS_FRAME_QUEUING
306 ecore_x_window_shape_mask_set(ee->prop.window,
311 #ifdef EVAS_FRAME_QUEUING
312 /* wait until ee->engine.x.mask being updated */
313 // evas_sync(ee->evas);
315 // ecore_x_window_shape_input_mask_set(ee->prop.window, ee->engine.x.mask);
317 evas_render_updates_free(updates);
318 _ecore_evas_idle_timeout_update(ee);
329 EINA_LIST_FOREACH(updates, l, r)
331 Ecore_X_Rectangle rect;
332 Ecore_X_XRegion *tmpr;
334 if (!ee->engine.x.damages)
335 ee->engine.x.damages = ecore_x_xregion_new();
336 tmpr = ecore_x_xregion_new();
337 if (ee->rotation == 0)
344 else if (ee->rotation == 90)
347 rect.y = ee->h - r->x - r->w;
351 else if (ee->rotation == 180)
353 rect.x = ee->w - r->x - r->w;
354 rect.y = ee->h - r->y - r->h;
358 else if (ee->rotation == 270)
360 rect.x = ee->w - r->y - r->h;
365 ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages,
367 ecore_x_xregion_free(ee->engine.x.damages);
368 ee->engine.x.damages = tmpr;
370 if (ee->engine.x.damages)
372 /* if we have a damage pixmap - we can avoid exposures by
373 * disabling them just for setting the mask */
374 ecore_x_event_mask_set(ee->prop.window,
375 ECORE_X_EVENT_MASK_KEY_DOWN |
376 ECORE_X_EVENT_MASK_KEY_UP |
377 ECORE_X_EVENT_MASK_MOUSE_DOWN |
378 ECORE_X_EVENT_MASK_MOUSE_UP |
379 ECORE_X_EVENT_MASK_MOUSE_IN |
380 ECORE_X_EVENT_MASK_MOUSE_OUT |
381 ECORE_X_EVENT_MASK_MOUSE_MOVE |
382 // ECORE_X_EVENT_MASK_WINDOW_DAMAGE |
383 ECORE_X_EVENT_MASK_WINDOW_VISIBILITY |
384 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE |
385 ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE |
386 ECORE_X_EVENT_MASK_WINDOW_PROPERTY |
387 ECORE_X_EVENT_MASK_WINDOW_COLORMAP
390 ecore_x_window_shape_mask_set(ee->prop.window,
392 /* and re-enable them again */
393 ecore_x_event_mask_set(ee->prop.window,
394 ECORE_X_EVENT_MASK_KEY_DOWN |
395 ECORE_X_EVENT_MASK_KEY_UP |
396 ECORE_X_EVENT_MASK_MOUSE_DOWN |
397 ECORE_X_EVENT_MASK_MOUSE_UP |
398 ECORE_X_EVENT_MASK_MOUSE_IN |
399 ECORE_X_EVENT_MASK_MOUSE_OUT |
400 ECORE_X_EVENT_MASK_MOUSE_MOVE |
401 ECORE_X_EVENT_MASK_WINDOW_DAMAGE |
402 ECORE_X_EVENT_MASK_WINDOW_VISIBILITY |
403 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE |
404 ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE |
405 ECORE_X_EVENT_MASK_WINDOW_PROPERTY |
406 ECORE_X_EVENT_MASK_WINDOW_COLORMAP
408 ecore_x_xregion_set(ee->engine.x.damages, ee->engine.x.gc);
409 ecore_x_pixmap_paste(ee->engine.x.pmap, ee->prop.window,
410 ee->engine.x.gc, 0, 0, ee->w, ee->h,
412 ecore_x_xregion_free(ee->engine.x.damages);
413 ee->engine.x.damages = NULL;
415 evas_render_updates_free(updates);
416 _ecore_evas_idle_timeout_update(ee);
421 else if (((ee->visible) && (ee->draw_ok)) ||
422 ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
423 ((ee->should_be_visible) && (ee->prop.override)))
429 #ifdef EVAS_FRAME_QUEUING
432 ecore_x_window_shape_mask_set(ee->prop.window,
437 #ifdef EVAS_FRAME_QUEUING
438 /* wait until ee->engine.x.mask being updated */
439 // evas_sync(ee->evas);
441 // ecore_x_window_shape_input_mask_set(ee->prop.window, ee->engine.x.mask);
443 evas_render_updates_free(updates);
444 _ecore_evas_idle_timeout_update(ee);
449 evas_norender(ee->evas);
450 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
454 static int frames = 0;
455 static double t0 = 0.0;
458 t = ecore_time_get();
463 printf("FPS: %3.3f\n", (double)frames / td);
474 _ecore_evas_x_resize_shape(Ecore_Evas *ee)
476 if (!strcmp(ee->driver, "software_x11"))
478 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
479 Evas_Engine_Info_Software_X11 *einfo;
481 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
484 unsigned int foreground;
487 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
488 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
490 gc = ecore_x_gc_new(ee->engine.x.mask,
491 ECORE_X_GC_VALUE_MASK_FOREGROUND,
493 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
496 einfo->info.mask = ee->engine.x.mask;
497 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
499 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
501 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
503 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
505 else if (!strcmp(ee->driver, "software_16_x11"))
507 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
508 # if 0 /* XXX no shaped window support for software_16_x11 */
509 Evas_Engine_Info_Software_16_X11 *einfo;
511 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
514 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
515 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
516 einfo->info.mask = ee->engine.x.mask;
517 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
519 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
521 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
523 # endif /* XXX no shaped window support for software_16_x11 */
524 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
526 if (!strcmp(ee->driver, "software_8_x11"))
528 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
529 Evas_Engine_Info_Software_8_X11 *einfo;
531 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
534 unsigned int foreground;
537 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
538 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
540 gc = ecore_x_gc_new(ee->engine.x.mask,
541 ECORE_X_GC_VALUE_MASK_FOREGROUND,
543 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
546 einfo->info.mask = ee->engine.x.mask;
547 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
549 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
551 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
553 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
557 /* TODO: we need to make this work for all the states, not just sticky */
559 _ecore_evas_x_event_property_change(void *data __UNUSED__, int type __UNUSED__, void *event)
562 Ecore_X_Event_Window_Property *e;
563 int state_change = 0;
566 ee = ecore_event_window_match(e->win);
567 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
568 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
569 if (e->atom == ECORE_X_ATOM_NET_WM_STATE)
572 Ecore_X_Window_State *state;
575 unsigned char modal : 1;
576 unsigned char sticky : 1;
577 unsigned char maximized_v : 1;
578 unsigned char maximized_h : 1;
579 unsigned char shaded : 1;
580 unsigned char skip_taskbar : 1;
581 unsigned char skip_pager : 1;
582 unsigned char fullscreen : 1;
583 unsigned char above : 1;
584 unsigned char below : 1;
595 prev.x.modal = ee->engine.x.state.modal;
596 prev.x.sticky = ee->engine.x.state.sticky;
597 prev.x.maximized_v = ee->engine.x.state.maximized_v;
598 prev.x.maximized_h = ee->engine.x.state.maximized_h;
599 prev.x.shaded = ee->engine.x.state.shaded;
600 prev.x.skip_taskbar = ee->engine.x.state.skip_taskbar;
601 prev.x.skip_pager = ee->engine.x.state.skip_pager;
602 prev.x.fullscreen = ee->engine.x.state.fullscreen;
603 prev.x.above = ee->engine.x.state.above;
604 prev.x.below = ee->engine.x.state.below;
606 prev.prop.modal = ee->prop.modal;
607 prev.prop.maximized = ee->prop.maximized;
608 prev.prop.sticky = ee->prop.sticky;
609 prev.prop.fullscreen = ee->prop.fullscreen;
610 prev.prop.focus_skip = ee->prop.focus_skip;
612 ee->engine.x.state.modal = 0;
613 ee->engine.x.state.sticky = 0;
614 ee->engine.x.state.maximized_v = 0;
615 ee->engine.x.state.maximized_h = 0;
616 ee->engine.x.state.shaded = 0;
617 ee->engine.x.state.skip_taskbar = 0;
618 ee->engine.x.state.skip_pager = 0;
619 ee->engine.x.state.fullscreen = 0;
620 ee->engine.x.state.above = 0;
621 ee->engine.x.state.below = 0;
624 ee->prop.maximized = 0;
626 ee->prop.fullscreen = 0;
627 ee->prop.focus_skip = 0;
629 ecore_x_netwm_window_state_get(e->win, &state, &num);
632 for (i = 0; i < num; i++)
636 case ECORE_X_WINDOW_STATE_MODAL:
637 ee->engine.x.state.modal = 1;
640 case ECORE_X_WINDOW_STATE_STICKY:
642 ee->engine.x.state.sticky = 1;
644 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
645 ee->engine.x.state.maximized_v = 1;
646 ee->prop.maximized = 1;
648 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
649 ee->engine.x.state.maximized_h = 1;
650 ee->prop.maximized = 1;
652 case ECORE_X_WINDOW_STATE_SHADED:
653 ee->engine.x.state.shaded = 1;
655 case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
656 ee->engine.x.state.skip_taskbar = 1;
657 ee->prop.focus_skip = 1;
659 case ECORE_X_WINDOW_STATE_SKIP_PAGER:
660 ee->engine.x.state.skip_pager = 1;
661 ee->prop.focus_skip = 1;
663 case ECORE_X_WINDOW_STATE_FULLSCREEN:
664 ee->prop.fullscreen = 1;
665 ee->engine.x.state.fullscreen = 1;
667 case ECORE_X_WINDOW_STATE_ABOVE:
668 ee->engine.x.state.above = 1;
670 case ECORE_X_WINDOW_STATE_BELOW:
671 ee->engine.x.state.below = 1;
680 // (prev.x.modal != ee->engine.x.state.modal) ||
681 (prev.x.sticky != ee->engine.x.state.sticky) ||
682 (prev.x.maximized_v != ee->engine.x.state.maximized_v) ||
683 (prev.x.maximized_h != ee->engine.x.state.maximized_h) ||
684 // (prev.x.shaded != ee->engine.x.state.shaded) ||
685 // (prev.x.skip_taskbar != ee->engine.x.state.skip_taskbar) ||
686 // (prev.x.skip_pager != ee->engine.x.state.skip_pager) ||
687 (prev.x.fullscreen != ee->engine.x.state.fullscreen) ||
688 // (prev.x.above != ee->engine.x.state.above) ||
689 // (prev.x.below != ee->engine.x.state.below) ||
690 // (prev.prop.modal != ee->prop.modal) ||
691 (prev.prop.maximized != ee->prop.maximized) ||
692 (prev.prop.sticky != ee->prop.sticky) ||
693 (prev.prop.fullscreen != ee->prop.fullscreen) ||
694 (prev.prop.focus_skip != ee->prop.focus_skip))
697 else if (e->atom == ECORE_X_ATOM_WM_STATE)
699 Ecore_X_Window_State_Hint state;
701 // handle WM_STATE changes
702 state = ecore_x_icccm_state_get(e->win);
705 case ECORE_X_WINDOW_STATE_HINT_WITHDRAWN:
706 if ((!ee->prop.withdrawn) || (ee->prop.iconified))
709 ee->prop.withdrawn = 1;
710 ee->prop.iconified = 0;
713 case ECORE_X_WINDOW_STATE_HINT_ICONIC:
714 if ((!ee->prop.iconified) || (ee->prop.withdrawn))
717 ee->prop.iconified = 1;
718 ee->prop.withdrawn = 0;
721 case ECORE_X_WINDOW_STATE_HINT_NORMAL:
722 if ((ee->prop.iconified) || (ee->prop.withdrawn))
725 ee->prop.iconified = 0;
726 ee->prop.withdrawn = 0;
733 else if (e->atom == ECORE_X_ATOM_E_PROFILE)
735 char *p = ecore_x_e_window_profile_get(e->win);
736 if ((p) && (ee->prop.profile))
738 if (strcmp(p, ee->prop.profile) != 0)
740 free(ee->prop.profile);
741 ee->prop.profile = strdup(p);
745 else if ((!p) && (ee->prop.profile))
747 free(ee->prop.profile);
748 ee->prop.profile = NULL;
751 else if ((p) && (!ee->prop.profile))
753 ee->prop.profile = strdup(p);
763 if (ee->func.fn_state_change) ee->func.fn_state_change(ee);
766 return ECORE_CALLBACK_PASS_ON;
770 _ecore_evas_x_event_visibility_change(void *data __UNUSED__, int type __UNUSED__, void *event)
773 Ecore_X_Event_Window_Visibility_Change *e;
776 ee = ecore_event_window_match(e->win);
777 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
778 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
779 // printf("VIS CHANGE OBSCURED: %p %i\n", ee, e->fully_obscured);
780 if (e->fully_obscured)
782 /* FIXME: round trip */
783 if (!ecore_x_screen_is_composited(ee->engine.x.screen_num))
788 return ECORE_CALLBACK_PASS_ON;
792 _ecore_evas_x_event_client_message(void *data __UNUSED__, int type __UNUSED__, void *event)
795 Ecore_X_Event_Client_Message *e;
798 if (e->format != 32) return ECORE_CALLBACK_PASS_ON;
799 if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_BEGIN)
801 ee = ecore_event_window_match(e->data.l[0]);
802 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
803 if (e->data.l[0] != (long)ee->prop.window)
804 return ECORE_CALLBACK_PASS_ON;
805 if (!ee->engine.x.sync_began)
807 // qeue a damage + draw. work around an event re-ordering thing.
808 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
810 ee->engine.x.sync_began = 1;
811 ee->engine.x.sync_cancel = 0;
813 else if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_END)
815 ee = ecore_event_window_match(e->data.l[0]);
816 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
817 if (e->data.l[0] != (long)ee->prop.window)
818 return ECORE_CALLBACK_PASS_ON;
819 ee->engine.x.sync_began = 0;
820 ee->engine.x.sync_cancel = 0;
822 else if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_CANCEL)
824 ee = ecore_event_window_match(e->data.l[0]);
825 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
826 if (e->data.l[0] != (long)ee->prop.window)
827 return ECORE_CALLBACK_PASS_ON;
828 ee->engine.x.sync_began = 0;
829 ee->engine.x.sync_cancel = 1;
831 else if ((e->message_type == ECORE_X_ATOM_WM_PROTOCOLS) &&
832 (e->data.l[0] == (int)ECORE_X_ATOM_NET_WM_SYNC_REQUEST))
834 ee = ecore_event_window_match(e->win);
835 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
836 ee->engine.x.netwm_sync_val_lo = (unsigned int)e->data.l[2];
837 ee->engine.x.netwm_sync_val_hi = (int)e->data.l[3];
838 ee->engine.x.netwm_sync_set = 1;
840 return ECORE_CALLBACK_PASS_ON;
844 _ecore_evas_x_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
847 Ecore_X_Event_Mouse_In *e;
850 ee = ecore_event_window_match(e->win);
851 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
852 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
857 /* const char *modes[] = { */
859 /* "MODE_WHILE_GRABBED", */
863 /* const char *details[] = { */
864 /* "DETAIL_ANCESTOR", */
865 /* "DETAIL_VIRTUAL", */
866 /* "DETAIL_INFERIOR", */
867 /* "DETAIL_NON_LINEAR", */
868 /* "DETAIL_NON_LINEAR_VIRTUAL", */
869 /* "DETAIL_POINTER", */
870 /* "DETAIL_POINTER_ROOT", */
871 /* "DETAIL_DETAIL_NONE" */
873 /* t = time(NULL); */
874 /* ct = ctime(&t); */
875 /* ct[strlen(ct) - 1] = 0; */
876 /* printf("@@ ->IN 0x%x 0x%x %s md=%s dt=%s\n", */
877 /* e->win, e->event_win, */
879 /* modes[e->mode], */
880 /* details[e->detail]); */
882 // disable. causes more problems than it fixes
883 // if ((e->mode == ECORE_X_EVENT_MODE_GRAB) ||
884 // (e->mode == ECORE_X_EVENT_MODE_UNGRAB))
886 /* if (e->mode != ECORE_X_EVENT_MODE_NORMAL) return 0; */
889 if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
890 ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
891 evas_event_feed_mouse_in(ee->evas, e->time, NULL);
892 _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
895 return ECORE_CALLBACK_PASS_ON;
899 _ecore_evas_x_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
902 Ecore_X_Event_Mouse_Out *e;
905 ee = ecore_event_window_match(e->win);
906 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
908 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
913 /* const char *modes[] = { */
915 /* "MODE_WHILE_GRABBED", */
919 /* const char *details[] = { */
920 /* "DETAIL_ANCESTOR", */
921 /* "DETAIL_VIRTUAL", */
922 /* "DETAIL_INFERIOR", */
923 /* "DETAIL_NON_LINEAR", */
924 /* "DETAIL_NON_LINEAR_VIRTUAL", */
925 /* "DETAIL_POINTER", */
926 /* "DETAIL_POINTER_ROOT", */
927 /* "DETAIL_DETAIL_NONE" */
929 /* t = time(NULL); */
930 /* ct = ctime(&t); */
931 /* ct[strlen(ct) - 1] = 0; */
932 /* printf("@@ ->OUT 0x%x 0x%x %s md=%s dt=%s\n", */
933 /* e->win, e->event_win, */
935 /* modes[e->mode], */
936 /* details[e->detail]); */
938 // disable. causes more problems than it fixes
939 // if ((e->mode == ECORE_X_EVENT_MODE_GRAB) ||
940 // (e->mode == ECORE_X_EVENT_MODE_UNGRAB))
942 /* if (e->mode != ECORE_X_EVENT_MODE_NORMAL) return 0; */
943 // printf("OUT: ee->in=%i, e->mode=%i, e->detail=%i, dount_count=%i\n",
944 // ee->in, e->mode, e->detail, evas_event_down_count_get(ee->evas));
947 if ((evas_event_down_count_get(ee->evas) > 0) &&
948 (!((e->mode == ECORE_X_EVENT_MODE_GRAB) &&
949 (e->detail == ECORE_X_EVENT_DETAIL_NON_LINEAR))))
950 return ECORE_CALLBACK_PASS_ON;
951 ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
952 _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
953 if (e->mode == ECORE_X_EVENT_MODE_GRAB)
954 evas_event_feed_mouse_cancel(ee->evas, e->time, NULL);
955 evas_event_feed_mouse_out(ee->evas, e->time, NULL);
956 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
957 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
960 return ECORE_CALLBACK_PASS_ON;
964 _ecore_evas_x_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
967 Ecore_X_Event_Window_Focus_In *e;
970 ee = ecore_event_window_match(e->win);
971 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
972 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
973 //xx// filtering with these doesnt help
974 //xx// if (e->mode == ECORE_X_EVENT_MODE_UNGRAB) return ECORE_CALLBACK_PASS_ON;
975 ee->prop.focused = 1;
976 evas_focus_in(ee->evas);
977 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
978 return ECORE_CALLBACK_PASS_ON;
982 _ecore_evas_x_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
985 Ecore_X_Event_Window_Focus_Out *e;
988 ee = ecore_event_window_match(e->win);
989 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
990 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
991 //xx// filtering with these doesnt help
992 //xx// if (e->mode == ECORE_X_EVENT_MODE_GRAB) return ECORE_CALLBACK_PASS_ON;
994 // if (ee->prop.fullscreen)
995 // ecore_x_window_focus(ee->prop.window);
996 evas_focus_out(ee->evas);
997 ee->prop.focused = 0;
998 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
999 return ECORE_CALLBACK_PASS_ON;
1003 _ecore_evas_x_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event)
1006 Ecore_X_Event_Window_Damage *e;
1009 ee = ecore_event_window_match(e->win);
1010 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1011 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1012 if (ee->engine.x.using_bg_pixmap) return ECORE_CALLBACK_PASS_ON;
1013 // printf("EXPOSE %p [%i] %i %i %ix%i\n", ee, ee->prop.avoid_damage, e->x, e->y, e->w, e->h);
1014 if (ee->prop.avoid_damage)
1016 Ecore_X_Rectangle rect;
1017 Ecore_X_XRegion *tmpr;
1019 if (!ee->engine.x.damages)
1020 ee->engine.x.damages = ecore_x_xregion_new();
1021 tmpr = ecore_x_xregion_new();
1026 ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
1027 ecore_x_xregion_free(ee->engine.x.damages);
1028 ee->engine.x.damages = tmpr;
1029 /* no - this breaks things badly. disable. Ecore_X_Rectangle != XRectangle - see
1030 * the typedefs in x's headers and ecore_x's. also same with Region - it's a pointer in x - not an X ID
1031 Ecore_X_Rectangle rect;
1032 Ecore_X_XRegion *tmpr;
1034 if (!ee->engine.x.damages) ee->engine.x.damages = ecore_x_xregion_new();
1035 tmpr = ecore_x_xregion_new();
1040 ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
1041 ecore_x_xregion_free(ee->engine.x.damages);
1042 ee->engine.x.damages = tmpr;
1047 if (ee->rotation == 0)
1048 evas_damage_rectangle_add(ee->evas, e->x, e->y, e->w, e->h);
1049 else if (ee->rotation == 90)
1050 evas_damage_rectangle_add(ee->evas,
1051 ee->h - e->y - e->h, e->x, e->h, e->w);
1052 else if (ee->rotation == 180)
1053 evas_damage_rectangle_add(ee->evas, ee->w - e->x - e->w,
1054 ee->h - e->y - e->h, e->w, e->h);
1055 else if (ee->rotation == 270)
1056 evas_damage_rectangle_add(ee->evas, e->y, ee->w - e->x - e->w,
1059 return ECORE_CALLBACK_PASS_ON;
1063 _ecore_evas_x_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event)
1066 Ecore_X_Event_Window_Destroy *e;
1069 ee = ecore_event_window_match(e->win);
1070 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1071 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1072 if (ee->func.fn_destroy) ee->func.fn_destroy(ee);
1073 _ecore_evas_x_sync_clear(ee);
1074 ecore_evas_free(ee);
1075 return ECORE_CALLBACK_PASS_ON;
1079 _ecore_evas_x_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
1082 Ecore_X_Event_Window_Configure *e;
1085 ee = ecore_event_window_match(e->win);
1086 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1087 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1088 if (ee->engine.x.direct_resize) return ECORE_CALLBACK_PASS_ON;
1090 ee->engine.x.configure_coming = 0;
1091 if ((e->from_wm) || (ee->prop.override))
1093 if ((ee->x != e->x) || (ee->y != e->y))
1099 if (ee->func.fn_move) ee->func.fn_move(ee);
1102 if ((ee->w != e->w) || (ee->h != e->h))
1108 if ((ee->rotation == 90) || (ee->rotation == 270))
1110 evas_output_size_set(ee->evas, ee->h, ee->w);
1111 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1115 evas_output_size_set(ee->evas, ee->w, ee->h);
1116 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1118 if (ee->prop.avoid_damage)
1122 pdam = ecore_evas_avoid_damage_get(ee);
1123 ecore_evas_avoid_damage_set(ee, 0);
1124 ecore_evas_avoid_damage_set(ee, pdam);
1126 if ((ee->shaped) || (ee->alpha))
1127 _ecore_evas_x_resize_shape(ee);
1128 if ((ee->expecting_resize.w > 0) && (ee->expecting_resize.h > 0))
1130 if ((ee->expecting_resize.w == ee->w) &&
1131 (ee->expecting_resize.h == ee->h))
1132 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
1133 ecore_x_current_time_get());
1134 ee->expecting_resize.w = 0;
1135 ee->expecting_resize.h = 0;
1137 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1139 return ECORE_CALLBACK_PASS_ON;
1143 _ecore_evas_x_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event)
1146 Ecore_X_Event_Window_Delete_Request *e;
1149 ee = ecore_event_window_match(e->win);
1150 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1151 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1152 if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
1153 return ECORE_CALLBACK_PASS_ON;
1157 _ecore_evas_x_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event)
1160 Ecore_X_Event_Window_Show *e;
1161 static int first_map_bug = -1;
1164 ee = ecore_event_window_match(e->win);
1165 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1166 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1167 /* some GL drivers are doing buffer copy in a separate thread.
1168 * we need to check whether GL driver sends SYNC_DRAW_DONE msg afger copying
1169 * that are required in order to exactly render. - added by gl77.lee
1171 if (ee->gl_sync_draw_done < 0)
1173 if (getenv("ECORE_EVAS_GL_SYNC_DRAW_DONE"))
1174 ee->gl_sync_draw_done = atoi(getenv("ECORE_EVAS_GL_SYNC_DRAW_DONE"));
1176 ee->gl_sync_draw_done = 0;
1178 if (first_map_bug < 0)
1182 if ((bug = getenv("ECORE_EVAS_GL_FIRST_MAP_BUG")))
1183 first_map_bug = atoi(bug);
1187 if ((first_map_bug) && (!strcmp(ee->driver, "opengl_x11")))
1188 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1189 if (ee->visible) return ECORE_CALLBACK_PASS_ON;
1190 // if (ee->visible) return ECORE_CALLBACK_DONE;
1191 // printf("SHOW EVENT %p\n", ee);
1193 if (ee->func.fn_show) ee->func.fn_show(ee);
1194 return ECORE_CALLBACK_PASS_ON;
1198 _ecore_evas_x_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event)
1201 Ecore_X_Event_Window_Hide *e;
1204 ee = ecore_event_window_match(e->win);
1205 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1206 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1209 evas_event_feed_mouse_cancel(ee->evas, e->time, NULL);
1210 evas_event_feed_mouse_out(ee->evas, e->time, NULL);
1211 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
1212 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
1213 ee->in = EINA_FALSE;
1215 if (!ee->visible) return ECORE_CALLBACK_PASS_ON;
1216 // if (!ee->visible) return ECORE_CALLBACK_DONE;
1217 // printf("HIDE EVENT %p\n", ee);
1219 if (ee->func.fn_hide) ee->func.fn_hide(ee);
1220 return ECORE_CALLBACK_PASS_ON;
1223 /* FIXME, should be in idler */
1224 /* FIXME, round trip */
1226 _ecore_evas_x_size_pos_hints_update(Ecore_Evas *ee)
1228 ecore_x_icccm_size_pos_hints_set(ee->prop.window,
1229 ee->prop.request_pos /*request_pos */,
1230 ECORE_X_GRAVITY_NW /* gravity */,
1231 ee->prop.min.w /* min_w */,
1232 ee->prop.min.h /* min_h */,
1233 ee->prop.max.w /* max_w */,
1234 ee->prop.max.h /* max_h */,
1235 ee->prop.base.w /* base_w */,
1236 ee->prop.base.h /* base_h */,
1237 ee->prop.step.w /* step_x */,
1238 ee->prop.step.h /* step_y */,
1239 ee->prop.aspect /* min_aspect */,
1240 ee->prop.aspect /* max_aspect */);
1243 /* FIXME, should be in idler */
1245 _ecore_evas_x_state_update(Ecore_Evas *ee)
1247 Ecore_X_Window_State state[10];
1251 state[num++] = ECORE_X_WINDOW_STATE_MODAL;
1252 if (ee->prop.sticky)
1253 state[num++] = ECORE_X_WINDOW_STATE_STICKY;
1254 if (ee->prop.maximized)
1255 state[num++] = ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
1256 if (ee->prop.maximized)
1257 state[num++] = ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
1258 // if (bd->client.netwm.state.shaded)
1259 // state[num++] = ECORE_X_WINDOW_STATE_SHADED;
1260 if (ee->prop.focus_skip)
1261 state[num++] = ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
1262 if (ee->prop.focus_skip)
1263 state[num++] = ECORE_X_WINDOW_STATE_SKIP_PAGER;
1264 // if (bd->client.netwm.state.hidden)
1265 // state[num++] = ECORE_X_WINDOW_STATE_HIDDEN;
1266 if (ee->engine.x.state.fullscreen)
1267 state[num++] = ECORE_X_WINDOW_STATE_FULLSCREEN;
1268 if (ee->engine.x.state.above)
1269 state[num++] = ECORE_X_WINDOW_STATE_ABOVE;
1270 if (ee->engine.x.state.below)
1271 state[num++] = ECORE_X_WINDOW_STATE_BELOW;
1272 if (ee->prop.demand_attention)
1273 state[num++] = ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION;
1275 ecore_x_netwm_window_state_set(ee->prop.window, state, num);
1279 _ecore_evas_x_layer_update(Ecore_Evas *ee)
1281 if (ee->should_be_visible)
1283 /* We need to send a netwm request to the wm */
1284 /* FIXME: Do we have to remove old state before adding new? */
1285 if (ee->prop.layer < 3)
1287 if (ee->engine.x.state.above)
1289 ee->engine.x.state.above = 0;
1290 ecore_x_netwm_state_request_send(ee->prop.window,
1291 ee->engine.x.win_root,
1292 ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
1294 if (!ee->engine.x.state.below)
1296 ee->engine.x.state.below = 1;
1297 ecore_x_netwm_state_request_send(ee->prop.window,
1298 ee->engine.x.win_root,
1299 ECORE_X_WINDOW_STATE_BELOW, -1, 1);
1302 else if (ee->prop.layer > 5)
1304 if (ee->engine.x.state.below)
1306 ee->engine.x.state.below = 0;
1307 ecore_x_netwm_state_request_send(ee->prop.window,
1308 ee->engine.x.win_root,
1309 ECORE_X_WINDOW_STATE_BELOW, -1, 0);
1311 if (!ee->engine.x.state.above)
1313 ee->engine.x.state.above = 1;
1314 ecore_x_netwm_state_request_send(ee->prop.window,
1315 ee->engine.x.win_root,
1316 ECORE_X_WINDOW_STATE_ABOVE, -1, 1);
1321 if (ee->engine.x.state.below)
1323 ee->engine.x.state.below = 0;
1324 ecore_x_netwm_state_request_send(ee->prop.window,
1325 ee->engine.x.win_root,
1326 ECORE_X_WINDOW_STATE_BELOW, -1, 0);
1328 if (ee->engine.x.state.above)
1330 ee->engine.x.state.above = 0;
1331 ecore_x_netwm_state_request_send(ee->prop.window,
1332 ee->engine.x.win_root,
1333 ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
1339 /* Just set the state */
1340 if (ee->prop.layer < 3)
1342 if ((ee->engine.x.state.above) || (!ee->engine.x.state.below))
1344 ee->engine.x.state.above = 0;
1345 ee->engine.x.state.below = 1;
1346 _ecore_evas_x_state_update(ee);
1349 else if (ee->prop.layer > 5)
1351 if ((!ee->engine.x.state.above) || (ee->engine.x.state.below))
1353 ee->engine.x.state.above = 1;
1354 ee->engine.x.state.below = 0;
1355 _ecore_evas_x_state_update(ee);
1360 if ((ee->engine.x.state.above) || (ee->engine.x.state.below))
1362 ee->engine.x.state.above = 0;
1363 ee->engine.x.state.below = 0;
1364 _ecore_evas_x_state_update(ee);
1368 /* FIXME: Set gnome layer */
1372 _ecore_evas_x_init(void)
1374 _ecore_evas_init_count++;
1375 if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
1376 ecore_evas_event_handlers[0] =
1377 ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN,
1378 _ecore_evas_x_event_mouse_in, NULL);
1379 ecore_evas_event_handlers[1] =
1380 ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT,
1381 _ecore_evas_x_event_mouse_out, NULL);
1382 ecore_evas_event_handlers[2] =
1383 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN,
1384 _ecore_evas_x_event_window_focus_in, NULL);
1385 ecore_evas_event_handlers[3] =
1386 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT,
1387 _ecore_evas_x_event_window_focus_out, NULL);
1388 ecore_evas_event_handlers[4] =
1389 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DAMAGE,
1390 _ecore_evas_x_event_window_damage, NULL);
1391 ecore_evas_event_handlers[5] =
1392 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DESTROY,
1393 _ecore_evas_x_event_window_destroy, NULL);
1394 ecore_evas_event_handlers[6] =
1395 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE,
1396 _ecore_evas_x_event_window_configure, NULL);
1397 ecore_evas_event_handlers[7] =
1398 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST,
1399 _ecore_evas_x_event_window_delete_request, NULL);
1400 ecore_evas_event_handlers[8] =
1401 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW,
1402 _ecore_evas_x_event_window_show, NULL);
1403 ecore_evas_event_handlers[9] =
1404 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_HIDE,
1405 _ecore_evas_x_event_window_hide, NULL);
1406 ecore_evas_event_handlers[10] =
1407 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY,
1408 _ecore_evas_x_event_property_change, NULL);
1409 ecore_evas_event_handlers[11] =
1410 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE,
1411 _ecore_evas_x_event_visibility_change, NULL);
1412 ecore_evas_event_handlers[12] =
1413 ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE,
1414 _ecore_evas_x_event_client_message, NULL);
1415 ecore_event_evas_init();
1416 return _ecore_evas_init_count;
1420 _ecore_evas_x_free(Ecore_Evas *ee)
1422 _ecore_evas_x_group_leader_unset(ee);
1423 _ecore_evas_x_sync_set(ee);
1424 if (ee->engine.x.win_shaped_input)
1425 ecore_x_window_free(ee->engine.x.win_shaped_input);
1426 ecore_x_window_free(ee->prop.window);
1427 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
1428 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1429 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
1430 if (ee->engine.x.damages) ecore_x_xregion_free(ee->engine.x.damages);
1431 ee->engine.x.pmap = 0;
1432 ee->engine.x.mask = 0;
1433 ee->engine.x.gc = 0;
1434 ee->engine.x.damages = NULL;
1435 ecore_event_window_unregister(ee->prop.window);
1436 while (ee->engine.x.win_extra)
1438 Ecore_X_Window *winp;
1440 winp = ee->engine.x.win_extra->data;
1441 ee->engine.x.win_extra =
1442 eina_list_remove_list(ee->engine.x.win_extra, ee->engine.x.win_extra);
1443 ecore_event_window_unregister(*winp);
1446 _ecore_evas_x_shutdown();
1451 _ecore_evas_x_callback_delete_request_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
1453 ee->func.fn_delete_request = func;
1454 _ecore_evas_x_protocols_set(ee);
1455 _ecore_evas_x_sync_set(ee);
1459 _ecore_evas_x_move(Ecore_Evas *ee, int x, int y)
1463 if (ee->engine.x.direct_resize)
1465 if (!ee->engine.x.managed)
1467 if ((x != ee->x) || (y != ee->y))
1471 ecore_x_window_move(ee->prop.window, x, y);
1472 if (!ee->should_be_visible)
1474 /* We need to request pos */
1475 ee->prop.request_pos = 1;
1476 _ecore_evas_x_size_pos_hints_update(ee);
1478 if (ee->func.fn_move) ee->func.fn_move(ee);
1484 if (((ee->x != x) || (ee->y != y)) ||
1485 (ee->engine.x.configure_coming))
1487 ee->engine.x.configure_coming = 1;
1488 if (!ee->engine.x.managed)
1493 ecore_x_window_move(ee->prop.window, x, y);
1495 if (!ee->should_be_visible)
1497 /* We need to request pos */
1498 ee->prop.request_pos = 1;
1499 _ecore_evas_x_size_pos_hints_update(ee);
1505 _ecore_evas_x_managed_move(Ecore_Evas *ee, int x, int y)
1509 if (ee->engine.x.direct_resize)
1511 ee->engine.x.managed = 1;
1512 if ((x != ee->x) || (y != ee->y))
1516 if (ee->func.fn_move) ee->func.fn_move(ee);
1522 _ecore_evas_x_resize(Ecore_Evas *ee, int w, int h)
1526 if (ee->engine.x.direct_resize)
1528 if ((ee->w != w) || (ee->h != h))
1532 ecore_x_window_resize(ee->prop.window, w, h);
1533 if ((ee->rotation == 90) || (ee->rotation == 270))
1535 evas_output_size_set(ee->evas, ee->h, ee->w);
1536 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1540 evas_output_size_set(ee->evas, ee->w, ee->h);
1541 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1543 if (ee->prop.avoid_damage)
1547 pdam = ecore_evas_avoid_damage_get(ee);
1548 ecore_evas_avoid_damage_set(ee, 0);
1549 ecore_evas_avoid_damage_set(ee, pdam);
1551 if ((ee->shaped) || (ee->alpha))
1552 _ecore_evas_x_resize_shape(ee);
1553 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1556 else if (((ee->w != w) || (ee->h != h)) ||
1557 (ee->engine.x.configure_coming))
1559 ee->engine.x.configure_coming = 1;
1560 ecore_x_window_resize(ee->prop.window, w, h);
1565 _ecore_evas_x_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
1571 if (ee->engine.x.direct_resize)
1573 if ((ee->w != w) || (ee->h != h) || (x != ee->x) || (y != ee->y))
1575 int change_size = 0, change_pos = 0;
1577 if ((ee->w != w) || (ee->h != h)) change_size = 1;
1578 if (!ee->engine.x.managed)
1580 if ((x != ee->x) || (y != ee->y)) change_pos = 1;
1582 ecore_x_window_move_resize(ee->prop.window, x, y, w, h);
1583 if (!ee->engine.x.managed)
1590 if ((ee->rotation == 90) || (ee->rotation == 270))
1592 evas_output_size_set(ee->evas, ee->h, ee->w);
1593 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1597 evas_output_size_set(ee->evas, ee->w, ee->h);
1598 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1600 if (ee->prop.avoid_damage)
1604 pdam = ecore_evas_avoid_damage_get(ee);
1605 ecore_evas_avoid_damage_set(ee, 0);
1606 ecore_evas_avoid_damage_set(ee, pdam);
1608 if ((ee->shaped) || (ee->alpha))
1609 _ecore_evas_x_resize_shape(ee);
1612 if (ee->func.fn_move) ee->func.fn_move(ee);
1616 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1620 else if (((ee->w != w) || (ee->h != h) || (ee->x != x) || (ee->y != y)) ||
1621 (ee->engine.x.configure_coming))
1623 ee->engine.x.configure_coming = 1;
1624 ecore_x_window_move_resize(ee->prop.window, x, y, w, h);
1625 if (!ee->engine.x.managed)
1634 _ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize,
1635 Evas_Engine_Info *einfo)
1639 rot_dif = ee->rotation - rotation;
1640 if (rot_dif < 0) rot_dif = -rot_dif;
1644 int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
1646 if (!evas_engine_info_set(ee->evas, einfo))
1648 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1653 ee->engine.x.configure_coming = 1;
1654 if (!ee->prop.fullscreen)
1656 ecore_x_window_resize(ee->prop.window, ee->req.h, ee->req.w);
1657 ee->expecting_resize.w = ee->h;
1658 ee->expecting_resize.h = ee->w;
1664 ecore_x_window_size_get(ee->prop.window, &w, &h);
1665 ecore_x_window_resize(ee->prop.window, h, w);
1666 if ((rotation == 0) || (rotation == 180))
1668 evas_output_size_set(ee->evas, ee->req.w, ee->req.h);
1669 evas_output_viewport_set(ee->evas, 0, 0, ee->req.w, ee->req.h);
1673 evas_output_size_set(ee->evas, ee->req.h, ee->req.w);
1674 evas_output_viewport_set(ee->evas, 0, 0, ee->req.h, ee->req.w);
1676 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1678 if ((ee->rotation == 90) || (ee->rotation == 270))
1679 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.h, ee->req.w);
1681 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
1687 /* ecore_x_window_size_get(ee->prop.window, &w, &h); */
1688 if ((rotation == 0) || (rotation == 180))
1690 evas_output_size_set(ee->evas, ee->w, ee->h);
1691 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1695 evas_output_size_set(ee->evas, ee->h, ee->w);
1696 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1698 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1699 if ((ee->rotation == 90) || (ee->rotation == 270))
1700 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
1702 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1704 ecore_evas_size_min_get(ee, &minw, &minh);
1705 ecore_evas_size_max_get(ee, &maxw, &maxh);
1706 ecore_evas_size_base_get(ee, &basew, &baseh);
1707 ecore_evas_size_step_get(ee, &stepw, &steph);
1708 ee->rotation = rotation;
1709 ecore_evas_size_min_set(ee, minh, minw);
1710 ecore_evas_size_max_set(ee, maxh, maxw);
1711 ecore_evas_size_base_set(ee, baseh, basew);
1712 ecore_evas_size_step_set(ee, steph, stepw);
1713 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
1714 ecore_x_current_time_get());
1718 if (!evas_engine_info_set(ee->evas, einfo))
1720 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1722 ee->rotation = rotation;
1723 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
1724 ecore_x_current_time_get());
1725 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1727 if ((ee->rotation == 90) || (ee->rotation == 270))
1728 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
1730 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1734 #define _USE_WIN_ROT_EFFECT 1
1736 #if _USE_WIN_ROT_EFFECT
1737 static void _ecore_evas_x_flush_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__);
1739 typedef struct _Ecore_Evas_X_Rotation_Effect Ecore_Evas_X_Rotation_Effect;
1740 struct _Ecore_Evas_X_Rotation_Effect
1742 Eina_Bool wait_for_comp_reply;
1745 static Ecore_Evas_X_Rotation_Effect _rot_effect =
1751 _ecore_evas_x_rotation_effect_setup(void)
1753 _rot_effect.wait_for_comp_reply = EINA_TRUE;
1755 #endif /* end of _USE_WIN_ROT_EFFECT */
1758 _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize)
1760 if (ee->rotation == rotation) return;
1761 if (!strcmp(ee->driver, "xrender_x11")) return;
1763 #if _USE_WIN_ROT_EFFECT
1765 angles[0] = rotation;
1766 angles[1] = ee->rotation;
1767 #endif /* end of _USE_WIN_ROT_EFFECT */
1769 if (!strcmp(ee->driver, "opengl_x11"))
1771 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
1772 Evas_Engine_Info_GL_X11 *einfo;
1774 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
1776 einfo->info.rotation = rotation;
1777 _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
1778 (Evas_Engine_Info *)einfo);
1779 # if _USE_WIN_ROT_EFFECT
1780 ecore_x_window_prop_property_set(ee->prop.window,
1781 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1782 ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1784 ecore_x_window_prop_property_set(ee->prop.window,
1785 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1786 ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1788 #endif /* BUILD_ECORE_EVAS_OPENGL_X11 */
1790 else if (!strcmp(ee->driver, "software_x11"))
1792 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
1793 Evas_Engine_Info_Software_X11 *einfo;
1795 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
1797 einfo->info.rotation = rotation;
1798 _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
1799 (Evas_Engine_Info *)einfo);
1800 # if _USE_WIN_ROT_EFFECT
1801 ecore_x_window_prop_property_set(ee->prop.window,
1802 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1803 ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1805 ecore_x_window_prop_property_set(ee->prop.window,
1806 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1807 ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1809 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
1811 else if (!strcmp(ee->driver, "software_16_x11"))
1813 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
1814 Evas_Engine_Info_Software_16_X11 *einfo;
1816 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
1818 einfo->info.rotation = rotation;
1819 _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
1820 (Evas_Engine_Info *)einfo);
1821 # if _USE_WIN_ROT_EFFECT
1822 ecore_x_window_prop_property_set(ee->prop.window,
1823 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1824 ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1826 ecore_x_window_prop_property_set(ee->prop.window,
1827 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1828 ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1830 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
1832 else if (!strcmp(ee->driver, "software_8_x11"))
1834 #if BUILD_ECORE_EVAS_SOFTWARE_8_X11
1835 Evas_Engine_Info_Software_8_X11 *einfo;
1837 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
1839 einfo->info.rotation = rotation;
1840 _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
1841 (Evas_Engine_Info *)einfo);
1842 # if _USE_WIN_ROT_EFFECT
1843 ecore_x_window_prop_property_set(ee->prop.window,
1844 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1845 ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1847 ecore_x_window_prop_property_set(ee->prop.window,
1848 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1849 ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1851 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
1854 #if _USE_WIN_ROT_EFFECT
1855 if ((ee->visible) &&
1856 ((ecore_x_e_comp_sync_supported_get(ee->engine.x.win_root)) &&
1857 (!ee->no_comp_sync) && (_ecore_evas_app_comp_sync)) &&
1858 (ee->engine.x.sync_counter) &&
1859 (ee->engine.x.sync_val > 0))
1861 _ecore_evas_x_rotation_effect_setup();
1862 _ecore_evas_x_flush_pre(ee, NULL, NULL);
1864 #endif /* end of _USE_WIN_ROT_EFFECT */
1868 _ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped)
1870 if ((ee->shaped == shaped)) return;
1871 if (!strcmp(ee->driver, "opengl_x11")) return;
1872 if (!strcmp(ee->driver, "software_x11"))
1874 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
1875 Evas_Engine_Info_Software_X11 *einfo;
1877 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
1878 ee->shaped = shaped;
1883 unsigned int foreground;
1886 if (!ee->engine.x.mask)
1887 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1889 gc = ecore_x_gc_new(ee->engine.x.mask,
1890 ECORE_X_GC_VALUE_MASK_FOREGROUND,
1892 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
1893 0, 0, ee->w, ee->h);
1894 ecore_x_gc_free(gc);
1895 einfo->info.mask = ee->engine.x.mask;
1896 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1898 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1900 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1901 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1905 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1906 ee->engine.x.mask = 0;
1907 einfo->info.mask = 0;
1908 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1910 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1912 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1913 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1916 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
1918 else if (!strcmp(ee->driver, "software_16_x11"))
1920 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
1921 # if 0 /* XXX no shaped window support for software_16_x11 */
1922 Evas_Engine_Info_Software_16_X11 *einfo;
1924 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
1925 ee->shaped = shaped;
1931 ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1932 einfo->info.mask = ee->engine.x.mask;
1933 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1935 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1937 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1941 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1942 ee->engine.x.mask = 0;
1943 einfo->info.mask = 0;
1944 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1946 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1948 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1951 # endif /* XXX no shaped window support for software_16_x11 */
1952 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
1954 if (!strcmp(ee->driver, "software_8_x11"))
1956 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
1957 Evas_Engine_Info_Software_8_X11 *einfo;
1959 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
1960 ee->shaped = shaped;
1965 unsigned int foreground;
1968 if (!ee->engine.x.mask)
1969 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1971 gc = ecore_x_gc_new(ee->engine.x.mask,
1972 ECORE_X_GC_VALUE_MASK_FOREGROUND,
1974 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
1975 0, 0, ee->w, ee->h);
1976 ecore_x_gc_free(gc);
1977 einfo->info.mask = ee->engine.x.mask;
1978 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1980 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1982 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1983 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1987 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1988 ee->engine.x.mask = 0;
1989 einfo->info.mask = 0;
1990 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1992 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1994 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1995 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1998 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
2002 /* FIXME, round trip */
2004 _ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
2006 Ecore_X_Window_Attributes att;
2009 if ((ee->alpha == alpha)) return;
2011 if (!strcmp(ee->driver, "software_x11"))
2013 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
2014 Evas_Engine_Info_Software_X11 *einfo;
2016 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2019 if (!ecore_x_composite_query()) return;
2023 ecore_x_window_free(ee->prop.window);
2024 ecore_event_window_unregister(ee->prop.window);
2027 if (ee->prop.override)
2028 ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2030 ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2031 if (!ee->engine.x.mask)
2032 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2036 if (ee->prop.override)
2037 ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2039 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2040 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2041 ee->engine.x.mask = 0;
2042 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2045 einfo->info.destination_alpha = alpha;
2047 ecore_x_window_attributes_get(ee->prop.window, &att);
2048 einfo->info.visual = att.visual;
2049 einfo->info.colormap = att.colormap;
2050 einfo->info.depth = att.depth;
2052 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2053 // ee->engine.x.mask = 0;
2054 einfo->info.mask = ee->engine.x.mask;
2055 einfo->info.drawable = ee->prop.window;
2056 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2058 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2060 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2061 ecore_x_window_shape_mask_set(ee->prop.window, 0);
2062 ecore_x_input_multi_select(ee->prop.window);
2063 ecore_event_window_register(ee->prop.window, ee, ee->evas,
2064 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
2065 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
2066 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
2067 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
2068 if (ee->prop.borderless)
2069 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2070 if (ee->visible) ecore_x_window_show(ee->prop.window);
2071 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2074 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2075 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2078 ecore_x_icccm_name_class_set(ee->prop.window,
2079 ee->prop.name, ee->prop.clas);
2080 _ecore_evas_x_hints_update(ee);
2081 _ecore_evas_x_group_leader_update(ee);
2082 ecore_x_window_defaults_set(ee->prop.window);
2083 _ecore_evas_x_protocols_set(ee);
2084 _ecore_evas_x_sync_set(ee);
2085 _ecore_evas_x_size_pos_hints_update(ee);
2086 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
2087 if ((id = getenv("DESKTOP_STARTUP_ID")))
2089 ecore_x_netwm_startup_id_set(ee->prop.window, id);
2090 /* NB: on linux this may simply empty the env as opposed to completely
2091 * unset it to being empty - unsure as solartis libc crashes looking
2092 * for the '=' char */
2093 // putenv((char*)"DESKTOP_STARTUP_ID=");
2096 else if (!strcmp(ee->driver, "opengl_x11"))
2098 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
2099 Evas_Engine_Info_GL_X11 *einfo;
2101 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
2104 if (!ecore_x_composite_query()) return;
2108 ecore_x_window_free(ee->prop.window);
2109 ecore_event_window_unregister(ee->prop.window);
2110 ee->prop.window = 0;
2112 einfo->info.destination_alpha = alpha;
2114 if (ee->engine.x.win_root != 0)
2116 /* FIXME: round trip in ecore_x_window_argb_get */
2117 if (ecore_x_window_argb_get(ee->engine.x.win_root))
2120 _ecore_evas_x_gl_window_new(ee, ee->engine.x.win_root,
2121 ee->req.x, ee->req.y,
2122 ee->req.w, ee->req.h,
2123 ee->prop.override, 1, NULL);
2128 _ecore_evas_x_gl_window_new(ee, ee->engine.x.win_root,
2129 ee->req.x, ee->req.y,
2130 ee->req.w, ee->req.h,
2131 ee->prop.override, ee->alpha,
2138 _ecore_evas_x_gl_window_new(ee, ee->engine.x.win_root,
2139 ee->req.x, ee->req.y,
2140 ee->req.w, ee->req.h,
2141 ee->prop.override, ee->alpha, NULL);
2144 if (!ee->prop.window) return;
2148 if (ee->prop.override)
2149 ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2151 ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2152 if (!ee->engine.x.mask)
2153 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2157 if (ee->prop.override)
2158 ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2160 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2161 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2162 ee->engine.x.mask = 0;
2163 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2167 ecore_x_window_attributes_get(ee->prop.window, &att);
2168 einfo->info.visual = att.visual;
2169 einfo->info.colormap = att.colormap;
2170 einfo->info.depth = att.depth;
2172 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2173 // ee->engine.x.mask = 0;
2174 // einfo->info.mask = ee->engine.x.mask;
2175 einfo->info.drawable = ee->prop.window;
2176 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2178 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2180 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2181 // ecore_x_window_shape_mask_set(ee->prop.window, 0);
2182 ecore_x_input_multi_select(ee->prop.window);
2183 ecore_event_window_register(ee->prop.window, ee, ee->evas,
2184 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
2185 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
2186 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
2187 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
2188 if (ee->prop.borderless)
2189 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2190 if (ee->visible) ecore_x_window_show(ee->prop.window);
2191 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2194 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2195 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2198 ecore_x_icccm_name_class_set(ee->prop.window,
2199 ee->prop.name, ee->prop.clas);
2200 _ecore_evas_x_hints_update(ee);
2201 _ecore_evas_x_group_leader_update(ee);
2202 ecore_x_window_defaults_set(ee->prop.window);
2203 _ecore_evas_x_protocols_set(ee);
2204 _ecore_evas_x_sync_set(ee);
2205 _ecore_evas_x_size_pos_hints_update(ee);
2206 #endif /* BUILD_ECORE_EVAS_OPENGL_X11 */
2207 if ((id = getenv("DESKTOP_STARTUP_ID")))
2209 ecore_x_netwm_startup_id_set(ee->prop.window, id);
2210 /* NB: on linux this may simply empty the env as opposed to completely
2211 * unset it to being empty - unsure as solartis libc crashes looking
2212 * for the '=' char */
2213 // putenv((char*)"DESKTOP_STARTUP_ID=");
2216 else if (!strcmp(ee->driver, "software_16_x11"))
2218 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
2219 Evas_Engine_Info_Software_16_X11 *einfo;
2221 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
2226 ecore_x_window_free(ee->prop.window);
2227 ecore_event_window_unregister(ee->prop.window);
2230 if (ee->prop.override)
2231 ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2233 ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2234 if (!ee->engine.x.mask)
2235 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2239 if (ee->prop.override)
2240 ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2242 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2243 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2244 ee->engine.x.mask = 0;
2245 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2248 # if 0 /* XXX no alpha window support for software_16_x11 */
2249 einfo->info.destination_alpha = alpha;
2250 # endif /* XXX no alpha window support for software_16_x11 */
2252 # if 0 /* XXX no shaped window support for software_16_x11 */
2253 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2254 // ee->engine.x.mask = 0;
2255 einfo->info.mask = ee->engine.x.mask;
2256 # endif /* XXX no shaped window support for software_16_x11 */
2258 einfo->info.drawable = ee->prop.window;
2259 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2261 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2263 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2264 ecore_x_window_shape_mask_set(ee->prop.window, 0);
2265 ecore_x_input_multi_select(ee->prop.window);
2266 ecore_event_window_register(ee->prop.window, ee, ee->evas,
2267 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
2268 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
2269 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
2270 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
2271 if (ee->prop.borderless)
2272 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2273 if (ee->visible) ecore_x_window_show(ee->prop.window);
2274 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2277 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2278 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2281 ecore_x_icccm_name_class_set(ee->prop.window,
2282 ee->prop.name, ee->prop.clas);
2283 _ecore_evas_x_hints_update(ee);
2284 _ecore_evas_x_group_leader_update(ee);
2285 ecore_x_window_defaults_set(ee->prop.window);
2286 _ecore_evas_x_protocols_set(ee);
2287 _ecore_evas_x_sync_set(ee);
2288 _ecore_evas_x_size_pos_hints_update(ee);
2289 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
2290 if ((id = getenv("DESKTOP_STARTUP_ID")))
2292 ecore_x_netwm_startup_id_set(ee->prop.window, id);
2293 /* NB: on linux this may simply empty the env as opposed to completely
2294 * unset it to being empty - unsure as solartis libc crashes looking
2295 * for the '=' char */
2296 // putenv((char*)"DESKTOP_STARTUP_ID=");
2299 else if (!strcmp(ee->driver, "software_8_x11"))
2301 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
2302 Evas_Engine_Info_Software_8_X11 *einfo;
2304 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
2309 ecore_x_window_free(ee->prop.window);
2310 ecore_event_window_unregister(ee->prop.window);
2313 if (ee->prop.override)
2314 ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2316 ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2317 if (!ee->engine.x.mask)
2318 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2322 if (ee->prop.override)
2323 ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2325 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2326 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2327 ee->engine.x.mask = 0;
2328 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2331 einfo->info.destination_alpha = alpha;
2333 ecore_x_window_attributes_get(ee->prop.window, &att);
2334 einfo->info.visual = att.visual;
2335 einfo->info.colormap = att.colormap;
2336 einfo->info.depth = att.depth;
2338 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2339 // ee->engine.x.mask = 0;
2340 einfo->info.mask = ee->engine.x.mask;
2341 einfo->info.drawable = ee->prop.window;
2342 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2344 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2346 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2347 ecore_x_window_shape_mask_set(ee->prop.window, 0);
2348 ecore_x_input_multi_select(ee->prop.window);
2349 ecore_event_window_register(ee->prop.window, ee, ee->evas,
2350 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
2351 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
2352 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
2353 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
2354 if (ee->prop.borderless)
2355 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2356 if (ee->visible) ecore_x_window_show(ee->prop.window);
2357 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2360 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2361 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2364 ecore_x_icccm_name_class_set(ee->prop.window,
2365 ee->prop.name, ee->prop.clas);
2366 _ecore_evas_x_hints_update(ee);
2367 _ecore_evas_x_group_leader_update(ee);
2368 ecore_x_window_defaults_set(ee->prop.window);
2369 _ecore_evas_x_protocols_set(ee);
2370 _ecore_evas_x_sync_set(ee);
2371 _ecore_evas_x_size_pos_hints_update(ee);
2373 if ((id = getenv("DESKTOP_STARTUP_ID")))
2375 ecore_x_netwm_startup_id_set(ee->prop.window, id);
2376 /* NB: on linux this may simply empty the env as opposed to completely
2377 * unset it to being empty - unsure as solartis libc crashes looking
2378 * for the '=' char */
2379 // putenv((char*)"DESKTOP_STARTUP_ID=");
2381 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
2386 _ecore_evas_x_transparent_set(Ecore_Evas *ee, int transparent)
2388 if ((ee->transparent == transparent)) return;
2390 if (!strcmp(ee->driver, "software_x11"))
2392 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
2393 Evas_Engine_Info_Software_X11 *einfo;
2395 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2398 ee->transparent = transparent;
2399 einfo->info.destination_alpha = transparent;
2400 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2402 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2404 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2410 _ecore_evas_x_window_group_set(Ecore_Evas *ee, const Ecore_Evas *group_ee)
2412 if (ee->prop.group_ee == group_ee) return;
2414 ee->prop.group_ee = (Ecore_Evas *)group_ee;
2415 if (ee->prop.group_ee)
2416 ee->prop.group_ee_win = group_ee->prop.window;
2418 ee->prop.group_ee_win = 0;
2419 _ecore_evas_x_hints_update(ee);
2423 _ecore_evas_x_aspect_set(Ecore_Evas *ee, double aspect)
2425 if (ee->prop.aspect == aspect) return;
2427 ee->prop.aspect = aspect;
2428 _ecore_evas_x_size_pos_hints_update(ee);
2430 // if (ee->should_be_visible)
2431 // ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2432 // ECORE_X_WINDOW_STATE_STICKY, -1, sticky);
2434 // _ecore_evas_x_state_update(ee);
2438 _ecore_evas_x_urgent_set(Ecore_Evas *ee, int urgent)
2440 if (ee->prop.urgent == urgent) return;
2442 ee->prop.urgent = urgent;
2443 _ecore_evas_x_hints_update(ee);
2447 _ecore_evas_x_modal_set(Ecore_Evas *ee, int modal)
2449 if (ee->prop.modal == modal) return;
2451 ee->prop.modal = modal;
2452 if (ee->should_be_visible)
2453 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2454 ECORE_X_WINDOW_STATE_MODAL, -1, modal);
2456 _ecore_evas_x_state_update(ee);
2460 _ecore_evas_x_demand_attention_set(Ecore_Evas *ee, int demand)
2462 if (ee->prop.demand_attention == demand) return;
2464 ee->prop.demand_attention = demand;
2465 if (ee->should_be_visible)
2466 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2467 ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION, -1, demand);
2469 _ecore_evas_x_state_update(ee);
2473 _ecore_evas_x_focus_skip_set(Ecore_Evas *ee, int skip)
2475 if (ee->prop.focus_skip == skip) return;
2477 ee->prop.focus_skip = skip;
2478 if (ee->should_be_visible)
2480 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2481 ECORE_X_WINDOW_STATE_SKIP_TASKBAR, -1, skip);
2482 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2483 ECORE_X_WINDOW_STATE_SKIP_PAGER, -1, skip);
2486 _ecore_evas_x_state_update(ee);
2487 _ecore_evas_x_hints_update(ee);
2490 #endif /* BUILD_ECORE_EVAS_X11 */
2492 #ifdef BUILD_ECORE_EVAS_X11
2494 _ecore_evas_x_show(Ecore_Evas *ee)
2496 ee->should_be_visible = 1;
2497 if (ee->prop.avoid_damage)
2498 _ecore_evas_x_render(ee);
2499 _ecore_evas_x_sync_set(ee);
2500 ecore_x_window_show(ee->prop.window);
2501 if (ee->prop.fullscreen)
2502 ecore_x_window_focus(ee->prop.window);
2506 _ecore_evas_x_hide(Ecore_Evas *ee)
2508 ecore_x_window_hide(ee->prop.window);
2509 ee->should_be_visible = 0;
2510 _ecore_evas_x_sync_set(ee);
2514 _ecore_evas_x_raise(Ecore_Evas *ee)
2516 ecore_x_window_raise(ee->prop.window);
2520 _ecore_evas_x_lower(Ecore_Evas *ee)
2522 ecore_x_window_lower(ee->prop.window);
2526 _ecore_evas_x_activate(Ecore_Evas *ee)
2528 ecore_x_netwm_client_active_request(ee->engine.x.win_root,
2529 ee->prop.window, 2, 0);
2533 _ecore_evas_x_title_set(Ecore_Evas *ee, const char *t)
2535 if (ee->prop.title) free(ee->prop.title);
2536 ee->prop.title = NULL;
2537 if (t) ee->prop.title = strdup(t);
2538 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2539 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2543 _ecore_evas_x_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
2545 if (ee->prop.name) free(ee->prop.name);
2546 if (ee->prop.clas) free(ee->prop.clas);
2547 ee->prop.name = NULL;
2548 ee->prop.clas = NULL;
2549 if (n) ee->prop.name = strdup(n);
2550 if (c) ee->prop.clas = strdup(c);
2551 ecore_x_icccm_name_class_set(ee->prop.window, ee->prop.name, ee->prop.clas);
2555 _ecore_evas_x_size_min_set(Ecore_Evas *ee, int w, int h)
2559 if ((ee->prop.min.w == w) && (ee->prop.min.h == h)) return;
2562 _ecore_evas_x_size_pos_hints_update(ee);
2566 _ecore_evas_x_size_max_set(Ecore_Evas *ee, int w, int h)
2570 if ((ee->prop.max.w == w) && (ee->prop.max.h == h)) return;
2573 _ecore_evas_x_size_pos_hints_update(ee);
2577 _ecore_evas_x_size_base_set(Ecore_Evas *ee, int w, int h)
2581 if ((ee->prop.base.w == w) && (ee->prop.base.h == h)) return;
2582 ee->prop.base.w = w;
2583 ee->prop.base.h = h;
2584 _ecore_evas_x_size_pos_hints_update(ee);
2588 _ecore_evas_x_size_step_set(Ecore_Evas *ee, int w, int h)
2592 if ((ee->prop.step.w == w) && (ee->prop.step.h == h)) return;
2593 ee->prop.step.w = w;
2594 ee->prop.step.h = h;
2595 _ecore_evas_x_size_pos_hints_update(ee);
2599 _ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2604 if (ee) ee->prop.cursor.object = NULL;
2608 _ecore_evas_x_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
2612 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
2616 ee->prop.cursor.object = NULL;
2617 ee->prop.cursor.layer = 0;
2618 ee->prop.cursor.hot.x = 0;
2619 ee->prop.cursor.hot.y = 0;
2620 ecore_x_window_cursor_show(ee->prop.window, 1);
2624 ee->prop.cursor.object = obj;
2625 ee->prop.cursor.layer = layer;
2626 ee->prop.cursor.hot.x = hot_x;
2627 ee->prop.cursor.hot.y = hot_y;
2629 ecore_x_window_cursor_show(ee->prop.window, 0);
2631 evas_pointer_output_xy_get(ee->evas, &x, &y);
2632 evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
2633 evas_object_move(ee->prop.cursor.object,
2634 x - ee->prop.cursor.hot.x,
2635 y - ee->prop.cursor.hot.y);
2636 evas_object_pass_events_set(ee->prop.cursor.object, 1);
2637 if (evas_pointer_inside_get(ee->evas))
2638 evas_object_show(ee->prop.cursor.object);
2640 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
2645 * @param layer If < 3, @a ee will be put below all other windows.
2646 * If > 5, @a ee will be "always-on-top"
2647 * If = 4, @a ee will be put in the default layer.
2648 * Acceptable values range from 1 to 255 (0 reserved for
2652 _ecore_evas_x_layer_set(Ecore_Evas *ee, int layer)
2654 if (ee->prop.layer == layer) return;
2656 /* FIXME: Should this logic be here? */
2659 else if (layer > 255)
2662 ee->prop.layer = layer;
2663 _ecore_evas_x_layer_update(ee);
2667 _ecore_evas_x_focus_set(Ecore_Evas *ee, int on __UNUSED__)
2669 ecore_x_window_focus(ee->prop.window);
2673 _ecore_evas_x_iconified_set(Ecore_Evas *ee, int on)
2675 if (ee->prop.iconified == on) return;
2676 ee->prop.iconified = on;
2677 _ecore_evas_x_hints_update(ee);
2679 ecore_x_icccm_iconic_request_send(ee->prop.window, ee->engine.x.win_root);
2681 ecore_evas_show(ee);
2685 _ecore_evas_x_borderless_set(Ecore_Evas *ee, int on)
2687 if (ee->prop.borderless == on) return;
2688 ee->prop.borderless = on;
2689 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2692 /* FIXME: This function changes the initial state of the ee
2693 * whilest the iconic function changes the current state! */
2695 _ecore_evas_x_withdrawn_set(Ecore_Evas *ee, int withdrawn)
2697 if (ee->prop.withdrawn == withdrawn) return;
2698 ee->prop.withdrawn = withdrawn;
2699 _ecore_evas_x_hints_update(ee);
2703 _ecore_evas_x_sticky_set(Ecore_Evas *ee, int sticky)
2705 if (ee->prop.sticky == sticky) return;
2707 /* We dont want to set prop.sticky here as it will cause
2708 * the sticky callback not to get called. Its set on the
2709 * property change event.
2710 * ee->prop.sticky = sticky;
2712 ee->engine.x.state.sticky = sticky;
2713 if (ee->should_be_visible)
2714 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2715 ECORE_X_WINDOW_STATE_STICKY, -1, sticky);
2717 _ecore_evas_x_state_update(ee);
2721 _ecore_evas_x_ignore_events_set(Ecore_Evas *ee, int ignore)
2723 if (ee->ignore_events == ignore) return;
2725 ee->ignore_events = ignore;
2726 if (ee->prop.window)
2727 ecore_x_window_ignore_set(ee->prop.window, ignore);
2732 _ecore_evas_x_reinit_win(Ecore_Evas *ee)
2734 if (!strcmp(ee->driver, "software_x11"))
2736 #ifdef BUILD_ECORE_EVAS_X11
2737 Evas_Engine_Info_Software_X11 *einfo;
2739 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2742 einfo->info.drawable = ee->prop.window;
2743 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
2747 else if (!strcmp(ee->driver, "opengl_x11"))
2749 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
2750 Evas_Engine_Info_GL_X11 *einfo;
2752 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
2755 einfo->info.drawable = ee->prop.window;
2756 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
2764 _ecore_evas_x_override_set(Ecore_Evas *ee, int on)
2766 if (ee->prop.override == on) return;
2767 if (ee->should_be_visible) ecore_x_window_hide(ee->prop.window);
2768 ecore_x_window_override_set(ee->prop.window, on);
2769 if (ee->should_be_visible) ecore_x_window_show(ee->prop.window);
2770 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2771 ee->prop.override = on;
2775 _ecore_evas_x_fullscreen_set(Ecore_Evas *ee, int on)
2777 if (ee->prop.fullscreen == on) return;
2779 /* FIXME: Detect if WM is EWMH compliant and handle properly if not,
2780 * i.e. reposition, resize, and change borderless hint */
2781 ee->engine.x.state.fullscreen = on;
2782 if (ee->should_be_visible)
2783 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2784 ECORE_X_WINDOW_STATE_FULLSCREEN, -1, on);
2786 _ecore_evas_x_state_update(ee);
2790 _ecore_evas_x_profiles_set(Ecore_Evas *ee, const char **plist, int n)
2792 /* Ecore_Evas's profile will be updated when WM sets the E_PROFILE. */
2793 ecore_x_e_window_profile_list_set(ee->prop.window, plist, n);
2797 _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on)
2799 if (ee->prop.avoid_damage == on) return;
2800 if (!strcmp(ee->driver, "opengl_x11")) return;
2802 if (!strcmp(ee->driver, "software_x11"))
2804 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
2805 Evas_Engine_Info_Software_X11 *einfo;
2807 ee->prop.avoid_damage = on;
2808 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2811 if (ee->prop.avoid_damage)
2813 ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth);
2814 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2815 einfo->info.drawable = ee->engine.x.pmap;
2816 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2818 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2820 if ((ee->rotation == 90) || (ee->rotation == 270))
2821 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2823 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2824 if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN)
2826 ee->engine.x.using_bg_pixmap = 1;
2827 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2828 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2830 if (ee->engine.x.direct_resize)
2832 /* Turn this off for now
2833 ee->engine.x.using_bg_pixmap = 1;
2834 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2840 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2841 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2842 if (ee->engine.x.using_bg_pixmap)
2844 ecore_x_window_pixmap_set(ee->prop.window, 0);
2845 ee->engine.x.using_bg_pixmap = 0;
2846 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2848 ee->engine.x.pmap = 0;
2849 ee->engine.x.gc = 0;
2850 einfo->info.drawable = ee->prop.window;
2851 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2853 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2857 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
2859 else if (!strcmp(ee->driver, "software_16_x11"))
2861 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
2862 Evas_Engine_Info_Software_16_X11 *einfo;
2864 ee->prop.avoid_damage = on;
2865 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
2868 if (ee->prop.avoid_damage)
2870 ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 16);
2871 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2872 einfo->info.drawable = ee->engine.x.pmap;
2873 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2875 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2877 if ((ee->rotation == 90) || (ee->rotation == 270))
2878 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2880 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2881 if (ee->engine.x.direct_resize)
2883 /* Turn this off for now
2884 ee->engine.x.using_bg_pixmap = 1;
2885 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2891 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2892 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2893 if (ee->engine.x.using_bg_pixmap)
2895 ecore_x_window_pixmap_set(ee->prop.window, 0);
2896 ee->engine.x.using_bg_pixmap = 0;
2898 ee->engine.x.pmap = 0;
2899 ee->engine.x.gc = 0;
2900 einfo->info.drawable = ee->prop.window;
2901 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2903 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2907 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
2909 else if (!strcmp(ee->driver, "software_8_x11"))
2911 #if BUILD_ECORE_EVAS_SOFTWARE_8_X11
2912 Evas_Engine_Info_Software_8_X11 *einfo;
2914 ee->prop.avoid_damage = on;
2915 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
2918 if (ee->prop.avoid_damage)
2920 ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth);
2921 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2922 einfo->info.drawable = ee->engine.x.pmap;
2923 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2925 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2927 if ((ee->rotation == 90) || (ee->rotation == 270))
2928 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2930 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2931 if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN)
2933 ee->engine.x.using_bg_pixmap = 1;
2934 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2935 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2937 if (ee->engine.x.direct_resize)
2939 /* Turn this off for now
2940 ee->engine.x.using_bg_pixmap = 1;
2941 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2947 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2948 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2949 if (ee->engine.x.using_bg_pixmap)
2951 ecore_x_window_pixmap_set(ee->prop.window, 0);
2952 ee->engine.x.using_bg_pixmap = 0;
2953 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2955 ee->engine.x.pmap = 0;
2956 ee->engine.x.gc = 0;
2957 einfo->info.drawable = ee->prop.window;
2958 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2960 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2964 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
2969 _ecore_evas_x_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h)
2973 ecore_x_screen_size_get(ecore_x_default_screen_get(), w, h);
2977 _ecore_evas_x_shutdown(void)
2979 _ecore_evas_init_count--;
2980 if (_ecore_evas_init_count == 0)
2984 for (i = 0; i < sizeof(ecore_evas_event_handlers) / sizeof(Ecore_Event_Handler*); i++)
2986 if (ecore_evas_event_handlers[i])
2987 ecore_event_handler_del(ecore_evas_event_handlers[i]);
2989 ecore_event_evas_shutdown();
2991 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
2992 return _ecore_evas_init_count;
2995 static Ecore_Evas_Engine_Func _ecore_x_engine_func =
3002 _ecore_evas_x_callback_delete_request_set,
3013 _ecore_evas_x_managed_move,
3014 _ecore_evas_x_resize,
3015 _ecore_evas_x_move_resize,
3016 _ecore_evas_x_rotation_set,
3017 _ecore_evas_x_shaped_set,
3020 _ecore_evas_x_raise,
3021 _ecore_evas_x_lower,
3022 _ecore_evas_x_activate,
3023 _ecore_evas_x_title_set,
3024 _ecore_evas_x_name_class_set,
3025 _ecore_evas_x_size_min_set,
3026 _ecore_evas_x_size_max_set,
3027 _ecore_evas_x_size_base_set,
3028 _ecore_evas_x_size_step_set,
3029 _ecore_evas_x_object_cursor_set,
3030 _ecore_evas_x_layer_set,
3031 _ecore_evas_x_focus_set,
3032 _ecore_evas_x_iconified_set,
3033 _ecore_evas_x_borderless_set,
3034 _ecore_evas_x_override_set,
3036 _ecore_evas_x_fullscreen_set,
3037 _ecore_evas_x_avoid_damage_set,
3038 _ecore_evas_x_withdrawn_set,
3039 _ecore_evas_x_sticky_set,
3040 _ecore_evas_x_ignore_events_set,
3041 _ecore_evas_x_alpha_set,
3042 _ecore_evas_x_transparent_set,
3043 _ecore_evas_x_profiles_set,
3045 _ecore_evas_x_window_group_set,
3046 _ecore_evas_x_aspect_set,
3047 _ecore_evas_x_urgent_set,
3048 _ecore_evas_x_modal_set,
3049 _ecore_evas_x_demand_attention_set,
3050 _ecore_evas_x_focus_skip_set,
3053 _ecore_evas_x_screen_geometry_get
3055 #endif /* BUILD_ECORE_EVAS_X11 */
3058 * FIXME: there are some round trips. Especially, we can split
3059 * ecore_x_init in 2 functions and suppress some round trips.
3062 #if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_OPENGL_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_16_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
3064 _ecore_evas_x_flush_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
3066 Ecore_Evas *ee = data;
3068 if (ee->no_comp_sync) return;
3069 if (!_ecore_evas_app_comp_sync) return;
3070 if (ee->engine.x.sync_counter)
3072 if (ee->engine.x.sync_began)
3074 ee->engine.x.sync_val++;
3075 if (!ee->engine.x.sync_cancel)
3078 ecore_x_sync_counter_val_wait(ee->engine.x.sync_counter,
3079 ee->engine.x.sync_val);
3086 _ecore_evas_x_flush_post(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
3088 Ecore_Evas *ee = data;
3090 if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync) &&
3091 (!ee->gl_sync_draw_done)) // added by gl77.lee
3093 if (ee->engine.x.sync_counter)
3095 if (ee->engine.x.sync_began)
3097 if (!ee->engine.x.sync_cancel)
3099 ecore_x_e_comp_sync_draw_size_done_send
3100 (ee->engine.x.win_root, ee->prop.window, ee->w, ee->h);
3105 if (ee->engine.x.netwm_sync_set)
3107 ecore_x_sync_counter_2_set(ee->engine.x.netwm_sync_counter,
3108 ee->engine.x.netwm_sync_val_hi,
3109 ee->engine.x.netwm_sync_val_lo);
3110 ee->engine.x.netwm_sync_set = 0;
3116 * @brief Create Ecore_Evas using software x11.
3117 * @note If ecore is not compiled with support to x11 then nothing is done and NULL is returned.
3118 * @param disp_name The name of the Ecore_Evas to be created.
3119 * @param parent The parent of the Ecore_Evas to be created.
3120 * @param x The X coordinate to be used.
3121 * @param y The Y coordinate to be used.
3122 * @param w The width of the Ecore_Evas to be created.
3123 * @param h The height of the Ecore_Evas to be created.
3124 * @return A handle to the created Ecore_Evas.
3126 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3128 ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent,
3129 int x, int y, int w, int h)
3131 Evas_Engine_Info_Software_X11 *einfo;
3133 int argb = 0, rmethod;
3134 static int redraw_debug = -1;
3137 rmethod = evas_render_method_lookup("software_x11");
3138 if (!rmethod) return NULL;
3139 if (!ecore_x_init(disp_name)) return NULL;
3140 ee = calloc(1, sizeof(Ecore_Evas));
3141 if (!ee) return NULL;
3143 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3145 _ecore_evas_x_init();
3147 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3149 ee->driver = "software_x11";
3150 if (disp_name) ee->name = strdup(disp_name);
3163 ee->prop.max.w = 32767;
3164 ee->prop.max.h = 32767;
3166 ee->prop.request_pos = 0;
3167 ee->prop.sticky = 0;
3168 ee->engine.x.state.sticky = 0;
3170 /* init evas here */
3171 ee->evas = evas_new();
3172 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE,
3173 _ecore_evas_x_flush_pre, ee);
3174 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST,
3175 _ecore_evas_x_flush_post, ee);
3176 evas_data_attach_set(ee->evas, ee);
3177 evas_output_method_set(ee->evas, rmethod);
3178 evas_output_size_set(ee->evas, w, h);
3179 evas_output_viewport_set(ee->evas, 0, 0, w, h);
3181 ee->engine.x.win_root = parent;
3182 ee->engine.x.screen_num = 0;
3186 ee->engine.x.screen_num = 1; /* FIXME: get real scren # */
3187 /* FIXME: round trip in ecore_x_window_argb_get */
3188 if (ecore_x_window_argb_get(parent))
3190 ee->prop.window = ecore_x_window_argb_new(parent, x, y, w, h);
3194 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3197 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3198 if ((id = getenv("DESKTOP_STARTUP_ID")))
3200 ecore_x_netwm_startup_id_set(ee->prop.window, id);
3201 /* NB: on linux this may simply empty the env as opposed to completely
3202 * unset it to being empty - unsure as solartis libc crashes looking
3203 * for the '=' char */
3204 // putenv((char*)"DESKTOP_STARTUP_ID=");
3206 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
3209 Ecore_X_Screen *screen;
3211 /* FIXME: this is inefficient as its 1 or more round trips */
3212 screen = ecore_x_default_screen_get();
3213 if (ecore_x_screen_count_get() > 1)
3215 Ecore_X_Window *roots;
3219 roots = ecore_x_window_root_list(&num);
3222 Ecore_X_Window root;
3224 root = ecore_x_window_root_get(parent);
3225 for (i = 0; i < num; i++)
3227 if (root == roots[i])
3229 screen = ecore_x_screen_get(i);
3237 einfo->info.destination_alpha = argb;
3239 if (redraw_debug < 0)
3241 if (getenv("REDRAW_DEBUG"))
3242 redraw_debug = atoi(getenv("REDRAW_DEBUG"));
3247 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3248 einfo->info.backend = EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB;
3249 einfo->info.connection = ecore_x_connection_get();
3250 einfo->info.screen = screen;
3252 einfo->info.backend = EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB;
3253 einfo->info.connection = ecore_x_display_get();
3254 einfo->info.screen = NULL;
3256 einfo->info.drawable = ee->prop.window;
3258 # ifdef EVAS_FRAME_QUEUING
3262 render_mode = getenv("EVAS_RENDER_MODE");
3263 if ((render_mode) && (!strcmp(render_mode, "non-blocking")))
3264 einfo->render_mode = EVAS_RENDER_MODE_NONBLOCKING;
3270 Ecore_X_Window_Attributes at;
3272 ecore_x_window_attributes_get(ee->prop.window, &at);
3273 einfo->info.visual = at.visual;
3274 einfo->info.colormap = at.colormap;
3275 einfo->info.depth = at.depth;
3276 einfo->info.destination_alpha = 1;
3280 einfo->info.visual =
3281 ecore_x_default_visual_get(einfo->info.connection, screen);
3282 einfo->info.colormap =
3283 ecore_x_default_colormap_get(einfo->info.connection, screen);
3285 ecore_x_default_depth_get(einfo->info.connection, screen);
3286 einfo->info.destination_alpha = 0;
3289 einfo->info.rotation = 0;
3290 einfo->info.debug = redraw_debug;
3291 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3293 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3294 ecore_evas_free(ee);
3299 _ecore_evas_x_hints_update(ee);
3300 _ecore_evas_x_group_leader_set(ee);
3301 ecore_x_window_defaults_set(ee->prop.window);
3302 _ecore_evas_x_protocols_set(ee);
3303 _ecore_evas_x_sync_set(ee);
3305 ee->engine.func->fn_render = _ecore_evas_x_render;
3306 _ecore_evas_register(ee);
3307 ecore_x_input_multi_select(ee->prop.window);
3308 ecore_event_window_register(ee->prop.window, ee, ee->evas,
3309 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
3310 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
3311 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
3312 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
3317 ecore_evas_software_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3318 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3325 * @brief Get the window from Ecore_Evas using software x11.
3326 * @note If ecore is not compiled with support for x11 or if @p ee was not
3327 * created with ecore_evas_software_x11_new() then nothing is done and
3329 * @param ee The Ecore_Evas from which to get the window.
3330 * @return The window of type Ecore_X_Window.
3332 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3334 ecore_evas_software_x11_window_get(const Ecore_Evas *ee)
3336 if (!(!strcmp(ee->driver, "software_x11"))) return 0;
3337 return (Ecore_X_Window) ecore_evas_window_get(ee);
3341 ecore_evas_software_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3348 * @brief Set the direct_resize of Ecore_Evas using software x11.
3349 * @note If ecore is not compiled with support to x11 then nothing is done.
3350 * @param ee The Ecore_Evas in which to set direct resize.
3351 * @param on Enables the resize of Ecore_Evas if equals EINA_TRUE, disables if equals EINA_FALSE.
3353 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3355 ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3357 ee->engine.x.direct_resize = on;
3358 if (ee->prop.avoid_damage)
3360 if (ee->engine.x.direct_resize)
3362 /* turn this off for now
3363 ee->engine.x.using_bg_pixmap = 1;
3364 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
3369 /* turn this off too- bg pixmap is controlled by avoid damage directly
3370 ee->engine.x.using_bg_pixmap = 0;
3371 ecore_x_window_pixmap_set(ee->prop.window, 0);
3372 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
3379 ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3385 * @brief Gets if the Ecore_Evas is being directly resized using software x11.
3386 * @note If ecore is not compiled with support to x11 then nothing is done and EINA_FALSE is returned.
3387 * @param ee The Ecore_Evas from which to get direct resize.
3388 * @return EINA_TRUE if the resize was managed directly, otherwise return EINA_FALSE.
3390 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3392 ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee)
3394 return ee->engine.x.direct_resize;
3398 ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3405 * @brief Add extra window on Ecore_Evas using software x11.
3406 * @note If ecore is not compiled with support to x11 then nothing is done.
3407 * @param ee The Ecore_Evas on which to add the window.
3408 * @param win The window to be added at the Ecore_Evas.
3410 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3412 ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3414 Ecore_X_Window *winp;
3416 winp = malloc(sizeof(Ecore_X_Window));
3420 ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
3421 ecore_x_input_multi_select(win);
3422 ecore_event_window_register(win, ee, ee->evas,
3423 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
3424 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
3425 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
3426 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
3431 ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3437 * @brief Create Ecore_Evas using opengl x11.
3438 * @note If ecore is not compiled with support to x11 then nothing is done and NULL is returned.
3439 * @param disp_name The name of the display of the Ecore_Evas to be created.
3440 * @param parent The parent of the Ecore_Evas to be created.
3441 * @param x The X coordinate to be used.
3442 * @param y The Y coordinate to be used.
3443 * @param w The width of the Ecore_Evas to be created.
3444 * @param h The height of the Ecore_Evas to be created.
3445 * @return The new Ecore_Evas.
3447 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3449 ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent,
3450 int x, int y, int w, int h)
3452 return ecore_evas_gl_x11_options_new(disp_name, parent, x, y, w, h, NULL);
3456 ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent,
3457 int x, int y, int w, int h, const int *opt)
3463 rmethod = evas_render_method_lookup("gl_x11");
3464 if (!rmethod) return NULL;
3465 if (!ecore_x_init(disp_name)) return NULL;
3466 ee = calloc(1, sizeof(Ecore_Evas));
3467 if (!ee) return NULL;
3469 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3471 ee->gl_sync_draw_done = -1; // added by gl77.lee
3473 _ecore_evas_x_init();
3475 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3477 ee->driver = "opengl_x11";
3479 ee->semi_sync = 0; // gl engine doesn't need to sync - its whole swaps
3481 if (!getenv("ECORE_EVAS_COMP_NOSEMISYNC"))
3482 ee->semi_sync = 1; // gl engine doesn't need to sync - its whole swaps
3483 // ee->no_comp_sync = 1; // gl engine doesn't need to sync - its whole swaps
3485 if (disp_name) ee->name = strdup(disp_name);
3498 ee->prop.max.w = 32767;
3499 ee->prop.max.h = 32767;
3501 ee->prop.request_pos = 0;
3502 ee->prop.sticky = 0;
3503 ee->engine.x.state.sticky = 0;
3505 /* init evas here */
3506 ee->evas = evas_new();
3507 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3508 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3509 evas_data_attach_set(ee->evas, ee);
3510 evas_output_method_set(ee->evas, rmethod);
3511 evas_output_size_set(ee->evas, w, h);
3512 evas_output_viewport_set(ee->evas, 0, 0, w, h);
3514 if (parent == 0) parent = DefaultRootWindow(ecore_x_display_get());
3515 ee->engine.x.win_root = parent;
3517 if (ee->engine.x.win_root != 0)
3519 ee->engine.x.screen_num = 1; /* FIXME: get real scren # */
3520 /* FIXME: round trip in ecore_x_window_argb_get */
3521 if (ecore_x_window_argb_get(ee->engine.x.win_root))
3523 ee->prop.window = _ecore_evas_x_gl_window_new
3524 (ee, ee->engine.x.win_root, x, y, w, h, 0, 1, opt);
3527 ee->prop.window = _ecore_evas_x_gl_window_new
3528 (ee, ee->engine.x.win_root, x, y, w, h, 0, 0, opt);
3531 ee->prop.window = _ecore_evas_x_gl_window_new
3532 (ee, ee->engine.x.win_root, x, y, w, h, 0, 0, opt);
3533 if (!ee->prop.window)
3535 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3536 ecore_evas_free(ee);
3539 if ((id = getenv("DESKTOP_STARTUP_ID")))
3541 ecore_x_netwm_startup_id_set(ee->prop.window, id);
3542 /* NB: on linux this may simply empty the env as opposed to completely
3543 * unset it to being empty - unsure as solartis libc crashes looking
3544 * for the '=' char */
3545 // putenv((char*)"DESKTOP_STARTUP_ID=");
3548 _ecore_evas_x_hints_update(ee);
3549 _ecore_evas_x_group_leader_set(ee);
3550 ecore_x_window_defaults_set(ee->prop.window);
3551 _ecore_evas_x_protocols_set(ee);
3552 _ecore_evas_x_sync_set(ee);
3554 ee->engine.func->fn_render = _ecore_evas_x_render;
3555 _ecore_evas_register(ee);
3556 ecore_x_input_multi_select(ee->prop.window);
3557 ecore_event_window_register(ee->prop.window, ee, ee->evas,
3558 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
3559 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
3560 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
3561 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
3567 ecore_evas_gl_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3568 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3573 ecore_evas_gl_x11_options_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3574 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__, const int *opt __UNUSED__)
3578 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3581 * @brief Get the window from Ecore_Evas using opengl x11.
3582 * @note If ecore is not compiled with support for x11 or if @p ee was not
3583 * created with ecore_evas_gl_x11_new() then nothing is done and
3585 * @param ee The Ecore_Evas from which to get the window.
3586 * @return The window of type Ecore_X_Window of Ecore_Evas.
3588 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3590 ecore_evas_gl_x11_window_get(const Ecore_Evas *ee)
3592 if (!(!strcmp(ee->driver, "opengl_x11"))) return 0;
3593 return (Ecore_X_Window) ecore_evas_window_get(ee);
3597 ecore_evas_gl_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3601 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3604 * @brief Set direct_resize for Ecore_Evas using opengl x11.
3605 * @note If ecore is not compiled with support to x11 then nothing is done.
3606 * @param ee The Ecore_Evas in which to set direct resize.
3607 * @param on Enables the resize of Ecore_Evas if equals EINA_TRUE, disables if equals EINA_FALSE.
3609 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3611 ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3613 ee->engine.x.direct_resize = on;
3617 ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3620 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3623 * @brief Gets if the Ecore_Evas is being directly resized using opengl x11.
3624 * @note If ecore is not compiled with support to x11 then nothing is done and EINA_FALSE is returned.
3625 * @param ee The Ecore_Evas from which to get direct resize.
3626 * @return EINA_TRUE if the resize was managed directly, otherwise return EINA_FALSE.
3628 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3630 ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee)
3632 return ee->engine.x.direct_resize;
3636 ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3640 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3643 * @brief Add extra window on Ecore_Evas using opengl x11.
3644 * @note If ecore is not compiled with support to x11 then nothing is done.
3645 * @param ee The Ecore_Evas for which to add the window.
3646 * @param win The window to be added at the Ecore_Evas.
3648 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3650 ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3652 ecore_evas_software_x11_extra_event_window_add(ee, win);
3656 ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3659 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3662 * @brief Set the functions to be used before and after the swap callback.
3663 * @note If ecore is not compiled with support to x11 then nothing is done and the function is returned.
3664 * @param ee The Ecore_Evas for which to set the swap callback.
3665 * @param data The data for which to set the swap callback.
3666 * @param pre_cb The function to be called before the callback.
3667 * @param post_cb The function to be called after the callback.
3669 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3671 ecore_evas_gl_x11_pre_post_swap_callback_set(const Ecore_Evas *ee, void *data, void (*pre_cb) (void *data, Evas *e), void (*post_cb) (void *data, Evas *e))
3673 Evas_Engine_Info_GL_X11 *einfo;
3675 if (!(!strcmp(ee->driver, "opengl_x11"))) return;
3677 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
3680 einfo->callback.pre_swap = pre_cb;
3681 einfo->callback.post_swap = post_cb;
3682 einfo->callback.data = data;
3683 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3685 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
3691 ecore_evas_gl_x11_pre_post_swap_callback_set(const Ecore_Evas *ee __UNUSED__, void *data __UNUSED__, void (*pre_cb) (void *data, Evas *e) __UNUSED__, void (*post_cb) (void *data, Evas *e) __UNUSED__)
3695 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3698 ecore_evas_xrender_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3699 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3705 ecore_evas_xrender_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3711 ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3716 ecore_evas_xrender_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3722 ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3727 * @brief Create Ecore_Evas using software 16 x11.
3728 * @note If ecore is not compiled with support to x11 then nothing is done and NULL is returned.
3729 * @param disp_name The name of the display of the Ecore_Evas to be created.
3730 * @param parent The parent of the Ecore_Evas to be created.
3731 * @param x The X coordinate to be used.
3732 * @param y The Y coordinate to be used.
3733 * @param w The width of the Ecore_Evas to be created.
3734 * @param h The height of the Ecore_Evas to be created.
3735 * @return The new Ecore_Evas.
3737 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3739 ecore_evas_software_x11_16_new(const char *disp_name, Ecore_X_Window parent,
3740 int x, int y, int w, int h)
3742 Evas_Engine_Info_Software_16_X11 *einfo;
3745 static int redraw_debug = -1;
3747 rmethod = evas_render_method_lookup("software_16_x11");
3748 if (!rmethod) return NULL;
3749 if (!ecore_x_init(disp_name)) return NULL;
3750 ee = calloc(1, sizeof(Ecore_Evas));
3751 if (!ee) return NULL;
3753 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3755 _ecore_evas_x_init();
3757 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3759 ee->driver = "software_16_x11";
3760 if (disp_name) ee->name = strdup(disp_name);
3773 ee->prop.max.w = 32767;
3774 ee->prop.max.h = 32767;
3776 ee->prop.request_pos = 0;
3777 ee->prop.sticky = 0;
3778 ee->engine.x.state.sticky = 0;
3780 /* init evas here */
3781 ee->evas = evas_new();
3782 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3783 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3784 evas_data_attach_set(ee->evas, ee);
3785 evas_output_method_set(ee->evas, rmethod);
3786 evas_output_size_set(ee->evas, w, h);
3787 evas_output_viewport_set(ee->evas, 0, 0, w, h);
3789 ee->engine.x.win_root = parent;
3792 /* FIXME: round trip in ecore_x_window_argb_get */
3793 if (ecore_x_window_argb_get(parent))
3795 ee->prop.window = ecore_x_window_argb_new(parent, x, y, w, h);
3798 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3801 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3802 if (getenv("DESKTOP_STARTUP_ID"))
3804 ecore_x_netwm_startup_id_set(ee->prop.window,
3805 getenv("DESKTOP_STARTUP_ID"));
3806 /* NB: on linux this may simply empty the env as opposed to completely
3807 * unset it to being empty - unsure as solartis libc crashes looking
3808 * for the '=' char */
3809 // putenv((char*)"DESKTOP_STARTUP_ID=");
3811 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
3815 if (ScreenCount(ecore_x_display_get()) > 1)
3817 Ecore_X_Window *roots;
3821 roots = ecore_x_window_root_list(&num);
3824 XWindowAttributes at;
3826 if (XGetWindowAttributes(ecore_x_display_get(),
3829 for (i = 0; i < num; i++)
3831 if (at.root == roots[i])
3839 if (redraw_debug < 0)
3841 if (getenv("REDRAW_DEBUG"))
3842 redraw_debug = atoi(getenv("REDRAW_DEBUG"));
3846 einfo->info.display = ecore_x_display_get();
3847 einfo->info.drawable = ee->prop.window;
3849 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3851 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3852 ecore_evas_free(ee);
3858 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3859 ecore_evas_free(ee);
3863 _ecore_evas_x_hints_update(ee);
3864 _ecore_evas_x_group_leader_set(ee);
3865 ecore_x_window_defaults_set(ee->prop.window);
3866 _ecore_evas_x_protocols_set(ee);
3867 _ecore_evas_x_sync_set(ee);
3869 ee->engine.func->fn_render = _ecore_evas_x_render;
3870 _ecore_evas_register(ee);
3871 ecore_x_input_multi_select(ee->prop.window);
3872 ecore_event_window_register(ee->prop.window, ee, ee->evas,
3873 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
3874 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
3875 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
3876 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
3881 ecore_evas_software_x11_16_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3882 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3886 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
3889 * @brief Get the window from Ecore_Evas using software 16 x11.
3890 * @note If ecore is not compiled with support for x11 or if @p ee was not
3891 * created with ecore_evas_software_x11_16_new() then nothing is done and
3893 * @param ee The Ecore_Evas from which to get the window.
3894 * @return The window of type Ecore_X_Window of Ecore_Evas.
3896 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3898 ecore_evas_software_x11_16_window_get(const Ecore_Evas *ee)
3900 if (!(!strcmp(ee->driver, "software_16_x11"))) return 0;
3901 return (Ecore_X_Window) ecore_evas_window_get(ee);
3905 ecore_evas_software_x11_16_window_get(const Ecore_Evas *ee __UNUSED__)
3909 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
3912 * @brief Set direct_resize for Ecore_Evas using software 16 x11.
3913 * @note If ecore is not compiled with support to x11 then nothing is done.
3914 * @param ee The Ecore_Evas in which to set direct resize.
3915 * @param on Enables the resize of Ecore_Evas if equals EINA_TRUE, disables if equals EINA_FALSE.
3917 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3919 ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3921 ee->engine.x.direct_resize = on;
3922 if (ee->prop.avoid_damage)
3924 if (ee->engine.x.direct_resize)
3926 /* turn this off for now
3927 ee->engine.x.using_bg_pixmap = 1;
3928 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
3933 /* turn this off too- bg pixmap is controlled by avoid damage directly
3934 ee->engine.x.using_bg_pixmap = 0;
3935 ecore_x_window_pixmap_set(ee->prop.window, 0);
3936 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
3943 ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3946 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
3949 * @brief Gets if the Ecore_Evas is being directly resized using software 16 x11.
3950 * @note If ecore is not compiled with support to x11 then nothing is done and 0 is returned.
3951 * @param ee The Ecore_Evas from which to get direct resize.
3952 * @return EINA_TRUE if the resize was managed directly, otherwise return EINA_FALSE.
3954 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3956 ecore_evas_software_x11_16_direct_resize_get(const Ecore_Evas *ee)
3958 return ee->engine.x.direct_resize;
3962 ecore_evas_software_x11_16_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3966 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
3969 * @brief Add extra window on Ecore_Evas using software 16 x11.
3970 * @note If ecore is not compiled with support to x11 then nothing is done.
3971 * @param ee The Ecore_Evas on which to add the window.
3972 * @param win The window to be added at the Ecore_Evas.
3974 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3976 ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3978 Ecore_X_Window *winp;
3980 winp = malloc(sizeof(Ecore_X_Window));
3984 ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
3985 ecore_x_input_multi_select(win);
3986 ecore_event_window_register(win, ee, ee->evas,
3987 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
3988 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
3989 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
3990 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
3995 ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3998 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
4002 * @brief Create Ecore_Evas using software 8 x11.
4003 * @note If ecore is not compiled with support to x11 then nothing is done and NULL is returned.
4004 * @param disp_name The name of the display of the Ecore_Evas to be created.
4005 * @param parent The parent of the Ecore_Evas to be created.
4006 * @param x The X coordinate to be used.
4007 * @param y The Y coordinate to be used.
4008 * @param w The width of the Ecore_Evas to be created.
4009 * @param h The height of the Ecore_Evas to be created.
4010 * @return The new Ecore_Evas.
4013 ecore_evas_software_x11_8_new(const char *disp_name, Ecore_X_Window parent,
4014 int x, int y, int w, int h)
4016 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4017 Evas_Engine_Info_Software_8_X11 *einfo;
4021 static int redraw_debug = -1;
4023 rmethod = evas_render_method_lookup("software_8_x11");
4024 if (!rmethod) return NULL;
4025 if (!ecore_x_init(disp_name)) return NULL;
4026 ee = calloc(1, sizeof(Ecore_Evas));
4027 if (!ee) return NULL;
4029 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
4031 _ecore_evas_x_init();
4033 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
4035 ee->driver = "software_8_x11";
4036 if (disp_name) ee->name = strdup(disp_name);
4049 ee->prop.max.w = 32767;
4050 ee->prop.max.h = 32767;
4052 ee->prop.request_pos = 0;
4053 ee->prop.sticky = 0;
4054 ee->engine.x.state.sticky = 0;
4056 /* init evas here */
4057 ee->evas = evas_new();
4058 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
4059 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
4060 evas_data_attach_set(ee->evas, ee);
4061 evas_output_method_set(ee->evas, rmethod);
4062 evas_output_size_set(ee->evas, w, h);
4063 evas_output_viewport_set(ee->evas, 0, 0, w, h);
4065 ee->engine.x.win_root = parent;
4068 // /* FIXME: round trip in ecore_x_window_argb_get */
4069 // if (ecore_x_window_argb_get(parent))
4071 // ee->engine.x.win = ecore_x_window_argb_new(parent, x, y, w, h);
4075 // ee->engine.x.win = ecore_x_window_new(parent, x, y, w, h);
4078 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
4079 if (getenv("DESKTOP_STARTUP_ID"))
4081 ecore_x_netwm_startup_id_set(ee->prop.window,
4082 getenv("DESKTOP_STARTUP_ID"));
4083 /* NB: on linux this may simply empty the env as opposed to completely
4084 * unset it to being empty - unsure as solartis libc crashes looking
4085 * for the '=' char */
4086 // putenv((char*)"DESKTOP_STARTUP_ID=");
4088 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
4091 xcb_screen_iterator_t iter;
4092 xcb_screen_t *screen;
4094 /* FIXME: this is inefficient as its a round trip */
4095 //einfo->info.backend = 1;
4096 screen = ecore_x_default_screen_get();
4097 iter = xcb_setup_roots_iterator (xcb_get_setup (ecore_x_connection_get()));
4100 xcb_get_geometry_cookie_t cookie;
4101 xcb_get_geometry_reply_t *reply;
4102 Ecore_X_Window *roots;
4107 cookie = xcb_get_geometry_unchecked(ecore_x_connection_get(), parent);
4108 roots = ecore_x_window_root_list(&num);
4111 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
4115 for (i = 0; i < num; xcb_screen_next (&iter), i++)
4117 if (reply->root == roots[i])
4129 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
4130 if (reply) free(reply);
4134 if (redraw_debug < 0)
4136 if (getenv("REDRAW_DEBUG"))
4137 redraw_debug = atoi(getenv("REDRAW_DEBUG"));
4141 einfo->info.connection = ecore_x_connection_get();
4142 einfo->info.screen = screen;
4143 einfo->info.drawable = ee->prop.window;
4146 /* FIXME: round trip */
4147 xcb_get_geometry_cookie_t cookie_geom;
4148 xcb_get_window_attributes_cookie_t cookie_attr;
4149 xcb_get_geometry_reply_t *reply_geom;
4150 xcb_get_window_attributes_reply_t *reply_attr;
4152 cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->prop.window);
4153 cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
4155 reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
4156 reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
4157 if (reply_attr && reply_geom)
4159 einfo->info.visual = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
4160 einfo->info.colormap = reply_attr->colormap;
4161 einfo->info.depth = reply_geom->depth;
4162 einfo->info.destination_alpha = 1;
4169 xcb_screen_t *screen;
4171 screen = ecore_x_default_screen_get();
4172 einfo->info.visual = xcb_visualtype_get(screen, screen->root_visual);
4173 einfo->info.colormap = screen->default_colormap;
4174 einfo->info.depth = screen->root_depth;
4175 einfo->info.destination_alpha = 0;
4177 einfo->info.rotation = 0;
4178 einfo->info.debug = redraw_debug;
4179 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
4181 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
4182 ecore_evas_free(ee);
4188 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
4189 ecore_evas_free(ee);
4193 _ecore_evas_x_hints_update(ee);
4194 _ecore_evas_x_group_leader_set(ee);
4195 ecore_x_window_defaults_set(ee->prop.window);
4196 _ecore_evas_x_protocols_set(ee);
4197 _ecore_evas_x_sync_set(ee);
4199 ee->engine.func->fn_render = _ecore_evas_x_render;
4200 _ecore_evas_register(ee);
4201 ecore_x_input_multi_select(ee->prop.window);
4202 ecore_event_window_register(ee->prop.window, ee, ee->evas,
4203 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
4204 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
4205 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
4206 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
4217 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
4221 * @brief Get window from Ecore_Evas using software 8 x11.
4222 * @note If ecore is not compiled with support for x11 or if @p ee was not
4223 * created with ecore_evas_software_x11_8_new() then nothing is done and
4225 * @param ee The Ecore_Evas from which to get the window.
4226 * @return The window of type Ecore_X_Window of Ecore_Evas.
4229 ecore_evas_software_x11_8_window_get(const Ecore_Evas *ee)
4231 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4232 if (!(!strcmp(ee->driver, "software_8_x11"))) return 0;
4233 return (Ecore_X_Window) ecore_evas_window_get(ee);
4241 * @brief Get subwindow from Ecore_Evas using software 8 x11.
4242 * @note If ecore is not compiled with support for x11 or if @p ee was not
4243 * created with ecore_evas_software_x11_8_new() then nothing is done and
4245 * @param ee The Ecore_Evas from which to get the subwindow.
4246 * @return The window of type Ecore_X_Window of Ecore_Evas.
4249 ecore_evas_software_x11_8_subwindow_get(const Ecore_Evas *ee)
4251 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4252 if (!(!strcmp(ee->driver, "software_8_x11"))) return 0;
4253 return (Ecore_X_Window) ecore_evas_window_get(ee);
4261 * @brief Set direct_size for Ecore_Evas using software 8 x11.
4262 * @note If ecore is not compiled with support to x11 then nothing is done and the function is returned.
4263 * @param ee The Ecore_Evas in which to set direct resize.
4264 * @param on Enables the resize of Ecore_Evas if equals EINA_TRUE, disables if equals EINA_FALSE.
4267 ecore_evas_software_x11_8_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
4269 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4270 ee->engine.x.direct_resize = on;
4271 if (ee->prop.avoid_damage)
4273 if (ee->engine.x.direct_resize)
4275 /* turn this off for now
4276 ee->engine.x.using_bg_pixmap = 1;
4277 ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap);
4282 /* turn this off too- bg pixmap is controlled by avoid damage directly
4283 ee->engine.x.using_bg_pixmap = 0;
4284 ecore_x_window_pixmap_set(ee->engine.x.win, 0);
4285 ecore_x_window_area_expose(ee->engine.x.win, 0, 0, ee->w, ee->h);
4297 * @brief Gets if the Ecore_Evas is being directly resized using software 8 x11.
4298 * @note If ecore is not compiled with support to x11 then nothing is done and 0 is returned.
4299 * @param ee The Ecore_Evas from which to get direct resize.
4300 * @return EINA_TRUE if the resize was managed directly, otherwise return EINA_FALSE.
4303 ecore_evas_software_x11_8_direct_resize_get(const Ecore_Evas *ee)
4305 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4306 return ee->engine.x.direct_resize;
4314 * @brief Add extra window on Ecore_Evas using software 8 x11.
4315 * @note If ecore is not compiled with support to x11 then nothing is done and the function is returned.
4316 * @param ee The Ecore_Evas on which to add the window.
4317 * @param win The window to be added at Ecore_Evas.
4320 ecore_evas_software_x11_8_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
4322 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4323 Ecore_X_Window *winp;
4325 winp = malloc(sizeof(Ecore_X_Window));
4329 ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
4330 ecore_x_input_multi_select(win);
4331 ecore_event_window_register(win, ee, ee->evas,
4332 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
4333 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
4334 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
4335 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
4345 ecore_evas_x11_leader_set(Ecore_Evas *ee, Ecore_X_Window win)
4347 #ifdef BUILD_ECORE_EVAS_X11
4348 _ecore_evas_x_group_leader_unset(ee);
4349 ee->engine.x.leader = win;
4350 _ecore_evas_x_group_leader_update(ee);
4359 ecore_evas_x11_leader_get(Ecore_Evas *ee)
4361 #ifdef BUILD_ECORE_EVAS_X11
4362 return ee->engine.x.leader;
4370 ecore_evas_x11_leader_default_set(Ecore_Evas *ee)
4372 #ifdef BUILD_ECORE_EVAS_X11
4373 _ecore_evas_x_group_leader_unset(ee);
4374 _ecore_evas_x_group_leader_set(ee);
4381 #ifdef BUILD_ECORE_EVAS_X11
4383 _ecore_evas_x11_convert_rectangle_with_angle(Ecore_Evas *ee, Ecore_X_Rectangle *dst_rect, Ecore_X_Rectangle *src_rect)
4385 if ((!src_rect) || (!dst_rect)) return 0;
4387 if (ee->rotation == 0)
4389 dst_rect->x = src_rect->x;
4390 dst_rect->y = src_rect->y;
4391 dst_rect->width = src_rect->width;
4392 dst_rect->height = src_rect->height;
4394 else if (ee->rotation == 90)
4396 dst_rect->x = src_rect->y;
4397 dst_rect->y = ee->req.h - src_rect->x - src_rect->width;
4398 dst_rect->width = src_rect->height;
4399 dst_rect->height = src_rect->width;
4401 else if (ee->rotation == 180)
4403 dst_rect->x = ee->req.w - src_rect->x - src_rect->width;
4404 dst_rect->y = ee->req.h - src_rect->y - src_rect->height;
4405 dst_rect->width = src_rect->width;
4406 dst_rect->height = src_rect->height;
4408 else if (ee->rotation == 270)
4410 dst_rect->x = ee->req.w - src_rect->y - src_rect->height;
4411 dst_rect->y = src_rect->x;
4412 dst_rect->width = src_rect->height;
4413 dst_rect->height = src_rect->width;
4425 ecore_evas_x11_shape_input_rectangle_set(Ecore_Evas *ee, int x, int y, int w, int h)
4427 #ifdef BUILD_ECORE_EVAS_X11
4429 Ecore_X_Rectangle src_rect;
4430 Ecore_X_Rectangle dst_rect;
4432 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4434 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4435 "ecore_evas_x11_shape_input_rectangle_set");
4442 src_rect.height = h;
4447 dst_rect.height = 0;
4449 ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
4451 if (!ee->engine.x.win_shaped_input)
4452 ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root,
4456 ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input,
4457 dst_rect.x, dst_rect.y,
4458 dst_rect.width, dst_rect.height);
4470 ecore_evas_x11_shape_input_rectangle_add(Ecore_Evas *ee, int x, int y, int w, int h)
4472 #ifdef BUILD_ECORE_EVAS_X11
4474 Ecore_X_Rectangle src_rect;
4475 Ecore_X_Rectangle dst_rect;
4477 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4479 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4480 "ecore_evas_x11_shape_input_rectangle_add");
4487 src_rect.height = h;
4492 dst_rect.height = 0;
4494 ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
4496 if (!ee->engine.x.win_shaped_input)
4497 ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root,
4501 ecore_x_window_shape_input_rectangle_add(ee->engine.x.win_shaped_input,
4502 dst_rect.x, dst_rect.y,
4503 dst_rect.width, dst_rect.height);
4515 ecore_evas_x11_shape_input_rectangle_subtract(Ecore_Evas *ee, int x, int y, int w, int h)
4517 #ifdef BUILD_ECORE_EVAS_X11
4519 Ecore_X_Rectangle src_rect;
4520 Ecore_X_Rectangle dst_rect;
4522 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4524 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4525 "ecore_evas_x11_shape_input_rectangle_subtract");
4532 src_rect.height = h;
4537 dst_rect.height = 0;
4539 ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
4541 if (!ee->engine.x.win_shaped_input)
4542 ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root,
4546 ecore_x_window_shape_input_rectangle_subtract(ee->engine.x.win_shaped_input,
4547 dst_rect.x, dst_rect.y,
4548 dst_rect.width, dst_rect.height);
4560 ecore_evas_x11_shape_input_empty(Ecore_Evas *ee)
4562 #ifdef BUILD_ECORE_EVAS_X11
4563 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4565 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4566 "ecore_evas_x11_shape_input_empty");
4570 if (!ee->engine.x.win_shaped_input)
4571 ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root, 0, 0, 1, 1);
4573 ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input, 0, 0, 0, 0);
4581 ecore_evas_x11_shape_input_reset(Ecore_Evas *ee)
4583 #ifdef BUILD_ECORE_EVAS_X11
4584 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4586 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4587 "ecore_evas_x11_shape_input_reset");
4591 if (!ee->engine.x.win_shaped_input)
4592 ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root, 0, 0, 1, 1);
4594 ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input, 0, 0, 65535, 65535);
4602 ecore_evas_x11_shape_input_apply(Ecore_Evas *ee)
4604 #ifdef BUILD_ECORE_EVAS_X11
4605 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4607 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4608 "ecore_evas_x11_shape_input_apply");
4612 if (!ee->engine.x.win_shaped_input) return;
4614 ecore_x_window_shape_input_window_set(ee->prop.window, ee->engine.x.win_shaped_input);