projects
/
wxWidgets.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fixed memory allocation code of wxStreamBuffer to not realloc() new[]ed memory any...
[wxWidgets.git]
/
src
/
msw
/
taskbar.cpp
diff --git
a/src/msw/taskbar.cpp
b/src/msw/taskbar.cpp
index fdf563dc377958c13b6a9de3d0664a1b4a2bb02b..13235cea9d9c39a58e433db87e6488ba04a1add3 100644
(file)
--- a/
src/msw/taskbar.cpp
+++ b/
src/msw/taskbar.cpp
@@
-1,13
+1,13
@@
/////////////////////////////////////////////////////////////////////////
// File: taskbar.cpp
/////////////////////////////////////////////////////////////////////////
// File: taskbar.cpp
-// Purpose:
Implements wxTaskBarIcon class for manipulating icons on
+// Purpose: Implements wxTaskBarIcon class for manipulating icons on
// the Windows task bar.
// Author: Julian Smart
// Modified by:
// Created: 24/3/98
// RCS-ID: $Id$
// Copyright: (c)
// the Windows task bar.
// Author: Julian Smart
// Modified by:
// Created: 24/3/98
// RCS-ID: $Id$
// Copyright: (c)
-// Licence: wxWindows licence
+// Licence:
wxWindows licence
/////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
/////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
@@
-26,36
+26,39
@@
#include "wx/window.h"
#include "wx/frame.h"
#include "wx/utils.h"
#include "wx/window.h"
#include "wx/frame.h"
#include "wx/utils.h"
+#include "wx/menu.h"
#endif
#if defined(__WIN95__) && !defined(__TWIN32__)
#include <windows.h>
#endif
#if defined(__WIN95__) && !defined(__TWIN32__)
#include <windows.h>
+
+#include "wx/msw/winundef.h"
+
#include <string.h>
#include <string.h>
-#include
<wx/msw/taskbar.h>
-#include
<wx/msw/private.h>
+#include
"wx/msw/taskbar.h"
+#include
"wx/msw/private.h"
#ifndef __TWIN32__
#ifndef __TWIN32__
-
#ifdef __GNUWIN32
__
-#include <wx/msw/gnuwin32/extra.h>
-#endif
+
#ifdef __GNUWIN32_OLD
__
+ #include "wx/msw/gnuwin32/extra.h"
+
#endif
#endif
#ifdef __SALFORDC__
#endif
#ifdef __SALFORDC__
-#include <shellapi.h>
+
#include <shellapi.h>
#endif
LRESULT APIENTRY _EXPORT wxTaskBarIconWindowProc( HWND hWnd, unsigned msg,
#endif
LRESULT APIENTRY _EXPORT wxTaskBarIconWindowProc( HWND hWnd, unsigned msg,
- UINT wParam, LONG lParam );
+
UINT wParam, LONG lParam );
-wxChar *wxTaskBarWindowClass =
_
T("wxTaskBarWindowClass");
+wxChar *wxTaskBarWindowClass =
wx
T("wxTaskBarWindowClass");
wxList wxTaskBarIcon::sm_taskBarIcons;
bool wxTaskBarIcon::sm_registeredClass = FALSE;
UINT wxTaskBarIcon::sm_taskbarMsg = 0;
wxList wxTaskBarIcon::sm_taskBarIcons;
bool wxTaskBarIcon::sm_registeredClass = FALSE;
UINT wxTaskBarIcon::sm_taskbarMsg = 0;
-#if !USE_SHARED_LIBRARY
BEGIN_EVENT_TABLE(wxTaskBarIcon, wxEvtHandler)
EVT_TASKBAR_MOVE (wxTaskBarIcon::_OnMouseMove)
EVT_TASKBAR_LEFT_DOWN (wxTaskBarIcon::_OnLButtonDown)
BEGIN_EVENT_TABLE(wxTaskBarIcon, wxEvtHandler)
EVT_TASKBAR_MOVE (wxTaskBarIcon::_OnMouseMove)
EVT_TASKBAR_LEFT_DOWN (wxTaskBarIcon::_OnLButtonDown)
@@
-68,7
+71,6
@@
END_EVENT_TABLE()
IMPLEMENT_DYNAMIC_CLASS(wxTaskBarIcon, wxEvtHandler)
IMPLEMENT_DYNAMIC_CLASS(wxTaskBarIcon, wxEvtHandler)
-#endif
wxTaskBarIcon::wxTaskBarIcon(void)
wxTaskBarIcon::wxTaskBarIcon(void)
@@
-107,20
+109,20
@@
bool wxTaskBarIcon::SetIcon(const wxIcon& icon, const wxString& tooltip)
NOTIFYICONDATA notifyData;
memset(¬ifyData, 0, sizeof(notifyData));
NOTIFYICONDATA notifyData;
memset(¬ifyData, 0, sizeof(notifyData));
- notifyData.cbSize = sizeof(notifyData);
- notifyData.hWnd = (HWND) m_hWnd;
- notifyData.uCallbackMessage = sm_taskbarMsg;
- notifyData.uFlags = NIF_MESSAGE ;
- if (icon.Ok())
+
notifyData.cbSize = sizeof(notifyData);
+
notifyData.hWnd = (HWND) m_hWnd;
+
notifyData.uCallbackMessage = sm_taskbarMsg;
+
notifyData.uFlags = NIF_MESSAGE ;
+
if (icon.Ok())
{
{
- notifyData.uFlags |= NIF_ICON;
- notifyData.hIcon = (HICON) icon.GetHICON();
+
notifyData.uFlags |= NIF_ICON;
+
notifyData.hIcon = (HICON) icon.GetHICON();
}
}
- if (((const wxChar*) tooltip != NULL) && (tooltip !=
_
T("")))
+ if (((const wxChar*) tooltip != NULL) && (tooltip !=
wx
T("")))
{
notifyData.uFlags |= NIF_TIP ;
{
notifyData.uFlags |= NIF_TIP ;
- lstrcpyn(notifyData.szTip, WXSTRINGCAST tooltip, sizeof(notifyData.szTip));
+
lstrcpyn(notifyData.szTip, WXSTRINGCAST tooltip, sizeof(notifyData.szTip));
}
notifyData.uID = 99;
}
notifyData.uID = 99;
@@
-142,11
+144,11
@@
bool wxTaskBarIcon::RemoveIcon(void)
NOTIFYICONDATA notifyData;
memset(¬ifyData, 0, sizeof(notifyData));
NOTIFYICONDATA notifyData;
memset(¬ifyData, 0, sizeof(notifyData));
- notifyData.cbSize = sizeof(notifyData);
- notifyData.hWnd = (HWND) m_hWnd;
- notifyData.uCallbackMessage = sm_taskbarMsg;
- notifyData.uFlags = NIF_MESSAGE;
- notifyData.hIcon = 0 ; // hIcon;
+
notifyData.cbSize = sizeof(notifyData);
+
notifyData.hWnd = (HWND) m_hWnd;
+
notifyData.uCallbackMessage = sm_taskbarMsg;
+
notifyData.uFlags = NIF_MESSAGE;
+
notifyData.hIcon = 0 ; // hIcon;
notifyData.uID = 99;
m_iconAdded = FALSE;
notifyData.uID = 99;
m_iconAdded = FALSE;
@@
-155,6
+157,16
@@
bool wxTaskBarIcon::RemoveIcon(void)
bool wxTaskBarIcon::PopupMenu(wxMenu *menu) //, int x, int y);
{
bool wxTaskBarIcon::PopupMenu(wxMenu *menu) //, int x, int y);
{
+ // OK, so I know this isn't thread-friendly, but
+ // what to do? We need this check.
+
+ static bool s_inPopup = FALSE;
+
+ if (s_inPopup)
+ return FALSE;
+
+ s_inPopup = TRUE;
+
bool rval = FALSE;
wxWindow* win;
int x, y;
bool rval = FALSE;
wxWindow* win;
int x, y;
@@
-164,10
+176,26
@@
bool wxTaskBarIcon::PopupMenu(wxMenu *menu) //, int x, int y);
win = new wxFrame(NULL, -1, "", wxPoint(x,y), wxSize(-1,-1), 0);
win->PushEventHandler(this);
win = new wxFrame(NULL, -1, "", wxPoint(x,y), wxSize(-1,-1), 0);
win->PushEventHandler(this);
+ // Remove from record of top-level windows, or will confuse wxWindows
+ // if we try to exit right now.
+ wxTopLevelWindows.DeleteObject(win);
+
+ menu->UpdateUI();
+
+ // Work around a WIN32 bug
+ ::SetForegroundWindow ((HWND) win->GetHWND ());
+
rval = win->PopupMenu(menu, 0, 0);
rval = win->PopupMenu(menu, 0, 0);
+ // Work around a WIN32 bug
+ ::PostMessage ((HWND) win->GetHWND(),WM_NULL,0,0L);
+
win->PopEventHandler(FALSE);
win->Destroy();
win->PopEventHandler(FALSE);
win->Destroy();
+ delete win;
+
+ s_inPopup = FALSE;
+
return rval;
}
return rval;
}
@@
-239,10
+267,10
@@
bool wxTaskBarIcon::RegisterWindowClass()
return TRUE;
// Also register the taskbar message here
return TRUE;
// Also register the taskbar message here
- sm_taskbarMsg = ::RegisterWindowMessage(
_
T("wxTaskBarIconMessage"));
+ sm_taskbarMsg = ::RegisterWindowMessage(
wx
T("wxTaskBarIconMessage"));
- WNDCLASS wc;
- bool rc;
+ WNDCLASS
wc;
+ bool
rc;
HINSTANCE hInstance = GetModuleHandle(NULL);
HINSTANCE hInstance = GetModuleHandle(NULL);
@@
-271,7
+299,7
@@
WXHWND wxTaskBarIcon::CreateTaskBarWindow()
HINSTANCE hInstance = GetModuleHandle(NULL);
HWND hWnd = CreateWindowEx (0, wxTaskBarWindowClass,
HINSTANCE hInstance = GetModuleHandle(NULL);
HWND hWnd = CreateWindowEx (0, wxTaskBarWindowClass,
-
_
T("wxTaskBarWindow"),
+
wx
T("wxTaskBarWindow"),
WS_OVERLAPPED,
0,
0,
WS_OVERLAPPED,
0,
0,
@@
-294,37
+322,37
@@
long wxTaskBarIcon::WindowProc( WXHWND hWnd, unsigned int msg, unsigned int wPar
switch (lParam)
{
switch (lParam)
{
- case WM_LBUTTONDOWN:
+
case WM_LBUTTONDOWN:
eventType = wxEVT_TASKBAR_LEFT_DOWN;
break;
eventType = wxEVT_TASKBAR_LEFT_DOWN;
break;
- case WM_LBUTTONUP:
+
case WM_LBUTTONUP:
eventType = wxEVT_TASKBAR_LEFT_UP;
break;
eventType = wxEVT_TASKBAR_LEFT_UP;
break;
- case WM_RBUTTONDOWN:
+
case WM_RBUTTONDOWN:
eventType = wxEVT_TASKBAR_RIGHT_DOWN;
break;
eventType = wxEVT_TASKBAR_RIGHT_DOWN;
break;
- case WM_RBUTTONUP:
+
case WM_RBUTTONUP:
eventType = wxEVT_TASKBAR_RIGHT_UP;
break;
eventType = wxEVT_TASKBAR_RIGHT_UP;
break;
- case WM_LBUTTONDBLCLK:
+
case WM_LBUTTONDBLCLK:
eventType = wxEVT_TASKBAR_LEFT_DCLICK;
break;
eventType = wxEVT_TASKBAR_LEFT_DCLICK;
break;
- case WM_RBUTTONDBLCLK:
+
case WM_RBUTTONDBLCLK:
eventType = wxEVT_TASKBAR_RIGHT_DCLICK;
break;
eventType = wxEVT_TASKBAR_RIGHT_DCLICK;
break;
- case WM_MOUSEMOVE:
+
case WM_MOUSEMOVE:
eventType = wxEVT_TASKBAR_MOVE;
break;
eventType = wxEVT_TASKBAR_MOVE;
break;
- default:
+
default:
break;
break;
- }
+
}
if (eventType) {
wxEvent event;
if (eventType) {
wxEvent event;
@@
-337,7
+365,7
@@
long wxTaskBarIcon::WindowProc( WXHWND hWnd, unsigned int msg, unsigned int wPar
}
LRESULT APIENTRY _EXPORT wxTaskBarIconWindowProc( HWND hWnd, unsigned msg,
}
LRESULT APIENTRY _EXPORT wxTaskBarIconWindowProc( HWND hWnd, unsigned msg,
- UINT wParam, LONG lParam )
+
UINT wParam, LONG lParam )
{
wxTaskBarIcon* obj = wxTaskBarIcon::FindObjectForHWND((WXHWND) hWnd);
if (obj)
{
wxTaskBarIcon* obj = wxTaskBarIcon::FindObjectForHWND((WXHWND) hWnd);
if (obj)