diff foosdk/sdk/foobar2000/shared/systray.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foosdk/sdk/foobar2000/shared/systray.cpp	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,108 @@
+#include "shared.h"
+#include <shellapi.h>
+
+void SHARED_EXPORT uFixAmpersandChars(const char * src,pfc::string_base & out)
+{
+	out.reset();
+	while(*src)
+	{
+		if (*src=='&')
+		{
+			out.add_string("&&&");
+			src++;
+			while(*src=='&')
+			{
+				out.add_string("&&");
+				src++;
+			}
+		}
+		else out.add_byte(*(src++));
+	}
+}
+
+void SHARED_EXPORT uFixAmpersandChars_v2(const char * src,pfc::string_base & out)
+{
+	out.reset();
+	while(*src)
+	{
+		if (*src=='&')
+		{
+			out.add_string("&&");
+			src++;
+		}
+		else out.add_byte(*(src++));
+	}
+}
+
+static BOOL run_action(DWORD action,NOTIFYICONDATA * data)
+{
+	if (Shell_NotifyIcon(action,data)) return TRUE;
+	if (action==NIM_MODIFY)
+	{
+		if (Shell_NotifyIcon(NIM_ADD,data)) return TRUE;
+	}
+	return FALSE;
+}
+
+extern "C"
+{
+
+	BOOL SHARED_EXPORT uShellNotifyIcon(DWORD action,HWND wnd,UINT id,UINT callbackmsg,HICON icon,const char * tip)
+	{
+		NOTIFYICONDATA nid = {};
+		nid.cbSize = sizeof(nid);
+		nid.hWnd = wnd;
+		nid.uID = id;
+		nid.uFlags = 0;
+		if (callbackmsg)
+		{
+			nid.uFlags |= NIF_MESSAGE;
+			nid.uCallbackMessage = callbackmsg;
+		}
+		if (icon)
+		{
+			nid.uFlags |= NIF_ICON;
+			nid.hIcon = icon;
+		}			
+		if (tip)
+		{
+			nid.uFlags |= NIF_TIP;
+			pfc::stringToBuffer(nid.szTip,pfc::stringcvt::string_os_from_utf8(tip));
+		}
+
+		return run_action(action,&nid);
+	}
+
+	BOOL SHARED_EXPORT uShellNotifyIconEx(DWORD action,HWND wnd,UINT id,UINT callbackmsg,HICON icon,const char * tip,const char * balloon_title,const char * balloon_msg)
+	{
+		NOTIFYICONDATA nid = {};
+		nid.cbSize = sizeof(nid);
+		nid.hWnd = wnd;
+		nid.uID = id;
+		if (callbackmsg)
+		{
+			nid.uFlags |= NIF_MESSAGE;
+			nid.uCallbackMessage = callbackmsg;
+		}
+		if (icon)
+		{
+			nid.uFlags |= NIF_ICON;
+			nid.hIcon = icon;
+		}			
+		if (tip)
+		{
+			nid.uFlags |= NIF_TIP;
+			pfc::stringToBuffer(nid.szTip,pfc::stringcvt::string_os_from_utf8(tip));
+		}
+
+		nid.dwInfoFlags = NIIF_INFO | NIIF_NOSOUND;
+		//if (balloon_title || balloon_msg)
+		{
+			nid.uFlags |= NIF_INFO;
+			if (balloon_title) pfc::stringToBuffer(nid.szInfoTitle,pfc::stringcvt::string_os_from_utf8(balloon_title));
+			if (balloon_msg) pfc::stringToBuffer(nid.szInfo,pfc::stringcvt::string_os_from_utf8(balloon_msg));
+		}
+		return run_action(action,&nid);
+	}
+
+}//extern "C"