Browse Source

Adjust default directory for configuration file save and load

tags/v1.12.90
Johannes 2 years ago
parent
commit
6c8dc447ce
4 changed files with 69 additions and 13 deletions
  1. 25
    4
      common/os/os.cxx
  2. 14
    0
      common/os/os.h
  3. 28
    9
      vncviewer/ServerDialog.cxx
  4. 2
    0
      vncviewer/ServerDialog.h

+ 25
- 4
common/os/os.cxx View File

#include <shlobj.h> #include <shlobj.h>
#endif #endif


int getvnchomedir(char **dirp)
static int gethomedir(char **dirp, bool userDir)
{ {
#ifndef WIN32 #ifndef WIN32
char *homedir, *dir; char *homedir, *dir;
return -1; return -1;


memcpy(dir, homedir, len); memcpy(dir, homedir, len);
memcpy(dir + len, "/.vnc/\0", 7);
if (userDir)
dir[len]='\0';
else
memcpy(dir + len, "/.vnc/\0", 7);
#else #else
dir = new TCHAR[MAX_PATH]; dir = new TCHAR[MAX_PATH];
if (dir == NULL) if (dir == NULL)
return -1; return -1;


ret = SHGetSpecialFolderPath(NULL, dir, CSIDL_APPDATA, FALSE);
if (userDir)
ret = SHGetSpecialFolderPath(NULL, dir, CSIDL_PROFILE, FALSE);
else
ret = SHGetSpecialFolderPath(NULL, dir, CSIDL_APPDATA, FALSE);

if (ret == FALSE) { if (ret == FALSE) {
delete [] dir; delete [] dir;
return -1; return -1;
} }
memcpy(dir+strlen(dir), (TCHAR *)"\\vnc\\\0", 6);
if (userDir)
dir[strlen(dir)+1] = '\0';
else
memcpy(dir+strlen(dir), (TCHAR *)"\\vnc\\\0", 6);
#endif #endif
*dirp = dir; *dirp = dir;
return 0; return 0;
} }

int getvnchomedir(char **dirp)
{
return gethomedir(dirp, false);
}

int getuserhomedir(char **dirp)
{
return gethomedir(dirp, true);
}


+ 14
- 0
common/os/os.h View File

*/ */
int getvnchomedir(char **dirp); int getvnchomedir(char **dirp);


/*
* Get user home directory.
* If HOME environment variable is set then it is used.
* Otherwise home directory is obtained via getpwuid function.
*
* Note for Windows:
* This functions returns array of TCHARs, not array of chars.
*
* Returns:
* 0 - Success
* -1 - Failure
*/
int getuserhomedir(char **dirp);

#endif /* OS_OS_H */ #endif /* OS_OS_H */

+ 28
- 9
vncviewer/ServerDialog.cxx View File



#include <errno.h> #include <errno.h>
#include <algorithm> #include <algorithm>
#include <libgen.h>


#include <FL/Fl.H> #include <FL/Fl.H>
#include <FL/Fl_Input.H> #include <FL/Fl_Input.H>
y = margin; y = margin;
serverName = new Fl_Input_Choice(x, y, w() - margin*2 - server_label_width, INPUT_HEIGHT, _("VNC server:")); serverName = new Fl_Input_Choice(x, y, w() - margin*2 - server_label_width, INPUT_HEIGHT, _("VNC server:"));
usedDir = NULL;


int adjust = (w() - 20) / 4; int adjust = (w() - 20) / 4;
int button_width = adjust - margin/2; int button_width = adjust - margin/2;


ServerDialog::~ServerDialog() ServerDialog::~ServerDialog()
{ {
if (usedDir)
free(usedDir);
} }




void ServerDialog::handleLoad(Fl_Widget *widget, void *data) void ServerDialog::handleLoad(Fl_Widget *widget, void *data)
{ {
ServerDialog *dialog = (ServerDialog*)data; ServerDialog *dialog = (ServerDialog*)data;
Fl_File_Chooser* file_chooser = new Fl_File_Chooser("", _("TigerVNC configuration (*.tigervnc)"),
0, _("Select a TigerVNC configuration file"));

if (!dialog->usedDir)
getuserhomedir(&(dialog->usedDir));

Fl_File_Chooser* file_chooser = new Fl_File_Chooser(dialog->usedDir, _("TigerVNC configuration (*.tigervnc)"),
0, _("Select a TigerVNC configuration file"));
file_chooser->preview(0); file_chooser->preview(0);
file_chooser->previewButton->hide(); file_chooser->previewButton->hide();
file_chooser->show(); file_chooser->show();
} }
const char* filename = file_chooser->value(); const char* filename = file_chooser->value();
dialog->updateUsedDir(filename);


try { try {
dialog->serverName->value(loadViewerParameters(filename)); dialog->serverName->value(loadViewerParameters(filename));
ServerDialog *dialog = (ServerDialog*)data; ServerDialog *dialog = (ServerDialog*)data;
const char* servername = dialog->serverName->value(); const char* servername = dialog->serverName->value();
const char* filename; const char* filename;

Fl_File_Chooser* file_chooser = new Fl_File_Chooser("", _("TigerVNC configuration (*.tigervnc)"),
2, _("Save the TigerVNC configuration to file"));
if (!dialog->usedDir)
getuserhomedir(&dialog->usedDir);
Fl_File_Chooser* file_chooser = new Fl_File_Chooser(dialog->usedDir, _("TigerVNC configuration (*.tigervnc)"),
2, _("Save the TigerVNC configuration to file"));
file_chooser->preview(0); file_chooser->preview(0);
file_chooser->previewButton->hide(); file_chooser->previewButton->hide();
} }
filename = file_chooser->value(); filename = file_chooser->value();
dialog->updateUsedDir(filename);
FILE* f = fopen(filename, "r"); FILE* f = fopen(filename, "r");
if (f) { if (f) {
// The file already exists. // The file already exists.
fclose(f); fclose(f);
int overwrite_choice = fl_choice(_("%s already exists. Do you want to overwrite?"), int overwrite_choice = fl_choice(_("%s already exists. Do you want to overwrite?"),
_("Overwrite"), _("No"), NULL, filename);
_("Overwrite"), _("No"), NULL, filename);
if (overwrite_choice == 1) { if (overwrite_choice == 1) {


// If the user doesn't want to overwrite:
file_chooser->show();
continue;
// If the user doesn't want to overwrite:
file_chooser->show();
continue;
} }
} }




fclose(f); fclose(f);
} }

void ServerDialog::updateUsedDir(const char* filename)
{
char * name = strdup(filename);
usedDir = strdup(dirname(name));
free(name);
}

+ 2
- 0
vncviewer/ServerDialog.h View File

private: private:
void loadServerHistory(); void loadServerHistory();
void saveServerHistory(); void saveServerHistory();
void updateUsedDir(const char* filename);


protected: protected:
Fl_Input_Choice *serverName; Fl_Input_Choice *serverName;
std::vector<std::string> serverHistory; std::vector<std::string> serverHistory;
char *usedDir;
}; };


#endif #endif

Loading…
Cancel
Save