Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
16cbf156
Commit
16cbf156
authored
Feb 07, 2000
by
Sheri Steeves
Committed by
Alexandre Julliard
Feb 07, 2000
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix for the system tray, Icon and popup menu's now work.
parent
d16895be
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
243 additions
and
172 deletions
+243
-172
systray.c
dlls/shell32/systray.c
+243
-172
No files found.
dlls/shell32/systray.c
View file @
16cbf156
...
@@ -23,25 +23,23 @@
...
@@ -23,25 +23,23 @@
DEFAULT_DEBUG_CHANNEL
(
shell
)
DEFAULT_DEBUG_CHANNEL
(
shell
)
typedef
struct
SystrayData
{
typedef
struct
SystrayItem
{
HWND
hWnd
;
HWND
hWndToolTip
;
NOTIFYICONDATAA
notifyIcon
;
NOTIFYICONDATAA
notifyIcon
;
int
nitem
;
/* number of current element = tooltip id */
int
nitem
;
/* number of current element = tooltip id */
struct
SystrayItem
*
next
;
/* nextright systray item */
struct
SystrayData
*
nextTrayItem
;
}
SystrayItem
;
}
SystrayData
;
typedef
struct
Systray
Data
{
typedef
struct
Systray
{
int
hasCritSection
;
int
hasCritSection
;
CRITICAL_SECTION
critSection
;
CRITICAL_SECTION
critSection
;
HWND
hWnd
;
SystrayData
*
systrayItemList
;
HWND
hWndToolTip
;
}
Systray
;
int
nitems
;
/* number of elements in systray */
SystrayItem
*
next
;
/* leftmost systray item */
}
SystrayData
;
static
Systray
systray
;
static
int
nNumberTrayElements
;
static
SystrayData
systray
;
static
BOOL
SYSTRAY_Delete
(
PNOTIFYICONDATAA
pnid
);
static
BOOL
SYSTRAY_Delete
(
PNOTIFYICONDATAA
pnid
);
...
@@ -50,19 +48,14 @@ static BOOL SYSTRAY_Delete(PNOTIFYICONDATAA pnid);
...
@@ -50,19 +48,14 @@ static BOOL SYSTRAY_Delete(PNOTIFYICONDATAA pnid);
* internal systray
* internal systray
*
*
*/
*/
#define SMALL_ICON_SIZE GetSystemMetrics(SM_CXSMICON)
#define SMALL_ICON_SIZE GetSystemMetrics(SM_CXSMICON)
/* space between icons */
#define SMALL_ICON_FILL 1
/* space between icons and frame */
/* space between icons and frame */
#define IBORDER 3
#define IBORDER 3
#define OBORDER 2
#define OBORDER 2
#define TBORDER (OBORDER+1+IBORDER)
#define TBORDER (OBORDER+1+IBORDER)
#define ICON_TOP(i) (TBORDER)
#define ICON_LEFT(i) (TBORDER+(i)*(SMALL_ICON_SIZE+SMALL_ICON_FILL))
#define ICON_RIGHT(i) (TBORDER+(i)*(SMALL_ICON_SIZE+SMALL_ICON_FILL)+SMALL_ICON_SIZE)
#define ICON_BOTTOM(i) (TBORDER+SMALL_ICON_SIZE)
static
LRESULT
CALLBACK
SYSTRAY_WndProc
(
HWND
hWnd
,
UINT
message
,
WPARAM
wParam
,
LPARAM
lParam
)
static
LRESULT
CALLBACK
SYSTRAY_WndProc
(
HWND
hWnd
,
UINT
message
,
WPARAM
wParam
,
LPARAM
lParam
)
{
{
HDC
hdc
;
HDC
hdc
;
...
@@ -72,29 +65,25 @@ static LRESULT CALLBACK SYSTRAY_WndProc(HWND hWnd, UINT message, WPARAM wParam,
...
@@ -72,29 +65,25 @@ static LRESULT CALLBACK SYSTRAY_WndProc(HWND hWnd, UINT message, WPARAM wParam,
case
WM_PAINT
:
case
WM_PAINT
:
{
{
RECT
rc
;
RECT
rc
;
Systray
Item
*
trayItem
=
systray
.
nex
t
;
Systray
Data
*
ptrayItem
=
systray
.
systrayItemLis
t
;
while
(
ptrayItem
)
{
if
(
ptrayItem
->
hWnd
==
hWnd
)
{
hdc
=
BeginPaint
(
hWnd
,
&
ps
);
hdc
=
BeginPaint
(
hWnd
,
&
ps
);
GetClientRect
(
hWnd
,
&
rc
);
GetClientRect
(
hWnd
,
&
rc
);
/*
rc.top += OBORDER;
if
(
!
DrawIconEx
(
hdc
,
rc
.
left
,
rc
.
top
,
ptrayItem
->
notifyIcon
.
hIcon
,
rc.bottom -= OBORDER;
rc.left += OBORDER;
rc.right -= OBORDER;
DrawEdge(hdc, &rc, EDGE_SUNKEN, BF_TOPLEFT|BF_BOTTOMRIGHT);
*/
rc
.
top
=
TBORDER
;
rc
.
left
=
TBORDER
;
while
(
trayItem
)
{
if
(
trayItem
->
notifyIcon
.
hIcon
)
if
(
!
DrawIconEx
(
hdc
,
rc
.
left
,
rc
.
top
,
trayItem
->
notifyIcon
.
hIcon
,
SMALL_ICON_SIZE
,
SMALL_ICON_SIZE
,
0
,
0
,
DI_DEFAULTSIZE
|
DI_NORMAL
))
SMALL_ICON_SIZE
,
SMALL_ICON_SIZE
,
0
,
0
,
DI_DEFAULTSIZE
|
DI_NORMAL
))
SYSTRAY_Delete
(
&
trayItem
->
notifyIcon
);
SYSTRAY_Delete
(
&
p
trayItem
->
notifyIcon
);
trayItem
=
trayItem
->
next
;
}
rc
.
left
+=
SMALL_ICON_SIZE
+
SMALL_ICON_FILL
;
ptrayItem
=
ptrayItem
->
nextTrayItem
;
}
}
EndPaint
(
hWnd
,
&
ps
);
EndPaint
(
hWnd
,
&
ps
);
}
break
;
}
break
;
case
WM_MOUSEMOVE
:
case
WM_MOUSEMOVE
:
case
WM_LBUTTONDOWN
:
case
WM_LBUTTONDOWN
:
case
WM_LBUTTONUP
:
case
WM_LBUTTONUP
:
...
@@ -104,8 +93,12 @@ static LRESULT CALLBACK SYSTRAY_WndProc(HWND hWnd, UINT message, WPARAM wParam,
...
@@ -104,8 +93,12 @@ static LRESULT CALLBACK SYSTRAY_WndProc(HWND hWnd, UINT message, WPARAM wParam,
case
WM_MBUTTONUP
:
case
WM_MBUTTONUP
:
{
{
MSG
msg
;
MSG
msg
;
RECT
rect
;
SystrayData
*
ptrayItem
=
systray
.
systrayItemList
;
GetWindowRect
(
hWnd
,
&
rect
);
while
(
ptrayItem
)
{
if
(
ptrayItem
->
hWnd
==
hWnd
)
{
msg
.
hwnd
=
hWnd
;
msg
.
hwnd
=
hWnd
;
msg
.
message
=
message
;
msg
.
message
=
message
;
msg
.
wParam
=
wParam
;
msg
.
wParam
=
wParam
;
...
@@ -113,36 +106,50 @@ static LRESULT CALLBACK SYSTRAY_WndProc(HWND hWnd, UINT message, WPARAM wParam,
...
@@ -113,36 +106,50 @@ static LRESULT CALLBACK SYSTRAY_WndProc(HWND hWnd, UINT message, WPARAM wParam,
msg
.
time
=
GetMessageTime
();
msg
.
time
=
GetMessageTime
();
msg
.
pt
.
x
=
LOWORD
(
GetMessagePos
());
msg
.
pt
.
x
=
LOWORD
(
GetMessagePos
());
msg
.
pt
.
y
=
HIWORD
(
GetMessagePos
());
msg
.
pt
.
y
=
HIWORD
(
GetMessagePos
());
SendMessageA
(
systray
.
hWndToolTip
,
TTM_RELAYEVENT
,
0
,
(
LPARAM
)
&
msg
);
SendMessageA
(
ptrayItem
->
hWndToolTip
,
TTM_RELAYEVENT
,
0
,
(
LPARAM
)
&
msg
);
}
ptrayItem
=
ptrayItem
->
nextTrayItem
;
}
}
}
case
WM_LBUTTONDBLCLK
:
case
WM_LBUTTONDBLCLK
:
case
WM_RBUTTONDBLCLK
:
case
WM_RBUTTONDBLCLK
:
case
WM_MBUTTONDBLCLK
:
case
WM_MBUTTONDBLCLK
:
{
{
int
xPos
=
LOWORD
(
lParam
);
int
xPos
;
int
xItem
=
TBORDER
;
SystrayData
*
ptrayItem
=
systray
.
systrayItemList
;
SystrayItem
*
trayItem
=
systray
.
next
;
while
(
trayItem
)
{
while
(
ptrayItem
)
if
(
xPos
>=
xItem
&&
xPos
<
(
xItem
+
SMALL_ICON_SIZE
))
{
{
if
(
!
PostMessageA
(
trayItem
->
notifyIcon
.
hWnd
,
trayItem
->
notifyIcon
.
uCallbackMessage
,
if
(
ptrayItem
->
hWnd
==
hWnd
)
(
WPARAM
)
trayItem
->
notifyIcon
.
hIcon
,
(
LPARAM
)
message
))
{
SYSTRAY_Delete
(
&
trayItem
->
notifyIcon
);
xPos
=
LOWORD
(
lParam
);
if
(
(
xPos
>=
TBORDER
)
&&
(
xPos
<
(
TBORDER
+
SMALL_ICON_SIZE
))
)
{
if
(
!
PostMessageA
(
ptrayItem
->
notifyIcon
.
hWnd
,
ptrayItem
->
notifyIcon
.
uCallbackMessage
,
(
WPARAM
)
ptrayItem
->
notifyIcon
.
uID
,
(
LPARAM
)
message
))
SYSTRAY_Delete
(
&
ptrayItem
->
notifyIcon
);
break
;
break
;
}
}
trayItem
=
trayItem
->
next
;
xItem
+=
SMALL_ICON_SIZE
+
SMALL_ICON_FILL
;
}
}
}
break
;
ptrayItem
=
ptrayItem
->
nextTrayItem
;
}
}
break
;
default:
default:
return
(
DefWindowProcA
(
hWnd
,
message
,
wParam
,
lParam
));
return
(
DefWindowProcA
(
hWnd
,
message
,
wParam
,
lParam
));
}
}
return
(
0
);
return
(
0
);
}
}
BOOL
SYSTRAY_
Create
(
void
)
BOOL
SYSTRAY_
RegisterClass
(
void
)
{
{
WNDCLASSA
wc
;
WNDCLASSA
wc
;
RECT
rect
;
wc
.
style
=
CS_SAVEBITS
;
wc
.
style
=
CS_SAVEBITS
;
wc
.
lpfnWndProc
=
(
WNDPROC
)
SYSTRAY_WndProc
;
wc
.
lpfnWndProc
=
(
WNDPROC
)
SYSTRAY_WndProc
;
wc
.
cbClsExtra
=
0
;
wc
.
cbClsExtra
=
0
;
...
@@ -154,159 +161,189 @@ BOOL SYSTRAY_Create(void)
...
@@ -154,159 +161,189 @@ BOOL SYSTRAY_Create(void)
wc
.
lpszMenuName
=
NULL
;
wc
.
lpszMenuName
=
NULL
;
wc
.
lpszClassName
=
"WineSystray"
;
wc
.
lpszClassName
=
"WineSystray"
;
TRACE
(
"
\n
"
);
if
(
!
RegisterClassA
(
&
wc
))
{
if
(
!
RegisterClassA
(
&
wc
))
{
ERR
(
"RegisterClass(WineSystray) failed
\n
"
);
ERR
(
"RegisterClass(WineSystray) failed
\n
"
);
return
FALSE
;
return
FALSE
;
}
}
return
TRUE
;
}
BOOL
SYSTRAY_Create
(
SystrayData
*
ptrayItem
)
{
RECT
rect
;
/* Register the class if this is our first tray item. */
if
(
nNumberTrayElements
==
1
)
{
if
(
!
SYSTRAY_RegisterClass
()
)
{
ERR
(
"RegisterClass(WineSystray) failed
\n
"
);
return
FALSE
;
}
}
/* Initialize the window size. */
rect
.
left
=
0
;
rect
.
left
=
0
;
rect
.
top
=
0
;
rect
.
top
=
0
;
rect
.
right
=
SMALL_ICON_SIZE
+
2
*
TBORDER
;
rect
.
right
=
SMALL_ICON_SIZE
+
2
*
TBORDER
;
rect
.
bottom
=
SMALL_ICON_SIZE
+
2
*
TBORDER
;
rect
.
bottom
=
SMALL_ICON_SIZE
+
2
*
TBORDER
;
/* AdjustWindowRect(&rect, WS_CAPTION, FALSE);*/
systray
.
hWnd
=
CreateWindowExA
(
/* Create tray window for icon. */
WS_EX_TRAYWINDOW
,
ptrayItem
->
hWnd
=
CreateWindowExA
(
WS_EX_TRAYWINDOW
,
"WineSystray"
,
"Wine-Systray"
,
"WineSystray"
,
"Wine-Systray"
,
WS_VISIBLE
,
WS_VISIBLE
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
rect
.
right
-
rect
.
left
,
rect
.
bottom
-
rect
.
top
,
rect
.
right
-
rect
.
left
,
rect
.
bottom
-
rect
.
top
,
0
,
0
,
0
,
0
);
0
,
0
,
0
,
0
);
if
(
!
systray
.
hWnd
)
{
if
(
!
ptrayItem
->
hWnd
)
ERR
(
"CreateWindow(WineSystray) failed
\n
"
);
{
ERR
(
"CreateWindow(WineSystray) failed
\n
"
);
return
FALSE
;
return
FALSE
;
}
}
systray
.
hWndToolTip
=
CreateWindowA
(
TOOLTIPS_CLASSA
,
NULL
,
TTS_ALWAYSTIP
,
/* Create tooltip for icon. */
ptrayItem
->
hWndToolTip
=
CreateWindowA
(
TOOLTIPS_CLASSA
,
NULL
,
TTS_ALWAYSTIP
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
CW_USEDEFAULT
,
systray
.
hWnd
,
0
,
0
,
0
);
ptrayItem
->
hWnd
,
0
,
0
,
0
);
if
(
systray
.
hWndToolTip
==
0
)
{
if
(
ptrayItem
->
hWndToolTip
==
0
)
ERR
(
"CreateWindow(TOOLTIP) failed
\n
"
);
{
ERR
(
"CreateWindow(TOOLTIP) failed
\n
"
);
return
FALSE
;
return
FALSE
;
}
}
return
TRUE
;
return
TRUE
;
}
}
static
void
SYSTRAY_RepaintAll
(
void
)
{
SystrayData
*
ptrayItem
=
systray
.
systrayItemList
;
while
(
ptrayItem
)
{
InvalidateRect
(
ptrayItem
->
hWnd
,
NULL
,
TRUE
);
ptrayItem
=
ptrayItem
->
nextTrayItem
;
}
}
static
void
SYSTRAY_RepaintItem
(
int
nitem
)
static
void
SYSTRAY_RepaintItem
(
int
nitem
)
{
{
if
(
nitem
<
0
)
{
/* repaint all items */
RECT
rc1
,
rc2
;
SystrayData
*
ptrayItem
=
systray
.
systrayItemList
;
GetWindowRect
(
systray
.
hWnd
,
&
rc1
);
rc2
.
left
=
0
;
while
(
ptrayItem
)
rc2
.
top
=
0
;
{
rc2
.
right
=
systray
.
nitems
*
(
SMALL_ICON_SIZE
+
SMALL_ICON_FILL
)
+
2
*
TBORDER
;
if
(
ptrayItem
->
nitem
==
nitem
)
rc2
.
bottom
=
SMALL_ICON_SIZE
+
2
*
TBORDER
;
InvalidateRect
(
ptrayItem
->
hWnd
,
NULL
,
TRUE
);
/* TRACE("%d %d %d %d %d\n",systray.nitems, rc1.left, rc1.top, rc2.right-rc2.left, rc2.bottom-rc2.top); */
/* AdjustWindowRect(&rc2, WS_CAPTION, FALSE);*/
ptrayItem
=
ptrayItem
->
nextTrayItem
;
MoveWindow
(
systray
.
hWnd
,
rc1
.
left
,
rc1
.
top
,
rc2
.
right
-
rc2
.
left
,
rc2
.
bottom
-
rc2
.
top
,
TRUE
);
InvalidateRect
(
systray
.
hWnd
,
NULL
,
TRUE
);
/* TRACE("%d %d %d %d %d\n",systray.nitems, rc1.left, rc1.top, rc2.right-rc2.left, rc2.bottom-rc2.top); */
}
else
{
RECT
rc
;
rc
.
left
=
ICON_LEFT
(
nitem
);
rc
.
top
=
ICON_TOP
(
nitem
);
rc
.
right
=
ICON_RIGHT
(
nitem
);
rc
.
bottom
=
ICON_BOTTOM
(
nitem
);
InvalidateRect
(
systray
.
hWnd
,
&
rc
,
TRUE
);
}
}
}
}
void
SYSTRAY_InitItem
(
Systray
Item
*
trayItem
)
void
SYSTRAY_InitItem
(
Systray
Data
*
p
trayItem
)
{
{
trayItem
->
nitem
=
systray
.
nitems
++
;
ptrayItem
->
nitem
=
nNumberTrayElements
++
;
/* create window only if needed */
SYSTRAY_Create
(
ptrayItem
);
if
(
systray
.
hWnd
==
0
)
SYSTRAY_Create
();
}
}
void
SYSTRAY_SetIcon
(
Systray
Item
*
trayItem
,
HICON
hIcon
)
void
SYSTRAY_SetIcon
(
Systray
Data
*
p
trayItem
,
HICON
hIcon
)
{
{
trayItem
->
notifyIcon
.
hIcon
=
hIcon
;
ptrayItem
->
notifyIcon
.
hIcon
=
hIcon
;
SYSTRAY_RepaintItem
(
trayItem
->
nitem
>
systray
.
nitems
?-
1
:
trayItem
->
nitem
);
}
void
SYSTRAY_SetTip
(
SystrayData
*
ptrayItem
,
CHAR
*
szTip
)
{
TTTOOLINFOA
ti
;
strncpy
(
ptrayItem
->
notifyIcon
.
szTip
,
szTip
,
sizeof
(
ptrayItem
->
notifyIcon
.
szTip
));
ptrayItem
->
notifyIcon
.
szTip
[
sizeof
(
ptrayItem
->
notifyIcon
.
szTip
)
-
1
]
=
0
;
ti
.
cbSize
=
sizeof
(
TTTOOLINFOA
);
ti
.
uFlags
=
0
;
ti
.
hwnd
=
ptrayItem
->
hWnd
;
ti
.
hinst
=
0
;
ti
.
uId
=
ptrayItem
->
nitem
;
ti
.
lpszText
=
ptrayItem
->
notifyIcon
.
szTip
;
ti
.
rect
.
left
=
0
;
ti
.
rect
.
top
=
0
;
ti
.
rect
.
right
=
SMALL_ICON_SIZE
+
2
*
TBORDER
;
ti
.
rect
.
bottom
=
SMALL_ICON_SIZE
+
2
*
TBORDER
;
SendMessageA
(
ptrayItem
->
hWndToolTip
,
TTM_ADDTOOLA
,
0
,
(
LPARAM
)
&
ti
);
}
}
void
SYSTRAY_SetTip2
(
SystrayItem
*
trayItem
)
static
void
SYSTRAY_ModifyTip
(
SystrayData
*
ptrayItem
,
CHAR
*
szTip
)
{
{
TTTOOLINFOA
ti
;
TTTOOLINFOA
ti
;
strncpy
(
ptrayItem
->
notifyIcon
.
szTip
,
szTip
,
sizeof
(
ptrayItem
->
notifyIcon
.
szTip
));
ptrayItem
->
notifyIcon
.
szTip
[
sizeof
(
ptrayItem
->
notifyIcon
.
szTip
)
-
1
]
=
0
;
ti
.
cbSize
=
sizeof
(
TTTOOLINFOA
);
ti
.
cbSize
=
sizeof
(
TTTOOLINFOA
);
ti
.
uFlags
=
0
;
ti
.
uFlags
=
0
;
ti
.
hwnd
=
systray
.
hWnd
;
ti
.
hwnd
=
ptrayItem
->
hWnd
;
ti
.
hinst
=
0
;
ti
.
hinst
=
0
;
ti
.
uId
=
trayItem
->
nitem
;
ti
.
uId
=
ptrayItem
->
nitem
;
ti
.
lpszText
=
trayItem
->
notifyIcon
.
szTip
;
ti
.
lpszText
=
ptrayItem
->
notifyIcon
.
szTip
;
ti
.
rect
.
left
=
ICON_LEFT
(
trayItem
->
nitem
);
ti
.
rect
.
left
=
0
;
ti
.
rect
.
top
=
ICON_TOP
(
trayItem
->
nitem
);
ti
.
rect
.
top
=
0
;
ti
.
rect
.
right
=
ICON_RIGHT
(
trayItem
->
nitem
);
ti
.
rect
.
right
=
SMALL_ICON_SIZE
+
2
*
TBORDER
;
ti
.
rect
.
bottom
=
ICON_BOTTOM
(
trayItem
->
nitem
);
ti
.
rect
.
bottom
=
SMALL_ICON_SIZE
+
2
*
TBORDER
;
SendMessageA
(
systray
.
hWndToolTip
,
TTM_ADDTOOLA
,
0
,
(
LPARAM
)
&
ti
);
SendMessageA
(
ptrayItem
->
hWndToolTip
,
TTM_UPDATETIPTEXTA
,
0
,
(
LPARAM
)
&
ti
);
}
}
static
void
SYSTRAY_TermItem
(
Systray
Item
*
removeItem
)
static
void
SYSTRAY_TermItem
(
Systray
Data
*
removeItem
)
{
{
int
nitem
;
int
nitem
;
Systray
Item
**
trayItem
;
Systray
Data
**
trayItem
;
TTTOOLINFOA
ti
;
TTTOOLINFOA
ti
;
ti
.
cbSize
=
sizeof
(
TTTOOLINFOA
);
ti
.
cbSize
=
sizeof
(
TTTOOLINFOA
);
ti
.
uFlags
=
0
;
ti
.
uFlags
=
0
;
ti
.
hwnd
=
systray
.
hWnd
;
ti
.
hinst
=
0
;
ti
.
hinst
=
0
;
/* delete all tooltips ...*/
/* delete all tooltips ...*/
trayItem
=
&
systray
.
nex
t
;
trayItem
=
&
systray
.
systrayItemLis
t
;
while
(
*
trayItem
)
{
while
(
*
trayItem
)
{
ti
.
uId
=
(
*
trayItem
)
->
nitem
;
ti
.
uId
=
(
*
trayItem
)
->
nitem
;
SendMessageA
(
systray
.
hWndToolTip
,
TTM_DELTOOLA
,
0
,
(
LPARAM
)
&
ti
);
ti
.
hwnd
=
(
*
trayItem
)
->
hWnd
;
trayItem
=
&
((
*
trayItem
)
->
next
);
SendMessageA
((
*
trayItem
)
->
hWndToolTip
,
TTM_DELTOOLA
,
0
,
(
LPARAM
)
&
ti
);
trayItem
=
&
((
*
trayItem
)
->
nextTrayItem
);
}
}
/* ... and add them again, because uID may shift */
/* ... and add them again, because uID may shift */
nitem
=
0
;
nitem
=
0
;
trayItem
=
&
systray
.
next
;
trayItem
=
&
systray
.
systrayItemList
;
while
(
*
trayItem
)
{
while
(
*
trayItem
)
if
(
*
trayItem
!=
removeItem
)
{
{
if
(
*
trayItem
!=
removeItem
)
{
(
*
trayItem
)
->
nitem
=
nitem
;
(
*
trayItem
)
->
nitem
=
nitem
;
ti
.
uId
=
nitem
;
ti
.
uId
=
nitem
;
ti
.
hwnd
=
(
*
trayItem
)
->
hWnd
;
ti
.
lpszText
=
(
*
trayItem
)
->
notifyIcon
.
szTip
;
ti
.
lpszText
=
(
*
trayItem
)
->
notifyIcon
.
szTip
;
ti
.
rect
.
left
=
ICON_LEFT
(
nitem
)
;
ti
.
rect
.
left
=
0
;
ti
.
rect
.
top
=
ICON_TOP
(
nitem
)
;
ti
.
rect
.
top
=
0
;
ti
.
rect
.
right
=
ICON_RIGHT
(
nitem
)
;
ti
.
rect
.
right
=
SMALL_ICON_SIZE
+
2
*
TBORDER
;
ti
.
rect
.
bottom
=
ICON_BOTTOM
(
nitem
)
;
ti
.
rect
.
bottom
=
SMALL_ICON_SIZE
+
2
*
TBORDER
;
SendMessageA
(
systray
.
hWndToolTip
,
TTM_ADDTOOLA
,
0
,
(
LPARAM
)
&
ti
);
SendMessageA
(
(
*
trayItem
)
->
hWndToolTip
,
TTM_ADDTOOLA
,
0
,
(
LPARAM
)
&
ti
);
nitem
++
;
nitem
++
;
}
}
trayItem
=
&
((
*
trayItem
)
->
next
);
trayItem
=
&
((
*
trayItem
)
->
next
TrayItem
);
}
}
/* remove icon */
nNumberTrayElements
--
;
SYSTRAY_RepaintItem
(
-
1
);
systray
.
nitems
--
;
}
}
/**************************************************************************
/**************************************************************************
* helperfunctions
* helperfunctions
*
*
*/
*/
void
SYSTRAY_SetMessage
(
Systray
Item
*
trayItem
,
UINT
uCallbackMessage
)
void
SYSTRAY_SetMessage
(
Systray
Data
*
p
trayItem
,
UINT
uCallbackMessage
)
{
{
trayItem
->
notifyIcon
.
uCallbackMessage
=
uCallbackMessage
;
p
trayItem
->
notifyIcon
.
uCallbackMessage
=
uCallbackMessage
;
}
}
void
SYSTRAY_SetTip
(
SystrayItem
*
trayItem
,
CHAR
*
szTip
)
{
/* char *s; */
strncpy
(
trayItem
->
notifyIcon
.
szTip
,
szTip
,
sizeof
(
trayItem
->
notifyIcon
.
szTip
));
trayItem
->
notifyIcon
.
szTip
[
sizeof
(
trayItem
->
notifyIcon
.
szTip
)
-
1
]
=
0
;
/* cut off trailing spaces */
/*
s=trayItem->notifyIcon.szTip+strlen(trayItem->notifyIcon.szTip);
while (--s >= trayItem->notifyIcon.szTip && *s == ' ')
*s=0;
*/
SYSTRAY_SetTip2
(
trayItem
);
}
static
BOOL
SYSTRAY_IsEqual
(
PNOTIFYICONDATAA
pnid1
,
PNOTIFYICONDATAA
pnid2
)
static
BOOL
SYSTRAY_IsEqual
(
PNOTIFYICONDATAA
pnid1
,
PNOTIFYICONDATAA
pnid2
)
{
{
if
(
pnid1
->
hWnd
!=
pnid2
->
hWnd
)
return
FALSE
;
if
(
pnid1
->
hWnd
!=
pnid2
->
hWnd
)
return
FALSE
;
...
@@ -314,76 +351,108 @@ static BOOL SYSTRAY_IsEqual(PNOTIFYICONDATAA pnid1, PNOTIFYICONDATAA pnid2)
...
@@ -314,76 +351,108 @@ static BOOL SYSTRAY_IsEqual(PNOTIFYICONDATAA pnid1, PNOTIFYICONDATAA pnid2)
return
TRUE
;
return
TRUE
;
}
}
static
BOOL
SYSTRAY_Add
(
PNOTIFYICONDATAA
pnid
)
static
BOOL
SYSTRAY_Add
(
PNOTIFYICONDATAA
pnid
)
{
{
SystrayItem
**
trayItem
=
&
systray
.
next
;
SystrayData
**
ptrayItem
=
&
systray
.
systrayItemList
;
while
(
*
trayItem
)
{
if
(
SYSTRAY_IsEqual
(
pnid
,
&
(
*
trayItem
)
->
notifyIcon
))
/* Find empty space for new element. */
while
(
*
ptrayItem
)
{
if
(
SYSTRAY_IsEqual
(
pnid
,
&
(
*
ptrayItem
)
->
notifyIcon
)
)
return
FALSE
;
return
FALSE
;
trayItem
=
&
((
*
trayItem
)
->
next
);
ptrayItem
=
&
((
*
ptrayItem
)
->
nextTrayItem
);
}
}
(
*
trayItem
)
=
(
SystrayItem
*
)
malloc
(
sizeof
(
SystrayItem
));
memcpy
(
&
(
*
trayItem
)
->
notifyIcon
,
pnid
,
sizeof
(
NOTIFYICONDATAA
));
/* Allocate SystrayData for element and zero memory. */
SYSTRAY_InitItem
(
*
trayItem
);
(
*
ptrayItem
)
=
(
SystrayData
*
)
malloc
(
sizeof
(
SystrayData
)
);
SYSTRAY_SetIcon
(
*
trayItem
,
(
pnid
->
uFlags
&
NIF_ICON
)
?
pnid
->
hIcon
:
0
);
ZeroMemory
(
(
*
ptrayItem
),
sizeof
(
SystrayData
)
);
SYSTRAY_SetMessage
(
*
trayItem
,
(
pnid
->
uFlags
&
NIF_MESSAGE
)
?
pnid
->
uCallbackMessage
:
0
);
SYSTRAY_SetTip
(
*
trayItem
,
(
pnid
->
uFlags
&
NIF_TIP
)
?
pnid
->
szTip
:
""
);
/* Copy notification data */
(
*
trayItem
)
->
next
=
NULL
;
memcpy
(
&
(
*
ptrayItem
)
->
notifyIcon
,
pnid
,
sizeof
(
NOTIFYICONDATAA
)
);
TRACE
(
"%p: 0x%08x %d %s
\n
"
,
*
trayItem
,
(
*
trayItem
)
->
notifyIcon
.
hWnd
,
(
*
trayItem
)
->
notifyIcon
.
uID
,
(
*
trayItem
)
->
notifyIcon
.
szTip
);
/* Initialize and set data for the tray element. */
SYSTRAY_InitItem
(
(
*
ptrayItem
)
);
SYSTRAY_SetIcon
(
*
ptrayItem
,
(
pnid
->
uFlags
&
NIF_ICON
)
?
pnid
->
hIcon
:
0
);
SYSTRAY_SetMessage
(
*
ptrayItem
,
(
pnid
->
uFlags
&
NIF_MESSAGE
)
?
pnid
->
uCallbackMessage
:
0
);
SYSTRAY_SetTip
(
*
ptrayItem
,
(
pnid
->
uFlags
&
NIF_TIP
)
?
pnid
->
szTip
:
""
);
(
*
ptrayItem
)
->
nextTrayItem
=
NULL
;
/* may be overkill after the ZeroMemory call. */
/* Repaint all system tray icons as we have added one. */
SYSTRAY_RepaintAll
();
TRACE
(
"%p: 0x%08x %d %s
\n
"
,
(
*
ptrayItem
),
(
*
ptrayItem
)
->
notifyIcon
.
hWnd
,
(
*
ptrayItem
)
->
notifyIcon
.
uID
,
(
*
ptrayItem
)
->
notifyIcon
.
szTip
);
return
TRUE
;
return
TRUE
;
}
}
static
BOOL
SYSTRAY_Modify
(
PNOTIFYICONDATAA
pnid
)
static
BOOL
SYSTRAY_Modify
(
PNOTIFYICONDATAA
pnid
)
{
{
SystrayItem
*
trayItem
=
systray
.
next
;
SystrayData
*
ptrayItem
=
systray
.
systrayItemList
;
while
(
trayItem
)
{
if
(
SYSTRAY_IsEqual
(
pnid
,
&
trayItem
->
notifyIcon
))
{
while
(
ptrayItem
)
{
if
(
SYSTRAY_IsEqual
(
pnid
,
&
ptrayItem
->
notifyIcon
)
)
{
if
(
pnid
->
uFlags
&
NIF_ICON
)
if
(
pnid
->
uFlags
&
NIF_ICON
)
SYSTRAY_SetIcon
(
trayItem
,
pnid
->
hIcon
);
{
SYSTRAY_SetIcon
(
ptrayItem
,
pnid
->
hIcon
);
SYSTRAY_RepaintItem
(
ptrayItem
->
nitem
);
}
if
(
pnid
->
uFlags
&
NIF_MESSAGE
)
if
(
pnid
->
uFlags
&
NIF_MESSAGE
)
SYSTRAY_SetMessage
(
trayItem
,
pnid
->
uCallbackMessage
);
SYSTRAY_SetMessage
(
ptrayItem
,
pnid
->
uCallbackMessage
);
if
(
pnid
->
uFlags
&
NIF_TIP
)
if
(
pnid
->
uFlags
&
NIF_TIP
)
SYSTRAY_SetTip
(
trayItem
,
pnid
->
szTip
);
SYSTRAY_ModifyTip
(
ptrayItem
,
pnid
->
szTip
);
TRACE
(
"%p: 0x%08x %d %s
\n
"
,
trayItem
,
trayItem
->
notifyIcon
.
hWnd
,
trayItem
->
notifyIcon
.
uID
,
trayItem
->
notifyIcon
.
szTip
);
TRACE
(
"%p: 0x%08x %d %s
\n
"
,
ptrayItem
,
ptrayItem
->
notifyIcon
.
hWnd
,
ptrayItem
->
notifyIcon
.
uID
,
ptrayItem
->
notifyIcon
.
szTip
);
return
TRUE
;
return
TRUE
;
}
}
trayItem
=
trayItem
->
next
;
ptrayItem
=
ptrayItem
->
nextTrayItem
;
}
}
return
FALSE
;
/* not found */
return
FALSE
;
/* not found */
}
}
static
BOOL
SYSTRAY_Delete
(
PNOTIFYICONDATAA
pnid
)
static
BOOL
SYSTRAY_Delete
(
PNOTIFYICONDATAA
pnid
)
{
{
SystrayItem
**
trayItem
=
&
systray
.
next
;
SystrayData
**
ptrayItem
=
&
systray
.
systrayItemList
;
while
(
*
trayItem
)
{
if
(
SYSTRAY_IsEqual
(
pnid
,
&
(
*
trayItem
)
->
notifyIcon
))
{
while
(
*
ptrayItem
)
SystrayItem
*
next
=
(
*
trayItem
)
->
next
;
{
TRACE
(
"%p: 0x%08x %d %s
\n
"
,
*
trayItem
,
(
*
trayItem
)
->
notifyIcon
.
hWnd
,
if
(
SYSTRAY_IsEqual
(
pnid
,
&
(
*
ptrayItem
)
->
notifyIcon
))
(
*
trayItem
)
->
notifyIcon
.
uID
,
(
*
trayItem
)
->
notifyIcon
.
szTip
);
{
SYSTRAY_TermItem
(
*
trayItem
);
SystrayData
*
next
=
(
*
ptrayItem
)
->
nextTrayItem
;
free
(
*
trayItem
);
TRACE
(
"%p: 0x%08x %d %s
\n
"
,
*
ptrayItem
,
(
*
ptrayItem
)
->
notifyIcon
.
hWnd
,
*
trayItem
=
next
;
(
*
ptrayItem
)
->
notifyIcon
.
uID
,
(
*
ptrayItem
)
->
notifyIcon
.
szTip
);
SYSTRAY_TermItem
(
*
ptrayItem
);
DestroyWindow
((
*
ptrayItem
)
->
hWndToolTip
);
DestroyWindow
((
*
ptrayItem
)
->
hWnd
);
free
(
*
ptrayItem
);
*
ptrayItem
=
next
;
SYSTRAY_RepaintAll
();
return
TRUE
;
return
TRUE
;
}
}
trayItem
=
&
((
*
trayItem
)
->
next
);
ptrayItem
=
&
((
*
ptrayItem
)
->
nextTrayItem
);
}
}
return
FALSE
;
/* not found */
return
FALSE
;
/* not found */
}
}
/*************************************************************************
/*************************************************************************
*
*
*/
*/
BOOL
SYSTRAY_Init
(
void
)
BOOL
SYSTRAY_Init
(
void
)
{
{
if
(
!
systray
.
hasCritSection
)
{
if
(
!
systray
.
hasCritSection
)
{
systray
.
hasCritSection
=
1
;
systray
.
hasCritSection
=
1
;
InitializeCriticalSection
(
&
systray
.
critSection
);
InitializeCriticalSection
(
&
systray
.
critSection
);
MakeCriticalSectionGlobal
(
&
systray
.
critSection
);
MakeCriticalSectionGlobal
(
&
systray
.
critSection
);
...
@@ -404,8 +473,10 @@ BOOL WINAPI Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA pnid )
...
@@ -404,8 +473,10 @@ BOOL WINAPI Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA pnid )
EnterCriticalSection
(
&
systray
.
critSection
);
EnterCriticalSection
(
&
systray
.
critSection
);
TRACE
(
"enter %d %d %ld
\n
"
,
pnid
->
hWnd
,
pnid
->
uID
,
dwMessage
);
TRACE
(
"enter %d %d %ld
\n
"
,
pnid
->
hWnd
,
pnid
->
uID
,
dwMessage
);
switch
(
dwMessage
)
{
switch
(
dwMessage
)
{
case
NIM_ADD
:
case
NIM_ADD
:
TRACE
(
"Calling systray add
\n
"
);
flag
=
SYSTRAY_Add
(
pnid
);
flag
=
SYSTRAY_Add
(
pnid
);
break
;
break
;
case
NIM_MODIFY
:
case
NIM_MODIFY
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment