blob: 4c9e0880c780706460a6cf33ed95e339203e9853 [file] [log] [blame]
Pierre Ossmand463b572011-05-16 12:04:43 +00001/* Copyright 2011 Pierre Ossman <ossman@cendio.se> for Cendio AB
2 *
3 * This is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This software is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
16 * USA.
17 */
18
19#include <list>
20
21#include <FL/Fl_Tabs.H>
22#include <FL/Fl_Button.H>
23#include <FL/Fl_Return_Button.H>
24
25#include <rdr/types.h>
26#include <rfb/encodings.h>
27
28#ifdef HAVE_GNUTLS
29#include <rfb/Security.h>
30#include <rfb/SecurityClient.h>
31#include <rfb/CSecurityTLS.h>
32#endif
33
34#include "OptionsDialog.h"
35#include "fltk_layout.h"
36#include "i18n.h"
37#include "parameters.h"
38
39using namespace std;
40using namespace rdr;
41using namespace rfb;
42
43OptionsDialog::OptionsDialog()
44 : Fl_Window(450, 450, _("VNC Viewer: Connection Options"))
45{
46 int x, y;
47 Fl_Button *button;
48
49 Fl_Tabs *tabs = new Fl_Tabs(OUTER_MARGIN, OUTER_MARGIN,
50 w() - OUTER_MARGIN*2,
51 h() - OUTER_MARGIN*2 - INNER_MARGIN - BUTTON_HEIGHT);
52
53 {
54 int tx, ty, tw, th;
55
56 tabs->client_area(tx, ty, tw, th, TABS_HEIGHT);
57
58 createCompressionPage(tx, ty, tw, th);
59 createSecurityPage(tx, ty, tw, th);
60 createInputPage(tx, ty, tw, th);
61 createMiscPage(tx, ty, tw, th);
62 }
63
64 tabs->end();
65
66 x = w() - BUTTON_WIDTH * 2 - INNER_MARGIN - OUTER_MARGIN;
67 y = h() - BUTTON_HEIGHT - OUTER_MARGIN;
68
69 button = new Fl_Button(x, y, BUTTON_WIDTH, BUTTON_HEIGHT, _("Cancel"));
70 button->callback(this->handleCancel, this);
71
72 x += BUTTON_WIDTH + INNER_MARGIN;
73
74 button = new Fl_Return_Button(x, y, BUTTON_WIDTH, BUTTON_HEIGHT, _("OK"));
75 button->callback(this->handleOK, this);
76
77 callback(this->handleCancel, this);
78
79 set_modal();
80}
81
82
83OptionsDialog::~OptionsDialog()
84{
85}
86
87
88void OptionsDialog::showDialog(void)
89{
90 static OptionsDialog *dialog = NULL;
91
92 if (!dialog)
93 dialog = new OptionsDialog();
94
95 if (dialog->shown())
96 return;
97
98 dialog->show();
99}
100
101
102void OptionsDialog::show(void)
103{
104 loadOptions();
105
106 Fl_Window::show();
107}
108
109
110void OptionsDialog::loadOptions(void)
111{
112 /* Compression */
113 autoselectCheckbox->value(autoSelect);
114
115 int encNum = encodingNum(preferredEncoding);
116
117 switch (encNum) {
118 case encodingTight:
119 tightButton->setonly();
120 break;
121 case encodingZRLE:
122 zrleButton->setonly();
123 break;
124 case encodingHextile:
125 hextileButton->setonly();
126 break;
127 case encodingRaw:
128 rawButton->setonly();
129 break;
130 }
131
132 if (fullColour)
133 fullcolorCheckbox->setonly();
134 else {
135 switch (lowColourLevel) {
136 case 0:
137 mediumcolorCheckbox->setonly();
138 break;
139 case 1:
140 lowcolorCheckbox->setonly();
141 break;
142 case 2:
143 verylowcolorCheckbox->setonly();
144 break;
145 }
146 }
147
148 char digit[2] = "0";
149
150 compressionCheckbox->value(customCompressLevel);
151 jpegCheckbox->value(!noJpeg);
152 digit[0] = '0' + compressLevel;
153 compressionInput->value(digit);
154 digit[0] = '0' + qualityLevel;
155 jpegInput->value(digit);
156
157 handleAutoselect(autoselectCheckbox, this);
158 handleCompression(compressionCheckbox, this);
159 handleJpeg(jpegCheckbox, this);
160
161#ifdef HAVE_GNUTLS
162 /* Security */
163 Security security(SecurityClient::secTypes);
164
165 list<U8> secTypes;
166 list<U8>::iterator iter;
167
168 list<U32> secTypesExt;
169 list<U32>::iterator iterExt;
170
171 vencryptCheckbox->value(false);
172
173 encNoneCheckbox->value(false);
174 encTLSCheckbox->value(false);
175 encX509Checkbox->value(false);
176
177 authNoneCheckbox->value(false);
178 authVncCheckbox->value(false);
179 authPlainCheckbox->value(false);
180
181 secTypes = security.GetEnabledSecTypes();
182 for (iter = secTypes.begin(); iter != secTypes.end(); ++iter) {
183 switch (*iter) {
184 case secTypeVeNCrypt:
185 vencryptCheckbox->value(true);
186 break;
187 case secTypeNone:
188 encNoneCheckbox->value(true);
189 authNoneCheckbox->value(true);
190 break;
191 case secTypeVncAuth:
192 encNoneCheckbox->value(true);
193 authVncCheckbox->value(true);
194 break;
195 }
196 }
197
198 secTypesExt = security.GetEnabledExtSecTypes();
199 for (iterExt = secTypesExt.begin(); iterExt != secTypesExt.end(); ++iterExt) {
200 switch (*iterExt) {
201 case secTypePlain:
202 encNoneCheckbox->value(true);
203 authPlainCheckbox->value(true);
204 break;
205 case secTypeTLSNone:
206 encTLSCheckbox->value(true);
207 authNoneCheckbox->value(true);
208 break;
209 case secTypeTLSVnc:
210 encTLSCheckbox->value(true);
211 authVncCheckbox->value(true);
212 break;
213 case secTypeTLSPlain:
214 encTLSCheckbox->value(true);
215 authPlainCheckbox->value(true);
216 break;
217 case secTypeX509None:
218 encX509Checkbox->value(true);
219 authNoneCheckbox->value(true);
220 break;
221 case secTypeX509Vnc:
222 encX509Checkbox->value(true);
223 authVncCheckbox->value(true);
224 break;
225 case secTypeX509Plain:
226 encX509Checkbox->value(true);
227 authPlainCheckbox->value(true);
228 break;
229 }
230 }
231
232 caInput->value(CSecurityTLS::x509ca);
233 crlInput->value(CSecurityTLS::x509crl);
234
235 handleVencrypt(vencryptCheckbox, this);
236 handleX509(encX509Checkbox, this);
237#endif
238
239 /* Input */
240 viewOnlyCheckbox->value(viewOnly);
241 acceptClipboardCheckbox->value(acceptClipboard);
242 sendClipboardCheckbox->value(sendClipboard);
243 sendPrimaryCheckbox->value(sendPrimary);
244
245 /* Misc. */
246 sharedCheckbox->value(shared);
247 fullScreenCheckbox->value(fullScreen);
248 localCursorCheckbox->value(useLocalCursor);
249 dotCursorCheckbox->value(dotWhenNoCursor);
250}
251
252
253void OptionsDialog::storeOptions(void)
254{
255}
256
257
258void OptionsDialog::createCompressionPage(int tx, int ty, int tw, int th)
259{
260 Fl_Group *group = new Fl_Group(tx, ty, tw, th, _("Compression"));
261
262 int orig_tx, orig_ty;
263 int half_width, full_width;
264 int width, height;
265
266 tx += OUTER_MARGIN;
267 ty += OUTER_MARGIN;
268
269 full_width = tw - OUTER_MARGIN * 2;
270 half_width = (full_width - INNER_MARGIN) / 2;
271
272 /* AutoSelect checkbox */
273 autoselectCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
274 CHECK_MIN_WIDTH,
275 CHECK_HEIGHT,
276 _("Auto select")));
277 autoselectCheckbox->callback(handleAutoselect, this);
278 ty += CHECK_HEIGHT + INNER_MARGIN;
279
280 /* Two columns */
281 orig_tx = tx;
282 orig_ty = ty;
283
284 /* VNC encoding box */
285 ty += GROUP_LABEL_OFFSET;
286 height = GROUP_MARGIN * 2 + TIGHT_MARGIN * 3 + RADIO_HEIGHT * 4;
287 encodingGroup = new Fl_Group(tx, ty, half_width, height,
288 _("Preferred encoding"));
289 encodingGroup->box(FL_ENGRAVED_BOX);
290 encodingGroup->align(FL_ALIGN_LEFT | FL_ALIGN_TOP);
291
292 {
293 tx += GROUP_MARGIN;
294 ty += GROUP_MARGIN;
295
296 width = encodingGroup->w() - GROUP_MARGIN * 2;
297
298 tightButton = new Fl_Round_Button(LBLRIGHT(tx, ty,
299 RADIO_MIN_WIDTH,
300 RADIO_HEIGHT,
301 _("Tight")));
302 tightButton->type(FL_RADIO_BUTTON);
303 ty += RADIO_HEIGHT + TIGHT_MARGIN;
304
305 zrleButton = new Fl_Round_Button(LBLRIGHT(tx, ty,
306 RADIO_MIN_WIDTH,
307 RADIO_HEIGHT,
308 _("ZRLE")));
309 zrleButton->type(FL_RADIO_BUTTON);
310 ty += RADIO_HEIGHT + TIGHT_MARGIN;
311
312 hextileButton = new Fl_Round_Button(LBLRIGHT(tx, ty,
313 RADIO_MIN_WIDTH,
314 RADIO_HEIGHT,
315 _("Hextile")));
316 hextileButton->type(FL_RADIO_BUTTON);
317 ty += RADIO_HEIGHT + TIGHT_MARGIN;
318
319 rawButton = new Fl_Round_Button(LBLRIGHT(tx, ty,
320 RADIO_MIN_WIDTH,
321 RADIO_HEIGHT,
322 _("Raw")));
323 rawButton->type(FL_RADIO_BUTTON);
324 ty += RADIO_HEIGHT + TIGHT_MARGIN;
325 }
326
327 ty += GROUP_MARGIN - TIGHT_MARGIN;
328
329 encodingGroup->end();
330
331 /* Second column */
332 tx = orig_tx + half_width + INNER_MARGIN;
333 ty = orig_ty;
334
335 /* Color box */
336 ty += GROUP_LABEL_OFFSET;
337 height = GROUP_MARGIN * 2 + TIGHT_MARGIN * 3 + RADIO_HEIGHT * 4;
338 colorlevelGroup = new Fl_Group(tx, ty, half_width, height, _("Color level"));
339 colorlevelGroup->box(FL_ENGRAVED_BOX);
340 colorlevelGroup->align(FL_ALIGN_LEFT | FL_ALIGN_TOP);
341
342 {
343 tx += GROUP_MARGIN;
344 ty += GROUP_MARGIN;
345
346 width = colorlevelGroup->w() - GROUP_MARGIN * 2;
347
348 fullcolorCheckbox = new Fl_Round_Button(LBLRIGHT(tx, ty,
349 RADIO_MIN_WIDTH,
350 RADIO_HEIGHT,
351 _("Full (all available colors)")));
352 fullcolorCheckbox->type(FL_RADIO_BUTTON);
353 ty += RADIO_HEIGHT + TIGHT_MARGIN;
354
355 mediumcolorCheckbox = new Fl_Round_Button(LBLRIGHT(tx, ty,
356 RADIO_MIN_WIDTH,
357 RADIO_HEIGHT,
358 _("Medium (256 colors)")));
359 mediumcolorCheckbox->type(FL_RADIO_BUTTON);
360 ty += RADIO_HEIGHT + TIGHT_MARGIN;
361
362 lowcolorCheckbox = new Fl_Round_Button(LBLRIGHT(tx, ty,
363 RADIO_MIN_WIDTH,
364 RADIO_HEIGHT,
365 _("Low (64 colors)")));
366 lowcolorCheckbox->type(FL_RADIO_BUTTON);
367 ty += RADIO_HEIGHT + TIGHT_MARGIN;
368
369 verylowcolorCheckbox = new Fl_Round_Button(LBLRIGHT(tx, ty,
370 RADIO_MIN_WIDTH,
371 RADIO_HEIGHT,
372 _("Very low (8 colors)")));
373 verylowcolorCheckbox->type(FL_RADIO_BUTTON);
374 ty += RADIO_HEIGHT + TIGHT_MARGIN;
375 }
376
377 ty += GROUP_MARGIN - TIGHT_MARGIN;
378
379 colorlevelGroup->end();
380
381 /* Back to normal */
382 tx = orig_tx;
383 ty += INNER_MARGIN;
384
385 /* Checkboxes */
386 compressionCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
387 CHECK_MIN_WIDTH,
388 CHECK_HEIGHT,
389 _("Custom compression level:")));
390 compressionCheckbox->callback(handleCompression, this);
391 ty += CHECK_HEIGHT + TIGHT_MARGIN;
392
393 compressionInput = new Fl_Int_Input(tx + INDENT, ty,
394 INPUT_HEIGHT, INPUT_HEIGHT,
395 _("level (1=fast, 9=best)"));
396 compressionInput->align(FL_ALIGN_RIGHT);
397 ty += INPUT_HEIGHT + INNER_MARGIN;
398
399 jpegCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
400 CHECK_MIN_WIDTH,
401 CHECK_HEIGHT,
402 _("Allow JPEG compression:")));
403 jpegCheckbox->callback(handleJpeg, this);
404 ty += CHECK_HEIGHT + TIGHT_MARGIN;
405
406 jpegInput = new Fl_Int_Input(tx + INDENT, ty,
407 INPUT_HEIGHT, INPUT_HEIGHT,
408 _("quality (1=poor, 9=best)"));
409 jpegInput->align(FL_ALIGN_RIGHT);
410 ty += INPUT_HEIGHT + INNER_MARGIN;
411
412 group->end();
413}
414
415
416void OptionsDialog::createSecurityPage(int tx, int ty, int tw, int th)
417{
418#ifdef HAVE_GNUTLS
419 Fl_Group *group = new Fl_Group(tx, ty, tw, th, _("Security"));
420
421 int orig_tx;
422 int width, height;
423
424 tx += OUTER_MARGIN;
425 ty += OUTER_MARGIN;
426
427 width = tw - OUTER_MARGIN * 2;
428
429 orig_tx = tx;
430
431 /* Security */
432 vencryptCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
433 CHECK_MIN_WIDTH,
434 CHECK_HEIGHT,
435 _("Extended encryption and authentication methods (VeNCrypt)")));
436 vencryptCheckbox->callback(handleVencrypt, this);
437 ty += CHECK_HEIGHT + INNER_MARGIN;
438
439 /* Encryption */
440 ty += GROUP_LABEL_OFFSET;
441 height = GROUP_MARGIN * 2 + TIGHT_MARGIN * 4 + CHECK_HEIGHT * 3 + (INPUT_LABEL_OFFSET + INPUT_HEIGHT) * 2;
442 encryptionGroup = new Fl_Group(tx, ty, width, height, _("Encryption"));
443 encryptionGroup->box(FL_ENGRAVED_BOX);
444 encryptionGroup->align(FL_ALIGN_LEFT | FL_ALIGN_TOP);
445
446 {
447 tx += GROUP_MARGIN;
448 ty += GROUP_MARGIN;
449
450 encNoneCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
451 CHECK_MIN_WIDTH,
452 CHECK_HEIGHT,
453 _("None")));
454 ty += CHECK_HEIGHT + TIGHT_MARGIN;
455
456 encTLSCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
457 CHECK_MIN_WIDTH,
458 CHECK_HEIGHT,
459 _("TLS with anonymous certificates")));
460 ty += CHECK_HEIGHT + TIGHT_MARGIN;
461
462 encX509Checkbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
463 CHECK_MIN_WIDTH,
464 CHECK_HEIGHT,
465 _("TLS with X509 certificates")));
466 encX509Checkbox->callback(handleX509, this);
467 ty += CHECK_HEIGHT + TIGHT_MARGIN;
468
469 ty += INPUT_LABEL_OFFSET;
470 caInput = new Fl_Input(tx + INDENT, ty,
471 width - GROUP_MARGIN*2 - INDENT, INPUT_HEIGHT,
472 _("Path to X509 CA certificate"));
473 caInput->align(FL_ALIGN_LEFT | FL_ALIGN_TOP);
474 ty += INPUT_HEIGHT + TIGHT_MARGIN;
475
476 ty += INPUT_LABEL_OFFSET;
477 crlInput = new Fl_Input(tx + INDENT, ty,
478 width - GROUP_MARGIN*2 - INDENT, INPUT_HEIGHT,
479 _("Path to X509 CRL file"));
480 crlInput->align(FL_ALIGN_LEFT | FL_ALIGN_TOP);
481 ty += INPUT_HEIGHT + TIGHT_MARGIN;
482 }
483
484 ty += GROUP_MARGIN - TIGHT_MARGIN;
485
486 encryptionGroup->end();
487
488 /* Back to normal */
489 tx = orig_tx;
490 ty += INNER_MARGIN;
491
492 /* Authentication */
493 /* Encryption */
494 ty += GROUP_LABEL_OFFSET;
495 height = GROUP_MARGIN * 2 + TIGHT_MARGIN * 2 + CHECK_HEIGHT * 3;
496 authenticationGroup = new Fl_Group(tx, ty, width, height, _("Authentication"));
497 authenticationGroup->box(FL_ENGRAVED_BOX);
498 authenticationGroup->align(FL_ALIGN_LEFT | FL_ALIGN_TOP);
499
500 {
501 tx += GROUP_MARGIN;
502 ty += GROUP_MARGIN;
503
504 authNoneCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
505 CHECK_MIN_WIDTH,
506 CHECK_HEIGHT,
507 _("None")));
508 ty += CHECK_HEIGHT + TIGHT_MARGIN;
509
510 authVncCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
511 CHECK_MIN_WIDTH,
512 CHECK_HEIGHT,
513 _("Standard VNC (insecure without encryption)")));
514 ty += CHECK_HEIGHT + TIGHT_MARGIN;
515
516 authPlainCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
517 CHECK_MIN_WIDTH,
518 CHECK_HEIGHT,
519 _("Username and password (insecure without encryption)")));
520 ty += CHECK_HEIGHT + TIGHT_MARGIN;
521 }
522
523 ty += GROUP_MARGIN - TIGHT_MARGIN;
524
525 authenticationGroup->end();
526
527 /* Back to normal */
528 tx = orig_tx;
529 ty += INNER_MARGIN;
530
531 group->end();
532#endif
533}
534
535
536void OptionsDialog::createInputPage(int tx, int ty, int tw, int th)
537{
538 Fl_Group *group = new Fl_Group(tx, ty, tw, th, _("Input"));
539
540 tx += OUTER_MARGIN;
541 ty += OUTER_MARGIN;
542
543 viewOnlyCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
544 CHECK_MIN_WIDTH,
545 CHECK_HEIGHT,
546 _("View only (ignore mouse and keyboard)")));
547 ty += CHECK_HEIGHT + TIGHT_MARGIN;
548
549 acceptClipboardCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
550 CHECK_MIN_WIDTH,
551 CHECK_HEIGHT,
552 _("Accept clipboard from server")));
553 ty += CHECK_HEIGHT + TIGHT_MARGIN;
554
555 sendClipboardCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
556 CHECK_MIN_WIDTH,
557 CHECK_HEIGHT,
558 _("Send clipboard to server")));
559 ty += CHECK_HEIGHT + TIGHT_MARGIN;
560
561 sendPrimaryCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
562 CHECK_MIN_WIDTH,
563 CHECK_HEIGHT,
564 _("Send primary selection and cut buffer as clipboard")));
565 ty += CHECK_HEIGHT + TIGHT_MARGIN;
566
567 group->end();
568}
569
570
571void OptionsDialog::createMiscPage(int tx, int ty, int tw, int th)
572{
573 Fl_Group *group = new Fl_Group(tx, ty, tw, th, _("Misc."));
574
575 tx += OUTER_MARGIN;
576 ty += OUTER_MARGIN;
577
578 sharedCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
579 CHECK_MIN_WIDTH,
580 CHECK_HEIGHT,
581 _("Shared (don't disconnect other viewers)")));
582 ty += CHECK_HEIGHT + TIGHT_MARGIN;
583
584 fullScreenCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
585 CHECK_MIN_WIDTH,
586 CHECK_HEIGHT,
587 _("Full-screen mode")));
588 ty += CHECK_HEIGHT + TIGHT_MARGIN;
589
590 localCursorCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
591 CHECK_MIN_WIDTH,
592 CHECK_HEIGHT,
593 _("Render cursor locally")));
594 ty += CHECK_HEIGHT + TIGHT_MARGIN;
595
596 dotCursorCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
597 CHECK_MIN_WIDTH,
598 CHECK_HEIGHT,
599 _("Show dot when no cursor")));
600 ty += CHECK_HEIGHT + TIGHT_MARGIN;
601
602 group->end();
603}
604
605
606void OptionsDialog::handleAutoselect(Fl_Widget *widget, void *data)
607{
608 OptionsDialog *dialog = (OptionsDialog*)data;
609
610 if (dialog->autoselectCheckbox->value()) {
611 dialog->encodingGroup->deactivate();
612 dialog->colorlevelGroup->deactivate();
613 } else {
614 dialog->encodingGroup->activate();
615 dialog->colorlevelGroup->activate();
616 }
617
618 // JPEG setting is also affected by autoselection
619 dialog->handleJpeg(dialog->jpegCheckbox, dialog);
620}
621
622
623void OptionsDialog::handleCompression(Fl_Widget *widget, void *data)
624{
625 OptionsDialog *dialog = (OptionsDialog*)data;
626
627 if (dialog->compressionCheckbox->value())
628 dialog->compressionInput->activate();
629 else
630 dialog->compressionInput->deactivate();
631}
632
633
634void OptionsDialog::handleJpeg(Fl_Widget *widget, void *data)
635{
636 OptionsDialog *dialog = (OptionsDialog*)data;
637
638 if (dialog->jpegCheckbox->value() &&
639 !dialog->autoselectCheckbox->value())
640 dialog->jpegInput->activate();
641 else
642 dialog->jpegInput->deactivate();
643}
644
645
646void OptionsDialog::handleVencrypt(Fl_Widget *widget, void *data)
647{
648 OptionsDialog *dialog = (OptionsDialog*)data;
649
650 if (dialog->vencryptCheckbox->value()) {
651 dialog->encryptionGroup->activate();
652 dialog->authPlainCheckbox->activate();
653 } else {
654 dialog->encryptionGroup->deactivate();
655 dialog->authPlainCheckbox->deactivate();
656 }
657}
658
659
660void OptionsDialog::handleX509(Fl_Widget *widget, void *data)
661{
662 OptionsDialog *dialog = (OptionsDialog*)data;
663
664 if (dialog->encX509Checkbox->value()) {
665 dialog->caInput->activate();
666 dialog->crlInput->activate();
667 } else {
668 dialog->caInput->deactivate();
669 dialog->crlInput->deactivate();
670 }
671}
672
673
674void OptionsDialog::handleCancel(Fl_Widget *widget, void *data)
675{
676 OptionsDialog *dialog = (OptionsDialog*)data;
677
678 dialog->hide();
679}
680
681
682void OptionsDialog::handleOK(Fl_Widget *widget, void *data)
683{
684 OptionsDialog *dialog = (OptionsDialog*)data;
685
686 dialog->hide();
687
688 dialog->storeOptions();
689}