From 23ba447283a3b2545b10d7a398458e5b6147d2e8 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Tue, 10 May 2016 13:10:37 +0200 Subject: [PATCH] ZRCola now minimizes to system tray. (closes #20) --- ZRCola/ZRCola.fbp | 2 +- ZRCola/zrcolafrm.cpp | 39 +++++++++++++++++++++++++++++++++++++-- ZRCola/zrcolafrm.h | 4 ++++ ZRCola/zrcolagui.cpp | 2 ++ ZRCola/zrcolagui.h | 1 + 5 files changed, 45 insertions(+), 3 deletions(-) diff --git a/ZRCola/ZRCola.fbp b/ZRCola/ZRCola.fbp index b1a76f7..8f702da 100644 --- a/ZRCola/ZRCola.fbp +++ b/ZRCola/ZRCola.fbp @@ -66,7 +66,7 @@ - + OnIconize OnIdle diff --git a/ZRCola/zrcolafrm.cpp b/ZRCola/zrcolafrm.cpp index d07a471..aa099f1 100644 --- a/ZRCola/zrcolafrm.cpp +++ b/ZRCola/zrcolafrm.cpp @@ -75,14 +75,25 @@ wxZRColaFrame::wxZRColaFrame() : // Load main window icons. #ifdef __WINDOWS__ + wxIcon icon_small(wxT("00_zrcola.ico"), wxBITMAP_TYPE_ICO_RESOURCE, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON)); wxIconBundle icons; - icons.AddIcon(wxIcon(wxT("00_zrcola.ico"), wxBITMAP_TYPE_ICO_RESOURCE, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON))); + icons.AddIcon(icon_small); icons.AddIcon(wxIcon(wxT("00_zrcola.ico"), wxBITMAP_TYPE_ICO_RESOURCE, ::GetSystemMetrics(SM_CXICON ), ::GetSystemMetrics(SM_CYICON ))); SetIcons(icons); #else - SetIcon(wxICON(00_zrcola.ico)); + wxIcon icon_small(wxICON(00_zrcola.ico)); + SetIcon(icon_small); #endif + m_taskBarIcon = new wxTaskBarIcon(); + if (m_taskBarIcon->IsOk()) { + m_taskBarIcon->SetIcon(icon_small, _("ZRCola")); + m_taskBarIcon->Connect(wxEVT_TASKBAR_LEFT_DOWN, wxTaskBarIconEventHandler(wxZRColaFrame::OnTaskbarIconClick), NULL, this); + } else { + // Taskbar icon creation failed. Not the end of the world. No taskbar icon then. + delete m_taskBarIcon; + } + { // Populate language lists. memcpy(m_lang, ZRCOLA_LANG_VOID, sizeof(m_lang)); @@ -153,6 +164,11 @@ wxZRColaFrame::~wxZRColaFrame() UnregisterHotKey(wxZRColaHKID_INVOKE_DECOMPOSE); UnregisterHotKey(wxZRColaHKID_INVOKE_COMPOSE); + if (m_taskBarIcon) { + m_taskBarIcon->Disconnect(wxEVT_TASKBAR_LEFT_DOWN, wxTaskBarIconEventHandler(wxZRColaFrame::OnTaskbarIconClick), NULL, this); + delete m_taskBarIcon; + } + // Save wxAuiManager's state before return to parent's destructor. // Since the later calls m_mgr.UnInit() the regular persistence mechanism is useless to save wxAuiManager's state. wxPersistentAuiManager((wxAuiManager*)&m_mgr).Save(); @@ -350,6 +366,25 @@ void wxZRColaFrame::OnIdle(wxIdleEvent& event) } +void wxZRColaFrame::OnTaskbarIconClick(wxTaskBarIconEvent& event) +{ + Iconize(false); + Show(true); + Raise(); + + event.Skip(); +} + + +void wxZRColaFrame::OnIconize(wxIconizeEvent& event) +{ + if (m_taskBarIcon) + Show(!event.IsIconized()); + + event.Skip(); +} + + void wxZRColaFrame::OnToolbarEditUpdate(wxUpdateUIEvent& event) { event.Check(m_mgr.GetPane(m_toolbarEdit).IsShown()); diff --git a/ZRCola/zrcolafrm.h b/ZRCola/zrcolafrm.h index 7a5cff8..7aebaac 100644 --- a/ZRCola/zrcolafrm.h +++ b/ZRCola/zrcolafrm.h @@ -27,6 +27,7 @@ class wxZRColaFrame; #include "zrcolagui.h" #include +#include #include #if defined(__WXMSW__) #include @@ -79,6 +80,8 @@ protected: void OnDecomposedLanguage(wxCommandEvent& event); virtual void OnDecompLanguageChoice(wxCommandEvent& event); virtual void OnIdle(wxIdleEvent& event); + void OnTaskbarIconClick(wxTaskBarIconEvent& event); + virtual void OnIconize(wxIconizeEvent& event); void OnToolbarEditUpdate(wxUpdateUIEvent& event); void OnToolbarEdit(wxCommandEvent& event); void OnToolbarComposeUpdate(wxUpdateUIEvent& event); @@ -118,6 +121,7 @@ protected: bool m_lang_auto; ///< Automatic language selection according to keyboard layout ZRCola::langid_t m_lang; ///< Language for decomposing WXHWND m_hWndSource; ///< handle of the active window, when the ZRCola hotkey was pressed + wxTaskBarIcon *m_taskBarIcon; ///< Taskbar icon }; diff --git a/ZRCola/zrcolagui.cpp b/ZRCola/zrcolagui.cpp index fef65cd..6e4b6a7 100644 --- a/ZRCola/zrcolagui.cpp +++ b/ZRCola/zrcolagui.cpp @@ -183,6 +183,7 @@ wxZRColaFrameBase::wxZRColaFrameBase( wxWindow* parent, wxWindowID id, const wxS this->Centre( wxBOTH ); // Connect Events + this->Connect( wxEVT_ICONIZE, wxIconizeEventHandler( wxZRColaFrameBase::OnIconize ) ); this->Connect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaFrameBase::OnIdle ) ); m_toolDecompLanguage->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( wxZRColaFrameBase::OnDecompLanguageChoice ), NULL, this ); } @@ -190,6 +191,7 @@ wxZRColaFrameBase::wxZRColaFrameBase( wxWindow* parent, wxWindowID id, const wxS wxZRColaFrameBase::~wxZRColaFrameBase() { // Disconnect Events + this->Disconnect( wxEVT_ICONIZE, wxIconizeEventHandler( wxZRColaFrameBase::OnIconize ) ); this->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaFrameBase::OnIdle ) ); m_toolDecompLanguage->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( wxZRColaFrameBase::OnDecompLanguageChoice ), NULL, this ); diff --git a/ZRCola/zrcolagui.h b/ZRCola/zrcolagui.h index c18771b..901e9d7 100644 --- a/ZRCola/zrcolagui.h +++ b/ZRCola/zrcolagui.h @@ -77,6 +77,7 @@ class wxZRColaFrameBase : public wxFrame wxStatusBar* m_statusBar; // Virtual event handlers, overide them in your derived class + virtual void OnIconize( wxIconizeEvent& event ) { event.Skip(); } virtual void OnIdle( wxIdleEvent& event ) { event.Skip(); } virtual void OnDecompLanguageChoice( wxCommandEvent& event ) { event.Skip(); }