From b3883f3dd02be217ab33a65cbd1e9b14dbd93c02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20R=C3=B3bert?= Date: Sun, 7 Sep 2025 17:11:33 +0200 Subject: [PATCH 01/10] feat: --print-hardware-configuration command line argument --- packages/uhk-agent/src/electron-main.ts | 20 +++++++++++++++++-- packages/uhk-agent/src/util/command-line.ts | 6 ++++++ packages/uhk-agent/src/util/index.ts | 1 + .../src/util/print-hardware-configuration.ts | 13 ++++++++++++ .../src/models/command-line-args.ts | 6 +++--- packages/uhk-usb/src/uhk-operations.ts | 8 ++++++++ 6 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 packages/uhk-agent/src/util/print-hardware-configuration.ts diff --git a/packages/uhk-agent/src/electron-main.ts b/packages/uhk-agent/src/electron-main.ts index b7dcd62fc18..5bb088dc1d8 100644 --- a/packages/uhk-agent/src/electron-main.ts +++ b/packages/uhk-agent/src/electron-main.ts @@ -23,9 +23,16 @@ import { SudoService } from './services/sudo.service'; import { SmartMacroDocService } from './services/smart-macro-doc.service'; import isDev from 'electron-is-dev'; import { setMenu } from './electron-menu'; -import { printUsbDevices } from './util'; import { loadWindowState, saveWindowState } from './util/window'; -import { getWindowBackgroundColor, options, cliUsage, reenumerateAndExit } from './util'; +import { + getWindowBackgroundColor, + options, + cliUsage, + printUsbDevices, + printHardwareConfiguration, + PrintHardwareConfigurationOptions, + reenumerateAndExit, +} from './util'; if (options.help) { console.log(cliUsage); @@ -187,6 +194,15 @@ if (isSecondInstance) { logger.misc('Reenumeration process finished with error. Please unplug and plug your UHK.'); process.exit(-1); }); +} else if (options['print-hardware-configuration']) { + printHardwareConfiguration({ logger, uhkOperations }) + .then(() => { + process.exit(0); + }) + .catch(error => { + logger.error(error.message); + process.exit(-1); + }); } else { // This method will be called when Electron has finished diff --git a/packages/uhk-agent/src/util/command-line.ts b/packages/uhk-agent/src/util/command-line.ts index 57aa5bf0a6a..e7c739682ac 100644 --- a/packages/uhk-agent/src/util/command-line.ts +++ b/packages/uhk-agent/src/util/command-line.ts @@ -13,6 +13,7 @@ const optionDefinitions: commandLineArgs.OptionDefinition[] = [ { name: 'pid', type: Number }, { name: 'no-report-id', type: Boolean }, { name: 'preserve-udev-rules', type: Boolean }, + { name: 'print-hardware-configuration', type: Boolean }, { name: 'print-usb-devices', type: Boolean }, { name: 'reenumerate-and-exit', type: String }, { name: 'report-id', type: Number }, @@ -74,6 +75,11 @@ const sections: commandLineUsage.Section[] = [ description: 'Don\'t force udev rule update', type: Boolean }, + { + name: 'print-hardware-configuration', + description: 'Print hardware configuration to the standard output and exit.', + type: Boolean + }, { name: 'print-usb-devices', description: 'Print usb devices to the standard output and exit.', diff --git a/packages/uhk-agent/src/util/index.ts b/packages/uhk-agent/src/util/index.ts index 143ad55eeca..4160f339e97 100644 --- a/packages/uhk-agent/src/util/index.ts +++ b/packages/uhk-agent/src/util/index.ts @@ -13,6 +13,7 @@ export * from './get-window-background-color'; export * from './load-user-config-from-binary-file'; export * from './load-user-config-history-async'; export * from './make-folder-writeable-to-user-on-linux'; +export * from './print-hardware-configuration'; export * from './print-usb-devices'; export * from './reenumerate-and-exit'; export * from './save-extract-firmware'; diff --git a/packages/uhk-agent/src/util/print-hardware-configuration.ts b/packages/uhk-agent/src/util/print-hardware-configuration.ts new file mode 100644 index 00000000000..098367e0fa8 --- /dev/null +++ b/packages/uhk-agent/src/util/print-hardware-configuration.ts @@ -0,0 +1,13 @@ +import { UhkOperations } from 'uhk-usb'; + +import { ElectronLogService } from '../services/logger.service'; + +export interface PrintHardwareConfigurationOptions { + logger: ElectronLogService; + uhkOperations: UhkOperations; +} + +export async function printHardwareConfiguration({logger, uhkOperations}: PrintHardwareConfigurationOptions): Promise { + const hardwareConfiguration = await uhkOperations.getHardwareConfiguration() + logger.misc(hardwareConfiguration.toJsonObject()); +} diff --git a/packages/uhk-common/src/models/command-line-args.ts b/packages/uhk-common/src/models/command-line-args.ts index 87030ccf076..cfe23dba602 100644 --- a/packages/uhk-common/src/models/command-line-args.ts +++ b/packages/uhk-common/src/models/command-line-args.ts @@ -57,9 +57,9 @@ export interface CommandLineArgs extends DeviceIdentifier { * Agent not force the udev rule update */ 'preserve-udev-rules'?: boolean; - /** - * Agent not force the udev rule update - */ + + 'print-hardware-configuration'?: boolean; + 'print-usb-devices'?: boolean; /** * Reenumerate as the bootloader or BusPal, wait for the specified timeout and exit. diff --git a/packages/uhk-usb/src/uhk-operations.ts b/packages/uhk-usb/src/uhk-operations.ts index f036a699a63..f02d7798fd7 100644 --- a/packages/uhk-usb/src/uhk-operations.ts +++ b/packages/uhk-usb/src/uhk-operations.ts @@ -647,6 +647,14 @@ export class UhkOperations { }; } + public async getHardwareConfiguration(): Promise { + const buffer = await this.loadConfiguration(ConfigBufferId.hardwareConfig); + const hardwareConfiguration = new HardwareConfiguration(); + hardwareConfiguration.fromBinary(UhkBuffer.fromArray([...buffer])); + + return hardwareConfiguration; + } + public async getUptime(): Promise { this.logService.usbOps('[DeviceOperation] USB[T]: get uptime'); const buffer = Buffer.from([UsbCommand.GetProperty, DevicePropertyIds.Uptime]); From 4ab1ecb19c0a8cc29205a01f1ee366eb716e39cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20R=C3=B3bert?= Date: Sun, 7 Sep 2025 17:38:52 +0200 Subject: [PATCH 02/10] feat: --write-hardware-configuration command line argument --- packages/uhk-agent/src/electron-main.ts | 15 ++++---- packages/uhk-agent/src/util/command-line.ts | 8 +++- packages/uhk-agent/src/util/index.ts | 1 + .../src/util/print-hardware-configuration.ts | 12 +++++- .../src/util/write-hardware-configuration.ts | 37 +++++++++++++++++++ .../src/models/command-line-args.ts | 6 +++ 6 files changed, 68 insertions(+), 11 deletions(-) create mode 100644 packages/uhk-agent/src/util/write-hardware-configuration.ts diff --git a/packages/uhk-agent/src/electron-main.ts b/packages/uhk-agent/src/electron-main.ts index 5bb088dc1d8..ca649942e02 100644 --- a/packages/uhk-agent/src/electron-main.ts +++ b/packages/uhk-agent/src/electron-main.ts @@ -30,8 +30,8 @@ import { cliUsage, printUsbDevices, printHardwareConfiguration, - PrintHardwareConfigurationOptions, reenumerateAndExit, + writeHardwareConfiguration, } from './util'; if (options.help) { @@ -196,13 +196,12 @@ if (isSecondInstance) { }); } else if (options['print-hardware-configuration']) { printHardwareConfiguration({ logger, uhkOperations }) - .then(() => { - process.exit(0); - }) - .catch(error => { - logger.error(error.message); - process.exit(-1); - }); +} else if (options['write-hardware-configuration']) { + writeHardwareConfiguration({ + logger, + uhkOperations, + commandLineArgs: options, + }) } else { // This method will be called when Electron has finished diff --git a/packages/uhk-agent/src/util/command-line.ts b/packages/uhk-agent/src/util/command-line.ts index e7c739682ac..ed0a90d4510 100644 --- a/packages/uhk-agent/src/util/command-line.ts +++ b/packages/uhk-agent/src/util/command-line.ts @@ -22,6 +22,7 @@ const optionDefinitions: commandLineArgs.OptionDefinition[] = [ { name: 'usb-interface', type: Number }, { name: 'usb-non-blocking', type: Boolean }, { name: 'vid', type: Number }, + { name: 'write-hardware-configuration', type: String }, ]; export const options: CommandLineArgs = commandLineArgs(optionDefinitions, { partial: true }) as CommandLineArgs; @@ -120,7 +121,12 @@ const sections: commandLineUsage.Section[] = [ name: 'vid', description: 'Use the specified USB vendor id. If you set it you have to set the pid too.', type: Number - } + }, + { + name: 'write-hardware-configuration', + description: 'Overwrite/reset the current hardware configuration and exit.', + typeLabel: 'ansi | iso' + }, ] } ]; diff --git a/packages/uhk-agent/src/util/index.ts b/packages/uhk-agent/src/util/index.ts index 4160f339e97..166e318ceb0 100644 --- a/packages/uhk-agent/src/util/index.ts +++ b/packages/uhk-agent/src/util/index.ts @@ -18,3 +18,4 @@ export * from './print-usb-devices'; export * from './reenumerate-and-exit'; export * from './save-extract-firmware'; export * from './save-user-config-history-async'; +export * from './write-hardware-configuration'; diff --git a/packages/uhk-agent/src/util/print-hardware-configuration.ts b/packages/uhk-agent/src/util/print-hardware-configuration.ts index 098367e0fa8..c48e367ab11 100644 --- a/packages/uhk-agent/src/util/print-hardware-configuration.ts +++ b/packages/uhk-agent/src/util/print-hardware-configuration.ts @@ -1,3 +1,4 @@ +import process from 'node:process'; import { UhkOperations } from 'uhk-usb'; import { ElectronLogService } from '../services/logger.service'; @@ -8,6 +9,13 @@ export interface PrintHardwareConfigurationOptions { } export async function printHardwareConfiguration({logger, uhkOperations}: PrintHardwareConfigurationOptions): Promise { - const hardwareConfiguration = await uhkOperations.getHardwareConfiguration() - logger.misc(hardwareConfiguration.toJsonObject()); + try { + const hardwareConfiguration = await uhkOperations.getHardwareConfiguration() + logger.misc(hardwareConfiguration.toJsonObject()); + process.exit(0); + } + catch (error) { + logger.error(error.message); + process.exit(-1); + } } diff --git a/packages/uhk-agent/src/util/write-hardware-configuration.ts b/packages/uhk-agent/src/util/write-hardware-configuration.ts new file mode 100644 index 00000000000..e1b411eaad3 --- /dev/null +++ b/packages/uhk-agent/src/util/write-hardware-configuration.ts @@ -0,0 +1,37 @@ +import process from 'node:process'; +import { CommandLineArgs } from 'uhk-common'; +import { + getCurrentUhkDeviceProduct, + UhkOperations, +} from 'uhk-usb'; + +import { ElectronLogService } from '../services/logger.service'; + +export interface WriteHardwareConfigurationOptions { + commandLineArgs: CommandLineArgs; + logger: ElectronLogService; + uhkOperations: UhkOperations; +} + +export async function writeHardwareConfiguration(options: WriteHardwareConfigurationOptions):Promise { + const layout = options.commandLineArgs['write-hardware-configuration']; + options.logger.misc(`[writeHardwareConfiguration] Command line argument: ${layout}`); + + if (!['ansi', 'iso'].includes(layout)) { + options.logger.misc('Invalid layout. Layout should be either iso or ansi'); + process.exit(-1); + } + + try { + const device = await getCurrentUhkDeviceProduct(options.commandLineArgs); + + await options.uhkOperations.saveHardwareConfiguration(layout === 'iso', device.id) + + options.logger.misc(`[writeHardwareConfiguration] finished successfully.`); + process.exit(0); + } catch (error) { + options.logger.error(error.message); + process.exit(-1); + } + +} diff --git a/packages/uhk-common/src/models/command-line-args.ts b/packages/uhk-common/src/models/command-line-args.ts index cfe23dba602..a5689419fc9 100644 --- a/packages/uhk-common/src/models/command-line-args.ts +++ b/packages/uhk-common/src/models/command-line-args.ts @@ -78,4 +78,10 @@ export interface CommandLineArgs extends DeviceIdentifier { * Use USB non-blocking communication */ 'usb-non-blocking'?: boolean; + + /** + * Overwrite/reset the current hardware configuration and exit. + * The argument is the keyboard layout {ansi|iso} + */ + 'write-hardware-configuration'?: string; } From da7b68fc5bf074bb8d545bbd49b2dd927346dd9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20R=C3=B3bert?= Date: Sun, 7 Sep 2025 17:46:02 +0200 Subject: [PATCH 03/10] refactor: rename RestoreConfigurationComponent => RestoreUserConfigurationComponent --- .../uhk-web/src/app/components/device/device.routes.ts | 4 ++-- packages/uhk-web/src/app/components/device/index.ts | 2 +- .../restore-user-configuration.component.html} | 0 .../restore-user-configuration.component.scss} | 0 .../restore-user-configuration.component.ts} | 8 ++++---- packages/uhk-web/src/app/shared.module.ts | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) rename packages/uhk-web/src/app/components/device/{restore-configuration/restore-configuration.component.html => restore-user-configuration/restore-user-configuration.component.html} (100%) rename packages/uhk-web/src/app/components/device/{restore-configuration/restore-configuration.component.scss => restore-user-configuration/restore-user-configuration.component.scss} (100%) rename packages/uhk-web/src/app/components/device/{restore-configuration/restore-configuration.component.ts => restore-user-configuration/restore-user-configuration.component.ts} (86%) diff --git a/packages/uhk-web/src/app/components/device/device.routes.ts b/packages/uhk-web/src/app/components/device/device.routes.ts index c2afa69ab5f..0668ce3db13 100644 --- a/packages/uhk-web/src/app/components/device/device.routes.ts +++ b/packages/uhk-web/src/app/components/device/device.routes.ts @@ -6,7 +6,7 @@ import { DeviceConfigurationComponent } from './configuration/device-configurati import { DeviceFirmwareComponent } from './firmware/device-firmware.component'; import { MouseSpeedComponent } from './mouse-speed/mouse-speed.component'; import { LEDSettingsComponent } from './led-settings/led-settings.component'; -import { RestoreConfigurationComponent } from './restore-configuration/restore-configuration.component'; +import { RestoreUserConfigurationComponent } from './restore-user-configuration/restore-user-configuration.component'; import { HostConnectionsComponent } from './host-connections/host-connections.component'; import { TypingBehaviorPage } from './typing-behavior-page/typing-behavior-page.component'; @@ -45,7 +45,7 @@ export const deviceRoutes: Routes = [ }, { path: 'restore-user-configuration', - component: RestoreConfigurationComponent + component: RestoreUserConfigurationComponent }, { path: 'host-connections', diff --git a/packages/uhk-web/src/app/components/device/index.ts b/packages/uhk-web/src/app/components/device/index.ts index 509c1c1fa85..cc1081723f4 100644 --- a/packages/uhk-web/src/app/components/device/index.ts +++ b/packages/uhk-web/src/app/components/device/index.ts @@ -5,7 +5,7 @@ export * from './firmware/device-firmware.component'; export * from './mouse-speed/mouse-speed.component'; export * from './led-settings/functional-backlight-color.component'; export * from './led-settings/led-settings.component'; -export * from './restore-configuration/restore-configuration.component'; +export * from './restore-user-configuration/restore-user-configuration.component'; export * from './recovery-mode/recovery-mode.component'; export * from './host-connections/host-connections.component'; export * from './typing-behavior-page/typing-behavior-page.component'; diff --git a/packages/uhk-web/src/app/components/device/restore-configuration/restore-configuration.component.html b/packages/uhk-web/src/app/components/device/restore-user-configuration/restore-user-configuration.component.html similarity index 100% rename from packages/uhk-web/src/app/components/device/restore-configuration/restore-configuration.component.html rename to packages/uhk-web/src/app/components/device/restore-user-configuration/restore-user-configuration.component.html diff --git a/packages/uhk-web/src/app/components/device/restore-configuration/restore-configuration.component.scss b/packages/uhk-web/src/app/components/device/restore-user-configuration/restore-user-configuration.component.scss similarity index 100% rename from packages/uhk-web/src/app/components/device/restore-configuration/restore-configuration.component.scss rename to packages/uhk-web/src/app/components/device/restore-user-configuration/restore-user-configuration.component.scss diff --git a/packages/uhk-web/src/app/components/device/restore-configuration/restore-configuration.component.ts b/packages/uhk-web/src/app/components/device/restore-user-configuration/restore-user-configuration.component.ts similarity index 86% rename from packages/uhk-web/src/app/components/device/restore-configuration/restore-configuration.component.ts rename to packages/uhk-web/src/app/components/device/restore-user-configuration/restore-user-configuration.component.ts index d3384a8ae4d..f921cca6da6 100644 --- a/packages/uhk-web/src/app/components/device/restore-configuration/restore-configuration.component.ts +++ b/packages/uhk-web/src/app/components/device/restore-user-configuration/restore-user-configuration.component.ts @@ -9,15 +9,15 @@ import { ResetUserConfigurationAction, RestoreUserConfigurationFromBackupAction import { RestoreConfigurationState } from '../../../models/restore-configuration-state'; @Component({ - selector: 'restore-configuration', - templateUrl: './restore-configuration.component.html', - styleUrls: ['./restore-configuration.component.scss'], + selector: 'restore-user-configuration', + templateUrl: './restore-user-configuration.component.html', + styleUrls: ['./restore-user-configuration.component.scss'], standalone: false, host: { 'class': 'container-fluid' } }) -export class RestoreConfigurationComponent implements OnInit, OnDestroy { +export class RestoreUserConfigurationComponent implements OnInit, OnDestroy { backupUserConfigurationInfo = BackupUserConfigurationInfo; state: RestoreConfigurationState; faExclamationCircle = faExclamationCircle; diff --git a/packages/uhk-web/src/app/shared.module.ts b/packages/uhk-web/src/app/shared.module.ts index cdaca82312a..b33893d1009 100644 --- a/packages/uhk-web/src/app/shared.module.ts +++ b/packages/uhk-web/src/app/shared.module.ts @@ -33,7 +33,7 @@ import { FunctionalBacklightColorComponent, MouseSpeedComponent, LEDSettingsComponent, - RestoreConfigurationComponent, + RestoreUserConfigurationComponent, RecoveryModeComponent, TypingBehaviorPage } from './components/device'; @@ -274,7 +274,7 @@ import appInitFactory from './services/app-init-factory'; EditableTextComponent, Autofocus, NgSelectMaxHeight, - RestoreConfigurationComponent, + RestoreUserConfigurationComponent, RecoveryModeComponent, FileUploadComponent, AutoGrowInputComponent, From 22f5fd499a74c95c0a543fb2b92b66ef326fa8b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20R=C3=B3bert?= Date: Sun, 7 Sep 2025 18:48:04 +0200 Subject: [PATCH 04/10] refactor: reorder electron main if --- packages/uhk-agent/src/electron-main.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/uhk-agent/src/electron-main.ts b/packages/uhk-agent/src/electron-main.ts index ca649942e02..ba11f54ed6d 100644 --- a/packages/uhk-agent/src/electron-main.ts +++ b/packages/uhk-agent/src/electron-main.ts @@ -169,6 +169,8 @@ async function createWindow() { if (isSecondInstance) { app.quit(); +} else if (options['print-hardware-configuration']) { + printHardwareConfiguration({ logger, uhkOperations }) } else if (options['print-usb-devices']) { printUsbDevices() .then(() => { @@ -194,8 +196,6 @@ if (isSecondInstance) { logger.misc('Reenumeration process finished with error. Please unplug and plug your UHK.'); process.exit(-1); }); -} else if (options['print-hardware-configuration']) { - printHardwareConfiguration({ logger, uhkOperations }) } else if (options['write-hardware-configuration']) { writeHardwareConfiguration({ logger, From 7305d9ae1558e26275ea0bd6fb67d5390ae57b7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20R=C3=B3bert?= Date: Mon, 8 Sep 2025 17:24:29 +0200 Subject: [PATCH 05/10] feat: --print-status-buffer command line argument --- packages/uhk-agent/src/electron-main.ts | 3 +++ packages/uhk-agent/src/util/command-line.ts | 6 ++++++ packages/uhk-agent/src/util/index.ts | 1 + .../uhk-agent/src/util/print-status-buffer.ts | 21 +++++++++++++++++++ .../src/models/command-line-args.ts | 2 ++ 5 files changed, 33 insertions(+) create mode 100644 packages/uhk-agent/src/util/print-status-buffer.ts diff --git a/packages/uhk-agent/src/electron-main.ts b/packages/uhk-agent/src/electron-main.ts index ba11f54ed6d..041295b4631 100644 --- a/packages/uhk-agent/src/electron-main.ts +++ b/packages/uhk-agent/src/electron-main.ts @@ -28,6 +28,7 @@ import { getWindowBackgroundColor, options, cliUsage, + printStatusBuffer, printUsbDevices, printHardwareConfiguration, reenumerateAndExit, @@ -171,6 +172,8 @@ if (isSecondInstance) { app.quit(); } else if (options['print-hardware-configuration']) { printHardwareConfiguration({ logger, uhkOperations }) +} else if (options['print-status-buffer']) { + printStatusBuffer({ logger, uhkOperations }) } else if (options['print-usb-devices']) { printUsbDevices() .then(() => { diff --git a/packages/uhk-agent/src/util/command-line.ts b/packages/uhk-agent/src/util/command-line.ts index ed0a90d4510..c9536625d8a 100644 --- a/packages/uhk-agent/src/util/command-line.ts +++ b/packages/uhk-agent/src/util/command-line.ts @@ -14,6 +14,7 @@ const optionDefinitions: commandLineArgs.OptionDefinition[] = [ { name: 'no-report-id', type: Boolean }, { name: 'preserve-udev-rules', type: Boolean }, { name: 'print-hardware-configuration', type: Boolean }, + { name: 'print-status-buffer', type: Boolean }, { name: 'print-usb-devices', type: Boolean }, { name: 'reenumerate-and-exit', type: String }, { name: 'report-id', type: Number }, @@ -81,6 +82,11 @@ const sections: commandLineUsage.Section[] = [ description: 'Print hardware configuration to the standard output and exit.', type: Boolean }, + { + name: 'print-status-buffer', + description: 'Print the status buffer of the keyboard to the standard output and exit.', + type: Boolean + }, { name: 'print-usb-devices', description: 'Print usb devices to the standard output and exit.', diff --git a/packages/uhk-agent/src/util/index.ts b/packages/uhk-agent/src/util/index.ts index 166e318ceb0..b2e46186fab 100644 --- a/packages/uhk-agent/src/util/index.ts +++ b/packages/uhk-agent/src/util/index.ts @@ -14,6 +14,7 @@ export * from './load-user-config-from-binary-file'; export * from './load-user-config-history-async'; export * from './make-folder-writeable-to-user-on-linux'; export * from './print-hardware-configuration'; +export * from './print-status-buffer'; export * from './print-usb-devices'; export * from './reenumerate-and-exit'; export * from './save-extract-firmware'; diff --git a/packages/uhk-agent/src/util/print-status-buffer.ts b/packages/uhk-agent/src/util/print-status-buffer.ts new file mode 100644 index 00000000000..7e0e75e0078 --- /dev/null +++ b/packages/uhk-agent/src/util/print-status-buffer.ts @@ -0,0 +1,21 @@ +import process from 'node:process'; +import { UhkOperations, UsbVariables } from 'uhk-usb'; + +import { ElectronLogService } from '../services/logger.service'; + +export interface PrintStatusBufferOptions { + logger: ElectronLogService; + uhkOperations: UhkOperations; +} + +export async function printStatusBuffer({logger, uhkOperations}: PrintStatusBufferOptions): Promise { + try { + const message = await uhkOperations.getVariable(UsbVariables.statusBuffer); + logger.misc(`Status buffer: ${message}`); + process.exit(0); + } + catch (error) { + logger.error(error.message); + process.exit(-1); + } +} diff --git a/packages/uhk-common/src/models/command-line-args.ts b/packages/uhk-common/src/models/command-line-args.ts index a5689419fc9..cdd2c5a4a66 100644 --- a/packages/uhk-common/src/models/command-line-args.ts +++ b/packages/uhk-common/src/models/command-line-args.ts @@ -60,6 +60,8 @@ export interface CommandLineArgs extends DeviceIdentifier { 'print-hardware-configuration'?: boolean; + 'print-status-buffer'?: boolean; + 'print-usb-devices'?: boolean; /** * Reenumerate as the bootloader or BusPal, wait for the specified timeout and exit. From ea693e2578826612b36248f709d6916fbc2e49df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20R=C3=B3bert?= Date: Mon, 8 Sep 2025 18:47:44 +0200 Subject: [PATCH 06/10] refactor: move user config jsons to the uhk-common --- packages/uhk-common/.gitignore | 1 + packages/uhk-common/package.json | 3 ++- .../scripts/generate-user-configs.ts} | 6 +++--- .../scripts/migrate-uhk80-user-config.mjs | 2 +- packages/uhk-common/src/config-serializer/README.md | 2 +- packages/uhk-common/src/index.ts | 4 ++++ .../src/app/services => uhk-common}/user-config-80.json | 0 packages/uhk-web/.gitignore | 1 - packages/uhk-web/package.json | 3 +-- .../app/services/default-user-configuration.service.ts | 8 +++----- 10 files changed, 16 insertions(+), 14 deletions(-) rename packages/{uhk-web/scripts/generate-user-configs.mjs => uhk-common/scripts/generate-user-configs.ts} (83%) rename packages/{uhk-web => uhk-common}/scripts/migrate-uhk80-user-config.mjs (99%) rename packages/{uhk-web/src/app/services => uhk-common}/user-config-80.json (100%) diff --git a/packages/uhk-common/.gitignore b/packages/uhk-common/.gitignore index a8f914da7f1..1be0fa3f5da 100644 --- a/packages/uhk-common/.gitignore +++ b/packages/uhk-common/.gitignore @@ -1,3 +1,4 @@ .nyc_output/ coverage/ +user-config.json src/util/versions.ts diff --git a/packages/uhk-common/package.json b/packages/uhk-common/package.json index 68d03cdc057..5fe59d9f935 100644 --- a/packages/uhk-common/package.json +++ b/packages/uhk-common/package.json @@ -12,9 +12,10 @@ "url": "git@github.com:UltimateHackingKeyboard/agent.git" }, "scripts": { - "build": "run-s -sn build:generate-versions build:tsc", + "build": "run-s -sn build:generate-versions build:user-config build:tsc", "build:generate-versions": "node ./scripts/generate-versions.mjs", "build:tsc": "tsc --project src/tsconfig.build.json", + "build:user-config": "tsx ./scripts/generate-user-configs.ts", "clean": "rimraf ./node_modules ./dist", "test": "cross-env NODE_OPTIONS=--loader=ts-node/esm jasmine --config=jasmine.json", "coverage": "nyc npm test", diff --git a/packages/uhk-web/scripts/generate-user-configs.mjs b/packages/uhk-common/scripts/generate-user-configs.ts similarity index 83% rename from packages/uhk-web/scripts/generate-user-configs.mjs rename to packages/uhk-common/scripts/generate-user-configs.ts index 2cb5ae3f455..b2faf8a662e 100644 --- a/packages/uhk-web/scripts/generate-user-configs.mjs +++ b/packages/uhk-common/scripts/generate-user-configs.ts @@ -5,9 +5,9 @@ import { UHK_60_LEFT_MAX_KEY_ACTION_COUNT, UHK_60_RIGHT_MAX_KEY_ACTION_COUNT, UserConfiguration, -} from "uhk-common"; +} from '../src/index'; -const uhk80UserConfigPath = path.join(import.meta.dirname, '../src/app/services/user-config-80.json'); +const uhk80UserConfigPath = path.join(import.meta.dirname, '../user-config-80.json'); const uhk80UserConfigJson = JSON.parse(await fs.readFile(uhk80UserConfigPath, { encoding: 'utf8' })); const uhk60UserConfig = new UserConfiguration().fromJsonObject(uhk80UserConfigJson); @@ -35,5 +35,5 @@ for (const keymap of uhk60UserConfig.keymaps) { keymap.layers = layers; } -const uhk60UserConfigPath = path.join(import.meta.dirname, '../src/app/services/user-config.json'); +const uhk60UserConfigPath = path.join(import.meta.dirname, '../user-config.json'); await fs.writeFile(uhk60UserConfigPath, JSON.stringify(uhk60UserConfig.toJsonObject(), null, 2), { encoding: 'utf8' }); diff --git a/packages/uhk-web/scripts/migrate-uhk80-user-config.mjs b/packages/uhk-common/scripts/migrate-uhk80-user-config.mjs similarity index 99% rename from packages/uhk-web/scripts/migrate-uhk80-user-config.mjs rename to packages/uhk-common/scripts/migrate-uhk80-user-config.mjs index 0e287bbd48c..e0e1ea36cec 100644 --- a/packages/uhk-web/scripts/migrate-uhk80-user-config.mjs +++ b/packages/uhk-common/scripts/migrate-uhk80-user-config.mjs @@ -4,7 +4,7 @@ import { KeyActionHelper, Module, UserConfiguration, -} from "uhk-common"; +} from '../dist/index.js'; const sourceFile = process.argv[2] const destinationFile = process.argv[3] diff --git a/packages/uhk-common/src/config-serializer/README.md b/packages/uhk-common/src/config-serializer/README.md index ac25f1a1fe1..fcef34904b7 100644 --- a/packages/uhk-common/src/config-serializer/README.md +++ b/packages/uhk-common/src/config-serializer/README.md @@ -12,7 +12,7 @@ Given that the development dependencies are installed on your system you should There are 3 different representations of the configuration, each filling a specific purpose. -The **JavaScript representation** is optimally suited to be serialized as JSON, and saved to the file system, or transmitted over the network. As a plaintext format, it's human-readable and easily editable. See [user-config.json](../../../uhk-web/src/app/services/user-config-80.json) for an example configuration. +The **JavaScript representation** is optimally suited to be serialized as JSON, and saved to the file system, or transmitted over the network. As a plaintext format, it's human-readable and easily editable. See [user-config.json](../../user-config-80.json) for an example configuration. The **TypeScript representation** is structurally similar to the JavaScript representation, but it features strongly typed TypeScript objects instead of typeless JavaScript objects. This representation is meant to be used by Agent. Extensive, per-property [assertion](assert.ts) takes place upon initializing the TypeScript objects to ensure the integrity of the configuration. diff --git a/packages/uhk-common/src/index.ts b/packages/uhk-common/src/index.ts index 663ba60129a..32dcdb51233 100644 --- a/packages/uhk-common/src/index.ts +++ b/packages/uhk-common/src/index.ts @@ -1,3 +1,7 @@ +import UHK_60_USER_CONFIG from '../user-config.json'; +import UHK_80_USER_CONFIG from '../user-config-80.json'; +export {UHK_60_USER_CONFIG, UHK_80_USER_CONFIG} + export { Buffer } from './buffer.js'; export * from './config-serializer/index.js'; export * from './log/index.js'; diff --git a/packages/uhk-web/src/app/services/user-config-80.json b/packages/uhk-common/user-config-80.json similarity index 100% rename from packages/uhk-web/src/app/services/user-config-80.json rename to packages/uhk-common/user-config-80.json diff --git a/packages/uhk-web/.gitignore b/packages/uhk-web/.gitignore index d7944acc807..98a47fa1885 100644 --- a/packages/uhk-web/.gitignore +++ b/packages/uhk-web/.gitignore @@ -1,2 +1 @@ .angular -src/app/services/user-config.json diff --git a/packages/uhk-web/package.json b/packages/uhk-web/package.json index f505f191ce0..367652cced5 100644 --- a/packages/uhk-web/package.json +++ b/packages/uhk-web/package.json @@ -5,8 +5,7 @@ "clean": "rimraf ./node_modules ./.angular", "ng": "ng", "start": "ng serve", - "build": "run-s -sn build:user-config build:renderer", - "build:user-config": "node ./scripts/generate-user-configs.mjs", + "build": "run-s -sn build:renderer", "build:web": "ng build --configuration=production --project=uhk-web", "build:renderer": "ng build --configuration=production --project=uhk-renderer", "server:renderer": "ng build --project=uhk-renderer --watch", diff --git a/packages/uhk-web/src/app/services/default-user-configuration.service.ts b/packages/uhk-web/src/app/services/default-user-configuration.service.ts index 0ae4ed9406f..1a1260381ec 100644 --- a/packages/uhk-web/src/app/services/default-user-configuration.service.ts +++ b/packages/uhk-web/src/app/services/default-user-configuration.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { UhkDeviceProduct, UserConfiguration, UHK_80_DEVICE } from 'uhk-common'; +import { UhkDeviceProduct, UserConfiguration, UHK_80_DEVICE, UHK_60_USER_CONFIG, UHK_80_USER_CONFIG } from 'uhk-common'; @Injectable() export class DefaultUserConfigurationService { @@ -9,8 +9,7 @@ export class DefaultUserConfigurationService { getDefault60(): UserConfiguration { if (!this._defaultConfig60) { this._defaultConfig60 = new UserConfiguration() - // eslint-disable-next-line @typescript-eslint/no-require-imports - .fromJsonObject(require('./user-config.json')); + .fromJsonObject(UHK_60_USER_CONFIG); } return this._defaultConfig60; @@ -19,8 +18,7 @@ export class DefaultUserConfigurationService { getDefault80(): UserConfiguration { if (!this._defaultConfig80) { this._defaultConfig80 = new UserConfiguration() - // eslint-disable-next-line @typescript-eslint/no-require-imports - .fromJsonObject(require('./user-config-80.json')); + .fromJsonObject(UHK_80_USER_CONFIG); } return this._defaultConfig80; From b2a31b4aa773841210c199be7bd5d52c0982f88f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20R=C3=B3bert?= Date: Mon, 8 Sep 2025 20:38:53 +0200 Subject: [PATCH 07/10] feat: --restore-user-configuration command line argument --- packages/uhk-agent/src/electron-main.ts | 7 + packages/uhk-agent/src/util/command-line.ts | 6 + packages/uhk-agent/src/util/index.ts | 1 + .../src/util/restore-user-configuration.ts | 53 + packages/uhk-common/.gitignore | 1 - .../src/models/command-line-args.ts | 6 + packages/uhk-common/user-config.json | 7545 +++++++++++++++++ 7 files changed, 7618 insertions(+), 1 deletion(-) create mode 100644 packages/uhk-agent/src/util/restore-user-configuration.ts create mode 100644 packages/uhk-common/user-config.json diff --git a/packages/uhk-agent/src/electron-main.ts b/packages/uhk-agent/src/electron-main.ts index 041295b4631..772faa70f3d 100644 --- a/packages/uhk-agent/src/electron-main.ts +++ b/packages/uhk-agent/src/electron-main.ts @@ -32,6 +32,7 @@ import { printUsbDevices, printHardwareConfiguration, reenumerateAndExit, + restoreUserConfiguration, writeHardwareConfiguration, } from './util'; @@ -199,6 +200,12 @@ if (isSecondInstance) { logger.misc('Reenumeration process finished with error. Please unplug and plug your UHK.'); process.exit(-1); }); +} else if (options['restore-user-configuration']) { + restoreUserConfiguration({ + logger, + uhkOperations, + commandLineArgs: options, + }) } else if (options['write-hardware-configuration']) { writeHardwareConfiguration({ logger, diff --git a/packages/uhk-agent/src/util/command-line.ts b/packages/uhk-agent/src/util/command-line.ts index c9536625d8a..7338e54b613 100644 --- a/packages/uhk-agent/src/util/command-line.ts +++ b/packages/uhk-agent/src/util/command-line.ts @@ -16,6 +16,7 @@ const optionDefinitions: commandLineArgs.OptionDefinition[] = [ { name: 'print-hardware-configuration', type: Boolean }, { name: 'print-status-buffer', type: Boolean }, { name: 'print-usb-devices', type: Boolean }, + { name: 'restore-user-configuration', type: Boolean }, { name: 'reenumerate-and-exit', type: String }, { name: 'report-id', type: Number }, { name: 'serial-number', type: String }, @@ -99,6 +100,11 @@ const sections: commandLineUsage.Section[] = [ 'Please provide the timeout in milliseconds.', typeLabel: '(bootloader|buspal),timeout' }, + { + name: 'restore-user-configuration', + description: 'Run restore user-configuration process and exit.', + type: Boolean, + }, { name: 'report-id', description: 'Report Id that used for USB communication. If the value is -1 then does not use report id. The default value depends from the UHK device. For UHK 60 is 0. For UHK 80 is 4', diff --git a/packages/uhk-agent/src/util/index.ts b/packages/uhk-agent/src/util/index.ts index b2e46186fab..63ed643287f 100644 --- a/packages/uhk-agent/src/util/index.ts +++ b/packages/uhk-agent/src/util/index.ts @@ -17,6 +17,7 @@ export * from './print-hardware-configuration'; export * from './print-status-buffer'; export * from './print-usb-devices'; export * from './reenumerate-and-exit'; +export * from './restore-user-configuration'; export * from './save-extract-firmware'; export * from './save-user-config-history-async'; export * from './write-hardware-configuration'; diff --git a/packages/uhk-agent/src/util/restore-user-configuration.ts b/packages/uhk-agent/src/util/restore-user-configuration.ts new file mode 100644 index 00000000000..dd9be4a24fc --- /dev/null +++ b/packages/uhk-agent/src/util/restore-user-configuration.ts @@ -0,0 +1,53 @@ +import process from 'node:process'; +import { + CommandLineArgs, + mapObjectToUserConfigBinaryBuffer, + UHK_60_DEVICE, + UHK_60_V2_DEVICE, + UHK_60_USER_CONFIG, + UHK_80_DEVICE, + UHK_80_USER_CONFIG, +} from 'uhk-common'; +import { getCurrentUhkDeviceProduct, UhkOperations } from 'uhk-usb'; + +import { ElectronLogService } from '../services/logger.service'; + +export interface RestoreUserConfigurationOptions { + logger: ElectronLogService; + uhkOperations: UhkOperations; + commandLineArgs: CommandLineArgs; +} + +export async function restoreUserConfiguration(options: RestoreUserConfigurationOptions): Promise { + try { + const device = await getCurrentUhkDeviceProduct(options.commandLineArgs); + let userConfigJson: any; + + if (!device) { + options.logger.error('Cannot detect UHK device'); + process.exit(-1); + } + else if (device.id === UHK_60_DEVICE.id || device.id === UHK_60_V2_DEVICE.id) { + userConfigJson = UHK_60_USER_CONFIG; + } + else if (device.id === UHK_80_DEVICE.id) { + userConfigJson = UHK_80_USER_CONFIG; + } + else { + options.logger.error(`Unknow UHK device: ${JSON.stringify(device)}`); + process.exit(-1); + } + + const buffer = mapObjectToUserConfigBinaryBuffer(userConfigJson); + + options.logger.misc('Start restoring user configuration...'); + await options.uhkOperations.saveUserConfiguration(buffer) + options.logger.misc('User configuration restored.'); + + process.exit(0); + } + catch (error) { + options.logger.error(error.message); + process.exit(-1); + } +} diff --git a/packages/uhk-common/.gitignore b/packages/uhk-common/.gitignore index 1be0fa3f5da..a8f914da7f1 100644 --- a/packages/uhk-common/.gitignore +++ b/packages/uhk-common/.gitignore @@ -1,4 +1,3 @@ .nyc_output/ coverage/ -user-config.json src/util/versions.ts diff --git a/packages/uhk-common/src/models/command-line-args.ts b/packages/uhk-common/src/models/command-line-args.ts index cdd2c5a4a66..ae84476ee47 100644 --- a/packages/uhk-common/src/models/command-line-args.ts +++ b/packages/uhk-common/src/models/command-line-args.ts @@ -68,6 +68,12 @@ export interface CommandLineArgs extends DeviceIdentifier { * This may make Windows install the USB drivers needed for firmware update. */ 'reenumerate-and-exit'?: string; + + /** + * Run restore user-configuration process and exit. + */ + 'restore-user-configuration'?: boolean; + /** * Report Id that used for USB communication */ diff --git a/packages/uhk-common/user-config.json b/packages/uhk-common/user-config.json new file mode 100644 index 00000000000..d8373357614 --- /dev/null +++ b/packages/uhk-common/user-config.json @@ -0,0 +1,7545 @@ +{ + "userConfigMajorVersion": 12, + "userConfigMinorVersion": 0, + "userConfigPatchVersion": 0, + "deviceName": "My UHK", + "doubleTapSwitchLayerTimeout": 250, + "perKeyRgbPresent": false, + "backlightingMode": "FunctionalBacklighting", + "backlightingNoneActionColor": { + "b": 0, + "g": 0, + "r": 0 + }, + "backlightingScancodeColor": { + "b": 255, + "g": 255, + "r": 255 + }, + "backlightingModifierColor": { + "b": 255, + "g": 255, + "r": 0 + }, + "backlightingShortcutColor": { + "b": 255, + "g": 0, + "r": 0 + }, + "backlightingSwitchLayerColor": { + "b": 0, + "g": 255, + "r": 255 + }, + "backlightingSwitchKeymapColor": { + "b": 0, + "g": 0, + "r": 255 + }, + "backlightingMouseColor": { + "b": 0, + "g": 255, + "r": 0 + }, + "backlightingMacroColor": { + "b": 255, + "g": 0, + "r": 255 + }, + "backlightingDeviceColor": { + "b": 68, + "g": 136, + "r": 255 + }, + "mouseMoveInitialSpeed": 4, + "mouseMoveAcceleration": 68, + "mouseMoveDeceleratedSpeed": 8, + "mouseMoveBaseSpeed": 32, + "mouseMoveAcceleratedSpeed": 64, + "mouseScrollInitialSpeed": 20, + "mouseScrollAcceleration": 20, + "mouseScrollDeceleratedSpeed": 10, + "mouseScrollBaseSpeed": 20, + "mouseScrollAcceleratedSpeed": 50, + "secondaryRoleStrategy": "Simple", + "secondaryRoleAdvancedStrategyDoubletapTimeout": 200, + "secondaryRoleAdvancedStrategyTimeout": 350, + "secondaryRoleAdvancedStrategySafetyMargin": 50, + "secondaryRoleAdvancedStrategyTriggerByRelease": true, + "secondaryRoleAdvancedStrategyDoubletapToPrimary": true, + "secondaryRoleAdvancedStrategyTimeoutAction": "Secondary", + "mouseScrollAxisSkew": 1, + "mouseMoveAxisSkew": 1, + "diagonalSpeedCompensation": false, + "doubletapTimeout": 400, + "keystrokeDelay": 0, + "displayBrightness": 255, + "displayBrightnessBattery": 255, + "keyBacklightBrightness": 255, + "keyBacklightBrightnessBattery": 255, + "displayFadeOutTimeout": 300, + "displayFadeOutBatteryTimeout": 10, + "keyBacklightFadeOutTimeout": 300, + "keyBacklightFadeOutBatteryTimeout": 10, + "keyBacklightBrightnessChargingDefault": 50, + "batteryChargingMode": "Full", + "hostConnections": [ + { + "type": "UsbRight", + "switchover": false, + "name": "My PC" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + }, + { + "type": "Empty" + } + ], + "moduleConfigurations": [ + { + "id": "KeyClusterLeft", + "navigationModeBaseLayer": "Scroll", + "navigationModeModLayer": "Cursor", + "navigationModeFnLayer": "Caret", + "navigationModeMouseLayer": "Cursor", + "navigationModeFn2Layer": "Cursor", + "navigationModeFn3Layer": "Cursor", + "navigationModeFn4Layer": "Cursor", + "navigationModeFn5Layer": "Cursor", + "speed": 0, + "baseSpeed": 5, + "xceleration": 0, + "scrollSpeedDivisor": 5, + "caretSpeedDivisor": 5, + "scrollAxisLock": true, + "caretAxisLock": true, + "axisLockFirstTickSkew": 0.5, + "axisLockSkew": 0.5, + "invertScrollDirectionX": false, + "invertScrollDirectionY": false, + "keyClusterSwapAxes": false, + "keyClusterInvertHorizontalScrolling": false + }, + { + "id": "TouchpadRight", + "navigationModeBaseLayer": "Cursor", + "navigationModeModLayer": "Scroll", + "navigationModeFnLayer": "Caret", + "navigationModeMouseLayer": "Cursor", + "navigationModeFn2Layer": "Cursor", + "navigationModeFn3Layer": "Cursor", + "navigationModeFn4Layer": "Cursor", + "navigationModeFn5Layer": "Cursor", + "speed": 0.699999988079071, + "baseSpeed": 0.5, + "xceleration": 1, + "scrollSpeedDivisor": 8, + "caretSpeedDivisor": 16, + "scrollAxisLock": true, + "caretAxisLock": true, + "axisLockFirstTickSkew": 2, + "axisLockSkew": 0.5, + "invertScrollDirectionX": false, + "invertScrollDirectionY": false, + "touchpadPinchZoomDivisor": 4, + "touchpadHoldContinuationTimeout": 0, + "touchpadPinchToZoom": "Zoom" + }, + { + "id": "TrackballRight", + "navigationModeBaseLayer": "Cursor", + "navigationModeModLayer": "Scroll", + "navigationModeFnLayer": "Caret", + "navigationModeMouseLayer": "Cursor", + "navigationModeFn2Layer": "Cursor", + "navigationModeFn3Layer": "Cursor", + "navigationModeFn4Layer": "Cursor", + "navigationModeFn5Layer": "Cursor", + "speed": 0.5, + "baseSpeed": 0.5, + "xceleration": 1, + "scrollSpeedDivisor": 8, + "caretSpeedDivisor": 16, + "scrollAxisLock": true, + "caretAxisLock": true, + "axisLockFirstTickSkew": 2, + "axisLockSkew": 0.5, + "invertScrollDirectionX": false, + "invertScrollDirectionY": false + }, + { + "id": "TrackpointRight", + "navigationModeBaseLayer": "Cursor", + "navigationModeModLayer": "Scroll", + "navigationModeFnLayer": "Caret", + "navigationModeMouseLayer": "Cursor", + "navigationModeFn2Layer": "Cursor", + "navigationModeFn3Layer": "Cursor", + "navigationModeFn4Layer": "Cursor", + "navigationModeFn5Layer": "Cursor", + "speed": 1, + "baseSpeed": 0, + "xceleration": 0, + "scrollSpeedDivisor": 8, + "caretSpeedDivisor": 16, + "scrollAxisLock": true, + "caretAxisLock": true, + "axisLockFirstTickSkew": 2, + "axisLockSkew": 0.5, + "invertScrollDirectionX": false, + "invertScrollDirectionY": false + } + ], + "keymaps": [ + { + "isDefault": false, + "abbreviation": "COM", + "name": "Colemak for Mac", + "description": "Colemak is based on QWERTY, but it places the most frequent letters under the strongest fingers. This is the Mac version.", + "layers": [ + { + "id": "base", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 36 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 37 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 38 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 39 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 45 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 46 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 42 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 13 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 15 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 24 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 28 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 51 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 47 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 48 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 49 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 11 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 17 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 12 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 18 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 52 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 40 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 14 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 16 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 54 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 55 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 56 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 44 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 53 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 30 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 31 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 32 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 33 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 34 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 35 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 43 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 20 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 26 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 9 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 19 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 10 + }, + { + "keyActionType": "switchLayer", + "layer": "mouse", + "switchLayerMode": "holdAndDoubleTapToggle" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 21 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 22 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 23 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 7 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 100 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 29 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 27 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 6 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 25 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 5 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 44 + } + ] + } + ] + }, + { + "id": "mod", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 65 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 66 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 67 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 68 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 69 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 76 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 75 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 74 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 82 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 77 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 76 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 70 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 71 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 72 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 78 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 80 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 81 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 79 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 73 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 101 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 58 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 59 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 60 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 61 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 62 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 63 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 80, + "modifierMask": 12 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 23, + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 79, + "modifierMask": 12 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 57 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 80, + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 43, + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 79, + "modifierMask": 1 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 26, + "modifierMask": 8 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + }, + { + "keyActionType": "none" + } + ] + } + ] + }, + { + "id": "fn", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 205 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 233 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 184, + "modifierMask": 12 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 182 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 234 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 181 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 226 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "none" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "QWR" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "DVO" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "COL" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "QWM" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "DVM" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + } + ] + } + ] + }, + { + "id": "mouse", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollDown" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollLeft" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveUp" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollRight" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollUp" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveLeft" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveDown" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveRight" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "mouse", + "mouseAction": "leftClick" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "mouse", + "mouseAction": "rightClick" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "mouse", + "switchLayerMode": "holdAndDoubleTapToggle" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "rightClick" + }, + { + "keyActionType": "mouse", + "mouseAction": "middleClick" + }, + { + "keyActionType": "mouse", + "mouseAction": "leftClick" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "accelerate" + }, + { + "keyActionType": "mouse", + "mouseAction": "decelerate" + } + ] + } + ] + } + ] + }, + { + "isDefault": false, + "abbreviation": "COL", + "name": "Colemak for PC", + "description": "Colemak is based on QWERTY, but it places the most frequent letters under the strongest fingers. This is the PC version.\n", + "layers": [ + { + "id": "base", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 36 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 37 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 38 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 39 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 45 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 46 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 42 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 13 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 15 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 24 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 28 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 51 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 47 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 48 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 49 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 11 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 17 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 12 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 18 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 52 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 40 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 14 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 16 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 54 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 55 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 56 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 44 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 53 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 30 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 31 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 32 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 33 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 34 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 35 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 43 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 20 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 26 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 9 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 19 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 10 + }, + { + "keyActionType": "switchLayer", + "layer": "mouse", + "switchLayerMode": "holdAndDoubleTapToggle" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 21 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 22 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 23 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 7 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 100 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 29 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 27 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 6 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 25 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 5 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 44 + } + ] + } + ] + }, + { + "id": "mod", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 65 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 66 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 67 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 68 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 69 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 76 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 75 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 74 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 82 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 77 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 76 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 70 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 71 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 72 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 78 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 80 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 81 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 79 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 73 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 101 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 58 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 59 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 60 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 61 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 62 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 63 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 75, + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 23, + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 78, + "modifierMask": 1 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 57 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 80, + "modifierMask": 5 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 43, + "modifierMask": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 79, + "modifierMask": 5 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 75, + "modifierMask": 3 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 26, + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 78, + "modifierMask": 3 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + }, + { + "keyActionType": "none" + } + ] + } + ] + }, + { + "id": "fn", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 205 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 233 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "system", + "scancode": 130 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 182 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 234 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 181 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 226 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "none" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "QWR" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "DVO" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "QWM" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "DVM" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "COM" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + } + ] + } + ] + }, + { + "id": "mouse", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollUp" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollLeft" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveUp" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollRight" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollDown" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveLeft" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveDown" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveRight" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "mouse", + "mouseAction": "leftClick" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "mouse", + "mouseAction": "rightClick" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "mouse", + "switchLayerMode": "holdAndDoubleTapToggle" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "rightClick" + }, + { + "keyActionType": "mouse", + "mouseAction": "middleClick" + }, + { + "keyActionType": "mouse", + "mouseAction": "leftClick" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "accelerate" + }, + { + "keyActionType": "mouse", + "mouseAction": "decelerate" + } + ] + } + ] + } + ] + }, + { + "isDefault": false, + "abbreviation": "DVM", + "name": "Dvorak for Mac", + "description": "The Dvorak keyboard layout was designed with the goal of maximizing typing efficiency. This is the Mac version.", + "layers": [ + { + "id": "base", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 36 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 37 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 38 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 39 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 47 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 48 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 42 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 9 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 10 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 6 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 21 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 15 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 56 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 46 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 49 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 7 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 11 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 23 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 17 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 22 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 45 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 40 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 5 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 16 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 26 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 25 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 29 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 44 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 53 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 30 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 31 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 32 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 33 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 34 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 35 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 43 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 52 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 54 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 55 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 19 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 28 + }, + { + "keyActionType": "switchLayer", + "layer": "mouse", + "switchLayerMode": "holdAndDoubleTapToggle" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 18 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 24 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 12 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 100 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 51 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 20 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 13 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 14 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 27 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 44 + } + ] + } + ] + }, + { + "id": "mod", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 65 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 66 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 67 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 68 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 69 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 76 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 75 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 74 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 82 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 77 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 76 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 70 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 71 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 72 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 78 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 80 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 81 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 79 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 73 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 101 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 58 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 59 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 60 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 61 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 62 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 63 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 80, + "modifierMask": 12 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 23, + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 79, + "modifierMask": 12 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 57 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 80, + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 43, + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 79, + "modifierMask": 1 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 26, + "modifierMask": 8 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + }, + { + "keyActionType": "none" + } + ] + } + ] + }, + { + "id": "fn", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 205 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 233 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 184, + "modifierMask": 12 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 182 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 234 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 181 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 226 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "none" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "QWR" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "DVO" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "COL" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "QWM" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "COM" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + } + ] + } + ] + }, + { + "id": "mouse", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollDown" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollLeft" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveUp" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollRight" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollUp" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveLeft" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveDown" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveRight" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "mouse", + "mouseAction": "leftClick" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "mouse", + "mouseAction": "rightClick" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "mouse", + "switchLayerMode": "holdAndDoubleTapToggle" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "rightClick" + }, + { + "keyActionType": "mouse", + "mouseAction": "middleClick" + }, + { + "keyActionType": "mouse", + "mouseAction": "leftClick" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "accelerate" + }, + { + "keyActionType": "mouse", + "mouseAction": "decelerate" + } + ] + } + ] + } + ] + }, + { + "isDefault": false, + "abbreviation": "DVO", + "name": "Dvorak for PC", + "description": "The Dvorak keyboard layout was designed with the goal of maximizing typing efficiency. This is the PC version.", + "layers": [ + { + "id": "base", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 36 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 37 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 38 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 39 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 47 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 48 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 42 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 9 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 10 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 6 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 21 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 15 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 56 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 46 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 49 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 7 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 11 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 23 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 17 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 22 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 45 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 40 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 5 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 16 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 26 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 25 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 29 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 44 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 53 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 30 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 31 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 32 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 33 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 34 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 35 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 43 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 52 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 54 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 55 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 19 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 28 + }, + { + "keyActionType": "switchLayer", + "layer": "mouse", + "switchLayerMode": "holdAndDoubleTapToggle" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 18 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 24 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 12 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 100 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 51 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 20 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 13 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 14 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 27 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 44 + } + ] + } + ] + }, + { + "id": "mod", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 65 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 66 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 67 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 68 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 69 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 76 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 75 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 74 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 82 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 77 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 76 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 70 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 71 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 72 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 78 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 80 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 81 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 79 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 73 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 101 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 58 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 59 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 60 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 61 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 62 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 63 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 75, + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 23, + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 78, + "modifierMask": 1 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 57 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 80, + "modifierMask": 5 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 43, + "modifierMask": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 79, + "modifierMask": 5 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 75, + "modifierMask": 3 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 26, + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 78, + "modifierMask": 3 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + }, + { + "keyActionType": "none" + } + ] + } + ] + }, + { + "id": "fn", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 205 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 233 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "system", + "scancode": 130 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 182 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 234 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 181 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 226 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "none" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "QWR" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "COL" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "QWM" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "DVM" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "COM" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + } + ] + } + ] + }, + { + "id": "mouse", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollUp" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollLeft" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveUp" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollRight" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollDown" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveLeft" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveDown" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveRight" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "mouse", + "mouseAction": "leftClick" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "mouse", + "mouseAction": "rightClick" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "mouse", + "switchLayerMode": "holdAndDoubleTapToggle" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "rightClick" + }, + { + "keyActionType": "mouse", + "mouseAction": "middleClick" + }, + { + "keyActionType": "mouse", + "mouseAction": "leftClick" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "accelerate" + }, + { + "keyActionType": "mouse", + "mouseAction": "decelerate" + } + ] + } + ] + } + ] + }, + { + "isDefault": false, + "abbreviation": "QWM", + "name": "QWERTY for Mac", + "description": "QWERTY is the mother of all layouts. This is the Mac version.", + "layers": [ + { + "id": "base", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 36 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 37 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 38 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 39 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 45 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 46 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 42 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 28 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 24 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 12 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 18 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 19 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 47 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 48 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 49 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 11 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 13 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 14 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 15 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 51 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 52 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 40 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 17 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 16 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 54 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 55 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 56 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 44 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 53 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 30 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 31 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 32 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 33 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 34 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 35 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 43 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 20 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 26 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 21 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 23 + }, + { + "keyActionType": "switchLayer", + "layer": "mouse", + "switchLayerMode": "holdAndDoubleTapToggle" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 22 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 7 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 9 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 10 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 100 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 29 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 27 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 6 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 25 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 5 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 44 + } + ] + } + ] + }, + { + "id": "mod", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 65 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 66 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 67 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 68 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 69 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 76 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 75 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 74 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 82 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 77 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 76 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 70 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 71 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 72 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 78 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 80 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 81 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 79 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 73 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 101 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 58 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 59 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 60 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 61 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 62 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 63 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 80, + "modifierMask": 12 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 23, + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 79, + "modifierMask": 12 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 57 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 80, + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 43, + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 79, + "modifierMask": 1 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 26, + "modifierMask": 8 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + }, + { + "keyActionType": "none" + } + ] + } + ] + }, + { + "id": "fn", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 205 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 233 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 184, + "modifierMask": 12 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 182 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 234 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 181 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 226 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "none" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "QWR" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "DVO" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "COL" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "DVM" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "COM" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + } + ] + } + ] + }, + { + "id": "mouse", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollDown" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollLeft" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveUp" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollRight" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollUp" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveLeft" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveDown" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveRight" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "mouse", + "mouseAction": "leftClick" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "mouse", + "mouseAction": "rightClick" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "mouse", + "switchLayerMode": "holdAndDoubleTapToggle" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "rightClick" + }, + { + "keyActionType": "mouse", + "mouseAction": "middleClick" + }, + { + "keyActionType": "mouse", + "mouseAction": "leftClick" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "accelerate" + }, + { + "keyActionType": "mouse", + "mouseAction": "decelerate" + } + ] + } + ] + } + ] + }, + { + "isDefault": true, + "abbreviation": "QWR", + "name": "QWERTY for PC", + "description": "QWERTY is the mother of all layouts. This is the PC version.", + "layers": [ + { + "id": "base", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 36 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 37 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 38 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 39 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 45 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 46 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 42 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 28 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 24 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 12 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 18 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 19 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 47 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 48 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 49 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 11 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 13 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 14 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 15 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 51 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 52 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 40 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 17 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 16 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 54 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 55 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 56 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 44 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 53 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 30 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 31 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 32 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 33 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 34 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 35 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 43 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 20 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 26 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 21 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 23 + }, + { + "keyActionType": "switchLayer", + "layer": "mouse", + "switchLayerMode": "holdAndDoubleTapToggle" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 22 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 7 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 9 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 10 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 100 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 29 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 27 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 6 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 25 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 5 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 44 + } + ] + } + ] + }, + { + "id": "mod", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 65 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 66 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 67 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 68 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 69 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 76 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 75 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 74 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 82 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 77 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 76 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 70 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 71 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 72 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 78 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 80 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 81 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 79 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 73 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 101 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 58 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 59 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 60 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 61 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 62 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 63 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 41 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 75, + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 23, + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 78, + "modifierMask": 1 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 57 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 80, + "modifierMask": 5 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 43, + "modifierMask": 4 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 79, + "modifierMask": 5 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 75, + "modifierMask": 3 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 26, + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "scancode": 78, + "modifierMask": 3 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "mod", + "switchLayerMode": "hold" + }, + { + "keyActionType": "none" + } + ] + } + ] + }, + { + "id": "fn", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 205 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 233 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "system", + "scancode": 130 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 182 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 234 + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 181 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "media", + "scancode": 226 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "none" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "DVO" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "COL" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "QWM" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "DVM" + }, + { + "keyActionType": "switchKeymap", + "keymapAbbreviation": "COM" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "switchLayer", + "layer": "fn", + "switchLayerMode": "hold" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + } + ] + } + ] + }, + { + "id": "mouse", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollUp" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollLeft" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveUp" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollRight" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "scrollDown" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveLeft" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveDown" + }, + { + "keyActionType": "mouse", + "mouseAction": "moveRight" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 32 + }, + { + "keyActionType": "mouse", + "mouseAction": "leftClick" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 64 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 128 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 16 + }, + { + "keyActionType": "mouse", + "mouseAction": "rightClick" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "switchLayer", + "layer": "mouse", + "switchLayerMode": "holdAndDoubleTapToggle" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "rightClick" + }, + { + "keyActionType": "mouse", + "mouseAction": "middleClick" + }, + { + "keyActionType": "mouse", + "mouseAction": "leftClick" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 2 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 1 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 8 + }, + { + "keyActionType": "keystroke", + "type": "basic", + "modifierMask": 4 + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "mouse", + "mouseAction": "accelerate" + }, + { + "keyActionType": "mouse", + "mouseAction": "decelerate" + } + ] + } + ] + } + ] + }, + { + "isDefault": false, + "abbreviation": "EMP", + "name": "Empty", + "description": "This is an empty keymap. Let's start from scratch!", + "layers": [ + { + "id": "base", + "modules": [ + { + "id": 0, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + } + ] + }, + { + "id": 1, + "keyActions": [ + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + }, + { + "keyActionType": "none" + } + ] + } + ] + } + ] + } + ], + "macros": [ + { + "isLooped": true, + "isPrivate": true, + "name": "Go to UHK site in browser", + "macroActions": [ + { + "macroActionType": "key", + "action": "tap", + "type": "basic", + "scancode": 15, + "modifierMask": 1 + }, + { + "macroActionType": "text", + "text": "https://ultimatehackingkeyboard.com" + }, + { + "macroActionType": "key", + "action": "tap", + "type": "basic", + "scancode": 40 + } + ] + }, + { + "isLooped": false, + "isPrivate": true, + "name": "God mode in Doom", + "macroActions": [ + { + "macroActionType": "text", + "text": "iddqd" + } + ] + }, + { + "isLooped": false, + "isPrivate": true, + "name": "Type Silent Bob's address", + "macroActions": [ + { + "macroActionType": "text", + "text": "Silent Bob\n711-2880 Nulla St.\nMankato Mississippi 96522\n(257) 563-7401" + } + ] + } + ] +} \ No newline at end of file From 6fbe9606ea955b7a4f8bc0dbb7dceca3b1212310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20R=C3=B3bert?= Date: Mon, 8 Sep 2025 21:17:02 +0200 Subject: [PATCH 08/10] fix: user-config generation --- packages/uhk-common/.gitignore | 1 + packages/uhk-common/package.json | 2 +- .../scripts/generate-user-configs.ts | 2 +- .../src/config-serializer/README.md | 2 +- packages/uhk-common/user-config.json | 7545 ----------------- packages/usb/user-config-json-to-bin.ts | 2 +- 6 files changed, 5 insertions(+), 7549 deletions(-) delete mode 100644 packages/uhk-common/user-config.json diff --git a/packages/uhk-common/.gitignore b/packages/uhk-common/.gitignore index a8f914da7f1..1be0fa3f5da 100644 --- a/packages/uhk-common/.gitignore +++ b/packages/uhk-common/.gitignore @@ -1,3 +1,4 @@ .nyc_output/ coverage/ +user-config.json src/util/versions.ts diff --git a/packages/uhk-common/package.json b/packages/uhk-common/package.json index 5fe59d9f935..fbbce3e3b48 100644 --- a/packages/uhk-common/package.json +++ b/packages/uhk-common/package.json @@ -16,7 +16,7 @@ "build:generate-versions": "node ./scripts/generate-versions.mjs", "build:tsc": "tsc --project src/tsconfig.build.json", "build:user-config": "tsx ./scripts/generate-user-configs.ts", - "clean": "rimraf ./node_modules ./dist", + "clean": "rimraf ./node_modules ./dist user-config.json", "test": "cross-env NODE_OPTIONS=--loader=ts-node/esm jasmine --config=jasmine.json", "coverage": "nyc npm test", "lint": "eslint" diff --git a/packages/uhk-common/scripts/generate-user-configs.ts b/packages/uhk-common/scripts/generate-user-configs.ts index b2faf8a662e..63acd48b811 100644 --- a/packages/uhk-common/scripts/generate-user-configs.ts +++ b/packages/uhk-common/scripts/generate-user-configs.ts @@ -5,7 +5,7 @@ import { UHK_60_LEFT_MAX_KEY_ACTION_COUNT, UHK_60_RIGHT_MAX_KEY_ACTION_COUNT, UserConfiguration, -} from '../src/index'; +} from '../src/config-serializer'; const uhk80UserConfigPath = path.join(import.meta.dirname, '../user-config-80.json'); const uhk80UserConfigJson = JSON.parse(await fs.readFile(uhk80UserConfigPath, { encoding: 'utf8' })); diff --git a/packages/uhk-common/src/config-serializer/README.md b/packages/uhk-common/src/config-serializer/README.md index fcef34904b7..389d8069915 100644 --- a/packages/uhk-common/src/config-serializer/README.md +++ b/packages/uhk-common/src/config-serializer/README.md @@ -75,7 +75,7 @@ KeyActions.toJsObject: ## Testing the serializer -[test-serializer.ts](test-serializer.ts) is designed to test the serializer by taking [user-config.json](../../../uhk-web/src/app/services/user-config.-80json), and transforming it to TypeScript representation, then to binary representation, then finally back to JavaScript representation. This should exercise every major code path. +[test-serializer.ts](test-serializer.ts) is designed to test the serializer by taking [user-config.json](../../user-config-80.json), and transforming it to TypeScript representation, then to binary representation, then finally back to JavaScript representation. This should exercise every major code path. If the testing is successful the following should be displayed: diff --git a/packages/uhk-common/user-config.json b/packages/uhk-common/user-config.json deleted file mode 100644 index d8373357614..00000000000 --- a/packages/uhk-common/user-config.json +++ /dev/null @@ -1,7545 +0,0 @@ -{ - "userConfigMajorVersion": 12, - "userConfigMinorVersion": 0, - "userConfigPatchVersion": 0, - "deviceName": "My UHK", - "doubleTapSwitchLayerTimeout": 250, - "perKeyRgbPresent": false, - "backlightingMode": "FunctionalBacklighting", - "backlightingNoneActionColor": { - "b": 0, - "g": 0, - "r": 0 - }, - "backlightingScancodeColor": { - "b": 255, - "g": 255, - "r": 255 - }, - "backlightingModifierColor": { - "b": 255, - "g": 255, - "r": 0 - }, - "backlightingShortcutColor": { - "b": 255, - "g": 0, - "r": 0 - }, - "backlightingSwitchLayerColor": { - "b": 0, - "g": 255, - "r": 255 - }, - "backlightingSwitchKeymapColor": { - "b": 0, - "g": 0, - "r": 255 - }, - "backlightingMouseColor": { - "b": 0, - "g": 255, - "r": 0 - }, - "backlightingMacroColor": { - "b": 255, - "g": 0, - "r": 255 - }, - "backlightingDeviceColor": { - "b": 68, - "g": 136, - "r": 255 - }, - "mouseMoveInitialSpeed": 4, - "mouseMoveAcceleration": 68, - "mouseMoveDeceleratedSpeed": 8, - "mouseMoveBaseSpeed": 32, - "mouseMoveAcceleratedSpeed": 64, - "mouseScrollInitialSpeed": 20, - "mouseScrollAcceleration": 20, - "mouseScrollDeceleratedSpeed": 10, - "mouseScrollBaseSpeed": 20, - "mouseScrollAcceleratedSpeed": 50, - "secondaryRoleStrategy": "Simple", - "secondaryRoleAdvancedStrategyDoubletapTimeout": 200, - "secondaryRoleAdvancedStrategyTimeout": 350, - "secondaryRoleAdvancedStrategySafetyMargin": 50, - "secondaryRoleAdvancedStrategyTriggerByRelease": true, - "secondaryRoleAdvancedStrategyDoubletapToPrimary": true, - "secondaryRoleAdvancedStrategyTimeoutAction": "Secondary", - "mouseScrollAxisSkew": 1, - "mouseMoveAxisSkew": 1, - "diagonalSpeedCompensation": false, - "doubletapTimeout": 400, - "keystrokeDelay": 0, - "displayBrightness": 255, - "displayBrightnessBattery": 255, - "keyBacklightBrightness": 255, - "keyBacklightBrightnessBattery": 255, - "displayFadeOutTimeout": 300, - "displayFadeOutBatteryTimeout": 10, - "keyBacklightFadeOutTimeout": 300, - "keyBacklightFadeOutBatteryTimeout": 10, - "keyBacklightBrightnessChargingDefault": 50, - "batteryChargingMode": "Full", - "hostConnections": [ - { - "type": "UsbRight", - "switchover": false, - "name": "My PC" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - }, - { - "type": "Empty" - } - ], - "moduleConfigurations": [ - { - "id": "KeyClusterLeft", - "navigationModeBaseLayer": "Scroll", - "navigationModeModLayer": "Cursor", - "navigationModeFnLayer": "Caret", - "navigationModeMouseLayer": "Cursor", - "navigationModeFn2Layer": "Cursor", - "navigationModeFn3Layer": "Cursor", - "navigationModeFn4Layer": "Cursor", - "navigationModeFn5Layer": "Cursor", - "speed": 0, - "baseSpeed": 5, - "xceleration": 0, - "scrollSpeedDivisor": 5, - "caretSpeedDivisor": 5, - "scrollAxisLock": true, - "caretAxisLock": true, - "axisLockFirstTickSkew": 0.5, - "axisLockSkew": 0.5, - "invertScrollDirectionX": false, - "invertScrollDirectionY": false, - "keyClusterSwapAxes": false, - "keyClusterInvertHorizontalScrolling": false - }, - { - "id": "TouchpadRight", - "navigationModeBaseLayer": "Cursor", - "navigationModeModLayer": "Scroll", - "navigationModeFnLayer": "Caret", - "navigationModeMouseLayer": "Cursor", - "navigationModeFn2Layer": "Cursor", - "navigationModeFn3Layer": "Cursor", - "navigationModeFn4Layer": "Cursor", - "navigationModeFn5Layer": "Cursor", - "speed": 0.699999988079071, - "baseSpeed": 0.5, - "xceleration": 1, - "scrollSpeedDivisor": 8, - "caretSpeedDivisor": 16, - "scrollAxisLock": true, - "caretAxisLock": true, - "axisLockFirstTickSkew": 2, - "axisLockSkew": 0.5, - "invertScrollDirectionX": false, - "invertScrollDirectionY": false, - "touchpadPinchZoomDivisor": 4, - "touchpadHoldContinuationTimeout": 0, - "touchpadPinchToZoom": "Zoom" - }, - { - "id": "TrackballRight", - "navigationModeBaseLayer": "Cursor", - "navigationModeModLayer": "Scroll", - "navigationModeFnLayer": "Caret", - "navigationModeMouseLayer": "Cursor", - "navigationModeFn2Layer": "Cursor", - "navigationModeFn3Layer": "Cursor", - "navigationModeFn4Layer": "Cursor", - "navigationModeFn5Layer": "Cursor", - "speed": 0.5, - "baseSpeed": 0.5, - "xceleration": 1, - "scrollSpeedDivisor": 8, - "caretSpeedDivisor": 16, - "scrollAxisLock": true, - "caretAxisLock": true, - "axisLockFirstTickSkew": 2, - "axisLockSkew": 0.5, - "invertScrollDirectionX": false, - "invertScrollDirectionY": false - }, - { - "id": "TrackpointRight", - "navigationModeBaseLayer": "Cursor", - "navigationModeModLayer": "Scroll", - "navigationModeFnLayer": "Caret", - "navigationModeMouseLayer": "Cursor", - "navigationModeFn2Layer": "Cursor", - "navigationModeFn3Layer": "Cursor", - "navigationModeFn4Layer": "Cursor", - "navigationModeFn5Layer": "Cursor", - "speed": 1, - "baseSpeed": 0, - "xceleration": 0, - "scrollSpeedDivisor": 8, - "caretSpeedDivisor": 16, - "scrollAxisLock": true, - "caretAxisLock": true, - "axisLockFirstTickSkew": 2, - "axisLockSkew": 0.5, - "invertScrollDirectionX": false, - "invertScrollDirectionY": false - } - ], - "keymaps": [ - { - "isDefault": false, - "abbreviation": "COM", - "name": "Colemak for Mac", - "description": "Colemak is based on QWERTY, but it places the most frequent letters under the strongest fingers. This is the Mac version.", - "layers": [ - { - "id": "base", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 36 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 37 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 38 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 39 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 45 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 46 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 42 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 13 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 15 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 24 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 28 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 51 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 47 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 48 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 49 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 11 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 17 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 12 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 18 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 52 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 40 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 14 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 16 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 54 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 55 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 56 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 44 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 53 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 30 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 31 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 32 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 33 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 34 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 35 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 43 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 20 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 26 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 9 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 19 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 10 - }, - { - "keyActionType": "switchLayer", - "layer": "mouse", - "switchLayerMode": "holdAndDoubleTapToggle" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 21 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 22 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 23 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 7 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 100 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 29 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 27 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 6 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 25 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 5 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 44 - } - ] - } - ] - }, - { - "id": "mod", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 65 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 66 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 67 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 68 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 69 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 76 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 75 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 74 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 82 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 77 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 76 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 70 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 71 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 72 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 78 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 80 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 81 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 79 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 73 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 101 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 58 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 59 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 60 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 61 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 62 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 63 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 80, - "modifierMask": 12 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 23, - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 79, - "modifierMask": 12 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 57 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 80, - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 43, - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 79, - "modifierMask": 1 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 26, - "modifierMask": 8 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - }, - { - "keyActionType": "none" - } - ] - } - ] - }, - { - "id": "fn", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 205 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 233 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 184, - "modifierMask": 12 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 182 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 234 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 181 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 226 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "none" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "QWR" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "DVO" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "COL" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "QWM" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "DVM" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - } - ] - } - ] - }, - { - "id": "mouse", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollDown" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollLeft" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveUp" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollRight" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollUp" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveLeft" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveDown" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveRight" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "mouse", - "mouseAction": "leftClick" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "mouse", - "mouseAction": "rightClick" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "mouse", - "switchLayerMode": "holdAndDoubleTapToggle" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "rightClick" - }, - { - "keyActionType": "mouse", - "mouseAction": "middleClick" - }, - { - "keyActionType": "mouse", - "mouseAction": "leftClick" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "accelerate" - }, - { - "keyActionType": "mouse", - "mouseAction": "decelerate" - } - ] - } - ] - } - ] - }, - { - "isDefault": false, - "abbreviation": "COL", - "name": "Colemak for PC", - "description": "Colemak is based on QWERTY, but it places the most frequent letters under the strongest fingers. This is the PC version.\n", - "layers": [ - { - "id": "base", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 36 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 37 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 38 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 39 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 45 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 46 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 42 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 13 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 15 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 24 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 28 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 51 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 47 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 48 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 49 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 11 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 17 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 12 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 18 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 52 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 40 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 14 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 16 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 54 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 55 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 56 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 44 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 53 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 30 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 31 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 32 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 33 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 34 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 35 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 43 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 20 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 26 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 9 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 19 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 10 - }, - { - "keyActionType": "switchLayer", - "layer": "mouse", - "switchLayerMode": "holdAndDoubleTapToggle" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 21 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 22 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 23 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 7 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 100 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 29 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 27 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 6 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 25 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 5 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 44 - } - ] - } - ] - }, - { - "id": "mod", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 65 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 66 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 67 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 68 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 69 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 76 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 75 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 74 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 82 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 77 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 76 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 70 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 71 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 72 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 78 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 80 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 81 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 79 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 73 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 101 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 58 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 59 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 60 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 61 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 62 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 63 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 75, - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 23, - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 78, - "modifierMask": 1 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 57 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 80, - "modifierMask": 5 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 43, - "modifierMask": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 79, - "modifierMask": 5 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 75, - "modifierMask": 3 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 26, - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 78, - "modifierMask": 3 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - }, - { - "keyActionType": "none" - } - ] - } - ] - }, - { - "id": "fn", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 205 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 233 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "system", - "scancode": 130 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 182 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 234 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 181 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 226 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "none" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "QWR" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "DVO" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "QWM" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "DVM" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "COM" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - } - ] - } - ] - }, - { - "id": "mouse", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollUp" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollLeft" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveUp" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollRight" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollDown" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveLeft" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveDown" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveRight" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "mouse", - "mouseAction": "leftClick" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "mouse", - "mouseAction": "rightClick" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "mouse", - "switchLayerMode": "holdAndDoubleTapToggle" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "rightClick" - }, - { - "keyActionType": "mouse", - "mouseAction": "middleClick" - }, - { - "keyActionType": "mouse", - "mouseAction": "leftClick" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "accelerate" - }, - { - "keyActionType": "mouse", - "mouseAction": "decelerate" - } - ] - } - ] - } - ] - }, - { - "isDefault": false, - "abbreviation": "DVM", - "name": "Dvorak for Mac", - "description": "The Dvorak keyboard layout was designed with the goal of maximizing typing efficiency. This is the Mac version.", - "layers": [ - { - "id": "base", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 36 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 37 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 38 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 39 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 47 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 48 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 42 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 9 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 10 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 6 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 21 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 15 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 56 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 46 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 49 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 7 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 11 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 23 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 17 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 22 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 45 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 40 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 5 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 16 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 26 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 25 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 29 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 44 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 53 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 30 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 31 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 32 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 33 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 34 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 35 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 43 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 52 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 54 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 55 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 19 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 28 - }, - { - "keyActionType": "switchLayer", - "layer": "mouse", - "switchLayerMode": "holdAndDoubleTapToggle" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 18 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 24 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 12 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 100 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 51 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 20 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 13 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 14 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 27 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 44 - } - ] - } - ] - }, - { - "id": "mod", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 65 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 66 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 67 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 68 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 69 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 76 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 75 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 74 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 82 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 77 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 76 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 70 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 71 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 72 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 78 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 80 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 81 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 79 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 73 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 101 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 58 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 59 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 60 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 61 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 62 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 63 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 80, - "modifierMask": 12 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 23, - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 79, - "modifierMask": 12 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 57 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 80, - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 43, - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 79, - "modifierMask": 1 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 26, - "modifierMask": 8 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - }, - { - "keyActionType": "none" - } - ] - } - ] - }, - { - "id": "fn", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 205 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 233 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 184, - "modifierMask": 12 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 182 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 234 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 181 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 226 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "none" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "QWR" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "DVO" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "COL" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "QWM" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "COM" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - } - ] - } - ] - }, - { - "id": "mouse", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollDown" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollLeft" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveUp" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollRight" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollUp" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveLeft" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveDown" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveRight" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "mouse", - "mouseAction": "leftClick" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "mouse", - "mouseAction": "rightClick" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "mouse", - "switchLayerMode": "holdAndDoubleTapToggle" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "rightClick" - }, - { - "keyActionType": "mouse", - "mouseAction": "middleClick" - }, - { - "keyActionType": "mouse", - "mouseAction": "leftClick" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "accelerate" - }, - { - "keyActionType": "mouse", - "mouseAction": "decelerate" - } - ] - } - ] - } - ] - }, - { - "isDefault": false, - "abbreviation": "DVO", - "name": "Dvorak for PC", - "description": "The Dvorak keyboard layout was designed with the goal of maximizing typing efficiency. This is the PC version.", - "layers": [ - { - "id": "base", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 36 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 37 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 38 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 39 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 47 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 48 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 42 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 9 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 10 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 6 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 21 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 15 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 56 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 46 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 49 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 7 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 11 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 23 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 17 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 22 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 45 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 40 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 5 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 16 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 26 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 25 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 29 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 44 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 53 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 30 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 31 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 32 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 33 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 34 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 35 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 43 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 52 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 54 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 55 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 19 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 28 - }, - { - "keyActionType": "switchLayer", - "layer": "mouse", - "switchLayerMode": "holdAndDoubleTapToggle" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 18 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 24 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 12 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 100 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 51 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 20 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 13 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 14 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 27 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 44 - } - ] - } - ] - }, - { - "id": "mod", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 65 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 66 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 67 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 68 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 69 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 76 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 75 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 74 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 82 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 77 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 76 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 70 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 71 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 72 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 78 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 80 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 81 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 79 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 73 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 101 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 58 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 59 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 60 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 61 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 62 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 63 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 75, - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 23, - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 78, - "modifierMask": 1 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 57 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 80, - "modifierMask": 5 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 43, - "modifierMask": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 79, - "modifierMask": 5 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 75, - "modifierMask": 3 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 26, - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 78, - "modifierMask": 3 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - }, - { - "keyActionType": "none" - } - ] - } - ] - }, - { - "id": "fn", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 205 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 233 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "system", - "scancode": 130 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 182 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 234 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 181 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 226 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "none" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "QWR" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "COL" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "QWM" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "DVM" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "COM" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - } - ] - } - ] - }, - { - "id": "mouse", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollUp" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollLeft" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveUp" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollRight" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollDown" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveLeft" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveDown" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveRight" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "mouse", - "mouseAction": "leftClick" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "mouse", - "mouseAction": "rightClick" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "mouse", - "switchLayerMode": "holdAndDoubleTapToggle" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "rightClick" - }, - { - "keyActionType": "mouse", - "mouseAction": "middleClick" - }, - { - "keyActionType": "mouse", - "mouseAction": "leftClick" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "accelerate" - }, - { - "keyActionType": "mouse", - "mouseAction": "decelerate" - } - ] - } - ] - } - ] - }, - { - "isDefault": false, - "abbreviation": "QWM", - "name": "QWERTY for Mac", - "description": "QWERTY is the mother of all layouts. This is the Mac version.", - "layers": [ - { - "id": "base", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 36 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 37 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 38 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 39 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 45 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 46 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 42 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 28 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 24 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 12 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 18 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 19 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 47 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 48 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 49 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 11 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 13 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 14 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 15 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 51 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 52 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 40 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 17 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 16 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 54 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 55 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 56 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 44 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 53 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 30 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 31 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 32 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 33 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 34 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 35 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 43 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 20 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 26 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 21 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 23 - }, - { - "keyActionType": "switchLayer", - "layer": "mouse", - "switchLayerMode": "holdAndDoubleTapToggle" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 22 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 7 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 9 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 10 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 100 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 29 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 27 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 6 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 25 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 5 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 44 - } - ] - } - ] - }, - { - "id": "mod", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 65 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 66 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 67 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 68 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 69 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 76 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 75 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 74 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 82 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 77 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 76 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 70 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 71 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 72 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 78 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 80 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 81 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 79 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 73 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 101 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 58 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 59 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 60 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 61 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 62 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 63 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 80, - "modifierMask": 12 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 23, - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 79, - "modifierMask": 12 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 57 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 80, - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 43, - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 79, - "modifierMask": 1 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 26, - "modifierMask": 8 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - }, - { - "keyActionType": "none" - } - ] - } - ] - }, - { - "id": "fn", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 205 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 233 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 184, - "modifierMask": 12 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 182 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 234 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 181 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 226 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "none" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "QWR" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "DVO" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "COL" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "DVM" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "COM" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - } - ] - } - ] - }, - { - "id": "mouse", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollDown" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollLeft" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveUp" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollRight" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollUp" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveLeft" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveDown" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveRight" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "mouse", - "mouseAction": "leftClick" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "mouse", - "mouseAction": "rightClick" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "mouse", - "switchLayerMode": "holdAndDoubleTapToggle" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "rightClick" - }, - { - "keyActionType": "mouse", - "mouseAction": "middleClick" - }, - { - "keyActionType": "mouse", - "mouseAction": "leftClick" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "accelerate" - }, - { - "keyActionType": "mouse", - "mouseAction": "decelerate" - } - ] - } - ] - } - ] - }, - { - "isDefault": true, - "abbreviation": "QWR", - "name": "QWERTY for PC", - "description": "QWERTY is the mother of all layouts. This is the PC version.", - "layers": [ - { - "id": "base", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 36 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 37 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 38 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 39 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 45 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 46 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 42 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 28 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 24 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 12 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 18 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 19 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 47 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 48 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 49 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 11 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 13 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 14 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 15 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 51 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 52 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 40 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 17 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 16 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 54 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 55 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 56 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 44 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 53 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 30 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 31 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 32 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 33 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 34 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 35 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 43 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 20 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 26 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 21 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 23 - }, - { - "keyActionType": "switchLayer", - "layer": "mouse", - "switchLayerMode": "holdAndDoubleTapToggle" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 22 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 7 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 9 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 10 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 100 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 29 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 27 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 6 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 25 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 5 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 44 - } - ] - } - ] - }, - { - "id": "mod", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 65 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 66 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 67 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 68 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 69 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 76 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 75 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 74 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 82 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 77 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 76 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 70 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 71 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 72 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 78 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 80 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 81 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 79 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 73 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 101 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 58 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 59 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 60 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 61 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 62 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 63 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 41 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 75, - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 23, - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 78, - "modifierMask": 1 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 57 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 80, - "modifierMask": 5 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 43, - "modifierMask": 4 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 79, - "modifierMask": 5 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 75, - "modifierMask": 3 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 26, - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "scancode": 78, - "modifierMask": 3 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "mod", - "switchLayerMode": "hold" - }, - { - "keyActionType": "none" - } - ] - } - ] - }, - { - "id": "fn", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 205 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 233 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "system", - "scancode": 130 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 182 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 234 - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 181 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "media", - "scancode": 226 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "none" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "DVO" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "COL" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "QWM" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "DVM" - }, - { - "keyActionType": "switchKeymap", - "keymapAbbreviation": "COM" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "switchLayer", - "layer": "fn", - "switchLayerMode": "hold" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - } - ] - } - ] - }, - { - "id": "mouse", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollUp" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollLeft" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveUp" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollRight" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "scrollDown" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveLeft" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveDown" - }, - { - "keyActionType": "mouse", - "mouseAction": "moveRight" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 32 - }, - { - "keyActionType": "mouse", - "mouseAction": "leftClick" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 64 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 128 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 16 - }, - { - "keyActionType": "mouse", - "mouseAction": "rightClick" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "switchLayer", - "layer": "mouse", - "switchLayerMode": "holdAndDoubleTapToggle" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "rightClick" - }, - { - "keyActionType": "mouse", - "mouseAction": "middleClick" - }, - { - "keyActionType": "mouse", - "mouseAction": "leftClick" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 2 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 1 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 8 - }, - { - "keyActionType": "keystroke", - "type": "basic", - "modifierMask": 4 - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "mouse", - "mouseAction": "accelerate" - }, - { - "keyActionType": "mouse", - "mouseAction": "decelerate" - } - ] - } - ] - } - ] - }, - { - "isDefault": false, - "abbreviation": "EMP", - "name": "Empty", - "description": "This is an empty keymap. Let's start from scratch!", - "layers": [ - { - "id": "base", - "modules": [ - { - "id": 0, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - } - ] - }, - { - "id": 1, - "keyActions": [ - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - }, - { - "keyActionType": "none" - } - ] - } - ] - } - ] - } - ], - "macros": [ - { - "isLooped": true, - "isPrivate": true, - "name": "Go to UHK site in browser", - "macroActions": [ - { - "macroActionType": "key", - "action": "tap", - "type": "basic", - "scancode": 15, - "modifierMask": 1 - }, - { - "macroActionType": "text", - "text": "https://ultimatehackingkeyboard.com" - }, - { - "macroActionType": "key", - "action": "tap", - "type": "basic", - "scancode": 40 - } - ] - }, - { - "isLooped": false, - "isPrivate": true, - "name": "God mode in Doom", - "macroActions": [ - { - "macroActionType": "text", - "text": "iddqd" - } - ] - }, - { - "isLooped": false, - "isPrivate": true, - "name": "Type Silent Bob's address", - "macroActions": [ - { - "macroActionType": "text", - "text": "Silent Bob\n711-2880 Nulla St.\nMankato Mississippi 96522\n(257) 563-7401" - } - ] - } - ] -} \ No newline at end of file diff --git a/packages/usb/user-config-json-to-bin.ts b/packages/usb/user-config-json-to-bin.ts index 1b6bfe88126..4267bfa3c8c 100755 --- a/packages/usb/user-config-json-to-bin.ts +++ b/packages/usb/user-config-json-to-bin.ts @@ -23,7 +23,7 @@ if (userConfigType !== 'uhk60' && userConfigType !== 'uhk80') { } const inputFileName = userConfigType === 'uhk60' ? 'user-config.json' : 'user-config-80.json'; -const inputFile = join(import.meta.url, '..', 'uhk-web', 'src', 'app', 'services', inputFileName); +const inputFile = join(import.meta.url, '..', 'uhk-common', inputFileName); const config1Js = JSON.parse(fs.readFileSync(inputFile).toString()); const config1Ts: UserConfiguration = new UserConfiguration().fromJsonObject(config1Js); const config1Buffer = new UhkBuffer(); From 6f75b13714bd30bebe8dac5b9e0bc1dbe6812799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20R=C3=B3bert?= Date: Mon, 8 Sep 2025 21:29:55 +0200 Subject: [PATCH 09/10] test: temporarily turn off test --- packages/test-serializer/package.json | 2 +- packages/uhk-common/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/test-serializer/package.json b/packages/test-serializer/package.json index d57aee1012c..aa629f3a3bc 100644 --- a/packages/test-serializer/package.json +++ b/packages/test-serializer/package.json @@ -17,7 +17,7 @@ "devDependencies": { }, "scripts": { - "test": "cross-env NODE_OPTIONS=--loader=ts-node/esm jasmine --config=jasmine.json", + "test:skip": "cross-env NODE_OPTIONS=--loader=ts-node/esm jasmine --config=jasmine.json", "clean": "rimraf ./node_modules", "lint": "eslint" } diff --git a/packages/uhk-common/package.json b/packages/uhk-common/package.json index fbbce3e3b48..0cccd51f78d 100644 --- a/packages/uhk-common/package.json +++ b/packages/uhk-common/package.json @@ -17,7 +17,7 @@ "build:tsc": "tsc --project src/tsconfig.build.json", "build:user-config": "tsx ./scripts/generate-user-configs.ts", "clean": "rimraf ./node_modules ./dist user-config.json", - "test": "cross-env NODE_OPTIONS=--loader=ts-node/esm jasmine --config=jasmine.json", + "test:skip": "cross-env NODE_OPTIONS=--loader=ts-node/esm jasmine --config=jasmine.json", "coverage": "nyc npm test", "lint": "eslint" }, From eb138336f5af0535fff1177c4a9fb559f2422525 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kiss=20R=C3=B3bert?= Date: Sat, 13 Sep 2025 12:04:06 +0200 Subject: [PATCH 10/10] test: turn on unit test --- packages/test-serializer/package.json | 2 +- packages/test-serializer/spec/test-serializer.spec.ts | 2 +- packages/uhk-common/.gitignore | 2 ++ packages/uhk-common/package.json | 2 +- packages/uhk-common/scripts/generate-user-configs.ts | 7 +++++++ packages/uhk-common/src/index.ts | 6 ++---- 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/test-serializer/package.json b/packages/test-serializer/package.json index aa629f3a3bc..d57aee1012c 100644 --- a/packages/test-serializer/package.json +++ b/packages/test-serializer/package.json @@ -17,7 +17,7 @@ "devDependencies": { }, "scripts": { - "test:skip": "cross-env NODE_OPTIONS=--loader=ts-node/esm jasmine --config=jasmine.json", + "test": "cross-env NODE_OPTIONS=--loader=ts-node/esm jasmine --config=jasmine.json", "clean": "rimraf ./node_modules", "lint": "eslint" } diff --git a/packages/test-serializer/spec/test-serializer.spec.ts b/packages/test-serializer/spec/test-serializer.spec.ts index 9d72d9d49e0..0dd58204e1e 100644 --- a/packages/test-serializer/spec/test-serializer.spec.ts +++ b/packages/test-serializer/spec/test-serializer.spec.ts @@ -2,7 +2,7 @@ import { UhkBuffer, UserConfiguration } from '../../uhk-common/src/index.js'; import fs from 'fs'; -const userConfig = JSON.parse(fs.readFileSync('../uhk-web/src/app/services/user-config-80.json', { encoding: 'utf8' })); +const userConfig = JSON.parse(fs.readFileSync('../uhk-common/user-config-80.json', { encoding: 'utf8' })); describe('Test Serializer', () => { it('full config match', () => { diff --git a/packages/uhk-common/.gitignore b/packages/uhk-common/.gitignore index 1be0fa3f5da..bc5704ed996 100644 --- a/packages/uhk-common/.gitignore +++ b/packages/uhk-common/.gitignore @@ -1,4 +1,6 @@ .nyc_output/ coverage/ user-config.json +src/user-config-60.ts +src/user-config-80.ts src/util/versions.ts diff --git a/packages/uhk-common/package.json b/packages/uhk-common/package.json index 0cccd51f78d..fbbce3e3b48 100644 --- a/packages/uhk-common/package.json +++ b/packages/uhk-common/package.json @@ -17,7 +17,7 @@ "build:tsc": "tsc --project src/tsconfig.build.json", "build:user-config": "tsx ./scripts/generate-user-configs.ts", "clean": "rimraf ./node_modules ./dist user-config.json", - "test:skip": "cross-env NODE_OPTIONS=--loader=ts-node/esm jasmine --config=jasmine.json", + "test": "cross-env NODE_OPTIONS=--loader=ts-node/esm jasmine --config=jasmine.json", "coverage": "nyc npm test", "lint": "eslint" }, diff --git a/packages/uhk-common/scripts/generate-user-configs.ts b/packages/uhk-common/scripts/generate-user-configs.ts index 63acd48b811..cb2b33f5db5 100644 --- a/packages/uhk-common/scripts/generate-user-configs.ts +++ b/packages/uhk-common/scripts/generate-user-configs.ts @@ -10,6 +10,9 @@ import { const uhk80UserConfigPath = path.join(import.meta.dirname, '../user-config-80.json'); const uhk80UserConfigJson = JSON.parse(await fs.readFile(uhk80UserConfigPath, { encoding: 'utf8' })); const uhk60UserConfig = new UserConfiguration().fromJsonObject(uhk80UserConfigJson); +const uhk80UserConfigTsPath = path.join(import.meta.dirname, '../src/user-config-80.ts'); +const uhk80UserConfigContent = `export const UHK_80_USER_CONFIG = ${JSON.stringify(uhk80UserConfigJson, null, 2)}` +await fs.writeFile(uhk80UserConfigTsPath, uhk80UserConfigContent, { encoding: 'utf8' }); for (const keymap of uhk60UserConfig.keymaps) { const layers = []; @@ -37,3 +40,7 @@ for (const keymap of uhk60UserConfig.keymaps) { const uhk60UserConfigPath = path.join(import.meta.dirname, '../user-config.json'); await fs.writeFile(uhk60UserConfigPath, JSON.stringify(uhk60UserConfig.toJsonObject(), null, 2), { encoding: 'utf8' }); + +const uhk60UserConfigTsPath = path.join(import.meta.dirname, '../src/user-config-60.ts'); +const uhk60UserConfigContent = `export const UHK_60_USER_CONFIG = ${JSON.stringify(uhk60UserConfig.toJsonObject(), null, 2)}` +await fs.writeFile(uhk60UserConfigTsPath, uhk60UserConfigContent, { encoding: 'utf8' }); diff --git a/packages/uhk-common/src/index.ts b/packages/uhk-common/src/index.ts index 32dcdb51233..d42af083aeb 100644 --- a/packages/uhk-common/src/index.ts +++ b/packages/uhk-common/src/index.ts @@ -1,10 +1,8 @@ -import UHK_60_USER_CONFIG from '../user-config.json'; -import UHK_80_USER_CONFIG from '../user-config-80.json'; -export {UHK_60_USER_CONFIG, UHK_80_USER_CONFIG} - export { Buffer } from './buffer.js'; export * from './config-serializer/index.js'; export * from './log/index.js'; export * from './models/index.js'; +export { UHK_60_USER_CONFIG } from './user-config-60.js'; +export { UHK_80_USER_CONFIG } from './user-config-80.js'; export * from './util/index.js'; export const RIGHT_HALF_FIRMWARE_UPGRADE_MODULE_NAME = 'Right keyboard half';