Skip to content

Commit 5f7d388

Browse files
committed
core: Mouse buttons state integration #101
This allows users to use mousekey buttons with PS/2, ADB or Serial pointing device.
1 parent b981b8e commit 5f7d388

File tree

12 files changed

+86
-0
lines changed

12 files changed

+86
-0
lines changed

Diff for: converter/adb_usb/matrix.c

+5
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,11 @@ void adb_mouse_task(void)
414414

415415
return;
416416
}
417+
418+
uint8_t adb_mouse_buttons(void)
419+
{
420+
return mouse_report.buttons;
421+
}
417422
#endif
418423

419424
uint8_t matrix_scan(void)

Diff for: converter/ibmpc_usb/ibmpc_usb.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,14 @@ action_t action_for_key(uint8_t layer, keypos_t key)
8585
return (action_t){ .code = pgm_read_word(&actionmaps[(layer)][key.row & 0x07][key.col & 0x0F]) };
8686
}
8787

88+
#ifdef IBMPC_MOUSE_ENABLE
89+
static uint8_t last_buttons;
90+
uint8_t ibmpc_mouse_buttons(void)
91+
{
92+
return last_buttons;
93+
}
94+
#endif
95+
8896

8997
void IBMPCConverter::set_led(uint8_t usb_led)
9098
{
@@ -607,6 +615,7 @@ uint8_t IBMPCConverter::process_interface(void)
607615
mouse_report.v = -CHOP8(v);
608616
mouse_report.h = CHOP8(h);
609617
host_mouse_send(&mouse_report);
618+
last_buttons = mouse_report.buttons;
610619
xprintf("M[x:%d y:%d v:%d h:%d b:%02X]\n", mouse_report.x, mouse_report.y,
611620
mouse_report.v, mouse_report.h, mouse_report.buttons);
612621
break; }

Diff for: converter/ibmpc_usb/ibmpc_usb.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
#define ROW(code) ((code>>4)&0x07)
1717
#define COL(code) (code&0x0F)
1818

19+
#ifdef IBMPC_MOUSE_ENABLE
20+
extern "C" uint8_t ibmpc_mouse_buttons(void);
21+
#endif
22+
1923

2024
class IBMPCConverter {
2125
public:

Diff for: tmk_core/common/host.c

+35
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,22 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
2222
#include "util.h"
2323
#include "debug.h"
2424

25+
#ifdef MOUSEKEY_ENABLE
26+
# include "mousekey.h"
27+
#endif
28+
#ifdef PS2_MOUSE_ENABLE
29+
# include "ps2_mouse.h"
30+
#endif
31+
#ifdef SERIAL_MOUSE_ENABLE
32+
# include "serial_mouse.h"
33+
#endif
34+
#ifdef ADB_MOUSE_ENABLE
35+
# include "adb.h"
36+
#endif
37+
#ifdef IBMPC_MOUSE_ENABLE
38+
uint8_t ibmpc_mouse_buttons(void);
39+
#endif
40+
2541

2642
#if defined(NKRO_ENABLE) || defined(NKRO_6KRO_ENABLE)
2743
bool keyboard_nkro = true;
@@ -70,7 +86,26 @@ void host_mouse_send(report_mouse_t *report)
7086
report->boot_x = (report->x > 127) ? 127 : ((report->x < -127) ? -127 : report->x);
7187
report->boot_y = (report->y > 127) ? 127 : ((report->y < -127) ? -127 : report->y);
7288
#endif
89+
90+
/* Mouse buttons integration */
91+
uint8_t b = report->buttons;
92+
#ifdef MOUSEKEY_ENABLE
93+
report->buttons |= mousekey_buttons();
94+
#endif
95+
#ifdef PS2_MOUSE_ENABLE
96+
report->buttons |= ps2_mouse_buttons();
97+
#endif
98+
#ifdef SERIAL_MOUSE_ENABLE
99+
report->buttons |= serial_mouse_buttons();
100+
#endif
101+
#ifdef ADB_MOUSE_ENABLE
102+
report->buttons |= adb_mouse_buttons();
103+
#endif
104+
#ifdef IBMPC_MOUSE_ENABLE
105+
report->buttons |= ibmpc_mouse_buttons();
106+
#endif
73107
(*driver->send_mouse)(report);
108+
report->buttons = b;
74109
}
75110

76111
void host_system_send(uint16_t report)

Diff for: tmk_core/common/mousekey.c

+5
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,11 @@ void mousekey_clear(void)
182182
mousekey_accel = 0;
183183
}
184184

185+
uint8_t mousekey_buttons(void)
186+
{
187+
return mouse_report.buttons;
188+
}
189+
185190
static void mousekey_debug(void)
186191
{
187192
if (!debug_mouse) return;

Diff for: tmk_core/common/mousekey.h

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ void mousekey_on(uint8_t code);
6969
void mousekey_off(uint8_t code);
7070
void mousekey_clear(void);
7171
void mousekey_send(void);
72+
uint8_t mousekey_buttons(void);
7273

7374
#ifdef __cplusplus
7475
}

Diff for: tmk_core/protocol/adb.h

+1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ void adb_host_reset_hard(void);
109109
void adb_host_kbd_led(uint8_t addr, uint8_t led);
110110
void adb_mouse_task(void);
111111
void adb_mouse_init(void);
112+
uint8_t adb_mouse_buttons(void);
112113

113114

114115
#endif

Diff for: tmk_core/protocol/ps2_mouse.c

+7
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
2828

2929

3030
static report_mouse_t mouse_report = {};
31+
static uint8_t last_buttons;
3132

3233

3334
static void print_usb_data(void);
@@ -161,6 +162,7 @@ void ps2_mouse_task(void)
161162

162163

163164
host_mouse_send(&mouse_report);
165+
last_buttons = mouse_report.buttons;
164166
print_usb_data();
165167
}
166168
// clear report
@@ -171,6 +173,11 @@ void ps2_mouse_task(void)
171173
mouse_report.buttons = 0;
172174
}
173175

176+
uint8_t ps2_mouse_buttons(void)
177+
{
178+
return last_buttons;
179+
}
180+
174181
static void print_usb_data(void)
175182
{
176183
if (!debug_mouse) return;

Diff for: tmk_core/protocol/ps2_mouse.h

+1
Original file line numberDiff line numberDiff line change
@@ -62,5 +62,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
6262

6363
uint8_t ps2_mouse_init(void);
6464
void ps2_mouse_task(void);
65+
uint8_t ps2_mouse_buttons(void);
6566

6667
#endif

Diff for: tmk_core/protocol/serial_mouse.h

+1
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,6 @@ static inline uint8_t serial_mouse_init(void)
2929
}
3030

3131
void serial_mouse_task(void);
32+
uint8_t serial_mouse_buttons(void);
3233

3334
#endif

Diff for: tmk_core/protocol/serial_mouse_microsoft.c

+8
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
3232
#endif
3333
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
3434

35+
static uint8_t last_buttons;
3536
static void print_usb_data(const report_mouse_t *report);
3637

3738
void serial_mouse_task(void)
@@ -71,6 +72,7 @@ void serial_mouse_task(void)
7172

7273
print_usb_data(&report);
7374
host_mouse_send(&report);
75+
last_buttons = report.buttons;
7476
return;
7577
}
7678

@@ -111,6 +113,12 @@ void serial_mouse_task(void)
111113

112114
print_usb_data(&report);
113115
host_mouse_send(&report);
116+
last_buttons = report.buttons;
117+
}
118+
119+
uint8_t serial_mouse_buttons(void)
120+
{
121+
return last_buttons;
114122
}
115123

116124
static void print_usb_data(const report_mouse_t *report)

Diff for: tmk_core/protocol/serial_mouse_mousesystems.c

+9
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
3434

3535
//#define SERIAL_MOUSE_CENTER_SCROLL
3636

37+
static uint8_t last_buttons;
3738
static void print_usb_data(const report_mouse_t *report);
3839

3940
void serial_mouse_task(void)
@@ -78,13 +79,15 @@ void serial_mouse_task(void)
7879

7980
print_usb_data(&report);
8081
host_mouse_send(&report);
82+
last_buttons = report.buttons;
8183

8284
if (buffer[3] || buffer[4]) {
8385
report.h = MAX((int8_t)buffer[3], -127);
8486
report.v = MAX((int8_t)buffer[4], -127);
8587

8688
print_usb_data(&report);
8789
host_mouse_send(&report);
90+
last_buttons = report.buttons;
8891
}
8992

9093
return;
@@ -117,9 +120,15 @@ void serial_mouse_task(void)
117120

118121
print_usb_data(&report);
119122
host_mouse_send(&report);
123+
last_buttons = report.buttons;
120124
}
121125
}
122126

127+
uint8_t serial_mouse_buttons(void)
128+
{
129+
return last_buttons;
130+
}
131+
123132
static void print_usb_data(const report_mouse_t *report)
124133
{
125134
if (!debug_mouse)

0 commit comments

Comments
 (0)