Tizen 2.0 Release
[profile/ivi/ecore.git] / src / lib / ecore_x / xcb / ecore_xcb_netwm.c
index 13026b1..954e663 100644 (file)
-/*
- * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
- */
+#include "ecore_xcb_private.h"
 
-/*
- * _NET_WM... aka Extended Window Manager Hint (EWMH) functions.
- */
+/* local function prototypes */
+/* static void _ecore_xcb_netwm_startup_info_free(void *data); */
+static Ecore_X_Atom        _ecore_xcb_netwm_window_type_atom_get(Ecore_X_Window_Type type);
+static Ecore_X_Window_Type _ecore_xcb_netwm_window_type_type_get(Ecore_X_Atom atom);
+static Ecore_X_Atom        _ecore_xcb_netwm_window_state_atom_get(Ecore_X_Window_State state);
+static Ecore_X_Atom        _ecore_xcb_netwm_action_atom_get(Ecore_X_Action action);
 
-#include "Ecore_Data.h"
-#include "ecore_xcb_private.h"
-#include "Ecore_X_Atoms.h"
+/* local variables */
+//static Eina_Hash *_startup_info = NULL;
+
+/* local structures */
+typedef struct _Ecore_Xcb_Startup_Info Ecore_Xcb_Startup_Info;
+struct _Ecore_Xcb_Startup_Info
+{
+   Ecore_X_Window win;
+   int            init, size;
+   char          *buffer;
+   int            length;
+
+   /* sequence info fields */
+   char          *id, *name;
+   int            screen;
+   char          *bin, *icon;
+   int            desktop, timestamp;
+   char          *description, *wmclass;
+   int            silent;
+};
 
+EAPI void
+ecore_x_netwm_init(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-/**
- * @defgroup Ecore_X_NetWM_Group Extended Window Manager Hint (EWMH) functions
- *
- * Functions related to the Extended Window Manager Hint (EWMH).
- */
+//   _startup_info =
+//     eina_hash_string_superfast_new(_ecore_xcb_netwm_startup_info_free);
+}
 
+EAPI void
+ecore_x_netwm_shutdown(void)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-typedef struct _Ecore_X_Startup_Info Ecore_X_Startup_Info;
+//   if (_startup_info) eina_hash_free(_startup_info);
+//   _startup_info = NULL;
+}
 
-struct _Ecore_X_Startup_Info
+EAPI Eina_Bool
+ecore_x_netwm_pid_get(Ecore_X_Window win,
+                      int           *pid)
 {
-   Ecore_X_Window win;
+   uint32_t tmp;
 
-   int   init;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   int   buffer_size;
-   char *buffer;
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_PID, &tmp, 1))
+     return EINA_FALSE;
 
-   int   length;
+   if (pid) *pid = tmp;
 
-   /* These are the sequence info fields */
-   char *id;
-   char *name;
-   int   screen;
-   char *bin;
-   char *icon;
-   int   desktop;
-   int   timestamp;
-   char *description;
-   char *wmclass;
-   int   silent;
-};
+   return EINA_TRUE;
+}
 
-#if 0
-static void  _ecore_x_window_prop_string_utf8_get_prefetch(Ecore_X_Window window, Ecore_X_Atom atom);
-static void  _ecore_x_window_prop_string_utf8_get_fetch(void);
-#endif
-static void  _ecore_x_window_prop_string_utf8_set(Ecore_X_Window window, Ecore_X_Atom atom, const char *str);
-static char *_ecore_x_window_prop_string_utf8_get(Ecore_X_Window window, Ecore_X_Atom atom);
-#if 0 /* Unused */
-static int   _ecore_x_netwm_startup_info_process(Ecore_X_Startup_Info *info);
-static int   _ecore_x_netwm_startup_info_parse(Ecore_X_Startup_Info *info, char *data);
-#endif
-static void  _ecore_x_netwm_startup_info_free(void *data);
-
-/*
- * Local variables
- */
-
-static Ecore_Hash *startup_info = NULL;
-
-/**
- * Initialize the NetWM module
- */
 EAPI void
-ecore_x_netwm_init(void)
+ecore_x_netwm_pid_set(Ecore_X_Window win,
+                      int            pid)
+{
+   unsigned int tmp;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   tmp = pid;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_PID, &tmp, 1);
+}
+
+EAPI Eina_Bool
+ecore_x_netwm_window_type_get(Ecore_X_Window       win,
+                              Ecore_X_Window_Type *type)
+{
+   Ecore_X_Atom *atoms;
+   int num = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (type) *type = ECORE_X_WINDOW_TYPE_NORMAL;
+
+   num =
+     ecore_x_window_prop_atom_list_get(win,
+                                       ECORE_X_ATOM_NET_WM_WINDOW_TYPE, &atoms);
+   if ((type) && (num >= 1) && (atoms))
+     *type = _ecore_xcb_netwm_window_type_type_get(atoms[0]);
+
+   if (atoms) free(atoms);
+
+   if (num >= 1) return EINA_TRUE;
+   return EINA_FALSE;
+}
+
+EAPI void
+ecore_x_netwm_window_type_set(Ecore_X_Window      win,
+                              Ecore_X_Window_Type type)
+{
+   Ecore_X_Atom atom;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   atom = _ecore_xcb_netwm_window_type_atom_get(type);
+   ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE, &atom, 1);
+}
+
+EAPI int
+ecore_x_netwm_window_types_get(Ecore_X_Window        win,
+                               Ecore_X_Window_Type **types)
 {
-   startup_info = ecore_hash_new(ecore_direct_hash, ecore_direct_compare);
-   if (startup_info)
+   int num = 0, i = 0;
+   Ecore_X_Atom *atoms = NULL;
+   Ecore_X_Window_Type *atoms2 = NULL;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (types) *types = NULL;
+   num =
+     ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
+                                       &atoms);
+   if ((num <= 0) || (!atoms))
+     {
+        if (atoms) free(atoms);
+        return 0;
+     }
+
+   atoms2 = malloc(num * sizeof(Ecore_X_Window_Type));
+   if (!atoms2)
      {
-       ecore_hash_free_value_cb_set(startup_info, _ecore_x_netwm_startup_info_free);
+        if (atoms) free(atoms);
+        return 0;
      }
+
+   for (i = 0; i < num; i++)
+     atoms2[i] = _ecore_xcb_netwm_window_type_type_get(atoms[i]);
+   if (atoms) free(atoms);
+
+   if (types)
+     *types = atoms2;
+   else
+     free(atoms2);
+
+   return num;
+}
+
+EAPI int
+ecore_x_netwm_name_get(Ecore_X_Window win,
+                       char         **name)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (name)
+     *name = ecore_x_window_prop_string_get(win, ECORE_X_ATOM_NET_WM_NAME);
+   return 1;
 }
 
-/**
- * Shutdown the NetWM module
- */
 EAPI void
-ecore_x_netwm_shutdown(void)
+ecore_x_netwm_name_set(Ecore_X_Window win,
+                       const char    *name)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_NAME, name);
+}
+
+EAPI void
+ecore_x_netwm_opacity_set(Ecore_X_Window win,
+                          unsigned int   opacity)
+{
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
+                                  &opacity, 1);
+}
+
+EAPI Eina_Bool
+ecore_x_netwm_opacity_get(Ecore_X_Window win,
+                          unsigned int  *opacity)
 {
-   if (startup_info)
-     ecore_hash_destroy(startup_info);
-   startup_info = NULL;
-}
-
-/**
- * Set the _NET_SUPPORTING_WM_CHECK property.
- * @param root    The root window.
- * @param check   The child window.
- * @param wm_name The name of the Window Manager.
- *
- * Set the _NET_SUPPORTING_WM_CHECK property on the @p root window to be
- * the ID of the child window @p check created by the Window Manager.
- * @p check also have the _NET_WM_NAME property set to the name
- * @p wm_name of the Window Manager.
- *
- * The Window MUST call that function to indicate that a compliant
- * window manager is active.
- * @ingroup Ecore_X_NetWM_Group
- */
+   unsigned int tmp = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
+                                       &tmp, 1))
+     return EINA_FALSE;
+
+   if (opacity) *opacity = tmp;
+
+   return EINA_TRUE;
+}
+
 EAPI void
 ecore_x_netwm_wm_identify(Ecore_X_Window root,
                           Ecore_X_Window check,
-                         const char    *wm_name)
-{
-   ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK, &check, 1);
-   ecore_x_window_prop_window_set(check, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK, &check, 1);
-   _ecore_x_window_prop_string_utf8_set(check, ECORE_X_ATOM_NET_WM_NAME, wm_name);
-   /* This one isn't mandatory */
-   _ecore_x_window_prop_string_utf8_set(root, ECORE_X_ATOM_NET_WM_NAME, wm_name);
-}
-
-/**
- * Set the _NET_SUPPORTED property.
- * @param root      The root window.
- * @param supported The supported hints.
- * @param num       The number of hints.
- *
- * Set the _NET_SUPPORTED property on the @p root window. The hints
- * that the Window Manager supports are stored in @p supported.
- *
- * The Window Manager MUST set this property to indicate which hints
- * it supports.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_supported_set(Ecore_X_Window root,
-                            Ecore_X_Atom  *supported,
-                            int            num)
+                          const char    *wm_name)
 {
-   ecore_x_window_prop_atom_set(root, ECORE_X_ATOM_NET_SUPPORTED, supported, num);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_window_set(check, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK,
+                                  &check, 1);
+   ecore_x_window_prop_string_set(check, ECORE_X_ATOM_NET_WM_NAME, wm_name);
+   ecore_x_window_prop_string_set(root, ECORE_X_ATOM_NET_WM_NAME, wm_name);
+   ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK,
+                                  &check, 1);
 }
 
-/**
- * Sends the GetProperty request.
- * @param root The root window
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_supported_get_prefetch(Ecore_X_Window root)
+ecore_x_netwm_supported_set(Ecore_X_Window root,
+                            Ecore_X_Atom  *supported,
+                            int            num)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, root,
-                                       ECORE_X_ATOM_NET_SUPPORTED, ECORE_X_ATOM_ATOM,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ecore_x_window_prop_atom_set(root, ECORE_X_ATOM_NET_SUPPORTED,
+                                supported, num);
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_supported_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_supported_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the hints supported by the Window Manager.
- * @param root      The root window.
- * @param supported The supported hints.
- * @param num       The number of atoms.
- * @return          1 on success, 0 otherwise.
- *
- * Get the hints supported by the Window Manager. @p root is the root
- * window. The hints are stored in @p supported. The number of hints
- * is stored in @p num.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_supported_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_supported_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
+EAPI Eina_Bool
 ecore_x_netwm_supported_get(Ecore_X_Window root,
                             Ecore_X_Atom **supported,
                             int           *num)
 {
-   int num_ret;
+   int num_ret = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   if (num) *num = 0UL;
+   if (num) *num = 0;
    if (supported) *supported = NULL;
 
-   num_ret = ecore_x_window_prop_xid_list_get(root,
-                                              ECORE_X_ATOM_NET_SUPPORTED,
-                                              ECORE_X_ATOM_ATOM,
-                                              supported);
-   if (num_ret <= 0)
-      return 0;
+   num_ret =
+     ecore_x_window_prop_atom_list_get(root, ECORE_X_ATOM_NET_SUPPORTED,
+                                       supported);
+   if (num_ret <= 0) return EINA_FALSE;
+   if (num) *num = num_ret;
 
-   if (num) *num = (uint32_t)num_ret;
-   return 1;
+   return EINA_TRUE;
 }
 
-/**
- * Set the _NET_NUMBER_OF_DESKTOPS property.
- * @param root The root window.
- * @param n_desks The number of desktops.
- *
- * Set the number of desktops @p n_desks of the Window Manager by
- * sending the _NET_NUMBER_OF_DESKTOPS to the @p root window.
- *
- * The Window Manager SHOULD set and update this property to indicate
- * the number of virtual desktops. A Pager can request a change in the
- * number of desktops by using that function.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
 ecore_x_netwm_desk_count_set(Ecore_X_Window root,
                              unsigned int   n_desks)
 {
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
    ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS,
-                                 &n_desks, 1);
-}
-
-/**
- * Set the _NET_VIRTUAL_ROOTS property.
- * @param root    The root window.
- * @param vroots  The virtual root windows.
- * @param n_desks The number of desks.
- *
- * Set the number of virtual desktops by sending the
- * _NET_VIRTUAL_ROOTS property to the @p root window. @p vroots is an
- * array of window and @p n_desks is the number of windows.
- *
- * A Window Manager that implements virtual desktops by reparent
- * client windows to a child of the root window MUST use that
- * function.
- * @ingroup Ecore_X_NetWM_Group
- */
+                                  &n_desks, 1);
+}
+
 EAPI void
 ecore_x_netwm_desk_roots_set(Ecore_X_Window  root,
-                            Ecore_X_Window *vroots,
+                             Ecore_X_Window *vroots,
                              unsigned int    n_desks)
 {
-   ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_VIRTUAL_ROOTS, vroots, n_desks);
-}
-
-/**
- * Set the _NET_DESKTOP_NAMES property.
- * @param root    The root window.
- * @param names   The names of the virtual desktops.
- * @param n_desks The number of virtual desktops.
- *
- * Set the name of each virtual desktop by sending the
- * _NET_DESKTOP_NAMES to the @p root window. @p names are the names of
- * the virtual desktops and @p n_desks is the number of virtual
- * desktops.
- *
- * A Pager MAY use that function. @p n_desks may be different from the
- * one passed to ecore_x_netwm_desk_count_set().  If it less or equal,
- * then the desktops with high numbers are unnamed. If it is larger,
- * then the excess names are considered to be reserved in case the
- * number of desktops is increased.
- * @ingroup Ecore_X_NetWM_Group
- */
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_VIRTUAL_ROOTS,
+                                  vroots, n_desks);
+}
+
 EAPI void
 ecore_x_netwm_desk_names_set(Ecore_X_Window root,
-                            const char   **names,
+                             const char   **names,
                              unsigned int   n_desks)
 {
-   char        ss[32];
-   char       *buf;
+   char ss[32], *buf = NULL, *t = NULL;
    const char *s;
-   uint32_t    i;
-   uint32_t    len;
-   uint32_t    l;
+   uint32_t len = 0, i, l;
 
-   buf = NULL;
-   len = 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
 
    for (i = 0; i < n_desks; i++)
      {
-       s = (names) ? names[i] : NULL;
-       if (!s)
-         {
-            /* Default to "Desk-<number>" */
-            sprintf(ss, "Desk-%d", i);
-            s = ss;
-         }
-
-       l = strlen(s) + 1;
-       buf = realloc(buf, len + l);
-       memcpy(buf + len, s, l);
-       len += l;
+        s = ((names) ? names[i] : NULL);
+        if (!s)
+          {
+             /* Default to "Desk-<number>" */
+              sprintf(ss, "Desk-%d", i);
+              s = ss;
+          }
+
+        l = strlen(s) + 1;
+        t = realloc(buf, len + 1);
+        if (t)
+          {
+             buf = t;
+             memcpy(buf + len, s, l);
+          }
+        len += l;
      }
 
    xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, root,
                        ECORE_X_ATOM_NET_DESKTOP_NAMES,
-                       ECORE_X_ATOM_UTF8_STRING,
-                       8, len, (const void *)buf);
+                       ECORE_X_ATOM_UTF8_STRING, 8, len, (const void *)buf);
+//   ecore_x_flush();
    free(buf);
 }
 
