Skip to content

Commit 1f05c68

Browse files
committed
Better TrayIcon error handling
1 parent c76c2da commit 1f05c68

File tree

4 files changed

+40
-33
lines changed

4 files changed

+40
-33
lines changed

src/Finestray.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,12 @@ int WINAPI wWinMain(_In_ HINSTANCE hinstance, _In_opt_ HINSTANCE prevHinstance,
193193
// ShowWindow(appWindow_, nCmdShow);
194194
(void)nCmdShow;
195195

196+
ErrorContext err;
197+
196198
// create a tray icon for the app
197-
if (!trayIcon_.create(appWindow_, appWindow_, WM_TRAYWINDOW, hicon)) {
198-
errorMessage(IDS_ERROR_CREATE_TRAY_ICON);
199+
err = trayIcon_.create(appWindow_, appWindow_, WM_TRAYWINDOW, hicon);
200+
if (err) {
201+
errorMessage(err);
199202
return IDS_ERROR_CREATE_TRAY_ICON;
200203
}
201204

@@ -218,7 +221,7 @@ int WINAPI wWinMain(_In_ HINSTANCE hinstance, _In_opt_ HINSTANCE prevHinstance,
218221
return IDS_ERROR_REGISTER_EVENTHOOK;
219222
}
220223

221-
ErrorContext err = start();
224+
err = start();
222225
if (err) {
223226
errorMessage(err);
224227
settingsDialogWindow_ = SettingsDialog::create(appWindow_, settings_, onSettingsDialogComplete);

src/MinimizedWindow.cpp

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "MinimizedWindow.h"
1616

1717
// App
18+
#include "Helpers.h"
1819
#include "Log.h"
1920
#include "StringUtility.h"
2021
#include "TrayIcon.h"
@@ -47,7 +48,6 @@ typedef std::vector<MinimizedWindowData> MinimizedWindows;
4748
MinimizedWindows minimizedWindows_;
4849

4950
MinimizedWindows::iterator findMinimizedWindow(HWND hwnd);
50-
TrayIcon * createTrayIcon(HWND hwnd, HWND messageHwnd);
5151

5252
} // anonymous namespace
5353

@@ -70,7 +70,13 @@ void minimize(HWND hwnd, HWND messageHwnd, MinimizePlacement minimizePlacement)
7070

7171
std::unique_ptr<TrayIcon> trayIcon;
7272
if (minimizePlacementIncludesTray(minimizePlacement)) {
73-
trayIcon.reset(createTrayIcon(hwnd, messageHwnd));
73+
trayIcon.reset(new TrayIcon());
74+
ErrorContext err = trayIcon->create(hwnd, messageHwnd, WM_TRAYWINDOW, WindowIcon::get(hwnd));
75+
if (err) {
76+
WARNING_PRINTF("failed to create tray icon for minimized window %#x\n", hwnd);
77+
trayIcon.reset();
78+
errorMessage(err);
79+
}
7480
}
7581

7682
minimizedWindows_.emplace_back(hwnd, messageHwnd, std::move(trayIcon));
@@ -112,7 +118,17 @@ void addAll(MinimizePlacement minimizePlacement)
112118
MinimizedWindowData & minimizedWindow = *it;
113119
if (minimizePlacementIncludesTray(minimizePlacement)) {
114120
if (!minimizedWindow.trayIcon_) {
115-
minimizedWindow.trayIcon_.reset(createTrayIcon(minimizedWindow.hwnd_, minimizedWindow.messageHwnd_));
121+
minimizedWindow.trayIcon_.reset(new TrayIcon());
122+
ErrorContext err = minimizedWindow.trayIcon_->create(
123+
minimizedWindow.hwnd_,
124+
minimizedWindow.messageHwnd_,
125+
WM_TRAYWINDOW,
126+
WindowIcon::get(minimizedWindow.hwnd_));
127+
if (err) {
128+
WARNING_PRINTF("failed to create tray icon for minimized window %#x\n", minimizedWindow.hwnd_);
129+
minimizedWindow.trayIcon_.reset();
130+
errorMessage(err);
131+
}
116132
}
117133
} else {
118134
if (minimizedWindow.trayIcon_) {
@@ -204,18 +220,4 @@ MinimizedWindows::iterator findMinimizedWindow(HWND hwnd)
204220
});
205221
}
206222

207-
TrayIcon * createTrayIcon(HWND hwnd, HWND messageHwnd)
208-
{
209-
TrayIcon * trayIcon = new TrayIcon();
210-
211-
HICON hicon = WindowIcon::get(hwnd);
212-
if (!hicon) {
213-
hicon = LoadIcon(nullptr, IDI_APPLICATION);
214-
}
215-
216-
trayIcon->create(hwnd, messageHwnd, WM_TRAYWINDOW, hicon);
217-
218-
return trayIcon;
219-
}
220-
221223
} // anonymous namespace

