mirror of
https://gitee.com/gfdgd-xi/deep-wine-runner
synced 2025-12-14 19:12:04 +08:00
初步的虚拟机vnc连接
This commit is contained in:
106
novnc-client/qvncwidget/rfbhelpers.py
Normal file
106
novnc-client/qvncwidget/rfbhelpers.py
Normal file
@@ -0,0 +1,106 @@
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user