parent
6f11d89152
commit
95b7a7b684
@ -0,0 +1,70 @@
|
|||||||
|
// -*- mode: c++ -*-
|
||||||
|
|
||||||
|
/* This example demonstrates the Model 01 / Model 100 butterfly logo key as a
|
||||||
|
* tmux prefix key. When the key is held, Ctrl-B is pressed prior to the key
|
||||||
|
* you pressed.
|
||||||
|
*
|
||||||
|
* This example also demonstrates the purpose of using an entire layer for this
|
||||||
|
* plugin: the h/j/k/l keys in the TMUX layer are swapped for arrow keys to
|
||||||
|
* make switching between panes easier.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <Kaleidoscope.h>
|
||||||
|
#include <Kaleidoscope-PrefixLayer.h>
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PRIMARY,
|
||||||
|
TMUX,
|
||||||
|
}; // layers
|
||||||
|
|
||||||
|
/* Used in setup() below. */
|
||||||
|
static const kaleidoscope::plugin::PrefixLayer::Entry prefix_layers[] PROGMEM = {
|
||||||
|
kaleidoscope::plugin::PrefixLayer::Entry(TMUX, LCTRL(Key_B)),
|
||||||
|
};
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
KEYMAPS(
|
||||||
|
[PRIMARY] = KEYMAP_STACKED
|
||||||
|
(XXX, Key_1, Key_2, Key_3, Key_4, Key_5, XXX,
|
||||||
|
Key_Backtick, Key_Q, Key_W, Key_E, Key_R, Key_T, Key_Tab,
|
||||||
|
Key_PageUp, Key_A, Key_S, Key_D, Key_F, Key_G,
|
||||||
|
Key_PageDown, Key_Z, Key_X, Key_C, Key_V, Key_B, Key_Escape,
|
||||||
|
Key_LeftControl, Key_Backspace, Key_LeftGui, Key_LeftShift,
|
||||||
|
XXX,
|
||||||
|
|
||||||
|
XXX, Key_6, Key_7, Key_8, Key_9, Key_0, XXX,
|
||||||
|
Key_Enter, Key_Y, Key_U, Key_I, Key_O, Key_P, Key_Equals,
|
||||||
|
Key_H, Key_J, Key_K, Key_L, Key_Semicolon, Key_Quote,
|
||||||
|
ShiftToLayer(TMUX), Key_N, Key_M, Key_Comma, Key_Period, Key_Slash, Key_Minus,
|
||||||
|
Key_RightShift, Key_RightAlt, Key_Spacebar, Key_RightControl,
|
||||||
|
XXX),
|
||||||
|
|
||||||
|
[TMUX] = KEYMAP_STACKED
|
||||||
|
(___, ___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___,
|
||||||
|
___,
|
||||||
|
|
||||||
|
___, ___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___, ___, ___, ___,
|
||||||
|
Key_LeftArrow, Key_DownArrow, Key_UpArrow, Key_RightArrow, ___, ___,
|
||||||
|
___, ___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___,
|
||||||
|
___),
|
||||||
|
)
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
KALEIDOSCOPE_INIT_PLUGINS(PrefixLayer);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Kaleidoscope.setup();
|
||||||
|
/* Configure the previously-defined prefix layers. */
|
||||||
|
PrefixLayer.prefix_layers = prefix_layers;
|
||||||
|
PrefixLayer.prefix_layers_length = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
Kaleidoscope.loop();
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"cpu": {
|
||||||
|
"fqbn": "keyboardio:avr:model01",
|
||||||
|
"port": ""
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
# PrefixLayer
|
||||||
|
|
||||||
|
The `PrefixLayer` plugin allows you to easily create a keyboard layer designed
|
||||||
|
for use with programs that use a prefix key, such as tmux or screen. When a key
|
||||||
|
in a prefix layer is pressed, the prefix is injected first, then the key in
|
||||||
|
that layer is pressed.
|
||||||
|
|
||||||
|
## Using the plugin
|
||||||
|
|
||||||
|
You will need to define a keymap layer and configure the plugin to use that
|
||||||
|
layer with a prefix key. You can then include the plugin's header and set the
|
||||||
|
`.prefix_layers` property.
|
||||||
|
|
||||||
|
```c++
|
||||||
|
#include <Kaleidoscope.h>
|
||||||
|
#include <Kaleidoscope-PrefixLayer.h>
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PRIMARY,
|
||||||
|
TMUX,
|
||||||
|
}; // layers
|
||||||
|
|
||||||
|
static const kaleidoscope::plugin::PrefixLayer::Entry prefix_layers[] PROGMEM = {
|
||||||
|
kaleidoscope::plugin::PrefixLayer::Entry(TMUX, LCTRL(Key_B)),
|
||||||
|
};
|
||||||
|
|
||||||
|
KALEIDOSCOPE_INIT_PLUGINS(LEDControl, PrefixLayer);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Kaleidoscope.setup();
|
||||||
|
PrefixLayer.prefix_layers = prefix_layers;
|
||||||
|
PrefixLayer.prefix_layers_length = 1;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Plugin methods
|
||||||
|
|
||||||
|
The plugin provides a `PrefixLayer` object, which has the following methods
|
||||||
|
and properties:
|
||||||
|
|
||||||
|
### `.prefix_layers`
|
||||||
|
|
||||||
|
> A `kaleidoscope::plugin::PrefixLayer::Entry` array that maps layers to prefix
|
||||||
|
> keys. The `Entry` constructor accepts `Entry(layer_number, prefix_key)`. This
|
||||||
|
> array must be stored in `PROGMEM` as shown above.
|
||||||
|
>
|
||||||
|
> Defaults to an empty array.
|
||||||
|
|
||||||
|
### `.prefix_layers_length`
|
||||||
|
|
||||||
|
> Length of the `prefix_layers` array.
|
||||||
|
>
|
||||||
|
> Defaults to *0*
|
||||||
|
|
||||||
|
## Further reading
|
||||||
|
|
||||||
|
Starting from the [example][plugin:example] is the recommended way of getting
|
||||||
|
started with the plugin.
|
||||||
|
|
||||||
|
[plugin:example]: /examples/Keystrokes/PrefixLayer/PrefixLayer.ino
|
@ -0,0 +1,7 @@
|
|||||||
|
name=Kaleidoscope-PrefixLayer
|
||||||
|
version=0.0.0
|
||||||
|
sentence=Sends a prefix key for every key in a layer.
|
||||||
|
maintainer=Kaleidoscope's Developers <jesse@keyboard.io>
|
||||||
|
url=https://github.com/keyboardio/Kaleidoscope
|
||||||
|
author=iliana etaoin, James Cash
|
||||||
|
paragraph=
|
@ -0,0 +1,21 @@
|
|||||||
|
/* -*- mode: c++ -*-
|
||||||
|
* Kaleidoscope-PrefixLayer -- Sends a prefix key for every key in a layer.
|
||||||
|
* Copyright (C) 2017, 2022 iliana etaoin <iliana@buttslol.net>
|
||||||
|
* Copyright (C) 2017 James Cash
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under
|
||||||
|
* the terms of the GNU General Public License as published by the Free Software
|
||||||
|
* Foundation, version 3.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with
|
||||||
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "kaleidoscope/plugin/PrefixLayer.h" // IWYU pragma: export
|
@ -0,0 +1,77 @@
|
|||||||
|
/* -*- mode: c++ -*-
|
||||||
|
* Kaleidoscope-PrefixLayer -- Sends a prefix key for every key in a layer.
|
||||||
|
* Copyright (C) 2017, 2022 iliana etaoin <iliana@buttslol.net>
|
||||||
|
* Copyright (C) 2017 James Cash
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under
|
||||||
|
* the terms of the GNU General Public License as published by the Free Software
|
||||||
|
* Foundation, version 3.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with
|
||||||
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "kaleidoscope/plugin/PrefixLayer.h"
|
||||||
|
|
||||||
|
#include <Arduino.h> // for PROGMEM
|
||||||
|
#include <stdint.h> // for uint8_t
|
||||||
|
|
||||||
|
#include "kaleidoscope/KeyEvent.h" // for KeyEvent
|
||||||
|
#include "kaleidoscope/Runtime.h" // for Runtime
|
||||||
|
#include "kaleidoscope/event_handler_result.h" // for EventHandlerResult, EventHandlerResult::OK
|
||||||
|
#include "kaleidoscope/key_defs.h" // for Key
|
||||||
|
#include "kaleidoscope/keyswitch_state.h" // for keyToggledOn
|
||||||
|
#include "kaleidoscope/layers.h" // for Layer
|
||||||
|
|
||||||
|
namespace kaleidoscope {
|
||||||
|
namespace plugin {
|
||||||
|
|
||||||
|
static const PrefixLayer::Entry prefix_layers_default_[] PROGMEM = {};
|
||||||
|
const PrefixLayer::Entry *PrefixLayer::prefix_layers = prefix_layers_default_;
|
||||||
|
uint8_t PrefixLayer::prefix_layers_length = 0;
|
||||||
|
bool PrefixLayer::clear_modifiers_ = false;
|
||||||
|
|
||||||
|
EventHandlerResult PrefixLayer::onKeyEvent(KeyEvent &event) {
|
||||||
|
if (event.state & INJECTED)
|
||||||
|
return EventHandlerResult::OK;
|
||||||
|
if (!keyToggledOn(event.state))
|
||||||
|
return EventHandlerResult::OK;
|
||||||
|
if (event.key == Key_NoKey)
|
||||||
|
return EventHandlerResult::OK;
|
||||||
|
if (!event.key.isKeyboardKey())
|
||||||
|
return EventHandlerResult::OK;
|
||||||
|
if (event.key.isKeyboardModifier())
|
||||||
|
return EventHandlerResult::OK;
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < prefix_layers_length; i++) {
|
||||||
|
if (Layer.isActive(prefix_layers[i].layer)) {
|
||||||
|
clear_modifiers_ = true;
|
||||||
|
Runtime.handleKeyEvent(KeyEvent{KeyAddr::none(), IS_PRESSED | INJECTED, prefix_layers[i].prefix});
|
||||||
|
Runtime.handleKeyEvent(KeyEvent{KeyAddr::none(), WAS_PRESSED | INJECTED, prefix_layers[i].prefix});
|
||||||
|
clear_modifiers_ = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return EventHandlerResult::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
EventHandlerResult PrefixLayer::beforeReportingState(const KeyEvent &event) {
|
||||||
|
if (clear_modifiers_) {
|
||||||
|
for (uint8_t i = HID_KEYBOARD_FIRST_MODIFIER; i <= HID_KEYBOARD_LAST_MODIFIER; i++) {
|
||||||
|
Runtime.hid().keyboard().releaseKey(Key(i, KEY_FLAGS));
|
||||||
|
}
|
||||||
|
Runtime.hid().keyboard().pressModifiers(event.key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return EventHandlerResult::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace plugin
|
||||||
|
} // namespace kaleidoscope
|
||||||
|
|
||||||
|
kaleidoscope::plugin::PrefixLayer PrefixLayer;
|
@ -0,0 +1,54 @@
|
|||||||
|
/* -*- mode: c++ -*-
|
||||||
|
* Kaleidoscope-PrefixLayer -- Sends a prefix key for every key in a layer.
|
||||||
|
* Copyright (C) 2017, 2022 iliana etaoin <iliana@buttslol.net>
|
||||||
|
* Copyright (C) 2017 James Cash
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under
|
||||||
|
* the terms of the GNU General Public License as published by the Free Software
|
||||||
|
* Foundation, version 3.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with
|
||||||
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h> // for uint8_t
|
||||||
|
|
||||||
|
#include "kaleidoscope/KeyEvent.h" // for KeyEvent
|
||||||
|
#include "kaleidoscope/event_handler_result.h" // for EventHandlerResult
|
||||||
|
#include "kaleidoscope/key_defs.h" // for Key
|
||||||
|
#include "kaleidoscope/plugin.h" // for Plugin
|
||||||
|
|
||||||
|
namespace kaleidoscope {
|
||||||
|
namespace plugin {
|
||||||
|
|
||||||
|
class PrefixLayer : public Plugin {
|
||||||
|
public:
|
||||||
|
EventHandlerResult onKeyEvent(KeyEvent &event);
|
||||||
|
EventHandlerResult beforeReportingState(const KeyEvent &event);
|
||||||
|
|
||||||
|
struct Entry {
|
||||||
|
uint8_t layer;
|
||||||
|
Key prefix;
|
||||||
|
|
||||||
|
constexpr Entry(uint8_t layer, Key prefix)
|
||||||
|
: layer(layer), prefix(prefix) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const Entry *prefix_layers;
|
||||||
|
static uint8_t prefix_layers_length;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static bool clear_modifiers_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace plugin
|
||||||
|
} // namespace kaleidoscope
|
||||||
|
|
||||||
|
extern kaleidoscope::plugin::PrefixLayer PrefixLayer;
|
@ -0,0 +1,68 @@
|
|||||||
|
/* -*- mode: c++ -*-
|
||||||
|
* Copyright (C) 2022 iliana etaoin <iliana@buttslol.net>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under
|
||||||
|
* the terms of the GNU General Public License as published by the Free Software
|
||||||
|
* Foundation, version 3.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with
|
||||||
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <Kaleidoscope.h>
|
||||||
|
#include <Kaleidoscope-PrefixLayer.h>
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
KEYMAPS(
|
||||||
|
[0] = KEYMAP_STACKED
|
||||||
|
(ShiftToLayer(1), ___, ___, ___, ___, ___, ___,
|
||||||
|
Key_LeftControl, Key_LeftShift, ___, ___, ___, ___, ___,
|
||||||
|
Key_H, Key_J, Key_K, ___, ___, ___,
|
||||||
|
___, ___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___,
|
||||||
|
___,
|
||||||
|
|
||||||
|
___, ___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___,
|
||||||
|
___),
|
||||||
|
|
||||||
|
[1] = KEYMAP_STACKED
|
||||||
|
(___, ___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___, ___, ___, ___,
|
||||||
|
___, Key_DownArrow, XXX, ___, ___, ___,
|
||||||
|
___, ___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___,
|
||||||
|
___,
|
||||||
|
|
||||||
|
___, ___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___, ___, ___, ___,
|
||||||
|
___, ___, ___, ___,
|
||||||
|
___),
|
||||||
|
)
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
static const kaleidoscope::plugin::PrefixLayer::Entry prefix_layers[] PROGMEM = {
|
||||||
|
kaleidoscope::plugin::PrefixLayer::Entry(1, LCTRL(Key_B)),
|
||||||
|
};
|
||||||
|
|
||||||
|
KALEIDOSCOPE_INIT_PLUGINS(PrefixLayer);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Kaleidoscope.setup();
|
||||||
|
PrefixLayer.prefix_layers = prefix_layers;
|
||||||
|
PrefixLayer.prefix_layers_length = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
Kaleidoscope.loop();
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"cpu": {
|
||||||
|
"fqbn": "keyboardio:virtual:model01",
|
||||||
|
"port": ""
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,231 @@
|
|||||||
|
VERSION 1
|
||||||
|
|
||||||
|
KEYSWITCH PREFIX_B 0 0
|
||||||
|
KEYSWITCH CTRL 1 0
|
||||||
|
KEYSWITCH SHIFT 1 1
|
||||||
|
KEYSWITCH H 2 0
|
||||||
|
KEYSWITCH J 2 1
|
||||||
|
KEYSWITCH K 2 2
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
NAME Prefix layer passthrough
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS PREFIX_B
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT no keyboard-report # no report after pressing PREFIX_B
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS H
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report Key_LCtrl # press Ctrl
|
||||||
|
EXPECT keyboard-report Key_LCtrl Key_B # press B, Ctrl held
|
||||||
|
EXPECT keyboard-report Key_LCtrl # release B, Ctrl held
|
||||||
|
EXPECT keyboard-report empty # release Ctrl
|
||||||
|
EXPECT keyboard-report Key_H # press H
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE H
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report empty # release H
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE PREFIX_B
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT no keyboard-report # no report after releasing PREFIX_B
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
NAME Prefix layer explicit
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS PREFIX_B
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT no keyboard-report # no report after pressing PREFIX_B
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS J
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report Key_LCtrl # press Ctrl
|
||||||
|
EXPECT keyboard-report Key_LCtrl Key_B # press B, Ctrl held
|
||||||
|
EXPECT keyboard-report Key_LCtrl # release B, Ctrl held
|
||||||
|
EXPECT keyboard-report empty # release Ctrl
|
||||||
|
EXPECT keyboard-report Key_DownArrow # press J
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE J
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report empty # release J
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE PREFIX_B
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT no keyboard-report # no report after releasing PREFIX_B
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
NAME Prefix layer masked
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS PREFIX_B
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT no keyboard-report # no report after pressing PREFIX_B
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS K
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT no keyboard-report # press K (masked)
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE K
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT no keyboard-report # release K (masked)
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE PREFIX_B
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT no keyboard-report # no report after releasing PREFIX_B
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
NAME Prefix layer same modifier first
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS CTRL
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report Key_LCtrl # press Ctrl
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS PREFIX_B
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT no keyboard-report # no report after pressing PREFIX_B
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS H
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report Key_LCtrl Key_B # press B, Ctrl held
|
||||||
|
EXPECT keyboard-report Key_LCtrl # release B, Ctrl held
|
||||||
|
EXPECT keyboard-report Key_LCtrl Key_H # press H
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE H
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report Key_LCtrl # release H
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE PREFIX_B
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT no keyboard-report # no report after releasing PREFIX_B
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE CTRL
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report empty # release Ctrl
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
NAME Prefix layer same modifier second
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS PREFIX_B
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT no keyboard-report # no report after pressing PREFIX_B
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS CTRL
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report Key_LCtrl # press Ctrl
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS H
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report Key_LCtrl Key_B # press B, Ctrl held
|
||||||
|
EXPECT keyboard-report Key_LCtrl # release B, Ctrl held
|
||||||
|
EXPECT keyboard-report Key_LCtrl Key_H # press H
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE H
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report Key_LCtrl # release H
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE CTRL
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report empty # release Ctrl
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE PREFIX_B
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT no keyboard-report # no report after releasing PREFIX_B
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
NAME Prefix layer different modifier first
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS SHIFT
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report Key_LShift # press Shift
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS PREFIX_B
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT no keyboard-report # no report after pressing PREFIX_B
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS H
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report Key_LShift Key_LCtrl # press Ctrl
|
||||||
|
EXPECT keyboard-report Key_LCtrl # release pressed shift
|
||||||
|
EXPECT keyboard-report Key_LCtrl Key_B # press B, Ctrl held
|
||||||
|
EXPECT keyboard-report Key_LCtrl # release B, Ctrl held
|
||||||
|
EXPECT keyboard-report Key_LShift # restoring pressed Shift
|
||||||
|
EXPECT keyboard-report Key_LShift Key_H # press H
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE H
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report Key_LShift # release H
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE PREFIX_B
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT no keyboard-report # no report after releasing PREFIX_B
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE SHIFT
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report empty # release Ctrl
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
NAME Prefix layer different modifier second
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS PREFIX_B
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT no keyboard-report # no report after pressing PREFIX_B
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS SHIFT
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report Key_LShift # press Shift
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
PRESS H
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report Key_LShift Key_LCtrl # press Ctrl
|
||||||
|
EXPECT keyboard-report Key_LCtrl # release pressed shift
|
||||||
|
EXPECT keyboard-report Key_LCtrl Key_B # press B, Ctrl held
|
||||||
|
EXPECT keyboard-report Key_LCtrl # release B, Ctrl held
|
||||||
|
EXPECT keyboard-report Key_LShift # restoring pressed Shift
|
||||||
|
EXPECT keyboard-report Key_LShift Key_H # press H
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE H
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report Key_LShift # release H
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE SHIFT
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT keyboard-report empty # release Ctrl
|
||||||
|
|
||||||
|
RUN 4 ms
|
||||||
|
RELEASE PREFIX_B
|
||||||
|
RUN 1 cycle
|
||||||
|
EXPECT no keyboard-report # no report after releasing PREFIX_B
|
Loading…
Reference in new issue