XSizeHints sh;
long sh_mask;
XClassHint ch;
- XWMHints *hints;
+ xcb_wm_hints_t hints;
};
TAILQ_HEAD(ws_win_list, ws_win);
{
struct swm_region *r = NULL;
int i, num_screens;
- xcb_query_pointer_cookie_t qpc;
xcb_query_pointer_reply_t *qpr;
DNPRINTF(SWM_D_MISC, "root_to_region: window: 0x%x\n", root);
if (screens[i].root == root)
break;
- qpc = xcb_query_pointer(conn, screens[i].root);
- qpr = xcb_query_pointer_reply(conn, qpc, NULL);
+ qpr = xcb_query_pointer_reply(conn, xcb_query_pointer(conn,
+ screens[i].root), NULL);
if (qpr) {
DNPRINTF(SWM_D_MISC, "root_to_region: pointer: (%d,%d)\n",
Time time = 0;
struct swm_region *r = NULL;
int resize_step = 0;
- Window rr, cr;
- int x, y, wx, wy;
- unsigned int mask;
struct swm_geometry g;
int top = 0, left = 0;
int dx, dy;
- Cursor cursor;
unsigned int shape; /* cursor style */
+ xcb_cursor_t cursor;
+ xcb_font_t cursor_font;
+ xcb_grab_pointer_reply_t *gpr;
+ xcb_query_pointer_reply_t *xpr;
if (win == NULL)
return;
drain_enter_notify();
/* get cursor offset from window root */
- if (!XQueryPointer(display, win->id, &rr, &cr, &x, &y, &wx, &wy, &mask))
- return;
-
+ xpr = xcb_query_pointer_reply(conn, xcb_query_pointer(conn, win->id),
+ NULL);
+ if (!xpr)
+ return;
+
g = win->g;
- if (wx < WIDTH(win) / 2)
+ if (xpr->win_x < WIDTH(win) / 2)
left = 1;
- if (wy < HEIGHT(win) / 2)
+ if (xpr->win_y < HEIGHT(win) / 2)
top = 1;
if (args->id == SWM_ARG_ID_CENTER)
else
shape = (left) ? XC_bottom_left_corner : XC_bottom_right_corner;
- cursor = XCreateFontCursor(display, shape);
-
- if (XGrabPointer(display, win->id, False, MOUSEMASK, GrabModeAsync,
- GrabModeAsync, None, cursor, CurrentTime) != GrabSuccess) {
- XFreeCursor(display, cursor);
+ cursor_font = xcb_generate_id(conn);
+ xcb_open_font(conn, cursor_font, strlen("cursor"), "cursor");
+
+ cursor = xcb_generate_id(conn);
+ xcb_create_glyph_cursor(conn, cursor, cursor_font, cursor_font,
+ shape, shape + 1, 0, 0, 0, 0xffff, 0xffff, 0xffff);
+
+ gpr = xcb_grab_pointer_reply(conn,
+ xcb_grab_pointer(conn, False, win->id, MOUSEMASK,
+ XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, XCB_WINDOW_NONE,
+ cursor, XCB_CURRENT_TIME),
+ NULL);
+ if (!gpr) {
+ xcb_free_cursor(conn, cursor);
+ xcb_close_font(conn, cursor_font);
+ free(xpr);
return;
}
break;
case MotionNotify:
/* cursor offset/delta from start of the operation */
- dx = ev.xmotion.x_root - x;
- dy = ev.xmotion.y_root - y;
+ dx = ev.xmotion.x_root - xpr->root_x;
+ dy = ev.xmotion.y_root - xpr->root_y;
/* vertical */
if (top)
store_float_geom(win,r);
xcb_ungrab_pointer(conn, XCB_CURRENT_TIME);
- XFreeCursor(display, cursor);
+ xcb_free_cursor(conn, cursor);
+ xcb_close_font(conn, cursor_font);
+ free(gpr);
+ free(xpr);
/* drain events */
drain_enter_notify();
Time time = 0;
int move_step = 0;
struct swm_region *r = NULL;
-
- Window rr, cr;
- int x, y, wx, wy;
- unsigned int mask;
+ xcb_font_t cursor_font;
+ xcb_cursor_t cursor;
+ xcb_grab_pointer_reply_t *gpr;
+ xcb_query_pointer_reply_t *qpr;
if (win == NULL)
return;
return;
}
- if (XGrabPointer(display, win->id, False, MOUSEMASK, GrabModeAsync,
- GrabModeAsync, None, XCreateFontCursor(display, XC_fleur),
- CurrentTime) != GrabSuccess)
+ cursor_font = xcb_generate_id(conn);
+ xcb_open_font(conn, cursor_font, strlen("cursor"), "cursor");
+
+ cursor = xcb_generate_id(conn);
+ xcb_create_glyph_cursor(conn, cursor, cursor_font, cursor_font,
+ XC_fleur, XC_fleur + 1, 0, 0, 0, 0xffff, 0xffff, 0xffff);
+
+ gpr = xcb_grab_pointer_reply(conn,
+ xcb_grab_pointer(conn, False, win->id, MOUSEMASK,
+ XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC,
+ XCB_WINDOW_NONE, cursor, XCB_CURRENT_TIME),
+ NULL);
+ if (!gpr) {
+ xcb_free_cursor(conn, cursor);
+ xcb_close_font(conn, cursor_font);
return;
+ }
/* get cursor offset from window root */
- if (!XQueryPointer(display, win->id, &rr, &cr, &x, &y, &wx, &wy, &mask))
- return;
-
+ qpr = xcb_query_pointer_reply(conn, xcb_query_pointer(conn, win->id),
+ NULL);
+ if (!qpr) {
+ xcb_ungrab_pointer(conn, XCB_CURRENT_TIME);
+ xcb_free_cursor(conn, cursor);
+ xcb_close_font(conn, cursor_font);
+ return;
+ }
do {
XMaskEvent(display, MOUSEMASK | ExposureMask |
SubstructureRedirectMask, &ev);
handler[ev.type](&ev);
break;
case MotionNotify:
- X(win) = ev.xmotion.x_root - wx - border_width;
- Y(win) = ev.xmotion.y_root - wy - border_width;
+ X(win) = ev.xmotion.x_root - qpr->win_x - border_width;
+ Y(win) = ev.xmotion.y_root - qpr->win_y - border_width;
constrain_window(win, r, 0);
update_window(win);
}
store_float_geom(win, r);
+ free(qpr);
+ xcb_free_cursor(conn, cursor);
+ xcb_close_font(conn, cursor_font);
xcb_ungrab_pointer(conn, XCB_CURRENT_TIME);
/* drain events */
set_child_transient(struct ws_win *win, Window *trans)
{
struct ws_win *parent, *w;
- XWMHints *wmh = NULL;
struct swm_region *r;
struct workspace *ws;
+ xcb_wm_hints_t wmh;
parent = find_window(win->transient);
if (parent)
DNPRINTF(SWM_D_MISC, "set_child_transient: parent doesn't exist"
" for 0x%x trans 0x%x\n", win->id, win->transient);
- if (win->hints == NULL) {
- warnx("no hints for 0x%x", win->id);
- return;
- }
-
r = root_to_region(win->wa.root);
ws = r->ws;
/* parent doen't exist in our window list */
TAILQ_FOREACH(w, &ws->winlist, entry) {
- if (wmh)
- XFree(wmh);
-
- if ((wmh = XGetWMHints(display, w->id)) == NULL) {
+ if (xcb_icccm_get_wm_hints_reply(conn,
+ xcb_icccm_get_wm_hints(conn, w->id),
+ &wmh, NULL) != 1) {
warnx("can't get hints for 0x%x", w->id);
continue;
}
- if (win->hints->window_group != wmh->window_group)
+ if (win->hints.window_group != wmh.window_group)
continue;
w->child_trans = win;
break;
}
}
-
- if (wmh)
- XFree(wmh);
}
long
}
XGetWindowAttributes(display, id, &win->wa);
XGetWMNormalHints(display, id, &win->sh, &win->sh_mask);
- win->hints = XGetWMHints(display, id);
+ xcb_icccm_get_wm_hints_reply(conn,
+ xcb_icccm_get_wm_hints(conn, id),
+ &win->hints, NULL);
XGetTransientForHint(display, id, &trans);
if (trans) {
win->transient = trans;
focus_prev(win);
- if (win->hints) {
- XFree(win->hints);
- win->hints = NULL;
- }
-
TAILQ_REMOVE(&win->ws->winlist, win, entry);
TAILQ_INSERT_TAIL(&win->ws->unmanagedlist, win, entry);
}
{
struct ws_win *win;
struct swm_region *r;
- XWindowAttributes wa;
XMapRequestEvent *ev = &e->xmaprequest;
+ xcb_get_window_attributes_reply_t *war;
DNPRINTF(SWM_D_EVENT, "maprequest: window: 0x%lx\n",
e->xmaprequest.window);
- if (!XGetWindowAttributes(display, ev->window, &wa))
+ war = xcb_get_window_attributes_reply(conn,
+ xcb_get_window_attributes(conn, ev->window),
+ NULL);
+ if (!war)
return;
- if (wa.override_redirect)
+ if (war->override_redirect) {
+ free(war);
return;
+ }
+ free(war);
win = manage_window(e->xmaprequest.window);
- if (win == NULL)
+ if (win == NULL) {
return; /* can't happen */
+ }
stack();
{
int i, j, k, num_screens;
struct workspace *ws;
- uint32_t gcv[1];
+ uint32_t gcv[1], wa[1];
const xcb_query_extension_reply_t *qep;
+ xcb_cursor_t cursor;
+ xcb_font_t cursor_font;
xcb_randr_query_version_cookie_t c;
xcb_randr_query_version_reply_t *r;
qep = xcb_get_extension_data(conn, &xcb_randr_id);
xrandr_eventbase = qep->first_event;
+ cursor_font = xcb_generate_id(conn);
+ xcb_open_font(conn, cursor_font, strlen("cursor"), "cursor");
+
+ cursor = xcb_generate_id(conn);
+ xcb_create_glyph_cursor(conn, cursor, cursor_font, cursor_font,
+ XC_left_ptr, XC_left_ptr + 1, 0, 0, 0, 0xffff, 0xffff, 0xffff);
+ wa[0] = cursor;
+
/* map physical screens */
for (i = 0; i < num_screens; i++) {
DNPRINTF(SWM_D_WS, "setup_screens: init screen: %d\n", i);
XCB_GC_GRAPHICS_EXPOSURES, gcv);
/* set default cursor */
- XDefineCursor(display, screens[i].root,
- XCreateFontCursor(display, XC_left_ptr));
+ xcb_change_window_attributes(conn, screens[i].root,
+ XCB_CW_CURSOR, wa);
/* init all workspaces */
/* XXX these should be dynamically allocated too */
xcb_randr_select_input(conn, screens[i].root,
XCB_RANDR_NOTIFY_MASK_SCREEN_CHANGE);
}
+ xcb_free_cursor(conn, cursor);
+ xcb_close_font(conn, cursor_font);
}
void