gboolean has_atom_property(Display* dsp, Window w, Atom prop) { gulong items; void* data = get_window_property(dsp, w, prop, &items); if (data == NULL) { return FALSE; } else { g_free(data); return TRUE; } }
Drawable get_blurred_background() { gulong n_item; gpointer data = get_window_property(gdk_x11_get_default_xdisplay(), GDK_ROOT_WINDOW(), _BG_ATOM, &n_item); if (data == NULL) { return 0; } Drawable bg = X_FETCH_32(data, 0); XFree(data); return bg; }
gboolean get_atom_value_by_atom(Display* dsp, Window window_id, Atom atom, gpointer res, CallbackFunc callback, gulong index) { gulong n_item; gpointer data = get_window_property(dsp, window_id, atom, &n_item); if (data == NULL) { return FALSE; } g_assert(callback != NULL); callback(data, n_item, res, index); XFree(data); return TRUE; }
void get_workarea_size(int* x, int* y, int* width, int* height) { Display *dpy = gdk_x11_get_default_xdisplay(); Atom property = XInternAtom(dpy, "_NET_WORKAREA", False); gulong items; gulong* data = get_window_property(dpy, GDK_ROOT_WINDOW(), property, &items); if (data && items == 4) { *x = X_FETCH_32(data, 0); *y = X_FETCH_32(data, 1); *width = X_FETCH_32(data, 2); *height = X_FETCH_32(data, 3); XFree(data); } else { x = y = width = height = 0; } }
int _is_maximized_window(Window win) { gulong items; Atom ATOM_WINDOW_NET_STATE = gdk_x11_get_xatom_by_name("_NET_WM_STATE"); Atom ATOM_WINDOW_MAXIMIZED_VERT = gdk_x11_get_xatom_by_name("_NET_WM_STATE_MAXIMIZED_VERT"); Display* _dsp = GDK_DISPLAY_XDISPLAY(gdk_display_get_default()); long* data = get_window_property(_dsp, win, ATOM_WINDOW_NET_STATE, &items); if (data != NULL) { for (guint i=0; i<items; i++) { if ((Atom)X_FETCH_32(data, i) == ATOM_WINDOW_MAXIMIZED_VERT) { XFree(data); return 1; } } XFree(data); } return 0; }
gboolean dock_has_maximize_client() { Atom ATOM_CLIENT_LIST = gdk_x11_get_xatom_by_name("_NET_CLIENT_LIST"); Display* _dsp = GDK_DISPLAY_XDISPLAY(gdk_display_get_default()); gulong items; Window root = GDK_ROOT_WINDOW(); void* data = get_window_property(_dsp, root, ATOM_CLIENT_LIST, &items); gboolean has = FALSE; if (data == NULL) return has; for (guint i=0; i<items; i++) { Window xid = X_FETCH_32(data, i); if (_is_maximized_window(xid)) { has = TRUE; break; } } XFree(data); return has; }