Mercurial > dwindows
view win/wintoast.cpp @ 2114:251d050d306b
Change dw_notification_new() to take an image path instead of an in-memory HPIXMAP.
After examining all the platforms, several require the image to be on disk.
It is easier to specify the path and load it on platforms requiring it in memory
than to save it to disk on platforms that require it on disk. Currently it does
not automatically pick an extension like some other functions, may need to add
that feature here too soon. Only tested on Windows in this commit.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Tue, 23 Jun 2020 07:48:29 +0000 |
parents | 35abef6e33a9 |
children | 663467f6eee4 |
line wrap: on
line source
/* Simple WinToast forwarder from Dynamic Windows APIs */ #include "wintoastlib.h" using namespace WinToastLib; extern "C" { LRESULT CALLBACK _wndproc(HWND hWnd, UINT msg, WPARAM mp1, LPARAM mp2); void dw_signal_disconnect_by_window(HWND window); } class DWHandler : public IWinToastHandler { public: WinToastTemplate *templ; void toastActivated() const { // The user clicked in this toast _wndproc((HWND)templ, WM_USER+102, 0, 0); dw_signal_disconnect_by_window((HWND)templ); delete templ; } void toastActivated(int actionIndex) const { // The user clicked on action _wndproc((HWND)templ, WM_USER+102, 0, 0); dw_signal_disconnect_by_window((HWND)templ); delete templ; } void toastDismissed(WinToastDismissalReason state) const { switch (state) { case UserCanceled: // The user dismissed this toast dw_signal_disconnect_by_window((HWND)templ); delete templ; break; case TimedOut: // The toast has timed out break; case ApplicationHidden: // The application hid the toast using ToastNotifier.hide() break; default: // Toast not activated break; } } void toastFailed() const { // Error showing current toast delete templ; } }; enum Results { ToastClicked, // user clicked on the toast ToastDismissed, // user dismissed the toast ToastTimeOut, // toast timed out ToastHided, // application hid the toast ToastNotActivated, // toast was not activated ToastFailed, // toast failed SystemNotSupported, // system does not support toasts UnhandledOption, // unhandled option MultipleTextNotSupported, // multiple texts were provided InitializationFailure, // toast notification manager initialization failure ToastNotLaunched // toast could not be launched }; extern "C" { void _dw_toast_init(LPWSTR AppName, LPWSTR AppID) { if(WinToast::isCompatible()) { // Generate a Microsoft compatible Application User Model ID LPWSTR company = wcschr(AppID, '.'); *company = 0; LPWSTR product = wcschr(++company, '.'); *product = 0; LPWSTR subproduct = wcschr(++product, '.'); if(subproduct) *subproduct = 0; LPWSTR version = subproduct ? wcschr(++subproduct, '.') : NULL; WinToast::instance()->setAppName(AppName); WinToast::instance()->setAppUserModelId(WinToast::instance()->configureAUMI(company, product, subproduct ? subproduct : L"", (version && version++ && _wtoi(version) > 0) ? version : L"")); WinToast::instance()->initialize(); } } void *_dw_notification_new(LPWSTR title, LPWSTR image, LPWSTR description) { if(WinToast::isCompatible()) { WinToastTemplate *templ = new WinToastTemplate(image ? WinToastTemplate::ImageAndText02 : WinToastTemplate::Text02); templ->setTextField(title, WinToastTemplate::FirstLine); templ->setAttributionText(description); if(image) { WCHAR fullpath[MAX_PATH+1] = {0}; GetFullPathNameW(image, MAX_PATH, fullpath, NULL); templ->setImagePath(fullpath); } return (void *)templ; } return NULL; } int _dw_notification_send(void *notification) { if(WinToast::isCompatible()) { WinToastTemplate *templ = (WinToastTemplate *)notification; DWHandler *handler = new DWHandler(); handler->templ = templ; if(templ && WinToast::instance()->showToast(*templ, handler) >= 0) return 0; // DW_ERROR_NONE } return -1; // DW_ERROR_UNKNOWN } BOOL _dw_toast_is_compatible(void) { return WinToast::isCompatible(); } }