diff mbox

ui/cocoa.m: Prevent activation clicks from going to guest

Message ID AFC490FB-08DE-4F10-A28B-115DA789FB59@gmail.com
State New
Headers show

Commit Message

Programmingkid Nov. 22, 2015, 1:43 a.m. UTC
When QEMU is brought to the foreground, the click event that activates QEMU
should not go to the guest. Accidents happen when they do go to the guest
without giving the user a change to handle them. Buttons are clicked accidently.
Windows are closed accidently. Volumes are unmounted accidently. This patch
prevents these accidents from happening. 

Signed-off-by: John Arbuckle <programmingkidx@gmail.com>

---
 ui/cocoa.m |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)

Comments

Peter Maydell Nov. 23, 2015, 4:06 p.m. UTC | #1
On 22 November 2015 at 01:43, Programmingkid <programmingkidx@gmail.com> wrote:
> When QEMU is brought to the foreground, the click event that activates QEMU
> should not go to the guest. Accidents happen when they do go to the guest
> without giving the user a change to handle them. Buttons are clicked accidently.
> Windows are closed accidently. Volumes are unmounted accidently. This patch
> prevents these accidents from happening.
>
> Signed-off-by: John Arbuckle <programmingkidx@gmail.com>

So, I checked how Parallels behaves (this is my go-to check for
"how should a native OSX VM window behave?"), and it works the
same way QEMU does -- left mouse clicks "click through" so they
both raise the window to the front and have the behaviour
indicated by the guest OS.

thanks
-- PMM
Programmingkid Nov. 23, 2015, 5:37 p.m. UTC | #2
On Nov 23, 2015, at 11:06 AM, Peter Maydell wrote:

> On 22 November 2015 at 01:43, Programmingkid <programmingkidx@gmail.com> wrote:
>> When QEMU is brought to the foreground, the click event that activates QEMU
>> should not go to the guest. Accidents happen when they do go to the guest
>> without giving the user a change to handle them. Buttons are clicked accidently.
>> Windows are closed accidently. Volumes are unmounted accidently. This patch
>> prevents these accidents from happening.
>> 
>> Signed-off-by: John Arbuckle <programmingkidx@gmail.com>
> 
> So, I checked how Parallels behaves (this is my go-to check for
> "how should a native OSX VM window behave?"), and it works the
> same way QEMU does -- left mouse clicks "click through" so they
> both raise the window to the front and have the behaviour
> indicated by the guest OS.

What if we were better than Parallels? Apple's own human interface guidelines state that the
activation click should not make any changes to the application.
Programmingkid Nov. 24, 2015, 3:25 a.m. UTC | #3
On Nov 23, 2015, at 11:06 AM, Peter Maydell wrote:

> On 22 November 2015 at 01:43, Programmingkid <programmingkidx@gmail.com> wrote:
>> When QEMU is brought to the foreground, the click event that activates QEMU
>> should not go to the guest. Accidents happen when they do go to the guest
>> without giving the user a change to handle them. Buttons are clicked accidently.
>> Windows are closed accidently. Volumes are unmounted accidently. This patch
>> prevents these accidents from happening.
>> 
>> Signed-off-by: John Arbuckle <programmingkidx@gmail.com>
> 
> So, I checked how Parallels behaves (this is my go-to check for
> "how should a native OSX VM window behave?"), and it works the
> same way QEMU does -- left mouse clicks "click through" so they
> both raise the window to the front and have the behaviour
> indicated by the guest OS.

But doesn't Parallels allow you to move the mouse pointer before activating it? 
QEMU requires the mouse to be grabbed before any movement can take 
place. That makes moving the mouse pointer out of danger before an activation
click impossible.
Peter Maydell Nov. 24, 2015, 8:56 a.m. UTC | #4
On 24 November 2015 at 03:25, Programmingkid <programmingkidx@gmail.com> wrote:
>
> On Nov 23, 2015, at 11:06 AM, Peter Maydell wrote:
>
>> On 22 November 2015 at 01:43, Programmingkid <programmingkidx@gmail.com> wrote:
>>> When QEMU is brought to the foreground, the click event that activates QEMU
>>> should not go to the guest. Accidents happen when they do go to the guest
>>> without giving the user a change to handle them. Buttons are clicked accidently.
>>> Windows are closed accidently. Volumes are unmounted accidently. This patch
>>> prevents these accidents from happening.
>>>
>>> Signed-off-by: John Arbuckle <programmingkidx@gmail.com>
>>
>> So, I checked how Parallels behaves (this is my go-to check for
>> "how should a native OSX VM window behave?"), and it works the
>> same way QEMU does -- left mouse clicks "click through" so they
>> both raise the window to the front and have the behaviour
>> indicated by the guest OS.
>
> But doesn't Parallels allow you to move the mouse pointer before activating it?
> QEMU requires the mouse to be grabbed before any movement can take
> place. That makes moving the mouse pointer out of danger before an activation
> click impossible.

