This is an automated email from the git hooks/post-receive script. x2go pushed a change to branch master in repository x2goclient. from 34c121f for x2gokdrive sessions, when auto kbd layout is chosen, x2goclient will try to set the same kbd layout on server as on the client. new ba65703 add "noresize" setting, which makes the proxy window not resizable for user. The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Summary of changes: debian/changelog | 2 ++ src/onmainwindow.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++++----- src/onmainwindow.h | 5 ++-- src/settingswidget.cpp | 9 ++++++ src/settingswidget.h | 1 + src/wapi.cpp | 14 +++++++++ src/wapi.h | 2 ++ 7 files changed, 103 insertions(+), 9 deletions(-) -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goclient.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository x2goclient. commit ba65703ca715eb6e920069f75b8d8382bb3d2d28 Author: Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> Date: Mon Aug 22 11:56:38 2022 -0500 add "noresize" setting, which makes the proxy window not resizable for user. --- debian/changelog | 2 ++ src/onmainwindow.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++++----- src/onmainwindow.h | 5 ++-- src/settingswidget.cpp | 9 ++++++ src/settingswidget.h | 1 + src/wapi.cpp | 14 +++++++++ src/wapi.h | 2 ++ 7 files changed, 103 insertions(+), 9 deletions(-) diff --git a/debian/changelog b/debian/changelog index 1d9ba63..c794401 100644 --- a/debian/changelog +++ b/debian/changelog @@ -51,6 +51,8 @@ x2goclient (4.1.2.3-0x2go1) UNRELEASED; urgency=medium - for x2gokdrive sessions, when auto kbd layout is chosen, x2goclient will try to set the same kbd layout on server as on the client. + - add "noresize" setting, which makes the proxy window not resizable + for user. [ Ryan Schmidt ] * New upstream version (4.1.2.3): diff --git a/src/onmainwindow.cpp b/src/onmainwindow.cpp index 9552df7..e63dcc5 100644 --- a/src/onmainwindow.cpp +++ b/src/onmainwindow.cpp @@ -4542,11 +4542,11 @@ void ONMainWindow::startNewSession() { runRemoteCommand=false; } + proxyWinWidth=width; + proxyWinHeight=height; #ifdef Q_OS_WIN x2goDebug<<"Fullscreen: "<<fullscreen; maximizeProxyWin=false; - proxyWinWidth=width; - proxyWinHeight=height; xorgMode=WIN; if (fullscreen) xorgMode=FS; @@ -4892,10 +4892,11 @@ void ONMainWindow::resumeSession ( const x2goSession& s ) layout=cbLayout->currentText(); QString geometry; -#ifdef Q_OS_WIN - maximizeProxyWin=false; proxyWinWidth=width; proxyWinHeight=height; + +#ifdef Q_OS_WIN + maximizeProxyWin=false; // #ifdef CFGCLIENT xorgMode=WIN; if (fullscreen) @@ -6339,7 +6340,7 @@ void ONMainWindow::slotTunnelOk(int) bool multidisp=false; QString dispNumber="1"; QString clipboard="both"; - + bool noresize=false; if (!embedMode ) { if (!useLdap) @@ -6368,8 +6369,7 @@ void ONMainWindow::slotTunnelOk(int) width=st->setting()->value ( sid+"/width", ( QVariant ) "800").toString(); height=st->setting()->value ( sid+"/height", ( QVariant ) "600").toString(); clipboard=st->setting()->value ( sid+"/clipboard", ( QVariant ) "both").toString(); - - + noresize=st->setting()->value ( sid+"/noresize", ( QVariant ) false).toBool(); if (st->setting()->value ( sid+"/multidisp", ( QVariant ) false ).toBool()) @@ -6394,6 +6394,8 @@ void ONMainWindow::slotTunnelOk(int) } options<<"--connect"<<"localhost"<<"--port"<<localGraphicPort<<"--title"<<resumingSession.sessionId<<"-S"<<"nx/nx,options="+dirpath+ "/options:"+resumingSession.display<<"--selection"<<clipboard; + if(noresize) + options<<"--noresize"; if(resumingSession.sessionType==x2goSession::ROOTLESSKDRIVE) { options << "--rootless"; @@ -11970,6 +11972,62 @@ void ONMainWindow::slotXineramaConfigured() xineramaTimer->start(500); } +void ONMainWindow::setProxyWinNotResizable() +{ +#ifdef Q_OS_WIN + switch(wapiIsWinResizeable((HWND)proxyWinId)) + { + case -1: + x2goDebug<<"Proxy window is closed, stop checking properties"; + return; + case 1: + wapiSetWinNotResizable((HWND)proxyWinId); + default: + QTimer::singleShot(1000, this, SLOT(setProxyWinNotResizable())); + } +#endif +#ifdef Q_OS_LINUX + XWindowAttributes wattr; + if(! XGetWindowAttributes(QX11Info::display(), proxyWinId, &wattr)) + { + x2goDebug<<"Proxy window is closed, stop checking properties"; + return; + } + if(wattr.map_state != IsViewable) + { + QTimer::singleShot(1000, this, SLOT(setProxyWinNotResizable())); + return; + } + + XSizeHints rhints; + long rflags; + if(!XGetWMNormalHints(QX11Info::display(), proxyWinId, &rhints, &rflags)) + { + x2goDebug<<"Failed to get hints for proxy window, stop checking properties"; + return; + } + if(rhints.min_width==proxyWinWidth && rhints.max_width==proxyWinWidth && rhints.min_height==proxyWinHeight && rhints.max_height==proxyWinHeight) + { + QTimer::singleShot(1000, this, SLOT(setProxyWinNotResizable())); + return; + } + + XSizeHints* hints; + XSync(QX11Info::display(),false); + hints=XAllocSizeHints(); + hints->flags= PMinSize|PMaxSize; + hints->base_width=hints->max_width=hints->min_width=proxyWinWidth; + hints->base_height=hints->max_height=hints->min_height=proxyWinHeight; +// x2goDebug<<"Setting X11 hints on proxy window"; + XSetWMNormalHints(QX11Info::display(), proxyWinId, hints); + XSync(QX11Info::display(),false); + XFlush(QX11Info::display()); + XFree(hints); + QTimer::singleShot(1000, this, SLOT(setProxyWinNotResizable())); +#endif +} + + void ONMainWindow::slotFindProxyWin() { #ifndef Q_OS_DARWIN @@ -12023,6 +12081,13 @@ void ONMainWindow::slotFindProxyWin() return; } #endif + if (st->setting()->value ( sid+"/noresize", + ( QVariant ) false ).toBool()) + { + x2goDebug<<"making proxy window not resizable"; + setProxyWinNotResizable(); + } + delete st; } if (xinerama) diff --git a/src/onmainwindow.h b/src/onmainwindow.h index e88b689..dca09a7 100644 --- a/src/onmainwindow.h +++ b/src/onmainwindow.h @@ -838,6 +838,8 @@ private: QAction *act_new; QAction *act_sessicon; QProcess *nxproxy; + int proxyWinWidth; + int proxyWinHeight; #ifndef Q_OS_WIN QProcess *sshd; #else @@ -856,8 +858,6 @@ private: bool cyEntry; bool maximizeProxyWin; - int proxyWinWidth; - int proxyWinHeight; QTimer* xorgLogTimer; QString xorgLogFile; QMutex xorgLogMutex; @@ -1080,6 +1080,7 @@ private slots: void slotBrokerLogoutButton (); void slotReadApplications(bool result, QString output, int pid ); void slotResLoadRequestFinished( QNetworkReply* reply ); + void setProxyWinNotResizable(); public slots: void slotConfig(); diff --git a/src/settingswidget.cpp b/src/settingswidget.cpp index 13e20ba..5cca6e6 100644 --- a/src/settingswidget.cpp +++ b/src/settingswidget.cpp @@ -66,6 +66,7 @@ SettingsWidget::SettingsWidget ( QString id, ONMainWindow * mw, custom=new QRadioButton ( tr ( "Window" ),dgb ); #endif display=new QRadioButton ( tr ( "Use whole display" ),dgb ); + cbNoresize=new QCheckBox ( tr ( "Not resizable" ),dgb ); maxRes=new QRadioButton ( tr ( "Maximum available" ),dgb ); radio->addButton ( fs ); radio->addButton ( custom ); @@ -129,6 +130,7 @@ SettingsWidget::SettingsWidget ( QString id, ONMainWindow * mw, dbLay->addLayout ( dgLay ); dbLay->addLayout ( dwLay ); dbLay->addLayout(dispLay); + dbLay->addWidget(cbNoresize); QFrame* dhl=new QFrame ( dgb ); hLine1=dhl; dhl->setFrameStyle ( QFrame::HLine | QFrame::Sunken ); @@ -391,6 +393,10 @@ void SettingsWidget::readConfig() st.setting()->value ( sessionId+"/fullscreen", ( QVariant ) mainWindow->getDefaultFullscreen() ).toBool() ); + cbNoresize->setChecked ( + st.setting()->value ( sessionId+"/noresize", + ( QVariant ) false ).toBool() ); + custom->setChecked ( ! st.setting()->value ( sessionId+"/fullscreen", ( QVariant ) mainWindow->getDefaultFullscreen() @@ -523,6 +529,7 @@ void SettingsWidget::setDefaults() custom->setChecked ( true ); width->setValue ( 800 ); height->setValue ( 600 ); + cbNoresize->setChecked( false ); cbSetDPI->setChecked ( mainWindow->getDefaultSetDPI() ); DPI->setValue ( mainWindow->getDefaultDPI() ); @@ -548,6 +555,8 @@ void SettingsWidget::saveSettings() st.setting()->setValue ( sessionId+"/fullscreen", ( QVariant ) fs->isChecked() ); + st.setting()->setValue ( sessionId+"/noresize", + ( QVariant ) cbNoresize->isChecked() ); st.setting()->setValue ( sessionId+"/multidisp", ( QVariant ) display->isChecked() ); st.setting()->setValue ( sessionId+"/display", diff --git a/src/settingswidget.h b/src/settingswidget.h index 76f445f..cbf2779 100644 --- a/src/settingswidget.h +++ b/src/settingswidget.h @@ -71,6 +71,7 @@ private: QLineEdit* leVariant; QCheckBox* cbSetDPI; QCheckBox* cbXinerama; + QCheckBox* cbNoresize; QSpinBox* DPI; QLabel* widthLabel; QLabel* heightLabel; diff --git a/src/wapi.cpp b/src/wapi.cpp index 15bf2e5..12732c2 100644 --- a/src/wapi.cpp +++ b/src/wapi.cpp @@ -615,4 +615,18 @@ QString wapiGetKeyboardLayout() return QString::null; } +void wapiSetWinNotResizable(HWND wnd) +{ + SetWindowLong ( wnd, GWL_STYLE, GetWindowLong(wnd, GWL_STYLE)&~WS_SIZEBOX&~WS_MAXIMIZEBOX); +} + +short wapiIsWinResizeable(HWND wnd) +{ + LONG flags=GetWindowLong(wnd, GWL_STYLE); + if(!flags) + return -1; + if((flags & WS_SIZEBOX) || (flags & WS_MAXIMIZEBOX)) + return 1; + return 0; +} #endif diff --git a/src/wapi.h b/src/wapi.h index 72cd993..b186d93 100644 --- a/src/wapi.h +++ b/src/wapi.h @@ -77,6 +77,8 @@ QString wapiGetDriveByLabel(const QString& label); QString wapiGetUserName(); void wapiSetFilePermissions(const QString& path); QString wapiGetKeyboardLayout(); +void wapiSetWinNotResizable(HWND wnd); +short wapiIsWinResizeable(HWND wnd); #endif #endif -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goclient.git