pointing.c 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // Copyright 2021 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "pointing.h"
  4. #include "math.h"
  5. static uint16_t mouse_debounce_timer = 0;
  6. bool enable_acceleration = false;
  7. #ifdef TAPPING_TERM_PER_KEY
  8. # define TAP_CHECK get_tapping_term(KC_BTN1, NULL)
  9. #else
  10. # ifndef TAPPING_TERM
  11. # define TAPPING_TERM 200
  12. # endif
  13. # define TAP_CHECK TAPPING_TERM
  14. #endif
  15. __attribute__((weak)) void pointing_device_init_keymap(void) {}
  16. void pointing_device_init_user(void) {
  17. set_auto_mouse_layer(_MOUSE);
  18. set_auto_mouse_enable(true);
  19. pointing_device_init_keymap();
  20. }
  21. __attribute__((weak)) report_mouse_t pointing_device_task_keymap(report_mouse_t mouse_report) {
  22. return mouse_report;
  23. }
  24. report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) {
  25. mouse_xy_report_t x = mouse_report.x, y = mouse_report.y;
  26. mouse_report.x = 0;
  27. mouse_report.y = 0;
  28. if (x != 0 && y != 0 && (timer_elapsed(mouse_debounce_timer) > TAP_CHECK)) {
  29. #ifdef OLED_ENABLE
  30. oled_timer_reset();
  31. #endif
  32. if (enable_acceleration) {
  33. x = (mouse_xy_report_t)(x > 0 ? pow(4, x) / 2 + x : -pow(4, abs(x)) / 2 + x);
  34. y = (mouse_xy_report_t)(y > 0 ? pow(5, y) / 2 + y : -pow(5, abs(y)) / 2 + y);
  35. // x = (mouse_xy_report_t)(x > 0 ? x * x / 16 + x : -x * x / 16 + x);
  36. // y = (mouse_xy_report_t)(y > 0 ? y * y / 16 + y : -y * y / 16 + y);
  37. }
  38. mouse_report.x = x;
  39. mouse_report.y = y;
  40. }
  41. return pointing_device_task_keymap(mouse_report);
  42. }
  43. bool process_record_pointing(uint16_t keycode, keyrecord_t* record) {
  44. switch (keycode) {
  45. case KC_ACCEL:
  46. enable_acceleration = record->event.pressed;
  47. break;
  48. default:
  49. mouse_debounce_timer = timer_read();
  50. break;
  51. }
  52. return true;
  53. }
  54. layer_state_t layer_state_set_pointing(layer_state_t state) {
  55. if (layer_state_cmp(state, _GAMEPAD) || layer_state_cmp(state, _DIABLO) || layer_state_cmp(state, _DIABLOII)) {
  56. state |= ((layer_state_t)1 << _MOUSE);
  57. set_auto_mouse_enable(false); // auto mouse can be disabled any time during run time
  58. } else {
  59. set_auto_mouse_enable(true);
  60. }
  61. return state;
  62. }
  63. #if defined(POINTING_DEVICE_AUTO_MOUSE_ENABLE)
  64. __attribute__((weak)) bool is_mouse_record_keymap(uint16_t keycode, keyrecord_t *record) { return false; }
  65. bool is_mouse_record_user(uint16_t keycode, keyrecord_t* record) {
  66. if (is_mouse_record_keymap(keycode, record)) {
  67. return true;
  68. }
  69. switch (keycode) {
  70. # if defined(KEYBOARD_ploopy)
  71. case DPI_CONFIG:
  72. # elif (defined(KEYBOARD_bastardkb_charybdis) || defined(KEYBOARD_handwired_tractyl_manuform)) && !defined(NO_CHARYBDIS_KEYCODES) || (defined(KEYBOARD_bastardkb_dilemma) && !defined(NO_DILEMMA_KEYCODES))
  73. case QK_KB ... QK_KB_MAX:
  74. # endif
  75. case KC_ACCEL:
  76. return true;
  77. }
  78. return false;
  79. }
  80. #endif