src/TrayIcon.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
// App
1818
#include "Log.h"
19+
#include "Resource.h"
1920
#include "StringUtility.h"
2021

2122
volatile LONG TrayIcon::gid_ = 0;
@@ -25,11 +26,11 @@ TrayIcon::~TrayIcon()
2526
destroy();
2627
}
2728

28-
bool TrayIcon::create(HWND hwnd, HWND messageHwnd, UINT msg, HICON hicon)
29+
ErrorContext TrayIcon::create(HWND hwnd, HWND messageHwnd, UINT msg, HICON hicon)
2930
{
3031
if (nid_.uID) {
3132
WARNING_PRINTF("attempt to re-create tray icon %u\n", nid_.uID);
32-
return false;
33+
return ErrorContext(IDS_ERROR_CREATE_TRAY_ICON, "tray icon already exists");
3334
}
3435

3536
LONG id = InterlockedIncrement(&gid_);
@@ -40,7 +41,7 @@ bool TrayIcon::create(HWND hwnd, HWND messageHwnd, UINT msg, HICON hicon)
4041
nid_.uID = (UINT)id;
4142
nid_.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
4243
nid_.uCallbackMessage = msg;
43-
nid_.hIcon = hicon;
44+
nid_.hIcon = hicon ? hicon : LoadIcon(nullptr, IDI_APPLICATION);
4445
nid_.uVersion = NOTIFYICON_VERSION;
4546

4647
if (!GetWindowTextA(hwnd, nid_.szTip, sizeof(nid_.szTip) / sizeof(nid_.szTip[0])) &&
@@ -49,22 +50,20 @@ bool TrayIcon::create(HWND hwnd, HWND messageHwnd, UINT msg, HICON hicon)
4950
}
5051

5152
if (!Shell_NotifyIconA(NIM_ADD, &nid_)) {
52-
WARNING_PRINTF(
53-
"could not add tray icon, Shell_NotifyIcon() failed: %s\n",
54-
StringUtility::lastErrorString().c_str());
53+
std::string lastErrorString = StringUtility::lastErrorString();
54+
WARNING_PRINTF("could not add tray icon, Shell_NotifyIcon() failed: %s\n", lastErrorString.c_str());
5555
ZeroMemory(&nid_, sizeof(nid_));
56-
return false;
56+
return ErrorContext(IDS_ERROR_CREATE_TRAY_ICON, lastErrorString + "(NIM_ADD)");
5757
}
5858

5959
if (!Shell_NotifyIconA(NIM_SETVERSION, &nid_)) {
60-
WARNING_PRINTF(
61-
"could not set tray icon version, Shell_NotifyIcon() failed: %s\n",
62-
StringUtility::lastErrorString().c_str());
60+
std::string lastErrorString = StringUtility::lastErrorString();
61+
WARNING_PRINTF("could not set tray icon version, Shell_NotifyIcon() failed: %s\n", lastErrorString.c_str());
6362
destroy();
64-
return false;
63+
return ErrorContext(IDS_ERROR_CREATE_TRAY_ICON, lastErrorString + "(NIM_SETVERSION)");
6564
}
6665

67-
return true;
66+
return ErrorContext();
6867
}
6968

7069
void TrayIcon::destroy()

src/TrayIcon.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414

1515
#pragma once
1616

17+
// App
18+
#include "ErrorContext.h"
19+
1720
// Windows
1821
#include <Windows.h>
1922
#include <shellapi.h>
@@ -28,7 +31,7 @@ class TrayIcon
2831
TrayIcon() = default;
2932
~TrayIcon();
3033

31-
bool create(HWND hwnd, HWND messageHwnd, UINT msg, HICON hicon);
34+
ErrorContext create(HWND hwnd, HWND messageHwnd, UINT msg, HICON hicon);
3235
void destroy();
3336

3437
void updateTip(const std::string & tip);

0 commit comments

Comments
 (0)