void mousefunc_client_move(struct client_ctx *cc, union arg *arg) { XEvent ev; Time ltime = 0; struct screen_ctx *sc = cc->sc; struct geom xine; int px, py; client_raise(cc); if (cc->flags & CLIENT_FREEZE) return; if (xu_ptr_grab(cc->win, MOUSEMASK, Conf.cursor[CF_MOVE]) < 0) return; xu_ptr_getpos(cc->win, &px, &py); for (;;) { XMaskEvent(X_Dpy, MOUSEMASK, &ev); switch (ev.type) { case MotionNotify: cc->geom.x = ev.xmotion.x_root - px - cc->bwidth; cc->geom.y = ev.xmotion.y_root - py - cc->bwidth; xine = screen_find_xinerama(sc, cc->geom.x + cc->geom.w / 2, cc->geom.y + cc->geom.h / 2, CWM_GAP); cc->geom.x += client_snapcalc(cc->geom.x, cc->geom.x + cc->geom.w + (cc->bwidth * 2), xine.x, xine.x + xine.w, sc->snapdist); cc->geom.y += client_snapcalc(cc->geom.y, cc->geom.y + cc->geom.h + (cc->bwidth * 2), xine.y, xine.y + xine.h, sc->snapdist); /* don't move more than 60 times / second */ if ((ev.xmotion.time - ltime) > (1000 / 60)) { ltime = ev.xmotion.time; client_move(cc); } break; case ButtonRelease: if (ltime) client_move(cc); xu_ptr_ungrab(); return; } } /* NOTREACHED */ }
if (mc->print != NULL) { (*mc->print)(mi, mc->listing); text = mi->print; } else { mi->print[0] = '\0'; text = mi->text; } mc->width = MAX(mc->width, font_width(sc, text, MIN(strlen(text), MENU_MAXENTRY))); dy += font_height(sc); mc->num++; } xine = screen_find_xinerama(sc, mc->x, mc->y); if (xine) { xmin = xine->x_org; xmax = xine->x_org + xine->width; ymin = xine->y_org; ymax = xine->y_org + xine->height; } else { xmin = ymin = 0; xmax = sc->xmax; ymax = sc->ymax; } xsave = mc->x; ysave = mc->y; bwidth2 = Conf.bwidth * 2;
if (mc->print != NULL) { (*mc->print)(mi, mc->listing); text = mi->print; } else { mi->print[0] = '\0'; text = mi->text; } mc->width = MAX(mc->width, xu_xft_width(sc->xftfont, text, MIN(strlen(text), MENU_MAXENTRY))); mc->height += sc->xftfont->height + 1; mc->num++; } xine = screen_find_xinerama(sc, mc->x, mc->y, CWM_GAP); xine.w += xine.x; xine.h += xine.y; xsave = mc->x; ysave = mc->y; /* Never hide the top, or left side, of the menu. */ if (mc->x + mc->width >= xine.w) mc->x = xine.w - mc->width; if (mc->x < xine.x) { mc->x = xine.x; mc->width = MIN(mc->width, (xine.w - xine.x)); } if (mc->y + mc->height >= xine.h) mc->y = xine.h - mc->height;