From 61b64bb82a93c6d1441f07655a5e20b59a15fd29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Thu, 16 Jul 2020 14:27:55 +0200 Subject: [PATCH] Redefine IS_LAYER_ON/OFF() as aliases for existing layer functions (#6352) * Add IS_LAYER_ON_STATE()/IS_LAYER_OFF_STATE() macros * Add docs for IS_LAYER_ON/OFF(_STATE) macros * Remove IS_LAYER_ON/OFF_STATE redefinition in userspace * Run clang-format on quantum/quantum.h * Redefine IS_LAYER_ON/OFF(_STATE) as aliases of existing layer functions Also update relevant doc entries. Needs testing to check if this breaks existing IS_LAYER_ON/OFF usage in certain edge cases (namely calling the macros with 0). * Reformat layer check function docs --- docs/custom_quantum_functions.md | 7 ++++++- docs/feature_layers.md | 15 +++++++-------- quantum/quantum.h | 7 +++++-- users/konstantin/konstantin.h | 3 --- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/docs/custom_quantum_functions.md b/docs/custom_quantum_functions.md index 6eb144af76..e15126c420 100644 --- a/docs/custom_quantum_functions.md +++ b/docs/custom_quantum_functions.md @@ -319,7 +319,7 @@ This runs code every time that the layers get changed. This can be useful for l ### Example `layer_state_set_*` Implementation -This example shows how to set the [RGB Underglow](feature_rgblight.md) lights based on the layer, using the Planck as an example +This example shows how to set the [RGB Underglow](feature_rgblight.md) lights based on the layer, using the Planck as an example. ```c layer_state_t layer_state_set_user(layer_state_t state) { @@ -343,6 +343,11 @@ layer_state_t layer_state_set_user(layer_state_t state) { return state; } ``` + +Use the `IS_LAYER_ON_STATE(state, layer)` and `IS_LAYER_OFF_STATE(state, layer)` macros to check the status of a particular layer. + +Outside of `layer_state_set_*` functions, you can use the `IS_LAYER_ON(layer)` and `IS_LAYER_OFF(layer)` macros to check global layer state. + ### `layer_state_set_*` Function Documentation * Keyboard/Revision: `layer_state_t layer_state_set_kb(layer_state_t state)` diff --git a/docs/feature_layers.md b/docs/feature_layers.md index d3ee747e69..3f62cfc805 100644 --- a/docs/feature_layers.md +++ b/docs/feature_layers.md @@ -74,10 +74,9 @@ There are a number of functions (and variables) related to how you can use or ma | [`update_tri_layer(x, y, z)`](ref_functions.md#update_tri_layerx-y-z) | Checks if layers `x` and `y` are both on, and sets `z` based on that (on if both on, otherwise off). | | [`update_tri_layer_state(state, x, y, z)`](ref_functions.md#update_tri_layer_statestate-x-y-z) | Does the same as `update_tri_layer(x, y, z)`, but from `layer_state_set_*` functions. | +In addition to the functions that you can call, there are a number of callback functions that get called every time the layer changes. This passes the layer state to the function, where it can be read or modified. -In additional to the functions that you can call, there are a number of callback functions that get called every time the layer changes. This passed the layer state to the function, which can be read or modified. - -|Callbacks |Description | +|Callback |Description | |-----------------------------------------------------|----------------------------------------------------------------------------------------| | `layer_state_set_kb(layer_state_t state)` | Callback for layer functions, for keyboard. | | `layer_state_set_user(layer_state_t state)` | Callback for layer functions, for users. | @@ -86,9 +85,9 @@ In additional to the functions that you can call, there are a number of callback ?> For additional details on how you can use these callbacks, check out the [Layer Change Code](custom_quantum_functions.md#layer-change-code) document. -|Check functions |Description | -|-------------------------------------------|------------------------------------------------------------------------------| -| `layer_state_cmp(cmp_layer_state, layer)` | This checks the `cmp_layer_state` to see if the specific `layer` is enabled. This is meant for use with the layer callbacks. | -| `layer_state_is(layer)` | This checks the layer state to see if the specific `layer` is enabled. (calls `layer_state_cmp` for the global layer state). | +It is also possible to check the state of a particular layer using the following functions and macros. -!> There is `IS_LAYER_ON(layer)` as well, however the `layer_state_cmp` function has some additional handling to ensure that on layer 0 that it returns the correct value. Otherwise, if you check to see if layer 0 is on, you may get an incorrect value returned. +|Function |Description |Aliases +|---------------------------------|-------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------| +| `layer_state_is(layer)` | Checks if the specified `layer` is enabled globally. | `IS_LAYER_ON(layer)`, `IS_LAYER_OFF(layer)` | +| `layer_state_cmp(state, layer)` | Checks `state` to see if the specified `layer` is enabled. Intended for use in layer callbacks. | `IS_LAYER_ON_STATE(state, layer)`, `IS_LAYER_OFF_STATE(state, layer)` | diff --git a/quantum/quantum.h b/quantum/quantum.h index 17d1d41cc9..51deac0cd5 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -249,8 +249,11 @@ void set_single_persistent_default_layer(uint8_t default_layer); void tap_random_base64(void); -#define IS_LAYER_ON(layer) (layer_state & (1UL << (layer))) -#define IS_LAYER_OFF(layer) (~layer_state & (1UL << (layer))) +#define IS_LAYER_ON(layer) layer_state_is(layer) +#define IS_LAYER_OFF(layer) !layer_state_is(layer) + +#define IS_LAYER_ON_STATE(state, layer) layer_state_cmp(state, layer) +#define IS_LAYER_OFF_STATE(state, layer) !layer_state_cmp(state, layer) void matrix_init_kb(void); void matrix_scan_kb(void); diff --git a/users/konstantin/konstantin.h b/users/konstantin/konstantin.h index 72a1616238..249b3fe15b 100644 --- a/users/konstantin/konstantin.h +++ b/users/konstantin/konstantin.h @@ -48,9 +48,6 @@ #define LCT_CPS LCTL_T(KC_CAPS) #define RSF_SLS RSFT_T(KC_SLSH) -#define IS_LAYER_ON_STATE(state, layer) ( (state) & (1UL << (layer))) -#define IS_LAYER_OFF_STATE(state, layer) (~(state) & (1UL << (layer))) - // Clear mods, perform action, restore mods #define CLEAN_MODS(action) { \ uint8_t mods = get_mods(); \