void get_task_hinticon (task *tk) { XWMHints *hin; tk->icon = None; tk->mask = None; hin = (XWMHints *) get_prop_data (tk->win, XA_WM_HINTS, XA_WM_HINTS, 0); if (hin) { if ((hin->flags & IconPixmapHint)) { if ((hin->flags & IconMaskHint)) { tk->mask = hin->icon_mask; } tk->icon = hin->icon_pixmap; tk->icon_copied = 1; scale_icon (tk); } XFree (hin); } if (tk->icon == None) { tk->icon = generic_icon; tk->mask = generic_mask; } }
void get_task_kdeicon (task *tk) { unsigned long *data; data = get_prop_data (tk->win, atom_KWM_WIN_ICON, atom_KWM_WIN_ICON, 0); if (data) { tk->icon = data[0]; tk->mask = data[1]; XFree (data); } }
int generic_get_int (Window win, Atom at) { int num = 0; unsigned long *data; data = get_prop_data (win, at, XA_CARDINAL, 0); if (data) { num = *data; XFree (data); } return num; }
static void initX() { /* open connection to X server */ X.display = XOpenDisplay(0); if (!X.display) LOG_ERROR("failed connect to X server\n"); XSetErrorHandler(X_error_handler); XSetIOErrorHandler(X_io_error_handler); memset(&X.attrs, 0, sizeof(X.attrs)); /* useful variables */ X.screen = DefaultScreen(X.display); X.screen_width = DisplayWidth(X.display, X.screen); X.screen_height = DisplayHeight(X.display, X.screen); X.visual = DefaultVisual(X.display, X.screen); X.colmap = CopyFromParent; X.root = RootWindow(X.display, X.screen); X.amask = 0; X.depth = DefaultDepth(X.display, X.screen); X.wa_x = 0; X.wa_y = 0; X.wa_w = X.screen_width; X.wa_h = X.screen_height; /* get internal atoms */ XInternAtoms(X.display, atom_names, XATOM_COUNT, False, X.atoms); XSelectInput( X.display , X.root , PropertyChangeMask | ButtonPressMask | KeyPressMask | ExposureMask | FocusChangeMask | StructureNotifyMask ); /* append_font_path_to_imlib(); */ /* get workarea */ int32_t *workarea = get_prop_data(X.root, X.atoms[XATOM_NET_WORKAREA], XA_CARDINAL, 0); if (workarea) { X.wa_x = workarea[0]; X.wa_y = workarea[1]; X.wa_w = workarea[2]; X.wa_h = workarea[3]; XFree(workarea); } }
int is_iconified (Window win) { unsigned long *data; int ret = 0; data = get_prop_data (win, atom_WM_STATE, atom_WM_STATE, 0); if (data) { if (data[0] == IconicState) ret = 1; XFree (data); } return ret; }
void taskbar_read_clientlist (void) { Window *win, focus_win; int num, i, rev, desk, new_desk = 0; task *list, *next; desk = get_current_desktop (); if (desk != tb.my_desktop) { new_desk = 1; tb.my_desktop = desk; } XGetInputFocus (dd, &focus_win, &rev); win = get_prop_data (root_win, atom__NET_CLIENT_LIST, XA_WINDOW, &num); if (!win) return; /* remove windows that arn't in the _NET_CLIENT_LIST anymore */ list = tb.task_list; while (list) { list->focused = (focus_win == list->win); next = list->next; if (!new_desk) for (i = num - 1; i >= 0; i--) if (list->win == win[i]) goto dontdel; del_task (list->win); dontdel: list = next; } /* add any new windows */ for (i = 0; i < num; i++) { if (!find_task (win[i])) add_task (win[i], (win[i] == focus_win)); } XFree (win); }
void add_task (Window win, int focus) { task *tk, *list; if (win == tb.win) return; /* is this window on a different desktop? */ if (tb.my_desktop != find_desktop (win) || is_hidden (win)) return; tk = calloc (1, sizeof (task)); tk->win = win; tk->focused = focus; tk->name = get_prop_data (win, XA_WM_NAME, XA_STRING, 0); tk->iconified = is_iconified (win); get_task_kdeicon (tk); if (tk->icon == None) get_task_hinticon (tk); XSelectInput (dd, win, PropertyChangeMask | FocusChangeMask | StructureNotifyMask); /* now append it to our linked list */ tb.num_tasks++; list = tb.task_list; if (!list) { tb.task_list = tk; return; } while (1) { if (!list->next) { list->next = tk; return; } list = list->next; } }
void handle_propertynotify (Window win, Atom at) { task *tk; if (win == root_win) { if (at == atom__NET_CLIENT_LIST || at == atom__NET_CURRENT_DESKTOP) { taskbar_read_clientlist (); gui_draw_taskbar (); } return; } tk = find_task (win); if (!tk) return; if (at == XA_WM_NAME) { /* window's title changed */ if (tk->name) XFree (tk->name); tk->name = get_prop_data (tk->win, XA_WM_NAME, XA_STRING, 0); gui_draw_task (tk); } else if (at == atom_WM_STATE) { /* iconified state changed? */ if (is_iconified (tk->win) != tk->iconified) { tk->iconified = !tk->iconified; gui_draw_task (tk); } } else if (at == XA_WM_HINTS) { /* some windows set their WM_HINTS icon after mapping */ if (tk->icon == generic_icon) { get_task_hinticon (tk); gui_draw_task (tk); } } }
int is_hidden (Window win) { unsigned long *data; int ret = 0; int num; data = get_prop_data (win, atom__NET_WM_STATE, XA_ATOM, &num); if (data) { while (num) { num--; if ((data[num]) == atom__NET_WM_STATE_SKIP_TASKBAR) ret = 1; } XFree (data); } return ret; }