Потестил трей ради эксперимента, пока вывод сложился такой: appindicator используется тулкитами повсеместно, но сам по себе достаточно коряв и не отслеживает события мыши, меню открывает по левой кнопке, так и по правой, при открытии окна в событиях мыши не сохраняет данных о кнопках. Пока придумал такой выход, в addOnAdd контекстного меню, которое ставится в трей через getParent получаю доступ к его родителю Window, opacity в 0. На Window addOnHide и тоже после каждого закрытия opacity в 0. Когда меню открыто, то на нем начинают срабатывать события мыши и в addOnButtonRelease можно отследить кнопку мыши в случае правой кнопки восстановить непрозрачность окна, в котором меню, в случае левой запросить показ окна проги. Получается, что оно на долю секунды появляется по лкм, но само по себе невидимо. Хотя события и обрабатывает, но скрывается быстро, маловероятно, что можно успеть задеть его, хотя не факт... не факт..
Пока остается Gdk-CRITICAL, но насколько я гуглил встречается она часто, у кого то из-за установки иконки, но в целом зависит от процесса включения\выключения защиты от обработки событий, там внутри вставлена проверка счетчика и она фейлится, но проблема в том, что это кагбэ внутреннее апи.
Второй вариант и скорее всего правильный - xapp от минтовцев и XAppStatusIcon
https://github.com/linuxmint/xapp/blob/master/libxapp/xapp-status-icon.h, там есть и события и все плюшки, но разные системы идут с разными версиями либы и можно нарваться на более старую версию, так что выглядит менее универсальным. Но остается проблема с маками, насколько я понимаю, там нужен биндинг на AppKit, а там objective-c\swift. Пока, пожалуй, напишу свой враппер под обычный статус икон в 3, чтобы его апи не попал в код контроллеров, а потом можно уже подменить на что-то другое, но скорее на xapp.