summaryrefslogtreecommitdiff
path: root/quantum/action_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/action_util.c')
-rw-r--r--quantum/action_util.c174
1 files changed, 107 insertions, 67 deletions
diff --git a/quantum/action_util.c b/quantum/action_util.c
index 78e02aec18..64a1b6b30d 100644
--- a/quantum/action_util.c
+++ b/quantum/action_util.c
@@ -21,12 +21,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "action_layer.h"
#include "timer.h"
#include "keycode_config.h"
+#include <string.h>
extern keymap_config_t keymap_config;
-static uint8_t real_mods = 0;
-static uint8_t weak_mods = 0;
-static uint8_t macro_mods = 0;
+static uint8_t real_mods = 0;
+static uint8_t weak_mods = 0;
#ifdef KEY_OVERRIDE_ENABLE
static uint8_t weak_override_mods = 0;
static uint8_t suppressed_mods = 0;
@@ -43,8 +43,10 @@ extern inline void clear_keys(void);
#ifndef NO_ACTION_ONESHOT
static uint8_t oneshot_mods = 0;
static uint8_t oneshot_locked_mods = 0;
-uint8_t get_oneshot_locked_mods(void) { return oneshot_locked_mods; }
-void set_oneshot_locked_mods(uint8_t mods) {
+uint8_t get_oneshot_locked_mods(void) {
+ return oneshot_locked_mods;
+}
+void set_oneshot_locked_mods(uint8_t mods) {
if (mods != oneshot_locked_mods) {
oneshot_locked_mods = mods;
oneshot_locked_mods_changed_kb(oneshot_locked_mods);
@@ -58,9 +60,13 @@ void clear_oneshot_locked_mods(void) {
}
# if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
static uint16_t oneshot_time = 0;
-bool has_oneshot_mods_timed_out(void) { return TIMER_DIFF_16(timer_read(), oneshot_time) >= ONESHOT_TIMEOUT; }
+bool has_oneshot_mods_timed_out(void) {
+ return TIMER_DIFF_16(timer_read(), oneshot_time) >= ONESHOT_TIMEOUT;
+}
# else
-bool has_oneshot_mods_timed_out(void) { return false; }
+bool has_oneshot_mods_timed_out(void) {
+ return false;
+}
# endif
#endif
@@ -74,24 +80,32 @@ bool has_oneshot_mods_timed_out(void) { return false; }
*/
static int8_t oneshot_layer_data = 0;
-inline uint8_t get_oneshot_layer(void) { return oneshot_layer_data >> 3; }
-inline uint8_t get_oneshot_layer_state(void) { return oneshot_layer_data & 0b111; }
+inline uint8_t get_oneshot_layer(void) {
+ return oneshot_layer_data >> 3;
+}
+inline uint8_t get_oneshot_layer_state(void) {
+ return oneshot_layer_data & 0b111;
+}
# ifdef SWAP_HANDS_ENABLE
enum {
SHO_OFF,
- SHO_ACTIVE, // Swap hands button was pressed, and we didn't send any swapped keys yet
- SHO_PRESSED, // Swap hands button is currently pressed
- SHO_USED, // Swap hands button is still pressed, and we already sent swapped keys
+ SHO_ACTIVE, // Swap hands button was pressed, and we didn't send any swapped keys yet
+ SHO_PRESSED, // Swap hands button is currently pressed
+ SHO_USED, // Swap hands button is still pressed, and we already sent swapped keys
} swap_hands_oneshot = SHO_OFF;
# endif
# if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
static uint16_t oneshot_layer_time = 0;
-inline bool has_oneshot_layer_timed_out() { return TIMER_DIFF_16(timer_read(), oneshot_layer_time) >= ONESHOT_TIMEOUT && !(get_oneshot_layer_state() & ONESHOT_TOGGLED); }
+inline bool has_oneshot_layer_timed_out() {
+ return TIMER_DIFF_16(timer_read(), oneshot_layer_time) >= ONESHOT_TIMEOUT && !(get_oneshot_layer_state() & ONESHOT_TOGGLED);
+}
# ifdef SWAP_HANDS_ENABLE
static uint16_t oneshot_swaphands_time = 0;
-inline bool has_oneshot_swaphands_timed_out() { return TIMER_DIFF_16(timer_read(), oneshot_swaphands_time) >= ONESHOT_TIMEOUT && (swap_hands_oneshot == SHO_ACTIVE); }
+inline bool has_oneshot_swaphands_timed_out() {
+ return TIMER_DIFF_16(timer_read(), oneshot_swaphands_time) >= ONESHOT_TIMEOUT && (swap_hands_oneshot == SHO_ACTIVE);
+}
# endif
# endif
@@ -179,7 +193,9 @@ void clear_oneshot_layer_state(oneshot_fullfillment_t state) {
*
* FIXME: needs doc
*/
-bool is_oneshot_layer_active(void) { return get_oneshot_layer_state(); }
+bool is_oneshot_layer_active(void) {
+ return get_oneshot_layer_state();
+}
/** \brief set oneshot
*
@@ -198,21 +214,29 @@ void oneshot_set(bool active) {
*
* FIXME: needs doc
*/
-void oneshot_toggle(void) { oneshot_set(!keymap_config.oneshot_disable); }
+void oneshot_toggle(void) {
+ oneshot_set(!keymap_config.oneshot_disable);
+}
/** \brief enable oneshot
*
* FIXME: needs doc
*/
-void oneshot_enable(void) { oneshot_set(true); }
+void oneshot_enable(void) {
+ oneshot_set(true);
+}
/** \brief disable oneshot
*
* FIXME: needs doc
*/
-void oneshot_disable(void) { oneshot_set(false); }
+void oneshot_disable(void) {
+ oneshot_set(false);
+}
-bool is_oneshot_enabled(void) { return keymap_config.oneshot_disable; }
+bool is_oneshot_enabled(void) {
+ return keymap_config.oneshot_disable;
+}
#endif
@@ -223,7 +247,6 @@ bool is_oneshot_enabled(void) { return keymap_config.oneshot_disable; }
void send_keyboard_report(void) {
keyboard_report->mods = real_mods;
keyboard_report->mods |= weak_mods;
- keyboard_report->mods |= macro_mods;
#ifndef NO_ACTION_ONESHOT
if (oneshot_mods) {
@@ -247,110 +270,119 @@ void send_keyboard_report(void) {
keyboard_report->mods |= weak_override_mods;
#endif
- host_keyboard_send(keyboard_report);
+ static report_keyboard_t last_report;
+
+ /* Only send the report if there are changes to propagate to the host. */
+ if (memcmp(keyboard_report, &last_report, sizeof(report_keyboard_t)) != 0) {
+ memcpy(&last_report, keyboard_report, sizeof(report_keyboard_t));
+ host_keyboard_send(keyboard_report);
+ }
}
/** \brief Get mods
*
* FIXME: needs doc
*/
-uint8_t get_mods(void) { return real_mods; }
+uint8_t get_mods(void) {
+ return real_mods;
+}
/** \brief add mods
*
* FIXME: needs doc
*/
-void add_mods(uint8_t mods) { real_mods |= mods; }
+void add_mods(uint8_t mods) {
+ real_mods |= mods;
+}
/** \brief del mods
*
* FIXME: needs doc
*/
-void del_mods(uint8_t mods) { real_mods &= ~mods; }
+void del_mods(uint8_t mods) {
+ real_mods &= ~mods;
+}
/** \brief set mods
*
* FIXME: needs doc
*/
-void set_mods(uint8_t mods) { real_mods = mods; }
+void set_mods(uint8_t mods) {
+ real_mods = mods;
+}
/** \brief clear mods
*
* FIXME: needs doc
*/
-void clear_mods(void) { real_mods = 0; }
+void clear_mods(void) {
+ real_mods = 0;
+}
/** \brief get weak mods
*
* FIXME: needs doc
*/
-uint8_t get_weak_mods(void) { return weak_mods; }
+uint8_t get_weak_mods(void) {
+ return weak_mods;
+}
/** \brief add weak mods
*
* FIXME: needs doc
*/
-void add_weak_mods(uint8_t mods) { weak_mods |= mods; }
+void add_weak_mods(uint8_t mods) {
+ weak_mods |= mods;
+}
/** \brief del weak mods
*
* FIXME: needs doc
*/
-void del_weak_mods(uint8_t mods) { weak_mods &= ~mods; }
+void del_weak_mods(uint8_t mods) {
+ weak_mods &= ~mods;
+}
/** \brief set weak mods
*
* FIXME: needs doc
*/
-void set_weak_mods(uint8_t mods) { weak_mods = mods; }
+void set_weak_mods(uint8_t mods) {
+ weak_mods = mods;
+}
/** \brief clear weak mods
*
* FIXME: needs doc
*/
-void clear_weak_mods(void) { weak_mods = 0; }
+void clear_weak_mods(void) {
+ weak_mods = 0;
+}
#ifdef KEY_OVERRIDE_ENABLE
/** \brief set weak mods used by key overrides. DO not call this manually
*/
-void set_weak_override_mods(uint8_t mods) { weak_override_mods = mods; }
+void set_weak_override_mods(uint8_t mods) {
+ weak_override_mods = mods;
+}
/** \brief clear weak mods used by key overrides. DO not call this manually
*/
-void clear_weak_override_mods(void) { weak_override_mods = 0; }
+void clear_weak_override_mods(void) {
+ weak_override_mods = 0;
+}
/** \brief set suppressed mods used by key overrides. DO not call this manually
*/
-void set_suppressed_override_mods(uint8_t mods) { suppressed_mods = mods; }
+void set_suppressed_override_mods(uint8_t mods) {
+ suppressed_mods = mods;
+}
/** \brief clear suppressed mods used by key overrides. DO not call this manually
*/
-void clear_suppressed_override_mods(void) { suppressed_mods = 0; }
+void clear_suppressed_override_mods(void) {
+ suppressed_mods = 0;
+}
#endif
-/* macro modifier */
-/** \brief get macro mods
- *
- * FIXME: needs doc
- */
-uint8_t get_macro_mods(void) { return macro_mods; }
-/** \brief add macro mods
- *
- * FIXME: needs doc
- */
-void add_macro_mods(uint8_t mods) { macro_mods |= mods; }
-/** \brief del macro mods
- *
- * FIXME: needs doc
- */
-void del_macro_mods(uint8_t mods) { macro_mods &= ~mods; }
-/** \brief set macro mods
- *
- * FIXME: needs doc
- */
-void set_macro_mods(uint8_t mods) { macro_mods = mods; }
-/** \brief clear macro mods
- *
- * FIXME: needs doc
- */
-void clear_macro_mods(void) { macro_mods = 0; }
-
#ifndef NO_ACTION_ONESHOT
/** \brief get oneshot mods
*
* FIXME: needs doc
*/
-uint8_t get_oneshot_mods(void) { return oneshot_mods; }
+uint8_t get_oneshot_mods(void) {
+ return oneshot_mods;
+}
void add_oneshot_mods(uint8_t mods) {
if ((oneshot_mods & mods) != mods) {
@@ -413,7 +445,9 @@ __attribute__((weak)) void oneshot_locked_mods_changed_user(uint8_t mods) {}
*
* \param mods Contains the active modifiers active after the change.
*/
-__attribute__((weak)) void oneshot_locked_mods_changed_kb(uint8_t mods) { oneshot_locked_mods_changed_user(mods); }
+__attribute__((weak)) void oneshot_locked_mods_changed_kb(uint8_t mods) {
+ oneshot_locked_mods_changed_user(mods);
+}
/** \brief Called when the one shot modifiers have been changed.
*
@@ -425,7 +459,9 @@ __attribute__((weak)) void oneshot_mods_changed_user(uint8_t mods) {}
*
* \param mods Contains the active modifiers active after the change.
*/
-__attribute__((weak)) void oneshot_mods_changed_kb(uint8_t mods) { oneshot_mods_changed_user(mods); }
+__attribute__((weak)) void oneshot_mods_changed_kb(uint8_t mods) {
+ oneshot_mods_changed_user(mods);
+}
/** \brief Called when the one shot layers have been changed.
*
@@ -437,10 +473,14 @@ __attribute__((weak)) void oneshot_layer_changed_user(uint8_t layer) {}
*
* \param layer Contains the layer that is toggled on, or zero when toggled off.
*/
-__attribute__((weak)) void oneshot_layer_changed_kb(uint8_t layer) { oneshot_layer_changed_user(layer); }
+__attribute__((weak)) void oneshot_layer_changed_kb(uint8_t layer) {
+ oneshot_layer_changed_user(layer);
+}
/** \brief inspect keyboard state
*
* FIXME: needs doc
*/
-uint8_t has_anymod(void) { return bitpop(real_mods); }
+uint8_t has_anymod(void) {
+ return bitpop(real_mods);
+}