Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Popup menus in the score canvas don't show on Mac #2

Closed
maximumspatium opened this issue Mar 4, 2017 · 18 comments
Closed

Popup menus in the score canvas don't show on Mac #2

maximumspatium opened this issue Mar 4, 2017 · 18 comments
Assignees

Comments

@maximumspatium
Copy link
Contributor

maximumspatium commented Mar 4, 2017

Right click on the score canvas should bring up popup menus. Unfortunately, it doesn't work on Mac.

The code responsible for handling click events is located in UIPredicates class.

There is Mac-specific code in the isContextWanted method:

public static boolean isContextWanted (MouseEvent e)
{
    if (WellKnowns.MAC_OS_X) {
        return e.isPopupTrigger();
    } else {
        return SwingUtilities.isRightMouseButton(e) && !SwingUtilities.isLeftMouseButton(e);
    }
}

It looks like e.isPopupTrigger()never evaluates to true on JRE7 and later. Why? To be investigated and fixed.

@maximumspatium maximumspatium self-assigned this Mar 4, 2017
@leo-benz
Copy link

I did a bit of debugging trying to find the reason for this issue:

  1. e.isPopupTrigger() is evaluated to true only in the mousePressed and mouseDragged event but not in the mouseReleased event.
  2. Since the popup is only shown in case of the mouseReleased event, it is never shown.
  3. A quick workaround is to return e.getButton() == 3; instead of return e.isPopupTrigger(); in the isContextWanted function.

@maximumspatium
Copy link
Contributor Author

Thank you for your investigation, Leo!
I'm currently using another quick workaround, similar to yours. I'll try to found a proper solution for that issue guided by your information...

Stay tuned.

@maximumspatium
Copy link
Contributor Author

maximumspatium commented Mar 24, 2017

e.isPopupTrigger() is evaluated to true only in the mousePressed and mouseDragged event but not in the mouseReleased event.

isContextWanted() (and thus e.isPupupTrigger()) is called only in two classes: BoardsPane.java and Rubber.java.

Rubber.java class calls isContextWanted in both mousePressed and mouseReleased methods.

BoardsPane calls isContextWanted only for mousePressed messages but it still does work as expected.

I suppose the problem should be somewhere in the mouse event handling logic of the Rubber class. I'll continue my investigation...

@JohannesBrx
Copy link

