src/gui/util/qsystemtrayicon_mac.mm
changeset 30 5dc02b23752f
parent 19 fcece45ef507
child 33 3e2da88830cd
--- a/src/gui/util/qsystemtrayicon_mac.mm	Wed Jun 23 19:07:03 2010 +0300
+++ b/src/gui/util/qsystemtrayicon_mac.mm	Tue Jul 06 15:10:48 2010 +0300
@@ -75,8 +75,6 @@
 
 #define QT_MAC_SYSTEMTRAY_USE_GROWL
 
-@class QNSMenu;
-
 #include <private/qt_cocoa_helpers_mac_p.h>
 #include <private/qsystemtrayicon_p.h>
 #include <qtemporaryfile.h>
@@ -93,35 +91,37 @@
 extern void qtsystray_sendActivated(QSystemTrayIcon *i, int r); //qsystemtrayicon.cpp
 extern NSString *keySequenceToKeyEqivalent(const QKeySequence &accel); // qmenu_mac.mm
 extern NSUInteger keySequenceModifierMask(const QKeySequence &accel);  // qmenu_mac.mm
+extern Qt::MouseButton cocoaButton2QtButton(NSInteger buttonNum);
 QT_END_NAMESPACE
 
 QT_USE_NAMESPACE
 
-@class QNSImageView;
+@class QT_MANGLE_NAMESPACE(QNSMenu);
+@class QT_MANGLE_NAMESPACE(QNSImageView);
 
