1 /////////////////////////////////////////////////////////////////////////
3 // Purpose: Implements wxTaskBarIcon class for manipulating icons on
4 // the Windows task bar.
5 // Author: Julian Smart
10 // Licence: wxWindows licence
11 /////////////////////////////////////////////////////////////////////////
14 #pragma implementation "taskbar.h"
17 // For compilers that support precompilation, includes "wx.h".
18 #include "wx/wxprec.h"
28 #include "wx/window.h"
36 #include <wx/msw/taskbar.h>
37 #include <wx/msw/private.h>
40 #include <wx/msw/gnuwin32/extra.h>
43 LRESULT APIENTRY _EXPORT
wxTaskBarIconWindowProc( HWND hWnd
, unsigned msg
,
44 UINT wParam
, LONG lParam
);
46 char *wxTaskBarWindowClass
= "wxTaskBarWindowClass";
48 wxList
wxTaskBarIcon::sm_taskBarIcons
;
49 bool wxTaskBarIcon::sm_registeredClass
= FALSE
;
50 UINT
wxTaskBarIcon::sm_taskbarMsg
= 0;
53 #if !USE_SHARED_LIBRARY
54 BEGIN_EVENT_TABLE(wxTaskBarIcon
, wxEvtHandler
)
55 EVT_TASKBAR_MOVE (wxTaskBarIcon::_OnMouseMove
)
56 EVT_TASKBAR_LEFT_DOWN (wxTaskBarIcon::_OnLButtonDown
)
57 EVT_TASKBAR_LEFT_UP (wxTaskBarIcon::_OnLButtonUp
)
58 EVT_TASKBAR_RIGHT_DOWN (wxTaskBarIcon::_OnRButtonDown
)
59 EVT_TASKBAR_RIGHT_UP (wxTaskBarIcon::_OnRButtonUp
)
60 EVT_TASKBAR_LEFT_DCLICK (wxTaskBarIcon::_OnLButtonDClick
)
61 EVT_TASKBAR_RIGHT_DCLICK (wxTaskBarIcon::_OnRButtonDClick
)
65 IMPLEMENT_DYNAMIC_CLASS(wxTaskBarIcon
, wxEvtHandler
)
69 wxTaskBarIcon::wxTaskBarIcon(void)
76 if (RegisterWindowClass())
77 m_hWnd
= CreateTaskBarWindow();
80 wxTaskBarIcon::~wxTaskBarIcon(void)
91 ::DestroyWindow((HWND
) m_hWnd
);
97 bool wxTaskBarIcon::SetIcon(const wxIcon
& icon
, const wxString
& tooltip
)
102 NOTIFYICONDATA notifyData
;
104 memset(¬ifyData
, 0, sizeof(notifyData
));
105 notifyData
.cbSize
= sizeof(notifyData
);
106 notifyData
.hWnd
= (HWND
) m_hWnd
;
107 notifyData
.uCallbackMessage
= sm_taskbarMsg
;
108 notifyData
.uFlags
= NIF_MESSAGE
;
111 notifyData
.uFlags
|= NIF_ICON
;
112 notifyData
.hIcon
= (HICON
) icon
.GetHICON();
115 if (((const char*) tooltip
!= NULL
) && (tooltip
!= ""))
117 notifyData
.uFlags
|= NIF_TIP
;
118 lstrcpyn(notifyData
.szTip
, (char*) (const char*) tooltip
, sizeof(notifyData
.szTip
));
124 return (Shell_NotifyIcon(NIM_MODIFY
, & notifyData
) != 0);
127 m_iconAdded
= (Shell_NotifyIcon(NIM_ADD
, & notifyData
) != 0);
132 bool wxTaskBarIcon::RemoveIcon(void)
137 NOTIFYICONDATA notifyData
;
139 memset(¬ifyData
, 0, sizeof(notifyData
));
140 notifyData
.cbSize
= sizeof(notifyData
);
141 notifyData
.hWnd
= (HWND
) m_hWnd
;
142 notifyData
.uCallbackMessage
= sm_taskbarMsg
;
143 notifyData
.uFlags
= NIF_MESSAGE
;
144 notifyData
.hIcon
= 0 ; // hIcon;
148 return (Shell_NotifyIcon(NIM_DELETE
, & notifyData
) != 0);
151 bool wxTaskBarIcon::PopupMenu(wxMenu
*menu
) //, int x, int y);
156 wxGetMousePosition(&x
, &y
);
158 // is wxFrame the best window type to use???
159 win
= new wxFrame(NULL
, -1, "", wxPoint(x
,y
), wxSize(-1,-1), 0);
160 win
->PushEventHandler(this);
162 rval
= win
->PopupMenu(menu
, 0, 0);
164 win
->PopEventHandler(FALSE
);
171 void wxTaskBarIcon::OnMouseMove(wxEvent
&)
175 void wxTaskBarIcon::OnLButtonDown(wxEvent
&)
179 void wxTaskBarIcon::OnLButtonUp(wxEvent
&)
183 void wxTaskBarIcon::OnRButtonDown(wxEvent
&)
187 void wxTaskBarIcon::OnRButtonUp(wxEvent
&)
191 void wxTaskBarIcon::OnLButtonDClick(wxEvent
&)
195 void wxTaskBarIcon::OnRButtonDClick(wxEvent
&)
199 void wxTaskBarIcon::_OnMouseMove(wxEvent
& e
) { OnMouseMove(e
); }
200 void wxTaskBarIcon::_OnLButtonDown(wxEvent
& e
) { OnLButtonDown(e
); }
201 void wxTaskBarIcon::_OnLButtonUp(wxEvent
& e
) { OnLButtonUp(e
); }
202 void wxTaskBarIcon::_OnRButtonDown(wxEvent
& e
) { OnRButtonDown(e
); }
203 void wxTaskBarIcon::_OnRButtonUp(wxEvent
& e
) { OnRButtonUp(e
); }
204 void wxTaskBarIcon::_OnLButtonDClick(wxEvent
& e
) { OnLButtonDClick(e
); }
205 void wxTaskBarIcon::_OnRButtonDClick(wxEvent
& e
) { OnRButtonDClick(e
); }
208 wxTaskBarIcon
* wxTaskBarIcon::FindObjectForHWND(WXHWND hWnd
)
210 wxNode
*node
= sm_taskBarIcons
.First();
213 wxTaskBarIcon
* obj
= (wxTaskBarIcon
*) node
->Data();
214 if (obj
->GetHWND() == hWnd
)
221 void wxTaskBarIcon::AddObject(wxTaskBarIcon
* obj
)
223 sm_taskBarIcons
.Append(obj
);
226 void wxTaskBarIcon::RemoveObject(wxTaskBarIcon
* obj
)
228 sm_taskBarIcons
.DeleteObject(obj
);
231 bool wxTaskBarIcon::RegisterWindowClass()
233 if (sm_registeredClass
)
236 // Also register the taskbar message here
237 sm_taskbarMsg
= ::RegisterWindowMessage("wxTaskBarIconMessage");
242 HINSTANCE hInstance
= GetModuleHandle(NULL
);
245 * set up and register window class
247 wc
.style
= CS_HREDRAW
| CS_VREDRAW
;
248 wc
.lpfnWndProc
= (WNDPROC
) wxTaskBarIconWindowProc
;
251 wc
.hInstance
= hInstance
;
254 wc
.hbrBackground
= 0;
255 wc
.lpszMenuName
= NULL
;
256 wc
.lpszClassName
= wxTaskBarWindowClass
;
257 rc
= (::RegisterClass( &wc
) != 0);
259 sm_registeredClass
= (rc
!= 0);
264 WXHWND
wxTaskBarIcon::CreateTaskBarWindow()
266 HINSTANCE hInstance
= GetModuleHandle(NULL
);
268 HWND hWnd
= CreateWindowEx (0, wxTaskBarWindowClass
,
280 return (WXHWND
) hWnd
;
283 long wxTaskBarIcon::WindowProc( WXHWND hWnd
, unsigned int msg
, unsigned int wParam
, long lParam
)
285 wxEventType eventType
= 0;
287 if (msg
!= sm_taskbarMsg
)
288 return DefWindowProc((HWND
) hWnd
, msg
, wParam
, lParam
);
293 eventType
= wxEVT_TASKBAR_LEFT_DOWN
;
297 eventType
= wxEVT_TASKBAR_LEFT_UP
;
301 eventType
= wxEVT_TASKBAR_RIGHT_DOWN
;
305 eventType
= wxEVT_TASKBAR_RIGHT_UP
;
308 case WM_LBUTTONDBLCLK
:
309 eventType
= wxEVT_TASKBAR_LEFT_DCLICK
;
312 case WM_RBUTTONDBLCLK
:
313 eventType
= wxEVT_TASKBAR_RIGHT_DCLICK
;
317 eventType
= wxEVT_TASKBAR_MOVE
;
326 event
.SetEventType(eventType
);
327 event
.SetEventObject(this);
334 LRESULT APIENTRY _EXPORT
wxTaskBarIconWindowProc( HWND hWnd
, unsigned msg
,
335 UINT wParam
, LONG lParam
)
337 wxTaskBarIcon
* obj
= wxTaskBarIcon::FindObjectForHWND((WXHWND
) hWnd
);
339 return obj
->WindowProc((WXHWND
) hWnd
, msg
, wParam
, lParam
);
341 return DefWindowProc(hWnd
, msg
, wParam
, lParam
);