summaryrefslogtreecommitdiff
path: root/users/bbaserdem/bbaserdem.c
diff options
context:
space:
mode:
Diffstat (limited to 'users/bbaserdem/bbaserdem.c')
-rw-r--r--users/bbaserdem/bbaserdem.c919
1 files changed, 331 insertions, 588 deletions
diff --git a/users/bbaserdem/bbaserdem.c b/users/bbaserdem/bbaserdem.c
index cdacda12ee..e0e204c302 100644
--- a/users/bbaserdem/bbaserdem.c
+++ b/users/bbaserdem/bbaserdem.c
@@ -1,633 +1,376 @@
-#include "bbaserdem.h"
-
-/*---------------*\
-|*-----MOUSE-----*|
-\*---------------*/
-#ifdef MOUSEKEY_ENABLE
-#include "mousekey.h"
-#endif
-
-/*-------------*\
-|*-----RGB-----*|
-\*-------------*/
-#ifdef RGBLIGHT_ENABLE
-#include "rgblight.h"
-#endif
-
-/*-------------*\
-|*---UNICODE---*|
-\*-------------*/
-#ifdef UNICODE_ENABLE
-#endif
-
-/*-----------------*\
-|*-----SECRETS-----*|
-\*-----------------*/
-// Enabled by adding a non-tracked secrets.h to this dir.
-#if (__has_include("secrets.h"))
-#include "secrets.h"
-#endif
-
-/*---------------*\
-|*-----MUSIC-----*|
-\*---------------*/
-#ifdef AUDIO_ENABLE
-float tone_game[][2] = SONG(ZELDA_PUZZLE);
-float tone_return[][2] = SONG(ZELDA_TREASURE);
-float tone_linux[][2] = SONG(UNICODE_LINUX);
-float tone_windows[][2] = SONG(UNICODE_WINDOWS);
-#endif
-
-/*-------------------*\
-|*-----TAP-DANCE-----*|
-\*-------------------*/
-#ifdef TAP_DANCE_ENABLE
-qk_tap_dance_action_t tap_dance_actions[] = {
- // Shift on double tap of semicolon
- [SCL] = ACTION_TAP_DANCE_DOUBLE( KC_SCLN, KC_COLN )
-};
-#endif
-
-/* In keymaps, instead of writing _user functions, write _keymap functions
- * The __attribute__((weak)) allows for empty definitions here, and during
- * compilation, if these functions are defined elsewhere, they are written
- * over. This allows to include custom code from keymaps in the generic code
- * in this file.
+/* Copyright 2021 Batuhan Başerdem
+ * <baserdem.batuhan@gmail.com> @bbaserdem
+ *
+ * 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 2 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 <http://www.gnu.org/licenses/>.
*/
-__attribute__ ((weak)) void matrix_init_keymap(void) { }
-__attribute__ ((weak)) void matrix_scan_keymap(void) { }
-__attribute__ ((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
- return true;
+
+#include "bbaserdem.h"
+// Language imports
+#include <sendstring_dvorak.h>
+// Need memcpy and memcmp from string.h along with transfer stuff
+#ifdef SPLIT_KEYBOARD
+#include "transactions.h"
+#include <string.h>
+#endif // SPLIT_KEYBOARD
+
+/*-------------------------*\
+|*-----KEYBOARD CONFIG-----*|
+\*-------------------------*/
+userspace_config_t userspace_config;
+userspace_runtime_t userspace_runtime;
+
+/*---------------------------------*\
+|*----SPLIT KEYBOARD TRANSPORT-----*|
+\*---------------------------------*/
+#ifdef SPLIT_KEYBOARD
+userspace_config_t transport_userspace_config;
+userspace_runtime_t transport_userspace_runtime;
+
+// Translate the RPC data to the local variable
+void userspace_config_sync(uint8_t in_buflen, const void* in_data, uint8_t out_buflen, void* out_data) {
+ // Copy incoming data to local variable
+ if (in_buflen == sizeof(transport_userspace_config)) {
+ memcpy(&transport_userspace_config, in_data, in_buflen);
+ }
+ // There is no data to send back; so no output handling
}
-__attribute__ ((weak)) uint32_t layer_state_set_keymap (uint32_t state) {
- return state;
+void userspace_runtime_sync(uint8_t in_buflen, const void* in_data, uint8_t out_buflen, void* out_data) {
+ // Copy incoming data to local variable
+ if (in_buflen == sizeof(transport_userspace_runtime)) {
+ memcpy(&transport_userspace_runtime, in_data, in_buflen);
+ }
+ // There is no data to send back; so no output handling
}
-__attribute__ ((weak)) void led_set_keymap(uint8_t usb_led) { }
-/* ----------------------- *\
- * -----RGB Functions----- *
-\* ----------------------- */
-#ifdef RGBLIGHT_ENABLE
-// Storage variables
-extern rgblight_config_t rgblight_config;
-bool base_sta; // Keeps track if in saveable state
-bool base_tog; // Whether base state is active or not
-int base_hue; // Hue value of base state
-int base_sat; // Saturation value of base state
-int base_val; // Brightness value of base state
-uint8_t base_mod; // Animation mode of the base state
-
-// Save the current state of the rgb mode
-void rgblight_saveBase(void) {
- base_hue = rgblight_config.hue;
- base_sat = rgblight_config.sat;
- base_val = rgblight_config.val;
- base_mod = rgblight_config.mode;
- base_tog = rgblight_config.enable;
- base_sta = false; // If saving, that means base layer is being left
+// Either send or receive the correct data
+void userspace_transport_update(void) {
+ if (is_keyboard_master()) {
+ // If we are the main device; we want to send info.
+ transport_userspace_config.raw = userspace_config.raw;
+ transport_userspace_runtime.raw = userspace_runtime.raw;
+ } else {
+ // If we are the secondary device; we want to receive info, and save to eeprom.
+ userspace_config.raw = transport_userspace_config.raw;
+ userspace_runtime.raw = transport_userspace_runtime.raw;
+ }
}
-// Load the base state back
-void rgblight_loadBase(void) {
- // Don't do anything if not enabled
- if ( !base_sta ) {
- if ( base_tog ) {
- rgblight_enable();
- rgblight_mode( base_mod );
- rgblight_sethsv( base_hue, base_sat, base_val );
- } else {
- rgblight_disable();
+// Initiate the protocol on sync
+void userspace_transport_sync(bool force_sync) {
+ if (is_keyboard_master()) {
+ // Keep track of the last state
+ static userspace_config_t last_userspace_config;
+ static userspace_runtime_t last_userspace_runtime;
+ bool needs_sync = false;
+
+ // Check if the config values are different
+ if (memcmp(&transport_userspace_config, &last_userspace_config, sizeof(transport_userspace_config))) {
+ needs_sync = true;
+ memcpy(&last_userspace_config, &transport_userspace_config, sizeof(transport_userspace_config));
+ }
+ // Perform the sync if requested
+ if (needs_sync || force_sync) {
+ transaction_rpc_send(RPC_ID_CONFIG_SYNC, sizeof(transport_userspace_config), &transport_userspace_config);
+ needs_sync = false;
}
- }
- // Mark that base is loaded, and to be saved before leaving
- base_sta = true;
-}
-// Set to plain HSV color
-void rgblight_colorStatic( int hu, int sa, int va ) {
- // First, it must be enabled or color change is not written
- rgblight_enable();
- rgblight_mode(1);
- rgblight_sethsv(hu,sa,va);
-}
-/* HSV values
- * white ( 0, 0, 255)
- * red ( 0, 255, 255)
- * coral ( 16, 176, 255)
- * orange ( 39, 255, 255)
- * goldenrod ( 43, 218, 218)
- * gold ( 51, 255, 255)
- * yellow ( 60, 255, 255)
- * chartreuse ( 90, 255, 255)
- * green (120, 255, 255)
- * springgreen (150, 255, 255)
- * turquoise (174, 90, 112)
- * teal (180, 255, 128)
- * cyan (180, 255, 255)
- * azure (186, 102, 255)
- * blue (240, 255, 255)
- * purple (270, 255, 255)
- * magenta (300, 255, 255)
- * pink (330, 128, 255)
- */
+ // Check if the runtime values are different
+ if (memcmp(&transport_userspace_runtime, &last_userspace_runtime, sizeof(transport_userspace_runtime))) {
+ needs_sync = true;
+ memcpy(&last_userspace_runtime, &transport_userspace_runtime, sizeof(transport_userspace_runtime));
+ }
-// Set RGBLIGHT state depending on layer
-void rgblight_change( uint8_t this_layer ) {
- // Save state, if saving is requested
- if ( base_sta ) {
- rgblight_saveBase();
- }
- // Change RGB light
- switch ( this_layer ) {
- case _DV:
- // Load base layer
- rgblight_loadBase();
- break;
- case _AL:
- // Do yellow for alternate
- rgblight_colorStatic( 60,255,255);
- break;
- case _GA:
- // Do purple for game
- rgblight_colorStatic(285,255,255);
- break;
- case _NU:
- // Do azure for number
- rgblight_colorStatic(186,200,255);
- break;
- case _SE:
- // Do red for settings
- rgblight_colorStatic( 16,255,255);
- break;
- case _MO:
- // Do green for mouse
- rgblight_colorStatic(120,255,255);
- break;
- case _MU:
- // Do orange for music
- rgblight_colorStatic( 39,255,255);
- break;
- default:
- // Something went wrong
- rgblight_colorStatic( 0,255,255);
- break;
+ // Perform the sync if requested
+ if (needs_sync || force_sync) {
+ transaction_rpc_send(RPC_ID_RUNTIME_SYNC, sizeof(transport_userspace_runtime), &transport_userspace_runtime);
+ needs_sync = false;
+ }
}
}
+#endif // SPLIT_KEYBOARD
-#endif
+/*---------------------------*\
+|*-----KEYBOARD PRE INIT-----*|
+\*---------------------------*/
+/* This code runs before anything is started.
+ * Good for early hardware setup
+ */
+__attribute__ ((weak)) void keyboard_pre_init_keymap(void) {}
+__attribute__ ((weak)) void keyboard_pre_init_user(void) {
+ // Keymap specific stuff
+ keyboard_pre_init_keymap();
+}
/*---------------------*\
|*-----MATRIX INIT-----*|
\*---------------------*/
+/* This code runs once midway thru the firmware process.
+ * So far, sets the base layer and fixes unicode mode
+ */
+__attribute__ ((weak)) void matrix_init_keymap(void) {}
void matrix_init_user (void) {
-
- // Keymap specific things, do it first thing to allow for delays etc
+ // Keymap specific things
matrix_init_keymap();
+}
+
+/*----------------------------*\
+|*-----KEYBOARD POST INIT-----*|
+\*----------------------------*/
+/* This code runs after anything is started.
+ * Good for late hardware setup, like setting up layer specifications
+ */
+__attribute__ ((weak)) void keyboard_post_init_keymap(void) {}
+__attribute__ ((weak)) void keyboard_post_init_user(void) {
+ // Fix beginning base layer, in case some other firmware was flashed
+ // set_single_persistent_default_layer(_BASE);
- // Correct unicode
-#ifdef UNICODE_ENABLE
+ // Unicode mode
+# ifdef UNICODEMAP_ENABLE
set_unicode_input_mode(UC_LNX);
-#endif
+# endif // UNICODEMAP_ENABLE
+
+ // Split keyboard halves communication
+# ifdef SPLIT_KEYBOARD
+ // Register the transactions
+ transaction_register_rpc( RPC_ID_CONFIG_SYNC, userspace_config_sync );
+ transaction_register_rpc(RPC_ID_RUNTIME_SYNC, userspace_runtime_sync);
+ // Load default config values
+ if (is_keyboard_master()) {
+ // If we are main; load from eeconfig
+ userspace_config.raw = eeconfig_read_user();
+ // And update the transport variable
+ userspace_transport_update();
+ // Do one forced transfer to sync halves
+ userspace_transport_sync(true);
+ } else {
+ // Just sync the data received
+ userspace_transport_update();
+ }
+# else // SPLIT_KEYBOARD
+ // If we are not split; just load from eeprom
+ userspace_config.raw = eeconfig_read_user();
+# endif // SPLIT_KEYBOARD
+
+ // Backlight LED
+# ifdef BACKLIGHT_ENABLE
+ keyboard_post_init_backlight();
+# endif // BACKLIGHT_ENABLE
+
+ // RGB underglow
+# ifdef RGBLIGHT_ENABLE
+ keyboard_post_init_underglow();
+# endif // RGBLIGHT_ENABLE
+
+ // Keymap specific stuff
+ keyboard_post_init_keymap();
+}
- // Make beginning layer DVORAK
- set_single_persistent_default_layer(_DV);
+/*---------------------------*\
+|*-----HOUSEKEEPING TASK-----*|
+\*---------------------------*/
+/* I have no idea what this does
+ */
+__attribute__ ((weak)) void housekeeping_task_keymap(void) {}
+void housekeeping_task_user(void) {
+ // Check eeprom every now and then
+ static userspace_config_t prev_userspace_config;
+ static fast_timer_t throttle_timer = 0;
+ static bool init_flag = true;
+
+ // Read this if we never read it before
+ if (init_flag) {
+ init_flag = false;
+ prev_userspace_config.raw = eeconfig_read_user();
+ }
-//--RGB light initialize base layer
-#ifdef RGBLIGHT_ENABLE
- // Base hue is white, and RGB disabled
- base_hue = 100;
- base_sat = 0;
- base_val = 255;
- base_mod = 2;
- base_tog = false;
- rgblight_enable();
- rgblight_mode(base_mod);
- rgblight_sethsv(base_hue,base_sat,base_val);
- rgblight_disable();
- rgblight_loadBase();
-#endif
+ // Throttled tasks here
+ if (timer_elapsed_fast(throttle_timer) >= HOUSEKEEPING_THROTTLE_INTERVAL_MS) {
+ // Refresh timer
+ throttle_timer = timer_read_fast();
+ // Check userspace config for eeprom updates
+ if (memcmp(&prev_userspace_config, &userspace_config, sizeof(userspace_config))) {
+ memcpy(&prev_userspace_config, &userspace_config, sizeof(userspace_config));
+ eeconfig_update_user(userspace_config.raw);
+ }
+ }
+
+ // Do transport stuff
+# ifdef SPLIT_KEYBOARD
+ userspace_transport_update();
+ userspace_transport_sync(false);
+# endif // SPLIT_KEYBOARD
+
+ // Hook to keymap code
+ housekeeping_task_keymap();
+}
+
+/*-----------------------*\
+|*-----EECONFIG INIT-----*|
+\*-----------------------*/
+/* Default values to send to the eeprom
+ */
+void eeconfig_init_user(void) {
+ // Set everything to default
+ userspace_config.raw = 0;
+ // Set encoder states to sane defaults if enabled
+# ifdef ENCODER_ENABLE
+ reset_encoder_state();
+# endif // ENCODER_ENABLE
+}
+/*------------------------*\
+|*-----PROCESS RECORD-----*|
+\*------------------------*/
+/* Process record: custom keycodes to process here
+ * Allow also the following codes to hook here as well;
+ * Macro definitions
+ * Audio hooks
+ */
+__attribute__ ((weak))
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
+ return true;
+}
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ // Return after running through all individual hooks
+ return
+ process_record_keymap(keycode, record) &&
+# ifdef AUDIO_ENABLE
+ process_record_audio(keycode, record) &&
+# endif // AUDIO_ENABLE
+# ifdef ENCODER_ENABLE
+ process_record_encoder(keycode, record) &&
+# endif // ENCODER_ENABLE
+ process_record_macro(keycode, record);
}
/*---------------------*\
|*-----MATRIX SCAN-----*|
\*---------------------*/
+/* This code runs every frame
+ * I used to check for layer switching here, but layer state is better used.
+ * Try to not put anything here; as it runs hundreds time per second-ish
+ */
+__attribute__ ((weak)) void matrix_scan_keymap(void) { }
void matrix_scan_user (void) {
- // Keymap specific, do it first
+ // Keymap specific scan function
matrix_scan_keymap();
}
-/*------------------*\
-|*-----KEYCODES-----*|
-\*------------------*/
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
-
- // Shift check
- bool is_capital = ( keyboard_report->mods & (MOD_BIT(KC_LSFT)|MOD_BIT(KC_RSFT)) );
- static bool lock_flag = false;
- uint8_t layer = biton32 (layer_state);
-
- switch (keycode) {
- // Secrets implementation
-#if (__has_include("secrets.h"))
- case SECRET1:
- if( !record->event.pressed ) {
- send_string_P( secret[ keycode - SECRET1 ] );
- }
- return false;
- break;
- case SECRET2:
- if( !record->event.pressed ) {
- send_string_P( secret[ keycode - SECRET2 ] );
- }
- return false;
- break;
- case SECRET3:
- if( !record->event.pressed ) {
- send_string_P( secret[ keycode - SECRET3 ] );
- }
- return false;
- break;
-#endif
-
- // If these keys are pressed, load base layer config, and mark saving
-#ifdef RGBLIGHT_ENABLE
- case RGB_TOG:
- case RGB_MOD:
- case RGB_VAI:
- case RGB_VAD:
- case RGB_SAI:
- case RGB_SAD:
- case RGB_HUI:
- case RGB_HUD:
- if ( !base_sta ) {
- rgblight_loadBase();
- }
- return true;
- break;
-#endif
-
- // Lock functionality: These layers are locked if the LOCKED buttons are
- // pressed. Otherwise, they are momentary toggles
- case K_LOCK:
- if (record->event.pressed) {
- lock_flag = !lock_flag;
- }
- return false;
- break;
- case K_MOUSE:
- if (record->event.pressed) {
- layer_on(_MO);
- lock_flag = false;
- } else {
- if ( lock_flag ) {
- lock_flag = false;
- } else {
- layer_off(_MO);
- }
- }
- return false;
- break;
- case K_NUMBR:
- if (record->event.pressed) {
- layer_on(_NU);
- lock_flag = false;
- } else {
- if ( lock_flag ) {
- lock_flag = false;
- } else {
- layer_off(_NU);
- }
- }
- return false;
- break;
-
- // Layer switches with sound
- case K_GAMES:
- if (record->event.pressed) {
- // On press, turn off layer if active
- if ( layer == _GA ) {
-#ifdef AUDIO_ENABLE
- stop_all_notes();
- PLAY_SONG(tone_return);
-#endif
- layer_off(_GA);
- }
- } else {
- // After click, turn on layer if accessed from setting
- if ( layer == _SE ) {
-#ifdef AUDIO_ENABLE
- stop_all_notes();
- PLAY_SONG(tone_game);
-#endif
- layer_on(_GA);
- layer_off(_SE);
- }
- }
- return false;
- break;
- case MU_TOG:
- if (record->event.pressed) {
- // On press, turn off layer if active
- if ( layer == _SE ) {
- layer_off(_SE);
- layer_on(_MU);
- } else {
- layer_off(_MU);
- }
- }
- return true;
- break;
-
-//------UNICODE
- // Unicode switches with sound
-#ifdef UNICODE_ENABLE
- case UNI_LI:
- if (record->event.pressed) {
-#ifdef AUDIO_ENABLE
- stop_all_notes();
- PLAY_SONG(tone_linux);
-#endif
- set_unicode_input_mode(UC_LNX);
- }
- return false;
- break;
- case UNI_WN:
- if (record->event.pressed) {
-#ifdef AUDIO_ENABLE
- stop_all_notes();
- PLAY_SONG(tone_windows);
-#endif
- set_unicode_input_mode(UC_WIN);
- }
- return false;
- break;
-
- // Turkish letters, with capital functionality
- case TUR_A:
- if (record->event.pressed) {
- if ( is_capital ) {
- unicode_input_start();
- register_hex(0x00c2);
- unicode_input_finish();
- } else {
- unicode_input_start();
- register_hex(0x00e2);
- unicode_input_finish();
- }
- }
- return false;
- break;
- case TUR_O:
- if (record->event.pressed) {
- if ( is_capital ) {
- unicode_input_start();
- register_hex(0x00d6);
- unicode_input_finish();
- } else {
- unicode_input_start();
- register_hex(0x00f6);
- unicode_input_finish();
- }
- }
- return false;
- break;
- case TUR_U:
- if (record->event.pressed) {
- if ( is_capital ) {
- unicode_input_start();
- register_hex(0x00dc);
- unicode_input_finish();
- } else {
- unicode_input_start();
- register_hex(0x00fc);
- unicode_input_finish();
- }
- }
- return false;
- break;
- case TUR_I:
- if (record->event.pressed) {
- if ( is_capital ) {
- unicode_input_start();
- register_hex(0x0130);
- unicode_input_finish();
- } else {
- unicode_input_start();
- register_hex(0x0131);
- unicode_input_finish();
- }
- }
- return false;
- break;
- case TUR_G:
- if (record->event.pressed) {
- if ( is_capital ) {
- unicode_input_start();
- register_hex(0x011e);
- unicode_input_finish();
- } else {
- unicode_input_start();
- register_hex(0x011f);
- unicode_input_finish();
- }
- }
- return false;
- break;
- case TUR_C:
- if (record->event.pressed) {
- if ( is_capital ) {
- unicode_input_start();
- register_hex(0x00c7);
- unicode_input_finish();
- } else {
- unicode_input_start();
- register_hex(0x00e7);
- unicode_input_finish();
- }
- }
- return false;
- break;
- case TUR_S:
- if (record->event.pressed) {
- if ( is_capital ) {
- unicode_input_start();
- register_hex(0x015e);
- unicode_input_finish();
- } else {
- unicode_input_start();
- register_hex(0x015f);
- unicode_input_finish();
- }
- }
- return false;
- break;
-#endif
+/*---------------------*\
+|*-----LAYER STATE-----*|
+\*---------------------*/
+/* This code runs after every layer change
+ * State represents the new layer state.
+ */
+__attribute__ ((weak))
+layer_state_t layer_state_set_keymap (layer_state_t state) {
+ return state;
+}
+layer_state_t layer_state_set_user(layer_state_t state) {
+ // Keymap layer state setting
+ state = layer_state_set_keymap(state);
+ // For underglow stuff
+# ifdef RGBLIGHT_ENABLE
+ state = layer_state_set_underglow(state);
+# endif // RGBLIGHT_ENABLE
+ // Audio playback
+# ifdef AUDIO_ENABLE
+ state = layer_state_set_audio(state);
+# endif // AUDIO_ENABLE
-//-------Diagonal mouse movements
-#ifdef MOUSEKEY_ENABLE
- case MO_NE:
- if( record->event.pressed ) {
- mousekey_on(MO_N);
- mousekey_on(MO_E);
- mousekey_send();
- } else {
- mousekey_off(MO_N);
- mousekey_off(MO_E);
- mousekey_send();
- }
- return false;
- break;
- case MO_NW:
- if( record->event.pressed ) {
- mousekey_on(MO_N);
- mousekey_on(MO_W);
- mousekey_send();
- } else {
- mousekey_off(MO_N);
- mousekey_off(MO_W);
- mousekey_send();
- }
- return false;
- break;
- case MO_SE:
- if( record->event.pressed ) {
- mousekey_on(MO_S);
- mousekey_on(MO_E);
- mousekey_send();
- } else {
- mousekey_off(MO_S);
- mousekey_off(MO_E);
- mousekey_send();
- }
- return false;
- break;
- case MO_SW:
- if( record->event.pressed ) {
- mousekey_on(MO_S);
- mousekey_on(MO_W);
- mousekey_send();
- } else {
- mousekey_off(MO_S);
- mousekey_off(MO_W);
- mousekey_send();
- }
- return false;
- break;
- case MO_S_NE:
- if( record->event.pressed ) {
- mousekey_on(MO_S_N);
- mousekey_on(MO_S_E);
- mousekey_send();
- } else {
- mousekey_off(MO_S_N);
- mousekey_off(MO_S_E);
- mousekey_send();
- }
- return false;
- break;
- case MO_S_NW:
- if( record->event.pressed ) {
- mousekey_on(MO_S_N);
- mousekey_on(MO_S_W);
- mousekey_send();
- } else {
- mousekey_off(MO_S_N);
- mousekey_off(MO_S_W);
- mousekey_send();
- }
- return false;
- break;
- case MO_S_SE:
- if( record->event.pressed ) {
- mousekey_on(MO_S_S);
- mousekey_on(MO_S_E);
- mousekey_send();
- } else {
- mousekey_off(MO_S_S);
- mousekey_off(MO_S_E);
- mousekey_send();
- }
- return false;
- break;
- case MO_S_SW:
- if( record->event.pressed ) {
- mousekey_on(MO_S_S);
- mousekey_on(MO_S_W);
- mousekey_send();
- } else {
- mousekey_off(MO_S_S);
- mousekey_off(MO_S_W);
- mousekey_send();
- }
- return false;
- break;
-#endif
+ return state;
+}
-//------DOUBLE PRESS, with added left navigation
- case DBL_SPC:
- if( record->event.pressed ) {
- SEND_STRING(" "SS_TAP(X_LEFT));
- }
- return false;
- break;
- case DBL_ANG:
- if( record->event.pressed ) {
- SEND_STRING("<>"SS_TAP(X_LEFT));
- }
- return false;
- break;
- case DBL_PAR:
- if( record->event.pressed ) {
- SEND_STRING("()"SS_TAP(X_LEFT));
- }
- return false;
- break;
- case DBL_SQR:
- if( record->event.pressed ) {
- SEND_STRING("[]"SS_TAP(X_LEFT));
- }
- return false;
- break;
- case DBL_BRC:
- if( record->event.pressed ) {
- SEND_STRING("{}"SS_TAP(X_LEFT));
- }
- return false;
- break;
- case DBL_QUO:
- if( record->event.pressed ) {
- SEND_STRING("\'\'"SS_TAP(X_LEFT));
- }
- return false;
- break;
- case DBL_DQT:
- if( record->event.pressed ) {
- SEND_STRING("\"\""SS_TAP(X_LEFT));
- }
- return false;
- break;
- case DBL_GRV:
- if( record->event.pressed ) {
- SEND_STRING("``"SS_TAP(X_LEFT));
- }
- return false;
- break;
-// END OF KEYCODES
- }
- return process_record_keymap(keycode, record);
+/*-----------------------------*\
+|*-----DEFAULT LAYER STATE-----*|
+\*-----------------------------*/
+/* This code runs after every time default base layer is changed
+ */
+__attribute__ ((weak))
+layer_state_t default_layer_state_set_keymap (layer_state_t state) {
+ return state;
+}
+layer_state_t default_layer_state_set_user(layer_state_t state) {
+ // Keymap level code
+ state = default_layer_state_set_keymap(state);
+ return state;
}
-/*----------------------*\
-|*-----LAYER CHANGE-----*|
-\*----------------------*/
+/*------------------------*\
+|*-----LED SET KEYMAP-----*|
+\*------------------------*/
+/* Code for LED indicators
+ * I'm not sure when exactly does this code run
+ */
+__attribute__ ((weak)) void led_set_keymap(uint8_t usb_led) {}
+void led_set_user(uint8_t usb_led) {
+ led_set_keymap(usb_led);
+}
-layer_state_t layer_state_set_user(layer_state_t state) {
+/*-----------------*\
+|*-----SUSPEND-----*|
+\*-----------------*/
+/* Suspend stuff here, mostly for the rgb lighting.
+ */
+__attribute__ ((weak)) void suspend_power_down_keymap (void) { }
+void suspend_power_down_user(void) {
+ suspend_power_down_keymap();
+ // RGB matrix sleep hook
+# ifdef RGB_MATRIX_ENABLE
+ suspend_power_down_rgb();
+# endif // RGB_MATRIX_ENABLE
+}
+__attribute__ ((weak)) void suspend_wakeup_init_keymap (void) { }
+void suspend_wakeup_init_user(void) {
+ suspend_wakeup_init_keymap();
+ // RGB matrix sleep hook
+# ifdef RGB_MATRIX_ENABLE
+ suspend_wakeup_init_rgb();
+# endif // RGB_MATRIX_ENABLE
+}
+<<<<<<< HEAD
+ state = layer_state_set_keymap (state);
+#ifdef RGBLIGHT_ENABLE
+ // Change RGB lighting depending on the last layer activated
+ rgblight_change( get_highest_layer(state) );
+#endif
+ return state;
+||||||| f439fe6055
state = layer_state_set_keymap (state);
#ifdef RGBLIGHT_ENABLE
// Change RGB lighting depending on the last layer activated
rgblight_change( biton32(state) );
#endif
return state;
+=======
+/*------------------*\
+|*-----SHUTDOWN-----*|
+\*------------------*/
+/* Shutdown stuff here; for when entering bootmode.
+ */
+__attribute__ ((weak)) void shutdown_keymap (void) { }
+void shutdown_user(void) {
+ // Underglow LED hook on boot
+# ifdef RGBLIGHT_ENABLE
+ shutdown_underglow();
+# endif // RGBLIGHT_ENABLE
+ // Perkey led hook on boot
+# ifdef RGB_MATRIX_ENABLE
+ shutdown_rgb();
+# endif // RGB_MATRIX_ENABLE
+ // Keymap hooks
+ shutdown_keymap();
+>>>>>>> upstream/master
}