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