Eto: Добавить элемент управления значком в трее

Созданный на 7 мар. 2015  ·  33Комментарии  ·  Источник: picoe/Eto

enhancement

Самый полезный комментарий

Реализация Wpf выполнена:
wpf

Все 33 Комментарий

Да, в .Net framework есть класс NotifyIcon, но я не смог его правильно использовать.

«Общий значок NotifyIcon не отображается, если вы используете рабочий стол KDE по умолчанию;
для этого требуется панель Gnome под названием «Апплет области уведомлений».
http://www.codeproject.com/Articles/466805/AmberIndicator-a-systray-app-under-Linux

«В openSUSE, Fedora и Ubuntu NotifyIcon нельзя использовать»
https://bugzilla.novell.com/show_bug.cgi?id=590093

«NotifyIcon не отображается в системном трее (проверено на ОС: Fedora, Arch. DE: MATE, Cinnamon)»
https://bugzilla.xamarin.com/show_bug.cgi?id=14976

Должно быть что-то более интегрированное с DBus.

Основная идея заключается в том, что создание значка в области уведомлений
менее раздражает, чем всплывающее диалоговое окно (диалоговое окно прерывает текущую работу, а значок может некоторое время игнорироваться пользователем). Однако значок также труднее заметить, поэтому есть функция, позволяющая значкам в трее всплывать небольшие всплывающие окна с сообщениями (может ли всплывающее окно содержать изображения или видеопотоки с камеры входной двери? или он отображает только строки?). В частности, это означает, что балун через какое-то время должен исчезнуть (но менеджер Rigo делает неправильно - он требует от пользователя закрыть его вручную)

Существует также апплет _Workspace Switcher_, с которым было бы неплохо интегрироваться через DBus. Сценарий использования - программы MDI, которые должны отображать разный набор документов в разных рабочих областях. Я создал еще один запрос функции для рабочих пространств — https://github.com/picoe/Eto/issues/409.

«Системный трей GNOME может быть горизонтальным или вертикальным»

«Системный трей координирует всплывающие сообщения, чтобы обеспечить их единообразный внешний вид и избежать одновременного отображения нескольких всплывающих сообщений… для повторной сборки сообщений на основе идентификатора окна значка в трее.... Сообщение всплывающей подсказки — это короткое текстовое сообщение... Сообщение может иметь тайм-аут, в этом случае сообщение будет удалено по истечении тайм-аута. ... Значок в трее может отменить ранее отправленное всплывающее сообщение."

Mono NotifyIcon в области уведомлений

некоторые URL-адреса:

  1. Руководство по пользовательскому интерфейсу GNOME 2.2.3 Интеграция с рабочим столом
    https://developer.gnome.org/hig-book/unstable/desktop-notification-area.html.en
  2. Спецификация протокола панели задач
    http://standards.freedesktop.org/systemtray-spec/latest/
  3. Руководство по межклиентским коммуникациям
    http://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html
  4. Спецификация протокола XEmbed (протокол для встраивания виджетов между наборами инструментов)
    http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html
  5. Расширенные подсказки оконного менеджера
    http://standards.freedesktop.org/wm-spec/wm-spec-latest.html
  6. Система.Windows.Forms.NotifyIcon (MSDN)
    https://msdn.microsoft.com/ru-ru/library/system.windows.forms.notifyicon%28v=vs.110%29.aspx
  7. Реализация NotifyIcon в моно
    https://github.com/mono/mono/blob/ef380e3712af86ef7f8064fab19400523c7510c0/mcs/class/System.Windows.Forms/System.Windows.Forms/NotifyIcon.cs#L38
  8. Примеры для моно NotifyIcon
    https://github.com/mono/winforms/blob/master/notifyicon/swf-notifyicon.cs
    https://github.com/mono/winforms/blob/master/notifyicon/swf-balloon.cs
  9. KeePass использует NotifyIcon:
    http://sourceforge.net/p/keepass/bugs/1212/
  10. Gtk# пример
    http://www.mono-project.com/docs/gui/gtksharp/widgets/notification-icon/
    Gtk.StatusIcon
    http://askubuntu.com/questions/13197
    https://developer.gnome.org/gtk3/stable/GtkStatusIcon.html

Согласно GNOME HIG, есть 2 способа добавить значок на панель:
panels-and-area

