From e39f5fa5d6b1b09df16271cabb1dda5d42c0b980 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Sun, 29 Apr 2018 17:33:33 +0200 Subject: MacOSX: support pasting values to password fields using keyboard (CMD+V and CMD+A now working properly). This make using password managers with VeraCrypt easier. --- src/Main/Forms/ChangePasswordDialog.cpp | 15 ++++++++++++ src/Main/Forms/ChangePasswordDialog.h | 4 ++++ src/Main/Forms/MountOptionsDialog.cpp | 16 +++++++++++++ src/Main/Forms/MountOptionsDialog.h | 4 ++++ src/Main/Forms/VolumeCreationWizard.cpp | 15 ++++++++++++ src/Main/Forms/VolumeCreationWizard.h | 4 ++++ src/Main/GraphicUserInterface.cpp | 42 +++++++++++++++++++++++++++++++++ src/Main/GraphicUserInterface.h | 7 ++++++ 8 files changed, 107 insertions(+) diff --git a/src/Main/Forms/ChangePasswordDialog.cpp b/src/Main/Forms/ChangePasswordDialog.cpp index 2f8e1e47..819d9bf2 100644 --- a/src/Main/Forms/ChangePasswordDialog.cpp +++ b/src/Main/Forms/ChangePasswordDialog.cpp @@ -18,6 +18,17 @@ namespace VeraCrypt { +#ifdef TC_MACOSX + + bool ChangePasswordDialog::ProcessEvent(wxEvent& event) + { + if(GraphicUserInterface::HandlePasswordEntryCustomEvent (event)) + return true; + else + return ChangePasswordDialogBase::ProcessEvent(event); + } +#endif + ChangePasswordDialog::ChangePasswordDialog (wxWindow* parent, shared_ptr volumePath, Mode::Enum mode, shared_ptr password, shared_ptr keyfiles, shared_ptr newPassword, shared_ptr newKeyfiles) : ChangePasswordDialogBase (parent), DialogMode (mode), Path (volumePath) { @@ -57,6 +68,10 @@ namespace VeraCrypt default: throw ParameterIncorrect (SRC_POS); } + +#ifdef TC_MACOSX + GraphicUserInterface::InstallPasswordEntryCustomKeyboardShortcuts (this); +#endif CurrentPasswordPanel = new VolumePasswordPanel (this, NULL, password, false, keyfiles, false, true, true, false, true, true); CurrentPasswordPanel->UpdateEvent.Connect (EventConnector (this, &ChangePasswordDialog::OnPasswordPanelUpdate)); diff --git a/src/Main/Forms/ChangePasswordDialog.h b/src/Main/Forms/ChangePasswordDialog.h index 242bd965..66fbfecf 100644 --- a/src/Main/Forms/ChangePasswordDialog.h +++ b/src/Main/Forms/ChangePasswordDialog.h @@ -35,6 +35,10 @@ namespace VeraCrypt ChangePasswordDialog (wxWindow* parent, shared_ptr volumePath, Mode::Enum mode = Mode::ChangePasswordAndKeyfiles, shared_ptr password = shared_ptr (), shared_ptr keyfiles = shared_ptr (), shared_ptr newPassword = shared_ptr (), shared_ptr newKeyfiles = shared_ptr ()); virtual ~ChangePasswordDialog (); + +#ifdef TC_MACOSX + virtual bool ProcessEvent(wxEvent& event); +#endif protected: void OnOKButtonClick (wxCommandEvent& event); diff --git a/src/Main/Forms/MountOptionsDialog.cpp b/src/Main/Forms/MountOptionsDialog.cpp index 9a9f2691..c33cf9fe 100644 --- a/src/Main/Forms/MountOptionsDialog.cpp +++ b/src/Main/Forms/MountOptionsDialog.cpp @@ -17,6 +17,17 @@ namespace VeraCrypt { +#ifdef TC_MACOSX + + bool MountOptionsDialog::ProcessEvent(wxEvent& event) + { + if(GraphicUserInterface::HandlePasswordEntryCustomEvent (event)) + return true; + else + return MountOptionsDialogBase::ProcessEvent(event); + } +#endif + MountOptionsDialog::MountOptionsDialog (wxWindow *parent, MountOptions &options, const wxString &title, bool disableMountOptions) : MountOptionsDialogBase (parent, wxID_ANY, wxString() #ifdef __WXGTK__ // GTK apparently needs wxRESIZE_BORDER to support dynamic resizing @@ -33,6 +44,11 @@ namespace VeraCrypt if (disableMountOptions) OptionsButton->Show (false); + + +#ifdef TC_MACOSX + GraphicUserInterface::InstallPasswordEntryCustomKeyboardShortcuts (this); +#endif PasswordPanel = new VolumePasswordPanel (this, &options, options.Password, disableMountOptions, options.Keyfiles, !disableMountOptions, true, true, false, true, true); PasswordPanel->SetCacheCheckBoxValidator (wxGenericValidator (&Options.CachePassword)); diff --git a/src/Main/Forms/MountOptionsDialog.h b/src/Main/Forms/MountOptionsDialog.h index 4a2b38be..6366ce85 100644 --- a/src/Main/Forms/MountOptionsDialog.h +++ b/src/Main/Forms/MountOptionsDialog.h @@ -24,6 +24,10 @@ namespace VeraCrypt public: MountOptionsDialog (wxWindow* parent, MountOptions &options, const wxString &title = wxEmptyString, bool disableMountOptions = false); void OnShow (); + +#ifdef TC_MACOSX + virtual bool ProcessEvent(wxEvent& event); +#endif protected: void OnInitDialog (wxInitDialogEvent& event); diff --git a/src/Main/Forms/VolumeCreationWizard.cpp b/src/Main/Forms/VolumeCreationWizard.cpp index 15c92c32..b28b1c37 100644 --- a/src/Main/Forms/VolumeCreationWizard.cpp +++ b/src/Main/Forms/VolumeCreationWizard.cpp @@ -36,6 +36,17 @@ namespace VeraCrypt { +#ifdef TC_MACOSX + + bool VolumeCreationWizard::ProcessEvent(wxEvent& event) + { + if(GraphicUserInterface::HandlePasswordEntryCustomEvent (event)) + return true; + else + return WizardFrame::ProcessEvent(event); + } +#endif + VolumeCreationWizard::VolumeCreationWizard (wxWindow* parent) : WizardFrame (parent), CrossPlatformSupport (true), @@ -55,6 +66,10 @@ namespace VeraCrypt SetTitle (LangString["INTRO_TITLE"]); SetImage (Resources::GetVolumeCreationWizardBitmap (Gui->GetCharHeight (this) * 21)); SetMaxStaticTextWidth (55); + +#ifdef TC_MACOSX + GraphicUserInterface::InstallPasswordEntryCustomKeyboardShortcuts (this); +#endif SetStep (Step::VolumeHostType); diff --git a/src/Main/Forms/VolumeCreationWizard.h b/src/Main/Forms/VolumeCreationWizard.h index 85203b9a..c4087426 100644 --- a/src/Main/Forms/VolumeCreationWizard.h +++ b/src/Main/Forms/VolumeCreationWizard.h @@ -24,6 +24,10 @@ namespace VeraCrypt VolumeCreationWizard (wxWindow* parent); ~VolumeCreationWizard (); +#ifdef TC_MACOSX + virtual bool ProcessEvent(wxEvent& event); +#endif + protected: struct Step { diff --git a/src/Main/GraphicUserInterface.cpp b/src/Main/GraphicUserInterface.cpp index 9ae735e4..ba283af4 100755 --- a/src/Main/GraphicUserInterface.cpp +++ b/src/Main/GraphicUserInterface.cpp @@ -37,6 +37,11 @@ namespace VeraCrypt { +#ifdef TC_MACOSX + int GraphicUserInterface::g_customIdCmdV = 0; + int GraphicUserInterface::g_customIdCmdA = 0; +#endif + GraphicUserInterface::GraphicUserInterface () : ActiveFrame (nullptr), BackgroundMode (false), @@ -51,6 +56,8 @@ namespace VeraCrypt #endif #ifdef TC_MACOSX + g_customIdCmdV = wxNewId(); + g_customIdCmdA = wxNewId(); wxApp::s_macHelpMenuTitleName = _("&Help"); #endif } @@ -657,6 +664,41 @@ namespace VeraCrypt { SetBackgroundMode (false); } + + bool GraphicUserInterface::HandlePasswordEntryCustomEvent (wxEvent& event) + { + bool bHandled = false; + if ( (event.GetEventType() == wxEVT_MENU) + && ((event.GetId() == g_customIdCmdV) || (event.GetId() == g_customIdCmdA))) + { + wxWindow* focusedCtrl = wxWindow::FindFocus(); + if (focusedCtrl + && (focusedCtrl->IsKindOf(wxCLASSINFO(wxTextCtrl))) + && (focusedCtrl->GetWindowStyle() & wxTE_PASSWORD)) + { + wxTextCtrl* passwordCtrl = (wxTextCtrl*) focusedCtrl; + if (event.GetId() == g_customIdCmdV) + passwordCtrl->Paste (); + else if (event.GetId() == g_customIdCmdA) + passwordCtrl->SelectAll (); + bHandled = true; + } + } + + return bHandled; + } + + void GraphicUserInterface::InstallPasswordEntryCustomKeyboardShortcuts (wxWindow* window) + { + // we manually handle CMD+V and CMD+A on password fields in order to support + // pasting password values into them. By default, wxWidgets doesn't handle this + // for password entry fields. + wxAcceleratorEntry entries[2]; + entries[0].Set(wxACCEL_CMD, (int) 'V', g_customIdCmdV); + entries[1].Set(wxACCEL_CMD, (int) 'A', g_customIdCmdA); + wxAcceleratorTable accel(sizeof(entries) / sizeof(wxAcceleratorEntry), entries); + window->SetAcceleratorTable(accel); + } #endif void GraphicUserInterface::MoveListCtrlItem (wxListCtrl *listCtrl, long itemIndex, long newItemIndex) const diff --git a/src/Main/GraphicUserInterface.h b/src/Main/GraphicUserInterface.h index f170d9a6..01f385a3 100644 --- a/src/Main/GraphicUserInterface.h +++ b/src/Main/GraphicUserInterface.h @@ -100,6 +100,8 @@ namespace VeraCrypt #ifdef TC_MACOSX virtual void MacOpenFiles (const wxArrayString &fileNames); virtual void MacReopenApp (); + static bool HandlePasswordEntryCustomEvent (wxEvent& event); + static void InstallPasswordEntryCustomKeyboardShortcuts (wxWindow* window); #endif template @@ -133,6 +135,11 @@ namespace VeraCrypt auto_ptr SingleInstanceChecker; mutable WaitDialog* mWaitDialog; +public: +#ifdef TC_MACOSX + static int g_customIdCmdV; + static int g_customIdCmdA; +#endif private: GraphicUserInterface (const GraphicUserInterface &); -- cgit v1.2.3