2013-01-31 08:50:53 +00:00
/*
Copyright 2013 Jun Wako < wakojun @ gmail . com >
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/>.
*/
2013-02-20 02:16:13 +00:00
# include <avr/pgmspace.h>
2013-01-31 08:50:53 +00:00
# include "keymap.h"
# include "report.h"
# include "keycode.h"
2013-04-02 08:44:24 +00:00
# include "action_layer.h"
2013-02-13 02:20:47 +00:00
# include "action.h"
2013-02-25 06:30:37 +00:00
# include "action_macro.h"
2013-02-20 02:16:13 +00:00
# include "debug.h"
2013-01-31 08:50:53 +00:00
2013-02-20 02:16:13 +00:00
static action_t keycode_to_action ( uint8_t keycode ) ;
2013-03-11 05:39:06 +00:00
2013-02-20 02:16:13 +00:00
/* converts key to action */
action_t action_for_key ( uint8_t layer , key_t key )
{
uint8_t keycode = keymap_key_to_keycode ( layer , key ) ;
switch ( keycode ) {
case KC_FN0 . . . KC_FN31 :
return keymap_fn_to_action ( keycode ) ;
2013-04-07 06:36:50 +00:00
# ifdef BOOTMAGIC_ENABLE
case KC_CAPSLOCK :
if ( keymap_config . swap_control_capslock | | keymap_config . capslock_to_control ) {
return keycode_to_action ( KC_LCTL ) ;
}
return keycode_to_action ( KC_CAPS ) ;
case KC_LCTL :
if ( keymap_config . swap_control_capslock ) {
return keycode_to_action ( KC_CAPSLOCK ) ;
}
return keycode_to_action ( KC_LCTL ) ;
case KC_LALT :
if ( keymap_config . swap_lalt_lgui ) {
if ( keymap_config . no_gui ) {
return keycode_to_action ( ACTION_NO ) ;
}
return keycode_to_action ( KC_LGUI ) ;
}
return keycode_to_action ( KC_LALT ) ;
case KC_LGUI :
if ( keymap_config . swap_lalt_lgui ) {
return keycode_to_action ( KC_LALT ) ;
}
if ( keymap_config . no_gui ) {
return keycode_to_action ( ACTION_NO ) ;
}
return keycode_to_action ( KC_LGUI ) ;
case KC_RALT :
if ( keymap_config . swap_ralt_rgui ) {
if ( keymap_config . no_gui ) {
return keycode_to_action ( ACTION_NO ) ;
}
return keycode_to_action ( KC_RGUI ) ;
}
return keycode_to_action ( KC_RALT ) ;
case KC_RGUI :
if ( keymap_config . swap_ralt_rgui ) {
return keycode_to_action ( KC_RALT ) ;
}
if ( keymap_config . no_gui ) {
return keycode_to_action ( ACTION_NO ) ;
}
return keycode_to_action ( KC_RGUI ) ;
case KC_GRAVE :
if ( keymap_config . swap_grave_esc ) {
return keycode_to_action ( KC_ESC ) ;
}
return keycode_to_action ( KC_GRAVE ) ;
case KC_ESC :
if ( keymap_config . swap_grave_esc ) {
return keycode_to_action ( KC_GRAVE ) ;
}
return keycode_to_action ( KC_ESC ) ;
case KC_BSLASH :
if ( keymap_config . swap_backslash_backspace ) {
return keycode_to_action ( KC_BSPACE ) ;
}
return keycode_to_action ( KC_BSLASH ) ;
case KC_BSPACE :
if ( keymap_config . swap_backslash_backspace ) {
return keycode_to_action ( KC_BSLASH ) ;
}
return keycode_to_action ( KC_BSPACE ) ;
# endif
2013-02-20 02:16:13 +00:00
default :
return keycode_to_action ( keycode ) ;
}
}
2013-03-11 05:39:06 +00:00
/* Macro */
2013-03-05 06:41:21 +00:00
__attribute__ ( ( weak ) )
2013-05-20 13:42:29 +00:00
const macro_t * action_get_macro ( keyrecord_t * record , uint8_t id , uint8_t opt )
2013-03-11 05:39:06 +00:00
{
return MACRO_NONE ;
}
2013-03-05 06:41:21 +00:00
2013-03-11 05:39:06 +00:00
/* Function */
2013-03-05 06:41:21 +00:00
__attribute__ ( ( weak ) )
2013-03-11 05:39:06 +00:00
void action_function ( keyrecord_t * record , uint8_t id , uint8_t opt )
{
}
2013-03-05 06:41:21 +00:00
2013-02-20 02:16:13 +00:00
/* translates keycode to action */
static action_t keycode_to_action ( uint8_t keycode )
2013-01-31 08:50:53 +00:00
{
action_t action ;
2013-02-13 02:20:47 +00:00
switch ( keycode ) {
2013-01-31 08:50:53 +00:00
case KC_A . . . KC_EXSEL :
2013-03-11 05:39:06 +00:00
case KC_LCTRL . . . KC_RGUI :
2013-02-13 02:20:47 +00:00
action . code = ACTION_KEY ( keycode ) ;
2013-01-31 08:50:53 +00:00
break ;
case KC_SYSTEM_POWER . . . KC_SYSTEM_WAKE :
2013-02-13 02:20:47 +00:00
action . code = ACTION_USAGE_SYSTEM ( KEYCODE2SYSTEM ( keycode ) ) ;
2013-01-31 08:50:53 +00:00
break ;
case KC_AUDIO_MUTE . . . KC_WWW_FAVORITES :
2013-02-13 02:20:47 +00:00
action . code = ACTION_USAGE_CONSUMER ( KEYCODE2CONSUMER ( keycode ) ) ;
2013-01-31 08:50:53 +00:00
break ;
case KC_MS_UP . . . KC_MS_ACCEL2 :
2013-02-13 02:20:47 +00:00
action . code = ACTION_MOUSEKEY ( keycode ) ;
2013-01-31 08:50:53 +00:00
break ;
2013-02-13 02:20:47 +00:00
case KC_TRNS :
action . code = ACTION_TRANSPARENT ;
2013-01-31 08:50:53 +00:00
break ;
default :
action . code = ACTION_NO ;
break ;
}
return action ;
}
2013-03-11 05:39:06 +00:00
# ifdef USE_LEGACY_KEYMAP
/*
* Legacy keymap support
* Consider using new keymap API instead .
*/
__attribute__ ( ( weak ) )
uint8_t keymap_key_to_keycode ( uint8_t layer , key_t key )
{
return keymap_get_keycode ( layer , key . row , key . col ) ;
}
/* Legacy keymap support */
__attribute__ ( ( weak ) )
action_t keymap_fn_to_action ( uint8_t keycode )
{
action_t action = { . code = ACTION_NO } ;
switch ( keycode ) {
case KC_FN0 . . . KC_FN31 :
{
uint8_t layer = keymap_fn_layer ( FN_INDEX ( keycode ) ) ;
uint8_t key = keymap_fn_keycode ( FN_INDEX ( keycode ) ) ;
if ( key ) {
2013-04-04 18:44:42 +00:00
action . code = ACTION_LAYER_TAP_KEY ( layer , key ) ;
2013-03-11 05:39:06 +00:00
} else {
2013-04-04 18:44:42 +00:00
action . code = ACTION_LAYER_MOMENTARY ( layer ) ;
2013-03-11 05:39:06 +00:00
}
}
return action ;
default :
return action ;
}
}
# endif