const std = @import("std"); pub const c = @import("c.zig").c; const surface_api = @import("surface.zig"); pub const Surface = surface_api.Surface; pub const Tray = opaque { pub inline fn setTrayIcon(tray: *Tray, icon: ?*Surface) void { return c.SDL_SetTrayIcon(@ptrCast(tray), @ptrCast(icon)); } pub inline fn setTrayTooltip(tray: *Tray, tooltip: [*c]const u8) void { return c.SDL_SetTrayTooltip(@ptrCast(tray), tooltip); } pub inline fn createTrayMenu(tray: *Tray) ?*TrayMenu { return @ptrCast(c.SDL_CreateTrayMenu(@ptrCast(tray))); } pub inline fn getTrayMenu(tray: *Tray) ?*TrayMenu { return @ptrCast(c.SDL_GetTrayMenu(@ptrCast(tray))); } pub inline fn destroyTray(tray: *Tray) void { return c.SDL_DestroyTray(@ptrCast(tray)); } }; pub const TrayMenu = opaque { pub inline fn getTrayEntries(traymenu: *TrayMenu, count: *c_int) [*c]?*const TrayEntry { return c.SDL_GetTrayEntries(@ptrCast(traymenu), @ptrCast(count)); } pub inline fn insertTrayEntryAt(traymenu: *TrayMenu, pos: c_int, label: [*c]const u8, flags: TrayEntryFlags) ?*TrayEntry { return @ptrCast(c.SDL_InsertTrayEntryAt(@ptrCast(traymenu), pos, label, @bitCast(flags))); } pub inline fn getTrayMenuParentEntry(traymenu: *TrayMenu) ?*TrayEntry { return @ptrCast(c.SDL_GetTrayMenuParentEntry(@ptrCast(traymenu))); } pub inline fn getTrayMenuParentTray(traymenu: *TrayMenu) ?*Tray { return @ptrCast(c.SDL_GetTrayMenuParentTray(@ptrCast(traymenu))); } }; pub const TrayEntry = opaque { pub inline fn createTraySubmenu(trayentry: *TrayEntry) ?*TrayMenu { return @ptrCast(c.SDL_CreateTraySubmenu(@ptrCast(trayentry))); } pub inline fn getTraySubmenu(trayentry: *TrayEntry) ?*TrayMenu { return @ptrCast(c.SDL_GetTraySubmenu(@ptrCast(trayentry))); } pub inline fn removeTrayEntry(trayentry: *TrayEntry) void { return c.SDL_RemoveTrayEntry(@ptrCast(trayentry)); } pub inline fn setTrayEntryLabel(trayentry: *TrayEntry, label: [*c]const u8) void { return c.SDL_SetTrayEntryLabel(@ptrCast(trayentry), label); } pub inline fn getTrayEntryLabel(trayentry: *TrayEntry) [*c]const u8 { return c.SDL_GetTrayEntryLabel(@ptrCast(trayentry)); } pub inline fn setTrayEntryChecked(trayentry: *TrayEntry, checked: bool) void { return c.SDL_SetTrayEntryChecked(@ptrCast(trayentry), @bitCast(checked)); } pub inline fn getTrayEntryChecked(trayentry: *TrayEntry) bool { return @bitCast(c.SDL_GetTrayEntryChecked(@ptrCast(trayentry))); } pub inline fn setTrayEntryEnabled(trayentry: *TrayEntry, enabled: bool) void { return c.SDL_SetTrayEntryEnabled(@ptrCast(trayentry), @bitCast(enabled)); } pub inline fn getTrayEntryEnabled(trayentry: *TrayEntry) bool { return @bitCast(c.SDL_GetTrayEntryEnabled(@ptrCast(trayentry))); } pub inline fn setTrayEntryCallback(trayentry: *TrayEntry, callback: TrayCallback, userdata: ?*anyopaque) void { return c.SDL_SetTrayEntryCallback(@ptrCast(trayentry), callback, userdata); } pub inline fn clickTrayEntry(trayentry: *TrayEntry) void { return c.SDL_ClickTrayEntry(@ptrCast(trayentry)); } pub inline fn getTrayEntryParent(trayentry: *TrayEntry) ?*TrayMenu { return @ptrCast(c.SDL_GetTrayEntryParent(@ptrCast(trayentry))); } }; pub const TrayEntryFlags = packed struct(u32) { trayentryButton: bool = false, // Make the entry a simple button. Required. trayentryCheckbox: bool = false, // Make the entry a checkbox. Required. trayentrySubmenu: bool = false, // Prepare the entry to have a submenu. Required trayentryDisabled: bool = false, // Make the entry disabled. Optional. trayentryChecked: bool = false, // Make the entry checked. This is valid only for checkboxes. Optional. pad0: u26 = 0, rsvd: bool = false, pub const None = TrayEntryFlags{}; }; pub const TrayCallback = c.SDL_TrayCallback; pub inline fn createTray(icon: ?*Surface, tooltip: [*c]const u8) ?*Tray { return @ptrCast(c.SDL_CreateTray(@ptrCast(icon), tooltip)); } pub inline fn updateTrays() void { return c.SDL_UpdateTrays(); }