-@interface QNSStatusItem : NSObject {
+@interface QT_MANGLE_NAMESPACE(QNSStatusItem) : NSObject {
     NSStatusItem *item;
     QSystemTrayIcon *icon;
     QSystemTrayIconPrivate *iconPrivate;
-    QNSImageView *imageCell;
+    QT_MANGLE_NAMESPACE(QNSImageView) *imageCell;
 }
 -(id)initWithIcon:(QSystemTrayIcon*)icon iconPrivate:(QSystemTrayIconPrivate *)iprivate;
 -(void)dealloc;
 -(QSystemTrayIcon*)icon;
 -(NSStatusItem*)item;
 -(QRectF)geometry;
-- (void)triggerSelector:(id)sender;
+- (void)triggerSelector:(id)sender button:(Qt::MouseButton)mouseButton;
 - (void)doubleClickSelector:(id)sender;
 @end
 
-@interface QNSImageView : NSImageView {
+@interface QT_MANGLE_NAMESPACE(QNSImageView) : NSImageView {
     BOOL down;
-    QNSStatusItem *parent;
+    QT_MANGLE_NAMESPACE(QNSStatusItem) *parent;
 }
--(id)initWithParent:(QNSStatusItem*)myParent;
+-(id)initWithParent:(QT_MANGLE_NAMESPACE(QNSStatusItem)*)myParent;
 -(QSystemTrayIcon*)icon;
 -(void)menuTrackingDone:(NSNotification*)notification;
--(void)mousePressed:(NSEvent *)mouseEvent;
+-(void)mousePressed:(NSEvent *)mouseEvent button:(Qt::MouseButton)mouseButton;
 @end
 
 
@@ -133,7 +133,7 @@
 #endif
 
 
-@interface QNSMenu : NSMenu <NSMenuDelegate> {
+@interface QT_MANGLE_NAMESPACE(QNSMenu) : NSMenu <NSMenuDelegate> {
     QMenu *qmenu;
 }
 -(QMenu*)menu;
@@ -147,14 +147,14 @@
 public:
     QSystemTrayIconSys(QSystemTrayIcon *icon, QSystemTrayIconPrivate *d) {
         QMacCocoaAutoReleasePool pool;
-        item = [[QNSStatusItem alloc] initWithIcon:icon iconPrivate:d];
+        item = [[QT_MANGLE_NAMESPACE(QNSStatusItem) alloc] initWithIcon:icon iconPrivate:d];
     }
     ~QSystemTrayIconSys() {
         QMacCocoaAutoReleasePool pool;
         [[[item item] view] setHidden: YES];
         [item release];
     }
-    QNSStatusItem *item;
+    QT_MANGLE_NAMESPACE(QNSStatusItem) *item;
 };
 
 void QSystemTrayIconPrivate::install_sys()
@@ -298,8 +298,8 @@
 @implementation NSStatusItem (Qt)
 @end
 
-@implementation QNSImageView
--(id)initWithParent:(QNSStatusItem*)myParent {
+@implementation QT_MANGLE_NAMESPACE(QNSImageView)
+-(id)initWithParent:(QT_MANGLE_NAMESPACE(QNSStatusItem)*)myParent {
     self = [super init];
     parent = myParent;
     down = NO;
@@ -333,12 +333,10 @@
     [self setNeedsDisplay:YES];
 }
 
--(void)mousePressed:(NSEvent *)mouseEvent
+-(void)mousePressed:(NSEvent *)mouseEvent button:(Qt::MouseButton)mouseButton
 {
-    int clickCount = [mouseEvent clickCount];
-    down = !down;
-    if(!down && [self icon]->contextMenu())
-        [self icon]->contextMenu()->hide();
+    down = YES;
+    int clickCount = [mouseEvent clickCount];  
     [self setNeedsDisplay:YES];
 
 #ifndef QT_MAC_USE_COCOA
@@ -348,47 +346,52 @@
     const short scale = hgt - 4;
 #endif
 
-    if( down && ![self icon]->icon().isNull() ) {
+    if (![self icon]->icon().isNull() ) {
         NSImage *nsaltimage = static_cast<NSImage *>(qt_mac_create_nsimage([self icon]->icon().pixmap(QSize(scale, scale), QIcon::Selected)));
         [self setImage: nsaltimage];
         [nsaltimage release];
     }
 
-
-    if (down)
-        [parent triggerSelector:self];
-    else if ((clickCount%2))
+    if ((clickCount == 2)) {
+        [self menuTrackingDone:nil];
         [parent doubleClickSelector:self];
-    while (down) {
-        mouseEvent = [[self window] nextEventMatchingMask:NSLeftMouseDownMask | NSLeftMouseUpMask
-                        | NSLeftMouseDraggedMask | NSRightMouseDownMask | NSRightMouseUpMask
-                        | NSRightMouseDraggedMask];
-        switch ([mouseEvent type]) {
-            case NSRightMouseDown:
-            case NSRightMouseUp:
-            case NSLeftMouseDown:
-            case NSLeftMouseUp:
-                [self menuTrackingDone:nil];
-                break;
-            case NSRightMouseDragged:
-            case NSLeftMouseDragged:
-            default:
-                /* Ignore any other kind of event. */
-                break;
-        }
-    };
+    } else {
+        [parent triggerSelector:self button:mouseButton];
+    }
 }
 
 -(void)mouseDown:(NSEvent *)mouseEvent
 {
-    [self mousePressed:mouseEvent];
+    [self mousePressed:mouseEvent button:Qt::LeftButton];
+}
+
+-(void)mouseUp:(NSEvent *)mouseEvent
+{
+    Q_UNUSED(mouseEvent);
+    [self menuTrackingDone:nil];
 }
 
 - (void)rightMouseDown:(NSEvent *)mouseEvent
 {
-    [self mousePressed:mouseEvent];
+    [self mousePressed:mouseEvent button:Qt::RightButton];
+}
+
+-(void)rightMouseUp:(NSEvent *)mouseEvent
+{
+    Q_UNUSED(mouseEvent);
+    [self menuTrackingDone:nil];
 }
 
+- (void)otherMouseDown:(NSEvent *)mouseEvent
+{
+    [self mousePressed:mouseEvent button:cocoaButton2QtButton([mouseEvent buttonNumber])];
+}
+
+-(void)otherMouseUp:(NSEvent *)mouseEvent
+{
+    Q_UNUSED(mouseEvent);
+    [self menuTrackingDone:nil];
+}
 
 -(void)drawRect:(NSRect)rect {
     [[parent item] drawStatusBarBackgroundInRect:rect withHighlight:down];
@@ -396,7 +399,7 @@
 }
 @end
 
-@implementation QNSStatusItem
+@implementation QT_MANGLE_NAMESPACE(QNSStatusItem)
 
 -(id)initWithIcon:(QSystemTrayIcon*)i iconPrivate:(QSystemTrayIconPrivate *)iPrivate
 {
@@ -405,7 +408,7 @@
         icon = i;
         iconPrivate = iPrivate;
         item = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain];
-        imageCell = [[QNSImageView alloc] initWithParent:self];
+        imageCell = [[QT_MANGLE_NAMESPACE(QNSImageView) alloc] initWithParent:self];
         [item setView: imageCell];
     }
     return self;
@@ -433,45 +436,40 @@
     }
     return QRectF();
 }
-- (void)triggerSelector:(id)sender {
+
+- (void)triggerSelector:(id)sender button:(Qt::MouseButton)mouseButton {
     Q_UNUSED(sender);
-    if(!icon)
+    if (!icon)
         return;
-    qtsystray_sendActivated(icon, QSystemTrayIcon::Trigger);
+
+    if (mouseButton == Qt::MidButton)
+        qtsystray_sendActivated(icon, QSystemTrayIcon::MiddleClick);
+    else
+        qtsystray_sendActivated(icon, QSystemTrayIcon::Trigger);
+
     if (icon->contextMenu()) {
-#if 0
-        const QRectF geom = [self geometry];
-        if(!geom.isNull()) {
-            [[NSNotificationCenter defaultCenter] addObserver:imageCell
-                                                  selector:@selector(menuTrackingDone:)
-                                                  name:nil
-                                                  object:self];
-            icon->contextMenu()->exec(geom.topLeft().toPoint(), 0);
-            [imageCell menuTrackingDone:nil];
-        } else 
+#ifndef QT_MAC_USE_COCOA
+        [[[self item] view] removeAllToolTips];
+        iconPrivate->updateToolTip_sys();
 #endif
-        {
-#ifndef QT_MAC_USE_COCOA
-            [[[self item] view] removeAllToolTips];
-            iconPrivate->updateToolTip_sys();
-#endif
-            NSMenu *m = [[QNSMenu alloc] initWithQMenu:icon->contextMenu()];
-            [m setAutoenablesItems: NO];
-            [[NSNotificationCenter defaultCenter] addObserver:imageCell
-                                                  selector:@selector(menuTrackingDone:)
-                                                  name:NSMenuDidEndTrackingNotification
-                                                  object:m];
-            [item popUpStatusItemMenu: m];
-            [m release];
-        }
+        NSMenu *m = [[QT_MANGLE_NAMESPACE(QNSMenu) alloc] initWithQMenu:icon->contextMenu()];
+        [m setAutoenablesItems: NO];
+        [[NSNotificationCenter defaultCenter] addObserver:imageCell
+         selector:@selector(menuTrackingDone:)
+             name:NSMenuDidEndTrackingNotification
+                 object:m];
+        [item popUpStatusItemMenu: m];
+        [m release];
     }
 }
+
 - (void)doubleClickSelector:(id)sender {
     Q_UNUSED(sender);
     if(!icon)
         return;
     qtsystray_sendActivated(icon, QSystemTrayIcon::DoubleClick);
 }
+
 @end
 
 class QSystemTrayIconQMenu : public QMenu
@@ -482,7 +480,7 @@
     QSystemTrayIconQMenu();
 };
 
-@implementation QNSMenu
+@implementation QT_MANGLE_NAMESPACE(QNSMenu)
 -(id)initWithQMenu:(QMenu*)qm {
     self = [super init];
     if(self) {
@@ -495,7 +493,7 @@
     return qmenu;
 }
 -(void)menuNeedsUpdate:(NSMenu*)nsmenu {
-    QNSMenu *menu = static_cast<QNSMenu *>(nsmenu);
+    QT_MANGLE_NAMESPACE(QNSMenu) *menu = static_cast<QT_MANGLE_NAMESPACE(QNSMenu) *>(nsmenu);
     emit static_cast<QSystemTrayIconQMenu*>(menu->qmenu)->doAboutToShow();
     for(int i = [menu numberOfItems]-1; i >= 0; --i)
         [menu removeItemAtIndex:i];
@@ -540,7 +538,7 @@
                 [nsimage release];
             }
             if(action->menu()) {
-                QNSMenu *sub = [[QNSMenu alloc] initWithQMenu:action->menu()];
+                QT_MANGLE_NAMESPACE(QNSMenu) *sub = [[QT_MANGLE_NAMESPACE(QNSMenu) alloc] initWithQMenu:action->menu()];
                 [item setSubmenu:sub];
             } else {
                 [item setAction:@selector(selectedAction:)];