From cb0c7b01e4071b4bb646da7a29585fdda539fb0c Mon Sep 17 00:00:00 2001
From: Jesse Chounard <[EMAIL REDACTED]>
Date: Thu, 5 Feb 2026 12:05:57 -0600
Subject: [PATCH] tray: removed double click handling
---
include/SDL3/SDL_tray.h | 4 ----
src/tray/cocoa/SDL_tray.m | 22 ++++------------------
src/tray/windows/SDL_tray.c | 17 +----------------
test/testtray.c | 8 ++++++++
4 files changed, 13 insertions(+), 38 deletions(-)
diff --git a/include/SDL3/SDL_tray.h b/include/SDL3/SDL_tray.h
index 4b72f2b610977..8586ce8c8b7d3 100644
--- a/include/SDL3/SDL_tray.h
+++ b/include/SDL3/SDL_tray.h
@@ -167,9 +167,6 @@ extern SDL_DECLSPEC SDL_Tray * SDLCALL SDL_CreateTray(SDL_Surface *icon, const c
* - `SDL_PROP_TRAY_CREATE_MIDDLECLICK_CALLBACK_POINTER`: an
* SDL_TrayClickCallback to be invoked when the tray icon is middle-clicked.
* Not supported on all platforms. May be NULL.
- * - `SDL_PROP_TRAY_CREATE_DOUBLECLICK_CALLBACK_POINTER`: an
- * SDL_TrayClickCallback to be invoked when the tray icon is double-clicked.
- * Not supported on all platforms. May be NULL.
*
* \param props the properties to use.
* \returns The newly created system tray icon.
@@ -191,7 +188,6 @@ extern SDL_DECLSPEC SDL_Tray * SDLCALL SDL_CreateTrayWithProperties(SDL_Properti
#define SDL_PROP_TRAY_CREATE_LEFTCLICK_CALLBACK_POINTER "SDL.tray.create.leftclick_callback"
#define SDL_PROP_TRAY_CREATE_RIGHTCLICK_CALLBACK_POINTER "SDL.tray.create.rightclick_callback"
#define SDL_PROP_TRAY_CREATE_MIDDLECLICK_CALLBACK_POINTER "SDL.tray.create.middleclick_callback"
-#define SDL_PROP_TRAY_CREATE_DOUBLECLICK_CALLBACK_POINTER "SDL.tray.create.doubleclick_callback"
/**
* Updates the system tray icon's icon.
diff --git a/src/tray/cocoa/SDL_tray.m b/src/tray/cocoa/SDL_tray.m
index 860a4eb5a25fb..eb0f5ea83a934 100644
--- a/src/tray/cocoa/SDL_tray.m
+++ b/src/tray/cocoa/SDL_tray.m
@@ -34,7 +34,6 @@
/* Objective-C helper class to handle status item button clicks */
@interface SDLTrayClickHandler : NSObject
@property (nonatomic, assign) struct SDL_Tray *tray;
-@property (nonatomic, assign) NSTimeInterval lastLeftClickTime;
@property (nonatomic, strong) id middleClickMonitor;
- (void)handleClick:(id)sender;
- (void)startMonitoringMiddleClicks;
@@ -73,7 +72,6 @@ - (void)stopMonitoringMiddleClicks;
SDL_TrayClickCallback left_click_callback;
SDL_TrayClickCallback right_click_callback;
SDL_TrayClickCallback middle_click_callback;
- SDL_TrayClickCallback double_click_callback;
};
@implementation SDLTrayClickHandler
@@ -90,22 +88,11 @@ - (void)handleClick:(id)sender
bool show_menu = false;
if (buttonNumber == 0) {
- /* Left click - check for double-click ourselves */
- NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
- NSTimeInterval doubleClickInterval = [NSEvent doubleClickInterval];
-
- if (self.tray->double_click_callback && (now - self.lastLeftClickTime) <= doubleClickInterval) {
- /* Double-click */
- self.tray->double_click_callback(self.tray->userdata, self.tray);
- self.lastLeftClickTime = 0; /* Reset to prevent triple-click from triggering another double */
+ /* Left click */
+ if (self.tray->left_click_callback) {
+ show_menu = self.tray->left_click_callback(self.tray->userdata, self.tray);
} else {
- /* Single left click */
- self.lastLeftClickTime = now;
- if (self.tray->left_click_callback) {
- show_menu = self.tray->left_click_callback(self.tray->userdata, self.tray);
- } else {
- show_menu = true;
- }
+ show_menu = true;
}
} else if (buttonNumber == 1) {
/* Right click */
@@ -217,7 +204,6 @@ void SDL_UpdateTrays(void)
tray->left_click_callback = (SDL_TrayClickCallback)SDL_GetPointerProperty(props, SDL_PROP_TRAY_CREATE_LEFTCLICK_CALLBACK_POINTER, NULL);
tray->right_click_callback = (SDL_TrayClickCallback)SDL_GetPointerProperty(props, SDL_PROP_TRAY_CREATE_RIGHTCLICK_CALLBACK_POINTER, NULL);
tray->middle_click_callback = (SDL_TrayClickCallback)SDL_GetPointerProperty(props, SDL_PROP_TRAY_CREATE_MIDDLECLICK_CALLBACK_POINTER, NULL);
- tray->double_click_callback = (SDL_TrayClickCallback)SDL_GetPointerProperty(props, SDL_PROP_TRAY_CREATE_DOUBLECLICK_CALLBACK_POINTER, NULL);
tray->statusItem = nil;
tray->statusBar = [NSStatusBar systemStatusBar];
diff --git a/src/tray/windows/SDL_tray.c b/src/tray/windows/SDL_tray.c
index 170785238e07f..f3c6d90c85a3e 100644
--- a/src/tray/windows/SDL_tray.c
+++ b/src/tray/windows/SDL_tray.c
@@ -67,8 +67,6 @@ struct SDL_Tray {
SDL_TrayClickCallback left_click_callback;
SDL_TrayClickCallback right_click_callback;
SDL_TrayClickCallback middle_click_callback;
- SDL_TrayClickCallback double_click_callback;
- bool ignore_next_left_up;
};
static UINT_PTR get_next_id(void)
@@ -131,9 +129,7 @@ LRESULT CALLBACK TrayWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPar
switch (LOWORD(lParam)) {
case WM_LBUTTONUP:
- if (tray->ignore_next_left_up) {
- tray->ignore_next_left_up = false;
- } else if (tray->left_click_callback) {
+ if (tray->left_click_callback) {
show_menu = tray->left_click_callback(tray->userdata, tray);
} else {
show_menu = true;
@@ -153,16 +149,6 @@ LRESULT CALLBACK TrayWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPar
tray->middle_click_callback(tray->userdata, tray);
}
break;
-
- case WM_LBUTTONDBLCLK:
- if (tray->double_click_callback) {
- tray->double_click_callback(tray->userdata, tray);
- /* Suppress the WM_LBUTTONUP that follows a double-click, so we
- don't fire both double-click and left-click callbacks. This
- matches the behavior on other platforms. */
- tray->ignore_next_left_up = true;
- }
- break;
}
if (show_menu && tray->menu) {
@@ -331,7 +317,6 @@ SDL_Tray *SDL_CreateTrayWithProperties(SDL_PropertiesID props)
tray->left_click_callback = (SDL_TrayClickCallback)SDL_GetPointerProperty(props, SDL_PROP_TRAY_CREATE_LEFTCLICK_CALLBACK_POINTER, NULL);
tray->right_click_callback = (SDL_TrayClickCallback)SDL_GetPointerProperty(props, SDL_PROP_TRAY_CREATE_RIGHTCLICK_CALLBACK_POINTER, NULL);
tray->middle_click_callback = (SDL_TrayClickCallback)SDL_GetPointerProperty(props, SDL_PROP_TRAY_CREATE_MIDDLECLICK_CALLBACK_POINTER, NULL);
- tray->double_click_callback = (SDL_TrayClickCallback)SDL_GetPointerProperty(props, SDL_PROP_TRAY_CREATE_DOUBLECLICK_CALLBACK_POINTER, NULL);
tray->menu = NULL;
if (!SDL_RegisterTrayClass(TEXT("SDL_TRAY"))) {
diff --git a/test/testtray.c b/test/testtray.c
index 3a4fabfc4d718..d13793f89c615 100644
--- a/test/testtray.c
+++ b/test/testtray.c
@@ -24,6 +24,7 @@
* SDL_CreateTrayWithProperties to demonstrate click callbacks:
* - Left click: Logs a message and shows the menu (returns true)
* - Right click: Logs a message and suppresses the menu (returns false)
+ * - Middle click: Logs a message (menu never shows for middle click)
*
* Window behavior:
* - Closing the window (X button) hides it to the tray rather than exiting
@@ -51,6 +52,12 @@ static bool SDLCALL tray2_rightclick(void *userdata, SDL_Tray *tray)
return false;
}
+static bool SDLCALL tray2_middleclick(void *userdata, SDL_Tray *tray)
+{
+ SDL_Log("Middle click on example tray - menu doesn't show for middle click");
+ return false;
+}
+
static bool trays_destroyed = false;
static SDL_Window *window = NULL;
static SDL_TrayEntry *entry_toggle = NULL;
@@ -607,6 +614,7 @@ int main(int argc, char **argv)
SDL_SetStringProperty(tray2_props, SDL_PROP_TRAY_CREATE_TOOLTIP_STRING, "SDL Tray example");
SDL_SetPointerProperty(tray2_props, SDL_PROP_TRAY_CREATE_LEFTCLICK_CALLBACK_POINTER, tray2_leftclick);
SDL_SetPointerProperty(tray2_props, SDL_PROP_TRAY_CREATE_RIGHTCLICK_CALLBACK_POINTER, tray2_rightclick);
+ SDL_SetPointerProperty(tray2_props, SDL_PROP_TRAY_CREATE_MIDDLECLICK_CALLBACK_POINTER, tray2_middleclick);
SDL_Tray *tray2 = SDL_CreateTrayWithProperties(tray2_props);
SDL_DestroyProperties(tray2_props);