mirror of
				https://gitee.com/gfdgd-xi/deep-wine-runner
				synced 2025-11-04 07:22:23 +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
 |