/* Written by Patrick Griffis <tingping@tingping.se> SPDX License: CC0-1.0 */

#ifdef GDK_WINDOWING_X11
/* Note you will have to link to xlib in this case */
#include <gdk/gdkx.h>
#endif

#ifdef GDK_WINDOWING_WIN32
#include <gdk/win32/gdkwin32.h>
#endif

#ifdef GDK_WINDOWING_QUARTZ
#include <gdk/quartz/gdkquartz.h>
#endif


gboolean
tray_icon_supported (GtkWindow *window)
{
#if defined(GDK_WINDOWING_X11) || defined(GDK_WINDOWING_WIN32) || defined(GDK_WINDOWING_QUARTZ)
    GdkScreen *screen = gtk_window_get_screen (window);
    GdkDisplay *display = gdk_screen_get_display (screen);
#endif

#ifdef GDK_WINDOWING_X11
    if (GDK_IS_X11_DISPLAY (display))
      {
        int screen_number = gdk_screen_get_number (screen);
        char *selection_name = g_strdup_printf ("_NET_SYSTEM_TRAY_S%d", screen_number);

        Display *xdisplay = gdk_x11_display_get_xdisplay (display);
        Atom selection_atom = gdk_x11_get_xatom_by_name_for_display (display, selection_name);
        Window tray_window = None;    

        gdk_x11_display_grab (display);
        tray_window = XGetSelectionOwner (xdisplay, selection_atom);
        gdk_x11_display_ungrab (display);

        XFlush (xdisplay);
        g_free (selection_name);

        return (tray_window != None);

      }
#endif

/* Windows and OSX always have tray support */
#ifdef GDK_WINDOWING_WIN32
    if (GDK_IS_WIN32_DISPLAY (display))
        return TRUE;
#endif

#ifdef GDK_WINDOWING_QUARTZ
    if (GDK_IS_QUARTZ_DISPLAY (display))
        return TRUE;
#endif

    /* Wayland, Broadway, and Mir never do. */
    return FALSE;
}

Initiatives/StatusIconMigration/Guidelines/TraySupportCheck (last edited 2018-03-05 21:50:32 by TingPing)