а. Апплет панели (они слева от «Ванды-рыбы»)
б. Значок области уведомлений (сама панель уведомлений добавляется на панель как приложение панели)

Mono реализует «значок области уведомлений» поверх спецификации X11 (напрямую, без Gtk#).

mono использует интерфейс XplatUI с методами
SystrayAdd, SystrayRemove, SystrayChange, SystrayBalloon, SendMessage, SetForegroundWindow
https://github.com/mono/mono/blob/ef380e3712af86ef7f8064fab19400523c7510c0/mcs/class/System.Windows.Forms/System.Windows.Forms/XplatUI.cs#L1106-L1128
звонки переадресовываются на участника

 static XplatUIDriver driver;

какой тип??? для среды MATE.

Я не знаю, что выбирает, какой драйвер использовать. Вероятно, это XplatUIX11, который выбран в этой строке:
https://github.com/mono/mono/blob/b7a308f660de8174b64697a422abfc7315d07b8c/mcs/class/System.Windows.Forms/System.Windows.Forms/XplatUI.cs#L112

иконка в трее это окно

Значок в трее — это окно, которое будет встроено в системный лоток.

внутренний класс NotifyIconWindow : Form { ... // строка 57
приватное окно NotifyIconWindow; // строка 45
окно = новое окно NotifyIconWindow (это); // строка 389
XplatUI.SystrayAdd(window.Handle, текст, значок, всплывающая подсказка); // строка 524

Проблема с рисунком:
https://bugzilla.novell.com/show_bug.cgi?id=324237#c13
«На 64-битных машинах значок вообще НЕ отображается в трее».

Проблема с прозрачностью:
http://lists.ximian.com/pipermail/mono-winforms-list/2007-December/003173.html
причина проблемы строка 189
(это неисправленная ошибка с 8-летней историей)
но вложение в сообщении списка рассылки содержит пример кода приложения.
смотрите также
http://standards.freedesktop.org/systemtray-spec/latest/ar01s06.html

Проблема с перерисовкой:
http://mono.1490590.n4.nabble.com/NotifyIcon-and-ContextMenu-redrawing-issues-in-gnome-td1541474.html
https://bugzilla.novell.com/show_bug.cgi?id=324237
https://bugzilla.novell.com/show_bug.cgi?id=MONO81668

_NET_SYSTEM_TRAY_S

Соглашения по выбору менеджеров определены в ICCCM (http://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html#manager_selections).
Системный трей — это X-клиент, которому принадлежит специальный выбор менеджера на данном экране.
Приложение, желающее разместить значок на панели задач, должно сначала найти панель задач.
путем запроса окна владельца выбора менеджера.
Если у выбора менеджера нет владельца, клиенты могут использовать метод, описанный в ICCCM (отслеживание клиентского сообщения MANAGER), чтобы получать уведомления при появлении панели задач.

окно владельца выбора не будет таким же, как любое из видимых пользователю окон, представленных на панели задач (другими словами, выбор менеджера, вероятно, не то же самое окно, которое используется для содержания значков на панели задач), потому что окно владельца выбора должен быть уничтожен, когда выбор менеджера потерян.

системный трей должен получить выбор менеджера с именем _NET_SYSTEM_TRAY_Sn, заменив n на номер экрана, который трей хочет использовать:

  • https://github.com/mono/mono/blob/b7a308f660de8174b64697a422abfc7315d07b8c/mcs/class/System.Windows.Forms/System.Windows.Forms/XplatUIX11.cs#L729

XGrabServer(DisplayHandle); SystrayMgrWindow = XGetSelectionOwner(DisplayHandle, _NET_SYSTEM_TRAY_S); XUngrabServer(DisplayHandle); XFlush(DisplayHandle);

  • https://github.com/mono/mono/blob/b7a308f660de8174b64697a422abfc7315d07b8c/mcs/class/System.Windows.Forms/System.Windows.Forms.X11Internal/X11Display.cs#L345

Xlib.XGrabServer (display); IntPtr SystrayMgrWindow = Xlib.XGetSelectionOwner (display, Atoms._NET_SYSTEM_TRAY_S); Xlib.XUngrabServer (display);

SYSTEM_TRAY_REQUEST_DOCK

формат сообщения описан здесь:
http://standards.freedesktop.org/systemtray-spec/latest/ar01s04.html
Можно ли отправлять сообщения X без использования Xlib и лежащей в его основе библиотеки XCB
т.е. прямо из кода C# в "провод"?

https://github.com/mono/mono/blob/b7a308f660de8174b64697a422abfc7315d07b8c/mcs/class/System.Windows.Forms/System.Windows.Forms/XplatUIX11.cs#L6259

    SendNetClientMessage(SystrayMgrWindow, _NET_SYSTEM_TRAY_OPCODE, IntPtr.Zero, (IntPtr)SystrayRequest.SYSTEM_TRAY_REQUEST_DOCK, hwnd.whole_window);

https://github.com/mono/mono/blob/b7a308f660de8174b64697a422abfc7315d07b8c/mcs/class/System.Windows.Forms/System.Windows.Forms.X11Internal/X11Display.cs#L413-L417

    SendNetClientMessage (SystrayMgrWindow,
        Atoms._NET_SYSTEM_TRAY_OPCODE,
        IntPtr.Zero,
        (IntPtr)SystrayRequest.SYSTEM_TRAY_REQUEST_DOCK,
        hwnd.WholeWindow);

Значок как апплет панели

https://en.wikipedia.org/wiki/D-Bus
D-BUS — это система межпроцессного взаимодействия (IPC), предоставляющая простой, но мощный механизм, позволяющий приложениям взаимодействовать друг с другом, обмениваться информацией и запрашивать услуги.
«D-BUS может стать унифицированным и независимым механизмом IPC, используемым обоими рабочими столами (GNOME и KDE)».
_но, но, но - ICCCM тоже межпроцессный, унифицированный и агностический..._
см. Уровень событий ядра - DBus единая шина, совместно используемая всей системой, позволяет распространять события от ядра до самых верхних приложений в системе.
Такие события, как переполнение диска и пустая очередь печати или даже низкий уровень заряда батареи, могут привести к пузырю в системном стеке, доступном для любого приложения, которое заботится о нем, позволяя системе реагировать и реагировать.

  1. Спецификация D-Bus
    http://dbus.freedesktop.org/doc/dbus-specification.html

  2. Библиотека DBus для C# (не оболочка, чистый C#)
    https://github.com/mono/dbus-sharp

  3. Справочное руководство по библиотеке апплетов Panel
    https://developer.gnome.org/panel-applet/stable/

  4. GnomeGoal — перенести все апплеты Gnome на новый API DBUS (от Bonobo).
    https://wiki.gnome.org/Initiatives/GnomeGoals/AppletsDbusMigration

существуют ли такие вещи, как апплеты панели Ubuntu?

Совместимость Gnome и панели Unity (апплета)
http://ubuntu.itsprite.com/ubuntugnome-vs-unity-panel-applet-compatibility/

Индикаторы приложений
( Аятана , Юнити, Убунту)

Спецификация уведомления о состоянии (SNI, org.freedesktop.StatusNotifierItem)
http://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/
«Он предназначен для замены спецификации системного трея Freedesktop ...
он используется в производстве по крайней мере KDE Plasma и Unity"

  1. Индикаторы панели приложений
    https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators

Справочное руководство по libappindicator
http://developer.ubuntu.com/api/devel/ubuntu-12.04/c/appindicator/

Индикаторы Аятана на панели Gnome:
https://launchpad.net/индикатор-апплет

Для MATE есть панельный апплет:
https://github.com/mate-desktop/mate-indicator-applet
для последовательного отображения информации из различных приложений на панели.

Значок уведомления в Ubuntu с примером Unity и Mono C#:
http://www.arvydas.co.uk/2012/08/notification-icon-in-ubuntu-with-unity-and-mono-c-sharp-example/

Каждый индикатор устанавливает небольшой файл в /usr/share/unity/indicators, который определяет, где его найти на DBus и как он должен отображаться на панели. Процесс индикатора управляется демоном инициализации сеанса.

Спецификация уведомлений на рабочем столе
http://www.galago-project.org/specs/notification/0.9/index.html
" В уведомлении можно размещать изображения, но делать это следует с осторожностью. Размер изображения никогда не должен превышать 200x100, но это следует рассматривать как максимальный размер."

https://wiki.ubuntu.com/MessagingMenu/

Как сделать панель меню прозрачной:
http://www.linuxandlife.com/2012/05/ubuntu-panel-transparent.html

"индикаторы могут содержать только метку или иконку на панели
нет пользовательского рендеринга или других виджетов"
Индикаторы приложений используют фиксированный размер значка 22 пикселя.
https://bugs.launchpad.net/ubuntu/+source/indicator-application/+bug/533439
"Libindicator API не позволяет указать размер иконки и
поэтому по соглашению все размеры значков равны 22 пикселям».

изменить и обновить значок состояния работающего апплета-индикатора
http://www.helptouser.com/ubuntu/11162-is-it-possible-to-alter-and-update-the-status-icon-of-a-running-indicator-applet.html

Виджет в системном трее (Plasma/KDE)

  1. Виджет System Tray отображает системную информацию, уведомления и службы.
    https://userbase.kde.org/Plasma/SystemTray

Элементы xembed жестко запрограммированы на 22×22 пикселя.

Спецификация уведомления о состоянии, класс KStatusNotifierItem
https://github.com/lxde/lxqt/issues/359

04 марта 2014 г., Системный трей в Plasma Next
http://blog.martin-graesslin.com/blog/2014/03/системный трей-в-плазме-следующий/

«мы не хотим тратить время на внедрение устаревшей (xembed) системы для Plasma Next»
«Большинство приложений GTK+ также используют библиотеку appindicator для интеграции с Unity, поэтому они просто работают так, как мы этого хотим»
«Хотя это займет до Qt 5.4, прежде чем эта функция будет работать должным образом».
«Возможно, что есть приложения, которые все еще используют устаревший протокол, и они сломаются».

Панель сообщений оболочки GNOME

https://wiki.gnome.org/Design/OS/MessageTray
«Страницы дизайна панели сообщений устарели и сохраняются только для справочных целей. Актуальные дизайны см. на странице уведомлений»
https://wiki.gnome.org/Design/OS/Уведомления

В репозиториях Ubuntu также есть сторонний «Индикаторный апплет» для Gnome 3:
https://code.launchpad.net/~jconti/индикатор-апплет/gnome3

http://live.gnome.org/GnomeShell/Расширения

GNOME Shell допускает очень ограниченную настройку (по дизайну), и системный трей не является одной из этих областей. На самом деле сам факт его существования предназначен только для поддержки определенных устаревших приложений.

«Значки на панели задач считаются обычным источником отвлечения внимания, от которого разработчики хотят избавиться».

«Если мы собираемся решить проблему должным образом, нам нужно установить новый API и дать приложениям время для переноса на него. В настоящее время мы работаем над планом для этого».

http://worldofgnome.org/shell-new-notifications-goodbye-message-tray/
05.01.2014, «Разработчики GNOME планируют внести существенные изменения в сторону совершенно новой системы уведомлений».

https://blogs.gnome.org/aday/2014/06/18/a-notifications-update/
Fedora 22 (GNOME 3.16) представила эту расширяемую устаревшую панель значков в левом нижнем углу экрана:

устаревшие значки «трея» отображаются в «ящике», который использует автоматическое скрытие в левом нижнем углу экрана.
Примечания к выпуску Gnome 3.16

https://github.com/gnome-design-team/gnome-mockups/tree/master/notifications

IRC-каналы gnome-design или #gnome-shell

https://developer.gnome.org/notification-spec/

WingPanel из Elementary OS

Стильная верхняя панель с индикаторами и панелью запуска приложений.

Элементарная ОС не поддерживает индикаторы аятаны:
https://github.com/dyson/indicator-workspaces/issues/3

Эти новые индикаторы имеют немного больше свободы (вы не ограничены дизайном меню, теперь вы можете иметь в них любой виджет), так что вам может быть на что обратить внимание. ;) Индикаторы Ayatana по-прежнему будут технически поддерживаться

Одним из примеров работы с панелями является приложение Workrave.
у него есть класс для каждого типа панели.
там https://github.com/rcaelers/workrave/tree/7cb9aef971f21c9a473146f9b72693b86a4a76f6/frontend/апплеты
«корица», «общий», «gnome-shell», «gnome2», «gnome3», «индикатор», «mate», «win32», «xfce»

Может кто-нибудь ответить на мои простые вопросы?

1) Можем ли мы теперь создавать иконки в трее с помощью Eto?
2) Какие ОС поддерживаются?
3) Где я могу это прочитать? Может название класса?

