Skip to content

Latest commit

 

History

History
677 lines (643 loc) · 24.1 KB

File metadata and controls

677 lines (643 loc) · 24.1 KB
description 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.

Additional Resources

I want to…

CloudProviders

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 %}
{{ de.title }}
Consent{{ status }}
Indication{{ status }}