mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2025-11-12 19:38:26 -06:00
Linux/MacOSX: Implement TrueCrypt conversion and loading support. Correct many GTK issues linked to multi-threaded origine of events by implementing an automatic mechanism for handling such requests in the main thread.
This commit is contained in:
122
src/Main/Forms/WaitDialog.h
Executable file → Normal file
122
src/Main/Forms/WaitDialog.h
Executable file → Normal file
@@ -11,11 +11,16 @@
|
||||
|
||||
#include "Forms.h"
|
||||
#include "Main/Main.h"
|
||||
#include "Main/Application.h"
|
||||
#include <wx/msgqueue.h>
|
||||
|
||||
namespace VeraCrypt
|
||||
{
|
||||
|
||||
DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOGTHREAD_COMPLETED, -1);
|
||||
DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD, -1);
|
||||
DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOG_PIN, -1);
|
||||
DECLARE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_WAITDIALOG_SHOW_MSG, -1);
|
||||
|
||||
class WaitDialog;
|
||||
|
||||
@@ -50,6 +55,10 @@ namespace VeraCrypt
|
||||
GetSizer()->Fit( this );
|
||||
Centre( wxBOTH );
|
||||
Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOGTHREAD_COMPLETED, wxCommandEventHandler( WaitDialog::OnThreadCompletion ) );
|
||||
Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD, wxCommandEventHandler( WaitDialog::OnAdminPasswordRequest ) );
|
||||
Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_PIN, wxCommandEventHandler( WaitDialog::OnPinRequest ) );
|
||||
Connect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_SHOW_MSG, wxCommandEventHandler( WaitDialog::OnShowMsg ) );
|
||||
|
||||
Connect( wxEVT_TIMER, wxTimerEventHandler( WaitDialog::OnProgressTimer ), NULL, this );
|
||||
m_thread = new WaitThread(this, pRoutine);
|
||||
}
|
||||
@@ -58,6 +67,9 @@ namespace VeraCrypt
|
||||
{
|
||||
Disconnect( wxEVT_TIMER, wxTimerEventHandler( WaitDialog::OnProgressTimer ));
|
||||
Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOGTHREAD_COMPLETED, wxCommandEventHandler( WaitDialog::OnThreadCompletion ) );
|
||||
Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD, wxCommandEventHandler( WaitDialog::OnAdminPasswordRequest ) );
|
||||
Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_PIN, wxCommandEventHandler( WaitDialog::OnPinRequest ) );
|
||||
Disconnect( wxID_ANY, wxEVT_COMMAND_WAITDIALOG_SHOW_MSG, wxCommandEventHandler( WaitDialog::OnShowMsg ) );
|
||||
}
|
||||
|
||||
virtual void OnWaitDialogInit( wxInitDialogEvent& event )
|
||||
@@ -65,12 +77,119 @@ namespace VeraCrypt
|
||||
m_thread->Run();
|
||||
m_timer.Start(100);
|
||||
}
|
||||
|
||||
int GetCharWidth (wxWindow *window) const
|
||||
{
|
||||
int width;
|
||||
int height;
|
||||
window->GetTextExtent (L"a", &width, &height);
|
||||
|
||||
if (width < 1)
|
||||
return 7;
|
||||
|
||||
return width;
|
||||
}
|
||||
|
||||
class ShowMessageParam
|
||||
{
|
||||
public:
|
||||
wxString m_message;
|
||||
wxString m_caption;
|
||||
long m_style;
|
||||
bool m_topMost;
|
||||
ShowMessageParam(const wxString &message, const wxString &caption,long style, bool topMost)
|
||||
: m_message(message), m_caption(caption), m_style(style), m_topMost(topMost)
|
||||
{}
|
||||
};
|
||||
|
||||
int RequestShowMessage (const wxString &message, const wxString &caption,long style, bool topMost)
|
||||
{
|
||||
long lResult = -1;
|
||||
if (m_queue.IsOk())
|
||||
{
|
||||
wxString sResult;
|
||||
ShowMessageParam* pParam = new ShowMessageParam(message, caption, style, topMost);
|
||||
wxCommandEvent* pEvent = new wxCommandEvent( wxEVT_COMMAND_WAITDIALOG_SHOW_MSG,0);
|
||||
pEvent->SetClientData (pParam);
|
||||
wxQueueEvent (this, pEvent);
|
||||
m_queue.Receive (sResult);
|
||||
sResult.ToLong(&lResult);
|
||||
}
|
||||
return (int) lResult;
|
||||
}
|
||||
|
||||
void RequestAdminPassword (wxString& adminPassword)
|
||||
{
|
||||
if (m_queue.IsOk())
|
||||
{
|
||||
wxQueueEvent (this, new wxCommandEvent( wxEVT_COMMAND_WAITDIALOG_ADMIN_PASSWORD,0));
|
||||
if (wxMSGQUEUE_NO_ERROR != m_queue.Receive (adminPassword))
|
||||
adminPassword = wxT("");
|
||||
}
|
||||
else
|
||||
adminPassword = wxT("");
|
||||
}
|
||||
|
||||
void RequestPin (wxString& pin)
|
||||
{
|
||||
if (m_queue.IsOk())
|
||||
{
|
||||
wxCommandEvent* pEvent = new wxCommandEvent( wxEVT_COMMAND_WAITDIALOG_PIN,0);
|
||||
pEvent->SetString (pin);
|
||||
wxQueueEvent (this, pEvent);
|
||||
if (wxMSGQUEUE_NO_ERROR != m_queue.Receive (pin))
|
||||
pin = wxT("");
|
||||
}
|
||||
else
|
||||
pin = wxT("");
|
||||
}
|
||||
|
||||
// virtual void OnWaitDialogClose( wxCloseEvent& event ) { }
|
||||
void OnThreadCompletion(wxCommandEvent &)
|
||||
{
|
||||
m_queue.Clear();
|
||||
EndModal(0);
|
||||
}
|
||||
|
||||
void OnAdminPasswordRequest(wxCommandEvent &)
|
||||
{
|
||||
|
||||
wxPasswordEntryDialog dialog (this, _("Enter your user password or administrator password:"), _("Administrator privileges required"));
|
||||
if (dialog.ShowModal() != wxID_OK)
|
||||
m_queue.Post(wxT(""));
|
||||
else
|
||||
m_queue.Post(dialog.GetValue());
|
||||
}
|
||||
|
||||
|
||||
|
||||
void OnPinRequest(wxCommandEvent &e)
|
||||
{
|
||||
|
||||
wxPasswordEntryDialog dialog (this, wxString::Format (LangString["ENTER_TOKEN_PASSWORD"], e.GetString()), LangString["IDD_TOKEN_PASSWORD"]);
|
||||
dialog.SetSize (wxSize (GetCharWidth (&dialog) * 50, -1));
|
||||
|
||||
if (dialog.ShowModal() != wxID_OK)
|
||||
m_queue.Post(wxT(""));
|
||||
else
|
||||
m_queue.Post(dialog.GetValue());
|
||||
}
|
||||
|
||||
void OnShowMsg(wxCommandEvent &e)
|
||||
{
|
||||
ShowMessageParam* pParam = (ShowMessageParam*) e.GetClientData();
|
||||
if (pParam->m_topMost)
|
||||
{
|
||||
if (!IsActive())
|
||||
RequestUserAttention (wxUSER_ATTENTION_ERROR);
|
||||
|
||||
pParam->m_style |= wxSTAY_ON_TOP;
|
||||
}
|
||||
|
||||
int iResult = wxMessageBox (pParam->m_message, pParam->m_caption, pParam->m_style, this);
|
||||
delete pParam;
|
||||
m_queue.Post(wxString::Format(wxT("%d"), iResult));
|
||||
}
|
||||
|
||||
void OnProgressTimer(wxTimerEvent& event)
|
||||
{
|
||||
@@ -83,7 +202,8 @@ namespace VeraCrypt
|
||||
|
||||
protected:
|
||||
WaitThread* m_thread;
|
||||
wxTimer m_timer;
|
||||
wxTimer m_timer;
|
||||
wxMessageQueue<wxString> m_queue;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user