Message ID | 20211231174210.82446-2-carwynellis@gmail.com |
---|---|
State | New |
Headers | show |
Series | ui/cocoa: Add option to disable left command and hide cursor on click | expand |
On 12/31/21 12:42, Carwyn Ellis wrote: > When switching between guest and host on a Mac using command-tab the > command key is sent to the guest which can trigger functionality in the > guest OS. Specifying left-command-key=off disables forwarding this key > to the guest. Defaults to enabled. > > When switching between guest and host on a Mac with a fullscreen guest > the host pointer will occasionally persist despite the ui code > requesting that it be hidden. Added cursor hide calls on left and right > mouse click to hide the cursor when the mouse is clicked. > > Also updated the cocoa display documentation to reference the new > left-command-key option along with the existing show-cursor option. > --- > qapi/ui.json | 17 +++++++++++++++++ > qemu-options.hx | 12 ++++++++++++ > ui/cocoa.m | 33 +++++++++++++++++++++++++-------- > 3 files changed, 54 insertions(+), 8 deletions(-) > > diff --git a/qapi/ui.json b/qapi/ui.json > index 2b4371da37..764480e145 100644 > --- a/qapi/ui.json > +++ b/qapi/ui.json > @@ -1107,6 +1107,22 @@ > 'data' : { '*grab-on-hover' : 'bool', > '*zoom-to-fit' : 'bool' } } > > +## > +# @DisplayCocoa: > +# > +# Cocoa display options. > +# > +# @left-command-key: Enable/disable forwarding of left command key to > +# guest. Allows command-tab window switching on the > +# host without sending this key to the guest when > +# "off". Defaults to "on" > +# > +# Since: 6.2.50 > +# > +## > +{ 'struct' : 'DisplayCocoa', > + 'data' : { '*left-command-key' : 'bool' } } > + > ## > # @DisplayEGLHeadless: > # > @@ -1254,6 +1270,7 @@ > 'discriminator' : 'type', > 'data' : { > 'gtk': { 'type': 'DisplayGTK', 'if': 'CONFIG_GTK' }, > + 'cocoa': { 'type': 'DisplayCocoa', 'if': 'CONFIG_COCOA' }, > 'curses': { 'type': 'DisplayCurses', 'if': 'CONFIG_CURSES' }, > 'egl-headless': { 'type': 'DisplayEGLHeadless', > 'if': { 'all': ['CONFIG_OPENGL', 'CONFIG_GBM'] } }, > diff --git a/qemu-options.hx b/qemu-options.hx > index 7d47510947..5214457676 100644 > --- a/qemu-options.hx > +++ b/qemu-options.hx > @@ -1869,6 +1869,9 @@ DEF("display", HAS_ARG, QEMU_OPTION_display, > #if defined(CONFIG_DBUS_DISPLAY) > "-display dbus[,addr=<dbusaddr>]\n" > " [,gl=on|core|es|off][,rendernode=<file>]\n" > +#endif > +#if defined(CONFIG_COCOA) > + "-display cocoa[,show-cursor=on|off][,left-command-key=on|off]\n" > #endif > "-display none\n" > " select display backend type\n" > @@ -1956,6 +1959,15 @@ SRST > ``charset=CP850`` for IBM CP850 encoding. The default is > ``CP437``. > > + ``cocoa`` > + Display video output in a Cocoa window. Mac only. This interface > + provides drop-down menus and other UI elements to configure and > + control the VM during runtime. Valid parameters are: > + > + ``show-cursor=on|off`` : Force showing the mouse cursor > + > + ``left-command-key=on|off`` : Disable forwarding left command key to host > + > ``egl-headless[,rendernode=<file>]`` > Offload all OpenGL operations to a local DRI device. For any > graphical display, this display needs to be paired with either > diff --git a/ui/cocoa.m b/ui/cocoa.m > index 69745c483b..10e492538a 100644 > --- a/ui/cocoa.m > +++ b/ui/cocoa.m > @@ -95,6 +95,8 @@ static DisplayChangeListener dcl = { > }; > static int last_buttons; > static int cursor_hide = 1; > +static bool cursor_visible = 1; > +static int left_command_key_enabled = 1; > > static int gArgc; > static char **gArgv; > @@ -411,18 +413,18 @@ QemuCocoaView *cocoaView; > > - (void) hideCursor > { > - if (!cursor_hide) { > - return; > + if (cursor_hide && cursor_visible) { > + cursor_visible = 0; > + [NSCursor hide]; > } > - [NSCursor hide]; > } > > - (void) unhideCursor > { > - if (!cursor_hide) { > - return; > + if (cursor_hide && !cursor_visible) { > + cursor_visible = 1; > + [NSCursor unhide]; > } > - [NSCursor unhide]; > } > > - (void) drawRect:(NSRect) rect > @@ -831,10 +833,14 @@ QemuCocoaView *cocoaView; > } > break; > > - /* Don't pass command key changes to guest unless mouse is grabbed */ > + /* > + Don't pass command key changes to guest unless mouse is grabbed > + or the key is explicitly disabled using the left-command-key option > + */ > case kVK_Command: > if (isMouseGrabbed && > - !!(modifiers & NSEventModifierFlagCommand)) { > + !!(modifiers & NSEventModifierFlagCommand) && > + left_command_key_enabled) { > [self toggleKey:Q_KEY_CODE_META_L]; > } > break; > @@ -923,10 +929,16 @@ QemuCocoaView *cocoaView; > case NSEventTypeLeftMouseDown: > buttons |= MOUSE_EVENT_LBUTTON; > mouse_event = true; > + if (isFullscreen) { > + [self hideCursor]; > + } > break; > case NSEventTypeRightMouseDown: > buttons |= MOUSE_EVENT_RBUTTON; > mouse_event = true; > + if (isFullscreen) { > + [self hideCursor]; > + } > break; > case NSEventTypeOtherMouseDown: > buttons |= MOUSE_EVENT_MBUTTON; > @@ -2050,10 +2062,15 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts) > [(QemuCocoaAppController *)[[NSApplication sharedApplication] delegate] toggleFullScreen: nil]; > }); > } > + > if (opts->has_show_cursor && opts->show_cursor) { > cursor_hide = 0; > } > > + if (opts->u.cocoa.has_left_command_key && !opts->u.cocoa.left_command_key) { > + left_command_key_enabled = 0; > + } > + > // register vga output callbacks > register_displaychangelistener(&dcl); > All the fullscreen stuff could be put into its own patch.
Ok cool, I’ll separate this out into 2 patches for the fullscreen and left-command changes respectively. Will aim to get this out at some point tomorrow. Cheers Carwyn > On 31 Dec 2021, at 17:49, Alexander Orzechowski <orzechowski.alexander@gmail.com> wrote: > > > On 12/31/21 12:42, Carwyn Ellis wrote: >> When switching between guest and host on a Mac using command-tab the >> command key is sent to the guest which can trigger functionality in the >> guest OS. Specifying left-command-key=off disables forwarding this key >> to the guest. Defaults to enabled. >> >> When switching between guest and host on a Mac with a fullscreen guest >> the host pointer will occasionally persist despite the ui code >> requesting that it be hidden. Added cursor hide calls on left and right >> mouse click to hide the cursor when the mouse is clicked. >> >> Also updated the cocoa display documentation to reference the new >> left-command-key option along with the existing show-cursor option. >> --- >> qapi/ui.json | 17 +++++++++++++++++ >> qemu-options.hx | 12 ++++++++++++ >> ui/cocoa.m | 33 +++++++++++++++++++++++++-------- >> 3 files changed, 54 insertions(+), 8 deletions(-) >> >> diff --git a/qapi/ui.json b/qapi/ui.json >> index 2b4371da37..764480e145 100644 >> --- a/qapi/ui.json >> +++ b/qapi/ui.json >> @@ -1107,6 +1107,22 @@ >> 'data' : { '*grab-on-hover' : 'bool', >> '*zoom-to-fit' : 'bool' } } >> +## >> +# @DisplayCocoa: >> +# >> +# Cocoa display options. >> +# >> +# @left-command-key: Enable/disable forwarding of left command key to >> +# guest. Allows command-tab window switching on the >> +# host without sending this key to the guest when >> +# "off". Defaults to "on" >> +# >> +# Since: 6.2.50 >> +# >> +## >> +{ 'struct' : 'DisplayCocoa', >> + 'data' : { '*left-command-key' : 'bool' } } >> + >> ## >> # @DisplayEGLHeadless: >> # >> @@ -1254,6 +1270,7 @@ >> 'discriminator' : 'type', >> 'data' : { >> 'gtk': { 'type': 'DisplayGTK', 'if': 'CONFIG_GTK' }, >> + 'cocoa': { 'type': 'DisplayCocoa', 'if': 'CONFIG_COCOA' }, >> 'curses': { 'type': 'DisplayCurses', 'if': 'CONFIG_CURSES' }, >> 'egl-headless': { 'type': 'DisplayEGLHeadless', >> 'if': { 'all': ['CONFIG_OPENGL', 'CONFIG_GBM'] } }, >> diff --git a/qemu-options.hx b/qemu-options.hx >> index 7d47510947..5214457676 100644 >> --- a/qemu-options.hx >> +++ b/qemu-options.hx >> @@ -1869,6 +1869,9 @@ DEF("display", HAS_ARG, QEMU_OPTION_display, >> #if defined(CONFIG_DBUS_DISPLAY) >> "-display dbus[,addr=<dbusaddr>]\n" >> " [,gl=on|core|es|off][,rendernode=<file>]\n" >> +#endif >> +#if defined(CONFIG_COCOA) >> + "-display cocoa[,show-cursor=on|off][,left-command-key=on|off]\n" >> #endif >> "-display none\n" >> " select display backend type\n" >> @@ -1956,6 +1959,15 @@ SRST >> ``charset=CP850`` for IBM CP850 encoding. The default is >> ``CP437``. >> + ``cocoa`` >> + Display video output in a Cocoa window. Mac only. This interface >> + provides drop-down menus and other UI elements to configure and >> + control the VM during runtime. Valid parameters are: >> + >> + ``show-cursor=on|off`` : Force showing the mouse cursor >> + >> + ``left-command-key=on|off`` : Disable forwarding left command key to host >> + >> ``egl-headless[,rendernode=<file>]`` >> Offload all OpenGL operations to a local DRI device. For any >> graphical display, this display needs to be paired with either >> diff --git a/ui/cocoa.m b/ui/cocoa.m >> index 69745c483b..10e492538a 100644 >> --- a/ui/cocoa.m >> +++ b/ui/cocoa.m >> @@ -95,6 +95,8 @@ static DisplayChangeListener dcl = { >> }; >> static int last_buttons; >> static int cursor_hide = 1; >> +static bool cursor_visible = 1; >> +static int left_command_key_enabled = 1; >> static int gArgc; >> static char **gArgv; >> @@ -411,18 +413,18 @@ QemuCocoaView *cocoaView; >> - (void) hideCursor >> { >> - if (!cursor_hide) { >> - return; >> + if (cursor_hide && cursor_visible) { >> + cursor_visible = 0; >> + [NSCursor hide]; >> } >> - [NSCursor hide]; >> } >> - (void) unhideCursor >> { >> - if (!cursor_hide) { >> - return; >> + if (cursor_hide && !cursor_visible) { >> + cursor_visible = 1; >> + [NSCursor unhide]; >> } >> - [NSCursor unhide]; >> } >> - (void) drawRect:(NSRect) rect >> @@ -831,10 +833,14 @@ QemuCocoaView *cocoaView; >> } >> break; >> - /* Don't pass command key changes to guest unless mouse is grabbed */ >> + /* >> + Don't pass command key changes to guest unless mouse is grabbed >> + or the key is explicitly disabled using the left-command-key option >> + */ >> case kVK_Command: >> if (isMouseGrabbed && >> - !!(modifiers & NSEventModifierFlagCommand)) { >> + !!(modifiers & NSEventModifierFlagCommand) && >> + left_command_key_enabled) { >> [self toggleKey:Q_KEY_CODE_META_L]; >> } >> break; >> @@ -923,10 +929,16 @@ QemuCocoaView *cocoaView; >> case NSEventTypeLeftMouseDown: >> buttons |= MOUSE_EVENT_LBUTTON; >> mouse_event = true; >> + if (isFullscreen) { >> + [self hideCursor]; >> + } >> break; >> case NSEventTypeRightMouseDown: >> buttons |= MOUSE_EVENT_RBUTTON; >> mouse_event = true; >> + if (isFullscreen) { >> + [self hideCursor]; >> + } >> break; >> case NSEventTypeOtherMouseDown: >> buttons |= MOUSE_EVENT_MBUTTON; >> @@ -2050,10 +2062,15 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts) >> [(QemuCocoaAppController *)[[NSApplication sharedApplication] delegate] toggleFullScreen: nil]; >> }); >> } >> + >> if (opts->has_show_cursor && opts->show_cursor) { >> cursor_hide = 0; >> } >> + if (opts->u.cocoa.has_left_command_key && !opts->u.cocoa.left_command_key) { >> + left_command_key_enabled = 0; >> + } >> + >> // register vga output callbacks >> register_displaychangelistener(&dcl); >> > All the fullscreen stuff could be put into its own patch.
On 12/31/21 12:42, Carwyn Ellis wrote: > When switching between guest and host on a Mac using command-tab the > command key is sent to the guest which can trigger functionality in the > guest OS. Specifying left-command-key=off disables forwarding this key > to the guest. Defaults to enabled. > > When switching between guest and host on a Mac with a fullscreen guest > the host pointer will occasionally persist despite the ui code > requesting that it be hidden. Added cursor hide calls on left and right > mouse click to hide the cursor when the mouse is clicked. > > Also updated the cocoa display documentation to reference the new > left-command-key option along with the existing show-cursor option. > --- > qapi/ui.json | 17 +++++++++++++++++ > qemu-options.hx | 12 ++++++++++++ > ui/cocoa.m | 33 +++++++++++++++++++++++++-------- > 3 files changed, 54 insertions(+), 8 deletions(-) > > diff --git a/qapi/ui.json b/qapi/ui.json > index 2b4371da37..764480e145 100644 > --- a/qapi/ui.json > +++ b/qapi/ui.json > @@ -1107,6 +1107,22 @@ > 'data' : { '*grab-on-hover' : 'bool', > '*zoom-to-fit' : 'bool' } } > > +## > +# @DisplayCocoa: > +# > +# Cocoa display options. > +# > +# @left-command-key: Enable/disable forwarding of left command key to > +# guest. Allows command-tab window switching on the > +# host without sending this key to the guest when > +# "off". Defaults to "on" > +# > +# Since: 6.2.50 > +# > +## > +{ 'struct' : 'DisplayCocoa', > + 'data' : { '*left-command-key' : 'bool' } } > + > ## > # @DisplayEGLHeadless: > # > @@ -1254,6 +1270,7 @@ > 'discriminator' : 'type', > 'data' : { > 'gtk': { 'type': 'DisplayGTK', 'if': 'CONFIG_GTK' }, > + 'cocoa': { 'type': 'DisplayCocoa', 'if': 'CONFIG_COCOA' }, > 'curses': { 'type': 'DisplayCurses', 'if': 'CONFIG_CURSES' }, > 'egl-headless': { 'type': 'DisplayEGLHeadless', > 'if': { 'all': ['CONFIG_OPENGL', 'CONFIG_GBM'] } }, > diff --git a/qemu-options.hx b/qemu-options.hx > index 7d47510947..5214457676 100644 > --- a/qemu-options.hx > +++ b/qemu-options.hx > @@ -1869,6 +1869,9 @@ DEF("display", HAS_ARG, QEMU_OPTION_display, > #if defined(CONFIG_DBUS_DISPLAY) > "-display dbus[,addr=<dbusaddr>]\n" > " [,gl=on|core|es|off][,rendernode=<file>]\n" > +#endif > +#if defined(CONFIG_COCOA) > + "-display cocoa[,show-cursor=on|off][,left-command-key=on|off]\n" > #endif > "-display none\n" > " select display backend type\n" > @@ -1956,6 +1959,15 @@ SRST > ``charset=CP850`` for IBM CP850 encoding. The default is > ``CP437``. > > + ``cocoa`` > + Display video output in a Cocoa window. Mac only. This interface > + provides drop-down menus and other UI elements to configure and > + control the VM during runtime. Valid parameters are: > + > + ``show-cursor=on|off`` : Force showing the mouse cursor > + > + ``left-command-key=on|off`` : Disable forwarding left command key to host > + > ``egl-headless[,rendernode=<file>]`` > Offload all OpenGL operations to a local DRI device. For any > graphical display, this display needs to be paired with either > diff --git a/ui/cocoa.m b/ui/cocoa.m > index 69745c483b..10e492538a 100644 > --- a/ui/cocoa.m > +++ b/ui/cocoa.m > @@ -95,6 +95,8 @@ static DisplayChangeListener dcl = { > }; > static int last_buttons; > static int cursor_hide = 1; > +static bool cursor_visible = 1; > +static int left_command_key_enabled = 1; > > static int gArgc; > static char **gArgv; > @@ -411,18 +413,18 @@ QemuCocoaView *cocoaView; > > - (void) hideCursor > { > - if (!cursor_hide) { > - return; > + if (cursor_hide && cursor_visible) { > + cursor_visible = 0; > + [NSCursor hide]; > } > - [NSCursor hide]; > } > > - (void) unhideCursor > { > - if (!cursor_hide) { > - return; > + if (cursor_hide && !cursor_visible) { > + cursor_visible = 1; > + [NSCursor unhide]; > } > - [NSCursor unhide]; > } > > - (void) drawRect:(NSRect) rect > @@ -831,10 +833,14 @@ QemuCocoaView *cocoaView; > } > break; > > - /* Don't pass command key changes to guest unless mouse is grabbed */ > + /* > + Don't pass command key changes to guest unless mouse is grabbed > + or the key is explicitly disabled using the left-command-key option > + */ > case kVK_Command: > if (isMouseGrabbed && > - !!(modifiers & NSEventModifierFlagCommand)) { > + !!(modifiers & NSEventModifierFlagCommand) && > + left_command_key_enabled) { > [self toggleKey:Q_KEY_CODE_META_L]; > } > break; > @@ -923,10 +929,16 @@ QemuCocoaView *cocoaView; > case NSEventTypeLeftMouseDown: > buttons |= MOUSE_EVENT_LBUTTON; > mouse_event = true; > + if (isFullscreen) { > + [self hideCursor]; > + } > break; > case NSEventTypeRightMouseDown: > buttons |= MOUSE_EVENT_RBUTTON; > mouse_event = true; > + if (isFullscreen) { > + [self hideCursor]; > + } > break; > case NSEventTypeOtherMouseDown: > buttons |= MOUSE_EVENT_MBUTTON; > @@ -2050,10 +2062,15 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts) > [(QemuCocoaAppController *)[[NSApplication sharedApplication] delegate] toggleFullScreen: nil]; > }); > } > + > if (opts->has_show_cursor && opts->show_cursor) { > cursor_hide = 0; > } > > + if (opts->u.cocoa.has_left_command_key && !opts->u.cocoa.left_command_key) { > + left_command_key_enabled = 0; > + } > + > // register vga output callbacks > register_displaychangelistener(&dcl); > You also forgot about the sign off. git commit with a -s switch will append the appropriate sign off message. All patches need to be signed off so we know you are okay with them going upstream.
> On 31 Dec 2021, at 17:56, Alexander Orzechowski <orzechowski.alexander@gmail.com> wrote: > > > On 12/31/21 12:42, Carwyn Ellis wrote: >> When switching between guest and host on a Mac using command-tab the >> command key is sent to the guest which can trigger functionality in the >> guest OS. Specifying left-command-key=off disables forwarding this key >> to the guest. Defaults to enabled. >> >> When switching between guest and host on a Mac with a fullscreen guest >> the host pointer will occasionally persist despite the ui code >> requesting that it be hidden. Added cursor hide calls on left and right >> mouse click to hide the cursor when the mouse is clicked. >> >> Also updated the cocoa display documentation to reference the new >> left-command-key option along with the existing show-cursor option. >> --- >> qapi/ui.json | 17 +++++++++++++++++ >> qemu-options.hx | 12 ++++++++++++ >> ui/cocoa.m | 33 +++++++++++++++++++++++++-------- >> 3 files changed, 54 insertions(+), 8 deletions(-) >> >> diff --git a/qapi/ui.json b/qapi/ui.json >> index 2b4371da37..764480e145 100644 >> --- a/qapi/ui.json >> +++ b/qapi/ui.json >> @@ -1107,6 +1107,22 @@ >> 'data' : { '*grab-on-hover' : 'bool', >> '*zoom-to-fit' : 'bool' } } >> +## >> +# @DisplayCocoa: >> +# >> +# Cocoa display options. >> +# >> +# @left-command-key: Enable/disable forwarding of left command key to >> +# guest. Allows command-tab window switching on the >> +# host without sending this key to the guest when >> +# "off". Defaults to "on" >> +# >> +# Since: 6.2.50 >> +# >> +## >> +{ 'struct' : 'DisplayCocoa', >> + 'data' : { '*left-command-key' : 'bool' } } >> + >> ## >> # @DisplayEGLHeadless: >> # >> @@ -1254,6 +1270,7 @@ >> 'discriminator' : 'type', >> 'data' : { >> 'gtk': { 'type': 'DisplayGTK', 'if': 'CONFIG_GTK' }, >> + 'cocoa': { 'type': 'DisplayCocoa', 'if': 'CONFIG_COCOA' }, >> 'curses': { 'type': 'DisplayCurses', 'if': 'CONFIG_CURSES' }, >> 'egl-headless': { 'type': 'DisplayEGLHeadless', >> 'if': { 'all': ['CONFIG_OPENGL', 'CONFIG_GBM'] } }, >> diff --git a/qemu-options.hx b/qemu-options.hx >> index 7d47510947..5214457676 100644 >> --- a/qemu-options.hx >> +++ b/qemu-options.hx >> @@ -1869,6 +1869,9 @@ DEF("display", HAS_ARG, QEMU_OPTION_display, >> #if defined(CONFIG_DBUS_DISPLAY) >> "-display dbus[,addr=<dbusaddr>]\n" >> " [,gl=on|core|es|off][,rendernode=<file>]\n" >> +#endif >> +#if defined(CONFIG_COCOA) >> + "-display cocoa[,show-cursor=on|off][,left-command-key=on|off]\n" >> #endif >> "-display none\n" >> " select display backend type\n" >> @@ -1956,6 +1959,15 @@ SRST >> ``charset=CP850`` for IBM CP850 encoding. The default is >> ``CP437``. >> + ``cocoa`` >> + Display video output in a Cocoa window. Mac only. This interface >> + provides drop-down menus and other UI elements to configure and >> + control the VM during runtime. Valid parameters are: >> + >> + ``show-cursor=on|off`` : Force showing the mouse cursor >> + >> + ``left-command-key=on|off`` : Disable forwarding left command key to host >> + >> ``egl-headless[,rendernode=<file>]`` >> Offload all OpenGL operations to a local DRI device. For any >> graphical display, this display needs to be paired with either >> diff --git a/ui/cocoa.m b/ui/cocoa.m >> index 69745c483b..10e492538a 100644 >> --- a/ui/cocoa.m >> +++ b/ui/cocoa.m >> @@ -95,6 +95,8 @@ static DisplayChangeListener dcl = { >> }; >> static int last_buttons; >> static int cursor_hide = 1; >> +static bool cursor_visible = 1; >> +static int left_command_key_enabled = 1; >> static int gArgc; >> static char **gArgv; >> @@ -411,18 +413,18 @@ QemuCocoaView *cocoaView; >> - (void) hideCursor >> { >> - if (!cursor_hide) { >> - return; >> + if (cursor_hide && cursor_visible) { >> + cursor_visible = 0; >> + [NSCursor hide]; >> } >> - [NSCursor hide]; >> } >> - (void) unhideCursor >> { >> - if (!cursor_hide) { >> - return; >> + if (cursor_hide && !cursor_visible) { >> + cursor_visible = 1; >> + [NSCursor unhide]; >> } >> - [NSCursor unhide]; >> } >> - (void) drawRect:(NSRect) rect >> @@ -831,10 +833,14 @@ QemuCocoaView *cocoaView; >> } >> break; >> - /* Don't pass command key changes to guest unless mouse is grabbed */ >> + /* >> + Don't pass command key changes to guest unless mouse is grabbed >> + or the key is explicitly disabled using the left-command-key option >> + */ >> case kVK_Command: >> if (isMouseGrabbed && >> - !!(modifiers & NSEventModifierFlagCommand)) { >> + !!(modifiers & NSEventModifierFlagCommand) && >> + left_command_key_enabled) { >> [self toggleKey:Q_KEY_CODE_META_L]; >> } >> break; >> @@ -923,10 +929,16 @@ QemuCocoaView *cocoaView; >> case NSEventTypeLeftMouseDown: >> buttons |= MOUSE_EVENT_LBUTTON; >> mouse_event = true; >> + if (isFullscreen) { >> + [self hideCursor]; >> + } >> break; >> case NSEventTypeRightMouseDown: >> buttons |= MOUSE_EVENT_RBUTTON; >> mouse_event = true; >> + if (isFullscreen) { >> + [self hideCursor]; >> + } >> break; >> case NSEventTypeOtherMouseDown: >> buttons |= MOUSE_EVENT_MBUTTON; >> @@ -2050,10 +2062,15 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts) >> [(QemuCocoaAppController *)[[NSApplication sharedApplication] delegate] toggleFullScreen: nil]; >> }); >> } >> + >> if (opts->has_show_cursor && opts->show_cursor) { >> cursor_hide = 0; >> } >> + if (opts->u.cocoa.has_left_command_key && !opts->u.cocoa.left_command_key) { >> + left_command_key_enabled = 0; >> + } >> + >> // register vga output callbacks >> register_displaychangelistener(&dcl); >> > > You also forgot about the sign off. git commit with a -s switch will append the appropriate sign off message. > > All patches need to be signed off so we know you are okay with them going upstream. > Good point! Will make sure that’s in on the next set of patches.
diff --git a/qapi/ui.json b/qapi/ui.json index 2b4371da37..764480e145 100644 --- a/qapi/ui.json +++ b/qapi/ui.json @@ -1107,6 +1107,22 @@ 'data' : { '*grab-on-hover' : 'bool', '*zoom-to-fit' : 'bool' } } +## +# @DisplayCocoa: +# +# Cocoa display options. +# +# @left-command-key: Enable/disable forwarding of left command key to +# guest. Allows command-tab window switching on the +# host without sending this key to the guest when +# "off". Defaults to "on" +# +# Since: 6.2.50 +# +## +{ 'struct' : 'DisplayCocoa', + 'data' : { '*left-command-key' : 'bool' } } + ## # @DisplayEGLHeadless: # @@ -1254,6 +1270,7 @@ 'discriminator' : 'type', 'data' : { 'gtk': { 'type': 'DisplayGTK', 'if': 'CONFIG_GTK' }, + 'cocoa': { 'type': 'DisplayCocoa', 'if': 'CONFIG_COCOA' }, 'curses': { 'type': 'DisplayCurses', 'if': 'CONFIG_CURSES' }, 'egl-headless': { 'type': 'DisplayEGLHeadless', 'if': { 'all': ['CONFIG_OPENGL', 'CONFIG_GBM'] } }, diff --git a/qemu-options.hx b/qemu-options.hx index 7d47510947..5214457676 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -1869,6 +1869,9 @@ DEF("display", HAS_ARG, QEMU_OPTION_display, #if defined(CONFIG_DBUS_DISPLAY) "-display dbus[,addr=<dbusaddr>]\n" " [,gl=on|core|es|off][,rendernode=<file>]\n" +#endif +#if defined(CONFIG_COCOA) + "-display cocoa[,show-cursor=on|off][,left-command-key=on|off]\n" #endif "-display none\n" " select display backend type\n" @@ -1956,6 +1959,15 @@ SRST ``charset=CP850`` for IBM CP850 encoding. The default is ``CP437``. + ``cocoa`` + Display video output in a Cocoa window. Mac only. This interface + provides drop-down menus and other UI elements to configure and + control the VM during runtime. Valid parameters are: + + ``show-cursor=on|off`` : Force showing the mouse cursor + + ``left-command-key=on|off`` : Disable forwarding left command key to host + ``egl-headless[,rendernode=<file>]`` Offload all OpenGL operations to a local DRI device. For any graphical display, this display needs to be paired with either diff --git a/ui/cocoa.m b/ui/cocoa.m index 69745c483b..10e492538a 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -95,6 +95,8 @@ static DisplayChangeListener dcl = { }; static int last_buttons; static int cursor_hide = 1; +static bool cursor_visible = 1; +static int left_command_key_enabled = 1; static int gArgc; static char **gArgv; @@ -411,18 +413,18 @@ QemuCocoaView *cocoaView; - (void) hideCursor { - if (!cursor_hide) { - return; + if (cursor_hide && cursor_visible) { + cursor_visible = 0; + [NSCursor hide]; } - [NSCursor hide]; } - (void) unhideCursor { - if (!cursor_hide) { - return; + if (cursor_hide && !cursor_visible) { + cursor_visible = 1; + [NSCursor unhide]; } - [NSCursor unhide]; } - (void) drawRect:(NSRect) rect @@ -831,10 +833,14 @@ QemuCocoaView *cocoaView; } break; - /* Don't pass command key changes to guest unless mouse is grabbed */ + /* + Don't pass command key changes to guest unless mouse is grabbed + or the key is explicitly disabled using the left-command-key option + */ case kVK_Command: if (isMouseGrabbed && - !!(modifiers & NSEventModifierFlagCommand)) { + !!(modifiers & NSEventModifierFlagCommand) && + left_command_key_enabled) { [self toggleKey:Q_KEY_CODE_META_L]; } break; @@ -923,10 +929,16 @@ QemuCocoaView *cocoaView; case NSEventTypeLeftMouseDown: buttons |= MOUSE_EVENT_LBUTTON; mouse_event = true; + if (isFullscreen) { + [self hideCursor]; + } break; case NSEventTypeRightMouseDown: buttons |= MOUSE_EVENT_RBUTTON; mouse_event = true; + if (isFullscreen) { + [self hideCursor]; + } break; case NSEventTypeOtherMouseDown: buttons |= MOUSE_EVENT_MBUTTON; @@ -2050,10 +2062,15 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts) [(QemuCocoaAppController *)[[NSApplication sharedApplication] delegate] toggleFullScreen: nil]; }); } + if (opts->has_show_cursor && opts->show_cursor) { cursor_hide = 0; } + if (opts->u.cocoa.has_left_command_key && !opts->u.cocoa.left_command_key) { + left_command_key_enabled = 0; + } + // register vga output callbacks register_displaychangelistener(&dcl);