Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Application details

This is a Qt5 platform plugin to export application through RDP without modifying
This is a Qt5/Qt6 platform plugin to export application through RDP without modifying
the original code.

## Requirements
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/platforms/freerdp/qfreerdpbackingstore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ QFreeRdpBackingStore::QFreeRdpBackingStore(QWindow *window, QFreeRdpPlatform *pl
}

QFreeRdpBackingStore::~QFreeRdpBackingStore() {
mPlatform->dropBackingStore(this);
}

QPaintDevice *QFreeRdpBackingStore::paintDevice() {
Expand All @@ -46,7 +47,6 @@ QPaintDevice *QFreeRdpBackingStore::paintDevice() {

void QFreeRdpBackingStore::flush(QWindow *window, const QRegion &region, const QPoint &offset)
{
Q_UNUSED(window);
Q_UNUSED(offset);

mPlatform->mWindowManager->pushDirtyArea(
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/platforms/freerdp/qfreerdpbackingstore.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class QFreeRdpBackingStore : public QObject, public QPlatformBackingStore
public:
QFreeRdpBackingStore(QWindow *window, QFreeRdpPlatform *platform);

~QFreeRdpBackingStore();
virtual ~QFreeRdpBackingStore();

QPaintDevice *paintDevice() override;

Expand Down
25 changes: 22 additions & 3 deletions src/plugins/platforms/freerdp/qfreerdpplatform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@
#include "qfreerdpclipboard.h"
#include "qfreerdpwindow.h"
#include "qfreerdpwindowmanager.h"
#include "xcursors/qfreerdpxcursor.h"

#include <sys/socket.h>
#include <netinet/in.h>

Expand Down Expand Up @@ -201,6 +203,7 @@ QFreeRdpPlatform::QFreeRdpPlatform(const QString& system, const QStringList& par
, mClipboard(new QFreeRdpClipboard())
, mConfig(new QFreeRdpPlatformConfig(paramList))
, mScreen(new QFreeRdpScreen(this, mConfig->screenSz.width(), mConfig->screenSz.height()))
, mCursor(new QFreeRdpCursor(this))
, mWindowManager(new QFreeRdpWindowManager(this, mConfig->fps))
, mListener(new QFreeRdpListener(this))
, mResourcesLoaded(false)
Expand Down Expand Up @@ -228,20 +231,25 @@ QFreeRdpPlatform::~QFreeRdpPlatform() {
}

delete mListener;
delete mWindowManager;
delete mScreen;
delete mCursor;
delete mConfig;
delete mClipboard;
delete mNativeInterface;
delete mFontDb;
delete mWindowManager;
delete mScreen;
}

QPlatformWindow *QFreeRdpPlatform::createPlatformWindow(QWindow *window) const {
qDebug() << "QFreeRdpPlatform::createPlatformWindow(modality=" << window->modality()
qDebug() << "QFreeRdpPlatform::createPlatformWindow(window=" << (void*)window << " modality=" << window->modality()
<< " flags=" << window->flags() << ")";

QFreeRdpWindow *ret = new QFreeRdpWindow(window, const_cast<QFreeRdpPlatform*>(this));
mWindowManager->addWindow(ret);
auto it = mbackingStores.find(window);
if (it != mbackingStores.end())
ret->setBackingStore(*it);

return ret;
}

Expand Down Expand Up @@ -360,6 +368,8 @@ void QFreeRdpPlatform::unregisterPeer(QFreeRdpPeer *peer) {
}

void QFreeRdpPlatform::registerBackingStore(QWindow *w, QFreeRdpBackingStore *back) {
mbackingStores.insert(w, back);

foreach(QFreeRdpWindow *rdpWindow, *mWindowManager->getAllWindows()) {
if(rdpWindow->window() == w) {
rdpWindow->setBackingStore(back);
Expand All @@ -369,6 +379,15 @@ void QFreeRdpPlatform::registerBackingStore(QWindow *w, QFreeRdpBackingStore *ba
qWarning("did not find window %p in window manager to register its backing store", (void*)w);
}

void QFreeRdpPlatform::dropBackingStore(QFreeRdpBackingStore *back)
{
for (auto it = mbackingStores.begin(); it != mbackingStores.end(); ++it)
if (it.value() == back) {
mbackingStores.erase(it);
break;
}
}

void QFreeRdpPlatform::repaint(const QRegion &region) {
foreach(QFreeRdpPeer *peer, mPeers) {
peer->repaint(region);
Expand Down
20 changes: 10 additions & 10 deletions src/plugins/platforms/freerdp/qfreerdpplatform.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class QFreeRdpWindow;
class QFreeRdpBackingStore;
class QFreeRdpWindowManager;
class QFreeRdpClipboard;
class QFreeRdpCursor;

enum DisplayMode {
UNKNOWN = 0,
Expand Down Expand Up @@ -92,9 +93,7 @@ struct QFreeRdpPlatformConfig {
};


/**
* @brief
*/
/** @brief FreeRDP based platform */
class QFreeRdpPlatform : public QObject, public QPlatformIntegration {
friend class QFreeRdpScreen;
friend class QFreeRdpCursor;
Expand All @@ -110,6 +109,7 @@ class QFreeRdpPlatform : public QObject, public QPlatformIntegration {
*/
QFreeRdpPlatform(const QString& system, const QStringList& paramList);

/** dtor */
virtual ~QFreeRdpPlatform();

/** @overload QPlatformIntegration
Expand All @@ -136,17 +136,13 @@ class QFreeRdpPlatform : public QObject, public QPlatformIntegration {
/** @return the main screen */
QFreeRdpScreen *getScreen() { return mScreen; }

/** @return */
/** @return clipboard */
QFreeRdpClipboard *rdpClipboard() const { return mClipboard; }

/**
* @return listen address
*/
/** @return listen address */
char* getListenAddress() const;

/**
* @return listen port
*/
/** @return listen port */
int getListenPort() const;

/** registers a RDP peer
Expand All @@ -165,6 +161,7 @@ class QFreeRdpPlatform : public QObject, public QPlatformIntegration {
void repaint(const QRegion &region);

void registerBackingStore(QWindow *w, QFreeRdpBackingStore *back);
void dropBackingStore(QFreeRdpBackingStore *back);

/** @return the event dispatcher */
QAbstractEventDispatcher *getDispatcher() { return mEventDispatcher; }
Expand All @@ -191,10 +188,13 @@ class QFreeRdpPlatform : public QObject, public QPlatformIntegration {

QFreeRdpPlatformConfig *mConfig;
QFreeRdpScreen *mScreen;
QFreeRdpCursor *mCursor;
QFreeRdpWindowManager *mWindowManager;
QFreeRdpListener *mListener;
bool mResourcesLoaded;
QMap<IconResourceType, IconResource*> mResources;
typedef QMap<QWindow *, QFreeRdpBackingStore *> BackingStoreMap;
BackingStoreMap mbackingStores;
QList<QFreeRdpPeer *> mPeers;
QString mPlatformName;
};
Expand Down
6 changes: 2 additions & 4 deletions src/plugins/platforms/freerdp/qfreerdpscreen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,18 @@

#include "qfreerdpscreen.h"
#include "qfreerdpplatform.h"
#include "xcursors/qfreerdpxcursor.h"
#include "qfreerdpwindowmanager.h"

#include <QtCore/QtDebug>
#include <QDebug>

#include <qpa/qwindowsysteminterface.h>
#include "xcursors/qfreerdpxcursor.h"

QT_BEGIN_NAMESPACE

QFreeRdpScreen::QFreeRdpScreen(QFreeRdpPlatform *platform, int width, int height)
: mPlatform(platform)
, mCursor(new QFreeRdpCursor(platform))
{
qDebug("QFreeRdpScreen::%s(%d x %d)", __func__, width, height);
mGeometry = QRect(0, 0, width, height);
Expand All @@ -45,7 +44,6 @@ QFreeRdpScreen::QFreeRdpScreen(QFreeRdpPlatform *platform, int width, int height
QFreeRdpScreen::~QFreeRdpScreen() {
qDebug() << "QFreeRdpScreen::" << __func__ << "()";
delete mScreenBits;
delete mCursor;
}

QRect QFreeRdpScreen::geometry() const {
Expand All @@ -66,7 +64,7 @@ qreal QFreeRdpScreen::refreshRate() const {
}

QPlatformCursor *QFreeRdpScreen::cursor() const {
return mCursor;
return mPlatform->mCursor;
}

void QFreeRdpScreen::setGeometry(const QRect &geometry) {
Expand Down
3 changes: 1 addition & 2 deletions src/plugins/platforms/freerdp/qfreerdpscreen.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class QFreeRdpScreen : public QObject, public QPlatformScreen
Q_OBJECT
public:
QFreeRdpScreen(QFreeRdpPlatform *platform, int width, int height);
~QFreeRdpScreen();
virtual ~QFreeRdpScreen();

QRect geometry() const override;
int depth() const override;
Expand All @@ -55,7 +55,6 @@ public slots:
QRect mGeometry;
QFreeRdpPlatform *mPlatform;
QImage *mScreenBits;
QFreeRdpCursor *mCursor;
};

QT_END_NAMESPACE
Expand Down
20 changes: 9 additions & 11 deletions src/plugins/platforms/freerdp/qfreerdpwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,13 @@ static volatile int globalWinId = 1;
QFreeRdpWindow::QFreeRdpWindow(QWindow *window, QFreeRdpPlatform *platform) :
QPlatformWindow(window),
mPlatform(platform),
mBackingStore(0),
mBackingStore(nullptr),
mWinId( WId(globalWinId++) ),
mVisible(false),
mSentInitialResize(false),
mDecorate(false),
mDecorations(nullptr)
{
mScreen = QPlatformScreen::platformScreenForWindow(window);
qDebug() << "QFreeRdpWindow ctor(" << mWinId << ", type=" << window->type() << ")";

// adapt window position
Expand Down Expand Up @@ -143,7 +142,7 @@ void QFreeRdpWindow::setVisible(bool visible) {
void QFreeRdpWindow::setGeometry(const QRect &rect) {
qDebug("QFreeRdpWindow::%s(%llu, %d,%d - %dx%d)", __func__, mWinId, rect.left(),
rect.top(), rect.width(), rect.height());
QRegion updateRegion(geometry());
QRegion updateRegion(outerWindowGeometry());

QPlatformWindow::setGeometry(rect);
updateRegion += outerWindowGeometry();
Expand All @@ -167,13 +166,12 @@ void QFreeRdpWindow::propagateSizeHints() {
}



QMargins QFreeRdpWindow::frameMargins() const
{
if (mDecorate)
return QMargins(BORDERS_SIZE, TOP_BAR_SIZE, BORDERS_SIZE, BORDERS_SIZE);
else
return QMargins();

return QMargins();
}

void QFreeRdpWindow::setWindowTitle(const QString &title)
Expand Down Expand Up @@ -202,16 +200,16 @@ QRegion QFreeRdpWindow::decorationGeometry() const {

const QImage *QFreeRdpWindow::windowContent() {
if (!mBackingStore) {
qWarning("QFreeRdpWindow::%s: window %p has no backing store", __func__, (void*)this);
return 0;
qWarning("QFreeRdpWindow::%s: window %p(%lld) has no backing store", __func__, (void*)this, mWinId);
return nullptr;
}
return (const QImage*) mBackingStore->paintDevice();
}

void QFreeRdpWindow::center() {

QRect screenGeometry = mScreen->geometry();
QRect windowGeometry = this->geometry();
QPlatformScreen *screen = QPlatformScreen::platformScreenForWindow(window());
QRect screenGeometry = screen->geometry();
QRect windowGeometry = geometry();

int x = (screenGeometry.width() - windowGeometry.width()) / 2;
int y = (screenGeometry.height() - windowGeometry.height()) / 2;
Expand Down
3 changes: 1 addition & 2 deletions src/plugins/platforms/freerdp/qfreerdpwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class QFreeRdpWindow : public QPlatformWindow

public:
QFreeRdpWindow(QWindow *window, QFreeRdpPlatform *platform);
~QFreeRdpWindow();
virtual ~QFreeRdpWindow();

void setBackingStore(QFreeRdpBackingStore *b);

Expand Down Expand Up @@ -75,7 +75,6 @@ class QFreeRdpWindow : public QPlatformWindow
protected:
QFreeRdpPlatform *mPlatform;
QFreeRdpBackingStore *mBackingStore;
QPlatformScreen *mScreen;
WId mWinId;
bool mVisible;
bool mSentInitialResize;
Expand Down
5 changes: 4 additions & 1 deletion src/plugins/platforms/freerdp/qfreerdpwindowmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ QFreeRdpWindowManager::QFreeRdpWindowManager(QFreeRdpPlatform *platform, int fps
connect(&mFrameTimer, SIGNAL(timeout()), this, SLOT(onGenerateFrame()));
}

QFreeRdpWindowManager::~QFreeRdpWindowManager() {
}

void QFreeRdpWindowManager::initialize() {
mFrameTimer.start((int)(1000 / mFps));
}
Expand Down Expand Up @@ -161,7 +164,7 @@ void QFreeRdpWindowManager::repaint(const QRegion &region) {
//qDebug() << "dirtyRegion=" << dirtyRegion;

foreach(QFreeRdpWindow *window, mWindows) {
if(!window->isVisible())
if(!window->isVisible() || !window->windowContent())
continue;

QRect windowRect = window->geometry();
Expand Down
2 changes: 2 additions & 0 deletions src/plugins/platforms/freerdp/qfreerdpwindowmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ class QFreeRdpWindowManager : public QObject {
public:
QFreeRdpWindowManager(QFreeRdpPlatform *platform, int fps);

virtual ~QFreeRdpWindowManager();

void initialize();

void addWindow(QFreeRdpWindow *window);
Expand Down