Ver Fonte

Share button state from mousekey to pointing_device (#10179)

* Branch point for 2020 November 28 Breaking Change

Update readme.md

* Share button state from mousekey to pointing_device

Co-authored-by: Nick Brassel <nick@tzarc.org>

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
Co-authored-by: Nick Brassel <nick@tzarc.org>
Manna Harbour há 5 anos atrás
pai
commit
eecedf0db5
2 ficheiros alterados com 45 adições e 8 exclusões
  1. 4 0
      docs/feature_mouse_keys.md
  2. 41 8
      tmk_core/common/action.c

+ 4 - 0
docs/feature_mouse_keys.md

@@ -140,3 +140,7 @@ To use constant speed mode, you must at least define `MK_COMBINED` in your keyma
 ```c
 #define MK_COMBINED
 ```
+
+## Use with PS/2 Mouse and Pointing Device
+
+Mouse keys button state is shared with [PS/2 mouse](feature_ps2_mouse.md) and [pointing device](feature_pointing_device.md) so mouse keys button presses can be used for clicks and drags.

+ 41 - 8
tmk_core/common/action.c

@@ -37,6 +37,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #    include "nodebug.h"
 #endif
 
+#ifdef POINTING_DEVICE_ENABLE
+#    include "pointing_device.h"
+#endif
+
 int tp_buttons;
 
 #ifdef RETRO_TAPPING
@@ -220,6 +224,19 @@ void process_record_handler(keyrecord_t *record) {
     process_action(record, action);
 }
 
+#if defined(PS2_MOUSE_ENABLE) || defined(POINTING_DEVICE_ENABLE)
+void register_button(bool pressed, enum mouse_buttons button) {
+    #ifdef PS2_MOUSE_ENABLE
+    tp_buttons = pressed ? tp_buttons | button : tp_buttons & ~button;
+    #endif
+    #ifdef POINTING_DEVICE_ENABLE
+    report_mouse_t currentReport = pointing_device_get_report();
+    currentReport.buttons = pressed ? currentReport.buttons | button : currentReport.buttons & ~button;
+    pointing_device_set_report(currentReport);
+    #endif
+}
+#endif
+
 /** \brief Take an action and processes it.
  *
  * FIXME: Needs documentation.
@@ -404,15 +421,23 @@ void process_action(keyrecord_t *record, action_t action) {
             if (event.pressed) {
                 mousekey_on(action.key.code);
                 switch (action.key.code) {
-#    ifdef PS2_MOUSE_ENABLE
+#    if defined(PS2_MOUSE_ENABLE) || defined(POINTING_DEVICE_ENABLE)
                     case KC_MS_BTN1:
-                        tp_buttons |= (1 << 0);
+                        register_button(true, MOUSE_BTN1);
                         break;
                     case KC_MS_BTN2:
-                        tp_buttons |= (1 << 1);
+                        register_button(true, MOUSE_BTN2);
                         break;
                     case KC_MS_BTN3:
-                        tp_buttons |= (1 << 2);
+                        register_button(true, MOUSE_BTN3);
+                        break;
+#    endif
+#    ifdef POINTING_DEVICE_ENABLE
+                    case KC_MS_BTN4:
+                        register_button(true, MOUSE_BTN4);
+                        break;
+                    case KC_MS_BTN5:
+                        register_button(true, MOUSE_BTN5);
                         break;
 #    endif
                     default:
@@ -422,15 +447,23 @@ void process_action(keyrecord_t *record, action_t action) {
             } else {
                 mousekey_off(action.key.code);
                 switch (action.key.code) {
-#    ifdef PS2_MOUSE_ENABLE
+#    if defined(PS2_MOUSE_ENABLE) || defined(POINTING_DEVICE_ENABLE)
                     case KC_MS_BTN1:
-                        tp_buttons &= ~(1 << 0);
+                        register_button(false, MOUSE_BTN1);
                         break;
                     case KC_MS_BTN2:
-                        tp_buttons &= ~(1 << 1);
+                        register_button(false, MOUSE_BTN2);
                         break;
                     case KC_MS_BTN3:
-                        tp_buttons &= ~(1 << 2);
+                        register_button(false, MOUSE_BTN3);
+                        break;
+#    endif
+#    ifdef POINTING_DEVICE_ENABLE
+                    case KC_MS_BTN4:
+                        register_button(false, MOUSE_BTN4);
+                        break;
+                    case KC_MS_BTN5:
+                        register_button(false, MOUSE_BTN5);
                         break;
 #    endif
                     default: