void window_grab_buttons(xcb_window_t win) { for (unsigned int i = 0; i < LENGTH(BUTTONS); i++) { if (click_to_focus == (int8_t) XCB_BUTTON_INDEX_ANY || click_to_focus == (int8_t) BUTTONS[i]) { window_grab_button(win, BUTTONS[i], XCB_NONE); } if (pointer_actions[i] != ACTION_NONE) { window_grab_button(win, BUTTONS[i], pointer_modifier); } } }
void window_grab_buttons(xcb_window_t win) { if (click_to_focus) { window_grab_button(win, XCB_BUTTON_INDEX_1, XCB_NONE); } uint8_t buttons[] = {XCB_BUTTON_INDEX_1, XCB_BUTTON_INDEX_2, XCB_BUTTON_INDEX_3}; for (unsigned int i = 0; i < LENGTH(buttons); i++) { if (pointer_actions[i] != ACTION_NONE) { window_grab_button(win, buttons[i], pointer_modifier); } } }
Client* manage_client(Window win) { if (get_client_from_window(win)) return NULL; // init client Client* client = create_client(); Monitor* m = get_current_monitor(); // set to window properties client->window = win; client_update_title(client); // apply rules int manage = 1; rules_apply(client, &manage); if (!manage) { destroy_client(client); // map it... just to be sure XMapWindow(gDisplay, win); return NULL; } unsigned int border, depth; Window root_win; int x, y; unsigned int w, h; XGetGeometry(gDisplay, win, &root_win, &x, &y, &w, &h, &border, &depth); // treat wanted coordinates as floating coords XRectangle size = client->float_size; size.width = w; size.height = h; size.x = m->rect.x + m->rect.width/2 - size.width/2; size.y = m->rect.y + m->rect.height/2 - size.height/2 + bar_height; client->float_size = size; client->last_size = size; XMoveResizeWindow(gDisplay, client->window, size.x, size.y, size.width, size.height); // actually manage it g_array_append_val(g_clients, client); XSetWindowBorderWidth(gDisplay, win, window_border_width); // insert to layout if (!client->tag) client->tag = m->tag; // get events from window client_update_wm_hints(client); XSelectInput(gDisplay, win, CLIENT_EVENT_MASK); window_grab_button(win); frame_insert_window(client->tag->frame, win); monitor_apply_layout(find_monitor_with_tag(client->tag)); return client; }
void window_unfocus(Window window) { // grab buttons in old window again XSetWindowBorder(gDisplay, window, wincolors[0][ColWindowBorder]); window_grab_button(window); }