summaryrefslogtreecommitdiff
path: root/kvmd/plugins
diff options
context:
space:
mode:
authorMaxim Devaev <[email protected]>2021-08-15 17:34:42 +0300
committerMaxim Devaev <[email protected]>2021-08-15 20:16:48 +0300
commitdf098bd075e26fb6ecc75b2f7be5923371741677 (patch)
tree663a4e6a4808ed267e985c5b5d3d18bc4cf1f915 /kvmd/plugins
parent9afa6efbe4b8ee3186c5d840233c96115363460f (diff)
win95 runtime switching
Diffstat (limited to 'kvmd/plugins')
-rw-r--r--kvmd/plugins/hid/_mcu/__init__.py17
-rw-r--r--kvmd/plugins/hid/_mcu/proto.py9
-rw-r--r--kvmd/plugins/hid/otg/__init__.py45
-rw-r--r--kvmd/plugins/hid/otg/events.py13
-rw-r--r--kvmd/plugins/hid/otg/mouse.py19
5 files changed, 69 insertions, 34 deletions
diff --git a/kvmd/plugins/hid/_mcu/__init__.py b/kvmd/plugins/hid/_mcu/__init__.py
index 07aeface..4dfd978a 100644
--- a/kvmd/plugins/hid/_mcu/__init__.py
+++ b/kvmd/plugins/hid/_mcu/__init__.py
@@ -179,12 +179,21 @@ class BaseMcuHid(BaseHid, multiprocessing.Process): # pylint: disable=too-many-
if outputs1 & 0b10000000: # Dynamic
if outputs2 & 0b00000001: # USB
- keyboard_outputs["available"].extend(["usb", "disabled"])
- mouse_outputs["available"].extend(["usb", "usb_rel", "disabled"])
+ keyboard_outputs["available"].append("usb")
+ mouse_outputs["available"].extend(["usb", "usb_rel"])
+
+ if outputs2 & 0b00000100: # USB WIN98
+ mouse_outputs["available"].append("usb_win98")
if outputs2 & 0b00000010: # PS/2
- keyboard_outputs["available"].extend(["ps2", "disabled"])
- mouse_outputs["available"].extend(["ps2", "disabled"])
+ keyboard_outputs["available"].append("ps2")
+ mouse_outputs["available"].append("ps2")
+
+ if keyboard_outputs["available"]:
+ keyboard_outputs["available"].append("disabled")
+
+ if mouse_outputs["available"]:
+ mouse_outputs["available"].append("disabled")
active_keyboard = get_active_keyboard(outputs1)
if active_keyboard in keyboard_outputs["available"]:
diff --git a/kvmd/plugins/hid/_mcu/proto.py b/kvmd/plugins/hid/_mcu/proto.py
index 16757d7d..a49f2b02 100644
--- a/kvmd/plugins/hid/_mcu/proto.py
+++ b/kvmd/plugins/hid/_mcu/proto.py
@@ -63,10 +63,11 @@ class SetKeyboardOutputEvent(BaseEvent):
# =====
_MOUSE_NAMES_TO_CODES = {
- "disabled": 0b00000000,
- "usb": 0b00001000,
- "usb_rel": 0b00010000,
- "ps2": 0b00011000,
+ "disabled": 0b00000000,
+ "usb": 0b00001000,
+ "usb_rel": 0b00010000,
+ "ps2": 0b00011000,
+ "usb_win98": 0b00100000,
}
_MOUSE_CODES_TO_NAMES = tools.swapped_kvs(_MOUSE_NAMES_TO_CODES)
diff --git a/kvmd/plugins/hid/otg/__init__.py b/kvmd/plugins/hid/otg/__init__.py
index 030c551d..f4df4c63 100644
--- a/kvmd/plugins/hid/otg/__init__.py
+++ b/kvmd/plugins/hid/otg/__init__.py
@@ -27,7 +27,6 @@ from typing import AsyncGenerator
from typing import Optional
from typing import Any
-from .... import tools
from .... import aiomulti
from ....yamlconf import Option
@@ -59,30 +58,31 @@ class Plugin(BaseHid): # pylint: disable=too-many-instance-attributes
self.__udc = UsbDeviceController(udc)
+ win98_fix = mouse.pop("absolute_win98_fix")
common = {
"udc": self.__udc,
"noop": noop,
"notifier": self.__notifier,
}
-
self.__keyboard_proc = KeyboardProcess(**common, **keyboard)
self.__mouse_current = self.__mouse_proc = MouseProcess(**common, **mouse)
self.__mouse_alt_proc: Optional[MouseProcess] = None
- self.__output_to_mouse: Dict[str, MouseProcess] = {}
- self.__mouse_to_output: Dict[MouseProcess, str] = {}
+ self.__mouses: Dict[str, MouseProcess] = {}
if mouse_alt["device_path"]:
self.__mouse_alt_proc = MouseProcess(
absolute=(not mouse["absolute"]),
- absolute_win98_fix=mouse["absolute_win98_fix"],
**common,
**mouse_alt,
)
- self.__output_to_mouse = {
+ self.__mouses = {
"usb": (self.__mouse_proc if mouse["absolute"] else self.__mouse_alt_proc),
"usb_rel": (self.__mouse_alt_proc if mouse["absolute"] else self.__mouse_proc),
}
- self.__mouse_to_output = tools.swapped_kvs(self.__output_to_mouse)
+ if win98_fix:
+ # На самом деле мультимышка и win95 не зависят друг от друга,
+ # но так было проще реализовать переключение режимов
+ self.__mouses["usb_win98"] = self.__mouses["usb"]
@classmethod
def get_plugin_options(cls) -> Dict:
@@ -139,8 +139,8 @@ class Plugin(BaseHid): # pylint: disable=too-many-instance-attributes
},
"mouse": {
"outputs": {
- "available": list(self.__output_to_mouse),
- "active": (self.__mouse_to_output[self.__mouse_current] if self.__mouse_alt_proc else ""),
+ "available": list(self.__mouses),
+ "active": self.__get_current_mouse_mode(),
},
**mouse_state,
},
@@ -157,7 +157,9 @@ class Plugin(BaseHid): # pylint: disable=too-many-instance-attributes
async def reset(self) -> None:
self.__keyboard_proc.send_reset_event()
- self.__mouse_current.send_reset_event()
+ self.__mouse_proc.send_reset_event()
+ if self.__mouse_alt_proc:
+ self.__mouse_alt_proc.send_reset_event()
async def cleanup(self) -> None:
try:
@@ -188,12 +190,23 @@ class Plugin(BaseHid): # pylint: disable=too-many-instance-attributes
def set_params(self, keyboard_output: Optional[str]=None, mouse_output: Optional[str]=None) -> None:
_ = keyboard_output
- if mouse_output != self.__mouse_to_output[self.__mouse_current]:
- if mouse_output in self.__output_to_mouse:
- self.__mouse_current.send_clear_event()
- self.__mouse_current = self.__output_to_mouse[mouse_output]
- self.__notifier.notify()
+ if mouse_output in self.__mouses and mouse_output != self.__get_current_mouse_mode():
+ self.__mouse_current.send_clear_event()
+ self.__mouse_current = self.__mouses[mouse_output]
+ self.__mouse_current.set_win98_fix(mouse_output == "usb_win98")
+ self.__notifier.notify()
def clear_events(self) -> None:
self.__keyboard_proc.send_clear_event()
- self.__mouse_current.send_clear_event()
+ self.__mouse_proc.send_clear_event()
+ if self.__mouse_alt_proc:
+ self.__mouse_alt_proc.send_clear_event()
+
+ # =====
+
+ def __get_current_mouse_mode(self) -> str:
+ if len(self.__mouses) == 0:
+ return ""
+ if self.__mouse_current.is_absolute():
+ return ("usb_win98" if self.__mouse_current.get_win98_fix() else "usb")
+ return "usb_rel"
diff --git a/kvmd/plugins/hid/otg/events.py b/kvmd/plugins/hid/otg/events.py
index 229f4faa..5bbffcd6 100644
--- a/kvmd/plugins/hid/otg/events.py
+++ b/kvmd/plugins/hid/otg/events.py
@@ -124,14 +124,23 @@ class MouseButtonEvent(BaseEvent):
class MouseMoveEvent(BaseEvent):
to_x: int
to_y: int
+ win98_fix: bool = False
to_fixed_x: int = 0
to_fixed_y: int = 0
def __post_init__(self) -> None:
assert MouseRange.MIN <= self.to_x <= MouseRange.MAX
assert MouseRange.MIN <= self.to_y <= MouseRange.MAX
- object.__setattr__(self, "to_fixed_x", MouseRange.remap(self.to_x, 0, MouseRange.MAX))
- object.__setattr__(self, "to_fixed_y", MouseRange.remap(self.to_y, 0, MouseRange.MAX))
+ to_fixed_x = MouseRange.remap(self.to_x, 0, MouseRange.MAX)
+ to_fixed_y = MouseRange.remap(self.to_y, 0, MouseRange.MAX)
+ if self.win98_fix:
+ # https://github.com/pikvm/pikvm/issues/159
+ # For some reason, the correct implementation of this fix
+ # is a shift to the left, and not to the right, as in VirtualBox
+ to_fixed_x <<= 1
+ to_fixed_y <<= 1
+ object.__setattr__(self, "to_fixed_x", to_fixed_x)
+ object.__setattr__(self, "to_fixed_y", to_fixed_y)
@dataclasses.dataclass(frozen=True)
diff --git a/kvmd/plugins/hid/otg/mouse.py b/kvmd/plugins/hid/otg/mouse.py
index 4ede3277..39e9657c 100644
--- a/kvmd/plugins/hid/otg/mouse.py
+++ b/kvmd/plugins/hid/otg/mouse.py
@@ -42,7 +42,6 @@ from .events import make_mouse_report
class MouseProcess(BaseDeviceProcess):
def __init__(self, **kwargs: Any) -> None:
self.__absolute: bool = kwargs.pop("absolute")
- self.__absolute_win98_fix: bool = kwargs.pop("absolute_win98_fix")
self.__horizontal_wheel: bool = kwargs.pop("horizontal_wheel")
super().__init__(
@@ -55,6 +54,16 @@ class MouseProcess(BaseDeviceProcess):
self.__pressed_buttons = 0
self.__x = 0 # For absolute
self.__y = 0
+ self.__win98_fix = False
+
+ def is_absolute(self) -> bool:
+ return self.__absolute
+
+ def set_win98_fix(self, enabled: bool) -> None:
+ self.__win98_fix = enabled
+
+ def get_win98_fix(self) -> bool:
+ return self.__win98_fix
def cleanup(self) -> None:
self._stop()
@@ -82,7 +91,7 @@ class MouseProcess(BaseDeviceProcess):
def send_move_event(self, to_x: int, to_y: int) -> None:
if self.__absolute:
- self._queue_event(MouseMoveEvent(to_x, to_y))
+ self._queue_event(MouseMoveEvent(to_x, to_y, self.__win98_fix))
def send_relative_event(self, delta_x: int, delta_y: int) -> None:
if not self.__absolute:
@@ -144,12 +153,6 @@ class MouseProcess(BaseDeviceProcess):
assert relative_event is None
move_x = self.__x
move_y = self.__y
- if self.__absolute_win98_fix:
- # https://github.com/pikvm/pikvm/issues/159
- # For some reason, the correct implementation of this fix
- # is a shift to the left, and not to the right, as in VirtualBox
- move_x <<= 1
- move_y <<= 1
else:
assert self.__x == self.__y == 0
if relative_event is not None: