You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Popular desktop environments have dropped the legacy concept of a SysTray. Here’s a list of newer, capable, cross-desktop APIs to use instead.
redirect_from
app-indicator
appindicator
app-indicators
appindicators
indicators
status-icon
statusicon
status-icons
statusicons
systemtray
sys-tray
sys-trays
systrays
[Is Linux About]({{ site.baseurl }}/) SysTray?
{% assign des = site.desktop-environments | sort: "title" %}
No.
Popular desktop environments have dropped the legacy concept of a SysTray (system tray, notification area, status icons, app indicators, tray icons, etc.). However, there are many newer, more capable, and cross-desktop APIs that replace the functionality previously provided by these icons.
Here you can find a list of replacement APIs and see how well-supported they are.
If you want to communicate synchronization status or provide actions related to cloud storage devices, you can use the CloudProviders DBus API
{% for de in des %}
{% endfor %}
{% for de in des %}
{% assign status = de.cloudproviders.status-icon %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.cloudproviders.status-icon-note %}
{% assign note = de.cloudproviders.status-icon-note %}
{% endif %}
{% endfor %}
{% for de in des %}
{% assign status = de.cloudproviders.actions %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.cloudproviders.actions-note %}
{% assign note = de.cloudproviders.actions-note %}
{% endif %}
{% endfor %}
{{ de.title }}
Status Icon
{{ status }}
Actions
{{ status }}
Desktop Actions
If you want to provide quick access to common actions, you can add them to your .desktop file
{% for de in des %}
{% endfor %}
{% for de in des %}
{% assign status = de.desktop-actions.actions %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.desktop-actions.actions-note %}
{% assign note = de.desktop-actions.actions-note %}
{% endif %}
{% endfor %}
{% for de in des %}
{% assign status = de.desktop-actions.icons %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.desktop-actions.icons-note %}
{% assign note = de.desktop-actions.icons-note %}
{% endif %}
{% endfor %}
{{ de.title }}
Actions
{{ status }}
Icons
{{ status }}
Launcher Entry
If you want to communicate progress information for long-running background tasks or the number of items needing action in your app (such as tasks or messages) you can use the LauncherEntry DBus API
{% for de in des %}
{% endfor %}
{% for de in des %}
{% assign status = de.launcher-entry.progress-bar %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.launcher-entry.progress-bar-note %}
{% assign note = de.launcher-entry.progress-bar-note %}
{% endif %}
{% endfor %}
{% for de in des %}
{% assign status = de.launcher-entry.badge %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.launcher-entry.badge-note %}
{% assign note = de.launcher-entry.badge-note %}
{% endif %}
{% endfor %}
{{ de.title }}
Progress Bar
{{ status }}
Badge
{{ status }}
MPRIS
If you want the user to be able to access media player controls for you app, you can listen to and supply information to MPRIS
{% for de in des %}
{% endfor %}
{% for de in des %}
{% assign status = de.mpris.media-info %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.mpris.media-info-note %}
{% assign note = de.mpris.media-info-note %}
{% endif %}
{% endfor %}
{% for de in des %}
{% assign status = de.mpris.player-controls %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.mpris.player-controls-note %}
{% assign note = de.mpris.player-controls-note %}
{% endif %}
{% endfor %}
{% for de in des %}
{% assign status = de.mpris.album-art %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.mpris.album-art-note %}
{% assign note = de.mpris.album-art-note %}
{% endif %}
{% endfor %}
{{ de.title }}
Media Info
{{ status }}
Player Controls
{{ status }}
Album Art
{{ status }}
Notifications
If you want to alert the user that something has changed in your app, you can send a notification bubble
{% for de in des %}
{% endfor %}
{% for de in des %}
{% assign status = de.notifications.bubbles %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.notifications.bubbles-note %}
{% assign note = de.notifications.bubbles-note %}
{% endif %}
{% endfor %}
{% for de in des %}
{% assign status = de.notifications.actions %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.notifications.actions-note %}
{% assign note = de.notifications.actions-note %}
{% endif %}
{% endfor %}
{% for de in des %}
{% assign status = de.notifications.notification-center %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.notifications.notifications-center-note %}
{% assign note = de.notifications.notifications-center-note %}
{% endif %}
{% endfor %}
{% for de in des %}
{% assign status = de.notifications.images %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.notifications.images-note %}
{% assign note = de.notifications.images-note %}
{% endif %}
{% endfor %}
{% for de in des %}
{% assign status = de.notifications.replace %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.notifications.replace-note %}
{% assign note = de.notifications.replace-note %}
{% endif %}
{% endfor %}
{% for de in des %}
{% assign status = de.notifications.inline-reply %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.notifications.inline-reply %}
{% assign note = de.notifications.inline-reply %}
{% endif %}
{% endfor %}
{{ de.title }}
Bubbles
{{ status }}
Actions
{{ status }}
Notification Center
{{ status }}
Images
{{ status }}
Replace
{{ status }}
Inline Reply
{{ status }}
Portals
XDG Desktop Portals are sandbox-compatible DBus APIs for accessing system functions. Desktop environments can use these portals to request consent from users and provide an ongoing visual indication of portal usage.
Location
The Location Portal is responsible for providing apps with the device's current physical location.
{% for de in des %}
{% endfor %}
{% for de in des %}
{% assign status = de.portals.location-consent %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.portals.location-consent-note %}
{% assign note = de.portals.location-consent-note %}
{% endif %}
{% endfor %}
{% for de in des %}
{% assign status = de.portals.location-indication %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.portals.location-indication-note %}
{% assign note = de.portals.location-indication-note %}
{% endif %}
{% endfor %}
{{ de.title }}
Consent
{{ status }}
Indication
{{ status }}
Screencast/Recording
The Screencast Portal is responsible for providing apps with the display's or a window's visible content i.e. for recording, streaming, or remote viewing.
{% for de in des %}
{% endfor %}
{% for de in des %}
{% assign status = de.portals.screencast-consent %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.portals.screenshot-consent-note %}
{% assign note = de.portals.screencast-consent-note %}
{% endif %}
{% endfor %}
{% for de in des %}
{% assign status = de.portals.screencast-indication %}
{% if status == true %}
{% assign status = "✔️" %}
{% assign note = "Implemented" %}
{% elsif status == false %}
{% assign status = "✖️" %}
{% assign note = "Not implemented" %}
{% elsif status == "planned" %}
{% assign status = "📝️" %}
{% assign note = "Planned" %}
{% elsif status == "partial" %}
{% assign status = "🛠️" %}
{% assign note = "Partially implemented" %}
{% elsif status == "unknown" %}
{% assign status = "❓️" %}
{% assign note = "Unknown" %}
{% endif %}
{% if de.portals.screenshot-indication-note %}
{% assign note = de.portals.screencast-indication-note %}
{% endif %}
{% endfor %}