status restrictAreaEvent(EventObj ev, Graphical gr) { Int X, Y; int ex, ey, aw, ah; int dx=0, dy=0; if ( isDefault(gr) ) gr = ev->receiver; if ( !get_xy_event(ev, gr, ON, &X, &Y) ) fail; ex = valInt(X); ey = valInt(Y); aw = valInt(gr->area->w); ah = valInt(gr->area->h); if ( ex < 0 ) dx = -ex; else if ( ex > aw ) dx = aw-ex; if ( ey < 0 ) dy = -ey; else if ( ey > ah ) dy = ah-ey; if ( dx ) assign(ev, x, toInt(valInt(ev->x)+dx)); if ( dy ) assign(ev, y, toInt(valInt(ev->y)+dy)); succeed; }
static status verifyResizeGesture(ResizeGesture g, EventObj ev) { int frac = valInt(getClassVariableValueObject(g, NAME_marginFraction)); int mx = valInt(getClassVariableValueObject(g, NAME_marginWidth)); Int X, Y; int x, y, w, h; Graphical gr = ev->receiver; if ( !instanceOfObject(gr, ClassGraphical) || isNil(gr->device) ) fail; get_xy_event(ev, ev->receiver, ON, &X, &Y); x = valInt(X), y = valInt(Y); w = valInt(gr->area->w); h = valInt(gr->area->h); if ( x < w/frac && x < mx ) /* determine horizontal-mode */ assign(g, h_mode, NAME_left); else if ( x > ((frac-1) * w)/frac && x > w - mx ) assign(g, h_mode, NAME_right); else assign(g, h_mode, NAME_keep); if ( y < h/frac && y < mx ) /* determine vertical-mode */ assign(g, v_mode, NAME_top); else if ( y > ((frac-1) * h)/frac && y > h - mx ) assign(g, v_mode, NAME_bottom); else assign(g, v_mode, NAME_keep); if ( g->h_mode == NAME_keep && g->v_mode == NAME_keep ) fail; succeed; }
static status dragResizeGesture(ResizeGesture g, EventObj ev) { Graphical gr = ev->receiver; int x, y, w, h; int sx, sy, sw, sh; int ex, ey; Int X, Y; Name hm = g->h_mode, vm = g->v_mode; x = valInt(gr->area->x); y = valInt(gr->area->y); w = valInt(gr->area->w); h = valInt(gr->area->h); get_xy_event(ev, gr, ON, &X, &Y); ex = valInt(X); ey = valInt(Y); if ( notNil(g->min_size) ) { if ( hm == NAME_left && ex > w - valInt(g->min_size->w) ) ex = w - valInt(g->min_size->w); if ( hm == NAME_right && ex < valInt(g->min_size->w) ) ex = valInt(g->min_size->w); if ( vm == NAME_top && ey > h - valInt(g->min_size->h) ) ey = h - valInt(g->min_size->h); if ( vm == NAME_bottom && ey < valInt(g->min_size->h) ) ey = valInt(g->min_size->h); } if ( notNil(g->max_size) ) { if ( hm == NAME_left && ex < w - valInt(g->max_size->w) ) ex = w - valInt(g->max_size->w); if ( hm == NAME_right && ex > valInt(g->max_size->w) ) ex = valInt(g->max_size->w); if ( vm == NAME_top && ey < h - valInt(g->max_size->h) ) ey = h - valInt(g->max_size->h); if ( vm == NAME_bottom && ey > valInt(g->max_size->h) ) ey = valInt(g->max_size->h); } if ( hm == NAME_left && vm == NAME_top ) sx = x+ex, sy = y+ey, sw = w-ex, sh = h-ey; else if ( hm == NAME_right && vm == NAME_top ) sx = x, sy = y+ey, sw = ex, sh = h-ey; else if ( hm == NAME_left && vm == NAME_bottom ) sx = x+ex, sy = y, sw = w-ex, sh = ey; else if ( hm == NAME_right && vm == NAME_bottom ) sx = x, sy = y, sw = ex, sh = ey; else if ( hm == NAME_keep && vm == NAME_top ) sx = x, sy = y+ey, sw = w, sh = h-ey; else if ( hm == NAME_keep && vm == NAME_bottom ) sx = x, sy = y, sw = w, sh = ey; else if ( hm == NAME_left && vm == NAME_keep ) sx = x+ex, sy = y, sw = w-ex, sh = h; else if ( hm == NAME_right && vm == NAME_keep ) sx = x, sy = y, sw = ex, sh = h; else { NOTREACHED; fail; } return send(gr, NAME_doSet, toInt(sx), toInt(sy), toInt(sw), toInt(sh), EAV); }
static status setPointerResizeGesture(ResizeGesture g, Graphical gr, EventObj ev) { Point pos; Name hm = g->h_mode, vm = g->v_mode; Int w, h, px = ZERO, py = ZERO; /* keep compiler happy */ w = gr->area->w; h = gr->area->h; if ( hm == NAME_keep || vm == NAME_keep ) { Int cx, cy; get_xy_event(ev, gr, ON, &cx, &cy); if ( hm == NAME_keep && vm == NAME_top ) px = cx, py = ZERO; else if ( hm == NAME_keep && vm == NAME_bottom ) px = cx, py = h; else if ( hm == NAME_left && vm == NAME_keep ) px = ZERO, py = cy; else if ( hm == NAME_right && vm == NAME_keep ) px = w, py = cy; else NOTREACHED; } else { if ( hm == NAME_left && vm == NAME_top ) px = ZERO, py = ZERO; else if ( hm == NAME_right && vm == NAME_top ) px = w, py = ZERO; else if ( hm == NAME_left && vm == NAME_bottom ) px = ZERO, py = h; else if ( hm == NAME_right && vm == NAME_bottom ) px = w, py = h; else NOTREACHED; } pos = tempObject(ClassPoint, px, py, EAV); pointerGraphical(gr, pos); considerPreserveObject(pos); succeed; }
static status scrollMessage(Gesture g, EventObj ev, Graphical *client, Name *Msg, Int *Amount) { Graphical gr = ev->receiver; Int X, Y; int ex, ey, aw, ah; Name msg; Int amount; if ( !(isDragEvent(ev) || isAEvent(ev, NAME_locMove) || isAEvent(ev, NAME_area)) ) fail; if ( !(gr = getScrollTarget(g, ev)) ) fail; if ( !get_xy_event(ev, gr, ON, &X, &Y) ) fail; ex = valInt(X); ey = valInt(Y); aw = valInt(gr->area->w); ah = valInt(gr->area->h); DEBUG(NAME_dragScroll, Cprintf("Event on %s at %d,%d, area 0,0-%d,%d\n", pp(gr), ex, ey, aw, ah)); if ( ex < 0 && ey >= 0 && ey <= ah && ex > -DRAGSCROLL_MARGIN ) { msg = NAME_scrollHorizontal; amount = toInt(-1); } else if ( ex > aw && ey >= 0 && ey <= ah && ex < aw + DRAGSCROLL_MARGIN ) { msg = NAME_scrollHorizontal; amount = toInt(1); } else if ( ey < 0 && ex >= 0 && ey <= aw && ey > -DRAGSCROLL_MARGIN ) { msg = NAME_scrollVertical; amount = toInt(-1); } else if ( ey > ah && ex >= 0 && ey <= aw && ey < ah + DRAGSCROLL_MARGIN ) { msg = NAME_scrollVertical; amount = toInt(1); } else fail; DEBUG(NAME_dragScroll, if ( !Msg ) Cprintf("%s %s\n", pp(msg), pp(amount))); if ( Msg ) *Msg = msg; if ( Amount ) *Amount = amount; if ( client ) *client = gr; succeed; }
static Int getEventOffsetTileAdjuster(TileAdjuster adj, EventObj ev) { Int x, y; TRY(get_xy_event(ev, adj->frame, OFF, &x, &y)); if ( adj->orientation == NAME_horizontal ) answer(sub(x, adj->client->area->x)); else answer(sub(y, adj->client->area->y)); }
static Fragment getFragmentTextMargin(TextMargin m, EventObj ev) { position pos; Int ex, ey; get_xy_event(ev, m, ON, &ex, &ey); pos.x = valInt(ex); pos.y = valInt(ey); answer(scan_fragment_icons(m, find_fragment, NAME_find, &pos)); }