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 ??? }
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; }
/** * 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); }
/** * 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); }