Andreas Höschler wrote:
Hi all,
I have a view subclass with
- (void)mouseDown:(NSEvent *)theEvent
{
NSPoint locA = [self convertPoint:[theEvent locationInWindow]
fromView:nil];
BOOL shiftPressed = (([theEvent modifierFlags] & NSShiftKeyMask) > 0);
BOOL keepOn = YES;
BOOL hasDragged = NO;
while (keepOn)
{
theEvent = [[self window] nextEventMatchingMask:NSLeftMouseUpMask
| NSLeftMouseDraggedMask];
switch ([theEvent type])
{
case NSLeftMouseDragged:
{
NSPoint locB = [self convertPoint:[theEvent
locationInWindow] fromView:nil];
NSSize offset = NSMakeSize(locB.x - locA.x, locB.y -
locA.y);
NSRect oldRect = _selectionRect;
_selectionRect.origin = locA;
if (offset.width < 0)
{
_selectionRect.origin.x = locB.x;
offset.width = -offset.width;
}
if (offset.height < 0)
{
_selectionRect.origin.y = locB.y;
offset.height = -offset.height;
}
_selectionRect.size = offset;
_selecting = YES;
[self setNeedsDisplayInRect:NSUnionRect(_selectionRect,
oldRect)];
hasDragged = YES;
}
break;
case NSLeftMouseUp:
{
keepOn = NO;
}
break;
default:
break;
}
}
}
- (void)drawRect:(NSRect)rect
{
[super drawRect:rect];
if (_selecting)
{
[[NSColor grayColor] set];
NSFrameRect(_selectionRect);
}
}
This draws a rectangle following the mouse until the user releases the
mouse button. On MacOSX the rectangle follows the mouse instantly. Under
GNUstep I see a significant delay. Dragging rectangles makes no fun
there. Any idea why this is so slow? This of course has nothing to do
with rectangles in special but with slow drawing code in general. In my
app I want to drag objects around with the mouse. This works under
GNUstep and MacOX but on GNustep it is almost too slow to be usable. Is
this a known (may be even already improved) issue? My GNUstep tree is
already a year old. :-)
Most likely the slow drawing speed you see in GNUstep has nothing to do
with the drawing itself, but with the event handling in GNUstep. The
window will just not get a chance to redraw itself.
One possible reason for this may be that in
[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] we
handle an expiration date of nil different from Cocoa. There distantPast
is used while we use distantFuture, resulting in the loop to wait until
the next event happens.
As I am no expert in this area, I would like to get some comments from
other developers before changing this code. That change may result in
the need to adopt a lot of places that rely on the old behaviour.
_______________________________________________
Discuss-gnustep mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/discuss-gnustep