I'm not entirely sure what you mean. Parallels doesn't show a separate
guest mouse pointer generally: where you click the host mouse pointer
is where the click happens. You can choose where in the guest window you
want to make the activation-and-clickthrough click.

Ah, I think I've just worked it out -- when there's no guest OS
support for absolute mouse positioning (ie you're using an emulated
mouse rather than emulated tablet for input), the guest mouse pointer
will just be wherever in the guest window it was left (perhaps even
underneath the obscuring window), so we will effectively click on that
point, not on wherever the user actually made the activating click.
OK, I'm convinced, we should definitely not do that.

I asked somebody to check VMWare's behaviour as another
data point. Apparently it doesn't do click-through
to the guest window, but it doesn't pass through the
right mouse button either. Your patch only affects leftclicks:
should we suppress other mouse events too?

thanks
-- PMM
Programmingkid Nov. 24, 2015, 4:46 p.m. UTC | #5
On Nov 24, 2015, at 3:56 AM, Peter Maydell wrote:

> On 24 November 2015 at 03:25, Programmingkid <programmingkidx@gmail.com> wrote:
>> 
>> On Nov 23, 2015, at 11:06 AM, Peter Maydell wrote:
>> 
>>> On 22 November 2015 at 01:43, Programmingkid <programmingkidx@gmail.com> wrote:
>>>> When QEMU is brought to the foreground, the click event that activates QEMU
>>>> should not go to the guest. Accidents happen when they do go to the guest
>>>> without giving the user a change to handle them. Buttons are clicked accidently.
>>>> Windows are closed accidently. Volumes are unmounted accidently. This patch
>>>> prevents these accidents from happening.
>>>> 
>>>> Signed-off-by: John Arbuckle <programmingkidx@gmail.com>
>>> 
>>> So, I checked how Parallels behaves (this is my go-to check for
>>> "how should a native OSX VM window behave?"), and it works the
>>> same way QEMU does -- left mouse clicks "click through" so they
>>> both raise the window to the front and have the behaviour
>>> indicated by the guest OS.
>> 
>> But doesn't Parallels allow you to move the mouse pointer before activating it?
>> QEMU requires the mouse to be grabbed before any movement can take
>> place. That makes moving the mouse pointer out of danger before an activation
>> click impossible.
> 
> I'm not entirely sure what you mean. Parallels doesn't show a separate
> guest mouse pointer generally: where you click the host mouse pointer
> is where the click happens. You can choose where in the guest window you
> want to make the activation-and-clickthrough click.
> 
> Ah, I think I've just worked it out -- when there's no guest OS
> support for absolute mouse positioning (ie you're using an emulated
> mouse rather than emulated tablet for input), the guest mouse pointer
> will just be wherever in the guest window it was left (perhaps even
> underneath the obscuring window), so we will effectively click on that
> point, not on wherever the user actually made the activating click.
> OK, I'm convinced, we should definitely not do that.
> 
> I asked somebody to check VMWare's behaviour as another
> data point. Apparently it doesn't do click-through
> to the guest window, but it doesn't pass through the
> right mouse button either. Your patch only affects leftclicks:
> should we suppress other mouse events too?

Suppressing other mouse events does sound logical. Another patch
will be made to do this.
diff mbox

Patch

diff --git a/ui/cocoa.m b/ui/cocoa.m
index 1554331..b75c01e 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -669,6 +669,16 @@  QemuCocoaView *cocoaView;
             mouse_event = true;
             break;
         case NSLeftMouseDown:
+            /*
+             * This prevents the click that activates QEMU from being sent to
+             * the guest.
+             */
+            if (!isMouseGrabbed && [self screenContainsPoint:p]) {
+                [self grabMouse];
+                [NSApp sendEvent:event];
+                return;
+            }
+
             if ([event modifierFlags] & NSCommandKeyMask) {
                 buttons |= MOUSE_EVENT_RBUTTON;
             } else {