commit
9c885a0458
@ -0,0 +1,51 @@
|
||||
# Kaleidoscope-TopsyTurvy
|
||||
|
||||
`TopsyTurvy` is a plugin that inverts the behaviour of the `Shift` key for some
|
||||
selected keys. That is, if configured so, it will input `!` when pressing the
|
||||
`1` key without `Shift`, but with the modifier pressed, it will input the
|
||||
original `1` symbol.
|
||||
|
||||
## Using the plugin
|
||||
|
||||
To use the plugin, one needs to include the header, mark keys to apply plugin
|
||||
effects to, and use the plugin:
|
||||
|
||||
```c++
|
||||
#include <Kaleidoscope.h>
|
||||
#include <Kaleidoscope-TopsyTurvy.h>
|
||||
|
||||
// In the keymap:
|
||||
TOPSY(1), TOPSY(2), TOPSY(3)
|
||||
|
||||
KALEIDOSCOPE_INIT_PLUGINS(TopsyTurvy);
|
||||
|
||||
void setup () {
|
||||
Kaleidoscope.setup ();
|
||||
}
|
||||
```
|
||||
|
||||
## Keymap markup
|
||||
|
||||
There is only one macro that the plugin provides, which one can use in keymap definitions:
|
||||
|
||||
### `TOPSY(key)`
|
||||
|
||||
> Mark the specified `key` (without the `Key_` prefix!) for TopsyTurvy, and swap
|
||||
> the effect of `Shift` when the key is used. One can have any number of
|
||||
> topsy-turvy keys on a keymap.
|
||||
>
|
||||
> The keys must be plain old keys, modifiers or anything other augmentation
|
||||
> cannot be applied.
|
||||
|
||||
The plugin provides a number of macros one can use in keymap definitions:
|
||||
|
||||
## Plugin methods
|
||||
|
||||
The plugin provides the `TopsyTurvy` object, without any public methods or properties.
|
||||
|
||||
## Further reading
|
||||
|
||||
Starting from the [example][plugin:example] is the recommended way of getting
|
||||
started with the plugin.
|
||||
|
||||
[plugin:example]: ../../examples/TopsyTurvy/TopsyTurvy.ino
|
@ -0,0 +1,51 @@
|
||||
/* -*- mode: c++ -*-
|
||||
* Kaleidoscope-TopsyTurvy -- Turn the effect of Shift upside down for certain keys
|
||||
* Copyright (C) 2017, 2018 Keyboard.io, Inc
|
||||
*
|
||||
* 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-TopsyTurvy.h>
|
||||
|
||||
// *INDENT-OFF*
|
||||
const Key keymaps[][ROWS][COLS] PROGMEM = {
|
||||
[0] = KEYMAP_STACKED
|
||||
(
|
||||
Key_NoKey, TOPSY(1), TOPSY(2), TOPSY(3), TOPSY(4), TOPSY(5), Key_NoKey,
|
||||
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,
|
||||
Key_skip,
|
||||
|
||||
Key_skip, TOPSY(6), TOPSY(7), TOPSY(8), TOPSY(9), TOPSY(0), Key_skip,
|
||||
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,
|
||||
Key_skip, Key_N, Key_M, Key_Comma, Key_Period, Key_Slash, Key_Minus,
|
||||
|
||||
Key_RightShift, Key_RightAlt, Key_Spacebar, Key_RightControl,
|
||||
Key_skip),
|
||||
};
|
||||
// *INDENT-ON*
|
||||
|
||||
KALEIDOSCOPE_INIT_PLUGINS(TopsyTurvy);
|
||||
|
||||
void setup() {
|
||||
Kaleidoscope.setup();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
Kaleidoscope.loop();
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
/* -*- mode: c++ -*-
|
||||
* Kaleidoscope-TopsyTurvy -- Turn the effect of Shift upside down for certain keys
|
||||
* Copyright (C) 2017 Keyboard.io, Inc
|
||||
*
|
||||
* 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/TopsyTurvy.h>
|
@ -0,0 +1,75 @@
|
||||
/* -*- mode: c++ -*-
|
||||
* Kaleidoscope-TopsyTurvy -- Turn the effect of Shift upside down for certain keys
|
||||
* Copyright (C) 2017, 2018 Keyboard.io, Inc
|
||||
*
|
||||
* 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-TopsyTurvy.h>
|
||||
#include "kaleidoscope/hid.h"
|
||||
|
||||
namespace kaleidoscope {
|
||||
namespace plugin {
|
||||
|
||||
uint8_t TopsyTurvy::last_pressed_position_;
|
||||
bool TopsyTurvy::is_shifted_;
|
||||
bool TopsyTurvy::is_active_;
|
||||
|
||||
EventHandlerResult TopsyTurvy::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) {
|
||||
|
||||
if (mapped_key == Key_LeftShift ||
|
||||
mapped_key == Key_RightShift) {
|
||||
is_shifted_ = keyIsPressed(key_state);
|
||||
if (is_active_)
|
||||
return EventHandlerResult::EVENT_CONSUMED;
|
||||
}
|
||||
|
||||
if (mapped_key < ranges::TT_FIRST || mapped_key > ranges::TT_LAST) {
|
||||
if (keyToggledOn(key_state) && (mapped_key < Key_LeftControl || mapped_key > Key_RightGui)) {
|
||||
last_pressed_position_ = row * COLS + col;
|
||||
}
|
||||
|
||||
return EventHandlerResult::OK;
|
||||
}
|
||||
|
||||
if (keyToggledOn(key_state)) {
|
||||
last_pressed_position_ = row * COLS + col;
|
||||
} else {
|
||||
if (last_pressed_position_ != row * COLS + col) {
|
||||
return EventHandlerResult::EVENT_CONSUMED;
|
||||
}
|
||||
}
|
||||
|
||||
is_active_ = keyIsPressed(key_state);
|
||||
mapped_key.raw = mapped_key.raw - ranges::TT_FIRST;
|
||||
|
||||
// invert the shift state
|
||||
if (!is_shifted_) {
|
||||
mapped_key.flags |= SHIFT_HELD;
|
||||
return EventHandlerResult::OK;
|
||||
}
|
||||
|
||||
if (keyIsPressed(key_state)) {
|
||||
hid::releaseKey(Key_LeftShift);
|
||||
hid::releaseKey(Key_RightShift);
|
||||
|
||||
return EventHandlerResult::OK;
|
||||
}
|
||||
|
||||
return EventHandlerResult::EVENT_CONSUMED;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
kaleidoscope::plugin::TopsyTurvy TopsyTurvy;
|
@ -0,0 +1,42 @@
|
||||
/* -*- mode: c++ -*-
|
||||
* Kaleidoscope-TopsyTurvy -- Turn the effect of Shift upside down for certain keys
|
||||
* Copyright (C) 2017, 2018 Keyboard.io, Inc
|
||||
*
|
||||
* 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.h>
|
||||
#include <Kaleidoscope-Ranges.h>
|
||||
|
||||
#define TOPSY(k) (Key) { .raw = kaleidoscope::ranges::TT_FIRST + (Key_ ## k).keyCode }
|
||||
|
||||
namespace kaleidoscope {
|
||||
namespace plugin {
|
||||
|
||||
class TopsyTurvy: public kaleidoscope::Plugin {
|
||||
public:
|
||||
TopsyTurvy(void) {}
|
||||
|
||||
EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state);
|
||||
|
||||
private:
|
||||
static uint8_t last_pressed_position_;
|
||||
static bool is_shifted_;
|
||||
static bool is_active_;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
extern kaleidoscope::plugin::TopsyTurvy TopsyTurvy;
|
Loading…
Reference in new issue