diff --git a/doc/plugin/Redial.md b/doc/plugin/Redial.md new file mode 100644 index 00000000..67cd56b2 --- /dev/null +++ b/doc/plugin/Redial.md @@ -0,0 +1,63 @@ +# Kaleidoscope-Redial + +If you ever wanted to just repeat the last key pressed, no matter what it was, +this plugin is made for you. It allows you to configure a key that will repeat +whatever the last previously pressed key was. Of course, one can limit which +keys are remembered... + +## Using the plugin + +To use the plugin, we'll need to enable it, and configure a key to act as the +"redial" key. This key should be on the keymap too. + +```c++ +#include +#include +#include + +enum { + REDIAL = kaleidoscope::ranges::SAFE_START, +}; +#define Key_Redial (Key) {.raw = REDIAL} + +// Place Key_Redial somewhere on the keymap... + +KALEIDOSCOPE_INIT_PLUGINS(Redial); + +void setup() { + Kaleidoscope.setup(); + + Redial.key = Key_Redial; +} +``` + +## Overrideable plugin methods + +### `bool shouldRemember(Key mapped_key)` + +> If one wants to change what keys the plugin remembers, simply override the +> `kaleidoscope::Redial::shouldRemember` function. Whenever a key is to be +> remembered, this function will be called with the key as argument. It should +> return `true` if the key should be remembered (and repeated by Redial), +> `false` otherwise. +> +> By default, the plugin will remember alphanumeric keys only. + +## Plugin properties + +The `Redial` object has only one property, the key to trigger it. + +### `.key` + +> The key to trigger the redial effect. Be aware that whatever key you specify +> here, will have its action shadowed by the redial functionality. Choose +> something unused, see the example sketch for one way to do that. +> +> There is no default. + +## Further reading + +Starting from the [example][plugin:example] is the recommended way of getting +started with the plugin. + + [plugin:example]: ../../examples/Redial/Redial.ino diff --git a/examples/Redial/Redial.ino b/examples/Redial/Redial.ino new file mode 100644 index 00000000..293d0996 --- /dev/null +++ b/examples/Redial/Redial.ino @@ -0,0 +1,66 @@ +/* -*- mode: c++ -*- + * Kaleidoscope-Redial -- Redial support for Kaleidoscope + * Copyright (C) 2018 Gergely Nagy + * + * 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, either version 3 of the License, or + * (at your option) any later version. + * + * 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 . + */ + +#include +#include +#include + +enum { + REDIAL = kaleidoscope::ranges::SAFE_START, +}; +#define Key_Redial (Key) {.raw = REDIAL} + +bool kaleidoscope::plugin::Redial::shouldRemember(Key mapped_key) { + if (mapped_key >= Key_A && mapped_key <= Key_Z) + return true; + return false; +} + +// *INDENT-OFF* +const Key keymaps[][ROWS][COLS] PROGMEM = { + [0] = KEYMAP_STACKED + ( + Key_NoKey, Key_1, Key_2, Key_3, Key_4, Key_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_Redial, + + Key_skip, Key_6, Key_7, Key_8, Key_9, Key_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_Redial), +}; +// *INDENT-ON* + +KALEIDOSCOPE_INIT_PLUGINS(Redial); + +void setup() { + Kaleidoscope.setup(); + + Redial.key = Key_Redial; +} + +void loop() { + Kaleidoscope.loop(); +} diff --git a/src/Kaleidoscope-Redial.h b/src/Kaleidoscope-Redial.h new file mode 100644 index 00000000..378b0177 --- /dev/null +++ b/src/Kaleidoscope-Redial.h @@ -0,0 +1,21 @@ +/* -*- mode: c++ -*- + * Kaleidoscope-Redial -- Redial support for Kaleidoscope + * Copyright (C) 2018 Gergely Nagy + * + * 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, either version 3 of the License, or + * (at your option) any later version. + * + * 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 . + */ + +#pragma once + +#include diff --git a/src/kaleidoscope/plugin/Redial.cpp b/src/kaleidoscope/plugin/Redial.cpp new file mode 100644 index 00000000..6bfaa538 --- /dev/null +++ b/src/kaleidoscope/plugin/Redial.cpp @@ -0,0 +1,55 @@ +/* -*- mode: c++ -*- + * Kaleidoscope-Redial -- Redial support for Kaleidoscope + * Copyright (C) 2018 Gergely Nagy + * + * 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, either version 3 of the License, or + * (at your option) any later version. + * + * 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 . + */ + +#include + +namespace kaleidoscope { +namespace plugin { + +Key Redial::key; +Key Redial::key_to_redial_; + +EventHandlerResult Redial::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) { + if (key == Key_NoKey) + return EventHandlerResult::OK; + + if (mapped_key == key) { + mapped_key = key_to_redial_; + return EventHandlerResult::OK; + } + + if (keyToggledOn(key_state) && shouldRemember(mapped_key)) { + key_to_redial_ = mapped_key; + } + + return EventHandlerResult::OK; +} + +__attribute__((weak)) bool Redial::shouldRemember(Key mapped_key) { + if (mapped_key >= Key_A && mapped_key <= Key_Z) + return true; + if (mapped_key >= Key_1 && mapped_key <= Key_0) + return true; + + return false; +} + +} +} + +kaleidoscope::plugin::Redial Redial; diff --git a/src/kaleidoscope/plugin/Redial.h b/src/kaleidoscope/plugin/Redial.h new file mode 100644 index 00000000..72519672 --- /dev/null +++ b/src/kaleidoscope/plugin/Redial.h @@ -0,0 +1,43 @@ +/* -*- mode: c++ -*- + * Kaleidoscope-Redial -- Redial support for Kaleidoscope + * Copyright (C) 2018 Gergely Nagy + * + * 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, either version 3 of the License, or + * (at your option) any later version. + * + * 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 . + */ + +#pragma once + +#include + +namespace kaleidoscope { +namespace plugin { + +class Redial : public kaleidoscope::Plugin { + public: + Redial(void) {} + + static Key key; + + static bool shouldRemember(Key mappedKey); + + EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state); + + private: + static Key key_to_redial_; +}; + +} +} + +extern kaleidoscope::plugin::Redial Redial;