The functions ecore_x_window_prop_card32_list_get, ecore_x_window_prop_xid_get, and...
authorkwo <kwo@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 18 Jul 2009 10:27:51 +0000 (10:27 +0000)
committerkwo <kwo@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 18 Jul 2009 10:27:51 +0000 (10:27 +0000)
The original intention was that if the property is absent or not of extected type (or invalid window) they should return -1, otherwise they should return the number of elements in the property, 0 if none.

Unfortunately they all returned 0 if the property does not exist. Also, ecore_x_window_prop_xid_list_get retuned 0 if the property exists, has no elements, but has wrong type (should be -1).

These issues should be fixed now but this may cause problems in any code that relied on the incorrect behavior.

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/ecore@41418 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/ecore_x/xlib/ecore_x_window_prop.c

index 225b8bf..a091328 100644 (file)
@@ -63,23 +63,27 @@ ecore_x_window_prop_card32_get(Ecore_X_Window win, Ecore_X_Atom atom,
    int                 num;
 
    prop_ret = NULL;
-   XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
-                     XA_CARDINAL, &type_ret, &format_ret, &num_ret,
-                     &bytes_after, &prop_ret);
-   if (prop_ret && type_ret == XA_CARDINAL && format_ret == 32)
+   if (XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
+                         XA_CARDINAL, &type_ret, &format_ret, &num_ret,
+                         &bytes_after, &prop_ret) != Success)
+      return -1;
+
+   if (type_ret != XA_CARDINAL || format_ret != 32)
+     {
+       num = -1;
+     }
+   else if (num_ret == 0 || !prop_ret)
+     {
+       num = 0;
+     }
+   else
      {
        if (num_ret < len)
           len = num_ret;
-
        for (i = 0; i < len; i++)
-          val[i] = ((unsigned long*)prop_ret)[i];
-       
+          val[i] = ((unsigned long *)prop_ret)[i];
        num = len;
      }
-   else
-     {
-       num = -1;
-     }
    if (prop_ret)
       XFree(prop_ret);
 
@@ -104,18 +108,22 @@ ecore_x_window_prop_card32_list_get(Ecore_X_Window win, Ecore_X_Atom atom,
    unsigned int        i, *val;
    int                 num;
 
+   *plst = NULL;
    prop_ret = NULL;
    if (XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
                          XA_CARDINAL, &type_ret, &format_ret, &num_ret,
                          &bytes_after, &prop_ret) != Success)
       return -1;
 
-   if (type_ret == None || num_ret == 0)
+   if (type_ret != XA_CARDINAL || format_ret != 32)
+     {
+       num = -1;
+     }
+   else if (num_ret == 0 || !prop_ret)
      {
        num = 0;
-       *plst = NULL;
      }
-   else if (prop_ret && type_ret == XA_CARDINAL && format_ret == 32)
+   else
      {
        val = malloc(num_ret * sizeof(unsigned int));
        for (i = 0; i < num_ret; i++)
@@ -123,11 +131,6 @@ ecore_x_window_prop_card32_list_get(Ecore_X_Window win, Ecore_X_Atom atom,
        num = num_ret;
        *plst = val;
      }
-   else
-     {
-       num = -1;
-       *plst = NULL;
-     }
    if (prop_ret)
       XFree(prop_ret);
 
@@ -186,11 +189,15 @@ ecore_x_window_prop_xid_get(Ecore_X_Window win, Ecore_X_Atom atom,
                          &bytes_after, &prop_ret) != Success)
       return -1;
 
-   if (type_ret == None)
+   if (type_ret != type || format_ret != 32)
+     {
+       num = -1;
+     }
+   else if (num_ret == 0 || !prop_ret)
      {
        num = 0;
      }
-   else if (prop_ret && type_ret == type && format_ret == 32)
+   else
      {
        if (num_ret < len)
           len = num_ret;
@@ -198,10 +205,6 @@ ecore_x_window_prop_xid_get(Ecore_X_Window win, Ecore_X_Atom atom,
           lst[i] = ((unsigned long *)prop_ret)[i];
        num = len;
      }
-   else
-     {
-       num = -1;
-     }
    if (prop_ret)
       XFree(prop_ret);
 
@@ -235,21 +238,21 @@ ecore_x_window_prop_xid_list_get(Ecore_X_Window win, Ecore_X_Atom atom,
                          &bytes_after, &prop_ret) != Success)
       return -1;
 
-   if (type_ret == None || num_ret == 0)
+   if (type_ret != type || format_ret != 32)
+     {
+       num = -1;
+     }
+   else if (num_ret == 0 || !prop_ret)
      {
        num = 0;
      }
-   else if (prop_ret && type_ret == type && format_ret == 32)
+   else
      {
        alst = malloc(num_ret * sizeof(Ecore_X_ID));
        for (i = 0; i < num_ret; i++)
           alst[i] = ((unsigned long *)prop_ret)[i];
-       *val = alst;
        num = num_ret;
-     }
-   else
-     {
-       num = -1;
+       *val = alst;
      }
    if (prop_ret)
       XFree(prop_ret);