8 #include <Ecore_Input.h>
9 #include <Ecore_Input_Evas.h>
10 #ifdef BUILD_ECORE_EVAS_X11
12 # include <Ecore_X_Atoms.h>
14 # undef BUILD_ECORE_EVAS_OPENGL_X11
15 # undef BUILD_ECORE_EVAS_SOFTWARE_X11
16 # undef BUILD_ECORE_EVAS_XRENDER_X11
19 #ifndef HAVE_ECORE_X_XCB
20 # undef BUILD_ECORE_EVAS_XRENDER_XCB
21 # undef BUILD_ECORE_EVAS_SOFTWARE_XCB
24 #include "ecore_evas_private.h"
25 #include "Ecore_Evas.h"
27 #ifdef BUILD_ECORE_EVAS_X11
28 static int _ecore_evas_init_count = 0;
30 static Ecore_Event_Handler *ecore_evas_event_handlers[13];
32 static int leader_ref = 0;
33 static Ecore_X_Window leader_win = 0;
36 _ecore_evas_x_group_leader_set(Ecore_Evas *ee)
41 leader_win = ecore_x_window_override_new(ee->engine.x.win_root, 1234, 5678, 1, 2);
42 ecore_x_window_defaults_set(leader_win);
43 if (getenv("DESKTOP_STARTUP_ID"))
44 ecore_x_netwm_startup_id_set(leader_win,
45 getenv("DESKTOP_STARTUP_ID"));
46 ecore_x_icccm_client_leader_set(leader_win, leader_win);
48 ee->engine.x.leader = leader_win;
49 ecore_x_icccm_client_leader_set(ee->prop.window, leader_win);
53 _ecore_evas_x_group_leader_unset(Ecore_Evas *ee)
55 ecore_x_window_prop_property_del(ee->prop.window, ECORE_X_ATOM_WM_CLIENT_LEADER);
56 if (ee->engine.x.leader == leader_win)
61 ecore_x_window_free(leader_win);
64 ee->engine.x.leader = 0;
69 _ecore_evas_x_group_leader_update(Ecore_Evas *ee)
71 if (ee->engine.x.leader)
72 ecore_x_icccm_client_leader_set(ee->prop.window, ee->engine.x.leader);
76 _ecore_evas_x_protocols_set(Ecore_Evas *ee)
78 Ecore_X_Atom protos[10];
81 if (ee->func.fn_delete_request)
82 protos[num++] = ECORE_X_ATOM_WM_DELETE_WINDOW;
83 protos[num++] = ECORE_X_ATOM_NET_WM_PING;
84 ecore_x_icccm_protocol_atoms_set(ee->prop.window, protos, num);
88 _ecore_evas_x_sync_set(Ecore_Evas *ee)
90 if (((ee->should_be_visible) || (ee->visible)) &&
91 ((ecore_x_e_comp_sync_supported_get(ee->engine.x.win_root)) &&
92 (!ee->no_comp_sync) && (_ecore_evas_app_comp_sync)))
94 if (!ee->engine.x.sync_counter)
95 ee->engine.x.sync_counter = ecore_x_sync_counter_new(0);
99 if (ee->engine.x.sync_counter)
100 ecore_x_sync_counter_free(ee->engine.x.sync_counter);
101 ee->engine.x.sync_counter = 0;
103 ecore_x_e_comp_sync_counter_set(ee->prop.window, ee->engine.x.sync_counter);
107 _ecore_evas_x_sync_clear(Ecore_Evas *ee)
109 if (!ee->engine.x.sync_counter) return;
110 ecore_x_sync_counter_free(ee->engine.x.sync_counter);
111 ee->engine.x.sync_counter = 0;
114 #ifdef HAVE_ECORE_X_XCB
115 static xcb_visualtype_t *
116 xcb_visualtype_get(xcb_screen_t *screen, xcb_visualid_t visual)
118 xcb_depth_iterator_t iter_depth;
120 if (!screen) return NULL;
122 iter_depth = xcb_screen_allowed_depths_iterator(screen);
123 for (; iter_depth.rem; xcb_depth_next (&iter_depth))
125 xcb_visualtype_iterator_t iter_vis;
127 iter_vis = xcb_depth_visuals_iterator(iter_depth.data);
128 for (; iter_vis.rem; --screen, xcb_visualtype_next (&iter_vis))
130 if (visual == iter_vis.data->visual_id)
131 return iter_vis.data;
137 #endif /* HAVE_ECORE_X_XCB */
139 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
140 # ifdef HAVE_ECORE_X_XCB
143 static Ecore_X_Window
144 _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)
146 Evas_Engine_Info_GL_X11 *einfo;
149 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
152 XSetWindowAttributes attr;
159 for (op = 0; opt[op]; op++)
161 if (opt[op] == ECORE_EVAS_GL_X11_OPT_INDIRECT)
164 einfo->indirect = opt[op];
169 /* FIXME: this is inefficient as its 1 or more round trips */
170 screen = DefaultScreen(ecore_x_display_get());
171 if (ScreenCount(ecore_x_display_get()) > 1)
173 Ecore_X_Window *roots;
177 roots = ecore_x_window_root_list(&num);
180 XWindowAttributes at;
182 if (XGetWindowAttributes(ecore_x_display_get(),
185 for (i = 0; i < num; i++)
187 if (at.root == roots[i])
197 einfo->info.display = ecore_x_display_get();
198 einfo->info.screen = screen;
200 einfo->info.destination_alpha = argb;
202 einfo->info.visual = einfo->func.best_visual_get(einfo);
203 einfo->info.colormap = einfo->func.best_colormap_get(einfo);
204 einfo->info.depth = einfo->func.best_depth_get(einfo);
207 if ((!einfo->info.visual) ||
208 (!einfo->info.colormap) ||
209 (!einfo->info.depth))
211 WRN("OpenGL X11 init engine '%s' failed - no visual, colormap or depth.", ee->driver);
212 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
214 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
219 attr.backing_store = NotUseful;
220 attr.override_redirect = override;
221 attr.colormap = einfo->info.colormap;
222 attr.border_pixel = 0;
223 attr.background_pixmap = None;
225 KeyPressMask | KeyReleaseMask |
226 ExposureMask | ButtonPressMask | ButtonReleaseMask |
227 EnterWindowMask | LeaveWindowMask |
228 PointerMotionMask | StructureNotifyMask | VisibilityChangeMask |
229 FocusChangeMask | PropertyChangeMask | ColormapChangeMask;
230 attr.bit_gravity = ForgetGravity;
233 XCreateWindow(einfo->info.display, parent, x, y, w, h, 0,
234 einfo->info.depth, InputOutput, einfo->info.visual,
235 CWBackingStore | CWColormap | CWBackPixmap |
236 CWBorderPixel | CWBitGravity | CWEventMask |
237 CWOverrideRedirect, &attr);
238 einfo->info.drawable = win;
240 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
242 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
243 XDestroyWindow(einfo->info.display, win);
253 #endif /* HAVE_ECORE_X_XCB */
257 _ecore_evas_x_render(Ecore_Evas *ee)
260 Eina_List *updates, *l;
262 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
266 if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync) &&
267 (ee->engine.x.sync_counter) && (!ee->engine.x.sync_began) &&
268 (!ee->engine.x.sync_cancel))
271 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
273 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
274 rend |= _ecore_evas_buffer_render(ee2);
275 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
278 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
279 if (ee->prop.avoid_damage)
281 updates = evas_render_updates(ee->evas);
282 if (ee->engine.x.using_bg_pixmap)
286 EINA_LIST_FOREACH(updates, l, r)
287 ecore_x_window_area_clear(ee->prop.window, r->x, r->y, r->w, r->h);
288 if ((ee->shaped) && (updates))
290 #ifdef EVAS_FRAME_QUEUING
291 /* wait until ee->engine.x.mask being updated */
294 ecore_x_window_shape_mask_set(ee->prop.window, ee->engine.x.mask);
296 if ((ee->alpha) && (updates))
298 #ifdef EVAS_FRAME_QUEUING
299 /* wait until ee->engine.x.mask being updated */
300 // evas_sync(ee->evas);
302 // ecore_x_window_shape_input_mask_set(ee->prop.window, ee->engine.x.mask);
304 evas_render_updates_free(updates);
305 _ecore_evas_idle_timeout_update(ee);
311 EINA_LIST_FOREACH(updates, l, r)
313 Ecore_X_Rectangle rect;
314 Ecore_X_XRegion *tmpr;
316 if (!ee->engine.x.damages)
317 ee->engine.x.damages = ecore_x_xregion_new();
318 tmpr = ecore_x_xregion_new();
319 if (ee->rotation == 0)
326 else if (ee->rotation == 90)
329 rect.y = ee->h - r->x - r->w;
333 else if (ee->rotation == 180)
335 rect.x = ee->w - r->x - r->w;
336 rect.y = ee->h - r->y - r->h;
340 else if (ee->rotation == 270)
342 rect.x = ee->w - r->y - r->h;
347 ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
348 ecore_x_xregion_free(ee->engine.x.damages);
349 ee->engine.x.damages = tmpr;
351 if (ee->engine.x.damages)
353 /* if we have a damage pixmap - we can avoid exposures by
354 * disabling them just for setting the mask */
355 ecore_x_event_mask_set(ee->prop.window,
356 ECORE_X_EVENT_MASK_KEY_DOWN |
357 ECORE_X_EVENT_MASK_KEY_UP |
358 ECORE_X_EVENT_MASK_MOUSE_DOWN |
359 ECORE_X_EVENT_MASK_MOUSE_UP |
360 ECORE_X_EVENT_MASK_MOUSE_IN |
361 ECORE_X_EVENT_MASK_MOUSE_OUT |
362 ECORE_X_EVENT_MASK_MOUSE_MOVE |
363 // ECORE_X_EVENT_MASK_WINDOW_DAMAGE |
364 ECORE_X_EVENT_MASK_WINDOW_VISIBILITY |
365 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE |
366 ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE |
367 ECORE_X_EVENT_MASK_WINDOW_PROPERTY |
368 ECORE_X_EVENT_MASK_WINDOW_COLORMAP
370 if ((ee->shaped) && (updates))
371 ecore_x_window_shape_mask_set(ee->prop.window, ee->engine.x.mask);
372 /* and re-enable them again */
373 ecore_x_event_mask_set(ee->prop.window,
374 ECORE_X_EVENT_MASK_KEY_DOWN |
375 ECORE_X_EVENT_MASK_KEY_UP |
376 ECORE_X_EVENT_MASK_MOUSE_DOWN |
377 ECORE_X_EVENT_MASK_MOUSE_UP |
378 ECORE_X_EVENT_MASK_MOUSE_IN |
379 ECORE_X_EVENT_MASK_MOUSE_OUT |
380 ECORE_X_EVENT_MASK_MOUSE_MOVE |
381 ECORE_X_EVENT_MASK_WINDOW_DAMAGE |
382 ECORE_X_EVENT_MASK_WINDOW_VISIBILITY |
383 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE |
384 ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE |
385 ECORE_X_EVENT_MASK_WINDOW_PROPERTY |
386 ECORE_X_EVENT_MASK_WINDOW_COLORMAP
388 ecore_x_xregion_set(ee->engine.x.damages, ee->engine.x.gc);
389 /* debug rendering */
391 XSetForeground(ecore_x_display_get(), ee->engine.x.gc, rand());
392 XFillRectangle(ecore_x_display_get(), ee->prop.window, ee->engine.x.gc,
394 XSync(ecore_x_display_get(), False);
396 XSync(ecore_x_display_get(), False);
398 ecore_x_pixmap_paste(ee->engine.x.pmap, ee->prop.window, ee->engine.x.gc,
399 0, 0, ee->w, ee->h, 0, 0);
400 ecore_x_xregion_free(ee->engine.x.damages);
401 ee->engine.x.damages = NULL;
405 evas_render_updates_free(updates);
406 _ecore_evas_idle_timeout_update(ee);
411 else if (((ee->visible) && (ee->draw_ok)) ||
412 ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
413 ((ee->should_be_visible) && (ee->prop.override)))
415 updates = evas_render_updates(ee->evas);
420 #ifdef EVAS_FRAME_QUEUING
421 /* wait until ee->engine.x.mask being updated */
424 ecore_x_window_shape_mask_set(ee->prop.window, ee->engine.x.mask);
428 #ifdef EVAS_FRAME_QUEUING
429 /* wait until ee->engine.x.mask being updated */
430 // evas_sync(ee->evas);
432 // ecore_x_window_shape_input_mask_set(ee->prop.window, ee->engine.x.mask);
434 evas_render_updates_free(updates);
435 _ecore_evas_idle_timeout_update(ee);
440 evas_norender(ee->evas);
441 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
445 static int frames = 0;
446 static double t0 = 0.0;
449 t = ecore_time_get();
454 printf("FPS: %3.3f\n", (double)frames / td);
464 _ecore_evas_x_resize_shape(Ecore_Evas *ee)
466 if (!strcmp(ee->driver, "software_x11"))
468 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
469 Evas_Engine_Info_Software_X11 *einfo;
471 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
474 unsigned int foreground;
477 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
478 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
480 gc = ecore_x_gc_new(ee->engine.x.mask,
481 ECORE_X_GC_VALUE_MASK_FOREGROUND,
483 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
486 einfo->info.mask = ee->engine.x.mask;
487 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
489 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
491 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
493 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
495 else if (!strcmp(ee->driver, "xrender_x11"))
497 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
498 Evas_Engine_Info_XRender_X11 *einfo;
500 einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
503 unsigned int foreground;
506 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
507 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
509 gc = ecore_x_gc_new(ee->engine.x.mask,
510 ECORE_X_GC_VALUE_MASK_FOREGROUND,
512 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
515 einfo->info.mask = ee->engine.x.mask;
516 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
518 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
520 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
523 #endif /* BUILD_ECORE_EVAS_XRENDER_X11 || BUILD_ECORE_EVAS_XRENDER_XCB */
525 else if (!strcmp(ee->driver, "software_16_x11"))
527 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
528 # if 0 /* XXX no shaped window support for software_16_x11 */
529 Evas_Engine_Info_Software_16_X11 *einfo;
531 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
534 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
535 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
536 einfo->info.mask = ee->engine.x.mask;
537 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
539 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
541 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
543 # endif /* XXX no shaped window support for software_16_x11 */
544 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
546 if (!strcmp(ee->driver, "software_8_x11"))
548 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
549 Evas_Engine_Info_Software_8_X11 *einfo;
551 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
554 unsigned int foreground;
557 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
558 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
560 gc = ecore_x_gc_new(ee->engine.x.mask,
561 ECORE_X_GC_VALUE_MASK_FOREGROUND,
563 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
566 einfo->info.mask = ee->engine.x.mask;
567 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
569 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
571 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
573 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
577 /* TODO: we need to make this work for all the states, not just sticky */
579 _ecore_evas_x_event_property_change(void *data __UNUSED__, int type __UNUSED__, void *event)
582 Ecore_X_Event_Window_Property *e;
585 ee = ecore_event_window_match(e->win);
586 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
587 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
588 if (e->atom == ECORE_X_ATOM_NET_WM_STATE)
591 Ecore_X_Window_State *state;
594 #ifdef HAVE_ECORE_X_XCB
595 ecore_x_netwm_window_state_get_prefetch(e->win);
596 #endif /* HAVE_ECORE_X_XCB */
599 /* TODO: we need to move those to the end, with if statements */
600 ee->engine.x.state.modal = 0;
601 ee->engine.x.state.maximized_v = 0;
602 ee->engine.x.state.maximized_h = 0;
603 ee->engine.x.state.shaded = 0;
604 ee->engine.x.state.skip_taskbar = 0;
605 ee->engine.x.state.skip_pager = 0;
606 ee->prop.fullscreen = 0;
607 ee->engine.x.state.fullscreen = 0;
608 ee->engine.x.state.above = 0;
609 ee->engine.x.state.below = 0;
611 #ifdef HAVE_ECORE_X_XCB
612 ecore_x_netwm_window_state_get_fetch();
613 #endif /* HAVE_ECORE_X_XCB */
614 ecore_x_netwm_window_state_get(e->win, &state, &num);
617 for (i = 0; i < num; i++)
621 case ECORE_X_WINDOW_STATE_MODAL:
622 ee->engine.x.state.modal = 1;
624 case ECORE_X_WINDOW_STATE_STICKY:
625 if (ee->prop.sticky && ee->engine.x.state.sticky)
630 ee->engine.x.state.sticky = 1;
631 if (ee->func.fn_sticky) ee->func.fn_sticky(ee);
633 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
634 ee->engine.x.state.maximized_v = 1;
636 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
637 ee->engine.x.state.maximized_h = 1;
639 case ECORE_X_WINDOW_STATE_SHADED:
640 ee->engine.x.state.shaded = 1;
642 case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
643 ee->engine.x.state.skip_taskbar = 1;
645 case ECORE_X_WINDOW_STATE_SKIP_PAGER:
646 ee->engine.x.state.skip_pager = 1;
648 case ECORE_X_WINDOW_STATE_FULLSCREEN:
649 ee->prop.fullscreen = 1;
650 ee->engine.x.state.fullscreen = 1;
652 case ECORE_X_WINDOW_STATE_ABOVE:
653 ee->engine.x.state.above = 1;
655 case ECORE_X_WINDOW_STATE_BELOW:
656 ee->engine.x.state.below = 1;
664 #ifdef HAVE_ECORE_X_XCB
665 ecore_xcb_reply_free();
666 #endif /* HAVE_ECORE_X_XCB */
668 if (ee->prop.sticky && !sticky)
671 ee->engine.x.state.sticky = 0;
672 if (ee->func.fn_unsticky) ee->func.fn_unsticky(ee);
676 return ECORE_CALLBACK_PASS_ON;
680 _ecore_evas_x_event_visibility_change(void *data __UNUSED__, int type __UNUSED__, void *event)
683 Ecore_X_Event_Window_Visibility_Change *e;
686 ee = ecore_event_window_match(e->win);
687 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
688 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
689 // printf("VIS CHANGE OBSCURED: %p %i\n", ee, e->fully_obscured);
690 if (e->fully_obscured)
692 /* FIXME: round trip */
693 if (!ecore_x_screen_is_composited(ee->engine.x.screen_num))
696 else ee->draw_ok = 1;
697 return ECORE_CALLBACK_PASS_ON;
701 _ecore_evas_x_event_client_message(void *data __UNUSED__, int type __UNUSED__, void *event)
704 Ecore_X_Event_Client_Message *e;
707 if (e->format != 32) return ECORE_CALLBACK_PASS_ON;
708 if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_BEGIN)
710 ee = ecore_event_window_match(e->data.l[0]);
711 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
712 if (e->data.l[0] != (long)ee->prop.window) return ECORE_CALLBACK_PASS_ON;
713 if (!ee->engine.x.sync_began)
715 // qeue a damage + draw. work around an event re-ordering thing.
716 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
718 ee->engine.x.sync_began = 1;
719 ee->engine.x.sync_cancel = 0;
721 else if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_END)
723 ee = ecore_event_window_match(e->data.l[0]);
724 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
725 if (e->data.l[0] != (long)ee->prop.window) return ECORE_CALLBACK_PASS_ON;
726 ee->engine.x.sync_began = 0;
727 ee->engine.x.sync_cancel = 0;
729 else if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_CANCEL)
731 ee = ecore_event_window_match(e->data.l[0]);
732 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
733 if (e->data.l[0] != (long)ee->prop.window) return ECORE_CALLBACK_PASS_ON;
734 ee->engine.x.sync_began = 0;
735 ee->engine.x.sync_cancel = 1;
737 return ECORE_CALLBACK_PASS_ON;
741 _ecore_evas_x_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
744 Ecore_X_Event_Mouse_In *e;
747 ee = ecore_event_window_match(e->win);
748 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
749 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
754 /* const char *modes[] = { */
756 /* "MODE_WHILE_GRABBED", */
760 /* const char *details[] = { */
761 /* "DETAIL_ANCESTOR", */
762 /* "DETAIL_VIRTUAL", */
763 /* "DETAIL_INFERIOR", */
764 /* "DETAIL_NON_LINEAR", */
765 /* "DETAIL_NON_LINEAR_VIRTUAL", */
766 /* "DETAIL_POINTER", */
767 /* "DETAIL_POINTER_ROOT", */
768 /* "DETAIL_DETAIL_NONE" */
770 /* t = time(NULL); */
771 /* ct = ctime(&t); */
772 /* ct[strlen(ct) - 1] = 0; */
773 /* printf("@@ ->IN 0x%x 0x%x %s md=%s dt=%s\n", */
774 /* e->win, e->event_win, */
776 /* modes[e->mode], */
777 /* details[e->detail]); */
779 // disable. causes more problems than it fixes
780 // if ((e->mode == ECORE_X_EVENT_MODE_GRAB) ||
781 // (e->mode == ECORE_X_EVENT_MODE_UNGRAB))
783 /* if (e->mode != ECORE_X_EVENT_MODE_NORMAL) return 0; */
784 if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
785 ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
786 evas_event_feed_mouse_in(ee->evas, e->time, NULL);
787 _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
788 return ECORE_CALLBACK_PASS_ON;
792 _ecore_evas_x_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
795 Ecore_X_Event_Mouse_Out *e;
798 ee = ecore_event_window_match(e->win);
799 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
801 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
806 /* const char *modes[] = { */
808 /* "MODE_WHILE_GRABBED", */
812 /* const char *details[] = { */
813 /* "DETAIL_ANCESTOR", */
814 /* "DETAIL_VIRTUAL", */
815 /* "DETAIL_INFERIOR", */
816 /* "DETAIL_NON_LINEAR", */
817 /* "DETAIL_NON_LINEAR_VIRTUAL", */
818 /* "DETAIL_POINTER", */
819 /* "DETAIL_POINTER_ROOT", */
820 /* "DETAIL_DETAIL_NONE" */
822 /* t = time(NULL); */
823 /* ct = ctime(&t); */
824 /* ct[strlen(ct) - 1] = 0; */
825 /* printf("@@ ->OUT 0x%x 0x%x %s md=%s dt=%s\n", */
826 /* e->win, e->event_win, */
828 /* modes[e->mode], */
829 /* details[e->detail]); */
831 // disable. causes more problems than it fixes
832 // if ((e->mode == ECORE_X_EVENT_MODE_GRAB) ||
833 // (e->mode == ECORE_X_EVENT_MODE_UNGRAB))
835 /* if (e->mode != ECORE_X_EVENT_MODE_NORMAL) return 0; */
836 ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
837 _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
838 if (e->mode == ECORE_X_EVENT_MODE_GRAB)
839 evas_event_feed_mouse_cancel(ee->evas, e->time, NULL);
840 evas_event_feed_mouse_out(ee->evas, e->time, NULL);
841 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
842 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
843 return ECORE_CALLBACK_PASS_ON;
847 _ecore_evas_x_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
850 Ecore_X_Event_Window_Focus_In *e;
853 ee = ecore_event_window_match(e->win);
854 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
855 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
856 if (e->mode == ECORE_X_EVENT_MODE_UNGRAB) return ECORE_CALLBACK_PASS_ON;
857 ee->prop.focused = 1;
858 evas_focus_in(ee->evas);
859 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
860 return ECORE_CALLBACK_PASS_ON;
864 _ecore_evas_x_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
867 Ecore_X_Event_Window_Focus_Out *e;
870 ee = ecore_event_window_match(e->win);
871 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
872 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
873 if (e->mode == ECORE_X_EVENT_MODE_GRAB) return ECORE_CALLBACK_PASS_ON;
874 // if (ee->prop.fullscreen)
875 // ecore_x_window_focus(ee->prop.window);
876 evas_focus_out(ee->evas);
877 ee->prop.focused = 0;
878 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
879 return ECORE_CALLBACK_PASS_ON;
883 _ecore_evas_x_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event)
886 Ecore_X_Event_Window_Damage *e;
889 ee = ecore_event_window_match(e->win);
890 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
891 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
892 if (ee->engine.x.using_bg_pixmap) return ECORE_CALLBACK_PASS_ON;
893 // printf("EXPOSE %p [%i] %i %i %ix%i\n", ee, ee->prop.avoid_damage, e->x, e->y, e->w, e->h);
894 if (ee->prop.avoid_damage)
896 Ecore_X_Rectangle rect;
897 Ecore_X_XRegion *tmpr;
899 if (!ee->engine.x.damages) ee->engine.x.damages = ecore_x_xregion_new();
900 tmpr = ecore_x_xregion_new();
905 ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
906 ecore_x_xregion_free(ee->engine.x.damages);
907 ee->engine.x.damages = tmpr;
908 /* no - this breaks things badly. disable. Ecore_X_Rectangle != XRectangle - see
909 * the typedefs in x's headers and ecore_x's. also same with Region - it's a pointer in x - not an X ID
910 Ecore_X_Rectangle rect;
911 Ecore_X_XRegion *tmpr;
913 if (!ee->engine.x.damages) ee->engine.x.damages = ecore_x_xregion_new();
914 tmpr = ecore_x_xregion_new();
919 ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
920 ecore_x_xregion_free(ee->engine.x.damages);
921 ee->engine.x.damages = tmpr;
926 if (ee->rotation == 0)
927 evas_damage_rectangle_add(ee->evas,
931 else if (ee->rotation == 90)
932 evas_damage_rectangle_add(ee->evas,
936 else if (ee->rotation == 180)
937 evas_damage_rectangle_add(ee->evas,
941 else if (ee->rotation == 270)
942 evas_damage_rectangle_add(ee->evas,
947 return ECORE_CALLBACK_PASS_ON;
951 _ecore_evas_x_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event)
954 Ecore_X_Event_Window_Destroy *e;
957 ee = ecore_event_window_match(e->win);
958 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
959 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
960 if (ee->func.fn_destroy) ee->func.fn_destroy(ee);
961 _ecore_evas_x_sync_clear(ee);
963 return ECORE_CALLBACK_PASS_ON;
967 _ecore_evas_x_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
970 Ecore_X_Event_Window_Configure *e;
973 ee = ecore_event_window_match(e->win);
974 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
975 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
976 if (ee->engine.x.direct_resize) return ECORE_CALLBACK_PASS_ON;
978 if ((e->from_wm) || (ee->prop.override))
980 if ((ee->x != e->x) || (ee->y != e->y))
986 if (ee->func.fn_move) ee->func.fn_move(ee);
989 if ((ee->w != e->w) || (ee->h != e->h))
995 if ((ee->rotation == 90) || (ee->rotation == 270))
997 evas_output_size_set(ee->evas, ee->h, ee->w);
998 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1002 evas_output_size_set(ee->evas, ee->w, ee->h);
1003 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1005 if (ee->prop.avoid_damage)
1009 pdam = ecore_evas_avoid_damage_get(ee);
1010 ecore_evas_avoid_damage_set(ee, 0);
1011 ecore_evas_avoid_damage_set(ee, pdam);
1013 if ((ee->shaped) || (ee->alpha))
1014 _ecore_evas_x_resize_shape(ee);
1015 if ((ee->expecting_resize.w > 0) &&
1016 (ee->expecting_resize.h > 0))
1018 if ((ee->expecting_resize.w == ee->w) &&
1019 (ee->expecting_resize.h == ee->h))
1020 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
1021 ecore_x_current_time_get());
1022 ee->expecting_resize.w = 0;
1023 ee->expecting_resize.h = 0;
1025 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1027 return ECORE_CALLBACK_PASS_ON;
1031 _ecore_evas_x_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event)
1034 Ecore_X_Event_Window_Delete_Request *e;
1037 ee = ecore_event_window_match(e->win);
1038 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1039 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1040 if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
1041 return ECORE_CALLBACK_PASS_ON;
1045 _ecore_evas_x_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event)
1048 Ecore_X_Event_Window_Show *e;
1049 static int first_map_bug = -1;
1052 ee = ecore_event_window_match(e->win);
1053 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1054 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1055 if (first_map_bug < 0)
1057 if (getenv("ECORE_EVAS_GL_FIRST_MAP_BUG"))
1058 first_map_bug = atoi(getenv("ECORE_EVAS_GL_FIRST_MAP_BUG"));
1062 if ((first_map_bug) &&
1063 (!strcmp(ee->driver, "opengl_x11")))
1064 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1065 if (ee->visible) return ECORE_CALLBACK_DONE;
1066 // printf("SHOW EVENT %p\n", ee);
1068 if (ee->func.fn_show) ee->func.fn_show(ee);
1069 return ECORE_CALLBACK_PASS_ON;
1073 _ecore_evas_x_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event)
1076 Ecore_X_Event_Window_Hide *e;
1079 ee = ecore_event_window_match(e->win);
1080 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1081 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1082 if (!ee->visible) return ECORE_CALLBACK_DONE;
1083 // printf("HIDE EVENT %p\n", ee);
1085 if (ee->func.fn_hide) ee->func.fn_hide(ee);
1086 return ECORE_CALLBACK_PASS_ON;
1089 /* FIXME, should be in idler */
1090 /* FIXME, round trip */
1092 _ecore_evas_x_size_pos_hints_update(Ecore_Evas *ee)
1094 # ifdef HAVE_ECORE_X_XCB
1095 ecore_x_icccm_size_pos_hints_get_prefetch(ee->prop.window);
1096 ecore_x_icccm_size_pos_hints_get_fetch();
1097 # endif /* HAVE_ECORE_X_XCB */
1098 ecore_x_icccm_size_pos_hints_set(ee->prop.window,
1099 ee->prop.request_pos /*request_pos */,
1100 ECORE_X_GRAVITY_NW /* gravity */,
1101 ee->prop.min.w /* min_w */,
1102 ee->prop.min.h /* min_h */,
1103 ee->prop.max.w /* max_w */,
1104 ee->prop.max.h /* max_h */,
1105 ee->prop.base.w /* base_w */,
1106 ee->prop.base.h /* base_h */,
1107 ee->prop.step.w /* step_x */,
1108 ee->prop.step.h /* step_y */,
1110 0 /* max_aspect */);
1111 # ifdef HAVE_ECORE_X_XCB
1112 ecore_xcb_reply_free();
1113 # endif /* HAVE_ECORE_X_XCB */
1116 /* FIXME, should be in idler */
1118 _ecore_evas_x_state_update(Ecore_Evas *ee)
1120 Ecore_X_Window_State state[10];
1126 if (bd->client.netwm.state.modal)
1127 state[num++] = ECORE_X_WINDOW_STATE_MODAL;
1129 if (ee->engine.x.state.sticky)
1130 state[num++] = ECORE_X_WINDOW_STATE_STICKY;
1132 if (bd->client.netwm.state.maximized_v)
1133 state[num++] = ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
1134 if (bd->client.netwm.state.maximized_h)
1135 state[num++] = ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
1136 if (bd->client.netwm.state.shaded)
1137 state[num++] = ECORE_X_WINDOW_STATE_SHADED;
1138 if (bd->client.netwm.state.skip_taskbar)
1139 state[num++] = ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
1140 if (bd->client.netwm.state.skip_pager)
1141 state[num++] = ECORE_X_WINDOW_STATE_SKIP_PAGER;
1142 if (bd->client.netwm.state.hidden)
1143 state[num++] = ECORE_X_WINDOW_STATE_HIDDEN;
1145 if (ee->engine.x.state.fullscreen)
1146 state[num++] = ECORE_X_WINDOW_STATE_FULLSCREEN;
1147 if (ee->engine.x.state.above)
1148 state[num++] = ECORE_X_WINDOW_STATE_ABOVE;
1149 if (ee->engine.x.state.below)
1150 state[num++] = ECORE_X_WINDOW_STATE_BELOW;
1152 ecore_x_netwm_window_state_set(ee->prop.window, state, num);
1156 _ecore_evas_x_layer_update(Ecore_Evas *ee)
1158 if (ee->should_be_visible)
1160 /* We need to send a netwm request to the wm */
1161 /* FIXME: Do we have to remove old state before adding new? */
1162 if (ee->prop.layer < 3)
1164 if (ee->engine.x.state.above)
1166 ee->engine.x.state.above = 0;
1167 ecore_x_netwm_state_request_send(ee->prop.window,
1168 ee->engine.x.win_root,
1169 ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
1171 if (!ee->engine.x.state.below)
1173 ee->engine.x.state.below = 1;
1174 ecore_x_netwm_state_request_send(ee->prop.window,
1175 ee->engine.x.win_root,
1176 ECORE_X_WINDOW_STATE_BELOW, -1, 1);
1179 else if (ee->prop.layer > 5)
1181 if (ee->engine.x.state.below)
1183 ee->engine.x.state.below = 0;
1184 ecore_x_netwm_state_request_send(ee->prop.window,
1185 ee->engine.x.win_root,
1186 ECORE_X_WINDOW_STATE_BELOW, -1, 0);
1188 if (!ee->engine.x.state.above)
1190 ee->engine.x.state.above = 1;
1191 ecore_x_netwm_state_request_send(ee->prop.window,
1192 ee->engine.x.win_root,
1193 ECORE_X_WINDOW_STATE_ABOVE, -1, 1);
1198 if (ee->engine.x.state.below)
1200 ee->engine.x.state.below = 0;
1201 ecore_x_netwm_state_request_send(ee->prop.window,
1202 ee->engine.x.win_root,
1203 ECORE_X_WINDOW_STATE_BELOW, -1, 0);
1205 if (ee->engine.x.state.above)
1207 ee->engine.x.state.above = 0;
1208 ecore_x_netwm_state_request_send(ee->prop.window,
1209 ee->engine.x.win_root,
1210 ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
1216 /* Just set the state */
1217 if (ee->prop.layer < 3)
1219 if ((ee->engine.x.state.above) || (!ee->engine.x.state.below))
1221 ee->engine.x.state.above = 0;
1222 ee->engine.x.state.below = 1;
1223 _ecore_evas_x_state_update(ee);
1226 else if (ee->prop.layer > 5)
1228 if ((!ee->engine.x.state.above) || (ee->engine.x.state.below))
1230 ee->engine.x.state.above = 1;
1231 ee->engine.x.state.below = 0;
1232 _ecore_evas_x_state_update(ee);
1237 if ((ee->engine.x.state.above) || (ee->engine.x.state.below))
1239 ee->engine.x.state.above = 0;
1240 ee->engine.x.state.below = 0;
1241 _ecore_evas_x_state_update(ee);
1245 /* FIXME: Set gnome layer */
1249 _ecore_evas_x_init(void)
1251 _ecore_evas_init_count++;
1252 if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
1253 ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN, _ecore_evas_x_event_mouse_in, NULL);
1254 ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT, _ecore_evas_x_event_mouse_out, NULL);
1255 ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, _ecore_evas_x_event_window_focus_in, NULL);
1256 ecore_evas_event_handlers[3] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, _ecore_evas_x_event_window_focus_out, NULL);
1257 ecore_evas_event_handlers[4] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DAMAGE, _ecore_evas_x_event_window_damage, NULL);
1258 ecore_evas_event_handlers[5] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DESTROY, _ecore_evas_x_event_window_destroy, NULL);
1259 ecore_evas_event_handlers[6] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE, _ecore_evas_x_event_window_configure, NULL);
1260 ecore_evas_event_handlers[7] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, _ecore_evas_x_event_window_delete_request, NULL);
1261 ecore_evas_event_handlers[8] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW, _ecore_evas_x_event_window_show, NULL);
1262 ecore_evas_event_handlers[9] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_HIDE, _ecore_evas_x_event_window_hide, NULL);
1263 ecore_evas_event_handlers[10] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, _ecore_evas_x_event_property_change, NULL);
1264 ecore_evas_event_handlers[11] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, _ecore_evas_x_event_visibility_change, NULL);
1265 ecore_evas_event_handlers[12] = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, _ecore_evas_x_event_client_message, NULL);
1266 ecore_event_evas_init();
1267 return _ecore_evas_init_count;
1271 _ecore_evas_x_free(Ecore_Evas *ee)
1273 _ecore_evas_x_group_leader_unset(ee);
1274 _ecore_evas_x_sync_set(ee);
1275 ecore_x_window_free(ee->prop.window);
1276 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
1277 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1278 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
1279 if (ee->engine.x.damages) ecore_x_xregion_free(ee->engine.x.damages);
1280 ee->engine.x.pmap = 0;
1281 ee->engine.x.mask = 0;
1282 ee->engine.x.gc = 0;
1283 ee->engine.x.damages = NULL;
1284 ecore_event_window_unregister(ee->prop.window);
1285 while (ee->engine.x.win_extra)
1287 Ecore_X_Window *winp;
1289 winp = ee->engine.x.win_extra->data;
1290 ee->engine.x.win_extra = eina_list_remove_list(ee->engine.x.win_extra, ee->engine.x.win_extra);
1291 ecore_event_window_unregister(*winp);
1294 _ecore_evas_x_shutdown();
1299 _ecore_evas_x_callback_delete_request_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
1301 ee->func.fn_delete_request = func;
1302 _ecore_evas_x_protocols_set(ee);
1303 _ecore_evas_x_sync_set(ee);
1307 _ecore_evas_x_move(Ecore_Evas *ee, int x, int y)
1311 if (ee->engine.x.direct_resize)
1313 if (!ee->engine.x.managed)
1315 if ((x != ee->x) || (y != ee->y))
1319 ecore_x_window_move(ee->prop.window, x, y);
1320 if (!ee->should_be_visible)
1322 /* We need to request pos */
1323 ee->prop.request_pos = 1;
1324 _ecore_evas_x_size_pos_hints_update(ee);
1326 if (ee->func.fn_move) ee->func.fn_move(ee);
1332 ecore_x_window_move(ee->prop.window, x, y);
1333 if (!ee->should_be_visible)
1335 /* We need to request pos */
1336 ee->prop.request_pos = 1;
1337 _ecore_evas_x_size_pos_hints_update(ee);
1339 if (!ee->engine.x.managed)
1348 _ecore_evas_x_managed_move(Ecore_Evas *ee, int x, int y)
1352 if (ee->engine.x.direct_resize)
1354 ee->engine.x.managed = 1;
1355 if ((x != ee->x) || (y != ee->y))
1359 if (ee->func.fn_move) ee->func.fn_move(ee);
1365 _ecore_evas_x_resize(Ecore_Evas *ee, int w, int h)
1369 if (ee->engine.x.direct_resize)
1371 if ((ee->w != w) || (ee->h != h))
1373 ecore_x_window_resize(ee->prop.window, w, h);
1376 if ((ee->rotation == 90) || (ee->rotation == 270))
1378 evas_output_size_set(ee->evas, ee->h, ee->w);
1379 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1383 evas_output_size_set(ee->evas, ee->w, ee->h);
1384 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1386 if (ee->prop.avoid_damage)
1390 pdam = ecore_evas_avoid_damage_get(ee);
1391 ecore_evas_avoid_damage_set(ee, 0);
1392 ecore_evas_avoid_damage_set(ee, pdam);
1394 if ((ee->shaped) || (ee->alpha))
1395 _ecore_evas_x_resize_shape(ee);
1396 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1400 ecore_x_window_resize(ee->prop.window, w, h);
1404 _ecore_evas_x_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
1410 if (ee->engine.x.direct_resize)
1412 if ((ee->w != w) || (ee->h != h) || (x != ee->x) || (y != ee->y))
1414 int change_size = 0, change_pos = 0;
1416 if ((ee->w != w) || (ee->h != h)) change_size = 1;
1417 if (!ee->engine.x.managed)
1419 if ((x != ee->x) || (y != ee->y)) change_pos = 1;
1421 ecore_x_window_move_resize(ee->prop.window, x, y, w, h);
1422 if (!ee->engine.x.managed)
1429 if ((ee->rotation == 90) || (ee->rotation == 270))
1431 evas_output_size_set(ee->evas, ee->h, ee->w);
1432 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1436 evas_output_size_set(ee->evas, ee->w, ee->h);
1437 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1439 if (ee->prop.avoid_damage)
1443 pdam = ecore_evas_avoid_damage_get(ee);
1444 ecore_evas_avoid_damage_set(ee, 0);
1445 ecore_evas_avoid_damage_set(ee, pdam);
1447 if ((ee->shaped) || (ee->alpha))
1448 _ecore_evas_x_resize_shape(ee);
1451 if (ee->func.fn_move) ee->func.fn_move(ee);
1455 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1461 ecore_x_window_move_resize(ee->prop.window, x, y, w, h);
1462 if (!ee->engine.x.managed)
1471 _ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize,
1472 Evas_Engine_Info *einfo)
1476 rot_dif = ee->rotation - rotation;
1477 if (rot_dif < 0) rot_dif = -rot_dif;
1481 int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
1483 if (!evas_engine_info_set(ee->evas, einfo))
1485 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1490 if (!ee->prop.fullscreen)
1492 ecore_x_window_resize(ee->prop.window, ee->req.h, ee->req.w);
1493 ee->expecting_resize.w = ee->h;
1494 ee->expecting_resize.h = ee->w;
1500 ecore_x_window_size_get(ee->prop.window, &w, &h);
1501 ecore_x_window_resize(ee->prop.window, h, w);
1502 if ((rotation == 0) || (rotation == 180))
1504 evas_output_size_set(ee->evas, ee->req.w, ee->req.h);
1505 evas_output_viewport_set(ee->evas, 0, 0, ee->req.w, ee->req.h);
1509 evas_output_size_set(ee->evas, ee->req.h, ee->req.w);
1510 evas_output_viewport_set(ee->evas, 0, 0, ee->req.h, ee->req.w);
1512 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1514 if ((ee->rotation == 90) || (ee->rotation == 270))
1515 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.h, ee->req.w);
1517 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
1523 ecore_x_window_size_get(ee->prop.window, &w, &h);
1524 if ((rotation == 0) || (rotation == 180))
1526 evas_output_size_set(ee->evas, ee->w, ee->h);
1527 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1531 evas_output_size_set(ee->evas, ee->h, ee->w);
1532 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1534 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1535 if ((ee->rotation == 90) || (ee->rotation == 270))
1536 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
1538 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1540 ecore_evas_size_min_get(ee, &minw, &minh);
1541 ecore_evas_size_max_get(ee, &maxw, &maxh);
1542 ecore_evas_size_base_get(ee, &basew, &baseh);
1543 ecore_evas_size_step_get(ee, &stepw, &steph);
1544 ee->rotation = rotation;
1545 ecore_evas_size_min_set(ee, minh, minw);
1546 ecore_evas_size_max_set(ee, maxh, maxw);
1547 ecore_evas_size_base_set(ee, baseh, basew);
1548 ecore_evas_size_step_set(ee, steph, stepw);
1549 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
1550 ecore_x_current_time_get());
1554 if (!evas_engine_info_set(ee->evas, einfo))
1556 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1558 ee->rotation = rotation;
1559 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
1560 ecore_x_current_time_get());
1561 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1563 if ((ee->rotation == 90) || (ee->rotation == 270))
1564 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
1566 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1570 #define _USE_WIN_ROT_EFFECT 1
1572 #if _USE_WIN_ROT_EFFECT
1573 static void _ecore_evas_x_flush_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__);
1575 typedef struct _Ecore_Evas_X_Rotation_Effect Ecore_Evas_X_Rotation_Effect;
1576 struct _Ecore_Evas_X_Rotation_Effect
1578 Eina_Bool wait_for_comp_reply;
1581 static Ecore_Evas_X_Rotation_Effect _rot_effect =
1587 _ecore_evas_x_rotation_effect_setup(void)
1589 _rot_effect.wait_for_comp_reply = EINA_TRUE;
1591 #endif /* end of _USE_WIN_ROT_EFFECT */
1594 _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize)
1596 if (ee->rotation == rotation) return;
1597 if (!strcmp(ee->driver, "xrender_x11")) return;
1599 #if _USE_WIN_ROT_EFFECT
1601 angles[0] = rotation;
1602 angles[1] = ee->rotation;
1603 #endif /* end of _USE_WIN_ROT_EFFECT */
1605 if (!strcmp(ee->driver, "opengl_x11"))
1607 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
1608 Evas_Engine_Info_GL_X11 *einfo;
1610 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
1612 einfo->info.rotation = rotation;
1613 _ecore_evas_x_rotation_set_internal
1614 (ee, rotation, resize, (Evas_Engine_Info *)einfo);
1615 # if _USE_WIN_ROT_EFFECT
1616 ecore_x_window_prop_property_set (ee->prop.window,
1617 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1618 ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1620 ecore_x_window_prop_property_set (ee->prop.window,
1621 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1622 ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1624 #endif /* BUILD_ECORE_EVAS_OPENGL_X11 */
1626 else if (!strcmp(ee->driver, "software_x11"))
1628 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
1629 Evas_Engine_Info_Software_X11 *einfo;
1631 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
1633 einfo->info.rotation = rotation;
1634 _ecore_evas_x_rotation_set_internal
1635 (ee, rotation, resize, (Evas_Engine_Info *)einfo);
1636 # if _USE_WIN_ROT_EFFECT
1637 ecore_x_window_prop_property_set (ee->prop.window,
1638 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1639 ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1641 ecore_x_window_prop_property_set (ee->prop.window,
1642 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1643 ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1645 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
1647 else if (!strcmp(ee->driver, "software_16_x11"))
1649 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
1650 Evas_Engine_Info_Software_16_X11 *einfo;
1652 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
1654 einfo->info.rotation = rotation;
1655 _ecore_evas_x_rotation_set_internal
1656 (ee, rotation, resize, (Evas_Engine_Info *)einfo);
1657 # if _USE_WIN_ROT_EFFECT
1658 ecore_x_window_prop_property_set (ee->prop.window,
1659 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1660 ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1662 ecore_x_window_prop_property_set (ee->prop.window,
1663 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1664 ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1666 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
1668 else if (!strcmp(ee->driver, "software_8_x11"))
1670 #if BUILD_ECORE_EVAS_SOFTWARE_8_X11
1671 Evas_Engine_Info_Software_8_X11 *einfo;
1673 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
1675 einfo->info.rotation = rotation;
1676 _ecore_evas_x_rotation_set_internal
1677 (ee, rotation, resize, (Evas_Engine_Info *)einfo);
1678 # if _USE_WIN_ROT_EFFECT
1679 ecore_x_window_prop_property_set (ee->prop.window,
1680 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1681 ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1683 ecore_x_window_prop_property_set (ee->prop.window,
1684 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1685 ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1687 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
1690 #if _USE_WIN_ROT_EFFECT
1691 _ecore_evas_x_rotation_effect_setup();
1692 _ecore_evas_x_flush_pre(ee, NULL, NULL);
1693 #endif /* end of _USE_WIN_ROT_EFFECT */
1697 _ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped)
1699 if (((ee->shaped) && (shaped)) || ((!ee->shaped) && (!shaped)))
1701 if (!strcmp(ee->driver, "opengl_x11")) return;
1702 if (!strcmp(ee->driver, "software_x11"))
1704 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
1705 Evas_Engine_Info_Software_X11 *einfo;
1707 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
1708 ee->shaped = shaped;
1713 unsigned int foreground;
1716 if (!ee->engine.x.mask)
1717 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1719 gc = ecore_x_gc_new(ee->engine.x.mask,
1720 ECORE_X_GC_VALUE_MASK_FOREGROUND,
1722 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
1723 0, 0, ee->w, ee->h);
1724 ecore_x_gc_free(gc);
1725 einfo->info.mask = ee->engine.x.mask;
1726 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1728 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1730 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1731 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1735 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1736 ee->engine.x.mask = 0;
1737 einfo->info.mask = 0;
1738 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1740 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1742 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1743 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1746 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
1748 else if (!strcmp(ee->driver, "xrender_x11"))
1750 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
1751 Evas_Engine_Info_XRender_X11 *einfo;
1753 ee->shaped = shaped;
1754 einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
1759 unsigned int foreground;
1762 if (!ee->engine.x.mask)
1763 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1765 gc = ecore_x_gc_new(ee->engine.x.mask,
1766 ECORE_X_GC_VALUE_MASK_FOREGROUND,
1768 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
1769 0, 0, ee->w, ee->h);
1770 ecore_x_gc_free(gc);
1771 einfo->info.mask = ee->engine.x.mask;
1772 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1774 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1776 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1777 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1781 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1782 ee->engine.x.mask = 0;
1783 einfo->info.mask = 0;
1784 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1786 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1788 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1789 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1792 #endif /* BUILD_ECORE_EVAS_XRENDER_X11 || BUILD_ECORE_EVAS_XRENDER_XCB */
1794 else if (!strcmp(ee->driver, "software_16_x11"))
1796 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
1797 # if 0 /* XXX no shaped window support for software_16_x11 */
1798 Evas_Engine_Info_Software_16_X11 *einfo;
1800 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
1801 ee->shaped = shaped;
1809 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1810 einfo->info.mask = ee->engine.x.mask;
1811 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1813 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1815 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1819 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1820 ee->engine.x.mask = 0;
1821 einfo->info.mask = 0;
1822 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1824 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1826 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1829 # endif /* XXX no shaped window support for software_16_x11 */
1830 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
1832 if (!strcmp(ee->driver, "software_8_x11"))
1834 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
1835 Evas_Engine_Info_Software_8_X11 *einfo;
1837 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
1838 ee->shaped = shaped;
1843 unsigned int foreground;
1846 if (!ee->engine.x.mask)
1847 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1849 gc = ecore_x_gc_new(ee->engine.x.mask,
1850 ECORE_X_GC_VALUE_MASK_FOREGROUND,
1852 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
1853 0, 0, ee->w, ee->h);
1854 ecore_x_gc_free(gc);
1855 einfo->info.mask = ee->engine.x.mask;
1856 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1858 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1860 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1861 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1865 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1866 ee->engine.x.mask = 0;
1867 einfo->info.mask = 0;
1868 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1870 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1872 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1873 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1876 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
1880 /* FIXME, round trip */
1882 _ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
1884 # ifdef HAVE_ECORE_X_XCB
1885 xcb_get_geometry_cookie_t cookie_geom;
1886 xcb_get_window_attributes_cookie_t cookie_attr;
1887 xcb_get_geometry_reply_t *reply_geom;
1888 xcb_get_window_attributes_reply_t *reply_attr;
1890 XWindowAttributes att;
1891 #endif /* ! HAVE_ECORE_X_XCB */
1893 if (((ee->alpha) && (alpha)) || ((!ee->alpha) && (!alpha)))
1896 if (!strcmp(ee->driver, "software_x11"))
1898 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
1899 Evas_Engine_Info_Software_X11 *einfo;
1901 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
1904 if (!ecore_x_composite_query()) return;
1908 ecore_x_window_free(ee->prop.window);
1909 ecore_event_window_unregister(ee->prop.window);
1912 if (ee->prop.override)
1913 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);
1915 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);
1916 if (!ee->engine.x.mask)
1917 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
1921 if (ee->prop.override)
1922 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);
1924 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1925 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1926 ee->engine.x.mask = 0;
1927 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1930 einfo->info.destination_alpha = alpha;
1932 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
1933 cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->prop.window);
1934 cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
1936 reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
1937 reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
1938 einfo->info.visual = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
1939 einfo->info.colormap = reply_attr->colormap;
1940 einfo->info.depth = reply_geom->depth;
1944 XGetWindowAttributes(ecore_x_display_get(), ee->prop.window, &att);
1945 einfo->info.visual = att.visual;
1946 einfo->info.colormap = att.colormap;
1947 einfo->info.depth = att.depth;
1948 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
1950 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1951 // ee->engine.x.mask = 0;
1952 einfo->info.mask = ee->engine.x.mask;
1953 einfo->info.drawable = ee->prop.window;
1954 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1956 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1958 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
1959 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1960 ecore_x_input_multi_select(ee->prop.window);
1961 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
1962 if (ee->prop.borderless)
1963 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
1964 if (ee->visible) ecore_x_window_show(ee->prop.window);
1965 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
1968 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
1969 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
1971 ecore_x_icccm_hints_set(ee->prop.window,
1972 1 /* accepts_focus */,
1973 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
1974 0 /* icon_pixmap */,
1976 0 /* icon_window */,
1977 0 /* window_group */,
1979 _ecore_evas_x_group_leader_update(ee);
1980 ecore_x_window_defaults_set(ee->prop.window);
1981 _ecore_evas_x_protocols_set(ee);
1982 _ecore_evas_x_sync_set(ee);
1983 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
1984 if (getenv("DESKTOP_STARTUP_ID"))
1986 ecore_x_netwm_startup_id_set(ee->prop.window,
1987 getenv("DESKTOP_STARTUP_ID"));
1988 /* NB: on linux this may simply empty the env as opposed to completely
1989 * unset it to being empty - unsure as solartis libc crashes looking
1990 * for the '=' char */
1991 // putenv((char*)"DESKTOP_STARTUP_ID=");
1994 else if (!strcmp(ee->driver, "opengl_x11"))
1996 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
1997 Evas_Engine_Info_GL_X11 *einfo;
1999 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
2002 if (!ecore_x_composite_query()) return;
2006 ecore_x_window_free(ee->prop.window);
2007 ecore_event_window_unregister(ee->prop.window);
2008 ee->prop.window = 0;
2010 einfo->info.destination_alpha = alpha;
2012 if (ee->engine.x.win_root != 0)
2014 /* FIXME: round trip in ecore_x_window_argb_get */
2015 if (ecore_x_window_argb_get(ee->engine.x.win_root))
2017 ee->prop.window = _ecore_evas_x_gl_window_new
2018 (ee, ee->engine.x.win_root,
2019 ee->req.x, ee->req.y, ee->req.w, ee->req.h,
2020 ee->prop.override, 1, NULL);
2023 ee->prop.window = _ecore_evas_x_gl_window_new
2024 (ee, ee->engine.x.win_root,
2025 ee->req.x, ee->req.y, ee->req.w, ee->req.h,
2026 ee->prop.override, ee->alpha, NULL);
2029 ee->prop.window = _ecore_evas_x_gl_window_new
2030 (ee, ee->engine.x.win_root,
2031 ee->req.x, ee->req.y, ee->req.w, ee->req.h,
2032 ee->prop.override, ee->alpha, NULL);
2033 if (!ee->prop.window)
2040 if (ee->prop.override)
2041 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);
2043 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);
2044 if (!ee->engine.x.mask)
2045 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2049 if (ee->prop.override)
2050 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);
2052 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2053 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2054 ee->engine.x.mask = 0;
2055 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2059 XGetWindowAttributes(ecore_x_display_get(), ee->prop.window, &att);
2060 einfo->info.visual = att.visual;
2061 einfo->info.colormap = att.colormap;
2062 einfo->info.depth = att.depth;
2064 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2065 // ee->engine.x.mask = 0;
2066 // einfo->info.mask = ee->engine.x.mask;
2067 einfo->info.drawable = ee->prop.window;
2068 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2070 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2072 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2073 // ecore_x_window_shape_mask_set(ee->prop.window, 0);
2074 ecore_x_input_multi_select(ee->prop.window);
2075 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
2076 if (ee->prop.borderless)
2077 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2078 if (ee->visible) ecore_x_window_show(ee->prop.window);
2079 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2082 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2083 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2085 ecore_x_icccm_hints_set(ee->prop.window,
2086 1 /* accepts_focus */,
2087 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2088 0 /* icon_pixmap */,
2090 0 /* icon_window */,
2091 0 /* window_group */,
2093 _ecore_evas_x_group_leader_update(ee);
2094 ecore_x_window_defaults_set(ee->prop.window);
2095 _ecore_evas_x_protocols_set(ee);
2096 _ecore_evas_x_sync_set(ee);
2097 #endif /* BUILD_ECORE_EVAS_OPENGL_X11 */
2098 if (getenv("DESKTOP_STARTUP_ID"))
2100 ecore_x_netwm_startup_id_set(ee->prop.window,
2101 getenv("DESKTOP_STARTUP_ID"));
2102 /* NB: on linux this may simply empty the env as opposed to completely
2103 * unset it to being empty - unsure as solartis libc crashes looking
2104 * for the '=' char */
2105 // putenv((char*)"DESKTOP_STARTUP_ID=");
2108 else if (!strcmp(ee->driver, "xrender_x11"))
2110 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
2111 Evas_Engine_Info_XRender_X11 *einfo;
2113 einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
2115 if (!ecore_x_composite_query()) return;
2119 ecore_x_window_free(ee->prop.window);
2120 ecore_event_window_unregister(ee->prop.window);
2123 if (ee->prop.override)
2124 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);
2126 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);
2127 if (!ee->engine.x.mask)
2128 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2132 if (ee->prop.override)
2133 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);
2135 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2136 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2137 ee->engine.x.mask = 0;
2138 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2141 einfo->info.destination_alpha = alpha;
2143 # ifdef BUILD_ECORE_EVAS_XRENDER_XCB
2144 cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
2145 reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
2147 einfo->info.visual = reply_attr->visual;
2150 XGetWindowAttributes(ecore_x_display_get(), ee->prop.window, &att);
2151 einfo->info.visual = att.visual;
2152 # endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
2154 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2155 // ee->engine.x.mask = 0;
2156 einfo->info.mask = ee->engine.x.mask;
2157 einfo->info.drawable = ee->prop.window;
2158 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2160 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2162 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2163 ecore_x_window_shape_mask_set(ee->prop.window, 0);
2164 ecore_x_input_multi_select(ee->prop.window);
2165 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
2166 if (ee->prop.borderless)
2167 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2168 if (ee->visible) ecore_x_window_show(ee->prop.window);
2169 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2172 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2173 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2175 ecore_x_icccm_hints_set(ee->prop.window,
2176 1 /* accepts_focus */,
2177 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2178 0 /* icon_pixmap */,
2180 0 /* icon_window */,
2181 0 /* window_group */,
2183 _ecore_evas_x_group_leader_update(ee);
2184 ecore_x_window_defaults_set(ee->prop.window);
2185 _ecore_evas_x_protocols_set(ee);
2186 _ecore_evas_x_sync_set(ee);
2187 #endif /* BUILD_ECORE_EVAS_XRENDER_X11 || BUILD_ECORE_EVAS_XRENDER_XCB */
2188 if (getenv("DESKTOP_STARTUP_ID"))
2190 ecore_x_netwm_startup_id_set(ee->prop.window,
2191 getenv("DESKTOP_STARTUP_ID"));
2192 /* NB: on linux this may simply empty the env as opposed to completely
2193 * unset it to being empty - unsure as solartis libc crashes looking
2194 * for the '=' char */
2195 // putenv((char*)"DESKTOP_STARTUP_ID=");
2198 else if (!strcmp(ee->driver, "software_16_x11"))
2200 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
2201 Evas_Engine_Info_Software_16_X11 *einfo;
2203 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
2208 ecore_x_window_free(ee->prop.window);
2209 ecore_event_window_unregister(ee->prop.window);
2212 if (ee->prop.override)
2213 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);
2215 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);
2216 if (!ee->engine.x.mask)
2217 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2221 if (ee->prop.override)
2222 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);
2224 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2225 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2226 ee->engine.x.mask = 0;
2227 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2230 # if 0 /* XXX no alpha window support for software_16_x11 */
2231 einfo->info.destination_alpha = alpha;
2232 # endif /* XXX no alpha window support for software_16_x11 */
2234 # if 0 /* XXX no shaped window support for software_16_x11 */
2235 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2236 // ee->engine.x.mask = 0;
2237 einfo->info.mask = ee->engine.x.mask;
2238 # endif /* XXX no shaped window support for software_16_x11 */
2240 einfo->info.drawable = ee->prop.window;
2241 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2243 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2245 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2246 ecore_x_window_shape_mask_set(ee->prop.window, 0);
2247 ecore_x_input_multi_select(ee->prop.window);
2248 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
2249 if (ee->prop.borderless)
2250 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2251 if (ee->visible) ecore_x_window_show(ee->prop.window);
2252 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2255 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2256 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2258 ecore_x_icccm_hints_set(ee->prop.window,
2259 1 /* accepts_focus */,
2260 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2261 0 /* icon_pixmap */,
2263 0 /* icon_window */,
2264 0 /* window_group */,
2266 _ecore_evas_x_group_leader_update(ee);
2267 ecore_x_window_defaults_set(ee->prop.window);
2268 _ecore_evas_x_protocols_set(ee);
2269 _ecore_evas_x_sync_set(ee);
2270 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
2271 if (getenv("DESKTOP_STARTUP_ID"))
2273 ecore_x_netwm_startup_id_set(ee->prop.window,
2274 getenv("DESKTOP_STARTUP_ID"));
2275 /* NB: on linux this may simply empty the env as opposed to completely
2276 * unset it to being empty - unsure as solartis libc crashes looking
2277 * for the '=' char */
2278 // putenv((char*)"DESKTOP_STARTUP_ID=");
2281 else if (!strcmp(ee->driver, "software_8_x11"))
2283 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
2284 Evas_Engine_Info_Software_8_X11 *einfo;
2286 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
2291 ecore_x_window_free(ee->prop.window);
2292 ecore_event_window_unregister(ee->prop.window);
2295 if (ee->prop.override)
2296 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);
2298 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);
2299 if (!ee->engine.x.mask)
2300 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2304 if (ee->prop.override)
2305 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);
2307 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2308 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2309 ee->engine.x.mask = 0;
2310 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2313 einfo->info.destination_alpha = alpha;
2315 cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->prop.window);
2316 cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
2318 reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
2319 reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
2320 einfo->info.visual = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
2321 einfo->info.colormap = reply_attr->colormap;
2322 einfo->info.depth = reply_geom->depth;
2326 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2327 // ee->engine.x.mask = 0;
2328 einfo->info.mask = ee->engine.x.mask;
2329 einfo->info.drawable = ee->prop.window;
2330 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2332 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2334 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2335 ecore_x_window_shape_mask_set(ee->prop.window, 0);
2336 ecore_x_input_multi_select(ee->prop.window);
2337 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
2338 if (ee->prop.borderless)
2339 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2340 if (ee->visible) ecore_x_window_show(ee->prop.window);
2341 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2344 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2345 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2347 ecore_x_icccm_hints_set(ee->prop.window,
2348 1 /* accepts_focus */,
2349 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2350 0 /* icon_pixmap */,
2352 0 /* icon_window */,
2353 0 /* window_group */,
2355 _ecore_evas_x_group_leader_update(ee);
2356 ecore_x_window_defaults_set(ee->prop.window);
2357 _ecore_evas_x_protocols_set(ee);
2358 _ecore_evas_x_sync_set(ee);
2360 if (getenv("DESKTOP_STARTUP_ID"))
2362 ecore_x_netwm_startup_id_set(ee->prop.window,
2363 getenv("DESKTOP_STARTUP_ID"));
2364 /* NB: on linux this may simply empty the env as opposed to completely
2365 * unset it to being empty - unsure as solartis libc crashes looking
2366 * for the '=' char */
2367 // putenv((char*)"DESKTOP_STARTUP_ID=");
2369 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
2374 _ecore_evas_x_transparent_set(Ecore_Evas *ee, int transparent)
2376 if (((ee->transparent) && (transparent)) ||
2377 ((!ee->transparent) && (!transparent)))
2380 if (!strcmp(ee->driver, "software_x11"))
2382 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
2383 Evas_Engine_Info_Software_X11 *einfo;
2385 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2388 ee->transparent = transparent;
2389 einfo->info.destination_alpha = transparent;
2390 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2392 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2394 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2398 #endif /* BUILD_ECORE_EVAS_X11 */
2400 #ifdef BUILD_ECORE_EVAS_X11
2402 _ecore_evas_x_show(Ecore_Evas *ee)
2404 ee->should_be_visible = 1;
2405 if (ee->prop.avoid_damage)
2406 _ecore_evas_x_render(ee);
2407 _ecore_evas_x_sync_set(ee);
2408 ecore_x_window_show(ee->prop.window);
2409 if (ee->prop.fullscreen)
2410 ecore_x_window_focus(ee->prop.window);
2414 _ecore_evas_x_hide(Ecore_Evas *ee)
2416 ecore_x_window_hide(ee->prop.window);
2417 ee->should_be_visible = 0;
2418 _ecore_evas_x_sync_set(ee);
2422 _ecore_evas_x_raise(Ecore_Evas *ee)
2424 if (!ee->prop.fullscreen)
2425 ecore_x_window_raise(ee->prop.window);
2427 ecore_x_window_raise(ee->prop.window);
2431 _ecore_evas_x_lower(Ecore_Evas *ee)
2433 if (!ee->prop.fullscreen)
2434 ecore_x_window_lower(ee->prop.window);
2436 ecore_x_window_lower(ee->prop.window);
2440 _ecore_evas_x_activate(Ecore_Evas *ee)
2442 ecore_x_netwm_client_active_request(ee->engine.x.win_root,
2443 ee->prop.window, 2, 0);
2447 _ecore_evas_x_title_set(Ecore_Evas *ee, const char *t)
2449 if (ee->prop.title) free(ee->prop.title);
2450 ee->prop.title = NULL;
2451 if (t) ee->prop.title = strdup(t);
2452 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2453 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2457 _ecore_evas_x_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
2459 if (ee->prop.name) free(ee->prop.name);
2460 if (ee->prop.clas) free(ee->prop.clas);
2461 ee->prop.name = NULL;
2462 ee->prop.clas = NULL;
2463 if (n) ee->prop.name = strdup(n);
2464 if (c) ee->prop.clas = strdup(c);
2465 ecore_x_icccm_name_class_set(ee->prop.window, ee->prop.name, ee->prop.clas);
2469 _ecore_evas_x_size_min_set(Ecore_Evas *ee, int w, int h)
2473 if ((ee->prop.min.w == w) && (ee->prop.min.h == h)) return;
2476 _ecore_evas_x_size_pos_hints_update(ee);
2480 _ecore_evas_x_size_max_set(Ecore_Evas *ee, int w, int h)
2484 if ((ee->prop.max.w == w) && (ee->prop.max.h == h)) return;
2487 _ecore_evas_x_size_pos_hints_update(ee);
2491 _ecore_evas_x_size_base_set(Ecore_Evas *ee, int w, int h)
2495 if ((ee->prop.base.w == w) && (ee->prop.base.h == h)) return;
2496 ee->prop.base.w = w;
2497 ee->prop.base.h = h;
2498 _ecore_evas_x_size_pos_hints_update(ee);
2502 _ecore_evas_x_size_step_set(Ecore_Evas *ee, int w, int h)
2506 if ((ee->prop.step.w == w) && (ee->prop.step.h == h)) return;
2507 ee->prop.step.w = w;
2508 ee->prop.step.h = h;
2509 _ecore_evas_x_size_pos_hints_update(ee);
2513 _ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2519 ee->prop.cursor.object = NULL;
2523 _ecore_evas_x_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
2527 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
2531 ee->prop.cursor.object = NULL;
2532 ee->prop.cursor.layer = 0;
2533 ee->prop.cursor.hot.x = 0;
2534 ee->prop.cursor.hot.y = 0;
2535 ecore_x_window_cursor_show(ee->prop.window, 1);
2539 ee->prop.cursor.object = obj;
2540 ee->prop.cursor.layer = layer;
2541 ee->prop.cursor.hot.x = hot_x;
2542 ee->prop.cursor.hot.y = hot_y;
2544 ecore_x_window_cursor_show(ee->prop.window, 0);
2546 evas_pointer_output_xy_get(ee->evas, &x, &y);
2547 evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
2548 evas_object_move(ee->prop.cursor.object,
2549 x - ee->prop.cursor.hot.x,
2550 y - ee->prop.cursor.hot.y);
2551 evas_object_pass_events_set(ee->prop.cursor.object, 1);
2552 if (evas_pointer_inside_get(ee->evas))
2553 evas_object_show(ee->prop.cursor.object);
2555 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
2560 * @param layer If < 3, @a ee will be put below all other windows.
2561 * If > 5, @a ee will be "always-on-top"
2562 * If = 4, @a ee will be put in the default layer.
2563 * Acceptable values range from 1 to 255 (0 reserved for
2567 _ecore_evas_x_layer_set(Ecore_Evas *ee, int layer)
2569 if (ee->prop.layer == layer) return;
2571 /* FIXME: Should this logic be here? */
2574 else if (layer > 255)
2577 ee->prop.layer = layer;
2578 _ecore_evas_x_layer_update(ee);
2582 _ecore_evas_x_focus_set(Ecore_Evas *ee, int on __UNUSED__)
2584 ecore_x_window_focus(ee->prop.window);
2588 _ecore_evas_x_iconified_set(Ecore_Evas *ee, int on)
2590 // if (((ee->prop.iconified) && (on)) ||
2591 // ((!ee->prop.iconified) && (!on))) return;
2592 ee->prop.iconified = on;
2595 ecore_x_icccm_hints_set(ee->prop.window,
2596 1 /* accepts_focus */,
2597 ECORE_X_WINDOW_STATE_HINT_ICONIC /* initial_state */,
2598 0 /* icon_pixmap */,
2600 0 /* icon_window */,
2601 0 /* window_group */,
2603 ecore_x_icccm_iconic_request_send(ee->prop.window, ee->engine.x.win_root);
2607 ecore_x_icccm_hints_set(ee->prop.window,
2608 1 /* accepts_focus */,
2609 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2610 0 /* icon_pixmap */,
2612 0 /* icon_window */,
2613 0 /* window_group */,
2615 ecore_evas_show(ee);
2620 _ecore_evas_x_borderless_set(Ecore_Evas *ee, int on)
2622 if (((ee->prop.borderless) && (on)) ||
2623 ((!ee->prop.borderless) && (!on))) return;
2624 ee->prop.borderless = on;
2625 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2628 /* FIXME: This function changes the initial state of the ee
2629 * whilest the iconic function changes the current state! */
2631 _ecore_evas_x_withdrawn_set(Ecore_Evas *ee, int withdrawn)
2633 Ecore_X_Window_State_Hint hint;
2635 if ((ee->prop.withdrawn && withdrawn) ||
2636 (!ee->prop.withdrawn && !withdrawn)) return;
2638 ee->prop.withdrawn = withdrawn;
2640 hint = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
2642 hint = ECORE_X_WINDOW_STATE_HINT_NORMAL;
2644 ecore_x_icccm_hints_set(ee->prop.window,
2645 1 /* accepts_focus */,
2646 hint /* initial_state */,
2647 0 /* icon_pixmap */,
2649 0 /* icon_window */,
2650 0 /* window_group */,
2655 _ecore_evas_x_sticky_set(Ecore_Evas *ee, int sticky)
2657 if ((ee->prop.sticky && sticky) ||
2658 (!ee->prop.sticky && !sticky)) return;
2660 /* We dont want to set prop.sticky here as it will cause
2661 * the sticky callback not to get called. Its set on the
2662 * property change event.
2663 * ee->prop.sticky = sticky;
2665 ee->engine.x.state.sticky = sticky;
2666 if (ee->should_be_visible)
2667 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2668 ECORE_X_WINDOW_STATE_STICKY, -1, sticky);
2670 _ecore_evas_x_state_update(ee);
2674 _ecore_evas_x_ignore_events_set(Ecore_Evas *ee, int ignore)
2676 if ((ee->ignore_events && ignore) ||
2677 (!ee->ignore_events && !ignore)) return;
2681 ee->ignore_events = 1;
2682 if (ee->prop.window)
2683 ecore_x_window_ignore_set(ee->prop.window, 1);
2687 ee->ignore_events = 0;
2688 if (ee->prop.window)
2689 ecore_x_window_ignore_set(ee->prop.window, 0);
2695 _ecore_evas_x_reinit_win(Ecore_Evas *ee)
2697 if (!strcmp(ee->driver, "software_x11"))
2699 #ifdef BUILD_ECORE_EVAS_X11
2700 Evas_Engine_Info_Software_X11 *einfo;
2702 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2705 einfo->info.drawable = ee->prop.window;
2706 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
2710 else if (!strcmp(ee->driver, "xrender_x11"))
2712 #ifdef BUILD_ECORE_EVAS_XRENDER_X11
2713 Evas_Engine_Info_XRender_X11 *einfo;
2715 einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
2718 einfo->info.drawable = ee->prop.window;
2719 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
2723 else if (!strcmp(ee->driver, "opengl_x11"))
2725 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
2726 Evas_Engine_Info_GL_X11 *einfo;
2728 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
2731 einfo->info.drawable = ee->prop.window;
2732 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
2740 _ecore_evas_x_override_set(Ecore_Evas *ee, int on)
2742 if (((ee->prop.override) && (on)) ||
2743 ((!ee->prop.override) && (!on))) return;
2744 ecore_x_window_hide(ee->prop.window);
2745 ecore_x_window_override_set(ee->prop.window, on);
2746 if (ee->visible) ecore_x_window_show(ee->prop.window);
2747 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2748 ee->prop.override = on;
2752 _ecore_evas_x_fullscreen_set(Ecore_Evas *ee, int on)
2754 if ((ee->prop.fullscreen && on) ||
2755 (!ee->prop.fullscreen && !on)) return;
2757 /* FIXME: Detect if WM is EWMH compliant and handle properly if not,
2758 * i.e. reposition, resize, and change borderless hint */
2759 ee->engine.x.state.fullscreen = on;
2760 if (ee->should_be_visible)
2761 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2762 ECORE_X_WINDOW_STATE_FULLSCREEN, -1, on);
2764 _ecore_evas_x_state_update(ee);
2768 _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on)
2770 if (ee->prop.avoid_damage == on) return;
2771 if (!strcmp(ee->driver, "opengl_x11")) return;
2772 if (!strcmp(ee->driver, "xrender_x11")) return;
2774 if (!strcmp(ee->driver, "software_x11"))
2776 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
2777 Evas_Engine_Info_Software_X11 *einfo;
2779 ee->prop.avoid_damage = on;
2780 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2783 if (ee->prop.avoid_damage)
2785 ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth);
2786 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2787 einfo->info.drawable = ee->engine.x.pmap;
2788 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2790 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2792 if ((ee->rotation == 90) || (ee->rotation == 270))
2793 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2795 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2796 if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN)
2798 ee->engine.x.using_bg_pixmap = 1;
2799 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2800 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2802 if (ee->engine.x.direct_resize)
2804 /* Turn this off for now
2805 ee->engine.x.using_bg_pixmap = 1;
2806 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2812 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2813 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2814 if (ee->engine.x.using_bg_pixmap)
2816 ecore_x_window_pixmap_set(ee->prop.window, 0);
2817 ee->engine.x.using_bg_pixmap = 0;
2818 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2820 ee->engine.x.pmap = 0;
2821 ee->engine.x.gc = 0;
2822 einfo->info.drawable = ee->prop.window;
2823 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2825 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2829 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
2831 else if (!strcmp(ee->driver, "software_16_x11"))
2833 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
2834 Evas_Engine_Info_Software_16_X11 *einfo;
2835 ee->prop.avoid_damage = on;
2837 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
2840 if (ee->prop.avoid_damage)
2842 ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 16);
2843 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2844 einfo->info.drawable = ee->engine.x.pmap;
2845 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2847 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2849 if ((ee->rotation == 90) || (ee->rotation == 270))
2850 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2852 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2853 if (ee->engine.x.direct_resize)
2855 /* Turn this off for now
2856 ee->engine.x.using_bg_pixmap = 1;
2857 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2863 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2864 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2865 if (ee->engine.x.using_bg_pixmap)
2867 ecore_x_window_pixmap_set(ee->prop.window, 0);
2868 ee->engine.x.using_bg_pixmap = 0;
2870 ee->engine.x.pmap = 0;
2871 ee->engine.x.gc = 0;
2872 einfo->info.drawable = ee->prop.window;
2873 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2875 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2879 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
2881 else if (!strcmp(ee->driver, "software_8_x11"))
2883 #if BUILD_ECORE_EVAS_SOFTWARE_8_X11
2884 Evas_Engine_Info_Software_8_X11 *einfo;
2886 ee->prop.avoid_damage = on;
2887 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
2890 if (ee->prop.avoid_damage)
2892 ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth);
2893 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2894 einfo->info.drawable = ee->engine.x.pmap;
2895 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2897 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2899 if ((ee->rotation == 90) || (ee->rotation == 270))
2900 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2902 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2903 if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN)
2905 ee->engine.x.using_bg_pixmap = 1;
2906 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2907 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2909 if (ee->engine.x.direct_resize)
2911 /* Turn this off for now
2912 ee->engine.x.using_bg_pixmap = 1;
2913 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2919 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2920 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2921 if (ee->engine.x.using_bg_pixmap)
2923 ecore_x_window_pixmap_set(ee->prop.window, 0);
2924 ee->engine.x.using_bg_pixmap = 0;
2925 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2927 ee->engine.x.pmap = 0;
2928 ee->engine.x.gc = 0;
2929 einfo->info.drawable = ee->prop.window;
2930 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2932 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2936 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
2941 _ecore_evas_x_shutdown(void)
2943 _ecore_evas_init_count--;
2944 if (_ecore_evas_init_count == 0)
2948 for (i = 0; i < sizeof(ecore_evas_event_handlers) / sizeof(Ecore_Event_Handler*); i++)
2950 if (ecore_evas_event_handlers[i])
2951 ecore_event_handler_del(ecore_evas_event_handlers[i]);
2953 ecore_event_evas_shutdown();
2955 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
2956 return _ecore_evas_init_count;
2959 static Ecore_Evas_Engine_Func _ecore_x_engine_func =
2966 _ecore_evas_x_callback_delete_request_set,
2977 _ecore_evas_x_managed_move,
2978 _ecore_evas_x_resize,
2979 _ecore_evas_x_move_resize,
2980 _ecore_evas_x_rotation_set,
2981 _ecore_evas_x_shaped_set,
2984 _ecore_evas_x_raise,
2985 _ecore_evas_x_lower,
2986 _ecore_evas_x_activate,
2987 _ecore_evas_x_title_set,
2988 _ecore_evas_x_name_class_set,
2989 _ecore_evas_x_size_min_set,
2990 _ecore_evas_x_size_max_set,
2991 _ecore_evas_x_size_base_set,
2992 _ecore_evas_x_size_step_set,
2993 _ecore_evas_x_object_cursor_set,
2994 _ecore_evas_x_layer_set,
2995 _ecore_evas_x_focus_set,
2996 _ecore_evas_x_iconified_set,
2997 _ecore_evas_x_borderless_set,
2998 _ecore_evas_x_override_set,
3000 _ecore_evas_x_fullscreen_set,
3001 _ecore_evas_x_avoid_damage_set,
3002 _ecore_evas_x_withdrawn_set,
3003 _ecore_evas_x_sticky_set,
3004 _ecore_evas_x_ignore_events_set,
3005 _ecore_evas_x_alpha_set,
3006 _ecore_evas_x_transparent_set,
3010 #endif /* BUILD_ECORE_EVAS_X11 */
3013 * FIXME: there are some round trips. Especially, we can split
3014 * ecore_x_init in 2 functions and suppress some round trips.
3017 #if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_OPENGL_X11) || defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB) || defined (BUILD_ECORE_EVAS_SOFTWARE_16_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
3019 _ecore_evas_x_flush_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
3021 Ecore_Evas *ee = data;
3023 if (ee->no_comp_sync) return;
3024 if (!_ecore_evas_app_comp_sync) return;
3025 if (ee->engine.x.sync_counter)
3027 if (ee->engine.x.sync_began)
3029 ee->engine.x.sync_val++;
3030 if (!ee->engine.x.sync_cancel)
3032 ecore_x_sync_counter_val_wait(ee->engine.x.sync_counter,
3033 ee->engine.x.sync_val);
3040 _ecore_evas_x_flush_post(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
3042 Ecore_Evas *ee = data;
3044 if (ee->no_comp_sync) return;
3045 if (!_ecore_evas_app_comp_sync) return;
3046 if (ee->engine.x.sync_counter)
3048 if (ee->engine.x.sync_began)
3050 if (!ee->engine.x.sync_cancel)
3052 ecore_x_e_comp_sync_draw_done_send(ee->engine.x.win_root,
3063 * FIXME: To be fixed.
3065 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3067 ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent,
3068 int x, int y, int w, int h)
3070 Evas_Engine_Info_Software_X11 *einfo;
3074 static int redraw_debug = -1;
3076 rmethod = evas_render_method_lookup("software_x11");
3077 if (!rmethod) return NULL;
3078 if (!ecore_x_init(disp_name)) return NULL;
3079 ee = calloc(1, sizeof(Ecore_Evas));
3080 if (!ee) return NULL;
3082 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3084 _ecore_evas_x_init();
3086 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3088 ee->driver = "software_x11";
3089 if (disp_name) ee->name = strdup(disp_name);
3102 ee->prop.max.w = 32767;
3103 ee->prop.max.h = 32767;
3105 ee->prop.request_pos = 0;
3106 ee->prop.sticky = 0;
3107 ee->engine.x.state.sticky = 0;
3109 /* init evas here */
3110 ee->evas = evas_new();
3111 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3112 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3113 evas_data_attach_set(ee->evas, ee);
3114 evas_output_method_set(ee->evas, rmethod);
3115 evas_output_size_set(ee->evas, w, h);
3116 evas_output_viewport_set(ee->evas, 0, 0, w, h);
3118 ee->engine.x.win_root = parent;
3119 ee->engine.x.screen_num = 0;
3123 ee->engine.x.screen_num = 1; /* FIXME: get real scren # */
3124 /* FIXME: round trip in ecore_x_window_argb_get */
3125 if (ecore_x_window_argb_get(parent))
3127 ee->prop.window = ecore_x_window_argb_new(parent, x, y, w, h);
3131 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3134 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3135 if (getenv("DESKTOP_STARTUP_ID"))
3137 ecore_x_netwm_startup_id_set(ee->prop.window,
3138 getenv("DESKTOP_STARTUP_ID"));
3139 /* NB: on linux this may simply empty the env as opposed to completely
3140 * unset it to being empty - unsure as solartis libc crashes looking
3141 * for the '=' char */
3142 // putenv((char*)"DESKTOP_STARTUP_ID=");
3144 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
3147 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3148 xcb_screen_iterator_t iter;
3149 xcb_screen_t *screen;
3152 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
3154 /* FIXME: this is inefficient as its a round trip */
3155 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3156 screen = ecore_x_default_screen_get();
3157 iter = xcb_setup_roots_iterator (xcb_get_setup (ecore_x_connection_get()));
3160 xcb_get_geometry_cookie_t cookie;
3161 xcb_get_geometry_reply_t *reply;
3162 Ecore_X_Window *roots;
3167 cookie = xcb_get_geometry_unchecked(ecore_x_connection_get(), parent);
3168 roots = ecore_x_window_root_list(&num);
3171 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
3175 for (i = 0; i < num; xcb_screen_next (&iter), i++)
3177 if (reply->root == roots[i])
3189 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
3190 if (reply) free(reply);
3194 screen = DefaultScreen(ecore_x_display_get());
3195 if (ScreenCount(ecore_x_display_get()) > 1)
3197 Ecore_X_Window *roots;
3201 roots = ecore_x_window_root_list(&num);
3204 XWindowAttributes at;
3206 if (XGetWindowAttributes(ecore_x_display_get(),
3209 for (i = 0; i < num; i++)
3211 if (at.root == roots[i])
3221 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
3223 if (redraw_debug < 0)
3225 if (getenv("REDRAW_DEBUG"))
3226 redraw_debug = atoi(getenv("REDRAW_DEBUG"));
3230 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3231 einfo->info.backend = EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB;
3232 einfo->info.connection = ecore_x_connection_get();
3233 einfo->info.screen = screen;
3235 einfo->info.backend = EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB;
3236 einfo->info.connection = ecore_x_display_get();
3237 einfo->info.screen = NULL;
3238 #ifdef EVAS_FRAME_QUEUING
3241 render_mode = getenv("EVAS_RENDER_MODE");
3242 if (render_mode && !strcmp(render_mode, "non-blocking"))
3244 einfo->render_mode = EVAS_RENDER_MODE_NONBLOCKING;
3249 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
3250 einfo->info.drawable = ee->prop.window;
3253 /* FIXME: round trip */
3254 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3255 xcb_get_geometry_cookie_t cookie_geom;
3256 xcb_get_window_attributes_cookie_t cookie_attr;
3257 xcb_get_geometry_reply_t *reply_geom;
3258 xcb_get_window_attributes_reply_t *reply_attr;
3260 cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->prop.window);
3261 cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
3263 reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
3264 reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
3265 if (reply_attr && reply_geom)
3267 einfo->info.visual = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
3268 einfo->info.colormap = reply_attr->colormap;
3269 einfo->info.depth = reply_geom->depth;
3270 einfo->info.destination_alpha = 1;
3275 XWindowAttributes at;
3277 if (XGetWindowAttributes(ecore_x_display_get(), ee->prop.window,
3280 einfo->info.visual = at.visual;
3281 einfo->info.colormap = at.colormap;
3282 einfo->info.depth = at.depth;
3283 einfo->info.destination_alpha = 1;
3285 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
3289 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3290 xcb_screen_t *screen;
3292 screen = ecore_x_default_screen_get();
3293 einfo->info.visual = xcb_visualtype_get(screen, screen->root_visual);
3294 einfo->info.colormap = screen->default_colormap;
3295 einfo->info.depth = screen->root_depth;
3297 einfo->info.visual = DefaultVisual(ecore_x_display_get(), screen);
3298 einfo->info.colormap = DefaultColormap(ecore_x_display_get(), screen);
3299 einfo->info.depth = DefaultDepth(ecore_x_display_get(), screen);
3300 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
3301 einfo->info.destination_alpha = 0;
3303 einfo->info.rotation = 0;
3304 einfo->info.debug = redraw_debug;
3305 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3307 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3308 ecore_evas_free(ee);
3313 ecore_x_icccm_hints_set(ee->prop.window,
3314 1 /* accepts_focus */,
3315 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
3316 0 /* icon_pixmap */,
3318 0 /* icon_window */,
3319 0 /* window_group */,
3321 _ecore_evas_x_group_leader_set(ee);
3322 ecore_x_window_defaults_set(ee->prop.window);
3323 _ecore_evas_x_protocols_set(ee);
3324 _ecore_evas_x_sync_set(ee);
3326 ee->engine.func->fn_render = _ecore_evas_x_render;
3327 _ecore_evas_register(ee);
3328 ecore_x_input_multi_select(ee->prop.window);
3329 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
3334 ecore_evas_software_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3335 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3344 * FIXME: To be fixed.
3346 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3348 ecore_evas_software_x11_window_get(const Ecore_Evas *ee)
3350 return (Ecore_X_Window) ecore_evas_window_get(ee);
3354 ecore_evas_software_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3363 * FIXME: To be fixed.
3365 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3367 ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3369 ee->engine.x.direct_resize = on;
3370 if (ee->prop.avoid_damage)
3372 if (ee->engine.x.direct_resize)
3374 /* turn this off for now
3375 ee->engine.x.using_bg_pixmap = 1;
3376 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
3381 /* turn this off too- bg pixmap is controlled by avoid damage directly
3382 ee->engine.x.using_bg_pixmap = 0;
3383 ecore_x_window_pixmap_set(ee->prop.window, 0);
3384 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
3391 ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3399 * FIXME: To be fixed.
3401 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3403 ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee)
3405 return ee->engine.x.direct_resize;
3409 ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3418 * FIXME: To be fixed.
3420 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3422 ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3424 Ecore_X_Window *winp;
3426 winp = malloc(sizeof(Ecore_X_Window));
3430 ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
3431 ecore_x_input_multi_select(win);
3432 ecore_event_window_register(win, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
3437 ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3445 * FIXME: To be fixed.
3447 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3449 ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent,
3450 int x, int y, int w, int h)
3452 return ecore_evas_gl_x11_options_new(disp_name, parent, x, y, w, h, NULL);
3455 ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent,
3456 int x, int y, int w, int h, const int *opt)
3458 # ifdef HAVE_ECORE_X_XCB
3459 Ecore_Evas *ee = NULL;
3464 rmethod = evas_render_method_lookup("gl_x11");
3465 if (!rmethod) return NULL;
3466 if (!ecore_x_init(disp_name)) return NULL;
3467 ee = calloc(1, sizeof(Ecore_Evas));
3468 if (!ee) return NULL;
3470 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3472 _ecore_evas_x_init();
3474 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3476 ee->driver = "opengl_x11";
3477 if (disp_name) ee->name = strdup(disp_name);
3490 ee->prop.max.w = 32767;
3491 ee->prop.max.h = 32767;
3493 ee->prop.request_pos = 0;
3494 ee->prop.sticky = 0;
3495 ee->engine.x.state.sticky = 0;
3497 /* init evas here */
3498 ee->evas = evas_new();
3499 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3500 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3501 evas_data_attach_set(ee->evas, ee);
3502 evas_output_method_set(ee->evas, rmethod);
3503 evas_output_size_set(ee->evas, w, h);
3504 evas_output_viewport_set(ee->evas, 0, 0, w, h);
3506 if (parent == 0) parent = DefaultRootWindow(ecore_x_display_get());
3507 ee->engine.x.win_root = parent;
3509 if (ee->engine.x.win_root != 0)
3511 ee->engine.x.screen_num = 1; /* FIXME: get real scren # */
3512 /* FIXME: round trip in ecore_x_window_argb_get */
3513 if (ecore_x_window_argb_get(ee->engine.x.win_root))
3515 ee->prop.window = _ecore_evas_x_gl_window_new
3516 (ee, ee->engine.x.win_root, x, y, w, h, 0, 1, opt);
3519 ee->prop.window = _ecore_evas_x_gl_window_new
3520 (ee, ee->engine.x.win_root, x, y, w, h, 0, 0, opt);
3523 ee->prop.window = _ecore_evas_x_gl_window_new
3524 (ee, ee->engine.x.win_root, x, y, w, h, 0, 0, opt);
3525 if (!ee->prop.window)
3527 ecore_evas_free(ee);
3530 if (getenv("DESKTOP_STARTUP_ID"))
3532 ecore_x_netwm_startup_id_set(ee->prop.window,
3533 getenv("DESKTOP_STARTUP_ID"));
3534 /* NB: on linux this may simply empty the env as opposed to completely
3535 * unset it to being empty - unsure as solartis libc crashes looking
3536 * for the '=' char */
3537 // putenv((char*)"DESKTOP_STARTUP_ID=");
3540 ecore_x_icccm_hints_set(ee->prop.window,
3541 1 /* accepts_focus */,
3542 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
3543 0 /* icon_pixmap */,
3545 0 /* icon_window */,
3546 0 /* window_group */,
3548 _ecore_evas_x_group_leader_set(ee);
3549 ecore_x_window_defaults_set(ee->prop.window);
3550 _ecore_evas_x_protocols_set(ee);
3551 _ecore_evas_x_sync_set(ee);
3553 ee->engine.func->fn_render = _ecore_evas_x_render;
3554 _ecore_evas_register(ee);
3555 ecore_x_input_multi_select(ee->prop.window);
3556 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
3557 # endif /* HAVE_ECORE_X_XCB */
3563 ecore_evas_gl_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3564 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3569 ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent,
3570 int x, int y, int w, int h, const int *opt)
3574 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3579 * FIXME: To be fixed.
3581 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3583 ecore_evas_gl_x11_window_get(const Ecore_Evas *ee)
3585 return (Ecore_X_Window) ecore_evas_window_get(ee);
3589 ecore_evas_gl_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3593 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3598 * FIXME: To be fixed.
3600 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3602 ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3604 ee->engine.x.direct_resize = on;
3608 ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3611 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3616 * FIXME: To be fixed.
3618 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3620 ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee)
3622 return ee->engine.x.direct_resize;
3626 ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3630 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3635 * FIXME: To be fixed.
3637 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3639 ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3641 ecore_evas_software_x11_extra_event_window_add(ee, win);
3645 ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3648 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3653 * FIXME: To be fixed.
3655 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3657 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))
3659 Evas_Engine_Info_GL_X11 *einfo;
3661 if (!(!strcmp(ee->driver, "opengl_x11"))) return;
3663 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
3666 einfo->callback.pre_swap = pre_cb;
3667 einfo->callback.pre_swap = post_cb;
3668 einfo->callback.data = data;
3669 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3671 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
3677 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))
3681 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3686 * FIXME: To be fixed.
3688 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
3690 ecore_evas_xrender_x11_new(const char *disp_name, Ecore_X_Window parent,
3691 int x, int y, int w, int h)
3693 Evas_Engine_Info_XRender_X11 *einfo;
3697 rmethod = evas_render_method_lookup("xrender_x11");
3698 if (!rmethod) return NULL;
3699 if (!ecore_x_init(disp_name)) return NULL;
3700 ee = calloc(1, sizeof(Ecore_Evas));
3701 if (!ee) return NULL;
3703 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3705 _ecore_evas_x_init();
3707 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3709 ee->driver = "xrender_x11";
3710 if (disp_name) ee->name = strdup(disp_name);
3723 ee->prop.max.w = 32767;
3724 ee->prop.max.h = 32767;
3726 ee->prop.request_pos = 0;
3727 ee->prop.sticky = 0;
3728 ee->engine.x.state.sticky = 0;
3730 /* init evas here */
3731 ee->evas = evas_new();
3732 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3733 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3734 evas_data_attach_set(ee->evas, ee);
3735 evas_output_method_set(ee->evas, rmethod);
3736 evas_output_size_set(ee->evas, w, h);
3737 evas_output_viewport_set(ee->evas, 0, 0, w, h);
3739 ee->engine.x.win_root = parent;
3740 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3741 if (getenv("DESKTOP_STARTUP_ID"))
3743 ecore_x_netwm_startup_id_set(ee->prop.window,
3744 getenv("DESKTOP_STARTUP_ID"));
3745 /* NB: on linux this may simply empty the env as opposed to completely
3746 * unset it to being empty - unsure as solartis libc crashes looking
3747 * for the '=' char */
3748 // putenv((char*)"DESKTOP_STARTUP_ID=");
3750 einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
3753 # ifdef BUILD_ECORE_EVAS_XRENDER_XCB
3754 xcb_screen_iterator_t iter;
3755 xcb_screen_t *screen;
3757 /* FIXME: this is inefficient as its a round trip */
3758 screen = ecore_x_default_screen_get();
3759 iter = xcb_setup_roots_iterator (xcb_get_setup (ecore_x_connection_get()));
3762 xcb_get_geometry_cookie_t cookie;
3763 xcb_get_geometry_reply_t *reply;
3764 Ecore_X_Window *roots;
3769 cookie = xcb_get_geometry_unchecked(ecore_x_connection_get(), parent);
3770 roots = ecore_x_window_root_list(&num);
3773 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
3777 for (i = 0; i < num; xcb_screen_next (&iter), i++)
3779 if (reply->root == roots[i])
3791 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
3792 if (reply) free(reply);
3795 einfo->info.backend = EVAS_ENGINE_INFO_XRENDER_BACKEND_XCB;
3796 einfo->info.connection = ecore_x_connection_get();
3797 einfo->info.screen = screen;
3798 einfo->info.visual = screen->root_visual;
3799 # elif BUILD_ECORE_EVAS_XRENDER_X11
3802 /* FIXME: this is inefficient as its a round trip */
3803 screen = DefaultScreen(ecore_x_display_get());
3804 if (ScreenCount(ecore_x_display_get()) > 1)
3806 Ecore_X_Window *roots;
3810 roots = ecore_x_window_root_list(&num);
3813 XWindowAttributes at;
3815 if (XGetWindowAttributes(ecore_x_display_get(),
3818 for (i = 0; i < num; i++)
3820 if (at.root == roots[i])
3830 einfo->info.backend = EVAS_ENGINE_INFO_XRENDER_BACKEND_XLIB;
3831 einfo->info.connection = ecore_x_display_get();
3832 einfo->info.screen = NULL;
3833 einfo->info.visual = DefaultVisual(ecore_x_display_get(), screen);
3834 # endif /* BUILD_ECORE_EVAS_XRENDER_(XCB|X11) */
3835 einfo->info.drawable = ee->prop.window;
3836 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3838 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3839 ecore_evas_free(ee);
3844 ecore_x_icccm_hints_set(ee->prop.window,
3845 1 /* accepts_focus */,
3846 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
3847 0 /* icon_pixmap */,
3849 0 /* icon_window */,
3850 0 /* window_group */,
3852 _ecore_evas_x_group_leader_set(ee);
3853 ecore_x_window_defaults_set(ee->prop.window);
3854 _ecore_evas_x_protocols_set(ee);
3855 _ecore_evas_x_sync_set(ee);
3857 ee->engine.func->fn_render = _ecore_evas_x_render;
3858 _ecore_evas_register(ee);
3859 ecore_x_input_multi_select(ee->prop.window);
3860 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
3865 ecore_evas_xrender_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3866 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3870 #endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
3875 * FIXME: To be fixed.
3877 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
3879 ecore_evas_xrender_x11_window_get(const Ecore_Evas *ee)
3881 return (Ecore_X_Window) ecore_evas_window_get(ee);
3885 ecore_evas_xrender_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3889 #endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
3894 * FIXME: To be fixed.
3896 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
3898 ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3900 ee->engine.x.direct_resize = on;
3904 ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3907 #endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
3912 * FIXME: To be fixed.
3914 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
3916 ecore_evas_xrender_x11_direct_resize_get(const Ecore_Evas *ee)
3918 return ee->engine.x.direct_resize;
3922 ecore_evas_xrender_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3926 #endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
3931 * FIXME: To be fixed.
3933 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
3935 ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3937 ecore_evas_software_x11_extra_event_window_add(ee, win);
3941 ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3944 #endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
3949 * FIXME: To be fixed.
3951 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3953 ecore_evas_software_x11_16_new(const char *disp_name, Ecore_X_Window parent,
3954 int x, int y, int w, int h)
3956 Evas_Engine_Info_Software_16_X11 *einfo;
3959 static int redraw_debug = -1;
3961 rmethod = evas_render_method_lookup("software_16_x11");
3962 if (!rmethod) return NULL;
3963 if (!ecore_x_init(disp_name)) return NULL;
3964 ee = calloc(1, sizeof(Ecore_Evas));
3965 if (!ee) return NULL;
3967 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3969 _ecore_evas_x_init();
3971 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3973 ee->driver = "software_16_x11";
3974 if (disp_name) ee->name = strdup(disp_name);
3987 ee->prop.max.w = 32767;
3988 ee->prop.max.h = 32767;
3990 ee->prop.request_pos = 0;
3991 ee->prop.sticky = 0;
3992 ee->engine.x.state.sticky = 0;
3994 /* init evas here */
3995 ee->evas = evas_new();
3996 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3997 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3998 evas_data_attach_set(ee->evas, ee);
3999 evas_output_method_set(ee->evas, rmethod);
4000 evas_output_size_set(ee->evas, w, h);
4001 evas_output_viewport_set(ee->evas, 0, 0, w, h);
4003 ee->engine.x.win_root = parent;
4006 /* FIXME: round trip in ecore_x_window_argb_get */
4007 if (ecore_x_window_argb_get(parent))
4009 ee->prop.window = ecore_x_window_argb_new(parent, x, y, w, h);
4012 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
4015 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
4016 if (getenv("DESKTOP_STARTUP_ID"))
4018 ecore_x_netwm_startup_id_set(ee->prop.window,
4019 getenv("DESKTOP_STARTUP_ID"));
4020 /* NB: on linux this may simply empty the env as opposed to completely
4021 * unset it to being empty - unsure as solartis libc crashes looking
4022 * for the '=' char */
4023 // putenv((char*)"DESKTOP_STARTUP_ID=");
4025 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
4029 if (ScreenCount(ecore_x_display_get()) > 1)
4031 Ecore_X_Window *roots;
4035 roots = ecore_x_window_root_list(&num);
4038 XWindowAttributes at;
4040 if (XGetWindowAttributes(ecore_x_display_get(),
4043 for (i = 0; i < num; i++)
4045 if (at.root == roots[i])
4053 if (redraw_debug < 0)
4055 if (getenv("REDRAW_DEBUG"))
4056 redraw_debug = atoi(getenv("REDRAW_DEBUG"));
4060 einfo->info.display = ecore_x_display_get();
4061 einfo->info.drawable = ee->prop.window;
4063 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
4065 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
4066 ecore_evas_free(ee);
4071 ecore_x_icccm_hints_set(ee->prop.window,
4072 1 /* accepts_focus */,
4073 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
4074 0 /* icon_pixmap */,
4076 0 /* icon_window */,
4077 0 /* window_group */,
4079 _ecore_evas_x_group_leader_set(ee);
4080 ecore_x_window_defaults_set(ee->prop.window);
4081 _ecore_evas_x_protocols_set(ee);
4082 _ecore_evas_x_sync_set(ee);
4084 ee->engine.func->fn_render = _ecore_evas_x_render;
4085 _ecore_evas_register(ee);
4086 ecore_x_input_multi_select(ee->prop.window);
4087 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
4092 ecore_evas_software_x11_16_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
4093 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
4097 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
4102 * FIXME: To be fixed.
4104 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
4106 ecore_evas_software_x11_16_window_get(const Ecore_Evas *ee)
4108 return (Ecore_X_Window) ecore_evas_window_get(ee);
4112 ecore_evas_software_x11_16_window_get(const Ecore_Evas *ee __UNUSED__)
4116 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
4121 * FIXME: To be fixed.
4123 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
4125 ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
4127 ee->engine.x.direct_resize = on;
4128 if (ee->prop.avoid_damage)
4130 if (ee->engine.x.direct_resize)
4132 /* turn this off for now
4133 ee->engine.x.using_bg_pixmap = 1;
4134 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
4139 /* turn this off too- bg pixmap is controlled by avoid damage directly
4140 ee->engine.x.using_bg_pixmap = 0;
4141 ecore_x_window_pixmap_set(ee->prop.window, 0);
4142 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
4149 ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
4152 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
4157 * FIXME: To be fixed.
4159 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
4161 ecore_evas_software_x11_16_direct_resize_get(const Ecore_Evas *ee)
4163 return ee->engine.x.direct_resize;
4167 ecore_evas_software_x11_16_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
4171 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
4176 * FIXME: To be fixed.
4178 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
4180 ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
4182 Ecore_X_Window *winp;
4184 winp = malloc(sizeof(Ecore_X_Window));
4188 ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
4189 ecore_x_input_multi_select(win);
4190 ecore_event_window_register(win, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
4195 ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
4198 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
4204 * FIXME: To be fixed.
4207 ecore_evas_software_x11_8_new(const char *disp_name, Ecore_X_Window parent,
4208 int x, int y, int w, int h)
4210 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4211 Evas_Engine_Info_Software_8_X11 *einfo;
4215 static int redraw_debug = -1;
4217 rmethod = evas_render_method_lookup("software_8_x11");
4218 if (!rmethod) return NULL;
4219 if (!ecore_x_init(disp_name)) return NULL;
4220 ee = calloc(1, sizeof(Ecore_Evas));
4221 if (!ee) return NULL;
4223 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
4225 _ecore_evas_x_init();
4227 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
4229 ee->driver = "software_8_x11";
4230 if (disp_name) ee->name = strdup(disp_name);
4243 ee->prop.max.w = 32767;
4244 ee->prop.max.h = 32767;
4246 ee->prop.request_pos = 0;
4247 ee->prop.sticky = 0;
4248 ee->engine.x.state.sticky = 0;
4250 /* init evas here */
4251 ee->evas = evas_new();
4252 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
4253 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
4254 evas_data_attach_set(ee->evas, ee);
4255 evas_output_method_set(ee->evas, rmethod);
4256 evas_output_size_set(ee->evas, w, h);
4257 evas_output_viewport_set(ee->evas, 0, 0, w, h);
4259 ee->engine.x.win_root = parent;
4262 // /* FIXME: round trip in ecore_x_window_argb_get */
4263 // if (ecore_x_window_argb_get(parent))
4265 // ee->engine.x.win = ecore_x_window_argb_new(parent, x, y, w, h);
4269 // ee->engine.x.win = ecore_x_window_new(parent, x, y, w, h);
4272 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
4273 if (getenv("DESKTOP_STARTUP_ID"))
4275 ecore_x_netwm_startup_id_set(ee->prop.window,
4276 getenv("DESKTOP_STARTUP_ID"));
4277 /* NB: on linux this may simply empty the env as opposed to completely
4278 * unset it to being empty - unsure as solartis libc crashes looking
4279 * for the '=' char */
4280 // putenv((char*)"DESKTOP_STARTUP_ID=");
4282 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
4285 xcb_screen_iterator_t iter;
4286 xcb_screen_t *screen;
4288 /* FIXME: this is inefficient as its a round trip */
4289 //einfo->info.backend = 1;
4290 screen = ecore_x_default_screen_get();
4291 iter = xcb_setup_roots_iterator (xcb_get_setup (ecore_x_connection_get()));
4294 xcb_get_geometry_cookie_t cookie;
4295 xcb_get_geometry_reply_t *reply;
4296 Ecore_X_Window *roots;
4301 cookie = xcb_get_geometry_unchecked(ecore_x_connection_get(), parent);
4302 roots = ecore_x_window_root_list(&num);
4305 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
4309 for (i = 0; i < num; xcb_screen_next (&iter), i++)
4311 if (reply->root == roots[i])
4323 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
4324 if (reply) free(reply);
4328 if (redraw_debug < 0)
4330 if (getenv("REDRAW_DEBUG"))
4331 redraw_debug = atoi(getenv("REDRAW_DEBUG"));
4335 einfo->info.connection = ecore_x_connection_get();
4336 einfo->info.screen = screen;
4337 einfo->info.drawable = ee->prop.window;
4340 /* FIXME: round trip */
4341 xcb_get_geometry_cookie_t cookie_geom;
4342 xcb_get_window_attributes_cookie_t cookie_attr;
4343 xcb_get_geometry_reply_t *reply_geom;
4344 xcb_get_window_attributes_reply_t *reply_attr;
4346 cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->prop.window);
4347 cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
4349 reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
4350 reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
4351 if (reply_attr && reply_geom)
4353 einfo->info.visual = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
4354 einfo->info.colormap = reply_attr->colormap;
4355 einfo->info.depth = reply_geom->depth;
4356 einfo->info.destination_alpha = 1;
4363 xcb_screen_t *screen;
4365 screen = ecore_x_default_screen_get();
4366 einfo->info.visual = xcb_visualtype_get(screen, screen->root_visual);
4367 einfo->info.colormap = screen->default_colormap;
4368 einfo->info.depth = screen->root_depth;
4369 einfo->info.destination_alpha = 0;
4371 einfo->info.rotation = 0;
4372 einfo->info.debug = redraw_debug;
4373 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
4375 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
4376 ecore_evas_free(ee);
4381 ecore_x_icccm_hints_set(ee->prop.window,
4382 1 /* accepts_focus */,
4383 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
4384 0 /* icon_pixmap */,
4386 0 /* icon_window */,
4387 0 /* window_group */,
4389 _ecore_evas_x_group_leader_set(ee);
4390 ecore_x_window_defaults_set(ee->prop.window);
4391 _ecore_evas_x_protocols_set(ee);
4392 _ecore_evas_x_sync_set(ee);
4394 ee->engine.func->fn_render = _ecore_evas_x_render;
4395 _ecore_evas_register(ee);
4396 ecore_x_input_multi_select(ee->prop.window);
4397 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
4408 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
4414 * FIXME: To be fixed.
4417 ecore_evas_software_x11_8_window_get(const Ecore_Evas *ee)
4419 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4420 return (Ecore_X_Window) ecore_evas_window_get(ee);
4430 * FIXME: To be fixed.
4433 ecore_evas_software_x11_8_subwindow_get(const Ecore_Evas *ee)
4435 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4436 return (Ecore_X_Window) ecore_evas_window_get(ee);
4446 * FIXME: To be fixed.
4449 ecore_evas_software_x11_8_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
4451 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4452 ee->engine.x.direct_resize = on;
4453 if (ee->prop.avoid_damage)
4455 if (ee->engine.x.direct_resize)
4457 /* turn this off for now
4458 ee->engine.x.using_bg_pixmap = 1;
4459 ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap);
4464 /* turn this off too- bg pixmap is controlled by avoid damage directly
4465 ee->engine.x.using_bg_pixmap = 0;
4466 ecore_x_window_pixmap_set(ee->engine.x.win, 0);
4467 ecore_x_window_area_expose(ee->engine.x.win, 0, 0, ee->w, ee->h);
4481 * FIXME: To be fixed.
4484 ecore_evas_software_x11_8_direct_resize_get(const Ecore_Evas *ee)
4486 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4487 return ee->engine.x.direct_resize;
4497 * FIXME: To be fixed.
4500 ecore_evas_software_x11_8_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
4502 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4503 Ecore_X_Window *winp;
4505 winp = malloc(sizeof(Ecore_X_Window));
4509 ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
4510 ecore_x_input_multi_select(win);
4511 ecore_event_window_register(win, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
4521 ecore_evas_x11_leader_set(Ecore_Evas *ee, Ecore_X_Window win)
4523 #ifdef BUILD_ECORE_EVAS_X11
4524 _ecore_evas_x_group_leader_unset(ee);
4525 ee->engine.x.leader = win;
4526 _ecore_evas_x_group_leader_update(ee);
4535 ecore_evas_x11_leader_get(Ecore_Evas *ee)
4537 #ifdef BUILD_ECORE_EVAS_X11
4538 return ee->engine.x.leader;
4546 ecore_evas_x11_leader_default_set(Ecore_Evas *ee)
4548 #ifdef BUILD_ECORE_EVAS_X11
4549 _ecore_evas_x_group_leader_unset(ee);
4550 _ecore_evas_x_group_leader_set(ee);