From 78e1f60d63344e71e6846e9a3d4725953565864c Mon Sep 17 00:00:00 2001 From: deuce <> Date: Sun, 29 Jul 2007 00:24:12 +0000 Subject: [PATCH] Apparently, not cross-platform toolkit is happy with multiple threads doing stuff at the same time. Remove the timer idea (Not multithread happy on Win32) and use deferred events with mutexes and semaphores galore. Whee. --- src/syncterm/htmlwin.cpp | 170 +++++++++++++++++++-------------------- 1 file changed, 84 insertions(+), 86 deletions(-) diff --git a/src/syncterm/htmlwin.cpp b/src/syncterm/htmlwin.cpp index 95109f0369..9617384615 100644 --- a/src/syncterm/htmlwin.cpp +++ b/src/syncterm/htmlwin.cpp @@ -28,19 +28,15 @@ static sem_t state_changed; static pthread_mutex_t update_mutex; static wxString update_str; - enum update_type { HTML_WIN_UPDATE_NONE ,HTML_WIN_UPDATE_ADD ,HTML_WIN_UPDATE_REPLACE }; - static enum update_type update_type=HTML_WIN_UPDATE_NONE; static wxFrame *frame; static wxHtmlWindow *htmlWindow; -static wxTimer *update_timer; -static wxTimer *state_timer; static int window_width=640; static int window_height=400; @@ -56,82 +52,8 @@ enum html_window_state { ,HTML_WIN_STATE_ICONIZED ,HTML_WIN_STATE_HIDDEN }; - static enum html_window_state html_window_requested_state=HTML_WIN_STATE_RAISED; -class MyUpdateTimer: public wxTimer -{ -protected: - void Notify(void); -}; - -void MyUpdateTimer::Notify(void) -{ - int width,height,xpos,ypos; - - pthread_mutex_lock(&update_mutex); - switch(update_type) { - case HTML_WIN_UPDATE_REPLACE: - frame->Show(); - frame->Raise(); - frame->GetPosition(&xpos, &ypos); - frame->GetSize(&width, &height); - if(xpos != window_xpos - || ypos != window_ypos - || width != window_width - || height != window_height) - frame->SetSize(window_xpos, window_ypos, window_width, window_height, wxSIZE_AUTO); - htmlWindow->SetPage(update_str); - htmlWindow->Raise(); - htmlWindow->SetFocus(); - sem_post(&shown); - break; - case HTML_WIN_UPDATE_ADD: - htmlWindow->AppendToPage(update_str); - sem_post(&shown); - break; - } - update_str=wxT(""); - update_type=HTML_WIN_UPDATE_NONE; - pthread_mutex_unlock(&update_mutex); -} - -class MyStateTimer: public wxTimer -{ -protected: - void Notify(void); -}; - -void MyStateTimer::Notify(void) -{ - if(wxTheApp) { - switch(html_window_requested_state) { - case HTML_WIN_STATE_RAISED: - if(!frame->IsShown()) - frame->Show(); - if(frame->IsIconized()) - frame->Iconize(false); - frame->Raise(); - htmlWindow->Raise(); - htmlWindow->SetFocus(); - break; - case HTML_WIN_STATE_ICONIZED: - if(!frame->IsShown()) - frame->Show(); - frame->Lower(); - if(!frame->IsIconized()) - frame->Iconize(true); - break; - case HTML_WIN_STATE_HIDDEN: - frame->Lower(); - if(frame->IsShown()) - frame->Show(false); - break; - } - } - sem_post(&state_changed); -} - class MyHTML: public wxHtmlWindow { public: @@ -142,6 +64,8 @@ public: protected: wxHtmlOpeningStatus OnOpeningURL(wxHtmlURLType type,const wxString& url, wxString *redirect) const; void MyHTML::OnKeyDown(wxKeyEvent& event); + void MyHTML::OnUpdate(wxCommandEvent &event); + void MyHTML::OnState(wxCommandEvent &event); DECLARE_EVENT_TABLE() }; @@ -210,13 +134,87 @@ void MyHTML::OnKeyDown(wxKeyEvent& event) event.Skip(); } +void MyHTML::OnUpdate(wxCommandEvent &event) +{ + int width,height,xpos,ypos; + + pthread_mutex_lock(&update_mutex); + switch(update_type) { + case HTML_WIN_UPDATE_REPLACE: + frame->Show(); + frame->Raise(); + frame->GetPosition(&xpos, &ypos); + frame->GetSize(&width, &height); + if(xpos != window_xpos + || ypos != window_ypos + || width != window_width + || height != window_height) + frame->SetSize(window_xpos, window_ypos, window_width, window_height, wxSIZE_AUTO); + htmlWindow->SetPage(update_str); + htmlWindow->Raise(); + htmlWindow->SetFocus(); + sem_post(&shown); + break; + case HTML_WIN_UPDATE_ADD: + htmlWindow->AppendToPage(update_str); + sem_post(&shown); + break; + } + update_str=wxT(""); + update_type=HTML_WIN_UPDATE_NONE; + pthread_mutex_unlock(&update_mutex); +} + +void MyHTML::OnState(wxCommandEvent &event) +{ + if(wxTheApp) { + switch(html_window_requested_state) { + case HTML_WIN_STATE_RAISED: + if(!frame->IsShown()) + frame->Show(); + if(frame->IsIconized()) + frame->Iconize(false); + frame->Raise(); + htmlWindow->Raise(); + htmlWindow->SetFocus(); + break; + case HTML_WIN_STATE_ICONIZED: + if(!frame->IsShown()) + frame->Show(); + frame->Lower(); + if(!frame->IsIconized()) + frame->Iconize(true); + break; + case HTML_WIN_STATE_HIDDEN: + frame->Lower(); + if(frame->IsShown()) + frame->Show(false); + break; + } + } + sem_post(&state_changed); +} + #define HTML_ID wxID_HIGHEST +DECLARE_EVENT_TYPE(update_event, -1) +DECLARE_EVENT_TYPE(state_event, -1) +DEFINE_EVENT_TYPE(update_event) +DEFINE_EVENT_TYPE(state_event) + BEGIN_EVENT_TABLE(MyHTML, wxHtmlWindow) EVT_KEY_DOWN(MyHTML::OnKeyDown) EVT_HTML_LINK_CLICKED(HTML_ID, MyHTML::Clicked) + EVT_COMMAND(HTML_ID, update_event, MyHTML::OnUpdate) + EVT_COMMAND(HTML_ID, state_event, MyHTML::OnState) END_EVENT_TABLE() +void send_html_event(int evt) +{ + wxCommandEvent event( evt, HTML_ID ); + htmlWindow->GetEventHandler()->AddPendingEvent( event ); +} + class MyFrame: public wxFrame { public: @@ -260,8 +258,6 @@ bool MyApp::OnInit() htmlWindow->SetRelatedFrame(frame,wxT("SyncTERM HTML : %s")); wxFileSystem::AddHandler(new wxInternetFSHandler); wxInitAllImageHandlers(); - update_timer = new MyUpdateTimer(); - state_timer = new MyStateTimer(); frame->Show(); SetTopWindow( frame ); while(wxTheApp->Pending()) @@ -316,21 +312,21 @@ extern "C" { void hide_html(void) { html_window_requested_state=HTML_WIN_STATE_HIDDEN; - state_timer->Start(1, true); + send_html_event(state_event); sem_wait(&state_changed); } void iconize_html(void) { html_window_requested_state=HTML_WIN_STATE_ICONIZED; - state_timer->Start(1, true); + send_html_event(state_event); sem_wait(&state_changed); } void raise_html(void) { html_window_requested_state=HTML_WIN_STATE_RAISED; - state_timer->Start(1, true); + send_html_event(state_event); sem_wait(&state_changed); } @@ -338,10 +334,12 @@ extern "C" { { pthread_mutex_lock(&update_mutex); if(update_type!=HTML_WIN_UPDATE_NONE) { - update_timer->Start(1, true); + send_html_event(update_event); + pthread_mutex_unlock(&update_mutex); + sem_wait(&shown); } - pthread_mutex_unlock(&update_mutex); - sem_wait(&shown); + else + pthread_mutex_unlock(&update_mutex); } void add_html(const char *buf) -- GitLab