-/**
- * Set the _NET_DESKTOP_GEOMETRY property.
- * @param root   The root window.
- * @param width  The width of the desktop.
- * @param height The height of the desktop.
- *
- * Set the common @p width and @p height of all desktops by sending
- * the _NET_DESKTOP_GEOMETRY to the @p root window.
- *
- * This size is equal to the screen size if the Window Manager doesn't
- * support large desktops, otherwise it's equal to the virtual size of
- * the desktop. The Window Manager SHOULD set this property. A Pager
- * can request a change in the desktop geometry by using this
- * function.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
 ecore_x_netwm_desk_size_set(Ecore_X_Window root,
                             unsigned int   width,
@@ -325,105 +309,25 @@ ecore_x_netwm_desk_size_set(Ecore_X_Window root,
 {
    uint32_t size[2];
 
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
    size[0] = width;
    size[1] = height;
-   ecore_x_window_prop_card32_set(root,
-                                  ECORE_X_ATOM_NET_DESKTOP_GEOMETRY,
+   ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_GEOMETRY,
                                   size, 2);
 }
 
-/**
- * Set the _NET_DESKTOP_VIEWPORT property.
- * @param root    The root window.
- * @param origins An array of paris of coordiantes.
- * @param n_desks The number of virtual desktops.
- *
- * Set the top left corner of each desktop's viewport by sending the
- * _NET_DESKTOP_VIEWPORT property to the @p root window. @p origins
- * contains each pair of X coordinate and Y coordinate of the top left
- * corner of each desktop's viewport.
- *
- * If the Window Manager does not support large desktops, the
- * coordinates MUST be (0,0). A Pager can request to change the
- * viewport for the current desktop by using this function.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
 ecore_x_netwm_desk_viewports_set(Ecore_X_Window root,
                                  unsigned int  *origins,
                                  unsigned int   n_desks)
 {
-   ecore_x_window_prop_card32_set(root,
-                                  ECORE_X_ATOM_NET_DESKTOP_VIEWPORT,
-                                  origins, 2 * n_desks);
-}
-
-/**
- * Set the _NET_DESKTOP_LAYOUT property.
- * @param root The root window.
- * @param orientation
- * @param columns
- * @param rows
- * @param starting_corner
- *
- * Set the layout of virtual desktops relative to each other by
- * sending the _NET_DESKTOP_LAYOUT to the @p root window.
- * @p orientation defines the orientation of the virtual desktop. 0
- * means horizontal layout, 1 means vertical layout. @p columns is
- * the number of desktops in the X direction and @p rows is the number
- * in the Y direction. @p starting_corner is the corner containing the
- * first desktop. The values for @p starting_corner are 0 (top-left),
- * 1 (top-right), 2 (bottom-right) and 3 (bottom-left).
- *
- * When the orientation is horizontal the desktops are laid out in
- * rows, with the first desktop in the specified starting corner. So a
- * layout with four columns and three rows starting in
- * the top-left corner looks like this:
- *
- * +--+--+--+--+
- * | 0| 1| 2| 3|
- * +--+--+--+--+
- * | 4| 5| 6| 7|
- * +--+--+--+--+
- * | 8| 9|10|11|
- * +--+--+--+--+
- *
- * With @p starting_corner being bottom-right, it looks like this:
- *
- * +--+--+--+--+
- * |11|10| 9| 8|
- * +--+--+--+--+
- * | 7| 6| 5| 4|
- * +--+--+--+--+
- * | 3| 2| 1| 0|
- * +--+--+--+--+
- *
- * When the orientation is vertical the layout with four columns and
- * three rows starting in the top-left corner looks like:
- *
- * +--+--+--+--+
- * | 0| 3| 6| 9|
- * +--+--+--+--+
- * | 1| 4| 7|10|
- * +--+--+--+--+
- * | 2| 5| 8|11|
- * +--+--+--+--+
- *
- * With @p starting_corner  being top-right, it looks like:
- *
- * +--+--+--+--+
- * | 9| 6| 3| 0|
- * +--+--+--+--+
- * |10| 7| 4| 1|
- * +--+--+--+--+
- * |11| 8| 5| 2|
- * +--+--+--+--+
- *
- * This function MUST be used by a Pager and NOT by the Window
- * Manager. When using this function, the Pager must own a manager
- * selection.
- * @ingroup Ecore_X_NetWM_Group
- */
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_VIEWPORT,
+                                  origins, (2 * n_desks));
+}
+
 EAPI void
 ecore_x_netwm_desk_layout_set(Ecore_X_Window root,
                               int            orientation,
@@ -431,2767 +335,1270 @@ ecore_x_netwm_desk_layout_set(Ecore_X_Window root,
                               int            rows,
                               int            starting_corner)
 {
-   uint32_t layout[4];
+   unsigned int layout[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
    layout[0] = orientation;
    layout[1] = columns;
    layout[2] = rows;
    layout[3] = starting_corner;
-   ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_LAYOUT, layout, 4);
-}
-
-/**
- * Set the _NET_WORKAREA property.
- * @param root    The root window.
- * @param areas   An array of areas.
- * @param n_desks The number of desks.
- *
- * Set the work area for each desktop by sending the _NET_WORKAREA
- * property to the @p root window. An area contains the geometry (X
- * and Y coordinates, width and height). These geometries are
- * specified relative to the viewport on each desktop and specify an
- * area that is completely contained within the viewport. @p areas
- * stores these geometries. @p n_desks is the number of geometry to
- * set.
- *
- * This function MUST be set by the Window Manager. It is used by
- * desktop applications to place desktop icons appropriately.
- * @ingroup Ecore_X_NetWM_Group
- */
+   ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_LAYOUT,
+                                  layout, 4);
+}
+
 EAPI void
 ecore_x_netwm_desk_workareas_set(Ecore_X_Window root,
                                  unsigned int  *areas,
                                  unsigned int   n_desks)
 {
-   ecore_x_window_prop_card32_set(root,
-                                  ECORE_X_ATOM_NET_WORKAREA,
-                                  areas, 4 * n_desks);
-}
-
-/**
- * Set the _NET_CURRENT_DESKTOP property.
- * @param root The root window.
- * @param desk The index of the current desktop.
- *
- * Set the current desktop by sending the _NET_CURRENT_DESKTOP to the
- * @p root window. @p deskmust be an integer number between 0 and the
- * number of desks (set by ecore_x_netwm_desk_count_set()) -1.
- *
- * This function MUST be called by the Window Manager. If a Pagerwants
- * to switch to naother desktop, it MUST call that function.
- * @ingroup Ecore_X_NetWM_Group
- */
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_WORKAREA, areas,
+                                  4 * n_desks);
+}
+
+EAPI unsigned int *
+ecore_x_netwm_desk_workareas_get(Ecore_X_Window root, unsigned int *n_desks)
+{
+   int ret;
+   unsigned int *areas = NULL;
+   
+   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+   
+   ret = ecore_x_window_prop_card32_list_get(root, ECORE_X_ATOM_NET_WORKAREA,
+                                             &areas);
+   if (!areas)
+     {
+        if (n_desks) *n_desks = 0;
+        return 0;
+     }
+   if (n_desks) *n_desks = ret / 4;
+   return areas;
+}
+
 EAPI void
 ecore_x_netwm_desk_current_set(Ecore_X_Window root,
                                unsigned int   desk)
 {
-   ecore_x_window_prop_card32_set(root,
-                                  ECORE_X_ATOM_NET_CURRENT_DESKTOP,
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_CURRENT_DESKTOP,
                                   &desk, 1);
 }
 
