void remove_desktop(monitor_t *m, desktop_t *d) { put_status(SBSC_MASK_DESKTOP_REMOVE, "desktop_remove %s %s\n", m->name, d->name); bool was_focused = (mon != NULL && d == mon->desk); bool was_active = (d == m->desk); history_remove(d, NULL, false); unlink_desktop(m, d); empty_desktop(m, d); free(d); ewmh_update_current_desktop(); ewmh_update_number_of_desktops(); ewmh_update_desktop_names(); if (mon != NULL && m->desk != NULL) { if (was_focused) { update_focused(); } else if (was_active) { activate_node(m, m->desk, m->desk->focus); } } put_status(SBSC_MASK_REPORT); }
void add_desktop(monitor_t *m, desktop_t *d) { PRINTF("add desktop %s\n", d->name); insert_desktop(m, d); num_desktops++; ewmh_update_number_of_desktops(); ewmh_update_desktop_names(); put_status(); }
void add_desktop(monitor_t *m, desktop_t *d) { put_status(SBSC_MASK_DESKTOP_ADD, "desktop_add %s %s\n", m->name, d->name); insert_desktop(m, d); ewmh_update_number_of_desktops(); ewmh_update_desktop_names(); ewmh_update_wm_desktops(); put_status(SBSC_MASK_REPORT); }
void add_desktop(monitor_t *m, desktop_t *d) { put_status(SBSC_MASK_DESKTOP_ADD, "desktop_add 0x%08X %s 0x%08X\n", d->id, d->name, m->id); d->border_width = m->border_width; d->window_gap = m->window_gap; insert_desktop(m, d); ewmh_update_number_of_desktops(); ewmh_update_desktop_names(); ewmh_update_wm_desktops(); put_status(SBSC_MASK_REPORT); }
void remove_desktop(monitor_t *m, desktop_t *d) { PRINTF("remove desktop %s\n", d->name); unlink_desktop(m, d); history_remove(d, NULL); empty_desktop(d); free(d); num_desktops--; ewmh_update_number_of_desktops(); ewmh_update_desktop_names(); put_status(); }
void ewmh_update(void) { long vp[] = {0, 0}; XChangeProperty(dpy, root, ewmh_atoms[NET_SUPPORTED], XA_ATOM, 32, PropModeReplace, (unsigned char *) &ewmh_atoms, EWMH_ATOM_COUNT); XChangeProperty(dpy, root, ewmh_atoms[NET_SUPPORTING_WM_CHECK], XA_WINDOW, 32, PropModeReplace, (unsigned char *) &wlist, 1); XChangeProperty(dpy, wlist, ewmh_atoms[NET_SUPPORTING_WM_CHECK], XA_WINDOW, 32, PropModeReplace, (unsigned char *) &wlist, 1); XChangeProperty(dpy, wlist, ewmh_atoms[NET_WM_NAME], XA_STRING, 8, PropModeReplace, (unsigned char *) NAME, strlen(NAME)); XChangeProperty(dpy, root, ewmh_atoms[NET_DESKTOP_VIEWPORT], XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &vp, 2); XDeleteProperty(dpy, root, ewmh_atoms[NET_DESKTOP_NAMES]); ewmh_update_number_of_desktops(); ewmh_set_desktop(desktop); ewmh_update_geometry(); ewmh_update_showing_desktop(); }
void cfg_reinitialize(void) { int i; #ifdef USE_XFT int xft = xftfont ? 1 : 0; #endif /* free things from old configuration */ XFreeGC(dpy, gc); XFreeGC(dpy, igc); XFreeGC(dpy, bgc); XFreeGC(dpy, ibgc); keys_free(); /* read config again */ cfg_read(0); /* update some things */ p_attr.background_pixel = fg.pixel; p_attr.border_pixel = ibfg.pixel; select_root_events(); /* update clients */ for(i = 0; i < cn; i++) { #ifdef USE_XFT if(xftfont && !xft) clients[i]->wlist_draw = XftDrawCreate(dpy, clients[i]->wlist_item, visual, colormap); if(!xftfont && xft) { XftDrawDestroy(clients[i]->title_draw); XftDrawDestroy(clients[i]->wlist_draw); } #endif XDestroyWindow(dpy, clients[i]->button_parent_left); XDestroyWindow(dpy, clients[i]->button_parent_right); free((void *) clients[i]->buttons); clients[i]->flags ^= clients[i]->flags & HAS_BUTTONS; buttons_create(clients[i]); /* buttons are now on top of the client window */ XRaiseWindow(dpy, clients[i]->window); /* hence this line */ client_update(clients[i]); client_update_name(clients[i]); (clients[i] == current) ? client_set_bg(clients[i], bg, fg) : client_set_bg(clients[i], ibg, ifg); if(clients[i]->flags & IS_TASKBAR) client_set_layer(clients[i], taskbar_ontop ? TOP : NORMAL); XUngrabButton(dpy, AnyButton, AnyModifier, clients[i]->parent); client_grab_buttons(clients[i]); if(clients[i]->flags & FULLSCREEN && clients[i]->layer <= NORMAL && fullscreen_stacking != FS_NORMAL) client_update_layer(clients[i], (fullscreen_stacking == FS_ALWAYS_ONTOP) ? NORMAL : TOP); if(clients[i]->flags & HAS_BORDER) XSetWindowBorderWidth(dpy, clients[i]->parent, border_width); ewmh_update_extents(clients[i]); } ewmh_update_number_of_desktops(); ewmh_update_geometry(); ewmh_update_strut(); }
void setup(void) { ewmh_init(); screen = xcb_setup_roots_iterator(xcb_get_setup(dpy)).data; if (!screen) die("error: cannot aquire screen\n"); screen_width = screen->width_in_pixels; screen_height = screen->height_in_pixels; root_depth = screen->root_depth; xcb_atom_t net_atoms[] = {ewmh->_NET_SUPPORTED, ewmh->_NET_DESKTOP_NAMES, ewmh->_NET_NUMBER_OF_DESKTOPS, ewmh->_NET_CURRENT_DESKTOP, ewmh->_NET_CLIENT_LIST, ewmh->_NET_ACTIVE_WINDOW, ewmh->_NET_WM_STATE, ewmh->_NET_WM_STATE_FULLSCREEN, ewmh->_NET_WM_WINDOW_TYPE, ewmh->_NET_WM_WINDOW_TYPE_DIALOG, ewmh->_NET_WM_WINDOW_TYPE_UTILITY, ewmh->_NET_WM_WINDOW_TYPE_TOOLBAR}; xcb_ewmh_set_supported(ewmh, default_screen, LENGTH(net_atoms), net_atoms); desk = make_desktop(DEFAULT_DESK_NAME); last_desk = NULL; desk_head = desk; desk_tail = desk; num_desktops++; ewmh_update_number_of_desktops(); ewmh_update_desktop_names(); rule_head = make_rule(); frozen_pointer = make_pointer_state(); split_mode = MODE_AUTOMATIC; }
void remove_desktop(monitor_t *m, desktop_t *d) { put_status(SBSC_MASK_DESKTOP_REMOVE, "desktop_remove 0x%08X 0x%08X\n", m->id, d->id); remove_node(m, d, d->root); unlink_desktop(m, d); history_remove(d, NULL, false); free(d); ewmh_update_current_desktop(); ewmh_update_number_of_desktops(); ewmh_update_desktop_names(); if (mon != NULL && m->desk == NULL) { if (m == mon) { focus_node(m, NULL, NULL); } else { activate_node(m, NULL, NULL); } } put_status(SBSC_MASK_REPORT); }
void setup(void) { ewmh_init(); screen = xcb_setup_roots_iterator(xcb_get_setup(dpy)).data; if (!screen) err("error: cannot aquire screen\n"); screen_width = screen->width_in_pixels; screen_height = screen->height_in_pixels; root_depth = screen->root_depth; xcb_atom_t net_atoms[] = {ewmh->_NET_SUPPORTED, ewmh->_NET_DESKTOP_NAMES, ewmh->_NET_NUMBER_OF_DESKTOPS, ewmh->_NET_CURRENT_DESKTOP, ewmh->_NET_CLIENT_LIST, ewmh->_NET_ACTIVE_WINDOW, ewmh->_NET_WM_DESKTOP, ewmh->_NET_WM_STATE, ewmh->_NET_WM_STATE_FULLSCREEN, ewmh->_NET_WM_WINDOW_TYPE, ewmh->_NET_WM_WINDOW_TYPE_DOCK, ewmh->_NET_WM_WINDOW_TYPE_NOTIFICATION, ewmh->_NET_WM_WINDOW_TYPE_DIALOG, ewmh->_NET_WM_WINDOW_TYPE_UTILITY, ewmh->_NET_WM_WINDOW_TYPE_TOOLBAR}; xcb_ewmh_set_supported(ewmh, default_screen, LENGTH(net_atoms), net_atoms); monitor_uid = desktop_uid = client_uid = 0; mon = last_mon = mon_head = mon_tail = NULL; bool xinerama_is_active = false; if (xcb_get_extension_data(dpy, &xcb_xinerama_id)->present) { xcb_xinerama_is_active_reply_t *xia = xcb_xinerama_is_active_reply(dpy, xcb_xinerama_is_active(dpy), NULL); if (xia != NULL) { xinerama_is_active = xia->state; free(xia); } } if (xinerama_is_active) { xcb_xinerama_query_screens_reply_t *xsq = xcb_xinerama_query_screens_reply(dpy, xcb_xinerama_query_screens(dpy), NULL); xcb_xinerama_screen_info_t *xsi = xcb_xinerama_query_screens_screen_info(xsq); int n = xcb_xinerama_query_screens_screen_info_length(xsq); PRINTF("number of monitors: %d\n", n); for (int i = 0; i < n; i++) { xcb_xinerama_screen_info_t info = xsi[i]; xcb_rectangle_t rect = (xcb_rectangle_t) {info.x_org, info.y_org, info.width, info.height}; add_monitor(&rect); } free(xsq); } else { warn("Xinerama is inactive"); xcb_rectangle_t rect = (xcb_rectangle_t) {0, 0, screen_width, screen_height}; add_monitor(&rect); } for (monitor_t *m = mon_head; m != NULL; m = m->next) add_desktop(m, NULL); ewmh_update_number_of_desktops(); ewmh_update_desktop_names(); rule_head = make_rule(); frozen_pointer = make_pointer_state(); get_pointer_position(&pointer_position); split_mode = MODE_AUTOMATIC; }