Exemplo n.º 1
0
bool
od_wm_iconified(Ecore_X_Window window)
{
    int             size = 0;
    Atom           *atom = NULL;

    if (ecore_x_window_prop_property_get(window, ecore_x_atom_get("WM_STATE"),
                                         ecore_x_atom_get("WM_STATE"), 32,
                                         (unsigned char **) &atom, &size)) {
        bool            ret = (*atom == IconicState);

        free(atom);
        return ret;
    }

    if (ecore_x_window_prop_property_get
            (window, ecore_x_atom_get("_NET_WM_STATE"), XA_ATOM, 32,
             (unsigned char **) &atom, &size)) {
        int             i;
        bool            hidden = false, shaded = false;

        for (i = 0; i < size / sizeof(Atom); i++) {
            if (atom[i] == ecore_x_atom_get("_NET_WM_STATE_SHADED"))
                shaded = true;
            if (atom[i] == ecore_x_atom_get("_NET_WM_STATE_HIDDEN"))
                hidden = true;
        }
        free(atom);
        return hidden && !shaded;
    }
    return false;                 // anything we've missed ???
}
Exemplo n.º 2
0
Ecore_X_Window *
od_wm_get_clients(int *size)
{
    Ecore_X_Window *win_list = NULL;

    if (!ecore_x_window_prop_property_get(0, ecore_x_atom_get("_NET_CLIENT_LIST"),
                                          XA_WINDOW, 32,
                                          (unsigned char **) &win_list, size)) {
        if (!ecore_x_window_prop_property_get
                (0, ecore_x_atom_get("_WIN_CLIENT_LIST"), XA_CARDINAL, 32,
                 (unsigned char **) &win_list, size)) {
            *size = 0;
            return NULL;
        }
    }
    return win_list;
}
Exemplo n.º 3
0
/**
 * Add a subwindow to the list of windows that need a different colormap installed.
 * @param win The toplevel window
 * @param subwin The subwindow to be added to the colormap windows list
 */
EAPI void
ecore_x_icccm_colormap_window_set(Ecore_X_Window win,
                                  Ecore_X_Window subwin)
{
   int num = 0, i;
   unsigned char *old_data = NULL;
   unsigned char *data = NULL;
   Window *oldset = NULL;
   Window *newset = NULL;

   LOGFN(__FILE__, __LINE__, __FUNCTION__);
   if (!ecore_x_window_prop_property_get(win,
                                         ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
                                         XA_WINDOW, 32, &old_data, &num))
     {
        newset = calloc(1, sizeof(Window));
        if (!newset)
          {
             if (old_data) free(old_data);
             return;
          }

        newset[0] = subwin;
        num = 1;
        data = (unsigned char *)newset;
     }
   else
     {
        newset = calloc(num + 1, sizeof(Window));
        oldset = (Window *)old_data;
        if (!newset)
          {
             if (old_data) free(old_data);
             return;
          }

        for (i = 0; i < num; ++i)
          {
             if (oldset[i] == subwin)
               {
                  if (old_data)
                    XFree(old_data);

                  old_data = NULL;
                  free(newset);
                  return;
               }

             newset[i] = oldset[i];
          }

        newset[num++] = subwin;
        if (old_data)
          XFree(old_data);

        data = (unsigned char *)newset;
     }

   ecore_x_window_prop_property_set(win,
                                    ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
                                    XA_WINDOW, 32, data, num);
   free(newset);
   free(old_data);
}
Exemplo n.º 4
0
/**
 * Remove a window from the list of colormap windows.
 * @param win The toplevel window
 * @param subwin The window to be removed from the colormap window list.
 */
EAPI void
ecore_x_icccm_colormap_window_unset(Ecore_X_Window win,
                                    Ecore_X_Window subwin)
{
   int num = 0, i, j, k = 0;
   unsigned char *old_data = NULL;
   unsigned char *data = NULL;
   Window *oldset = NULL;
   Window *newset = NULL;

   LOGFN(__FILE__, __LINE__, __FUNCTION__);
   if (!ecore_x_window_prop_property_get(win,
                                         ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
                                         XA_WINDOW, 32, &old_data, &num))
     {
        if (old_data) free(old_data);
        return;
     }

   oldset = (Window *)old_data;
   for (i = 0; i < num; i++)
     {
        if (oldset[i] == subwin)
          {
             if (num == 1)
               {
                  XDeleteProperty(_ecore_x_disp,
                                  win, ECORE_X_ATOM_WM_COLORMAP_WINDOWS);
                  if (_ecore_xlib_sync) ecore_x_sync();
                  if (old_data)
                    XFree(old_data);

                  old_data = NULL;
                  return;
               }
             else
               {
                  newset = calloc(num - 1, sizeof(Window));
                  data = (unsigned char *)newset;
                  for (j = 0; j < num; ++j)
                    if (oldset[j] != subwin)
                      newset[k++] = oldset[j];

                  ecore_x_window_prop_property_set(
                    win,
                    ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
                    XA_WINDOW,
                    32,
                    data,
                    k);
                  if (old_data)
                    XFree(old_data);

                  old_data = NULL;
                  free(newset);
                  return;
               }
          }
     }

   if (old_data)
     XFree(old_data);
}