aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/SYSTRAY.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Winamp/SYSTRAY.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Winamp/SYSTRAY.cpp')
-rw-r--r--Src/Winamp/SYSTRAY.cpp124
1 files changed, 124 insertions, 0 deletions
diff --git a/Src/Winamp/SYSTRAY.cpp b/Src/Winamp/SYSTRAY.cpp
new file mode 100644
index 00000000..b154700f
--- /dev/null
+++ b/Src/Winamp/SYSTRAY.cpp
@@ -0,0 +1,124 @@
+/** (c) Nullsoft, Inc. C O N F I D E N T I A L
+ ** Filename:
+ ** Project:
+ ** Description:
+ ** Author:
+ ** Created:
+ **/
+
+#include "Main.h"
+#include <stdarg.h>
+#include "strutil.h"
+
+#define SYSTRAY_ICON 502
+#define SYSTRAY_WINDOW hMainWindow
+
+int systray_intray = 0;
+
+static BOOL systray_add(HWND hwnd, UINT uID, LPWSTR lpszTip);
+static BOOL systray_del(HWND hwnd, UINT uID);
+static BOOL systray_mod(HWND hwnd, UINT uID, LPWSTR lpszTip);
+static HICON hhIcon;
+static int hicon_index=-1;
+
+void systray_minimize(wchar_t *tip)
+{
+ extern int geticonid(int x);
+ int newindex=geticonid(config_sticon);
+ if (!SYSTRAY_WINDOW) return;
+ if (!hhIcon || hicon_index != newindex) {
+ if (hhIcon) {
+ DestroyIcon(hhIcon);
+ }
+ if(newindex == -666) {
+ wchar_t tmp[MAX_PATH] = {0};
+ StringCchPrintfW(tmp,MAX_PATH,L"%s\\winamp.ico",CONFIGDIR);
+ if(!PathFileExistsW(tmp)) {
+ hhIcon = (HICON)LoadImageW(hMainInstance,MAKEINTRESOURCEW(ICON_XP),IMAGE_ICON,16,16,LR_SHARED);
+ }
+ else {
+ hhIcon = (HICON)LoadImageW(0,tmp,IMAGE_ICON,16,16,LR_LOADFROMFILE);
+ }
+ }
+ else {
+ hhIcon = (HICON)LoadImageW(hMainInstance,MAKEINTRESOURCEW(newindex),IMAGE_ICON,16,16,LR_SHARED);
+ }
+ }
+ hicon_index=newindex;
+ if (!systray_intray) {
+ systray_add(SYSTRAY_WINDOW,SYSTRAY_ICON,tip);
+ systray_intray = 1;
+ }
+ else {
+ systray_mod(SYSTRAY_WINDOW,SYSTRAY_ICON,tip);
+ }
+}
+
+void systray_restore(void)
+{
+ if (systray_intray) {
+ systray_del(SYSTRAY_WINDOW,SYSTRAY_ICON);
+ systray_intray = 0;
+ if (hhIcon) {
+ DestroyIcon(hhIcon);
+ hhIcon=NULL;
+ hicon_index=-1;
+ }
+ }
+}
+
+static void mktipstr(wchar_t *out, wchar_t *in, size_t outlen)
+{
+ wchar_t *nextOut;
+ size_t outpos=0;
+ while (outpos < outlen-1 && *in)
+ {
+ if (*in == L'&')
+ {
+ if ((outpos+=2) >= outlen-1) break;
+ *out++=L'&';
+ *out++=L'&';
+ }
+
+ CopyCharW(out, in);
+ nextOut = CharNextW(out);
+ in = CharNextW(in);
+ outpos+=(nextOut-out);
+ out=nextOut;
+ }
+ *out=0;
+}
+
+static BOOL systray_add(HWND hwnd, UINT uID, LPWSTR lpszTip)
+{
+ NOTIFYICONDATAW tnid = {0};
+ tnid.cbSize = sizeof(NOTIFYICONDATAW);
+ tnid.hWnd = hwnd;
+ tnid.uID = uID;
+ tnid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
+ tnid.uCallbackMessage = WM_WA_SYSTRAY;
+ tnid.hIcon = hhIcon;
+ mktipstr(tnid.szTip,lpszTip,sizeof(tnid.szTip)/sizeof(wchar_t));
+ return Shell_NotifyIconW(NIM_ADD, &tnid);
+}
+
+static BOOL systray_del(HWND hwnd, UINT uID)
+{
+ NOTIFYICONDATAW tnid = {0};
+ tnid.cbSize = sizeof(NOTIFYICONDATAW);
+ tnid.hWnd = hwnd;
+ tnid.uID = uID;
+ return(Shell_NotifyIconW(NIM_DELETE, &tnid));
+}
+
+static BOOL systray_mod(HWND hwnd, UINT uID, LPWSTR lpszTip)
+{
+ NOTIFYICONDATAW tnid = {0};
+ tnid.cbSize = sizeof(NOTIFYICONDATAW);
+ tnid.hWnd = hwnd;
+ tnid.uID = uID;
+ tnid.uFlags = NIF_TIP|NIF_ICON;
+ tnid.hIcon = hhIcon;
+ mktipstr(tnid.szTip,lpszTip,sizeof(tnid.szTip)/sizeof(wchar_t));
+ return (Shell_NotifyIconW(NIM_MODIFY, &tnid));
+} \ No newline at end of file