diff --git a/src/core/linux/SDL_dbus.c b/src/core/linux/SDL_dbus.c
index af791b764e..2416907fc6 100644
--- a/src/core/linux/SDL_dbus.c
+++ b/src/core/linux/SDL_dbus.c
@@ -53,7 +53,7 @@ static unsigned int screensaver_cookie = 0;
static SDL_DBusContext dbus;
#define DBUS_MENU_INTERFACE "com.canonical.dbusmenu"
-#define DBUS_MENU_OBJECT_PATH "/Menu"
+#define DBUS_MENU_OBJECT_PATH "/StatusNotifierItem/menu"
#define SDL_DBUS_UPDATE_MENU_FLAG_DO_NOT_REPLACE (1 << 0)
static const char *menu_introspect = "";
diff --git a/src/core/unix/SDL_appid.c b/src/core/unix/SDL_appid.c
index 3b85cbc876..afe157f2cd 100644
--- a/src/core/unix/SDL_appid.c
+++ b/src/core/unix/SDL_appid.c
@@ -61,6 +61,12 @@ const char *SDL_GetAppID(void)
{
const char *id_str = SDL_GetAppMetadataProperty(SDL_PROP_APP_METADATA_IDENTIFIER_STRING);
+#ifdef SDL_PLATFORM_LINUX
+ if (!id_str) {
+ id_str = SDL_getenv("FLATPAK_ID");
+ }
+#endif
+
if (!id_str) {
// If the hint isn't set, try to use the application's executable name
id_str = SDL_GetExeName();
diff --git a/src/tray/unix/SDL_dbustray.c b/src/tray/unix/SDL_dbustray.c
index 0885da8f01..c2c66679e7 100644
--- a/src/tray/unix/SDL_dbustray.c
+++ b/src/tray/unix/SDL_dbustray.c
@@ -28,6 +28,7 @@
#ifdef SDL_USE_LIBDBUS
#include "../../video/SDL_surface_c.h"
+#include "../../core/unix/SDL_appid.h"
#include "../SDL_tray_utils.h"
#include "SDL_unixtray.h"
#include
@@ -468,7 +469,11 @@ SDL_Tray *CreateTray(SDL_TrayDriver *driver, SDL_PropertiesID props)
/* Request name */
driver->count++;
- SDL_asprintf(&tray_dbus->service_name, "org.kde.StatusNotifierItem-%d-%d", getpid(), driver->count);
+ if (SDL_GetSandbox() == SDL_SANDBOX_FLATPAK) {
+ SDL_asprintf(&tray_dbus->service_name, "%s.tray%d", SDL_GetAppID(), driver->count);
+ } else {
+ SDL_asprintf(&tray_dbus->service_name, "org.kde.StatusNotifierItem-%d-%d", getpid(), driver->count);
+ }
status = dbus_driver->dbus->bus_request_name(tray_dbus->connection, tray_dbus->service_name, DBUS_NAME_FLAG_REPLACE_EXISTING, &err);
if (dbus_driver->dbus->error_is_set(&err)) {
SDL_SetError("Unable to create tray: %s", err.message);