-/**
- * Set the _NET_SHOWING_DESKTOP property.
- * @param root The root window
- * @param on   0 to hide the desktop, non 0 to show it.
- *
- * Set or unset the desktop in a "showing mode" by sending the
- * _NET_SHOWING_DESKTOP property to the @p root window. If @p on is 0,
- * the windows are hidden and the desktop background is displayed and
- * focused.
- *
- * If a Pager wants to enter or leave the mode, it MUST use this
- * function.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
 ecore_x_netwm_showing_desktop_set(Ecore_X_Window root,
-                                  int            on)
+                                  Eina_Bool      on)
 {
-   uint32_t val;
+   unsigned int val = 0;
 
-   val = (on) ? 1 : 0;
-   ecore_x_window_prop_card32_set(root,
-                                  ECORE_X_ATOM_NET_SHOWING_DESKTOP,
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   val = ((on) ? 1 : 0);
+   ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_SHOWING_DESKTOP,
                                   &val, 1);
 }
 
-/*
- * Client status
- */
-
-/**
- * Set the _NET_CLIENT_LIST property.
- * @param root The root window.
- * @param p_clients An array of windows.
- * @param n_clients The number of windows.
- *
- * Map all the X windows managed by the window manager from the oldest
- * to the newest by sending the _NET_CLIENT_LIST property to the
- * @p root window. The X windows are stored in @p p_clients and their
- * number in @p n_clients.
- *
- * This function SHOULD be called by the Window Manager.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_client_list_set(Ecore_X_Window  root,
-                              Ecore_X_Window *p_clients,
-                              unsigned int    n_clients)
+EAPI int
+ecore_x_netwm_startup_id_get(Ecore_X_Window win,
+                             char         **id)
 {
-   ecore_x_window_prop_window_set(root,
-                                  ECORE_X_ATOM_NET_CLIENT_LIST,
-                                  p_clients, n_clients);
-}
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-/**
- * Set the _NET_CLIENT_LIST_STACKING property.
- * @param root The root window.
- * @param p_clients An array of windows.
- * @param n_clients The number of windows.
- *
- * Stack all the X windows managed by the window manager from bottom
- * to top order by sending the _NET_CLIENT_LIST_STACKING property to the
- * @p root window. The X windows are stored in @p p_clients and their
- * number in @p n_clients.
- *
- * This function SHOULD be called by the Window Manager.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_client_list_stacking_set(Ecore_X_Window  root,
-                                       Ecore_X_Window *p_clients,
-                                       unsigned int    n_clients)
-{
-   ecore_x_window_prop_window_set(root,
-                                  ECORE_X_ATOM_NET_CLIENT_LIST_STACKING,
-                                  p_clients, n_clients);
-}
+   if (id)
+     {
+        *id =
+          ecore_x_window_prop_string_get(win, ECORE_X_ATOM_NET_STARTUP_ID);
+     }
 
-/**
- * Set the _NET_ACTIVE_WINDOW property.
- * @param root   The root window.
- * @param window The widow to activate.
- *
- * Activate @p window by sending the _NET_ACTIVE_WINDOW property to
- * the @p root window.
- *
- * If a Client wants to activate another window, it MUST call this
- * function.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_client_active_set(Ecore_X_Window root,
-                                Ecore_X_Window window)
-{
-   ecore_x_window_prop_window_set(root,
-                                  ECORE_X_ATOM_NET_ACTIVE_WINDOW,
-                                  &window, 1);
-}
-
-/**
- * Set the _NET_WM_NAME property.
- * @param window The widow to activate.
- * @param name   The title name of the window.
- *
- * Set the title name of @p window to @p name by sending the
- * _NET_WM_NAME property to @p window.
- *
- * The Client SHOULD set the title of @p window in UTF-8 encoding. If
- * set, the Window Manager should use this in preference to WM_NAME.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_name_set(Ecore_X_Window window,
-                       const char    *name)
-{
-   _ecore_x_window_prop_string_utf8_set(window, ECORE_X_ATOM_NET_WM_NAME, name);
+   return 1;
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_name_get_prefetch(Ecore_X_Window window)
+ecore_x_netwm_startup_id_set(Ecore_X_Window win,
+                             const char    *id)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_NAME, ECORE_X_ATOM_UTF8_STRING,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_STARTUP_ID, id);
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_name_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_name_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the title of a window.
- * @param window The window.
- * @param name   The title name.
- * @return       Returns always 1.
- *
- * Retrieve the title name of @p window and store it in @p name. The
- * function returns always 1.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_name_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_name_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_name_get(Ecore_X_Window window,
-                       char         **name)
+ecore_x_netwm_state_request_send(Ecore_X_Window       win,
+                                 Ecore_X_Window       root,
+                                 Ecore_X_Window_State s1,
+                                 Ecore_X_Window_State s2,
+                                 Eina_Bool            set)
 {
-   if (name)
-     *name = _ecore_x_window_prop_string_utf8_get(window, ECORE_X_ATOM_NET_WM_NAME);
-   return 1;
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!win) return;
+   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_NET_WM_STATE;
+   ev.data.data32[0] = !!set;
+   ev.data.data32[1] = _ecore_xcb_netwm_window_state_atom_get(s1);
+   ev.data.data32[2] = _ecore_xcb_netwm_window_state_atom_get(s2);
+   /* 1 == normal client, if used in a pager this should be 2 */
+   ev.data.data32[3] = 1;
+   ev.data.data32[4] = 0;
+
+   xcb_send_event(_ecore_xcb_conn, 0, root,
+                  (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
+                   XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
+//   ecore_x_flush();
 }
 
-/**
- * Set the _NET_STARTUP_ID property.
- * @param window The window.
- * @param id     The ID name.
- *
- * Set the ID @p id used for the startup sequence by sending the
- * property _NET_STARTUP_ID to @p window. The ID name should be
- * encoded in UTF-8.
- *
- * If a new value for the property is set, the Window Manager
- * should update the window's status accordingly (update its virtual
- * desktop, etc.).
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_startup_id_set(Ecore_X_Window window,
-                             const char    *id)
+ecore_x_netwm_window_state_set(Ecore_X_Window        win,
+                               Ecore_X_Window_State *state,
+                               unsigned int          num)
 {
-   _ecore_x_window_prop_string_utf8_set(window, ECORE_X_ATOM_NET_STARTUP_ID, id);
+   Ecore_X_Atom *set;
+   unsigned int i = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!num)
+     {
+        ecore_x_window_prop_property_del(win, ECORE_X_ATOM_NET_WM_STATE);
+        return;
+     }
+
+   set = malloc(num * sizeof(Ecore_X_Atom));
+   if (!set) return;
+
+   for (i = 0; i < num; i++)
+     set[i] = _ecore_xcb_netwm_window_state_atom_get(state[i]);
+
+   ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_STATE, set, num);
+   free(set);
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_startup_id_get_prefetch(Ecore_X_Window window)
+EAPI Eina_Bool
+ecore_x_netwm_window_state_get(Ecore_X_Window         win,
+                               Ecore_X_Window_State **state,
+                               unsigned int          *num)
 {
-   xcb_get_property_cookie_t cookie;
+   Ecore_X_Atom *atoms;
+   int ret = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (num) *num = 0;
+   if (state) *state = NULL;
+
+   ret =
+     ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_STATE, &atoms);
+
+   if (ret <= 0) return EINA_FALSE;
+
+   if (state)
+     {
+        *state = malloc(ret * sizeof(Ecore_X_Window_State));
+        if (*state)
+          {
+             int i = 0;
+
+             for (i = 0; i < ret; i++)
+               (*state)[i] = _ecore_xcb_netwm_window_state_get(atoms[i]);
+             if (num) *num = ret;
+          }
+     }
+
+   free(atoms);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_STARTUP_ID, ECORE_X_ATOM_UTF8_STRING,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   return EINA_TRUE;
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_startup_id_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_startup_id_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the startup ID name of a window.
- * @param window The window
- * @param id     The ID name
- * @return       Return always 1.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_startup_id_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_startup_id_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_startup_id_get(Ecore_X_Window window,
-                             char         **id)
+ecore_x_netwm_client_active_set(Ecore_X_Window root,
+                                Ecore_X_Window win)
 {
-   if (id)
-     *id = _ecore_x_window_prop_string_utf8_get(window, ECORE_X_ATOM_NET_STARTUP_ID);
-   return 1;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_window_set(root,
+                                  ECORE_X_ATOM_NET_ACTIVE_WINDOW, &win, 1);
 }
 
-/**
- * Set the _NET_WM_VISIBLE_NAME property.
- * @param window The widow to activate.
- * @param name   The title name of the window.
- *
- * Set the title name of @p window to @p name by sending the
- * _NET_WM_VISIBLE_NAME property to @p window, when the Window Manager
- * displays a window name other than by calling
- * ecore_x_netwm_name_set().
- *
- * The Client SHOULD set the title of @p window in UTF-8
- * encoding. This function is used for displaying title windows like
- * [xterm1], [xterm2], ... thereby allowing Pagers to display the same
- * title as the Window Manager.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_visible_name_set(Ecore_X_Window window,
-                               const char    *name)
+ecore_x_netwm_client_active_request(Ecore_X_Window root,
+                                    Ecore_X_Window win,
+                                    int            type,
+                                    Ecore_X_Window current_win)
 {
-   _ecore_x_window_prop_string_utf8_set(window, ECORE_X_ATOM_NET_WM_VISIBLE_NAME,
-                                        name);
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_NET_ACTIVE_WINDOW;
+   ev.data.data32[0] = type;
+   ev.data.data32[1] = XCB_CURRENT_TIME;
+   ev.data.data32[2] = current_win;
+   ev.data.data32[3] = 0;
+   ev.data.data32[4] = 0;
+
+   xcb_send_event(_ecore_xcb_conn, 0, root,
+                  (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
+                   XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
+//   ecore_x_flush();
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_visible_name_get_prefetch(Ecore_X_Window window)
+ecore_x_netwm_client_list_set(Ecore_X_Window  root,
+                              Ecore_X_Window *p_clients,
+                              unsigned int    n_clients)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_VISIBLE_NAME, ECORE_X_ATOM_UTF8_STRING,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_CLIENT_LIST,
+                                  p_clients, n_clients);
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_visible_name_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_visible_name_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the visible title of a window.
- * @param window The window.
- * @param name   The title name.
- * @return       Returns always 1.
- *
- * Retrieve the visible title name of @p window and store it in @p name. The
- * function returns always 1.
- * @param window The window
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_visible_name_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_visible_name_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_visible_name_get(Ecore_X_Window window,
-                               char         **name)
+ecore_x_netwm_client_list_stacking_set(Ecore_X_Window  root,
+                                       Ecore_X_Window *p_clients,
+                                       unsigned int    n_clients)
 {
-   if (name)
-     *name = _ecore_x_window_prop_string_utf8_get(window,
-                                                  ECORE_X_ATOM_NET_WM_VISIBLE_NAME);
-   return 1;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_CLIENT_LIST_STACKING,
+                                  p_clients, n_clients);
 }
 
-/**
- * Set the _NET_WM_ICON_NAME property.
- * @param window The widow to activate.
- * @param name   The icon name of the window.
- *
- * Set the icon name of @p window to @p name by sending the
- * _NET_WM_ICON_NAME property to @p window.
- *
- * The Client SHOULD set the title of @p window in UTF-8 encoding. If
- * set, the Window Manager should use this in preference to WM_ICON_NAME.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_icon_name_set(Ecore_X_Window window,
-                            const char    *name)
+EAPI Eina_Bool
+ecore_x_screen_is_composited(int screen)
 {
-   _ecore_x_window_prop_string_utf8_set(window, ECORE_X_ATOM_NET_WM_ICON_NAME,
-                                        name);
+   char buff[32];
+   xcb_get_selection_owner_cookie_t ocookie;
+   xcb_get_selection_owner_reply_t *oreply;
+   Ecore_X_Window win;
+   static Ecore_X_Atom atom = XCB_NONE;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   snprintf(buff, sizeof(buff), "_NET_WM_CM_S%i", screen);
+
+   if (atom == XCB_NONE)
+     {
+        xcb_intern_atom_cookie_t acookie;
+        xcb_intern_atom_reply_t *areply;
+
+        acookie =
+          xcb_intern_atom_unchecked(_ecore_xcb_conn, 0, strlen(buff), buff);
+        areply = xcb_intern_atom_reply(_ecore_xcb_conn, acookie, NULL);
+        if (!areply) return EINA_FALSE;
+        atom = areply->atom;
+        free(areply);
+     }
+   if (atom == XCB_NONE) return EINA_FALSE;
+
+   ocookie = xcb_get_selection_owner_unchecked(_ecore_xcb_conn, atom);
+   oreply = xcb_get_selection_owner_reply(_ecore_xcb_conn, ocookie, NULL);
+   if (!oreply) return EINA_FALSE;
+   win = oreply->owner;
+   free(oreply);
+
+   return (win != XCB_NONE) ? EINA_TRUE : EINA_FALSE;
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_icon_name_get_prefetch(Ecore_X_Window window)
+ecore_x_screen_is_composited_set(int            screen,
+                                 Ecore_X_Window win)
 {
-   xcb_get_property_cookie_t cookie;
+   static Ecore_X_Atom atom = XCB_NONE;
+   char buff[32];
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_ICON_NAME, ECORE_X_ATOM_UTF8_STRING,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   snprintf(buff, sizeof(buff), "_NET_WM_CM_S%i", screen);
+   if (atom == XCB_NONE)
+     {
+        xcb_intern_atom_cookie_t acookie;
+        xcb_intern_atom_reply_t *areply;
+
+        acookie =
+          xcb_intern_atom_unchecked(_ecore_xcb_conn, 0, strlen(buff), buff);
+        areply = xcb_intern_atom_reply(_ecore_xcb_conn, acookie, NULL);
+        if (!areply) return;
+        atom = areply->atom;
+        free(areply);
+     }
+   if (atom == XCB_NONE) return;
+   xcb_set_selection_owner(_ecore_xcb_conn, win, atom,
+                           _ecore_xcb_events_last_time_get());
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_icon_name_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_icon_name_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the icon name of a window.
- * @param window The window.
- * @param name   The icon name.
- * @return       Returns always 1.
- *
- * Retrieve the icon name of @p window and store it in @p name. The
- * function returns always 1.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_icon_name_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_icon_name_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_icon_name_get(Ecore_X_Window window,
-                            char         **name)
+ecore_x_netwm_ping_send(Ecore_X_Window win)
 {
-   if (name)
-     *name = _ecore_x_window_prop_string_utf8_get(window,
-                                                 ECORE_X_ATOM_NET_WM_ICON_NAME);
-   return 1;
-}
+   xcb_client_message_event_t ev;
 
-/**
- * Set the _NET_WM_VISIBLE_ICON_NAME property.
- * @param window The widow to activate.
- * @param name   The title name of the window.
- *
- * Set the icon name of @p window to @p name by sending the
- * _NET_WM_VISIBLE_ICON_NAME property to @p window, when the Window Manager
- * displays a icon name other than by calling
- * ecore_x_netwm_icon_name_set().
- *
- * The Client SHOULD set the icon name in UTF-8
- * encoding. The Window Manager MUST use this function is it display
- * an icon name other than with ecore_x_netwm_icon_name_set().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_visible_icon_name_set(Ecore_X_Window window,
-                                    const char    *name)
-{
-   _ecore_x_window_prop_string_utf8_set(window,
-                                        ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME,
-                                        name);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!win) return;
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_WM_PROTOCOLS;
+   ev.data.data32[0] = ECORE_X_ATOM_NET_WM_PING;
+   ev.data.data32[1] = ecore_x_current_time_get();
+   ev.data.data32[2] = win;
+   ev.data.data32[3] = 0;
+   ev.data.data32[4] = 0;
+
+   xcb_send_event(_ecore_xcb_conn, 0, win,
+                  XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//   ecore_x_flush();
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_visible_icon_name_get_prefetch(Ecore_X_Window window)
+ecore_x_netwm_frame_size_set(Ecore_X_Window win,
+                             int            fl,
+                             int            fr,
+                             int            ft,
+                             int            fb)
 {
-   xcb_get_property_cookie_t cookie;
+   uint32_t frames[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME, ECORE_X_ATOM_UTF8_STRING,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   frames[0] = fl;
+   frames[1] = fr;
+   frames[2] = ft;
+   frames[3] = fb;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_FRAME_EXTENTS,
+                                  frames, 4);
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_visible_icon_name_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_visible_icon_name_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the visible icon name of a window.
- * @param window The window.
- * @param name   The icon name.
- * @return       Returns always 1.
- *
- * Retrieve the visible icon name of @p window and store it in
- * @p name. The function returns always 1.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_visible_icon_name_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_visible_icon_name_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_visible_icon_name_get(Ecore_X_Window window,
-                                    char         **name)
+EAPI Eina_Bool
+ecore_x_netwm_frame_size_get(Ecore_X_Window win,
+                             int           *fl,
+                             int           *fr,
+                             int           *ft,
+                             int           *fb)
 {
-   if (name)
-     *name = _ecore_x_window_prop_string_utf8_get(window,
-                                                  ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME);
-   return 1;
+   int ret = 0;
+   unsigned int frames[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_FRAME_EXTENTS,
+                                        frames, 4);
+   if (ret != 4) return EINA_FALSE;
+
+   if (fl) *fl = frames[0];
+   if (fr) *fr = frames[1];
+   if (ft) *ft = frames[2];
+   if (fb) *fb = frames[3];
+
+   return EINA_TRUE;
 }
 
-/**
- * Set the _NET_WM_DESKTOP property.
- * @param window The window.
- * @param desk   The desktop index.
- *
- * Set on which desktop the @p window is in by sending the
- * _NET_WM_DESKTOP property to @p window. @p desk is the index of
- * the desktop, starting from 0. To indicate that the window should
- * appear on all desktops, @p desk must be equal to 0xFFFFFFFF.
- *
- * A Client MAY choose not to set this property, in which case the
- * Window Manager SHOULD place it as it wishes.
- *
- * The Window Manager should honor _NET_WM_DESKTOP whenever a
- * withdrawn window requests to be mapped.
- *
- * A Client can request a change of desktop for a non-withdrawn window
- * by sending a _NET_WM_DESKTOP client message to the root window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_desktop_set(Ecore_X_Window window,
-                          unsigned int   desk)
+ecore_x_netwm_sync_request_send(Ecore_X_Window win,
+                                unsigned int   serial)
 {
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_WM_DESKTOP, &desk, 1);
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!win) return;
+
+   /* FIXME: Maybe need XSyncIntToValue ?? */
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_WM_PROTOCOLS;
+   ev.data.data32[0] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
+   ev.data.data32[1] = _ecore_xcb_events_last_time_get();
+   ev.data.data32[2] = serial;
+   ev.data.data32[3] = 0;
+   ev.data.data32[4] = 0;
+
+   xcb_send_event(_ecore_xcb_conn, 0, win,
+                  XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+//   ecore_x_flush();
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_desktop_get_prefetch(Ecore_X_Window window)
+ecore_x_netwm_desktop_set(Ecore_X_Window win,
+                          unsigned int   desk)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_DESKTOP, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_DESKTOP, &desk, 1);
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_desktop_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_desktop_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the visible icon name of a window.
- * @param window The window.
- * @param desk   The desktop index.
- * @return       1 on success, 0 otherwise.
- *
- * Retrieve the desktop index in which @p window is displayed and
- * store it in @p desk. If @p desk value is 0xFFFFFFFF, the window
- * appears on all desktops. The function returns 1 on success, 0
- * otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_desktop_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_desktop_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_desktop_get(Ecore_X_Window window,
-                          unsigned int *desk)
+EAPI Eina_Bool
+ecore_x_netwm_desktop_get(Ecore_X_Window win,
+                          unsigned int  *desk)
 {
-   int      ret;
-   uint32_t tmp;
+   unsigned int tmp = 0;
 
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_DESKTOP,
-                                       &tmp, 1);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_DESKTOP,
+                                       &tmp, 1))
+     return EINA_FALSE;
 
    if (desk) *desk = tmp;
-   return (ret == 1) ? 1 : 0;
-}
-
-/**
- * Set the _NET_WM_STRUT property.
- * @param window The window
- * @param left   The number of pixels at the left of the screen.
- * @param right  The number of pixels at the right of the screen.
- * @param top    The number of pixels at the top of the screen.
- * @param bottom The number of pixels at the bottom of the screen.
- *
- * Set space at the edje of the screen by sending the _NET_WM_STRUT
- * property to @p window if @p window is to reserve that space.
- * @p left, @p right, @p top and @p bottom are respectively the number
- * of pixels at the left, right, top and bottom of the screen.
- *
- * This property is deprecated and ecore_x_netwm_strut_partial_set()
- * should be used instead. However, Clients MAY set this property in
- * addition to _NET_WM_STRUT_PARTIAL to ensure backward compatibility
- * with Window Managers supporting older versions of the
- * Specification.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_strut_set(Ecore_X_Window window,
-                        int            left,
-                        int            right,
-                        int            top,
-                        int            bottom)
-{
-   uint32_t strut[4];
 
-   strut[0] = left;
-   strut[1] = right;
-   strut[2] = top;
-   strut[3] = bottom;
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
+   return EINA_TRUE;
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_strut_get_prefetch(Ecore_X_Window window)
+ecore_x_netwm_desktop_request_send(Ecore_X_Window win,
+                                   Ecore_X_Window root,
+                                   unsigned int   desktop)
 {
-   xcb_get_property_cookie_t cookie;
+   xcb_client_message_event_t ev;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_STRUT, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_NET_WM_DESKTOP;
+   ev.data.data32[0] = desktop;
+
+   xcb_send_event(_ecore_xcb_conn, 0, root,
+                  (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
+                   XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
+//   ecore_x_flush();
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_strut_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_strut_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/*
- * _NET_WM_STRUT is deprecated
- */
-
-/**
- * Get the space at the edje of the screen.
- * @param window The window
- * @param left   The number of pixels at the left of the screen.
- * @param right  The number of pixels at the right of the screen.
- * @param top    The number of pixels at the top of the screen.
- * @param bottom The number of pixels at the bottom of the screen.
- * @return       1 on success, 0 otherwise.
- *
- * Retrieve the space at the edje of the screen if @p window is to
- * reserve such space. The number of pixels at the left, right, top
- * and bottom of the screen are respectively stored in @p left,
- * @p right, @p top and @p bottom. This function returns 1 on success,
- * 0 otherwise.
- *
- * This property is deprecated. See ecore_x_netwm_strut_set() for more
- * informations.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_strut_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_strut_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_strut_get(Ecore_X_Window window,
-                        int           *left,
-                        int           *right,
-                        int           *top,
-                        int           *bottom)
-{
-   uint32_t strut[4];
-   int      ret = 0;
-
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
-   if (ret != 4)
-     return 0;
-
-   if (left)   *left   = strut[0];
-   if (right)  *right  = strut[1];
-   if (top)    *top    = strut[2];
-   if (bottom) *bottom = strut[3];
+ecore_x_netwm_moveresize_request_send(Ecore_X_Window win,
+                                      int x,
+                                      int y,
+                                      Ecore_X_Netwm_Direction direction,
+                                      unsigned int button)
+{
+   xcb_client_message_event_t ev;
 
-   return 1;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   CHECK_XCB_CONN;
+
+   memset(&ev, 0, sizeof(xcb_client_message_event_t));
+
+   ev.response_type = XCB_CLIENT_MESSAGE;
+   ev.format = 32;
+   ev.window = win;
+   ev.type = ECORE_X_ATOM_NET_WM_MOVERESIZE;
+   ev.data.data32[0] = x;
+   ev.data.data32[1] = y;
+   ev.data.data32[2] = direction;
+   ev.data.data32[3] = button;
+   ev.data.data32[4] = 1;
+
+   xcb_send_event(_ecore_xcb_conn, 0, win,
+                  (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
+                   XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
 }
 
-/**
- * Set the _NET_WM_STRUT_PARTIAL property.
- * @param window         The window
- * @param left           The number of pixels at the left of the screen.
- * @param right          The number of pixels at the right of the screen.
- * @param top            The number of pixels at the top of the screen.
- * @param bottom         The number of pixels at the bottom of the screen.
- * @param left_start_y   The number of pixels.
- * @param left_end_y     The number of pixels.
- * @param right_start_y  The number of pixels.
- * @param right_end_y    The number of pixels.
- * @param top_start_x    The number of pixels.
- * @param top_end_x      The number of pixels.
- * @param bottom_start_x The number of pixels.
- * @param bottom_end_x   The number of pixels.
- *
- * Set space at the edje of the screen by sending the
- * _NET_WM_STRUT_PARTIAL property to @p window if @p window is to
- * reserve that space. @p left, @p right, @p top and @p bottom are
- * respectively the number of pixels at the left, right, top and
- * bottom of the screen.
- *
- * TODO: more description for that function.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_strut_partial_set(Ecore_X_Window window,
-                                int            left,
-                                int            right,
-                                int            top,
-                                int            bottom,
-                                int            left_start_y,
-                                int            left_end_y,
-                                int            right_start_y,
-                                int            right_end_y,
-                                int            top_start_x,
-                                int            top_end_x,
-                                int            bottom_start_x,
-                                int            bottom_end_x)
+ecore_x_netwm_handled_icons_set(Ecore_X_Window win)
 {
-   unsigned int strut[12];
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   strut[0] = left;
-   strut[1] = right;
-   strut[2] = top;
-   strut[3] = bottom;
-   strut[4] = left_start_y;
-   strut[5] = left_end_y;
-   strut[6] = right_start_y;
-   strut[7] = right_end_y;
-   strut[8] = top_start_x;
-   strut[9] = top_end_x;
-   strut[10] = bottom_start_x;
-   strut[11] = bottom_end_x;
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL, strut, 12);
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
+                                  NULL, 0);
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_strut_partial_get_prefetch(Ecore_X_Window window)
+EAPI Eina_Bool
+ecore_x_netwm_handled_icons_get(Ecore_X_Window win)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_STRUT_PARTIAL, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
+                                       NULL, 0))
+     return EINA_FALSE;
+
+   return EINA_TRUE;
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_strut_partial_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_strut_partial_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the space at the edje of the screen of a window.
- * @param window         The window
- * @param left           The number of pixels at the left of the screen.
- * @param right          The number of pixels at the right of the screen.
- * @param top            The number of pixels at the top of the screen.
- * @param bottom         The number of pixels at the bottom of the screen.
- * @param left_start_y   The number of pixels.
- * @param left_end_y     The number of pixels.
- * @param right_start_y  The number of pixels.
- * @param right_end_y    The number of pixels.
- * @param top_start_x    The number of pixels.
- * @param top_end_x      The number of pixels.
- * @param bottom_start_x The number of pixels.
- * @param bottom_end_x   The number of pixels.
- *
- * Retrieve the space at the edje of the screen if @p window is to
- * reserve such space. The number of pixels at the left, right, top
- * and bottom of the screen are respectively stored in @p left,
- * @p right, @p top and @p bottom. This function returns 1 on success,
- * 0 otherwise.
- *
- * TODO: more description for that function.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_strut_partial_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_strut_partial_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI int
-ecore_x_netwm_strut_partial_get(Ecore_X_Window window,
-                                int           *left,
-                                int           *right,
-                                int           *top,
-                                int           *bottom,
-                                int           *left_start_y,
-                                int           *left_end_y,
-                                int           *right_start_y,
-                                int           *right_end_y,
-                                int           *top_start_x,
-                                int           *top_end_x,
-                                int           *bottom_start_x,
-                                int           *bottom_end_x)
+ecore_x_netwm_icon_name_get(Ecore_X_Window win,
+                            char         **name)
 {
-   uint32_t strut[12];
-   int      ret = 0;
-
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL, strut, 12);
-   if (ret != 12)
-     return 0;
-
-   if (left)           *left           = strut[0];
-   if (right)          *right          = strut[1];
-   if (top)            *top            = strut[2];
-   if (bottom)         *bottom         = strut[3];
-   if (left_start_y)   *left_start_y   = strut[4];
-   if (left_end_y)     *left_end_y     = strut[5];
-   if (right_start_y)  *right_start_y  = strut[6];
-   if (right_end_y)    *right_end_y    = strut[7];
-   if (top_start_x)    *top_start_x    = strut[8];
-   if (top_end_x)      *top_end_x      = strut[9];
-   if (bottom_start_x) *bottom_start_x = strut[10];
-   if (bottom_end_x)   *bottom_end_x   = strut[11];
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (name)
+     {
+        *name =
+          ecore_x_window_prop_string_get(win, ECORE_X_ATOM_NET_WM_ICON_NAME);
+     }
+
    return 1;
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_icons_get_prefetch(Ecore_X_Window window)
+ecore_x_netwm_icon_name_set(Ecore_X_Window win,
+                            const char    *name)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_ICON, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_ICON_NAME, name);
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_icons_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_icons_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Retrieve hte possible icons of a window.
- * @param window The window
- * @param icon   An array of icons.
- * @param num    The number of icons.
- * @return       1 on success, 0 otherwise.
- *
- * Retrieve an array of possible icons of @p window. The icons are
- * stored in @p icon and their number in @p num.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_icons_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_icons_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_icons_get(Ecore_X_Window window,
+ecore_x_netwm_icons_set(Ecore_X_Window win,
+                        Ecore_X_Icon *icon,
+                        int num)
+{
+   unsigned int *data, *p, *p2;
+   unsigned int i, size, x, y;
+   
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+   size = 0;
+   for (i = 0; i < (unsigned int)num; i++)
+     {
+        size += 2 + (icon[i].width * icon[i].height);
+     }
+   data = malloc(size * sizeof(unsigned int));
+   if (!data) return;
+   p = data;
+   for (i = 0; i < (unsigned int)num; i++)
+     {
+        p[0] = icon[i].width;
+        p[1] = icon[i].height;
+        p += 2;
+        p2 = icon[i].data;
+        for (y = 0; y < icon[i].height; y++)
+          {
+             for (x = 0; x < icon[i].width; x++)
+               {
+                  unsigned int r, g, b, a;
+                  
+                  a = (*p2 >> 24) & 0xff;
+                  r = (*p2 >> 16) & 0xff;
+                  g = (*p2 >> 8 ) & 0xff;
+                  b = (*p2      ) & 0xff;
+                  if ((a > 0) && (a < 255))
+                    {
+                       r = (r * 255) / a;
+                       g = (g * 255) / a;
+                       b = (b * 255) / a;
+                    }
+                  *p = (a << 24) | (r << 16) | (g << 8) | b;
+                  p++;
+                  p2++;
+               }
+          }
+     }
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_ICON,
+                                  data, size);
+   free(data);
+}
+
+EAPI Eina_Bool
+ecore_x_netwm_icons_get(Ecore_X_Window win,
                         Ecore_X_Icon **icon,
                         int           *num)
 {
-   uint32_t *data;
-   uint32_t *p;
-   uint32_t *src;
-   uint32_t  icons;
-   uint32_t  len;
-   uint32_t  i;
-   int       num_ret;
+   int num_ret = 0;
+   unsigned int i = 0, len = 0, icons = 0;
+   unsigned int *data, *p, *src;
 
-   if (num) *num = 0UL;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (num) *num = 0;
    if (icon) *icon = NULL;
 
-   num_ret = ecore_x_window_prop_card32_list_get(window,
-                                                 ECORE_X_ATOM_NET_WM_ICON,
-                                                 &data);
-   if ((num_ret <= 0) || !data)
-     return 0;
+   num_ret =
+     ecore_x_window_prop_card32_list_get(win, ECORE_X_ATOM_NET_WM_ICON, &data);
 
+   if ((num_ret <= 0) || (!data))
+     {
+        if (data) free(data);
+        return EINA_FALSE;
+     }
    if (num_ret < 2)
      {
-       free(data);
-       return 0;
+        if (data) free(data);
+        return EINA_FALSE;
      }
 
-   /* Check how many icons there are */
    icons = 0;
    p = data;
    while (p)
      {
-       len = p[0] * p[1];
-       p += (len + 2);
-       if ((p - data) > num_ret)
-         {
-            free(data);
-            return 0;
-         }
-       icons++;
-
-       if ((p - data) == num_ret)
-         p = NULL;
+        len = (p[0] * p[1]);
+        p += (len + 2);
+        if ((p - data) > num_ret)
+          {
+             if (data) free(data);
+             return EINA_FALSE;
+          }
+        icons++;
+        if ((p - data) == num_ret) p = NULL;
      }
    if (num) *num = icons;
-
-   /* If the user doesn't want the icons, return */
    if (!icon)
      {
-       free(data);
-       return 1;
+        if (data) free(data);
+        return EINA_TRUE;
      }
 
-   /* Allocate memory */
    *icon = malloc(icons * sizeof(Ecore_X_Icon));
    if (!(*icon))
      {
-       free(data);
-       return 0;
+        if (data) free(data);
+        return EINA_FALSE;
      }
 
    /* Fetch the icons */
    p = data;
    for (i = 0; i < icons; i++)
      {
-       uint32_t *ps, *pd, *pe;
-
-       len = p[0] * p[1];
-       ((*icon)[i]).width = p[0];
-       ((*icon)[i]).height = p[1];
-       src = &(p[2]);
-       ((*icon)[i]).data = malloc(len * sizeof(uint32_t));
-       if (!((*icon)[i]).data)
-         {
-            while (i)
-              free(((*icon)[--i]).data);
-            free(*icon);
-            free(data);
-            return 0;
-         }
-
-       pd = ((*icon)[i]).data;
-       ps = src;
-       pe = ps + len;
-       for (; ps < pe; ps++)
-         {
-            uint32_t r, g, b, a;
-
-            a = (*ps >> 24) & 0xff;
-            r = (((*ps >> 16) & 0xff) * a) / 255;
-            g = (((*ps >>  8) & 0xff) * a) / 255;
-            b = (((*ps      ) & 0xff) * a) / 255;
-            *pd = (a << 24) | (r << 16) | (g << 8) | (b);
-            pd++;
-         }
-       p += (len + 2);
+        unsigned int *ps, *pd, *pe;
+
+        len = p[0] * p[1];
+        ((*icon)[i]).width = p[0];
+        ((*icon)[i]).height = p[1];
+        src = &(p[2]);
+        ((*icon)[i]).data = malloc(len * sizeof(unsigned int));
+        if (!((*icon)[i]).data)
+          {
+             while (i)
+               free(((*icon)[--i]).data);
+             free(*icon);
+             free(data);
+             return EINA_FALSE;
+          }
+
+        pd = ((*icon)[i]).data;
+        ps = src;
+        pe = ps + len;
+        for (; ps < pe; ps++)
+          {
+             unsigned int r, g, b, a;
+
+             a = (*ps >> 24) & 0xff;
+             r = (((*ps >> 16) & 0xff) * a) / 255;
+             g = (((*ps >> 8) & 0xff) * a) / 255;
+             b = (((*ps) & 0xff) * a) / 255;
+             *pd = (a << 24) | (r << 16) | (g << 8) | (b);
+             pd++;
+          }
+        p += (len + 2);
      }
 
-   free(data);
-
-   return 1;
+   if (data) free(data);
+   return EINA_TRUE;
 }
 
-/**
- * Set the _NET_WM_ICON_GEOMETRY property.
- * @param window The window.
- * @param x      The X coordinate of the icon.
- * @param y      The Y coordinate of the icon.
- * @param width  The width of the icon.
- * @param height The height of the icon.
- *
- * Set the geometry of the icon of @p window by sending the
- * _NET_WM_ICON_GEOMETRY property to @p window. @p x, @p y, @p width
- * and @p height specify respectively the X coordinate, the Y
- * coordinate, the width and the height of the icon.
- *
- * Stand alone tools like a taskbar or an iconbox MAY use this
- * function. This functions makes possible for a Window Manager to
- * display a nice animation like morphing the window into its icon.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_icon_geometry_set(Ecore_X_Window window,
+ecore_x_netwm_icon_geometry_set(Ecore_X_Window win,
                                 int            x,
                                 int            y,
-                                int            width,
-                                int            height)
+                                int            w,
+                                int            h)
 {
-   uint32_t geometry[4];
+   unsigned int geom[4];
 
-   geometry[0] = (uint32_t)x;
-   geometry[1] = (uint32_t)y;
-   geometry[2] = (uint32_t)width;
-   geometry[3] = (uint32_t)height;
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY, geometry, 4);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   geom[0] = x;
+   geom[1] = y;
+   geom[2] = w;
+   geom[3] = h;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
+                                  geom, 4);
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_icon_geometry_get_prefetch(Ecore_X_Window window)
+EAPI Eina_Bool
+ecore_x_netwm_icon_geometry_get(Ecore_X_Window win,
+                                int           *x,
+                                int           *y,
+                                int           *w,
+                                int           *h)
 {
-   xcb_get_property_cookie_t cookie;
+   int ret = 0;
+   unsigned int geom[4];
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_ICON_GEOMETRY, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ret =
+     ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
+                                    geom, 4);
+   if (ret != 4) return EINA_FALSE;
+   if (x) *x = geom[0];
+   if (y) *y = geom[1];
+   if (w) *w = geom[2];
+   if (h) *h = geom[3];
+
+   return EINA_TRUE;
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_icon_geometry_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_icon_geometry_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the geometry of an icon.
- * @param window The window
- * @param x      x
- * @param x      The X coordinate of the icon.
- * @param y      The Y coordinate of the icon.
- * @param width  The width of the icon.
- * @param height The height of the icon.
- * @return       1 on success, 0 othrwise.
- *
- * Retrieve the geometry of the icon of @p window. The geometry is
- * stored in @p x, @p y, @p width and @p height. The function returns
- * 1 on success, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_icon_geometry_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_icon_geometry_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_icon_geometry_get(Ecore_X_Window window,
-                                int           *x,
-                                int           *y,
-                                int           *width,
-                                int           *height)
+ecore_x_netwm_strut_set(Ecore_X_Window win,
+                        int            l,
+                        int            r,
+                        int            t,
+                        int            b)
 {
-   uint32_t geometry[4];
-   int      ret;
+   unsigned int strut[4];
 
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY, geometry, 4);
-   if (ret != 4)
-     return 0;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   if (x)      *x      = geometry[0];
-   if (y)      *y      = geometry[1];
-   if (width)  *width  = geometry[2];
-   if (height) *height = geometry[3];
+   strut[0] = l;
+   strut[1] = r;
+   strut[2] = t;
+   strut[3] = b;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
+}
 
-   return 1;
+EAPI Eina_Bool
+ecore_x_netwm_strut_get(Ecore_X_Window win,
+                        int           *l,
+                        int           *r,
+                        int           *t,
+                        int           *b)
+{
+   unsigned int strut[4];
+   int ret = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ret =
+     ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
+   if (ret != 4) return EINA_FALSE;
+
+   if (l) *l = strut[0];
+   if (r) *r = strut[1];
+   if (t) *t = strut[2];
+   if (b) *b = strut[3];
+
+   return EINA_TRUE;
 }
 
-/**
- * Set the _NET_WM_PID property.
- * @param window The window.
- * @param pid    The process ID.
- *
- * Set the process ID of the client owning @p window by sending the
- * _NET_WM_PID property to @p window.
- *
- * This function MAY be used by the Window Manager to kill windows
- * which do not respond to the _NET_WM_PING protocol.
- *
- * If _NET_WM_PID is set, the ICCCM-specified property
- * WM_CLIENT_MACHINE MUST also be set.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_pid_set(Ecore_X_Window window,
-                      int            pid)
+ecore_x_netwm_strut_partial_set(Ecore_X_Window win,
+                                int            left,
+                                int            right,
+                                int            top,
+                                int            bottom,
+                                int            left_start_y,
+                                int            left_end_y,
+                                int            right_start_y,
+                                int            right_end_y,
+                                int            top_start_x,
+                                int            top_end_x,
+                                int            bottom_start_x,
+                                int            bottom_end_x)
 {
-   unsigned int tmp;
+   unsigned int strut[12];
 
-   tmp = pid;
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_WM_PID,
-                                 &tmp, 1);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   strut[0] = left;
+   strut[1] = right;
+   strut[2] = top;
+   strut[3] = bottom;
+   strut[4] = left_start_y;
+   strut[5] = left_end_y;
+   strut[6] = right_start_y;
+   strut[7] = right_end_y;
+   strut[8] = top_start_x;
+   strut[9] = top_end_x;
+   strut[10] = bottom_start_x;
+   strut[11] = bottom_end_x;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL,
+                                  strut, 12);
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_pid_get_prefetch(Ecore_X_Window window)
+EAPI Eina_Bool
+ecore_x_netwm_strut_partial_get(Ecore_X_Window win,
+                                int           *left,
+                                int           *right,
+                                int           *top,
+                                int           *bottom,
+                                int           *left_start_y,
+                                int           *left_end_y,
+                                int           *right_start_y,
+                                int           *right_end_y,
+                                int           *top_start_x,
+                                int           *top_end_x,
+                                int           *bottom_start_x,
+                                int           *bottom_end_x)
 {
-   xcb_get_property_cookie_t cookie;
+   unsigned int strut[12];
+   int ret = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   ret =
+     ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL,
+                                    strut, 12);
+   if (ret != 12) return EINA_FALSE;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_PID, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   if (left) *left = strut[0];
+   if (right) *right = strut[1];
+   if (top) *top = strut[2];
+   if (bottom) *bottom = strut[3];
+   if (left_start_y) *left_start_y = strut[4];
+   if (left_end_y) *left_end_y = strut[5];
+   if (right_start_y) *right_start_y = strut[6];
+   if (right_end_y) *right_end_y = strut[7];
+   if (top_start_x) *top_start_x = strut[8];
+   if (top_end_x) *top_end_x = strut[9];
+   if (bottom_start_x) *bottom_start_x = strut[10];
+   if (bottom_end_x) *bottom_end_x = strut[11];
+
+   return EINA_TRUE;
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_pid_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_pid_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the process ID of a client window.
- * @param window The window.
- * @param pid    The process ID.
- * @return       1 on success, 0 otherwise.
- *
- * Retrieve the process ID of @p window and store it in @p pid. This
- * function returns 1 on success, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_pid_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_pid_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_pid_get(Ecore_X_Window window,
-                      int           *pid)
+ecore_x_netwm_user_time_set(Ecore_X_Window win,
+                            unsigned int   t)
 {
-   int ret;
-   uint32_t tmp;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_PID,
-                                       &tmp, 1);
-   if (pid) *pid = tmp;
+   ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_USER_TIME, &t, 1);
+}
 
-   return (ret == 1) ? 1 : 0;
-}
-
-/**
- * Set the _NET_WM_HANDLED_ICONS property.
- * @param window The window.
- *
- * Indicate to the Window Manager that it does not need to provide
- * icons for the iconified @p window by sending the
- * _NET_WM_HANDLED_ICONS property to @p window.
- *
- * This function can be used by a Pager on one of its own toplevel
- * windows (for example if the Client is a taskbar and provides
- * buttons for iconified windows).
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_handled_icons_set(Ecore_X_Window window)
+EAPI Eina_Bool
+ecore_x_netwm_user_time_get(Ecore_X_Window win,
+                            unsigned int  *t)
 {
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
-                                 NULL, 0);
+   unsigned int tmp;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_USER_TIME,
+                                       &tmp, 1))
+     return EINA_FALSE;
+
+   if (t) *t = tmp;
+
+   return EINA_TRUE;
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_handled_icons_get_prefetch(Ecore_X_Window window)
+ecore_x_netwm_visible_name_set(Ecore_X_Window win,
+                               const char    *name)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_HANDLED_ICONS, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_VISIBLE_NAME,
+                                  name);
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_handled_icons_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_handled_icons_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Return wheter the Client handles icons or not.
- * @param window The window.
- * @return       1 if icons are handled, 0 otherwise.
- *
- * Return whether the client handles icons or not if @p window is
- * iconified.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_handled_icons_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_handled_icons_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI int
-ecore_x_netwm_handled_icons_get(Ecore_X_Window window)
-{
-   int ret = 0;
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
-                                       NULL, 0);
-   return (ret == 0) ? 1 : 0;
-}
-
-/**
- * Set the _NET_WM_USER_TIME property.
- * @param window The window.
- * @param time   The last user activity time in the window.
- *
- * Set the XServer time at which last user activity in @p window took
- * place by sending the _NET_WM_USER_TIME property to @p window. @p
- * time contains that XServer time in seconds.
- *
- * This function allows a Window Manager to alter the focus, stacking,
- * and/or placement behavior of windows when they are mapped depending
- * on whether the new window was created by a user action or is a
- * "pop-up" window activated by a timer or some other event.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_user_time_set(Ecore_X_Window window,
-                            unsigned int   time)
+ecore_x_netwm_visible_name_get(Ecore_X_Window win,
+                               char         **name)
 {
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_WM_USER_TIME,
-                                 &time, 1);
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (name)
+     *name = ecore_x_window_prop_string_get(win,
+                                            ECORE_X_ATOM_NET_WM_VISIBLE_NAME);
+   return 1;
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_user_time_get_prefetch(Ecore_X_Window window)
+ecore_x_netwm_visible_icon_name_set(Ecore_X_Window win,
+                                    const char    *name)
 {
-   xcb_get_property_cookie_t cookie;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_USER_TIME, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME,
+                                  name);
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_user_time_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_user_time_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the last user activity time in the window.
- * @param window The window.
- * @param time   The returned time.
- * @return       1 on success, 0 otherwise.
- *
- * Return the XServer time at which last user activity in @p window
- * took place. The time is stored in @p time.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_user_time_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_user_time_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI int
-ecore_x_netwm_user_time_get(Ecore_X_Window window,
-                            unsigned int  *time)
+ecore_x_netwm_visible_icon_name_get(Ecore_X_Window win,
+                                    char         **name)
 {
-   int ret;
-   uint32_t tmp;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+   if (name)
+     {
+        *name =
+          ecore_x_window_prop_string_get(win,
+                                         ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME);
+     }
 
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_USER_TIME,
-                                       &tmp, 1);
-   if (time) *time = tmp;
-   return (ret == 1) ? 1 : 0;
+   return 1;
 }
 
-Ecore_X_Window_State
-_ecore_x_netwm_state_get(Ecore_X_Atom a)
+EAPI Eina_Bool
+ecore_x_netwm_sync_counter_get(Ecore_X_Window        win,
+                               Ecore_X_Sync_Counter *counter)
 {
-   if (a == ECORE_X_ATOM_NET_WM_STATE_MODAL)
-     return ECORE_X_WINDOW_STATE_MODAL;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_STICKY)
-     return ECORE_X_WINDOW_STATE_STICKY;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT)
-     return ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ)
-     return ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_SHADED)
-     return ECORE_X_WINDOW_STATE_SHADED;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR)
-     return ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER)
-     return ECORE_X_WINDOW_STATE_SKIP_PAGER;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_HIDDEN)
-     return ECORE_X_WINDOW_STATE_HIDDEN;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN)
-     return ECORE_X_WINDOW_STATE_FULLSCREEN;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_ABOVE)
-     return ECORE_X_WINDOW_STATE_ABOVE;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_BELOW)
-     return ECORE_X_WINDOW_STATE_BELOW;
-   else if (a == ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION)
-     return ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION;
-   else
-     return ECORE_X_WINDOW_STATE_UNKNOWN;
-}
-
-static Ecore_X_Atom
-_ecore_x_netwm_state_atom_get(Ecore_X_Window_State s)
-{
-   switch(s)
-     {
-      case ECORE_X_WINDOW_STATE_MODAL:
-        return ECORE_X_ATOM_NET_WM_STATE_MODAL;
-      case ECORE_X_WINDOW_STATE_STICKY:
-        return ECORE_X_ATOM_NET_WM_STATE_STICKY;
-      case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
-        return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT;
-      case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
-        return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ;
-      case ECORE_X_WINDOW_STATE_SHADED:
-        return ECORE_X_ATOM_NET_WM_STATE_SHADED;
-      case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
-        return ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR;
-      case ECORE_X_WINDOW_STATE_SKIP_PAGER:
-        return ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER;
-      case ECORE_X_WINDOW_STATE_HIDDEN:
-        return ECORE_X_ATOM_NET_WM_STATE_HIDDEN;
-      case ECORE_X_WINDOW_STATE_FULLSCREEN:
-        return ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN;
-      case ECORE_X_WINDOW_STATE_ABOVE:
-        return ECORE_X_ATOM_NET_WM_STATE_ABOVE;
-      case ECORE_X_WINDOW_STATE_BELOW:
-        return ECORE_X_ATOM_NET_WM_STATE_BELOW;
-      case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
-        return ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION;
-      default:
-        return 0;
-     }
-}
-
-/**
- * Set the _NET_WM_STATE property.
- * @param window The window.
- * @param state  An array of window hints.
- * @param num    The number of hints.
- *
- * Set a list of hints describing @p window state by sending the
- * _NET_WM_STATE property to @p window. The hints are stored in the
- * array @p state. @p num must contain the number of hints.
- *
- * The Window Manager SHOULD honor _NET_WM_STATE whenever a withdrawn
- * window requests to be mapped. A Client wishing to change the state
- * of a window MUST send a _NET_WM_STATE client message to the root
- * window. The Window Manager MUST keep this property updated to
- * reflect the current state of the window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_window_state_set(Ecore_X_Window        window,
-                               Ecore_X_Window_State *state,
-                               unsigned int          num)
-{
-   Ecore_X_Atom  *set;
-   uint32_t       i;
-
-   if (!num)
-     {
-       ecore_x_window_prop_property_del(window, ECORE_X_ATOM_NET_WM_STATE);
-       return;
-     }
-
-   set = malloc(num * sizeof(Ecore_X_Atom));
-   if (!set) return;
-
-   for (i = 0; i < num; i++)
-     set[i] = _ecore_x_netwm_state_atom_get(state[i]);
-
-   ecore_x_window_prop_atom_set(window, ECORE_X_ATOM_NET_WM_STATE, set, num);
-
-   free(set);
-}
-
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_window_state_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
-
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_STATE, ECORE_X_ATOM_ATOM,
-                                       0, 0x7fffffff);;
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
-
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_window_state_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_window_state_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the hints describing the window state.
- * @param window The window.
- * @param state  The returned hins.
- * @param num    The number of hints.
- * @return       1 on success, 0 otherwise.
- *
- * Retrieve the hints describing @p window state. The state is
- * returned in @p state. The nummber of hints is stored in @p
- * num. This function returns 1 on success, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_window_state_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_window_state_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_window_state_get(Ecore_X_Window         window,
-                               Ecore_X_Window_State **state,
-                               unsigned int          *num)
-{
-   Ecore_X_Atom *atoms;
-   int           num_ret;
-   int           i;
-
-   if (num) *num = 0;
-   if (state) *state = NULL;
-
-   num_ret = ecore_x_window_prop_atom_list_get(window, ECORE_X_ATOM_NET_WM_STATE,
-                                              &atoms);
-   if (num_ret <= 0)
-      return 0;
-
-   if (state)
-     {
-       *state = malloc(num_ret * sizeof(Ecore_X_Window_State));
-       if (*state)
-         for (i = 0; i < num_ret; ++i)
-           (*state)[i] = _ecore_x_netwm_state_get(atoms[i]);
-
-       if (num) *num = num_ret;
-     }
-
-   free(atoms);
-
-   return 1;
-}
-
-static Ecore_X_Window_Type
-_ecore_x_netwm_window_type_type_get(Ecore_X_Atom atom)
-{
-   if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP)
-     return ECORE_X_WINDOW_TYPE_DESKTOP;
-   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK)
-     return ECORE_X_WINDOW_TYPE_DOCK;
-   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR)
-     return ECORE_X_WINDOW_TYPE_TOOLBAR;
-   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU)
-     return ECORE_X_WINDOW_TYPE_MENU;
-   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY)
-     return ECORE_X_WINDOW_TYPE_UTILITY;
-   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH)
-     return ECORE_X_WINDOW_TYPE_SPLASH;
-   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG)
-     return ECORE_X_WINDOW_TYPE_DIALOG;
-   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL)
-     return ECORE_X_WINDOW_TYPE_NORMAL;
-   else
-     return ECORE_X_WINDOW_TYPE_UNKNOWN;
-}
-
-static Ecore_X_Atom
-_ecore_x_netwm_window_type_atom_get(Ecore_X_Window_Type type)
-{
-   switch (type)
-     {
-      case ECORE_X_WINDOW_TYPE_DESKTOP:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP;
-      case ECORE_X_WINDOW_TYPE_DOCK:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK;
-      case ECORE_X_WINDOW_TYPE_TOOLBAR:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR;
-      case ECORE_X_WINDOW_TYPE_MENU:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU;
-      case ECORE_X_WINDOW_TYPE_UTILITY:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY;
-      case ECORE_X_WINDOW_TYPE_SPLASH:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH;
-      case ECORE_X_WINDOW_TYPE_DIALOG:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
-      case ECORE_X_WINDOW_TYPE_NORMAL:
-        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
-      default:
-        return 0;
-     }
-}
+   unsigned int tmp;
 
-/*
- * FIXME: We should set WM_TRANSIENT_FOR if type is ECORE_X_WINDOW_TYPE_TOOLBAR
- * , ECORE_X_WINDOW_TYPE_MENU or ECORE_X_WINDOW_TYPE_DIALOG
- */
-
-/**
- * Set the _NET_WM_WINDOW_TYPE property.
- * @param window The window.
- * @param type   The functional type of the window.
- *
- * Set the functional @p type of @p window by sending _NET_WM_WINDOW_TYPE
- * property to @p window.
- *
- * This property SHOULD be set by the Client before mapping. This
- * property SHOULD be used by the window manager in determining the
- * decoration, stacking position and other behavior of the window. The
- * Client SHOULD specify window types in order of preference (the first
- * being most preferable).
- *
- * This hint is intended to replace the MOTIF hints.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_window_type_set(Ecore_X_Window      window,
-                              Ecore_X_Window_Type type)
-{
-   Ecore_X_Atom atom;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   atom = _ecore_x_netwm_window_type_atom_get(type);
-   ecore_x_window_prop_atom_set(window, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
-                               &atom, 1);
-}
+   if (!ecore_x_window_prop_card32_get(win,
+                                       ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
+                                       &tmp, 1))
+     return EINA_FALSE;
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_window_type_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
+   if (counter) *counter = tmp;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_WINDOW_TYPE, ECORE_X_ATOM_ATOM,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   return EINA_TRUE;
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_window_type_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_window_type_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/* FIXME: Maybe return 0 on some conditions? */
-
-/**
- * Get the functional type of a window.
- * @param window The window.
- * @param type   The function type of the window.
- * @return       1 on success, 0 otherwise.
- *
- * Retrieve the functional type of @p window. The type is stored in
- * @p type. This function returns 1 on success, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_window_type_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_window_type_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_window_type_get(Ecore_X_Window       window,
-                              Ecore_X_Window_Type *type)
+EAPI Eina_Bool
+ecore_x_netwm_allowed_action_isset(Ecore_X_Window win,
+                                   Ecore_X_Action action)
 {
-   Ecore_X_Atom *atoms;
-   int           num;
-   int           i;
+   int num = 0, i = 0;
+   Ecore_X_Atom *atoms, atom;
+   Eina_Bool ret = EINA_FALSE;
 
-   if (type) *type = ECORE_X_WINDOW_TYPE_NORMAL;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   num = ecore_x_window_prop_atom_list_get(window, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
-                                          &atoms);
-   if (num < 0)
-     {
-       /* IMO this is not the place to mix netwm and icccm /kwo */
-       /* Check if WM_TRANSIENT_FOR is set */
-
-        /* Disable it for xcb */
-
-/*     if ((type) && (ecore_x_icccm_transient_for_get(window))) */
-/*       *type = ECORE_X_WINDOW_TYPE_DIALOG; */
-/*     return 1; */
-     }
+   num =
+     ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
+                                       &atoms);
+   if (num <= 0) return EINA_FALSE;
 
