Eto: Añadir un control de icono de bandeja

Creado en 7 mar. 2015  ·  33Comentarios  ·  Fuente: picoe/Eto

enhancement

Comentario más útil

Implementación de Wpf hecha:
wpf

Todos 33 comentarios

Sí, hay una clase NotifyIcon en .Net Framework, pero no pude usarla correctamente.

"El NotifyIcon común no está visible si está ejecutando un escritorio KDE predeterminado;
requiere un panel de Gnome llamado subprograma de área de notificación"
http://www.codeproject.com/Articles/466805/AmberIndicator-a-systray-app-under-Linux

"En openSUSE, Fedora y Ubuntu, NotifyIcon no se puede utilizar"
https://bugzilla.novell.com/show_bug.cgi?id=590093

"NotifyIcon no aparece en la bandeja del sistema (Probado en OS: Fedora, Arch. DE: MATE, Cinnamon)"
https://bugzilla.xamarin.com/show_bug.cgi?id=14976

Debería haber algo más integrado con DBus.

La idea básica es que la creación de un icono en el área de notificación
es menos molesto que abrir un cuadro de diálogo (el cuadro de diálogo interrumpe el trabajo actual y el usuario puede ignorar el icono durante algún tiempo). Sin embargo, el ícono también es más difícil de notar, por lo que hay una función que permite que los íconos de la bandeja muestren pequeños globos de mensajes (¿el globo puede contener imágenes o secuencias de video de la cámara de la puerta de entrada? ¿o solo muestra cadenas?). En particular, eso significa que el globo debería desaparecer después de un tiempo (pero el administrador de Rigo hace mal: requiere que el usuario cierre su globo manualmente)

También hay _Workspace Switcher Applet_ con el que sería bueno integrarlo a través de DBus. Escenario de uso: programas MDI que deben mostrar diferentes conjuntos de documentos en diferentes espacios de trabajo. Creé otra solicitud de función para espacios de trabajo: https://github.com/picoe/Eto/issues/409

"La bandeja del sistema GNOME puede ser horizontal o vertical"

"La bandeja del sistema coordina los mensajes de globo para garantizar que tengan una apariencia uniforme y para evitar mostrar varios mensajes de globo a la vez... Las bandejas del sistema pueden recibir porciones de mensajes de varios iconos de bandeja a la vez, por lo que son necesarios para volver a ensamblar los mensajes en función del ID de ventana del icono de la bandeja.... Un mensaje de globo es un mensaje de texto corto.... El mensaje puede tener un tiempo de espera, si es así, el mensaje se eliminará después de que expire el tiempo de espera. ...El icono de la bandeja puede desear cancelar un mensaje de globo enviado previamente".

NotifyIcon de mono en el área de notificación

algunas URL:

  1. Directrices de la interfaz humana de GNOME 2.2.3 Integración con el escritorio
    https://developer.gnome.org/hig-book/unstable/desktop-notification-area.html.en
  2. Especificación del protocolo de la bandeja del sistema
    http://standards.freedesktop.org/systemtray-spec/latest/
  3. Manual de convenciones de comunicación entre clientes
    http://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html
  4. Especificación del protocolo XEmbed (protocolo para la incrustación de widgets entre herramientas)
    http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html
  5. Sugerencias extendidas del administrador de ventanas
    http://standards.freedesktop.org/wm-spec/wm-spec-latest.html
  6. Sistema.Windows.Forms.NotifyIcon (MSDN)
    https://msdn.microsoft.com/ru-ru/library/system.windows.forms.notifyicon%28v=vs.110%29.aspx
  7. Implementación de NotifyIcon en mono
    https://github.com/mono/mono/blob/ef380e3712af86ef7f8064fab19400523c7510c0/mcs/class/System.Windows.Forms/System.Windows.Forms/NotifyIcon.cs#L38
  8. Ejemplos de NotifyIcon de mono
    https://github.com/mono/winforms/blob/master/notifyicon/swf-notifyicon.cs
    https://github.com/mono/winforms/blob/master/notifyicon/swf-balloon.cs
  9. KeePass usa NotifyIcon:
    http://sourceforge.net/p/keepass/bugs/1212/
  10. Ejemplo de 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

