boolean GraphicMaster::grasp (const Event& e, Tool& tool) { if (window_cursor == nil) { window_cursor = e.window()->cursor(); } boolean flag = false; unsigned int tool_type = tool.tool(); switch (tool_type) { case Tool::move: case Tool::scale: case Tool::rotate: { float tol = 2.0; BoxObj box( e.pointer_x()-tol, e.pointer_y()-tol, e.pointer_x()+tol, e.pointer_y()+tol ); Graphic* target = last_intersecting(box); if (target != nil) { Window* w = e.window(); Canvas* c = w->canvas(); w->cursor(grabber_cursor); ToolState& ts = tool.toolstate(); total_gs(ts._gs); _gr_list->append(target); Coord l, b, r, t; target->getbounds(l, b, r, t); c->damage(l, b, r, t); flag = target->grasp(e, tool); if (flag) { target->getbounds(l, b, r, t); c->damage(l, b, r, t); } CanvasRep& rep = *c->rep(); CanvasDamage& cd = rep.damage_; rep.start_repair(); drawclipped(c, cd.left, cd.bottom, cd.right, cd.top); rep.finish_repair(); } break; } } return flag; }