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 ecore_x_window_shape_mask_set(ee->prop.window,
308 // ecore_x_window_shape_input_mask_set(ee->prop.window, ee->engine.x.mask);
310 evas_render_updates_free(updates);
311 _ecore_evas_idle_timeout_update(ee);
322 EINA_LIST_FOREACH(updates, l, r)
324 Ecore_X_Rectangle rect;
325 Ecore_X_XRegion *tmpr;
327 if (!ee->engine.x.damages)
328 ee->engine.x.damages = ecore_x_xregion_new();
329 tmpr = ecore_x_xregion_new();
330 if (ee->rotation == 0)
337 else if (ee->rotation == 90)
340 rect.y = ee->h - r->x - r->w;
344 else if (ee->rotation == 180)
346 rect.x = ee->w - r->x - r->w;
347 rect.y = ee->h - r->y - r->h;
351 else if (ee->rotation == 270)
353 rect.x = ee->w - r->y - r->h;
358 ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages,
360 ecore_x_xregion_free(ee->engine.x.damages);
361 ee->engine.x.damages = tmpr;
363 if (ee->engine.x.damages)
365 /* if we have a damage pixmap - we can avoid exposures by
366 * disabling them just for setting the mask */
367 ecore_x_event_mask_set(ee->prop.window,
368 ECORE_X_EVENT_MASK_KEY_DOWN |
369 ECORE_X_EVENT_MASK_KEY_UP |
370 ECORE_X_EVENT_MASK_MOUSE_DOWN |
371 ECORE_X_EVENT_MASK_MOUSE_UP |
372 ECORE_X_EVENT_MASK_MOUSE_IN |
373 ECORE_X_EVENT_MASK_MOUSE_OUT |
374 ECORE_X_EVENT_MASK_MOUSE_MOVE |
375 // ECORE_X_EVENT_MASK_WINDOW_DAMAGE |
376 ECORE_X_EVENT_MASK_WINDOW_VISIBILITY |
377 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE |
378 ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE |
379 ECORE_X_EVENT_MASK_WINDOW_PROPERTY |
380 ECORE_X_EVENT_MASK_WINDOW_COLORMAP
383 ecore_x_window_shape_mask_set(ee->prop.window,
385 /* and re-enable them again */
386 ecore_x_event_mask_set(ee->prop.window,
387 ECORE_X_EVENT_MASK_KEY_DOWN |
388 ECORE_X_EVENT_MASK_KEY_UP |
389 ECORE_X_EVENT_MASK_MOUSE_DOWN |
390 ECORE_X_EVENT_MASK_MOUSE_UP |
391 ECORE_X_EVENT_MASK_MOUSE_IN |
392 ECORE_X_EVENT_MASK_MOUSE_OUT |
393 ECORE_X_EVENT_MASK_MOUSE_MOVE |
394 ECORE_X_EVENT_MASK_WINDOW_DAMAGE |
395 ECORE_X_EVENT_MASK_WINDOW_VISIBILITY |
396 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE |
397 ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE |
398 ECORE_X_EVENT_MASK_WINDOW_PROPERTY |
399 ECORE_X_EVENT_MASK_WINDOW_COLORMAP
401 ecore_x_xregion_set(ee->engine.x.damages, ee->engine.x.gc);
402 ecore_x_pixmap_paste(ee->engine.x.pmap, ee->prop.window,
403 ee->engine.x.gc, 0, 0, ee->w, ee->h,
405 ecore_x_xregion_free(ee->engine.x.damages);
406 ee->engine.x.damages = NULL;
408 evas_render_updates_free(updates);
409 _ecore_evas_idle_timeout_update(ee);
414 else if (((ee->visible) && (ee->draw_ok)) ||
415 ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
416 ((ee->should_be_visible) && (ee->prop.override)))
422 ecore_x_window_shape_mask_set(ee->prop.window,
427 // ecore_x_window_shape_input_mask_set(ee->prop.window, ee->engine.x.mask);
429 evas_render_updates_free(updates);
430 _ecore_evas_idle_timeout_update(ee);
435 evas_norender(ee->evas);
436 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
440 static int frames = 0;
441 static double t0 = 0.0;
444 t = ecore_time_get();
449 printf("FPS: %3.3f\n", (double)frames / td);
460 _ecore_evas_x_resize_shape(Ecore_Evas *ee)
462 if (!strcmp(ee->driver, "software_x11"))
464 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
465 Evas_Engine_Info_Software_X11 *einfo;
467 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
470 unsigned int foreground;
473 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
474 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
476 gc = ecore_x_gc_new(ee->engine.x.mask,
477 ECORE_X_GC_VALUE_MASK_FOREGROUND,
479 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
482 einfo->info.mask = ee->engine.x.mask;
483 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
485 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
487 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
489 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
491 else if (!strcmp(ee->driver, "software_16_x11"))
493 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
494 # if 0 /* XXX no shaped window support for software_16_x11 */
495 Evas_Engine_Info_Software_16_X11 *einfo;
497 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
500 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
501 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
502 einfo->info.mask = ee->engine.x.mask;
503 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
505 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
507 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
509 # endif /* XXX no shaped window support for software_16_x11 */
510 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
512 if (!strcmp(ee->driver, "software_8_x11"))
514 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
515 Evas_Engine_Info_Software_8_X11 *einfo;
517 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
520 unsigned int foreground;
523 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
524 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
526 gc = ecore_x_gc_new(ee->engine.x.mask,
527 ECORE_X_GC_VALUE_MASK_FOREGROUND,
529 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
532 einfo->info.mask = ee->engine.x.mask;
533 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
535 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
537 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
539 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
543 /* TODO: we need to make this work for all the states, not just sticky */
545 _ecore_evas_x_event_property_change(void *data __UNUSED__, int type __UNUSED__, void *event)
548 Ecore_X_Event_Window_Property *e;
549 int state_change = 0;
552 ee = ecore_event_window_match(e->win);
553 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
554 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
555 if (e->atom == ECORE_X_ATOM_NET_WM_STATE)
558 Ecore_X_Window_State *state;
561 unsigned char modal : 1;
562 unsigned char sticky : 1;
563 unsigned char maximized_v : 1;
564 unsigned char maximized_h : 1;
565 unsigned char shaded : 1;
566 unsigned char skip_taskbar : 1;
567 unsigned char skip_pager : 1;
568 unsigned char fullscreen : 1;
569 unsigned char above : 1;
570 unsigned char below : 1;
581 prev.x.modal = ee->engine.x.state.modal;
582 prev.x.sticky = ee->engine.x.state.sticky;
583 prev.x.maximized_v = ee->engine.x.state.maximized_v;
584 prev.x.maximized_h = ee->engine.x.state.maximized_h;
585 prev.x.shaded = ee->engine.x.state.shaded;
586 prev.x.skip_taskbar = ee->engine.x.state.skip_taskbar;
587 prev.x.skip_pager = ee->engine.x.state.skip_pager;
588 prev.x.fullscreen = ee->engine.x.state.fullscreen;
589 prev.x.above = ee->engine.x.state.above;
590 prev.x.below = ee->engine.x.state.below;
592 prev.prop.modal = ee->prop.modal;
593 prev.prop.maximized = ee->prop.maximized;
594 prev.prop.sticky = ee->prop.sticky;
595 prev.prop.fullscreen = ee->prop.fullscreen;
596 prev.prop.focus_skip = ee->prop.focus_skip;
598 ee->engine.x.state.modal = 0;
599 ee->engine.x.state.sticky = 0;
600 ee->engine.x.state.maximized_v = 0;
601 ee->engine.x.state.maximized_h = 0;
602 ee->engine.x.state.shaded = 0;
603 ee->engine.x.state.skip_taskbar = 0;
604 ee->engine.x.state.skip_pager = 0;
605 ee->engine.x.state.fullscreen = 0;
606 ee->engine.x.state.above = 0;
607 ee->engine.x.state.below = 0;
610 ee->prop.maximized = 0;
612 ee->prop.fullscreen = 0;
613 ee->prop.focus_skip = 0;
615 ecore_x_netwm_window_state_get(e->win, &state, &num);
618 for (i = 0; i < num; i++)
622 case ECORE_X_WINDOW_STATE_MODAL:
623 ee->engine.x.state.modal = 1;
626 case ECORE_X_WINDOW_STATE_STICKY:
628 ee->engine.x.state.sticky = 1;
630 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
631 ee->engine.x.state.maximized_v = 1;
632 ee->prop.maximized = 1;
634 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
635 ee->engine.x.state.maximized_h = 1;
636 ee->prop.maximized = 1;
638 case ECORE_X_WINDOW_STATE_SHADED:
639 ee->engine.x.state.shaded = 1;
641 case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
642 ee->engine.x.state.skip_taskbar = 1;
643 ee->prop.focus_skip = 1;
645 case ECORE_X_WINDOW_STATE_SKIP_PAGER:
646 ee->engine.x.state.skip_pager = 1;
647 ee->prop.focus_skip = 1;
649 case ECORE_X_WINDOW_STATE_FULLSCREEN:
650 ee->prop.fullscreen = 1;
651 ee->engine.x.state.fullscreen = 1;
653 case ECORE_X_WINDOW_STATE_ABOVE:
654 ee->engine.x.state.above = 1;
656 case ECORE_X_WINDOW_STATE_BELOW:
657 ee->engine.x.state.below = 1;
666 // (prev.x.modal != ee->engine.x.state.modal) ||
667 (prev.x.sticky != ee->engine.x.state.sticky) ||
668 (prev.x.maximized_v != ee->engine.x.state.maximized_v) ||
669 (prev.x.maximized_h != ee->engine.x.state.maximized_h) ||
670 // (prev.x.shaded != ee->engine.x.state.shaded) ||
671 // (prev.x.skip_taskbar != ee->engine.x.state.skip_taskbar) ||
672 // (prev.x.skip_pager != ee->engine.x.state.skip_pager) ||
673 (prev.x.fullscreen != ee->engine.x.state.fullscreen) ||
674 // (prev.x.above != ee->engine.x.state.above) ||
675 // (prev.x.below != ee->engine.x.state.below) ||
676 // (prev.prop.modal != ee->prop.modal) ||
677 (prev.prop.maximized != ee->prop.maximized) ||
678 (prev.prop.sticky != ee->prop.sticky) ||
679 (prev.prop.fullscreen != ee->prop.fullscreen) ||
680 (prev.prop.focus_skip != ee->prop.focus_skip))
683 else if (e->atom == ECORE_X_ATOM_WM_STATE)
685 Ecore_X_Window_State_Hint state;
687 // handle WM_STATE changes
688 state = ecore_x_icccm_state_get(e->win);
691 case ECORE_X_WINDOW_STATE_HINT_WITHDRAWN:
692 if ((!ee->prop.withdrawn) || (ee->prop.iconified))
695 ee->prop.withdrawn = 1;
696 ee->prop.iconified = 0;
699 case ECORE_X_WINDOW_STATE_HINT_ICONIC:
700 if ((!ee->prop.iconified) || (ee->prop.withdrawn))
703 ee->prop.iconified = 1;
704 ee->prop.withdrawn = 0;
707 case ECORE_X_WINDOW_STATE_HINT_NORMAL:
708 if ((ee->prop.iconified) || (ee->prop.withdrawn))
711 ee->prop.iconified = 0;
712 ee->prop.withdrawn = 0;
719 else if (e->atom == ECORE_X_ATOM_E_PROFILE)
721 char *p = ecore_x_e_window_profile_get(e->win);
722 if ((p) && (ee->prop.profile))
724 if (strcmp(p, ee->prop.profile) != 0)
726 free(ee->prop.profile);
727 ee->prop.profile = strdup(p);
731 else if ((!p) && (ee->prop.profile))
733 free(ee->prop.profile);
734 ee->prop.profile = NULL;
737 else if ((p) && (!ee->prop.profile))
739 ee->prop.profile = strdup(p);
749 if (ee->func.fn_state_change) ee->func.fn_state_change(ee);
752 return ECORE_CALLBACK_PASS_ON;
756 _ecore_evas_x_event_visibility_change(void *data __UNUSED__, int type __UNUSED__, void *event)
759 Ecore_X_Event_Window_Visibility_Change *e;
762 ee = ecore_event_window_match(e->win);
763 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
764 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
765 // printf("VIS CHANGE OBSCURED: %p %i\n", ee, e->fully_obscured);
766 if (e->fully_obscured)
768 /* FIXME: round trip */
769 if (!ecore_x_screen_is_composited(ee->engine.x.screen_num))
774 return ECORE_CALLBACK_PASS_ON;
778 _ecore_evas_x_event_client_message(void *data __UNUSED__, int type __UNUSED__, void *event)
781 Ecore_X_Event_Client_Message *e;
784 if (e->format != 32) return ECORE_CALLBACK_PASS_ON;
785 if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_BEGIN)
787 ee = ecore_event_window_match(e->data.l[0]);
788 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
789 if (e->data.l[0] != (long)ee->prop.window)
790 return ECORE_CALLBACK_PASS_ON;
791 if (!ee->engine.x.sync_began)
793 // qeue a damage + draw. work around an event re-ordering thing.
794 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
796 ee->engine.x.sync_began = 1;
797 ee->engine.x.sync_cancel = 0;
799 else if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_END)
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 ee->engine.x.sync_began = 0;
806 ee->engine.x.sync_cancel = 0;
808 else if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_CANCEL)
810 ee = ecore_event_window_match(e->data.l[0]);
811 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
812 if (e->data.l[0] != (long)ee->prop.window)
813 return ECORE_CALLBACK_PASS_ON;
814 ee->engine.x.sync_began = 0;
815 ee->engine.x.sync_cancel = 1;
817 else if ((e->message_type == ECORE_X_ATOM_WM_PROTOCOLS) &&
818 (e->data.l[0] == (int)ECORE_X_ATOM_NET_WM_SYNC_REQUEST))
820 ee = ecore_event_window_match(e->win);
821 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
822 ee->engine.x.netwm_sync_val_lo = (unsigned int)e->data.l[2];
823 ee->engine.x.netwm_sync_val_hi = (int)e->data.l[3];
824 ee->engine.x.netwm_sync_set = 1;
826 return ECORE_CALLBACK_PASS_ON;
830 _ecore_evas_x_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
833 Ecore_X_Event_Mouse_In *e;
836 ee = ecore_event_window_match(e->win);
837 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
838 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
843 /* const char *modes[] = { */
845 /* "MODE_WHILE_GRABBED", */
849 /* const char *details[] = { */
850 /* "DETAIL_ANCESTOR", */
851 /* "DETAIL_VIRTUAL", */
852 /* "DETAIL_INFERIOR", */
853 /* "DETAIL_NON_LINEAR", */
854 /* "DETAIL_NON_LINEAR_VIRTUAL", */
855 /* "DETAIL_POINTER", */
856 /* "DETAIL_POINTER_ROOT", */
857 /* "DETAIL_DETAIL_NONE" */
859 /* t = time(NULL); */
860 /* ct = ctime(&t); */
861 /* ct[strlen(ct) - 1] = 0; */
862 /* printf("@@ ->IN 0x%x 0x%x %s md=%s dt=%s\n", */
863 /* e->win, e->event_win, */
865 /* modes[e->mode], */
866 /* details[e->detail]); */
868 // disable. causes more problems than it fixes
869 // if ((e->mode == ECORE_X_EVENT_MODE_GRAB) ||
870 // (e->mode == ECORE_X_EVENT_MODE_UNGRAB))
872 /* if (e->mode != ECORE_X_EVENT_MODE_NORMAL) return 0; */
875 if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
876 ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
877 evas_event_feed_mouse_in(ee->evas, e->time, NULL);
878 _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
881 return ECORE_CALLBACK_PASS_ON;
885 _ecore_evas_x_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
888 Ecore_X_Event_Mouse_Out *e;
891 ee = ecore_event_window_match(e->win);
892 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
894 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
899 /* const char *modes[] = { */
901 /* "MODE_WHILE_GRABBED", */
905 /* const char *details[] = { */
906 /* "DETAIL_ANCESTOR", */
907 /* "DETAIL_VIRTUAL", */
908 /* "DETAIL_INFERIOR", */
909 /* "DETAIL_NON_LINEAR", */
910 /* "DETAIL_NON_LINEAR_VIRTUAL", */
911 /* "DETAIL_POINTER", */
912 /* "DETAIL_POINTER_ROOT", */
913 /* "DETAIL_DETAIL_NONE" */
915 /* t = time(NULL); */
916 /* ct = ctime(&t); */
917 /* ct[strlen(ct) - 1] = 0; */
918 /* printf("@@ ->OUT 0x%x 0x%x %s md=%s dt=%s\n", */
919 /* e->win, e->event_win, */
921 /* modes[e->mode], */
922 /* details[e->detail]); */
924 // disable. causes more problems than it fixes
925 // if ((e->mode == ECORE_X_EVENT_MODE_GRAB) ||
926 // (e->mode == ECORE_X_EVENT_MODE_UNGRAB))
928 /* if (e->mode != ECORE_X_EVENT_MODE_NORMAL) return 0; */
929 // printf("OUT: ee->in=%i, e->mode=%i, e->detail=%i, dount_count=%i\n",
930 // ee->in, e->mode, e->detail, evas_event_down_count_get(ee->evas));
933 if ((evas_event_down_count_get(ee->evas) > 0) &&
934 (!((e->mode == ECORE_X_EVENT_MODE_GRAB) &&
935 (e->detail == ECORE_X_EVENT_DETAIL_NON_LINEAR))))
936 return ECORE_CALLBACK_PASS_ON;
937 ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
938 _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
939 if (e->mode == ECORE_X_EVENT_MODE_GRAB)
940 evas_event_feed_mouse_cancel(ee->evas, e->time, NULL);
941 evas_event_feed_mouse_out(ee->evas, e->time, NULL);
942 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
943 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
946 return ECORE_CALLBACK_PASS_ON;
950 _ecore_evas_x_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
953 Ecore_X_Event_Window_Focus_In *e;
956 ee = ecore_event_window_match(e->win);
957 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
958 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
959 //xx// filtering with these doesnt help
960 //xx// if (e->mode == ECORE_X_EVENT_MODE_UNGRAB) return ECORE_CALLBACK_PASS_ON;
961 ee->prop.focused = 1;
962 evas_focus_in(ee->evas);
963 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
964 return ECORE_CALLBACK_PASS_ON;
968 _ecore_evas_x_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
971 Ecore_X_Event_Window_Focus_Out *e;
974 ee = ecore_event_window_match(e->win);
975 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
976 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
977 //xx// filtering with these doesnt help
978 //xx// if (e->mode == ECORE_X_EVENT_MODE_GRAB) return ECORE_CALLBACK_PASS_ON;
980 // if (ee->prop.fullscreen)
981 // ecore_x_window_focus(ee->prop.window);
982 evas_focus_out(ee->evas);
983 ee->prop.focused = 0;
984 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
985 return ECORE_CALLBACK_PASS_ON;
989 _ecore_evas_x_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event)
992 Ecore_X_Event_Window_Damage *e;
995 ee = ecore_event_window_match(e->win);
996 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
997 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
998 if (ee->engine.x.using_bg_pixmap) return ECORE_CALLBACK_PASS_ON;
999 // printf("EXPOSE %p [%i] %i %i %ix%i\n", ee, ee->prop.avoid_damage, e->x, e->y, e->w, e->h);
1000 if (ee->prop.avoid_damage)
1002 Ecore_X_Rectangle rect;
1003 Ecore_X_XRegion *tmpr;
1005 if (!ee->engine.x.damages)
1006 ee->engine.x.damages = ecore_x_xregion_new();
1007 tmpr = ecore_x_xregion_new();
1012 ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
1013 ecore_x_xregion_free(ee->engine.x.damages);
1014 ee->engine.x.damages = tmpr;
1015 /* no - this breaks things badly. disable. Ecore_X_Rectangle != XRectangle - see
1016 * the typedefs in x's headers and ecore_x's. also same with Region - it's a pointer in x - not an X ID
1017 Ecore_X_Rectangle rect;
1018 Ecore_X_XRegion *tmpr;
1020 if (!ee->engine.x.damages) 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;
1033 if (ee->rotation == 0)
1034 evas_damage_rectangle_add(ee->evas, e->x, e->y, e->w, e->h);
1035 else if (ee->rotation == 90)
1036 evas_damage_rectangle_add(ee->evas,
1037 ee->h - e->y - e->h, e->x, e->h, e->w);
1038 else if (ee->rotation == 180)
1039 evas_damage_rectangle_add(ee->evas, ee->w - e->x - e->w,
1040 ee->h - e->y - e->h, e->w, e->h);
1041 else if (ee->rotation == 270)
1042 evas_damage_rectangle_add(ee->evas, e->y, ee->w - e->x - e->w,
1045 return ECORE_CALLBACK_PASS_ON;
1049 _ecore_evas_x_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event)
1052 Ecore_X_Event_Window_Destroy *e;
1055 ee = ecore_event_window_match(e->win);
1056 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1057 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1058 if (ee->func.fn_destroy) ee->func.fn_destroy(ee);
1059 _ecore_evas_x_sync_clear(ee);
1060 ecore_evas_free(ee);
1061 return ECORE_CALLBACK_PASS_ON;
1065 _ecore_evas_x_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
1068 Ecore_X_Event_Window_Configure *e;
1071 ee = ecore_event_window_match(e->win);
1072 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1073 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1074 if (ee->engine.x.direct_resize) return ECORE_CALLBACK_PASS_ON;
1076 ee->engine.x.configure_coming = 0;
1077 if ((e->from_wm) || (ee->prop.override))
1079 if ((ee->x != e->x) || (ee->y != e->y))
1085 if (ee->func.fn_move) ee->func.fn_move(ee);
1088 if ((ee->w != e->w) || (ee->h != e->h))
1094 if ((ee->rotation == 90) || (ee->rotation == 270))
1096 evas_output_size_set(ee->evas, ee->h, ee->w);
1097 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1101 evas_output_size_set(ee->evas, ee->w, ee->h);
1102 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1104 if (ee->prop.avoid_damage)
1108 pdam = ecore_evas_avoid_damage_get(ee);
1109 ecore_evas_avoid_damage_set(ee, 0);
1110 ecore_evas_avoid_damage_set(ee, pdam);
1112 if ((ee->shaped) || (ee->alpha))
1113 _ecore_evas_x_resize_shape(ee);
1114 if ((ee->expecting_resize.w > 0) && (ee->expecting_resize.h > 0))
1116 if ((ee->expecting_resize.w == ee->w) &&
1117 (ee->expecting_resize.h == ee->h))
1118 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
1119 ecore_x_current_time_get());
1120 ee->expecting_resize.w = 0;
1121 ee->expecting_resize.h = 0;
1123 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1125 return ECORE_CALLBACK_PASS_ON;
1129 _ecore_evas_x_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event)
1132 Ecore_X_Event_Window_Delete_Request *e;
1135 ee = ecore_event_window_match(e->win);
1136 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1137 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1138 if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
1139 return ECORE_CALLBACK_PASS_ON;
1143 _ecore_evas_x_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event)
1146 Ecore_X_Event_Window_Show *e;
1147 static int first_map_bug = -1;
1150 ee = ecore_event_window_match(e->win);
1151 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1152 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1153 /* some GL drivers are doing buffer copy in a separate thread.
1154 * we need to check whether GL driver sends SYNC_DRAW_DONE msg afger copying
1155 * that are required in order to exactly render. - added by gl77.lee
1157 if (ee->gl_sync_draw_done < 0)
1159 if (getenv("ECORE_EVAS_GL_SYNC_DRAW_DONE"))
1160 ee->gl_sync_draw_done = atoi(getenv("ECORE_EVAS_GL_SYNC_DRAW_DONE"));
1162 ee->gl_sync_draw_done = 0;
1164 if (first_map_bug < 0)
1168 if ((bug = getenv("ECORE_EVAS_GL_FIRST_MAP_BUG")))
1169 first_map_bug = atoi(bug);
1173 if ((first_map_bug) && (!strcmp(ee->driver, "opengl_x11")))
1174 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1175 if (ee->visible) return ECORE_CALLBACK_PASS_ON;
1176 // if (ee->visible) return ECORE_CALLBACK_DONE;
1177 // printf("SHOW EVENT %p\n", ee);
1179 if (ee->func.fn_show) ee->func.fn_show(ee);
1180 return ECORE_CALLBACK_PASS_ON;
1184 _ecore_evas_x_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event)
1187 Ecore_X_Event_Window_Hide *e;
1190 ee = ecore_event_window_match(e->win);
1191 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1192 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1195 evas_event_feed_mouse_cancel(ee->evas, e->time, NULL);
1196 evas_event_feed_mouse_out(ee->evas, e->time, NULL);
1197 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
1198 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
1199 ee->in = EINA_FALSE;
1201 if (!ee->visible) return ECORE_CALLBACK_PASS_ON;
1202 // if (!ee->visible) return ECORE_CALLBACK_DONE;
1203 // printf("HIDE EVENT %p\n", ee);
1205 if (ee->func.fn_hide) ee->func.fn_hide(ee);
1206 return ECORE_CALLBACK_PASS_ON;
1209 /* FIXME, should be in idler */
1210 /* FIXME, round trip */
1212 _ecore_evas_x_size_pos_hints_update(Ecore_Evas *ee)
1214 ecore_x_icccm_size_pos_hints_set(ee->prop.window,
1215 ee->prop.request_pos /*request_pos */,
1216 ECORE_X_GRAVITY_NW /* gravity */,
1217 ee->prop.min.w /* min_w */,
1218 ee->prop.min.h /* min_h */,
1219 ee->prop.max.w /* max_w */,
1220 ee->prop.max.h /* max_h */,
1221 ee->prop.base.w /* base_w */,
1222 ee->prop.base.h /* base_h */,
1223 ee->prop.step.w /* step_x */,
1224 ee->prop.step.h /* step_y */,
1225 ee->prop.aspect /* min_aspect */,
1226 ee->prop.aspect /* max_aspect */);
1229 /* FIXME, should be in idler */
1231 _ecore_evas_x_state_update(Ecore_Evas *ee)
1233 Ecore_X_Window_State state[10];
1237 state[num++] = ECORE_X_WINDOW_STATE_MODAL;
1238 if (ee->prop.sticky)
1239 state[num++] = ECORE_X_WINDOW_STATE_STICKY;
1240 if (ee->prop.maximized)
1241 state[num++] = ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
1242 if (ee->prop.maximized)
1243 state[num++] = ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
1244 // if (bd->client.netwm.state.shaded)
1245 // state[num++] = ECORE_X_WINDOW_STATE_SHADED;
1246 if (ee->prop.focus_skip)
1247 state[num++] = ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
1248 if (ee->prop.focus_skip)
1249 state[num++] = ECORE_X_WINDOW_STATE_SKIP_PAGER;
1250 // if (bd->client.netwm.state.hidden)
1251 // state[num++] = ECORE_X_WINDOW_STATE_HIDDEN;
1252 if (ee->engine.x.state.fullscreen)
1253 state[num++] = ECORE_X_WINDOW_STATE_FULLSCREEN;
1254 if (ee->engine.x.state.above)
1255 state[num++] = ECORE_X_WINDOW_STATE_ABOVE;
1256 if (ee->engine.x.state.below)
1257 state[num++] = ECORE_X_WINDOW_STATE_BELOW;
1258 if (ee->prop.demand_attention)
1259 state[num++] = ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION;
1261 ecore_x_netwm_window_state_set(ee->prop.window, state, num);
1265 _ecore_evas_x_layer_update(Ecore_Evas *ee)
1267 if (ee->should_be_visible)
1269 /* We need to send a netwm request to the wm */
1270 /* FIXME: Do we have to remove old state before adding new? */
1271 if (ee->prop.layer < 3)
1273 if (ee->engine.x.state.above)
1275 ee->engine.x.state.above = 0;
1276 ecore_x_netwm_state_request_send(ee->prop.window,
1277 ee->engine.x.win_root,
1278 ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
1280 if (!ee->engine.x.state.below)
1282 ee->engine.x.state.below = 1;
1283 ecore_x_netwm_state_request_send(ee->prop.window,
1284 ee->engine.x.win_root,
1285 ECORE_X_WINDOW_STATE_BELOW, -1, 1);
1288 else if (ee->prop.layer > 5)
1290 if (ee->engine.x.state.below)
1292 ee->engine.x.state.below = 0;
1293 ecore_x_netwm_state_request_send(ee->prop.window,
1294 ee->engine.x.win_root,
1295 ECORE_X_WINDOW_STATE_BELOW, -1, 0);
1297 if (!ee->engine.x.state.above)
1299 ee->engine.x.state.above = 1;
1300 ecore_x_netwm_state_request_send(ee->prop.window,
1301 ee->engine.x.win_root,
1302 ECORE_X_WINDOW_STATE_ABOVE, -1, 1);
1307 if (ee->engine.x.state.below)
1309 ee->engine.x.state.below = 0;
1310 ecore_x_netwm_state_request_send(ee->prop.window,
1311 ee->engine.x.win_root,
1312 ECORE_X_WINDOW_STATE_BELOW, -1, 0);
1314 if (ee->engine.x.state.above)
1316 ee->engine.x.state.above = 0;
1317 ecore_x_netwm_state_request_send(ee->prop.window,
1318 ee->engine.x.win_root,
1319 ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
1325 /* Just set the state */
1326 if (ee->prop.layer < 3)
1328 if ((ee->engine.x.state.above) || (!ee->engine.x.state.below))
1330 ee->engine.x.state.above = 0;
1331 ee->engine.x.state.below = 1;
1332 _ecore_evas_x_state_update(ee);
1335 else if (ee->prop.layer > 5)
1337 if ((!ee->engine.x.state.above) || (ee->engine.x.state.below))
1339 ee->engine.x.state.above = 1;
1340 ee->engine.x.state.below = 0;
1341 _ecore_evas_x_state_update(ee);
1346 if ((ee->engine.x.state.above) || (ee->engine.x.state.below))
1348 ee->engine.x.state.above = 0;
1349 ee->engine.x.state.below = 0;
1350 _ecore_evas_x_state_update(ee);
1354 /* FIXME: Set gnome layer */
1358 _ecore_evas_x_init(void)
1360 _ecore_evas_init_count++;
1361 if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
1362 ecore_evas_event_handlers[0] =
1363 ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN,
1364 _ecore_evas_x_event_mouse_in, NULL);
1365 ecore_evas_event_handlers[1] =
1366 ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT,
1367 _ecore_evas_x_event_mouse_out, NULL);
1368 ecore_evas_event_handlers[2] =
1369 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN,
1370 _ecore_evas_x_event_window_focus_in, NULL);
1371 ecore_evas_event_handlers[3] =
1372 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT,
1373 _ecore_evas_x_event_window_focus_out, NULL);
1374 ecore_evas_event_handlers[4] =
1375 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DAMAGE,
1376 _ecore_evas_x_event_window_damage, NULL);
1377 ecore_evas_event_handlers[5] =
1378 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DESTROY,
1379 _ecore_evas_x_event_window_destroy, NULL);
1380 ecore_evas_event_handlers[6] =
1381 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE,
1382 _ecore_evas_x_event_window_configure, NULL);
1383 ecore_evas_event_handlers[7] =
1384 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST,
1385 _ecore_evas_x_event_window_delete_request, NULL);
1386 ecore_evas_event_handlers[8] =
1387 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW,
1388 _ecore_evas_x_event_window_show, NULL);
1389 ecore_evas_event_handlers[9] =
1390 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_HIDE,
1391 _ecore_evas_x_event_window_hide, NULL);
1392 ecore_evas_event_handlers[10] =
1393 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY,
1394 _ecore_evas_x_event_property_change, NULL);
1395 ecore_evas_event_handlers[11] =
1396 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE,
1397 _ecore_evas_x_event_visibility_change, NULL);
1398 ecore_evas_event_handlers[12] =
1399 ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE,
1400 _ecore_evas_x_event_client_message, NULL);
1401 ecore_event_evas_init();
1402 return _ecore_evas_init_count;
1406 _ecore_evas_x_free(Ecore_Evas *ee)
1408 _ecore_evas_x_group_leader_unset(ee);
1409 _ecore_evas_x_sync_set(ee);
1410 if (ee->engine.x.win_shaped_input)
1411 ecore_x_window_free(ee->engine.x.win_shaped_input);
1412 ecore_x_window_free(ee->prop.window);
1413 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
1414 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1415 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
1416 if (ee->engine.x.damages) ecore_x_xregion_free(ee->engine.x.damages);
1417 ee->engine.x.pmap = 0;
1418 ee->engine.x.mask = 0;
1419 ee->engine.x.gc = 0;
1420 ee->engine.x.damages = NULL;
1421 ecore_event_window_unregister(ee->prop.window);
1422 while (ee->engine.x.win_extra)
1424 Ecore_X_Window *winp;
1426 winp = ee->engine.x.win_extra->data;
1427 ee->engine.x.win_extra =
1428 eina_list_remove_list(ee->engine.x.win_extra, ee->engine.x.win_extra);
1429 ecore_event_window_unregister(*winp);
1432 _ecore_evas_x_shutdown();
1437 _ecore_evas_x_callback_delete_request_set(Ecore_Evas *ee, Ecore_Evas_Event_Cb func)
1439 ee->func.fn_delete_request = func;
1440 _ecore_evas_x_protocols_set(ee);
1441 _ecore_evas_x_sync_set(ee);
1445 _ecore_evas_x_move(Ecore_Evas *ee, int x, int y)
1449 if (ee->engine.x.direct_resize)
1451 if (!ee->engine.x.managed)
1453 if ((x != ee->x) || (y != ee->y))
1457 ecore_x_window_move(ee->prop.window, x, y);
1458 if (!ee->should_be_visible)
1460 /* We need to request pos */
1461 ee->prop.request_pos = 1;
1462 _ecore_evas_x_size_pos_hints_update(ee);
1464 if (ee->func.fn_move) ee->func.fn_move(ee);
1470 if (((ee->x != x) || (ee->y != y)) ||
1471 (ee->engine.x.configure_coming))
1473 ee->engine.x.configure_coming = 1;
1474 if (!ee->engine.x.managed)
1479 ecore_x_window_move(ee->prop.window, x, y);
1481 if (!ee->should_be_visible)
1483 /* We need to request pos */
1484 ee->prop.request_pos = 1;
1485 _ecore_evas_x_size_pos_hints_update(ee);
1491 _ecore_evas_x_managed_move(Ecore_Evas *ee, int x, int y)
1495 if (ee->engine.x.direct_resize)
1497 ee->engine.x.managed = 1;
1498 if ((x != ee->x) || (y != ee->y))
1502 if (ee->func.fn_move) ee->func.fn_move(ee);
1508 _ecore_evas_x_resize(Ecore_Evas *ee, int w, int h)
1512 if (ee->engine.x.direct_resize)
1514 if ((ee->w != w) || (ee->h != h))
1518 ecore_x_window_resize(ee->prop.window, w, h);
1519 if ((ee->rotation == 90) || (ee->rotation == 270))
1521 evas_output_size_set(ee->evas, ee->h, ee->w);
1522 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1526 evas_output_size_set(ee->evas, ee->w, ee->h);
1527 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1529 if (ee->prop.avoid_damage)
1533 pdam = ecore_evas_avoid_damage_get(ee);
1534 ecore_evas_avoid_damage_set(ee, 0);
1535 ecore_evas_avoid_damage_set(ee, pdam);
1537 if ((ee->shaped) || (ee->alpha))
1538 _ecore_evas_x_resize_shape(ee);
1539 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1542 else if (((ee->w != w) || (ee->h != h)) ||
1543 (ee->engine.x.configure_coming))
1545 ee->engine.x.configure_coming = 1;
1546 ecore_x_window_resize(ee->prop.window, w, h);
1551 _ecore_evas_x_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
1557 if (ee->engine.x.direct_resize)
1559 if ((ee->w != w) || (ee->h != h) || (x != ee->x) || (y != ee->y))
1561 int change_size = 0, change_pos = 0;
1563 if ((ee->w != w) || (ee->h != h)) change_size = 1;
1564 if (!ee->engine.x.managed)
1566 if ((x != ee->x) || (y != ee->y)) change_pos = 1;
1568 ecore_x_window_move_resize(ee->prop.window, x, y, w, h);
1569 if (!ee->engine.x.managed)
1576 if ((ee->rotation == 90) || (ee->rotation == 270))
1578 evas_output_size_set(ee->evas, ee->h, ee->w);
1579 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1583 evas_output_size_set(ee->evas, ee->w, ee->h);
1584 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1586 if (ee->prop.avoid_damage)
1590 pdam = ecore_evas_avoid_damage_get(ee);
1591 ecore_evas_avoid_damage_set(ee, 0);
1592 ecore_evas_avoid_damage_set(ee, pdam);
1594 if ((ee->shaped) || (ee->alpha))
1595 _ecore_evas_x_resize_shape(ee);
1598 if (ee->func.fn_move) ee->func.fn_move(ee);
1602 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1606 else if (((ee->w != w) || (ee->h != h) || (ee->x != x) || (ee->y != y)) ||
1607 (ee->engine.x.configure_coming))
1609 ee->engine.x.configure_coming = 1;
1610 ecore_x_window_move_resize(ee->prop.window, x, y, w, h);
1611 if (!ee->engine.x.managed)
1620 _ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize,
1621 Evas_Engine_Info *einfo)
1625 rot_dif = ee->rotation - rotation;
1626 if (rot_dif < 0) rot_dif = -rot_dif;
1630 int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
1632 if (!evas_engine_info_set(ee->evas, einfo))
1634 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1639 ee->engine.x.configure_coming = 1;
1640 if (!ee->prop.fullscreen)
1642 ecore_x_window_resize(ee->prop.window, ee->req.h, ee->req.w);
1643 ee->expecting_resize.w = ee->h;
1644 ee->expecting_resize.h = ee->w;
1650 ecore_x_window_size_get(ee->prop.window, &w, &h);
1651 ecore_x_window_resize(ee->prop.window, h, w);
1652 if ((rotation == 0) || (rotation == 180))
1654 evas_output_size_set(ee->evas, ee->req.w, ee->req.h);
1655 evas_output_viewport_set(ee->evas, 0, 0, ee->req.w, ee->req.h);
1659 evas_output_size_set(ee->evas, ee->req.h, ee->req.w);
1660 evas_output_viewport_set(ee->evas, 0, 0, ee->req.h, ee->req.w);
1662 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1664 if ((ee->rotation == 90) || (ee->rotation == 270))
1665 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.h, ee->req.w);
1667 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
1673 /* ecore_x_window_size_get(ee->prop.window, &w, &h); */
1674 if ((rotation == 0) || (rotation == 180))
1676 evas_output_size_set(ee->evas, ee->w, ee->h);
1677 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1681 evas_output_size_set(ee->evas, ee->h, ee->w);
1682 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1684 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1685 if ((ee->rotation == 90) || (ee->rotation == 270))
1686 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
1688 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1690 ecore_evas_size_min_get(ee, &minw, &minh);
1691 ecore_evas_size_max_get(ee, &maxw, &maxh);
1692 ecore_evas_size_base_get(ee, &basew, &baseh);
1693 ecore_evas_size_step_get(ee, &stepw, &steph);
1694 ee->rotation = rotation;
1695 ecore_evas_size_min_set(ee, minh, minw);
1696 ecore_evas_size_max_set(ee, maxh, maxw);
1697 ecore_evas_size_base_set(ee, baseh, basew);
1698 ecore_evas_size_step_set(ee, steph, stepw);
1699 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
1700 ecore_x_current_time_get());
1704 if (!evas_engine_info_set(ee->evas, einfo))
1706 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1708 ee->rotation = rotation;
1709 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
1710 ecore_x_current_time_get());
1711 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1713 if ((ee->rotation == 90) || (ee->rotation == 270))
1714 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
1716 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1720 #define _USE_WIN_ROT_EFFECT 1
1722 #if _USE_WIN_ROT_EFFECT
1723 static void _ecore_evas_x_flush_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__);
1725 typedef struct _Ecore_Evas_X_Rotation_Effect Ecore_Evas_X_Rotation_Effect;
1726 struct _Ecore_Evas_X_Rotation_Effect
1728 Eina_Bool wait_for_comp_reply;
1731 static Ecore_Evas_X_Rotation_Effect _rot_effect =
1737 _ecore_evas_x_rotation_effect_setup(void)
1739 _rot_effect.wait_for_comp_reply = EINA_TRUE;
1741 #endif /* end of _USE_WIN_ROT_EFFECT */
1744 _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize)
1746 if (ee->rotation == rotation) return;
1747 if (!strcmp(ee->driver, "xrender_x11")) return;
1749 #if _USE_WIN_ROT_EFFECT
1751 angles[0] = rotation;
1752 angles[1] = ee->rotation;
1753 #endif /* end of _USE_WIN_ROT_EFFECT */
1755 if (!strcmp(ee->driver, "opengl_x11"))
1757 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
1758 Evas_Engine_Info_GL_X11 *einfo;
1760 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
1762 einfo->info.rotation = rotation;
1763 _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
1764 (Evas_Engine_Info *)einfo);
1765 # if _USE_WIN_ROT_EFFECT
1766 ecore_x_window_prop_property_set(ee->prop.window,
1767 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1768 ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1770 ecore_x_window_prop_property_set(ee->prop.window,
1771 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1772 ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1774 #endif /* BUILD_ECORE_EVAS_OPENGL_X11 */
1776 else if (!strcmp(ee->driver, "software_x11"))
1778 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
1779 Evas_Engine_Info_Software_X11 *einfo;
1781 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
1783 einfo->info.rotation = rotation;
1784 _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
1785 (Evas_Engine_Info *)einfo);
1786 # if _USE_WIN_ROT_EFFECT
1787 ecore_x_window_prop_property_set(ee->prop.window,
1788 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1789 ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1791 ecore_x_window_prop_property_set(ee->prop.window,
1792 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1793 ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1795 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
1797 else if (!strcmp(ee->driver, "software_16_x11"))
1799 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
1800 Evas_Engine_Info_Software_16_X11 *einfo;
1802 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
1804 einfo->info.rotation = rotation;
1805 _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
1806 (Evas_Engine_Info *)einfo);
1807 # if _USE_WIN_ROT_EFFECT
1808 ecore_x_window_prop_property_set(ee->prop.window,
1809 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1810 ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1812 ecore_x_window_prop_property_set(ee->prop.window,
1813 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1814 ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1816 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
1818 else if (!strcmp(ee->driver, "software_8_x11"))
1820 #if BUILD_ECORE_EVAS_SOFTWARE_8_X11
1821 Evas_Engine_Info_Software_8_X11 *einfo;
1823 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
1825 einfo->info.rotation = rotation;
1826 _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
1827 (Evas_Engine_Info *)einfo);
1828 # if _USE_WIN_ROT_EFFECT
1829 ecore_x_window_prop_property_set(ee->prop.window,
1830 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1831 ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1833 ecore_x_window_prop_property_set(ee->prop.window,
1834 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1835 ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1837 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
1840 #if _USE_WIN_ROT_EFFECT
1841 if ((ee->visible) &&
1842 ((ecore_x_e_comp_sync_supported_get(ee->engine.x.win_root)) &&
1843 (!ee->no_comp_sync) && (_ecore_evas_app_comp_sync)) &&
1844 (ee->engine.x.sync_counter) &&
1845 (ee->engine.x.sync_val > 0))
1847 _ecore_evas_x_rotation_effect_setup();
1848 _ecore_evas_x_flush_pre(ee, NULL, NULL);
1850 #endif /* end of _USE_WIN_ROT_EFFECT */
1854 _ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped)
1856 if ((ee->shaped == shaped)) return;
1857 if (!strcmp(ee->driver, "opengl_x11")) return;
1858 if (!strcmp(ee->driver, "software_x11"))
1860 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
1861 Evas_Engine_Info_Software_X11 *einfo;
1863 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
1864 ee->shaped = shaped;
1869 unsigned int foreground;
1872 if (!ee->engine.x.mask)
1873 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1875 gc = ecore_x_gc_new(ee->engine.x.mask,
1876 ECORE_X_GC_VALUE_MASK_FOREGROUND,
1878 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
1879 0, 0, ee->w, ee->h);
1880 ecore_x_gc_free(gc);
1881 einfo->info.mask = ee->engine.x.mask;
1882 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1884 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1886 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1887 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1891 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1892 ee->engine.x.mask = 0;
1893 einfo->info.mask = 0;
1894 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1896 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1898 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1899 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1902 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
1904 else if (!strcmp(ee->driver, "software_16_x11"))
1906 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
1907 # if 0 /* XXX no shaped window support for software_16_x11 */
1908 Evas_Engine_Info_Software_16_X11 *einfo;
1910 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
1911 ee->shaped = shaped;
1917 ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1918 einfo->info.mask = ee->engine.x.mask;
1919 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1921 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1923 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1927 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1928 ee->engine.x.mask = 0;
1929 einfo->info.mask = 0;
1930 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1932 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1934 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1937 # endif /* XXX no shaped window support for software_16_x11 */
1938 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
1940 if (!strcmp(ee->driver, "software_8_x11"))
1942 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
1943 Evas_Engine_Info_Software_8_X11 *einfo;
1945 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
1946 ee->shaped = shaped;
1951 unsigned int foreground;
1954 if (!ee->engine.x.mask)
1955 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1957 gc = ecore_x_gc_new(ee->engine.x.mask,
1958 ECORE_X_GC_VALUE_MASK_FOREGROUND,
1960 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
1961 0, 0, ee->w, ee->h);
1962 ecore_x_gc_free(gc);
1963 einfo->info.mask = ee->engine.x.mask;
1964 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1966 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1968 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1969 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1973 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1974 ee->engine.x.mask = 0;
1975 einfo->info.mask = 0;
1976 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1978 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1980 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1981 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1984 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
1988 /* FIXME, round trip */
1990 _ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
1992 Ecore_X_Window_Attributes att;
1995 if ((ee->alpha == alpha)) return;
1997 if (!strcmp(ee->driver, "software_x11"))
1999 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
2000 Evas_Engine_Info_Software_X11 *einfo;
2002 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2005 if (!ecore_x_composite_query()) return;
2009 ecore_x_window_free(ee->prop.window);
2010 ecore_event_window_unregister(ee->prop.window);
2013 if (ee->prop.override)
2014 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);
2016 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);
2017 if (!ee->engine.x.mask)
2018 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2022 if (ee->prop.override)
2023 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);
2025 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2026 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2027 ee->engine.x.mask = 0;
2028 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2031 einfo->info.destination_alpha = alpha;
2033 ecore_x_window_attributes_get(ee->prop.window, &att);
2034 einfo->info.visual = att.visual;
2035 einfo->info.colormap = att.colormap;
2036 einfo->info.depth = att.depth;
2038 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2039 // ee->engine.x.mask = 0;
2040 einfo->info.mask = ee->engine.x.mask;
2041 einfo->info.drawable = ee->prop.window;
2042 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2044 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2046 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2047 ecore_x_window_shape_mask_set(ee->prop.window, 0);
2048 ecore_x_input_multi_select(ee->prop.window);
2049 ecore_event_window_register(ee->prop.window, ee, ee->evas,
2050 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
2051 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
2052 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
2053 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
2054 if (ee->prop.borderless)
2055 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2056 if (ee->visible) ecore_x_window_show(ee->prop.window);
2057 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2060 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2061 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2064 ecore_x_icccm_name_class_set(ee->prop.window,
2065 ee->prop.name, ee->prop.clas);
2066 _ecore_evas_x_hints_update(ee);
2067 _ecore_evas_x_group_leader_update(ee);
2068 ecore_x_window_defaults_set(ee->prop.window);
2069 _ecore_evas_x_protocols_set(ee);
2070 _ecore_evas_x_sync_set(ee);
2071 _ecore_evas_x_size_pos_hints_update(ee);
2072 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
2073 if ((id = getenv("DESKTOP_STARTUP_ID")))
2075 ecore_x_netwm_startup_id_set(ee->prop.window, id);
2076 /* NB: on linux this may simply empty the env as opposed to completely
2077 * unset it to being empty - unsure as solartis libc crashes looking
2078 * for the '=' char */
2079 // putenv((char*)"DESKTOP_STARTUP_ID=");
2082 else if (!strcmp(ee->driver, "opengl_x11"))
2084 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
2085 Evas_Engine_Info_GL_X11 *einfo;
2087 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
2090 if (!ecore_x_composite_query()) return;
2094 ecore_x_window_free(ee->prop.window);
2095 ecore_event_window_unregister(ee->prop.window);
2096 ee->prop.window = 0;
2098 einfo->info.destination_alpha = alpha;
2100 if (ee->engine.x.win_root != 0)
2102 /* FIXME: round trip in ecore_x_window_argb_get */
2103 if (ecore_x_window_argb_get(ee->engine.x.win_root))
2106 _ecore_evas_x_gl_window_new(ee, ee->engine.x.win_root,
2107 ee->req.x, ee->req.y,
2108 ee->req.w, ee->req.h,
2109 ee->prop.override, 1, NULL);
2114 _ecore_evas_x_gl_window_new(ee, ee->engine.x.win_root,
2115 ee->req.x, ee->req.y,
2116 ee->req.w, ee->req.h,
2117 ee->prop.override, ee->alpha,
2124 _ecore_evas_x_gl_window_new(ee, ee->engine.x.win_root,
2125 ee->req.x, ee->req.y,
2126 ee->req.w, ee->req.h,
2127 ee->prop.override, ee->alpha, NULL);
2130 if (!ee->prop.window) return;
2134 if (ee->prop.override)
2135 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);
2137 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);
2138 if (!ee->engine.x.mask)
2139 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2143 if (ee->prop.override)
2144 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);
2146 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2147 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2148 ee->engine.x.mask = 0;
2149 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2153 ecore_x_window_attributes_get(ee->prop.window, &att);
2154 einfo->info.visual = att.visual;
2155 einfo->info.colormap = att.colormap;
2156 einfo->info.depth = att.depth;
2158 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2159 // ee->engine.x.mask = 0;
2160 // einfo->info.mask = ee->engine.x.mask;
2161 einfo->info.drawable = ee->prop.window;
2162 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2164 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2166 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2167 // ecore_x_window_shape_mask_set(ee->prop.window, 0);
2168 ecore_x_input_multi_select(ee->prop.window);
2169 ecore_event_window_register(ee->prop.window, ee, ee->evas,
2170 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
2171 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
2172 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
2173 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
2174 if (ee->prop.borderless)
2175 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2176 if (ee->visible) ecore_x_window_show(ee->prop.window);
2177 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2180 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2181 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2184 ecore_x_icccm_name_class_set(ee->prop.window,
2185 ee->prop.name, ee->prop.clas);
2186 _ecore_evas_x_hints_update(ee);
2187 _ecore_evas_x_group_leader_update(ee);
2188 ecore_x_window_defaults_set(ee->prop.window);
2189 _ecore_evas_x_protocols_set(ee);
2190 _ecore_evas_x_sync_set(ee);
2191 _ecore_evas_x_size_pos_hints_update(ee);
2192 #endif /* BUILD_ECORE_EVAS_OPENGL_X11 */
2193 if ((id = getenv("DESKTOP_STARTUP_ID")))
2195 ecore_x_netwm_startup_id_set(ee->prop.window, id);
2196 /* NB: on linux this may simply empty the env as opposed to completely
2197 * unset it to being empty - unsure as solartis libc crashes looking
2198 * for the '=' char */
2199 // putenv((char*)"DESKTOP_STARTUP_ID=");
2202 else if (!strcmp(ee->driver, "software_16_x11"))
2204 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
2205 Evas_Engine_Info_Software_16_X11 *einfo;
2207 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
2212 ecore_x_window_free(ee->prop.window);
2213 ecore_event_window_unregister(ee->prop.window);
2216 if (ee->prop.override)
2217 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);
2219 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);
2220 if (!ee->engine.x.mask)
2221 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2225 if (ee->prop.override)
2226 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);
2228 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2229 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2230 ee->engine.x.mask = 0;
2231 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2234 # if 0 /* XXX no alpha window support for software_16_x11 */
2235 einfo->info.destination_alpha = alpha;
2236 # endif /* XXX no alpha window support for software_16_x11 */
2238 # if 0 /* XXX no shaped window support for software_16_x11 */
2239 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2240 // ee->engine.x.mask = 0;
2241 einfo->info.mask = ee->engine.x.mask;
2242 # endif /* XXX no shaped window support for software_16_x11 */
2244 einfo->info.drawable = ee->prop.window;
2245 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2247 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2249 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2250 ecore_x_window_shape_mask_set(ee->prop.window, 0);
2251 ecore_x_input_multi_select(ee->prop.window);
2252 ecore_event_window_register(ee->prop.window, ee, ee->evas,
2253 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
2254 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
2255 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
2256 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
2257 if (ee->prop.borderless)
2258 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2259 if (ee->visible) ecore_x_window_show(ee->prop.window);
2260 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2263 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2264 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2267 ecore_x_icccm_name_class_set(ee->prop.window,
2268 ee->prop.name, ee->prop.clas);
2269 _ecore_evas_x_hints_update(ee);
2270 _ecore_evas_x_group_leader_update(ee);
2271 ecore_x_window_defaults_set(ee->prop.window);
2272 _ecore_evas_x_protocols_set(ee);
2273 _ecore_evas_x_sync_set(ee);
2274 _ecore_evas_x_size_pos_hints_update(ee);
2275 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
2276 if ((id = getenv("DESKTOP_STARTUP_ID")))
2278 ecore_x_netwm_startup_id_set(ee->prop.window, id);
2279 /* NB: on linux this may simply empty the env as opposed to completely
2280 * unset it to being empty - unsure as solartis libc crashes looking
2281 * for the '=' char */
2282 // putenv((char*)"DESKTOP_STARTUP_ID=");
2285 else if (!strcmp(ee->driver, "software_8_x11"))
2287 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
2288 Evas_Engine_Info_Software_8_X11 *einfo;
2290 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
2295 ecore_x_window_free(ee->prop.window);
2296 ecore_event_window_unregister(ee->prop.window);
2299 if (ee->prop.override)
2300 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);
2302 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);
2303 if (!ee->engine.x.mask)
2304 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2308 if (ee->prop.override)
2309 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);
2311 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2312 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2313 ee->engine.x.mask = 0;
2314 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2317 einfo->info.destination_alpha = alpha;
2319 ecore_x_window_attributes_get(ee->prop.window, &att);
2320 einfo->info.visual = att.visual;
2321 einfo->info.colormap = att.colormap;
2322 einfo->info.depth = att.depth;
2324 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2325 // ee->engine.x.mask = 0;
2326 einfo->info.mask = ee->engine.x.mask;
2327 einfo->info.drawable = ee->prop.window;
2328 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2330 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2332 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2333 ecore_x_window_shape_mask_set(ee->prop.window, 0);
2334 ecore_x_input_multi_select(ee->prop.window);
2335 ecore_event_window_register(ee->prop.window, ee, ee->evas,
2336 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
2337 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
2338 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
2339 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
2340 if (ee->prop.borderless)
2341 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2342 if (ee->visible) ecore_x_window_show(ee->prop.window);
2343 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2346 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2347 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2350 ecore_x_icccm_name_class_set(ee->prop.window,
2351 ee->prop.name, ee->prop.clas);
2352 _ecore_evas_x_hints_update(ee);
2353 _ecore_evas_x_group_leader_update(ee);
2354 ecore_x_window_defaults_set(ee->prop.window);
2355 _ecore_evas_x_protocols_set(ee);
2356 _ecore_evas_x_sync_set(ee);
2357 _ecore_evas_x_size_pos_hints_update(ee);
2359 if ((id = getenv("DESKTOP_STARTUP_ID")))
2361 ecore_x_netwm_startup_id_set(ee->prop.window, id);
2362 /* NB: on linux this may simply empty the env as opposed to completely
2363 * unset it to being empty - unsure as solartis libc crashes looking
2364 * for the '=' char */
2365 // putenv((char*)"DESKTOP_STARTUP_ID=");
2367 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
2372 _ecore_evas_x_transparent_set(Ecore_Evas *ee, int transparent)
2374 if ((ee->transparent == transparent)) return;
2376 if (!strcmp(ee->driver, "software_x11"))
2378 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
2379 Evas_Engine_Info_Software_X11 *einfo;
2381 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2384 ee->transparent = transparent;
2385 einfo->info.destination_alpha = transparent;
2386 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2388 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2390 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2396 _ecore_evas_x_window_group_set(Ecore_Evas *ee, const Ecore_Evas *group_ee)
2398 if (ee->prop.group_ee == group_ee) return;
2400 ee->prop.group_ee = (Ecore_Evas *)group_ee;
2401 if (ee->prop.group_ee)
2402 ee->prop.group_ee_win = group_ee->prop.window;
2404 ee->prop.group_ee_win = 0;
2405 _ecore_evas_x_hints_update(ee);
2409 _ecore_evas_x_aspect_set(Ecore_Evas *ee, double aspect)
2411 if (ee->prop.aspect == aspect) return;
2413 ee->prop.aspect = aspect;
2414 _ecore_evas_x_size_pos_hints_update(ee);
2416 // if (ee->should_be_visible)
2417 // ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2418 // ECORE_X_WINDOW_STATE_STICKY, -1, sticky);
2420 // _ecore_evas_x_state_update(ee);
2424 _ecore_evas_x_urgent_set(Ecore_Evas *ee, int urgent)
2426 if (ee->prop.urgent == urgent) return;
2428 ee->prop.urgent = urgent;
2429 _ecore_evas_x_hints_update(ee);
2433 _ecore_evas_x_modal_set(Ecore_Evas *ee, int modal)
2435 if (ee->prop.modal == modal) return;
2437 ee->prop.modal = modal;
2438 if (ee->should_be_visible)
2439 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2440 ECORE_X_WINDOW_STATE_MODAL, -1, modal);
2442 _ecore_evas_x_state_update(ee);
2446 _ecore_evas_x_demand_attention_set(Ecore_Evas *ee, int demand)
2448 if (ee->prop.demand_attention == demand) return;
2450 ee->prop.demand_attention = demand;
2451 if (ee->should_be_visible)
2452 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2453 ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION, -1, demand);
2455 _ecore_evas_x_state_update(ee);
2459 _ecore_evas_x_focus_skip_set(Ecore_Evas *ee, int skip)
2461 if (ee->prop.focus_skip == skip) return;
2463 ee->prop.focus_skip = skip;
2464 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_SKIP_TASKBAR, -1, skip);
2468 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2469 ECORE_X_WINDOW_STATE_SKIP_PAGER, -1, skip);
2472 _ecore_evas_x_state_update(ee);
2473 _ecore_evas_x_hints_update(ee);
2476 #endif /* BUILD_ECORE_EVAS_X11 */
2478 #ifdef BUILD_ECORE_EVAS_X11
2480 _ecore_evas_x_show(Ecore_Evas *ee)
2482 ee->should_be_visible = 1;
2483 if (ee->prop.avoid_damage)
2484 _ecore_evas_x_render(ee);
2485 _ecore_evas_x_sync_set(ee);
2486 ecore_x_window_show(ee->prop.window);
2487 if (ee->prop.fullscreen)
2488 ecore_x_window_focus(ee->prop.window);
2492 _ecore_evas_x_hide(Ecore_Evas *ee)
2494 ecore_x_window_hide(ee->prop.window);
2495 ee->should_be_visible = 0;
2496 _ecore_evas_x_sync_set(ee);
2500 _ecore_evas_x_raise(Ecore_Evas *ee)
2502 ecore_x_window_raise(ee->prop.window);
2506 _ecore_evas_x_lower(Ecore_Evas *ee)
2508 ecore_x_window_lower(ee->prop.window);
2512 _ecore_evas_x_activate(Ecore_Evas *ee)
2514 ecore_x_netwm_client_active_request(ee->engine.x.win_root,
2515 ee->prop.window, 2, 0);
2519 _ecore_evas_x_title_set(Ecore_Evas *ee, const char *t)
2521 if (ee->prop.title) free(ee->prop.title);
2522 ee->prop.title = NULL;
2523 if (t) ee->prop.title = strdup(t);
2524 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2525 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2529 _ecore_evas_x_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
2531 if (ee->prop.name) free(ee->prop.name);
2532 if (ee->prop.clas) free(ee->prop.clas);
2533 ee->prop.name = NULL;
2534 ee->prop.clas = NULL;
2535 if (n) ee->prop.name = strdup(n);
2536 if (c) ee->prop.clas = strdup(c);
2537 ecore_x_icccm_name_class_set(ee->prop.window, ee->prop.name, ee->prop.clas);
2541 _ecore_evas_x_size_min_set(Ecore_Evas *ee, int w, int h)
2545 if ((ee->prop.min.w == w) && (ee->prop.min.h == h)) return;
2548 _ecore_evas_x_size_pos_hints_update(ee);
2552 _ecore_evas_x_size_max_set(Ecore_Evas *ee, int w, int h)
2556 if ((ee->prop.max.w == w) && (ee->prop.max.h == h)) return;
2559 _ecore_evas_x_size_pos_hints_update(ee);
2563 _ecore_evas_x_size_base_set(Ecore_Evas *ee, int w, int h)
2567 if ((ee->prop.base.w == w) && (ee->prop.base.h == h)) return;
2568 ee->prop.base.w = w;
2569 ee->prop.base.h = h;
2570 _ecore_evas_x_size_pos_hints_update(ee);
2574 _ecore_evas_x_size_step_set(Ecore_Evas *ee, int w, int h)
2578 if ((ee->prop.step.w == w) && (ee->prop.step.h == h)) return;
2579 ee->prop.step.w = w;
2580 ee->prop.step.h = h;
2581 _ecore_evas_x_size_pos_hints_update(ee);
2585 _ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2590 if (ee) ee->prop.cursor.object = NULL;
2594 _ecore_evas_x_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
2598 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
2602 ee->prop.cursor.object = NULL;
2603 ee->prop.cursor.layer = 0;
2604 ee->prop.cursor.hot.x = 0;
2605 ee->prop.cursor.hot.y = 0;
2606 ecore_x_window_cursor_show(ee->prop.window, 1);
2610 ee->prop.cursor.object = obj;
2611 ee->prop.cursor.layer = layer;
2612 ee->prop.cursor.hot.x = hot_x;
2613 ee->prop.cursor.hot.y = hot_y;
2615 ecore_x_window_cursor_show(ee->prop.window, 0);
2617 evas_pointer_output_xy_get(ee->evas, &x, &y);
2618 evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
2619 evas_object_move(ee->prop.cursor.object,
2620 x - ee->prop.cursor.hot.x,
2621 y - ee->prop.cursor.hot.y);
2622 evas_object_pass_events_set(ee->prop.cursor.object, 1);
2623 if (evas_pointer_inside_get(ee->evas))
2624 evas_object_show(ee->prop.cursor.object);
2626 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
2631 * @param layer If < 3, @a ee will be put below all other windows.
2632 * If > 5, @a ee will be "always-on-top"
2633 * If = 4, @a ee will be put in the default layer.
2634 * Acceptable values range from 1 to 255 (0 reserved for
2638 _ecore_evas_x_layer_set(Ecore_Evas *ee, int layer)
2640 if (ee->prop.layer == layer) return;
2642 /* FIXME: Should this logic be here? */
2645 else if (layer > 255)
2648 ee->prop.layer = layer;
2649 _ecore_evas_x_layer_update(ee);
2653 _ecore_evas_x_focus_set(Ecore_Evas *ee, int on __UNUSED__)
2655 ecore_x_window_focus(ee->prop.window);
2659 _ecore_evas_x_iconified_set(Ecore_Evas *ee, int on)
2661 if (ee->prop.iconified == on) return;
2662 ee->prop.iconified = on;
2663 _ecore_evas_x_hints_update(ee);
2665 ecore_x_icccm_iconic_request_send(ee->prop.window, ee->engine.x.win_root);
2667 ecore_evas_show(ee);
2671 _ecore_evas_x_borderless_set(Ecore_Evas *ee, int on)
2673 if (ee->prop.borderless == on) return;
2674 ee->prop.borderless = on;
2675 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2678 /* FIXME: This function changes the initial state of the ee
2679 * whilest the iconic function changes the current state! */
2681 _ecore_evas_x_withdrawn_set(Ecore_Evas *ee, int withdrawn)
2683 if (ee->prop.withdrawn == withdrawn) return;
2684 ee->prop.withdrawn = withdrawn;
2685 _ecore_evas_x_hints_update(ee);
2689 _ecore_evas_x_sticky_set(Ecore_Evas *ee, int sticky)
2691 if (ee->prop.sticky == sticky) return;
2693 /* We dont want to set prop.sticky here as it will cause
2694 * the sticky callback not to get called. Its set on the
2695 * property change event.
2696 * ee->prop.sticky = sticky;
2698 ee->engine.x.state.sticky = sticky;
2699 if (ee->should_be_visible)
2700 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2701 ECORE_X_WINDOW_STATE_STICKY, -1, sticky);
2703 _ecore_evas_x_state_update(ee);
2707 _ecore_evas_x_ignore_events_set(Ecore_Evas *ee, int ignore)
2709 if (ee->ignore_events == ignore) return;
2711 ee->ignore_events = ignore;
2712 if (ee->prop.window)
2713 ecore_x_window_ignore_set(ee->prop.window, ignore);
2718 _ecore_evas_x_reinit_win(Ecore_Evas *ee)
2720 if (!strcmp(ee->driver, "software_x11"))
2722 #ifdef BUILD_ECORE_EVAS_X11
2723 Evas_Engine_Info_Software_X11 *einfo;
2725 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2728 einfo->info.drawable = ee->prop.window;
2729 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
2733 else if (!strcmp(ee->driver, "opengl_x11"))
2735 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
2736 Evas_Engine_Info_GL_X11 *einfo;
2738 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
2741 einfo->info.drawable = ee->prop.window;
2742 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
2750 _ecore_evas_x_override_set(Ecore_Evas *ee, int on)
2752 if (ee->prop.override == on) return;
2753 if (ee->should_be_visible) ecore_x_window_hide(ee->prop.window);
2754 ecore_x_window_override_set(ee->prop.window, on);
2755 if (ee->should_be_visible) ecore_x_window_show(ee->prop.window);
2756 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2757 ee->prop.override = on;
2761 _ecore_evas_x_fullscreen_set(Ecore_Evas *ee, int on)
2763 if (ee->prop.fullscreen == on) return;
2765 /* FIXME: Detect if WM is EWMH compliant and handle properly if not,
2766 * i.e. reposition, resize, and change borderless hint */
2767 ee->engine.x.state.fullscreen = on;
2768 if (ee->should_be_visible)
2769 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2770 ECORE_X_WINDOW_STATE_FULLSCREEN, -1, on);
2772 _ecore_evas_x_state_update(ee);
2776 _ecore_evas_x_profiles_set(Ecore_Evas *ee, const char **plist, int n)
2778 /* Ecore_Evas's profile will be updated when WM sets the E_PROFILE. */
2779 ecore_x_e_window_profile_list_set(ee->prop.window, plist, n);
2783 _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on)
2785 if (ee->prop.avoid_damage == on) return;
2786 if (!strcmp(ee->driver, "opengl_x11")) return;
2788 if (!strcmp(ee->driver, "software_x11"))
2790 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
2791 Evas_Engine_Info_Software_X11 *einfo;
2793 ee->prop.avoid_damage = on;
2794 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2797 if (ee->prop.avoid_damage)
2799 ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth);
2800 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2801 einfo->info.drawable = ee->engine.x.pmap;
2802 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2804 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2806 if ((ee->rotation == 90) || (ee->rotation == 270))
2807 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2809 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2810 if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN)
2812 ee->engine.x.using_bg_pixmap = 1;
2813 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2814 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2816 if (ee->engine.x.direct_resize)
2818 /* Turn this off for now
2819 ee->engine.x.using_bg_pixmap = 1;
2820 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2826 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2827 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2828 if (ee->engine.x.using_bg_pixmap)
2830 ecore_x_window_pixmap_set(ee->prop.window, 0);
2831 ee->engine.x.using_bg_pixmap = 0;
2832 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2834 ee->engine.x.pmap = 0;
2835 ee->engine.x.gc = 0;
2836 einfo->info.drawable = ee->prop.window;
2837 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2839 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2843 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
2845 else if (!strcmp(ee->driver, "software_16_x11"))
2847 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
2848 Evas_Engine_Info_Software_16_X11 *einfo;
2850 ee->prop.avoid_damage = on;
2851 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
2854 if (ee->prop.avoid_damage)
2856 ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 16);
2857 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2858 einfo->info.drawable = ee->engine.x.pmap;
2859 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2861 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2863 if ((ee->rotation == 90) || (ee->rotation == 270))
2864 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2866 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2867 if (ee->engine.x.direct_resize)
2869 /* Turn this off for now
2870 ee->engine.x.using_bg_pixmap = 1;
2871 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2877 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2878 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2879 if (ee->engine.x.using_bg_pixmap)
2881 ecore_x_window_pixmap_set(ee->prop.window, 0);
2882 ee->engine.x.using_bg_pixmap = 0;
2884 ee->engine.x.pmap = 0;
2885 ee->engine.x.gc = 0;
2886 einfo->info.drawable = ee->prop.window;
2887 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2889 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2893 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
2895 else if (!strcmp(ee->driver, "software_8_x11"))
2897 #if BUILD_ECORE_EVAS_SOFTWARE_8_X11
2898 Evas_Engine_Info_Software_8_X11 *einfo;
2900 ee->prop.avoid_damage = on;
2901 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
2904 if (ee->prop.avoid_damage)
2906 ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth);
2907 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2908 einfo->info.drawable = ee->engine.x.pmap;
2909 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2911 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2913 if ((ee->rotation == 90) || (ee->rotation == 270))
2914 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2916 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2917 if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN)
2919 ee->engine.x.using_bg_pixmap = 1;
2920 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2921 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2923 if (ee->engine.x.direct_resize)
2925 /* Turn this off for now
2926 ee->engine.x.using_bg_pixmap = 1;
2927 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2933 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2934 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2935 if (ee->engine.x.using_bg_pixmap)
2937 ecore_x_window_pixmap_set(ee->prop.window, 0);
2938 ee->engine.x.using_bg_pixmap = 0;
2939 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2941 ee->engine.x.pmap = 0;
2942 ee->engine.x.gc = 0;
2943 einfo->info.drawable = ee->prop.window;
2944 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2946 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2950 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
2955 _ecore_evas_x_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h)
2959 ecore_x_screen_size_get(ecore_x_default_screen_get(), w, h);
2963 _ecore_evas_x_shutdown(void)
2965 _ecore_evas_init_count--;
2966 if (_ecore_evas_init_count == 0)
2970 for (i = 0; i < sizeof(ecore_evas_event_handlers) / sizeof(Ecore_Event_Handler*); i++)
2972 if (ecore_evas_event_handlers[i])
2973 ecore_event_handler_del(ecore_evas_event_handlers[i]);
2975 ecore_event_evas_shutdown();
2977 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
2978 return _ecore_evas_init_count;
2981 static Ecore_Evas_Engine_Func _ecore_x_engine_func =
2988 _ecore_evas_x_callback_delete_request_set,
2999 _ecore_evas_x_managed_move,
3000 _ecore_evas_x_resize,
3001 _ecore_evas_x_move_resize,
3002 _ecore_evas_x_rotation_set,
3003 _ecore_evas_x_shaped_set,
3006 _ecore_evas_x_raise,
3007 _ecore_evas_x_lower,
3008 _ecore_evas_x_activate,
3009 _ecore_evas_x_title_set,
3010 _ecore_evas_x_name_class_set,
3011 _ecore_evas_x_size_min_set,
3012 _ecore_evas_x_size_max_set,
3013 _ecore_evas_x_size_base_set,
3014 _ecore_evas_x_size_step_set,
3015 _ecore_evas_x_object_cursor_set,
3016 _ecore_evas_x_layer_set,
3017 _ecore_evas_x_focus_set,
3018 _ecore_evas_x_iconified_set,
3019 _ecore_evas_x_borderless_set,
3020 _ecore_evas_x_override_set,
3022 _ecore_evas_x_fullscreen_set,
3023 _ecore_evas_x_avoid_damage_set,
3024 _ecore_evas_x_withdrawn_set,
3025 _ecore_evas_x_sticky_set,
3026 _ecore_evas_x_ignore_events_set,
3027 _ecore_evas_x_alpha_set,
3028 _ecore_evas_x_transparent_set,
3029 _ecore_evas_x_profiles_set,
3031 _ecore_evas_x_window_group_set,
3032 _ecore_evas_x_aspect_set,
3033 _ecore_evas_x_urgent_set,
3034 _ecore_evas_x_modal_set,
3035 _ecore_evas_x_demand_attention_set,
3036 _ecore_evas_x_focus_skip_set,
3039 _ecore_evas_x_screen_geometry_get
3041 #endif /* BUILD_ECORE_EVAS_X11 */
3044 * FIXME: there are some round trips. Especially, we can split
3045 * ecore_x_init in 2 functions and suppress some round trips.
3048 #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)
3050 _ecore_evas_x_flush_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
3052 Ecore_Evas *ee = data;
3054 if (ee->no_comp_sync) return;
3055 if (!_ecore_evas_app_comp_sync) return;
3056 if (ee->engine.x.sync_counter)
3058 if (ee->engine.x.sync_began)
3060 ee->engine.x.sync_val++;
3061 if (!ee->engine.x.sync_cancel)
3064 ecore_x_sync_counter_val_wait(ee->engine.x.sync_counter,
3065 ee->engine.x.sync_val);
3072 _ecore_evas_x_flush_post(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
3074 Ecore_Evas *ee = data;
3076 if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync) &&
3077 (!ee->gl_sync_draw_done)) // added by gl77.lee
3079 if (ee->engine.x.sync_counter)
3081 if (ee->engine.x.sync_began)
3083 if (!ee->engine.x.sync_cancel)
3085 ecore_x_e_comp_sync_draw_size_done_send
3086 (ee->engine.x.win_root, ee->prop.window, ee->w, ee->h);
3091 if (ee->engine.x.netwm_sync_set)
3093 ecore_x_sync_counter_2_set(ee->engine.x.netwm_sync_counter,
3094 ee->engine.x.netwm_sync_val_hi,
3095 ee->engine.x.netwm_sync_val_lo);
3096 ee->engine.x.netwm_sync_set = 0;
3102 * @brief Create Ecore_Evas using software x11.
3103 * @note If ecore is not compiled with support to x11 then nothing is done and NULL is returned.
3104 * @param disp_name The name of the Ecore_Evas to be created.
3105 * @param parent The parent of the Ecore_Evas to be created.
3106 * @param x The X coordinate to be used.
3107 * @param y The Y coordinate to be used.
3108 * @param w The width of the Ecore_Evas to be created.
3109 * @param h The height of the Ecore_Evas to be created.
3110 * @return A handle to the created Ecore_Evas.
3112 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3114 ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent,
3115 int x, int y, int w, int h)
3117 Evas_Engine_Info_Software_X11 *einfo;
3119 int argb = 0, rmethod;
3120 static int redraw_debug = -1;
3123 rmethod = evas_render_method_lookup("software_x11");
3124 if (!rmethod) return NULL;
3125 if (!ecore_x_init(disp_name)) return NULL;
3126 ee = calloc(1, sizeof(Ecore_Evas));
3127 if (!ee) return NULL;
3129 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3131 _ecore_evas_x_init();
3133 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3135 ee->driver = "software_x11";
3136 if (disp_name) ee->name = strdup(disp_name);
3149 ee->prop.max.w = 32767;
3150 ee->prop.max.h = 32767;
3152 ee->prop.request_pos = 0;
3153 ee->prop.sticky = 0;
3154 ee->engine.x.state.sticky = 0;
3156 /* init evas here */
3157 ee->evas = evas_new();
3158 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE,
3159 _ecore_evas_x_flush_pre, ee);
3160 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST,
3161 _ecore_evas_x_flush_post, ee);
3162 evas_data_attach_set(ee->evas, ee);
3163 evas_output_method_set(ee->evas, rmethod);
3164 evas_output_size_set(ee->evas, w, h);
3165 evas_output_viewport_set(ee->evas, 0, 0, w, h);
3167 ee->engine.x.win_root = parent;
3168 ee->engine.x.screen_num = 0;
3172 ee->engine.x.screen_num = 1; /* FIXME: get real scren # */
3173 /* FIXME: round trip in ecore_x_window_argb_get */
3174 if (ecore_x_window_argb_get(parent))
3176 ee->prop.window = ecore_x_window_argb_new(parent, x, y, w, h);
3180 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3183 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3184 if ((id = getenv("DESKTOP_STARTUP_ID")))
3186 ecore_x_netwm_startup_id_set(ee->prop.window, id);
3187 /* NB: on linux this may simply empty the env as opposed to completely
3188 * unset it to being empty - unsure as solartis libc crashes looking
3189 * for the '=' char */
3190 // putenv((char*)"DESKTOP_STARTUP_ID=");
3192 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
3195 Ecore_X_Screen *screen;
3197 /* FIXME: this is inefficient as its 1 or more round trips */
3198 screen = ecore_x_default_screen_get();
3199 if (ecore_x_screen_count_get() > 1)
3201 Ecore_X_Window *roots;
3205 roots = ecore_x_window_root_list(&num);
3208 Ecore_X_Window root;
3210 root = ecore_x_window_root_get(parent);
3211 for (i = 0; i < num; i++)
3213 if (root == roots[i])
3215 screen = ecore_x_screen_get(i);
3223 einfo->info.destination_alpha = argb;
3225 if (redraw_debug < 0)
3227 if (getenv("REDRAW_DEBUG"))
3228 redraw_debug = atoi(getenv("REDRAW_DEBUG"));
3233 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3234 einfo->info.backend = EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB;
3235 einfo->info.connection = ecore_x_connection_get();
3236 einfo->info.screen = screen;
3238 einfo->info.backend = EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB;
3239 einfo->info.connection = ecore_x_display_get();
3240 einfo->info.screen = NULL;
3242 einfo->info.drawable = ee->prop.window;
3246 Ecore_X_Window_Attributes at;
3248 ecore_x_window_attributes_get(ee->prop.window, &at);
3249 einfo->info.visual = at.visual;
3250 einfo->info.colormap = at.colormap;
3251 einfo->info.depth = at.depth;
3252 einfo->info.destination_alpha = 1;
3256 einfo->info.visual =
3257 ecore_x_default_visual_get(einfo->info.connection, screen);
3258 einfo->info.colormap =
3259 ecore_x_default_colormap_get(einfo->info.connection, screen);
3261 ecore_x_default_depth_get(einfo->info.connection, screen);
3262 einfo->info.destination_alpha = 0;
3265 einfo->info.rotation = 0;
3266 einfo->info.debug = redraw_debug;
3267 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3269 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3270 ecore_evas_free(ee);
3275 _ecore_evas_x_hints_update(ee);
3276 _ecore_evas_x_group_leader_set(ee);
3277 ecore_x_window_defaults_set(ee->prop.window);
3278 _ecore_evas_x_protocols_set(ee);
3279 _ecore_evas_x_sync_set(ee);
3281 ee->engine.func->fn_render = _ecore_evas_x_render;
3282 _ecore_evas_register(ee);
3283 ecore_x_input_multi_select(ee->prop.window);
3284 ecore_event_window_register(ee->prop.window, ee, ee->evas,
3285 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
3286 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
3287 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
3288 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
3293 ecore_evas_software_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3294 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3301 * @brief Get the window from Ecore_Evas using software x11.
3302 * @note If ecore is not compiled with support for x11 or if @p ee was not
3303 * created with ecore_evas_software_x11_new() then nothing is done and
3305 * @param ee The Ecore_Evas from which to get the window.
3306 * @return The window of type Ecore_X_Window.
3308 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3310 ecore_evas_software_x11_window_get(const Ecore_Evas *ee)
3312 if (!(!strcmp(ee->driver, "software_x11"))) return 0;
3313 return (Ecore_X_Window) ecore_evas_window_get(ee);
3317 ecore_evas_software_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3324 * @brief Set the direct_resize of Ecore_Evas using software x11.
3325 * @note If ecore is not compiled with support to x11 then nothing is done.
3326 * @param ee The Ecore_Evas in which to set direct resize.
3327 * @param on Enables the resize of Ecore_Evas if equals EINA_TRUE, disables if equals EINA_FALSE.
3329 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3331 ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3333 ee->engine.x.direct_resize = on;
3334 if (ee->prop.avoid_damage)
3336 if (ee->engine.x.direct_resize)
3338 /* turn this off for now
3339 ee->engine.x.using_bg_pixmap = 1;
3340 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
3345 /* turn this off too- bg pixmap is controlled by avoid damage directly
3346 ee->engine.x.using_bg_pixmap = 0;
3347 ecore_x_window_pixmap_set(ee->prop.window, 0);
3348 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
3355 ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3361 * @brief Gets if the Ecore_Evas is being directly resized using software x11.
3362 * @note If ecore is not compiled with support to x11 then nothing is done and EINA_FALSE is returned.
3363 * @param ee The Ecore_Evas from which to get direct resize.
3364 * @return EINA_TRUE if the resize was managed directly, otherwise return EINA_FALSE.
3366 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3368 ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee)
3370 return ee->engine.x.direct_resize;
3374 ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3381 * @brief Add extra window on Ecore_Evas using software x11.
3382 * @note If ecore is not compiled with support to x11 then nothing is done.
3383 * @param ee The Ecore_Evas on which to add the window.
3384 * @param win The window to be added at the Ecore_Evas.
3386 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3388 ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3390 Ecore_X_Window *winp;
3392 winp = malloc(sizeof(Ecore_X_Window));
3396 ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
3397 ecore_x_input_multi_select(win);
3398 ecore_event_window_register(win, ee, ee->evas,
3399 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
3400 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
3401 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
3402 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
3407 ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3413 * @brief Create Ecore_Evas using opengl x11.
3414 * @note If ecore is not compiled with support to x11 then nothing is done and NULL is returned.
3415 * @param disp_name The name of the display of the Ecore_Evas to be created.
3416 * @param parent The parent of the Ecore_Evas to be created.
3417 * @param x The X coordinate to be used.
3418 * @param y The Y coordinate to be used.
3419 * @param w The width of the Ecore_Evas to be created.
3420 * @param h The height of the Ecore_Evas to be created.
3421 * @return The new Ecore_Evas.
3423 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3425 ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent,
3426 int x, int y, int w, int h)
3428 return ecore_evas_gl_x11_options_new(disp_name, parent, x, y, w, h, NULL);
3432 ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent,
3433 int x, int y, int w, int h, const int *opt)
3439 rmethod = evas_render_method_lookup("gl_x11");
3440 if (!rmethod) return NULL;
3441 if (!ecore_x_init(disp_name)) return NULL;
3442 ee = calloc(1, sizeof(Ecore_Evas));
3443 if (!ee) return NULL;
3445 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3447 ee->gl_sync_draw_done = -1; // added by gl77.lee
3449 _ecore_evas_x_init();
3451 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3453 ee->driver = "opengl_x11";
3455 ee->semi_sync = 0; // gl engine doesn't need to sync - its whole swaps
3457 if (!getenv("ECORE_EVAS_COMP_NOSEMISYNC"))
3458 ee->semi_sync = 1; // gl engine doesn't need to sync - its whole swaps
3459 // ee->no_comp_sync = 1; // gl engine doesn't need to sync - its whole swaps
3461 if (disp_name) ee->name = strdup(disp_name);
3474 ee->prop.max.w = 32767;
3475 ee->prop.max.h = 32767;
3477 ee->prop.request_pos = 0;
3478 ee->prop.sticky = 0;
3479 ee->engine.x.state.sticky = 0;
3481 /* init evas here */
3482 ee->evas = evas_new();
3483 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3484 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3485 evas_data_attach_set(ee->evas, ee);
3486 evas_output_method_set(ee->evas, rmethod);
3487 evas_output_size_set(ee->evas, w, h);
3488 evas_output_viewport_set(ee->evas, 0, 0, w, h);
3490 if (parent == 0) parent = DefaultRootWindow(ecore_x_display_get());
3491 ee->engine.x.win_root = parent;
3493 if (ee->engine.x.win_root != 0)
3495 ee->engine.x.screen_num = 1; /* FIXME: get real scren # */
3496 /* FIXME: round trip in ecore_x_window_argb_get */
3497 if (ecore_x_window_argb_get(ee->engine.x.win_root))
3499 ee->prop.window = _ecore_evas_x_gl_window_new
3500 (ee, ee->engine.x.win_root, x, y, w, h, 0, 1, opt);
3503 ee->prop.window = _ecore_evas_x_gl_window_new
3504 (ee, ee->engine.x.win_root, x, y, w, h, 0, 0, opt);
3507 ee->prop.window = _ecore_evas_x_gl_window_new
3508 (ee, ee->engine.x.win_root, x, y, w, h, 0, 0, opt);
3509 if (!ee->prop.window)
3511 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3512 ecore_evas_free(ee);
3515 if ((id = getenv("DESKTOP_STARTUP_ID")))
3517 ecore_x_netwm_startup_id_set(ee->prop.window, id);
3518 /* NB: on linux this may simply empty the env as opposed to completely
3519 * unset it to being empty - unsure as solartis libc crashes looking
3520 * for the '=' char */
3521 // putenv((char*)"DESKTOP_STARTUP_ID=");
3524 _ecore_evas_x_hints_update(ee);
3525 _ecore_evas_x_group_leader_set(ee);
3526 ecore_x_window_defaults_set(ee->prop.window);
3527 _ecore_evas_x_protocols_set(ee);
3528 _ecore_evas_x_sync_set(ee);
3530 ee->engine.func->fn_render = _ecore_evas_x_render;
3531 _ecore_evas_register(ee);
3532 ecore_x_input_multi_select(ee->prop.window);
3533 ecore_event_window_register(ee->prop.window, ee, ee->evas,
3534 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
3535 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
3536 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
3537 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
3543 ecore_evas_gl_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3544 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3549 ecore_evas_gl_x11_options_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3550 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__, const int *opt __UNUSED__)
3554 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3557 * @brief Get the window from Ecore_Evas using opengl x11.
3558 * @note If ecore is not compiled with support for x11 or if @p ee was not
3559 * created with ecore_evas_gl_x11_new() then nothing is done and
3561 * @param ee The Ecore_Evas from which to get the window.
3562 * @return The window of type Ecore_X_Window of Ecore_Evas.
3564 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3566 ecore_evas_gl_x11_window_get(const Ecore_Evas *ee)
3568 if (!(!strcmp(ee->driver, "opengl_x11"))) return 0;
3569 return (Ecore_X_Window) ecore_evas_window_get(ee);
3573 ecore_evas_gl_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3577 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3580 * @brief Set direct_resize for Ecore_Evas using opengl x11.
3581 * @note If ecore is not compiled with support to x11 then nothing is done.
3582 * @param ee The Ecore_Evas in which to set direct resize.
3583 * @param on Enables the resize of Ecore_Evas if equals EINA_TRUE, disables if equals EINA_FALSE.
3585 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3587 ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3589 ee->engine.x.direct_resize = on;
3593 ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3596 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3599 * @brief Gets if the Ecore_Evas is being directly resized using opengl x11.
3600 * @note If ecore is not compiled with support to x11 then nothing is done and EINA_FALSE is returned.
3601 * @param ee The Ecore_Evas from which to get direct resize.
3602 * @return EINA_TRUE if the resize was managed directly, otherwise return EINA_FALSE.
3604 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3606 ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee)
3608 return ee->engine.x.direct_resize;
3612 ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3616 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3619 * @brief Add extra window on Ecore_Evas using opengl x11.
3620 * @note If ecore is not compiled with support to x11 then nothing is done.
3621 * @param ee The Ecore_Evas for which to add the window.
3622 * @param win The window to be added at the Ecore_Evas.
3624 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3626 ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3628 ecore_evas_software_x11_extra_event_window_add(ee, win);
3632 ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3635 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3638 * @brief Set the functions to be used before and after the swap callback.
3639 * @note If ecore is not compiled with support to x11 then nothing is done and the function is returned.
3640 * @param ee The Ecore_Evas for which to set the swap callback.
3641 * @param data The data for which to set the swap callback.
3642 * @param pre_cb The function to be called before the callback.
3643 * @param post_cb The function to be called after the callback.
3645 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3647 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))
3649 Evas_Engine_Info_GL_X11 *einfo;
3651 if (!(!strcmp(ee->driver, "opengl_x11"))) return;
3653 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
3656 einfo->callback.pre_swap = pre_cb;
3657 einfo->callback.post_swap = post_cb;
3658 einfo->callback.data = data;
3659 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3661 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
3667 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__)
3671 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3674 ecore_evas_xrender_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3675 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3681 ecore_evas_xrender_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3687 ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3692 ecore_evas_xrender_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3698 ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3703 * @brief Create Ecore_Evas using software 16 x11.
3704 * @note If ecore is not compiled with support to x11 then nothing is done and NULL is returned.
3705 * @param disp_name The name of the display of the Ecore_Evas to be created.
3706 * @param parent The parent of the Ecore_Evas to be created.
3707 * @param x The X coordinate to be used.
3708 * @param y The Y coordinate to be used.
3709 * @param w The width of the Ecore_Evas to be created.
3710 * @param h The height of the Ecore_Evas to be created.
3711 * @return The new Ecore_Evas.
3713 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3715 ecore_evas_software_x11_16_new(const char *disp_name, Ecore_X_Window parent,
3716 int x, int y, int w, int h)
3718 Evas_Engine_Info_Software_16_X11 *einfo;
3721 static int redraw_debug = -1;
3723 rmethod = evas_render_method_lookup("software_16_x11");
3724 if (!rmethod) return NULL;
3725 if (!ecore_x_init(disp_name)) return NULL;
3726 ee = calloc(1, sizeof(Ecore_Evas));
3727 if (!ee) return NULL;
3729 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3731 _ecore_evas_x_init();
3733 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3735 ee->driver = "software_16_x11";
3736 if (disp_name) ee->name = strdup(disp_name);
3749 ee->prop.max.w = 32767;
3750 ee->prop.max.h = 32767;
3752 ee->prop.request_pos = 0;
3753 ee->prop.sticky = 0;
3754 ee->engine.x.state.sticky = 0;
3756 /* init evas here */
3757 ee->evas = evas_new();
3758 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3759 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3760 evas_data_attach_set(ee->evas, ee);
3761 evas_output_method_set(ee->evas, rmethod);
3762 evas_output_size_set(ee->evas, w, h);
3763 evas_output_viewport_set(ee->evas, 0, 0, w, h);
3765 ee->engine.x.win_root = parent;
3768 /* FIXME: round trip in ecore_x_window_argb_get */
3769 if (ecore_x_window_argb_get(parent))
3771 ee->prop.window = ecore_x_window_argb_new(parent, x, y, w, h);
3774 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3777 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3778 if (getenv("DESKTOP_STARTUP_ID"))
3780 ecore_x_netwm_startup_id_set(ee->prop.window,
3781 getenv("DESKTOP_STARTUP_ID"));
3782 /* NB: on linux this may simply empty the env as opposed to completely
3783 * unset it to being empty - unsure as solartis libc crashes looking
3784 * for the '=' char */
3785 // putenv((char*)"DESKTOP_STARTUP_ID=");
3787 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
3791 if (ScreenCount(ecore_x_display_get()) > 1)
3793 Ecore_X_Window *roots;
3797 roots = ecore_x_window_root_list(&num);
3800 XWindowAttributes at;
3802 if (XGetWindowAttributes(ecore_x_display_get(),
3805 for (i = 0; i < num; i++)
3807 if (at.root == roots[i])
3815 if (redraw_debug < 0)
3817 if (getenv("REDRAW_DEBUG"))
3818 redraw_debug = atoi(getenv("REDRAW_DEBUG"));
3822 einfo->info.display = ecore_x_display_get();
3823 einfo->info.drawable = ee->prop.window;
3825 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3827 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3828 ecore_evas_free(ee);
3834 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3835 ecore_evas_free(ee);
3839 _ecore_evas_x_hints_update(ee);
3840 _ecore_evas_x_group_leader_set(ee);
3841 ecore_x_window_defaults_set(ee->prop.window);
3842 _ecore_evas_x_protocols_set(ee);
3843 _ecore_evas_x_sync_set(ee);
3845 ee->engine.func->fn_render = _ecore_evas_x_render;
3846 _ecore_evas_register(ee);
3847 ecore_x_input_multi_select(ee->prop.window);
3848 ecore_event_window_register(ee->prop.window, ee, ee->evas,
3849 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
3850 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
3851 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
3852 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
3857 ecore_evas_software_x11_16_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3858 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3862 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
3865 * @brief Get the window from Ecore_Evas using software 16 x11.
3866 * @note If ecore is not compiled with support for x11 or if @p ee was not
3867 * created with ecore_evas_software_x11_16_new() then nothing is done and
3869 * @param ee The Ecore_Evas from which to get the window.
3870 * @return The window of type Ecore_X_Window of Ecore_Evas.
3872 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3874 ecore_evas_software_x11_16_window_get(const Ecore_Evas *ee)
3876 if (!(!strcmp(ee->driver, "software_16_x11"))) return 0;
3877 return (Ecore_X_Window) ecore_evas_window_get(ee);
3881 ecore_evas_software_x11_16_window_get(const Ecore_Evas *ee __UNUSED__)
3885 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
3888 * @brief Set direct_resize for Ecore_Evas using software 16 x11.
3889 * @note If ecore is not compiled with support to x11 then nothing is done.
3890 * @param ee The Ecore_Evas in which to set direct resize.
3891 * @param on Enables the resize of Ecore_Evas if equals EINA_TRUE, disables if equals EINA_FALSE.
3893 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3895 ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3897 ee->engine.x.direct_resize = on;
3898 if (ee->prop.avoid_damage)
3900 if (ee->engine.x.direct_resize)
3902 /* turn this off for now
3903 ee->engine.x.using_bg_pixmap = 1;
3904 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
3909 /* turn this off too- bg pixmap is controlled by avoid damage directly
3910 ee->engine.x.using_bg_pixmap = 0;
3911 ecore_x_window_pixmap_set(ee->prop.window, 0);
3912 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
3919 ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3922 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
3925 * @brief Gets if the Ecore_Evas is being directly resized using software 16 x11.
3926 * @note If ecore is not compiled with support to x11 then nothing is done and 0 is returned.
3927 * @param ee The Ecore_Evas from which to get direct resize.
3928 * @return EINA_TRUE if the resize was managed directly, otherwise return EINA_FALSE.
3930 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3932 ecore_evas_software_x11_16_direct_resize_get(const Ecore_Evas *ee)
3934 return ee->engine.x.direct_resize;
3938 ecore_evas_software_x11_16_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3942 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
3945 * @brief Add extra window on Ecore_Evas using software 16 x11.
3946 * @note If ecore is not compiled with support to x11 then nothing is done.
3947 * @param ee The Ecore_Evas on which to add the window.
3948 * @param win The window to be added at the Ecore_Evas.
3950 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3952 ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3954 Ecore_X_Window *winp;
3956 winp = malloc(sizeof(Ecore_X_Window));
3960 ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
3961 ecore_x_input_multi_select(win);
3962 ecore_event_window_register(win, ee, ee->evas,
3963 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
3964 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
3965 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
3966 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
3971 ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3974 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
3978 * @brief Create Ecore_Evas using software 8 x11.
3979 * @note If ecore is not compiled with support to x11 then nothing is done and NULL is returned.
3980 * @param disp_name The name of the display of the Ecore_Evas to be created.
3981 * @param parent The parent of the Ecore_Evas to be created.
3982 * @param x The X coordinate to be used.
3983 * @param y The Y coordinate to be used.
3984 * @param w The width of the Ecore_Evas to be created.
3985 * @param h The height of the Ecore_Evas to be created.
3986 * @return The new Ecore_Evas.
3989 ecore_evas_software_x11_8_new(const char *disp_name, Ecore_X_Window parent,
3990 int x, int y, int w, int h)
3992 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
3993 Evas_Engine_Info_Software_8_X11 *einfo;
3997 static int redraw_debug = -1;
3999 rmethod = evas_render_method_lookup("software_8_x11");
4000 if (!rmethod) return NULL;
4001 if (!ecore_x_init(disp_name)) return NULL;
4002 ee = calloc(1, sizeof(Ecore_Evas));
4003 if (!ee) return NULL;
4005 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
4007 _ecore_evas_x_init();
4009 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
4011 ee->driver = "software_8_x11";
4012 if (disp_name) ee->name = strdup(disp_name);
4025 ee->prop.max.w = 32767;
4026 ee->prop.max.h = 32767;
4028 ee->prop.request_pos = 0;
4029 ee->prop.sticky = 0;
4030 ee->engine.x.state.sticky = 0;
4032 /* init evas here */
4033 ee->evas = evas_new();
4034 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
4035 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
4036 evas_data_attach_set(ee->evas, ee);
4037 evas_output_method_set(ee->evas, rmethod);
4038 evas_output_size_set(ee->evas, w, h);
4039 evas_output_viewport_set(ee->evas, 0, 0, w, h);
4041 ee->engine.x.win_root = parent;
4044 // /* FIXME: round trip in ecore_x_window_argb_get */
4045 // if (ecore_x_window_argb_get(parent))
4047 // ee->engine.x.win = ecore_x_window_argb_new(parent, x, y, w, h);
4051 // ee->engine.x.win = ecore_x_window_new(parent, x, y, w, h);
4054 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
4055 if (getenv("DESKTOP_STARTUP_ID"))
4057 ecore_x_netwm_startup_id_set(ee->prop.window,
4058 getenv("DESKTOP_STARTUP_ID"));
4059 /* NB: on linux this may simply empty the env as opposed to completely
4060 * unset it to being empty - unsure as solartis libc crashes looking
4061 * for the '=' char */
4062 // putenv((char*)"DESKTOP_STARTUP_ID=");
4064 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
4067 xcb_screen_iterator_t iter;
4068 xcb_screen_t *screen;
4070 /* FIXME: this is inefficient as its a round trip */
4071 //einfo->info.backend = 1;
4072 screen = ecore_x_default_screen_get();
4073 iter = xcb_setup_roots_iterator (xcb_get_setup (ecore_x_connection_get()));
4076 xcb_get_geometry_cookie_t cookie;
4077 xcb_get_geometry_reply_t *reply;
4078 Ecore_X_Window *roots;
4083 cookie = xcb_get_geometry_unchecked(ecore_x_connection_get(), parent);
4084 roots = ecore_x_window_root_list(&num);
4087 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
4091 for (i = 0; i < num; xcb_screen_next (&iter), i++)
4093 if (reply->root == roots[i])
4105 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
4106 if (reply) free(reply);
4110 if (redraw_debug < 0)
4112 if (getenv("REDRAW_DEBUG"))
4113 redraw_debug = atoi(getenv("REDRAW_DEBUG"));
4117 einfo->info.connection = ecore_x_connection_get();
4118 einfo->info.screen = screen;
4119 einfo->info.drawable = ee->prop.window;
4122 /* FIXME: round trip */
4123 xcb_get_geometry_cookie_t cookie_geom;
4124 xcb_get_window_attributes_cookie_t cookie_attr;
4125 xcb_get_geometry_reply_t *reply_geom;
4126 xcb_get_window_attributes_reply_t *reply_attr;
4128 cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->prop.window);
4129 cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
4131 reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
4132 reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
4133 if (reply_attr && reply_geom)
4135 einfo->info.visual = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
4136 einfo->info.colormap = reply_attr->colormap;
4137 einfo->info.depth = reply_geom->depth;
4138 einfo->info.destination_alpha = 1;
4145 xcb_screen_t *screen;
4147 screen = ecore_x_default_screen_get();
4148 einfo->info.visual = xcb_visualtype_get(screen, screen->root_visual);
4149 einfo->info.colormap = screen->default_colormap;
4150 einfo->info.depth = screen->root_depth;
4151 einfo->info.destination_alpha = 0;
4153 einfo->info.rotation = 0;
4154 einfo->info.debug = redraw_debug;
4155 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
4157 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
4158 ecore_evas_free(ee);
4164 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
4165 ecore_evas_free(ee);
4169 _ecore_evas_x_hints_update(ee);
4170 _ecore_evas_x_group_leader_set(ee);
4171 ecore_x_window_defaults_set(ee->prop.window);
4172 _ecore_evas_x_protocols_set(ee);
4173 _ecore_evas_x_sync_set(ee);
4175 ee->engine.func->fn_render = _ecore_evas_x_render;
4176 _ecore_evas_register(ee);
4177 ecore_x_input_multi_select(ee->prop.window);
4178 ecore_event_window_register(ee->prop.window, ee, ee->evas,
4179 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
4180 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
4181 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
4182 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
4193 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
4197 * @brief Get window from Ecore_Evas using software 8 x11.
4198 * @note If ecore is not compiled with support for x11 or if @p ee was not
4199 * created with ecore_evas_software_x11_8_new() then nothing is done and
4201 * @param ee The Ecore_Evas from which to get the window.
4202 * @return The window of type Ecore_X_Window of Ecore_Evas.
4205 ecore_evas_software_x11_8_window_get(const Ecore_Evas *ee)
4207 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4208 if (!(!strcmp(ee->driver, "software_8_x11"))) return 0;
4209 return (Ecore_X_Window) ecore_evas_window_get(ee);
4217 * @brief Get subwindow from Ecore_Evas using software 8 x11.
4218 * @note If ecore is not compiled with support for x11 or if @p ee was not
4219 * created with ecore_evas_software_x11_8_new() then nothing is done and
4221 * @param ee The Ecore_Evas from which to get the subwindow.
4222 * @return The window of type Ecore_X_Window of Ecore_Evas.
4225 ecore_evas_software_x11_8_subwindow_get(const Ecore_Evas *ee)
4227 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4228 if (!(!strcmp(ee->driver, "software_8_x11"))) return 0;
4229 return (Ecore_X_Window) ecore_evas_window_get(ee);
4237 * @brief Set direct_size for Ecore_Evas using software 8 x11.
4238 * @note If ecore is not compiled with support to x11 then nothing is done and the function is returned.
4239 * @param ee The Ecore_Evas in which to set direct resize.
4240 * @param on Enables the resize of Ecore_Evas if equals EINA_TRUE, disables if equals EINA_FALSE.
4243 ecore_evas_software_x11_8_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
4245 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4246 ee->engine.x.direct_resize = on;
4247 if (ee->prop.avoid_damage)
4249 if (ee->engine.x.direct_resize)
4251 /* turn this off for now
4252 ee->engine.x.using_bg_pixmap = 1;
4253 ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap);
4258 /* turn this off too- bg pixmap is controlled by avoid damage directly
4259 ee->engine.x.using_bg_pixmap = 0;
4260 ecore_x_window_pixmap_set(ee->engine.x.win, 0);
4261 ecore_x_window_area_expose(ee->engine.x.win, 0, 0, ee->w, ee->h);
4273 * @brief Gets if the Ecore_Evas is being directly resized using software 8 x11.
4274 * @note If ecore is not compiled with support to x11 then nothing is done and 0 is returned.
4275 * @param ee The Ecore_Evas from which to get direct resize.
4276 * @return EINA_TRUE if the resize was managed directly, otherwise return EINA_FALSE.
4279 ecore_evas_software_x11_8_direct_resize_get(const Ecore_Evas *ee)
4281 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4282 return ee->engine.x.direct_resize;
4290 * @brief Add extra window on Ecore_Evas using software 8 x11.
4291 * @note If ecore is not compiled with support to x11 then nothing is done and the function is returned.
4292 * @param ee The Ecore_Evas on which to add the window.
4293 * @param win The window to be added at Ecore_Evas.
4296 ecore_evas_software_x11_8_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
4298 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4299 Ecore_X_Window *winp;
4301 winp = malloc(sizeof(Ecore_X_Window));
4305 ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
4306 ecore_x_input_multi_select(win);
4307 ecore_event_window_register(win, ee, ee->evas,
4308 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
4309 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
4310 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
4311 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
4321 ecore_evas_x11_leader_set(Ecore_Evas *ee, Ecore_X_Window win)
4323 #ifdef BUILD_ECORE_EVAS_X11
4324 _ecore_evas_x_group_leader_unset(ee);
4325 ee->engine.x.leader = win;
4326 _ecore_evas_x_group_leader_update(ee);
4335 ecore_evas_x11_leader_get(Ecore_Evas *ee)
4337 #ifdef BUILD_ECORE_EVAS_X11
4338 return ee->engine.x.leader;
4346 ecore_evas_x11_leader_default_set(Ecore_Evas *ee)
4348 #ifdef BUILD_ECORE_EVAS_X11
4349 _ecore_evas_x_group_leader_unset(ee);
4350 _ecore_evas_x_group_leader_set(ee);
4357 #ifdef BUILD_ECORE_EVAS_X11
4359 _ecore_evas_x11_convert_rectangle_with_angle(Ecore_Evas *ee, Ecore_X_Rectangle *dst_rect, Ecore_X_Rectangle *src_rect)
4361 if ((!src_rect) || (!dst_rect)) return 0;
4363 if (ee->rotation == 0)
4365 dst_rect->x = src_rect->x;
4366 dst_rect->y = src_rect->y;
4367 dst_rect->width = src_rect->width;
4368 dst_rect->height = src_rect->height;
4370 else if (ee->rotation == 90)
4372 dst_rect->x = src_rect->y;
4373 dst_rect->y = ee->req.h - src_rect->x - src_rect->width;
4374 dst_rect->width = src_rect->height;
4375 dst_rect->height = src_rect->width;
4377 else if (ee->rotation == 180)
4379 dst_rect->x = ee->req.w - src_rect->x - src_rect->width;
4380 dst_rect->y = ee->req.h - src_rect->y - src_rect->height;
4381 dst_rect->width = src_rect->width;
4382 dst_rect->height = src_rect->height;
4384 else if (ee->rotation == 270)
4386 dst_rect->x = ee->req.w - src_rect->y - src_rect->height;
4387 dst_rect->y = src_rect->x;
4388 dst_rect->width = src_rect->height;
4389 dst_rect->height = src_rect->width;
4401 ecore_evas_x11_shape_input_rectangle_set(Ecore_Evas *ee, int x, int y, int w, int h)
4403 #ifdef BUILD_ECORE_EVAS_X11
4405 Ecore_X_Rectangle src_rect;
4406 Ecore_X_Rectangle dst_rect;
4408 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4410 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4411 "ecore_evas_x11_shape_input_rectangle_set");
4418 src_rect.height = h;
4423 dst_rect.height = 0;
4425 ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
4427 if (!ee->engine.x.win_shaped_input)
4428 ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root,
4432 ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input,
4433 dst_rect.x, dst_rect.y,
4434 dst_rect.width, dst_rect.height);
4446 ecore_evas_x11_shape_input_rectangle_add(Ecore_Evas *ee, int x, int y, int w, int h)
4448 #ifdef BUILD_ECORE_EVAS_X11
4450 Ecore_X_Rectangle src_rect;
4451 Ecore_X_Rectangle dst_rect;
4453 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4455 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4456 "ecore_evas_x11_shape_input_rectangle_add");
4463 src_rect.height = h;
4468 dst_rect.height = 0;
4470 ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
4472 if (!ee->engine.x.win_shaped_input)
4473 ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root,
4477 ecore_x_window_shape_input_rectangle_add(ee->engine.x.win_shaped_input,
4478 dst_rect.x, dst_rect.y,
4479 dst_rect.width, dst_rect.height);
4491 ecore_evas_x11_shape_input_rectangle_subtract(Ecore_Evas *ee, int x, int y, int w, int h)
4493 #ifdef BUILD_ECORE_EVAS_X11
4495 Ecore_X_Rectangle src_rect;
4496 Ecore_X_Rectangle dst_rect;
4498 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4500 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4501 "ecore_evas_x11_shape_input_rectangle_subtract");
4508 src_rect.height = h;
4513 dst_rect.height = 0;
4515 ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
4517 if (!ee->engine.x.win_shaped_input)
4518 ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root,
4522 ecore_x_window_shape_input_rectangle_subtract(ee->engine.x.win_shaped_input,
4523 dst_rect.x, dst_rect.y,
4524 dst_rect.width, dst_rect.height);
4536 ecore_evas_x11_shape_input_empty(Ecore_Evas *ee)
4538 #ifdef BUILD_ECORE_EVAS_X11
4539 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4541 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4542 "ecore_evas_x11_shape_input_empty");
4546 if (!ee->engine.x.win_shaped_input)
4547 ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root, 0, 0, 1, 1);
4549 ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input, 0, 0, 0, 0);
4557 ecore_evas_x11_shape_input_reset(Ecore_Evas *ee)
4559 #ifdef BUILD_ECORE_EVAS_X11
4560 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4562 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4563 "ecore_evas_x11_shape_input_reset");
4567 if (!ee->engine.x.win_shaped_input)
4568 ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root, 0, 0, 1, 1);
4570 ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input, 0, 0, 65535, 65535);
4578 ecore_evas_x11_shape_input_apply(Ecore_Evas *ee)
4580 #ifdef BUILD_ECORE_EVAS_X11
4581 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4583 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4584 "ecore_evas_x11_shape_input_apply");
4588 if (!ee->engine.x.win_shaped_input) return;
4590 ecore_x_window_shape_input_window_set(ee->prop.window, ee->engine.x.win_shaped_input);