Last active
September 17, 2023 05:58
-
-
Save ksh3/16f1b141190ce382726b11e8dd0530a6 to your computer and use it in GitHub Desktop.
keyball44_keymap.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Copyright 2022 @Yowkees | |
Copyright 2022 MURAOKA Taro (aka KoRoN, @kaoriya) | |
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/>. | |
*/ | |
#include QMK_KEYBOARD_H | |
#include "quantum.h" | |
enum custom_keycodes { | |
KC_MY_BTN1 = KEYBALL_SAFE_RANGE, | |
KC_MY_BTN2, | |
KC_OPSYM | |
}; | |
#define KC_ KC_TRNS | |
#define RAISE_TAB LT(_RAISE, KC_TAB) | |
#define RAISE_ESC LT(_RAISE, KC_ESC) | |
#define LSFT_SPC LSFT_T(KC_SPC) | |
#define RSFT_ENT RSFT_T(KC_ENT) | |
#define CMD_JA RGUI_T(KC_LNG1) | |
#define CMD_EN RGUI_T(KC_LNG2) | |
#define CMD_RCLK RGUI_T(KC_BTN2) | |
#define CMD_DEL LGUI_T(KC_DEL) | |
#define CMD_BS LGUI_T(KC_BSPC) | |
#define ALT_BS ALT_T(KC_BSPC) | |
#define ALT_DEL ALT_T(KC_DEL) | |
#define ALT_JA ALT_T(KC_LNG1) | |
#define ALT_LCLK ALT_T(KC_BTN1) | |
#define ALT_EN ALT_T(KC_LNG2) | |
#define CTRL_ESC LCTL_T(KC_ESC) | |
#define CTRL_TAB LCTL_T(KC_TAB) | |
#define LA_SEL LALT(KC_LEFT) | |
#define LA_SEL_AL LGUI(KC_LEFT) | |
#define RA_SEL RALT(KC_RIGHT) | |
#define RA_SEL_AL RGUI(KC_RIGHT) | |
enum click_state { | |
NONE = 0, | |
WAITING, | |
CLICKABLE, | |
CLICKING, | |
}; | |
enum click_state state; | |
const int16_t to_clickable_movement = 0; | |
const uint16_t click_layer = 4; | |
uint16_t click_timer; | |
uint16_t to_reset_time = 1000; | |
int16_t mouse_record_threshold = 30; | |
int16_t mouse_move_count_ratio = 5; | |
int16_t mouse_movement; | |
void enable_click_layer(void) { | |
layer_on(click_layer); | |
click_timer = timer_read(); | |
state = CLICKABLE; | |
} | |
void disable_click_layer(void) { | |
state = NONE; | |
layer_off(click_layer); | |
} | |
int16_t my_abs(int16_t num) { | |
if (num < 0) | |
{ | |
num = -num; | |
} | |
return num; | |
} | |
int16_t mmouse_move_y_sign(int16_t num) { | |
if (num < 0) | |
{ | |
return -1; | |
} | |
return 1; | |
} | |
bool is_clickable_mode(void) { | |
return state == CLICKABLE || state == CLICKING; | |
} | |
report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) | |
{ | |
int16_t current_x = mouse_report.x; | |
int16_t current_y = mouse_report.y; | |
if (current_x != 0 || current_y != 0) { | |
switch (state) { | |
case CLICKABLE: | |
click_timer = timer_read(); | |
break; | |
case CLICKING: | |
break; | |
case WAITING: | |
mouse_movement += my_abs(current_x) + my_abs(current_y); | |
if (mouse_movement >= to_clickable_movement) | |
{ | |
mouse_movement = 0; | |
enable_click_layer(); | |
} | |
break; | |
default: | |
click_timer = timer_read(); | |
state = WAITING; | |
mouse_movement = 0; | |
} | |
} else { | |
switch (state) { | |
case CLICKING: | |
break; | |
case CLICKABLE: | |
if (timer_elapsed(click_timer) > to_reset_time) | |
{ | |
disable_click_layer(); | |
} | |
break; | |
case WAITING: | |
if (timer_elapsed(click_timer) > 50) | |
{ | |
mouse_movement = 0; | |
state = NONE; | |
} | |
break; | |
default: | |
mouse_movement = 0; | |
state = NONE; | |
} | |
} | |
mouse_report.x = current_x; | |
mouse_report.y = current_y; | |
return mouse_report; | |
} | |
enum layer_number { | |
_QWERTY = 0, | |
_RAISE = 1, | |
}; | |
// clang-format off | |
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |
// keymap for defaultEN | |
[_QWERTY] = LAYOUT_universal( | |
KC_OPSYM , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_EQL , | |
KC_LBRC , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN , KC_QUOT , | |
KC_RBRC , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_MINS , | |
KC_LNG1, ALT_EN, CMD_BS, LSFT_SPC, CTRL_ESC, RAISE_TAB , RSFT_ENT, _______, _______ , ALT_DEL | |
), | |
[_RAISE] = LAYOUT_universal( | |
KC_GRV, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_BSLS, | |
KC_BRID, LA_SEL_AL, LA_SEL, RA_SEL, RA_SEL_AL , KC_BRIU, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, KC_VOLD, KC_VOLU , | |
KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______ | |
), | |
[2] = LAYOUT_universal( | |
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , | |
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , | |
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , | |
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ | |
), | |
[3] = LAYOUT_universal( | |
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , | |
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , | |
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , | |
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ | |
), | |
[4] = LAYOUT_universal( | |
KBC_RST, KBC_SAVE, CPI_D100, CPI_I100, SCRL_DVI , SCRL_DVD, _______ , _______ , _______ , _______ , _______ , _______ , | |
_______ ,_______ ,KC_MY_BTN2, SCRL_MO ,KC_MY_BTN1, _______ , _______ ,KC_MY_BTN1, SCRL_MO ,KC_MY_BTN2, _______ , _______ , | |
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , | |
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ | |
) | |
}; | |
// clang-format on | |
layer_state_t layer_state_set_user(layer_state_t state) { | |
keyball_set_scroll_mode(get_highest_layer(state) == _RAISE); | |
uint8_t layer = biton32(state); | |
switch (layer) | |
{ | |
case 4: | |
rgblight_sethsv(HSV_WHITE); | |
break; | |
default: | |
rgblight_sethsv(HSV_OFF); | |
} | |
return state; | |
} | |
#ifdef OLED_ENABLE | |
#include "lib/oledkit/oledkit.h" | |
void oledkit_render_info_user(void) { | |
keyball_oled_render_keyinfo(); | |
keyball_oled_render_ballinfo(); | |
oled_write_P(PSTR("Layer:"), false); | |
oled_write(get_u8_str(get_highest_layer(layer_state), ' '), false); | |
} | |
#endif | |
const char *read_layer_state(void); | |
const char *read_logo(void); | |
void set_keylog(uint16_t keycode, keyrecord_t *record); | |
const char *read_keylog(void); | |
const char *read_keylogs(void); | |
uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { | |
switch (keycode) { | |
case CTRL_ESC: | |
case RAISE_TAB: | |
return 130; | |
default: | |
return 180; | |
} | |
} | |
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |
static bool ctrl_pressed = false; | |
static bool lshift_pressed= false; | |
static bool rshift_pressed = false; | |
switch (keycode) { | |
case _QWERTY: | |
if (record->event.pressed) { | |
set_single_persistent_default_layer(_QWERTY); | |
} | |
return false; | |
break; | |
case _RAISE: | |
if (record->event.pressed) { | |
layer_on(_RAISE); | |
} else { | |
layer_off(_RAISE); | |
} | |
return false; | |
break; | |
case CTRL_ESC: | |
ctrl_pressed = keyboard_report->mods & MOD_BIT(KC_LCTL); | |
if (!record->event.pressed && !ctrl_pressed) { | |
tap_code(KC_LNG2); | |
} | |
break; | |
case KC_OPSYM: | |
lshift_pressed = keyboard_report->mods & MOD_BIT(KC_LSFT); | |
rshift_pressed = keyboard_report->mods & MOD_BIT(KC_RSFT); | |
if (record->event.pressed) { | |
if (rshift_pressed || lshift_pressed) { | |
tap_code(KC_BSLS); | |
} else { | |
register_code(KC_LSFT); | |
tap_code(KC_7); | |
unregister_code(KC_LSFT); | |
} | |
} | |
break; | |
case KC_MY_BTN1: | |
case KC_MY_BTN2: | |
{ | |
report_mouse_t currentReport = pointing_device_get_report(); | |
uint8_t btn = 1 << (keycode - KC_MY_BTN1); | |
if (record->event.pressed) { | |
currentReport.buttons |= btn; | |
state = CLICKING; | |
} else { | |
currentReport.buttons &= ~btn; | |
enable_click_layer(); | |
} | |
pointing_device_set_report(currentReport); | |
pointing_device_send(); | |
return false; | |
} | |
default: | |
{ | |
if (record->event.pressed){ | |
disable_click_layer(); | |
} | |
} | |
} | |
return true; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment