]>
git.saurik.com Git - wxWidgets.git/blob - src/os2/taskbar.cpp
   1 ///////////////////////////////////////////////////////////////////////// 
   3 // Purpose:         Implements wxTaskBarIcon class for manipulating icons on 
   4 //              the task bar. Optional. 
   5 // Author:      David Webster 
   9 // Copyright:   (c) David Webster 
  10 // Licence:     wxWindows licence 
  11 ///////////////////////////////////////////////////////////////////////// 
  13 // For compilers that support precompilation, includes "wx.h". 
  14 #include "wx/wxprec.h" 
  18 #include "wx/window.h" 
  27 #include <wx/os2/taskbar.h> 
  28 #include <wx/os2/private.h> 
  30 MRESULT 
wxTaskBarIconWindowProc( HWND hWnd
, UINT msg
, MPARAM wParam
, MPARAM lParam 
); 
  32 wxChar 
*wxTaskBarWindowClass 
= wxT("wxTaskBarWindowClass"); 
  34 wxList 
wxTaskBarIcon::sm_taskBarIcons
; 
  35 bool   wxTaskBarIcon::sm_registeredClass 
= FALSE
; 
  36 UINT   
wxTaskBarIcon::sm_taskbarMsg 
= 0; 
  39 BEGIN_EVENT_TABLE(wxTaskBarIcon
, wxEvtHandler
) 
  40     EVT_TASKBAR_MOVE         (wxTaskBarIcon::_OnMouseMove
) 
  41     EVT_TASKBAR_LEFT_DOWN    (wxTaskBarIcon::_OnLButtonDown
) 
  42     EVT_TASKBAR_LEFT_UP      (wxTaskBarIcon::_OnLButtonUp
) 
  43     EVT_TASKBAR_RIGHT_DOWN   (wxTaskBarIcon::_OnRButtonDown
) 
  44     EVT_TASKBAR_RIGHT_UP     (wxTaskBarIcon::_OnRButtonUp
) 
  45     EVT_TASKBAR_LEFT_DCLICK  (wxTaskBarIcon::_OnLButtonDClick
) 
  46     EVT_TASKBAR_RIGHT_DCLICK (wxTaskBarIcon::_OnRButtonDClick
) 
  49 IMPLEMENT_DYNAMIC_CLASS(wxTaskBarIcon
, wxEvtHandler
) 
  52 wxTaskBarIcon::wxTaskBarIcon(void) 
  60     if (RegisterWindowClass()) 
  61         m_hWnd = CreateTaskBarWindow(); 
  65 wxTaskBarIcon::~wxTaskBarIcon(void) 
  78         ::DestroyWindow((HWND) m_hWnd); 
  85 bool wxTaskBarIcon::SetIcon(const wxIcon
& icon
, const wxString
& tooltip
) 
  91     NOTIFYICONDATA notifyData; 
  93     memset(¬ifyData, 0, sizeof(notifyData)); 
  94     notifyData.cbSize = sizeof(notifyData); 
  95     notifyData.hWnd = (HWND) m_hWnd; 
  96     notifyData.uCallbackMessage = sm_taskbarMsg; 
  97     notifyData.uFlags = NIF_MESSAGE ; 
 100         notifyData.uFlags |= NIF_ICON; 
 101         notifyData.hIcon = (HICON) icon.GetHICON(); 
 104     if (((const wxChar*) tooltip != NULL) && (tooltip != wxT(""))) 
 106         notifyData.uFlags |= NIF_TIP ; 
 107         lstrcpyn(notifyData.szTip, WXSTRINGCAST tooltip, sizeof(notifyData.szTip)); 
 113         return (Shell_NotifyIcon(NIM_MODIFY, & notifyData) != 0); 
 116         m_iconAdded = (Shell_NotifyIcon(NIM_ADD, & notifyData) != 0); 
 123 bool wxTaskBarIcon::RemoveIcon(void) 
 129     NOTIFYICONDATA notifyData; 
 131     memset(¬ifyData, 0, sizeof(notifyData)); 
 132     notifyData.cbSize = sizeof(notifyData); 
 133     notifyData.hWnd = (HWND) m_hWnd; 
 134     notifyData.uCallbackMessage = sm_taskbarMsg; 
 135     notifyData.uFlags = NIF_MESSAGE; 
 136     notifyData.hIcon = 0 ; // hIcon; 
 140     return (Shell_NotifyIcon(NIM_DELETE, & notifyData) != 0); 
 145 bool wxTaskBarIcon::PopupMenu(wxMenu 
*menu
) //, int x, int y); 
 147     // OK, so I know this isn't thread-friendly, but 
 148     // what to do? We need this check. 
 150     static bool s_inPopup 
= FALSE
; 
 160     wxGetMousePosition(&x
, &y
); 
 162     // is wxFrame the best window type to use??? 
 163     win 
= new wxFrame(NULL
, -1, "", wxPoint(x
,y
), wxSize(-1,-1), 0); 
 164     win
->PushEventHandler(this); 
 166     // Remove from record of top-level windows, or will confuse wxWindows 
 167     // if we try to exit right now. 
 168     wxTopLevelWindows
.DeleteObject(win
); 
 172     rval 
= win
->PopupMenu(menu
, 0, 0); 
 174     win
->PopEventHandler(FALSE
); 
 184 void wxTaskBarIcon::OnMouseMove(wxEvent
&) 
 188 void wxTaskBarIcon::OnLButtonDown(wxEvent
&) 
 192 void wxTaskBarIcon::OnLButtonUp(wxEvent
&) 
 196 void wxTaskBarIcon::OnRButtonDown(wxEvent
&) 
 200 void wxTaskBarIcon::OnRButtonUp(wxEvent
&) 
 204 void wxTaskBarIcon::OnLButtonDClick(wxEvent
&) 
 208 void wxTaskBarIcon::OnRButtonDClick(wxEvent
&) 
 212 void wxTaskBarIcon::_OnMouseMove(wxEvent
& e
)      { OnMouseMove(e
);     } 
 213 void wxTaskBarIcon::_OnLButtonDown(wxEvent
& e
)    { OnLButtonDown(e
);   } 
 214 void wxTaskBarIcon::_OnLButtonUp(wxEvent
& e
)      { OnLButtonUp(e
);     } 
 215 void wxTaskBarIcon::_OnRButtonDown(wxEvent
& e
)    { OnRButtonDown(e
);   } 
 216 void wxTaskBarIcon::_OnRButtonUp(wxEvent
& e
)      { OnRButtonUp(e
);     } 
 217 void wxTaskBarIcon::_OnLButtonDClick(wxEvent
& e
)  { OnLButtonDClick(e
); } 
 218 void wxTaskBarIcon::_OnRButtonDClick(wxEvent
& e
)  { OnRButtonDClick(e
); } 
 221 wxTaskBarIcon
* wxTaskBarIcon::FindObjectForHWND(WXHWND hWnd
) 
 223     wxNode
*node 
= sm_taskBarIcons
.First(); 
 226         wxTaskBarIcon
* obj 
= (wxTaskBarIcon
*) node
->Data(); 
 227         if (obj
->GetHWND() == hWnd
) 
 234 void wxTaskBarIcon::AddObject(wxTaskBarIcon
* obj
) 
 236     sm_taskBarIcons
.Append(obj
); 
 239 void wxTaskBarIcon::RemoveObject(wxTaskBarIcon
* obj
) 
 241     sm_taskBarIcons
.DeleteObject(obj
); 
 244 bool wxTaskBarIcon::RegisterWindowClass() 
 246     if (sm_registeredClass
) 
 249     // Also register the taskbar message here 
 252     sm_taskbarMsg = ::RegisterWindowMessage(wxT("wxTaskBarIconMessage")); 
 257     HINSTANCE hInstance = GetModuleHandle(NULL); 
 260     // set up and register window class 
 262     wc.style = CS_HREDRAW | CS_VREDRAW; 
 263     wc.lpfnWndProc = (WNDPROC) wxTaskBarIconWindowProc; 
 266     wc.hInstance = hInstance; 
 269     wc.hbrBackground = 0; 
 270     wc.lpszMenuName = NULL; 
 271     wc.lpszClassName = wxTaskBarWindowClass ; 
 272     rc = (::RegisterClass( &wc ) != 0); 
 274     sm_registeredClass = (rc != 0); 
 281 WXHWND 
wxTaskBarIcon::CreateTaskBarWindow() 
 285     HINSTANCE hInstance = GetModuleHandle(NULL); 
 287     HWND hWnd = CreateWindowEx (0, wxTaskBarWindowClass, 
 288             wxT("wxTaskBarWindow"), 
 299     return (WXHWND) hWnd; 
 304 MRESULT 
wxTaskBarIcon::WindowProc( WXHWND hWnd
, UINT msg
, MPARAM wParam
, MPARAM lParam 
) 
 306     wxEventType eventType 
= 0; 
 309     if (msg != sm_taskbarMsg) 
 310         return DefWindowProc((HWND) hWnd, msg, wParam, lParam); 
 315             eventType = wxEVT_TASKBAR_LEFT_DOWN; 
 319             eventType = wxEVT_TASKBAR_LEFT_UP; 
 323             eventType = wxEVT_TASKBAR_RIGHT_DOWN; 
 327             eventType = wxEVT_TASKBAR_RIGHT_UP; 
 330         case WM_LBUTTONDBLCLK: 
 331             eventType = wxEVT_TASKBAR_LEFT_DCLICK; 
 334         case WM_RBUTTONDBLCLK: 
 335             eventType = wxEVT_TASKBAR_RIGHT_DCLICK; 
 339             eventType = wxEVT_TASKBAR_MOVE; 
 349         event
.SetEventType(eventType
); 
 350         event
.SetEventObject(this); 
 357 MRESULT 
wxTaskBarIconWindowProc( 
 364     wxTaskBarIcon
* obj 
= wxTaskBarIcon::FindObjectForHWND((WXHWND
) hWnd
); 
 366         return obj
->WindowProc((WXHWND
) hWnd
, msg
, wParam
, lParam
); 
 369 //        return DefWindowProc(hWnd, msg, wParam, lParam);