pointing.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. if (enable_acceleration) {
  30. float magnitude = sqrtf( mouse_report.x * mouse_report.x + mouse_report.y * mouse_report.y );
  31. float adjusted_magnitude = powf(magnitude, 1.2f);
  32. x = (mouse_xy_report_t)(x * adjusted_magnitude);
  33. y = (mouse_xy_report_t)(y * adjusted_magnitude);
  34. // x = (mouse_xy_report_t)(x > 0 ? x * x / 16 + x : -x * x / 16 + x);
  35. // y = (mouse_xy_report_t)(y > 0 ? y * y / 16 + y : -y * y / 16 + y);
  36. }
  37. mouse_report.x = x;
  38. mouse_report.y = y;
  39. }
  40. return pointing_device_task_keymap(mouse_report);
  41. }
  42. bool process_record_pointing(uint16_t keycode, keyrecord_t* record) {
  43. switch (keycode) {
  44. case KC_ACCEL:
  45. enable_acceleration = record->event.pressed;
  46. break;
  47. #if defined(POINTING_DEVICE_MOUSE_JIGGLER_ENABLE)
  48. case PD_JIGGLER:
  49. if (record->event.pressed) {
  50. pointing_device_mouse_jiggler_toggle();
  51. }
  52. #endif
  53. default:
  54. mouse_debounce_timer = timer_read();
  55. break;
  56. }
  57. return true;
  58. }
  59. layer_state_t layer_state_set_pointing(layer_state_t state) {
  60. if (layer_state_cmp(state, _GAMEPAD) || layer_state_cmp(state, _DIABLO) || layer_state_cmp(state, _DIABLOII)) {
  61. state |= ((layer_state_t)1 << _MOUSE);
  62. set_auto_mouse_enable(false); // auto mouse can be disabled any time during run time
  63. } else {
  64. set_auto_mouse_enable(true);
  65. }
  66. return state;
  67. }
  68. #if defined(POINTING_DEVICE_MOUSE_JIGGLER_ENABLE)
  69. static uint16_t mouse_jiggler_timer;
  70. bool has_mouse_report_changed(report_mouse_t* new_report, report_mouse_t* old_report) {
  71. // Only report every 5 seconds.
  72. if (userspace_config.mouse_jiggler && timer_elapsed(mouse_jiggler_timer) > 5000) {
  73. mouse_jiggler_timer = timer_read();
  74. return true;
  75. }
  76. return memcmp(new_report, old_report, sizeof(report_mouse_t));
  77. }
  78. void pointing_device_mouse_jiggler_toggle(void) {
  79. mouse_jiggler_timer = timer_read();
  80. userspace_config.mouse_jiggler = !userspace_config.mouse_jiggler;
  81. }
  82. #endif
  83. #if defined(POINTING_DEVICE_AUTO_MOUSE_ENABLE)
  84. __attribute__((weak)) bool is_mouse_record_keymap(uint16_t keycode, keyrecord_t *record) { return false; }
  85. bool is_mouse_record_user(uint16_t keycode, keyrecord_t* record) {
  86. if (is_mouse_record_keymap(keycode, record)) {
  87. return true;
  88. }
  89. switch (keycode) {
  90. # if defined(KEYBOARD_ploopy)
  91. case DPI_CONFIG:
  92. # elif (defined(KEYBOARD_bastardkb_charybdis) || defined(KEYBOARD_handwired_tractyl_manuform)) && !defined(NO_CHARYBDIS_KEYCODES) || (defined(KEYBOARD_bastardkb_dilemma) && !defined(NO_DILEMMA_KEYCODES))
  93. case QK_KB ... QK_KB_MAX:
  94. # endif
  95. case KC_ACCEL:
  96. return true;
  97. }
  98. return false;
  99. }
  100. #endif