mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2025-12-12 01:00:29 +08:00
mouse buttons 4 and 5
This commit is contained in:
parent
6840c514dc
commit
28cc3fe99a
@ -66,6 +66,11 @@
|
|||||||
#define PROTO_CMD_MOUSE_BUTTON_MIDDLE_SELECT 0b00100000
|
#define PROTO_CMD_MOUSE_BUTTON_MIDDLE_SELECT 0b00100000
|
||||||
#define PROTO_CMD_MOUSE_BUTTON_MIDDLE_STATE 0b00000010
|
#define PROTO_CMD_MOUSE_BUTTON_MIDDLE_STATE 0b00000010
|
||||||
|
|
||||||
|
#define PROTO_CMD_MOUSE_BUTTON_EXTRA_UP_SELECT 0b10000000
|
||||||
|
#define PROTO_CMD_MOUSE_BUTTON_EXTRA_UP_STATE 0b00001000
|
||||||
|
#define PROTO_CMD_MOUSE_BUTTON_EXTRA_DOWN_SELECT 0b01000000
|
||||||
|
#define PROTO_CMD_MOUSE_BUTTON_EXTRA_DOWN_STATE 0b00000100
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
#ifdef HID_USB_KBD
|
#ifdef HID_USB_KBD
|
||||||
@ -94,14 +99,17 @@ INLINE uint8_t cmdKeyEvent(const uint8_t *buffer) { // 2 bytes
|
|||||||
return PROTO_RESP_OK;
|
return PROTO_RESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
INLINE uint8_t cmdMouseButtonEvent(const uint8_t *buffer) { // 1 byte
|
INLINE uint8_t cmdMouseButtonEvent(const uint8_t *buffer) { // 2 bytes
|
||||||
# ifdef HID_USB_MOUSE
|
# ifdef HID_USB_MOUSE
|
||||||
uint8_t state = buffer[0];
|
uint8_t main_state = buffer[0];
|
||||||
|
uint8_t extra_state = buffer[1];
|
||||||
|
|
||||||
hid_mouse.sendMouseButtons(
|
hid_mouse.sendMouseButtons(
|
||||||
state & PROTO_CMD_MOUSE_BUTTON_LEFT_SELECT, state & PROTO_CMD_MOUSE_BUTTON_LEFT_STATE,
|
main_state & PROTO_CMD_MOUSE_BUTTON_LEFT_SELECT, main_state & PROTO_CMD_MOUSE_BUTTON_LEFT_STATE,
|
||||||
state & PROTO_CMD_MOUSE_BUTTON_RIGHT_SELECT, state & PROTO_CMD_MOUSE_BUTTON_RIGHT_STATE,
|
main_state & PROTO_CMD_MOUSE_BUTTON_RIGHT_SELECT, main_state & PROTO_CMD_MOUSE_BUTTON_RIGHT_STATE,
|
||||||
state & PROTO_CMD_MOUSE_BUTTON_MIDDLE_SELECT, state & PROTO_CMD_MOUSE_BUTTON_MIDDLE_STATE
|
main_state & PROTO_CMD_MOUSE_BUTTON_MIDDLE_SELECT, main_state & PROTO_CMD_MOUSE_BUTTON_MIDDLE_STATE,
|
||||||
|
extra_state & PROTO_CMD_MOUSE_BUTTON_EXTRA_UP_SELECT, extra_state & PROTO_CMD_MOUSE_BUTTON_EXTRA_UP_STATE,
|
||||||
|
extra_state & PROTO_CMD_MOUSE_BUTTON_EXTRA_DOWN_SELECT, extra_state & PROTO_CMD_MOUSE_BUTTON_EXTRA_DOWN_STATE
|
||||||
);
|
);
|
||||||
# endif
|
# endif
|
||||||
return PROTO_RESP_OK;
|
return PROTO_RESP_OK;
|
||||||
|
|||||||
@ -76,11 +76,15 @@ class UsbHidMouse {
|
|||||||
INLINE void sendMouseButtons(
|
INLINE void sendMouseButtons(
|
||||||
bool left_select, bool left_state,
|
bool left_select, bool left_state,
|
||||||
bool right_select, bool right_state,
|
bool right_select, bool right_state,
|
||||||
bool middle_select, bool middle_state
|
bool middle_select, bool middle_state,
|
||||||
|
bool up_select, bool up_state,
|
||||||
|
bool down_select, bool down_state
|
||||||
) {
|
) {
|
||||||
if (left_select) _sendMouseButton(MOUSE_LEFT, left_state);
|
if (left_select) _sendMouseButton(MOUSE_LEFT, left_state);
|
||||||
if (right_select) _sendMouseButton(MOUSE_RIGHT, right_state);
|
if (right_select) _sendMouseButton(MOUSE_RIGHT, right_state);
|
||||||
if (middle_select) _sendMouseButton(MOUSE_MIDDLE, middle_state);
|
if (middle_select) _sendMouseButton(MOUSE_MIDDLE, middle_state);
|
||||||
|
if (up_select) _sendMouseButton(MOUSE_PREV, up_state);
|
||||||
|
if (down_select) _sendMouseButton(MOUSE_NEXT, down_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
INLINE void sendMouseMove(int x, int y) {
|
INLINE void sendMouseMove(int x, int y) {
|
||||||
|
|||||||
@ -400,6 +400,8 @@ class RfbClient(RfbClientStream): # pylint: disable=too-many-instance-attribute
|
|||||||
"left": bool(buttons & 0x1),
|
"left": bool(buttons & 0x1),
|
||||||
"right": bool(buttons & 0x4),
|
"right": bool(buttons & 0x4),
|
||||||
"middle": bool(buttons & 0x2),
|
"middle": bool(buttons & 0x2),
|
||||||
|
"up": bool(buttons & 0x8), # Back
|
||||||
|
"down": bool(buttons & 0x10), # Forward
|
||||||
},
|
},
|
||||||
wheel={
|
wheel={
|
||||||
"x": (-4 if buttons & 0x40 else (4 if buttons & 0x20 else 0)),
|
"x": (-4 if buttons & 0x40 else (4 if buttons & 0x20 else 0)),
|
||||||
|
|||||||
@ -114,7 +114,7 @@ class _Client(RfbClient): # pylint: disable=too-many-instance-attributes
|
|||||||
|
|
||||||
# Эти состояния шарить не обязательно - бекенд исключает дублирующиеся события.
|
# Эти состояния шарить не обязательно - бекенд исключает дублирующиеся события.
|
||||||
# Все это нужно только чтобы не посылать лишние жсоны в сокет KVMD
|
# Все это нужно только чтобы не посылать лишние жсоны в сокет KVMD
|
||||||
self.__mouse_buttons: Dict[str, Optional[bool]] = {"left": None, "right": None, "middle": None}
|
self.__mouse_buttons: Dict[str, Optional[bool]] = dict.fromkeys(["left", "right", "middle", "up", "down"], None)
|
||||||
self.__mouse_move = {"x": -1, "y": -1}
|
self.__mouse_move = {"x": -1, "y": -1}
|
||||||
|
|
||||||
self.__lock = asyncio.Lock()
|
self.__lock = asyncio.Lock()
|
||||||
|
|||||||
@ -91,6 +91,8 @@ class MouseProcess(BaseDeviceProcess):
|
|||||||
"left": 0x1,
|
"left": 0x1,
|
||||||
"right": 0x2,
|
"right": 0x2,
|
||||||
"middle": 0x4,
|
"middle": 0x4,
|
||||||
|
"up": 0x8, # Back
|
||||||
|
"down": 0x10, # Forward
|
||||||
}[button]
|
}[button]
|
||||||
self._queue_event(_ButtonEvent(code, state))
|
self._queue_event(_ButtonEvent(code, state))
|
||||||
|
|
||||||
|
|||||||
@ -108,17 +108,25 @@ class _MouseButtonEvent(_BaseEvent):
|
|||||||
state: bool
|
state: bool
|
||||||
|
|
||||||
def __post_init__(self) -> None:
|
def __post_init__(self) -> None:
|
||||||
assert self.name in ["left", "right", "middle"]
|
assert self.name in ["left", "right", "middle", "up", "down"]
|
||||||
|
|
||||||
def make_command(self) -> bytes:
|
def make_command(self) -> bytes:
|
||||||
(code, state_pressed) = {
|
(code, state_pressed, is_main) = {
|
||||||
"left": (0b10000000, 0b00001000),
|
"left": (0b10000000, 0b00001000, True),
|
||||||
"right": (0b01000000, 0b00000100),
|
"right": (0b01000000, 0b00000100, True),
|
||||||
"middle": (0b00100000, 0b00000010),
|
"middle": (0b00100000, 0b00000010, True),
|
||||||
|
"up": (0b10000000, 0b00001000, False), # Back
|
||||||
|
"down": (0b01000000, 0b00000100, False), # Forward
|
||||||
}[self.name]
|
}[self.name]
|
||||||
if self.state:
|
if self.state:
|
||||||
code |= state_pressed
|
code |= state_pressed
|
||||||
return struct.pack(">BBxxx", 0x13, code)
|
if is_main:
|
||||||
|
main_code = code
|
||||||
|
extra_code = 0
|
||||||
|
else:
|
||||||
|
main_code = 0
|
||||||
|
extra_code = code
|
||||||
|
return struct.pack(">BBBxx", 0x13, main_code, extra_code)
|
||||||
|
|
||||||
|
|
||||||
@dataclasses.dataclass(frozen=True)
|
@dataclasses.dataclass(frozen=True)
|
||||||
|
|||||||
@ -80,7 +80,7 @@ def valid_hid_mouse_move(arg: Any) -> int:
|
|||||||
|
|
||||||
|
|
||||||
def valid_hid_mouse_button(arg: Any) -> str:
|
def valid_hid_mouse_button(arg: Any) -> str:
|
||||||
return check_string_in_list(arg, "HID mouse button", ["left", "right", "middle"])
|
return check_string_in_list(arg, "HID mouse button", ["left", "right", "middle", "up", "down"])
|
||||||
|
|
||||||
|
|
||||||
def valid_hid_mouse_wheel(arg: Any) -> int:
|
def valid_hid_mouse_wheel(arg: Any) -> int:
|
||||||
|
|||||||
@ -153,7 +153,7 @@ def test_fail__valid_hid_mouse_move(arg: Any) -> None:
|
|||||||
|
|
||||||
|
|
||||||
# =====
|
# =====
|
||||||
@pytest.mark.parametrize("arg", ["LEFT ", "RIGHT "])
|
@pytest.mark.parametrize("arg", ["LEFT ", "RIGHT ", "Up ", " Down", " MiDdLe "])
|
||||||
def test_ok__valid_hid_mouse_button(arg: Any) -> None:
|
def test_ok__valid_hid_mouse_button(arg: Any) -> None:
|
||||||
assert valid_hid_mouse_button(arg) == arg.strip().lower()
|
assert valid_hid_mouse_button(arg) == arg.strip().lower()
|
||||||
|
|
||||||
|
|||||||
@ -420,6 +420,13 @@
|
|||||||
<div class="modifier wide-2 right small" data-code="right"><span><b>•</b><br>Hold →</span></div>
|
<div class="modifier wide-2 right small" data-code="right"><span><b>•</b><br>Hold →</span></div>
|
||||||
<div class="key wide-4 right small" data-code="right"><span>Mouse<br>Right</span></div>
|
<div class="key wide-4 right small" data-code="right"><span>Mouse<br>Right</span></div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="keypad-row" style="display:none">
|
||||||
|
<div class="key wide-4 left small" data-code="up"><span>Mouse<br>Up/Back</span></div>
|
||||||
|
<div class="modifier wide-2 left small" data-code="up"><span><b>•</b><br>← Hold</span></div>
|
||||||
|
<div class="empty-key" style="width:10px"></div>
|
||||||
|
<div class="modifier wide-2 right small" data-code="down"><span><b>•</b><br>Hold →</span></div>
|
||||||
|
<div class="key wide-4 right small" data-code="down"><span>Mouse<br>Down/Fw</span></div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -13,3 +13,9 @@
|
|||||||
div(class="empty-key" style="width:10px")
|
div(class="empty-key" style="width:10px")
|
||||||
div(data-code="right" class="modifier wide-2 right small") #[span #[b •]#[br]Hold →]
|
div(data-code="right" class="modifier wide-2 right small") #[span #[b •]#[br]Hold →]
|
||||||
div(data-code="right" class="key wide-4 right small") #[span Mouse#[br]Right]
|
div(data-code="right" class="key wide-4 right small") #[span Mouse#[br]Right]
|
||||||
|
div(class="keypad-row" style="display:none")
|
||||||
|
div(data-code="up" class="key wide-4 left small") #[span Mouse#[br]Up/Back]
|
||||||
|
div(data-code="up" class="modifier wide-2 left small") #[span #[b •]#[br]← Hold]
|
||||||
|
div(class="empty-key" style="width:10px")
|
||||||
|
div(data-code="down" class="modifier wide-2 right small") #[span #[b •]#[br]Hold →]
|
||||||
|
div(data-code="down" class="key wide-4 right small") #[span Mouse#[br]Down/Fw]
|
||||||
|
|||||||
@ -120,6 +120,8 @@ export function Mouse(record_callback) {
|
|||||||
case 0: __keypad.emit("left", state); break;
|
case 0: __keypad.emit("left", state); break;
|
||||||
case 2: __keypad.emit("right", state); break;
|
case 2: __keypad.emit("right", state); break;
|
||||||
case 1: __keypad.emit("middle", state); break;
|
case 1: __keypad.emit("middle", state); break;
|
||||||
|
case 3: __keypad.emit("up", state); break;
|
||||||
|
case 4: __keypad.emit("down", state); break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user