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