1 /**************************************************************************
2 *   Copyright (C) 2005-2020 by Oleksandr Shneyder                         *
3 *                              <o.shneyder@phoca-gmbh.de>                 *
4 *                                                                         *
5 *   This program is free software; you can redistribute it and/or modify  *
6 *   it under the terms of the GNU General Public License as published by  *
7 *   the Free Software Foundation; either version 2 of the License, or     *
8 *   (at your option) any later version.                                   *
9 *   This program is distributed in the hope that it will be useful,       *
10 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12 *   GNU General Public License for more details.                          *
13 *                                                                         *
14 *   You should have received a copy of the GNU General Public License     *
15 *   along with this program.  If not, see <https://www.gnu.org/licenses/>. *
16 ***************************************************************************/
17 
18 #include "settingswidget.h"
19 #include "onmainwindow.h"
20 #include <QBoxLayout>
21 #include <QRadioButton>
22 #include <QLineEdit>
23 #include <QCheckBox>
24 #include <QSpinBox>
25 #include <QGroupBox>
26 #include <QButtonGroup>
27 #include <QLabel>
28 #include "x2gosettings.h"
29 #include <QDir>
30 #include <QApplication>
31 #include <QDesktopWidget>
32 #include <QTimer>
33 #include <QSplashScreen>
34 #include "x2gologdebug.h"
35 #include <QGridLayout>
36 
SettingsWidget(QString id,ONMainWindow * mw,QWidget * parent,Qt::WindowFlags f)37 SettingsWidget::SettingsWidget ( QString id, ONMainWindow * mw,
38                                  QWidget * parent, Qt::WindowFlags f )
39     : ConfigWidget ( id,mw,parent,f )
40 {
41     multiDisp=(QApplication::desktop()->screenCount()>1);
42 #ifdef Q_WS_HILDON
43     QTabWidget* tabSettings=new QTabWidget ( this );
44     QFrame* dgb=new QFrame();
45     QFrame* kgb=new QFrame();
46     tabSettings->addTab ( dgb, tr ( "&Display" ) );
47     tabSettings->addTab ( kgb,tr ( "&Keyboard" ) );
48 #else
49     QGroupBox *dgb=new QGroupBox ( tr ( "&Display" ),this );
50     clipGr=new QGroupBox ( tr ( "&Clipboard mode" ),this );
51     kgb=new QGroupBox ( tr ( "&Keyboard" ),this );
52 #endif
53     QVBoxLayout *dbLay = new QVBoxLayout ( dgb );
54     QVBoxLayout *cbLay=new QVBoxLayout ( clipGr );
55     QHBoxLayout* sLay=new QHBoxLayout ( );
56     QVBoxLayout* sLay_sys=new QVBoxLayout ( );
57     QVBoxLayout* sLay_opt=new QVBoxLayout ( );
58     sLay->addLayout ( sLay_sys );
59     sLay->addLayout ( sLay_opt );
60     QVBoxLayout* setLay=new QVBoxLayout ( this );
61     QButtonGroup* radio = new QButtonGroup ( dgb );
62     fs=new QRadioButton ( tr ( "Fullscreen" ),dgb );
63 #ifndef Q_WS_HILDON
64     custom=new QRadioButton ( tr ( "Custom" ),dgb );
65 #else
66     custom=new QRadioButton ( tr ( "Window" ),dgb );
67 #endif
68     display=new QRadioButton ( tr ( "Use whole display" ),dgb );
69     maxRes=new QRadioButton ( tr ( "Maximum available" ),dgb );
70     radio->addButton ( fs );
71     radio->addButton ( custom );
72     radio->setExclusive ( true );
73     radio->addButton(display);
74     radio->addButton(maxRes);
75     width=new QSpinBox ( dgb );
76     height=new QSpinBox ( dgb );
77     cbSetDPI=new QCheckBox ( tr ( "Set display DPI" ),dgb );
78 
79     DPI=new QSpinBox ( dgb );
80     DPI->setRange ( 1,1000 );
81 
82     cbXinerama= new QCheckBox(tr( "Xinerama extension (support for two or more physical displays)"),dgb);
83 
84     QHBoxLayout *dgLay =new QHBoxLayout();
85     QHBoxLayout *dwLay =new QHBoxLayout();
86     QHBoxLayout *ddLay =new QHBoxLayout();
87     QHBoxLayout *dispLay= new QHBoxLayout();
88     ddLay->addWidget ( cbSetDPI );
89     ddLay->addWidget ( DPI );
90     ddLay->addStretch();
91     ddLay->setSpacing ( 15 );
92 
93     dgLay->addWidget ( fs );
94     dgLay->addStretch();
95 
96     dwLay->addWidget ( custom );
97     dwLay->addSpacing ( 15 );
98     dwLay->addWidget ( widthLabel=new QLabel ( tr ( "Width:" ),dgb ) );
99     dwLay->addWidget ( width );
100     width->setRange ( 0,10000 );
101     dwLay->addWidget ( heightLabel=new QLabel ( tr ( "Height:" ),dgb ) );
102     dwLay->addWidget ( height );
103     height->setRange ( 0,10000 );
104     dwLay->addStretch();
105 
106     dispLay->addWidget(display);
107     dispLay->addWidget(maxRes);
108     dispLay->addSpacing(15);
109     dispLay->addWidget(lDisplay=new QLabel(tr("&Display:"),dgb));
110     dispLay->addWidget(displayNumber=new QSpinBox(dgb));
111     pbIdentDisp=new QPushButton(tr("&Identify all displays"), dgb);
112     dispLay->addWidget(pbIdentDisp);
113     dispLay->addStretch();
114     lDisplay->setBuddy(displayNumber);
115 
116     displayNumber->setMinimum(1);
117     displayNumber->setMaximum(QApplication::desktop()->screenCount());
118     if ((!multiDisp) || (mainWindow->debugging))
119     {
120         displayNumber->hide();
121         lDisplay->hide();
122         pbIdentDisp->hide();
123         display->hide();
124     }
125     lDisplay->setEnabled ( false );
126     displayNumber->setEnabled ( false );
127 
128 
129     dbLay->addLayout ( dgLay );
130     dbLay->addLayout ( dwLay );
131     dbLay->addLayout(dispLay);
132     QFrame* dhl=new QFrame ( dgb );
133     hLine1=dhl;
134     dhl->setFrameStyle ( QFrame::HLine | QFrame::Sunken );
135     dbLay->addWidget ( dhl );
136     dbLay->addLayout ( ddLay );
137     dhl=new QFrame ( dgb );
138     hLine2=dhl;
139     dhl->setFrameStyle ( QFrame::HLine | QFrame::Sunken );
140     dbLay->addWidget ( dhl );
141     dbLay->addWidget ( cbXinerama );
142 
143 #ifdef Q_WS_HILDON
144     width->hide();
145     height->hide();
146     widthLabel->hide();
147     heightLabel->hide();
148 #endif
149 
150 #ifdef Q_OS_DARWIN
151     kgb->hide();
152 #endif
153     rbClipBoth=new QRadioButton(tr("Bidirectional copy and paste"), clipGr);
154     rbClipClient=new QRadioButton(tr("Copy and paste from client to server"), clipGr);
155     rbClipServer=new QRadioButton(tr("Copy and paste from server to client"), clipGr);
156     rbClipNone=new QRadioButton(tr("Disable clipboard completely"), clipGr);
157     cbLay->addWidget(rbClipBoth);
158     cbLay->addWidget(rbClipClient);
159     cbLay->addWidget(rbClipServer);
160     cbLay->addWidget(rbClipNone);
161     QButtonGroup* clipRadioGroup=new QButtonGroup(clipGr);
162     clipRadioGroup->addButton(rbClipBoth);
163     clipRadioGroup->addButton(rbClipClient);
164     clipRadioGroup->addButton(rbClipServer);
165     clipRadioGroup->addButton(rbClipNone);
166 
167 
168     rbKbdAuto=new QRadioButton(tr("Auto-detect keyboard settings"),kgb);
169     rbKbdNoSet=new QRadioButton(tr("Do not configure keyboard"),kgb);
170     rbKbdSet=new QRadioButton(tr("Configure keyboard"),kgb);
171     QButtonGroup* kbRadio=new QButtonGroup(kgb);
172     kbRadio->addButton(rbKbdAuto);
173     kbRadio->addButton(rbKbdNoSet);
174     kbRadio->addButton(rbKbdSet);
175 
176     gbKbdString=new QGroupBox(kgb);
177     gbKbdString->setFlat(true);
178 
179 
180     QHBoxLayout* kbstrlay=new QHBoxLayout(gbKbdString);
181     kbstrlay->addWidget(new QLabel(tr("Model: "), gbKbdString));
182     leModel=new QLineEdit(gbKbdString);
183     kbstrlay->addWidget(leModel);
184     kbstrlay->addWidget(new QLabel(tr("Layout: "), gbKbdString));
185     leLayout=new QLineEdit(gbKbdString);
186     kbstrlay->addWidget(leLayout);
187     kbstrlay->addWidget(new QLabel(tr("Variant: "), gbKbdString));
188     leVariant=new QLineEdit(gbKbdString);
189     kbstrlay->addWidget(leVariant);
190 
191     QVBoxLayout *kbLay = new QVBoxLayout ( kgb );
192 
193     kbLay->addWidget ( rbKbdAuto);
194     kbLay->addWidget ( rbKbdNoSet);
195     kbLay->addWidget ( rbKbdSet);
196     kbLay->addWidget( gbKbdString );
197 
198 #ifndef Q_WS_HILDON
199     setLay->addWidget ( dgb );
200     setLay->addWidget ( clipGr );
201     setLay->addWidget ( kgb );
202 #ifdef Q_OS_UNIX
203 #ifdef CFGCLIENT
204     rdpBox=new QGroupBox ( tr ( "RDP client" ),this );
205     setLay->addWidget ( rdpBox );
206     rRdesktop=new QRadioButton ("rdesktop",rdpBox );
207     rRdesktop->setChecked(true);
208     rXfreeRDPOld=new QRadioButton ( tr( "FreeRDP/X11 (pre-2.x style options)" ),rdpBox);
209     rXfreeRDPNew=new QRadioButton ( tr( "FreeRDP/X11 (2.x style options)" ),rdpBox);
210     QButtonGroup* rClient=new QButtonGroup(rdpBox);
211     rClient->addButton ( rRdesktop );
212     rClient->addButton ( rXfreeRDPOld );
213     rClient->addButton ( rXfreeRDPNew );
214     rClient->setExclusive ( true );
215     QGridLayout *rdpLay=new QGridLayout(rdpBox);
216     rdpLay->addWidget(rRdesktop,0,0);
217     rdpLay->addWidget(rXfreeRDPOld,1,0);
218     rdpLay->addWidget(rXfreeRDPNew,2,0);
219     rdpLay->addWidget(new QLabel(tr("Additional parameters:")),3,0);
220     rdpLay->addWidget(new QLabel(tr("Command line:")),4,0);
221     cmdLine=new QLineEdit(rdpBox);
222     cmdLine->setReadOnly(true);
223     params=new QLineEdit(rdpBox);
224     rdpLay->addWidget(cmdLine,4,0,1,2);
225     rdpLay->addWidget(params,3,1);
226     connect (rClient, SIGNAL(buttonClicked(int)), this, SLOT(updateCmdLine()));
227     connect (radio, SIGNAL(buttonClicked(int)), this, SLOT(updateCmdLine()));
228     connect (params, SIGNAL(textChanged(QString)), this, SLOT(updateCmdLine()));
229     connect (width, SIGNAL(valueChanged(int)), this, SLOT(updateCmdLine()));
230     connect (height, SIGNAL(valueChanged(int)), this, SLOT(updateCmdLine()));
231 
232 
233     xdmcpBox=new QGroupBox ( tr ( "XDMCP client" ),this );
234     setLay->addWidget ( xdmcpBox );
235     rXnest=new QRadioButton ("Xnest",xdmcpBox );
236     rXnest->setChecked(true);
237     rXephyr=new QRadioButton ( "Xephyr",xdmcpBox);
238     rX2goagent=new QRadioButton ( "x2goagent ",xdmcpBox);
239     QButtonGroup* rXdmcpClient=new QButtonGroup(xdmcpBox);
240     rXdmcpClient->addButton ( rXnest );
241     rXdmcpClient->addButton ( rXephyr );
242     rXdmcpClient->addButton ( rX2goagent );
243     rXdmcpClient->setExclusive ( true );
244     QGridLayout *xdmcpLay=new QGridLayout(xdmcpBox);
245     xdmcpLay->addWidget(rXnest,0,0);
246     xdmcpLay->addWidget(rXephyr,1,0);
247     xdmcpLay->addWidget(rX2goagent,2,0);
248     xdmcpLay->addWidget(new QLabel(tr("Additional parameters:")),3,0);
249     xdmcpLay->addWidget(new QLabel(tr("Command line:")),4,0);
250     xdmcpCmdLine=new QLineEdit(xdmcpBox);
251     xdmcpCmdLine->setReadOnly(true);
252     xdmcpParams=new QLineEdit(xdmcpBox);
253     xdmcpLay->addWidget(xdmcpCmdLine,4,0,1,2);
254     xdmcpLay->addWidget(xdmcpParams,3,1);
255     connect (rXdmcpClient, SIGNAL(buttonClicked(int)), this, SLOT(updateCmdLine()));
256     connect (xdmcpParams, SIGNAL(textChanged(QString)), this, SLOT(updateCmdLine()));
257 #endif //CFGCLIENT
258 #endif //Q_OS_UNIX
259 #else
260     setLay->addWidget ( tabSettings );
261 // 	cbClientPrint->hide();
262 #endif //Q_WS_HILDON
263     setLay->addStretch();
264 
265     connect ( custom,SIGNAL ( toggled ( bool ) ),width,
266               SLOT ( setEnabled ( bool ) ) );
267     connect ( custom,SIGNAL ( toggled ( bool ) ),height,
268               SLOT ( setEnabled ( bool ) ) );
269     connect ( custom,SIGNAL ( toggled ( bool ) ),widthLabel,
270               SLOT ( setEnabled ( bool ) ) );
271     connect ( custom,SIGNAL ( toggled ( bool ) ),heightLabel,
272               SLOT ( setEnabled ( bool ) ) );
273 
274     connect ( display,SIGNAL ( toggled ( bool ) ),displayNumber,
275               SLOT ( setEnabled ( bool ) ) );
276     connect ( display,SIGNAL ( toggled ( bool ) ),lDisplay,
277               SLOT ( setEnabled ( bool ) ) );
278     connect(pbIdentDisp, SIGNAL(clicked()), this, SLOT (slot_identDisplays()));
279 
280 
281 
282     connect ( kbRadio, SIGNAL (buttonClicked(QAbstractButton*)), this, SLOT(slot_kbdClicked()));
283     connect ( cbSetDPI,SIGNAL ( toggled ( bool ) ),DPI,
284               SLOT ( setEnabled ( bool ) ) );
285 
286     setDefaults();
287 
288     custom->setChecked ( true );
289     readConfig();
290 }
291 
292 
~SettingsWidget()293 SettingsWidget::~SettingsWidget()
294 {
295 }
296 
297 
slot_kbdClicked()298 void SettingsWidget::slot_kbdClicked()
299 {
300     gbKbdString->setVisible(rbKbdSet->isChecked());
301 }
302 
303 
304 #ifdef Q_OS_UNIX
setDirectRdp(bool direct,bool isXDMCP)305 void SettingsWidget::setDirectRdp(bool direct, bool isXDMCP)
306 {
307     clipGr->setVisible(!direct);
308     kgb->setVisible(!direct);
309     cbSetDPI->setVisible(!direct);
310     cbXinerama->setVisible(!direct);
311     maxRes->setVisible(direct);
312     DPI->setVisible(!direct);
313 
314     bool whole_display_enable = ((!direct) && ((multiDisp) || (mainWindow->debugging)));
315     display->setVisible(whole_display_enable);
316     lDisplay->setVisible(whole_display_enable);
317     displayNumber->setVisible(whole_display_enable);
318     pbIdentDisp->setVisible(whole_display_enable);
319 
320     hLine1->setVisible(!direct);
321     hLine2->setVisible(!direct);
322     rdpBox->setVisible(direct && !isXDMCP);
323     xdmcpBox->setVisible(direct && isXDMCP);
324     if (direct)
325     {
326         if (display->isChecked())
327         {
328             display->setChecked(false);
329             custom->setChecked(true);
330         }
331     }
332     else
333     {
334         if (maxRes->isChecked())
335         {
336             maxRes->setChecked(false);
337             custom->setChecked(true);
338         }
339     }
340     updateCmdLine();
341 }
342 #endif
343 
slot_identDisplays()344 void SettingsWidget::slot_identDisplays()
345 {
346     pbIdentDisp->setEnabled(false);
347     identWins.clear();
348     for (int i=0; i<QApplication::desktop()->screenCount(); ++i)
349     {
350         QMainWindow *mw=new QMainWindow(
351             this, Qt::FramelessWindowHint|Qt::X11BypassWindowManagerHint|Qt::WindowStaysOnTopHint);
352         mw->setFixedSize(150,200);
353         QLabel* fr=new QLabel(QString::number(i+1), mw);
354         QFont f=fr->font();
355         f.setBold(true);
356         f.setPointSize(56);
357         fr->setFont(f);
358         fr->setAlignment(Qt::AlignCenter);
359         mw->setCentralWidget(fr);
360         fr->setFrameStyle(QFrame::Box);
361         QRect geom=QApplication::desktop()->screenGeometry(i);
362         int x_pos=geom.width()/2-75;
363         int y_pos=geom.height()/2-100;
364         x_pos=565;
365         identWins<<mw;
366         mw ->move(geom.x()+x_pos, geom.y()+y_pos);
367         mw->show();
368         mw->raise();
369     }
370     QTimer::singleShot(1200,this, SLOT(slot_hideIdentWins()));
371 }
372 
slot_hideIdentWins()373 void SettingsWidget::slot_hideIdentWins()
374 {
375     QMainWindow* mw;
376     foreach(mw,identWins)
377     {
378         mw->close();
379     }
380     pbIdentDisp->setEnabled(true);
381 }
382 
383 
384 
readConfig()385 void SettingsWidget::readConfig()
386 {
387 
388     X2goSettings st ( "sessions" );
389 
390     fs->setChecked (
391         st.setting()->value ( sessionId+"/fullscreen",
392                               ( QVariant ) mainWindow->getDefaultFullscreen() ).toBool() );
393 
394     custom->setChecked ( ! st.setting()->value (
395                              sessionId+"/fullscreen",
396                              ( QVariant ) mainWindow->getDefaultFullscreen()
397                          ).toBool() );
398 
399 
400     width->setValue (
401         st.setting()->value ( sessionId+"/width",
402                               ( QVariant ) mainWindow->getDefaultWidth() ).toInt() );
403     height->setValue (
404         st.setting()->value ( sessionId+"/height",
405                               ( QVariant ) mainWindow->getDefaultHeight() ).toInt() );
406 
407     if ((multiDisp) || (mainWindow->debugging)) {
408         bool md=st.setting()->value ( sessionId+"/multidisp",
409                                       ( QVariant ) false).toBool();
410         if (md)
411             display->setChecked(true);
412         int disp=st.setting()->value ( sessionId+"/display",
413                                        ( QVariant ) 1).toUInt();
414         if (disp<= displayNumber->maximum())
415             displayNumber->setValue(disp);
416         else
417             displayNumber->setValue(1);
418     }
419 
420 #ifdef Q_OS_UNIX
421 #ifdef CFGCLIENT
422     maxRes->setChecked(st.setting()->value ( sessionId+"/maxdim", false).toBool());
423     QString client=st.setting()->value ( sessionId+"/rdpclient","rdesktop").toString();
424     if(client=="rdesktop")
425         rRdesktop->setChecked(true);
426     else if(client=="xfreerdpnew")
427         rXfreeRDPNew->setChecked(true);
428     else
429         rXfreeRDPOld->setChecked(true);
430     params->setText(st.setting()->value ( sessionId+"/directrdpsettings","").toString());
431 
432     client=st.setting()->value ( sessionId+"/xdmcpclient","Xnest").toString();
433     if(client=="Xnest")
434         rXnest->setChecked(true);
435     else if(client=="x2goagent")
436         rX2goagent->setChecked(true);
437     else
438         rXephyr->setChecked(true);
439     xdmcpParams->setText(st.setting()->value ( sessionId+"/directxdmcpsettings","").toString());
440 #endif
441 #endif
442 
443 
444     cbSetDPI->setChecked (
445         st.setting()->value ( sessionId+"/setdpi",
446                               ( QVariant ) mainWindow->getDefaultSetDPI() ).toBool() );
447 
448     cbXinerama->setChecked (
449         st.setting()->value ( sessionId+"/xinerama",
450                               ( QVariant ) false).toBool());
451 
452 
453     DPI->setEnabled ( cbSetDPI->isChecked() );
454     DPI->setValue (
455         st.setting()->value ( sessionId+"/dpi",
456                               ( QVariant ) mainWindow->getDefaultDPI() ).toUInt() );
457 
458     QString clipboard=st.setting()->value ( sessionId+"/clipboard",
459                                             ( QVariant ) mainWindow->getDefaultClipboardMode()
460                                           ).toString();
461     if(clipboard =="both")
462     {
463         rbClipBoth->setChecked(true);
464     }
465     if(clipboard =="client")
466     {
467         rbClipClient->setChecked(true);
468     }
469     if(clipboard =="server")
470     {
471         rbClipServer->setChecked(true);
472     }
473     if(clipboard =="none")
474     {
475         rbClipNone->setChecked(true);
476     }
477 
478     QString ktype=st.setting()->value ( sessionId+"/type",
479                                         ( QVariant ) mainWindow->getDefaultKbdType()
480                                       ).toString();
481     if(ktype=="auto")
482     {
483         rbKbdAuto->setChecked(true);
484     }
485     else
486     {
487         rbKbdSet->setChecked(true);
488         ktype.replace("\\","");
489         QStringList str=ktype.split("/");
490         if(str.size()>0)
491         {
492             leModel->setText(str[0]);
493         }
494         if(str.size()>1)
495         {
496             str[1].replace(")","");
497             str=str[1].split("(");
498             if(str.size()>0)
499             {
500                 leLayout->setText(str[0]);
501             }
502             if(str.size()>1)
503             {
504                 leVariant->setText(str[1]);
505             }
506         }
507     }
508 
509     rbKbdNoSet->setChecked ( !st.setting()->value (
510                                  sessionId+"/usekbd",
511                                  ( QVariant ) mainWindow->getDefaultSetKbd()
512                              ).toBool() );
513     slot_kbdClicked();
514 
515 }
516 
setDefaults()517 void SettingsWidget::setDefaults()
518 {
519     fs->setChecked ( false );
520     display->setChecked ( false );
521     lDisplay->setEnabled ( false );
522     displayNumber->setEnabled ( false );
523     custom->setChecked ( true );
524     width->setValue ( 800 );
525     height->setValue ( 600 );
526 
527     cbSetDPI->setChecked ( mainWindow->getDefaultSetDPI() );
528     DPI->setValue ( mainWindow->getDefaultDPI() );
529     DPI->setEnabled ( mainWindow->getDefaultSetDPI() );
530 
531     rbClipBoth->setChecked(true);
532 
533     rbKbdAuto->setChecked ( mainWindow->getDefaultSetKbd() );
534     rbKbdNoSet->setChecked ( !mainWindow->getDefaultSetKbd() );
535     rbKbdSet->setChecked (false );
536     leLayout->setText ( tr ( "us" ) );
537     leModel->setText ( "pc105" );
538     leVariant->setText("");
539 
540     slot_kbdClicked();
541 
542     cbXinerama->setChecked ( false );
543 }
544 
saveSettings()545 void SettingsWidget::saveSettings()
546 {
547     X2goSettings st ( "sessions" );
548 
549     st.setting()->setValue ( sessionId+"/fullscreen",
550                              ( QVariant ) fs->isChecked() );
551     st.setting()->setValue ( sessionId+"/multidisp",
552                              ( QVariant ) display->isChecked() );
553     st.setting()->setValue ( sessionId+"/display",
554                              ( QVariant ) displayNumber->value() );
555 
556 #ifdef Q_OS_UNIX
557 #ifdef CFGCLIENT
558     st.setting()->setValue ( sessionId+"/maxdim",
559                              ( QVariant ) maxRes->isChecked() );
560 
561     if (rXfreeRDPOld->isChecked())
562     {
563         st.setting()->setValue ( sessionId+"/rdpclient",
564                                  ( QVariant ) "xfreerdp" );
565     }
566     else if (rXfreeRDPNew->isChecked())
567     {
568         st.setting()->setValue ( sessionId+"/rdpclient",
569                                  ( QVariant ) "xfreerdpnew" );
570     }
571     else
572     {
573         st.setting()->setValue ( sessionId+"/rdpclient",
574                                  ( QVariant ) "rdesktop" );
575     }
576     st.setting()->setValue ( sessionId+"/directrdpsettings",
577                              ( QVariant ) params->text());
578 
579     if (rXnest->isChecked())
580     {
581         st.setting()->setValue ( sessionId+"/xdmcpclient",
582                                  ( QVariant ) "Xnest" );
583     }
584     else if (rXephyr->isChecked())
585     {
586         st.setting()->setValue ( sessionId+"/xdmcpclient",
587                                  ( QVariant ) "Xephyr" );
588     }
589     else
590     {
591         st.setting()->setValue ( sessionId+"/xdmcpclient",
592                                  ( QVariant ) "x2goagent" );
593     }
594     st.setting()->setValue ( sessionId+"/directxdmcpsettings",
595                              ( QVariant ) xdmcpParams->text());
596 
597 #endif
598 #endif
599 
600     st.setting()->setValue ( sessionId+"/width",
601                              ( QVariant ) width->value() );
602 
603     st.setting()->setValue ( sessionId+"/height",
604                              ( QVariant ) height->value() );
605 
606     //if maxRes is checked width and height are setted to max area available
607     if (maxRes->isChecked()
608             || st.setting()->value(sessionId + "/multidisp", (QVariant) false).toBool()
609             || st.setting()->value(sessionId + "/maxdim", (QVariant) false).toBool()) {
610 
611         //get screen number
612         int selectedScreen = st.setting()->value(sessionId + "/display", (QVariant) -1).toInt();
613 
614         //get max available desktop area for selected screen
615         int height = QApplication::desktop()->availableGeometry(selectedScreen).height();
616         int width = QApplication::desktop()->availableGeometry(selectedScreen).width();
617 
618         //save max resolution
619         st.setting()->setValue (sessionId + "/width", (QVariant) width);
620         st.setting()->setValue (sessionId + "/height", (QVariant) height);
621     }
622 
623 
624     st.setting()->setValue ( sessionId+"/dpi",
625                              ( QVariant ) DPI->value() );
626     st.setting()->setValue ( sessionId+"/setdpi",
627                              ( QVariant ) cbSetDPI->isChecked() );
628     st.setting()->setValue ( sessionId+"/xinerama",
629                              ( QVariant ) cbXinerama->isChecked() );
630 
631     QString clipMode;
632     if(rbClipBoth->isChecked())
633         clipMode="both";
634     if(rbClipClient->isChecked())
635         clipMode="client";
636     if(rbClipServer->isChecked())
637         clipMode="server";
638     if(rbClipNone->isChecked())
639         clipMode="none";
640     st.setting()->setValue ( sessionId+"/clipboard",
641                              ( QVariant ) clipMode );
642 
643 
644     st.setting()->setValue ( sessionId+"/usekbd",
645                              ( QVariant ) !rbKbdNoSet->isChecked() );
646 
647     QString ktype;
648     if(rbKbdAuto->isChecked())
649     {
650         ktype="auto";
651     }
652     else
653     {
654         ktype=leModel->text()+"/"+leLayout->text();
655         if(leVariant->text().length()>0)
656         {
657             ktype+="\\("+leVariant->text()+"\\)";
658         }
659     }
660 
661     st.setting()->setValue ( sessionId+"/type",
662                              ( QVariant ) ktype );
663     st.setting()->sync();
664 }
665 
666 #ifdef Q_OS_UNIX
setServerSettings(QString server,QString port,QString user)667 void SettingsWidget::setServerSettings(QString server, QString port, QString user)
668 {
669     this->server=server;
670     this->port=port;
671     this->user=user;
672     updateCmdLine();
673 }
674 
updateCmdLine()675 void SettingsWidget::updateCmdLine()
676 {
677 #ifdef CFGCLIENT
678     QString client="xfreerdp";
679     QString userOpt;
680     if (user.length()>0)
681     {
682         userOpt=" -u ";
683         userOpt+=user;
684     }
685     if (rRdesktop->isChecked())
686     {
687         client="rdesktop";
688     }
689 
690     QString grOpt;
691 
692     if(!rXfreeRDPNew->isChecked())
693     {
694         if (fs->isChecked())
695         {
696             grOpt=" -f ";
697         }
698         if (maxRes->isChecked())
699         {
700             grOpt=" -D -g <maxW>x<maxH>";
701         }
702         if (custom->isChecked())
703         {
704             grOpt=" -g "+QString::number(width->value())+"x"+QString::number(height->value());
705         }
706         cmdLine->setText(client +" "+params->text()+ grOpt +userOpt+" -p <"+tr("password")+"> "+ server+":"+port );
707     }
708     else
709     {
710         if (user.length()>0)
711         {
712             userOpt=" /u:";
713             userOpt+=user;
714         }
715         if (fs->isChecked())
716         {
717             grOpt=" /f ";
718         }
719         if (maxRes->isChecked())
720         {
721             grOpt="  /w:<maxW> /h:<maxH>";
722         }
723         if (custom->isChecked())
724         {
725             grOpt=" /w:"+QString::number(width->value())+" /h:"+QString::number(height->value());
726         }
727         cmdLine->setText(client +" "+params->text()+ grOpt +userOpt+" /p:<"+tr("password")+"> /v:"+ server+":"+port );
728     }
729     fs->setEnabled(true);
730     if(!rXephyr->isChecked() && !xdmcpBox->isHidden())
731     {
732         fs->setEnabled(false);
733         if(fs->isChecked())
734         {
735             custom->setChecked(true);
736         }
737     }
738     if(rX2goagent->isChecked())
739     {
740         client="x2goagent";
741     }
742     else
743     {
744         client="Xnest";
745     }
746     if (maxRes->isChecked())
747     {
748         grOpt=" -geometry <maxW>x<maxH>";
749     }
750     if (custom->isChecked())
751     {
752         grOpt=" -geometry "+QString::number(width->value())+"x"+QString::number(height->value());
753     }
754 
755     if(rXephyr->isChecked())
756     {
757         client="Xephyr";
758         if (fs->isChecked())
759         {
760             grOpt=" -fullscreen ";
761         }
762         if (maxRes->isChecked())
763         {
764             grOpt=" -screen <maxW>x<maxH>";
765         }
766         if (custom->isChecked())
767         {
768             grOpt=" -screen "+QString::number(width->value())+"x"+QString::number(height->value());
769         }
770     }
771     xdmcpCmdLine->setText(client +" "+xdmcpParams->text()+ grOpt +" -query "+ server+ " :<DISPLAY>");
772 
773 #endif
774 }
775 #endif
776