diff options
author | Maxim Devaev <[email protected]> | 2022-11-02 03:23:37 +0300 |
---|---|---|
committer | Maxim Devaev <[email protected]> | 2022-11-03 15:07:06 +0300 |
commit | 08241e92559cc037da4891e8c03b49b800fe43c1 (patch) | |
tree | d0221e1951a63d0ad761ea9abd172076ed6e8d93 /kvmd/apps/vnc/rfb | |
parent | c57928a0f16ea4b5a1052ca00d616e56da82a274 (diff) |
Implemented VNC ContinuousUpdates
Diffstat (limited to 'kvmd/apps/vnc/rfb')
-rw-r--r-- | kvmd/apps/vnc/rfb/__init__.py | 13 | ||||
-rw-r--r-- | kvmd/apps/vnc/rfb/encodings.py | 2 |
2 files changed, 15 insertions, 0 deletions
diff --git a/kvmd/apps/vnc/rfb/__init__.py b/kvmd/apps/vnc/rfb/__init__.py index f715f9b7..bbb3036c 100644 --- a/kvmd/apps/vnc/rfb/__init__.py +++ b/kvmd/apps/vnc/rfb/__init__.py @@ -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: diff --git a/kvmd/apps/vnc/rfb/encodings.py b/kvmd/apps/vnc/rfb/encodings.py index e153b5e8..597e3a92 100644 --- a/kvmd/apps/vnc/rfb/encodings.py +++ b/kvmd/apps/vnc/rfb/encodings.py @@ -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 |