8 #include <Ecore_Input.h>
9 #include <Ecore_Input_Evas.h>
10 #ifdef BUILD_ECORE_EVAS_X11
12 # include <Ecore_X_Atoms.h>
15 #include "ecore_evas_private.h"
16 #include "Ecore_Evas.h"
18 #ifdef BUILD_ECORE_EVAS_X11
19 static int _ecore_evas_init_count = 0;
21 static Ecore_Event_Handler *ecore_evas_event_handlers[13];
24 _ecore_evas_x_protocols_set(Ecore_Evas *ee)
26 Ecore_X_Atom protos[10];
29 if (ee->func.fn_delete_request)
30 protos[num++] = ECORE_X_ATOM_WM_DELETE_WINDOW;
31 protos[num++] = ECORE_X_ATOM_NET_WM_PING;
32 ecore_x_icccm_protocol_atoms_set(ee->prop.window, protos, num);
36 _ecore_evas_x_sync_set(Ecore_Evas *ee)
38 if ((ecore_x_e_comp_sync_supported_get(ee->engine.x.win_root)) &&
39 (!ee->no_comp_sync) && (_ecore_evas_app_comp_sync))
41 if (!ee->engine.x.sync_counter)
42 ee->engine.x.sync_counter = ecore_x_sync_counter_new(0);
46 if (ee->engine.x.sync_counter)
47 ecore_x_sync_counter_free(ee->engine.x.sync_counter);
48 ee->engine.x.sync_counter = 0;
50 ecore_x_e_comp_sync_counter_set(ee->prop.window, ee->engine.x.sync_counter);
54 _ecore_evas_x_sync_clear(Ecore_Evas *ee)
56 if (!ee->engine.x.sync_counter) return;
57 ecore_x_sync_counter_free(ee->engine.x.sync_counter);
58 ee->engine.x.sync_counter = 0;
61 #ifdef HAVE_ECORE_X_XCB
62 static xcb_visualtype_t *
63 xcb_visualtype_get(xcb_screen_t *screen, xcb_visualid_t visual)
65 xcb_depth_iterator_t iter_depth;
67 if (!screen) return NULL;
69 iter_depth = xcb_screen_allowed_depths_iterator(screen);
70 for (; iter_depth.rem; xcb_depth_next (&iter_depth))
72 xcb_visualtype_iterator_t iter_vis;
74 iter_vis = xcb_depth_visuals_iterator(iter_depth.data);
75 for (; iter_vis.rem; --screen, xcb_visualtype_next (&iter_vis))
77 if (visual == iter_vis.data->visual_id)
84 #endif /* HAVE_ECORE_X_XCB */
86 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
87 # ifdef HAVE_ECORE_X_XCB
91 _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)
93 Evas_Engine_Info_GL_X11 *einfo;
96 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
99 XSetWindowAttributes attr;
106 for (op = 0; opt[op]; op++)
108 if (opt[op] == ECORE_EVAS_GL_X11_OPT_INDIRECT)
111 einfo->indirect = opt[op];
116 /* FIXME: this is inefficient as its 1 or more round trips */
117 screen = DefaultScreen(ecore_x_display_get());
118 if (ScreenCount(ecore_x_display_get()) > 1)
120 Ecore_X_Window *roots;
124 roots = ecore_x_window_root_list(&num);
127 XWindowAttributes at;
129 if (XGetWindowAttributes(ecore_x_display_get(),
132 for (i = 0; i < num; i++)
134 if (at.root == roots[i])
144 einfo->info.display = ecore_x_display_get();
145 einfo->info.screen = screen;
147 einfo->info.destination_alpha = argb;
149 einfo->info.visual = einfo->func.best_visual_get(einfo);
150 einfo->info.colormap = einfo->func.best_colormap_get(einfo);
151 einfo->info.depth = einfo->func.best_depth_get(einfo);
154 if ((!einfo->info.visual) ||
155 (!einfo->info.colormap) ||
156 (!einfo->info.depth))
158 WRN("OpenGL X11 init engine '%s' failed - no visual, colormap or depth.", ee->driver);
159 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
163 attr.backing_store = NotUseful;
164 attr.override_redirect = override;
165 attr.colormap = einfo->info.colormap;
166 attr.border_pixel = 0;
167 attr.background_pixmap = None;
169 KeyPressMask | KeyReleaseMask |
170 ExposureMask | ButtonPressMask | ButtonReleaseMask |
171 EnterWindowMask | LeaveWindowMask |
172 PointerMotionMask | StructureNotifyMask | VisibilityChangeMask |
173 FocusChangeMask | PropertyChangeMask | ColormapChangeMask;
174 attr.bit_gravity = ForgetGravity;
177 XCreateWindow(einfo->info.display, parent, x, y, w, h, 0,
178 einfo->info.depth, InputOutput, einfo->info.visual,
179 CWBackingStore | CWColormap | CWBackPixmap |
180 CWBorderPixel | CWBitGravity | CWEventMask |
181 CWOverrideRedirect, &attr);
182 einfo->info.drawable = win;
184 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
186 WRN("evas_engine_info_set() init engine '%s' failed.", ee->driver);
187 XDestroyWindow(einfo->info.display, win);
190 ecore_x_window_defaults_set(win);
191 _ecore_evas_x_protocols_set(ee);
192 _ecore_evas_x_sync_set(ee);
200 #endif /* HAVE_ECORE_X_XCB */
204 _ecore_evas_x_render(Ecore_Evas *ee)
207 Eina_List *updates, *l;
209 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
213 if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync) &&
214 (ee->engine.x.sync_counter) && (!ee->engine.x.sync_began) &&
215 (!ee->engine.x.sync_cancel))
218 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
220 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
221 rend |= _ecore_evas_buffer_render(ee2);
222 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
225 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
226 if (ee->prop.avoid_damage)
228 updates = evas_render_updates(ee->evas);
229 if (ee->engine.x.using_bg_pixmap)
233 EINA_LIST_FOREACH(updates, l, r)
234 ecore_x_window_area_clear(ee->prop.window, r->x, r->y, r->w, r->h);
235 if ((ee->shaped) && (updates))
237 #ifdef EVAS_FRAME_QUEUING
238 /* wait until ee->engine.x.mask being updated */
241 ecore_x_window_shape_mask_set(ee->prop.window, ee->engine.x.mask);
243 if ((ee->alpha) && (updates))
245 #ifdef EVAS_FRAME_QUEUING
246 /* wait until ee->engine.x.mask being updated */
247 // evas_sync(ee->evas);
249 // ecore_x_window_shape_input_mask_set(ee->prop.window, ee->engine.x.mask);
251 evas_render_updates_free(updates);
252 _ecore_evas_idle_timeout_update(ee);
258 EINA_LIST_FOREACH(updates, l, r)
260 Ecore_X_Rectangle rect;
261 Ecore_X_XRegion *tmpr;
263 if (!ee->engine.x.damages)
264 ee->engine.x.damages = ecore_x_xregion_new();
265 tmpr = ecore_x_xregion_new();
266 if (ee->rotation == 0)
273 else if (ee->rotation == 90)
276 rect.y = ee->h - r->x - r->w;
280 else if (ee->rotation == 180)
282 rect.x = ee->w - r->x - r->w;
283 rect.y = ee->h - r->y - r->h;
287 else if (ee->rotation == 270)
289 rect.x = ee->w - r->y - r->h;
294 ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
295 ecore_x_xregion_free(ee->engine.x.damages);
296 ee->engine.x.damages = tmpr;
298 if (ee->engine.x.damages)
300 /* if we have a damage pixmap - we can avoid exposures by
301 * disabling them just for setting the mask */
302 ecore_x_event_mask_set(ee->prop.window,
303 ECORE_X_EVENT_MASK_KEY_DOWN |
304 ECORE_X_EVENT_MASK_KEY_UP |
305 ECORE_X_EVENT_MASK_MOUSE_DOWN |
306 ECORE_X_EVENT_MASK_MOUSE_UP |
307 ECORE_X_EVENT_MASK_MOUSE_IN |
308 ECORE_X_EVENT_MASK_MOUSE_OUT |
309 ECORE_X_EVENT_MASK_MOUSE_MOVE |
310 // ECORE_X_EVENT_MASK_WINDOW_DAMAGE |
311 ECORE_X_EVENT_MASK_WINDOW_VISIBILITY |
312 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE |
313 ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE |
314 ECORE_X_EVENT_MASK_WINDOW_PROPERTY |
315 ECORE_X_EVENT_MASK_WINDOW_COLORMAP
317 if ((ee->shaped) && (updates))
318 ecore_x_window_shape_mask_set(ee->prop.window, ee->engine.x.mask);
319 /* and re-enable them again */
320 ecore_x_event_mask_set(ee->prop.window,
321 ECORE_X_EVENT_MASK_KEY_DOWN |
322 ECORE_X_EVENT_MASK_KEY_UP |
323 ECORE_X_EVENT_MASK_MOUSE_DOWN |
324 ECORE_X_EVENT_MASK_MOUSE_UP |
325 ECORE_X_EVENT_MASK_MOUSE_IN |
326 ECORE_X_EVENT_MASK_MOUSE_OUT |
327 ECORE_X_EVENT_MASK_MOUSE_MOVE |
328 ECORE_X_EVENT_MASK_WINDOW_DAMAGE |
329 ECORE_X_EVENT_MASK_WINDOW_VISIBILITY |
330 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE |
331 ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE |
332 ECORE_X_EVENT_MASK_WINDOW_PROPERTY |
333 ECORE_X_EVENT_MASK_WINDOW_COLORMAP
335 ecore_x_xregion_set(ee->engine.x.damages, ee->engine.x.gc);
336 /* debug rendering */
338 XSetForeground(ecore_x_display_get(), ee->engine.x.gc, rand());
339 XFillRectangle(ecore_x_display_get(), ee->prop.window, ee->engine.x.gc,
341 XSync(ecore_x_display_get(), False);
343 XSync(ecore_x_display_get(), False);
345 ecore_x_pixmap_paste(ee->engine.x.pmap, ee->prop.window, ee->engine.x.gc,
346 0, 0, ee->w, ee->h, 0, 0);
347 ecore_x_xregion_free(ee->engine.x.damages);
348 ee->engine.x.damages = NULL;
352 evas_render_updates_free(updates);
353 _ecore_evas_idle_timeout_update(ee);
358 else if (((ee->visible) && (ee->draw_ok)) ||
359 ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
360 ((ee->should_be_visible) && (ee->prop.override)))
362 updates = evas_render_updates(ee->evas);
367 #ifdef EVAS_FRAME_QUEUING
368 /* wait until ee->engine.x.mask being updated */
371 ecore_x_window_shape_mask_set(ee->prop.window, ee->engine.x.mask);
375 #ifdef EVAS_FRAME_QUEUING
376 /* wait until ee->engine.x.mask being updated */
377 // evas_sync(ee->evas);
379 // ecore_x_window_shape_input_mask_set(ee->prop.window, ee->engine.x.mask);
381 evas_render_updates_free(updates);
382 _ecore_evas_idle_timeout_update(ee);
387 evas_norender(ee->evas);
388 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
392 static int frames = 0;
393 static double t0 = 0.0;
396 t = ecore_time_get();
401 printf("FPS: %3.3f\n", (double)frames / td);
411 _ecore_evas_x_resize_shape(Ecore_Evas *ee)
413 if (!strcmp(ee->driver, "software_x11"))
415 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
416 Evas_Engine_Info_Software_X11 *einfo;
418 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
421 unsigned int foreground;
424 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
425 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
427 gc = ecore_x_gc_new(ee->engine.x.mask,
428 ECORE_X_GC_VALUE_MASK_FOREGROUND,
430 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
433 einfo->info.mask = ee->engine.x.mask;
434 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
436 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
438 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
440 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
442 else if (!strcmp(ee->driver, "xrender_x11"))
444 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
445 Evas_Engine_Info_XRender_X11 *einfo;
447 einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
450 unsigned int foreground;
453 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
454 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
456 gc = ecore_x_gc_new(ee->engine.x.mask,
457 ECORE_X_GC_VALUE_MASK_FOREGROUND,
459 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
462 einfo->info.mask = ee->engine.x.mask;
463 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
465 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
467 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
470 #endif /* BUILD_ECORE_EVAS_XRENDER_X11 || BUILD_ECORE_EVAS_XRENDER_XCB */
472 else if (!strcmp(ee->driver, "software_16_x11"))
474 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
475 # if 0 /* XXX no shaped window support for software_16_x11 */
476 Evas_Engine_Info_Software_16_X11 *einfo;
478 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
481 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
482 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
483 einfo->info.mask = ee->engine.x.mask;
484 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
486 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
488 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
490 # endif /* XXX no shaped window support for software_16_x11 */
491 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
493 if (!strcmp(ee->driver, "software_8_x11"))
495 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
496 Evas_Engine_Info_Software_8_X11 *einfo;
498 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
501 unsigned int foreground;
504 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
505 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
507 gc = ecore_x_gc_new(ee->engine.x.mask,
508 ECORE_X_GC_VALUE_MASK_FOREGROUND,
510 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
513 einfo->info.mask = ee->engine.x.mask;
514 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
516 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
518 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
520 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
524 /* TODO: we need to make this work for all the states, not just sticky */
526 _ecore_evas_x_event_property_change(void *data __UNUSED__, int type __UNUSED__, void *event)
529 Ecore_X_Event_Window_Property *e;
532 ee = ecore_event_window_match(e->win);
533 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
534 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
535 if (e->atom == ECORE_X_ATOM_NET_WM_STATE)
538 Ecore_X_Window_State *state;
541 #ifdef HAVE_ECORE_X_XCB
542 ecore_x_netwm_window_state_get_prefetch(e->win);
543 #endif /* HAVE_ECORE_X_XCB */
546 /* TODO: we need to move those to the end, with if statements */
547 ee->engine.x.state.modal = 0;
548 ee->engine.x.state.maximized_v = 0;
549 ee->engine.x.state.maximized_h = 0;
550 ee->engine.x.state.shaded = 0;
551 ee->engine.x.state.skip_taskbar = 0;
552 ee->engine.x.state.skip_pager = 0;
553 ee->prop.fullscreen = 0;
554 ee->engine.x.state.fullscreen = 0;
555 ee->engine.x.state.above = 0;
556 ee->engine.x.state.below = 0;
558 #ifdef HAVE_ECORE_X_XCB
559 ecore_x_netwm_window_state_get_fetch();
560 #endif /* HAVE_ECORE_X_XCB */
561 ecore_x_netwm_window_state_get(e->win, &state, &num);
564 for (i = 0; i < num; i++)
568 case ECORE_X_WINDOW_STATE_MODAL:
569 ee->engine.x.state.modal = 1;
571 case ECORE_X_WINDOW_STATE_STICKY:
572 if (ee->prop.sticky && ee->engine.x.state.sticky)
577 ee->engine.x.state.sticky = 1;
578 if (ee->func.fn_sticky) ee->func.fn_sticky(ee);
580 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
581 ee->engine.x.state.maximized_v = 1;
583 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
584 ee->engine.x.state.maximized_h = 1;
586 case ECORE_X_WINDOW_STATE_SHADED:
587 ee->engine.x.state.shaded = 1;
589 case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
590 ee->engine.x.state.skip_taskbar = 1;
592 case ECORE_X_WINDOW_STATE_SKIP_PAGER:
593 ee->engine.x.state.skip_pager = 1;
595 case ECORE_X_WINDOW_STATE_FULLSCREEN:
596 ee->prop.fullscreen = 1;
597 ee->engine.x.state.fullscreen = 1;
599 case ECORE_X_WINDOW_STATE_ABOVE:
600 ee->engine.x.state.above = 1;
602 case ECORE_X_WINDOW_STATE_BELOW:
603 ee->engine.x.state.below = 1;
611 #ifdef HAVE_ECORE_X_XCB
612 ecore_xcb_reply_free();
613 #endif /* HAVE_ECORE_X_XCB */
615 if (ee->prop.sticky && !sticky)
618 ee->engine.x.state.sticky = 0;
619 if (ee->func.fn_unsticky) ee->func.fn_unsticky(ee);
623 return ECORE_CALLBACK_PASS_ON;
627 _ecore_evas_x_event_visibility_change(void *data __UNUSED__, int type __UNUSED__, void *event)
630 Ecore_X_Event_Window_Visibility_Change *e;
633 ee = ecore_event_window_match(e->win);
634 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
635 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
636 // printf("VIS CHANGE OBSCURED: %p %i\n", ee, e->fully_obscured);
637 if (e->fully_obscured)
639 /* FIXME: round trip */
640 if (!ecore_x_screen_is_composited(ee->engine.x.screen_num))
643 else ee->draw_ok = 1;
644 return ECORE_CALLBACK_PASS_ON;
648 _ecore_evas_x_event_client_message(void *data __UNUSED__, int type __UNUSED__, void *event)
651 Ecore_X_Event_Client_Message *e;
654 if (e->format != 32) return ECORE_CALLBACK_PASS_ON;
655 if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_BEGIN)
657 ee = ecore_event_window_match(e->data.l[0]);
658 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
659 if (e->data.l[0] != (long)ee->prop.window) return ECORE_CALLBACK_PASS_ON;
660 if (!ee->engine.x.sync_began)
662 // qeue a damage + draw. work around an event re-ordering thing.
663 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
665 ee->engine.x.sync_began = 1;
666 ee->engine.x.sync_cancel = 0;
668 else if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_END)
670 ee = ecore_event_window_match(e->data.l[0]);
671 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
672 if (e->data.l[0] != (long)ee->prop.window) return ECORE_CALLBACK_PASS_ON;
673 ee->engine.x.sync_began = 0;
674 ee->engine.x.sync_cancel = 0;
676 else if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_CANCEL)
678 ee = ecore_event_window_match(e->data.l[0]);
679 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
680 if (e->data.l[0] != (long)ee->prop.window) return ECORE_CALLBACK_PASS_ON;
681 ee->engine.x.sync_began = 0;
682 ee->engine.x.sync_cancel = 1;
684 return ECORE_CALLBACK_PASS_ON;
688 _ecore_evas_x_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
691 Ecore_X_Event_Mouse_In *e;
694 ee = ecore_event_window_match(e->win);
695 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
696 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
701 /* const char *modes[] = { */
703 /* "MODE_WHILE_GRABBED", */
707 /* const char *details[] = { */
708 /* "DETAIL_ANCESTOR", */
709 /* "DETAIL_VIRTUAL", */
710 /* "DETAIL_INFERIOR", */
711 /* "DETAIL_NON_LINEAR", */
712 /* "DETAIL_NON_LINEAR_VIRTUAL", */
713 /* "DETAIL_POINTER", */
714 /* "DETAIL_POINTER_ROOT", */
715 /* "DETAIL_DETAIL_NONE" */
717 /* t = time(NULL); */
718 /* ct = ctime(&t); */
719 /* ct[strlen(ct) - 1] = 0; */
720 /* printf("@@ ->IN 0x%x 0x%x %s md=%s dt=%s\n", */
721 /* e->win, e->event_win, */
723 /* modes[e->mode], */
724 /* details[e->detail]); */
726 // disable. causes mroe problems than it fixes
727 // if ((e->mode == ECORE_X_EVENT_MODE_GRAB) ||
728 // (e->mode == ECORE_X_EVENT_MODE_UNGRAB))
730 /* if (e->mode != ECORE_X_EVENT_MODE_NORMAL) return 0; */
731 if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
732 ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
733 evas_event_feed_mouse_in(ee->evas, e->time, NULL);
734 _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
735 return ECORE_CALLBACK_PASS_ON;
739 _ecore_evas_x_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
742 Ecore_X_Event_Mouse_Out *e;
745 ee = ecore_event_window_match(e->win);
746 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
748 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
753 /* const char *modes[] = { */
755 /* "MODE_WHILE_GRABBED", */
759 /* const char *details[] = { */
760 /* "DETAIL_ANCESTOR", */
761 /* "DETAIL_VIRTUAL", */
762 /* "DETAIL_INFERIOR", */
763 /* "DETAIL_NON_LINEAR", */
764 /* "DETAIL_NON_LINEAR_VIRTUAL", */
765 /* "DETAIL_POINTER", */
766 /* "DETAIL_POINTER_ROOT", */
767 /* "DETAIL_DETAIL_NONE" */
769 /* t = time(NULL); */
770 /* ct = ctime(&t); */
771 /* ct[strlen(ct) - 1] = 0; */
772 /* printf("@@ ->OUT 0x%x 0x%x %s md=%s dt=%s\n", */
773 /* e->win, e->event_win, */
775 /* modes[e->mode], */
776 /* details[e->detail]); */
778 // disable. causes more problems than it fixes
779 // if ((e->mode == ECORE_X_EVENT_MODE_GRAB) ||
780 // (e->mode == ECORE_X_EVENT_MODE_UNGRAB))
782 /* if (e->mode != ECORE_X_EVENT_MODE_NORMAL) return 0; */
783 ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
784 _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
785 if (e->mode == ECORE_X_EVENT_MODE_GRAB)
786 evas_event_feed_mouse_cancel(ee->evas, e->time, NULL);
787 evas_event_feed_mouse_out(ee->evas, e->time, NULL);
788 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
789 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
790 return ECORE_CALLBACK_PASS_ON;
794 _ecore_evas_x_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
797 Ecore_X_Event_Window_Focus_In *e;
800 ee = ecore_event_window_match(e->win);
801 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
802 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
803 if (e->mode == ECORE_X_EVENT_MODE_UNGRAB) return ECORE_CALLBACK_PASS_ON;
804 ee->prop.focused = 1;
805 evas_focus_in(ee->evas);
806 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
807 return ECORE_CALLBACK_PASS_ON;
811 _ecore_evas_x_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
814 Ecore_X_Event_Window_Focus_Out *e;
817 ee = ecore_event_window_match(e->win);
818 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
819 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
820 if (e->mode == ECORE_X_EVENT_MODE_GRAB) return ECORE_CALLBACK_PASS_ON;
821 // if (ee->prop.fullscreen)
822 // ecore_x_window_focus(ee->prop.window);
823 evas_focus_out(ee->evas);
824 ee->prop.focused = 0;
825 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
826 return ECORE_CALLBACK_PASS_ON;
830 _ecore_evas_x_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event)
833 Ecore_X_Event_Window_Damage *e;
836 ee = ecore_event_window_match(e->win);
837 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
838 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
839 if (ee->engine.x.using_bg_pixmap) return ECORE_CALLBACK_PASS_ON;
840 // printf("EXPOSE %p [%i] %i %i %ix%i\n", ee, ee->prop.avoid_damage, e->x, e->y, e->w, e->h);
841 if (ee->prop.avoid_damage)
843 Ecore_X_Rectangle rect;
844 Ecore_X_XRegion *tmpr;
846 if (!ee->engine.x.damages) ee->engine.x.damages = ecore_x_xregion_new();
847 tmpr = ecore_x_xregion_new();
852 ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
853 ecore_x_xregion_free(ee->engine.x.damages);
854 ee->engine.x.damages = tmpr;
855 /* no - this breaks things badly. disable. Ecore_X_Rectangle != XRectangle - see
856 * the typedefs in x's headers and ecore_x's. also same with Region - it's a pointer in x - not an X ID
857 Ecore_X_Rectangle rect;
858 Ecore_X_XRegion *tmpr;
860 if (!ee->engine.x.damages) ee->engine.x.damages = ecore_x_xregion_new();
861 tmpr = ecore_x_xregion_new();
866 ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
867 ecore_x_xregion_free(ee->engine.x.damages);
868 ee->engine.x.damages = tmpr;
873 if (ee->rotation == 0)
874 evas_damage_rectangle_add(ee->evas,
878 else if (ee->rotation == 90)
879 evas_damage_rectangle_add(ee->evas,
883 else if (ee->rotation == 180)
884 evas_damage_rectangle_add(ee->evas,
888 else if (ee->rotation == 270)
889 evas_damage_rectangle_add(ee->evas,
894 return ECORE_CALLBACK_PASS_ON;
898 _ecore_evas_x_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event)
901 Ecore_X_Event_Window_Destroy *e;
904 ee = ecore_event_window_match(e->win);
905 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
906 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
907 if (ee->func.fn_destroy) ee->func.fn_destroy(ee);
908 _ecore_evas_x_sync_clear(ee);
910 return ECORE_CALLBACK_PASS_ON;
914 _ecore_evas_x_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
917 Ecore_X_Event_Window_Configure *e;
920 ee = ecore_event_window_match(e->win);
921 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
922 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
923 if (ee->engine.x.direct_resize) return ECORE_CALLBACK_PASS_ON;
925 if ((e->from_wm) || (ee->prop.override))
927 if ((ee->x != e->x) || (ee->y != e->y))
933 if (ee->func.fn_move) ee->func.fn_move(ee);
936 if ((ee->w != e->w) || (ee->h != e->h))
942 if ((ee->rotation == 90) || (ee->rotation == 270))
944 evas_output_size_set(ee->evas, ee->h, ee->w);
945 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
949 evas_output_size_set(ee->evas, ee->w, ee->h);
950 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
952 if (ee->prop.avoid_damage)
956 pdam = ecore_evas_avoid_damage_get(ee);
957 ecore_evas_avoid_damage_set(ee, 0);
958 ecore_evas_avoid_damage_set(ee, pdam);
960 if ((ee->shaped) || (ee->alpha))
961 _ecore_evas_x_resize_shape(ee);
962 if ((ee->expecting_resize.w > 0) &&
963 (ee->expecting_resize.h > 0))
965 if ((ee->expecting_resize.w == ee->w) &&
966 (ee->expecting_resize.h == ee->h))
967 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
968 ecore_x_current_time_get());
969 ee->expecting_resize.w = 0;
970 ee->expecting_resize.h = 0;
972 if (ee->func.fn_resize) ee->func.fn_resize(ee);
974 return ECORE_CALLBACK_PASS_ON;
978 _ecore_evas_x_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event)
981 Ecore_X_Event_Window_Delete_Request *e;
984 ee = ecore_event_window_match(e->win);
985 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
986 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
987 if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
988 return ECORE_CALLBACK_PASS_ON;
992 _ecore_evas_x_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event)
995 Ecore_X_Event_Window_Show *e;
996 static int first_map_bug = -1;
999 ee = ecore_event_window_match(e->win);
1000 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1001 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1002 if (first_map_bug < 0)
1004 if (getenv("ECORE_EVAS_GL_FIRST_MAP_BUG"))
1005 first_map_bug = atoi(getenv("ECORE_EVAS_GL_FIRST_MAP_BUG"));
1008 if ((first_map_bug) &&
1009 (!strcmp(ee->driver, "opengl_x11")))
1010 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1012 if (ee->visible) return ECORE_CALLBACK_DONE;
1013 // printf("SHOW EVENT %p\n", ee);
1015 if (ee->func.fn_show) ee->func.fn_show(ee);
1016 return ECORE_CALLBACK_PASS_ON;
1020 _ecore_evas_x_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event)
1023 Ecore_X_Event_Window_Hide *e;
1026 ee = ecore_event_window_match(e->win);
1027 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1028 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1029 if (!ee->visible) return ECORE_CALLBACK_DONE;
1030 // printf("HIDE EVENT %p\n", ee);
1032 if (ee->func.fn_hide) ee->func.fn_hide(ee);
1033 return ECORE_CALLBACK_PASS_ON;
1036 /* FIXME, should be in idler */
1037 /* FIXME, round trip */
1039 _ecore_evas_x_size_pos_hints_update(Ecore_Evas *ee)
1041 # ifdef HAVE_ECORE_X_XCB
1042 ecore_x_icccm_size_pos_hints_get_prefetch(ee->prop.window);
1043 ecore_x_icccm_size_pos_hints_get_fetch();
1044 # endif /* HAVE_ECORE_X_XCB */
1045 ecore_x_icccm_size_pos_hints_set(ee->prop.window,
1046 ee->prop.request_pos /*request_pos */,
1047 ECORE_X_GRAVITY_NW /* gravity */,
1048 ee->prop.min.w /* min_w */,
1049 ee->prop.min.h /* min_h */,
1050 ee->prop.max.w /* max_w */,
1051 ee->prop.max.h /* max_h */,
1052 ee->prop.base.w /* base_w */,
1053 ee->prop.base.h /* base_h */,
1054 ee->prop.step.w /* step_x */,
1055 ee->prop.step.h /* step_y */,
1057 0 /* max_aspect */);
1058 # ifdef HAVE_ECORE_X_XCB
1059 ecore_xcb_reply_free();
1060 # endif /* HAVE_ECORE_X_XCB */
1063 /* FIXME, should be in idler */
1065 _ecore_evas_x_state_update(Ecore_Evas *ee)
1067 Ecore_X_Window_State state[10];
1073 if (bd->client.netwm.state.modal)
1074 state[num++] = ECORE_X_WINDOW_STATE_MODAL;
1076 if (ee->engine.x.state.sticky)
1077 state[num++] = ECORE_X_WINDOW_STATE_STICKY;
1079 if (bd->client.netwm.state.maximized_v)
1080 state[num++] = ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
1081 if (bd->client.netwm.state.maximized_h)
1082 state[num++] = ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
1083 if (bd->client.netwm.state.shaded)
1084 state[num++] = ECORE_X_WINDOW_STATE_SHADED;
1085 if (bd->client.netwm.state.skip_taskbar)
1086 state[num++] = ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
1087 if (bd->client.netwm.state.skip_pager)
1088 state[num++] = ECORE_X_WINDOW_STATE_SKIP_PAGER;
1089 if (bd->client.netwm.state.hidden)
1090 state[num++] = ECORE_X_WINDOW_STATE_HIDDEN;
1092 if (ee->engine.x.state.fullscreen)
1093 state[num++] = ECORE_X_WINDOW_STATE_FULLSCREEN;
1094 if (ee->engine.x.state.above)
1095 state[num++] = ECORE_X_WINDOW_STATE_ABOVE;
1096 if (ee->engine.x.state.below)
1097 state[num++] = ECORE_X_WINDOW_STATE_BELOW;
1099 ecore_x_netwm_window_state_set(ee->prop.window, state, num);
1103 _ecore_evas_x_layer_update(Ecore_Evas *ee)
1105 if (ee->should_be_visible)
1107 /* We need to send a netwm request to the wm */
1108 /* FIXME: Do we have to remove old state before adding new? */
1109 if (ee->prop.layer < 3)
1111 if (ee->engine.x.state.above)
1113 ee->engine.x.state.above = 0;
1114 ecore_x_netwm_state_request_send(ee->prop.window,
1115 ee->engine.x.win_root,
1116 ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
1118 if (!ee->engine.x.state.below)
1120 ee->engine.x.state.below = 1;
1121 ecore_x_netwm_state_request_send(ee->prop.window,
1122 ee->engine.x.win_root,
1123 ECORE_X_WINDOW_STATE_BELOW, -1, 1);
1126 else if (ee->prop.layer > 5)
1128 if (ee->engine.x.state.below)
1130 ee->engine.x.state.below = 0;
1131 ecore_x_netwm_state_request_send(ee->prop.window,
1132 ee->engine.x.win_root,
1133 ECORE_X_WINDOW_STATE_BELOW, -1, 0);
1135 if (!ee->engine.x.state.above)
1137 ee->engine.x.state.above = 1;
1138 ecore_x_netwm_state_request_send(ee->prop.window,
1139 ee->engine.x.win_root,
1140 ECORE_X_WINDOW_STATE_ABOVE, -1, 1);
1145 if (ee->engine.x.state.below)
1147 ee->engine.x.state.below = 0;
1148 ecore_x_netwm_state_request_send(ee->prop.window,
1149 ee->engine.x.win_root,
1150 ECORE_X_WINDOW_STATE_BELOW, -1, 0);
1152 if (ee->engine.x.state.above)
1154 ee->engine.x.state.above = 0;
1155 ecore_x_netwm_state_request_send(ee->prop.window,
1156 ee->engine.x.win_root,
1157 ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
1163 /* Just set the state */
1164 if (ee->prop.layer < 3)
1166 if ((ee->engine.x.state.above) || (!ee->engine.x.state.below))
1168 ee->engine.x.state.above = 0;
1169 ee->engine.x.state.below = 1;
1170 _ecore_evas_x_state_update(ee);
1173 else if (ee->prop.layer > 5)
1175 if ((!ee->engine.x.state.above) || (ee->engine.x.state.below))
1177 ee->engine.x.state.above = 1;
1178 ee->engine.x.state.below = 0;
1179 _ecore_evas_x_state_update(ee);
1184 if ((ee->engine.x.state.above) || (ee->engine.x.state.below))
1186 ee->engine.x.state.above = 0;
1187 ee->engine.x.state.below = 0;
1188 _ecore_evas_x_state_update(ee);
1192 /* FIXME: Set gnome layer */
1196 _ecore_evas_x_init(void)
1198 _ecore_evas_init_count++;
1199 if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
1200 ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN, _ecore_evas_x_event_mouse_in, NULL);
1201 ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT, _ecore_evas_x_event_mouse_out, NULL);
1202 ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, _ecore_evas_x_event_window_focus_in, NULL);
1203 ecore_evas_event_handlers[3] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, _ecore_evas_x_event_window_focus_out, NULL);
1204 ecore_evas_event_handlers[4] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DAMAGE, _ecore_evas_x_event_window_damage, NULL);
1205 ecore_evas_event_handlers[5] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DESTROY, _ecore_evas_x_event_window_destroy, NULL);
1206 ecore_evas_event_handlers[6] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE, _ecore_evas_x_event_window_configure, NULL);
1207 ecore_evas_event_handlers[7] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, _ecore_evas_x_event_window_delete_request, NULL);
1208 ecore_evas_event_handlers[8] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW, _ecore_evas_x_event_window_show, NULL);
1209 ecore_evas_event_handlers[9] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_HIDE, _ecore_evas_x_event_window_hide, NULL);
1210 ecore_evas_event_handlers[10] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, _ecore_evas_x_event_property_change, NULL);
1211 ecore_evas_event_handlers[11] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, _ecore_evas_x_event_visibility_change, NULL);
1212 ecore_evas_event_handlers[12] = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, _ecore_evas_x_event_client_message, NULL);
1213 ecore_event_evas_init();
1214 return _ecore_evas_init_count;
1218 _ecore_evas_x_free(Ecore_Evas *ee)
1220 _ecore_evas_x_sync_set(ee);
1221 ecore_x_window_free(ee->prop.window);
1222 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
1223 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1224 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
1225 if (ee->engine.x.damages) ecore_x_xregion_free(ee->engine.x.damages);
1226 ee->engine.x.pmap = 0;
1227 ee->engine.x.mask = 0;
1228 ee->engine.x.gc = 0;
1229 ee->engine.x.damages = NULL;
1230 ecore_event_window_unregister(ee->prop.window);
1231 while (ee->engine.x.win_extra)
1233 Ecore_X_Window *winp;
1235 winp = ee->engine.x.win_extra->data;
1236 ee->engine.x.win_extra = eina_list_remove_list(ee->engine.x.win_extra, ee->engine.x.win_extra);
1237 ecore_event_window_unregister(*winp);
1240 _ecore_evas_x_shutdown();
1245 _ecore_evas_x_callback_delete_request_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
1247 ee->func.fn_delete_request = func;
1248 _ecore_evas_x_protocols_set(ee);
1249 _ecore_evas_x_sync_set(ee);
1253 _ecore_evas_x_move(Ecore_Evas *ee, int x, int y)
1257 if (ee->engine.x.direct_resize)
1259 if (!ee->engine.x.managed)
1261 if ((x != ee->x) || (y != ee->y))
1265 ecore_x_window_move(ee->prop.window, x, y);
1266 if (!ee->should_be_visible)
1268 /* We need to request pos */
1269 ee->prop.request_pos = 1;
1270 _ecore_evas_x_size_pos_hints_update(ee);
1272 if (ee->func.fn_move) ee->func.fn_move(ee);
1278 ecore_x_window_move(ee->prop.window, x, y);
1279 if (!ee->should_be_visible)
1281 /* We need to request pos */
1282 ee->prop.request_pos = 1;
1283 _ecore_evas_x_size_pos_hints_update(ee);
1285 if (!ee->engine.x.managed)
1294 _ecore_evas_x_managed_move(Ecore_Evas *ee, int x, int y)
1298 if (ee->engine.x.direct_resize)
1300 ee->engine.x.managed = 1;
1301 if ((x != ee->x) || (y != ee->y))
1305 if (ee->func.fn_move) ee->func.fn_move(ee);
1311 _ecore_evas_x_resize(Ecore_Evas *ee, int w, int h)
1315 if (ee->engine.x.direct_resize)
1317 if ((ee->w != w) || (ee->h != h))
1319 ecore_x_window_resize(ee->prop.window, w, h);
1322 if ((ee->rotation == 90) || (ee->rotation == 270))
1324 evas_output_size_set(ee->evas, ee->h, ee->w);
1325 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1329 evas_output_size_set(ee->evas, ee->w, ee->h);
1330 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1332 if (ee->prop.avoid_damage)
1336 pdam = ecore_evas_avoid_damage_get(ee);
1337 ecore_evas_avoid_damage_set(ee, 0);
1338 ecore_evas_avoid_damage_set(ee, pdam);
1340 if ((ee->shaped) || (ee->alpha))
1341 _ecore_evas_x_resize_shape(ee);
1342 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1346 ecore_x_window_resize(ee->prop.window, w, h);
1350 _ecore_evas_x_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
1356 if (ee->engine.x.direct_resize)
1358 if ((ee->w != w) || (ee->h != h) || (x != ee->x) || (y != ee->y))
1360 int change_size = 0, change_pos = 0;
1362 if ((ee->w != w) || (ee->h != h)) change_size = 1;
1363 if (!ee->engine.x.managed)
1365 if ((x != ee->x) || (y != ee->y)) change_pos = 1;
1367 ecore_x_window_move_resize(ee->prop.window, x, y, w, h);
1368 if (!ee->engine.x.managed)
1375 if ((ee->rotation == 90) || (ee->rotation == 270))
1377 evas_output_size_set(ee->evas, ee->h, ee->w);
1378 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1382 evas_output_size_set(ee->evas, ee->w, ee->h);
1383 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1385 if (ee->prop.avoid_damage)
1389 pdam = ecore_evas_avoid_damage_get(ee);
1390 ecore_evas_avoid_damage_set(ee, 0);
1391 ecore_evas_avoid_damage_set(ee, pdam);
1393 if ((ee->shaped) || (ee->alpha))
1394 _ecore_evas_x_resize_shape(ee);
1397 if (ee->func.fn_move) ee->func.fn_move(ee);
1401 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1407 ecore_x_window_move_resize(ee->prop.window, x, y, w, h);
1408 if (!ee->engine.x.managed)
1417 _ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize,
1418 Evas_Engine_Info *einfo)
1422 rot_dif = ee->rotation - rotation;
1423 if (rot_dif < 0) rot_dif = -rot_dif;
1427 int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
1429 if (!evas_engine_info_set(ee->evas, einfo))
1431 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1436 if (!ee->prop.fullscreen)
1438 ecore_x_window_resize(ee->prop.window, ee->req.h, ee->req.w);
1439 ee->expecting_resize.w = ee->h;
1440 ee->expecting_resize.h = ee->w;
1446 ecore_x_window_size_get(ee->prop.window, &w, &h);
1447 ecore_x_window_resize(ee->prop.window, h, w);
1448 if ((rotation == 0) || (rotation == 180))
1450 evas_output_size_set(ee->evas, ee->req.w, ee->req.h);
1451 evas_output_viewport_set(ee->evas, 0, 0, ee->req.w, ee->req.h);
1455 evas_output_size_set(ee->evas, ee->req.h, ee->req.w);
1456 evas_output_viewport_set(ee->evas, 0, 0, ee->req.h, ee->req.w);
1458 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1460 if ((ee->rotation == 90) || (ee->rotation == 270))
1461 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.h, ee->req.w);
1463 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
1469 ecore_x_window_size_get(ee->prop.window, &w, &h);
1470 if ((rotation == 0) || (rotation == 180))
1472 evas_output_size_set(ee->evas, ee->w, ee->h);
1473 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1477 evas_output_size_set(ee->evas, ee->h, ee->w);
1478 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1480 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1481 if ((ee->rotation == 90) || (ee->rotation == 270))
1482 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
1484 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1486 ecore_evas_size_min_get(ee, &minw, &minh);
1487 ecore_evas_size_max_get(ee, &maxw, &maxh);
1488 ecore_evas_size_base_get(ee, &basew, &baseh);
1489 ecore_evas_size_step_get(ee, &stepw, &steph);
1490 ee->rotation = rotation;
1491 ecore_evas_size_min_set(ee, minh, minw);
1492 ecore_evas_size_max_set(ee, maxh, maxw);
1493 ecore_evas_size_base_set(ee, baseh, basew);
1494 ecore_evas_size_step_set(ee, steph, stepw);
1495 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
1496 ecore_x_current_time_get());
1500 if (!evas_engine_info_set(ee->evas, einfo))
1502 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1504 ee->rotation = rotation;
1505 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
1506 ecore_x_current_time_get());
1507 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1509 if ((ee->rotation == 90) || (ee->rotation == 270))
1510 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
1512 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1516 /* added by gl77.lee 101001 - for EFL rotation effect */
1517 #define _USE_WIN_ROT_EFFECT 1
1519 #if _USE_WIN_ROT_EFFECT
1520 static void _ecore_evas_x_flush_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__);
1522 typedef struct _Ecore_Evas_X_Rotation_Effect Ecore_Evas_X_Rotation_Effect;
1523 struct _Ecore_Evas_X_Rotation_Effect
1525 Eina_Bool wait_for_comp_reply;
1528 static Ecore_Evas_X_Rotation_Effect _rot_effect =
1534 _ecore_evas_x_rotation_effect_setup(void)
1536 _rot_effect.wait_for_comp_reply = EINA_TRUE;
1538 #endif /* end of _USE_WIN_ROT_EFFECT */
1541 _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize)
1543 if (ee->rotation == rotation) return;
1544 if (!strcmp(ee->driver, "xrender_x11")) return;
1546 #if _USE_WIN_ROT_EFFECT
1548 angles[0] = rotation;
1549 angles[1] = ee->rotation;
1550 #endif /* end of _USE_WIN_ROT_EFFECT */
1552 if (!strcmp(ee->driver, "opengl_x11"))
1554 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
1555 Evas_Engine_Info_GL_X11 *einfo;
1557 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
1559 einfo->info.rotation = rotation;
1560 _ecore_evas_x_rotation_set_internal
1561 (ee, rotation, resize, (Evas_Engine_Info *)einfo);
1563 /* added by doyoun.kang 100218 - for rotation */
1564 #if _USE_WIN_ROT_EFFECT
1565 ecore_x_window_prop_property_set (ee->prop.window,
1566 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1567 ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1569 ecore_x_window_prop_property_set (ee->prop.window,
1570 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1571 ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1573 #endif /* BUILD_ECORE_EVAS_OPENGL_X11 */
1575 else if (!strcmp(ee->driver, "software_x11"))
1577 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
1578 Evas_Engine_Info_Software_X11 *einfo;
1580 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
1582 einfo->info.rotation = rotation;
1583 _ecore_evas_x_rotation_set_internal
1584 (ee, rotation, resize, (Evas_Engine_Info *)einfo);
1586 /* added by doyoun.kang 100218 - for rotation */
1587 #if _USE_WIN_ROT_EFFECT
1588 ecore_x_window_prop_property_set (ee->prop.window,
1589 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1590 ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1592 ecore_x_window_prop_property_set (ee->prop.window,
1593 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1594 ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1596 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
1598 else if (!strcmp(ee->driver, "software_16_x11"))
1600 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
1601 Evas_Engine_Info_Software_16_X11 *einfo;
1603 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
1605 einfo->info.rotation = rotation;
1606 _ecore_evas_x_rotation_set_internal
1607 (ee, rotation, resize, (Evas_Engine_Info *)einfo);
1609 /* added by doyoun.kang 100218 - for rotation */
1610 #if _USE_WIN_ROT_EFFECT
1611 ecore_x_window_prop_property_set (ee->prop.window,
1612 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1613 ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1615 ecore_x_window_prop_property_set (ee->prop.window,
1616 ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1617 ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1619 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
1621 else if (!strcmp(ee->driver, "software_8_x11"))
1623 #if BUILD_ECORE_EVAS_SOFTWARE_8_X11
1624 Evas_Engine_Info_Software_8_X11 *einfo;
1626 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
1628 einfo->info.rotation = rotation;
1629 _ecore_evas_x_rotation_set_internal
1630 (ee, rotation, resize, (Evas_Engine_Info *)einfo);
1631 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
1634 #if _USE_WIN_ROT_EFFECT
1635 _ecore_evas_x_rotation_effect_setup();
1636 _ecore_evas_x_flush_pre(ee, NULL, NULL);
1637 #endif /* end of _USE_WIN_ROT_EFFECT */
1641 _ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped)
1643 if (((ee->shaped) && (shaped)) || ((!ee->shaped) && (!shaped)))
1645 if (!strcmp(ee->driver, "opengl_x11")) return;
1646 if (!strcmp(ee->driver, "software_x11"))
1648 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
1649 Evas_Engine_Info_Software_X11 *einfo;
1651 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
1652 ee->shaped = shaped;
1657 unsigned int foreground;
1660 if (!ee->engine.x.mask)
1661 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1663 gc = ecore_x_gc_new(ee->engine.x.mask,
1664 ECORE_X_GC_VALUE_MASK_FOREGROUND,
1666 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
1667 0, 0, ee->w, ee->h);
1668 ecore_x_gc_free(gc);
1669 einfo->info.mask = ee->engine.x.mask;
1670 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1672 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1674 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1675 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1679 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1680 ee->engine.x.mask = 0;
1681 einfo->info.mask = 0;
1682 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
1683 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1684 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1687 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
1689 else if (!strcmp(ee->driver, "xrender_x11"))
1691 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
1692 Evas_Engine_Info_XRender_X11 *einfo;
1694 ee->shaped = shaped;
1695 einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
1700 unsigned int foreground;
1703 if (!ee->engine.x.mask)
1704 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1706 gc = ecore_x_gc_new(ee->engine.x.mask,
1707 ECORE_X_GC_VALUE_MASK_FOREGROUND,
1709 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
1710 0, 0, ee->w, ee->h);
1711 ecore_x_gc_free(gc);
1712 einfo->info.mask = ee->engine.x.mask;
1713 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1715 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1717 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1718 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1722 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1723 ee->engine.x.mask = 0;
1724 einfo->info.mask = 0;
1725 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1727 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1729 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1730 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1733 #endif /* BUILD_ECORE_EVAS_XRENDER_X11 || BUILD_ECORE_EVAS_XRENDER_XCB */
1735 else if (!strcmp(ee->driver, "software_16_x11"))
1737 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
1738 # if 0 /* XXX no shaped window support for software_16_x11 */
1739 Evas_Engine_Info_Software_16_X11 *einfo;
1741 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
1742 ee->shaped = shaped;
1750 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1751 einfo->info.mask = ee->engine.x.mask;
1752 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1754 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1756 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1760 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1761 ee->engine.x.mask = 0;
1762 einfo->info.mask = 0;
1763 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1765 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1767 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1770 # endif /* XXX no shaped window support for software_16_x11 */
1771 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
1773 if (!strcmp(ee->driver, "software_8_x11"))
1775 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
1776 Evas_Engine_Info_Software_8_X11 *einfo;
1778 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
1779 ee->shaped = shaped;
1784 unsigned int foreground;
1787 if (!ee->engine.x.mask)
1788 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1790 gc = ecore_x_gc_new(ee->engine.x.mask,
1791 ECORE_X_GC_VALUE_MASK_FOREGROUND,
1793 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
1794 0, 0, ee->w, ee->h);
1795 ecore_x_gc_free(gc);
1796 einfo->info.mask = ee->engine.x.mask;
1797 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1799 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1801 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1802 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1806 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1807 ee->engine.x.mask = 0;
1808 einfo->info.mask = 0;
1809 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
1810 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1811 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1814 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
1818 /* FIXME, round trip */
1820 _ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
1822 # ifdef HAVE_ECORE_X_XCB
1823 xcb_get_geometry_cookie_t cookie_geom;
1824 xcb_get_window_attributes_cookie_t cookie_attr;
1825 xcb_get_geometry_reply_t *reply_geom;
1826 xcb_get_window_attributes_reply_t *reply_attr;
1828 XWindowAttributes att;
1829 #endif /* ! HAVE_ECORE_X_XCB */
1831 if (((ee->alpha) && (alpha)) || ((!ee->alpha) && (!alpha)))
1834 if (!strcmp(ee->driver, "software_x11"))
1836 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
1837 Evas_Engine_Info_Software_X11 *einfo;
1839 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
1842 if (!ecore_x_composite_query()) return;
1846 ecore_x_window_free(ee->prop.window);
1847 ecore_event_window_unregister(ee->prop.window);
1850 if (ee->prop.override)
1851 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);
1853 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);
1854 if (!ee->engine.x.mask)
1855 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
1859 if (ee->prop.override)
1860 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);
1862 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1863 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1864 ee->engine.x.mask = 0;
1865 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1868 einfo->info.destination_alpha = alpha;
1870 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
1871 cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->prop.window);
1872 cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
1874 reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
1875 reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
1876 einfo->info.visual = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
1877 einfo->info.colormap = reply_attr->colormap;
1878 einfo->info.depth = reply_geom->depth;
1882 XGetWindowAttributes(ecore_x_display_get(), ee->prop.window, &att);
1883 einfo->info.visual = att.visual;
1884 einfo->info.colormap = att.colormap;
1885 einfo->info.depth = att.depth;
1886 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
1888 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1889 // ee->engine.x.mask = 0;
1890 einfo->info.mask = ee->engine.x.mask;
1891 einfo->info.drawable = ee->prop.window;
1892 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1894 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1896 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
1897 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1898 ecore_x_input_multi_select(ee->prop.window);
1899 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
1900 if (ee->prop.borderless)
1901 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
1902 if (ee->visible) ecore_x_window_show(ee->prop.window);
1903 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
1906 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
1907 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
1909 ecore_x_icccm_hints_set(ee->prop.window,
1910 1 /* accepts_focus */,
1911 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
1912 0 /* icon_pixmap */,
1914 0 /* icon_window */,
1915 0 /* window_group */,
1917 _ecore_evas_x_protocols_set(ee);
1918 _ecore_evas_x_sync_set(ee);
1919 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
1920 if (getenv("DESKTOP_STARTUP_ID"))
1922 ecore_x_netwm_startup_id_set(ee->prop.window,
1923 getenv("DESKTOP_STARTUP_ID"));
1924 /* NB: on linux this may simply empty the env as opposed to completely
1925 * unset it to being empty - unsure as solartis libc crashes looking
1926 * for the '=' char */
1927 // putenv((char*)"DESKTOP_STARTUP_ID=");
1930 else if (!strcmp(ee->driver, "opengl_x11"))
1932 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
1933 Evas_Engine_Info_GL_X11 *einfo;
1935 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
1938 if (!ecore_x_composite_query()) return;
1942 ecore_x_window_free(ee->prop.window);
1943 ecore_event_window_unregister(ee->prop.window);
1944 ee->prop.window = 0;
1946 einfo->info.destination_alpha = alpha;
1948 if (ee->engine.x.win_root != 0)
1950 /* FIXME: round trip in ecore_x_window_argb_get */
1951 if (ecore_x_window_argb_get(ee->engine.x.win_root))
1953 ee->prop.window = _ecore_evas_x_gl_window_new
1954 (ee, ee->engine.x.win_root,
1955 ee->req.x, ee->req.y, ee->req.w, ee->req.h,
1956 ee->prop.override, 1, NULL);
1959 ee->prop.window = _ecore_evas_x_gl_window_new
1960 (ee, ee->engine.x.win_root,
1961 ee->req.x, ee->req.y, ee->req.w, ee->req.h,
1962 ee->prop.override, ee->alpha, NULL);
1965 ee->prop.window = _ecore_evas_x_gl_window_new
1966 (ee, ee->engine.x.win_root,
1967 ee->req.x, ee->req.y, ee->req.w, ee->req.h,
1968 ee->prop.override, ee->alpha, NULL);
1969 if (!ee->prop.window)
1976 if (ee->prop.override)
1977 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);
1979 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);
1980 if (!ee->engine.x.mask)
1981 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
1985 if (ee->prop.override)
1986 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);
1988 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1989 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1990 ee->engine.x.mask = 0;
1991 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1995 XGetWindowAttributes(ecore_x_display_get(), ee->prop.window, &att);
1996 einfo->info.visual = att.visual;
1997 einfo->info.colormap = att.colormap;
1998 einfo->info.depth = att.depth;
2000 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2001 // ee->engine.x.mask = 0;
2002 // einfo->info.mask = ee->engine.x.mask;
2003 einfo->info.drawable = ee->prop.window;
2004 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2006 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2008 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2009 // ecore_x_window_shape_mask_set(ee->prop.window, 0);
2010 ecore_x_input_multi_select(ee->prop.window);
2011 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
2012 if (ee->prop.borderless)
2013 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2014 if (ee->visible) ecore_x_window_show(ee->prop.window);
2015 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2018 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2019 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2021 ecore_x_icccm_hints_set(ee->prop.window,
2022 1 /* accepts_focus */,
2023 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2024 0 /* icon_pixmap */,
2026 0 /* icon_window */,
2027 0 /* window_group */,
2029 _ecore_evas_x_protocols_set(ee);
2030 _ecore_evas_x_sync_set(ee);
2031 #endif /* BUILD_ECORE_EVAS_OPENGL_X11 */
2032 if (getenv("DESKTOP_STARTUP_ID"))
2034 ecore_x_netwm_startup_id_set(ee->prop.window,
2035 getenv("DESKTOP_STARTUP_ID"));
2036 /* NB: on linux this may simply empty the env as opposed to completely
2037 * unset it to being empty - unsure as solartis libc crashes looking
2038 * for the '=' char */
2039 // putenv((char*)"DESKTOP_STARTUP_ID=");
2042 else if (!strcmp(ee->driver, "xrender_x11"))
2044 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
2045 Evas_Engine_Info_XRender_X11 *einfo;
2047 einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
2049 if (!ecore_x_composite_query()) return;
2053 ecore_x_window_free(ee->prop.window);
2054 ecore_event_window_unregister(ee->prop.window);
2057 if (ee->prop.override)
2058 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);
2060 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);
2061 if (!ee->engine.x.mask)
2062 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2066 if (ee->prop.override)
2067 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);
2069 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2070 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2071 ee->engine.x.mask = 0;
2072 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2075 einfo->info.destination_alpha = alpha;
2077 # ifdef BUILD_ECORE_EVAS_XRENDER_XCB
2078 cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
2079 reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
2081 einfo->info.visual = reply_attr->visual;
2084 XGetWindowAttributes(ecore_x_display_get(), ee->prop.window, &att);
2085 einfo->info.visual = att.visual;
2086 # endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
2088 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2089 // ee->engine.x.mask = 0;
2090 einfo->info.mask = ee->engine.x.mask;
2091 einfo->info.drawable = ee->prop.window;
2092 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2094 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2096 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2097 ecore_x_window_shape_mask_set(ee->prop.window, 0);
2098 ecore_x_input_multi_select(ee->prop.window);
2099 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
2100 if (ee->prop.borderless)
2101 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2102 if (ee->visible) ecore_x_window_show(ee->prop.window);
2103 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2106 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2107 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2109 ecore_x_icccm_hints_set(ee->prop.window,
2110 1 /* accepts_focus */,
2111 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2112 0 /* icon_pixmap */,
2114 0 /* icon_window */,
2115 0 /* window_group */,
2117 _ecore_evas_x_protocols_set(ee);
2118 _ecore_evas_x_sync_set(ee);
2119 #endif /* BUILD_ECORE_EVAS_XRENDER_X11 || BUILD_ECORE_EVAS_XRENDER_XCB */
2120 if (getenv("DESKTOP_STARTUP_ID"))
2122 ecore_x_netwm_startup_id_set(ee->prop.window,
2123 getenv("DESKTOP_STARTUP_ID"));
2124 /* NB: on linux this may simply empty the env as opposed to completely
2125 * unset it to being empty - unsure as solartis libc crashes looking
2126 * for the '=' char */
2127 // putenv((char*)"DESKTOP_STARTUP_ID=");
2130 else if (!strcmp(ee->driver, "software_16_x11"))
2132 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
2133 Evas_Engine_Info_Software_16_X11 *einfo;
2135 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
2140 ecore_x_window_free(ee->prop.window);
2141 ecore_event_window_unregister(ee->prop.window);
2144 if (ee->prop.override)
2145 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);
2147 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);
2148 if (!ee->engine.x.mask)
2149 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2153 if (ee->prop.override)
2154 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);
2156 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2157 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2158 ee->engine.x.mask = 0;
2159 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2162 # if 0 /* XXX no alpha window support for software_16_x11 */
2163 einfo->info.destination_alpha = alpha;
2164 # endif /* XXX no alpha window support for software_16_x11 */
2166 # if 0 /* XXX no shaped window support for software_16_x11 */
2167 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2168 // ee->engine.x.mask = 0;
2169 einfo->info.mask = ee->engine.x.mask;
2170 # endif /* XXX no shaped window support for software_16_x11 */
2172 einfo->info.drawable = ee->prop.window;
2173 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2175 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2177 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2178 ecore_x_window_shape_mask_set(ee->prop.window, 0);
2179 ecore_x_input_multi_select(ee->prop.window);
2180 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
2181 if (ee->prop.borderless)
2182 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2183 if (ee->visible) ecore_x_window_show(ee->prop.window);
2184 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2187 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2188 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2190 ecore_x_icccm_hints_set(ee->prop.window,
2191 1 /* accepts_focus */,
2192 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2193 0 /* icon_pixmap */,
2195 0 /* icon_window */,
2196 0 /* window_group */,
2198 _ecore_evas_x_protocols_set(ee);
2199 _ecore_evas_x_sync_set(ee);
2200 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
2201 if (getenv("DESKTOP_STARTUP_ID"))
2203 ecore_x_netwm_startup_id_set(ee->prop.window,
2204 getenv("DESKTOP_STARTUP_ID"));
2205 /* NB: on linux this may simply empty the env as opposed to completely
2206 * unset it to being empty - unsure as solartis libc crashes looking
2207 * for the '=' char */
2208 // putenv((char*)"DESKTOP_STARTUP_ID=");
2211 else if (!strcmp(ee->driver, "software_8_x11"))
2213 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
2214 Evas_Engine_Info_Software_8_X11 *einfo;
2216 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
2221 ecore_x_window_free(ee->prop.window);
2222 ecore_event_window_unregister(ee->prop.window);
2225 if (ee->prop.override)
2226 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);
2228 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);
2229 if (!ee->engine.x.mask)
2230 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2234 if (ee->prop.override)
2235 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);
2237 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2238 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2239 ee->engine.x.mask = 0;
2240 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2243 einfo->info.destination_alpha = alpha;
2245 cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->prop.window);
2246 cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
2248 reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
2249 reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
2250 einfo->info.visual = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
2251 einfo->info.colormap = reply_attr->colormap;
2252 einfo->info.depth = reply_geom->depth;
2256 // if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2257 // ee->engine.x.mask = 0;
2258 einfo->info.mask = ee->engine.x.mask;
2259 einfo->info.drawable = ee->prop.window;
2260 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2262 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2264 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2265 ecore_x_window_shape_mask_set(ee->prop.window, 0);
2266 ecore_x_input_multi_select(ee->prop.window);
2267 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
2268 if (ee->prop.borderless)
2269 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2270 if (ee->visible) ecore_x_window_show(ee->prop.window);
2271 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2274 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2275 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2277 ecore_x_icccm_hints_set(ee->prop.window,
2278 1 /* accepts_focus */,
2279 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2280 0 /* icon_pixmap */,
2282 0 /* icon_window */,
2283 0 /* window_group */,
2285 _ecore_evas_x_protocols_set(ee);
2286 _ecore_evas_x_sync_set(ee);
2288 if (getenv("DESKTOP_STARTUP_ID"))
2290 ecore_x_netwm_startup_id_set(ee->prop.window,
2291 getenv("DESKTOP_STARTUP_ID"));
2292 /* NB: on linux this may simply empty the env as opposed to completely
2293 * unset it to being empty - unsure as solartis libc crashes looking
2294 * for the '=' char */
2295 // putenv((char*)"DESKTOP_STARTUP_ID=");
2297 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
2302 _ecore_evas_x_transparent_set(Ecore_Evas *ee, int transparent)
2304 if (((ee->transparent) && (transparent)) ||
2305 ((!ee->transparent) && (!transparent)))
2308 if (!strcmp(ee->driver, "software_x11"))
2310 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
2311 Evas_Engine_Info_Software_X11 *einfo;
2313 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2316 ee->transparent = transparent;
2317 einfo->info.destination_alpha = transparent;
2318 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2320 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2322 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2326 #endif /* BUILD_ECORE_EVAS_X11 */
2328 #ifdef BUILD_ECORE_EVAS_X11
2330 _ecore_evas_x_show(Ecore_Evas *ee)
2332 ee->should_be_visible = 1;
2333 if (ee->prop.avoid_damage)
2334 _ecore_evas_x_render(ee);
2335 ecore_x_window_show(ee->prop.window);
2336 if (ee->prop.fullscreen)
2337 ecore_x_window_focus(ee->prop.window);
2341 _ecore_evas_x_hide(Ecore_Evas *ee)
2343 ecore_x_window_hide(ee->prop.window);
2344 ee->should_be_visible = 0;
2348 _ecore_evas_x_raise(Ecore_Evas *ee)
2350 if (!ee->prop.fullscreen)
2351 ecore_x_window_raise(ee->prop.window);
2353 ecore_x_window_raise(ee->prop.window);
2357 _ecore_evas_x_lower(Ecore_Evas *ee)
2359 if (!ee->prop.fullscreen)
2360 ecore_x_window_lower(ee->prop.window);
2362 ecore_x_window_lower(ee->prop.window);
2366 _ecore_evas_x_activate(Ecore_Evas *ee)
2368 ecore_x_netwm_client_active_request(ee->engine.x.win_root,
2369 ee->prop.window, 2, 0);
2373 _ecore_evas_x_title_set(Ecore_Evas *ee, const char *t)
2375 if (ee->prop.title) free(ee->prop.title);
2376 ee->prop.title = NULL;
2377 if (t) ee->prop.title = strdup(t);
2378 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2379 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2383 _ecore_evas_x_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
2385 if (ee->prop.name) free(ee->prop.name);
2386 if (ee->prop.clas) free(ee->prop.clas);
2387 ee->prop.name = NULL;
2388 ee->prop.clas = NULL;
2389 if (n) ee->prop.name = strdup(n);
2390 if (c) ee->prop.clas = strdup(c);
2391 ecore_x_icccm_name_class_set(ee->prop.window, ee->prop.name, ee->prop.clas);
2395 _ecore_evas_x_size_min_set(Ecore_Evas *ee, int w, int h)
2399 if ((ee->prop.min.w == w) && (ee->prop.min.h == h)) return;
2402 _ecore_evas_x_size_pos_hints_update(ee);
2406 _ecore_evas_x_size_max_set(Ecore_Evas *ee, int w, int h)
2410 if ((ee->prop.max.w == w) && (ee->prop.max.h == h)) return;
2413 _ecore_evas_x_size_pos_hints_update(ee);
2417 _ecore_evas_x_size_base_set(Ecore_Evas *ee, int w, int h)
2421 if ((ee->prop.base.w == w) && (ee->prop.base.h == h)) return;
2422 ee->prop.base.w = w;
2423 ee->prop.base.h = h;
2424 _ecore_evas_x_size_pos_hints_update(ee);
2428 _ecore_evas_x_size_step_set(Ecore_Evas *ee, int w, int h)
2432 if ((ee->prop.step.w == w) && (ee->prop.step.h == h)) return;
2433 ee->prop.step.w = w;
2434 ee->prop.step.h = h;
2435 _ecore_evas_x_size_pos_hints_update(ee);
2439 _ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2445 ee->prop.cursor.object = NULL;
2449 _ecore_evas_x_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
2453 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
2457 ee->prop.cursor.object = NULL;
2458 ee->prop.cursor.layer = 0;
2459 ee->prop.cursor.hot.x = 0;
2460 ee->prop.cursor.hot.y = 0;
2461 ecore_x_window_cursor_show(ee->prop.window, 1);
2465 ee->prop.cursor.object = obj;
2466 ee->prop.cursor.layer = layer;
2467 ee->prop.cursor.hot.x = hot_x;
2468 ee->prop.cursor.hot.y = hot_y;
2470 ecore_x_window_cursor_show(ee->prop.window, 0);
2472 evas_pointer_output_xy_get(ee->evas, &x, &y);
2473 evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
2474 evas_object_move(ee->prop.cursor.object,
2475 x - ee->prop.cursor.hot.x,
2476 y - ee->prop.cursor.hot.y);
2477 evas_object_pass_events_set(ee->prop.cursor.object, 1);
2478 if (evas_pointer_inside_get(ee->evas))
2479 evas_object_show(ee->prop.cursor.object);
2481 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
2486 * @param layer If < 3, @a ee will be put below all other windows.
2487 * If > 5, @a ee will be "always-on-top"
2488 * If = 4, @a ee will be put in the default layer.
2489 * Acceptable values range from 1 to 255 (0 reserved for
2493 _ecore_evas_x_layer_set(Ecore_Evas *ee, int layer)
2495 if (ee->prop.layer == layer) return;
2497 /* FIXME: Should this logic be here? */
2500 else if (layer > 255)
2503 ee->prop.layer = layer;
2504 _ecore_evas_x_layer_update(ee);
2508 _ecore_evas_x_focus_set(Ecore_Evas *ee, int on __UNUSED__)
2510 ecore_x_window_focus(ee->prop.window);
2514 _ecore_evas_x_iconified_set(Ecore_Evas *ee, int on)
2516 // if (((ee->prop.iconified) && (on)) ||
2517 // ((!ee->prop.iconified) && (!on))) return;
2518 ee->prop.iconified = on;
2521 ecore_x_icccm_hints_set(ee->prop.window,
2522 1 /* accepts_focus */,
2523 ECORE_X_WINDOW_STATE_HINT_ICONIC /* initial_state */,
2524 0 /* icon_pixmap */,
2526 0 /* icon_window */,
2527 0 /* window_group */,
2529 ecore_x_icccm_iconic_request_send(ee->prop.window, ee->engine.x.win_root);
2533 ecore_x_icccm_hints_set(ee->prop.window,
2534 1 /* accepts_focus */,
2535 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2536 0 /* icon_pixmap */,
2538 0 /* icon_window */,
2539 0 /* window_group */,
2541 ecore_evas_show(ee);
2546 _ecore_evas_x_borderless_set(Ecore_Evas *ee, int on)
2548 if (((ee->prop.borderless) && (on)) ||
2549 ((!ee->prop.borderless) && (!on))) return;
2550 ee->prop.borderless = on;
2551 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2554 /* FIXME: This function changes the initial state of the ee
2555 * whilest the iconic function changes the current state! */
2557 _ecore_evas_x_withdrawn_set(Ecore_Evas *ee, int withdrawn)
2559 Ecore_X_Window_State_Hint hint;
2561 if ((ee->prop.withdrawn && withdrawn) ||
2562 (!ee->prop.withdrawn && !withdrawn)) return;
2564 ee->prop.withdrawn = withdrawn;
2566 hint = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
2568 hint = ECORE_X_WINDOW_STATE_HINT_NORMAL;
2570 ecore_x_icccm_hints_set(ee->prop.window,
2571 1 /* accepts_focus */,
2572 hint /* initial_state */,
2573 0 /* icon_pixmap */,
2575 0 /* icon_window */,
2576 0 /* window_group */,
2581 _ecore_evas_x_sticky_set(Ecore_Evas *ee, int sticky)
2583 if ((ee->prop.sticky && sticky) ||
2584 (!ee->prop.sticky && !sticky)) return;
2586 /* We dont want to set prop.sticky here as it will cause
2587 * the sticky callback not to get called. Its set on the
2588 * property change event.
2589 * ee->prop.sticky = sticky;
2591 ee->engine.x.state.sticky = sticky;
2592 if (ee->should_be_visible)
2593 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2594 ECORE_X_WINDOW_STATE_STICKY, -1, sticky);
2596 _ecore_evas_x_state_update(ee);
2600 _ecore_evas_x_ignore_events_set(Ecore_Evas *ee, int ignore)
2602 if ((ee->ignore_events && ignore) ||
2603 (!ee->ignore_events && !ignore)) return;
2607 ee->ignore_events = 1;
2608 if (ee->prop.window)
2609 ecore_x_window_ignore_set(ee->prop.window, 1);
2613 ee->ignore_events = 0;
2614 if (ee->prop.window)
2615 ecore_x_window_ignore_set(ee->prop.window, 0);
2621 _ecore_evas_x_reinit_win(Ecore_Evas *ee)
2623 if (!strcmp(ee->driver, "software_x11"))
2625 #ifdef BUILD_ECORE_EVAS_X11
2626 Evas_Engine_Info_Software_X11 *einfo;
2628 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2631 einfo->info.drawable = ee->prop.window;
2632 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
2636 else if (!strcmp(ee->driver, "xrender_x11"))
2638 #ifdef BUILD_ECORE_EVAS_XRENDER_X11
2639 Evas_Engine_Info_XRender_X11 *einfo;
2641 einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
2644 einfo->info.drawable = ee->prop.window;
2645 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
2649 else if (!strcmp(ee->driver, "opengl_x11"))
2651 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
2652 Evas_Engine_Info_GL_X11 *einfo;
2654 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
2657 einfo->info.drawable = ee->prop.window;
2658 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
2666 _ecore_evas_x_override_set(Ecore_Evas *ee, int on)
2668 if (((ee->prop.override) && (on)) ||
2669 ((!ee->prop.override) && (!on))) return;
2670 ecore_x_window_hide(ee->prop.window);
2671 ecore_x_window_override_set(ee->prop.window, on);
2672 if (ee->visible) ecore_x_window_show(ee->prop.window);
2673 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2674 ee->prop.override = on;
2678 _ecore_evas_x_fullscreen_set(Ecore_Evas *ee, int on)
2680 if ((ee->prop.fullscreen && on) ||
2681 (!ee->prop.fullscreen && !on)) return;
2683 /* FIXME: Detect if WM is EWMH compliant and handle properly if not,
2684 * i.e. reposition, resize, and change borderless hint */
2685 ee->engine.x.state.fullscreen = on;
2686 if (ee->should_be_visible)
2687 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2688 ECORE_X_WINDOW_STATE_FULLSCREEN, -1, on);
2690 _ecore_evas_x_state_update(ee);
2694 _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on)
2696 if (ee->prop.avoid_damage == on) return;
2697 if (!strcmp(ee->driver, "opengl_x11")) return;
2698 if (!strcmp(ee->driver, "xrender_x11")) return;
2700 if (!strcmp(ee->driver, "software_x11"))
2702 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
2703 Evas_Engine_Info_Software_X11 *einfo;
2705 ee->prop.avoid_damage = on;
2706 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2709 if (ee->prop.avoid_damage)
2711 ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth);
2712 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2713 einfo->info.drawable = ee->engine.x.pmap;
2714 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2716 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2718 if ((ee->rotation == 90) || (ee->rotation == 270))
2719 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2721 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2722 if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN)
2724 ee->engine.x.using_bg_pixmap = 1;
2725 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2726 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2728 if (ee->engine.x.direct_resize)
2730 /* Turn this off for now
2731 ee->engine.x.using_bg_pixmap = 1;
2732 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2738 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2739 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2740 if (ee->engine.x.using_bg_pixmap)
2742 ecore_x_window_pixmap_set(ee->prop.window, 0);
2743 ee->engine.x.using_bg_pixmap = 0;
2744 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2746 ee->engine.x.pmap = 0;
2747 ee->engine.x.gc = 0;
2748 einfo->info.drawable = ee->prop.window;
2749 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2751 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2755 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
2757 else if (!strcmp(ee->driver, "software_16_x11"))
2759 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
2760 Evas_Engine_Info_Software_16_X11 *einfo;
2761 ee->prop.avoid_damage = on;
2763 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
2766 if (ee->prop.avoid_damage)
2768 ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 16);
2769 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2770 einfo->info.drawable = ee->engine.x.pmap;
2771 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2773 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2775 if ((ee->rotation == 90) || (ee->rotation == 270))
2776 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2778 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2779 if (ee->engine.x.direct_resize)
2781 /* Turn this off for now
2782 ee->engine.x.using_bg_pixmap = 1;
2783 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2789 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2790 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2791 if (ee->engine.x.using_bg_pixmap)
2793 ecore_x_window_pixmap_set(ee->prop.window, 0);
2794 ee->engine.x.using_bg_pixmap = 0;
2796 ee->engine.x.pmap = 0;
2797 ee->engine.x.gc = 0;
2798 einfo->info.drawable = ee->prop.window;
2799 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2801 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2805 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
2807 else if (!strcmp(ee->driver, "software_8_x11"))
2809 #if BUILD_ECORE_EVAS_SOFTWARE_8_X11
2810 Evas_Engine_Info_Software_8_X11 *einfo;
2812 ee->prop.avoid_damage = on;
2813 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
2816 if (ee->prop.avoid_damage)
2818 ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth);
2819 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2820 einfo->info.drawable = ee->engine.x.pmap;
2821 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2823 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2825 if ((ee->rotation == 90) || (ee->rotation == 270))
2826 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2828 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2829 if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN)
2831 ee->engine.x.using_bg_pixmap = 1;
2832 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2833 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2835 if (ee->engine.x.direct_resize)
2837 /* Turn this off for now
2838 ee->engine.x.using_bg_pixmap = 1;
2839 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2845 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2846 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2847 if (ee->engine.x.using_bg_pixmap)
2849 ecore_x_window_pixmap_set(ee->prop.window, 0);
2850 ee->engine.x.using_bg_pixmap = 0;
2851 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2853 ee->engine.x.pmap = 0;
2854 ee->engine.x.gc = 0;
2855 einfo->info.drawable = ee->prop.window;
2856 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2858 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2862 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
2867 _ecore_evas_x_shutdown(void)
2869 _ecore_evas_init_count--;
2870 if (_ecore_evas_init_count == 0)
2874 for (i = 0; i < sizeof(ecore_evas_event_handlers) / sizeof(Ecore_Event_Handler*); i++)
2876 if (ecore_evas_event_handlers[i])
2877 ecore_event_handler_del(ecore_evas_event_handlers[i]);
2879 ecore_event_evas_shutdown();
2881 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
2882 return _ecore_evas_init_count;
2885 static Ecore_Evas_Engine_Func _ecore_x_engine_func =
2892 _ecore_evas_x_callback_delete_request_set,
2903 _ecore_evas_x_managed_move,
2904 _ecore_evas_x_resize,
2905 _ecore_evas_x_move_resize,
2906 _ecore_evas_x_rotation_set,
2907 _ecore_evas_x_shaped_set,
2910 _ecore_evas_x_raise,
2911 _ecore_evas_x_lower,
2912 _ecore_evas_x_activate,
2913 _ecore_evas_x_title_set,
2914 _ecore_evas_x_name_class_set,
2915 _ecore_evas_x_size_min_set,
2916 _ecore_evas_x_size_max_set,
2917 _ecore_evas_x_size_base_set,
2918 _ecore_evas_x_size_step_set,
2919 _ecore_evas_x_object_cursor_set,
2920 _ecore_evas_x_layer_set,
2921 _ecore_evas_x_focus_set,
2922 _ecore_evas_x_iconified_set,
2923 _ecore_evas_x_borderless_set,
2924 _ecore_evas_x_override_set,
2926 _ecore_evas_x_fullscreen_set,
2927 _ecore_evas_x_avoid_damage_set,
2928 _ecore_evas_x_withdrawn_set,
2929 _ecore_evas_x_sticky_set,
2930 _ecore_evas_x_ignore_events_set,
2931 _ecore_evas_x_alpha_set,
2932 _ecore_evas_x_transparent_set,
2936 #endif /* BUILD_ECORE_EVAS_X11 */
2939 * FIXME: there are some round trips. Especially, we can split
2940 * ecore_x_init in 2 functions and supress some round trips.
2943 #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)
2945 _ecore_evas_x_flush_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
2947 Ecore_Evas *ee = data;
2949 if (ee->no_comp_sync) return;
2950 if (!_ecore_evas_app_comp_sync) return;
2951 if (ee->engine.x.sync_counter)
2953 if (ee->engine.x.sync_began)
2955 ee->engine.x.sync_val++;
2956 if (!ee->engine.x.sync_cancel)
2958 ecore_x_sync_counter_val_wait(ee->engine.x.sync_counter,
2959 ee->engine.x.sync_val);
2966 _ecore_evas_x_flush_post(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
2968 Ecore_Evas *ee = data;
2970 if (ee->no_comp_sync) return;
2971 if (!_ecore_evas_app_comp_sync) return;
2972 if (ee->engine.x.sync_counter)
2974 if (ee->engine.x.sync_began)
2976 if (!ee->engine.x.sync_cancel)
2978 ecore_x_e_comp_sync_draw_done_send(ee->engine.x.win_root,
2989 * FIXME: To be fixed.
2991 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
2993 ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent,
2994 int x, int y, int w, int h)
2996 Evas_Engine_Info_Software_X11 *einfo;
3000 static int redraw_debug = -1;
3002 rmethod = evas_render_method_lookup("software_x11");
3003 if (!rmethod) return NULL;
3004 if (!ecore_x_init(disp_name)) return NULL;
3005 ee = calloc(1, sizeof(Ecore_Evas));
3006 if (!ee) return NULL;
3008 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3010 _ecore_evas_x_init();
3012 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3014 ee->driver = "software_x11";
3015 if (disp_name) ee->name = strdup(disp_name);
3028 ee->prop.max.w = 32767;
3029 ee->prop.max.h = 32767;
3031 ee->prop.request_pos = 0;
3032 ee->prop.sticky = 0;
3033 ee->engine.x.state.sticky = 0;
3035 /* init evas here */
3036 ee->evas = evas_new();
3037 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3038 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3039 evas_data_attach_set(ee->evas, ee);
3040 evas_output_method_set(ee->evas, rmethod);
3041 evas_output_size_set(ee->evas, w, h);
3042 evas_output_viewport_set(ee->evas, 0, 0, w, h);
3044 ee->engine.x.win_root = parent;
3045 ee->engine.x.screen_num = 0;
3049 ee->engine.x.screen_num = 1; /* FIXME: get real scren # */
3050 /* FIXME: round trip in ecore_x_window_argb_get */
3051 if (ecore_x_window_argb_get(parent))
3053 ee->prop.window = ecore_x_window_argb_new(parent, x, y, w, h);
3057 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3060 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3061 if (getenv("DESKTOP_STARTUP_ID"))
3063 ecore_x_netwm_startup_id_set(ee->prop.window,
3064 getenv("DESKTOP_STARTUP_ID"));
3065 /* NB: on linux this may simply empty the env as opposed to completely
3066 * unset it to being empty - unsure as solartis libc crashes looking
3067 * for the '=' char */
3068 // putenv((char*)"DESKTOP_STARTUP_ID=");
3070 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
3073 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3074 xcb_screen_iterator_t iter;
3075 xcb_screen_t *screen;
3078 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
3080 /* FIXME: this is inefficient as its a round trip */
3081 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3082 screen = ecore_x_default_screen_get();
3083 iter = xcb_setup_roots_iterator (xcb_get_setup (ecore_x_connection_get()));
3086 xcb_get_geometry_cookie_t cookie;
3087 xcb_get_geometry_reply_t *reply;
3088 Ecore_X_Window *roots;
3093 cookie = xcb_get_geometry_unchecked(ecore_x_connection_get(), parent);
3094 roots = ecore_x_window_root_list(&num);
3097 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
3101 for (i = 0; i < num; xcb_screen_next (&iter), i++)
3103 if (reply->root == roots[i])
3115 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
3116 if (reply) free(reply);
3120 screen = DefaultScreen(ecore_x_display_get());
3121 if (ScreenCount(ecore_x_display_get()) > 1)
3123 Ecore_X_Window *roots;
3127 roots = ecore_x_window_root_list(&num);
3130 XWindowAttributes at;
3132 if (XGetWindowAttributes(ecore_x_display_get(),
3135 for (i = 0; i < num; i++)
3137 if (at.root == roots[i])
3147 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
3149 if (redraw_debug < 0)
3151 if (getenv("REDRAW_DEBUG"))
3152 redraw_debug = atoi(getenv("REDRAW_DEBUG"));
3156 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3157 einfo->info.backend = EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB;
3158 einfo->info.connection = ecore_x_connection_get();
3159 einfo->info.screen = screen;
3161 einfo->info.backend = EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB;
3162 einfo->info.connection = ecore_x_display_get();
3163 einfo->info.screen = NULL;
3164 #ifdef EVAS_FRAME_QUEUING
3167 render_mode = getenv("EVAS_RENDER_MODE");
3168 if (render_mode && !strcmp(render_mode, "non-blocking"))
3170 einfo->render_mode = EVAS_RENDER_MODE_NONBLOCKING;
3175 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
3176 einfo->info.drawable = ee->prop.window;
3179 /* FIXME: round trip */
3180 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3181 xcb_get_geometry_cookie_t cookie_geom;
3182 xcb_get_window_attributes_cookie_t cookie_attr;
3183 xcb_get_geometry_reply_t *reply_geom;
3184 xcb_get_window_attributes_reply_t *reply_attr;
3186 cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->prop.window);
3187 cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
3189 reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
3190 reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
3191 if (reply_attr && reply_geom)
3193 einfo->info.visual = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
3194 einfo->info.colormap = reply_attr->colormap;
3195 einfo->info.depth = reply_geom->depth;
3196 einfo->info.destination_alpha = 1;
3201 XWindowAttributes at;
3203 if (XGetWindowAttributes(ecore_x_display_get(), ee->prop.window,
3206 einfo->info.visual = at.visual;
3207 einfo->info.colormap = at.colormap;
3208 einfo->info.depth = at.depth;
3209 einfo->info.destination_alpha = 1;
3211 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
3215 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3216 xcb_screen_t *screen;
3218 screen = ecore_x_default_screen_get();
3219 einfo->info.visual = xcb_visualtype_get(screen, screen->root_visual);
3220 einfo->info.colormap = screen->default_colormap;
3221 einfo->info.depth = screen->root_depth;
3223 einfo->info.visual = DefaultVisual(ecore_x_display_get(), screen);
3224 einfo->info.colormap = DefaultColormap(ecore_x_display_get(), screen);
3225 einfo->info.depth = DefaultDepth(ecore_x_display_get(), screen);
3226 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
3227 einfo->info.destination_alpha = 0;
3229 einfo->info.rotation = 0;
3230 einfo->info.debug = redraw_debug;
3231 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3233 WRN("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3234 ecore_evas_free(ee);
3238 ecore_x_icccm_hints_set(ee->prop.window,
3239 1 /* accepts_focus */,
3240 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
3241 0 /* icon_pixmap */,
3243 0 /* icon_window */,
3244 0 /* window_group */,
3247 ee->engine.func->fn_render = _ecore_evas_x_render;
3248 _ecore_evas_register(ee);
3249 ecore_x_input_multi_select(ee->prop.window);
3250 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
3255 ecore_evas_software_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3256 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3265 * FIXME: To be fixed.
3267 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3269 ecore_evas_software_x11_window_get(const Ecore_Evas *ee)
3271 return (Ecore_X_Window) ecore_evas_window_get(ee);
3275 ecore_evas_software_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3284 * FIXME: To be fixed.
3286 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3288 ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, int on)
3290 ee->engine.x.direct_resize = on;
3291 if (ee->prop.avoid_damage)
3293 if (ee->engine.x.direct_resize)
3295 /* turn this off for now
3296 ee->engine.x.using_bg_pixmap = 1;
3297 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
3302 /* turn this off too- bg pixmap is controlled by avoid damage directly
3303 ee->engine.x.using_bg_pixmap = 0;
3304 ecore_x_window_pixmap_set(ee->prop.window, 0);
3305 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
3312 ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, int on __UNUSED__)
3320 * FIXME: To be fixed.
3322 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3324 ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee)
3326 return ee->engine.x.direct_resize;
3330 ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3339 * FIXME: To be fixed.
3341 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3343 ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3345 Ecore_X_Window *winp;
3347 winp = malloc(sizeof(Ecore_X_Window));
3351 ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
3352 ecore_x_input_multi_select(win);
3353 ecore_event_window_register(win, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
3358 ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3366 * FIXME: To be fixed.
3368 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3370 ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent,
3371 int x, int y, int w, int h)
3373 return ecore_evas_gl_x11_options_new(disp_name, parent, x, y, w, h, NULL);
3376 ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent,
3377 int x, int y, int w, int h, const int *opt)
3379 # ifdef HAVE_ECORE_X_XCB
3380 Ecore_Evas *ee = NULL;
3385 rmethod = evas_render_method_lookup("gl_x11");
3386 if (!rmethod) return NULL;
3387 if (!ecore_x_init(disp_name)) return NULL;
3388 ee = calloc(1, sizeof(Ecore_Evas));
3389 if (!ee) return NULL;
3391 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3393 _ecore_evas_x_init();
3395 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3397 ee->driver = "opengl_x11";
3398 if (disp_name) ee->name = strdup(disp_name);
3411 ee->prop.max.w = 32767;
3412 ee->prop.max.h = 32767;
3414 ee->prop.request_pos = 0;
3415 ee->prop.sticky = 0;
3416 ee->engine.x.state.sticky = 0;
3418 /* init evas here */
3419 ee->evas = evas_new();
3420 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3421 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3422 evas_data_attach_set(ee->evas, ee);
3423 evas_output_method_set(ee->evas, rmethod);
3424 evas_output_size_set(ee->evas, w, h);
3425 evas_output_viewport_set(ee->evas, 0, 0, w, h);
3427 if (parent == 0) parent = DefaultRootWindow(ecore_x_display_get());
3428 ee->engine.x.win_root = parent;
3430 if (ee->engine.x.win_root != 0)
3432 ee->engine.x.screen_num = 1; /* FIXME: get real scren # */
3433 /* FIXME: round trip in ecore_x_window_argb_get */
3434 if (ecore_x_window_argb_get(ee->engine.x.win_root))
3436 ee->prop.window = _ecore_evas_x_gl_window_new
3437 (ee, ee->engine.x.win_root, x, y, w, h, 0, 1, opt);
3440 ee->prop.window = _ecore_evas_x_gl_window_new
3441 (ee, ee->engine.x.win_root, x, y, w, h, 0, 0, opt);
3444 ee->prop.window = _ecore_evas_x_gl_window_new
3445 (ee, ee->engine.x.win_root, x, y, w, h, 0, 0, opt);
3446 if (!ee->prop.window)
3448 ecore_evas_free(ee);
3451 if (getenv("DESKTOP_STARTUP_ID"))
3453 ecore_x_netwm_startup_id_set(ee->prop.window,
3454 getenv("DESKTOP_STARTUP_ID"));
3455 /* NB: on linux this may simply empty the env as opposed to completely
3456 * unset it to being empty - unsure as solartis libc crashes looking
3457 * for the '=' char */
3458 // putenv((char*)"DESKTOP_STARTUP_ID=");
3461 ecore_x_icccm_hints_set(ee->prop.window,
3462 1 /* accepts_focus */,
3463 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
3464 0 /* icon_pixmap */,
3466 0 /* icon_window */,
3467 0 /* window_group */,
3470 ee->engine.func->fn_render = _ecore_evas_x_render;
3471 _ecore_evas_register(ee);
3472 ecore_x_input_multi_select(ee->prop.window);
3473 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
3474 # endif /* HAVE_ECORE_X_XCB */
3480 ecore_evas_gl_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3481 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3486 ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent,
3487 int x, int y, int w, int h, const int *opt)
3491 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3496 * FIXME: To be fixed.
3498 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3500 ecore_evas_gl_x11_window_get(const Ecore_Evas *ee)
3502 return (Ecore_X_Window) ecore_evas_window_get(ee);
3506 ecore_evas_gl_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3510 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3515 * FIXME: To be fixed.
3517 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3519 ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, int on)
3521 ee->engine.x.direct_resize = on;
3525 ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, int on __UNUSED__)
3528 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3533 * FIXME: To be fixed.
3535 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3537 ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee)
3539 return ee->engine.x.direct_resize;
3543 ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3547 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3552 * FIXME: To be fixed.
3554 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3556 ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3558 ecore_evas_software_x11_extra_event_window_add(ee, win);
3562 ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3565 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3570 * FIXME: To be fixed.
3572 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3574 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))
3576 Evas_Engine_Info_GL_X11 *einfo;
3578 if (!(!strcmp(ee->driver, "opengl_x11"))) return;
3580 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
3583 einfo->callback.pre_swap = pre_cb;
3584 einfo->callback.pre_swap = post_cb;
3585 einfo->callback.data = data;
3586 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3588 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
3594 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))
3598 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3603 * @param no_swap If = 1, ee doesn't perform swap buffer.
3604 * If = 0, ee performs swap buffer.
3606 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3608 ecore_evas_gl_x11_no_swap_set(const Ecore_Evas *ee, Eina_Bool no_swap)
3610 Evas_Engine_Info_GL_X11 *einfo;
3611 if (!(!strcmp(ee->driver, "opengl_x11"))) return;
3612 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
3615 einfo->no_swap = no_swap;
3616 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3618 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
3624 ecore_evas_gl_x11_no_swap_set(const Ecore_Evas *ee, Eina_Bool no_swap)
3628 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3633 * FIXME: To be fixed.
3635 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
3637 ecore_evas_xrender_x11_new(const char *disp_name, Ecore_X_Window parent,
3638 int x, int y, int w, int h)
3640 Evas_Engine_Info_XRender_X11 *einfo;
3644 rmethod = evas_render_method_lookup("xrender_x11");
3645 if (!rmethod) return NULL;
3646 if (!ecore_x_init(disp_name)) return NULL;
3647 ee = calloc(1, sizeof(Ecore_Evas));
3648 if (!ee) return NULL;
3650 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3652 _ecore_evas_x_init();
3654 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3656 ee->driver = "xrender_x11";
3657 if (disp_name) ee->name = strdup(disp_name);
3670 ee->prop.max.w = 32767;
3671 ee->prop.max.h = 32767;
3673 ee->prop.request_pos = 0;
3674 ee->prop.sticky = 0;
3675 ee->engine.x.state.sticky = 0;
3677 /* init evas here */
3678 ee->evas = evas_new();
3679 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3680 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3681 evas_data_attach_set(ee->evas, ee);
3682 evas_output_method_set(ee->evas, rmethod);
3683 evas_output_size_set(ee->evas, w, h);
3684 evas_output_viewport_set(ee->evas, 0, 0, w, h);
3686 ee->engine.x.win_root = parent;
3687 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3688 if (getenv("DESKTOP_STARTUP_ID"))
3690 ecore_x_netwm_startup_id_set(ee->prop.window,
3691 getenv("DESKTOP_STARTUP_ID"));
3692 /* NB: on linux this may simply empty the env as opposed to completely
3693 * unset it to being empty - unsure as solartis libc crashes looking
3694 * for the '=' char */
3695 // putenv((char*)"DESKTOP_STARTUP_ID=");
3697 einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
3700 # ifdef BUILD_ECORE_EVAS_XRENDER_XCB
3701 xcb_screen_iterator_t iter;
3702 xcb_screen_t *screen;
3704 /* FIXME: this is inefficient as its a round trip */
3705 screen = ecore_x_default_screen_get();
3706 iter = xcb_setup_roots_iterator (xcb_get_setup (ecore_x_connection_get()));
3709 xcb_get_geometry_cookie_t cookie;
3710 xcb_get_geometry_reply_t *reply;
3711 Ecore_X_Window *roots;
3716 cookie = xcb_get_geometry_unchecked(ecore_x_connection_get(), parent);
3717 roots = ecore_x_window_root_list(&num);
3720 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
3724 for (i = 0; i < num; xcb_screen_next (&iter), i++)
3726 if (reply->root == roots[i])
3738 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
3739 if (reply) free(reply);
3742 einfo->info.backend = EVAS_ENGINE_INFO_XRENDER_BACKEND_XCB;
3743 einfo->info.connection = ecore_x_connection_get();
3744 einfo->info.screen = screen;
3745 einfo->info.visual = screen->root_visual;
3746 # elif BUILD_ECORE_EVAS_XRENDER_X11
3749 /* FIXME: this is inefficient as its a round trip */
3750 screen = DefaultScreen(ecore_x_display_get());
3751 if (ScreenCount(ecore_x_display_get()) > 1)
3753 Ecore_X_Window *roots;
3757 roots = ecore_x_window_root_list(&num);
3760 XWindowAttributes at;
3762 if (XGetWindowAttributes(ecore_x_display_get(),
3765 for (i = 0; i < num; i++)
3767 if (at.root == roots[i])
3777 einfo->info.backend = EVAS_ENGINE_INFO_XRENDER_BACKEND_XLIB;
3778 einfo->info.connection = ecore_x_display_get();
3779 einfo->info.screen = NULL;
3780 einfo->info.visual = DefaultVisual(ecore_x_display_get(), screen);
3781 # endif /* BUILD_ECORE_EVAS_XRENDER_(XCB|X11) */
3782 einfo->info.drawable = ee->prop.window;
3783 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3785 WRN("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3786 ecore_evas_free(ee);
3791 ecore_x_icccm_hints_set(ee->prop.window,
3792 1 /* accepts_focus */,
3793 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
3794 0 /* icon_pixmap */,
3796 0 /* icon_window */,
3797 0 /* window_group */,
3800 ee->engine.func->fn_render = _ecore_evas_x_render;
3801 _ecore_evas_register(ee);
3802 ecore_x_input_multi_select(ee->prop.window);
3803 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
3808 ecore_evas_xrender_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3809 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3813 #endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
3818 * FIXME: To be fixed.
3820 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
3822 ecore_evas_xrender_x11_window_get(const Ecore_Evas *ee)
3824 return (Ecore_X_Window) ecore_evas_window_get(ee);
3828 ecore_evas_xrender_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3832 #endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
3837 * FIXME: To be fixed.
3839 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
3841 ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee, int on)
3843 ee->engine.x.direct_resize = on;
3847 ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, int on __UNUSED__)
3850 #endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
3855 * FIXME: To be fixed.
3857 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
3859 ecore_evas_xrender_x11_direct_resize_get(const Ecore_Evas *ee)
3861 return ee->engine.x.direct_resize;
3865 ecore_evas_xrender_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3869 #endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
3874 * FIXME: To be fixed.
3876 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
3878 ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3880 ecore_evas_software_x11_extra_event_window_add(ee, win);
3884 ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3887 #endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
3892 * FIXME: To be fixed.
3894 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3896 ecore_evas_software_x11_16_new(const char *disp_name, Ecore_X_Window parent,
3897 int x, int y, int w, int h)
3899 Evas_Engine_Info_Software_16_X11 *einfo;
3902 static int redraw_debug = -1;
3904 rmethod = evas_render_method_lookup("software_16_x11");
3905 if (!rmethod) return NULL;
3906 if (!ecore_x_init(disp_name)) return NULL;
3907 ee = calloc(1, sizeof(Ecore_Evas));
3908 if (!ee) return NULL;
3910 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3912 _ecore_evas_x_init();
3914 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3916 ee->driver = "software_16_x11";
3917 if (disp_name) ee->name = strdup(disp_name);
3930 ee->prop.max.w = 32767;
3931 ee->prop.max.h = 32767;
3933 ee->prop.request_pos = 0;
3934 ee->prop.sticky = 0;
3935 ee->engine.x.state.sticky = 0;
3937 /* init evas here */
3938 ee->evas = evas_new();
3939 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3940 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3941 evas_data_attach_set(ee->evas, ee);
3942 evas_output_method_set(ee->evas, rmethod);
3943 evas_output_size_set(ee->evas, w, h);
3944 evas_output_viewport_set(ee->evas, 0, 0, w, h);
3946 ee->engine.x.win_root = parent;
3949 /* FIXME: round trip in ecore_x_window_argb_get */
3950 if (ecore_x_window_argb_get(parent))
3952 ee->prop.window = ecore_x_window_argb_new(parent, x, y, w, h);
3955 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3958 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3959 if (getenv("DESKTOP_STARTUP_ID"))
3961 ecore_x_netwm_startup_id_set(ee->prop.window,
3962 getenv("DESKTOP_STARTUP_ID"));
3963 /* NB: on linux this may simply empty the env as opposed to completely
3964 * unset it to being empty - unsure as solartis libc crashes looking
3965 * for the '=' char */
3966 // putenv((char*)"DESKTOP_STARTUP_ID=");
3968 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
3972 if (ScreenCount(ecore_x_display_get()) > 1)
3974 Ecore_X_Window *roots;
3978 roots = ecore_x_window_root_list(&num);
3981 XWindowAttributes at;
3983 if (XGetWindowAttributes(ecore_x_display_get(),
3986 for (i = 0; i < num; i++)
3988 if (at.root == roots[i])
3996 if (redraw_debug < 0)
3998 if (getenv("REDRAW_DEBUG"))
3999 redraw_debug = atoi(getenv("REDRAW_DEBUG"));
4003 einfo->info.display = ecore_x_display_get();
4004 einfo->info.drawable = ee->prop.window;
4006 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
4008 WRN("evas_engine_info_set() init engine '%s' failed.", ee->driver);
4009 ecore_evas_free(ee);
4014 ecore_x_icccm_hints_set(ee->prop.window,
4015 1 /* accepts_focus */,
4016 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
4017 0 /* icon_pixmap */,
4019 0 /* icon_window */,
4020 0 /* window_group */,
4023 ee->engine.func->fn_render = _ecore_evas_x_render;
4024 _ecore_evas_register(ee);
4025 ecore_x_input_multi_select(ee->prop.window);
4026 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
4031 ecore_evas_software_x11_16_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
4032 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
4036 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
4041 * FIXME: To be fixed.
4043 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
4045 ecore_evas_software_x11_16_window_get(const Ecore_Evas *ee)
4047 return (Ecore_X_Window) ecore_evas_window_get(ee);
4051 ecore_evas_software_x11_16_window_get(const Ecore_Evas *ee __UNUSED__)
4055 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
4060 * FIXME: To be fixed.
4062 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
4064 ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee, int on)
4066 ee->engine.x.direct_resize = on;
4067 if (ee->prop.avoid_damage)
4069 if (ee->engine.x.direct_resize)
4071 /* turn this off for now
4072 ee->engine.x.using_bg_pixmap = 1;
4073 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
4078 /* turn this off too- bg pixmap is controlled by avoid damage directly
4079 ee->engine.x.using_bg_pixmap = 0;
4080 ecore_x_window_pixmap_set(ee->prop.window, 0);
4081 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
4088 ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee __UNUSED__, int on __UNUSED__)
4091 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
4096 * FIXME: To be fixed.
4098 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
4100 ecore_evas_software_x11_16_direct_resize_get(const Ecore_Evas *ee)
4102 return ee->engine.x.direct_resize;
4106 ecore_evas_software_x11_16_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
4110 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
4115 * FIXME: To be fixed.
4117 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
4119 ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
4121 Ecore_X_Window *winp;
4123 winp = malloc(sizeof(Ecore_X_Window));
4127 ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
4128 ecore_x_input_multi_select(win);
4129 ecore_event_window_register(win, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
4134 ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
4137 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
4143 * FIXME: To be fixed.
4146 ecore_evas_software_x11_8_new(const char *disp_name, Ecore_X_Window parent,
4147 int x, int y, int w, int h)
4149 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4150 Evas_Engine_Info_Software_8_X11 *einfo;
4154 static int redraw_debug = -1;
4156 rmethod = evas_render_method_lookup("software_8_x11");
4157 if (!rmethod) return NULL;
4158 if (!ecore_x_init(disp_name)) return NULL;
4159 ee = calloc(1, sizeof(Ecore_Evas));
4160 if (!ee) return NULL;
4162 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
4164 _ecore_evas_x_init();
4166 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
4168 ee->driver = "software_8_x11";
4169 if (disp_name) ee->name = strdup(disp_name);
4182 ee->prop.max.w = 32767;
4183 ee->prop.max.h = 32767;
4185 ee->prop.request_pos = 0;
4186 ee->prop.sticky = 0;
4187 ee->engine.x.state.sticky = 0;
4189 /* init evas here */
4190 ee->evas = evas_new();
4191 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
4192 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
4193 evas_data_attach_set(ee->evas, ee);
4194 evas_output_method_set(ee->evas, rmethod);
4195 evas_output_size_set(ee->evas, w, h);
4196 evas_output_viewport_set(ee->evas, 0, 0, w, h);
4198 ee->engine.x.win_root = parent;
4201 // /* FIXME: round trip in ecore_x_window_argb_get */
4202 // if (ecore_x_window_argb_get(parent))
4204 // ee->engine.x.win = ecore_x_window_argb_new(parent, x, y, w, h);
4208 // ee->engine.x.win = ecore_x_window_new(parent, x, y, w, h);
4211 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
4212 if (getenv("DESKTOP_STARTUP_ID"))
4214 ecore_x_netwm_startup_id_set(ee->prop.window,
4215 getenv("DESKTOP_STARTUP_ID"));
4216 /* NB: on linux this may simply empty the env as opposed to completely
4217 * unset it to being empty - unsure as solartis libc crashes looking
4218 * for the '=' char */
4219 // putenv((char*)"DESKTOP_STARTUP_ID=");
4221 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
4224 xcb_screen_iterator_t iter;
4225 xcb_screen_t *screen;
4227 /* FIXME: this is inefficient as its a round trip */
4228 //einfo->info.backend = 1;
4229 screen = ecore_x_default_screen_get();
4230 iter = xcb_setup_roots_iterator (xcb_get_setup (ecore_x_connection_get()));
4233 xcb_get_geometry_cookie_t cookie;
4234 xcb_get_geometry_reply_t *reply;
4235 Ecore_X_Window *roots;
4240 cookie = xcb_get_geometry_unchecked(ecore_x_connection_get(), parent);
4241 roots = ecore_x_window_root_list(&num);
4244 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
4248 for (i = 0; i < num; xcb_screen_next (&iter), i++)
4250 if (reply->root == roots[i])
4262 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
4263 if (reply) free(reply);
4267 if (redraw_debug < 0)
4269 if (getenv("REDRAW_DEBUG"))
4270 redraw_debug = atoi(getenv("REDRAW_DEBUG"));
4274 einfo->info.connection = ecore_x_connection_get();
4275 einfo->info.screen = screen;
4276 einfo->info.drawable = ee->prop.window;
4279 /* FIXME: round trip */
4280 xcb_get_geometry_cookie_t cookie_geom;
4281 xcb_get_window_attributes_cookie_t cookie_attr;
4282 xcb_get_geometry_reply_t *reply_geom;
4283 xcb_get_window_attributes_reply_t *reply_attr;
4285 cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->prop.window);
4286 cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
4288 reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
4289 reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
4290 if (reply_attr && reply_geom)
4292 einfo->info.visual = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
4293 einfo->info.colormap = reply_attr->colormap;
4294 einfo->info.depth = reply_geom->depth;
4295 einfo->info.destination_alpha = 1;
4302 xcb_screen_t *screen;
4304 screen = ecore_x_default_screen_get();
4305 einfo->info.visual = xcb_visualtype_get(screen, screen->root_visual);
4306 einfo->info.colormap = screen->default_colormap;
4307 einfo->info.depth = screen->root_depth;
4308 einfo->info.destination_alpha = 0;
4310 einfo->info.rotation = 0;
4311 einfo->info.debug = redraw_debug;
4312 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
4314 WRN("evas_engine_info_set() init engine '%s' failed.", ee->driver);
4315 ecore_evas_free(ee);
4320 ecore_x_icccm_hints_set(ee->prop.window,
4321 1 /* accepts_focus */,
4322 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
4323 0 /* icon_pixmap */,
4325 0 /* icon_window */,
4326 0 /* window_group */,
4329 ee->engine.func->fn_render = _ecore_evas_x_render;
4330 _ecore_evas_register(ee);
4331 ecore_x_input_multi_select(ee->prop.window);
4332 ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
4337 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
4343 * FIXME: To be fixed.
4346 ecore_evas_software_x11_8_window_get(const Ecore_Evas *ee)
4348 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4349 return (Ecore_X_Window) ecore_evas_window_get(ee);
4358 * FIXME: To be fixed.
4361 ecore_evas_software_x11_8_subwindow_get(const Ecore_Evas *ee)
4363 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4364 return (Ecore_X_Window) ecore_evas_window_get(ee);
4373 * FIXME: To be fixed.
4376 ecore_evas_software_x11_8_direct_resize_set(Ecore_Evas *ee, int on)
4378 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4379 ee->engine.x.direct_resize = on;
4380 if (ee->prop.avoid_damage)
4382 if (ee->engine.x.direct_resize)
4384 /* turn this off for now
4385 ee->engine.x.using_bg_pixmap = 1;
4386 ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap);
4391 /* turn this off too- bg pixmap is controlled by avoid damage directly
4392 ee->engine.x.using_bg_pixmap = 0;
4393 ecore_x_window_pixmap_set(ee->engine.x.win, 0);
4394 ecore_x_window_area_expose(ee->engine.x.win, 0, 0, ee->w, ee->h);
4406 * FIXME: To be fixed.
4409 ecore_evas_software_x11_8_direct_resize_get(const Ecore_Evas *ee)
4411 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4412 return ee->engine.x.direct_resize;
4421 * FIXME: To be fixed.
4424 ecore_evas_software_x11_8_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
4426 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4427 Ecore_X_Window *winp;
4429 winp = malloc(sizeof(Ecore_X_Window));
4433 ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
4434 ecore_x_input_multi_select(win);
4435 ecore_event_window_register(win, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);