gnustep-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: NSMenuView patch


From: Germán Arias
Subject: Re: NSMenuView patch
Date: Thu, 17 Feb 2011 15:14:30 -0600

Well, definitely this behavior is better. But there are some problems:

* You need do three clicks on title bar to get a response (minimize,
close,...) when a submenu is displayed.

* If a submenu is displayed, and you do a click at horizontal bar in a
place where there isn't an item, after some second the app crash.


On jue, 2011-02-17 at 22:39 +1100, Christopher Armstrong wrote:
> I've reposted this here because I don't believe patches show up on the 
> mailing lists. 
> 
> I've attached a patch at savannah that fixes some outside mouse behaviour 
> issues with Mac and Windows style menus. Specifically:
> 
> * Clicking outside the attached menu window to close it doesn't close the menu
> * Moving the mouse outside the menu in Windows mode closes the menu
> * Attached sub-menus in Windows mode stay open until another top-level menu 
> is selected, instead of disappearing when the mouse is moved outside the 
> attached sub-menu
> 
> https://savannah.gnu.org/patch/?7470
> 
> Cheers
> 
> Christopher Armstrong
> address@hidden
> --
> 
> Index: Source/NSMenuView.m
> ===================================================================
> --- Source/NSMenuView.m       (revision 32140)
> +++ Source/NSMenuView.m       (working copy)
> @@ -1439,7 +1439,6 @@
>    int delayCount = 0;
>    int indexOfActionToExecute = -1;
>    int firstIndex = -1;
> -  int space = 0;
>    NSEvent *original;
>    NSEventType type;
>    NSEventType end;
> @@ -1487,7 +1486,6 @@
>        eventMask |= NSLeftMouseUpMask | NSLeftMouseDraggedMask;
>        eventMask |= NSLeftMouseDownMask;
>      }
> -
>    /* We attempt to mimic Mac OS X behavior for pop up menus. If the user
>       presses the mouse button over a pop up button and then drags the mouse
>       over the menu, the is closed when the user releases the mouse. On the
> @@ -1503,6 +1501,11 @@
>         */
>        shouldFinish = NO;
>      }
> +  
> +  // Capture the mouse so we get clicks outside the menus and
> +  // GNUstep windows.
> +  [_window _captureMouse: self];
> +
>    do
>      {
>        /*Close the menu if the user press a modifier key and menu
> @@ -1512,6 +1515,7 @@
>       {
>         [self setHighlightedItemIndex: -1];
>         [[[[NSApp mainWindow] menu] attachedMenu] close];
> +       [_window _releaseMouse: self];
>         return NO;
>       }
>  
> @@ -1585,7 +1589,6 @@
>                NSPoint locationInScreenCoordinates;
>                NSWindow *windowUnderMouse;
>                NSMenu *candidateMenu;
> -           NSMenu *anAttachedMenu = [[[NSApp mainWindow] menu] attachedMenu];
>  
>                subMenusNeedRemoving = NO;
>  
> @@ -1631,6 +1634,7 @@
>                    
>                    candidateMenuResult = [[candidateMenu menuRepresentation]
>                             trackWithEvent: original];
> +                  [_window _releaseMouse: self];
>                    return candidateMenuResult;
>                  }
>  
> @@ -1650,6 +1654,7 @@
>                      {
>                        [self detachSubmenu];
>                      }
> +                  [_window _releaseMouse: self];
>                    return subMenuResult;
>                  }
>             
> @@ -1660,23 +1665,16 @@
>                 ![[self menu] isTransient] &&
>                 ![[self menu] _ownedByPopUp])
>               {
> -               if ([self hitTest: location] == nil)
> +                  // If the user moves the mouse into the main window
> +                  // horizontal menu, start tracking again.
> +                  NSWindow *mainWindow = [NSApp mainWindow];
> +                  NSPoint locationInMainWindow = [mainWindow 
> +                    convertScreenToBase: locationInScreenCoordinates];
> +               if ([[[mainWindow menu] menuRepresentation] 
> +                        hitTest: locationInMainWindow] != nil)
>                   {
> -                   /*This gives us time to move the cursor between a menu and
> -                     its submenu (or vice versa) without lose the mouse
> -                     tracking*/
> -                   space += 1;
> -
> -                   if (space == 2)
> -                     {
> -                       [anAttachedMenu close];
> -                       return NO;
> -                     }
> -                 }
> -               
> -               if (self != [[[NSApp mainWindow] menu] menuRepresentation])
> -                 {
>                     [self setHighlightedItemIndex: -1];
> +                   [_window _releaseMouse: self];
>                     return [[[[NSApp mainWindow] menu] menuRepresentation]
>                              trackWithEvent: original];
>                   }
> @@ -1711,6 +1709,9 @@
>      }
>    while (type != end || shouldFinish == NO);
>  
> +  // Uncapture the mouse again.
> +  [_window _releaseMouse: self];
> +
>    /*
>     * Ok, we released the mouse
>     * There are now a few possibilities:
> 
> 
> _______________________________________________
> Gnustep-dev mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/gnustep-dev




reply via email to

[Prev in Thread] Current Thread [Next in Thread]