opennx/SessionProperties.cpp
2025-08-08 20:34:09 +02:00

2592 lines
88 KiB
C++

// $Id: SessionProperties.cpp 705 2012-03-16 13:01:13Z felfert $
//
// Copyright (C) 2006 The OpenNX Team
// Author: Fritz Elfert
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU Library General Public License as
// published by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version.
//
// This program 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 Library General Public
// License along with this program; 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
#if defined(__GNUG__) && !defined(__APPLE__)
#pragma implementation "SessionProperties.h"
#endif
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
////@begin includes
#include "wx/imaglist.h"
////@end includes
#include <wx/config.h>
#include <wx/imaglist.h>
#include <wx/tokenzr.h>
#include <wx/wfstream.h>
#include <wx/txtstrm.h>
#include <wx/dir.h>
#include <wx/scopeguard.h>
#include <wx/cshelp.h>
#include "SessionProperties.h"
#include "ProxyPropertyDialog.h"
#include "UnixImageSettingsDialog.h"
#include "UsbFilterDetailsDialog.h"
#include "RdpImageSettingsDialog.h"
#include "VncImageSettingsDialog.h"
#include "X11PropertyDialog.h"
#include "XdmPropertyDialog.h"
#include "RdpPropertyDialog.h"
#include "VncPropertyDialog.h"
#include "AboutDialog.h"
#include "ShareProperties.h"
#include "MyXmlConfig.h"
#include "MyValidator.h"
#include "Icon.h"
#include "KeyDialog.h"
#include "ExtHtmlWindow.h"
#include "LibUSB.h"
#include "opennxApp.h"
#include "osdep.h"
#include "PulseAudio.h"
////@begin XPM images
////@end XPM images
#include "trace.h"
ENABLE_TRACE;
#ifdef __UNIX__
# ifdef __WXMAC__
# define LD_LIBRARY_PATH wxT("DYLD_LIBRARY_PATH")
# else
# define LD_LIBRARY_PATH wxT("LD_LIBRARY_PATH")
# endif
#endif
wxString wxGetLibCheckRes(const wxString& libname)
{
wxString ret = wxT("");
#ifndef __WXMSW__
wxString ldpath;
bool libfound = false;
if (::wxGetEnv(LD_LIBRARY_PATH, &ldpath)) {
wxStringTokenizer t(ldpath, wxT(":"));
while (t.HasMoreTokens()) {
wxString abslib = t.GetNextToken() + wxFileName::GetPathSeparator() + libname;
libfound = wxFileName::IsFileReadable(abslib);
if (libfound)
break;
}
if (!libfound)
ret.Append(wxString::Format(_T(" %s not found in [DY]LD_LIBRARY_PATH=%s."),
VMB(libname), VMB(ldpath)));
} else
ret.Append(wxT(" Environment variable [DY]LD_LIBRARY_PATH is empty."));
#endif
return ret;
}
class KbdLayout {
public:
wxString sLayoutName;
wxString sIsoCode;
unsigned long winCode; // win32 language code;
};
#include <wx/arrimpl.cpp>
WX_DEFINE_OBJARRAY(KbdLayoutTable);
class CacheCleaner : public wxDirTraverser
{
public:
CacheCleaner(const wxString &toplevel)
{
m_sTopLevel = toplevel;
}
~CacheCleaner()
{
int n = m_aFiles.GetCount() - 1;
while (n >= 0)
::wxRemoveFile(m_aFiles[n--]);
n = m_aDirs.GetCount() - 1;
while (n >= 0)
::wxRmdir(m_aDirs[n--]);
}
virtual wxDirTraverseResult OnFile(const wxString &name)
{
if (name.StartsWith(m_sTopLevel + wxT("/cache")))
m_aFiles.Add(name);
return wxDIR_CONTINUE;
}
virtual wxDirTraverseResult OnDir(const wxString &name)
{
if (name.StartsWith(m_sTopLevel + wxT("/cache"))) {
m_aDirs.Add(name);
return wxDIR_CONTINUE;
} else
return wxDIR_IGNORE;
}
private:
wxArrayString m_aDirs;
wxArrayString m_aFiles;
wxString m_sTopLevel;
};
/*!
* SessionProperties type definition
*/
IMPLEMENT_CLASS( SessionProperties, wxDialog )
/*!
* SessionProperties event table definition
*/
BEGIN_EVENT_TABLE( SessionProperties, wxDialog )
////@begin SessionProperties event table entries
EVT_TEXT( XRCID("ID_TEXTCTRL_HOST"), SessionProperties::OnTextctrlHostUpdated )
EVT_SPINCTRL( XRCID("ID_SPINCTRL_PORT"), SessionProperties::OnSpinctrlPortUpdated )
EVT_TEXT( XRCID("ID_SPINCTRL_PORT"), SessionProperties::OnTextctrlPortUpdated )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_PWSAVE"), SessionProperties::OnCheckboxPwsaveClick )
EVT_BUTTON( XRCID("ID_BUTTON_KEYMANAGE"), SessionProperties::OnButtonKeymanageClick )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_SMARTCARD"), SessionProperties::OnCheckboxSmartcardClick )
EVT_COMBOBOX( XRCID("ID_COMBOBOX_DPROTO"), SessionProperties::OnComboboxDprotoSelected )
EVT_COMBOBOX( XRCID("ID_COMBOBOX_DTYPE"), SessionProperties::OnComboboxDtypeSelected )
EVT_BUTTON( XRCID("ID_BUTTON_DSETTINGS"), SessionProperties::OnButtonDsettingsClick )
EVT_SLIDER( XRCID("ID_SLIDER_SPEED"), SessionProperties::OnSliderSpeedUpdated )
EVT_COMBOBOX( XRCID("ID_COMBOBOX_DISPTYPE"), SessionProperties::OnComboboxDisptypeSelected )
EVT_SPINCTRL( XRCID("ID_SPINCTRL_WIDTH"), SessionProperties::OnSpinctrlWidthUpdated )
EVT_TEXT( XRCID("ID_SPINCTRL_WIDTH"), SessionProperties::OnSpinctrlWidthTextUpdated )
EVT_SPINCTRL( XRCID("ID_SPINCTRL_HEIGHT"), SessionProperties::OnSpinctrlHeightUpdated )
EVT_TEXT( XRCID("ID_SPINCTRL_HEIGHT"), SessionProperties::OnSpinctrlHeightTextUpdated )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_IMG_CUSTOM"), SessionProperties::OnCheckboxImgCustomClick )
EVT_BUTTON( XRCID("ID_BUTTON_IMG_CUSTOM"), SessionProperties::OnButtonImgCustomClick )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_KBDOTHER"), SessionProperties::OnCheckboxKbdotherClick )
EVT_COMBOBOX( XRCID("ID_COMBOBOX_KBDLAYOUT"), SessionProperties::OnComboboxKbdlayoutSelected )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_DISABLETCPNODEL"), SessionProperties::OnCheckboxDisabletcpnodelClick )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_DISABLEZCOMP"), SessionProperties::OnCheckboxDisablezcompClick )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_ENABLESSL"), SessionProperties::OnCheckboxEnablesslClick )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_PROXY"), SessionProperties::OnCheckboxProxyClick )
EVT_BUTTON( XRCID("ID_BUTTON_PROXYSETTINGS"), SessionProperties::OnButtonProxysettingsClick )
#if defined(__WXMSW__)
EVT_CHECKBOX( XRCID("ID_CHECKBOX_DISABLEDX"), SessionProperties::OnCheckboxDisabledxClick )
#endif
#if defined(__WXMSW__)
EVT_CHECKBOX( XRCID("ID_CHECKBOX_GRABKB"), SessionProperties::OnCheckboxGrabkbClick )
#endif
EVT_CHECKBOX( XRCID("ID_CHECKBOX_NODEFERRED"), SessionProperties::OnCheckboxNodeferredClick )
#if defined(__WXMSW__)
EVT_COMBOBOX( XRCID("ID_COMBOBOX_CLIPFILTER"), SessionProperties::OnComboboxClipfilterSelected )
#endif
EVT_COMBOBOX( XRCID("ID_COMBOBOX_CACHEMEM"), SessionProperties::OnComboboxCachememSelected )
EVT_COMBOBOX( XRCID("ID_COMBOBOX_CACHEDISK"), SessionProperties::OnComboboxCachediskSelected )
EVT_BUTTON( XRCID("ID_BUTTON_CACHECLEAN"), SessionProperties::OnButtonCachecleanClick )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_SMB"), SessionProperties::OnCheckboxSmbClick )
EVT_SPINCTRL( XRCID("ID_SPINCTRL_SMBPORT"), SessionProperties::OnSpinctrlSmbportUpdated )
EVT_TEXT( XRCID("ID_SPINCTRL_SMBPORT"), SessionProperties::OnSpinctrlSmbportTextUpdated )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_CUPSENABLE"), SessionProperties::OnCheckboxCupsenableClick )
EVT_SPINCTRL( XRCID("ID_SPINCTRL_CUPSPORT"), SessionProperties::OnSpinctrlCupsportUpdated )
EVT_TEXT( XRCID("ID_SPINCTRL_CUPSPORT"), SessionProperties::OnSpinctrlCupsportTextUpdated )
EVT_LIST_ITEM_SELECTED( XRCID("ID_LISTCTRL_SMB_SHARES"), SessionProperties::OnListctrlSmbSharesSelected )
EVT_LIST_ITEM_ACTIVATED( XRCID("ID_LISTCTRL_SMB_SHARES"), SessionProperties::OnListctrlSmbSharesItemActivated )
EVT_BUTTON( XRCID("ID_BUTTON_SMB_ADD"), SessionProperties::OnButtonSmbAddClick )
EVT_BUTTON( XRCID("ID_BUTTON_SMB_MODIFY"), SessionProperties::OnButtonSmbModifyClick )
EVT_BUTTON( XRCID("ID_BUTTON_SMB_DELETE"), SessionProperties::OnButtonSmbDeleteClick )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_MMEDIA"), SessionProperties::OnCheckboxMmediaClick )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_NATIVEPA"), SessionProperties::OnCheckboxNativePAClick )
EVT_COMBOBOX( XRCID("ID_COMBOBOX_RATEPA"), SessionProperties::OnComboboxRatePASelected )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_MONOPA"), SessionProperties::OnCheckboxMonoPAClick )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_USBENABLE"), SessionProperties::OnCHECKBOXUSBENABLEClick )
EVT_LIST_ITEM_SELECTED( XRCID("ID_LISTCTRL_USBFILTER"), SessionProperties::OnListctrlUsbfilterSelected )
EVT_LIST_ITEM_ACTIVATED( XRCID("ID_LISTCTRL_USBFILTER"), SessionProperties::OnListctrlUsbfilterItemActivated )
EVT_BUTTON( XRCID("ID_BUTTON_USBADD"), SessionProperties::OnButtonUsbaddClick )
EVT_BUTTON( XRCID("ID_BUTTON_USBMODIFY"), SessionProperties::OnButtonUsbmodifyClick )
EVT_BUTTON( XRCID("ID_BUTTON_USBDELETE"), SessionProperties::OnButtonUsbdeleteClick )
EVT_TEXT( XRCID("ID_TEXTCTRL_USERDIR"), SessionProperties::OnTextctrlUserdirUpdated )
EVT_BUTTON( XRCID("ID_BUTTON_BROWSE_USERDIR"), SessionProperties::OnButtonBrowseUserdirClick )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_REMOVEOLDSF"), SessionProperties::OnCheckboxRemoveoldsfClick )
EVT_TEXT( XRCID("ID_TEXTCTRL_SYSDIR"), SessionProperties::OnTextctrlSysdirUpdated )
EVT_BUTTON( XRCID("ID_BUTTON_BROWSE_SYSDIR"), SessionProperties::OnButtonBrowseSysdirClick )
EVT_TEXT( XRCID("ID_TEXTCTRL_CUPSPATH"), SessionProperties::OnTextctrlCupspathUpdated )
EVT_BUTTON( XRCID("ID_BUTTON_BROWSE_CUPSPATH"), SessionProperties::OnButtonBrowseCupspathClick )
EVT_TEXT( XRCID("ID_TEXTCTRL_USBIPD_SOCKET"), SessionProperties::OnTextctrlUsbipdSocketTextUpdated )
EVT_BUTTON( XRCID("ID_BUTTON_BROWSE_USBIPD_SOCKET"), SessionProperties::OnButtonBrowseUsbipdSocketClick )
EVT_SPINCTRL( XRCID("ID_SPINCTRL_USB_LOCALPORT"), SessionProperties::OnSpinctrlUsbLocalportUpdated )
EVT_TEXT( XRCID("ID_SPINCTRL_USB_LOCALPORT"), SessionProperties::OnSpinctrlUsbLocalportTextUpdated )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_CREATEICON"), SessionProperties::OnCheckboxCreateiconClick )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_RESETMSGBOXES"), SessionProperties::OnCheckboxResetmsgboxesClick )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_LOWERCASE_LOGIN"), SessionProperties::OnCheckboxLowercaseLoginClick )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_CLEAR_PASSONABORT"), SessionProperties::OnCheckboxClearPassonabortClick )
EVT_CHECKBOX( XRCID("ID_CHECKBOX_NOMAGICPIXEL"), SessionProperties::OnCheckboxNomagicpixelClick )
EVT_BUTTON( wxID_DELETE, SessionProperties::OnDeleteClick )
EVT_BUTTON( wxID_APPLY, SessionProperties::OnApplyClick )
////@end SessionProperties event table entries
EVT_MENU(wxID_CONTEXT_HELP, SessionProperties::OnContextHelp)
END_EVENT_TABLE()
/*!
* SessionProperties constructors
*/
SessionProperties::SessionProperties( )
: m_bKeyTyped(false)
, m_pCfg(NULL)
{
readKbdLayouts();
}
SessionProperties::SessionProperties( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
: m_bKeyTyped(false)
, m_pCfg(NULL)
{
readKbdLayouts();
Create(parent, id, caption, pos, size, style);
}
void
SessionProperties::SetConfig(MyXmlConfig *cfg)
{
m_pCfg = cfg;
SaveState();
}
void
SessionProperties::removePage(const wxString &title)
{
for (size_t i = 0; i < m_pNoteBook->GetPageCount(); i++) {
if (m_pNoteBook->GetPageText(i).IsSameAs(title)) {
m_pNoteBook->DeletePage(i);
break;
}
}
}
void
SessionProperties::CheckCfgChanges(bool changed)
{
if (m_pCfg)
changed |= m_pCfg->checkChanged();
m_pCtrlApplyButton->Enable(changed);
}
void
SessionProperties::CheckChanged()
{
wxASSERT_MSG(m_pCfg, _T("SessionProperties::CheckChanged: No configuration"));
if (m_pCfg) {
m_bKeyTyped = false;
TransferDataFromWindow();
// variables on 'General' Tab
m_pCfg->bSetRememberPassword(m_bRememberPassword);
m_pCfg->bSetUseSmartCard(m_bUseSmartCard);
m_pCfg->bSetUseCustomImageEncoding(m_bUseCustomImageEncoding);
m_pCfg->iSetServerPort(m_iPort);
m_pCfg->eSetSessionType((MyXmlConfig::SessionType)m_iSessionType);
switch (m_iSessionType) {
case MyXmlConfig::STYPE_UNIX:
m_iDesktopType = m_iDesktopTypeDialog;
break;
case MyXmlConfig::STYPE_WINDOWS:
m_iDesktopType = MyXmlConfig::DTYPE_RDP;
break;
case MyXmlConfig::STYPE_VNC:
m_iDesktopType = MyXmlConfig::DTYPE_RFB;
break;
}
m_pCfg->eSetDesktopType((MyXmlConfig::DesktopType)m_iDesktopType);
m_pCfg->eSetConnectionSpeed((MyXmlConfig::ConnectionSpeed)m_iConnectionSpeed);
m_pCfg->eSetDisplayType((MyXmlConfig::DisplayType)m_iDisplayType);
m_pCfg->iSetDisplayWidth(m_iDisplayWidth);
m_pCfg->iSetDisplayHeight(m_iDisplayHeight);
m_pCfg->sSetServerHost(m_sHostName);
m_pCfg->bSetKbdLayoutOther(m_bKbdLayoutOther);
m_pCfg->sSetKbdLayoutLanguage(m_sKbdLayoutLanguage);
// variables on 'Advanced' tab
m_pCfg->bSetDisableTcpNoDelay(m_bDisableTcpNoDelay);
m_pCfg->bSetDisableZlibCompression(m_bDisableZlibCompression);
m_pCfg->bSetEnableSSL(m_bEnableSSL);
m_pCfg->eSetCacheMemory((MyXmlConfig::CacheMemory)m_iCacheMem);
m_pCfg->eSetCacheDisk((MyXmlConfig::CacheDisk)m_iCacheDisk);
m_pCfg->bSetUseProxy(m_bUseProxy);
m_pCfg->bSetExternalProxy(m_bExternalProxy);
m_pCfg->sSetProxyHost(m_sProxyHost);
m_pCfg->sSetProxyPass(m_sProxyPass);
m_pCfg->sSetProxyUser(m_sProxyUser);
m_pCfg->bSetProxyPassRemember(m_bProxyPassRemember);
m_pCfg->iSetProxyPort(m_iProxyPort);
m_pCfg->sSetProxyCommand(m_sProxyCommand);
m_pCfg->bSetGrabKeyboard(m_bGrabKeyboard);
m_pCfg->bSetDisableDirectDraw(m_bDisableDirectDraw);
m_pCfg->bSetDisableDeferredUpdates(m_bDisableDeferredUpdates);
m_pCfg->iSetClipFilter(m_iClipFilter);
// variables on 'Services' tab
m_pCfg->bSetEnableSmbSharing(m_bEnableSmbSharing);
m_pCfg->bSetEnableMultimedia(m_bEnableMultimedia);
m_pCfg->bSetEnableNativePA(m_bEnableNativePA);
m_pCfg->eSetRatePA((MyXmlConfig::RatePA)m_iRatePA);
// switch (m_iRatePA) {
// case MyXmlConfig::RATEPA_:
// m_iRate = ;
// break;
// }
m_pCfg->bSetEnableMonoPA(m_bEnableMonoPA);
m_pCfg->bSetUseCups(m_bUseCups);
m_pCfg->iSetCupsPort(m_iCupsPort);
m_pCfg->iSetSmbPort(m_iSmbPort);
#ifdef SUPPORT_USBIP
// variables on the 'USB' tab
m_pCfg->bSetEnableUSBIP(m_bEnableUSBIP);
m_pCfg->aSetUsbForwards(m_aUsbForwards);
#endif
// variabless on 'Environment' tab
m_pCfg->bSetRemoveOldSessionFiles(m_bRemoveOldSessionFiles);
m_pCfg->sSetCupsPath(m_sCupsPath);
bool changed = false;
changed |= (m_sSavedUserNxDir != m_sUserNxDir);
changed |= (m_sSavedSystemNxDir != m_sSystemNxDir);
changed |= (m_sSavedUsbipdSocket != m_sUsbipdSocket);
changed |= (m_iSavedUsbLocalPort != m_iUsbLocalPort);
changed |= (m_bSavedCreateDesktopIcon != m_bCreateDesktopIcon);
changed |= (m_bSavedResetMessageBoxes != m_bResetMessageBoxes);
changed |= (m_bSavedLowercaseLogin != m_bLowercaseLogin);
changed |= (m_bSavedClearPassOnAbort != m_bClearPassOnAbort);
changed |= (m_bSavedDisableMagicPixel != m_bDisableMagicPixel);
CheckCfgChanges(changed);
}
}
void
SessionProperties::KeyTyped() {
m_bKeyTyped = true;
}
/*!
* SessionProperties creator
*/
bool SessionProperties::Create( wxWindow* parent, wxWindowID WXUNUSED(id), const wxString& WXUNUSED(caption), const wxPoint& WXUNUSED(pos), const wxSize& WXUNUSED(size), long WXUNUSED(style) )
{
////@begin SessionProperties member initialisation
m_bClearPassOnAbort = false;
m_bCreateDesktopIcon = false;
m_bDisableDeferredUpdates = false;
m_bDisableDirectDraw = false;
m_bDisableMagicPixel = false;
m_bGrabKeyboard = false;
m_bLowercaseLogin = false;
m_bProxyPassRemember = false;
m_bResetMessageBoxes = false;
m_bSavedClearPassOnAbort = true;
m_bSavedCreateDesktopIcon = false;
m_bSavedDisableMagicPixel = false;
m_bSavedLowercaseLogin = false;
m_bSavedResetMessageBoxes = false;
m_iClipFilter = 2;
m_iPseudoDesktopTypeIndex = -1;
m_iPseudoDisplayTypeIndex = -1;
m_iSmbPort = 445;
m_iUsbLocalPort = 3240;
m_pNoteBook = NULL;
m_pCtrlHostname = NULL;
m_pCtrlPort = NULL;
m_pCtrlUseSmartCard = NULL;
m_pCtrlSessionType = NULL;
m_pCtrlDesktopType = NULL;
m_pCtrlDesktopSettings = NULL;
m_pCtrlDisplayType = NULL;
m_pCtrlDisplayWidth = NULL;
m_pCtrlDisplayHeight = NULL;
m_pCtrlImageEncCustom = NULL;
m_pCtrlImageSettings = NULL;
m_pCtrlKeyboardOther = NULL;
m_pCtrlKeyboardLayout = NULL;
m_pCtrlEnableSSL = NULL;
m_pCtrlProxySettings = NULL;
m_pCtrlSmbEnable = NULL;
m_pCtrlSmbPort = NULL;
m_pCtrlCupsEnable = NULL;
m_pCtrlCupsPort = NULL;
m_pCtrlSmbShares = NULL;
m_pCtrlShareAdd = NULL;
m_pCtrlShareModify = NULL;
m_pCtrlShareDelete = NULL;
m_pCtrlEnableMultimedia = NULL;
m_pCtrlEnableNativePA = NULL;
m_pCtrlRatePA = NULL;
m_pCtrlEnableMonoPA = NULL;
m_pCtrlUsbEnable = NULL;
m_pCtrlUsbFilter = NULL;
m_pCtrlUsbAdd = NULL;
m_pCtrlUsbModify = NULL;
m_pCtrlUsbDelete = NULL;
m_pCtrlUserNxDir = NULL;
m_pCtrlSystemNxDir = NULL;
m_pCtrlCupsPath = NULL;
m_pCtrlCupsBrowse = NULL;
m_pCtrlUsbipdDaemon = NULL;
m_pCtrlUsbIpdSocket = NULL;
m_pCtrlUsbipdSocketBrowse = NULL;
m_pCtrlUsbLocalPort = NULL;
m_pCtrlResetMessageBoxes = NULL;
m_pCtrlPanelAbout = NULL;
m_pHtmlWindow = NULL;
m_pCtrlApplyButton = NULL;
////@end SessionProperties member initialisation
wxASSERT_MSG(m_pCfg, _T("SessionProperties::Create: No configuration"));
#ifdef HAVE_PULSE_PULSEAUDIO_H
#ifndef __WXMSW__
PulseAudio pa;
#endif
#endif
if (m_pCfg) {
// variables on 'General' Tab
m_bRememberPassword = m_pCfg->bGetRememberPassword();
m_bUseSmartCard = ::wxGetApp().NxSmartCardSupport() && m_pCfg->bGetUseSmartCard();
m_bUseCustomImageEncoding = m_pCfg->bGetUseCustomImageEncoding();
m_iPort = m_pCfg->iGetServerPort();
m_iSessionType = m_pCfg->eGetSessionType();
m_iDesktopType = m_pCfg->eGetDesktopType();
m_iDesktopTypeDialog = (m_iDesktopType > 0) ? m_iDesktopType : 0;
m_iUnixDesktopType = m_iDesktopType;
m_iConnectionSpeed = m_pCfg->eGetConnectionSpeed();
m_iDisplayType = m_pCfg->eGetDisplayType();
m_iDisplayWidth = m_pCfg->iGetDisplayWidth();
m_iDisplayHeight = m_pCfg->iGetDisplayHeight();
m_sHostName = m_pCfg->sGetServerHost();
// variables on 'Advanced' tab
m_bDisableTcpNoDelay = m_pCfg->bGetDisableTcpNoDelay();
m_bDisableZlibCompression = m_pCfg->bGetDisableZlibCompression();
m_bEnableSSL = m_pCfg->bGetEnableSSL();
m_bUseProxy = m_pCfg->bGetUseProxy();
m_bExternalProxy = m_pCfg->bGetExternalProxy();
m_bKbdLayoutOther = m_pCfg->bGetKbdLayoutOther();
m_iCacheMem = m_pCfg->eGetCacheMemory();
m_iCacheDisk = m_pCfg->eGetCacheDisk();
m_sKbdLayoutLanguage = m_pCfg->sGetKbdLayoutLanguage();
m_iProxyPort = m_pCfg->iGetProxyPort();
m_sProxyHost = m_pCfg->sGetProxyHost();
m_sProxyUser = m_pCfg->sGetProxyUser();
m_sProxyPass = m_pCfg->sGetProxyPass();
m_bProxyPassRemember = m_pCfg->bGetProxyPassRemember();
m_sProxyCommand = m_pCfg->sGetProxyCommand();
m_iClipFilter = m_pCfg->iGetClipFilter();
m_bGrabKeyboard = m_pCfg->bGetGrabKeyboard();
m_bDisableDirectDraw = m_pCfg->bGetDisableDirectDraw();
// variables on 'Services' tab
m_bEnableSmbSharing = m_pCfg->bGetEnableSmbSharing();
#ifdef HAVE_PULSE_PULSEAUDIO_H
#ifndef __WXMSW__
if (pa.IsAvailable()) {
#endif
#endif
m_bEnableMultimedia = m_pCfg->bGetEnableMultimedia();
#ifdef HAVE_PULSE_PULSEAUDIO_H
#ifndef __WXMSW__
} else {
// disable MM, disable checkbox
m_bEnableMultimedia = false;
m_pCfg->bSetEnableMultimedia(false);
}
#endif
#endif
m_bEnableNativePA = m_pCfg->bGetEnableNativePA();
m_iRatePA = m_pCfg->eGetRatePA();
m_bEnableMonoPA = m_pCfg->bGetEnableMonoPA();
#ifdef __UNIX__
m_bUseCups = m_pCfg->bGetUseCups();
#else
m_bUseCups = false;
#endif
m_iCupsPort = m_pCfg->iGetCupsPort();
m_iSmbPort = m_pCfg->iGetSmbPort();
// variables on 'USB' tab
#ifdef SUPPORT_USBIP
m_bEnableUSBIP = m_pCfg->bGetEnableUSBIP();
m_aUsbForwards = m_pCfg->aGetUsbForwards();
#else
m_bEnableUSBIP = false;
m_pCfg->bSetEnableUSBIP(false);
#endif
// variables on 'Environment' tab
m_bRemoveOldSessionFiles = m_pCfg->bGetRemoveOldSessionFiles();
m_sCupsPath = m_pCfg->sGetCupsPath();
m_bCreateDesktopIcon = m_bSavedCreateDesktopIcon =
::wxGetApp().CheckDesktopEntry(m_pCfg);
}
// Global config
wxConfigBase::Get()->Read(wxT("Config/UserNxDir"), &m_sUserNxDir);
wxConfigBase::Get()->Read(wxT("Config/SystemNxDir"), &m_sSystemNxDir);
wxConfigBase::Get()->Read(wxT("Config/LowercaseLogin"), &m_bLowercaseLogin, false);
wxConfigBase::Get()->Read(wxT("Config/ClearPassOnAbort"), &m_bClearPassOnAbort, true);
wxConfigBase::Get()->Read(wxT("Config/DisableMagicPixel"), &m_bDisableMagicPixel, false);
#ifdef SUPPORT_USBIP
wxConfigBase::Get()->Read(wxT("Config/UsbipdSocket"), &m_sUsbipdSocket);
wxConfigBase::Get()->Read(wxT("Config/UsbipPort"), &m_iUsbLocalPort);
#else
m_sUsbipdSocket = wxEmptyString;
#endif
// This setting can be used by an admin to disable storing passwords
// It has to be set manually in the global config file.
wxConfigBase::Get()->Read(wxT("Config/StorePasswords"), &m_bStorePasswords, true);
if (!m_bStorePasswords)
m_bRememberPassword = false;
////@begin SessionProperties creation
SetExtraStyle(wxWS_EX_VALIDATE_RECURSIVELY|wxWS_EX_BLOCK_EVENTS|wxDIALOG_EX_CONTEXTHELP);
SetParent(parent);
CreateControls();
SetIcon(GetIconResource(wxT("res/nx.png")));
if (GetSizer())
{
GetSizer()->SetSizeHints(this);
}
Centre();
////@end SessionProperties creation
#ifdef SUPPORT_USBIP
m_pCtrlUsbipdDaemon->Show();
wxSize sz = GetBestSize();
sz.IncBy(0, 35);
SetInitialSize(sz);
#else
removePage(_("USB"));
m_pCtrlUsbipdDaemon->Hide();
#endif
// Populate keyboard layout combobox
size_t idx1 = (size_t)-1;
size_t idx2 = (size_t)-1;
// Fix invalid keyboard lang
wxString mykbdlang = wxString(wxConvLocal.cMB2WX(x11_keyboard_type)).AfterFirst(wxT('/')).BeforeFirst(wxT(','));
size_t i;
for (i = 0; i < m_aKbdLayoutTable.GetCount(); i++) {
KbdLayout &l = m_aKbdLayoutTable.Item(i);
m_pCtrlKeyboardLayout->Append(l.sLayoutName, (void *)i);
if (l.sIsoCode == m_sKbdLayoutLanguage)
idx1 = i;
if (l.sIsoCode == mykbdlang)
idx2 = i;
}
if (idx1 != (size_t)-1)
m_pCtrlKeyboardLayout->SetValue(m_aKbdLayoutTable.Item(idx1).sLayoutName);
else if (idx2 != (size_t)-1)
m_pCtrlKeyboardLayout->SetValue(m_aKbdLayoutTable.Item(idx2).sLayoutName);
#define SHI_SIZE 16,16
wxImageList *il = new wxImageList(SHI_SIZE);
il->Add(CreateBitmapFromFile(wxT("res/shbroken.png"), SHI_SIZE));
il->Add(CreateBitmapFromFile(wxT("res/smbfolder.png"), SHI_SIZE));
il->Add(CreateBitmapFromFile(wxT("res/smbprinter.png"), SHI_SIZE));
il->Add(CreateBitmapFromFile(wxT("res/cupsprinter.png"), SHI_SIZE));
#ifdef SUPPORT_USBIP
wxImageList *il2 = new wxImageList(SHI_SIZE);
il2->Add(CreateBitmapFromFile(wxT("res/usblocal.png"), SHI_SIZE));
il2->Add(CreateBitmapFromFile(wxT("res/usbremote.png"), SHI_SIZE));
#endif
#undef SHI_SIZE
m_pCtrlSmbShares->AssignImageList(il, wxIMAGE_LIST_SMALL);
m_pCtrlSmbShares->InsertColumn(0, _("Share"));
m_pCtrlSmbShares->InsertColumn(1, _("Mount on"));
m_pCtrlSmbShares->InsertColumn(2, _("Comment"));
if (m_pCfg && (m_pCfg->iGetUsedShareGroups() > 0)) {
size_t i;
SmbClient sc;
CupsClient cc;
ArrayOfShareGroups sg = m_pCfg->aGetShareGroups();
ArrayOfShares sa = sc.GetShares();
WX_APPEND_ARRAY(sa, cc.GetShares());
wxArrayString usg = m_pCfg->aGetUsedShareGroups();
for (i = 0; i < sg.GetCount(); i++) {
if (usg.Index(sg[i].m_sGroupName) != wxNOT_FOUND) {
size_t si;
wxString comment = _("Currently not available");
int lidx = -1;
for (si = 0; si < sa.GetCount(); si++) {
if ((sa[si].name == sg[i].m_sShareName) &&
(sa[si].sharetype == sg[i].m_eType)) {
comment = sa[si].description;
switch (sa[si].sharetype) {
case SharedResource::SHARE_UNKNOWN:
break;
case SharedResource::SHARE_SMB_DISK:
myLogTrace(MYTRACETAG, wxT("%s"), VMB(sg[i].toString()));
lidx = m_pCtrlSmbShares->InsertItem(0, sg[i].m_sShareName, 1);
m_pCtrlSmbShares->SetItem(lidx, 1, sg[i].m_sAlias);
m_pCtrlSmbShares->SetItem(lidx, 2, comment);
break;
case SharedResource::SHARE_SMB_PRINTER:
myLogTrace(MYTRACETAG, wxT("%s"), VMB(sg[i].toString()));
lidx = m_pCtrlSmbShares->InsertItem(0, sg[i].m_sShareName, 2);
m_pCtrlSmbShares->SetItem(lidx, 1, sg[i].m_sDriver);
m_pCtrlSmbShares->SetItem(lidx, 2, comment);
break;
case SharedResource::SHARE_CUPS_PRINTER:
myLogTrace(MYTRACETAG, wxT("%s"), VMB(sg[i].toString()));
lidx = m_pCtrlSmbShares->InsertItem(0, sg[i].m_sShareName, 3);
m_pCtrlSmbShares->SetItem(lidx, 1, sg[i].m_sDriver);
m_pCtrlSmbShares->SetItem(lidx, 2, comment);
break;
}
break;
}
}
if (0 > lidx) {
myLogTrace(MYTRACETAG, wxT("Broken '%s'"), VMB(sg[i].toString()));
lidx = m_pCtrlSmbShares->InsertItem(0, sg[i].m_sShareName, 0);
m_pCtrlSmbShares->SetItem(lidx, 1, sg[i].m_sAlias);
m_pCtrlSmbShares->SetItem(lidx, 2, comment);
}
m_pCtrlSmbShares->SetItemData(lidx, i);
}
}
}
updateListCtrlColumnWidth(m_pCtrlSmbShares);
#ifdef SUPPORT_USBIP
m_pCtrlUsbFilter->AssignImageList(il2, wxIMAGE_LIST_SMALL);
m_pCtrlUsbFilter->InsertColumn(0, _("VendorID"));
m_pCtrlUsbFilter->InsertColumn(1, _("ProductID"));
m_pCtrlUsbFilter->InsertColumn(2, _("Class"));
m_pCtrlUsbFilter->InsertColumn(3, _("Name"));
m_pCtrlUsbFilter->InsertColumn(4, _("Serial"));
for (i = 0; i < m_aUsbForwards.GetCount(); i++)
appendUsbDevice(m_aUsbForwards[i], i);
updateListCtrlColumnWidth(m_pCtrlUsbFilter);
#endif
#ifdef HAVE_PULSE_PULSEAUDIO_H
#ifndef __WXMSW__
m_pCtrlEnableMultimedia->Enable(pa.IsAvailable());
#endif
#endif
UpdateDialogConstraints(false);
// Fix broken fonts in Spin-Controls
m_pCtrlDisplayWidth->SetFont(wxSystemSettings::GetFont(wxSYS_ANSI_VAR_FONT));
m_pCtrlDisplayHeight->SetFont(wxSystemSettings::GetFont(wxSYS_ANSI_VAR_FONT));
SaveState();
m_pCtrlApplyButton->Enable(false);
// Hook into OnChar events of wxTextCtrl's and wxSpinCtrl's
InstallOnCharHandlers();
#ifndef __UNIX__
// disable CUPS-related stuff on non-Unix platforms
m_pCtrlCupsEnable->Enable(false);
m_pCtrlCupsPort->Enable(false);
m_pCtrlCupsPath->Enable(false);
m_pCtrlCupsBrowse->Enable(false);
#endif
::wxGetApp().EnableContextHelp(this);
return TRUE;
}
void SessionProperties::OnContextHelp(wxCommandEvent &)
{
wxContextHelp contextHelp(this);
}
void SessionProperties::updateListCtrlColumnWidth(wxListCtrl *ctrl)
{
int cc = ctrl->GetColumnCount();
int i;
if (0 == cc) {
for (i = 0; i < cc; i++)
ctrl->SetColumnWidth(i, wxLIST_AUTOSIZE_USEHEADER);
return;
}
int *w = new int[cc];
// int w = (ctrl->GetItemCount() > 0) ? wxLIST_AUTOSIZE : wxLIST_AUTOSIZE_USEHEADER;
for (i = 0; i < cc; i++)
ctrl->SetColumnWidth(i, wxLIST_AUTOSIZE);
for (i = 0; i < cc; i++)
w[i] = ctrl->GetColumnWidth(i);
for (i = 0; i < cc; i++)
ctrl->SetColumnWidth(i, wxLIST_AUTOSIZE_USEHEADER);
for (i = 0; i < cc; i++) {
if (w[i] > ctrl->GetColumnWidth(i))
ctrl->SetColumnWidth(i, wxLIST_AUTOSIZE);
}
delete []w;
}
#ifdef SUPPORT_USBIP
void SessionProperties::appendUsbDevice(SharedUsbDevice &dev, int aidx)
{
long idx;
wxString lbl = (-1 == dev.m_iVendorID) ? wxT("*") : wxString::Format(wxT("%04X"), (int)dev.m_iVendorID);
idx = m_pCtrlUsbFilter->InsertItem(m_pCtrlUsbFilter->GetItemCount(),
lbl, (dev.m_eMode == SharedUsbDevice::MODE_REMOTE) ? 1 : 0);
lbl = (-1 == dev.m_iProductID) ? wxT("*") : wxString::Format(wxT("%04X"), (int)dev.m_iProductID);
m_pCtrlUsbFilter->SetItem(idx, 1, lbl);
lbl = (-1 == dev.m_iClass) ? wxT("*") : wxString::Format(wxT("%02X"), (int)dev.m_iClass);
m_pCtrlUsbFilter->SetItem(idx, 2, lbl);
lbl = dev.toShortString().IsEmpty() ? wxT("*") : dev.toShortString();
m_pCtrlUsbFilter->SetItem(idx, 3, lbl);
lbl = dev.m_sSerial.IsEmpty() ? wxT("*") : dev.m_sSerial;
m_pCtrlUsbFilter->SetItem(idx, 4, lbl);
m_pCtrlUsbFilter->SetItemData(idx, aidx);
}
#endif
/**
* Installs event handler for OnChar event in all wxTextCtrl and wxSpinCtrl
* childs.
*/
void
SessionProperties::InstallOnCharHandlers(wxWindow *w /* = NULL*/)
{
if (!w)
w = this;
wxWindowList& children = w->GetChildren();
wxWindowList::Node *node;
for (node = children.GetFirst(); node; node = node->GetNext()) {
w = node->GetData();
if (w->IsKindOf(CLASSINFO(wxTextCtrl)) || w->IsKindOf(CLASSINFO(wxSpinCtrl))) {
wxValidator *v = w->GetValidator();
if (v) {
if (v->IsKindOf(CLASSINFO(MyValidator)))
wxDynamicCast(v, MyValidator)->SetKeyTyped(this);
else
wxLogError(wxT("Detected %s window with validator other than MyValidator!"),
#ifdef __WXMSW__
w->IsKindOf(CLASSINFO(wxTextCtrl)) ? wxT("wxTextCtrl") : wxT("wxSpinCtrl"));
#else
w->IsKindOf(CLASSINFO(wxTextCtrl)) ? "wxTextCtrl" : "wxSpinCtrl");
#endif
} else {
#ifdef __WXMAC__
// wxWidgets on MacOSX generates additional windows
if (w->GetName().IsEmpty() || w->GetName().IsSameAs(wxT("text")))
continue;
#endif
wxLogError(wxT("Detected %s (name=%s) window without validator!"),
#ifdef __WXMSW__
(w->IsKindOf(CLASSINFO(wxTextCtrl)) ? wxT("wxTextCtrl") : wxT("wxSpinCtrl")),
(w->GetName().IsEmpty() ? wxT("") : VMB(w->GetName())));
#else
(w->IsKindOf(CLASSINFO(wxTextCtrl)) ? "wxTextCtrl" : "wxSpinCtrl"),
(w->GetName().IsEmpty() ? "" : VMB(w->GetName())));
#endif
}
} else {
if (!w->GetChildren().IsEmpty())
InstallOnCharHandlers(w);
}
}
}
/**
* Handle dialog constraints (i.e.: Enable/Disable various controls depending
* on other controls.
*/
void SessionProperties::UpdateDialogConstraints(bool getValues)
{
if (getValues)
TransferDataFromWindow();
// 'General' tab
switch (m_iSessionType) {
case MyXmlConfig::STYPE_UNIX:
if (m_iPseudoDesktopTypeIndex != -1) {
m_pCtrlDesktopType->Delete(m_iPseudoDesktopTypeIndex);
m_iPseudoDesktopTypeIndex = -1;
m_iDesktopTypeDialog = 0;
}
m_pCtrlDesktopType->SetSelection(m_iDesktopTypeDialog);
m_pCtrlDesktopType->Enable(true);
m_pCtrlDesktopSettings->Enable(
(m_iDesktopTypeDialog == MyXmlConfig::DTYPE_XDM) ||
(m_iDesktopTypeDialog == MyXmlConfig::DTYPE_CUSTOM));
if (m_iPseudoDisplayTypeIndex != -1) {
m_pCtrlDisplayType->Delete(m_iPseudoDisplayTypeIndex);
if (m_iDisplayType >= m_iPseudoDisplayTypeIndex)
m_pCtrlDisplayType->SetSelection(3);
m_iPseudoDisplayTypeIndex = -1;
}
m_pCtrlCupsEnable->Enable(true);
m_pCtrlSmbEnable->Enable(true);
#ifdef SUPPORT_USBIP
m_pCtrlUsbEnable->Enable(true);
#endif
break;
case MyXmlConfig::STYPE_WINDOWS:
if (m_iPseudoDesktopTypeIndex != -1) {
m_pCtrlDesktopType->Delete(m_iPseudoDesktopTypeIndex);
m_iPseudoDesktopTypeIndex = -1;
}
m_iPseudoDesktopTypeIndex = m_pCtrlDesktopType->Append(_("RDP"), (void *)MyXmlConfig::DTYPE_RDP);
m_pCtrlDesktopType->SetSelection(m_iPseudoDesktopTypeIndex);
m_iDesktopType = MyXmlConfig::DTYPE_RDP;
m_iDesktopTypeDialog = getValues ? 0 : m_iPseudoDesktopTypeIndex;
m_pCtrlDesktopType->Enable(false);
m_pCtrlDesktopSettings->Enable(true);
if (m_iPseudoDisplayTypeIndex != -1) {
m_pCtrlDisplayType->Delete(m_iPseudoDisplayTypeIndex);
if (m_iDisplayType >= m_iPseudoDisplayTypeIndex)
m_pCtrlDisplayType->SetSelection(3);
m_iPseudoDisplayTypeIndex = -1;
}
m_pCtrlCupsEnable->Enable(false);
m_pCtrlSmbEnable->Enable(false);
m_bUseCups = false;
m_bEnableSmbSharing = false;
m_bEnableUSBIP = false;
#ifdef SUPPORT_USBIP
m_pCtrlUsbEnable->Enable(false);
#endif
break;
case MyXmlConfig::STYPE_VNC:
if (m_iPseudoDesktopTypeIndex != -1) {
m_pCtrlDesktopType->Delete(m_iPseudoDesktopTypeIndex);
m_iPseudoDesktopTypeIndex = -1;
}
m_iPseudoDesktopTypeIndex = m_pCtrlDesktopType->Append(_("RFB"), (void *)MyXmlConfig::DTYPE_RFB);
m_pCtrlDesktopType->SetSelection(m_iPseudoDesktopTypeIndex);
m_iDesktopType = MyXmlConfig::DTYPE_RFB;
m_pCtrlDesktopType->Enable(true);
m_iDesktopTypeDialog = getValues ? 0 : m_iPseudoDesktopTypeIndex;
m_pCtrlDesktopType->Enable(false);
m_pCtrlDesktopSettings->Enable(true);
if (m_iPseudoDisplayTypeIndex != -1) {
m_pCtrlDisplayType->Delete(m_iPseudoDisplayTypeIndex);
if (m_iDisplayType >= m_iPseudoDisplayTypeIndex)
m_pCtrlDisplayType->SetSelection(3);
m_iPseudoDisplayTypeIndex = -1;
}
m_pCtrlCupsEnable->Enable(false);
m_pCtrlSmbEnable->Enable(false);
m_bUseCups = false;
m_bEnableSmbSharing = false;
m_bEnableUSBIP = false;
#ifdef SUPPORT_USBIP
m_pCtrlUsbEnable->Enable(false);
#endif
break;
case MyXmlConfig::STYPE_SHADOW:
if (m_iPseudoDesktopTypeIndex != -1) {
m_pCtrlDesktopType->Delete(m_iPseudoDesktopTypeIndex);
m_iPseudoDesktopTypeIndex = -1;
}
m_iPseudoDesktopTypeIndex = m_pCtrlDesktopType->Append(_("Any"), (void *)MyXmlConfig::DTYPE_ANY);
m_pCtrlDesktopType->SetSelection(m_iPseudoDesktopTypeIndex);
m_iDesktopType = MyXmlConfig::DTYPE_ANY;
m_iDesktopTypeDialog = getValues ? 0 : m_iPseudoDesktopTypeIndex;
m_pCtrlDesktopType->Enable(false);
m_pCtrlDesktopSettings->Enable(false);
if (m_iPseudoDisplayTypeIndex == -1) {
m_iPseudoDisplayTypeIndex = m_pCtrlDisplayType->Append(_("As on server"), (void *)MyXmlConfig::DPTYPE_REMOTE);
m_pCtrlDisplayType->SetSelection(m_iPseudoDisplayTypeIndex);
}
m_pCtrlCupsEnable->Enable(false);
m_pCtrlSmbEnable->Enable(false);
m_bUseCups = false;
m_bEnableSmbSharing = false;
m_bEnableUSBIP = false;
#ifdef SUPPORT_USBIP
m_pCtrlUsbEnable->Enable(false);
#endif
break;
case MyXmlConfig::STYPE_ADMIN:
if (m_iPseudoDesktopTypeIndex != -1) {
m_pCtrlDesktopType->Delete(m_iPseudoDesktopTypeIndex);
m_iPseudoDesktopTypeIndex = -1;
}
m_iPseudoDesktopTypeIndex = m_pCtrlDesktopType->Append(_("Any"), (void *)MyXmlConfig::DTYPE_ANY);
m_pCtrlDesktopType->SetSelection(m_iPseudoDesktopTypeIndex);
m_iDesktopType = MyXmlConfig::DTYPE_ANY;
m_iDesktopTypeDialog = getValues ? 0 : m_iPseudoDesktopTypeIndex;
m_pCtrlDesktopType->Enable(false);
m_pCtrlDesktopSettings->Enable(false);
if (m_iPseudoDisplayTypeIndex == -1) {
m_iPseudoDisplayTypeIndex = m_pCtrlDisplayType->Append(_("As on server"), (void *)MyXmlConfig::DPTYPE_REMOTE);
m_pCtrlDisplayType->SetSelection(m_iPseudoDisplayTypeIndex);
}
m_pCtrlCupsEnable->Enable(false);
m_pCtrlSmbEnable->Enable(false);
m_bUseCups = false;
m_bEnableSmbSharing = false;
m_bEnableUSBIP = false;
#ifdef SUPPORT_USBIP
m_pCtrlUsbEnable->Enable(false);
#endif
break;
}
switch (m_iDisplayType) {
case MyXmlConfig::DPTYPE_CUSTOM:
m_pCtrlDisplayWidth->Enable(true);
m_pCtrlDisplayHeight->Enable(true);
break;
default:
m_pCtrlDisplayWidth->Enable(false);
m_pCtrlDisplayHeight->Enable(false);
break;
}
if (m_bUseSmartCard) {
m_pCtrlEnableSSL->SetValue(true);
m_pCtrlEnableSSL->Enable(false);
m_bEnableSSL = true;
} else
m_pCtrlEnableSSL->Enable(true);
m_pCtrlImageSettings->Enable(m_bUseCustomImageEncoding);
// 'Services' tab
bool bTmp = m_bEnableSmbSharing || m_bUseCups;
m_pCtrlSmbShares->Enable(bTmp);
m_pCtrlShareAdd->Enable(bTmp);
m_pCtrlShareDelete->Enable(bTmp && (m_pCtrlSmbShares->GetSelectedItemCount() > 0));
m_pCtrlShareModify->Enable(bTmp && (m_pCtrlSmbShares->GetSelectedItemCount() > 0));
m_pCtrlSmbPort->Enable(m_bEnableSmbSharing);
m_pCtrlCupsPort->Enable(m_bUseCups);
m_pCtrlEnableNativePA->Enable(m_bEnableMultimedia);
m_pCtrlRatePA->Enable(m_bEnableMultimedia && m_bEnableNativePA);
m_pCtrlEnableMonoPA->Enable(m_bEnableMultimedia && m_bEnableNativePA
&& (MyXmlConfig::RATEPA_NORESAMPLE != m_iRatePA));
#ifdef SUPPORT_USBIP
// 'USB' tab
m_pCtrlUsbFilter->Enable(m_bEnableUSBIP);
m_pCtrlUsbAdd->Enable(m_bEnableUSBIP);
m_pCtrlUsbDelete->Enable(m_bEnableUSBIP && (m_pCtrlUsbFilter->GetSelectedItemCount() > 0));
m_pCtrlUsbModify->Enable(m_bEnableUSBIP && (m_pCtrlUsbFilter->GetSelectedItemCount() > 0));
#endif
// 'Advanced' tab
m_pCtrlKeyboardLayout->Enable(m_bKbdLayoutOther);
m_pCtrlProxySettings->Enable(m_bUseProxy);
// 'Environment' tab
}
/*!
* Control creation for SessionProperties
*/
void SessionProperties::CreateControls()
{
////@begin SessionProperties content construction
if (!wxXmlResource::Get()->LoadDialog(this, GetParent(), _T("ID_DIALOG_PROPERTIES")))
wxLogError(wxT("Missing wxXmlResource::Get()->Load() in OnInit()?"));
m_pNoteBook = XRCCTRL(*this, "ID_NOTEBOOK", wxNotebook);
m_pCtrlHostname = XRCCTRL(*this, "ID_TEXTCTRL_HOST", wxTextCtrl);
m_pCtrlPort = XRCCTRL(*this, "ID_SPINCTRL_PORT", wxSpinCtrl);
m_pCtrlUseSmartCard = XRCCTRL(*this, "ID_CHECKBOX_SMARTCARD", wxCheckBox);
m_pCtrlSessionType = XRCCTRL(*this, "ID_COMBOBOX_DPROTO", wxComboBox);
m_pCtrlDesktopType = XRCCTRL(*this, "ID_COMBOBOX_DTYPE", wxComboBox);
m_pCtrlDesktopSettings = XRCCTRL(*this, "ID_BUTTON_DSETTINGS", wxButton);
m_pCtrlDisplayType = XRCCTRL(*this, "ID_COMBOBOX_DISPTYPE", wxComboBox);
m_pCtrlDisplayWidth = XRCCTRL(*this, "ID_SPINCTRL_WIDTH", wxSpinCtrl);
m_pCtrlDisplayHeight = XRCCTRL(*this, "ID_SPINCTRL_HEIGHT", wxSpinCtrl);
m_pCtrlImageEncCustom = XRCCTRL(*this, "ID_CHECKBOX_IMG_CUSTOM", wxCheckBox);
m_pCtrlImageSettings = XRCCTRL(*this, "ID_BUTTON_IMG_CUSTOM", wxButton);
m_pCtrlKeyboardOther = XRCCTRL(*this, "ID_CHECKBOX_KBDOTHER", wxCheckBox);
m_pCtrlKeyboardLayout = XRCCTRL(*this, "ID_COMBOBOX_KBDLAYOUT", wxComboBox);
m_pCtrlEnableSSL = XRCCTRL(*this, "ID_CHECKBOX_ENABLESSL", wxCheckBox);
m_pCtrlProxySettings = XRCCTRL(*this, "ID_BUTTON_PROXYSETTINGS", wxButton);
m_pCtrlSmbEnable = XRCCTRL(*this, "ID_CHECKBOX_SMB", wxCheckBox);
m_pCtrlSmbPort = XRCCTRL(*this, "ID_SPINCTRL_SMBPORT", wxSpinCtrl);
m_pCtrlCupsEnable = XRCCTRL(*this, "ID_CHECKBOX_CUPSENABLE", wxCheckBox);
m_pCtrlCupsPort = XRCCTRL(*this, "ID_SPINCTRL_CUPSPORT", wxSpinCtrl);
m_pCtrlSmbShares = XRCCTRL(*this, "ID_LISTCTRL_SMB_SHARES", wxListCtrl);
m_pCtrlShareAdd = XRCCTRL(*this, "ID_BUTTON_SMB_ADD", wxButton);
m_pCtrlShareModify = XRCCTRL(*this, "ID_BUTTON_SMB_MODIFY", wxButton);
m_pCtrlShareDelete = XRCCTRL(*this, "ID_BUTTON_SMB_DELETE", wxButton);
m_pCtrlEnableMultimedia = XRCCTRL(*this, "ID_CHECKBOX_MMEDIA", wxCheckBox);
m_pCtrlEnableNativePA = XRCCTRL(*this, "ID_CHECKBOX_NATIVEPA", wxCheckBox);
m_pCtrlRatePA = XRCCTRL(*this, "ID_COMBOBOX_RATEPA", wxComboBox);
m_pCtrlEnableMonoPA = XRCCTRL(*this, "ID_CHECKBOX_MONOPA", wxCheckBox);
m_pCtrlUsbEnable = XRCCTRL(*this, "ID_CHECKBOX_USBENABLE", wxCheckBox);
m_pCtrlUsbFilter = XRCCTRL(*this, "ID_LISTCTRL_USBFILTER", wxListCtrl);
m_pCtrlUsbAdd = XRCCTRL(*this, "ID_BUTTON_USBADD", wxButton);
m_pCtrlUsbModify = XRCCTRL(*this, "ID_BUTTON_USBMODIFY", wxButton);
m_pCtrlUsbDelete = XRCCTRL(*this, "ID_BUTTON_USBDELETE", wxButton);
m_pCtrlUserNxDir = XRCCTRL(*this, "ID_TEXTCTRL_USERDIR", wxTextCtrl);
m_pCtrlSystemNxDir = XRCCTRL(*this, "ID_TEXTCTRL_SYSDIR", wxTextCtrl);
m_pCtrlCupsPath = XRCCTRL(*this, "ID_TEXTCTRL_CUPSPATH", wxTextCtrl);
m_pCtrlCupsBrowse = XRCCTRL(*this, "ID_BUTTON_BROWSE_CUPSPATH", wxButton);
m_pCtrlUsbipdDaemon = XRCCTRL(*this, "ID_PANEL_USBIP_DAEMON", wxPanel);
m_pCtrlUsbIpdSocket = XRCCTRL(*this, "ID_TEXTCTRL_USBIPD_SOCKET", wxTextCtrl);
m_pCtrlUsbipdSocketBrowse = XRCCTRL(*this, "ID_BUTTON_BROWSE_USBIPD_SOCKET", wxButton);
m_pCtrlUsbLocalPort = XRCCTRL(*this, "ID_SPINCTRL_USB_LOCALPORT", wxSpinCtrl);
m_pCtrlResetMessageBoxes = XRCCTRL(*this, "ID_CHECKBOX_RESETMSGBOXES", wxCheckBox);
m_pCtrlPanelAbout = XRCCTRL(*this, "ID_PANEL_ABOUT", wxPanel);
m_pHtmlWindow = XRCCTRL(*this, "ID_HTMLWINDOW_ABOUT", extHtmlWindow);
m_pCtrlApplyButton = XRCCTRL(*this, "wxID_APPLY", wxButton);
// Set validators
if (FindWindow(XRCID("ID_TEXTCTRL_HOST")))
FindWindow(XRCID("ID_TEXTCTRL_HOST"))->SetValidator( MyValidator(MyValidator::MYVAL_HOST, & m_sHostName) );
if (FindWindow(XRCID("ID_SPINCTRL_PORT")))
FindWindow(XRCID("ID_SPINCTRL_PORT"))->SetValidator( MyValidator(MyValidator::MYVAL_NUMERIC, & m_iPort) );
if (FindWindow(XRCID("ID_CHECKBOX_PWSAVE")))
FindWindow(XRCID("ID_CHECKBOX_PWSAVE"))->SetValidator( wxGenericValidator(& m_bRememberPassword) );
if (FindWindow(XRCID("ID_CHECKBOX_SMARTCARD")))
FindWindow(XRCID("ID_CHECKBOX_SMARTCARD"))->SetValidator( wxGenericValidator(& m_bUseSmartCard) );
if (FindWindow(XRCID("ID_COMBOBOX_DPROTO")))
FindWindow(XRCID("ID_COMBOBOX_DPROTO"))->SetValidator( wxGenericValidator(& m_iSessionType) );
if (FindWindow(XRCID("ID_COMBOBOX_DTYPE")))
FindWindow(XRCID("ID_COMBOBOX_DTYPE"))->SetValidator( wxGenericValidator(& m_iDesktopTypeDialog) );
if (FindWindow(XRCID("ID_SLIDER_SPEED")))
FindWindow(XRCID("ID_SLIDER_SPEED"))->SetValidator( wxGenericValidator(& m_iConnectionSpeed) );
if (FindWindow(XRCID("ID_COMBOBOX_DISPTYPE")))
FindWindow(XRCID("ID_COMBOBOX_DISPTYPE"))->SetValidator( wxGenericValidator(& m_iDisplayType) );
if (FindWindow(XRCID("ID_SPINCTRL_WIDTH")))
FindWindow(XRCID("ID_SPINCTRL_WIDTH"))->SetValidator( MyValidator(MyValidator::MYVAL_NUMERIC, & m_iDisplayWidth) );
if (FindWindow(XRCID("ID_SPINCTRL_HEIGHT")))
FindWindow(XRCID("ID_SPINCTRL_HEIGHT"))->SetValidator( MyValidator(MyValidator::MYVAL_NUMERIC, & m_iDisplayHeight) );
if (FindWindow(XRCID("ID_CHECKBOX_IMG_CUSTOM")))
FindWindow(XRCID("ID_CHECKBOX_IMG_CUSTOM"))->SetValidator( wxGenericValidator(& m_bUseCustomImageEncoding) );
if (FindWindow(XRCID("ID_CHECKBOX_KBDOTHER")))
FindWindow(XRCID("ID_CHECKBOX_KBDOTHER"))->SetValidator( wxGenericValidator(& m_bKbdLayoutOther) );
if (FindWindow(XRCID("ID_CHECKBOX_DISABLETCPNODEL")))
FindWindow(XRCID("ID_CHECKBOX_DISABLETCPNODEL"))->SetValidator( wxGenericValidator(& m_bDisableTcpNoDelay) );
if (FindWindow(XRCID("ID_CHECKBOX_DISABLEZCOMP")))
FindWindow(XRCID("ID_CHECKBOX_DISABLEZCOMP"))->SetValidator( wxGenericValidator(& m_bDisableZlibCompression) );
if (FindWindow(XRCID("ID_CHECKBOX_ENABLESSL")))
FindWindow(XRCID("ID_CHECKBOX_ENABLESSL"))->SetValidator( wxGenericValidator(& m_bEnableSSL) );
if (FindWindow(XRCID("ID_CHECKBOX_PROXY")))
FindWindow(XRCID("ID_CHECKBOX_PROXY"))->SetValidator( wxGenericValidator(& m_bUseProxy) );
#if defined(__WXMSW__)
if (FindWindow(XRCID("ID_CHECKBOX_DISABLEDX")))
FindWindow(XRCID("ID_CHECKBOX_DISABLEDX"))->SetValidator( wxGenericValidator(& m_bDisableDirectDraw) );
#endif
#if defined(__WXMSW__)
if (FindWindow(XRCID("ID_CHECKBOX_GRABKB")))
FindWindow(XRCID("ID_CHECKBOX_GRABKB"))->SetValidator( wxGenericValidator(& m_bGrabKeyboard) );
#endif
if (FindWindow(XRCID("ID_CHECKBOX_NODEFERRED")))
FindWindow(XRCID("ID_CHECKBOX_NODEFERRED"))->SetValidator( wxGenericValidator(& m_bDisableDeferredUpdates) );
#if defined(__WXMSW__)
if (FindWindow(XRCID("ID_COMBOBOX_CLIPFILTER")))
FindWindow(XRCID("ID_COMBOBOX_CLIPFILTER"))->SetValidator( wxGenericValidator(& m_iClipFilter) );
#endif
if (FindWindow(XRCID("ID_COMBOBOX_CACHEMEM")))
FindWindow(XRCID("ID_COMBOBOX_CACHEMEM"))->SetValidator( wxGenericValidator(& m_iCacheMem) );
if (FindWindow(XRCID("ID_COMBOBOX_CACHEDISK")))
FindWindow(XRCID("ID_COMBOBOX_CACHEDISK"))->SetValidator( wxGenericValidator(& m_iCacheDisk) );
if (FindWindow(XRCID("ID_CHECKBOX_SMB")))
FindWindow(XRCID("ID_CHECKBOX_SMB"))->SetValidator( wxGenericValidator(& m_bEnableSmbSharing) );
if (FindWindow(XRCID("ID_SPINCTRL_SMBPORT")))
FindWindow(XRCID("ID_SPINCTRL_SMBPORT"))->SetValidator( MyValidator(MyValidator::MYVAL_NUMERIC, & m_iSmbPort) );
if (FindWindow(XRCID("ID_CHECKBOX_CUPSENABLE")))
FindWindow(XRCID("ID_CHECKBOX_CUPSENABLE"))->SetValidator( wxGenericValidator(& m_bUseCups) );
if (FindWindow(XRCID("ID_SPINCTRL_CUPSPORT")))
FindWindow(XRCID("ID_SPINCTRL_CUPSPORT"))->SetValidator( MyValidator(MyValidator::MYVAL_NUMERIC, & m_iCupsPort) );
if (FindWindow(XRCID("ID_CHECKBOX_MMEDIA")))
FindWindow(XRCID("ID_CHECKBOX_MMEDIA"))->SetValidator( wxGenericValidator(& m_bEnableMultimedia) );
if (FindWindow(XRCID("ID_CHECKBOX_NATIVEPA")))
FindWindow(XRCID("ID_CHECKBOX_NATIVEPA"))->SetValidator( wxGenericValidator(& m_bEnableNativePA) );
if (FindWindow(XRCID("ID_COMBOBOX_RATEPA")))
FindWindow(XRCID("ID_COMBOBOX_RATEPA"))->SetValidator( wxGenericValidator(& m_iRatePA) );
if (FindWindow(XRCID("ID_CHECKBOX_MONOPA")))
FindWindow(XRCID("ID_CHECKBOX_MONOPA"))->SetValidator( wxGenericValidator(& m_bEnableMonoPA) );
if (FindWindow(XRCID("ID_CHECKBOX_USBENABLE")))
FindWindow(XRCID("ID_CHECKBOX_USBENABLE"))->SetValidator( wxGenericValidator(& m_bEnableUSBIP) );
if (FindWindow(XRCID("ID_TEXTCTRL_USERDIR")))
FindWindow(XRCID("ID_TEXTCTRL_USERDIR"))->SetValidator( MyValidator(& m_sUserNxDir) );
if (FindWindow(XRCID("ID_CHECKBOX_REMOVEOLDSF")))
FindWindow(XRCID("ID_CHECKBOX_REMOVEOLDSF"))->SetValidator( wxGenericValidator(& m_bRemoveOldSessionFiles) );
if (FindWindow(XRCID("ID_TEXTCTRL_SYSDIR")))
FindWindow(XRCID("ID_TEXTCTRL_SYSDIR"))->SetValidator( MyValidator(& m_sSystemNxDir) );
if (FindWindow(XRCID("ID_TEXTCTRL_CUPSPATH")))
FindWindow(XRCID("ID_TEXTCTRL_CUPSPATH"))->SetValidator( MyValidator(& m_sCupsPath) );
if (FindWindow(XRCID("ID_TEXTCTRL_USBIPD_SOCKET")))
FindWindow(XRCID("ID_TEXTCTRL_USBIPD_SOCKET"))->SetValidator( MyValidator(& m_sUsbipdSocket) );
if (FindWindow(XRCID("ID_SPINCTRL_USB_LOCALPORT")))
FindWindow(XRCID("ID_SPINCTRL_USB_LOCALPORT"))->SetValidator( MyValidator(MyValidator::MYVAL_NUMERIC, & m_iUsbLocalPort) );
if (FindWindow(XRCID("ID_CHECKBOX_CREATEICON")))
FindWindow(XRCID("ID_CHECKBOX_CREATEICON"))->SetValidator( wxGenericValidator(& m_bCreateDesktopIcon) );
if (FindWindow(XRCID("ID_CHECKBOX_RESETMSGBOXES")))
FindWindow(XRCID("ID_CHECKBOX_RESETMSGBOXES"))->SetValidator( wxGenericValidator(& m_bResetMessageBoxes) );
if (FindWindow(XRCID("ID_CHECKBOX_LOWERCASE_LOGIN")))
FindWindow(XRCID("ID_CHECKBOX_LOWERCASE_LOGIN"))->SetValidator( wxGenericValidator(& m_bLowercaseLogin) );
if (FindWindow(XRCID("ID_CHECKBOX_CLEAR_PASSONABORT")))
FindWindow(XRCID("ID_CHECKBOX_CLEAR_PASSONABORT"))->SetValidator( wxGenericValidator(& m_bClearPassOnAbort) );
if (FindWindow(XRCID("ID_CHECKBOX_NOMAGICPIXEL")))
FindWindow(XRCID("ID_CHECKBOX_NOMAGICPIXEL"))->SetValidator( wxGenericValidator(& m_bDisableMagicPixel) );
////@end SessionProperties content construction
if ((!m_bStorePasswords) && FindWindow(XRCID("ID_CHECKBOX_PWSAVE")))
FindWindow(XRCID("ID_CHECKBOX_PWSAVE"))->Enable(false);
////@begin SessionProperties content initialisation
////@end SessionProperties content initialisation
#ifdef __WXMSW__
// wxSpinCtrl is too small on windows
wxSize spin_size = m_pCtrlDisplayWidth->GetMinSize();
spin_size.IncBy(8, 0);
m_pCtrlDisplayWidth->SetSize(spin_size);
m_pCtrlDisplayWidth->SetMinSize(spin_size);
m_pCtrlDisplayWidth->SetSizeHints(spin_size);
m_pCtrlDisplayHeight->SetSize(spin_size);
m_pCtrlDisplayHeight->SetMinSize(spin_size);
m_pCtrlDisplayHeight->SetSizeHints(spin_size);
Layout();
#endif
m_pCtrlUseSmartCard->Enable(::wxGetApp().NxSmartCardSupport());
int fs[7];
wxFont fv = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
wxFont ff = wxSystemSettings::GetFont(wxSYS_ANSI_FIXED_FONT);
for (int i = 0; i < 7; i++)
fs[i] = fv.GetPointSize();
m_pHtmlWindow->SetFonts(fv.GetFaceName(), ff.GetFaceName(), fs);
m_pHtmlWindow->SetBorders(0);
wxString version = _("Version") + wxString::Format(wxT(" <B>%s</B>"),
VMB(::wxGetApp().GetVersion()));
wxString content = ::wxGetApp().LoadFileFromResource(wxT("res/about.html"));
content.Replace(wxT("<VERSION>"), version);
content.Replace(wxT("<WXVERSION>"), wxVERSION_STRING);
content.Replace(wxT("\"res:"), wxT("\"") + ::wxGetApp().GetResourcePrefix());
m_pHtmlWindow->SetPage(content);
m_pHtmlWindow->SetBackgroundColour(GetBackgroundColour());
m_pHtmlWindow->SetBackgroundStyle(GetBackgroundStyle());
if (!content.IsEmpty()) {
int width, height;
#ifdef __WXMAC__
// On MacOS wxHtmlContainerCell behaves unexpected?!
// -> Set size of about panel statically
width = 150;
height = 250;
#else
m_pCtrlPanelAbout->GetSize(&width, &height);
#endif
m_pHtmlWindow->GetInternalRepresentation()->Layout(width);
height = m_pHtmlWindow->GetInternalRepresentation()->GetHeight();
width = m_pHtmlWindow->GetInternalRepresentation()->GetWidth();
m_pHtmlWindow->SetSize(width, height);
m_pHtmlWindow->SetSizeHints(width, height);
m_pCtrlPanelAbout->Layout();
}
}
/*!
* Should we show tooltips?
*/
bool
SessionProperties::ShowToolTips()
{
return TRUE;
}
/*!
* Get bitmap resources
*/
wxBitmap SessionProperties::GetBitmapResource( const wxString& name )
{
// Bitmap retrieval
return CreateBitmapFromFile(name);
}
/*!
* Get icon resources
*/
wxIcon SessionProperties::GetIconResource( const wxString& name )
{
// Icon retrieval
return CreateIconFromFile(name);
}
int
SessionProperties::findSelectedShare()
{
for (int i = 0; i < m_pCtrlSmbShares->GetItemCount(); i++) {
int state = m_pCtrlSmbShares->GetItemState(i, wxLIST_STATE_SELECTED);
if (state)
return i;
}
return -1;
}
#ifdef SUPPORT_USBIP
int
SessionProperties::findSelectedUsbDevice()
{
for (int i = 0; i < m_pCtrlUsbFilter->GetItemCount(); i++) {
int state = m_pCtrlUsbFilter->GetItemState(i, wxLIST_STATE_SELECTED);
if (state)
return i;
}
return -1;
}
#endif
bool
SessionProperties::readKbdLayouts()
{
wxString kbdCfg;
wxConfigBase::Get()->Read(wxT("Config/SystemNxDir"), &kbdCfg);
kbdCfg << wxFileName::GetPathSeparator() << wxT("share")
<< wxFileName::GetPathSeparator() << wxT("keyboards");
wxFileInputStream fis(kbdCfg);
if (!fis.IsOk()) {
wxLogError(_("Error while reading keyboard table"));
return false;
}
wxTextInputStream tis(fis);
m_aKbdLayoutTable.Empty();
while (!fis.Eof()) {
wxString line = tis.ReadLine();
wxStringTokenizer t(line, wxT(","));
int i = 0;
long n;
KbdLayout kl;
while (t.HasMoreTokens()) {
switch (i++) {
case 0:
// ISO country code
kl.sIsoCode = t.GetNextToken();
break;
case 1:
// win32 language code
if (t.GetNextToken().ToLong(&n))
kl.winCode = n;
break;
case 2:
// Human readable name
kl.sLayoutName = t.GetNextToken();
m_aKbdLayoutTable.Add(kl);
break;
default:
wxLogError(_("Invalid line='%s'"), VMB(line));
wxLogError(_("Invalid entry in %s"), VMB(kbdCfg));
break;
}
}
}
return true;
}
void SessionProperties::SaveState()
{
if (m_pCfg)
m_pCfg->saveState();
m_sSavedUserNxDir = m_sUserNxDir;
m_sSavedSystemNxDir = m_sSystemNxDir;
m_sSavedUsbipdSocket = m_sUsbipdSocket;
m_iSavedUsbLocalPort = m_iUsbLocalPort;
m_bSavedCreateDesktopIcon = m_bCreateDesktopIcon;
m_bSavedLowercaseLogin = m_bLowercaseLogin;
m_bSavedClearPassOnAbort = m_bClearPassOnAbort;
m_bSavedResetMessageBoxes = m_bResetMessageBoxes = false;
m_bSavedDisableMagicPixel = m_bDisableMagicPixel;
}
// ====================== Event handlers ===============================
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_DSETTINGS
*/
void SessionProperties::OnButtonDsettingsClick( wxCommandEvent& event )
{
wxUnusedVar(event);
switch (m_iSessionType) {
case MyXmlConfig::STYPE_UNIX:
if (MyXmlConfig::DTYPE_XDM == m_iUnixDesktopType) {
XdmPropertyDialog d;
d.SetConfig(m_pCfg);
d.Create(this);
d.ShowModal();
CheckCfgChanges(false);
} else {
X11PropertyDialog d;
d.SetConfig(m_pCfg);
d.Create(this);
d.ShowModal();
CheckCfgChanges(false);
}
break;
case MyXmlConfig::STYPE_WINDOWS:
{
RdpPropertyDialog d;
d.SetConfig(m_pCfg);
d.Create(this);
d.ShowModal();
CheckCfgChanges(false);
}
break;
case MyXmlConfig::STYPE_VNC:
{
VncPropertyDialog d;
d.SetConfig(m_pCfg);
d.Create(this);
d.ShowModal();
CheckCfgChanges(false);
}
break;
}
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_IMG_CUSTOM
*/
void SessionProperties::OnButtonImgCustomClick( wxCommandEvent& event )
{
wxUnusedVar(event);
switch (m_iSessionType) {
case MyXmlConfig::STYPE_UNIX:
case MyXmlConfig::STYPE_SHADOW:
{
UnixImageSettingsDialog d;
d.SetConfig(m_pCfg);
d.Create(this);
d.ShowModal();
CheckChanged();
}
break;
case MyXmlConfig::STYPE_WINDOWS:
{
RdpImageSettingsDialog d;
d.SetConfig(m_pCfg);
d.Create(this);
d.ShowModal();
CheckChanged();
}
break;
case MyXmlConfig::STYPE_VNC:
{
VncImageSettingsDialog d;
d.SetConfig(m_pCfg);
d.Create(this);
d.ShowModal();
CheckChanged();
}
break;
}
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_CACHECLEAN
*/
void SessionProperties::OnButtonCachecleanClick( wxCommandEvent& event )
{
wxUnusedVar(event);
wxMessageDialog d(this, _("Do you really want to delete all cache directories?"),
_("Clean cache - OpenNX"), wxYES_NO|wxNO_DEFAULT|wxICON_QUESTION);
if (d.ShowModal() == wxID_YES) {
wxString userDir;
if (wxConfigBase::Get()->Read(wxT("Config/UserNxDir"), &userDir)) {
myLogTrace(MYTRACETAG, wxT("cleaning cache"));
wxDir ud;
if (ud.Open(userDir)) {
CacheCleaner cc(userDir);
ud.Traverse(cc);
}
}
}
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_SMB
*/
void SessionProperties::OnCheckboxSmbClick( wxCommandEvent& event )
{
wxUnusedVar(event);
SmbClient s;
if (s.IsAvailable()) {
#ifdef __LINUX__
wxString wstr = wxT("");
wxString sharedir = wxT("/var/lib/samba/usershares");
if ( IsFileStickyBitSet(sharedir.fn_str()) == 0)
wstr.Append(wxString::Format(wxT(" %s - sticky bit should be set;"),
VMB(sharedir)));
if (!wstr.IsEmpty()) {
wstr.Prepend(wxT("Some system settings may be incorrect:"));
wxLogWarning(VMB(wstr));
}
#endif
UpdateDialogConstraints(true);
CheckChanged();
} else {
wxString errstr = wxT("No local samba server is running;");
wxString checkres = wxGetLibCheckRes(wxT("libsmbclient.so"));
if (!checkres.IsEmpty())
errstr.Append(checkres);
wxLogWarning(VMB(errstr));
wxDynamicCast(event.GetEventObject(), wxCheckBox)->SetValue(false);
}
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_SMB_ADD
*/
void SessionProperties::OnButtonSmbAddClick( wxCommandEvent& event )
{
SmbClient sc;
CupsClient cc;
wxUnusedVar(event);
if ((sc.GetShares().GetCount() + cc.GetShares().GetCount()) > 0) {
ShareProperties d;
d.SetConfig(m_pCfg);
d.SetUse(m_bEnableSmbSharing, m_bUseCups);
d.Create(this);
if (d.ShowModal() == wxID_OK) {
size_t sgidx = m_pCfg->aGetShareGroups().GetCount() - 1;
ArrayOfShares sa = sc.GetShares();
WX_APPEND_ARRAY(sa, cc.GetShares());
ShareGroup sg = m_pCfg->aGetShareGroups().Item(sgidx);
size_t si;
wxString comment = _("Currently not available");
for (si = 0; si < sa.GetCount(); si++) {
if ((sa[si].name == sg.m_sShareName) &&
(sa[si].sharetype == sg.m_eType)) {
comment = sa[si].description;
break;
}
}
int lidx = -1;
switch (sg.m_eType) {
case SharedResource::SHARE_UNKNOWN:
break;
case SharedResource::SHARE_SMB_DISK:
lidx = m_pCtrlSmbShares->InsertItem(0, sg.m_sShareName, 1);
m_pCtrlSmbShares->SetItem(lidx, 1, sg.m_sAlias);
break;
case SharedResource::SHARE_SMB_PRINTER:
lidx = m_pCtrlSmbShares->InsertItem(0, sg.m_sShareName, 2);
m_pCtrlSmbShares->SetItem(lidx, 1, sg.m_sDriver);
break;
case SharedResource::SHARE_CUPS_PRINTER:
lidx = m_pCtrlSmbShares->InsertItem(0, sg.m_sShareName, 3);
m_pCtrlSmbShares->SetItem(lidx, 1, sg.m_sDriver);
break;
}
updateListCtrlColumnWidth(m_pCtrlSmbShares);
}
CheckChanged();
} else {
wxLogWarning(_("No sharable resources found"));
}
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_SMB_MODIFY
*/
void SessionProperties::OnButtonSmbModifyClick( wxCommandEvent& event )
{
wxUnusedVar(event);
int idx = findSelectedShare();
if (idx != -1) {
ShareProperties d;
d.SetConfig(m_pCfg);
d.SetUse(m_bEnableSmbSharing, m_bUseCups);
d.SetCurrentShare(m_pCtrlSmbShares->GetItemData(idx));
d.Create(this);
if (d.ShowModal() == wxID_OK) {
ShareGroup sg = m_pCfg->aGetShareGroups().Item(m_pCtrlSmbShares->GetItemData(idx));
switch (sg.m_eType) {
case SharedResource::SHARE_UNKNOWN:
break;
case SharedResource::SHARE_SMB_DISK:
m_pCtrlSmbShares->SetItem(idx, 1, sg.m_sAlias);
break;
case SharedResource::SHARE_SMB_PRINTER:
m_pCtrlSmbShares->SetItem(idx, 1, sg.m_sDriver);
break;
case SharedResource::SHARE_CUPS_PRINTER:
m_pCtrlSmbShares->SetItem(idx, 1, sg.m_sDriver);
break;
}
updateListCtrlColumnWidth(m_pCtrlSmbShares);
}
CheckChanged();
}
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_SMB_DELETE
*/
void SessionProperties::OnButtonSmbDeleteClick( wxCommandEvent& event )
{
wxUnusedVar(event);
int idx = findSelectedShare();
if (idx != -1) {
int shidx = m_pCtrlSmbShares->GetItemData(idx);
wxArrayString as = m_pCfg->aGetUsedShareGroups();
ArrayOfShareGroups asg = m_pCfg->aGetShareGroups();
as.Remove(asg[shidx].m_sGroupName);
asg.RemoveAt(shidx);
m_pCfg->aSetShareGroups(asg);
m_pCfg->aSetUsedShareGroups(as);
m_pCfg->iSetUsedShareGroups(m_pCfg->iGetUsedShareGroups() - 1);
m_pCtrlSmbShares->DeleteItem(idx);
for (int i = 0; i < m_pCtrlSmbShares->GetItemCount(); i++) {
int id = m_pCtrlSmbShares->GetItemData(i);
if (id > shidx)
m_pCtrlSmbShares->SetItemData(i, id - 1);
}
updateListCtrlColumnWidth(m_pCtrlSmbShares);
CheckChanged();
UpdateDialogConstraints(false);
}
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_BROWSE_USERDIR
*/
void SessionProperties::OnButtonBrowseUserdirClick( wxCommandEvent& event )
{
wxUnusedVar(event);
const wxString& dir = wxDirSelector(_("Select User NX directory"),
m_sUserNxDir, 0, wxDefaultPosition, this);
if (!dir.IsEmpty()) {
m_pCtrlUserNxDir->SetValue(dir);
CheckChanged();
}
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_BROWSE_SYSDIR
*/
void SessionProperties::OnButtonBrowseSysdirClick( wxCommandEvent& event )
{
wxUnusedVar(event);
const wxString& dir = wxDirSelector(_("Select System NX directory"),
m_sSystemNxDir, 0, wxDefaultPosition, this);
if (!dir.IsEmpty()) {
m_pCtrlSystemNxDir->SetValue(dir);
CheckChanged();
}
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_DELETE
*/
void SessionProperties::OnDeleteClick( wxCommandEvent& event )
{
wxUnusedVar(event);
if (wxMessageBox(wxString::Format(_("Really delete Session '%s' ?"),
VMB(m_pCfg->sGetName())), _("Delete Session"),
wxICON_QUESTION|wxYES_NO|wxNO_DEFAULT) == wxYES) {
::wxGetApp().RemoveDesktopEntry(m_pCfg);
myLogTrace(MYTRACETAG, wxT("Removing '%s'"), VMB(m_pCfg->sGetFileName()));
::wxRemoveFile(m_pCfg->sGetFileName());
EndModal(wxID_CLEAR);
}
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_SAVE
*/
void SessionProperties::OnApplyClick( wxCommandEvent& event )
{
wxUnusedVar(event);
wxConfigBase::Get()->Write(wxT("Config/UserNxDir"), m_sUserNxDir);
wxConfigBase::Get()->Write(wxT("Config/SystemNxDir"), m_sSystemNxDir);
wxConfigBase::Get()->Write(wxT("Config/LowercaseLogin"), m_bLowercaseLogin);
wxConfigBase::Get()->Write(wxT("Config/ClearPassOnAbort"), m_bClearPassOnAbort);
wxConfigBase::Get()->Write(wxT("Config/DisableMagicPixel"), m_bDisableMagicPixel);
#ifdef SUPPORT_USBIP
wxConfigBase::Get()->Write(wxT("Config/UsbipdSocket"), m_sUsbipdSocket);
wxConfigBase::Get()->Write(wxT("Config/UsbipPort"), m_iUsbLocalPort);
#endif
if (m_bSavedCreateDesktopIcon != m_bCreateDesktopIcon) {
if (NULL != m_pCfg) {
if (m_bCreateDesktopIcon)
::wxGetApp().CreateDesktopEntry(m_pCfg);
else
::wxGetApp().RemoveDesktopEntry(m_pCfg);
}
}
if (m_bSavedResetMessageBoxes != m_bResetMessageBoxes) {
if (m_bResetMessageBoxes) {
wxConfigBase::Get()->DeleteGroup(wxT("SupressedDialogs"));
}
}
SaveState();
m_pCtrlResetMessageBoxes->SetValue(m_bResetMessageBoxes);
m_pCtrlApplyButton->Enable(false);
}
/*!
* wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_COMBOBOX_DPROTO
*/
void SessionProperties::OnComboboxDprotoSelected( wxCommandEvent& event )
{
if (event.GetInt() == 0) {
m_iDesktopTypeDialog = m_iUnixDesktopType;
m_pCtrlDesktopType->SetSelection(m_iDesktopTypeDialog);
}
UpdateDialogConstraints(true);
CheckChanged();
}
/*!
* wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_COMBOBOX_DTYPE
*/
void SessionProperties::OnComboboxDtypeSelected( wxCommandEvent& event )
{
wxUnusedVar(event);
UpdateDialogConstraints(true);
m_iUnixDesktopType = m_iDesktopTypeDialog;
CheckChanged();
}
/*!
* wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_COMBOBOX_DISPTYPE
*/
void SessionProperties::OnComboboxDisptypeSelected( wxCommandEvent& event )
{
wxUnusedVar(event);
UpdateDialogConstraints(true);
CheckChanged();
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_PWSAVE
*/
void SessionProperties::OnCheckboxPwsaveClick( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_SMARTCARD
*/
void SessionProperties::OnCheckboxSmartcardClick( wxCommandEvent& event )
{
wxUnusedVar(event);
UpdateDialogConstraints(true);
CheckChanged();
}
/*!
* wxEVT_COMMAND_SLIDER_UPDATED event handler for ID_SLIDER_SPEED
*/
void SessionProperties::OnSliderSpeedUpdated( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_SPINCTRL_UPDATED event handler for ID_SPINCTRL_WIDTH
*/
void SessionProperties::OnSpinctrlWidthUpdated( wxSpinEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_SPINCTRL_UPDATED event handler for ID_SPINCTRL_HEIGHT
*/
void SessionProperties::OnSpinctrlHeightUpdated( wxSpinEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_DISABLETCPNODEL
*/
void SessionProperties::OnCheckboxDisabletcpnodelClick( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_DISABLEZCOMP
*/
void SessionProperties::OnCheckboxDisablezcompClick( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_ENABLESSL
*/
void SessionProperties::OnCheckboxEnablesslClick( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_COMBOBOX_CACHEMEM
*/
void SessionProperties::OnComboboxCachememSelected( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_COMBOBOX_CACHEDISK
*/
void SessionProperties::OnComboboxCachediskSelected( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_COMBOBOX_KBDLAYOUT
*/
void SessionProperties::OnComboboxKbdlayoutSelected( wxCommandEvent& event )
{
size_t idx = (size_t)m_pCtrlKeyboardLayout->GetClientData(event.GetInt());
m_sKbdLayoutLanguage = m_aKbdLayoutTable.Item(idx).sIsoCode;
CheckChanged();
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_REMOVEOLDSF
*/
void SessionProperties::OnCheckboxRemoveoldsfClick( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_TEXT_UPDATED event handler for ID_TEXTCTRL_HOST
*/
void SessionProperties::OnTextctrlHostUpdated( wxCommandEvent& event )
{
wxUnusedVar(event);
if (m_bKeyTyped && (wxWindow::FindFocus() == (wxWindow *)m_pCtrlHostname))
CheckChanged();
}
/*!
* wxEVT_COMMAND_TEXT_UPDATED event handler for ID_TEXTCTRL_USERDIR
*/
void SessionProperties::OnTextctrlUserdirUpdated( wxCommandEvent& event )
{
wxUnusedVar(event);
if (m_bKeyTyped && (wxWindow::FindFocus() == (wxWindow *)m_pCtrlUserNxDir))
CheckChanged();
}
/*!
* wxEVT_COMMAND_TEXT_UPDATED event handler for ID_TEXTCTRL_SYSDIR
*/
void SessionProperties::OnTextctrlSysdirUpdated( wxCommandEvent& event )
{
wxUnusedVar(event);
if (m_bKeyTyped && (wxWindow::FindFocus() == (wxWindow *)m_pCtrlSystemNxDir))
CheckChanged();
}
/*!
* wxEVT_COMMAND_LIST_ITEM_SELECTED event handler for ID_LISTCTRL_SMB_SHARES
*/
void SessionProperties::OnListctrlSmbSharesSelected( wxListEvent& event )
{
wxUnusedVar(event);
m_pCtrlShareDelete->Enable(true);
m_pCtrlShareModify->Enable(true);
}
/*!
* wxEVT_COMMAND_LIST_ITEM_ACTIVATED event handler for ID_LISTCTRL_SMB_SHARES
*/
void SessionProperties::OnListctrlSmbSharesItemActivated( wxListEvent& event )
{
wxUnusedVar(event);
wxCommandEvent e;
OnButtonSmbModifyClick(e);
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_CUPS
*/
void SessionProperties::OnCheckboxCupsenableClick( wxCommandEvent& event )
{
wxString errstr = wxT("");
CupsClient cl;
if (!cl.IsAvailable()) {
errstr.Append(wxT("No cups server available;"));
wxString checkres = wxGetLibCheckRes(wxT("libcups.so"));
if (!checkres.IsEmpty())
errstr.Append(checkres);
}
if (!wxFileName::IsFileExecutable(m_sCupsPath))
errstr.Append(wxString::Format(_T(" %s must be executable (755);"),VMB(m_sCupsPath)));
wxString libdirs = wxT("/usr/lib:/usr/lib64:/usr/libexec");
wxString ippexec = wxT("");
wxStringTokenizer t(libdirs, wxT(":"));
while (t.HasMoreTokens()) {
wxString tmpstr = t.GetNextToken() + wxT("/cups/backend/ipp");
if (wxFileName::FileExists(tmpstr)) {
ippexec = tmpstr;
break;
}
}
if (ippexec.IsEmpty()) {
errstr.Append(wxT(" ipp backend not found;"));
} else if (!wxFileName::IsFileExecutable(ippexec)) {
errstr.Append(wxString::Format(_T(" CUPS printing support cannot be enabled. Please ensure that permissions for %s are set to 755."),
VMB(ippexec)));
}
if (errstr.IsEmpty()) {
UpdateDialogConstraints(true);
CheckChanged();
} else {
wxLogWarning(VMB(errstr));
wxDynamicCast(event.GetEventObject(), wxCheckBox)->SetValue(false);
m_bUseCups = false;
}
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_BROWSE_CUPSD
*/
void SessionProperties::OnButtonBrowseCupspathClick( wxCommandEvent& event )
{
wxUnusedVar(event);
wxFileName fn(m_sCupsPath);
const wxString& file = ::wxFileSelector(_("Select System CUPS daemon"),
fn.GetPath(), fn.GetName(), wxEmptyString, wxT("*"), wxFD_OPEN|wxFD_FILE_MUST_EXIST, this);
if (!file.IsEmpty()) {
m_pCtrlCupsPath->SetValue(file);
CheckChanged();
}
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_KEYMANAGE
*/
void SessionProperties::OnButtonKeymanageClick( wxCommandEvent& event )
{
wxUnusedVar(event);
KeyDialog d;
d.SetSshKey(m_pCfg->sGetSshKey());
d.Create(this);
if (d.ShowModal() != wxCANCEL) {
m_pCfg->sSetSshKey(d.GetSshKey());
CheckChanged();
}
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_MMEDIA
*/
void SessionProperties::OnCheckboxMmediaClick( wxCommandEvent& event )
{
wxUnusedVar(event);
UpdateDialogConstraints(true);
CheckChanged();
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_NATIVEPA
*/
void SessionProperties::OnCheckboxNativePAClick( wxCommandEvent& event )
{
wxUnusedVar(event);
UpdateDialogConstraints(true);
CheckChanged();
}
/*!
* wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_COMBOBOX_RATEPA
*/
void SessionProperties::OnComboboxRatePASelected( wxCommandEvent& event )
{
wxUnusedVar(event);
UpdateDialogConstraints(true);
CheckChanged();
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_MONOPA
*/
void SessionProperties::OnCheckboxMonoPAClick( wxCommandEvent& event )
{
wxUnusedVar(event);
UpdateDialogConstraints(true);
CheckChanged();
}
/*!
* wxEVT_COMMAND_SPINCTRL_UPDATED event handler for ID_SPINCTRL_PORT
*/
void SessionProperties::OnSpinctrlPortUpdated( wxSpinEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_TEXT_UPDATED event handler for ID_SPINCTRL_PORT
*/
void SessionProperties::OnTextctrlPortUpdated( wxCommandEvent& event )
{
wxUnusedVar(event);
if (m_bKeyTyped && (wxWindow::FindFocus() == (wxWindow *)m_pCtrlPort))
m_pCtrlApplyButton->Enable(true);
}
/*!
* wxEVT_COMMAND_TEXT_UPDATED event handler for ID_SPINCTRL_WIDTH
*/
void SessionProperties::OnSpinctrlWidthTextUpdated( wxCommandEvent& event )
{
wxUnusedVar(event);
if (m_bKeyTyped && (wxWindow::FindFocus() == (wxWindow *)m_pCtrlDisplayWidth))
m_pCtrlApplyButton->Enable(true);
}
/*!
* wxEVT_COMMAND_TEXT_UPDATED event handler for ID_SPINCTRL_HEIGHT
*/
void SessionProperties::OnSpinctrlHeightTextUpdated( wxCommandEvent& event )
{
wxUnusedVar(event);
if (m_bKeyTyped && (wxWindow::FindFocus() == (wxWindow *)m_pCtrlDisplayHeight))
m_pCtrlApplyButton->Enable(true);
}
/*!
* wxEVT_COMMAND_SPINCTRL_UPDATED event handler for ID_SPINCTRL_SMBPORT
*/
void SessionProperties::OnSpinctrlSmbportUpdated( wxSpinEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_TEXT_UPDATED event handler for ID_SPINCTRL_SMBPORT
*/
void SessionProperties::OnSpinctrlSmbportTextUpdated( wxCommandEvent& event )
{
wxUnusedVar(event);
if (m_bKeyTyped && (wxWindow::FindFocus() == (wxWindow *)m_pCtrlSmbPort))
CheckChanged();
}
/*!
* wxEVT_COMMAND_SPINCTRL_UPDATED event handler for ID_SPINCTRL_CUPSPORT
*/
void SessionProperties::OnSpinctrlCupsportUpdated( wxSpinEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_TEXT_UPDATED event handler for ID_SPINCTRL_CUPSPORT
*/
void SessionProperties::OnSpinctrlCupsportTextUpdated( wxCommandEvent& event )
{
wxUnusedVar(event);
if (m_bKeyTyped && (wxWindow::FindFocus() == (wxWindow *)m_pCtrlCupsPort))
CheckChanged();
//m_pCtrlApplyButton->Enable(true);
}
/*!
* wxEVT_COMMAND_TEXT_UPDATED event handler for ID_TEXTCTRL_CUPSPATH
*/
void SessionProperties::OnTextctrlCupspathUpdated( wxCommandEvent& event )
{
wxUnusedVar(event);
if (m_bKeyTyped && (wxWindow::FindFocus() == (wxWindow *)m_pCtrlCupsPath))
CheckChanged();
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_USBENABLE
*/
void SessionProperties::OnCHECKBOXUSBENABLEClick( wxCommandEvent& event )
{
wxUnusedVar(event);
UpdateDialogConstraints(true);
CheckChanged();
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_USBADD
*/
void SessionProperties::OnButtonUsbaddClick( wxCommandEvent& event )
{
wxUnusedVar(event);
#ifdef SUPPORT_USBIP
USB u;
if (!u.IsAvailable()) {
wxLogWarning(_("libusb is not available. No USB devices will be exported"));
return;
}
ArrayOfUSBDevices a = u.GetDevices();
if (a.IsEmpty()) {
wxLogWarning(_("No USB devices available."));
return;
}
UsbFilterDetailsDialog d(this);
d.SetDeviceList(a);
d.SetDialogMode(UsbFilterDetailsDialog::MODE_ADD);
if (d.ShowModal() == wxID_OK) {
SharedUsbDevice dev;
long tmp;
if (d.GetVendorID().IsEmpty())
dev.m_iVendorID = -1;
else {
d.GetVendorID().ToLong(&tmp, 16);
dev.m_iVendorID = tmp;
}
if (d.GetProductID().IsEmpty())
dev.m_iProductID = -1;
else {
d.GetProductID().ToLong(&tmp, 16);
dev.m_iProductID = tmp;
}
if (d.GetDeviceClass().IsEmpty())
dev.m_iClass = -1;
else {
d.GetDeviceClass().ToLong(&tmp, 16);
dev.m_iClass = tmp;
}
dev.m_sVendor = d.GetVendor();
dev.m_sProduct = d.GetProduct();
dev.m_sSerial = d.GetSerial();
dev.m_eMode = d.GetForwarding() ? SharedUsbDevice::MODE_REMOTE : SharedUsbDevice::MODE_LOCAL;
bool found = false;
for (size_t i = 0; i < m_aUsbForwards.GetCount(); i++) {
if (dev.cmpNoMode(m_aUsbForwards[i])) {
found = true;
break;
}
}
if (!found) {
appendUsbDevice(dev, m_aUsbForwards.GetCount());
updateListCtrlColumnWidth(m_pCtrlUsbFilter);
m_aUsbForwards.Add(dev);
UpdateDialogConstraints(false);
CheckChanged();
}
}
#endif
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_USBMODIFY
*/
void SessionProperties::OnButtonUsbmodifyClick( wxCommandEvent& event )
{
wxUnusedVar(event);
#ifdef SUPPORT_USBIP
int idx = findSelectedUsbDevice();
if (idx != -1) {
int aidx = m_pCtrlUsbFilter->GetItemData(idx);
SharedUsbDevice dev = m_aUsbForwards[aidx];
UsbFilterDetailsDialog d(this);
d.SetDialogMode(UsbFilterDetailsDialog::MODE_EDIT);
d.SetVendorID((-1 == dev.m_iVendorID) ? wxT("") : wxString::Format(wxT("%04X"), (int)dev.m_iVendorID));
d.SetProductID((-1 == dev.m_iProductID) ? wxT("") : wxString::Format(wxT("%04X"), (int)dev.m_iProductID));
d.SetDeviceClass((-1 == dev.m_iClass) ? wxT("") : wxString::Format(wxT("%02X"), (int)dev.m_iClass));
d.SetVendor(dev.m_sVendor);
d.SetProduct(dev.m_sProduct);
d.SetSerial(dev.m_sSerial);
d.SetForwarding(dev.m_eMode == SharedUsbDevice::MODE_REMOTE);
if (d.ShowModal() == wxID_OK) {
long tmp;
if (d.GetVendorID().IsEmpty())
dev.m_iVendorID = -1;
else {
d.GetVendorID().ToLong(&tmp, 16);
dev.m_iVendorID = tmp;
}
if (d.GetProductID().IsEmpty())
dev.m_iProductID = -1;
else {
d.GetProductID().ToLong(&tmp, 16);
dev.m_iProductID = tmp;
}
if (d.GetDeviceClass().IsEmpty())
dev.m_iClass = -1;
else {
d.GetDeviceClass().ToLong(&tmp, 16);
dev.m_iClass = tmp;
}
dev.m_sVendor = d.GetVendor();
dev.m_sProduct = d.GetProduct();
dev.m_sSerial = d.GetSerial();
dev.m_eMode = d.GetForwarding() ? SharedUsbDevice::MODE_REMOTE : SharedUsbDevice::MODE_LOCAL;
m_aUsbForwards[aidx] = dev;
wxString lbl = (-1 == dev.m_iVendorID) ? wxT("*") : wxString::Format(wxT("%04X"), (int)dev.m_iVendorID);
m_pCtrlUsbFilter->SetItem(idx, 0, lbl, (dev.m_eMode == SharedUsbDevice::MODE_REMOTE) ? 1 : 0);
lbl = (-1 == dev.m_iProductID) ? wxT("*") : wxString::Format(wxT("%04X"), (int)dev.m_iProductID);
m_pCtrlUsbFilter->SetItem(idx, 1, lbl);
lbl = (-1 == dev.m_iClass) ? wxT("*") : wxString::Format(wxT("%02X"), (int)dev.m_iClass);
m_pCtrlUsbFilter->SetItem(idx, 2, lbl);
lbl = dev.toShortString().IsEmpty() ? wxT("*") : dev.toShortString();
m_pCtrlUsbFilter->SetItem(idx, 3, lbl);
lbl = dev.m_sSerial.IsEmpty() ? wxT("*") : dev.m_sSerial;
m_pCtrlUsbFilter->SetItem(idx, 4, lbl);
updateListCtrlColumnWidth(m_pCtrlUsbFilter);
UpdateDialogConstraints(false);
CheckChanged();
}
}
#endif
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_USBDELETE
*/
void SessionProperties::OnButtonUsbdeleteClick( wxCommandEvent& event )
{
wxUnusedVar(event);
#ifdef SUPPORT_USBIP
int idx = findSelectedUsbDevice();
if (idx != -1) {
int aidx = m_pCtrlUsbFilter->GetItemData(idx);
m_aUsbForwards.RemoveAt(aidx);
m_pCtrlUsbFilter->DeleteItem(idx);
for (int i = 0; i < m_pCtrlUsbFilter->GetItemCount(); i++) {
int id = m_pCtrlUsbFilter->GetItemData(i);
if (id > aidx)
m_pCtrlUsbFilter->SetItemData(i, id - 1);
}
updateListCtrlColumnWidth(m_pCtrlUsbFilter);
CheckChanged();
UpdateDialogConstraints(false);
}
#endif
}
/*!
* wxEVT_COMMAND_LIST_ITEM_SELECTED event handler for ID_LISTCTRL_USBFILTER
*/
void SessionProperties::OnListctrlUsbfilterSelected( wxListEvent& event )
{
wxUnusedVar(event);
#ifdef SUPPORT_USBIP
m_pCtrlUsbModify->Enable(true);
m_pCtrlUsbDelete->Enable(true);
#endif
}
/*!
* wxEVT_COMMAND_LIST_ITEM_ACTIVATED event handler for ID_LISTCTRL_USBFILTER
*/
void SessionProperties::OnListctrlUsbfilterItemActivated( wxListEvent& event )
{
#ifdef SUPPORT_USBIP
OnButtonUsbmodifyClick(event);
#else
wxUnusedVar(event);
#endif
}
/*!
* wxEVT_COMMAND_SPINCTRL_UPDATED event handler for ID_SPINCTRL_USB_LOCALPORT
*/
void SessionProperties::OnSpinctrlUsbLocalportUpdated( wxSpinEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_TEXT_UPDATED event handler for ID_SPINCTRL_USB_LOCALPORT
*/
void SessionProperties::OnSpinctrlUsbLocalportTextUpdated( wxCommandEvent& event )
{
wxUnusedVar(event);
if (m_bKeyTyped && (wxWindow::FindFocus() == (wxWindow *)m_pCtrlUsbLocalPort))
m_pCtrlApplyButton->Enable(true);
}
/*!
* wxEVT_COMMAND_TEXT_UPDATED event handler for ID_TEXTCTRL_USBIPD_SOCKET
*/
void SessionProperties::OnTextctrlUsbipdSocketTextUpdated( wxCommandEvent& event )
{
wxUnusedVar(event);
if (m_bKeyTyped && (wxWindow::FindFocus() == (wxWindow *)m_pCtrlUsbIpdSocket))
CheckChanged();
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_BROWSE_USBIPD_SOCKET
*/
void SessionProperties::OnButtonBrowseUsbipdSocketClick( wxCommandEvent& event )
{
wxUnusedVar(event);
wxFileName fn(m_sUsbipdSocket);
const wxString& file = ::wxFileSelector(_("Select path of USBIPD socket"),
fn.GetPath(), fn.GetName(), wxEmptyString, wxT("*"), wxFD_OPEN|wxFD_FILE_MUST_EXIST, this);
if (!file.IsEmpty()) {
m_pCtrlUsbIpdSocket->SetValue(file);
CheckChanged();
}
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_CREATEICON
*/
void SessionProperties::OnCheckboxCreateiconClick( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_PROXY
*/
void SessionProperties::OnCheckboxProxyClick( wxCommandEvent& event )
{
wxUnusedVar(event);
UpdateDialogConstraints(true);
CheckChanged();
}
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_PROXYSETTINGS
*/
void SessionProperties::OnButtonProxysettingsClick( wxCommandEvent& )
{
ProxyPropertyDialog d(this);
d.SetSProxyHost(m_sProxyHost);
d.SetIProxyPort(m_iProxyPort);
d.SetSProxyUser(m_sProxyUser);
d.SetSProxyPass(m_sProxyPass);
d.SetBProxyPassRemember(m_bProxyPassRemember);
d.SetSProxyCommand(m_sProxyCommand);
d.SetBExternalProxy(m_bExternalProxy);
d.SetBUseProxy(!m_bExternalProxy);
d.UpdateDialogConstraints();
if (wxID_OK == d.ShowModal()) {
m_sProxyHost = d.GetSProxyHost();
m_iProxyPort = d.GetIProxyPort();
m_sProxyUser = d.GetSProxyUser();
m_sProxyPass = d.GetSProxyPass();
m_bProxyPassRemember = d.GetBProxyPassRemember();
m_bExternalProxy = d.GetBExternalProxy();
m_sProxyCommand = d.GetSProxyCommand();
CheckChanged();
}
}
#if defined(__WXMSW__)
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_DISABLEDX
*/
void SessionProperties::OnCheckboxDisabledxClick( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
#endif
#if defined(__WXMSW__)
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_GRABKB
*/
void SessionProperties::OnCheckboxGrabkbClick( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
#endif
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_NODEFERRED
*/
void SessionProperties::OnCheckboxNodeferredClick( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_RESETMSGBOXES
*/
void SessionProperties::OnCheckboxResetmsgboxesClick( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_KBDOTHER
*/
void SessionProperties::OnCheckboxKbdotherClick( wxCommandEvent& event )
{
wxUnusedVar(event);
UpdateDialogConstraints(true);
CheckChanged();
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_IMG_CUSTOM
*/
void SessionProperties::OnCheckboxImgCustomClick( wxCommandEvent& event )
{
wxUnusedVar(event);
UpdateDialogConstraints(true);
CheckChanged();
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_LOWERCASE_LOGIN
*/
void SessionProperties::OnCheckboxLowercaseLoginClick( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
#if defined(__WXMSW__)
/*!
* wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_COMBOBOX_CLIPFILTER
*/
void SessionProperties::OnComboboxClipfilterSelected( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
#endif
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_CLEAR_PASSONABORT
*/
void SessionProperties::OnCheckboxClearPassonabortClick( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}
/*!
* wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_NOMAGICPIXEL
*/
void SessionProperties::OnCheckboxNomagicpixelClick( wxCommandEvent& event )
{
wxUnusedVar(event);
CheckChanged();
}