mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-01-29 00:51:53 +08:00
Implemented VNC ContinuousUpdates
This commit is contained in:
@@ -159,6 +159,9 @@ class RfbClient(RfbClientStream): # pylint: disable=too-many-instance-attribute
|
||||
async def _on_fb_update_request(self) -> None:
|
||||
raise NotImplementedError
|
||||
|
||||
async def _on_enable_cont_updates(self, enabled: bool) -> None:
|
||||
raise NotImplementedError
|
||||
|
||||
# =====
|
||||
|
||||
async def _send_fb_jpeg(self, data: bytes) -> None:
|
||||
@@ -398,6 +401,7 @@ class RfbClient(RfbClientStream): # pylint: disable=too-many-instance-attribute
|
||||
4: self.__handle_key_event,
|
||||
5: self.__handle_pointer_event,
|
||||
6: self.__handle_client_cut_text,
|
||||
150: self.__handle_enable_cont_updates,
|
||||
255: self.__handle_qemu_event,
|
||||
}
|
||||
while True:
|
||||
@@ -429,6 +433,9 @@ class RfbClient(RfbClientStream): # pylint: disable=too-many-instance-attribute
|
||||
logger.info("%s [main]: ... %s", self._remote, item)
|
||||
self.__check_encodings()
|
||||
|
||||
if self._encodings.has_cont_updates:
|
||||
await self._write_struct("allow ContUpdates", "B", 150)
|
||||
|
||||
if self._encodings.has_ext_keys: # Preferred method
|
||||
await self._write_fb_update("ExtKeys FBUR", 0, 0, RfbEncodings.EXT_KEYS, drain=True)
|
||||
await self._on_set_encodings()
|
||||
@@ -473,6 +480,12 @@ class RfbClient(RfbClientStream): # pylint: disable=too-many-instance-attribute
|
||||
text = await self._read_text("cut text data", length)
|
||||
await self._on_cut_event(text)
|
||||
|
||||
async def __handle_enable_cont_updates(self) -> None:
|
||||
enabled = bool((await self._read_struct("enabled ContUpdates", "B HH HH"))[0])
|
||||
await self._on_enable_cont_updates(enabled)
|
||||
if not enabled:
|
||||
await self._write_struct("disabled ContUpdates", "B", 150)
|
||||
|
||||
async def __handle_qemu_event(self) -> None:
|
||||
(sub_type, state, code) = await self._read_struct("QEMU event (key?)", "B H xxxx L")
|
||||
if sub_type != 0:
|
||||
|
||||
@@ -31,6 +31,7 @@ class RfbEncodings:
|
||||
RENAME = -307 # DesktopName Pseudo-encoding
|
||||
LEDS_STATE = -261 # QEMU LED State Pseudo-encoding
|
||||
EXT_KEYS = -258 # QEMU Extended Key Events Pseudo-encoding
|
||||
CONT_UPDATES = -313 # ContinuousUpdates Pseudo-encoding
|
||||
|
||||
TIGHT = 7
|
||||
TIGHT_JPEG_QUALITIES = dict(zip( # JPEG Quality Level Pseudo-encoding
|
||||
@@ -53,6 +54,7 @@ class RfbClientEncodings: # pylint: disable=too-many-instance-attributes
|
||||
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_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_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
|
||||
|
||||
Reference in New Issue
Block a user