Según GNOME HIG, hay 2 formas de agregar un ícono al panel:
panels-and-area

un. El subprograma del panel (estos están a la izquierda de "Wanda-the-fish")
B. Ícono del área de notificación (el panel de notificación en sí se agrega al panel como una aplicación del panel)

Mono implementa el "icono del área de notificación" además de la especificación X11 (directamente, sin Gtk#).

mono usa la interfaz XplatUI con métodos
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
las llamadas se reenvían al miembro

 static XplatUIDriver driver;

cual es de tipo??? para ambiente MATE.

No sé qué elige qué controlador usar. Probablemente sea XplatUIX11, que está seleccionado en esta línea:
https://github.com/mono/mono/blob/b7a308f660de8174b64697a422abfc7315d07b8c/mcs/class/System.Windows.Forms/System.Windows.Forms/XplatUI.cs#L112

el icono de la bandeja es una ventana

El icono de la bandeja es una ventana que se integrará en la bandeja del sistema.

clase interna NotifyIconWindow: Formulario {... // línea 57
ventana privada NotifyIconWindow; // linea 45
ventana = new NotifyIconWindow(esto); // linea 389
XplatUI.SystrayAdd(window.Handle, text, icon, out tooltip); // linea 524

Problema con el dibujo:
https://bugzilla.novell.com/show_bug.cgi?id=324237#c13
"En máquinas de 64 bits, el ícono NO aparece en la bandeja".

Problema con la transparencia:
http://lists.ximian.com/pipermail/mono-winforms-list/2007-December/003173.html
la razon del problema es la linea 189
(este es un error sin corregir con 8 años de historia)
pero, el archivo adjunto en el mensaje de la lista de correo contiene un código de aplicación de ejemplo.
ver también
http://standards.freedesktop.org/systemtray-spec/latest/ar01s06.html

Problema con redibujar:
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

Las convenciones para la selección de gerentes se definen en el ICCCM (http://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html#manager_selections).
La bandeja del sistema es un cliente X que posee una selección de administrador especial en una pantalla determinada.
Una aplicación que desee proporcionar un ícono a la bandeja del sistema primero debe ubicar la bandeja del sistema
solicitando la ventana de propietario de la selección del administrador.
Si la selección del administrador no tiene propietario, los clientes pueden usar el método descrito en el ICCCM (buscar un mensaje de cliente del ADMINISTRADOR) para recibir una notificación cuando aparezca una bandeja del sistema.

la ventana del propietario de la selección no será la misma que ninguna de las ventanas visibles para el usuario proporcionadas por la bandeja del sistema (en otras palabras, la selección del administrador probablemente no sea la misma ventana que se usa para contener los íconos de la bandeja del sistema), porque la ventana del propietario de la selección debe ser destruido cuando se pierde la selección del administrador.

la bandeja del sistema debe adquirir una selección de administrador llamada _NET_SYSTEM_TRAY_Sn, reemplazando n con el número de pantalla que la bandeja quiere usar:

  • 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

el formato del mensaje se describe aquí:
http://standards.freedesktop.org/systemtray-spec/latest/ar01s04.html
¿Es posible enviar mensajes X sin usar Xlib y está subyacente a la biblioteca XCB?
es decir, directamente desde el código C # a "cablear"?

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);

Icono como miniaplicación de panel

https://en.wikipedia.org/wiki/D-Bus
D-BUS es un sistema de comunicación entre procesos (IPC), que proporciona un mecanismo simple pero poderoso que permite que las aplicaciones se comuniquen entre sí, comuniquen información y soliciten servicios.
"D-BUS puede convertirse en un mecanismo IPC unificado y agnóstico utilizado por ambos escritorios (GNOME y KDE)"
_pero, pero, pero - ICCCM también es interproceso, unificado y agnóstico..._
consulte La capa de eventos del kernel: DBus, un solo bus compartido por todo el sistema, permite la propagación de eventos, desde el kernel hasta las aplicaciones superiores del sistema.
Eventos como el disco lleno y la cola de la impresora vacía o incluso la batería baja pueden aumentar la pila del sistema, disponible para cualquier aplicación, lo que permite que el sistema responda y reaccione.

  1. La especificación D-Bus
    http://dbus.freedesktop.org/doc/dbus-specification.html

  2. Biblioteca DBus para C# (no un contenedor, C# puro)
    https://github.com/mono/dbus-sharp

  3. Manual de referencia de la biblioteca de subprogramas del panel
    https://developer.gnome.org/panel-applet/estable/

  4. GnomeGoal es portar todos los subprogramas de Gnome a la nueva API DBUS (de Bonobo).
    https://wiki.gnome.org/Initiatives/GnomeGoals/AppletsDbusMigration

¿Existe tal cosa como los applets del panel de Ubuntu?

Compatibilidad con panel de Gnome vs Unity (applet)
http://ubuntu.itsprite.com/ubuntugnome-vs-unity-panel-applet-compatibilidad/

Indicadores de aplicación
( Ayatana , Unidad, Ubuntu)

Especificación del notificador de estado (SNI, org.freedesktop.StatusNotifierItem)
http://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/
"Está destinado a ser un reemplazo de la especificación de la bandeja del sistema Freedesktop...
es utilizado en producción por al menos KDE Plasma y Unity"

  1. Indicadores del panel de aplicaciones
    https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators

Manual de referencia del indicador libapp
http://developer.ubuntu.com/api/devel/ubuntu-12.04/c/appindicator/

Indicadores de Ayatana en el Panel Gnome:
https://launchpad.net/indicator-applet

Hay un subprograma de panel para MATE:
https://github.com/mate-desktop/mate-indicator-applet
para mostrar información de varias aplicaciones consistentemente en el panel.

Ícono de notificación en Ubuntu con Unity y Mono C# ejemplo:
http://www.arvydas.co.uk/2012/08/notification-icon-in-ubuntu-with-unity-and-mono-c-sharp-example/

Cada indicador instala un pequeño archivo en /usr/share/unity/indicators que define dónde encontrarlo en DBus y cómo debe mostrarse en el panel. Los procesos de indicador son administrados por el daemon de inicio de sesión.

Especificación de notificaciones de escritorio
http://www.galago-project.org/specs/notification/0.9/index.html
" Se pueden colocar imágenes en la notificación, pero esto debe hacerse con precaución. La imagen nunca debe exceder los 200x100, pero esto debe considerarse como un tamaño máximo".

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

Cómo hacer que el panel de menú sea transparente:
http://www.linuxandlife.com/2012/05/ubuntu-panel-transparent.html

"los indicadores solo pueden contener una etiqueta o un icono en el panel
sin representación personalizada u otros widgets"
Los indicadores de aplicación utilizan un tamaño de icono fijo de 22 píxeles.
https://bugs.launchpad.net/ubuntu/+source/indicator-application/+bug/533439
"La API de Libindicator no permite especificar el tamaño del icono y
por lo tanto, la convención es que todos los tamaños de íconos sean de 22 px".

modificar y actualizar el icono de estado de un subprograma indicador en ejecución
http://www.helptouser.com/ubuntu/11162-is-it-possible-to-alter-and-update-the-status-icon-of-a-running-indicator-applet.html

El widget de la bandeja del sistema (Plasma/KDE)

  1. El widget de la bandeja del sistema muestra información del sistema, notificaciones y servicios
    https://userbase.kde.org/Plasma/SystemTray

los elementos xembed están codificados a 22 × 22 píxeles

Especificación de notificador de estado, clase KStatusNotifierItem
https://github.com/lxde/lxqt/issues/359

Marzo 2014-03-04, Bandeja del sistema en Plasma Siguiente
http://blog.martin-graesslin.com/blog/2014/03/system-tray-in-plasma-next/

"No queremos invertir el tiempo en implementar el sistema heredado (xembed) para Plasma Next"
"La mayoría de las aplicaciones GTK+ también usan la biblioteca appindicator para la integración de Unity, por lo que funcionan de la manera que queremos".
"Aunque tomará hasta Qt 5.4 hasta que la función funcione correctamente".
"Es posible que haya aplicaciones que aún usen el protocolo heredado y eso se rompa".

Bandeja de mensajes de GNOME Shell

https://wiki.gnome.org/Design/OS/MessageTray
"Las páginas de diseño de la bandeja de mensajes están desactualizadas y se conservan solo con fines de referencia. Para obtener diseños actualizados, consulte la página de notificaciones"
https://wiki.gnome.org/Design/OS/Notificaciones

También hay un "Applet Indicador" de terceros para Gnome 3 en los repositorios de Ubuntu:
https://code.launchpad.net/~jconti/indicator-applet/gnome3

http://live.gnome.org/GnomeShell/Extensiones

GNOME Shell permite una personalización muy limitada (por diseño) y la bandeja del sistema no es una de esas áreas. De hecho, el hecho mismo de que exista es solo para admitir ciertas aplicaciones heredadas.

"Los íconos de la bandeja del sistema se consideran una fuente común de distracción, de la cual los desarrolladores quieren deshacerse".

"Si vamos a abordar el problema correctamente, debemos establecer una nueva API y dar tiempo a las aplicaciones para que se transfieran a ella. Actualmente estamos trabajando en un plan para esto".

http://worldofgnome.org/shell-new-notifications-goodbye-message-tray/
2014-01-05, "Los desarrolladores de GNOME están planeando algunos cambios significativos hacia un sistema de notificaciones completamente nuevo".

https://blogs.gnome.org/aday/2014/06/18/a-notifications-update/
Fedora 22 (GNOME 3.16) introdujo esta barra de íconos heredada expandible en la esquina inferior izquierda de la pantalla:

Los iconos de "bandeja" heredados se muestran en un "cajón" que utiliza la función de ocultación automática en la esquina inferior izquierda de la pantalla.
Notas de la versión de Gnome 3.16

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

Canales IRC gnome-design o #gnome-shell

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

WingPanel de Elementary OS

Elegante panel superior que contiene indicadores y genera un lanzador de aplicaciones

Sistema operativo elemental que desaprueba los indicadores de ayatana:
https://github.com/dyson/indicator-workspaces/issues/3

Estos nuevos indicadores tienen un poco más de libertad (no está limitado a un diseño de menú, puede tener cualquier widget en ellos ahora), por lo que podría ser algo que debe tener en cuenta. ;) Los indicadores de Ayatana seguirán siendo técnicamente compatibles

Un ejemplo de trabajo con paneles es la aplicación Workrave.
tiene una clase para cada tipo de panel.
hay https://github.com/rcaelers/workrave/tree/7cb9aef971f21c9a473146f9b72693b86a4a76f6/frontend/applets son
"canela", "común", "gnome-shell", "gnome2", "gnome3", "indicador", "compañero", "win32", "xfce"

¿Alguien puede responder a mis preguntas simples?

1) ¿Podemos ahora crear iconos de bandeja con Eto?
2) ¿Qué sistemas operativos son compatibles?
3) ¿Dónde puedo leer eso? ¿Quizás el nombre de la clase?

