/* 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 * 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. */ #ifdef HAVE_CONFIG_H #include <config.h> #endif #include <errno.h> #include <algorithm> #include <libgen.h> // FIXME: Workaround for FLTK including windows.h #ifdef WIN32 #include <winsock2.h> #endif #include <FL/Fl.H> #include <FL/Fl_Input.H> #include <FL/Fl_Input_Choice.H> #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 <core/Exception.h> #include <core/LogWriter.h> #include <core/string.h> #include <core/xdgdirs.h> #include <network/TcpSocket.h> #include "fltk/layout.h" #include "fltk/util.h" #include "ServerDialog.h" #include "OptionsDialog.h" #include "i18n.h" #include "vncviewer.h" #include "parameters.h" static core::LogWriter vlog("ServerDialog"); const char* SERVER_HISTORY="tigervnc.history"; ServerDialog::ServerDialog() : Fl_Window(450, 0, "TigerVNC") { int x, y, x2; Fl_Button *button; Fl_Box *divider; x = OUTER_MARGIN; y = OUTER_MARGIN; serverName = new Fl_Input_Choice(LBLLEFT(x, y, w() - OUTER_MARGIN*2, INPUT_HEIGHT, _("VNC server:"))); // Bug fix for wrong background serverName->color(FL_BACKGROUND2_COLOR); y += INPUT_HEIGHT + INNER_MARGIN; x2 = x; button = new Fl_Button(x2, y, BUTTON_WIDTH, BUTTON_HEIGHT, _("Options...")); button->callback(this->handleOptions, this); x2 += BUTTON_WIDTH + INNER_MARGIN; button = new Fl_Button(x2, y, BUTTON_WIDTH, BUTTON_HEIGHT, _("Load...")); button->callback(this->handleLoad, this); x2 += BUTTON_WIDTH + INNER_MARGIN; button = new Fl_Button(x2, y, BUTTON_WIDTH, BUTTON_HEIGHT, _("Save as...")); button->callback(this->handleSaveAs, this); x2 += BUTTON_WIDTH + INNER_MARGIN; y += BUTTON_HEIGHT + INNER_MARGIN; divider = new Fl_Box(0, y, w(), 2); divider->box(FL_THIN_DOWN_FRAME); y += divider->h() + INNER_MARGIN; // Symmetric margin around bottom button bar y += OUTER_MARGIN - INNER_MARGIN; button = new Fl_Button(x, y, BUTTON_WIDTH, BUTTON_HEIGHT, _("About...")); button->callback(this->handleAbout, this); x2 = w() - OUTER_MARGIN - BUTTON_WIDTH*2 - INNER_MARGIN*1; button = new Fl_Button(x2, y, BUTTON_WIDTH, BUTTON_HEIGHT, _("Cancel")); button->callback(this->handleCancel, this); x2 += BUTTON_WIDTH + INNER_MARGIN; button = new Fl_Return_Button(x2, y, BUTTON_WIDTH, BUTTON_HEIGHT, _("Connect")); button->callback(this->handleConnect, this); x2 += BUTTON_WIDTH + INNER_MARGIN; y += BUTTON_HEIGHT + INNER_MARGIN; /* Needed for resize to work sanely */ resizable(nullptr); h(y-INNER_MARGIN+OUTER_MARGIN); callback(this->handleCancel, this); } ServerDialog::~ServerDialog() { } void ServerDialog::run(const char* servername, char *newservername) { ServerDialog dialog; dialog.serverName->value(servername); dialog.show(); try { dialog.loadServerHistory(); dialog.serverName->clear(); for (const std::string& entry : dialog.serverHistory) fltk_menu_add(dialog.serverName->menubutton(), entry.c_str(), 0, nullptr); } catch (std::exception& e) { vlog.error("%s", e.what()); fl_alert(_("Unable to load the server history:\n\n%s"), e.what()); } while (dialog.shown()) Fl::wait(); if (dialog.serverName->value() == nullptr) { newservername[0] = '\0'; return; } strncpy(newservername, dialog.serverName->value(), VNCSERVERNAMELEN); newservername[VNCSERVERNAMELEN - 1] = '\0'; } void ServerDialog::handleOptions(Fl_Widget* /*widget*/, void* /*data*/) { OptionsDialog::showDialog(); } void ServerDialog::handleLoad(Fl_Widget* /*widget*/, void* data) { ServerDialog *dialog = (ServerDialog*)data; if (dialog->usedDir.empty()) dialog->usedDir = core::getuserhomedir(); Fl_File_Chooser* file_chooser = new Fl_File_Chooser(dialog->usedDir.c_str(), _("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() == nullptr) { delete(file_chooser); return; } const char* filename = file_chooser->value(); dialog->updateUsedDir(filename); try { dialog->serverName->value(loadViewerParameters(filename)); } catch (std::exception& e) { vlog.error("%s", e.what()); fl_alert(_("Unable to load the specified configuration file:\n\n%s"), e.what()); } delete(file_chooser); } void ServerDialog::handleSaveAs(Fl_Widget* /*widget*/, void* data) { ServerDialog *dialog = (ServerDialog*)data; const char* servername = dialog->serverName->value(); const char* filename; if (dialog->usedDir.empty()) dialog->usedDir = core::getuserhomedir(); Fl_File_Chooser* file_chooser = new Fl_File_Chooser(dialog->usedDir.c_str(), _("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() == nullptr) { delete(file_chooser); return; } filename = file_chooser->value(); dialog->updateUsedDir(filename); 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"), nullptr, filename); if (overwrite_choice == 1) { // If the user doesn't want to overwrite: file_chooser->show(); continue; } } break; } try { saveViewerParameters(filename, servername); } catch (std::exception& e) { vlog.error("%s", e.what()); fl_alert(_("Unable to save the specified configuration " "file:\n\n%s"), e.what()); } delete(file_chooser); } void ServerDialog::handleAbout(Fl_Widget* /*widget*/, void* /*data*/) { about_vncviewer(); } void ServerDialog::handleCancel(Fl_Widget* /*widget*/, void* data) { ServerDialog *dialog = (ServerDialog*)data; dialog->serverName->value(""); dialog->hide(); } void ServerDialog::handleConnect(Fl_Widget* /*widget*/, void *data) { ServerDialog *dialog = (ServerDialog*)data; const char* servername = dialog->serverName->value(); dialog->hide(); try { saveViewerParameters(nullptr, servername); } catch (std::exception&backport/50121/master backport/50121/stable30 backport/50121/stable31 backport/50123/master backport/50123/stable29 backport/50123/stable30 backport/50128/stable29 backport/50128/stable30 backport/50129/stable30 backport/50129/stable31 backport/50152/stable29 backport/50152/stable30 backport/50154/stable29 backport/50157/stable30 backport/50157/stable31 backport/50161/stable29 backport/50161/stable30 backport/50177/stable29 backport/50177/stable30 backport/50179/stable30 backport/50187/stable30 backport/50192/stable28 backport/50192/stable29 backport/50192/stable30 backport/50193/stable29 backport/50193/stable30 backport/50193/stable31 backport/50220/stable30 backport/50234/stable30 backport/50234/stable31 backport/50237/stable29 backport/50241/stable30 backport/50244/stable31 backport/50260/stable30 backport/50260/stable31 backport/50270/stable26 backport/50270/stable27 backport/50270/stable28 backport/50270/stable28-follow-up backport/50270/stable29 backport/50270/stable30 backport/50270/stable31 backport/50273/stable29 backport/50273/stable30 backport/50273/stable31 backport/50281/stable31 backport/50282/stable31 backport/50284/stable30 backport/50284/stable31 backport/50292/stable29 backport/50292/stable30 backport/50293/stable29 backport/50293/stable30 backport/50293/stable31 backport/50298/stable29 backport/50298/stable30 backport/50298/stable31 backport/50299/stable28 backport/50299/stable29 backport/50299/stable30 backport/50299/stable31 backport/50319/stable29 backport/50319/stable30 backport/50324/stable30 backport/50324/stable31 backport/50330/stable30 backport/50330/stable31 backport/50331/stable30 backport/50331/stable31 backport/50333/stable29 backport/50353/stable29 backport/50353/stable30 backport/50353/stable31 backport/50362/stable31 backport/50364/stable31 backport/50366/stable31 backport/50368/stable31 backport/50369/stable29 backport/50369/stable30 backport/50369/stable31 backport/50389/stable31 backport/50394/stable30 backport/50394/stable31 backport/50398/stable29 backport/50398/stable30 backport/50424/stable29 backport/50424/stable30 backport/50424/stable31 backport/50426/stable31 backport/50430/stable29 backport/50430/stable30 backport/50436/stable31 backport/50437/stable29 backport/50446/stable31 backport/50447/stable30 backport/50455/stable30 backport/50455/stable31 backport/50464/stable30 backport/50464/stable31 backport/50465/stable29 backport/50465/stable30 backport/50465/stable31 backport/50480/stable29 backport/50490/stable30 backport/50490/stable31 backport/50494/stable29 backport/50494/stable30 backport/50494/stable31 backport/50498/stable31 backport/50501/stable31 backport/50503/stable30 backport/50503/stable31 backport/50514/stable29 backport/50514/stable30 backport/50514/stable31 backport/50515/stable29 backport/50515/stable30 backport/50515/stable31 backport/50519/stable29 backport/50519/stable30 backport/50519/stable31 backport/50524/stable30 backport/50524/stable31 backport/50530/stable29 backport/50530/stable30 backport/50530/stable31 backport/50540/stable30 backport/50540/stable31 backport/50542/stable29 backport/50542/stable30 backport/50542/stable31 backport/50549/stable29 backport/50550/stable30 backport/50550/stable31 backport/50567/stable30 backport/50567/stable31 backport/50576/stable31 backport/50582/stable30 backport/50582/stable31 backport/50592/stable31 backport/50602/stable30 backport/50602/stable31 backport/50626/stable29 backport/50635/stable31 backport/50640/stable30 backport/50640/stable31 backport/50642/stable29 backport/50642/stable30 backport/50642/stable31 backport/50645/stable31 backport/50655/stable29 backport/50655/stable30 backport/50655/stable31 backport/50657/stable30 backport/50657/stable31 backport/50660/stable29 backport/50660/stable30 backport/50660/stable31 backport/50663/stable28 backport/50663/stable29 backport/50663/stable30 backport/50663/stable31 backport/50666/stable27 backport/50666/stable28 backport/50666/stable29 backport/50666/stable30 backport/50666/stable31 backport/50669/stable30 backport/50669/stable31 backport/50678/stable29 backport/50678/stable30 backport/50678/stable31 backport/50680/stable31 backport/50691/stable29 backport/50692/stable31 backport/50693/stable28 backport/50697/stable31 backport/50735/stable30 backport/50735/stable31 backport/50739/stable31 backport/50768/stable31 backport/50769/stable29 backport/50769/stable30 backport/50769/stable31 backport/50778/stable29 backport/50781/stable29 backport/50781/stable30 backport/50781/stable31 backport/50783/stable30 backport/50783/stable31 backport/50784/stable30 backport/50784/stable31 backport/50794/stable31 backport/50798/stable29 backport/50798/stable31 backport/50807/stable29 backport/50807/stable30 backport/50807/stable31 backport/50809/stable29 backport/50809/stable30 backport/50809/stable31 backport/50814/stable29 backport/50814/stable30 backport/50814/stable31 backport/50816/stable30 backport/50816/stable31 backport/50820/stable29 backport/50820/stable30 backport/50820/stable31 backport/50852/stable30 backport/50858/stable29 backport/50858/stable30 backport/50858/stable31 backport/50860/stable30 backport/50860/stable31 backport/50873/stable31 backport/50874/stable29 backport/50874/stable30 backport/50874/stable31 backport/50878/stable30 backport/50881/stable30 backport/50881/stable31 backport/50896/stable29 backport/50896/stable30 backport/50896/stable31 backport/50903/stable29 backport/50903/stable30 backport/50903/stable31 backport/50904/stable31 backport/50905/stable30 backport/50905/stable31 backport/50910/stable29 backport/50910/stable30 backport/50910/stable31 backport/50918/stable30 backport/50918/stable31 backport/50919/stable30 backport/50919/stable31 backport/50920/stable31 backport/50922/stable29 backport/50922/stable31 backport/50930/stable30 backport/50942/stable31 backport/50943/stable30 backport/50949/stable29 backport/50949/stable30 backport/50949/stable31 backport/50956/stable29 backport/50956/stable30 backport/50956/stable31 backport/50958/stable29 backport/50958/stable30 backport/50958/stable31 backport/50970/stable31 backport/50979/stable31 backport/50985/stable30 backport/50985/stable31 backport/50987/stable31 backport/50989/stable28 backport/50989/stable29 backport/50989/stable30 backport/50989/stable31 backport/50992/stable31 backport/51000/stable29 backport/51000/stable30 backport/51000/stable31 backport/51010-51839/stable29 backport/51010/stable29 backport/51010/stable30 backport/51010/stable31 backport/51019/stable26 backport/51019/stable27 backport/51019/stable28 backport/51019/stable29 backport/51019/stable30 backport/51019/stable31 backport/51020/stable29 backport/51020/stable30 backport/51020/stable31 backport/51031/stable31 backport/51049/stable29 backport/51049/stable30 backport/51049/stable31 backport/51050/stable28 backport/51050/stable29 backport/51050/stable30 backport/51050/stable31 backport/51051/stable25 backport/51051/stable26 backport/51051/stable27 backport/51051/stable28 backport/51051/stable29 backport/51051/stable30 backport/51051/stable31 backport/51069/stable31 backport/51071/stable30 backport/51071/stable31 backport/51073/stable29 backport/51073/stable30 backport/51073/stable31 backport/51077/stable31 backport/51079/stable31 backport/51081/stable30 backport/51081/stable31 backport/51082/stable31 backport/51108/stable29 backport/51108/stable30 backport/51108/stable31 backport/51126/stable31 backport/51130/stable28 backport/51130/stable29 backport/51130/stable30 backport/51130/stable31 backport/51131/stable30 backport/51131/stable31 backport/51132/stable30 backport/51142/stable30 backport/51142/stable31 backport/51144/stable29 backport/51144/stable30 backport/51144/stable31 backport/51146/stable29 backport/51146/stable30 backport/51146/stable31 backport/51148/stable30 backport/51148/stable31 backport/51151/stable31 backport/51152/stable31 backport/51173/master backport/51194/stable26 backport/51194/stable27 backport/51194/stable28 backport/51194/stable29 backport/51194/stable30 backport/51194/stable31 backport/51211/stable31 backport/51216/stable29 backport/51216/stable30 backport/51216/stable31 backport/51218/stable31 backport/51229/stable30 backport/51229/stable31 backport/51239/stable31 backport/51243/stable30 backport/51250/stable29 backport/51250/stable30 backport/51250/stable31 backport/51256/stable28 backport/51256/stable29 backport/51256/stable30 backport/51258/stable30 backport/51258/stable31 backport/51259/stable28 backport/51259/stable29 backport/51259/stable30 backport/51259/stable31 backport/51260/master backport/51280/stable26 backport/51280/stable27 backport/51280/stable28 backport/51280/stable29 backport/51281/stable29 backport/51285/stable29 backport/51287/stable31 backport/51302/stable30 backport/51302/stable31 backport/51309/stable31 backport/51310/stable31 backport/51320/stable29 backport/51320/stable30 backport/51320/stable31 backport/51333/stable29 backport/51333/stable30 backport/51333/stable31 backport/51336/stable30 backport/51336/stable31 backport/51361/stable26 backport/51361/stable27 backport/51361/stable28 backport/51361/stable29 backport/51361/stable30 backport/51361/stable31 backport/51364/stable29 backport/51364/stable30 backport/51364/stable31 backport/51365/stable31 backport/51378/stable31 backport/51379/stable30 backport/51379/stable31 backport/51380/stable29 backport/51380/stable30 backport/51380/stable31 backport/51384/stable29 backport/51384/stable30 backport/51384/stable31 backport/51389/stable29 backport/51389/stable30 backport/51389/stable31 backport/51394/stable31 backport/51404/stable29 backport/51404/stable30 backport/51405/stable29 backport/51405/stable30 backport/51407/stable22 backport/51407/stable23 backport/51407/stable24 backport/51407/stable25 backport/51407/stable26 backport/51407/stable27 backport/51407/stable28 backport/51418/stable30 backport/5