Add support for 8 buttons to mouse report (#10807)
* Add support for 8 buttons to mouse report This includes support for 8 buttons in mousekeys. However, this does move the keys around due to the fact that the last mousekey keycode is already 0xFF, so any past that would not work with register_code and the like, breaking them for tap hold keys, encoders, and other features. * Update mouse key docs * Add changes based on feedback * Fix VUSB report size comment Because drashna red gud * Fix typo in action.c * Fix IS_MOUSE_BUTTON check * Change start range for mousekeys so that the end is 0xFF properly * condense mousekeys check
This commit is contained in:
parent
bab9849a8b
commit
99f3df2893
9 changed files with 54 additions and 61 deletions
|
@ -443,6 +443,15 @@ void process_action(keyrecord_t *record, action_t action) {
|
|||
case KC_MS_BTN5:
|
||||
register_button(true, MOUSE_BTN5);
|
||||
break;
|
||||
case KC_MS_BTN6:
|
||||
register_button(true, MOUSE_BTN6);
|
||||
break;
|
||||
case KC_MS_BTN7:
|
||||
register_button(true, MOUSE_BTN7);
|
||||
break;
|
||||
case KC_MS_BTN8:
|
||||
register_button(true, MOUSE_BTN8);
|
||||
break;
|
||||
# endif
|
||||
default:
|
||||
mousekey_send();
|
||||
|
@ -469,6 +478,15 @@ void process_action(keyrecord_t *record, action_t action) {
|
|||
case KC_MS_BTN5:
|
||||
register_button(false, MOUSE_BTN5);
|
||||
break;
|
||||
case KC_MS_BTN6:
|
||||
register_button(false, MOUSE_BTN6);
|
||||
break;
|
||||
case KC_MS_BTN7:
|
||||
register_button(false, MOUSE_BTN7);
|
||||
break;
|
||||
case KC_MS_BTN8:
|
||||
register_button(false, MOUSE_BTN8);
|
||||
break;
|
||||
# endif
|
||||
default:
|
||||
mousekey_send();
|
||||
|
|
|
@ -39,7 +39,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
|
||||
#define IS_MOUSEKEY(code) (KC_MS_UP <= (code) && (code) <= KC_MS_ACCEL2)
|
||||
#define IS_MOUSEKEY_MOVE(code) (KC_MS_UP <= (code) && (code) <= KC_MS_RIGHT)
|
||||
#define IS_MOUSEKEY_BUTTON(code) (KC_MS_BTN1 <= (code) && (code) <= KC_MS_BTN5)
|
||||
#define IS_MOUSEKEY_BUTTON(code) (KC_MS_BTN1 <= (code) && (code) <= KC_MS_BTN8)
|
||||
#define IS_MOUSEKEY_WHEEL(code) (KC_MS_WH_UP <= (code) && (code) <= KC_MS_WH_RIGHT)
|
||||
#define IS_MOUSEKEY_ACCEL(code) (KC_MS_ACCEL0 <= (code) && (code) <= KC_MS_ACCEL2)
|
||||
|
||||
|
@ -205,6 +205,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#define KC_BTN3 KC_MS_BTN3
|
||||
#define KC_BTN4 KC_MS_BTN4
|
||||
#define KC_BTN5 KC_MS_BTN5
|
||||
#define KC_BTN6 KC_MS_BTN6
|
||||
#define KC_BTN7 KC_MS_BTN7
|
||||
#define KC_BTN8 KC_MS_BTN8
|
||||
#define KC_WH_U KC_MS_WH_UP
|
||||
#define KC_WH_D KC_MS_WH_DOWN
|
||||
#define KC_WH_L KC_MS_WH_LEFT
|
||||
|
@ -521,15 +524,18 @@ enum internal_special_keycodes {
|
|||
|
||||
enum mouse_keys {
|
||||
/* Mouse Buttons */
|
||||
KC_MS_UP = 0xF0,
|
||||
KC_MS_UP = 0xED,
|
||||
KC_MS_DOWN,
|
||||
KC_MS_LEFT,
|
||||
KC_MS_RIGHT,
|
||||
KC_MS_RIGHT, // 0xF0
|
||||
KC_MS_BTN1,
|
||||
KC_MS_BTN2,
|
||||
KC_MS_BTN3,
|
||||
KC_MS_BTN4,
|
||||
KC_MS_BTN5,
|
||||
KC_MS_BTN6,
|
||||
KC_MS_BTN7,
|
||||
KC_MS_BTN8,
|
||||
|
||||
/* Mouse Wheel */
|
||||
KC_MS_WH_UP,
|
||||
|
@ -540,5 +546,5 @@ enum mouse_keys {
|
|||
/* Acceleration */
|
||||
KC_MS_ACCEL0,
|
||||
KC_MS_ACCEL1,
|
||||
KC_MS_ACCEL2
|
||||
KC_MS_ACCEL2 // 0xFF
|
||||
};
|
||||
|
|
|
@ -278,16 +278,8 @@ void mousekey_on(uint8_t code) {
|
|||
mouse_report.h = wheel_unit() * -1;
|
||||
else if (code == KC_MS_WH_RIGHT)
|
||||
mouse_report.h = wheel_unit();
|
||||
else if (code == KC_MS_BTN1)
|
||||
mouse_report.buttons |= MOUSE_BTN1;
|
||||
else if (code == KC_MS_BTN2)
|
||||
mouse_report.buttons |= MOUSE_BTN2;
|
||||
else if (code == KC_MS_BTN3)
|
||||
mouse_report.buttons |= MOUSE_BTN3;
|
||||
else if (code == KC_MS_BTN4)
|
||||
mouse_report.buttons |= MOUSE_BTN4;
|
||||
else if (code == KC_MS_BTN5)
|
||||
mouse_report.buttons |= MOUSE_BTN5;
|
||||
else if (IS_MOUSEKEY_BUTTON(code))
|
||||
mouse_report.buttons |= 1 << (code - KC_MS_BTN1);
|
||||
else if (code == KC_MS_ACCEL0)
|
||||
mousekey_accel |= (1 << 0);
|
||||
else if (code == KC_MS_ACCEL1)
|
||||
|
@ -313,16 +305,8 @@ void mousekey_off(uint8_t code) {
|
|||
mouse_report.h = 0;
|
||||
else if (code == KC_MS_WH_RIGHT && mouse_report.h > 0)
|
||||
mouse_report.h = 0;
|
||||
else if (code == KC_MS_BTN1)
|
||||
mouse_report.buttons &= ~MOUSE_BTN1;
|
||||
else if (code == KC_MS_BTN2)
|
||||
mouse_report.buttons &= ~MOUSE_BTN2;
|
||||
else if (code == KC_MS_BTN3)
|
||||
mouse_report.buttons &= ~MOUSE_BTN3;
|
||||
else if (code == KC_MS_BTN4)
|
||||
mouse_report.buttons &= ~MOUSE_BTN4;
|
||||
else if (code == KC_MS_BTN5)
|
||||
mouse_report.buttons &= ~MOUSE_BTN5;
|
||||
else if (IS_MOUSEKEY_BUTTON(code))
|
||||
mouse_report.buttons &= ~(1 << (code - KC_MS_BTN1));
|
||||
else if (code == KC_MS_ACCEL0)
|
||||
mousekey_accel &= ~(1 << 0);
|
||||
else if (code == KC_MS_ACCEL1)
|
||||
|
@ -423,16 +407,8 @@ void mousekey_on(uint8_t code) {
|
|||
mouse_report.h = w_offset * -1;
|
||||
else if (code == KC_MS_WH_RIGHT)
|
||||
mouse_report.h = w_offset;
|
||||
else if (code == KC_MS_BTN1)
|
||||
mouse_report.buttons |= MOUSE_BTN1;
|
||||
else if (code == KC_MS_BTN2)
|
||||
mouse_report.buttons |= MOUSE_BTN2;
|
||||
else if (code == KC_MS_BTN3)
|
||||
mouse_report.buttons |= MOUSE_BTN3;
|
||||
else if (code == KC_MS_BTN4)
|
||||
mouse_report.buttons |= MOUSE_BTN4;
|
||||
else if (code == KC_MS_BTN5)
|
||||
mouse_report.buttons |= MOUSE_BTN5;
|
||||
else if (IS_MOUSEKEY_BUTTON(code))
|
||||
mouse_report.buttons |= 1 << (code - KC_MS_BTN1);
|
||||
else if (code == KC_MS_ACCEL0)
|
||||
mk_speed = mkspd_0;
|
||||
else if (code == KC_MS_ACCEL1)
|
||||
|
@ -462,16 +438,8 @@ void mousekey_off(uint8_t code) {
|
|||
mouse_report.h = 0;
|
||||
else if (code == KC_MS_WH_RIGHT && mouse_report.h > 0)
|
||||
mouse_report.h = 0;
|
||||
else if (code == KC_MS_BTN1)
|
||||
mouse_report.buttons &= ~MOUSE_BTN1;
|
||||
else if (code == KC_MS_BTN2)
|
||||
mouse_report.buttons &= ~MOUSE_BTN2;
|
||||
else if (code == KC_MS_BTN3)
|
||||
mouse_report.buttons &= ~MOUSE_BTN3;
|
||||
else if (code == KC_MS_BTN4)
|
||||
mouse_report.buttons &= ~MOUSE_BTN4;
|
||||
else if (code == KC_MS_BTN5)
|
||||
mouse_report.buttons &= ~MOUSE_BTN5;
|
||||
else if (IS_MOUSEKEY_BUTTON(code))
|
||||
mouse_report.buttons &= ~(1 << (code - KC_MS_BTN1));
|
||||
# ifdef MK_MOMENTARY_ACCEL
|
||||
else if (code == KC_MS_ACCEL0)
|
||||
mk_speed = mkspd_DEFAULT;
|
||||
|
|
|
@ -39,7 +39,10 @@ enum mouse_buttons {
|
|||
MOUSE_BTN2 = (1 << 1),
|
||||
MOUSE_BTN3 = (1 << 2),
|
||||
MOUSE_BTN4 = (1 << 3),
|
||||
MOUSE_BTN5 = (1 << 4)
|
||||
MOUSE_BTN5 = (1 << 4),
|
||||
MOUSE_BTN6 = (1 << 5),
|
||||
MOUSE_BTN7 = (1 << 6),
|
||||
MOUSE_BTN8 = (1 << 7)
|
||||
};
|
||||
|
||||
/* Consumer Page (0x0C)
|
||||
|
|
|
@ -116,19 +116,15 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = {
|
|||
# endif
|
||||
HID_RI_USAGE(8, 0x01), // Pointer
|
||||
HID_RI_COLLECTION(8, 0x00), // Physical
|
||||
// Buttons (5 bits)
|
||||
// Buttons (8 bits)
|
||||
HID_RI_USAGE_PAGE(8, 0x09), // Button
|
||||
HID_RI_USAGE_MINIMUM(8, 0x01), // Button 1
|
||||
HID_RI_USAGE_MAXIMUM(8, 0x05), // Button 5
|
||||
HID_RI_USAGE_MAXIMUM(8, 0x08), // Button 8
|
||||
HID_RI_LOGICAL_MINIMUM(8, 0x00),
|
||||
HID_RI_LOGICAL_MAXIMUM(8, 0x01),
|
||||
HID_RI_REPORT_COUNT(8, 0x05),
|
||||
HID_RI_REPORT_COUNT(8, 0x08),
|
||||
HID_RI_REPORT_SIZE(8, 0x01),
|
||||
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
|
||||
// Button padding (3 bits)
|
||||
HID_RI_REPORT_COUNT(8, 0x01),
|
||||
HID_RI_REPORT_SIZE(8, 0x03),
|
||||
HID_RI_INPUT(8, HID_IOF_CONSTANT),
|
||||
|
||||
// X/Y position (2 bytes)
|
||||
HID_RI_USAGE_PAGE(8, 0x01), // Generic Desktop
|
||||
|
@ -356,7 +352,7 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = {
|
|||
.Type = DTYPE_Device
|
||||
},
|
||||
.USBSpecification = VERSION_BCD(1, 1, 0),
|
||||
|
||||
|
||||
#if VIRTSER_ENABLE
|
||||
.Class = USB_CSCP_IADDeviceClass,
|
||||
.SubClass = USB_CSCP_IADDeviceSubclass,
|
||||
|
|
|
@ -444,19 +444,15 @@ const PROGMEM uchar shared_hid_report[] = {
|
|||
0x85, REPORT_ID_MOUSE, // Report ID
|
||||
0x09, 0x01, // Usage (Pointer)
|
||||
0xA1, 0x00, // Collection (Physical)
|
||||
// Buttons (5 bits)
|
||||
// Buttons (8 bits)
|
||||
0x05, 0x09, // Usage Page (Button)
|
||||
0x19, 0x01, // Usage Minimum (Button 1)
|
||||
0x29, 0x05, // Usage Maximum (Button 5)
|
||||
0x29, 0x08, // Usage Maximum (Button 8)
|
||||
0x15, 0x00, // Logical Minimum (0)
|
||||
0x25, 0x01, // Logical Maximum (1)
|
||||
0x95, 0x05, // Report Count (5)
|
||||
0x95, 0x08, // Report Count (8)
|
||||
0x75, 0x01, // Report Size (1)
|
||||
0x81, 0x02, // Input (Data, Variable, Absolute)
|
||||
// Button padding (3 bits)
|
||||
0x95, 0x01, // Report Count (1)
|
||||
0x75, 0x03, // Report Size (3)
|
||||
0x81, 0x03, // Input (Constant)
|
||||
|
||||
// X/Y position (2 bytes)
|
||||
0x05, 0x01, // Usage Page (Generic Desktop)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue