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 "mediawidget.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
MediaWidget(QString id,ONMainWindow * mw,QWidget * parent,Qt::WindowFlags f)37 MediaWidget::MediaWidget ( QString id, ONMainWindow * mw,
38 QWidget * parent, Qt::WindowFlags f )
39 : ConfigWidget ( id,mw,parent,f )
40 {
41 #ifdef Q_WS_HILDON
42 QTabWidget* tabSettings=new QTabWidget ( this );
43 QFrame* sbgr=new QFrame();
44 tabSettings->addTab ( sbgr,tr ( "Sound" ) );
45 #else
46 sbgr=new QGroupBox ( tr ( "Sound" ),this );
47 #endif
48 QVBoxLayout *sndLay=new QVBoxLayout ( sbgr );
49 QHBoxLayout* sLay=new QHBoxLayout ( );
50 QVBoxLayout* sLay_sys=new QVBoxLayout ( );
51 QVBoxLayout* sLay_opt=new QVBoxLayout ( );
52 sLay->addLayout ( sLay_sys );
53 sLay->addLayout ( sLay_opt );
54 QVBoxLayout* setLay=new QVBoxLayout ( this );
55
56 sound=new QCheckBox ( tr ( "Enable sound support" ),sbgr );
57 QButtonGroup* sndsys=new QButtonGroup;
58 pulse=new QRadioButton ( "PulseAudio",sbgr );
59 arts=new QRadioButton ( "arts",sbgr );
60 esd=new QRadioButton ( "esd",sbgr );
61 sndsys->addButton ( pulse,PULSE );
62 sndsys->addButton ( arts,ARTS );
63 sndsys->addButton ( esd,ESD );
64 sndsys->setExclusive ( true );
65 rbStartSnd=new QRadioButton ( tr ( "Start sound daemon" ),sbgr );
66 rbNotStartSnd=new QRadioButton (
67 tr ( "Use running sound daemon" ),sbgr );
68 cbSndSshTun=new QCheckBox (
69 tr ( "Use SSH port forwarding to tunnel\n"
70 "sound system connections through firewalls" ),sbgr );
71 cbDefSndPort=new QCheckBox ( tr ( "Use default sound port" ),sbgr );
72 sbSndPort=new QSpinBox ( sbgr );
73 sbSndPort->setMinimum ( 1 );
74 sbSndPort->setMaximum ( 65535 );
75
76
77 QHBoxLayout *sndPortLay = new QHBoxLayout();
78 lSndPort=new QLabel ( tr ( "Sound port:" ),sbgr );
79 sndPortLay->addWidget ( lSndPort );
80 sndPortLay->addWidget ( sbSndPort );
81
82 sLay_sys->addWidget ( pulse );
83 sLay_sys->addWidget ( arts );
84 sLay_sys->addWidget ( esd );
85
86 sLay_opt->addWidget ( rbStartSnd );
87 sLay_opt->addWidget ( rbNotStartSnd );
88 sLay_opt->addWidget ( cbSndSshTun );
89 QFrame* hl=new QFrame ( sbgr );
90 hl->setFrameStyle ( QFrame::HLine | QFrame::Sunken );
91 sLay_opt->addWidget ( hl );
92 sLay_opt->addWidget ( cbDefSndPort );
93 sLay_opt->addLayout ( sndPortLay );
94 sndLay->addWidget ( sound );
95 sndLay->addLayout ( sLay );
96 #if defined (Q_OS_WIN) || defined (Q_OS_DARWIN)
97 arts->hide();
98 hl->hide();
99 cbDefSndPort->hide();
100 lSndPort->hide();
101 sbSndPort->hide();
102 #endif /* defined (Q_OS_WIN) || defined (Q_OS_DARWIN) */
103
104
105 cbClientPrint=new QCheckBox ( tr ( "Client side printing support" ),
106 this );
107 setLay->addWidget(sbgr);
108 setLay->addWidget ( cbClientPrint );
109 setLay->addStretch();
110
111 connect ( sound,SIGNAL ( toggled ( bool ) ),this,
112 SLOT ( slot_sndToggled ( bool ) ) );
113 connect ( sndsys,SIGNAL ( buttonClicked ( int ) ),this,
114 SLOT ( slot_sndSysSelected ( int ) ) );
115 connect ( rbStartSnd,SIGNAL ( clicked ( ) ),this,
116 SLOT ( slot_sndStartClicked() ) );
117 connect ( rbNotStartSnd,SIGNAL ( clicked ( ) ),this,
118 SLOT ( slot_sndStartClicked() ) );
119 connect ( cbDefSndPort,SIGNAL ( toggled ( bool ) ),this,
120 SLOT ( slot_sndDefPortChecked ( bool ) ) );
121
122 setDefaults();
123 readConfig();
124 }
125
126
~MediaWidget()127 MediaWidget::~MediaWidget()
128 {
129 }
130
slot_sndSysSelected(int system)131 void MediaWidget::slot_sndSysSelected ( int system )
132 {
133 rbStartSnd->show();
134 rbNotStartSnd->show();
135 cbSndSshTun->hide();
136 cbDefSndPort->setChecked ( true );
137 cbDefSndPort->setEnabled ( true );
138
139 switch ( system )
140 {
141 case PULSE:
142 {
143 rbStartSnd->hide();
144 rbNotStartSnd->hide();
145 cbSndSshTun->show();
146 cbSndSshTun->setEnabled ( true );
147 break;
148 }
149 case ARTS:
150 {
151 cbDefSndPort->setChecked ( false );
152 cbDefSndPort->setEnabled ( false );
153 sbSndPort->setValue ( 20221 );
154 QMessageBox::warning (NULL, tr ("Deprecation Warning"),
155 tr ("ARTS support is scheduled to be removed soon.\n\n"
156
157 "Please upgrade to PulseAudio."),
158 QMessageBox::Ok, QMessageBox::NoButton);
159 break;
160 }
161 case ESD:
162 {
163 rbStartSnd->hide ();
164 rbNotStartSnd->hide ();
165 cbSndSshTun->show ();
166 #ifdef Q_OS_WIN
167 cbSndSshTun->setEnabled ( false );
168 cbSndSshTun->setChecked ( true );
169 #elif defined (Q_OS_DARWIN)
170 cbSndSshTun->setEnabled (true);
171 #endif /* defined (Q_OS_WIN) */
172
173 #if !defined (Q_OS_WIN) && !defined (Q_OS_DARWIN)
174 QMessageBox::warning (NULL, tr ("Deprecation Warning"),
175 tr ("ESounD support is scheduled to be removed soon.\n\n"
176
177 "Please upgrade to PulseAudio."),
178 QMessageBox::Ok, QMessageBox::NoButton);
179 #endif
180 sbSndPort->setValue ( 16001 );
181 break;
182 }
183 }
184 slot_sndStartClicked();
185 }
186
slot_sndToggled(bool val)187 void MediaWidget::slot_sndToggled ( bool val )
188 {
189 arts->setEnabled ( val );
190 pulse->setEnabled ( val );
191 esd->setEnabled ( val );
192
193 rbStartSnd->setEnabled ( val );
194 rbNotStartSnd->setEnabled ( val );
195
196 cbSndSshTun->setEnabled ( false );
197 /* ESD is also handled by PA on Windows and OS X. */
198 #if defined (Q_OS_WIN) || defined (Q_OS_DARWIN)
199 if ((pulse->isChecked ()) || (esd->isChecked ())) {
200 cbSndSshTun->setEnabled (val);
201 }
202 #else
203 if (pulse->isChecked ()) {
204 cbSndSshTun->setEnabled ( val );
205 }
206 #endif /* defined (Q_OS_WIN) || defined (Q_OS_DARWIN) */
207 lSndPort->setEnabled ( val );
208 if ( !arts->isChecked() )
209 cbDefSndPort->setEnabled ( val );
210 sbSndPort->setEnabled ( val );
211 if ( val )
212 slot_sndStartClicked();
213
214 }
215
slot_sndStartClicked()216 void MediaWidget::slot_sndStartClicked()
217 {
218 bool start=rbStartSnd->isChecked();
219 #ifdef Q_OS_WIN
220 start=false;
221 #endif
222 if ( pulse->isChecked() )
223 {
224 lSndPort->setEnabled ( true );
225 sbSndPort->setEnabled ( true );
226 cbDefSndPort->setEnabled (sound->isChecked());
227 }
228 else
229 {
230 lSndPort->setEnabled ( !start );
231 sbSndPort->setEnabled ( !start );
232 cbDefSndPort->setEnabled ( !start );
233 }
234 if ( arts->isChecked() )
235 cbDefSndPort->setEnabled ( false );
236 if ( ( !start && esd->isChecked() ) ||pulse->isChecked() )
237 slot_sndDefPortChecked ( cbDefSndPort->isChecked() );
238
239 }
240
slot_sndDefPortChecked(bool val)241 void MediaWidget::slot_sndDefPortChecked ( bool val )
242 {
243 sbSndPort->setEnabled ( !val );
244 lSndPort->setEnabled ( !val );
245 if ( val )
246 {
247 if ( pulse->isChecked() )
248 sbSndPort->setValue ( 4713 );
249 if ( arts->isChecked() )
250 sbSndPort->setValue ( 20221 );
251 if ( esd->isChecked() )
252 sbSndPort->setValue ( 16001 );
253 }
254
255 }
256
readConfig()257 void MediaWidget::readConfig()
258 {
259
260 X2goSettings st ( "sessions" );
261
262 bool snd=st.setting()->value (
263 sessionId+"/sound",
264 ( QVariant ) mainWindow->getDefaultUseSound()
265 ).toBool();
266 QString sndsys=st.setting()->value ( sessionId+"/soundsystem",
267 "pulse" ).toString();
268 bool startServ=st.setting()->value ( sessionId+"/startsoundsystem",
269 true ).toBool();
270 bool sndInTun=st.setting()->value ( sessionId+"/soundtunnel",
271 true ).toBool();
272 bool defSndPort=st.setting()->value ( sessionId+"/defsndport",
273 true ).toBool();
274 int sndPort= st.setting()->value ( sessionId+"/sndport",4713 ).toInt();
275 if ( startServ )
276 rbStartSnd->setChecked ( true );
277 else
278 rbNotStartSnd->setChecked ( true );
279
280 pulse->setChecked ( true );
281 slot_sndSysSelected ( PULSE );
282 #if defined (Q_OS_WIN) || defined (Q_OS_DARWIN)
283 if ( sndsys=="arts" )
284 {
285 sndsys="pulse";
286 }
287 #endif /* defined (Q_OS_WIN) || defined (Q_OS_DARWIN) */
288 if ( sndsys=="arts" )
289 {
290 arts->setChecked ( true );
291 slot_sndSysSelected ( ARTS );
292 }
293 if ( sndsys=="esd" )
294 {
295 esd->setChecked ( true );
296 slot_sndSysSelected ( ESD );
297 }
298 cbSndSshTun->setChecked ( sndInTun );
299 sound->setChecked ( snd );
300 if ( !defSndPort )
301 sbSndPort->setValue ( sndPort );
302 cbDefSndPort->setChecked ( defSndPort );
303 if ( sndsys=="arts" )
304 cbDefSndPort->setChecked ( false );
305 slot_sndToggled ( snd );
306 slot_sndStartClicked();
307
308 if(!sound)
309 cbDefSndPort->setEnabled(false);
310
311 cbClientPrint->setChecked ( st.setting()->value ( sessionId+"/print",
312 true ).toBool() );
313 }
314
setDefaults()315 void MediaWidget::setDefaults()
316 {
317 sound->setChecked ( true );
318 pulse->setChecked ( true );
319 slot_sndToggled ( true );
320 slot_sndSysSelected ( PULSE );
321 cbSndSshTun->setChecked ( true );
322 rbStartSnd->setChecked ( true );
323 cbClientPrint->setChecked ( true );
324 }
325
saveSettings()326 void MediaWidget::saveSettings()
327 {
328 X2goSettings st ( "sessions" );
329
330 st.setting()->setValue ( sessionId+"/sound",
331 ( QVariant ) sound->isChecked() );
332 if ( arts->isChecked() )
333 st.setting()->setValue ( sessionId+"/soundsystem",
334 ( QVariant ) "arts" );
335 if ( esd->isChecked() )
336 st.setting()->setValue ( sessionId+"/soundsystem",
337 ( QVariant ) "esd" );
338 if ( pulse->isChecked() )
339 st.setting()->setValue ( sessionId+"/soundsystem",
340 ( QVariant ) "pulse" );
341
342 st.setting()->setValue ( sessionId+"/startsoundsystem",
343 ( QVariant ) rbStartSnd->isChecked() );
344 st.setting()->setValue ( sessionId+"/soundtunnel",
345 ( QVariant ) cbSndSshTun->isChecked() );
346 st.setting()->setValue ( sessionId+"/defsndport",
347 ( QVariant ) cbDefSndPort->isChecked() );
348 st.setting()->setValue ( sessionId+"/sndport",
349 ( QVariant ) sbSndPort->value() );
350 st.setting()->setValue ( sessionId+"/print",
351 ( QVariant ) cbClientPrint->isChecked() );
352 st.setting()->sync();
353 }
354