I would suggest testing for the CTRL key on the Mac, too, as described in http://stackoverflow.com/questions/2972512/how-to-detect-right-click-event-for-mac-os. This is because you normally use CTRL+ on a notebook to simulate a right-click.

    public static boolean isContextWanted (MouseEvent e)
    {
        if (WellKnowns.MAC_OS_X) {
            return (e.getButton() == MouseEvent.BUTTON3) || e.isControlDown();
        } else {

@maximumspatium
Copy link
Contributor Author

I suppose the problem should be somewhere in the mouse event handling logic of the Rubber class.

Not exactly, but it was very close. The logic causing this issue is located in two places:

  1. PictureView.java, Line 127

  2. SymbolsEditor.java, Line 396

Both lines check for MouseMovement == RELEASING before actually initialize the popup:

if (movement == MouseMovement.RELEASING) {
    ...
}

Because the popup trigger occurs when the mouse is pressed on Mac (as opposed to released on Windows), the above mentioned checks prevent the popup from working on Mac.

Now, we need to fix that.

@hbitteur
Copy link
Contributor

hbitteur commented Jan 21, 2018

This should be fixed in the 'development' branch. To be part of coming 5.1 release.
Could you check by yourself (I have no access to a Mac) and tell us the result?

@maximumspatium
Copy link
Contributor Author

Popups still don't work. I'll investigate this further.

@maximumspatium
Copy link
Contributor Author

The above described problem still persists caused by this line:

if (movement == MouseMovement.RELEASING) {
    showPagePopup(pt, getRubberRectangle());
}

On a Mac, isContextWanted never evaluates to true during the mouse release event.

@hbitteur
Copy link
Contributor

hbitteur commented Jan 21, 2018

Does this mean that, on macOS, a contextual menu can show up only at PRESSING time? (That is when pressing down the right button on a mouse)
The display at RELEASING time was needed to combine lasso and popup, which is no longer needed. I will investigate further, I'm not on my laptop.

@maximumspatium
Copy link
Contributor Author

Does this mean that, on macOS, a contextual menu can show up only at PRESSING time?

Yes.

@hbitteur
Copy link
Contributor

Here below is a simple java program, named TestMouse.java. If you prefer, it is also packed into this .zip file:
TestMouse.zip

Could you compile and run it. It opens a square panel.
In this panel, using sequentially left button, then right button, then wheel (if available), do the following sequence: click , small drag then release.

Then post your text output in this forum, together with the reference of your environment OS and java (using command java -version).
As an example, here is my output, using just left then right buttons, for Windows 10 and java version "1.8.0_131". We can easily see the events related to PRESSED, DRAGGED and RELEASED:

 mousePressed  400 Button1 MOUSE_PRESSED,(123,83),absolute(131,114),button=1,modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(124,85),absolute(132,116),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(125,86),absolute(133,117),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(125,87),absolute(133,118),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(125,88),absolute(133,119),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(125,89),absolute(133,120),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(126,90),absolute(134,121),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(126,91),absolute(134,122),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(127,92),absolute(135,123),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(128,93),absolute(136,124),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(128,94),absolute(136,125),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(128,95),absolute(136,126),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(128,96),absolute(136,127),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(128,97),absolute(136,128),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(129,97),absolute(137,128),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(129,98),absolute(137,129),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(129,99),absolute(137,130),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(129,100),absolute(137,131),modifiers=Button1,extModifiers=Button1,clickCount=0
 mouseDragged  400 Button1 MOUSE_DRAGGED,(130,101),absolute(138,132),modifiers=Button1,extModifiers=Button1,clickCount=0
mouseReleased    0  MOUSE_RELEASED,(130,101),absolute(138,132),button=1,modifiers=Button1,clickCount=1
 mousePressed 1000 Button3 MOUSE_PRESSED,(111,79),absolute(119,110),button=3,modifiers=Meta+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(111,81),absolute(119,112),modifiers=Meta+Button3,extModifiers=Button3,clickCount=0
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(112,81),absolute(120,112),modifiers=Meta+Button3,extModifiers=Button3,clickCount=0
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(112,82),absolute(120,113),modifiers=Meta+Button3,extModifiers=Button3,clickCount=0
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(113,84),absolute(121,115),modifiers=Meta+Button3,extModifiers=Button3,clickCount=0
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(113,85),absolute(121,116),modifiers=Meta+Button3,extModifiers=Button3,clickCount=0
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(114,86),absolute(122,117),modifiers=Meta+Button3,extModifiers=Button3,clickCount=0
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(114,87),absolute(122,118),modifiers=Meta+Button3,extModifiers=Button3,clickCount=0
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(115,89),absolute(123,120),modifiers=Meta+Button3,extModifiers=Button3,clickCount=0
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(116,90),absolute(124,121),modifiers=Meta+Button3,extModifiers=Button3,clickCount=0
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(116,91),absolute(124,122),modifiers=Meta+Button3,extModifiers=Button3,clickCount=0
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(117,92),absolute(125,123),modifiers=Meta+Button3,extModifiers=Button3,clickCount=0
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(118,93),absolute(126,124),modifiers=Meta+Button3,extModifiers=Button3,clickCount=0
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(118,94),absolute(126,125),modifiers=Meta+Button3,extModifiers=Button3,clickCount=0
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(119,95),absolute(127,126),modifiers=Meta+Button3,extModifiers=Button3,clickCount=0
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(119,96),absolute(127,127),modifiers=Meta+Button3,extModifiers=Button3,clickCount=0
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(120,96),absolute(128,127),modifiers=Meta+Button3,extModifiers=Button3,clickCount=0
mouseReleased  100  MOUSE_RELEASED,(120,96),absolute(128,127),button=3,modifiers=Meta+Button3,extModifiers=Meta,clickCount=1

Here is the content of TestMouse.java:

import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/**
 * A simple program to check actual Swing events when user plays with the mouse.
 *
 * @author Hervé Bitteur
 */
public class TestMouse
        extends JPanel
        implements MouseListener, MouseWheelListener, MouseMotionListener
{
    //~ Constructors -------------------------------------------------------------------------------

    /**
     * Creates a new {@code TestMouse} object.
     */
    public TestMouse ()
    {
        setPreferredSize(new Dimension(400, 400));
        addMouseListener(this);
        addMouseMotionListener(this);
        addMouseWheelListener(this);
    }

    //~ Methods ------------------------------------------------------------------------------------
    public static void main (String[] args)
    {
        SwingUtilities.invokeLater(
                new Runnable()
        {
            @Override
            public void run ()
            {
                TestMouse gui = new TestMouse();
                JFrame frame = new JFrame();
                frame.setTitle("TestMouse");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(gui);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    @Override
    public void mouseClicked (MouseEvent e)
    {
        log(e, "mouseClicked");
    }

    @Override
    public void mouseDragged (MouseEvent e)
    {
        log(e, "mouseDragged");
    }

    @Override
    public void mouseEntered (MouseEvent e)
    {
        ///log(e, "mouseEntered");
    }

    @Override
    public void mouseExited (MouseEvent e)
    {
        ///log(e, "mouseExited");
    }

    @Override
    public void mouseMoved (MouseEvent e)
    {
        ///log(e, "mouseMoved");
    }

    @Override
    public void mousePressed (MouseEvent e)
    {
        log(e, "mousePressed");
    }

    @Override
    public void mouseReleased (MouseEvent e)
    {
        log(e, "mouseReleased");
    }

    @Override
    public void mouseWheelMoved (MouseWheelEvent e)
    {
        log(e, "mouseWheelMoved");
    }

    private void log (MouseEvent e,
                      String method)
    {
        final int modifiers = e.getModifiersEx();
        final String text = MouseEvent.getMouseModifiersText(modifiers);
        final String params = e.paramString();
        System.out.printf("%13s %4x %s %s%n", method, modifiers, text, params);
    }
}

@maximumspatium
Copy link
Contributor Author

Then post your text output in this forum...

 mousePressed  400 Button1 MOUSE_PRESSED,(30,30),absolute(30,74),button=1,modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(31,30),absolute(31,74),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(32,30),absolute(32,74),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(35,31),absolute(35,75),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(38,33),absolute(38,77),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(43,37),absolute(43,81),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(47,39),absolute(47,83),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(50,42),absolute(50,86),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(55,45),absolute(55,89),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(60,48),absolute(60,92),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(66,52),absolute(66,96),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(71,56),absolute(71,100),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(76,60),absolute(76,104),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(80,65),absolute(80,109),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(84,69),absolute(84,113),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(86,71),absolute(86,115),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(87,73),absolute(87,117),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(88,74),absolute(88,118),modifiers=Button1,extModifiers=Button1,clickCount=1
 mouseDragged  400 Button1 MOUSE_DRAGGED,(88,73),absolute(88,117),modifiers=Button1,extModifiers=Button1,clickCount=1
mouseReleased    0  MOUSE_RELEASED,(88,73),absolute(88,117),button=1,modifiers=Button1,clickCount=0
 mousePressed 1000 Button3 MOUSE_PRESSED,(143,56),absolute(143,100),button=3,modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(144,56),absolute(144,100),modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(149,60),absolute(149,104),modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(158,66),absolute(158,110),modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(173,75),absolute(173,119),modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(192,86),absolute(192,130),modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(210,99),absolute(210,143),modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(222,107),absolute(222,151),modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(232,115),absolute(232,159),modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(236,118),absolute(236,162),modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(238,120),absolute(238,164),modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(242,122),absolute(242,166),modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(244,123),absolute(244,167),modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(247,125),absolute(247,169),modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(248,126),absolute(248,170),modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(249,126),absolute(249,170),modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
 mouseDragged 1000 Button3 MOUSE_DRAGGED,(250,127),absolute(250,171),modifiers=⌘+Button3,extModifiers=Button3,clickCount=1
mouseReleased  100  MOUSE_RELEASED,(250,127),absolute(250,171),button=3,modifiers=⌘+Button3,extModifiers=⌘,clickCount=0

...together with the reference of your environment OS and java (using command java -version).

OS: macOs 10.11.6 (El Capitan)

java -version
java version "1.8.0_152"
Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)

@hbitteur
Copy link
Contributor

@maximumspatium My understanding, when I read your MacOS output, is that indeed we should be able to get and process on MacOS the mouse RELEASING events, for left and right buttons.

For left button released:
mouseReleased 0 MOUSE_RELEASED,(88,73),absolute(88,117),button=1,modifiers=Button1,clickCount=0

For right button released:
mouseReleased 100 MOUSE_RELEASED,(250,127),absolute(250,171),button=3,modifiers=⌘+Button3,extModifiers=⌘,clickCount=0

Or did I miss anything?

@maximumspatium
Copy link
Contributor Author

Or did I miss anything?

Please consider the fact that audiveris currently utilizes e.isPopupTrigger() for popup gesture detection. Its behavior is different in MacOS and Windows (and your test doesn't cover this difference).

My understanding, when I read your MacOS output, is that indeed we should be able to get and process on MacOS the mouse RELEASING events, for left and right buttons.

This implies that we have to remove the following platform-dependent check in UIPredicates.java, Line 82 and reduce the whole method to the following, single line:

return SwingUtilities.isRightMouseButton(e) && !SwingUtilities.isLeftMouseButton(e);

Just apply this change and voilà - it works!

@maximumspatium
Copy link
Contributor Author

The problem is that I don't know how it behaves on Apple hardware/software configurations other than MacBook Pro (this is a laptop). Maybe someone with a recent desktop macOs system could step in and test whether it works for him/her...

@hbitteur
Copy link
Contributor

Good news!

maximumspatium added a commit that referenced this issue Jan 22, 2018
It fixes the issue #2 (Popup menus don't work on Mac).
@maximumspatium
Copy link
Contributor Author

Okay, I did it (see 9643e46).
It works for me and will hopefully work for others. All other gestures (rubber rectangle, zooming and addition) work as well considering replacing the "Ctrl" key with the "Option" key on Mac.

@hbitteur
Copy link
Contributor

Closing the issue since now MacOS can behave as the other OSes

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants