This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch feature/kdrive_support in repository x2goclient. commit f64df182e60a67a857c2f4a45f1051a556bdef12 Author: Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> Date: Fri Jan 18 11:38:47 2019 +0100 x2gokdrive support for X2GoClient. --- src/InteractionDialog.cpp | 2 + src/onmainwindow.cpp | 169 +++++++++++++++++++++++++++++++++++++++++----- src/onmainwindow.h | 2 +- src/sessionexplorer.cpp | 2 +- src/sessionwidget.cpp | 20 ++++-- src/sessionwidget.h | 1 + src/wapi.cpp | 1 + 7 files changed, 172 insertions(+), 25 deletions(-) diff --git a/src/InteractionDialog.cpp b/src/InteractionDialog.cpp index 6ab5d45..d0efa3f 100644 --- a/src/InteractionDialog.cpp +++ b/src/InteractionDialog.cpp @@ -29,6 +29,8 @@ #ifndef Q_OS_LINUX #if QT_VERSION < 0x050000 #include <QPlastiqueStyle> +#else +#include <QStyleFactory> #endif #endif diff --git a/src/onmainwindow.cpp b/src/onmainwindow.cpp index dbdefaa..ec3623c 100644 --- a/src/onmainwindow.cpp +++ b/src/onmainwindow.cpp @@ -18,6 +18,9 @@ #include "onmainwindow_privat.h" #include "help.h" + +#include <QStyleFactory> + void x2goSession::operator = ( const x2goSession& s ) { agentPid=s.agentPid; @@ -31,6 +34,7 @@ void x2goSession::operator = ( const x2goSession& s ) sndPort=s.sndPort; fsPort=s.fsPort; status=s.status; + sessionType=s.sessionType; } bool ONMainWindow::portable=false; @@ -3998,6 +4002,10 @@ x2goSession ONMainWindow::getSessionFromString ( const QString& string ) s.sessionType=x2goSession::ROOTLESS; if ( st=='S' ) s.sessionType=x2goSession::SHADOW; + if ( st=='K' ) + { + s.sessionType=x2goSession::KDRIVE; + } QString command=cmdinfo.mid ( 1 ); if ( command.length() >0 ) s.command=command; @@ -4071,6 +4079,7 @@ void ONMainWindow::startNewSession() QString user=getCurrentUname(); QString pack; + bool kdrive=false; bool fullscreen; int height; int width; @@ -4214,6 +4223,10 @@ void ONMainWindow::startNewSession() { command=st->setting()->value ( sid+"/command", ( QVariant ) defaultCmd ).toString(); + + kdrive=st->setting()->value ( sid+"/kdrive", + ( QVariant ) false ).toBool(); + host=st->setting()->value ( sid+"/host", ( QVariant ) @@ -4308,7 +4321,12 @@ void ONMainWindow::startNewSession() } localDisplayNumber=disp; } - if (! startXorgOnStart) + if(kdrive) + { + x2goDebug<<"KDRIVE session don't start X Server"; + slotSetWinServersReady(); + } + if (! startXorgOnStart && ! kdrive) startXOrg(); #endif delete st; @@ -4319,6 +4337,7 @@ void ONMainWindow::startNewSession() runRemoteCommand=false; } + resumingSession.server=host; if (defaultLayout.size()>0) @@ -4413,6 +4432,8 @@ void ONMainWindow::startNewSession() sessTypeStr="P "; command="PUBLISHED"; } + if(kdrive) + sessTypeStr="K "; QString dpiEnv; QString xdmcpEnv; QString xinerama_env = "X2GO_XINERAMA="; @@ -4625,7 +4646,12 @@ void ONMainWindow::resumeSession ( const x2goSession& s ) xorgMode=SAPP; xorgWidth=QString::number(width); xorgHeight=QString::number(height); - if (! startXorgOnStart) + if(s.sessionType == x2goSession::KDRIVE) + { + x2goDebug<<"KDRIVE session, don't start X-Server"; + slotSetWinServersReady(); + } + if (! startXorgOnStart && (s.sessionType != x2goSession::KDRIVE)) startXOrg(); // #endif #else /* defined (Q_OS_WIN) */ @@ -4839,6 +4865,9 @@ void ONMainWindow::selectSession ( QStringList& sessions ) type=tr ( "single application" ); if ( s.sessionType==x2goSession::SHADOW ) type=tr ( "shadow session" ); + if ( s.sessionType==x2goSession::KDRIVE ) + type=tr ( "X2GoKDrive session" ); + item= new QStandardItem ( type ); model->setItem ( row,S_TYPE,item ); @@ -5357,6 +5386,7 @@ void ONMainWindow::slotRetResumeSess ( bool result, QString host; bool sound=true; + bool kdrive=false; int sndSystem=PULSE; QString sndPort; #if !defined (Q_OS_WIN) && !defined (Q_OS_DARWIN) @@ -5395,6 +5425,8 @@ void ONMainWindow::slotRetResumeSess ( bool result, else st= new X2goSettings(config.iniFile,QSettings::IniFormat); + kdrive=st->setting()->value ( sid+"/kdrive", + ( QVariant ) false ).toBool(); sound=st->setting()->value ( sid+"/sound", ( QVariant ) true ).toBool(); QString sndsys=st->setting()->value ( @@ -5473,6 +5505,10 @@ void ONMainWindow::slotRetResumeSess ( bool result, sString.replace ( '\n','|' ); host=resumingSession.server; resumingSession=getNewSessionFromString ( sString ); + if(kdrive) + { + resumingSession.sessionType=x2goSession::KDRIVE; + } resumingSession.server=host; resumingSession.crTime=QDateTime::currentDateTime().toString ( "dd.MM.yy HH:mm:ss" ); @@ -5505,6 +5541,15 @@ void ONMainWindow::slotRetResumeSess ( bool result, } else { + + if(resumingSession.sessionType==x2goSession::KDRIVE) + { + qDebug()<<"resuming kdrive session"; + } + else + { + qDebug()<<"resuming normal session"; + } host=resumingSession.server; QStringList outputLines=output.split("\n",QString::SkipEmptyParts); foreach(QString line,outputLines) @@ -5830,6 +5875,8 @@ void ONMainWindow::slotTunnelOk(int) xmodExecuted=false; + qDebug()<<"RESUMING SESSION is KDRIVE: "<<(resumingSession.sessionType== x2goSession::KDRIVE); + nxproxy=new QProcess; proxyErrString=""; QStringList env = QProcess::systemEnvironment(); @@ -5853,11 +5900,16 @@ void ONMainWindow::slotTunnelOk(int) // On Mac OS X, we want to make sure that DISPLAY is set to a proper value, // but at the same time don't want to set the value ourselves but keep // the provided one. - QString disp=getXDisplay(); - if ( disp==QString::null ) + + QString disp="0"; + if(resumingSession.sessionType!= x2goSession::KDRIVE) { - //slotProxyerror ( QProcess::FailedToStart ); - return; + disp=getXDisplay(); + if ( disp==QString::null ) + { + //slotProxyerror ( QProcess::FailedToStart ); + return; + } } #endif // Q_OS_WIN || Q_OS_DARWIN #if defined ( Q_OS_WIN ) @@ -5911,6 +5963,7 @@ void ONMainWindow::slotTunnelOk(int) QString proxyCmd="nxproxy -S nx/nx,options="+dirpath+"/options:"+ resumingSession.display; + #ifdef Q_OS_DARWIN //run nxproxy from bundle QDir dir ( appDir ); @@ -5919,9 +5972,90 @@ void ONMainWindow::slotTunnelOk(int) proxyCmd="\""+dir.absolutePath() +"/\""+proxyCmd; #endif //Q_OS_DARWIN - x2goDebug<<"Starting NX proxy, command: " + proxyCmd; - nxproxy->start ( proxyCmd ); + if(resumingSession.sessionType==x2goSession::KDRIVE) + { + bool randr=false; + bool fs=false; + QString width; + QString height; + bool multidisp=false; + QString dispNumber="1"; + + if (!embedMode ) + { + if (!useLdap) + { + X2goSettings *st; + QString sid; + if ( !embedMode ) { + if (!(sessionExplorer->getLastSession())) { + x2goDebug << "No session selected, not searching for proxy window."; + return; + } + + sid=sessionExplorer->getLastSession()->id(); + } + else + sid="embedded"; + + if (brokerMode) + st=new X2goSettings(config.iniFile,QSettings::IniFormat); + else + st= new X2goSettings( "sessions" ); + randr=st->setting()->value ( sid+"/xinerama", + ( QVariant ) defaultXinerama ).toBool(); + fs=st->setting()->value ( sid+"/fullscreen", ( QVariant ) defaultFullscreen).toBool(); + + width=st->setting()->value ( sid+"/width", ( QVariant ) "800").toString(); + height=st->setting()->value ( sid+"/height", ( QVariant ) "600").toString(); + + + if (st->setting()->value ( sid+"/multidisp", ( QVariant ) false ).toBool()) + { + dispNumber=st->setting()->value ( sid+"/display", (QVariant ) "1").toString(); + multidisp=st->setting()->value ( sid+"/multidisp", ( QVariant ) false ).toBool(); + } + delete st; + } + } + + QStringList options; +#ifdef Q_OS_WIN + //restore real path, as we not using cygwin for x2gokdriveclient + nxroot=homeDir +"/.x2go"; + dirpath=nxroot+"/S-"+resumingSession.sessionId; +#endif + proxyCmd="x2gokdriveclient"; + options<<"--connect"<<"localhost"<<"--port"<<localGraphicPort<<"--title"<<resumingSession.sessionId<<"-S"<<"nx/nx,options="+dirpath+ + "/options:"+resumingSession.display; + if(randr) + { + options<<"--randr"; + } + if(fs) + { + options<<"--fs"; + } + else + if(multidisp) + { + options<<"--screen"<<dispNumber; + } + else + { + options<<"--width"<<width<<"--height"<<height; + } + + x2goDebug<<"Starting NX proxy, command: " + proxyCmd<<options; + nxproxy->start ( proxyCmd, options ); + } + else + { + x2goDebug<<"Starting NX proxy, command: " + proxyCmd; + nxproxy->start ( proxyCmd); + } + proxyRunning=true; if(brokerMode) { @@ -11100,6 +11234,7 @@ bool ONMainWindow::startSshd(ONMainWindow::key_types key_type) void ONMainWindow::setProxyWinTitle() { + if (embedMode) return; @@ -11362,7 +11497,7 @@ void ONMainWindow::slotFindProxyWin() setProxyWinTitle(); proxyWinTimer->stop(); - if (!embedMode) + if (!embedMode && !(resumingSession.sessionType==x2goSession::KDRIVE)) { if (!useLdap) { @@ -11430,7 +11565,7 @@ void ONMainWindow::slotFindProxyWin() #ifdef Q_OS_WIN x2goDebug<<"Maximize proxy window: "<<maximizeProxyWin; - if ( !startEmbedded ) + if ( !startEmbedded &&!(resumingSession.sessionType==x2goSession::KDRIVE)) { if ( maximizeProxyWin ) { @@ -12072,7 +12207,7 @@ void ONMainWindow::initPassDlg() cancel->setEnabled ( false ); #ifdef Q_OS_WIN QRect r; - wapiWindowRect ( ok->winId(),r ); + wapiWindowRect ( (HWND)ok->winId(),r ); #endif } if (defaultLayout.size()>1) @@ -12261,8 +12396,8 @@ void ONMainWindow::initStatusDlg() if ( embedMode ) { QRect r; - wapiWindowRect ( sbAdv->winId(),r ); - wapiWindowRect ( stInfo->verticalScrollBar ()->winId(),r ); + wapiWindowRect ( (HWND)sbAdv->winId(),r ); + wapiWindowRect ( (HWND)stInfo->verticalScrollBar ()->winId(),r ); } #endif @@ -12515,10 +12650,10 @@ void ONMainWindow::initSelectSessDlg() if ( embedMode ) { QRect r; - wapiWindowRect ( sOk->winId(),r ); - wapiWindowRect ( sessTv->verticalScrollBar ()->winId(),r ); - wapiWindowRect ( sessTv->horizontalScrollBar ()->winId(),r ); - wapiWindowRect ( sessTv->header ()->viewport()->winId(),r ); + wapiWindowRect ( (HWND)sOk->winId(),r ); + wapiWindowRect ( (HWND)sessTv->verticalScrollBar ()->winId(),r ); + wapiWindowRect ( (HWND)sessTv->horizontalScrollBar ()->winId(),r ); + wapiWindowRect ( (HWND)sessTv->header ()->viewport()->winId(),r ); } #endif diff --git a/src/onmainwindow.h b/src/onmainwindow.h index 3fa35dd..b8d04d7 100644 --- a/src/onmainwindow.h +++ b/src/onmainwindow.h @@ -150,7 +150,7 @@ struct x2goSession bool published; int colorDepth; bool fullscreen; - enum {DESKTOP,ROOTLESS,SHADOW} sessionType; + enum {DESKTOP,ROOTLESS,SHADOW, KDRIVE} sessionType; QString command; void operator = ( const x2goSession& s ); }; diff --git a/src/sessionexplorer.cpp b/src/sessionexplorer.cpp index fe884f6..ec29106 100644 --- a/src/sessionexplorer.cpp +++ b/src/sessionexplorer.cpp @@ -237,7 +237,7 @@ void SessionExplorer::slotCreateDesktopIcon ( SessionButton* bt ) "link.WorkingDirectory = \""<<workDir<<"\"\n"<< "link.Save\n"; file.close(); - system ( scrname.toAscii() ); + system ( scrname.toLatin1() ); QFile::remove ( scrname ); #endif } diff --git a/src/sessionwidget.cpp b/src/sessionwidget.cpp index e72e30e..4ead112 100644 --- a/src/sessionwidget.cpp +++ b/src/sessionwidget.cpp @@ -207,6 +207,7 @@ SessionWidget::SessionWidget ( bool newSession, QString id, ONMainWindow * mw, QHBoxLayout* cmdLay=new QHBoxLayout (); cmdLay->addWidget ( new QLabel ( tr ( "Session type:" ),this ) ); #endif + cbKdrive=new QCheckBox(tr("Run in X2GoKDrive (experimental)")); sessBox=new QComboBox ( deskSess ); cmd=new QLineEdit ( deskSess ); cmdCombo=new QComboBox ( deskSess ); @@ -228,14 +229,15 @@ SessionWidget::SessionWidget ( bool newSession, QString id, ONMainWindow * mw, sessBox->addItem ( tr ( "Custom desktop" ) ); sessBox->addItem ( tr ( "Single application" ) ); sessBox->addItem ( tr ( "Published applications" ) ); - cmdLay->addWidget ( sessBox,0,1,Qt::AlignLeft ); + cmdLay->addWidget ( cbKdrive,0,1,Qt::AlignLeft ); + cmdLay->addWidget ( sessBox,1,1,Qt::AlignLeft ); leCmdIp=new QLabel ( tr ( "Command:" ),deskSess ); pbAdvanced=new QPushButton ( tr ( "Advanced options..." ),deskSess ); - cmdLay->addWidget ( leCmdIp,0,2 ); + cmdLay->addWidget ( leCmdIp,1,2 ); cmdLay->setColumnStretch(6,1); - cmdLay->addWidget ( cmd ,0,3); - cmdLay->addWidget ( cmdCombo,0,4 ); - cmdLay->addWidget ( pbAdvanced ,0,5); + cmdLay->addWidget ( cmd ,1,3); + cmdLay->addWidget ( cmdCombo,1,4 ); + cmdLay->addWidget ( pbAdvanced ,1,5); cmdCombo->setSizePolicy ( QSizePolicy::Expanding, QSizePolicy::Preferred ); cmdCombo->hide(); @@ -254,7 +256,7 @@ SessionWidget::SessionWidget ( bool newSession, QString id, ONMainWindow * mw, sessLay->addWidget ( deskSess ); #ifdef Q_OS_LINUX cbDirectRDP=new QCheckBox(tr("Direct RDP connection"), deskSess); - cmdLay->addWidget(cbDirectRDP,1,0,1,6); + cmdLay->addWidget(cbDirectRDP,2,0,1,6); cbDirectRDP->hide(); connect(cbDirectRDP,SIGNAL(clicked()), this, SLOT(slot_rdpDirectClicked())); #endif @@ -799,6 +801,9 @@ void SessionWidget::readConfig() sessName->selectAll(); sessName->setFocus(); } + + cbKdrive->setChecked(st.setting()->value (sessionId+"/kdrive", false).toBool() ); + #ifdef Q_OS_LINUX slot_rdpDirectClicked(); #endif @@ -811,6 +816,7 @@ void SessionWidget::setDefaults() sessBox->setCurrentIndex ( KDE ); cmdCombo->clear(); cmdCombo->addItem ( "" ); + cbKdrive->setChecked(false); cmdCombo->addItems ( mainWindow->transApplicationsNames() ); cbAutoLogin->setChecked(false); cbKrbLogin->setChecked(false); @@ -883,6 +889,8 @@ void SessionWidget::saveSettings() st.setting()->setValue(sessionId+"/directrdp",( QVariant ) cbDirectRDP->isChecked()); st.setting()->setValue(sessionId+"/directxdmcp",( QVariant ) cbDirectRDP->isChecked()); #endif + + st.setting()->setValue(sessionId+"/kdrive",( QVariant ) cbKdrive->isChecked()); QString command; bool rootless=false; bool published=false; diff --git a/src/sessionwidget.h b/src/sessionwidget.h index bbc940e..294885a 100644 --- a/src/sessionwidget.h +++ b/src/sessionwidget.h @@ -103,6 +103,7 @@ private: QCheckBox* cbProxySamePass; QCheckBox* cbProxyAutologin; QCheckBox* cbProxyKrbLogin; + QCheckBox* cbKdrive; QLineEdit* proxyKey; QPushButton* pbOpenProxyKey; QLabel* proxyKeyLabel; diff --git a/src/wapi.cpp b/src/wapi.cpp index b5d485b..182ffc2 100644 --- a/src/wapi.cpp +++ b/src/wapi.cpp @@ -24,6 +24,7 @@ #ifdef Q_OS_WIN #include <winsock2.h> #include <windows.h> +#include <winerror.h> #include <sddl.h> #include "wapi.h" #include "x2gologdebug.h" -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goclient.git