Revision: 4416
          http://tigervnc.svn.sourceforge.net/tigervnc/?rev=4416&view=rev
Author:   ossman_
Date:     2011-05-16 12:04:43 +0000 (Mon, 16 May 2011)

Log Message:
-----------
Initial options dialog (read-only) loosly based on the Unix vncviewer.

Modified Paths:
--------------
    trunk/vncviewer/CMakeLists.txt
    trunk/vncviewer/ServerDialog.cxx
    trunk/vncviewer/ServerDialog.h
    trunk/vncviewer/Viewport.cxx

Added Paths:
-----------
    trunk/vncviewer/OptionsDialog.cxx
    trunk/vncviewer/OptionsDialog.h
    trunk/vncviewer/fltk_layout.h

Modified: trunk/vncviewer/CMakeLists.txt
===================================================================
--- trunk/vncviewer/CMakeLists.txt      2011-05-16 12:00:20 UTC (rev 4415)
+++ trunk/vncviewer/CMakeLists.txt      2011-05-16 12:04:43 UTC (rev 4416)
@@ -7,6 +7,7 @@
   DesktopWindow.cxx
   UserDialog.cxx
   ServerDialog.cxx
+  OptionsDialog.cxx
   Viewport.cxx
   parameters.cxx
   keysym2ucs.c