-   if (type)
-     {
-       for (i = 0; i < num; ++i)
-         {
-            *type = _ecore_x_netwm_window_type_type_get(atoms[i]);
-            if (*type != ECORE_X_WINDOW_TYPE_UNKNOWN)
-              break;
-         }
-     }
-
-   free(atoms);
-
-   return 1;
-}
-
-static Ecore_X_Atom
-_ecore_x_netwm_action_atom_get(Ecore_X_Action action)
-{
-   switch (action)
+   atom = _ecore_xcb_netwm_action_atom_get(action);
+   for (i = 0; i < num; i++)
      {
-      case ECORE_X_ACTION_MOVE:
-        return ECORE_X_ATOM_NET_WM_ACTION_MOVE;
-      case ECORE_X_ACTION_RESIZE:
-        return ECORE_X_ATOM_NET_WM_ACTION_RESIZE;
-      case ECORE_X_ACTION_MINIMIZE:
-        return ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE;
-      case ECORE_X_ACTION_SHADE:
-        return ECORE_X_ATOM_NET_WM_ACTION_SHADE;
-      case ECORE_X_ACTION_STICK:
-        return ECORE_X_ATOM_NET_WM_ACTION_STICK;
-      case ECORE_X_ACTION_MAXIMIZE_HORZ:
-        return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ;
-      case ECORE_X_ACTION_MAXIMIZE_VERT:
-        return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT;
-      case ECORE_X_ACTION_FULLSCREEN:
-        return ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN;
-      case ECORE_X_ACTION_CHANGE_DESKTOP:
-        return ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP;
-      case ECORE_X_ACTION_CLOSE:
-        return ECORE_X_ATOM_NET_WM_ACTION_CLOSE;
-      default:
-        return 0;
+        if (atoms[i] == atom)
+          {
+             ret = EINA_TRUE;
+             break;
+          }
      }
-}
-
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_allowed_action_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS, ECORE_X_ATOM_ATOM,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+   if (atoms) free(atoms);
+   return ret;
 }
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_allowed_action_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_allowed_action_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/* FIXME: Get complete list */
-
-/**
- * Check whether an action is supported by a window.
- * @param window The window
- * @param action The action
- * @return       1 if set, 0 otherwise.
- *
- * Return whether the user operation @p action is supported by the
- * Window Manager for @p window.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_allowed_action_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_allowed_action_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_allowed_action_isset(Ecore_X_Window window,
-                                   Ecore_X_Action action)
+EAPI Eina_Bool
+ecore_x_netwm_allowed_action_get(Ecore_X_Window   win,
+                                 Ecore_X_Action **action,
+                                 unsigned int    *num)
 {
    Ecore_X_Atom *atoms;
-   Ecore_X_Atom  atom;
-   int           num;
-   int           ret = 0;
-   int           i;
+   int num_ret = 0;
 
-   num = ecore_x_window_prop_atom_list_get(window, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
-                                          &atoms);
-   if (num <= 0)
-     return ret;
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
-   atom = _ecore_x_netwm_action_atom_get(action);
+   if (num) *num = 0;
+   if (action) *action = NULL;
 
-   for (i = 0; i < num; ++i)
+   num_ret =
+     ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
+                                       &atoms);
+   if (num_ret <= 0) return EINA_FALSE;
+   if (action)
      {
-       if (atom == atoms[i])
-         {
-            ret = 1;
-            break;
-         }
+        *action = malloc(num_ret * sizeof(Ecore_X_Action));
+        if (*action)
+          {
+             int i = 0;
+
+             for (i = 0; i < num_ret; i++)
+               (*action)[i] = _ecore_xcb_netwm_action_atom_get(atoms[i]);
+          }
+        if (num) *num = num_ret;
      }
-
    free(atoms);
-
-   return ret;
+   return EINA_TRUE;
 }
 
-/* FIXME: Set complete list */
-/**
- * Set the _NET_WM_ALLOWED_ACTIONS property.
- * @param window The window.
- * @param action An array of allowed actions.
- * @param num    The number of actions.
- *
- * Set the user operations that the Window Manager supports for
- * @p window by sending the _NET_WM_ALLOWED_ACTIONS property to
- * @p window. @p action stores @p num actions.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_allowed_action_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_allowed_action_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
 EAPI void
-ecore_x_netwm_allowed_action_set(Ecore_X_Window  window,
+ecore_x_netwm_allowed_action_set(Ecore_X_Window  win,
                                  Ecore_X_Action *action,
                                  unsigned int    num)
 {
-   Ecore_X_Atom  *set;
-   unsigned int   i;
+   Ecore_X_Atom *set;
+   unsigned int i = 0;
+
+   LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
    if (!num)
      {
-       ecore_x_window_prop_property_del(window, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS);
-       return;
+        ecore_x_window_prop_property_del(win,
+                                         ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS);
+        return;
      }
 
    set = malloc(num * sizeof(Ecore_X_Atom));
    if (!set) return;
 
    for (i = 0; i < num; i++)
-     set[i] = _ecore_x_netwm_action_atom_get(action[i]);
-
-   ecore_x_window_prop_atom_set(window, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS, set, num);
+     set[i] = _ecore_xcb_netwm_action_atom_get(action[i]);
 
+   ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
+                                set, num);
    free(set);
 }
 
-/**
- * Get the allowed actions supported by a window.
- * @param window The window.
- * @param action The returned array of the actions.
- * @param num    The number of actions.
- * @return       1 on success, 0 otherwise.
- *
- * Retrieve the user operations that the Window Manager supports for
- * @p window and store them in @p action. The number of actions is
- * stored in @p num. This function returns 1 on success, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_allowed_action_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_allowed_action_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_allowed_action_get(Ecore_X_Window   window,
-                                 Ecore_X_Action **action,
-                                 unsigned int    *num)
+/* local functions */
+int
+_ecore_xcb_netwm_startup_info_begin(Ecore_X_Window win __UNUSED__,
+                                    uint8_t        data __UNUSED__)
 {
-   Ecore_X_Atom *atoms;
-   int           num_ret;
-   int           i;
-
-   if (num) *num = 0;
-   if (action) *action = NULL;
-
-   num_ret = ecore_x_window_prop_atom_list_get(window, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
-                                              &atoms);
-   if (num_ret <= 0)
-      return 0;
-
-   if (action)
-     {
-       *action = malloc(num_ret * sizeof(Ecore_X_Action));
-       if (*action)
-         for (i = 0; i < num_ret; ++i)
-           (*action)[i] = _ecore_x_netwm_action_atom_get(atoms[i]);
-
-       if (num) *num = num_ret;
-     }
-
-   free(atoms);
-
-   return 1;
+   // TODO: TBD
+     return 1;
 }
 
