Additional changes for Layer State typedef compatibility (#5906)

* Additional changes for Layer State typedef compatibility

* Replace biton32 with get_highest_layer in docs

* Change additional layer structure code

* Fix uGFX reference issue

* Remove dynamic_keymap check

* Where did all these extra spaces come from

Co-Authored-By: fauxpark <fauxpark@gmail.com>
This commit is contained in:
Drashna Jaelre 2019-08-21 17:07:49 -07:00 committed by GitHub
parent d534c72a54
commit b62e160a89
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 25 additions and 21 deletions

View file

@ -297,8 +297,8 @@ This runs code every time that the layers get changed. This can be useful for l
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 ```c
uint32_t layer_state_set_user(uint32_t state) { layer_state_t layer_state_set_user(layer_state_t state) {
switch (biton32(state)) { switch (get_highest_layer(state)) {
case _RAISE: case _RAISE:
rgblight_setrgb (0x00, 0x00, 0xFF); rgblight_setrgb (0x00, 0x00, 0xFF);
break; break;
@ -320,8 +320,8 @@ uint32_t layer_state_set_user(uint32_t state) {
``` ```
### `layer_state_set_*` Function Documentation ### `layer_state_set_*` Function Documentation
* Keyboard/Revision: `uint32_t layer_state_set_kb(uint32_t state)` * Keyboard/Revision: `layer_state_t layer_state_set_kb(layer_state_t state)`
* Keymap: `uint32_t layer_state_set_user(uint32_t state)` * Keymap: `layer_state_t layer_state_set_user(layer_state_t state)`
The `state` is the bitmask of the active layers, as explained in the [Keymap Overview](keymap.md#keymap-layer-status) The `state` is the bitmask of the active layers, as explained in the [Keymap Overview](keymap.md#keymap-layer-status)
@ -377,8 +377,8 @@ void keyboard_post_init_user(void) {
The above function will use the EEPROM config immediately after reading it, to set the default layer's RGB color. The "raw" value of it is converted in a usable structure based on the "union" that you created above. The above function will use the EEPROM config immediately after reading it, to set the default layer's RGB color. The "raw" value of it is converted in a usable structure based on the "union" that you created above.
```c ```c
uint32_t layer_state_set_user(uint32_t state) { layer_state_t layer_state_set_user(layer_state_t state) {
switch (biton32(state)) { switch (get_highest_layer(state)) {
case _RAISE: case _RAISE:
if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_magenta(); rgblight_mode_noeeprom(1); } if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_magenta(); rgblight_mode_noeeprom(1); }
break; break;

View file

@ -31,7 +31,7 @@ This enables the feature and the `OLED_DRIVER_ENABLE` define. Then in your `keym
void oled_task_user(void) { void oled_task_user(void) {
// Host Keyboard Layer Status // Host Keyboard Layer Status
oled_write_P(PSTR("Layer: "), false); oled_write_P(PSTR("Layer: "), false);
switch (biton32(layer_state)) { switch (get_highest_layer(layer_state)) {
case _QWERTY: case _QWERTY:
oled_write_P(PSTR("Default\n"), false); oled_write_P(PSTR("Default\n"), false);
break; break;

View file

@ -115,11 +115,11 @@ For instance, let's look at the `layer_state_set_user()` function. You can enab
In your `<name.c>` file, you'd want to add this: In your `<name.c>` file, you'd want to add this:
```c ```c
__attribute__ ((weak)) __attribute__ ((weak))
uint32_t layer_state_set_keymap (uint32_t state) { layer_state_t layer_state_set_keymap (layer_state_t state) {
return state; return state;
} }
uint32_t layer_state_set_user (uint32_t state) { layer_state_t layer_state_set_user (layer_state_t state) {
state = update_tri_layer_state(state, 2, 3, 5); state = update_tri_layer_state(state, 2, 3, 5);
return layer_state_set_keymap (state); return layer_state_set_keymap (state);
} }

View file

@ -50,7 +50,7 @@ The caveat to this method is that you cannot access the `z` layer without having
#### Example #### Example
```c ```c
uint32_t layer_state_set_user(uint32_t state) { layer_state_t layer_state_set_user(layer_state_t state) {
return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
} }
``` ```
@ -58,7 +58,7 @@ uint32_t layer_state_set_user(uint32_t state) {
Alternatively, you don't have to immediately "return" the value. This is useful if you want to add multiple tri layers, or if you want to add additional effects. Alternatively, you don't have to immediately "return" the value. This is useful if you want to add multiple tri layers, or if you want to add additional effects.
```c ```c
uint32_t layer_state_set_user(uint32_t state) { layer_state_t layer_state_set_user(layer_state_t state) {
state = update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); state = update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
state = update_tri_layer_state(state, _RAISE, _SYMB, _SPECIAL); state = update_tri_layer_state(state, _RAISE, _SYMB, _SPECIAL);
return state; return state;

View file

@ -931,9 +931,9 @@ void set_single_persistent_default_layer(uint8_t default_layer) {
default_layer_set(1U<<default_layer); default_layer_set(1U<<default_layer);
} }
uint32_t update_tri_layer_state(uint32_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3) { layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
uint32_t mask12 = (1UL << layer1) | (1UL << layer2); layer_state_t mask12 = (1UL << layer1) | (1UL << layer2);
uint32_t mask3 = 1UL << layer3; layer_state_t mask3 = 1UL << layer3;
return (state & mask12) == mask12 ? (state | mask3) : (state & ~mask3); return (state & mask12) == mask12 ? (state | mask3) : (state & ~mask3);
} }

View file

@ -213,7 +213,7 @@ void send_char(char ascii_code);
// For tri-layer // For tri-layer
void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3); void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3);
uint32_t update_tri_layer_state(uint32_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3); layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3);
void set_single_persistent_default_layer(uint8_t default_layer); void set_single_persistent_default_layer(uint8_t default_layer);

View file

@ -437,7 +437,7 @@ uint8_t visualizer_get_mods() {
if (!has_oneshot_mods_timed_out()) { if (!has_oneshot_mods_timed_out()) {
mods |= get_oneshot_mods(); mods |= get_oneshot_mods();
} }
#endif #endif
return mods; return mods;
} }
@ -447,7 +447,7 @@ void visualizer_set_user_data(void* u) {
} }
#endif #endif
void visualizer_update(uint32_t default_state, uint32_t state, uint8_t mods, uint32_t leds) { void visualizer_update(layer_state_t default_state, layer_state_t state, uint8_t mods, uint32_t leds) {
// Note that there's a small race condition here, the thread could read // Note that there's a small race condition here, the thread could read
// a state where one of these are set but not the other. But this should // a state where one of these are set but not the other. But this should
// not really matter as it will be fixed during the next loop step. // not really matter as it will be fixed during the next loop step.

View file

@ -30,6 +30,7 @@ SOFTWARE.
#include "config.h" #include "config.h"
#include "gfx.h" #include "gfx.h"
#include "action_layer.h"
#ifdef LCD_BACKLIGHT_ENABLE #ifdef LCD_BACKLIGHT_ENABLE
#include "lcd_backlight.h" #include "lcd_backlight.h"
@ -45,7 +46,7 @@ uint8_t visualizer_get_mods(void);
// This need to be called once at the start // This need to be called once at the start
void visualizer_init(void); void visualizer_init(void);
// This should be called at every matrix scan // This should be called at every matrix scan
void visualizer_update(uint32_t default_state, uint32_t state, uint8_t mods, uint32_t leds); void visualizer_update(layer_state_t default_state, layer_state_t state, uint8_t mods, uint32_t leds);
// This should be called when the keyboard goes to suspend state // This should be called when the keyboard goes to suspend state
void visualizer_suspend(void); void visualizer_suspend(void);
@ -68,8 +69,8 @@ void draw_emulator(void);
struct keyframe_animation_t; struct keyframe_animation_t;
typedef struct { typedef struct {
uint32_t layer; layer_state_t layer;
uint32_t default_layer; layer_state_t default_layer;
uint32_t leds; // See led.h for available statuses uint32_t leds; // See led.h for available statuses
uint8_t mods; uint8_t mods;
bool suspended; bool suspended;

View file

@ -21,12 +21,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "keyboard.h" #include "keyboard.h"
#include "action.h" #include "action.h"
#if defined(LAYER_STATE_8BIT) || ( defined(DYNAMIC_KEYMAP_ENABLE) && DYNAMIC_KEYMAP_LAYER_COUNT >= 8 ) #if defined(LAYER_STATE_8BIT)
typedef uint8_t layer_state_t; typedef uint8_t layer_state_t;
#define get_highest_layer(state) biton8(state)
#elif defined(LAYER_STATE_16BIT) #elif defined(LAYER_STATE_16BIT)
typedef uint16_t layer_state_t; typedef uint16_t layer_state_t;
#define get_highest_layer(state) biton16(state)
#else #else
typedef uint32_t layer_state_t; typedef uint32_t layer_state_t;
#define get_highest_layer(state) biton32(state)
#endif #endif