mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-01-29 00:51:53 +08:00
VNC: Supported ExtendedMouseButtons
This commit is contained in:
@@ -464,6 +464,10 @@ class RfbClient(RfbClientStream): # pylint: disable=too-many-instance-attribute
|
|||||||
|
|
||||||
if self._encodings.has_ext_keys: # Preferred method
|
if self._encodings.has_ext_keys: # Preferred method
|
||||||
await self._write_fb_update("ExtKeys FBUR", 0, 0, RfbEncodings.EXT_KEYS, drain=True)
|
await self._write_fb_update("ExtKeys FBUR", 0, 0, RfbEncodings.EXT_KEYS, drain=True)
|
||||||
|
|
||||||
|
if self._encodings.has_ext_mouse: # Preferred too
|
||||||
|
await self._write_fb_update("ExtMouse FBUR", 0, 0, RfbEncodings.EXT_MOUSE, drain=True)
|
||||||
|
|
||||||
await self._on_set_encodings()
|
await self._on_set_encodings()
|
||||||
|
|
||||||
async def __handle_fb_update_request(self) -> None:
|
async def __handle_fb_update_request(self) -> None:
|
||||||
@@ -486,11 +490,16 @@ class RfbClient(RfbClientStream): # pylint: disable=too-many-instance-attribute
|
|||||||
|
|
||||||
async def __handle_pointer_event(self) -> None:
|
async def __handle_pointer_event(self) -> None:
|
||||||
(buttons, to_x, to_y) = await self._read_struct("pointer event", "B HH")
|
(buttons, to_x, to_y) = await self._read_struct("pointer event", "B HH")
|
||||||
|
ext_buttons = 0
|
||||||
|
if self._encodings.has_ext_mouse and (buttons & 0x80): # Marker bit 7 for ext event
|
||||||
|
ext_buttons = await self._read_number("ext pointer event buttons", "B")
|
||||||
await self._on_pointer_event(
|
await self._on_pointer_event(
|
||||||
buttons={
|
buttons={
|
||||||
"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(ext_buttons & 0x2),
|
||||||
|
"down": bool(ext_buttons & 0x1),
|
||||||
},
|
},
|
||||||
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)),
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ class RfbEncodings:
|
|||||||
RENAME = -307 # DesktopName Pseudo-encoding
|
RENAME = -307 # DesktopName Pseudo-encoding
|
||||||
LEDS_STATE = -261 # QEMU LED State Pseudo-encoding
|
LEDS_STATE = -261 # QEMU LED State Pseudo-encoding
|
||||||
EXT_KEYS = -258 # QEMU Extended Key Events Pseudo-encoding
|
EXT_KEYS = -258 # QEMU Extended Key Events Pseudo-encoding
|
||||||
|
EXT_MOUSE = -316 # ExtendedMouseButtons Pseudo-encoding
|
||||||
CONT_UPDATES = -313 # ContinuousUpdates Pseudo-encoding
|
CONT_UPDATES = -313 # ContinuousUpdates Pseudo-encoding
|
||||||
|
|
||||||
TIGHT = 7
|
TIGHT = 7
|
||||||
@@ -50,16 +51,17 @@ def _make_meta(variants: (int | frozenset[int])) -> dict:
|
|||||||
class RfbClientEncodings: # pylint: disable=too-many-instance-attributes
|
class RfbClientEncodings: # pylint: disable=too-many-instance-attributes
|
||||||
encodings: frozenset[int]
|
encodings: frozenset[int]
|
||||||
|
|
||||||
has_resize: bool = dataclasses.field(default=False, metadata=_make_meta(RfbEncodings.RESIZE)) # noqa: E224
|
has_resize: bool = dataclasses.field(default=False, metadata=_make_meta(RfbEncodings.RESIZE)) # noqa: E224
|
||||||
has_rename: bool = dataclasses.field(default=False, metadata=_make_meta(RfbEncodings.RENAME)) # noqa: E224
|
has_rename: bool = dataclasses.field(default=False, metadata=_make_meta(RfbEncodings.RENAME)) # noqa: E224
|
||||||
has_leds_state: bool = dataclasses.field(default=False, metadata=_make_meta(RfbEncodings.LEDS_STATE)) # noqa: E224
|
has_leds_state: bool = dataclasses.field(default=False, metadata=_make_meta(RfbEncodings.LEDS_STATE)) # noqa: E224
|
||||||
has_ext_keys: bool = dataclasses.field(default=False, metadata=_make_meta(RfbEncodings.EXT_KEYS)) # noqa: E224
|
has_ext_keys: bool = dataclasses.field(default=False, metadata=_make_meta(RfbEncodings.EXT_KEYS)) # noqa: E224
|
||||||
has_cont_updates: bool = dataclasses.field(default=False, metadata=_make_meta(RfbEncodings.CONT_UPDATES)) # noqa: E224
|
has_ext_mouse: bool = dataclasses.field(default=False, metadata=_make_meta(RfbEncodings.EXT_MOUSE)) # noqa: E224
|
||||||
|
has_cont_updates: bool = dataclasses.field(default=False, metadata=_make_meta(RfbEncodings.CONT_UPDATES)) # noqa: E224
|
||||||
|
|
||||||
has_tight: bool = dataclasses.field(default=False, metadata=_make_meta(RfbEncodings.TIGHT)) # noqa: E224
|
has_tight: bool = dataclasses.field(default=False, metadata=_make_meta(RfbEncodings.TIGHT)) # noqa: E224
|
||||||
tight_jpeg_quality: int = dataclasses.field(default=0, metadata=_make_meta(frozenset(RfbEncodings.TIGHT_JPEG_QUALITIES))) # noqa: E224
|
tight_jpeg_quality: int = dataclasses.field(default=0, metadata=_make_meta(frozenset(RfbEncodings.TIGHT_JPEG_QUALITIES))) # noqa: E224
|
||||||
|
|
||||||
has_h264: bool = dataclasses.field(default=False, metadata=_make_meta(RfbEncodings.H264)) # noqa: E224
|
has_h264: bool = dataclasses.field(default=False, metadata=_make_meta(RfbEncodings.H264)) # noqa: E224
|
||||||
|
|
||||||
def get_summary(self) -> list[str]:
|
def get_summary(self) -> list[str]:
|
||||||
summary: list[str] = [f"encodings -- {sorted(self.encodings)}"]
|
summary: list[str] = [f"encodings -- {sorted(self.encodings)}"]
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ class _Client(RfbClient): # pylint: disable=too-many-instance-attributes
|
|||||||
|
|
||||||
# Эти состояния шарить не обязательно - бекенд исключает дублирующиеся события.
|
# Эти состояния шарить не обязательно - бекенд исключает дублирующиеся события.
|
||||||
# Все это нужно только чтобы не посылать лишние жсоны в сокет KVMD
|
# Все это нужно только чтобы не посылать лишние жсоны в сокет KVMD
|
||||||
self.__mouse_buttons: dict[str, (bool | None)] = dict.fromkeys(["left", "right", "middle"], None)
|
self.__mouse_buttons: dict[str, (bool | None)] = dict.fromkeys(["left", "right", "middle", "up", "down"], None)
|
||||||
self.__mouse_move = {"x": -1, "y": -1}
|
self.__mouse_move = {"x": -1, "y": -1}
|
||||||
|
|
||||||
self.__modifiers = 0
|
self.__modifiers = 0
|
||||||
|
|||||||
Reference in New Issue
Block a user