Malas noticias, todavía no hay soporte, buenas noticias, iba a implementar esto para Linux y Windows durante este fin de semana :)

¡Realmente genial! :) ¿Solo se requiere fusionar ahora?

¿Y MAC OS?

No creo que necesitemos emulación de bandeja en Android :)

¡Realmente genial! :) ¿Solo se requiere fusionar ahora?

Todavía no he empezado a trabajar en ello... sin embargo, sé lo que hay que hacer y tuve que hacer el #714 de antemano.

¿Y MAC OS?

Alguien más tendrá que implementarlo para MacOS, el único MacOS que tengo está en un VirtualBox, que es muy lento.

Versión Linux Gtk casi lista :D

indicator

¡Buen trabajo! :)

¿Es una ventana normal o emergente con contenido limitado permitido?

¡Buen trabajo! :)

¿Es una ventana normal o emergente con contenido limitado permitido?

Así es como se ve el menú contextual en GNOME con la extensión libappindicator en: P

Sin las extrañas extensiones que tengo en mi sistema se ve así:

withoutextension

Así es como se ve el menú contextual en GNOME con la extensión libappindicator en: P

No estoy seguro de entender... ¿Mencioné si es posible mostrar algún contenido allí, por ejemplo, una imagen en lugar de Hello World? Por ejemplo, en Windows no podemos hacer eso (solo elementos de menú con íconos). Para obtener eso, debemos implementar una ventana propia y mostrarla cerca del ícono de la bandeja o hacer clic con el mouse. Además, tendremos que traducir las coordenadas porque el ícono de la bandeja (que probablemente se usará) es parte de Windows.Forms, no de WPF.

