Exemplo n.º 1
0
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 */
}
Exemplo n.º 2
0
Arquivo: menu.c Projeto: S010/cwm
		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;
Exemplo n.º 3
0
		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;