Skip to content

Commit f86b595

Browse files
authored
Merge pull request #146 from Code-Hex/add/mac-keyboard
added VZMacKeyboardConfiguration
2 parents 70933c2 + a924e22 commit f86b595

File tree

3 files changed

+72
-0
lines changed

3 files changed

+72
-0
lines changed

keyboard_arm64.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
//go:build darwin && arm64
2+
// +build darwin,arm64
3+
4+
package vz
5+
6+
/*
7+
#cgo darwin CFLAGS: -mmacosx-version-min=11 -x objective-c -fno-objc-arc
8+
#cgo darwin LDFLAGS: -lobjc -framework Foundation -framework Virtualization
9+
# include "virtualization_14_arm64.h"
10+
*/
11+
import "C"
12+
import (
13+
"github.com/Code-Hex/vz/v3/internal/objc"
14+
)
15+
16+
// MacKeyboardConfiguration is a struct that defines the configuration
17+
// for a Mac keyboard.
18+
//
19+
// This device is only recognized by virtual machines running macOS 14.0 and later.
20+
// In order to support both macOS 13.0 and earlier guests, VirtualMachineConfiguration.keyboards
21+
// can be set to an array containing both a MacKeyboardConfiguration and
22+
// a USBKeyboardConfiguration object. macOS 14.0 and later guests will use the Mac keyboard device,
23+
// while earlier versions of macOS will use the USB keyboard device.
24+
//
25+
// see: https://developer.apple.com/documentation/virtualization/vzmackeyboardconfiguration?language=objc
26+
type MacKeyboardConfiguration struct {
27+
*pointer
28+
29+
*baseKeyboardConfiguration
30+
}
31+
32+
var _ KeyboardConfiguration = (*MacKeyboardConfiguration)(nil)
33+
34+
// NewMacKeyboardConfiguration creates a new MacKeyboardConfiguration.
35+
//
36+
// This is only supported on macOS 14 and newer, error will
37+
// be returned on older versions.
38+
func NewMacKeyboardConfiguration() (*MacKeyboardConfiguration, error) {
39+
if err := macOSAvailable(14); err != nil {
40+
return nil, err
41+
}
42+
config := &MacKeyboardConfiguration{
43+
pointer: objc.NewPointer(
44+
C.newVZMacKeyboardConfiguration(),
45+
),
46+
}
47+
objc.SetFinalizer(config, func(self *MacKeyboardConfiguration) {
48+
objc.Release(self)
49+
})
50+
return config, nil
51+
}

virtualization_14_arm64.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ void *newVZLinuxRosettaUnixSocketCachingOptionsWithPath(const char *path, void *
2121
uint32_t maximumPathLengthVZLinuxRosettaUnixSocketCachingOptions();
2222
uint32_t maximumNameLengthVZLinuxRosettaAbstractSocketCachingOptions();
2323
void setOptionsVZLinuxRosettaDirectoryShare(void *rosetta, void *cachingOptions);
24+
void *newVZMacKeyboardConfiguration();
2425
#endif

virtualization_14_arm64.m

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,3 +136,23 @@ void setOptionsVZLinuxRosettaDirectoryShare(void *rosetta, void *cachingOptions)
136136
#endif
137137
RAISE_UNSUPPORTED_MACOS_EXCEPTION();
138138
}
139+
140+
/*!
141+
@abstract Configuration for a Mac keyboard.
142+
@discussion
143+
This device can be used by VZVirtualMachineView to send keyboard events to the virtual machine.
144+
This keyboard supports Apple-specific features such as the globe key.
145+
Note: this device is only recognized by virtual machines running macOS 13.0 and later. In order to support both macOS 13.0 and earlier
146+
guests, VZVirtualMachineConfiguration.keyboards can be set to an array containing both a VZMacKeyboardConfiguration and
147+
a VZUSBKeyboardConfiguration object. macOS 13.0 and later guests will use the Mac keyboard device,
148+
while earlier versions of macOS will use the USB keyboard device.
149+
*/
150+
void *newVZMacKeyboardConfiguration()
151+
{
152+
#ifdef INCLUDE_TARGET_OSX_14
153+
if (@available(macOS 14, *)) {
154+
return [[VZMacTrackpadConfiguration alloc] init];
155+
}
156+
#endif
157+
RAISE_UNSUPPORTED_MACOS_EXCEPTION();
158+
}

0 commit comments

Comments
 (0)