Плохие новости, до сих пор нет поддержки, хорошие новости, я собирался реализовать это для Linux и Windows на этих выходных :)

Очень круто! :) Сейчас требуется только слияние?

А МАК ОС?

Не думаю, что нам нужна эмуляция трея в Android :)

Очень круто! :) Сейчас требуется только слияние?

Я еще не начал над этим работать... однако я знаю, что нужно сделать, и я должен был сделать #714 заранее.

А МАК ОС?

Кому-то еще нужно будет реализовать его для MacOS, единственная MacOS, которая у меня есть, — это VirtualBox, который чертовски медленный.

Версия Linux Gtk почти готова :D

indicator

Хорошая работа! :)

Это обычное окно или всплывающее окно с ограниченным содержимым?

Хорошая работа! :)

Это обычное окно или всплывающее окно с ограниченным содержимым?

Именно так контекстное меню выглядит в GNOME с расширением libappindicator: P

Без странных расширений, которые у меня есть в моей системе, это выглядит так:

withoutextension

Именно так контекстное меню выглядит в GNOME с расширением libappindicator: P

Не уверен, что понимаю... Я упомянул, можно ли отображать там какой-либо контент, например изображение, вместо Hello World? Например, в Windows мы не можем этого сделать (только элементы меню с иконками).. чтобы получить это, мы должны реализовать собственное окно и отображать его рядом с иконкой в ​​​​трее или щелчком мыши. Кроме того, нам придется перевести координаты, потому что значок в трее (который, скорее всего, будет использоваться) является частью Windows.Forms, а не WPF.

