summaryrefslogtreecommitdiffstats
path: root/vncviewer/ServerDialog.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vncviewer/ServerDialog.cxx')
-rw-r--r--vncviewer/ServerDialog.cxx169
1 files changed, 152 insertions, 17 deletions
diff --git a/vncviewer/ServerDialog.cxx b/vncviewer/ServerDialog.cxx
index 4f21eb1c..25a010a1 100644
--- a/vncviewer/ServerDialog.cxx
+++ b/vncviewer/ServerDialog.cxx
@@ -1,4 +1,5 @@
/* Copyright 2011 Pierre Ossman <ossman@cendio.se> for Cendio AB
+ * Copyright 2012 Samuel Mannehed <samuel@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
@@ -25,35 +26,75 @@
#include <FL/Fl_Button.H>
#include <FL/Fl_Return_Button.H>
#include <FL/fl_draw.H>
+#include <FL/fl_ask.H>
+#include <FL/Fl_Box.H>
+#include <FL/Fl_File_Chooser.H>
#include "ServerDialog.h"
#include "OptionsDialog.h"
#include "fltk_layout.h"
#include "i18n.h"
#include "vncviewer.h"
+#include "parameters.h"
+#include "rfb/Exception.h"
ServerDialog::ServerDialog()
- : Fl_Window(400, 112, _("VNC Viewer: Connection Details"))
+ : Fl_Window(450, 160, _("VNC Viewer: Connection Details"))
{
- int width;
+ int x, y;
Fl_Button *button;
+ Fl_Box *divider;
- width = gui_str_len(_("VNC server:"));
- serverName = new Fl_Input(20 + width, 20, w() - 20*2 - width, 25, _("VNC server:"));
+ int margin = 20;
+ int server_label_width = gui_str_len(_("VNC server:"));
- width = (w() - 20) / 4;
+ x = margin + server_label_width;
+ y = margin;
+
+ serverName = new Fl_Input(x, y, w() - margin*2 - server_label_width, INPUT_HEIGHT, _("VNC server:"));
- button = new Fl_Button(20 + width*0, 20+25+20, width - 20, 27, _("About..."));
- button->callback(this->handleAbout, this);
+ int adjust = (w() - 20) / 4;
+ int button_width = adjust - margin/2;
+
+ x = margin;
+ y = margin + margin/2 + INPUT_HEIGHT;
+
+ y += margin/2;
- button = new Fl_Button(20 + width*1, 20+25+20, width - 20, 27, _("Options..."));
+ button = new Fl_Button(x, y, button_width, BUTTON_HEIGHT, _("Options..."));
button->callback(this->handleOptions, this);
+
+ x += adjust;
+
+ button = new Fl_Button(x, y, button_width, BUTTON_HEIGHT, _("Load..."));
+ button->callback(this->handleLoad, this);
+
+ x += adjust;
+
+ button = new Fl_Button(x, y, button_width, BUTTON_HEIGHT, _("Save As..."));
+ button->callback(this->handleSaveAs, this);
+
+ x = 0;
+ y += margin/2 + BUTTON_HEIGHT;
+
+ divider = new Fl_Box(x, y, w(), 2);
+ divider->box(FL_THIN_DOWN_FRAME);
+
+ x += margin;
+ y += margin/2;
+
+ button = new Fl_Button(x, y, button_width, BUTTON_HEIGHT, _("About..."));
+ button->callback(this->handleAbout, this);
+
+ x = w() - margin - adjust - button_width - 20;
- button = new Fl_Button(20 + width*2, 20+25+20, width - 20, 27, _("Cancel"));
+ button = new Fl_Button(x, y, button_width, BUTTON_HEIGHT, _("Cancel"));
button->callback(this->handleCancel, this);
- button = new Fl_Return_Button(20 + width*3, 20+25+20, width - 20, 27, _("OK"));
- button->callback(this->handleOK, this);
+ x += adjust;
+
+ button = new Fl_Return_Button(x, y, button_width+20, BUTTON_HEIGHT, _("Connect"));
+ button->callback(this->handleConnect, this);
callback(this->handleCancel, this);
@@ -66,11 +107,13 @@ ServerDialog::~ServerDialog()
}
-const char *ServerDialog::run()
+const char *ServerDialog::run(const char* servername)
{
ServerDialog dialog;
static char buffer[256];
+ dialog.serverName->value(servername);
+
dialog.show();
while (dialog.shown()) Fl::wait();
@@ -83,16 +126,101 @@ const char *ServerDialog::run()
return buffer;
}
+void ServerDialog::handleOptions(Fl_Widget *widget, void *data)
+{
+ OptionsDialog::showDialog();
+}
-void ServerDialog::handleAbout(Fl_Widget *widget, void *data)
+
+void ServerDialog::handleLoad(Fl_Widget *widget, void *data)
{
- about_vncviewer();
+ ServerDialog *dialog = (ServerDialog*)data;
+ Fl_File_Chooser* file_chooser = new Fl_File_Chooser("", "TigerVNC configuration (*.tigervnc)",
+ 0, "Select a TigerVNC configuration file");
+ file_chooser->preview(0);
+ file_chooser->previewButton->hide();
+ file_chooser->show();
+
+ // Block until user picks something.
+ while(file_chooser->shown())
+ Fl::wait();
+
+ // Did the user hit cancel?
+ if (file_chooser->value() == NULL) {
+ delete(file_chooser);
+ return;
+ }
+
+ const char* filename = strdup(file_chooser->value());
+
+ try {
+ dialog->serverName->value(loadViewerParameters(filename));
+ } catch (rfb::Exception& e) {
+ fl_alert("%s", e.str());
+ }
+
+ delete(file_chooser);
}
-void ServerDialog::handleOptions(Fl_Widget *widget, void *data)
+void ServerDialog::handleSaveAs(Fl_Widget *widget, void *data)
+{
+ ServerDialog *dialog = (ServerDialog*)data;
+ const char* servername = strdup(dialog->serverName->value());
+ char* filename;
+
+ Fl_File_Chooser* file_chooser = new Fl_File_Chooser("", "TigerVNC configuration (*.tigervnc)",
+ 2, "Save the TigerVNC configuration to file");
+
+ file_chooser->preview(0);
+ file_chooser->previewButton->hide();
+ file_chooser->show();
+
+ while(1) {
+
+ // Block until user picks something.
+ while(file_chooser->shown())
+ Fl::wait();
+
+ // Did the user hit cancel?
+ if (file_chooser->value() == NULL) {
+ delete(file_chooser);
+ return;
+ }
+
+ filename = strdup(file_chooser->value());
+
+ FILE* f = fopen(filename, "r");
+ if (f) {
+
+ // The file already exists.
+ fclose(f);
+ int overwrite_choice = fl_choice("%s already exists. Do you want to overwrite?",
+ "Overwrite", "No", NULL, filename);
+ if (overwrite_choice == 1) {
+
+ // If the user doesn't want to overwrite:
+ file_chooser->show();
+ continue;
+ }
+ }
+
+ break;
+ }
+
+ try {
+ saveViewerParameters(filename, servername);
+ } catch (rfb::Exception& e) {
+ fl_alert("%s", e.str());
+ }
+
+ delete(file_chooser);
+}
+
+
+void ServerDialog::handleAbout(Fl_Widget *widget, void *data)
{
- OptionsDialog::showDialog();
+ about_vncviewer();
}
@@ -105,9 +233,16 @@ void ServerDialog::handleCancel(Fl_Widget *widget, void *data)
}
-void ServerDialog::handleOK(Fl_Widget *widget, void *data)
+void ServerDialog::handleConnect(Fl_Widget *widget, void *data)
{
ServerDialog *dialog = (ServerDialog*)data;
+ const char* servername = strdup(dialog->serverName->value());
dialog->hide();
+
+ try {
+ saveViewerParameters(NULL, servername);
+ } catch (rfb::Exception& e) {
+ fl_alert("%s", e.str());
+ }
}