+#define DOCKAPP_SIZE 56
+#define SPEED 100
+
+static GC dockapp_border1GC, dockapp_border2GC, window_border1GC, window_border2GC, active_desktopGC, inactive_desktopGC, active_windowGC, inactive_windowGC;
+static Atom num_desktops_atom, current_desktop_atom, client_list_atom, client_desktop_atom, client_state_atom, active_window_atom;
+static Atom shaded_state, skip_pager_state, hidden_state;
+static long desktop = -1;
+
+int error_handler(Display *display, XErrorEvent *event) {
+ char buffer[512];
+ int length;
+
+ switch (event->error_code) {
+ case BadWindow:
+ /* The window may have gone away since we queried the window manager. */
+ break;
+
+ default:
+ if (XGetErrorText(display, event->error_code, buffer, sizeof(buffer))) {
+ fprintf(stderr, "%s\n", buffer);
+ exit(100);
+ }
+ break;
+ }
+
+ return 0;
+}
+
+void setup_atom(Atom *atom, const char *prop) {
+ *atom = XInternAtom(DADisplay, prop, True);
+ if (*atom == None) exit(111);
+}
+
+void get_atom_longs(Atom atom, Atom type, Window window, long **data, unsigned long *num_items) {
+ Atom actual;
+ int format;
+ unsigned long num_bytes;
+
+ XGetWindowProperty(DADisplay, window, atom, 0, 8192, False, type, &actual, &format, num_items, &num_bytes, (unsigned char **) data);
+}
+
+long get_atom_long(Atom atom, Atom type, Window window) {
+ long *data;
+ long ret = 0;
+ unsigned long num_items;
+
+ get_atom_longs(atom, type, window, &data, &num_items);
+ if (num_items) ret = data[0];
+ XFree(data);
+
+ return ret;
+}