Опять же ... это просто то, как контекстное меню выглядит в моей системе ... посмотрите на второй скриншот, он показывает то же самое, за исключением того, что часть моей темы отключена.

@hardhub afaik, вы можете поместить пользовательские элементы управления в пункт меню с помощью winforms (и macOS). Я не знаю, будет ли это работать на GTK#.

@cwensley Я просто должен сообщить об одном отрицательном моменте: appindicator не позволяет загружать значки из памяти ... поэтому мне пришлось заставить API Eto для TrayIcon загружать его из фактического пути к файлу ...

@cra0zy ну, это довольно отстойно. Возможно, мы можем записать во временный файл или что-то в этом роде.

@Квенсли ,

Я имею в виду это:
https://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon (v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/system.windows.forms.menuitem (v=vs.110).aspx

Туда можно поместить только текст и иконку...

@cra0zy ну, это довольно отстойно. Возможно, мы можем записать во временный файл или что-то в этом роде.

Это то, что я уже сделал.

@hardhub ах да, он использует MenuItem , а не ToolStripMenuItem .. тьфу. В любом случае, мы можем просто встроить пользовательские функции окна в платформу Windows, чтобы их не нужно было реализовывать вручную, когда вы захотите их использовать.

Вы, ребята, говорите об окне с левым щелчком, как микшер громкости в Windows 7? Я немного смущен...