Una vez más... así es como se ve un menú contextual en mi sistema... mire la segunda captura de pantalla, muestra exactamente lo mismo excepto que parte de mi tema está deshabilitado.

@hardhub afaik, puede poner controles personalizados en un elemento de menú con winforms (y macOS). Sin embargo, no sé si esto funcionaría en GTK#.

@cwensley Solo tengo que informar una cosa negativa sobre esto, appindicator no permite cargar iconos desde la memoria... así que tuve que hacer que la API de Eto para TrayIcon lo cargara desde una ruta de archivo real...

@cra0zy bueno, eso es bastante desagradable. Tal vez podamos escribir en un archivo temporal o algo...

@cwensley ,

Quiero decir esto:
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

Solo puede poner texto e icono allí...

@cra0zy bueno, eso es bastante desagradable. Tal vez podamos escribir en un archivo temporal o algo...

Eso es lo que ya hice.

@hardhub ah cierto, usa MenuItem , no ToolStripMenuItem .. ugh. De cualquier manera, podemos incorporar la funcionalidad de la ventana personalizada en la plataforma de Windows para que no tenga que implementarse manualmente cuando desee usarla.

¿Están hablando de una ventana de clic izquierdo como el mezclador de volumen en Windows 7? Estoy un poco confundido...

De todos modos, la siguiente es la estructura de la API:
```c#
público bool Visible { obtener; colocar; }

public string Título { get; colocar; }

evento público Activado { get; colocar; }

public void SetMenu (menú contextual);

public void SetIcon(Icono de icono);

público vacío Mostrar ();

vacío público Ocultar();
```

