diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cd2849033..0908312b9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,7 +57,7 @@ jobs: - name: Install setuptools run: sudo apt install python3-setuptools - name: Install PyRDP dependencies - run: sudo apt install libgl1-mesa-glx git python3-dev + run: sudo apt install libgl1-mesa-glx libegl1 git python3-dev - name: Install wheel working-directory: . run: pip install wheel diff --git a/Dockerfile b/Dockerfile index 695cb1101..ab392b5b3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -49,7 +49,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends python3 \ # Required for the setup.py install and progressbar (required by pyrdp-convert) python3-distutils \ # GUI and notifications stuff - libgl1-mesa-glx libxcb-xinerama0 \ + libgl1-mesa-glx libegl1 libxcb-xinerama0 \ libxcb-icccm4 libxcb-image0 libxcb-util1 libxcb-keysyms1 \ libxcb-randr0 libxcb-render-util0 \ libxkbcommon-x11-0 \ diff --git a/pyproject.toml b/pyproject.toml index 69f2ad89c..69422df32 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,7 +54,7 @@ dependencies = [ full = [ 'wheel>=0.34.2', 'av>=8,<12', - 'PySide2>=5.12,<6', + 'PySide6>=6.3,<7', 'qimage2ndarray>=1.6,<2', 'py-notifier>=0.3.0', 'win10toast>=0.9;platform_system=="Windows"', diff --git a/pyrdp/bin/convert.py b/pyrdp/bin/convert.py index fd8e6ad74..bbe2685bc 100755 --- a/pyrdp/bin/convert.py +++ b/pyrdp/bin/convert.py @@ -65,8 +65,8 @@ def main(): sys.exit(1) elif HAS_GUI and args.format == "mp4": # Initialize QT because QBitmap will segfault without it (#378, #428) - from PySide2.QtWidgets import QApplication - app = QApplication() + from PySide6.QtWidgets import QApplication + QApplication() logging.basicConfig(level=logging.CRITICAL) logging.getLogger("scapy").setLevel(logging.ERROR) @@ -100,4 +100,4 @@ def main(): sys.exit(exitCode) if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/pyrdp/bin/player.py b/pyrdp/bin/player.py index c70655bbe..23e5f1e06 100755 --- a/pyrdp/bin/player.py +++ b/pyrdp/bin/player.py @@ -32,7 +32,7 @@ os.environ['QT_MAC_WANTS_LAYER']='1' if HAS_GUI: from pyrdp.player import MainWindow - from PySide2.QtWidgets import QApplication + from PySide6.QtWidgets import QApplication def enableNotifications(logger): @@ -85,8 +85,8 @@ def main(): enableNotifications(logger) if not HAS_GUI and not args.headless: - logger.error('Headless mode is not specified and PySide2 is not installed.' - ' Install PySide2 to use the graphical user interface.') + logger.error('Headless mode is not specified and PySide6 is not installed.' + ' Install PySide6 to use the graphical user interface.') sys.exit(127) if not args.headless: diff --git a/pyrdp/convert/MP4EventHandler.py b/pyrdp/convert/MP4EventHandler.py index fe19b9108..9a8509d1f 100644 --- a/pyrdp/convert/MP4EventHandler.py +++ b/pyrdp/convert/MP4EventHandler.py @@ -1,6 +1,6 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2020-2021 GoSecure Inc. +# Copyright (C) 2020-2023 GoSecure Inc. # Licensed under the GPLv3 or later. # @@ -13,7 +13,7 @@ import av import qimage2ndarray -from PySide2.QtGui import QImage, QPainter, QColor +from PySide6.QtGui import QImage, QPainter, QColor class MP4Image(ImageHandler): diff --git a/pyrdp/player/AttackerBar.py b/pyrdp/player/AttackerBar.py index 650080a4b..fd4f2c277 100644 --- a/pyrdp/player/AttackerBar.py +++ b/pyrdp/player/AttackerBar.py @@ -1,13 +1,13 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2019 GoSecure Inc. +# Copyright (C) 2019-2023 GoSecure Inc. # Licensed under the GPLv3 or later. # import logging -from PySide2.QtCore import Signal -from PySide2.QtWidgets import QHBoxLayout, QWidget, QSpacerItem, QSizePolicy +from PySide6.QtCore import Signal +from PySide6.QtWidgets import QHBoxLayout, QWidget, QSpacerItem, QSizePolicy from pyrdp.logging import LOGGER_NAMES from pyrdp.ui import PlayPauseButton diff --git a/pyrdp/player/BaseTab.py b/pyrdp/player/BaseTab.py index cacce8106..42751ea27 100644 --- a/pyrdp/player/BaseTab.py +++ b/pyrdp/player/BaseTab.py @@ -1,13 +1,13 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2018-2020 GoSecure Inc. +# Copyright (C) 2018-2023 GoSecure Inc. # Licensed under the GPLv3 or later. # import logging -from PySide2.QtCore import Qt -from PySide2.QtWidgets import QScrollArea, QTextEdit, QVBoxLayout, QWidget +from PySide6.QtCore import Qt +from PySide6.QtWidgets import QScrollArea, QTextEdit, QVBoxLayout, QWidget from pyrdp.logging import LOGGER_NAMES from pyrdp.ui import QRemoteDesktop diff --git a/pyrdp/player/BaseWindow.py b/pyrdp/player/BaseWindow.py index c4801ae58..915d7ebdf 100644 --- a/pyrdp/player/BaseWindow.py +++ b/pyrdp/player/BaseWindow.py @@ -1,14 +1,14 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2018, 2019 GoSecure Inc. +# Copyright (C) 2018-2023 GoSecure Inc. # Licensed under the GPLv3 or later. # import logging from typing import Dict -from PySide2.QtGui import QKeySequence -from PySide2.QtWidgets import QShortcut, QTabWidget, QWidget +from PySide6.QtGui import QAction, QKeySequence +from PySide6.QtWidgets import QTabWidget, QWidget from pyrdp.logging import LOGGER_NAMES @@ -26,7 +26,12 @@ def __init__(self, options: Dict[str, object], parent: QWidget = None, maxTabCou self.tabCloseRequested.connect(self.onTabCloseRequest) self.log = logging.getLogger(LOGGER_NAMES.PLAYER) self.options = options - self.closeTabShortcut = QShortcut(QKeySequence("Ctrl+W"), self, self.onCtrlW) + + # close Tab + closeTabAction = QAction("Close Tab", self) + closeTabAction.setShortcut(QKeySequence("Ctrl+W")) + closeTabAction.triggered.connect(self.onCtrlW) + self.addAction(closeTabAction) def onTabClosed(self, index: int): """ diff --git a/pyrdp/player/FileDownloadDialog.py b/pyrdp/player/FileDownloadDialog.py index 405cd1ca4..7ad9b3313 100644 --- a/pyrdp/player/FileDownloadDialog.py +++ b/pyrdp/player/FileDownloadDialog.py @@ -1,11 +1,11 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2019 GoSecure Inc. +# Copyright (C) 2019, 2023 GoSecure Inc. # Licensed under the GPLv3 or later. # -from PySide2.QtCore import QObject, Qt -from PySide2.QtGui import QCloseEvent -from PySide2.QtWidgets import QDialog, QLabel, QMessageBox, QProgressBar, QPushButton, QVBoxLayout +from PySide6.QtCore import QObject, Qt +from PySide6.QtGui import QCloseEvent +from PySide6.QtWidgets import QDialog, QLabel, QMessageBox, QProgressBar, QPushButton, QVBoxLayout class FileDownloadDialog(QDialog): @@ -110,4 +110,4 @@ def reportCompletion(self, error: int): def closeEvent(self, event: QCloseEvent): if not self.isComplete: - event.ignore() \ No newline at end of file + event.ignore() diff --git a/pyrdp/player/FileSystemItem.py b/pyrdp/player/FileSystemItem.py index 6a5d129bd..f70a6d00f 100644 --- a/pyrdp/player/FileSystemItem.py +++ b/pyrdp/player/FileSystemItem.py @@ -1,13 +1,13 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2019 GoSecure Inc. +# Copyright (C) 2019, 2023 GoSecure Inc. # Licensed under the GPLv3 or later. # from typing import Dict -from PySide2.QtCore import QObject -from PySide2.QtGui import QIcon -from PySide2.QtWidgets import QFileIconProvider, QListWidgetItem +from PySide6.QtCore import QObject +from PySide6.QtGui import QIcon +from PySide6.QtWidgets import QFileIconProvider, QListWidgetItem from pyrdp.player.filesystem import FileSystemItemType @@ -51,4 +51,4 @@ def __lt__(self, other: 'FileSystemItem'): if self.isDirectory() != other.isDirectory(): return self.isDirectory() - return self.text().upper() < other.text().upper() \ No newline at end of file + return self.text().upper() < other.text().upper() diff --git a/pyrdp/player/FileSystemWidget.py b/pyrdp/player/FileSystemWidget.py index aaee5895b..aa0d32e3a 100644 --- a/pyrdp/player/FileSystemWidget.py +++ b/pyrdp/player/FileSystemWidget.py @@ -1,14 +1,15 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2019 GoSecure Inc. +# Copyright (C) 2019, 2023 GoSecure Inc. # Licensed under the GPLv3 or later. # from pathlib import Path from typing import Optional -from PySide2.QtCore import QObject, QPoint, Qt, Signal -from PySide2.QtWidgets import QAction, QFileDialog, QFrame, QLabel, QListWidget, QMenu, QMessageBox, QVBoxLayout, QWidget +from PySide6.QtCore import QObject, QPoint, Qt, Signal +from PySide6.QtGui import QAction +from PySide6.QtWidgets import QFileDialog, QFrame, QLabel, QListWidget, QMenu, QMessageBox, QVBoxLayout, QWidget from pyrdp.player.FileDownloadDialog import FileDownloadDialog from pyrdp.player.filesystem import Directory, DirectoryObserver, File, FileSystemItemType @@ -217,7 +218,7 @@ def downloadDirectoryRecursively(self): dialog = None if directoryPath == "": - QMessageBox.critical(self, "Download folder", f"Please select a valid folder. Aborting download.") + QMessageBox.critical(self, "Download folder", "Please select a valid folder. Aborting download.") return directoryPath += f"/{selectedFolder.name}" @@ -225,7 +226,7 @@ def downloadDirectoryRecursively(self): try: os.mkdir(directoryPath) except FileExistsError: - QMessageBox.critical(self, "Download folder", f"Folder already exist. Make sure to select an empty directory. Aborting download.") + QMessageBox.critical(self, "Download folder", "Folder already exist. Make sure to select an empty directory. Aborting download.") return dialog = FileDownloadDialog(remotePath, directoryPath, True, self) diff --git a/pyrdp/player/LiveEventHandler.py b/pyrdp/player/LiveEventHandler.py index 8635da4b3..aaccccb2a 100644 --- a/pyrdp/player/LiveEventHandler.py +++ b/pyrdp/player/LiveEventHandler.py @@ -1,14 +1,14 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2019 GoSecure Inc. +# Copyright (C) 2019, 2023 GoSecure Inc. # Licensed under the GPLv3 or later. # from logging import LoggerAdapter from pathlib import Path, PosixPath from typing import BinaryIO, Dict, Union -from PySide2.QtCore import Signal -from PySide2.QtWidgets import QTextEdit +from PySide6.QtCore import Signal +from PySide6.QtWidgets import QTextEdit from pyrdp.enum import DeviceType, PlayerPDUType from pyrdp.layer import PlayerLayer @@ -96,7 +96,7 @@ def addToDownloadQueue(self, item: Union[File, Directory], targetPath: str, dial self.jobsQueue.add(job) - if self.currentDownload == None: + if self.currentDownload is None: self.dispatchDownload() def dispatchDownload(self): diff --git a/pyrdp/player/LiveTab.py b/pyrdp/player/LiveTab.py index cb5ec609a..9b97d661c 100644 --- a/pyrdp/player/LiveTab.py +++ b/pyrdp/player/LiveTab.py @@ -1,13 +1,13 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2018-2020 GoSecure Inc. +# Copyright (C) 2018-2023 GoSecure Inc. # Licensed under the GPLv3 or later. # import asyncio -from PySide2.QtCore import Qt -from PySide2.QtWidgets import QHBoxLayout, QWidget +from PySide6.QtCore import Qt +from PySide6.QtWidgets import QHBoxLayout, QWidget from pyrdp.mitm.PlayerLayerSet import AsyncIOPlayerLayerSet from pyrdp.player.AttackerBar import AttackerBar diff --git a/pyrdp/player/LiveThread.py b/pyrdp/player/LiveThread.py index 9fd4506f3..56223b39a 100644 --- a/pyrdp/player/LiveThread.py +++ b/pyrdp/player/LiveThread.py @@ -1,6 +1,6 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2018 GoSecure Inc. +# Copyright (C) 2018, 2023 GoSecure Inc. # Licensed under the GPLv3 or later. # @@ -8,7 +8,7 @@ import logging from typing import Callable -from PySide2.QtCore import QThread +from PySide6.QtCore import QThread from pyrdp.logging import LOGGER_NAMES @@ -43,4 +43,4 @@ def stop(self): self.loop.call_soon_threadsafe(self.stopLoop) def stopLoop(self): - self.loop.stop() \ No newline at end of file + self.loop.stop() diff --git a/pyrdp/player/LiveWindow.py b/pyrdp/player/LiveWindow.py index cdd7e3787..09df7a320 100644 --- a/pyrdp/player/LiveWindow.py +++ b/pyrdp/player/LiveWindow.py @@ -1,6 +1,6 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2019, 2020 GoSecure Inc. +# Copyright (C) 2019-2023 GoSecure Inc. # Licensed under the GPLv3 or later. # @@ -8,8 +8,8 @@ from queue import Queue from typing import Dict -from PySide2.QtCore import Qt, Signal -from PySide2.QtWidgets import QApplication, QFileIconProvider, QMessageBox, QWidget +from PySide6.QtCore import Qt, Signal +from PySide6.QtWidgets import QApplication, QFileIconProvider, QMessageBox, QWidget from pyrdp.player.BaseWindow import BaseWindow from pyrdp.player.LiveTab import LiveTab diff --git a/pyrdp/player/MainWindow.py b/pyrdp/player/MainWindow.py index 3f587e75a..1a4a2df62 100644 --- a/pyrdp/player/MainWindow.py +++ b/pyrdp/player/MainWindow.py @@ -1,12 +1,13 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2018-2020 GoSecure Inc. +# Copyright (C) 2018-2023 GoSecure Inc. # Licensed under the GPLv3 or later. # from typing import List -from PySide2.QtCore import Qt, Signal -from PySide2.QtWidgets import QAction, QFileDialog, QInputDialog, QMainWindow, QTabWidget +from PySide6.QtCore import Qt, Signal +from PySide6.QtGui import QAction +from PySide6.QtWidgets import QFileDialog, QInputDialog, QMainWindow, QTabWidget from pyrdp.player import BaseTab from pyrdp.player.LiveWindow import LiveWindow diff --git a/pyrdp/player/PlayerEventHandler.py b/pyrdp/player/PlayerEventHandler.py index 5b128b0a9..7d7579816 100644 --- a/pyrdp/player/PlayerEventHandler.py +++ b/pyrdp/player/PlayerEventHandler.py @@ -1,12 +1,12 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2018-2020 GoSecure Inc. +# Copyright (C) 2018-2023 GoSecure Inc. # Licensed under the GPLv3 or later. # -from PySide2.QtCore import QObject -from PySide2.QtGui import QTextCursor -from PySide2.QtWidgets import QTextEdit +from PySide6.QtCore import QObject +from PySide6.QtGui import QTextCursor +from PySide6.QtWidgets import QTextEdit from pyrdp.pdu import PlayerPDU from pyrdp.enum import CapabilityType @@ -15,7 +15,7 @@ from pyrdp.logging import log -class PlayerEventHandler(QObject, RenderingEventHandler): +class PlayerEventHandler(RenderingEventHandler, QObject): """ Qt Rendering Sink. diff --git a/pyrdp/player/QTimerSequencer.py b/pyrdp/player/QTimerSequencer.py index 4cbceebeb..932057569 100644 --- a/pyrdp/player/QTimerSequencer.py +++ b/pyrdp/player/QTimerSequencer.py @@ -1,10 +1,10 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2019 GoSecure Inc. +# Copyright (C) 2019, 2023 GoSecure Inc. # Licensed under the GPLv3 or later. # -from PySide2.QtCore import QTimer +from PySide6.QtCore import QTimer from pyrdp.core import Sequencer @@ -15,4 +15,4 @@ class QTimerSequencer(Sequencer): """ def wait(self, waitTime: int): - QTimer.singleShot(waitTime, self.run) \ No newline at end of file + QTimer.singleShot(waitTime, self.run) diff --git a/pyrdp/player/RDPMITMWidget.py b/pyrdp/player/RDPMITMWidget.py index 7637049af..35d7002e8 100644 --- a/pyrdp/player/RDPMITMWidget.py +++ b/pyrdp/player/RDPMITMWidget.py @@ -1,6 +1,6 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2019 GoSecure Inc. +# Copyright (C) 2019, 2023 GoSecure Inc. # Licensed under the GPLv3 or later. # @@ -10,9 +10,9 @@ import time from typing import Optional, Union -from PySide2.QtCore import QEvent, QObject, Qt -from PySide2.QtGui import QKeyEvent, QMouseEvent, QWheelEvent -from PySide2.QtWidgets import QWidget +from PySide6.QtCore import QEvent, QObject, Qt +from PySide6.QtGui import QKeyEvent, QMouseEvent, QWheelEvent +from PySide6.QtWidgets import QWidget from pyrdp.enum import MouseButton from pyrdp.layer import PlayerLayer @@ -46,7 +46,8 @@ def getTimetamp(self) -> int: def getMousePosition(self, event: Union[QMouseEvent, QWheelEvent]) -> (int, int): - return max(event.x(), 0), max(event.y(), 0) + pos = event.position() + return max(pos.x(), 0), max(pos.y(), 0) def mouseMoveEvent(self, event: QMouseEvent): if not self.handleEvents or not self.hasFocus(): diff --git a/pyrdp/player/ReplayBar.py b/pyrdp/player/ReplayBar.py index aa1109bec..95d122f70 100644 --- a/pyrdp/player/ReplayBar.py +++ b/pyrdp/player/ReplayBar.py @@ -1,12 +1,12 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2018-2020 GoSecure Inc. +# Copyright (C) 2018-2023 GoSecure Inc. # Licensed under the GPLv3 or later. # import logging -from PySide2.QtCore import Qt, Signal -from PySide2.QtWidgets import QCheckBox, QHBoxLayout, QLabel, QSizePolicy, QSlider, QSpacerItem, \ +from PySide6.QtCore import Qt, Signal +from PySide6.QtWidgets import QCheckBox, QHBoxLayout, QLabel, QSizePolicy, QSlider, QSpacerItem, \ QVBoxLayout, QWidget from pyrdp.logging import LOGGER_NAMES diff --git a/pyrdp/player/ReplayTab.py b/pyrdp/player/ReplayTab.py index c32fc21dd..04c6075fc 100644 --- a/pyrdp/player/ReplayTab.py +++ b/pyrdp/player/ReplayTab.py @@ -1,13 +1,12 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2019-2021 GoSecure Inc. +# Copyright (C) 2019-2023 GoSecure Inc. # Licensed under the GPLv3 or later. # -from PySide2.QtCore import Qt -from PySide2.QtGui import QResizeEvent, QKeyEvent -from PySide2.QtWidgets import QApplication, QWidget +from PySide6.QtCore import Qt +from PySide6.QtGui import QResizeEvent, QKeyEvent +from PySide6.QtWidgets import QApplication, QWidget -from pyrdp.layer import PlayerLayer from pyrdp.player.BaseTab import BaseTab from pyrdp.player.PlayerEventHandler import PlayerEventHandler from pyrdp.player.Replay import Replay, ReplayReader diff --git a/pyrdp/player/ReplayThread.py b/pyrdp/player/ReplayThread.py index be1a15cf5..59774b5eb 100644 --- a/pyrdp/player/ReplayThread.py +++ b/pyrdp/player/ReplayThread.py @@ -1,6 +1,6 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2018-2021 GoSecure Inc. +# Copyright (C) 2018-2023 GoSecure Inc. # Licensed under the GPLv3 or later. # @@ -9,7 +9,7 @@ from multiprocessing import Queue from time import sleep -from PySide2.QtCore import QThread, Signal +from PySide6.QtCore import QThread, Signal from pyrdp.core import Timer from pyrdp.player.Replay import Replay diff --git a/pyrdp/player/ReplayWindow.py b/pyrdp/player/ReplayWindow.py index 8338d9652..26d0d1dd2 100644 --- a/pyrdp/player/ReplayWindow.py +++ b/pyrdp/player/ReplayWindow.py @@ -1,14 +1,14 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2019, 2020 GoSecure Inc. +# Copyright (C) 2019-2023 GoSecure Inc. # Licensed under the GPLv3 or later. # from typing import Dict -from PySide2.QtCore import Qt -from PySide2.QtGui import QResizeEvent -from PySide2.QtWidgets import QWidget +from PySide6.QtCore import Qt +from PySide6.QtGui import QResizeEvent +from PySide6.QtWidgets import QWidget from pyrdp.player.BaseWindow import BaseWindow from pyrdp.player.ReplayTab import ReplayTab diff --git a/pyrdp/player/SeekBar.py b/pyrdp/player/SeekBar.py index a0e3ac22e..32195528c 100644 --- a/pyrdp/player/SeekBar.py +++ b/pyrdp/player/SeekBar.py @@ -1,11 +1,11 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2018 GoSecure Inc. +# Copyright (C) 2018, 2023 GoSecure Inc. # Licensed under the GPLv3 or later. # -from PySide2.QtWidgets import QWidget, QProgressBar -from PySide2.QtGui import QMouseEvent +from PySide6.QtWidgets import QWidget, QProgressBar +from PySide6.QtGui import QMouseEvent class SeekBar(QProgressBar): @@ -22,6 +22,6 @@ def setValue(self, p_int): self.repaint() def mousePressEvent(self, event: QMouseEvent): - progress = event.x() / self.width() + progress = event.position().x() / self.width() value = int(progress * self.maximum()) - self.setValue(value) \ No newline at end of file + self.setValue(value) diff --git a/pyrdp/player/gdi/cache.py b/pyrdp/player/gdi/cache.py index 34ff73bb3..ce945bbaf 100644 --- a/pyrdp/player/gdi/cache.py +++ b/pyrdp/player/gdi/cache.py @@ -1,6 +1,6 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2020-2021 GoSecure Inc. +# Copyright (C) 2020-2023 GoSecure Inc. # Licensed under the GPLv3 or later. # @@ -9,8 +9,8 @@ """ from typing import List -from PySide2.QtCore import QSize -from PySide2.QtGui import QBrush, QImage, QBitmap +from PySide6.QtCore import QSize +from PySide6.QtGui import QBrush, QImage, QBitmap from pyrdp.parser.rdp.orders.common import Glyph diff --git a/pyrdp/player/gdi/draw.py b/pyrdp/player/gdi/draw.py index fa04a8143..b83aa54ff 100644 --- a/pyrdp/player/gdi/draw.py +++ b/pyrdp/player/gdi/draw.py @@ -1,6 +1,6 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2021 GoSecure Inc. +# Copyright (C) 2021-2023 GoSecure Inc. # Licensed under the GPLv3 or later. # @@ -20,13 +20,13 @@ FastIndex, PolygonSc, PolygonCb, PolyLine, FastGlyph, EllipseSc, EllipseCb, GlyphIndex, Brush, \ BACKMODE_TRANSPARENT -from pyrdp.ui import QRemoteDesktop, RDPBitmapToQtImage +from pyrdp.ui import RDPBitmapToQtImage from .cache import BitmapCache, BrushCache, PaletteCache, GlyphCache, GlyphEntry from .raster import set_rop3, set_rop2 -from PySide2.QtCore import Qt, QPoint -from PySide2.QtGui import QImage, QPainter, QColor, QPixmap, QBrush, QPen, QPolygon +from PySide6.QtCore import Qt, QPoint +from PySide6.QtGui import QImage, QPainter, QColor, QPixmap, QBrush, QPen, QPolygon from pyrdp.player.ImageHandler import ImageHandler diff --git a/pyrdp/player/gdi/raster.py b/pyrdp/player/gdi/raster.py index 8d38a7e03..a89146b14 100644 --- a/pyrdp/player/gdi/raster.py +++ b/pyrdp/player/gdi/raster.py @@ -1,10 +1,10 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2020 GoSecure Inc. +# Copyright (C) 2020-2023 GoSecure Inc. # Licensed under the GPLv3 or later. # -from PySide2.QtGui import QPainter +from PySide6.QtGui import QPainter # All raster operations defined by [MS-RDPEGDI] Section 2.2.2.2.1.1.1.7 BLACKNESS = 0x00 diff --git a/pyrdp/player/keyboard.py b/pyrdp/player/keyboard.py index 4c6f76bb6..ac3257f03 100644 --- a/pyrdp/player/keyboard.py +++ b/pyrdp/player/keyboard.py @@ -1,13 +1,13 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2019-2020 GoSecure Inc. +# Copyright (C) 2019-2023 GoSecure Inc. # Licensed under the GPLv3 or later. # from typing import Optional -from PySide2.QtCore import Qt -from PySide2.QtGui import QKeyEvent +from PySide6.QtCore import Qt +from PySide6.QtGui import QKeyEvent SCANCODE_MAPPING = { Qt.Key.Key_Escape: 0x01, diff --git a/pyrdp/ui/PlayPauseButton.py b/pyrdp/ui/PlayPauseButton.py index 9e2a6dce5..d8b53ad61 100644 --- a/pyrdp/ui/PlayPauseButton.py +++ b/pyrdp/ui/PlayPauseButton.py @@ -1,11 +1,11 @@ # # This file is part of the PyRDP project. -# Copyright (C) 2018 GoSecure Inc. +# Copyright (C) 2018, 2023 GoSecure Inc. # Licensed under the GPLv3 or later. # -from PySide2.QtWidgets import QPushButton, QWidget -from PySide2.QtGui import QIcon +from PySide6.QtWidgets import QPushButton, QWidget +from PySide6.QtGui import QIcon class PlayPauseButton(QPushButton): diff --git a/pyrdp/ui/qt.py b/pyrdp/ui/qt.py index 4b93126fa..9fab5e099 100644 --- a/pyrdp/ui/qt.py +++ b/pyrdp/ui/qt.py @@ -1,6 +1,6 @@ # # Copyright (c) 2014-2015 Sylvain Peyrefitte -# Copyright (c) 2018-2021 GoSecure Inc. +# Copyright (c) 2018-2023 GoSecure Inc. # # This file is part of PyRDP. # This file was part of rdpy. @@ -30,9 +30,9 @@ import rle from io import BytesIO -from PySide2.QtCore import QEvent, QPoint, Qt, Signal -from PySide2.QtGui import QColor, QImage, QMatrix, QPainter -from PySide2.QtWidgets import QWidget +from PySide6.QtCore import QEvent, QPoint, Qt, Signal +from PySide6.QtGui import QColor, QImage, QTransform, QPainter +from PySide6.QtWidgets import QWidget from pyrdp.logging import log from pyrdp.player.ImageHandler import ImageHandler @@ -56,7 +56,7 @@ def RDPBitmapToQtImage(width: int, height: int, bitsPerPixel: int, isCompressed: image = QImage(buf, width, height, QImage.Format_RGB555) else: buf = data - image = QImage(buf, width, height, QImage.Format_RGB555).transformed(QMatrix(1.0, 0.0, 0.0, -1.0, 0.0, 0.0)) + image = QImage(buf, width, height, QImage.Format_RGB555).transformed(QTransform(1.0, 0.0, 0.0, -1.0, 0.0, 0.0)) elif bitsPerPixel == 16: if isCompressed: @@ -64,7 +64,7 @@ def RDPBitmapToQtImage(width: int, height: int, bitsPerPixel: int, isCompressed: image = QImage(buf, width, height, QImage.Format_RGB16) else: buf = data - image = QImage(buf, width, height, QImage.Format_RGB16).transformed(QMatrix(1.0, 0.0, 0.0, -1.0, 0.0, 0.0)) + image = QImage(buf, width, height, QImage.Format_RGB16).transformed(QTransform(1.0, 0.0, 0.0, -1.0, 0.0, 0.0)) elif bitsPerPixel == 24: if isCompressed: @@ -82,7 +82,7 @@ def RDPBitmapToQtImage(width: int, height: int, bitsPerPixel: int, isCompressed: image = QImage(buf, width, height, QImage.Format_RGB888) else: buf = data - image = QImage(buf, width, height, QImage.Format_RGB888).transformed(QMatrix(1.0, 0.0, 0.0, -1.0, 0.0, 0.0)) + image = QImage(buf, width, height, QImage.Format_RGB888).transformed(QTransform(1.0, 0.0, 0.0, -1.0, 0.0, 0.0)) elif bitsPerPixel == 32: if isCompressed: @@ -90,7 +90,7 @@ def RDPBitmapToQtImage(width: int, height: int, bitsPerPixel: int, isCompressed: image = QImage(buf, width, height, QImage.Format_RGB32) else: buf = data - image = QImage(buf, width, height, QImage.Format_RGB32).transformed(QMatrix(1.0, 0.0, 0.0, -1.0, 0.0, 0.0)) + image = QImage(buf, width, height, QImage.Format_RGB32).transformed(QTransform(1.0, 0.0, 0.0, -1.0, 0.0, 0.0)) elif bitsPerPixel == 8: if isCompressed: _buf = rle.bitmap_decompress(data, width, height, 1) @@ -98,7 +98,7 @@ def RDPBitmapToQtImage(width: int, height: int, bitsPerPixel: int, isCompressed: image = QImage(buf, width, height, QImage.Format_RGB16) else: buf = convert8bppTo16bpp(data) - image = QImage(buf, width, height, QImage.Format_RGB16).transformed(QMatrix(1.0, 0.0, 0.0, -1.0, 0.0, 0.0)) + image = QImage(buf, width, height, QImage.Format_RGB16).transformed(QTransform(1.0, 0.0, 0.0, -1.0, 0.0, 0.0)) else: log.error("Receive image in bad format") image = QImage(width, height, QImage.Format_RGB32) diff --git a/requirements.txt b/requirements.txt index 0e77d6b6d..a3ac4d78a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ pyasn1-modules==0.3.0 pycparser==2.21 pycryptodome==3.19.0 pyOpenSSL==23.3.0 -PySide2==5.15.2.1 +PySide6-Essentials==6.6.1 python-utils==3.8.1 pytz==2023.3.post1 qimage2ndarray==1.10.0