From c60b6b5c6008315ce0660f4d5fc08dfd53c2fe73 Mon Sep 17 00:00:00 2001 From: espectador Date: Sun, 7 Jul 2013 18:33:01 +0000 Subject: [PATCH] Prevent duplicate the cursor with -push. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@36848 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 8 ++++++++ Headers/AppKit/NSCursor.h | 2 ++ Source/NSCursor.m | 23 ++++++++++++++++++++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 169556cc1..9e2732685 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2013-07-07 German A. Arias + + * Headers/AppKit/NSCursor.h: Add _windowNum and _cursorRect. + * Source/NSCursor.m (-init, -push, -pop): Store at cursor object the + rect and the window where this is displayed. So the next time the app + request push this cursor, it can compare if currently is displayed for + that rect in that window. To prevent duplicate the cursor. + 2013-07-07 Fred Kiefer * Source/NSImageRep.m (-guiDrawInRect:...fraction:): Readd special diff --git a/Headers/AppKit/NSCursor.h b/Headers/AppKit/NSCursor.h index bbfbe9a67..bd0051c61 100644 --- a/Headers/AppKit/NSCursor.h +++ b/Headers/AppKit/NSCursor.h @@ -49,6 +49,8 @@ unsigned int reserved: 25; } _cursor_flags; void *_cid; + NSInteger _windowNum; + NSRect _cursorRect; } /* diff --git a/Source/NSCursor.m b/Source/NSCursor.m index 70da83128..be62fe7ee 100644 --- a/Source/NSCursor.m +++ b/Source/NSCursor.m @@ -35,11 +35,13 @@ #import "AppKit/NSColor.h" #import "AppKit/NSCursor.h" +#import "AppKit/NSEvent.h" #import "AppKit/NSGraphics.h" #import "AppKit/NSImage.h" #import "AppKit/NSBitmapImageRep.h" #import "GNUstepGUI/GSDisplayServer.h" +#import "GNUstepGUI/GSTrackingRect.h" // Class variables static NSMutableArray *gnustep_gui_cursor_stack; @@ -315,6 +317,8 @@ NSCursor *getStandardCursor(NSString *name, int style) */ - (id) init { + _windowNum = -1; + _cursorRect = NSZeroRect; return [self initWithImage: nil hotSpot: NSZeroPoint]; } @@ -440,11 +444,26 @@ backgroundColorHint:(NSColor *)bg } else if (_cursor_flags.is_set_on_mouse_exited == NO) { + NSInteger num = [theEvent windowNumber]; + GSTrackingRect *r =(GSTrackingRect*)[theEvent userData]; /* * Undocumented behavior - if a cursor is not set on exit or entry, * we assume a push-pop situation instead. */ - [self push]; + + /* First check if the cursor rect is currently updated. This prevent + * add the same cursor for the same cursor rect. This happen sometimes + * when the window become the main/key window, and the cursor is over + * a cursor rect. + */ + if ( !(NSEqualRects(_cursorRect, r->rectangle) && + (_windowNum == num) && + [gnustep_gui_current_cursor isEqual: self]) ) + { + [self push]; + _windowNum = num; + _cursorRect = r->rectangle; + } } } @@ -466,6 +485,8 @@ backgroundColorHint:(NSColor *)bg * we assume a push-pop situation instead. */ [self pop]; + _windowNum = -1; + _cursorRect = NSZeroRect; } else {