c9fe0411ad61fb83876f152996a6dd468b457185
[profile/ivi/ecore.git] / src / lib / ecore_evas / ecore_evas_x.c
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include <string.h>
6
7 #include <Ecore.h>
8 #include <Ecore_Input.h>
9 #include <Ecore_Input_Evas.h>
10 #ifdef BUILD_ECORE_EVAS_X11
11 # include <Ecore_X.h>
12 # include <Ecore_X_Atoms.h>
13 #else
14 # undef BUILD_ECORE_EVAS_OPENGL_X11
15 # undef BUILD_ECORE_EVAS_SOFTWARE_X11
16 # undef BUILD_ECORE_EVAS_XRENDER_X11
17 #endif
18
19 #ifndef HAVE_ECORE_X_XCB
20 # undef BUILD_ECORE_EVAS_XRENDER_XCB
21 # undef BUILD_ECORE_EVAS_SOFTWARE_XCB
22 #endif 
23
24 #include "ecore_evas_private.h"
25 #include "Ecore_Evas.h"
26
27 #ifdef BUILD_ECORE_EVAS_X11
28 static int _ecore_evas_init_count = 0;
29
30 static Ecore_Event_Handler *ecore_evas_event_handlers[13];
31
32 static int leader_ref = 0;
33 static Ecore_X_Window leader_win = 0;
34
35 static void
36 _ecore_evas_x_group_leader_set(Ecore_Evas *ee)
37 {
38    leader_ref++;
39    if (leader_ref == 1)
40      {
41         leader_win = ecore_x_window_override_new(ee->engine.x.win_root, 1234, 5678, 1, 2);
42         ecore_x_window_defaults_set(leader_win);
43         if (getenv("DESKTOP_STARTUP_ID"))
44            ecore_x_netwm_startup_id_set(leader_win,
45                                         getenv("DESKTOP_STARTUP_ID"));
46         ecore_x_icccm_client_leader_set(leader_win, leader_win);
47      }
48    ee->engine.x.leader = leader_win;
49    ecore_x_icccm_client_leader_set(ee->prop.window, leader_win);
50 }
51
52 static void
53 _ecore_evas_x_group_leader_unset(Ecore_Evas *ee)
54 {
55    ecore_x_window_prop_property_del(ee->prop.window, ECORE_X_ATOM_WM_CLIENT_LEADER);
56    if (ee->engine.x.leader == leader_win)
57      {
58         leader_ref--;
59         if (leader_ref <= 0)
60           {
61              ecore_x_window_free(leader_win);
62              leader_win = 0;
63           }
64         ee->engine.x.leader = 0;
65      }
66 }
67
68 static void
69 _ecore_evas_x_group_leader_update(Ecore_Evas *ee)
70 {
71    if (ee->engine.x.leader)
72       ecore_x_icccm_client_leader_set(ee->prop.window, ee->engine.x.leader);
73 }
74
75 static void
76 _ecore_evas_x_protocols_set(Ecore_Evas *ee)
77 {
78    Ecore_X_Atom protos[10];
79    int num = 0;
80    
81    if (ee->func.fn_delete_request)
82       protos[num++] = ECORE_X_ATOM_WM_DELETE_WINDOW;
83    protos[num++] = ECORE_X_ATOM_NET_WM_PING;
84    ecore_x_icccm_protocol_atoms_set(ee->prop.window, protos, num);
85 }
86
87 static void
88 _ecore_evas_x_sync_set(Ecore_Evas *ee)
89 {
90    if (((ee->should_be_visible) || (ee->visible)) &&
91        ((ecore_x_e_comp_sync_supported_get(ee->engine.x.win_root)) &&
92            (!ee->no_comp_sync) && (_ecore_evas_app_comp_sync)))
93      {
94         if (!ee->engine.x.sync_counter)
95            ee->engine.x.sync_counter = ecore_x_sync_counter_new(0);
96      }
97    else
98      {
99         if (ee->engine.x.sync_counter)
100            ecore_x_sync_counter_free(ee->engine.x.sync_counter);
101         ee->engine.x.sync_counter = 0;
102      }
103    ecore_x_e_comp_sync_counter_set(ee->prop.window, ee->engine.x.sync_counter);
104 }
105
106 static void
107 _ecore_evas_x_sync_clear(Ecore_Evas *ee)
108 {
109    if (!ee->engine.x.sync_counter) return;
110    ecore_x_sync_counter_free(ee->engine.x.sync_counter);
111    ee->engine.x.sync_counter = 0;
112 }
113
114 #ifdef HAVE_ECORE_X_XCB
115 static xcb_visualtype_t *
116 xcb_visualtype_get(xcb_screen_t *screen, xcb_visualid_t visual)
117 {
118    xcb_depth_iterator_t  iter_depth;
119
120    if (!screen) return NULL;
121
122    iter_depth = xcb_screen_allowed_depths_iterator(screen);
123    for (; iter_depth.rem; xcb_depth_next (&iter_depth))
124      {
125         xcb_visualtype_iterator_t iter_vis;
126
127         iter_vis = xcb_depth_visuals_iterator(iter_depth.data);
128         for (; iter_vis.rem; --screen, xcb_visualtype_next (&iter_vis))
129           {
130             if (visual == iter_vis.data->visual_id)
131               return iter_vis.data;
132           }
133      }
134
135    return NULL;
136 }
137 #endif /* HAVE_ECORE_X_XCB */
138
139 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
140 # ifdef HAVE_ECORE_X_XCB
141 /* noop */
142 # else
143 static Ecore_X_Window
144 _ecore_evas_x_gl_window_new(Ecore_Evas *ee, Ecore_X_Window parent, int x, int y, int w, int h, int override, int argb, const int *opt)
145 {
146    Evas_Engine_Info_GL_X11 *einfo;
147    Ecore_X_Window win;
148
149    einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
150    if (einfo)
151      {
152         XSetWindowAttributes attr;
153         int screen;
154
155         if (opt)
156           {
157              int op;
158              
159              for (op = 0; opt[op]; op++)
160                {
161                   if (opt[op] == ECORE_EVAS_GL_X11_OPT_INDIRECT)
162                     {
163                        op++;
164                        einfo->indirect = opt[op];
165                     }
166                }
167           }
168         
169         /* FIXME: this is inefficient as its 1 or more round trips */
170         screen = DefaultScreen(ecore_x_display_get());
171         if (ScreenCount(ecore_x_display_get()) > 1)
172           {
173              Ecore_X_Window *roots;
174              int num, i;
175
176              num = 0;
177              roots = ecore_x_window_root_list(&num);
178              if (roots)
179                {
180                   XWindowAttributes at;
181
182                   if (XGetWindowAttributes(ecore_x_display_get(),
183                                            parent, &at))
184                     {
185                        for (i = 0; i < num; i++)
186                          {
187                             if (at.root == roots[i])
188                               {
189                                  screen = i;
190                                  break;
191                               }
192                          }
193                     }
194                   free(roots);
195                }
196           }
197         einfo->info.display  = ecore_x_display_get();
198         einfo->info.screen   = screen;
199         
200         einfo->info.destination_alpha = argb;
201         
202         einfo->info.visual   = einfo->func.best_visual_get(einfo);
203         einfo->info.colormap = einfo->func.best_colormap_get(einfo);
204         einfo->info.depth    = einfo->func.best_depth_get(einfo);
205         
206
207         if ((!einfo->info.visual) ||
208             (!einfo->info.colormap) ||
209             (!einfo->info.depth))
210           {
211              WRN("OpenGL X11 init engine '%s' failed - no visual, colormap or depth.", ee->driver);
212              if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
213                {
214                   ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
215                   return 0;
216                }
217           }
218         
219         attr.backing_store = NotUseful;
220         attr.override_redirect = override;
221         attr.colormap = einfo->info.colormap;
222         attr.border_pixel = 0;
223         attr.background_pixmap = None;
224         attr.event_mask =
225           KeyPressMask | KeyReleaseMask |
226           ExposureMask | ButtonPressMask | ButtonReleaseMask |
227           EnterWindowMask | LeaveWindowMask |
228           PointerMotionMask | StructureNotifyMask | VisibilityChangeMask |
229           FocusChangeMask | PropertyChangeMask | ColormapChangeMask;
230         attr.bit_gravity = ForgetGravity;
231
232         win =
233           XCreateWindow(einfo->info.display, parent, x, y, w, h, 0,
234                         einfo->info.depth, InputOutput, einfo->info.visual,
235                         CWBackingStore | CWColormap | CWBackPixmap | 
236                         CWBorderPixel | CWBitGravity | CWEventMask |
237                         CWOverrideRedirect, &attr);
238         einfo->info.drawable = win;
239
240         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
241           {
242              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
243              XDestroyWindow(einfo->info.display, win);
244              return 0;
245           }
246     }
247    else
248      {
249         win = 0;
250      }
251    return win;
252 }
253 #endif /* HAVE_ECORE_X_XCB */
254 #endif
255
256 static int
257 _ecore_evas_x_render(Ecore_Evas *ee)
258 {
259    Eina_Rectangle *r;
260    Eina_List *updates, *l;
261    int rend = 0;
262 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
263    Eina_List *ll;
264    Ecore_Evas *ee2;
265
266    if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync) &&
267        (ee->engine.x.sync_counter) && (!ee->engine.x.sync_began) &&
268        (!ee->engine.x.sync_cancel))
269      return 0;
270    
271    EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
272      {
273         if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
274         rend |= _ecore_evas_buffer_render(ee2);
275         if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
276      }
277 #endif
278    if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
279    if (ee->prop.avoid_damage)
280      {
281         updates = evas_render_updates(ee->evas);
282         if (ee->engine.x.using_bg_pixmap)
283           {
284              if (updates)
285                {
286                   EINA_LIST_FOREACH(updates, l, r)
287                     ecore_x_window_area_clear(ee->prop.window, r->x, r->y, r->w, r->h);
288                   if ((ee->shaped) && (updates))
289                     {
290 #ifdef EVAS_FRAME_QUEUING
291                        /* wait until ee->engine.x.mask being updated */
292                        evas_sync(ee->evas);
293 #endif
294                        ecore_x_window_shape_mask_set(ee->prop.window, ee->engine.x.mask);
295                     }
296                   if ((ee->alpha) && (updates))
297                     {
298 #ifdef EVAS_FRAME_QUEUING
299                        /* wait until ee->engine.x.mask being updated */
300 //                     evas_sync(ee->evas);
301 #endif
302 //                     ecore_x_window_shape_input_mask_set(ee->prop.window, ee->engine.x.mask);
303                     }
304                   evas_render_updates_free(updates);
305                   _ecore_evas_idle_timeout_update(ee);
306                   rend = 1;
307                }
308           }
309         else
310           {
311              EINA_LIST_FOREACH(updates, l, r)
312                {
313                   Ecore_X_Rectangle rect;
314                   Ecore_X_XRegion  *tmpr;
315
316                   if (!ee->engine.x.damages)
317                     ee->engine.x.damages = ecore_x_xregion_new();
318                   tmpr = ecore_x_xregion_new();
319                   if (ee->rotation == 0)
320                     {
321                        rect.x = r->x;
322                        rect.y = r->y;
323                        rect.width = r->w;
324                        rect.height = r->h;
325                     }
326                   else if (ee->rotation == 90)
327                     {
328                        rect.x = r->y;
329                        rect.y = ee->h - r->x - r->w;
330                        rect.width = r->h;
331                        rect.height = r->w;
332                     }
333                   else if (ee->rotation == 180)
334                     {
335                        rect.x = ee->w - r->x - r->w;
336                        rect.y = ee->h - r->y - r->h;
337                        rect.width = r->w;
338                        rect.height = r->h;
339                     }
340                   else if (ee->rotation == 270)
341                     {
342                        rect.x = ee->w - r->y - r->h;
343                        rect.y = r->x;
344                        rect.width = r->h;
345                        rect.height = r->w;
346                     }
347                   ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
348                   ecore_x_xregion_free(ee->engine.x.damages);
349                   ee->engine.x.damages = tmpr;
350                }
351              if (ee->engine.x.damages)
352                {
353                   /* if we have a damage pixmap - we can avoid exposures by
354                    * disabling them just for setting the mask */
355                   ecore_x_event_mask_set(ee->prop.window,
356                                          ECORE_X_EVENT_MASK_KEY_DOWN |
357                                          ECORE_X_EVENT_MASK_KEY_UP |
358                                          ECORE_X_EVENT_MASK_MOUSE_DOWN |
359                                          ECORE_X_EVENT_MASK_MOUSE_UP |
360                                          ECORE_X_EVENT_MASK_MOUSE_IN |
361                                          ECORE_X_EVENT_MASK_MOUSE_OUT |
362                                          ECORE_X_EVENT_MASK_MOUSE_MOVE |
363 //                                         ECORE_X_EVENT_MASK_WINDOW_DAMAGE |
364                                          ECORE_X_EVENT_MASK_WINDOW_VISIBILITY |
365                                          ECORE_X_EVENT_MASK_WINDOW_CONFIGURE |
366                                          ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE |
367                                          ECORE_X_EVENT_MASK_WINDOW_PROPERTY |
368                                          ECORE_X_EVENT_MASK_WINDOW_COLORMAP
369                                          );
370                   if ((ee->shaped) && (updates))
371                     ecore_x_window_shape_mask_set(ee->prop.window, ee->engine.x.mask);
372                   /* and re-enable them again */
373                   ecore_x_event_mask_set(ee->prop.window,
374                                          ECORE_X_EVENT_MASK_KEY_DOWN |
375                                          ECORE_X_EVENT_MASK_KEY_UP |
376                                          ECORE_X_EVENT_MASK_MOUSE_DOWN |
377                                          ECORE_X_EVENT_MASK_MOUSE_UP |
378                                          ECORE_X_EVENT_MASK_MOUSE_IN |
379                                          ECORE_X_EVENT_MASK_MOUSE_OUT |
380                                          ECORE_X_EVENT_MASK_MOUSE_MOVE |
381                                          ECORE_X_EVENT_MASK_WINDOW_DAMAGE |
382                                          ECORE_X_EVENT_MASK_WINDOW_VISIBILITY |
383                                          ECORE_X_EVENT_MASK_WINDOW_CONFIGURE |
384                                          ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE |
385                                          ECORE_X_EVENT_MASK_WINDOW_PROPERTY |
386                                          ECORE_X_EVENT_MASK_WINDOW_COLORMAP
387                                          );
388                   ecore_x_xregion_set(ee->engine.x.damages, ee->engine.x.gc);
389                   /* debug rendering */
390                   /*
391                    XSetForeground(ecore_x_display_get(), ee->engine.x.gc, rand());
392                    XFillRectangle(ecore_x_display_get(), ee->prop.window, ee->engine.x.gc,
393                    0, 0, ee->w, ee->h);
394                    XSync(ecore_x_display_get(), False);
395                    usleep(20000);
396                    XSync(ecore_x_display_get(), False);
397                    */
398                   ecore_x_pixmap_paste(ee->engine.x.pmap, ee->prop.window, ee->engine.x.gc,
399                                        0, 0, ee->w, ee->h, 0, 0);
400                   ecore_x_xregion_free(ee->engine.x.damages);
401                   ee->engine.x.damages = NULL;
402                }
403              if (updates)
404                {
405                   evas_render_updates_free(updates);
406                   _ecore_evas_idle_timeout_update(ee);
407                   rend = 1;
408                }
409           }
410      }
411    else if (((ee->visible) && (ee->draw_ok)) ||
412             ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
413             ((ee->should_be_visible) && (ee->prop.override)))
414      {
415         updates = evas_render_updates(ee->evas);
416         if (updates) 
417           {
418              if (ee->shaped) 
419                {
420 #ifdef EVAS_FRAME_QUEUING
421                   /* wait until ee->engine.x.mask being updated */
422                   evas_sync(ee->evas);
423 #endif
424                   ecore_x_window_shape_mask_set(ee->prop.window, ee->engine.x.mask);
425                }
426              if (ee->alpha)
427                {
428 #ifdef EVAS_FRAME_QUEUING
429                   /* wait until ee->engine.x.mask being updated */
430 //                evas_sync(ee->evas);
431 #endif
432 //                ecore_x_window_shape_input_mask_set(ee->prop.window, ee->engine.x.mask);
433                }
434              evas_render_updates_free(updates);
435              _ecore_evas_idle_timeout_update(ee);
436              rend = 1;
437           }
438      }
439    else
440      evas_norender(ee->evas);
441    if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
442 /*   
443    if (rend)
444      {
445         static int frames = 0;
446         static double t0 = 0.0;
447         double t, td;
448         
449         t = ecore_time_get();
450         frames++;
451         if ((t - t0) > 1.0)
452           {
453              td = t - t0;
454              printf("FPS: %3.3f\n", (double)frames / td);
455              frames = 0;
456              t0 = t;
457           }
458      }
459  */
460    return rend;
461 }
462
463 static void
464 _ecore_evas_x_resize_shape(Ecore_Evas *ee)
465 {
466    if (!strcmp(ee->driver, "software_x11"))
467      {
468 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
469         Evas_Engine_Info_Software_X11 *einfo;
470
471         einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
472         if (einfo)
473           {
474              unsigned int    foreground;
475              Ecore_X_GC      gc;
476
477              if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
478              ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
479              foreground = 0;
480              gc = ecore_x_gc_new(ee->engine.x.mask,
481                                  ECORE_X_GC_VALUE_MASK_FOREGROUND,
482                                  &foreground);
483              ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
484                                              0, 0, ee->w, ee->h);
485              ecore_x_gc_free(gc);
486              einfo->info.mask = ee->engine.x.mask;
487              if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
488                {
489                   ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
490                }
491              evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
492           }
493 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
494      }
495    else if (!strcmp(ee->driver, "xrender_x11"))
496      {
497 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
498         Evas_Engine_Info_XRender_X11 *einfo;
499
500         einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
501         if (einfo)
502           {
503              unsigned int    foreground;
504              Ecore_X_GC      gc;
505
506              if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
507              ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
508              foreground = 0;
509              gc = ecore_x_gc_new(ee->engine.x.mask,
510                                  ECORE_X_GC_VALUE_MASK_FOREGROUND,
511                                  &foreground);
512              ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
513                                              0, 0, ee->w, ee->h);
514              ecore_x_gc_free(gc);
515              einfo->info.mask = ee->engine.x.mask;
516              if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
517                {
518                   ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
519                }
520              evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
521
522           }
523 #endif /* BUILD_ECORE_EVAS_XRENDER_X11 || BUILD_ECORE_EVAS_XRENDER_XCB */
524      }
525    else if (!strcmp(ee->driver, "software_16_x11"))
526      {
527 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
528 # if 0 /* XXX no shaped window support for software_16_x11 */
529         Evas_Engine_Info_Software_16_X11 *einfo;
530
531         einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
532         if (einfo)
533           {
534              if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
535              ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
536              einfo->info.mask = ee->engine.x.mask;
537              if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
538                {
539                   ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
540                }
541              evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
542           }
543 # endif /* XXX no shaped window support for software_16_x11 */
544 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
545      }
546    if (!strcmp(ee->driver, "software_8_x11"))
547      {
548 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
549         Evas_Engine_Info_Software_8_X11 *einfo;
550
551         einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
552         if (einfo)
553           {
554              unsigned int    foreground;
555              Ecore_X_GC      gc;
556
557              if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
558              ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
559              foreground = 0;
560              gc = ecore_x_gc_new(ee->engine.x.mask,
561                                  ECORE_X_GC_VALUE_MASK_FOREGROUND,
562                                  &foreground);
563              ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
564                                              0, 0, ee->w, ee->h);
565              ecore_x_gc_free(gc);
566              einfo->info.mask = ee->engine.x.mask;
567              if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
568                {
569                   ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
570                }
571              evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
572           }
573 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
574      }
575 }
576
577 /* TODO: we need to make this work for all the states, not just sticky */
578 static Eina_Bool
579 _ecore_evas_x_event_property_change(void *data __UNUSED__, int type __UNUSED__, void *event)
580 {
581    Ecore_Evas *ee;
582    Ecore_X_Event_Window_Property *e;
583
584    e = event;
585    ee = ecore_event_window_match(e->win);
586    if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
587    if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
588    if (e->atom == ECORE_X_ATOM_NET_WM_STATE)
589      {
590         unsigned int i, num;
591         Ecore_X_Window_State *state;
592         int sticky;
593
594 #ifdef HAVE_ECORE_X_XCB
595         ecore_x_netwm_window_state_get_prefetch(e->win);
596 #endif /* HAVE_ECORE_X_XCB */
597         sticky = 0;
598
599         /* TODO: we need to move those to the end, with if statements */
600         ee->engine.x.state.modal = 0;
601         ee->engine.x.state.maximized_v = 0;
602         ee->engine.x.state.maximized_h = 0;
603         ee->engine.x.state.shaded = 0;
604         ee->engine.x.state.skip_taskbar = 0;
605         ee->engine.x.state.skip_pager = 0;
606         ee->prop.fullscreen = 0;
607         ee->engine.x.state.fullscreen = 0;
608         ee->engine.x.state.above = 0;
609         ee->engine.x.state.below = 0;
610
611 #ifdef HAVE_ECORE_X_XCB
612         ecore_x_netwm_window_state_get_fetch();
613 #endif /* HAVE_ECORE_X_XCB */
614         ecore_x_netwm_window_state_get(e->win, &state, &num);
615         if (state)
616           {
617              for (i = 0; i < num; i++)
618                {
619                   switch (state[i])
620                     {
621                      case ECORE_X_WINDOW_STATE_MODAL:
622                         ee->engine.x.state.modal = 1;
623                         break;
624                      case ECORE_X_WINDOW_STATE_STICKY:
625                         if (ee->prop.sticky && ee->engine.x.state.sticky)
626                           break;
627
628                         sticky = 1;
629                         ee->prop.sticky = 1;
630                         ee->engine.x.state.sticky = 1;
631                         if (ee->func.fn_sticky) ee->func.fn_sticky(ee);
632                         break;
633                      case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
634                         ee->engine.x.state.maximized_v = 1;
635                         break;
636                      case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
637                         ee->engine.x.state.maximized_h = 1;
638                         break;
639                      case ECORE_X_WINDOW_STATE_SHADED:
640                         ee->engine.x.state.shaded = 1;
641                         break;
642                      case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
643                         ee->engine.x.state.skip_taskbar = 1;
644                         break;
645                      case ECORE_X_WINDOW_STATE_SKIP_PAGER:
646                         ee->engine.x.state.skip_pager = 1;
647                         break;
648                      case ECORE_X_WINDOW_STATE_FULLSCREEN:
649                         ee->prop.fullscreen = 1;
650                         ee->engine.x.state.fullscreen = 1;
651                         break;
652                      case ECORE_X_WINDOW_STATE_ABOVE:
653                         ee->engine.x.state.above = 1;
654                         break;
655                      case ECORE_X_WINDOW_STATE_BELOW:
656                         ee->engine.x.state.below = 1;
657                         break;
658                      default:
659                         break;
660                     }
661                }
662              free(state);
663           }
664 #ifdef HAVE_ECORE_X_XCB
665         ecore_xcb_reply_free();
666 #endif /* HAVE_ECORE_X_XCB */
667
668         if (ee->prop.sticky && !sticky)
669           {
670              ee->prop.sticky = 0;
671              ee->engine.x.state.sticky = 0;
672              if (ee->func.fn_unsticky) ee->func.fn_unsticky(ee);
673           }
674      }
675
676    return ECORE_CALLBACK_PASS_ON;
677 }
678
679 static Eina_Bool
680 _ecore_evas_x_event_visibility_change(void *data __UNUSED__, int type __UNUSED__, void *event)
681 {
682    Ecore_Evas *ee;
683    Ecore_X_Event_Window_Visibility_Change *e;
684
685    e = event;
686    ee = ecore_event_window_match(e->win);
687    if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
688    if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
689 //   printf("VIS CHANGE OBSCURED: %p %i\n", ee, e->fully_obscured);
690    if (e->fully_obscured)
691      {
692         /* FIXME: round trip */
693         if (!ecore_x_screen_is_composited(ee->engine.x.screen_num))
694           ee->draw_ok = 0;
695      }
696    else ee->draw_ok = 1;
697    return ECORE_CALLBACK_PASS_ON;
698 }
699
700 static Eina_Bool
701 _ecore_evas_x_event_client_message(void *data __UNUSED__, int type __UNUSED__, void *event)
702 {
703    Ecore_Evas *ee;
704    Ecore_X_Event_Client_Message *e;
705
706    e = event;
707    if (e->format != 32) return ECORE_CALLBACK_PASS_ON;
708    if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_BEGIN)
709      {
710         ee = ecore_event_window_match(e->data.l[0]);
711         if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
712         if (e->data.l[0] != (long)ee->prop.window) return ECORE_CALLBACK_PASS_ON;
713         if (!ee->engine.x.sync_began)
714           {
715              // qeue a damage + draw. work around an event re-ordering thing.
716              evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
717           }
718         ee->engine.x.sync_began = 1;
719         ee->engine.x.sync_cancel = 0;
720      }
721    else if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_END)
722      {
723         ee = ecore_event_window_match(e->data.l[0]);
724         if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
725         if (e->data.l[0] != (long)ee->prop.window) return ECORE_CALLBACK_PASS_ON;
726         ee->engine.x.sync_began = 0;
727         ee->engine.x.sync_cancel = 0;
728      }
729    else if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_CANCEL)
730      {
731         ee = ecore_event_window_match(e->data.l[0]);
732         if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
733         if (e->data.l[0] != (long)ee->prop.window) return ECORE_CALLBACK_PASS_ON;
734         ee->engine.x.sync_began = 0;
735         ee->engine.x.sync_cancel = 1;
736      }
737    return ECORE_CALLBACK_PASS_ON;
738 }
739
740 static Eina_Bool
741 _ecore_evas_x_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
742 {
743    Ecore_Evas *ee;
744    Ecore_X_Event_Mouse_In *e;
745
746    e = event;
747    ee = ecore_event_window_match(e->win);
748    if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
749    if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
750 /*    { */
751 /*       time_t t; */
752 /*       char *ct; */
753
754 /*       const char *modes[] = { */
755 /*        "MODE_NORMAL", */
756 /*        "MODE_WHILE_GRABBED", */
757 /*        "MODE_GRAB", */
758 /*        "MODE_UNGRAB" */
759 /*       }; */
760 /*       const char *details[] = { */
761 /*        "DETAIL_ANCESTOR", */
762 /*        "DETAIL_VIRTUAL", */
763 /*        "DETAIL_INFERIOR", */
764 /*        "DETAIL_NON_LINEAR", */
765 /*        "DETAIL_NON_LINEAR_VIRTUAL", */
766 /*        "DETAIL_POINTER", */
767 /*        "DETAIL_POINTER_ROOT", */
768 /*        "DETAIL_DETAIL_NONE" */
769 /*       }; */
770 /*       t = time(NULL); */
771 /*       ct = ctime(&t); */
772 /*       ct[strlen(ct) - 1] = 0; */
773 /*       printf("@@ ->IN 0x%x 0x%x %s md=%s dt=%s\n", */
774 /*             e->win, e->event_win, */
775 /*             ct, */
776 /*             modes[e->mode], */
777 /*             details[e->detail]); */
778 /*    } */
779    // disable. causes more problems than it fixes
780    //   if ((e->mode == ECORE_X_EVENT_MODE_GRAB) ||
781    //       (e->mode == ECORE_X_EVENT_MODE_UNGRAB))
782    //     return 0;
783    /* if (e->mode != ECORE_X_EVENT_MODE_NORMAL) return 0; */
784    if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
785    ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
786    evas_event_feed_mouse_in(ee->evas, e->time, NULL);
787    _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
788    return ECORE_CALLBACK_PASS_ON;
789 }
790
791 static Eina_Bool
792 _ecore_evas_x_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
793 {
794    Ecore_Evas *ee;
795    Ecore_X_Event_Mouse_Out *e;
796
797    e = event;
798    ee = ecore_event_window_match(e->win);
799    if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
800    /* pass on event */
801    if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
802 /*    { */
803 /*       time_t t; */
804 /*       char *ct; */
805
806 /*       const char *modes[] = { */
807 /*        "MODE_NORMAL", */
808 /*        "MODE_WHILE_GRABBED", */
809 /*        "MODE_GRAB", */
810 /*        "MODE_UNGRAB" */
811 /*       }; */
812 /*       const char *details[] = { */
813 /*        "DETAIL_ANCESTOR", */
814 /*        "DETAIL_VIRTUAL", */
815 /*        "DETAIL_INFERIOR", */
816 /*        "DETAIL_NON_LINEAR", */
817 /*        "DETAIL_NON_LINEAR_VIRTUAL", */
818 /*        "DETAIL_POINTER", */
819 /*        "DETAIL_POINTER_ROOT", */
820 /*        "DETAIL_DETAIL_NONE" */
821 /*       }; */
822 /*       t = time(NULL); */
823 /*       ct = ctime(&t); */
824 /*       ct[strlen(ct) - 1] = 0; */
825 /*       printf("@@ ->OUT 0x%x 0x%x %s md=%s dt=%s\n", */
826 /*             e->win, e->event_win, */
827 /*             ct, */
828 /*             modes[e->mode], */
829 /*             details[e->detail]); */
830 /*    } */
831    // disable. causes more problems than it fixes
832    //   if ((e->mode == ECORE_X_EVENT_MODE_GRAB) ||
833    //       (e->mode == ECORE_X_EVENT_MODE_UNGRAB))
834    //     return 0;
835    /* if (e->mode != ECORE_X_EVENT_MODE_NORMAL) return 0; */
836    ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
837    _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
838    if (e->mode == ECORE_X_EVENT_MODE_GRAB)
839      evas_event_feed_mouse_cancel(ee->evas, e->time, NULL);
840    evas_event_feed_mouse_out(ee->evas, e->time, NULL);
841    if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
842    if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
843    return ECORE_CALLBACK_PASS_ON;
844 }
845
846 static Eina_Bool
847 _ecore_evas_x_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
848 {
849    Ecore_Evas *ee;
850    Ecore_X_Event_Window_Focus_In *e;
851
852    e = event;
853    ee = ecore_event_window_match(e->win);
854    if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
855    if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
856    if (e->mode == ECORE_X_EVENT_MODE_UNGRAB) return ECORE_CALLBACK_PASS_ON;
857    ee->prop.focused = 1;
858    evas_focus_in(ee->evas);
859    if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
860    return ECORE_CALLBACK_PASS_ON;
861 }
862
863 static Eina_Bool
864 _ecore_evas_x_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
865 {
866    Ecore_Evas *ee;
867    Ecore_X_Event_Window_Focus_Out *e;
868
869    e = event;
870    ee = ecore_event_window_match(e->win);
871    if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
872    if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
873    if (e->mode == ECORE_X_EVENT_MODE_GRAB) return ECORE_CALLBACK_PASS_ON;
874 //   if (ee->prop.fullscreen)
875 //     ecore_x_window_focus(ee->prop.window);
876    evas_focus_out(ee->evas);
877    ee->prop.focused = 0;
878    if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
879    return ECORE_CALLBACK_PASS_ON;
880 }
881
882 static Eina_Bool
883 _ecore_evas_x_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event)
884 {
885    Ecore_Evas *ee;
886    Ecore_X_Event_Window_Damage *e;
887
888    e = event;
889    ee = ecore_event_window_match(e->win);
890    if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
891    if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
892    if (ee->engine.x.using_bg_pixmap) return ECORE_CALLBACK_PASS_ON;
893 //   printf("EXPOSE %p [%i] %i %i %ix%i\n", ee, ee->prop.avoid_damage, e->x, e->y, e->w, e->h);
894    if (ee->prop.avoid_damage)
895      {
896         Ecore_X_Rectangle rect;
897         Ecore_X_XRegion  *tmpr;
898
899         if (!ee->engine.x.damages) ee->engine.x.damages = ecore_x_xregion_new();
900         tmpr = ecore_x_xregion_new();
901         rect.x = e->x;
902         rect.y = e->y;
903         rect.width = e->w;
904         rect.height = e->h;
905         ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
906         ecore_x_xregion_free(ee->engine.x.damages);
907         ee->engine.x.damages = tmpr;
908 /* no - this breaks things badly. disable. Ecore_X_Rectangle != XRectangle - see
909  *  the typedefs in x's headers and ecore_x's. also same with Region - it's a pointer in x - not an X ID
910         Ecore_X_Rectangle rect;
911         Ecore_X_XRegion  *tmpr;
912
913         if (!ee->engine.x.damages) ee->engine.x.damages = ecore_x_xregion_new();
914         tmpr = ecore_x_xregion_new();
915         rect.x = e->x;
916         rect.y = e->y;
917         rect.width = e->w;
918         rect.height = e->h;
919         ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
920         ecore_x_xregion_free(ee->engine.x.damages);
921         ee->engine.x.damages = tmpr;
922  */
923      }
924    else
925      {
926         if (ee->rotation == 0)
927           evas_damage_rectangle_add(ee->evas,
928                                     e->x,
929                                     e->y,
930                                     e->w, e->h);
931         else if (ee->rotation == 90)
932           evas_damage_rectangle_add(ee->evas,
933                                     ee->h - e->y - e->h,
934                                     e->x,
935                                     e->h, e->w);
936         else if (ee->rotation == 180)
937           evas_damage_rectangle_add(ee->evas,
938                                     ee->w - e->x - e->w,
939                                     ee->h - e->y - e->h,
940                                     e->w, e->h);
941         else if (ee->rotation == 270)
942           evas_damage_rectangle_add(ee->evas,
943                                     e->y,
944                                     ee->w - e->x - e->w,
945                                     e->h, e->w);
946      }
947    return ECORE_CALLBACK_PASS_ON;
948 }
949
950 static Eina_Bool
951 _ecore_evas_x_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event)
952 {
953    Ecore_Evas *ee;
954    Ecore_X_Event_Window_Destroy *e;
955
956    e = event;
957    ee = ecore_event_window_match(e->win);
958    if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
959    if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
960    if (ee->func.fn_destroy) ee->func.fn_destroy(ee);
961    _ecore_evas_x_sync_clear(ee);
962    ecore_evas_free(ee);
963    return ECORE_CALLBACK_PASS_ON;
964 }
965
966 static Eina_Bool
967 _ecore_evas_x_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
968 {
969    Ecore_Evas *ee;
970    Ecore_X_Event_Window_Configure *e;
971
972    e = event;
973    ee = ecore_event_window_match(e->win);
974    if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
975    if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
976    if (ee->engine.x.direct_resize) return ECORE_CALLBACK_PASS_ON;
977
978    if ((e->from_wm) || (ee->prop.override))
979      {
980         if ((ee->x != e->x) || (ee->y != e->y))
981           {
982              ee->x = e->x;
983              ee->y = e->y;
984              ee->req.x = ee->x;
985              ee->req.y = ee->y;
986              if (ee->func.fn_move) ee->func.fn_move(ee);
987           }
988      }
989    if ((ee->w != e->w) || (ee->h != e->h))
990      {
991         ee->w = e->w;
992         ee->h = e->h;
993         ee->req.w = ee->w;
994         ee->req.h = ee->h;
995         if ((ee->rotation == 90) || (ee->rotation == 270))
996           {
997              evas_output_size_set(ee->evas, ee->h, ee->w);
998              evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
999           }
1000         else
1001           {
1002              evas_output_size_set(ee->evas, ee->w, ee->h);
1003              evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1004           }
1005         if (ee->prop.avoid_damage)
1006           {
1007              int pdam;
1008
1009              pdam = ecore_evas_avoid_damage_get(ee);
1010              ecore_evas_avoid_damage_set(ee, 0);
1011              ecore_evas_avoid_damage_set(ee, pdam);
1012           }
1013         if ((ee->shaped) || (ee->alpha))
1014           _ecore_evas_x_resize_shape(ee);
1015         if ((ee->expecting_resize.w > 0) &&
1016             (ee->expecting_resize.h > 0))
1017           {
1018              if ((ee->expecting_resize.w == ee->w) &&
1019                  (ee->expecting_resize.h == ee->h))
1020                _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
1021                                               ecore_x_current_time_get());
1022              ee->expecting_resize.w = 0;
1023              ee->expecting_resize.h = 0;
1024           }
1025         if (ee->func.fn_resize) ee->func.fn_resize(ee);
1026      }
1027    return ECORE_CALLBACK_PASS_ON;
1028 }
1029
1030 static Eina_Bool
1031 _ecore_evas_x_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event)
1032 {
1033    Ecore_Evas *ee;
1034    Ecore_X_Event_Window_Delete_Request *e;
1035
1036    e = event;
1037    ee = ecore_event_window_match(e->win);
1038    if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1039    if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1040    if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
1041    return ECORE_CALLBACK_PASS_ON;
1042 }
1043
1044 static Eina_Bool
1045 _ecore_evas_x_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event)
1046 {
1047    Ecore_Evas *ee;
1048    Ecore_X_Event_Window_Show *e;
1049    static int first_map_bug = -1;
1050    
1051    e = event;
1052    ee = ecore_event_window_match(e->win);
1053    if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1054    if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1055    if (first_map_bug < 0)
1056      {
1057         if (getenv("ECORE_EVAS_GL_FIRST_MAP_BUG"))
1058            first_map_bug = atoi(getenv("ECORE_EVAS_GL_FIRST_MAP_BUG"));
1059         else
1060            first_map_bug = 0;
1061      }
1062    if ((first_map_bug) &&
1063        (!strcmp(ee->driver, "opengl_x11")))
1064       evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1065    if (ee->visible) return ECORE_CALLBACK_DONE;
1066 //   printf("SHOW EVENT %p\n", ee);
1067    ee->visible = 1;
1068    if (ee->func.fn_show) ee->func.fn_show(ee);
1069    return ECORE_CALLBACK_PASS_ON;
1070 }
1071
1072 static Eina_Bool
1073 _ecore_evas_x_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event)
1074 {
1075    Ecore_Evas *ee;
1076    Ecore_X_Event_Window_Hide *e;
1077
1078    e = event;
1079    ee = ecore_event_window_match(e->win);
1080    if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1081    if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1082    if (!ee->visible) return ECORE_CALLBACK_DONE;
1083 //   printf("HIDE EVENT %p\n", ee);
1084    ee->visible = 0;
1085    if (ee->func.fn_hide) ee->func.fn_hide(ee);
1086    return ECORE_CALLBACK_PASS_ON;
1087 }
1088
1089 /* FIXME, should be in idler */
1090 /* FIXME, round trip */
1091 static void
1092 _ecore_evas_x_size_pos_hints_update(Ecore_Evas *ee)
1093 {
1094 # ifdef HAVE_ECORE_X_XCB
1095    ecore_x_icccm_size_pos_hints_get_prefetch(ee->prop.window);
1096    ecore_x_icccm_size_pos_hints_get_fetch();
1097 # endif /* HAVE_ECORE_X_XCB */
1098    ecore_x_icccm_size_pos_hints_set(ee->prop.window,
1099                                     ee->prop.request_pos /*request_pos */,
1100                                     ECORE_X_GRAVITY_NW /* gravity */,
1101                                     ee->prop.min.w /* min_w */,
1102                                     ee->prop.min.h /* min_h */,
1103                                     ee->prop.max.w /* max_w */,
1104                                     ee->prop.max.h /* max_h */,
1105                                     ee->prop.base.w /* base_w */,
1106                                     ee->prop.base.h /* base_h */,
1107                                     ee->prop.step.w /* step_x */,
1108                                     ee->prop.step.h /* step_y */,
1109                                     0 /* min_aspect */,
1110                                     0 /* max_aspect */);
1111 # ifdef HAVE_ECORE_X_XCB
1112    ecore_xcb_reply_free();
1113 # endif /* HAVE_ECORE_X_XCB */
1114 }
1115
1116 /* FIXME, should be in idler */
1117 static void
1118 _ecore_evas_x_state_update(Ecore_Evas *ee)
1119 {
1120    Ecore_X_Window_State state[10];
1121    int num;
1122
1123    num = 0;
1124
1125    /*
1126    if (bd->client.netwm.state.modal)
1127      state[num++] = ECORE_X_WINDOW_STATE_MODAL;
1128    */
1129    if (ee->engine.x.state.sticky)
1130      state[num++] = ECORE_X_WINDOW_STATE_STICKY;
1131    /*
1132    if (bd->client.netwm.state.maximized_v)
1133      state[num++] = ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
1134    if (bd->client.netwm.state.maximized_h)
1135      state[num++] = ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
1136    if (bd->client.netwm.state.shaded)
1137      state[num++] = ECORE_X_WINDOW_STATE_SHADED;
1138    if (bd->client.netwm.state.skip_taskbar)
1139      state[num++] = ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
1140    if (bd->client.netwm.state.skip_pager)
1141      state[num++] = ECORE_X_WINDOW_STATE_SKIP_PAGER;
1142    if (bd->client.netwm.state.hidden)
1143      state[num++] = ECORE_X_WINDOW_STATE_HIDDEN;
1144    */
1145    if (ee->engine.x.state.fullscreen)
1146      state[num++] = ECORE_X_WINDOW_STATE_FULLSCREEN;
1147    if (ee->engine.x.state.above)
1148      state[num++] = ECORE_X_WINDOW_STATE_ABOVE;
1149    if (ee->engine.x.state.below)
1150      state[num++] = ECORE_X_WINDOW_STATE_BELOW;
1151
1152    ecore_x_netwm_window_state_set(ee->prop.window, state, num);
1153 }
1154
1155 static void
1156 _ecore_evas_x_layer_update(Ecore_Evas *ee)
1157 {
1158    if (ee->should_be_visible)
1159      {
1160         /* We need to send a netwm request to the wm */
1161         /* FIXME: Do we have to remove old state before adding new? */
1162         if (ee->prop.layer < 3)
1163           {
1164              if (ee->engine.x.state.above)
1165                {
1166                   ee->engine.x.state.above = 0;
1167                   ecore_x_netwm_state_request_send(ee->prop.window,
1168                                                    ee->engine.x.win_root,
1169                                                    ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
1170                }
1171              if (!ee->engine.x.state.below)
1172                {
1173                   ee->engine.x.state.below = 1;
1174                   ecore_x_netwm_state_request_send(ee->prop.window,
1175                                                    ee->engine.x.win_root,
1176                                                    ECORE_X_WINDOW_STATE_BELOW, -1, 1);
1177                }
1178           }
1179         else if (ee->prop.layer > 5)
1180           {
1181              if (ee->engine.x.state.below)
1182                {
1183                   ee->engine.x.state.below = 0;
1184                   ecore_x_netwm_state_request_send(ee->prop.window,
1185                                                    ee->engine.x.win_root,
1186                                                    ECORE_X_WINDOW_STATE_BELOW, -1, 0);
1187                }
1188              if (!ee->engine.x.state.above)
1189                {
1190                   ee->engine.x.state.above = 1;
1191                   ecore_x_netwm_state_request_send(ee->prop.window,
1192                                                    ee->engine.x.win_root,
1193                                                    ECORE_X_WINDOW_STATE_ABOVE, -1, 1);
1194                }
1195           }
1196         else
1197           {
1198              if (ee->engine.x.state.below)
1199                {
1200                   ee->engine.x.state.below = 0;
1201                   ecore_x_netwm_state_request_send(ee->prop.window,
1202                                                    ee->engine.x.win_root,
1203                                                    ECORE_X_WINDOW_STATE_BELOW, -1, 0);
1204                }
1205              if (ee->engine.x.state.above)
1206                {
1207                   ee->engine.x.state.above = 0;
1208                   ecore_x_netwm_state_request_send(ee->prop.window,
1209                                                    ee->engine.x.win_root,
1210                                                    ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
1211                }
1212           }
1213      }
1214    else
1215      {
1216         /* Just set the state */
1217         if (ee->prop.layer < 3)
1218           {
1219              if ((ee->engine.x.state.above) || (!ee->engine.x.state.below))
1220                {
1221                   ee->engine.x.state.above = 0;
1222                   ee->engine.x.state.below = 1;
1223                   _ecore_evas_x_state_update(ee);
1224                }
1225           }
1226         else if (ee->prop.layer > 5)
1227           {
1228              if ((!ee->engine.x.state.above) || (ee->engine.x.state.below))
1229                {
1230                   ee->engine.x.state.above = 1;
1231                   ee->engine.x.state.below = 0;
1232                   _ecore_evas_x_state_update(ee);
1233                }
1234           }
1235         else
1236           {
1237              if ((ee->engine.x.state.above) || (ee->engine.x.state.below))
1238                {
1239                   ee->engine.x.state.above = 0;
1240                   ee->engine.x.state.below = 0;
1241                   _ecore_evas_x_state_update(ee);
1242                }
1243           }
1244      }
1245    /* FIXME: Set gnome layer */
1246 }
1247
1248 static int
1249 _ecore_evas_x_init(void)
1250 {
1251    _ecore_evas_init_count++;
1252    if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
1253    ecore_evas_event_handlers[0]  = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN, _ecore_evas_x_event_mouse_in, NULL);
1254    ecore_evas_event_handlers[1]  = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT, _ecore_evas_x_event_mouse_out, NULL);
1255    ecore_evas_event_handlers[2]  = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, _ecore_evas_x_event_window_focus_in, NULL);
1256    ecore_evas_event_handlers[3]  = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, _ecore_evas_x_event_window_focus_out, NULL);
1257    ecore_evas_event_handlers[4]  = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DAMAGE, _ecore_evas_x_event_window_damage, NULL);
1258    ecore_evas_event_handlers[5] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DESTROY, _ecore_evas_x_event_window_destroy, NULL);
1259    ecore_evas_event_handlers[6] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE, _ecore_evas_x_event_window_configure, NULL);
1260    ecore_evas_event_handlers[7] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, _ecore_evas_x_event_window_delete_request, NULL);
1261    ecore_evas_event_handlers[8] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW, _ecore_evas_x_event_window_show, NULL);
1262    ecore_evas_event_handlers[9] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_HIDE, _ecore_evas_x_event_window_hide, NULL);
1263    ecore_evas_event_handlers[10] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, _ecore_evas_x_event_property_change, NULL);
1264    ecore_evas_event_handlers[11] = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, _ecore_evas_x_event_visibility_change, NULL);
1265    ecore_evas_event_handlers[12] = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, _ecore_evas_x_event_client_message, NULL);
1266    ecore_event_evas_init();
1267    return _ecore_evas_init_count;
1268 }
1269
1270 static void
1271 _ecore_evas_x_free(Ecore_Evas *ee)
1272 {
1273    _ecore_evas_x_group_leader_unset(ee);
1274    _ecore_evas_x_sync_set(ee);
1275    ecore_x_window_free(ee->prop.window);
1276    if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
1277    if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1278    if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
1279    if (ee->engine.x.damages) ecore_x_xregion_free(ee->engine.x.damages);
1280    ee->engine.x.pmap = 0;
1281    ee->engine.x.mask = 0;
1282    ee->engine.x.gc = 0;
1283    ee->engine.x.damages = NULL;
1284    ecore_event_window_unregister(ee->prop.window);
1285    while (ee->engine.x.win_extra)
1286      {
1287         Ecore_X_Window *winp;
1288
1289         winp = ee->engine.x.win_extra->data;
1290         ee->engine.x.win_extra = eina_list_remove_list(ee->engine.x.win_extra, ee->engine.x.win_extra);
1291         ecore_event_window_unregister(*winp);
1292         free(winp);
1293      }
1294    _ecore_evas_x_shutdown();
1295    ecore_x_shutdown();
1296 }
1297
1298 static void
1299 _ecore_evas_x_callback_delete_request_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
1300 {
1301    ee->func.fn_delete_request = func;
1302    _ecore_evas_x_protocols_set(ee);
1303    _ecore_evas_x_sync_set(ee);
1304 }
1305
1306 static void
1307 _ecore_evas_x_move(Ecore_Evas *ee, int x, int y)
1308 {
1309    ee->req.x = x;
1310    ee->req.y = y;
1311    if (ee->engine.x.direct_resize)
1312      {
1313         if (!ee->engine.x.managed)
1314           {
1315              if ((x != ee->x) || (y != ee->y))
1316                {
1317                   ee->x = x;
1318                   ee->y = y;
1319                   ecore_x_window_move(ee->prop.window, x, y);
1320                   if (!ee->should_be_visible)
1321                     {
1322                        /* We need to request pos */
1323                        ee->prop.request_pos = 1;
1324                        _ecore_evas_x_size_pos_hints_update(ee);
1325                     }
1326                   if (ee->func.fn_move) ee->func.fn_move(ee);
1327                }
1328           }
1329      }
1330    else
1331      {
1332         ecore_x_window_move(ee->prop.window, x, y);
1333         if (!ee->should_be_visible)
1334           {
1335              /* We need to request pos */
1336              ee->prop.request_pos = 1;
1337              _ecore_evas_x_size_pos_hints_update(ee);
1338           }
1339         if (!ee->engine.x.managed)
1340           {
1341              ee->x = x;
1342              ee->y = y;
1343           }
1344      }
1345 }
1346
1347 static void
1348 _ecore_evas_x_managed_move(Ecore_Evas *ee, int x, int y)
1349 {
1350    ee->req.x = x;
1351    ee->req.y = y;
1352    if (ee->engine.x.direct_resize)
1353      {
1354         ee->engine.x.managed = 1;
1355         if ((x != ee->x) || (y != ee->y))
1356           {
1357              ee->x = x;
1358              ee->y = y;
1359              if (ee->func.fn_move) ee->func.fn_move(ee);
1360           }
1361      }
1362 }
1363
1364 static void
1365 _ecore_evas_x_resize(Ecore_Evas *ee, int w, int h)
1366 {
1367    ee->req.w = w;
1368    ee->req.h = h;
1369    if (ee->engine.x.direct_resize)
1370      {
1371         if ((ee->w != w) || (ee->h != h))
1372           {
1373              ecore_x_window_resize(ee->prop.window, w, h);
1374              ee->w = w;
1375              ee->h = h;
1376              if ((ee->rotation == 90) || (ee->rotation == 270))
1377                {
1378                   evas_output_size_set(ee->evas, ee->h, ee->w);
1379                   evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1380                }
1381              else
1382                {
1383                   evas_output_size_set(ee->evas, ee->w, ee->h);
1384                   evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1385                }
1386              if (ee->prop.avoid_damage)
1387                {
1388                   int pdam;
1389
1390                   pdam = ecore_evas_avoid_damage_get(ee);
1391                   ecore_evas_avoid_damage_set(ee, 0);
1392                   ecore_evas_avoid_damage_set(ee, pdam);
1393                }
1394              if ((ee->shaped) || (ee->alpha))
1395                _ecore_evas_x_resize_shape(ee);
1396              if (ee->func.fn_resize) ee->func.fn_resize(ee);
1397           }
1398      }
1399    else
1400      ecore_x_window_resize(ee->prop.window, w, h);
1401 }
1402
1403 static void
1404 _ecore_evas_x_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
1405 {
1406    ee->req.x = x;
1407    ee->req.y = y;
1408    ee->req.w = w;
1409    ee->req.h = h;
1410    if (ee->engine.x.direct_resize)
1411      {
1412         if ((ee->w != w) || (ee->h != h) || (x != ee->x) || (y != ee->y))
1413           {
1414              int change_size = 0, change_pos = 0;
1415
1416              if ((ee->w != w) || (ee->h != h)) change_size = 1;
1417              if (!ee->engine.x.managed)
1418                {
1419                   if ((x != ee->x) || (y != ee->y)) change_pos = 1;
1420                }
1421              ecore_x_window_move_resize(ee->prop.window, x, y, w, h);
1422              if (!ee->engine.x.managed)
1423                {
1424                   ee->x = x;
1425                   ee->y = y;
1426                }
1427              ee->w = w;
1428              ee->h = h;
1429              if ((ee->rotation == 90) || (ee->rotation == 270))
1430                {
1431                   evas_output_size_set(ee->evas, ee->h, ee->w);
1432                   evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1433                }
1434              else
1435                {
1436                   evas_output_size_set(ee->evas, ee->w, ee->h);
1437                   evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1438                }
1439              if (ee->prop.avoid_damage)
1440                {
1441                   int pdam;
1442
1443                   pdam = ecore_evas_avoid_damage_get(ee);
1444                   ecore_evas_avoid_damage_set(ee, 0);
1445                   ecore_evas_avoid_damage_set(ee, pdam);
1446                }
1447              if ((ee->shaped) || (ee->alpha))
1448                _ecore_evas_x_resize_shape(ee);
1449              if (change_pos)
1450                {
1451                   if (ee->func.fn_move) ee->func.fn_move(ee);
1452                }
1453              if (change_size)
1454                {
1455                   if (ee->func.fn_resize) ee->func.fn_resize(ee);
1456                }
1457           }
1458      }
1459    else
1460      {
1461         ecore_x_window_move_resize(ee->prop.window, x, y, w, h);
1462         if (!ee->engine.x.managed)
1463           {
1464              ee->x = x;
1465              ee->y = y;
1466           }
1467      }
1468 }
1469
1470 static void
1471 _ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize,
1472                                     Evas_Engine_Info *einfo)
1473 {
1474    int rot_dif;
1475
1476    rot_dif = ee->rotation - rotation;
1477    if (rot_dif < 0) rot_dif = -rot_dif;
1478
1479    if (rot_dif != 180)
1480      {
1481         int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
1482
1483         if (!evas_engine_info_set(ee->evas, einfo))
1484           {
1485              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1486           }
1487
1488         if (!resize)
1489           {
1490              if (!ee->prop.fullscreen)
1491                {
1492                   ecore_x_window_resize(ee->prop.window, ee->req.h, ee->req.w);
1493                   ee->expecting_resize.w = ee->h;
1494                   ee->expecting_resize.h = ee->w;
1495                }
1496              else
1497                {
1498                   int w, h;
1499                   
1500                   ecore_x_window_size_get(ee->prop.window, &w, &h);
1501                   ecore_x_window_resize(ee->prop.window, h, w);
1502                   if ((rotation == 0) || (rotation == 180))
1503                     {
1504                        evas_output_size_set(ee->evas, ee->req.w, ee->req.h);
1505                        evas_output_viewport_set(ee->evas, 0, 0, ee->req.w, ee->req.h);
1506                     }
1507                   else
1508                     {
1509                        evas_output_size_set(ee->evas, ee->req.h, ee->req.w);
1510                        evas_output_viewport_set(ee->evas, 0, 0, ee->req.h, ee->req.w);
1511                     }
1512                   if (ee->func.fn_resize) ee->func.fn_resize(ee);
1513                }
1514              if ((ee->rotation == 90) || (ee->rotation == 270))
1515                evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.h, ee->req.w);
1516              else
1517                evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
1518           }
1519         else
1520           {
1521              int w, h;
1522              
1523              ecore_x_window_size_get(ee->prop.window, &w, &h);
1524              if ((rotation == 0) || (rotation == 180))
1525                {
1526                   evas_output_size_set(ee->evas, ee->w, ee->h);
1527                   evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1528                }
1529              else
1530                {
1531                   evas_output_size_set(ee->evas, ee->h, ee->w);
1532                   evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1533                }
1534              if (ee->func.fn_resize) ee->func.fn_resize(ee);
1535              if ((ee->rotation == 90) || (ee->rotation == 270))
1536                evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
1537              else
1538                evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1539           }
1540         ecore_evas_size_min_get(ee, &minw, &minh);
1541         ecore_evas_size_max_get(ee, &maxw, &maxh);
1542         ecore_evas_size_base_get(ee, &basew, &baseh);
1543         ecore_evas_size_step_get(ee, &stepw, &steph);
1544         ee->rotation = rotation;
1545         ecore_evas_size_min_set(ee, minh, minw);
1546         ecore_evas_size_max_set(ee, maxh, maxw);
1547         ecore_evas_size_base_set(ee, baseh, basew);
1548         ecore_evas_size_step_set(ee, steph, stepw);
1549         _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
1550                                        ecore_x_current_time_get());
1551      }
1552    else
1553      {
1554         if (!evas_engine_info_set(ee->evas, einfo))
1555           {
1556              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1557           }
1558         ee->rotation = rotation;
1559         _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
1560                                        ecore_x_current_time_get());
1561         if (ee->func.fn_resize) ee->func.fn_resize(ee);
1562         
1563         if ((ee->rotation == 90) || (ee->rotation == 270))
1564           evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
1565         else
1566           evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1567      }
1568 }
1569
1570 #define _USE_WIN_ROT_EFFECT 1
1571
1572 #if _USE_WIN_ROT_EFFECT
1573 static void _ecore_evas_x_flush_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__);
1574
1575 typedef struct _Ecore_Evas_X_Rotation_Effect Ecore_Evas_X_Rotation_Effect;
1576 struct _Ecore_Evas_X_Rotation_Effect
1577 {
1578    Eina_Bool    wait_for_comp_reply;
1579 };
1580
1581 static Ecore_Evas_X_Rotation_Effect _rot_effect =
1582 {
1583    EINA_FALSE
1584 };
1585
1586 static void
1587 _ecore_evas_x_rotation_effect_setup(void)
1588 {
1589    _rot_effect.wait_for_comp_reply = EINA_TRUE;
1590 }
1591 #endif /* end of _USE_WIN_ROT_EFFECT */
1592
1593 static void
1594 _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize)
1595 {
1596    if (ee->rotation == rotation) return;
1597    if (!strcmp(ee->driver, "xrender_x11")) return;
1598
1599 #if _USE_WIN_ROT_EFFECT
1600    int angles[2];
1601    angles[0] = rotation;
1602    angles[1] = ee->rotation;
1603 #endif /* end of _USE_WIN_ROT_EFFECT */
1604
1605    if (!strcmp(ee->driver, "opengl_x11"))
1606      {
1607 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
1608         Evas_Engine_Info_GL_X11 *einfo;
1609
1610         einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
1611         if (!einfo) return;
1612         einfo->info.rotation = rotation;
1613         _ecore_evas_x_rotation_set_internal
1614           (ee, rotation, resize, (Evas_Engine_Info *)einfo);
1615 # if _USE_WIN_ROT_EFFECT
1616        ecore_x_window_prop_property_set (ee->prop.window,
1617                                          ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1618                                          ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1619 # else
1620        ecore_x_window_prop_property_set (ee->prop.window,
1621                                          ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1622                                          ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1623 # endif
1624 #endif /* BUILD_ECORE_EVAS_OPENGL_X11 */
1625      }
1626    else if (!strcmp(ee->driver, "software_x11"))
1627      {
1628 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
1629         Evas_Engine_Info_Software_X11 *einfo;
1630
1631         einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
1632         if (!einfo) return;
1633         einfo->info.rotation = rotation;
1634         _ecore_evas_x_rotation_set_internal
1635           (ee, rotation, resize, (Evas_Engine_Info *)einfo);
1636 # if _USE_WIN_ROT_EFFECT
1637        ecore_x_window_prop_property_set (ee->prop.window,
1638                                          ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1639                                          ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1640 # else
1641        ecore_x_window_prop_property_set (ee->prop.window,
1642                                          ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1643                                          ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1644 # endif
1645 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
1646      }
1647    else if (!strcmp(ee->driver,  "software_16_x11"))
1648      {
1649 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
1650         Evas_Engine_Info_Software_16_X11 *einfo;
1651
1652         einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
1653         if (!einfo) return;
1654         einfo->info.rotation = rotation;
1655         _ecore_evas_x_rotation_set_internal
1656           (ee, rotation, resize, (Evas_Engine_Info *)einfo);
1657 # if _USE_WIN_ROT_EFFECT
1658        ecore_x_window_prop_property_set (ee->prop.window,
1659                                          ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1660                                          ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1661 # else
1662        ecore_x_window_prop_property_set (ee->prop.window,
1663                                          ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1664                                          ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1665 # endif
1666 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
1667      }
1668    else if (!strcmp(ee->driver,  "software_8_x11"))
1669      {
1670 #if BUILD_ECORE_EVAS_SOFTWARE_8_X11
1671         Evas_Engine_Info_Software_8_X11 *einfo;
1672
1673         einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
1674         if (!einfo) return;
1675         einfo->info.rotation = rotation;
1676         _ecore_evas_x_rotation_set_internal
1677            (ee, rotation, resize, (Evas_Engine_Info *)einfo);
1678 # if _USE_WIN_ROT_EFFECT
1679        ecore_x_window_prop_property_set (ee->prop.window,
1680                                          ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1681                                          ECORE_X_ATOM_CARDINAL, 32, &angles, 2);
1682 # else
1683        ecore_x_window_prop_property_set (ee->prop.window,
1684                                          ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE,
1685                                          ECORE_X_ATOM_CARDINAL, 32, &rotation, 1);
1686 # endif
1687 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
1688      }
1689
1690 #if _USE_WIN_ROT_EFFECT
1691   _ecore_evas_x_rotation_effect_setup();
1692   _ecore_evas_x_flush_pre(ee, NULL, NULL);
1693 #endif /* end of _USE_WIN_ROT_EFFECT */
1694 }
1695
1696 static void
1697 _ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped)
1698 {
1699    if (((ee->shaped) && (shaped)) || ((!ee->shaped) && (!shaped)))
1700      return;
1701    if (!strcmp(ee->driver, "opengl_x11")) return;
1702    if (!strcmp(ee->driver, "software_x11"))
1703      {
1704 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
1705         Evas_Engine_Info_Software_X11 *einfo;
1706
1707         einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
1708         ee->shaped = shaped;
1709         if (einfo)
1710           {
1711              if (ee->shaped)
1712                {
1713                   unsigned int    foreground;
1714                   Ecore_X_GC      gc;
1715
1716                   if (!ee->engine.x.mask)
1717                     ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1718                   foreground = 0;
1719                   gc = ecore_x_gc_new(ee->engine.x.mask,
1720                                       ECORE_X_GC_VALUE_MASK_FOREGROUND,
1721                                       &foreground);
1722                   ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
1723                                                   0, 0, ee->w, ee->h);
1724                   ecore_x_gc_free(gc);
1725                   einfo->info.mask = ee->engine.x.mask;
1726                   if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1727                     {
1728                        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1729                     }
1730                   evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1731                   ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1732                }
1733              else
1734                {
1735                   if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1736                   ee->engine.x.mask = 0;
1737                   einfo->info.mask = 0;
1738                   if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1739                     {
1740                        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1741                     }
1742                   ecore_x_window_shape_mask_set(ee->prop.window, 0);
1743                   ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1744                }
1745           }
1746 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
1747      }
1748    else if (!strcmp(ee->driver, "xrender_x11"))
1749      {
1750 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
1751         Evas_Engine_Info_XRender_X11 *einfo;
1752
1753         ee->shaped = shaped;
1754         einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
1755         if (einfo)
1756           {
1757              if (ee->shaped)
1758                {
1759                   unsigned int    foreground;
1760                   Ecore_X_GC      gc;
1761
1762                   if (!ee->engine.x.mask)
1763                     ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1764                   foreground = 0;
1765                   gc = ecore_x_gc_new(ee->engine.x.mask,
1766                                       ECORE_X_GC_VALUE_MASK_FOREGROUND,
1767                                       &foreground);
1768                   ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
1769                                                   0, 0, ee->w, ee->h);
1770                   ecore_x_gc_free(gc);
1771                   einfo->info.mask = ee->engine.x.mask;
1772                   if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1773                     {
1774                        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1775                     }
1776                   evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1777                   ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1778                }
1779              else
1780                {
1781                   if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1782                   ee->engine.x.mask = 0;
1783                   einfo->info.mask = 0;
1784                   if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1785                     {
1786                        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1787                     }
1788                   ecore_x_window_shape_mask_set(ee->prop.window, 0);
1789                   ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1790                }
1791           }
1792 #endif /* BUILD_ECORE_EVAS_XRENDER_X11 || BUILD_ECORE_EVAS_XRENDER_XCB */
1793      }
1794    else if (!strcmp(ee->driver, "software_16_x11"))
1795      {
1796 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
1797 # if 0 /* XXX no shaped window support for software_16_x11 */
1798         Evas_Engine_Info_Software_16_X11 *einfo;
1799
1800         einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
1801         ee->shaped = shaped;
1802         if (einfo)
1803           {
1804              if (ee->shaped)
1805                {
1806                   GC gc;
1807                   XGCValues gcv;
1808
1809                   ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1810                   einfo->info.mask = ee->engine.x.mask;
1811                   if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1812                     {
1813                        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1814                     }
1815                   evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1816                }
1817              else
1818                {
1819                   if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1820                   ee->engine.x.mask = 0;
1821                   einfo->info.mask = 0;
1822                   if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1823                     {
1824                        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1825                     }
1826                   ecore_x_window_shape_mask_set(ee->prop.window, 0);
1827                }
1828           }
1829 # endif /* XXX no shaped window support for software_16_x11 */
1830 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
1831      }
1832    if (!strcmp(ee->driver, "software_8_x11"))
1833      {
1834 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
1835         Evas_Engine_Info_Software_8_X11 *einfo;
1836
1837         einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
1838         ee->shaped = shaped;
1839         if (einfo)
1840           {
1841              if (ee->shaped)
1842                {
1843                   unsigned int    foreground;
1844                   Ecore_X_GC      gc;
1845
1846                   if (!ee->engine.x.mask)
1847                     ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1848                   foreground = 0;
1849                   gc = ecore_x_gc_new(ee->engine.x.mask,
1850                                       ECORE_X_GC_VALUE_MASK_FOREGROUND,
1851                                       &foreground);
1852                   ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
1853                                                   0, 0, ee->w, ee->h);
1854                   ecore_x_gc_free(gc);
1855                   einfo->info.mask = ee->engine.x.mask;
1856                   if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1857                     {
1858                        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1859                     }
1860                   evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1861                   ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1862                }
1863              else
1864                {
1865                   if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1866                   ee->engine.x.mask = 0;
1867                   einfo->info.mask = 0;
1868                   if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1869                     {
1870                        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1871                     }
1872                   ecore_x_window_shape_mask_set(ee->prop.window, 0);
1873                   ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1874                }
1875           }
1876 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
1877      }
1878 }
1879
1880 /* FIXME, round trip */
1881 static void
1882 _ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
1883 {
1884 # ifdef HAVE_ECORE_X_XCB
1885    xcb_get_geometry_cookie_t          cookie_geom;
1886    xcb_get_window_attributes_cookie_t cookie_attr;
1887    xcb_get_geometry_reply_t          *reply_geom;
1888    xcb_get_window_attributes_reply_t *reply_attr;
1889 #else
1890    XWindowAttributes att;
1891 #endif /* ! HAVE_ECORE_X_XCB */
1892
1893    if (((ee->alpha) && (alpha)) || ((!ee->alpha) && (!alpha)))
1894      return;
1895
1896    if (!strcmp(ee->driver, "software_x11"))
1897      {
1898 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
1899         Evas_Engine_Info_Software_X11 *einfo;
1900
1901         einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
1902         if (!einfo) return;
1903
1904         if (!ecore_x_composite_query()) return;
1905
1906         ee->shaped = 0;
1907         ee->alpha = alpha;
1908         ecore_x_window_free(ee->prop.window);
1909         ecore_event_window_unregister(ee->prop.window);
1910         if (ee->alpha)
1911           {
1912              if (ee->prop.override)
1913                ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1914              else
1915                ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1916              if (!ee->engine.x.mask)
1917                ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
1918           }
1919         else
1920           {
1921              if (ee->prop.override)
1922                ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1923              else
1924                ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1925              if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1926              ee->engine.x.mask = 0;
1927              ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1928           }
1929
1930         einfo->info.destination_alpha = alpha;
1931
1932 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
1933         cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->prop.window);
1934         cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
1935
1936         reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
1937         reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
1938         einfo->info.visual = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
1939         einfo->info.colormap = reply_attr->colormap;
1940         einfo->info.depth = reply_geom->depth;
1941         free(reply_geom);
1942         free(reply_attr);
1943 # else
1944         XGetWindowAttributes(ecore_x_display_get(), ee->prop.window, &att);
1945         einfo->info.visual = att.visual;
1946         einfo->info.colormap = att.colormap;
1947         einfo->info.depth = att.depth;
1948 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
1949
1950 //        if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1951 //        ee->engine.x.mask = 0;
1952         einfo->info.mask = ee->engine.x.mask;
1953         einfo->info.drawable = ee->prop.window;
1954         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1955           {
1956              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1957           }
1958         evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
1959         ecore_x_window_shape_mask_set(ee->prop.window, 0);
1960         ecore_x_input_multi_select(ee->prop.window);
1961         ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
1962         if (ee->prop.borderless)
1963           ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
1964         if (ee->visible) ecore_x_window_show(ee->prop.window);
1965         if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
1966         if (ee->prop.title)
1967           {
1968              ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
1969              ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
1970           }
1971         ecore_x_icccm_hints_set(ee->prop.window,
1972                                 1 /* accepts_focus */,
1973                                 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
1974                                 0 /* icon_pixmap */,
1975                                 0 /* icon_mask */,
1976                                 0 /* icon_window */,
1977                                 0 /* window_group */,
1978                                 0 /* is_urgent */);
1979         _ecore_evas_x_group_leader_update(ee);
1980         ecore_x_window_defaults_set(ee->prop.window);
1981         _ecore_evas_x_protocols_set(ee);
1982         _ecore_evas_x_sync_set(ee);
1983 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
1984         if (getenv("DESKTOP_STARTUP_ID"))
1985           {
1986              ecore_x_netwm_startup_id_set(ee->prop.window,
1987                                           getenv("DESKTOP_STARTUP_ID"));
1988              /* NB: on linux this may simply empty the env as opposed to completely
1989               * unset it to being empty - unsure as solartis libc crashes looking
1990               * for the '=' char */
1991              //        putenv((char*)"DESKTOP_STARTUP_ID=");
1992           }
1993      }
1994    else if (!strcmp(ee->driver, "opengl_x11"))
1995      {
1996 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
1997         Evas_Engine_Info_GL_X11 *einfo;
1998
1999         einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
2000         if (!einfo) return;
2001
2002         if (!ecore_x_composite_query()) return;
2003
2004         ee->shaped = 0;
2005         ee->alpha = alpha;
2006         ecore_x_window_free(ee->prop.window);
2007         ecore_event_window_unregister(ee->prop.window);
2008         ee->prop.window = 0;
2009         
2010         einfo->info.destination_alpha = alpha;
2011         
2012         if (ee->engine.x.win_root != 0)
2013           {
2014              /* FIXME: round trip in ecore_x_window_argb_get */
2015              if (ecore_x_window_argb_get(ee->engine.x.win_root))
2016                {
2017                   ee->prop.window = _ecore_evas_x_gl_window_new
2018                     (ee, ee->engine.x.win_root, 
2019                      ee->req.x, ee->req.y, ee->req.w, ee->req.h,
2020                      ee->prop.override, 1, NULL);
2021                }
2022              else
2023                ee->prop.window = _ecore_evas_x_gl_window_new
2024                (ee, ee->engine.x.win_root,
2025                 ee->req.x, ee->req.y, ee->req.w, ee->req.h,
2026                 ee->prop.override, ee->alpha, NULL);
2027           }
2028         else
2029           ee->prop.window = _ecore_evas_x_gl_window_new
2030           (ee, ee->engine.x.win_root, 
2031            ee->req.x, ee->req.y, ee->req.w, ee->req.h,
2032            ee->prop.override, ee->alpha, NULL);
2033         if (!ee->prop.window)
2034           {
2035              return;
2036           }
2037 /*        
2038         if (ee->alpha)
2039           {
2040              if (ee->prop.override)
2041                ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2042              else
2043                ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2044              if (!ee->engine.x.mask)
2045                ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2046           }
2047         else
2048           {
2049              if (ee->prop.override)
2050                ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2051              else
2052                ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2053              if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2054              ee->engine.x.mask = 0;
2055              ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2056           }
2057  */
2058
2059         XGetWindowAttributes(ecore_x_display_get(), ee->prop.window, &att);
2060         einfo->info.visual = att.visual;
2061         einfo->info.colormap = att.colormap;
2062         einfo->info.depth = att.depth;
2063
2064 //        if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2065 //        ee->engine.x.mask = 0;
2066 //        einfo->info.mask = ee->engine.x.mask;
2067         einfo->info.drawable = ee->prop.window;
2068         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2069           {
2070              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2071           }
2072         evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2073 //        ecore_x_window_shape_mask_set(ee->prop.window, 0);
2074         ecore_x_input_multi_select(ee->prop.window);
2075         ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
2076         if (ee->prop.borderless)
2077           ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2078         if (ee->visible) ecore_x_window_show(ee->prop.window);
2079         if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2080         if (ee->prop.title)
2081           {
2082              ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2083              ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2084           }
2085         ecore_x_icccm_hints_set(ee->prop.window,
2086                                 1 /* accepts_focus */,
2087                                 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2088                                 0 /* icon_pixmap */,
2089                                 0 /* icon_mask */,
2090                                 0 /* icon_window */,
2091                                 0 /* window_group */,
2092                                 0 /* is_urgent */);
2093         _ecore_evas_x_group_leader_update(ee);
2094         ecore_x_window_defaults_set(ee->prop.window);
2095         _ecore_evas_x_protocols_set(ee);
2096         _ecore_evas_x_sync_set(ee);
2097 #endif /* BUILD_ECORE_EVAS_OPENGL_X11 */
2098         if (getenv("DESKTOP_STARTUP_ID"))
2099           {
2100              ecore_x_netwm_startup_id_set(ee->prop.window,
2101                                           getenv("DESKTOP_STARTUP_ID"));
2102              /* NB: on linux this may simply empty the env as opposed to completely
2103               * unset it to being empty - unsure as solartis libc crashes looking
2104               * for the '=' char */
2105              //        putenv((char*)"DESKTOP_STARTUP_ID=");
2106           }
2107      }
2108    else if (!strcmp(ee->driver, "xrender_x11"))
2109      {
2110 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
2111         Evas_Engine_Info_XRender_X11 *einfo;
2112
2113         einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
2114         if (!einfo) return;
2115         if (!ecore_x_composite_query()) return;
2116
2117         ee->shaped = 0;
2118         ee->alpha = alpha;
2119         ecore_x_window_free(ee->prop.window);
2120         ecore_event_window_unregister(ee->prop.window);
2121         if (ee->alpha)
2122           {
2123              if (ee->prop.override)
2124                ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2125              else
2126                ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2127              if (!ee->engine.x.mask)
2128                ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2129           }
2130         else
2131           {
2132              if (ee->prop.override)
2133                ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2134              else
2135                ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2136              if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2137              ee->engine.x.mask = 0;
2138              ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2139           }
2140
2141         einfo->info.destination_alpha = alpha;
2142
2143 # ifdef BUILD_ECORE_EVAS_XRENDER_XCB
2144         cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
2145         reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
2146
2147         einfo->info.visual = reply_attr->visual;
2148         free(reply_attr);
2149 # else
2150         XGetWindowAttributes(ecore_x_display_get(), ee->prop.window, &att);
2151         einfo->info.visual = att.visual;
2152 # endif /* ! BUILD_ECORE_EVAS_XRENDER_XCB */
2153
2154 //        if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2155 //        ee->engine.x.mask = 0;
2156         einfo->info.mask = ee->engine.x.mask;
2157         einfo->info.drawable = ee->prop.window;
2158         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2159           {
2160              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2161           }
2162         evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2163         ecore_x_window_shape_mask_set(ee->prop.window, 0);
2164         ecore_x_input_multi_select(ee->prop.window);
2165         ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
2166         if (ee->prop.borderless)
2167           ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2168         if (ee->visible) ecore_x_window_show(ee->prop.window);
2169         if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2170         if (ee->prop.title)
2171           {
2172              ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2173              ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2174           }
2175         ecore_x_icccm_hints_set(ee->prop.window,
2176                                 1 /* accepts_focus */,
2177                                 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2178                                 0 /* icon_pixmap */,
2179                                 0 /* icon_mask */,
2180                                 0 /* icon_window */,
2181                                 0 /* window_group */,
2182                                 0 /* is_urgent */);
2183         _ecore_evas_x_group_leader_update(ee);
2184         ecore_x_window_defaults_set(ee->prop.window);
2185         _ecore_evas_x_protocols_set(ee);
2186         _ecore_evas_x_sync_set(ee);
2187 #endif /* BUILD_ECORE_EVAS_XRENDER_X11 || BUILD_ECORE_EVAS_XRENDER_XCB */
2188         if (getenv("DESKTOP_STARTUP_ID"))
2189           {
2190              ecore_x_netwm_startup_id_set(ee->prop.window,
2191                                           getenv("DESKTOP_STARTUP_ID"));
2192              /* NB: on linux this may simply empty the env as opposed to completely
2193               * unset it to being empty - unsure as solartis libc crashes looking
2194               * for the '=' char */
2195              //        putenv((char*)"DESKTOP_STARTUP_ID=");
2196           }
2197      }
2198    else if (!strcmp(ee->driver, "software_16_x11"))
2199      {
2200 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
2201         Evas_Engine_Info_Software_16_X11 *einfo;
2202
2203         einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
2204         if (!einfo) return;
2205
2206         ee->shaped = 0;
2207         ee->alpha = alpha;
2208         ecore_x_window_free(ee->prop.window);
2209         ecore_event_window_unregister(ee->prop.window);
2210         if (ee->alpha)
2211           {
2212              if (ee->prop.override)
2213                ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2214              else
2215                ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2216              if (!ee->engine.x.mask)
2217                ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2218           }
2219         else
2220           {
2221              if (ee->prop.override)
2222                ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2223              else
2224                ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2225              if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2226              ee->engine.x.mask = 0;
2227              ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2228           }
2229
2230 # if 0 /* XXX no alpha window support for software_16_x11 */
2231         einfo->info.destination_alpha = alpha;
2232 # endif /* XXX no alpha window support for software_16_x11 */
2233
2234 # if 0 /* XXX no shaped window support for software_16_x11 */
2235 //        if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2236 //        ee->engine.x.mask = 0;
2237         einfo->info.mask = ee->engine.x.mask;
2238 # endif /* XXX no shaped window support for software_16_x11 */
2239
2240         einfo->info.drawable = ee->prop.window;
2241         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2242           {
2243              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2244           }
2245         evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2246         ecore_x_window_shape_mask_set(ee->prop.window, 0);
2247         ecore_x_input_multi_select(ee->prop.window);
2248         ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
2249         if (ee->prop.borderless)
2250           ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2251         if (ee->visible) ecore_x_window_show(ee->prop.window);
2252         if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2253         if (ee->prop.title)
2254           {
2255              ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2256              ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2257           }
2258         ecore_x_icccm_hints_set(ee->prop.window,
2259                                 1 /* accepts_focus */,
2260                                 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2261                                 0 /* icon_pixmap */,
2262                                 0 /* icon_mask */,
2263                                 0 /* icon_window */,
2264                                 0 /* window_group */,
2265                                 0 /* is_urgent */);
2266         _ecore_evas_x_group_leader_update(ee);
2267         ecore_x_window_defaults_set(ee->prop.window);
2268         _ecore_evas_x_protocols_set(ee);
2269         _ecore_evas_x_sync_set(ee);
2270 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
2271         if (getenv("DESKTOP_STARTUP_ID"))
2272           {
2273              ecore_x_netwm_startup_id_set(ee->prop.window,
2274                                           getenv("DESKTOP_STARTUP_ID"));
2275              /* NB: on linux this may simply empty the env as opposed to completely
2276               * unset it to being empty - unsure as solartis libc crashes looking
2277               * for the '=' char */
2278              //        putenv((char*)"DESKTOP_STARTUP_ID=");
2279           }
2280      }
2281    else if (!strcmp(ee->driver, "software_8_x11"))
2282      {
2283 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
2284         Evas_Engine_Info_Software_8_X11 *einfo;
2285
2286         einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
2287         if (!einfo) return;
2288
2289         ee->shaped = 0;
2290         ee->alpha = alpha;
2291         ecore_x_window_free(ee->prop.window);
2292         ecore_event_window_unregister(ee->prop.window);
2293         if (ee->alpha)
2294           {
2295              if (ee->prop.override)
2296                ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2297              else
2298                ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2299              if (!ee->engine.x.mask)
2300                ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2301           }
2302         else
2303           {
2304              if (ee->prop.override)
2305                ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2306              else
2307                ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2308              if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2309              ee->engine.x.mask = 0;
2310              ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2311           }
2312
2313         einfo->info.destination_alpha = alpha;
2314
2315         cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->prop.window);
2316         cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
2317
2318         reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
2319         reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
2320         einfo->info.visual = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
2321         einfo->info.colormap = reply_attr->colormap;
2322         einfo->info.depth = reply_geom->depth;
2323         free(reply_geom);
2324         free(reply_attr);
2325
2326 //        if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2327 //        ee->engine.x.mask = 0;
2328         einfo->info.mask = ee->engine.x.mask;
2329         einfo->info.drawable = ee->prop.window;
2330         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2331           {
2332              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2333           }
2334         evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2335         ecore_x_window_shape_mask_set(ee->prop.window, 0);
2336         ecore_x_input_multi_select(ee->prop.window);
2337         ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
2338         if (ee->prop.borderless)
2339           ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2340         if (ee->visible) ecore_x_window_show(ee->prop.window);
2341         if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2342         if (ee->prop.title)
2343           {
2344              ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2345              ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2346           }
2347         ecore_x_icccm_hints_set(ee->prop.window,
2348                                 1 /* accepts_focus */,
2349                                 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2350                                 0 /* icon_pixmap */,
2351                                 0 /* icon_mask */,
2352                                 0 /* icon_window */,
2353                                 0 /* window_group */,
2354                                 0 /* is_urgent */);
2355         _ecore_evas_x_group_leader_update(ee);
2356         ecore_x_window_defaults_set(ee->prop.window);
2357         _ecore_evas_x_protocols_set(ee);
2358         _ecore_evas_x_sync_set(ee);
2359
2360         if (getenv("DESKTOP_STARTUP_ID"))
2361           {
2362              ecore_x_netwm_startup_id_set(ee->prop.window,
2363                                           getenv("DESKTOP_STARTUP_ID"));
2364              /* NB: on linux this may simply empty the env as opposed to completely
2365               * unset it to being empty - unsure as solartis libc crashes looking
2366               * for the '=' char */
2367              //        putenv((char*)"DESKTOP_STARTUP_ID=");
2368           }
2369 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
2370      }
2371 }
2372
2373 static void
2374 _ecore_evas_x_transparent_set(Ecore_Evas *ee, int transparent)
2375 {
2376    if (((ee->transparent) && (transparent)) || 
2377        ((!ee->transparent) && (!transparent)))
2378      return;
2379
2380    if (!strcmp(ee->driver, "software_x11"))
2381      {
2382 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
2383         Evas_Engine_Info_Software_X11 *einfo;
2384
2385         einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2386         if (!einfo) return;
2387
2388         ee->transparent = transparent;
2389         einfo->info.destination_alpha = transparent;
2390         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2391           {
2392              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2393           }
2394         evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2395 #endif        
2396      }
2397 }
2398 #endif /* BUILD_ECORE_EVAS_X11 */
2399
2400 #ifdef BUILD_ECORE_EVAS_X11
2401 static void
2402 _ecore_evas_x_show(Ecore_Evas *ee)
2403 {
2404    ee->should_be_visible = 1;
2405    if (ee->prop.avoid_damage)
2406      _ecore_evas_x_render(ee);
2407    _ecore_evas_x_sync_set(ee);
2408    ecore_x_window_show(ee->prop.window);
2409    if (ee->prop.fullscreen)
2410      ecore_x_window_focus(ee->prop.window);
2411 }
2412
2413 static void
2414 _ecore_evas_x_hide(Ecore_Evas *ee)
2415 {
2416    ecore_x_window_hide(ee->prop.window);
2417    ee->should_be_visible = 0;
2418    _ecore_evas_x_sync_set(ee);
2419 }
2420
2421 static void
2422 _ecore_evas_x_raise(Ecore_Evas *ee)
2423 {
2424    if (!ee->prop.fullscreen)
2425      ecore_x_window_raise(ee->prop.window);
2426    else
2427      ecore_x_window_raise(ee->prop.window);
2428 }
2429
2430 static void
2431 _ecore_evas_x_lower(Ecore_Evas *ee)
2432 {
2433    if (!ee->prop.fullscreen)
2434      ecore_x_window_lower(ee->prop.window);
2435    else
2436      ecore_x_window_lower(ee->prop.window);
2437 }
2438
2439 static void
2440 _ecore_evas_x_activate(Ecore_Evas *ee)
2441 {
2442    ecore_x_netwm_client_active_request(ee->engine.x.win_root,
2443                                        ee->prop.window, 2, 0);
2444 }
2445
2446 static void
2447 _ecore_evas_x_title_set(Ecore_Evas *ee, const char *t)
2448 {
2449    if (ee->prop.title) free(ee->prop.title);
2450    ee->prop.title = NULL;
2451    if (t) ee->prop.title = strdup(t);
2452    ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2453    ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2454 }
2455
2456 static void
2457 _ecore_evas_x_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
2458 {
2459    if (ee->prop.name) free(ee->prop.name);
2460    if (ee->prop.clas) free(ee->prop.clas);
2461    ee->prop.name = NULL;
2462    ee->prop.clas = NULL;
2463    if (n) ee->prop.name = strdup(n);
2464    if (c) ee->prop.clas = strdup(c);
2465    ecore_x_icccm_name_class_set(ee->prop.window, ee->prop.name, ee->prop.clas);
2466 }
2467
2468 static void
2469 _ecore_evas_x_size_min_set(Ecore_Evas *ee, int w, int h)
2470 {
2471    if (w < 0) w = 0;
2472    if (h < 0) h = 0;
2473    if ((ee->prop.min.w == w) && (ee->prop.min.h == h)) return;
2474    ee->prop.min.w = w;
2475    ee->prop.min.h = h;
2476    _ecore_evas_x_size_pos_hints_update(ee);
2477 }
2478
2479 static void
2480 _ecore_evas_x_size_max_set(Ecore_Evas *ee, int w, int h)
2481 {
2482    if (w < 0) w = 0;
2483    if (h < 0) h = 0;
2484    if ((ee->prop.max.w == w) && (ee->prop.max.h == h)) return;
2485    ee->prop.max.w = w;
2486    ee->prop.max.h = h;
2487    _ecore_evas_x_size_pos_hints_update(ee);
2488 }
2489
2490 static void
2491 _ecore_evas_x_size_base_set(Ecore_Evas *ee, int w, int h)
2492 {
2493    if (w < 0) w = 0;
2494    if (h < 0) h = 0;
2495    if ((ee->prop.base.w == w) && (ee->prop.base.h == h)) return;
2496    ee->prop.base.w = w;
2497    ee->prop.base.h = h;
2498    _ecore_evas_x_size_pos_hints_update(ee);
2499 }
2500
2501 static void
2502 _ecore_evas_x_size_step_set(Ecore_Evas *ee, int w, int h)
2503 {
2504    if (w < 1) w = 1;
2505    if (h < 1) h = 1;
2506    if ((ee->prop.step.w == w) && (ee->prop.step.h == h)) return;
2507    ee->prop.step.w = w;
2508    ee->prop.step.h = h;
2509    _ecore_evas_x_size_pos_hints_update(ee);
2510 }
2511
2512 static void
2513 _ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2514 {
2515    Ecore_Evas *ee;
2516
2517    ee = data;
2518    if (ee)
2519      ee->prop.cursor.object = NULL;
2520 }
2521
2522 static void
2523 _ecore_evas_x_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
2524 {
2525    int x, y;
2526
2527    if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
2528
2529    if (!obj)
2530      {
2531         ee->prop.cursor.object = NULL;
2532         ee->prop.cursor.layer = 0;
2533         ee->prop.cursor.hot.x = 0;
2534         ee->prop.cursor.hot.y = 0;
2535         ecore_x_window_cursor_show(ee->prop.window, 1);
2536         return;
2537      }
2538
2539    ee->prop.cursor.object = obj;
2540    ee->prop.cursor.layer = layer;
2541    ee->prop.cursor.hot.x = hot_x;
2542    ee->prop.cursor.hot.y = hot_y;
2543
2544    ecore_x_window_cursor_show(ee->prop.window, 0);
2545
2546    evas_pointer_output_xy_get(ee->evas, &x, &y);
2547    evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
2548    evas_object_move(ee->prop.cursor.object,
2549                     x - ee->prop.cursor.hot.x,
2550                     y - ee->prop.cursor.hot.y);
2551    evas_object_pass_events_set(ee->prop.cursor.object, 1);
2552    if (evas_pointer_inside_get(ee->evas))
2553      evas_object_show(ee->prop.cursor.object);
2554
2555    evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
2556 }
2557
2558 /*
2559  * @param ee
2560  * @param layer If < 3, @a ee will be put below all other windows.
2561  *              If > 5, @a ee will be "always-on-top"
2562  *              If = 4, @a ee will be put in the default layer.
2563  *              Acceptable values range from 1 to 255 (0 reserved for
2564  *              desktop windows)
2565  */
2566 static void
2567 _ecore_evas_x_layer_set(Ecore_Evas *ee, int layer)
2568 {
2569    if (ee->prop.layer == layer) return;
2570
2571    /* FIXME: Should this logic be here? */
2572    if (layer < 1)
2573      layer = 1;
2574    else if (layer > 255)
2575      layer = 255;
2576
2577    ee->prop.layer = layer;
2578    _ecore_evas_x_layer_update(ee);
2579 }
2580
2581 static void
2582 _ecore_evas_x_focus_set(Ecore_Evas *ee, int on __UNUSED__)
2583 {
2584    ecore_x_window_focus(ee->prop.window);
2585 }
2586
2587 static void
2588 _ecore_evas_x_iconified_set(Ecore_Evas *ee, int on)
2589 {
2590 //   if (((ee->prop.iconified) && (on)) ||
2591 //       ((!ee->prop.iconified) && (!on))) return;
2592    ee->prop.iconified = on;
2593    if (on)
2594      {
2595         ecore_x_icccm_hints_set(ee->prop.window,
2596                                 1 /* accepts_focus */,
2597                                 ECORE_X_WINDOW_STATE_HINT_ICONIC /* initial_state */,
2598                                 0 /* icon_pixmap */,
2599                                 0 /* icon_mask */,
2600                                 0 /* icon_window */,
2601                                 0 /* window_group */,
2602                                 0 /* is_urgent */);
2603         ecore_x_icccm_iconic_request_send(ee->prop.window, ee->engine.x.win_root);
2604      }
2605    else
2606      {
2607         ecore_x_icccm_hints_set(ee->prop.window,
2608                                 1 /* accepts_focus */,
2609                                 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2610                                 0 /* icon_pixmap */,
2611                                 0 /* icon_mask */,
2612                                 0 /* icon_window */,
2613                                 0 /* window_group */,
2614                                 0 /* is_urgent */);
2615         ecore_evas_show(ee);
2616      }
2617 }
2618
2619 static void
2620 _ecore_evas_x_borderless_set(Ecore_Evas *ee, int on)
2621 {
2622    if (((ee->prop.borderless) && (on)) ||
2623        ((!ee->prop.borderless) && (!on))) return;
2624    ee->prop.borderless = on;
2625    ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2626 }
2627
2628 /* FIXME: This function changes the initial state of the ee
2629  * whilest the iconic function changes the current state! */
2630 static void
2631 _ecore_evas_x_withdrawn_set(Ecore_Evas *ee, int withdrawn)
2632 {
2633    Ecore_X_Window_State_Hint hint;
2634
2635    if ((ee->prop.withdrawn && withdrawn) ||
2636       (!ee->prop.withdrawn && !withdrawn)) return;
2637
2638    ee->prop.withdrawn = withdrawn;
2639    if (withdrawn)
2640      hint = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
2641    else
2642      hint = ECORE_X_WINDOW_STATE_HINT_NORMAL;
2643
2644    ecore_x_icccm_hints_set(ee->prop.window,
2645                            1 /* accepts_focus */,
2646                            hint /* initial_state */,
2647                            0 /* icon_pixmap */,
2648                            0 /* icon_mask */,
2649                            0 /* icon_window */,
2650                            0 /* window_group */,
2651                            0 /* is_urgent */);
2652 }
2653
2654 static void
2655 _ecore_evas_x_sticky_set(Ecore_Evas *ee, int sticky)
2656 {
2657    if ((ee->prop.sticky && sticky) ||
2658       (!ee->prop.sticky && !sticky)) return;
2659
2660    /* We dont want to set prop.sticky here as it will cause
2661     * the sticky callback not to get called. Its set on the
2662     * property change event.
2663     * ee->prop.sticky = sticky;
2664     */
2665    ee->engine.x.state.sticky = sticky;
2666    if (ee->should_be_visible)
2667      ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2668                                       ECORE_X_WINDOW_STATE_STICKY, -1, sticky);
2669    else
2670      _ecore_evas_x_state_update(ee);
2671 }
2672
2673 static void
2674 _ecore_evas_x_ignore_events_set(Ecore_Evas *ee, int ignore)
2675 {
2676    if ((ee->ignore_events && ignore) ||
2677        (!ee->ignore_events && !ignore)) return;
2678
2679    if (ignore)
2680      {
2681         ee->ignore_events = 1;
2682         if (ee->prop.window)
2683           ecore_x_window_ignore_set(ee->prop.window, 1);
2684      }
2685    else
2686      {
2687         ee->ignore_events = 0;
2688         if (ee->prop.window)
2689           ecore_x_window_ignore_set(ee->prop.window, 0);
2690      }
2691 }
2692
2693 /*
2694 static void
2695 _ecore_evas_x_reinit_win(Ecore_Evas *ee)
2696 {
2697    if (!strcmp(ee->driver, "software_x11"))
2698      {
2699 #ifdef BUILD_ECORE_EVAS_X11
2700         Evas_Engine_Info_Software_X11 *einfo;
2701
2702         einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2703         if (einfo)
2704           {
2705              einfo->info.drawable = ee->prop.window;
2706              evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
2707           }
2708 #endif
2709      }
2710    else if (!strcmp(ee->driver, "xrender_x11"))
2711      {
2712 #ifdef BUILD_ECORE_EVAS_XRENDER_X11
2713         Evas_Engine_Info_XRender_X11 *einfo;
2714
2715         einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
2716         if (einfo)
2717           {
2718              einfo->info.drawable = ee->prop.window;
2719              evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
2720           }
2721 #endif
2722      }
2723    else if (!strcmp(ee->driver, "opengl_x11"))
2724      {
2725 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
2726         Evas_Engine_Info_GL_X11 *einfo;
2727
2728         einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
2729         if (einfo)
2730           {
2731              einfo->info.drawable = ee->prop.window;
2732              evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
2733           }
2734 #endif
2735      }
2736 }
2737 */
2738
2739 static void
2740 _ecore_evas_x_override_set(Ecore_Evas *ee, int on)
2741 {
2742    if (((ee->prop.override) && (on)) ||
2743        ((!ee->prop.override) && (!on))) return;
2744    ecore_x_window_hide(ee->prop.window);
2745    ecore_x_window_override_set(ee->prop.window, on);
2746    if (ee->visible) ecore_x_window_show(ee->prop.window);
2747    if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2748    ee->prop.override = on;
2749 }
2750
2751 static void
2752 _ecore_evas_x_fullscreen_set(Ecore_Evas *ee, int on)
2753 {
2754    if ((ee->prop.fullscreen && on) ||
2755       (!ee->prop.fullscreen && !on)) return;
2756
2757    /* FIXME: Detect if WM is EWMH compliant and handle properly if not,
2758     * i.e. reposition, resize, and change borderless hint */
2759    ee->engine.x.state.fullscreen = on;
2760    if (ee->should_be_visible)
2761      ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2762                                       ECORE_X_WINDOW_STATE_FULLSCREEN, -1, on);
2763    else
2764      _ecore_evas_x_state_update(ee);
2765 }
2766
2767 static void
2768 _ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on)
2769 {
2770    if (ee->prop.avoid_damage == on) return;
2771    if (!strcmp(ee->driver, "opengl_x11")) return;
2772    if (!strcmp(ee->driver, "xrender_x11")) return;
2773
2774    if (!strcmp(ee->driver, "software_x11"))
2775      {
2776 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
2777         Evas_Engine_Info_Software_X11 *einfo;
2778
2779         ee->prop.avoid_damage = on;
2780         einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2781         if (einfo)
2782           {
2783              if (ee->prop.avoid_damage)
2784                {
2785                   ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth);
2786                   ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2787                   einfo->info.drawable = ee->engine.x.pmap;
2788                   if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2789                     {
2790                        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2791                     }
2792                   if ((ee->rotation == 90) || (ee->rotation == 270))
2793                     evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2794                   else
2795                     evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2796                   if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN)
2797                     {
2798                        ee->engine.x.using_bg_pixmap = 1;
2799                        ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2800                        ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2801                     }
2802                   if (ee->engine.x.direct_resize)
2803                     {
2804                        /* Turn this off for now
2805                           ee->engine.x.using_bg_pixmap = 1;
2806                           ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2807                        */
2808                     }
2809                }
2810              else
2811                {
2812                   if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2813                   if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2814                   if (ee->engine.x.using_bg_pixmap)
2815                     {
2816                        ecore_x_window_pixmap_set(ee->prop.window, 0);
2817                        ee->engine.x.using_bg_pixmap = 0;
2818                        ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2819                     }
2820                   ee->engine.x.pmap = 0;
2821                   ee->engine.x.gc = 0;
2822                   einfo->info.drawable = ee->prop.window;
2823                   if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2824                     {
2825                        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2826                     }
2827                }
2828           }
2829 #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
2830      }
2831    else if (!strcmp(ee->driver, "software_16_x11"))
2832      {
2833 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
2834         Evas_Engine_Info_Software_16_X11 *einfo;
2835         ee->prop.avoid_damage = on;
2836
2837         einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
2838         if (einfo)
2839           {
2840              if (ee->prop.avoid_damage)
2841                {
2842                   ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 16);
2843                   ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2844                   einfo->info.drawable = ee->engine.x.pmap;
2845                   if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2846                     {
2847                        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2848                     }
2849                   if ((ee->rotation == 90) || (ee->rotation == 270))
2850                     evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2851                   else
2852                     evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2853                   if (ee->engine.x.direct_resize)
2854                     {
2855                        /* Turn this off for now
2856                           ee->engine.x.using_bg_pixmap = 1;
2857                           ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2858                        */
2859                     }
2860                }
2861              else
2862                {
2863                   if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2864                   if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2865                   if (ee->engine.x.using_bg_pixmap)
2866                     {
2867                        ecore_x_window_pixmap_set(ee->prop.window, 0);
2868                        ee->engine.x.using_bg_pixmap = 0;
2869                     }
2870                   ee->engine.x.pmap = 0;
2871                   ee->engine.x.gc = 0;
2872                   einfo->info.drawable = ee->prop.window;
2873                   if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2874                     {
2875                        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2876                     }
2877                }
2878           }
2879 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
2880      }
2881    else if (!strcmp(ee->driver, "software_8_x11"))
2882      {
2883 #if BUILD_ECORE_EVAS_SOFTWARE_8_X11
2884         Evas_Engine_Info_Software_8_X11 *einfo;
2885
2886         ee->prop.avoid_damage = on;
2887         einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
2888         if (einfo)
2889           {
2890              if (ee->prop.avoid_damage)
2891                {
2892                   ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth);
2893                   ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2894                   einfo->info.drawable = ee->engine.x.pmap;
2895                   if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2896                     {
2897                        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2898                     }
2899                   if ((ee->rotation == 90) || (ee->rotation == 270))
2900                     evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2901                   else
2902                     evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2903                   if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN)
2904                     {
2905                        ee->engine.x.using_bg_pixmap = 1;
2906                        ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2907                        ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2908                     }
2909                   if (ee->engine.x.direct_resize)
2910                     {
2911                        /* Turn this off for now
2912                           ee->engine.x.using_bg_pixmap = 1;
2913                           ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2914                        */
2915                     }
2916                }
2917              else
2918                {
2919                   if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2920                   if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2921                   if (ee->engine.x.using_bg_pixmap)
2922                     {
2923                        ecore_x_window_pixmap_set(ee->prop.window, 0);
2924                        ee->engine.x.using_bg_pixmap = 0;
2925                        ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2926                     }
2927                   ee->engine.x.pmap = 0;
2928                   ee->engine.x.gc = 0;
2929                   einfo->info.drawable = ee->prop.window;
2930                   if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2931                     {
2932                        ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2933                     }
2934                }
2935           }
2936 #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
2937      }
2938 }
2939
2940 int
2941 _ecore_evas_x_shutdown(void)
2942 {
2943    _ecore_evas_init_count--;
2944    if (_ecore_evas_init_count == 0)
2945      {
2946         unsigned int i;
2947
2948         for (i = 0; i < sizeof(ecore_evas_event_handlers) / sizeof(Ecore_Event_Handler*); i++)
2949           {
2950              if (ecore_evas_event_handlers[i])
2951                ecore_event_handler_del(ecore_evas_event_handlers[i]);
2952           }
2953         ecore_event_evas_shutdown();
2954      }
2955    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
2956    return _ecore_evas_init_count;
2957 }
2958
2959 static Ecore_Evas_Engine_Func _ecore_x_engine_func =
2960 {
2961    _ecore_evas_x_free,
2962      NULL,
2963      NULL,
2964      NULL,
2965      NULL,
2966      _ecore_evas_x_callback_delete_request_set,
2967      NULL,
2968      NULL,
2969      NULL,
2970      NULL,
2971      NULL,
2972      NULL,
2973      NULL,
2974      NULL,
2975      NULL,
2976      _ecore_evas_x_move,
2977      _ecore_evas_x_managed_move,
2978      _ecore_evas_x_resize,
2979      _ecore_evas_x_move_resize,
2980      _ecore_evas_x_rotation_set,
2981      _ecore_evas_x_shaped_set,
2982      _ecore_evas_x_show,
2983      _ecore_evas_x_hide,
2984      _ecore_evas_x_raise,
2985      _ecore_evas_x_lower,
2986      _ecore_evas_x_activate,
2987      _ecore_evas_x_title_set,
2988      _ecore_evas_x_name_class_set,
2989      _ecore_evas_x_size_min_set,
2990      _ecore_evas_x_size_max_set,
2991      _ecore_evas_x_size_base_set,
2992      _ecore_evas_x_size_step_set,
2993      _ecore_evas_x_object_cursor_set,
2994      _ecore_evas_x_layer_set,
2995      _ecore_evas_x_focus_set,
2996      _ecore_evas_x_iconified_set,
2997      _ecore_evas_x_borderless_set,
2998      _ecore_evas_x_override_set,
2999      NULL,
3000      _ecore_evas_x_fullscreen_set,
3001      _ecore_evas_x_avoid_damage_set,
3002      _ecore_evas_x_withdrawn_set,
3003      _ecore_evas_x_sticky_set,
3004      _ecore_evas_x_ignore_events_set,
3005      _ecore_evas_x_alpha_set,
3006      _ecore_evas_x_transparent_set,
3007      
3008      NULL // render
3009 };
3010 #endif /* BUILD_ECORE_EVAS_X11 */
3011
3012 /*
3013  * FIXME: there are some round trips. Especially, we can split
3014  * ecore_x_init in 2 functions and suppress some round trips.
3015  */
3016
3017 #if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_OPENGL_X11) || defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB) || defined (BUILD_ECORE_EVAS_SOFTWARE_16_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
3018 static void
3019 _ecore_evas_x_flush_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
3020 {
3021    Ecore_Evas *ee = data;
3022
3023    if (ee->no_comp_sync) return;
3024    if (!_ecore_evas_app_comp_sync) return;
3025    if (ee->engine.x.sync_counter)
3026      {
3027         if (ee->engine.x.sync_began)
3028           {
3029              ee->engine.x.sync_val++;
3030              if (!ee->engine.x.sync_cancel)
3031                {
3032                   ecore_x_sync_counter_val_wait(ee->engine.x.sync_counter,
3033                                                 ee->engine.x.sync_val);
3034                }
3035           }
3036      }
3037 }
3038
3039 static void
3040 _ecore_evas_x_flush_post(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
3041 {
3042    Ecore_Evas *ee = data;
3043
3044    if (ee->no_comp_sync) return;
3045    if (!_ecore_evas_app_comp_sync) return;
3046    if (ee->engine.x.sync_counter)
3047      {
3048         if (ee->engine.x.sync_began)
3049           {
3050              if (!ee->engine.x.sync_cancel)
3051                {
3052                   ecore_x_e_comp_sync_draw_done_send(ee->engine.x.win_root, 
3053                                                      ee->prop.window);
3054                }
3055           }
3056      }
3057 }
3058 #endif
3059
3060 /**
3061  * To be documented.
3062  *
3063  * FIXME: To be fixed.
3064  */
3065 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3066 EAPI Ecore_Evas *
3067 ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent,
3068                             int x, int y, int w, int h)
3069 {
3070    Evas_Engine_Info_Software_X11 *einfo;
3071    Ecore_Evas *ee;
3072    int argb = 0;
3073    int rmethod;
3074    static int redraw_debug = -1;
3075
3076    rmethod = evas_render_method_lookup("software_x11");
3077    if (!rmethod) return NULL;
3078    if (!ecore_x_init(disp_name)) return NULL;
3079    ee = calloc(1, sizeof(Ecore_Evas));
3080    if (!ee) return NULL;
3081
3082    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3083
3084    _ecore_evas_x_init();
3085
3086    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3087
3088    ee->driver = "software_x11";
3089    if (disp_name) ee->name = strdup(disp_name);
3090
3091    if (w < 1) w = 1;
3092    if (h < 1) h = 1;
3093    ee->x = x;
3094    ee->y = y;
3095    ee->w = w;
3096    ee->h = h;
3097    ee->req.x = ee->x;
3098    ee->req.y = ee->y;
3099    ee->req.w = ee->w;
3100    ee->req.h = ee->h;
3101
3102    ee->prop.max.w = 32767;
3103    ee->prop.max.h = 32767;
3104    ee->prop.layer = 4;
3105    ee->prop.request_pos = 0;
3106    ee->prop.sticky = 0;
3107    ee->engine.x.state.sticky = 0;
3108
3109    /* init evas here */
3110    ee->evas = evas_new();
3111    evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3112    evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3113    evas_data_attach_set(ee->evas, ee);
3114    evas_output_method_set(ee->evas, rmethod);
3115    evas_output_size_set(ee->evas, w, h);
3116    evas_output_viewport_set(ee->evas, 0, 0, w, h);
3117
3118    ee->engine.x.win_root = parent;
3119    ee->engine.x.screen_num = 0;
3120    
3121    if (parent != 0)
3122      {
3123         ee->engine.x.screen_num = 1; /* FIXME: get real scren # */
3124        /* FIXME: round trip in ecore_x_window_argb_get */
3125         if (ecore_x_window_argb_get(parent))
3126           {
3127              ee->prop.window = ecore_x_window_argb_new(parent, x, y, w, h);
3128              argb = 1;
3129           }
3130         else
3131           ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3132      }
3133    else
3134      ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3135    if (getenv("DESKTOP_STARTUP_ID"))
3136      {
3137         ecore_x_netwm_startup_id_set(ee->prop.window,
3138                                      getenv("DESKTOP_STARTUP_ID"));
3139         /* NB: on linux this may simply empty the env as opposed to completely
3140          * unset it to being empty - unsure as solartis libc crashes looking
3141          * for the '=' char */
3142 //        putenv((char*)"DESKTOP_STARTUP_ID=");
3143      }
3144    einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
3145    if (einfo)
3146      {
3147 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3148         xcb_screen_iterator_t iter;
3149         xcb_screen_t         *screen;
3150 # else
3151         int screen;
3152 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
3153
3154         /* FIXME: this is inefficient as its a round trip */
3155 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3156         screen = ecore_x_default_screen_get();
3157         iter = xcb_setup_roots_iterator (xcb_get_setup (ecore_x_connection_get()));
3158         if (iter.rem > 1)
3159           {
3160              xcb_get_geometry_cookie_t cookie;
3161              xcb_get_geometry_reply_t *reply;
3162              Ecore_X_Window           *roots;
3163              int                       num;
3164              uint8_t                   i;
3165
3166              num = 0;
3167              cookie = xcb_get_geometry_unchecked(ecore_x_connection_get(), parent);
3168              roots = ecore_x_window_root_list(&num);
3169              if (roots)
3170                {
3171                   reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
3172
3173                   if (reply)
3174                     {
3175                        for (i = 0; i < num; xcb_screen_next (&iter), i++)
3176                          {
3177                             if (reply->root == roots[i])
3178                               {
3179                                  screen = iter.data;
3180                                  break;
3181                               }
3182                          }
3183                        free(reply);
3184                     }
3185                   free(roots);
3186                }
3187              else
3188                {
3189                   reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
3190                   if (reply) free(reply);
3191                }
3192           }
3193 # else
3194         screen = DefaultScreen(ecore_x_display_get());
3195         if (ScreenCount(ecore_x_display_get()) > 1)
3196           {
3197              Ecore_X_Window *roots;
3198              int num, i;
3199
3200              num = 0;
3201              roots = ecore_x_window_root_list(&num);
3202              if (roots)
3203                {
3204                   XWindowAttributes at;
3205
3206                   if (XGetWindowAttributes(ecore_x_display_get(),
3207                                            parent, &at))
3208                     {
3209                        for (i = 0; i < num; i++)
3210                          {
3211                             if (at.root == roots[i])
3212                               {
3213                                  screen = i;
3214                                  break;
3215                               }
3216                          }
3217                     }
3218                   free(roots);
3219                }
3220           }
3221 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
3222
3223         if (redraw_debug < 0)
3224           {
3225              if (getenv("REDRAW_DEBUG"))
3226                redraw_debug = atoi(getenv("REDRAW_DEBUG"));
3227              else
3228                redraw_debug = 0;
3229           }
3230 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3231         einfo->info.backend = EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB;
3232         einfo->info.connection = ecore_x_connection_get();
3233         einfo->info.screen = screen;
3234 # else
3235         einfo->info.backend = EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB;
3236         einfo->info.connection = ecore_x_display_get();
3237         einfo->info.screen = NULL;
3238 #ifdef EVAS_FRAME_QUEUING
3239         {
3240            char    *render_mode;
3241            render_mode = getenv("EVAS_RENDER_MODE");
3242            if (render_mode && !strcmp(render_mode, "non-blocking"))
3243              {
3244                 einfo->render_mode = EVAS_RENDER_MODE_NONBLOCKING;
3245              }
3246         }
3247 #endif
3248
3249 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
3250         einfo->info.drawable = ee->prop.window;
3251         if (argb)
3252           {
3253         /* FIXME: round trip */
3254 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3255              xcb_get_geometry_cookie_t          cookie_geom;
3256              xcb_get_window_attributes_cookie_t cookie_attr;
3257              xcb_get_geometry_reply_t          *reply_geom;
3258              xcb_get_window_attributes_reply_t *reply_attr;
3259
3260              cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->prop.window);
3261              cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
3262
3263              reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
3264              reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
3265              if (reply_attr && reply_geom)
3266                {
3267                   einfo->info.visual   = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
3268                   einfo->info.colormap = reply_attr->colormap;
3269                   einfo->info.depth    = reply_geom->depth;
3270                   einfo->info.destination_alpha = 1;
3271                   free(reply_geom);
3272                   free(reply_attr);
3273                }
3274 # else
3275              XWindowAttributes at;
3276
3277              if (XGetWindowAttributes(ecore_x_display_get(), ee->prop.window,
3278                                       &at))
3279                {
3280                   einfo->info.visual   = at.visual;
3281                   einfo->info.colormap = at.colormap;
3282                   einfo->info.depth    = at.depth;
3283                   einfo->info.destination_alpha = 1;
3284                }
3285 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
3286           }
3287         else
3288           {
3289 # ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
3290              xcb_screen_t *screen;
3291
3292              screen = ecore_x_default_screen_get();
3293              einfo->info.visual   = xcb_visualtype_get(screen, screen->root_visual);
3294              einfo->info.colormap = screen->default_colormap;
3295              einfo->info.depth    = screen->root_depth;
3296 #else
3297              einfo->info.visual   = DefaultVisual(ecore_x_display_get(), screen);
3298              einfo->info.colormap = DefaultColormap(ecore_x_display_get(), screen);
3299              einfo->info.depth    = DefaultDepth(ecore_x_display_get(), screen);
3300 # endif /* ! BUILD_ECORE_EVAS_SOFTWARE_XCB */
3301              einfo->info.destination_alpha = 0;
3302           }
3303         einfo->info.rotation = 0;
3304         einfo->info.debug    = redraw_debug;
3305         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3306           {
3307              ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3308              ecore_evas_free(ee);
3309              return NULL;
3310           }
3311      }
3312    
3313    ecore_x_icccm_hints_set(ee->prop.window,
3314                            1 /* accepts_focus */,
3315                            ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
3316                            0 /* icon_pixmap */,
3317                            0 /* icon_mask */,
3318                            0 /* icon_window */,
3319                            0 /* window_group */,
3320                            0 /* is_urgent */);
3321    _ecore_evas_x_group_leader_set(ee);
3322    ecore_x_window_defaults_set(ee->prop.window);
3323    _ecore_evas_x_protocols_set(ee);
3324    _ecore_evas_x_sync_set(ee);
3325
3326    ee->engine.func->fn_render = _ecore_evas_x_render;
3327    _ecore_evas_register(ee);
3328    ecore_x_input_multi_select(ee->prop.window);
3329    ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
3330    return ee;
3331 }
3332 #else
3333 EAPI Ecore_Evas *
3334 ecore_evas_software_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3335                             int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3336 {
3337    return NULL;
3338 }
3339 #endif
3340
3341 /**
3342  * To be documented.
3343  *
3344  * FIXME: To be fixed.
3345  */
3346 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3347 EAPI Ecore_X_Window
3348 ecore_evas_software_x11_window_get(const Ecore_Evas *ee)
3349 {
3350    return (Ecore_X_Window) ecore_evas_window_get(ee);
3351 }
3352 #else
3353 EAPI Ecore_X_Window
3354 ecore_evas_software_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3355 {
3356    return 0;
3357 }
3358 #endif
3359
3360 /**
3361  * To be documented.
3362  *
3363  * FIXME: To be fixed.
3364  */
3365 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3366 EAPI void
3367 ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3368 {
3369    ee->engine.x.direct_resize = on;
3370    if (ee->prop.avoid_damage)
3371      {
3372         if (ee->engine.x.direct_resize)
3373           {
3374 /* turn this off for now
3375              ee->engine.x.using_bg_pixmap = 1;
3376              ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
3377  */
3378           }
3379         else
3380           {
3381 /* turn this off too- bg pixmap is controlled by avoid damage directly
3382              ee->engine.x.using_bg_pixmap = 0;
3383              ecore_x_window_pixmap_set(ee->prop.window, 0);
3384              ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
3385  */
3386           }
3387      }
3388 }
3389 #else
3390 EAPI void
3391 ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3392 {
3393 }
3394 #endif
3395
3396 /**
3397  * To be documented.
3398  *
3399  * FIXME: To be fixed.
3400  */
3401 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3402 EAPI Eina_Bool
3403 ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee)
3404 {
3405    return ee->engine.x.direct_resize;
3406 }
3407 #else
3408 EAPI Eina_Bool
3409 ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3410 {
3411    return 0;
3412 }
3413 #endif
3414
3415 /**
3416  * To be documented.
3417  *
3418  * FIXME: To be fixed.
3419  */
3420 #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3421 EAPI void
3422 ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3423 {
3424    Ecore_X_Window *winp;
3425
3426    winp = malloc(sizeof(Ecore_X_Window));
3427    if (winp)
3428      {
3429         *winp = win;
3430         ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
3431         ecore_x_input_multi_select(win);
3432         ecore_event_window_register(win, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
3433      }
3434 }
3435 #else
3436 EAPI void
3437 ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3438 {
3439 }
3440 #endif
3441
3442 /**
3443  * To be documented.
3444  *
3445  * FIXME: To be fixed.
3446  */
3447 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3448 EAPI Ecore_Evas *
3449 ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent,
3450                       int x, int y, int w, int h)
3451 {
3452    return ecore_evas_gl_x11_options_new(disp_name, parent, x, y, w, h, NULL);
3453 }
3454 EAPI Ecore_Evas *
3455 ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent,
3456                               int x, int y, int w, int h, const int *opt)
3457 {
3458 # ifdef HAVE_ECORE_X_XCB
3459    Ecore_Evas *ee = NULL;
3460 # else
3461    Ecore_Evas *ee;
3462    int rmethod;
3463
3464    rmethod = evas_render_method_lookup("gl_x11");
3465    if (!rmethod) return NULL;
3466    if (!ecore_x_init(disp_name)) return NULL;
3467    ee = calloc(1, sizeof(Ecore_Evas));
3468    if (!ee) return NULL;
3469
3470    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3471
3472    _ecore_evas_x_init();
3473
3474    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3475
3476    ee->driver = "opengl_x11";
3477    if (disp_name) ee->name = strdup(disp_name);
3478
3479    if (w < 1) w = 1;
3480    if (h < 1) h = 1;
3481    ee->x = x;
3482    ee->y = y;
3483    ee->w = w;
3484    ee->h = h;
3485    ee->req.x = ee->x;
3486    ee->req.y = ee->y;
3487    ee->req.w = ee->w;
3488    ee->req.h = ee->h;
3489
3490    ee->prop.max.w = 32767;
3491    ee->prop.max.h = 32767;
3492    ee->prop.layer = 4;
3493    ee->prop.request_pos = 0;
3494    ee->prop.sticky = 0;
3495    ee->engine.x.state.sticky = 0;
3496
3497    /* init evas here */
3498    ee->evas = evas_new();
3499    evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3500    evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3501    evas_data_attach_set(ee->evas, ee);
3502    evas_output_method_set(ee->evas, rmethod);
3503    evas_output_size_set(ee->evas, w, h);
3504    evas_output_viewport_set(ee->evas, 0, 0, w, h);
3505
3506    if (parent == 0) parent = DefaultRootWindow(ecore_x_display_get());
3507    ee->engine.x.win_root = parent;
3508
3509    if (ee->engine.x.win_root != 0)
3510      {
3511         ee->engine.x.screen_num = 1; /* FIXME: get real scren # */
3512        /* FIXME: round trip in ecore_x_window_argb_get */
3513         if (ecore_x_window_argb_get(ee->engine.x.win_root))
3514           {
3515              ee->prop.window = _ecore_evas_x_gl_window_new
3516                (ee, ee->engine.x.win_root, x, y, w, h, 0, 1, opt);
3517           }
3518         else
3519           ee->prop.window = _ecore_evas_x_gl_window_new
3520           (ee, ee->engine.x.win_root, x, y, w, h, 0, 0, opt);
3521      }
3522    else
3523      ee->prop.window = _ecore_evas_x_gl_window_new
3524      (ee, ee->engine.x.win_root, x, y, w, h, 0, 0, opt);
3525    if (!ee->prop.window)
3526      {
3527         ecore_evas_free(ee);
3528         return NULL;
3529      }
3530    if (getenv("DESKTOP_STARTUP_ID"))
3531      {
3532         ecore_x_netwm_startup_id_set(ee->prop.window,
3533                                      getenv("DESKTOP_STARTUP_ID"));
3534         /* NB: on linux this may simply empty the env as opposed to completely
3535          * unset it to being empty - unsure as solartis libc crashes looking
3536          * for the '=' char */
3537 //        putenv((char*)"DESKTOP_STARTUP_ID=");
3538      }
3539
3540    ecore_x_icccm_hints_set(ee->prop.window,
3541                            1 /* accepts_focus */,
3542                            ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
3543                            0 /* icon_pixmap */,
3544                            0 /* icon_mask */,
3545                            0 /* icon_window */,
3546                            0 /* window_group */,
3547                            0 /* is_urgent */);
3548    _ecore_evas_x_group_leader_set(ee);
3549    ecore_x_window_defaults_set(ee->prop.window);
3550    _ecore_evas_x_protocols_set(ee);
3551    _ecore_evas_x_sync_set(ee);
3552
3553    ee->engine.func->fn_render = _ecore_evas_x_render;
3554    _ecore_evas_register(ee);
3555    ecore_x_input_multi_select(ee->prop.window);
3556    ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
3557 # endif /* HAVE_ECORE_X_XCB */
3558
3559    return ee;
3560 }
3561 #else
3562 EAPI Ecore_Evas *
3563 ecore_evas_gl_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3564                       int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3565 {
3566    return NULL;
3567 }
3568 EAPI Ecore_Evas *
3569 ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent,
3570                               int x, int y, int w, int h, const int *opt)
3571 {
3572    return NULL;
3573 }
3574 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3575
3576 /**
3577  * To be documented.
3578  *
3579  * FIXME: To be fixed.
3580  */
3581 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3582 EAPI Ecore_X_Window
3583 ecore_evas_gl_x11_window_get(const Ecore_Evas *ee)
3584 {
3585    return (Ecore_X_Window) ecore_evas_window_get(ee);
3586 }
3587 #else
3588 EAPI Ecore_X_Window
3589 ecore_evas_gl_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3590 {
3591    return 0;
3592 }
3593 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3594
3595 /**
3596  * To be documented.
3597  *
3598  * FIXME: To be fixed.
3599  */
3600 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3601 EAPI void
3602 ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3603 {
3604    ee->engine.x.direct_resize = on;
3605 }
3606 #else
3607 EAPI void
3608 ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3609 {
3610 }
3611 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3612
3613 /**
3614  * To be documented.
3615  *
3616  * FIXME: To be fixed.
3617  */
3618 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3619 EAPI Eina_Bool
3620 ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee)
3621 {
3622    return ee->engine.x.direct_resize;
3623 }
3624 #else
3625 EAPI Eina_Bool
3626 ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3627 {
3628    return 0;
3629 }
3630 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3631
3632 /**
3633  * To be documented.
3634  *
3635  * FIXME: To be fixed.
3636  */
3637 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3638 EAPI void
3639 ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3640 {
3641    ecore_evas_software_x11_extra_event_window_add(ee, win);
3642 }
3643 #else
3644 EAPI void
3645 ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3646 {
3647 }
3648 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3649
3650 /**
3651  * To be documented.
3652  *
3653  * FIXME: To be fixed.
3654  */
3655 #ifdef BUILD_ECORE_EVAS_OPENGL_X11
3656 EAPI void
3657 ecore_evas_gl_x11_pre_post_swap_callback_set(const Ecore_Evas *ee, void *data, void (*pre_cb) (void *data, Evas *e), void (*post_cb) (void *data, Evas *e))
3658 {
3659    Evas_Engine_Info_GL_X11 *einfo;
3660    
3661    if (!(!strcmp(ee->driver, "opengl_x11"))) return;
3662  
3663    einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
3664    if (einfo)
3665      {
3666         einfo->callback.pre_swap = pre_cb;
3667         einfo->callback.pre_swap = post_cb;
3668         einfo->callback.data = data;
3669         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3670           {
3671              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
3672           }
3673      }
3674 }
3675 #else
3676 EAPI void
3677 ecore_evas_gl_x11_pre_post_swap_callback_set(const Ecore_Evas *ee, void *data, void (*pre_cb) (void *data, Evas *e), void (*post_cb) (void *data, Evas *e))
3678 {
3679    return;
3680 }
3681 #endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3682
3683 /**
3684  * To be documented.
3685  *
3686  * FIXME: To be fixed.
3687  */
3688 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
3689 EAPI Ecore_Evas *
3690 ecore_evas_xrender_x11_new(const char *disp_name, Ecore_X_Window parent,
3691                       int x, int y, int w, int h)
3692 {
3693    Evas_Engine_Info_XRender_X11 *einfo;
3694    Ecore_Evas *ee;
3695    int rmethod;
3696
3697    rmethod = evas_render_method_lookup("xrender_x11");
3698    if (!rmethod) return NULL;
3699    if (!ecore_x_init(disp_name)) return NULL;
3700    ee = calloc(1, sizeof(Ecore_Evas));
3701    if (!ee) return NULL;
3702
3703    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3704
3705    _ecore_evas_x_init();
3706
3707    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3708
3709    ee->driver = "xrender_x11";
3710    if (disp_name) ee->name = strdup(disp_name);
3711
3712    if (w < 1) w = 1;
3713    if (h < 1) h = 1;
3714    ee->x = x;
3715    ee->y = y;
3716    ee->w = w;
3717    ee->h = h;
3718    ee->req.x = ee->x;
3719    ee->req.y = ee->y;
3720    ee->req.w = ee->w;
3721    ee->req.h = ee->h;
3722
3723    ee->prop.max.w = 32767;
3724    ee->prop.max.h = 32767;
3725    ee->prop.layer = 4;
3726    ee->prop.request_pos = 0;
3727    ee->prop.sticky = 0;
3728    ee->engine.x.state.sticky = 0;
3729
3730    /* init evas here */
3731    ee->evas = evas_new();
3732    evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3733    evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3734    evas_data_attach_set(ee->evas, ee);
3735    evas_output_method_set(ee->evas, rmethod);
3736    evas_output_size_set(ee->evas, w, h);
3737    evas_output_viewport_set(ee->evas, 0, 0, w, h);
3738
3739    ee->engine.x.win_root = parent;
3740    ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3741    if (getenv("DESKTOP_STARTUP_ID"))
3742      {
3743         ecore_x_netwm_startup_id_set(ee->prop.window,
3744                                      getenv("DESKTOP_STARTUP_ID"));
3745         /* NB: on linux this may simply empty the env as opposed to completely
3746          * unset it to being empty - unsure as solartis libc crashes looking
3747          * for the '=' char */
3748 //        putenv((char*)"DESKTOP_STARTUP_ID=");
3749      }
3750    einfo = (Evas_Engine_Info_XRender_X11 *)evas_engine_info_get(ee->evas);
3751    if (einfo)
3752      {
3753 # ifdef BUILD_ECORE_EVAS_XRENDER_XCB
3754         xcb_screen_iterator_t iter;
3755         xcb_screen_t         *screen;
3756
3757         /* FIXME: this is inefficient as its a round trip */
3758         screen = ecore_x_default_screen_get();
3759         iter = xcb_setup_roots_iterator (xcb_get_setup (ecore_x_connection_get()));
3760         if (iter.rem > 1)
3761           {
3762              xcb_get_geometry_cookie_t cookie;
3763              xcb_get_geometry_reply_t *reply;
3764              Ecore_X_Window           *roots;
3765              int                       num;
3766              uint8_t                   i;
3767
3768              num = 0;
3769              cookie = xcb_get_geometry_unchecked(ecore_x_connection_get(), parent);
3770              roots = ecore_x_window_root_list(&num);
3771              if (roots)
3772                {
3773                   reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
3774
3775                   if (reply)
3776                     {
3777                        for (i = 0; i < num; xcb_screen_next (&iter), i++)
3778                          {
3779                             if (reply->root == roots[i])
3780                               {
3781                                  screen = iter.data;
3782                                  break;
3783                               }
3784                          }
3785                        free(reply);
3786                     }
3787                   free(roots);
3788                }
3789              else
3790                {
3791                   reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
3792                   if (reply) free(reply);
3793                }
3794           }
3795         einfo->info.backend = EVAS_ENGINE_INFO_XRENDER_BACKEND_XCB;
3796         einfo->info.connection = ecore_x_connection_get();
3797         einfo->info.screen = screen;
3798         einfo->info.visual = screen->root_visual;
3799 # elif BUILD_ECORE_EVAS_XRENDER_X11
3800         int screen;
3801
3802         /* FIXME: this is inefficient as its a round trip */
3803         screen = DefaultScreen(ecore_x_display_get());
3804         if (ScreenCount(ecore_x_display_get()) > 1)
3805           {
3806              Ecore_X_Window *roots;
3807              int num, i;
3808
3809              num = 0;
3810              roots = ecore_x_window_root_list(&num);
3811              if (roots)
3812                {
3813                   XWindowAttributes at;
3814
3815                   if (XGetWindowAttributes(ecore_x_display_get(),
3816                                            parent, &at))
3817                     {
3818                        for (i = 0; i < num; i++)
3819                          {
3820                             if (at.root == roots[i])
3821                               {
3822                                  screen = i;
3823                                  break;
3824                               }
3825                          }
3826                     }
3827                   free(roots);
3828                }
3829           }
3830         einfo->info.backend = EVAS_ENGINE_INFO_XRENDER_BACKEND_XLIB;
3831         einfo->info.connection = ecore_x_display_get();
3832         einfo->info.screen = NULL;
3833         einfo->info.visual = DefaultVisual(ecore_x_display_get(), screen);
3834 # endif /* BUILD_ECORE_EVAS_XRENDER_(XCB|X11) */
3835         einfo->info.drawable = ee->prop.window;
3836         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3837           {
3838              ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3839              ecore_evas_free(ee);
3840              return NULL;
3841           }
3842      }
3843
3844    ecore_x_icccm_hints_set(ee->prop.window,
3845                            1 /* accepts_focus */,
3846                            ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
3847                            0 /* icon_pixmap */,
3848                            0 /* icon_mask */,
3849                            0 /* icon_window */,
3850                            0 /* window_group */,
3851                            0 /* is_urgent */);
3852    _ecore_evas_x_group_leader_set(ee);
3853    ecore_x_window_defaults_set(ee->prop.window);
3854    _ecore_evas_x_protocols_set(ee);
3855    _ecore_evas_x_sync_set(ee);
3856
3857    ee->engine.func->fn_render = _ecore_evas_x_render;
3858    _ecore_evas_register(ee);
3859    ecore_x_input_multi_select(ee->prop.window);
3860    ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
3861    return ee;
3862 }
3863 #else
3864 EAPI Ecore_Evas *
3865 ecore_evas_xrender_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3866                            int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3867 {
3868    return NULL;
3869 }
3870 #endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
3871
3872 /**
3873  * To be documented.
3874  *
3875  * FIXME: To be fixed.
3876  */
3877 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
3878 EAPI Ecore_X_Window
3879 ecore_evas_xrender_x11_window_get(const Ecore_Evas *ee)
3880 {
3881    return (Ecore_X_Window) ecore_evas_window_get(ee);
3882 }
3883 #else
3884 EAPI Ecore_X_Window
3885 ecore_evas_xrender_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3886 {
3887    return 0;
3888 }
3889 #endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
3890
3891 /**
3892  * To be documented.
3893  *
3894  * FIXME: To be fixed.
3895  */
3896 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
3897 EAPI void
3898 ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3899 {
3900    ee->engine.x.direct_resize = on;
3901 }
3902 #else
3903 EAPI void
3904 ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3905 {
3906 }
3907 #endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
3908
3909 /**
3910  * To be documented.
3911  *
3912  * FIXME: To be fixed.
3913  */
3914 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
3915 EAPI Eina_Bool
3916 ecore_evas_xrender_x11_direct_resize_get(const Ecore_Evas *ee)
3917 {
3918    return ee->engine.x.direct_resize;
3919 }
3920 #else
3921 EAPI Eina_Bool
3922 ecore_evas_xrender_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3923 {
3924    return 0;
3925 }
3926 #endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
3927
3928 /**
3929  * To be documented.
3930  *
3931  * FIXME: To be fixed.
3932  */
3933 #if defined (BUILD_ECORE_EVAS_XRENDER_X11) || defined (BUILD_ECORE_EVAS_XRENDER_XCB)
3934 EAPI void
3935 ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3936 {
3937    ecore_evas_software_x11_extra_event_window_add(ee, win);
3938 }
3939 #else
3940 EAPI void
3941 ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3942 {
3943 }
3944 #endif /* ! BUILD_ECORE_EVAS_XRENDER_X11 && ! BUILD_ECORE_EVAS_XRENDER_XCB */
3945
3946 /**
3947  * To be documented.
3948  *
3949  * FIXME: To be fixed.
3950  */
3951 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3952 EAPI Ecore_Evas *
3953 ecore_evas_software_x11_16_new(const char *disp_name, Ecore_X_Window parent,
3954                                int x, int y, int w, int h)
3955 {
3956    Evas_Engine_Info_Software_16_X11 *einfo;
3957    Ecore_Evas *ee;
3958    int rmethod;
3959    static int redraw_debug = -1;
3960
3961    rmethod = evas_render_method_lookup("software_16_x11");
3962    if (!rmethod) return NULL;
3963    if (!ecore_x_init(disp_name)) return NULL;
3964    ee = calloc(1, sizeof(Ecore_Evas));
3965    if (!ee) return NULL;
3966
3967    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3968
3969    _ecore_evas_x_init();
3970
3971    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3972
3973    ee->driver = "software_16_x11";
3974    if (disp_name) ee->name = strdup(disp_name);
3975
3976    if (w < 1) w = 1;
3977    if (h < 1) h = 1;
3978    ee->x = x;
3979    ee->y = y;
3980    ee->w = w;
3981    ee->h = h;
3982    ee->req.x = ee->x;
3983    ee->req.y = ee->y;
3984    ee->req.w = ee->w;
3985    ee->req.h = ee->h;
3986
3987    ee->prop.max.w = 32767;
3988    ee->prop.max.h = 32767;
3989    ee->prop.layer = 4;
3990    ee->prop.request_pos = 0;
3991    ee->prop.sticky = 0;
3992    ee->engine.x.state.sticky = 0;
3993
3994    /* init evas here */
3995    ee->evas = evas_new();
3996    evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3997    evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3998    evas_data_attach_set(ee->evas, ee);
3999    evas_output_method_set(ee->evas, rmethod);
4000    evas_output_size_set(ee->evas, w, h);
4001    evas_output_viewport_set(ee->evas, 0, 0, w, h);
4002
4003    ee->engine.x.win_root = parent;
4004    if (parent != 0)
4005      {
4006        /* FIXME: round trip in ecore_x_window_argb_get */
4007         if (ecore_x_window_argb_get(parent))
4008           {
4009              ee->prop.window = ecore_x_window_argb_new(parent, x, y, w, h);
4010           }
4011         else
4012           ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
4013      }
4014    else
4015      ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
4016    if (getenv("DESKTOP_STARTUP_ID"))
4017      {
4018         ecore_x_netwm_startup_id_set(ee->prop.window,
4019                                      getenv("DESKTOP_STARTUP_ID"));
4020         /* NB: on linux this may simply empty the env as opposed to completely
4021          * unset it to being empty - unsure as solartis libc crashes looking
4022          * for the '=' char */
4023 //        putenv((char*)"DESKTOP_STARTUP_ID=");
4024      }
4025    einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
4026
4027    if (einfo)
4028      {
4029         if (ScreenCount(ecore_x_display_get()) > 1)
4030           {
4031              Ecore_X_Window *roots;
4032              int num, i;
4033
4034              num = 0;
4035              roots = ecore_x_window_root_list(&num);
4036              if (roots)
4037                {
4038                   XWindowAttributes at;
4039
4040                   if (XGetWindowAttributes(ecore_x_display_get(),
4041                                            parent, &at))
4042                     {
4043                        for (i = 0; i < num; i++)
4044                          {
4045                             if (at.root == roots[i])
4046                               break;
4047                          }
4048                     }
4049                   free(roots);
4050                }
4051           }
4052
4053         if (redraw_debug < 0)
4054           {
4055              if (getenv("REDRAW_DEBUG"))
4056                redraw_debug = atoi(getenv("REDRAW_DEBUG"));
4057              else
4058                redraw_debug = 0;
4059           }
4060         einfo->info.display  = ecore_x_display_get();
4061         einfo->info.drawable = ee->prop.window;
4062
4063         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
4064           {
4065              ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
4066              ecore_evas_free(ee);
4067              return NULL;
4068           }
4069      }
4070
4071    ecore_x_icccm_hints_set(ee->prop.window,
4072                            1 /* accepts_focus */,
4073                            ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
4074                            0 /* icon_pixmap */,
4075                            0 /* icon_mask */,
4076                            0 /* icon_window */,
4077                            0 /* window_group */,
4078                            0 /* is_urgent */);
4079    _ecore_evas_x_group_leader_set(ee);
4080    ecore_x_window_defaults_set(ee->prop.window);
4081    _ecore_evas_x_protocols_set(ee);
4082    _ecore_evas_x_sync_set(ee);
4083
4084    ee->engine.func->fn_render = _ecore_evas_x_render;
4085    _ecore_evas_register(ee);
4086    ecore_x_input_multi_select(ee->prop.window);
4087    ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
4088    return ee;
4089 }
4090 #else
4091 EAPI Ecore_Evas *
4092 ecore_evas_software_x11_16_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
4093                                int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
4094 {
4095    return NULL;
4096 }
4097 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
4098
4099 /**
4100  * To be documented.
4101  *
4102  * FIXME: To be fixed.
4103  */
4104 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
4105 EAPI Ecore_X_Window
4106 ecore_evas_software_x11_16_window_get(const Ecore_Evas *ee)
4107 {
4108    return (Ecore_X_Window) ecore_evas_window_get(ee);
4109 }
4110 #else
4111 EAPI Ecore_X_Window
4112 ecore_evas_software_x11_16_window_get(const Ecore_Evas *ee __UNUSED__)
4113 {
4114    return 0;
4115 }
4116 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
4117
4118 /**
4119  * To be documented.
4120  *
4121  * FIXME: To be fixed.
4122  */
4123 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
4124 EAPI void
4125 ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
4126 {
4127    ee->engine.x.direct_resize = on;
4128    if (ee->prop.avoid_damage)
4129      {
4130         if (ee->engine.x.direct_resize)
4131           {
4132 /* turn this off for now
4133              ee->engine.x.using_bg_pixmap = 1;
4134              ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
4135  */
4136           }
4137         else
4138           {
4139 /* turn this off too- bg pixmap is controlled by avoid damage directly
4140              ee->engine.x.using_bg_pixmap = 0;
4141              ecore_x_window_pixmap_set(ee->prop.window, 0);
4142              ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
4143  */
4144           }
4145      }
4146 }
4147 #else
4148 EAPI void
4149 ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
4150 {
4151 }
4152 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
4153
4154 /**
4155  * To be documented.
4156  *
4157  * FIXME: To be fixed.
4158  */
4159 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
4160 EAPI Eina_Bool
4161 ecore_evas_software_x11_16_direct_resize_get(const Ecore_Evas *ee)
4162 {
4163    return ee->engine.x.direct_resize;
4164 }
4165 #else
4166 EAPI Eina_Bool
4167 ecore_evas_software_x11_16_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
4168 {
4169    return 0;
4170 }
4171 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
4172
4173 /**
4174  * To be documented.
4175  *
4176  * FIXME: To be fixed.
4177  */
4178 #if BUILD_ECORE_EVAS_SOFTWARE_16_X11
4179 EAPI void
4180 ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
4181 {
4182    Ecore_X_Window *winp;
4183
4184    winp = malloc(sizeof(Ecore_X_Window));
4185    if (winp)
4186      {
4187         *winp = win;
4188         ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
4189         ecore_x_input_multi_select(win);
4190         ecore_event_window_register(win, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
4191      }
4192 }
4193 #else
4194 EAPI void
4195 ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
4196 {
4197 }
4198 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
4199
4200
4201 /**
4202  * To be documented.
4203  *
4204  * FIXME: To be fixed.
4205  */
4206 EAPI Ecore_Evas *
4207 ecore_evas_software_x11_8_new(const char *disp_name, Ecore_X_Window parent,
4208                               int x, int y, int w, int h)
4209 {
4210 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4211    Evas_Engine_Info_Software_8_X11 *einfo;
4212    Ecore_Evas *ee;
4213    int argb = 0;
4214    int rmethod;
4215    static int redraw_debug = -1;
4216
4217    rmethod = evas_render_method_lookup("software_8_x11");
4218    if (!rmethod) return NULL;
4219    if (!ecore_x_init(disp_name)) return NULL;
4220    ee = calloc(1, sizeof(Ecore_Evas));
4221    if (!ee) return NULL;
4222
4223    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
4224
4225    _ecore_evas_x_init();
4226
4227    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
4228
4229    ee->driver = "software_8_x11";
4230    if (disp_name) ee->name = strdup(disp_name);
4231
4232    if (w < 1) w = 1;
4233    if (h < 1) h = 1;
4234    ee->x = x;
4235    ee->y = y;
4236    ee->w = w;
4237    ee->h = h;
4238    ee->req.x = ee->x;
4239    ee->req.y = ee->y;
4240    ee->req.w = ee->w;
4241    ee->req.h = ee->h;
4242
4243    ee->prop.max.w = 32767;
4244    ee->prop.max.h = 32767;
4245    ee->prop.layer = 4;
4246    ee->prop.request_pos = 0;
4247    ee->prop.sticky = 0;
4248    ee->engine.x.state.sticky = 0;
4249
4250    /* init evas here */
4251    ee->evas = evas_new();
4252    evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
4253    evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
4254    evas_data_attach_set(ee->evas, ee);
4255    evas_output_method_set(ee->evas, rmethod);
4256    evas_output_size_set(ee->evas, w, h);
4257    evas_output_viewport_set(ee->evas, 0, 0, w, h);
4258
4259    ee->engine.x.win_root = parent;
4260    //   if (parent != 0)
4261    //     {
4262    //       /* FIXME: round trip in ecore_x_window_argb_get */
4263    //        if (ecore_x_window_argb_get(parent))
4264    //          {
4265    //             ee->engine.x.win = ecore_x_window_argb_new(parent, x, y, w, h);
4266    //             argb = 1;
4267    //          }
4268    //        else
4269    //          ee->engine.x.win = ecore_x_window_new(parent, x, y, w, h);
4270    //     }
4271    //   else
4272    ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
4273    if (getenv("DESKTOP_STARTUP_ID"))
4274      {
4275         ecore_x_netwm_startup_id_set(ee->prop.window,
4276               getenv("DESKTOP_STARTUP_ID"));
4277         /* NB: on linux this may simply empty the env as opposed to completely
4278          * unset it to being empty - unsure as solartis libc crashes looking
4279          * for the '=' char */
4280         //        putenv((char*)"DESKTOP_STARTUP_ID=");
4281      }
4282    einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
4283    if (einfo)
4284      {
4285         xcb_screen_iterator_t iter;
4286         xcb_screen_t         *screen;
4287
4288         /* FIXME: this is inefficient as its a round trip */
4289         //einfo->info.backend = 1;
4290         screen = ecore_x_default_screen_get();
4291         iter = xcb_setup_roots_iterator (xcb_get_setup (ecore_x_connection_get()));
4292         if (iter.rem > 1)
4293           {
4294              xcb_get_geometry_cookie_t cookie;
4295              xcb_get_geometry_reply_t *reply;
4296              Ecore_X_Window           *roots;
4297              int                       num;
4298              uint8_t                   i;
4299
4300              num = 0;
4301              cookie = xcb_get_geometry_unchecked(ecore_x_connection_get(), parent);
4302              roots = ecore_x_window_root_list(&num);
4303              if (roots)
4304                {
4305                   reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
4306
4307                   if (reply)
4308                     {
4309                        for (i = 0; i < num; xcb_screen_next (&iter), i++)
4310                          {
4311                             if (reply->root == roots[i])
4312                               {
4313                                  screen = iter.data;
4314                                  break;
4315                               }
4316                          }
4317                        free(reply);
4318                     }
4319                   free(roots);
4320                }
4321              else
4322                {
4323                   reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
4324                   if (reply) free(reply);
4325                }
4326           }
4327
4328         if (redraw_debug < 0)
4329           {
4330              if (getenv("REDRAW_DEBUG"))
4331                redraw_debug = atoi(getenv("REDRAW_DEBUG"));
4332              else
4333                redraw_debug = 0;
4334           }
4335         einfo->info.connection = ecore_x_connection_get();
4336         einfo->info.screen = screen;
4337         einfo->info.drawable = ee->prop.window;
4338         if (argb)
4339           {
4340              /* FIXME: round trip */
4341              xcb_get_geometry_cookie_t          cookie_geom;
4342              xcb_get_window_attributes_cookie_t cookie_attr;
4343              xcb_get_geometry_reply_t          *reply_geom;
4344              xcb_get_window_attributes_reply_t *reply_attr;
4345
4346              cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->prop.window);
4347              cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
4348
4349              reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
4350              reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
4351              if (reply_attr && reply_geom)
4352                {
4353                   einfo->info.visual   = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
4354                   einfo->info.colormap = reply_attr->colormap;
4355                   einfo->info.depth    = reply_geom->depth;
4356                   einfo->info.destination_alpha = 1;
4357                   free(reply_geom);
4358                   free(reply_attr);
4359                }
4360           }
4361         else
4362           {
4363              xcb_screen_t *screen;
4364
4365              screen = ecore_x_default_screen_get();
4366              einfo->info.visual   = xcb_visualtype_get(screen, screen->root_visual);
4367              einfo->info.colormap = screen->default_colormap;
4368              einfo->info.depth    = screen->root_depth;
4369              einfo->info.destination_alpha = 0;
4370           }
4371         einfo->info.rotation = 0;
4372         einfo->info.debug    = redraw_debug;
4373         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
4374           {
4375              ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
4376              ecore_evas_free(ee);
4377              return NULL;
4378           }
4379      }
4380
4381    ecore_x_icccm_hints_set(ee->prop.window,
4382                            1 /* accepts_focus */,
4383                            ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
4384                            0 /* icon_pixmap */,
4385                            0 /* icon_mask */,
4386                            0 /* icon_window */,
4387                            0 /* window_group */,
4388                            0 /* is_urgent */);
4389    _ecore_evas_x_group_leader_set(ee);
4390    ecore_x_window_defaults_set(ee->prop.window);
4391    _ecore_evas_x_protocols_set(ee);
4392    _ecore_evas_x_sync_set(ee);
4393
4394    ee->engine.func->fn_render = _ecore_evas_x_render;
4395    _ecore_evas_register(ee);
4396    ecore_x_input_multi_select(ee->prop.window);
4397    ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
4398
4399    return ee;
4400 #else
4401    return NULL;
4402    disp_name = NULL;
4403    parent = 0;
4404    x = 0;
4405    y = 0;
4406    w = 0;
4407    h = 0;
4408 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
4409 }
4410
4411 /**
4412  * To be documented.
4413  *
4414  * FIXME: To be fixed.
4415  */
4416 EAPI Ecore_X_Window
4417 ecore_evas_software_x11_8_window_get(const Ecore_Evas *ee)
4418 {
4419 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4420    return (Ecore_X_Window) ecore_evas_window_get(ee);
4421 #else
4422    return 0;
4423    ee = NULL;
4424 #endif
4425 }
4426
4427 /**
4428  * To be documented.
4429  *
4430  * FIXME: To be fixed.
4431  */
4432 EAPI Ecore_X_Window
4433 ecore_evas_software_x11_8_subwindow_get(const Ecore_Evas *ee)
4434 {
4435 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4436    return (Ecore_X_Window) ecore_evas_window_get(ee);
4437 #else
4438    return 0;
4439    ee = NULL;
4440 #endif
4441 }
4442
4443 /**
4444  * To be documented.
4445  *
4446  * FIXME: To be fixed.
4447  */
4448 EAPI void
4449 ecore_evas_software_x11_8_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
4450 {
4451 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4452    ee->engine.x.direct_resize = on;
4453    if (ee->prop.avoid_damage)
4454      {
4455         if (ee->engine.x.direct_resize)
4456           {
4457              /* turn this off for now
4458                 ee->engine.x.using_bg_pixmap = 1;
4459                 ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap);
4460                 */
4461           }
4462         else
4463           {
4464              /* turn this off too- bg pixmap is controlled by avoid damage directly
4465                 ee->engine.x.using_bg_pixmap = 0;
4466                 ecore_x_window_pixmap_set(ee->engine.x.win, 0);
4467                 ecore_x_window_area_expose(ee->engine.x.win, 0, 0, ee->w, ee->h);
4468                 */
4469           }
4470      }
4471 #else
4472    return;
4473    ee = NULL;
4474    on = 0;
4475 #endif
4476 }
4477
4478 /**
4479  * To be documented.
4480  *
4481  * FIXME: To be fixed.
4482  */
4483 EAPI Eina_Bool
4484 ecore_evas_software_x11_8_direct_resize_get(const Ecore_Evas *ee)
4485 {
4486 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4487    return ee->engine.x.direct_resize;
4488 #else
4489    return 0;
4490    ee = NULL;
4491 #endif
4492 }
4493
4494 /**
4495  * To be documented.
4496  *
4497  * FIXME: To be fixed.
4498  */
4499 EAPI void
4500 ecore_evas_software_x11_8_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
4501 {
4502 #if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
4503    Ecore_X_Window *winp;
4504
4505    winp = malloc(sizeof(Ecore_X_Window));
4506    if (winp)
4507      {
4508         *winp = win;
4509         ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
4510         ecore_x_input_multi_select(win);
4511         ecore_event_window_register(win, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb) _ecore_evas_mouse_move_process);
4512      }
4513 #else
4514    return;
4515    ee = NULL;
4516    win = 0;
4517 #endif
4518 }
4519
4520 EAPI void
4521 ecore_evas_x11_leader_set(Ecore_Evas *ee, Ecore_X_Window win)
4522 {
4523 #ifdef BUILD_ECORE_EVAS_X11
4524    _ecore_evas_x_group_leader_unset(ee);
4525    ee->engine.x.leader = win;
4526    _ecore_evas_x_group_leader_update(ee);
4527 #else
4528    return;
4529    ee = NULL;
4530    win = 0;
4531 #endif   
4532 }
4533
4534 EAPI Ecore_X_Window
4535 ecore_evas_x11_leader_get(Ecore_Evas *ee)
4536 {
4537 #ifdef BUILD_ECORE_EVAS_X11
4538    return ee->engine.x.leader;
4539 #else
4540    return 0;
4541    ee = NULL;
4542 #endif   
4543 }
4544
4545 EAPI void
4546 ecore_evas_x11_leader_default_set(Ecore_Evas *ee)
4547 {
4548 #ifdef BUILD_ECORE_EVAS_X11
4549    _ecore_evas_x_group_leader_unset(ee);
4550    _ecore_evas_x_group_leader_set(ee);
4551 #else
4552    return;
4553    ee = NULL;
4554 #endif
4555 }
4556