В любом случае, следующая структура API:
```С#
общественное логическое значение Visible { получить; задавать; }

общедоступная строка Заголовок {получить; задавать; }

открытое событие Активировано { получить; задавать; }

public void SetMenu (меню ContextMenu);

общественная недействительность SetIcon (значок значка);

общественное недействительное шоу();

публичная пустота Скрыть();
```

@ cra0zy , я думаю, что щелчок левой кнопкой мыши открывает пользовательское окно. Я писал про правый клик. По крайней мере, ваш пример с пунктом «Выход» выглядит как контекстное меню.

@cwensley

Мы можем попробовать использовать свойство ContextMenuStrip... но я думаю, что он не сможет добавить ничего пользовательского...
https://msdn.microsoft.com/en-us/library/system.windows.forms.contextmenustrip (v=vs.110).aspx

Я думаю, вы упомянули, что мы можем добавить изображение слева от пункта меню ... да, мы можем ... но я сказал о пользовательском макете всплывающего окна, доступного из системного трея. Я упомянул изображение как пользовательский контент, а не как маленький значок слева от элемента.

Выполнена реализация WinForms:
winforms

Реализация Gtk Mac/Windows выполнена:
2

Реализация Wpf выполнена:
wpf

PR: #731

@cwensley Это можно закрыть.

@cra0zy все еще нужно сделать порт Mac, но это покрыто # 750

Была ли эта страница полезной?
0 / 5 - 0 рейтинги