Added: trunk/vncviewer/OptionsDialog.cxx
===================================================================
--- trunk/vncviewer/OptionsDialog.cxx                           (rev 0)
+++ trunk/vncviewer/OptionsDialog.cxx   2011-05-16 12:04:43 UTC (rev 4416)
@@ -0,0 +1,689 @@
+/* Copyright 2011 Pierre Ossman <oss...@cendio.se> for Cendio AB
+ * 
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+#include <list>
+
+#include <FL/Fl_Tabs.H>
+#include <FL/Fl_Button.H>
+#include <FL/Fl_Return_Button.H>
+
+#include <rdr/types.h>
+#include <rfb/encodings.h>
+
+#ifdef HAVE_GNUTLS
+#include <rfb/Security.h>
+#include <rfb/SecurityClient.h>
+#include <rfb/CSecurityTLS.h>
+#endif
+
+#include "OptionsDialog.h"
+#include "fltk_layout.h"
+#include "i18n.h"
+#include "parameters.h"
+
+using namespace std;
+using namespace rdr;
+using namespace rfb;
+
+OptionsDialog::OptionsDialog()
+  : Fl_Window(450, 450, _("VNC Viewer: Connection Options"))
+{
+  int x, y;
+  Fl_Button *button;
+
+  Fl_Tabs *tabs = new Fl_Tabs(OUTER_MARGIN, OUTER_MARGIN,
+                             w() - OUTER_MARGIN*2,
+                             h() - OUTER_MARGIN*2 - INNER_MARGIN - 
BUTTON_HEIGHT);
+
+  {
+    int tx, ty, tw, th;
+
+    tabs->client_area(tx, ty, tw, th, TABS_HEIGHT);
+
+    createCompressionPage(tx, ty, tw, th);
+    createSecurityPage(tx, ty, tw, th);
+    createInputPage(tx, ty, tw, th);
+    createMiscPage(tx, ty, tw, th);
+  }
+
+  tabs->end();
+
+  x = w() - BUTTON_WIDTH * 2 - INNER_MARGIN - OUTER_MARGIN;
+  y = h() - BUTTON_HEIGHT - OUTER_MARGIN;
+
+  button = new Fl_Button(x, y, BUTTON_WIDTH, BUTTON_HEIGHT, _("Cancel"));
+  button->callback(this->handleCancel, this);
+
+  x += BUTTON_WIDTH + INNER_MARGIN;
+
+  button = new Fl_Return_Button(x, y, BUTTON_WIDTH, BUTTON_HEIGHT, _("OK"));
+  button->callback(this->handleOK, this);
+
+  callback(this->handleCancel, this);
+
+  set_modal();
+}
+
+
+OptionsDialog::~OptionsDialog()
+{
+}
+
+
+void OptionsDialog::showDialog(void)
+{
+  static OptionsDialog *dialog = NULL;
+
+  if (!dialog)
+    dialog = new OptionsDialog();
+
+  if (dialog->shown())
+    return;
+
+  dialog->show();
+}
+
+
+void OptionsDialog::show(void)
+{
+  loadOptions();
+
+  Fl_Window::show();
+}
+
+
+void OptionsDialog::loadOptions(void)
+{
+  /* Compression */
+  autoselectCheckbox->value(autoSelect);
+
+  int encNum = encodingNum(preferredEncoding);
+
+  switch (encNum) {
+  case encodingTight:
+    tightButton->setonly();
+    break;
+  case encodingZRLE:
+    zrleButton->setonly();
+    break;
+  case encodingHextile:
+    hextileButton->setonly();
+    break;
+  case encodingRaw:
+    rawButton->setonly();
+    break;
+  }
+
+  if (fullColour)
+    fullcolorCheckbox->setonly();
+  else {
+    switch (lowColourLevel) {
+    case 0:
+      mediumcolorCheckbox->setonly();
+      break;
+    case 1:
+      lowcolorCheckbox->setonly();
+      break;
+    case 2:
+      verylowcolorCheckbox->setonly();
+      break;
+    }
+  }
+
+  char digit[2] = "0";
+
+  compressionCheckbox->value(customCompressLevel);
+  jpegCheckbox->value(!noJpeg);
+  digit[0] = '0' + compressLevel;
+  compressionInput->value(digit);
+  digit[0] = '0' + qualityLevel;
+  jpegInput->value(digit);
+
+  handleAutoselect(autoselectCheckbox, this);
+  handleCompression(compressionCheckbox, this);
+  handleJpeg(jpegCheckbox, this);
+
+#ifdef HAVE_GNUTLS
+  /* Security */
+  Security security(SecurityClient::secTypes);
+
+  list<U8> secTypes;
+  list<U8>::iterator iter;
+
+   list<U32> secTypesExt;
+   list<U32>::iterator iterExt;
+
+  vencryptCheckbox->value(false);
+
+  encNoneCheckbox->value(false);
+  encTLSCheckbox->value(false);
+  encX509Checkbox->value(false);
+
+  authNoneCheckbox->value(false);
+  authVncCheckbox->value(false);
+  authPlainCheckbox->value(false);
+
+  secTypes = security.GetEnabledSecTypes();
+  for (iter = secTypes.begin(); iter != secTypes.end(); ++iter) {
+    switch (*iter) {
+    case secTypeVeNCrypt:
+      vencryptCheckbox->value(true);
+      break;
+    case secTypeNone:
+      encNoneCheckbox->value(true);
+      authNoneCheckbox->value(true);
+      break;
+    case secTypeVncAuth:
+      encNoneCheckbox->value(true);
+      authVncCheckbox->value(true);
+      break;
+    }
+  }
+
+  secTypesExt = security.GetEnabledExtSecTypes();
+  for (iterExt = secTypesExt.begin(); iterExt != secTypesExt.end(); ++iterExt) 
{
+    switch (*iterExt) {
+    case secTypePlain:
+      encNoneCheckbox->value(true);
+      authPlainCheckbox->value(true);
+      break;
+    case secTypeTLSNone:
+      encTLSCheckbox->value(true);
+      authNoneCheckbox->value(true);
+      break;
+    case secTypeTLSVnc:
+      encTLSCheckbox->value(true);
+      authVncCheckbox->value(true);
+      break;
+    case secTypeTLSPlain:
+      encTLSCheckbox->value(true);
+      authPlainCheckbox->value(true);
+      break;
+    case secTypeX509None:
+      encX509Checkbox->value(true);
+      authNoneCheckbox->value(true);
+      break;
+    case secTypeX509Vnc:
+      encX509Checkbox->value(true);
+      authVncCheckbox->value(true);
+      break;
+    case secTypeX509Plain:
+      encX509Checkbox->value(true);
+      authPlainCheckbox->value(true);
+      break;
+    }
+  }
+
+  caInput->value(CSecurityTLS::x509ca);
+  crlInput->value(CSecurityTLS::x509crl);
+
+  handleVencrypt(vencryptCheckbox, this);
+  handleX509(encX509Checkbox, this);
+#endif
+
+  /* Input */
+  viewOnlyCheckbox->value(viewOnly);
+  acceptClipboardCheckbox->value(acceptClipboard);
+  sendClipboardCheckbox->value(sendClipboard);
+  sendPrimaryCheckbox->value(sendPrimary);
+
+  /* Misc. */
+  sharedCheckbox->value(shared);
+  fullScreenCheckbox->value(fullScreen);
+  localCursorCheckbox->value(useLocalCursor);
+  dotCursorCheckbox->value(dotWhenNoCursor);
+}
+
+
+void OptionsDialog::storeOptions(void)
+{
+}
+
+
+void OptionsDialog::createCompressionPage(int tx, int ty, int tw, int th)
+{
+  Fl_Group *group = new Fl_Group(tx, ty, tw, th, _("Compression"));
+
+  int orig_tx, orig_ty;
+  int half_width, full_width;
+  int width, height;
+
+  tx += OUTER_MARGIN;
+  ty += OUTER_MARGIN;
+
+  full_width = tw - OUTER_MARGIN * 2;
+  half_width = (full_width - INNER_MARGIN) / 2;
+
+  /* AutoSelect checkbox */
+  autoselectCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                     CHECK_MIN_WIDTH,
+                                                     CHECK_HEIGHT,
+                                                     _("Auto select")));
+  autoselectCheckbox->callback(handleAutoselect, this);
+  ty += CHECK_HEIGHT + INNER_MARGIN;
+
+  /* Two columns */
+  orig_tx = tx;
+  orig_ty = ty;
+
+  /* VNC encoding box */
+  ty += GROUP_LABEL_OFFSET;
+  height = GROUP_MARGIN * 2 + TIGHT_MARGIN * 3 + RADIO_HEIGHT * 4;
+  encodingGroup = new Fl_Group(tx, ty, half_width, height,
+                                _("Preferred encoding"));
+  encodingGroup->box(FL_ENGRAVED_BOX);
+  encodingGroup->align(FL_ALIGN_LEFT | FL_ALIGN_TOP);
+
+  {
+    tx += GROUP_MARGIN;
+    ty += GROUP_MARGIN;
+
+    width = encodingGroup->w() - GROUP_MARGIN * 2;
+
+    tightButton = new Fl_Round_Button(LBLRIGHT(tx, ty,
+                                               RADIO_MIN_WIDTH,
+                                               RADIO_HEIGHT,
+                                               _("Tight")));
+    tightButton->type(FL_RADIO_BUTTON);
+    ty += RADIO_HEIGHT + TIGHT_MARGIN;
+
+    zrleButton = new Fl_Round_Button(LBLRIGHT(tx, ty,
+                                              RADIO_MIN_WIDTH,
+                                              RADIO_HEIGHT,
+                                              _("ZRLE")));
+    zrleButton->type(FL_RADIO_BUTTON);
+    ty += RADIO_HEIGHT + TIGHT_MARGIN;
+
+    hextileButton = new Fl_Round_Button(LBLRIGHT(tx, ty,
+                                                 RADIO_MIN_WIDTH,
+                                                 RADIO_HEIGHT,
+                                                 _("Hextile")));
+    hextileButton->type(FL_RADIO_BUTTON);
+    ty += RADIO_HEIGHT + TIGHT_MARGIN;
+
+    rawButton = new Fl_Round_Button(LBLRIGHT(tx, ty,
+                                             RADIO_MIN_WIDTH,
+                                             RADIO_HEIGHT,
+                                             _("Raw")));
+    rawButton->type(FL_RADIO_BUTTON);
+    ty += RADIO_HEIGHT + TIGHT_MARGIN;
+  }
+
+  ty += GROUP_MARGIN - TIGHT_MARGIN;
+
+  encodingGroup->end();
+
+  /* Second column */
+  tx = orig_tx + half_width + INNER_MARGIN;
+  ty = orig_ty;
+
+  /* Color box */
+  ty += GROUP_LABEL_OFFSET;
+  height = GROUP_MARGIN * 2 + TIGHT_MARGIN * 3 + RADIO_HEIGHT * 4;
+  colorlevelGroup = new Fl_Group(tx, ty, half_width, height, _("Color level"));
+  colorlevelGroup->box(FL_ENGRAVED_BOX);
+  colorlevelGroup->align(FL_ALIGN_LEFT | FL_ALIGN_TOP);
+
+  {
+    tx += GROUP_MARGIN;
+    ty += GROUP_MARGIN;
+
+    width = colorlevelGroup->w() - GROUP_MARGIN * 2;
+
+    fullcolorCheckbox = new Fl_Round_Button(LBLRIGHT(tx, ty,
+                                                     RADIO_MIN_WIDTH,
+                                                     RADIO_HEIGHT,
+                                                     _("Full (all available 
colors)")));
+    fullcolorCheckbox->type(FL_RADIO_BUTTON);
+    ty += RADIO_HEIGHT + TIGHT_MARGIN;
+
+    mediumcolorCheckbox = new Fl_Round_Button(LBLRIGHT(tx, ty,
+                                                       RADIO_MIN_WIDTH,
+                                                       RADIO_HEIGHT,
+                                                       _("Medium (256 
colors)")));
+    mediumcolorCheckbox->type(FL_RADIO_BUTTON);
+    ty += RADIO_HEIGHT + TIGHT_MARGIN;
+
+    lowcolorCheckbox = new Fl_Round_Button(LBLRIGHT(tx, ty,
+                                                    RADIO_MIN_WIDTH,
+                                                    RADIO_HEIGHT,
+                                                    _("Low (64 colors)")));
+    lowcolorCheckbox->type(FL_RADIO_BUTTON);
+    ty += RADIO_HEIGHT + TIGHT_MARGIN;
+
+    verylowcolorCheckbox = new Fl_Round_Button(LBLRIGHT(tx, ty,
+                                                        RADIO_MIN_WIDTH,
+                                                        RADIO_HEIGHT,
+                                                        _("Very low (8 
colors)")));
+    verylowcolorCheckbox->type(FL_RADIO_BUTTON);
+    ty += RADIO_HEIGHT + TIGHT_MARGIN;
+  }
+
+  ty += GROUP_MARGIN - TIGHT_MARGIN;
+
+  colorlevelGroup->end();
+
+  /* Back to normal */
+  tx = orig_tx;
+  ty += INNER_MARGIN;
+
+  /* Checkboxes */
+  compressionCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                     CHECK_MIN_WIDTH,
+                                                     CHECK_HEIGHT,
+                                                     _("Custom compression 
level:")));
+  compressionCheckbox->callback(handleCompression, this);
+  ty += CHECK_HEIGHT + TIGHT_MARGIN;
+
+  compressionInput = new Fl_Int_Input(tx + INDENT, ty,
+                                      INPUT_HEIGHT, INPUT_HEIGHT,
+                                      _("level (1=fast, 9=best)"));
+  compressionInput->align(FL_ALIGN_RIGHT);
+  ty += INPUT_HEIGHT + INNER_MARGIN;
+
+  jpegCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                              CHECK_MIN_WIDTH,
+                                              CHECK_HEIGHT,
+                                              _("Allow JPEG compression:")));
+  jpegCheckbox->callback(handleJpeg, this);
+  ty += CHECK_HEIGHT + TIGHT_MARGIN;
+
+  jpegInput = new Fl_Int_Input(tx + INDENT, ty,
+                               INPUT_HEIGHT, INPUT_HEIGHT,
+                               _("quality (1=poor, 9=best)"));
+  jpegInput->align(FL_ALIGN_RIGHT);
+  ty += INPUT_HEIGHT + INNER_MARGIN;
+
+  group->end();
+}
+
+
+void OptionsDialog::createSecurityPage(int tx, int ty, int tw, int th)
+{
+#ifdef HAVE_GNUTLS
+  Fl_Group *group = new Fl_Group(tx, ty, tw, th, _("Security"));
+
+  int orig_tx;
+  int width, height;
+
+  tx += OUTER_MARGIN;
+  ty += OUTER_MARGIN;
+
+  width = tw - OUTER_MARGIN * 2;
+
+  orig_tx = tx;
+
+  /* Security */
+  vencryptCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                  CHECK_MIN_WIDTH,
+                                                  CHECK_HEIGHT,
+                                                  _("Extended encryption and 
authentication methods (VeNCrypt)")));
+  vencryptCheckbox->callback(handleVencrypt, this);
+  ty += CHECK_HEIGHT + INNER_MARGIN;
+
+  /* Encryption */
+  ty += GROUP_LABEL_OFFSET;
+  height = GROUP_MARGIN * 2 + TIGHT_MARGIN * 4 + CHECK_HEIGHT * 3 + 
(INPUT_LABEL_OFFSET + INPUT_HEIGHT) * 2;
+  encryptionGroup = new Fl_Group(tx, ty, width, height, _("Encryption"));
+  encryptionGroup->box(FL_ENGRAVED_BOX);
+  encryptionGroup->align(FL_ALIGN_LEFT | FL_ALIGN_TOP);
+
+  {
+    tx += GROUP_MARGIN;
+    ty += GROUP_MARGIN;
+
+    encNoneCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                   CHECK_MIN_WIDTH,
+                                                   CHECK_HEIGHT,
+                                                   _("None")));
+    ty += CHECK_HEIGHT + TIGHT_MARGIN;
+
+    encTLSCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                  CHECK_MIN_WIDTH,
+                                                  CHECK_HEIGHT,
+                                                  _("TLS with anonymous 
certificates")));
+    ty += CHECK_HEIGHT + TIGHT_MARGIN;
+
+    encX509Checkbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                   CHECK_MIN_WIDTH,
+                                                   CHECK_HEIGHT,
+                                                   _("TLS with X509 
certificates")));
+    encX509Checkbox->callback(handleX509, this);
+    ty += CHECK_HEIGHT + TIGHT_MARGIN;
+
+    ty += INPUT_LABEL_OFFSET;
+    caInput = new Fl_Input(tx + INDENT, ty, 
+                           width - GROUP_MARGIN*2 - INDENT, INPUT_HEIGHT,
+                           _("Path to X509 CA certificate"));
+    caInput->align(FL_ALIGN_LEFT | FL_ALIGN_TOP);
+    ty += INPUT_HEIGHT + TIGHT_MARGIN;
+
+    ty += INPUT_LABEL_OFFSET;
+    crlInput = new Fl_Input(tx + INDENT, ty,
+                            width - GROUP_MARGIN*2 - INDENT, INPUT_HEIGHT,
+                            _("Path to X509 CRL file"));
+    crlInput->align(FL_ALIGN_LEFT | FL_ALIGN_TOP);
+    ty += INPUT_HEIGHT + TIGHT_MARGIN;
+  }
+
+  ty += GROUP_MARGIN - TIGHT_MARGIN;
+
+  encryptionGroup->end();
+
+  /* Back to normal */
+  tx = orig_tx;
+  ty += INNER_MARGIN;
+
+  /* Authentication */
+  /* Encryption */
+  ty += GROUP_LABEL_OFFSET;
+  height = GROUP_MARGIN * 2 + TIGHT_MARGIN * 2 + CHECK_HEIGHT * 3;
+  authenticationGroup = new Fl_Group(tx, ty, width, height, 
_("Authentication"));
+  authenticationGroup->box(FL_ENGRAVED_BOX);
+  authenticationGroup->align(FL_ALIGN_LEFT | FL_ALIGN_TOP);
+
+  {
+    tx += GROUP_MARGIN;
+    ty += GROUP_MARGIN;
+
+    authNoneCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                    CHECK_MIN_WIDTH,
+                                                    CHECK_HEIGHT,
+                                                    _("None")));
+    ty += CHECK_HEIGHT + TIGHT_MARGIN;
+
+    authVncCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                   CHECK_MIN_WIDTH,
+                                                   CHECK_HEIGHT,
+                                                   _("Standard VNC (insecure 
without encryption)")));
+    ty += CHECK_HEIGHT + TIGHT_MARGIN;
+
+    authPlainCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                     CHECK_MIN_WIDTH,
+                                                     CHECK_HEIGHT,
+                                                     _("Username and password 
(insecure without encryption)")));
+    ty += CHECK_HEIGHT + TIGHT_MARGIN;
+  }
+
+  ty += GROUP_MARGIN - TIGHT_MARGIN;
+
+  authenticationGroup->end();
+
+  /* Back to normal */
+  tx = orig_tx;
+  ty += INNER_MARGIN;
+
+  group->end();
+#endif
+}
+
+
+void OptionsDialog::createInputPage(int tx, int ty, int tw, int th)
+{
+  Fl_Group *group = new Fl_Group(tx, ty, tw, th, _("Input"));
+
+  tx += OUTER_MARGIN;
+  ty += OUTER_MARGIN;
+
+  viewOnlyCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                  CHECK_MIN_WIDTH,
+                                                  CHECK_HEIGHT,
+                                                  _("View only (ignore mouse 
and keyboard)")));
+  ty += CHECK_HEIGHT + TIGHT_MARGIN;
+
+  acceptClipboardCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                         CHECK_MIN_WIDTH,
+                                                         CHECK_HEIGHT,
+                                                         _("Accept clipboard 
from server")));
+  ty += CHECK_HEIGHT + TIGHT_MARGIN;
+
+  sendClipboardCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                       CHECK_MIN_WIDTH,
+                                                       CHECK_HEIGHT,
+                                                       _("Send clipboard to 
server")));
+  ty += CHECK_HEIGHT + TIGHT_MARGIN;
+
+  sendPrimaryCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                     CHECK_MIN_WIDTH,
+                                                     CHECK_HEIGHT,
+                                                     _("Send primary selection 
and cut buffer as clipboard")));
+  ty += CHECK_HEIGHT + TIGHT_MARGIN;
+
+  group->end();
+}
+
+
+void OptionsDialog::createMiscPage(int tx, int ty, int tw, int th)
+{
+  Fl_Group *group = new Fl_Group(tx, ty, tw, th, _("Misc."));
+
+  tx += OUTER_MARGIN;
+  ty += OUTER_MARGIN;
+
+  sharedCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                  CHECK_MIN_WIDTH,
+                                                  CHECK_HEIGHT,
+                                                  _("Shared (don't disconnect 
other viewers)")));
+  ty += CHECK_HEIGHT + TIGHT_MARGIN;
+
+  fullScreenCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                  CHECK_MIN_WIDTH,
+                                                  CHECK_HEIGHT,
+                                                  _("Full-screen mode")));
+  ty += CHECK_HEIGHT + TIGHT_MARGIN;
+
+  localCursorCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                  CHECK_MIN_WIDTH,
+                                                  CHECK_HEIGHT,
+                                                  _("Render cursor locally")));
+  ty += CHECK_HEIGHT + TIGHT_MARGIN;
+
+  dotCursorCheckbox = new Fl_Check_Button(LBLRIGHT(tx, ty,
+                                                  CHECK_MIN_WIDTH,
+                                                  CHECK_HEIGHT,
+                                                  _("Show dot when no 
cursor")));
+  ty += CHECK_HEIGHT + TIGHT_MARGIN;
+
+  group->end();
+}
+
+
+void OptionsDialog::handleAutoselect(Fl_Widget *widget, void *data)
+{
+  OptionsDialog *dialog = (OptionsDialog*)data;
+
+  if (dialog->autoselectCheckbox->value()) {
+    dialog->encodingGroup->deactivate();
+    dialog->colorlevelGroup->deactivate();
+  } else {
+    dialog->encodingGroup->activate();
+    dialog->colorlevelGroup->activate();
+  }
+
+  // JPEG setting is also affected by autoselection
+  dialog->handleJpeg(dialog->jpegCheckbox, dialog);
+}
+
+
+void OptionsDialog::handleCompression(Fl_Widget *widget, void *data)
+{
+  OptionsDialog *dialog = (OptionsDialog*)data;
+
+  if (dialog->compressionCheckbox->value())
+    dialog->compressionInput->activate();
+  else
+    dialog->compressionInput->deactivate();
+}
+
+
+void OptionsDialog::handleJpeg(Fl_Widget *widget, void *data)
+{
+  OptionsDialog *dialog = (OptionsDialog*)data;
+
+  if (dialog->jpegCheckbox->value() &&
+      !dialog->autoselectCheckbox->value())
+    dialog->jpegInput->activate();
+  else
+    dialog->jpegInput->deactivate();
+}
+
+
+void OptionsDialog::handleVencrypt(Fl_Widget *widget, void *data)
+{
+  OptionsDialog *dialog = (OptionsDialog*)data;
+
+  if (dialog->vencryptCheckbox->value()) {
+    dialog->encryptionGroup->activate();
+    dialog->authPlainCheckbox->activate();
+  } else {
+    dialog->encryptionGroup->deactivate();
+    dialog->authPlainCheckbox->deactivate();
+  }
+}
+
+
+void OptionsDialog::handleX509(Fl_Widget *widget, void *data)
+{
+  OptionsDialog *dialog = (OptionsDialog*)data;
+
+  if (dialog->encX509Checkbox->value()) {
+    dialog->caInput->activate();
+    dialog->crlInput->activate();
+  } else {
+    dialog->caInput->deactivate();
+    dialog->crlInput->deactivate();
+  }
+}
+
+
+void OptionsDialog::handleCancel(Fl_Widget *widget, void *data)
+{
+  OptionsDialog *dialog = (OptionsDialog*)data;
+
+  dialog->hide();
+}
+
+
+void OptionsDialog::handleOK(Fl_Widget *widget, void *data)
+{
+  OptionsDialog *dialog = (OptionsDialog*)data;
+
+  dialog->hide();
+
+  dialog->storeOptions();
+}

Added: trunk/vncviewer/OptionsDialog.h
===================================================================
--- trunk/vncviewer/OptionsDialog.h                             (rev 0)
+++ trunk/vncviewer/OptionsDialog.h     2011-05-16 12:04:43 UTC (rev 4416)
@@ -0,0 +1,106 @@
+/* Copyright 2011 Pierre Ossman <oss...@cendio.se> for Cendio AB
+ * 
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+#ifndef __OPTIONSDIALOG_H__
+#define __OPTIONSDIALOG_H__
+
+#include <FL/Fl_Window.H>
+#include <FL/Fl_Group.H>
+#include <FL/Fl_Check_Button.H>
+#include <FL/Fl_Round_Button.H>
+#include <FL/Fl_Int_Input.H>
+
+class OptionsDialog : public Fl_Window {
+protected:
+  OptionsDialog();
+  ~OptionsDialog();
+
+public:
+  static void showDialog(void);
+
+  void show(void);
+
+protected:
+  void loadOptions(void);
+  void storeOptions(void);
+
+  void createCompressionPage(int tx, int ty, int tw, int th);
+  void createSecurityPage(int tx, int ty, int tw, int th);
+  void createInputPage(int tx, int ty, int tw, int th);
+  void createMiscPage(int tx, int ty, int tw, int th);
+
+  static void handleAutoselect(Fl_Widget *widget, void *data);
+  static void handleCompression(Fl_Widget *widget, void *data);
+  static void handleJpeg(Fl_Widget *widget, void *data);
+
+  static void handleVencrypt(Fl_Widget *widget, void *data);
+  static void handleX509(Fl_Widget *widget, void *data);
+
+  static void handleCancel(Fl_Widget *widget, void *data);
+  static void handleOK(Fl_Widget *widget, void *data);
+
+protected:
+  /* Compression */
+  Fl_Check_Button *autoselectCheckbox;
+
+  Fl_Group *encodingGroup;
+  Fl_Round_Button *tightButton;
+  Fl_Round_Button *zrleButton;
+  Fl_Round_Button *hextileButton;
+  Fl_Round_Button *rawButton;
+
+  Fl_Group *colorlevelGroup;
+  Fl_Round_Button *fullcolorCheckbox;
+  Fl_Round_Button *mediumcolorCheckbox;
+  Fl_Round_Button *lowcolorCheckbox;
+  Fl_Round_Button *verylowcolorCheckbox;
+
+  Fl_Check_Button *compressionCheckbox;
+  Fl_Check_Button *jpegCheckbox;
+  Fl_Int_Input *compressionInput;
+  Fl_Int_Input *jpegInput;
+
+  /* Security */
+  Fl_Check_Button *vencryptCheckbox;
+
+  Fl_Group *encryptionGroup;
+  Fl_Check_Button *encNoneCheckbox;
+  Fl_Check_Button *encTLSCheckbox;
+  Fl_Check_Button *encX509Checkbox;
+  Fl_Input *caInput;
+  Fl_Input *crlInput;
+
+  Fl_Group *authenticationGroup;
+  Fl_Check_Button *authNoneCheckbox;
+  Fl_Check_Button *authVncCheckbox;
+  Fl_Check_Button *authPlainCheckbox;
+
+  /* Input */
+  Fl_Check_Button *viewOnlyCheckbox;
+  Fl_Check_Button *acceptClipboardCheckbox;
+  Fl_Check_Button *sendClipboardCheckbox;
+  Fl_Check_Button *sendPrimaryCheckbox;
+
+  /* Misc. */
+  Fl_Check_Button *sharedCheckbox;
+  Fl_Check_Button *fullScreenCheckbox;
+  Fl_Check_Button *localCursorCheckbox;
+  Fl_Check_Button *dotCursorCheckbox;
+};
+
+#endif

Modified: trunk/vncviewer/ServerDialog.cxx
===================================================================
--- trunk/vncviewer/ServerDialog.cxx    2011-05-16 12:00:20 UTC (rev 4415)
+++ trunk/vncviewer/ServerDialog.cxx    2011-05-16 12:04:43 UTC (rev 4416)
@@ -23,6 +23,8 @@
 #include <FL/fl_draw.H>
 
 #include "ServerDialog.h"
+#include "OptionsDialog.h"
+#include "fltk_layout.h"
 #include "i18n.h"
 
 extern void about_vncviewer();
@@ -33,8 +35,7 @@
   int width;
   Fl_Button *button;
 
-  fl_font(FL_HELVETICA, FL_NORMAL_SIZE);
-  width = fl_width(_("VNC server:"));
+  width = gui_str_len(_("VNC server:"));
   serverName = new Fl_Input(20 + width, 20, w() - 20*2 - width, 25, _("VNC 
server:"));
 
   width = (w() - 20) / 4;
@@ -42,6 +43,9 @@
   button = new Fl_Button(20 + width*0, 20+25+20, width - 20, 27, 
_("About..."));
   button->callback(this->handleAbout, this);
 
+  button = new Fl_Button(20 + width*1, 20+25+20, width - 20, 27, 
_("Options..."));
+  button->callback(this->handleOptions, this);
+
   button = new Fl_Button(20 + width*2, 20+25+20, width - 20, 27, _("Cancel"));
   button->callback(this->handleCancel, this);
 
@@ -83,6 +87,12 @@
 }
 
 
+void ServerDialog::handleOptions(Fl_Widget *widget, void *data)
+{
+  OptionsDialog::showDialog();
+}
+
+
 void ServerDialog::handleCancel(Fl_Widget *widget, void *data)
 {
   ServerDialog *dialog = (ServerDialog*)data;

Modified: trunk/vncviewer/ServerDialog.h
===================================================================
--- trunk/vncviewer/ServerDialog.h      2011-05-16 12:00:20 UTC (rev 4415)
+++ trunk/vncviewer/ServerDialog.h      2011-05-16 12:04:43 UTC (rev 4416)
@@ -32,6 +32,7 @@
 
 protected:
   static void handleAbout(Fl_Widget *widget, void *data);
+  static void handleOptions(Fl_Widget *widget, void *data);
   static void handleCancel(Fl_Widget *widget, void *data);
   static void handleOK(Fl_Widget *widget, void *data);
 

Modified: trunk/vncviewer/Viewport.cxx
===================================================================
--- trunk/vncviewer/Viewport.cxx        2011-05-16 12:00:20 UTC (rev 4415)
+++ trunk/vncviewer/Viewport.cxx        2011-05-16 12:04:43 UTC (rev 4416)
@@ -35,6 +35,7 @@
 
 #include "Viewport.h"
 #include "CConn.h"
+#include "OptionsDialog.h"
 #include "i18n.h"
 #include "parameters.h"
 #include "keysym2ucs.h"
@@ -53,7 +54,7 @@
 // Menu constants
 
 enum { ID_EXIT, ID_CTRL, ID_ALT, ID_MENUKEY, ID_CTRLALTDEL,
-       ID_REFRESH, ID_ABOUT, ID_DISMISS };
+       ID_REFRESH, ID_OPTIONS, ID_ABOUT, ID_DISMISS };
 
 Viewport::Viewport(int w, int h, const rfb::PixelFormat& serverPF, CConn* cc_)
   : Fl_Widget(0, 0, w, h), cc(cc_), frameBuffer(NULL), pixelTrans(NULL),
@@ -450,6 +451,7 @@
 
   contextMenu->add(_("Refresh screen"), 0, NULL, (void*)ID_REFRESH, 
FL_MENU_DIVIDER);
 
+  contextMenu->add(_("Options..."), 0, NULL, (void*)ID_OPTIONS, 0);
   contextMenu->add(_("About TigerVNC viewer..."), 0, NULL, (void*)ID_ABOUT, 
FL_MENU_DIVIDER);
 
   contextMenu->add(_("Dismiss menu"), 0, NULL, (void*)ID_DISMISS, 0);
@@ -498,6 +500,9 @@
   case ID_REFRESH:
     cc->refreshFramebuffer();
     break;
+  case ID_OPTIONS:
+    OptionsDialog::showDialog();
+    break;
   case ID_ABOUT:
     about_vncviewer();
     break;

Added: trunk/vncviewer/fltk_layout.h
===================================================================
--- trunk/vncviewer/fltk_layout.h                               (rev 0)
+++ trunk/vncviewer/fltk_layout.h       2011-05-16 12:04:43 UTC (rev 4416)
@@ -0,0 +1,86 @@
+/* Copyright 2011 Pierre Ossman <oss...@cendio.se> for Cendio AB
+ * 
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+#ifndef __FLTK_LAYOUT_H__
+#define __FLTK_LAYOUT_H__
+
+#include <FL/fl_draw.H>
+
+/* Calculates the width of a string as printed by FLTK (pixels) */
+static inline int gui_str_len(const char *str)
+{
+    float len;
+
+    fl_font(FL_HELVETICA, FL_NORMAL_SIZE);
+
+    len = fl_width(str);
+
+    return (int)(len + 0.5f);
+}
+
+/**** MARGINS ****/
+
+#define OUTER_MARGIN            10
+#define INNER_MARGIN            10
+
+/* Tighter grouping of related fields */
+#define TIGHT_MARGIN            5
+
+/**** ADJUSTMENTS ****/
+#define INDENT                  20
+
+/**** FLTK WIDGETS ****/
+
+/* Fl_Tabs */
+#define TABS_HEIGHT             30
+
+/* Fl_Input */
+#define INPUT_LABEL_OFFSET      FL_NORMAL_SIZE
+#define INPUT_HEIGHT            25
+
+/* Fl_Button */
+#define BUTTON_WIDTH            115
+#define BUTTON_HEIGHT           27
+
+/* Fl_Round_Button */
+#define RADIO_MIN_WIDTH         (FL_NORMAL_SIZE + 5)
+#define RADIO_HEIGHT            (FL_NORMAL_SIZE + 7)
+
+/* Fl_Check_Button */
+#define CHECK_MIN_WIDTH         RADIO_MIN_WIDTH
+#define CHECK_HEIGHT            RADIO_HEIGHT
+
+/* Fl_Group */
+#define GROUP_LABEL_OFFSET      FL_NORMAL_SIZE
+#define GROUP_MARGIN            12
+
+/**** HELPERS FOR DYNAMIC TEXT ****/
+
+/* Extra space to add after any text line */
+#define TEXT_PADDING            2
+
+/* Use this when the text extends to the right (e.g. checkboxes) */
+#define LBLRIGHT(x, y, w, h, str) \
+    (x), (y), (w) + gui_str_len(str) + TEXT_PADDING, (h), (str)
+
+/* Use this when the space for the label is taken from the left (e.g. input) */
+#define LBLLEFT(x, y, w, h, str) \
+    (x) + (gui_str_len(str) + TEXT_PADDING), (y), \
+    (w) - (gui_str_len(str) + TEXT_PADDING), (h), (str)
+
+#endif


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Achieve unprecedented app performance and reliability
What every C/C++ and Fortran developer should know.
Learn how Intel has extended the reach of its next-generation tools
to help boost performance applications - inlcuding clusters.
http://p.sf.net/sfu/intel-dev2devmay
_______________________________________________
Tigervnc-commits mailing list
Tigervnc-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tigervnc-commits

Reply via email to