@cra0zy , creo que el clic izquierdo abre una ventana personalizada. Escribí sobre el clic derecho. Al menos su ejemplo con el elemento "Salir" parece un menú contextual.

@cwensley

Podemos intentar usar la propiedad ContextMenuStrip... pero creo que no podrá agregar nada personalizado...
https://msdn.microsoft.com/en-us/library/system.windows.forms.contextmenustrip (v=vs.110).aspx

Creo que mencionó que podemos agregar una imagen a la izquierda del elemento del menú... sí, podemos... pero dije sobre el diseño personalizado de la ventana emergente disponible en la bandeja del sistema. Mencioné la imagen como contenido personalizado, no como un ícono pequeño a la izquierda del elemento.

Implementación de WinForms hecha:
winforms

Implementación de Gtk Mac/Windows hecha:
2

Implementación de Wpf hecha:
wpf

Relaciones públicas arriba: #731

@cwensley Esto se puede cerrar.

@cra0zy todavía necesita hacer el puerto de Mac, pero eso está cubierto con el #750

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

Krakean picture Krakean  ·  6Comentarios

ArsenShnurkov picture ArsenShnurkov  ·  17Comentarios

Serg-Norseman picture Serg-Norseman  ·  5Comentarios

Xisrith picture Xisrith  ·  5Comentarios

TomQv picture TomQv  ·  6Comentarios