-/**
- * Set the _NET_WM_WINDOW_OPACITY property.
- * @param window  The window.
- * @param opacity The opacity value.
- *
- * Set the desired opacity of @p window by sending the
- * _NET_WM_WINDOW_OPACITY property to @p window. @p opacity is 0 for a
- * transparent window and 0xffffffff for an opaque window. @p opacity
- * must be multiplied with the original alpha value of @p window
- * (which is 1 for visuals not including an alpha component) so that
- * @p window content is modulated by the opacity value.
- *
- * Window Managers acting as compositing managers MAY take this into
- * account when displaying a window. Window Managers MUST forward the
- * value of this property to any enclosing frame window.  This
- * property MAY change while the window is mapped and the Window
- * Manager MUST respect changes while the window is mapped.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_opacity_set(Ecore_X_Window window,
-                          unsigned int   opacity)
+int
+_ecore_xcb_netwm_startup_info(Ecore_X_Window win __UNUSED__,
+                              uint8_t        data __UNUSED__)
 {
-   uint32_t op = opacity;
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
-                                 &op, 1);
+   // TODO: TBD
+     return 1;
 }
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_opacity_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
+/* static void  */
+/* _ecore_xcb_netwm_startup_info_free(void *data)  */
+/* { */
+/*    Ecore_Xcb_Startup_Info *info; */
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_WINDOW_OPACITY, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
+/*    LOGFN(__FILE__, __LINE__, __FUNCTION__); */
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_opacity_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_opacity_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the opacity value of a window.
- * @param window  The window.
- * @param opacity The returned opacity.
- * @return        1 on success, 0 otherwise.
- *
- * Retriee the opacity value of @p window and store it in
- * @p opacity. This function returns 1 on sucess, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_opacity_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_opacity_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_opacity_get(Ecore_X_Window window,
-                          unsigned int  *opacity)
-{
-   int ret;
-   unsigned int tmp;
+/*    if (!(info = data)) return; */
+/*    if (info->buffer) free(info->buffer); */
+/*    if (info->id) free(info->id); */
+/*    if (info->name) free(info->name); */
+/*    if (info->bin) free(info->bin); */
+/*    if (info->icon) free(info->icon); */
+/*    if (info->description) free(info->description); */
+/*    if (info->wmclass) free(info->wmclass); */
+/*    free(info); */
+/* } */
 
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
-                                       &tmp, 1);
-   if (opacity) *opacity = tmp;
-   return ret == 1 ? 1 : 0;
-}
-
-/**
- * Set the _NET_FRAME_EXTENTS property.
- * @param window The window.
- * @param fl     The number of pixels of the left border of the window.
- * @param fr     The number of pixels of the right border of the window.
- * @param ft     The number of pixels of the top border of the window.
- * @param fb     The number of pixels of the bottom border of the window.
- *
- * Set the border witdh of @p window by sending the _NET_FRAME_EXTENTS
- * property to @p window. @p fl, @p fr, @p ft and @p fb are respectively
- * the number of pixels of the left, right, top and bottom border of
- * @p window.
- *
- * The Window Manager MUST set _NET_FRAME_EXTENTS to the extents of
- * the window's frame.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_frame_size_set(Ecore_X_Window window,
-                             int            fl,
-                             int            fr,
-                             int            ft,
-                             int            fb)
+static Ecore_X_Atom
+_ecore_xcb_netwm_window_type_atom_get(Ecore_X_Window_Type type)
 {
-   uint32_t frames[4];
-
-   frames[0] = fl;
-   frames[1] = fr;
-   frames[2] = ft;
-   frames[3] = fb;
-   ecore_x_window_prop_card32_set(window, ECORE_X_ATOM_NET_FRAME_EXTENTS, frames, 4);
-}
+   switch (type)
+     {
+      case ECORE_X_WINDOW_TYPE_DESKTOP:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP;
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_frame_size_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
+      case ECORE_X_WINDOW_TYPE_DOCK:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_FRAME_EXTENTS, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
+      case ECORE_X_WINDOW_TYPE_TOOLBAR:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR;
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_frame_size_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_frame_size_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the frame extent of a window.
- * @param window  The window.
- * @param fl      The number of pixels of the left border of the window.
- * @param fr      The number of pixels of the right border of the window.
- * @param ft      The number of pixels of the top border of the window.
- * @param fb      The number of pixels of the bottom border of the window.
- * @return        1 on success, 0 otherwise.
- *
- * Retrieve the frame extents of @p window. The number of pixels of
- * the left, right, top and bottom border of @p window are
- * respectively stored in @p fl, @p fr, @p ft anfd @p fb. TYhis
- * function retuirns 1 on success, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_frame_size_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_frame_size_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_frame_size_get(Ecore_X_Window window,
-                             int           *fl,
-                             int           *fr,
-                             int           *ft,
-                             int           *fb)
-{
-   uint32_t frames[4];
-   int      ret = 0;
+      case ECORE_X_WINDOW_TYPE_MENU:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU;
 
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_FRAME_EXTENTS, frames, 4);
-   if (ret != 4)
-     return 0;
+      case ECORE_X_WINDOW_TYPE_UTILITY:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY;
 
-   if (fl) *fl = frames[0];
-   if (fr) *fr = frames[1];
-   if (ft) *ft = frames[2];
-   if (fb) *fb = frames[3];
-   return 1;
-}
+      case ECORE_X_WINDOW_TYPE_SPLASH:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH;
 
-/**
- * Sends the GetProperty request.
- * @param window The window.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_sync_counter_get_prefetch(Ecore_X_Window window)
-{
-   xcb_get_property_cookie_t cookie;
+      case ECORE_X_WINDOW_TYPE_DIALOG:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER, ECORE_X_ATOM_CARDINAL,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
-}
+      case ECORE_X_WINDOW_TYPE_NORMAL:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
 
-/**
- * Gets the reply of the GetProperty request sent by ecore_x_netwm_sync_counter_get_prefetch().
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_sync_counter_get_fetch(void)
-{
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
-}
-
-/**
- * Get the X ID of a X Sync counter.
- * @param window  The window.
- * @param counter The X ID of the Sync counter.
- * @return        1 on success, 0 otherwise.
- *
- * Retrieve the X ID of the X Sync counter of @p window and store it
- * in @p counter. This function returns 1 on success, 0 otherwise.
- *
- * To use this function, you must call before, and in order,
- * ecore_x_netwm_frame_size_get_prefetch(), which sends the GetProperty request,
- * then ecore_x_netwm_frame_size_get_fetch(), which gets the reply.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_netwm_sync_counter_get(Ecore_X_Window        window,
-                               Ecore_X_Sync_Counter *counter)
-{
-   int          ret;
-   unsigned int tmp;
+      case ECORE_X_WINDOW_TYPE_DROPDOWN_MENU:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU;
 
-   ret = ecore_x_window_prop_card32_get(window, ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
-                                       &tmp, 1);
+      case ECORE_X_WINDOW_TYPE_POPUP_MENU:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU;
 
-   if (counter) *counter = tmp;
-   return (ret == 1) ? 1 : 0;
-}
+      case ECORE_X_WINDOW_TYPE_TOOLTIP:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP;
 
-/**
- * Send a _NET_WM_PING property event.
- * @param window The window.
- *
- * Send a ClientMessage event from @p window with the _NET_WM_PING
- * property set.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_ping_send(Ecore_X_Window window)
-{
-   xcb_client_message_event_t ev;
+      case ECORE_X_WINDOW_TYPE_NOTIFICATION:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION;
 
-   if (!window) return;
+      case ECORE_X_WINDOW_TYPE_COMBO:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO;
 
-   ev.response_type = XCB_CLIENT_MESSAGE | 0x80;
-   ev.format = 32;
-   ev.sequence = 0;
-   ev.window = window;
-   ev.type = ECORE_X_ATOM_WM_PROTOCOLS;
-   ev.data.data32[0] = ECORE_X_ATOM_NET_WM_PING;
-   ev.data.data32[1] = XCB_CURRENT_TIME;
-   ev.data.data32[2] = window;
-   ev.data.data32[3] = 0;
-   ev.data.data32[4] = 0;
-   ev.data.data32[5] = 0;
+      case ECORE_X_WINDOW_TYPE_DND:
+        return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND;
 
-   xcb_send_event(_ecore_xcb_conn, 0, window, XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
+      default:
+        return 0;
+     }
 }
 
-/**
- * Send a _NET_WM_SYNC_REQUEST property event.
- * @param window The window.
- * @param serial The update request number.
- *
- * Send a ClientMessage event from @p window with the _NET_WM_SYNC_REQUEST
- * property set.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_sync_request_send(Ecore_X_Window window,
-                                unsigned int   serial)
-{
-   xcb_client_message_event_t ev;
-
-   if (!window) return;
-
-   ev.response_type = XCB_CLIENT_MESSAGE | 0x80;
-   ev.format = 32;
-   ev.window = window;
-   ev.type = ECORE_X_ATOM_WM_PROTOCOLS;
-   ev.data.data32[0] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
-   ev.data.data32[1] = XCB_CURRENT_TIME;
-   ev.data.data32[2] = serial;
-   /* FIXME: imho, the following test is useless as serial is non negative */
-   /* should we remove it ? */
-   ev.data.data32[3] = (serial < 0) ? ~0L : 0L;
-   ev.data.data32[4] = 0;
-
-   xcb_send_event(_ecore_xcb_conn, 0, window, 0, (const char *)&ev);
-}
-
-/**
- * Send a _NET_WM_STATE property event.
- * @param window The window.
- * @param root   The root window.
- * @param s1     The first state to alter.
- * @param s2     The second state to alter.
- * @param set    0 to unset the property, set it otherwise.
- *
- * Send a ClientMessage event from @p window to the @p root window
- * with the _NET_WM_STATE property set. This change the state of a
- * mapped window. @p s1 is the first state to alter. @p s2 is the
- * second state to alter. If @p set value is 0, the property is
- * removed (or unset), otherwise, the property is set.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_state_request_send(Ecore_X_Window       window,
-                                 Ecore_X_Window       root,
-                                 Ecore_X_Window_State s1,
-                                 Ecore_X_Window_State s2,
-                                 int                  set)
+static Ecore_X_Window_Type
+_ecore_xcb_netwm_window_type_type_get(Ecore_X_Atom atom)
 {
-   xcb_client_message_event_t ev;
-
-   if (!window) return;
-   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
-
-   ev.response_type = XCB_CLIENT_MESSAGE | 0x80;
-   ev.format = 32;
-   ev.window = window;
-   ev.type = ECORE_X_ATOM_NET_WM_STATE;
-   ev.data.data32[0] = !!set;
-   ev.data.data32[1] = _ecore_x_netwm_state_atom_get(s1);
-   ev.data.data32[2] = _ecore_x_netwm_state_atom_get(s2);
-   /* 1 == normal client, if someone wants to use this
-    * function in a pager, this should be 2 */
-   ev.data.data32[3] = 1;
-   ev.data.data32[4] = 0;
+   if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP)
+     return ECORE_X_WINDOW_TYPE_DESKTOP;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK)
+     return ECORE_X_WINDOW_TYPE_DOCK;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR)
+     return ECORE_X_WINDOW_TYPE_TOOLBAR;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU)
+     return ECORE_X_WINDOW_TYPE_MENU;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY)
+     return ECORE_X_WINDOW_TYPE_UTILITY;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH)
+     return ECORE_X_WINDOW_TYPE_SPLASH;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG)
+     return ECORE_X_WINDOW_TYPE_DIALOG;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL)
+     return ECORE_X_WINDOW_TYPE_NORMAL;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU)
+     return ECORE_X_WINDOW_TYPE_DROPDOWN_MENU;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU)
+     return ECORE_X_WINDOW_TYPE_POPUP_MENU;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP)
+     return ECORE_X_WINDOW_TYPE_TOOLTIP;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION)
+     return ECORE_X_WINDOW_TYPE_NOTIFICATION;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO)
+     return ECORE_X_WINDOW_TYPE_COMBO;
+   else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND)
+     return ECORE_X_WINDOW_TYPE_DND;
+   else
+     return ECORE_X_WINDOW_TYPE_UNKNOWN;
+}
 
-   xcb_send_event(_ecore_xcb_conn, 0, root,
-                  XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT,
-                  (const char *)&ev);
-}
-
-/**
- * Send a _NET_WM_DESKTOP property event.
- * @param window  The window.
- * @param root    The root window.
- * @param desktop The new desktop index.
- *
- * Send a ClientMessage event from @p window to the @p root window
- * with the _NET_WM_DESKTOP property set. This change the state of a
- * non-withdrawn window. @p desktop is the new desktop index to set.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI void
-ecore_x_netwm_desktop_request_send(Ecore_X_Window window,
-                                   Ecore_X_Window root,
-                                   unsigned int   desktop)
+static Ecore_X_Atom
+_ecore_xcb_netwm_window_state_atom_get(Ecore_X_Window_State state)
 {
-   xcb_client_message_event_t ev;
+   switch (state)
+     {
+      case ECORE_X_WINDOW_STATE_MODAL:
+        return ECORE_X_ATOM_NET_WM_STATE_MODAL;
 
-   if (!window) return;
-   if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
+      case ECORE_X_WINDOW_STATE_STICKY:
+        return ECORE_X_ATOM_NET_WM_STATE_STICKY;
 
-   ev.response_type = XCB_CLIENT_MESSAGE | 0x80;
-   ev.format = 32;
-   ev.window = window;
-   ev.type = ECORE_X_ATOM_NET_WM_DESKTOP;
-   ev.data.data32[0] = desktop;
+      case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
+        return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT;
 
-   xcb_send_event(_ecore_xcb_conn, 0, root,
-                  XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT,
-                  (const char *)&ev);
-}
+      case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
+        return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ;
 
-int
-_ecore_x_netwm_startup_info_begin(Ecore_X_Window window,
-                                  char          *data)
-{
-#if 0
-   Ecore_X_Startup_Info *info;
+      case ECORE_X_WINDOW_STATE_SHADED:
+        return ECORE_X_ATOM_NET_WM_STATE_SHADED;
 
-   if (!startup_info) return 0;
-   info = ecore_hash_get(startup_info, (void *)window);
-   if (info)
-     {
-       printf("Already got info for win: 0x%x\n", window);
-       _ecore_x_netwm_startup_info_free(info);
-     }
-   info = calloc(1, sizeof(Ecore_X_Startup_Info));
-   if (!info) return 0;
-   info->win = win;
-   info->length = 0;
-   info->buffer_size = 161;
-   info->buffer = calloc(info->buffer_size, sizeof(char));
-   if (!info->buffer)
-     {
-       _ecore_x_netwm_startup_info_free(info);
-       return 0;
-     }
-   memcpy(info->buffer, data, 20);
-   info->length += 20;
-   info->buffer[info->length] = 0;
-   ecore_hash_set(startup_info, (void *)info->win, info);
-   if (strlen(info->buffer) != 20)
-     {
-       /* We have a '\0' in there, the message is done */
-       _ecore_x_netwm_startup_info_process(info);
-     }
-#else
-   window = XCB_NONE;
-   data = NULL;
-#endif
+      case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
+        return ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR;
 
