lzw-723 / tray

Cross-platform, super tiny C99 implementation of a system tray icon with a popup menu.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Cross-platform Linux/Windows/MacOS Tray

Cross-platform, super tiny C99 implementation of a system tray icon with a popup menu.

Works well on:

  • Linux/Gtk (libappindicator)
  • Windows XP or newer (shellapi.h)
  • MacOS (Cocoa/AppKit)

The code is C++ friendly and will compile fine in C++98 and up.

This fork is intended to bring together the original work of Serge Zaitsev and the most interesting forks and PRs of respectable contributors:

Prerequisites

  • CMake
  • Ninja, in order to have the same build commands on all platforms
  • AppIndicator on Linux:
sudo apt install libappindicator3-dev

Building

mkdir build
cd build
cmake -G Ninja ..
ninja

Demo

Execute the tray_example application:

./tray_example

API

Tray structure defines an icon and a menu. Menu is a NULL-terminated array of items. Menu item defines menu text, menu checked and disabled (grayed) flags and a callback with some optional context pointer.

struct tray {
  char *icon;
  struct tray_menu *menu;
};

struct tray_menu {
  char *text;
  int disabled;
  int checked;

  void (*cb)(struct tray_menu *);
  void *context;

  struct tray_menu *submenu;
};
  • int tray_init(struct tray *) - creates tray icon. Returns -1 if tray icon/menu can't be created.
  • void tray_update(struct tray *) - updates tray icon and menu.
  • int tray_loop(int blocking) - runs one iteration of the UI loop. Returns -1 if tray_exit() has been called.
  • void tray_exit() - terminates UI loop.

All functions are meant to be called from the UI thread only.

Menu arrays must be terminated with a NULL item, e.g. the last item in the array must have text field set to NULL.

License

This software is distributed under MIT license, so feel free to integrate it in your commercial products.

About

Cross-platform, super tiny C99 implementation of a system tray icon with a popup menu.

License:MIT License


Languages

Language:C 63.9%Language:CMake 20.2%Language:Objective-C 15.9%