Ken Thomases : winemac: When removing the status item for a systray icon, discard any associated events in the queue.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Aug 6 15:52:12 CDT 2014


Module: wine
Branch: master
Commit: 9d1cfecc6d45fd37512f454111639d4ffbf32664
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9d1cfecc6d45fd37512f454111639d4ffbf32664

Author: Ken Thomases <ken at codeweavers.com>
Date:   Tue Aug  5 19:11:09 2014 -0500

winemac: When removing the status item for a systray icon, discard any associated events in the queue.

---

 dlls/winemac.drv/cocoa_event.m       | 13 ++++++++++---
 dlls/winemac.drv/cocoa_status_item.m |  6 ++++++
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/dlls/winemac.drv/cocoa_event.m b/dlls/winemac.drv/cocoa_event.m
index 85cac5f..757ad6b 100644
--- a/dlls/winemac.drv/cocoa_event.m
+++ b/dlls/winemac.drv/cocoa_event.m
@@ -267,7 +267,7 @@ static const OSType WineHotKeySignature = 'Wine';
         return ret;
     }
 
-    - (void) discardEventsMatchingMask:(macdrv_event_mask)mask forWindow:(NSWindow*)window
+    - (void) discardEventsPassingTest:(BOOL (^)(macdrv_event* event))block
     {
         NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
         NSIndexSet* indexes;
@@ -276,8 +276,7 @@ static const OSType WineHotKeySignature = 'Wine';
 
         indexes = [events indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop){
             MacDrvEvent* event = obj;
-            return ((event_mask_for_type(event->event->type) & mask) &&
-                    (!window || event->event->window == (macdrv_window)window));
+            return block(event->event);
         }];
 
         [events removeObjectsAtIndexes:indexes];
@@ -287,6 +286,14 @@ static const OSType WineHotKeySignature = 'Wine';
         [pool release];
     }
 
+    - (void) discardEventsMatchingMask:(macdrv_event_mask)mask forWindow:(NSWindow*)window
+    {
+        [self discardEventsPassingTest:^BOOL (macdrv_event* event){
+            return ((event_mask_for_type(event->type) & mask) &&
+                    (!window || event->window == (macdrv_window)window));
+        }];
+    }
+
     - (BOOL) query:(macdrv_query*)query timeout:(NSTimeInterval)timeout processEvents:(BOOL)processEvents
     {
         macdrv_event* event;
diff --git a/dlls/winemac.drv/cocoa_status_item.m b/dlls/winemac.drv/cocoa_status_item.m
index f0a5863..c38dc51 100644
--- a/dlls/winemac.drv/cocoa_status_item.m
+++ b/dlls/winemac.drv/cocoa_status_item.m
@@ -96,6 +96,12 @@
             NSStatusBar* statusBar = [NSStatusBar systemStatusBar];
             [statusBar removeStatusItem:item];
             [item setView:nil];
+
+            [queue discardEventsPassingTest:^BOOL (macdrv_event* event){
+                return ((event->type == STATUS_ITEM_MOUSE_BUTTON && event->status_item_mouse_button.item == (macdrv_status_item)self) ||
+                        (event->type == STATUS_ITEM_MOUSE_MOVE && event->status_item_mouse_move.item == (macdrv_status_item)self));
+            }];
+
             self.item = nil;
         }
     }




More information about the wine-cvs mailing list