File: src\Aspire.Tray\Linux\Gtk.cs
Web Access
Project: src\tests\Aspire.Tray.Tests\Aspire.Tray.Tests.csproj (Aspire.Tray.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Reflection;
using System.Runtime.InteropServices;
 
namespace Aspire.Tray;
 
/// <summary>
/// GTK 3 widgets exported as StatusNotifierItem and com.canonical.dbusmenu by libappindicator.
/// </summary>
internal static partial class Gtk
{
    private const string GtkLibrary = "libgtk-3.so.0";
    private const string IndicatorLibrary = "aspire-appindicator";
 
    internal static void Load()
    {
        // Both implementations expose the same GTK3 ABI. Let the distribution supply
        // its maintained D-Bus menu implementation, including watcher restart handling.
        // https://github.com/AyatanaIndicators/libayatana-appindicator
        NativeLibrary.SetDllImportResolver(typeof(Gtk).Assembly, Resolve);
    }
 
    private static nint Resolve(string name, Assembly assembly, DllImportSearchPath? paths)
    {
        if (name != IndicatorLibrary)
        {
            return 0;
        }
        foreach (var library in new[] { "libayatana-appindicator3.so.1", "libappindicator3.so.1" })
        {
            if (NativeLibrary.TryLoad(library, assembly, paths, out var handle))
            {
                return handle;
            }
        }
        throw new DllNotFoundException("Install the GTK 3 Ayatana AppIndicator library (libayatana-appindicator3-1 on Debian/Ubuntu, libayatana-appindicator-gtk3 on Fedora), or libappindicator3.");
    }
 
    [LibraryImport(GtkLibrary)] internal static partial int gtk_init_check(nint argc, nint argv);
    [LibraryImport(GtkLibrary)] internal static partial void gtk_main();
    [LibraryImport(GtkLibrary)] internal static partial void gtk_main_quit();
    [LibraryImport(GtkLibrary)] internal static partial nint gtk_menu_new();
    [LibraryImport(GtkLibrary, StringMarshalling = StringMarshalling.Utf8)] internal static partial nint gtk_menu_item_new_with_label(string label);
    [LibraryImport(GtkLibrary, StringMarshalling = StringMarshalling.Utf8)] internal static partial nint gtk_image_menu_item_new_with_label(string label);
    [LibraryImport(GtkLibrary)] internal static partial void gtk_image_menu_item_set_image(nint item, nint image);
    [LibraryImport(GtkLibrary)] internal static partial void gtk_image_menu_item_set_always_show_image(nint item, int alwaysShow);
    [LibraryImport(GtkLibrary, StringMarshalling = StringMarshalling.Utf8)] internal static partial nint gtk_image_new_from_icon_name(string name, int size);
    [LibraryImport(GtkLibrary)] internal static partial nint gtk_image_new_from_pixbuf(nint pixbuf);
    [LibraryImport("libgdk-3.so.0")] internal static partial nint gdk_pixbuf_get_from_surface(nint surface, int x, int y, int width, int height);
    [LibraryImport("libcairo.so.2")] internal static partial nint cairo_image_surface_create(int format, int width, int height);
    [LibraryImport("libcairo.so.2", StringMarshalling = StringMarshalling.Utf8)] internal static partial nint cairo_image_surface_create_from_png(string path);
    [LibraryImport("libcairo.so.2", StringMarshalling = StringMarshalling.Utf8)] internal static partial int cairo_surface_write_to_png(nint surface, string path);
    [LibraryImport("libcairo.so.2")] internal static partial int cairo_image_surface_get_width(nint surface);
    [LibraryImport("libcairo.so.2")] internal static partial int cairo_image_surface_get_height(nint surface);
    [LibraryImport("libcairo.so.2")] internal static partial void cairo_set_source_surface(nint context, nint surface, double x, double y);
    [LibraryImport("libcairo.so.2")] internal static partial void cairo_paint_with_alpha(nint context, double alpha);
    [LibraryImport("libcairo.so.2")] internal static partial void cairo_set_operator(nint context, int operation);
    [LibraryImport("libcairo.so.2")] internal static partial int cairo_surface_status(nint surface);
    [LibraryImport("libcairo.so.2")] internal static partial void cairo_surface_destroy(nint surface);
    [LibraryImport("libcairo.so.2")] internal static partial nint cairo_create(nint surface);
    [LibraryImport("libcairo.so.2")] internal static partial int cairo_status(nint context);
    [LibraryImport("libcairo.so.2")] internal static partial void cairo_destroy(nint context);
    [LibraryImport("libcairo.so.2")] internal static partial void cairo_set_source_rgb(nint context, double red, double green, double blue);
    [LibraryImport("libcairo.so.2")] internal static partial void cairo_arc(nint context, double x, double y, double radius, double start, double end);
    [LibraryImport("libcairo.so.2")] internal static partial void cairo_rectangle(nint context, double x, double y, double width, double height);
    [LibraryImport("libcairo.so.2")] internal static partial void cairo_fill(nint context);
    [LibraryImport(GtkLibrary)] internal static partial nint gtk_separator_menu_item_new();
    [LibraryImport(GtkLibrary)] internal static partial void gtk_menu_shell_append(nint menu, nint item);
    [LibraryImport(GtkLibrary)] internal static partial void gtk_menu_item_set_submenu(nint item, nint submenu);
    [LibraryImport(GtkLibrary)] internal static partial void gtk_widget_set_sensitive(nint widget, int sensitive);
    [LibraryImport(GtkLibrary)] internal static partial void gtk_widget_show_all(nint widget);
    [LibraryImport(GtkLibrary)] internal static partial void gtk_widget_destroy(nint widget);
    [LibraryImport(GtkLibrary)] internal static partial nint gtk_dialog_new();
    [LibraryImport(GtkLibrary, StringMarshalling = StringMarshalling.Utf8)] internal static partial void gtk_window_set_title(nint window, string title);
    [LibraryImport(GtkLibrary)] internal static partial void gtk_window_set_modal(nint window, int modal);
    [LibraryImport(GtkLibrary)] internal static partial nint gtk_dialog_get_content_area(nint dialog);
    [LibraryImport(GtkLibrary, StringMarshalling = StringMarshalling.Utf8)] internal static partial nint gtk_label_new(string text);
    [LibraryImport(GtkLibrary)] internal static partial void gtk_label_set_line_wrap(nint label, int wrap);
    [LibraryImport(GtkLibrary)] internal static partial void gtk_label_set_max_width_chars(nint label, int width);
    [LibraryImport(GtkLibrary)] internal static partial void gtk_container_add(nint container, nint child);
    [LibraryImport(GtkLibrary)] internal static partial void gtk_container_set_border_width(nint container, uint border);
    [LibraryImport(GtkLibrary, StringMarshalling = StringMarshalling.Utf8)] internal static partial nint gtk_dialog_add_button(nint dialog, string label, int response);
    [LibraryImport(GtkLibrary)] internal static partial void gtk_dialog_set_default_response(nint dialog, int response);
    [LibraryImport(GtkLibrary)] internal static partial int gtk_dialog_run(nint dialog);
    [LibraryImport(GtkLibrary)] internal static partial void gtk_dialog_response(nint dialog, int response);
    [LibraryImport(GtkLibrary, StringMarshalling = StringMarshalling.Utf8)] internal static partial nint gtk_check_button_new_with_label(string label);
    [LibraryImport(GtkLibrary)] internal static partial int gtk_toggle_button_get_active(nint button);
    [LibraryImport(GtkLibrary)] internal static partial nint gtk_clipboard_get(nint selection);
    [LibraryImport(GtkLibrary)] internal static partial nint gtk_entry_new();
    [LibraryImport(GtkLibrary, StringMarshalling = StringMarshalling.Utf8)] internal static partial void gtk_entry_set_text(nint entry, string text);
    [LibraryImport(GtkLibrary)] internal static partial void gtk_editable_set_editable(nint editable, int editableState);
    [LibraryImport(GtkLibrary)] internal static partial void gtk_editable_select_region(nint editable, int start, int end);
    [LibraryImport(GtkLibrary)] internal static partial int gtk_window_has_toplevel_focus(nint window);
    [LibraryImport("libgdk-3.so.0", StringMarshalling = StringMarshalling.Utf8)] internal static partial nint gdk_atom_intern(string name, int onlyIfExists);
    [LibraryImport(GtkLibrary, StringMarshalling = StringMarshalling.Utf8)] internal static partial void gtk_clipboard_set_text(nint clipboard, string text, int length);
    [LibraryImport("libglib-2.0.so.0")] internal static partial uint g_timeout_add(uint interval, nint callback, nint data);
    [LibraryImport("libglib-2.0.so.0")] internal static partial uint g_idle_add(nint callback, nint data);
    [LibraryImport("libglib-2.0.so.0")] internal static partial int g_source_remove(uint source);
    [LibraryImport("libgobject-2.0.so.0", StringMarshalling = StringMarshalling.Utf8)] internal static partial ulong g_signal_connect_data(nint instance, string signal, nint callback, nint data, nint destroy, int flags);
    [LibraryImport("libgobject-2.0.so.0")] internal static partial void g_object_unref(nint instance);
    [LibraryImport("libgobject-2.0.so.0")] internal static partial nint g_object_ref_sink(nint instance);
    [LibraryImport("libgio-2.0.so.0", StringMarshalling = StringMarshalling.Utf8)]
    internal static partial nint g_dbus_proxy_new_for_bus_sync(int busType, int flags, nint info, string name, string path, string interfaceName, nint cancellable, out nint error);
    [LibraryImport("libgio-2.0.so.0", StringMarshalling = StringMarshalling.Utf8)]
    internal static partial nint g_dbus_proxy_get_cached_property(nint proxy, string propertyName);
    [LibraryImport("libglib-2.0.so.0", StringMarshalling = StringMarshalling.Utf8)]
    internal static partial int g_variant_is_of_type(nint value, string type);
    [LibraryImport("libglib-2.0.so.0")] internal static partial int g_variant_get_boolean(nint value);
    [LibraryImport("libglib-2.0.so.0")] internal static partial void g_variant_unref(nint value);
    [LibraryImport(IndicatorLibrary, StringMarshalling = StringMarshalling.Utf8)] internal static partial nint app_indicator_new(string id, string icon, int category);
    [LibraryImport(IndicatorLibrary)] internal static partial void app_indicator_set_status(nint indicator, int status);
    [LibraryImport(IndicatorLibrary)] internal static partial void app_indicator_set_menu(nint indicator, nint menu);
    [LibraryImport(IndicatorLibrary, StringMarshalling = StringMarshalling.Utf8)] internal static partial void app_indicator_set_title(nint indicator, string title);
    [LibraryImport(IndicatorLibrary, StringMarshalling = StringMarshalling.Utf8)] internal static partial void app_indicator_set_icon_full(nint indicator, string icon, string description);
}