-   return 1;
-}
+      case ECORE_X_WINDOW_STATE_SKIP_PAGER:
+        return ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER;
 
-int
-_ecore_x_netwm_startup_info(Ecore_X_Window window,
-                            char          *data)
-{
-#if 0
-   Ecore_X_Startup_Info *info;
-   char *p;
+      case ECORE_X_WINDOW_STATE_HIDDEN:
+        return ECORE_X_ATOM_NET_WM_STATE_HIDDEN;
 
-   if (!startup_info) return 0;
-   info = ecore_hash_get(startup_info, (void *)window);
-   if (!info) return 0;
-   if ((info->length + 20) > info->buffer_size)
-     {
-       info->buffer_size += 160;
-       info->buffer = realloc(info->buffer, info->buffer_size * sizeof(char));
-       if (!info->buffer)
-         {
-            ecore_hash_remove(startup_info, (void *)info->win);
-            _ecore_x_netwm_startup_info_free(info);
-            return 0;
-         }
-     }
-   memcpy(info->buffer + info->length, data, 20);
-   p = info->buffer + info->length;
-   info->length += 20;
-   info->buffer[info->length] = 0;
-   if (strlen(p) != 20)
-     {
-       /* We have a '\0' in there, the message is done */
-       _ecore_x_netwm_startup_info_process(info);
-     }
-#else
-   window = XCB_NONE;
-   data = NULL;
-#endif
+      case ECORE_X_WINDOW_STATE_FULLSCREEN:
+        return ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN;
 
-   return 1;
-}
+      case ECORE_X_WINDOW_STATE_ABOVE:
+        return ECORE_X_ATOM_NET_WM_STATE_ABOVE;
 
-/*
- * Set UTF-8 string property
- */
-static void
-_ecore_x_window_prop_string_utf8_set(Ecore_X_Window window,
-                                     Ecore_X_Atom   atom,
-                                     const char    *str)
-{
-   xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, window,
-                       atom, ECORE_X_ATOM_UTF8_STRING,
-                       8, strlen(str), str);
-}
+      case ECORE_X_WINDOW_STATE_BELOW:
+        return ECORE_X_ATOM_NET_WM_STATE_BELOW;
 
-#if 0
-static void
-_ecore_x_window_prop_string_utf8_get_prefetch(Ecore_X_Window window,
-                                              Ecore_X_Atom atom)
-{
-   xcb_get_property_cookie_t cookie;
+      case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
+        return ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION;
 
-   cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, window,
-                                       atom, ECORE_X_ATOM_UTF8_STRING,
-                                       0, 0x7fffffff);
-   _ecore_xcb_cookie_cache(cookie.sequence);
+      default:
+        return 0;
+     }
 }
 
-static void
-_ecore_x_window_prop_string_utf8_get_fetch(void)
+Ecore_X_Window_State
+_ecore_xcb_netwm_window_state_get(Ecore_X_Atom atom)
 {
-   xcb_get_property_cookie_t cookie;
-   xcb_get_property_reply_t *reply;
-
-   cookie.sequence = _ecore_xcb_cookie_get();
-   reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
-   _ecore_xcb_reply_cache(reply);
+   if (atom == ECORE_X_ATOM_NET_WM_STATE_MODAL)
+     return ECORE_X_WINDOW_STATE_MODAL;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_STICKY)
+     return ECORE_X_WINDOW_STATE_STICKY;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT)
+     return ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ)
+     return ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_SHADED)
+     return ECORE_X_WINDOW_STATE_SHADED;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR)
+     return ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER)
+     return ECORE_X_WINDOW_STATE_SKIP_PAGER;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_HIDDEN)
+     return ECORE_X_WINDOW_STATE_HIDDEN;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN)
+     return ECORE_X_WINDOW_STATE_FULLSCREEN;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_ABOVE)
+     return ECORE_X_WINDOW_STATE_ABOVE;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_BELOW)
+     return ECORE_X_WINDOW_STATE_BELOW;
+   else if (atom == ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION)
+     return ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION;
+   else
+     return ECORE_X_WINDOW_STATE_UNKNOWN;
 }
-#endif
 
-/*
- * Get UTF-8 string property
- */
-static char *
-_ecore_x_window_prop_string_utf8_get(Ecore_X_Window window __UNUSED__,
-                                     Ecore_X_Atom   atom __UNUSED__)
+static Ecore_X_Atom
+_ecore_xcb_netwm_action_atom_get(Ecore_X_Action action)
 {
-   xcb_get_property_reply_t *reply;
-   char                     *str;
-   int                       length;
+   switch (action)
+     {
+      case ECORE_X_ACTION_MOVE:
+        return ECORE_X_ATOM_NET_WM_ACTION_MOVE;
 
-   reply = _ecore_xcb_reply_get();
-   if (!reply) return NULL;
+      case ECORE_X_ACTION_RESIZE:
+        return ECORE_X_ATOM_NET_WM_ACTION_RESIZE;
 
-   if ((reply->format != 8) ||
-       (reply->value_len <= 0))
-      return NULL;
+      case ECORE_X_ACTION_MINIMIZE:
+        return ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE;
 
-   length = reply->value_len;
-   str = (char *)malloc (sizeof (char) * (length + 1));
-   if (!str)
-     {
-        return NULL;
-     }
-   memcpy(str, xcb_get_property_value(reply), length);
-   str[length] = '\0';
+      case ECORE_X_ACTION_SHADE:
+        return ECORE_X_ATOM_NET_WM_ACTION_SHADE;
 
-   return str;
-}
+      case ECORE_X_ACTION_STICK:
+        return ECORE_X_ATOM_NET_WM_ACTION_STICK;
 
-#if 0 /* Unused */
-/*
- * Process startup info
- */
-static int
-_ecore_x_netwm_startup_info_process(Ecore_X_Startup_Info *info)
-{
-   Ecore_X_Event_Startup_Sequence *e;
-   int                             event;
-   char                           *p;
+      case ECORE_X_ACTION_MAXIMIZE_HORZ:
+        return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ;
 
-   p = strchr(info->buffer, ':');
-   if (!p)
-     {
-       ecore_hash_remove(startup_info, (void *)info->win);
-       _ecore_x_netwm_startup_info_free(info);
-       return 0;
-     }
-   *p = 0;
-   if (!strcmp(info->buffer, "new"))
-     {
-       if (info->init)
-         event = ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
-       else
-         event = ECORE_X_EVENT_STARTUP_SEQUENCE_NEW;
-       info->init = 1;
-     }
-   else if (!strcmp(info->buffer, "change"))
-     {
-       event = ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
-     }
-   else if (!strcmp(info->buffer, "remove"))
-     event = ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE;
-   else
-     {
-       ecore_hash_remove(startup_info, (void *)info->win);
-       _ecore_x_netwm_startup_info_free(info);
-       return 0;
-     }
+      case ECORE_X_ACTION_MAXIMIZE_VERT:
+        return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT;
 
-   p++;
+      case ECORE_X_ACTION_FULLSCREEN:
+        return ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN;
 
-   if (!_ecore_x_netwm_startup_info_parse(info, p))
-     {
-       ecore_hash_remove(startup_info, (void *)info->win);
-       _ecore_x_netwm_startup_info_free(info);
-       return 0;
-     }
+      case ECORE_X_ACTION_CHANGE_DESKTOP:
+        return ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP;
 
-   if (info->init)
-     {
-       e = calloc(1, sizeof(Ecore_X_Event_Startup_Sequence));
-       if (!e)
-         {
-            ecore_hash_remove(startup_info, (void *)info->win);
-            _ecore_x_netwm_startup_info_free(info);
-            return 0;
-         }
-       e->win = info->win;
-       ecore_event_add(event, e, NULL, NULL);
-     }
+      case ECORE_X_ACTION_CLOSE:
+        return ECORE_X_ATOM_NET_WM_ACTION_CLOSE;
 
-   if (event == ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE)
-     {
-       ecore_hash_remove(startup_info, (void *)info->win);
-       _ecore_x_netwm_startup_info_free(info);
-     }
-   else
-     {
-       /* Discard buffer */
-       info->length = 0;
-       info->buffer[0] = 0;
-     }
-   return 1;
-}
+      case ECORE_X_ACTION_ABOVE:
+        return ECORE_X_ATOM_NET_WM_ACTION_ABOVE;
 
-/*
- * Parse startup info
- */
-static int
-_ecore_x_netwm_startup_info_parse(Ecore_X_Startup_Info *info,
-                                  char                 *data)
-{
+      case ECORE_X_ACTION_BELOW:
+        return ECORE_X_ATOM_NET_WM_ACTION_BELOW;
 
-   while (*data)
-     {
-       int in_quot_sing, in_quot_dbl, escaped;
-       char *p, *pp;
-       char *key;
-       char value[1024];
-
-       /* Skip space */
-       while (*data == ' ') data++;
-       /* Get key */
-       key = data;
-       data = strchr(key, '=');
-       if (!data) return 0;
-       *data = 0;
-       data++;
-
-       /* Get value */
-       p = data;
-       pp = value;
-       in_quot_dbl = 0;
-       in_quot_sing = 0;
-       escaped = 0;
-       while (*p)
-         {
-            if ((pp - value) >= 1024) return 0;
-            if (escaped)
-              {
-                 *pp = *p;
-                 pp++;
-                 escaped = 0;
-              }
-            else if (in_quot_sing)
-              {
-                 if (*p == '\\')
-                   escaped = 1;
-                 else if (*p == '\'')
-                   in_quot_sing = 0;
-                 else
-                   {
-                      *pp = *p;
-                      pp++;
-                   }
-              }
-            else if (in_quot_dbl)
-              {
-                 if (*p == '\\')
-                   escaped = 1;
-                 else if (*p == '\"')
-                   in_quot_dbl = 0;
-                 else
-                   {
-                      *pp = *p;
-                      pp++;
-                   }
-              }
-            else
-              {
-                 if (*p == '\\')
-                   escaped = 1;
-                 else if (*p == '\'')
-                   in_quot_sing = 1;
-                 else if (*p == '\"')
-                   in_quot_dbl = 1;
-                 else if (*p == ' ')
-                   {
-                      break;
-                   }
-                 else
-                   {
-                      *pp = *p;
-                      pp++;
-                   }
-              }
-            p++;
-         }
-       if ((in_quot_dbl) || (in_quot_sing)) return 0;
-       data = p;
-       *pp = 0;
-
-       /* Parse info */
-       if (!strcmp(key, "ID"))
-         {
-            if ((info->id) && (strcmp(info->id, value))) return 0;
-            info->id = strdup(value);
-            p = strstr(value, "_TIME");
-            if (p)
-              {
-                 info->timestamp = atoi(p + 5);
-              }
-         }
-       else if (!strcmp(key, "NAME"))
-         {
-            if (info->name) free(info->name);
-            info->name = strdup(value);
-         }
-       else if (!strcmp(key, "SCREEN"))
-         {
-            info->screen = atoi(value);
-         }
-       else if (!strcmp(key, "BIN"))
-         {
-            if (info->bin) free(info->bin);
-            info->bin = strdup(value);
-         }
-       else if (!strcmp(key, "ICON"))
-         {
-            if (info->icon) free(info->icon);
-            info->icon = strdup(value);
-         }
-       else if (!strcmp(key, "DESKTOP"))
-         {
-            info->desktop = atoi(value);
-         }
-       else if (!strcmp(key, "TIMESTAMP"))
-         {
-            if (!info->timestamp)
-              info->timestamp = atoi(value);
-         }
-       else if (!strcmp(key, "DESCRIPTION"))
-         {
-            if (info->description) free(info->description);
-            info->description = strdup(value);
-         }
-       else if (!strcmp(key, "WMCLASS"))
-         {
-            if (info->wmclass) free(info->wmclass);
-            info->wmclass = strdup(value);
-         }
-       else if (!strcmp(key, "SILENT"))
-         {
-            info->silent = atoi(value);
-         }
-       else
-         {
-            printf("Ecore X Sequence, Unknown: %s=%s\n", key, value);
-         }
+      default:
+        return 0;
      }
-   if (!info->id) return 0;
-   return 1;
 }
-#endif
-
-/*
- * Free startup info struct
- */
-static void
-_ecore_x_netwm_startup_info_free(void *data)
-{
-   Ecore_X_Startup_Info *info;
-
-   info = data;
-   if (!info) return;
-   if (info->buffer) free(info->buffer);
-   if (info->id) free(info->id);
-   if (info->name) free(info->name);
-   if (info->bin) free(info->bin);
-   if (info->icon) free(info->icon);
-   if (info->description) free(info->description);
-   if (info->wmclass) free(info->wmclass);
-   free(info);
-}
-
-/*
- * Is screen composited?
- */
-
-/* FIXME: one round trip can be removed. Can we keep it ? */
-
-/**
- * Check whether a screen is composited or not.
- * @param screen The screen index.
- *
- * Return 1 if @p screen is composited, 0 otherwise.
- * @ingroup Ecore_X_NetWM_Group
- */
-EAPI int
-ecore_x_screen_is_composited(int screen)
-{
-   char                             buf[32];
-   xcb_intern_atom_cookie_t         cookie_atom;
-   xcb_get_selection_owner_cookie_t cookie_owner;
-   xcb_intern_atom_reply_t         *reply_atom;
-   xcb_get_selection_owner_reply_t *reply_owner;
-   Ecore_X_Window                   window;
-   Ecore_X_Atom                     atom;
-
-   snprintf(buf, sizeof(buf), "_NET_WM_CM_S%d", screen);
-   cookie_atom = xcb_intern_atom_unchecked(_ecore_xcb_conn, 1,
-                                           strlen(buf), buf);
-   reply_atom = xcb_intern_atom_reply(_ecore_xcb_conn, cookie_atom, NULL);
-   if (!reply_atom) return 0;
-   atom = reply_atom->atom;
-   free(reply_atom);
 
-   cookie_owner = xcb_get_selection_owner_unchecked(_ecore_xcb_conn, atom);
-   reply_owner = xcb_get_selection_owner_reply(_ecore_xcb_conn, cookie_owner, NULL);
-   if (!reply_owner) return 0;
-
-   window = reply_owner->owner;
-   free(reply_owner);
-
-   return window != XCB_NONE;
-}