mirror of
https://gitee.com/gfdgd-xi/deep-wine-runner
synced 2025-10-09 11:02:20 +08:00
107 lines
2.9 KiB
Python
107 lines
2.9 KiB
Python
|
|
import logging
|
|
import qvncwidget.rfbconstants as c
|
|
|
|
from PyQt5.QtGui import QMouseEvent
|
|
from PyQt5.QtCore import Qt
|
|
|
|
class RFBPixelformat:
|
|
def __init__(self,
|
|
bpp=32, depth=24, bigendian=False, truecolor=True,
|
|
redmax=255, greenmax=255, bluemax=255,
|
|
redshift=0, greenshift=0, blueshift=16):
|
|
|
|
self.bitspp = bpp
|
|
self.depth = depth
|
|
self.bigendian = 1 if bigendian else 0
|
|
self.truecolor = 1 if truecolor else 0
|
|
|
|
self.redmax = redmax
|
|
self.greenmax = greenmax
|
|
self.bluemax = bluemax
|
|
|
|
self.redshift = redshift
|
|
self.greenshift = greenshift
|
|
self.blueshift = blueshift
|
|
|
|
@staticmethod
|
|
def getRGB32():
|
|
return RFBPixelformat(
|
|
bpp=32, depth=32,
|
|
redshift=16, greenshift=8, blueshift=0
|
|
)
|
|
|
|
@staticmethod
|
|
def getRGB16():
|
|
return RFBPixelformat(
|
|
bpp=16, depth=16,
|
|
redmax=31, greenmax=63, bluemax=31,
|
|
redshift=11, greenshift=5, blueshift=0
|
|
)
|
|
|
|
@staticmethod
|
|
def getRGB555():
|
|
return RFBPixelformat(
|
|
bpp=16, depth=15,
|
|
redmax=31, greenmax=31, bluemax=31,
|
|
redshift=10, greenshift=5, blueshift=0
|
|
)
|
|
|
|
def asTuple(self) -> tuple:
|
|
return (
|
|
self.bitspp, self.depth, self.bigendian, self.truecolor,
|
|
self.redmax, self.greenmax, self.bluemax,
|
|
self.redshift, self.greenshift, self.blueshift
|
|
)
|
|
|
|
def __str__(self) -> str:
|
|
return ";".join(str(x) for x in self.asTuple())
|
|
|
|
class RFBRectangle:
|
|
def __init__(self, xPos: int, yPos: int, width: int, height: int):
|
|
self.xPos = xPos
|
|
self.yPos = yPos
|
|
self.width = width
|
|
self.height = height
|
|
|
|
def asTuple(self) -> tuple:
|
|
return (self.xPos, self.yPos, self.width, self.height)
|
|
|
|
def __str__(self) -> str:
|
|
return f"x: {self.xPos} y: {self.yPos} width: {self.width} height: {self.height}"
|
|
|
|
class RFBInput:
|
|
|
|
# thanks to ken3 (https://github.com/ken3) for this
|
|
MOUSE_MAPPING = {
|
|
Qt.LeftButton: 1 << 0,
|
|
Qt.MidButton: 1 << 1,
|
|
Qt.RightButton: 1 << 2,
|
|
}
|
|
|
|
@staticmethod
|
|
def fromQKeyEvent(eventID: int, eventStr: str) -> int:
|
|
rfbKey = c.KEY_TRANSLATION_SPECIAL.get(eventID)
|
|
|
|
if not rfbKey:
|
|
try:
|
|
rfbKey = ord(eventStr)
|
|
except TypeError:
|
|
logging.warning(f"Unknown keytype: {eventID} | {eventStr}")
|
|
return 0
|
|
|
|
return rfbKey
|
|
|
|
@staticmethod
|
|
def fromQMouseEvent(eventID: QMouseEvent, pressEvent: bool, mask) -> int:
|
|
_mask = RFBInput.MOUSE_MAPPING.get(eventID.button())
|
|
|
|
# FIXME: return previous bitmask in case unknown key is pressed
|
|
# TODO: implement all RFB supported buttons
|
|
if not _mask: return mask
|
|
|
|
if pressEvent:
|
|
return mask | _mask
|
|
else:
|
|
return mask & ~_mask
|