Skip to content

Commit 34fe4e3

Browse files
POS-22:Invoking prlctl send-key-event with PRL_KEY codes (#127)
-Introduced prlKeycode2ScanCode lookup table -Conversion logic scancode to PRL_KEY Co-authored-by: Carlos Lapao <cjlapao@gmail.com>
1 parent 70d4778 commit 34fe4e3

File tree

2 files changed

+295
-26
lines changed

2 files changed

+295
-26
lines changed

builder/parallels/common/driver_9.go

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -23,48 +23,42 @@ import (
2323
"github.com/hashicorp/packer-plugin-sdk/tmp"
2424
)
2525

26-
// Struct to format Scancodes in JSON
27-
type ScanCodes struct {
28-
Scancode int64 `json:"scancode"`
29-
Event string `json:"event"`
30-
Delay int `json:"delay"`
26+
// Struct to format keyCodes in JSON
27+
type keyCodes struct {
28+
KeyCode int `json:"key"`
29+
Event string `json:"event"`
30+
Delay int `json:"delay"`
3131
}
3232

3333
// sending scancodes to VM via prlctl send-key-event CMD
3434
func (d *Parallels9Driver) sendJsonScancodes(vmName string, inputScanCodes []string) error {
35-
scancodeData := []ScanCodes{}
3635

3736
log.Println("scancodes received for JSON encoding ", inputScanCodes)
3837
delay := 100
39-
for i := 0; i < len(inputScanCodes); i++ {
40-
key1, convErr_ := strconv.ParseInt(inputScanCodes[i], 16, 64)
41-
if convErr_ != nil {
42-
log.Println(convErr_, "conversion error for %s", inputScanCodes[i])
43-
return convErr_
44-
}
45-
38+
var inputHexScanCodes []uint
39+
for _, hexStr := range inputScanCodes {
40+
var val uint
41+
fmt.Sscanf(hexStr, "%X", &val) // Convert hex string to uint
42+
inputHexScanCodes = append(inputHexScanCodes, val)
43+
}
44+
keyCodeData := []keyCodes{}
45+
for i := 0; i < len(inputHexScanCodes); i++ {
46+
key1 := inputHexScanCodes[i]
4647
if key1 == 224 {
47-
key2, convErr_ := strconv.ParseInt(inputScanCodes[i+1], 16, 64)
48+
key2 := inputHexScanCodes[i+1]
4849
i = i + 1
49-
if convErr_ != nil {
50-
log.Println(convErr_, "conversion error for %s", inputScanCodes[i])
51-
return convErr_
52-
}
5350
if key2 < 128 {
54-
scancodeData = append(scancodeData, ScanCodes{Scancode: key1, Event: "press", Delay: delay})
55-
scancodeData = append(scancodeData, ScanCodes{Scancode: key2, Event: "press", Delay: delay})
51+
keyCodeData = append(keyCodeData, keyCodes{KeyCode: getKeycodeFromScanCode([]uint{key1, key2}), Event: "press", Delay: delay})
5652
} else {
57-
scancodeData = append(scancodeData, ScanCodes{Scancode: key1, Event: "release", Delay: delay})
58-
scancodeData = append(scancodeData, ScanCodes{Scancode: key2 - 128, Event: "release", Delay: delay})
53+
keyCodeData = append(keyCodeData, keyCodes{KeyCode: getKeycodeFromScanCode([]uint{key1, key2 - 128}), Event: "release", Delay: delay})
5954
}
6055
} else if key1 < 128 {
61-
scancodeData = append(scancodeData, ScanCodes{Scancode: key1, Event: "press", Delay: delay})
56+
keyCodeData = append(keyCodeData, keyCodes{KeyCode: getKeycodeFromScanCode([]uint{key1}), Event: "press", Delay: delay})
6257
} else {
63-
scancodeData = append(scancodeData, ScanCodes{Scancode: key1 - 128, Event: "release", Delay: delay})
58+
keyCodeData = append(keyCodeData, keyCodes{KeyCode: getKeycodeFromScanCode([]uint{key1 - 128}), Event: "release", Delay: delay})
6459
}
6560
}
66-
67-
jsonFormat, err := json.MarshalIndent(scancodeData, "", "\t")
61+
jsonFormat, err := json.MarshalIndent(keyCodeData, "", "\t")
6862
if err != nil {
6963
log.Println(err)
7064
return err

0 commit comments

Comments
 (0)