Eto: Ajouter un contrôle d'icône de plateau

Créé le 7 mars 2015  ·  33Commentaires  ·  Source: picoe/Eto

enhancement

Commentaire le plus utile

Implémentation Wpf terminée :
wpf

Tous les 33 commentaires

Oui, il existe une classe NotifyIcon dans le framework .Net, mais je n'ai pas pu l'utiliser correctement.

"Le NotifyIcon commun n'est pas visible si vous exécutez un bureau KDE par défaut ;
il nécessite un panneau Gnome appelé Notification Area Applet"
http://www.codeproject.com/Articles/466805/AmberIndicator-a-systray-app-under-Linux

"Sur openSUSE, Fedora et Ubuntu, NotifyIcon n'est pas utilisable"
https://bugzilla.novell.com/show_bug.cgi?id=590093

"NotifyIcon ne s'affiche pas dans la barre d'état système (Testé sur le système d'exploitation : Fedora, Arch. DE : MATE, Cinnamon)"
https://bugzilla.xamarin.com/show_bug.cgi?id=14976

Il devrait y avoir quelque chose de plus intégré avec DBus.

L'idée de base est que la création d'une icône dans la zone de notification
est moins ennuyeux que d'ouvrir une boîte de dialogue (la boîte de dialogue interrompt le travail en cours et l'icône peut être ignorée par l'utilisateur pendant un certain temps). Cependant, l'icône est également plus difficile à remarquer, il existe donc une fonctionnalité permettant aux icônes de la barre d'état de faire apparaître de petites bulles de message (la bulle peut-elle contenir des images ou des flux vidéo de la caméra de la porte d'entrée ? Ou n'afficher que des chaînes ?). En particulier, cela signifie que le ballon devrait disparaître après un certain temps (mais le gestionnaire Rigo se trompe - il oblige l'utilisateur à fermer son ballon manuellement)

Il existe également _Workspace Switcher Applet_ qui serait agréable à intégrer via DBus. Scénario d'utilisation - Programmes MDI qui doivent afficher différents ensembles de documents sur différents espaces de travail. J'ai créé une autre demande de fonctionnalité pour les espaces de travail - https://github.com/picoe/Eto/issues/409

"La barre d'état système de GNOME peut être horizontale ou verticale"

"La barre d'état système coordonne les messages de bulle pour s'assurer qu'ils ont une apparence cohérente et pour éviter d'afficher plusieurs messages de bulle à la fois. ... Les plateaux système peuvent recevoir des portions de messages de plusieurs icônes de plateau à la fois, ils sont donc nécessaires pour réassembler les messages en fonction de l'ID de fenêtre de l'icône de la barre d'état système.... Un message bulle est un message texte court. ... Le message peut avoir un délai d'attente ; si c'est le cas, le message sera supprimé après l'expiration du délai d'attente. ... L'icône de la barre d'état peut souhaiter annuler un message ballon envoyé précédemment."

NotifyIcon de mono dans la zone de notification

quelques URL :

  1. Directives d'interface utilisateur GNOME 2.2.3 Intégration au bureau
    https://developer.gnome.org/hig-book/unstable/desktop-notification-area.html.en
  2. Spécification du protocole de la barre d'état système
    http://standards.freedesktop.org/systemtray-spec/latest/
  3. Manuel des conventions de communication inter-clients
    http://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html
  4. XEmbed Protocol Specification (protocole pour l'intégration de widgets cross-toolkit)
    http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html
  5. Conseils étendus du gestionnaire de fenêtres
    http://standards.freedesktop.org/wm-spec/wm-spec-latest.html
  6. System.Windows.Forms.NotifyIcon (MSDN)
    https://msdn.microsoft.com/ru-ru/library/system.windows.forms.notifyicon%28v=vs.110%29.aspx
  7. Implémentation de NotifyIcon en mono
    https://github.com/mono/mono/blob/ef380e3712af86ef7f8064fab19400523c7510c0/mcs/class/System.Windows.Forms/System.Windows.Forms/NotifyIcon.cs#L38
  8. Exemples pour 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 utilise NotifyIcon :
    http://sourceforge.net/p/keepass/bugs/1212/
  10. Exemple Gtk#
    http://www.mono-project.com/docs/gui/gtksharp/widgets/notification-icon/
    Gtk.StatusIconGtk.StatusIcon
    http://askubuntu.com/questions/13197
    https://developer.gnome.org/gtk3/stable/GtkStatusIcon.html

Selon GNOME HIG, il existe 2 façons d'ajouter une icône au panneau :
panels-and-area

une. L'applet du panneau (ceux-ci sont à gauche de "Wanda-the-fish")
b. Icône de la zone de notification (le panneau de notification lui-même est ajouté au panneau en tant qu'appet de panneau)

Mono implémente "l'icône de la zone de notification" en plus de la spécification X11 (directement, sans Gtk#).

mono utilise l'interface XplatUI avec des méthodes
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
les appels sont transférés au membre

 static XplatUIDriver driver;

qui est de type ??? pour l'environnement MATE.

Je ne sais pas ce qui choisit quel pilote utiliser. C'est probablement XplatUIX11 qui est sélectionné dans cette ligne :
https://github.com/mono/mono/blob/b7a308f660de8174b64697a422abfc7315d07b8c/mcs/class/System.Windows.Forms/System.Windows.Forms/XplatUI.cs#L112

l'icône de la barre d'état est une fenêtre

L'icône de la barre d'état est une fenêtre à intégrer dans la barre d'état système.

classe interne NotifyIconWindow : Form { ... // ligne 57
fenêtre NotifyIconWindow privée ; // ligne 45
window = new NotifyIconWindow(this); // ligne 389
XplatUI.SystrayAdd(window.Handle, text, icon, out tooltip); // ligne 524

Problème de dessin :
https://bugzilla.novell.com/show_bug.cgi?id=324237#c13
"Sur les machines 64 bits, l'icône n'apparaît PAS du tout dans la barre d'état système."

Problème de transparence :
http://lists.ximian.com/pipermail/mono-winforms-list/2007-December/003173.html
la raison du problème est la ligne 189
(c'est un bogue non corrigé avec 8 ans d'historique)
mais, la pièce jointe dans le message de la liste de diffusion contient un exemple de code d'application.
voir également
http://standards.freedesktop.org/systemtray-spec/latest/ar01s06.html

Problème de redessin :
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

Les conventions de sélection des managers sont définies dans l'ICCCM ( http://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html#manager_selections ).
La barre d'état système est un client X qui possède une sélection de gestionnaire spéciale sur un écran donné.
Une application souhaitant fournir une icône à la barre d'état système doit d'abord localiser la barre d'état système
en demandant la fenêtre propriétaire de la sélection du manager.
Si la sélection du gestionnaire n'a pas de propriétaire, les clients peuvent utiliser la méthode décrite dans l'ICCCM (surveiller un message client du GESTIONNAIRE) pour être avertis lorsqu'une barre d'état système apparaît.

la fenêtre du propriétaire de la sélection ne sera pas la même que toutes les fenêtres visibles par l'utilisateur fournies par la barre d'état système (en d'autres termes - la sélection du responsable n'est probablement pas la même fenêtre que celle utilisée pour contenir les icônes de la barre d'état système), car la fenêtre du propriétaire de la sélection doit être détruit lorsque la sélection du manager est perdue.

la barre d'état système doit acquérir une sélection de gestionnaire appelée _NET_SYSTEM_TRAY_Sn, en remplaçant n par le numéro d'écran que la barre d'état souhaite utiliser :

  • 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

le format du message est décrit ici :
http://standards.freedesktop.org/systemtray-spec/latest/ar01s04.html
Est-il possible d'envoyer des messages X sans utiliser Xlib et sa bibliothèque XCB sous-jacente
c'est-à-dire directement du code C# au "wire" ?

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

Icône en tant qu'applet de panneau

https://en.wikipedia.org/wiki/D-Bus
D-BUS est un système de communication interprocessus (IPC), fournissant un mécanisme simple mais puissant permettant aux applications de se parler, de communiquer des informations et de demander des services.
"D-BUS peut devenir un mécanisme IPC unifié et agnostique utilisé par les deux bureaux (GNOME et KDE)"
_mais, mais, mais - ICCCM est aussi interprocessus, unifié et agnostique..._
voir La couche d'événements du noyau - DBus un seul bus partagé par l'ensemble du système permet la propagation des événements, du noyau aux applications les plus élevées du système.
Des événements tels que le disque plein et la file d'attente de l'imprimante vide ou même la batterie faible peuvent remonter dans la pile du système, disponible pour n'importe quelle application, permettant au système de répondre et de réagir.

  1. La spécification D-Bus
    http://dbus.freedesktop.org/doc/dbus-specification.html

  2. Bibliothèque DBus pour C# (pas un wrapper, pur C#)
    https://github.com/mono/dbus-sharp

  3. Manuel de référence de la bibliothèque d'applet de panneau
    https://developer.gnome.org/panel-applet/stable/

  4. GnomeGoal doit porter toutes les applets Gnome sur la nouvelle API DBUS (de Bonobo).
    https://wiki.gnome.org/Initiatives/GnomeGoals/AppletsDbusMigration

existe-t-il des applets de panneau Ubuntu?

Compatibilité Gnome vs Unity-panel (applet)
http://ubuntu.itsprite.com/ubuntugnome-vs-unity-panel-applet-compatibility/

Indicateurs d'application
( Ayatana , Unité, Ubuntu)

Spécification du notificateur d'état (SNI, org.freedesktop.StatusNotifierItem)
http://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/
"Il est destiné à remplacer la spécification de la barre d'état système Freedesktop ...
il est utilisé en production par au moins KDE Plasma et Unity"

  1. Indicateurs du panneau d'application
    https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators

Manuel de référence de libappindicator
http://developer.ubuntu.com/api/devel/ubuntu-12.04/c/appindicator/

Indicateurs Ayatana dans le panneau Gnome :
https://launchpad.net/indicator-applet

Il existe une applet de panneau pour MATE :
https://github.com/mate-desktop/mate-indicator-applet
pour afficher les informations de diverses applications de manière cohérente dans le panneau.

Icône de notification dans Ubuntu avec exemple Unity et Mono C# :
http://www.arvydas.co.uk/2012/08/notification-icon-in-ubuntu-with-unity-and-mono-c-sharp-example/

Chaque indicateur installe un petit fichier dans /usr/share/unity/indicators qui définit où le trouver sur DBus et comment il doit être affiché dans le panneau. Les processus d'indicateur sont gérés par le démon d'initialisation de session.

Spécification des notifications de bureau
http://www.galago-project.org/specs/notification/0.9/index.html
" Des images peuvent être placées dans la notification, mais cela doit être fait avec prudence. L'image ne doit jamais dépasser 200x100, mais cela doit être considéré comme une taille maximale."

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

Comment rendre le panneau de menu transparent :
http://www.linuxandlife.com/2012/05/ubuntu-panel-transparent.html

"les indicateurs ne peuvent contenir qu'une étiquette ou une icône dans le panneau
pas de rendu personnalisé ou d'autres widgets"
Les indicateurs d'application utilisent une taille d'icône fixe de 22 pixels.
https://bugs.launchpad.net/ubuntu/+source/indicator-application/+bug/533439
"L'API Libindicator ne permet pas de spécifier la taille de l'icône et
par conséquent, la convention est que toutes les tailles d'icônes sont de 22px."

modifier et mettre à jour l'icône d'état d'une applet d'indicateur en cours d'exécution
http://www.helptouser.com/ubuntu/11162-is-it-possible-to-alter-and-update-the-status-icon-of-a-running-indicator-applet.html

Le widget de la barre d'état système (Plasma/KDE)

  1. Le widget System Tray affiche les informations système, les notifications et les services
    https://userbase.kde.org/Plasma/SystemTray

les éléments xembed sont codés en dur à 22 × 22 pixels

Spécification du notificateur d'état, classe KStatusNotifierItem
https://github.com/lxde/lxqt/issues/359

Mars 2014-03-04, Barre d'état système dans Plasma Suivant
http://blog.martin-graesslin.com/blog/2014/03/system-tray-in-plasma-next/

"nous ne voulons pas investir du temps dans la mise en œuvre du système hérité (xembed) pour Plasma Next"
"la plupart des applications GTK + utilisent également la bibliothèque appindicator pour l'intégration de l'unité, elles fonctionnent donc comme nous le voulons"
"Bien que cela prendra jusqu'à Qt 5.4 jusqu'à ce que la fonctionnalité fonctionne correctement."
"il est possible qu'il y ait des applications qui utilisent encore le protocole hérité et qui vont casser."

Barre de messages du shell GNOME

https://wiki.gnome.org/Design/OS/MessageTray
"Les pages de conception de la barre des messages sont obsolètes et sont conservées à des fins de référence uniquement. Pour les conceptions à jour, consultez la page des notifications"
https://wiki.gnome.org/Design/OS/Notifications

Il existe également une "applet d'indicateur" tierce pour Gnome 3 dans les référentiels d'Ubuntu :
https://code.launchpad.net/~jconti/indicator-applet/gnome3

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

GNOME Shell permet une personnalisation très limitée (de par sa conception) et la barre d'état système ne fait pas partie de ces zones. En fait, le fait même qu'il existe ne sert qu'à prendre en charge certaines applications héritées.

"Les icônes Systray sont considérées comme une source courante de distraction, dont les développeurs veulent se débarrasser."

"Si nous voulons traiter le problème correctement, nous devons établir une nouvelle API et donner aux applications le temps de s'y adapter. Nous travaillons actuellement sur un plan pour cela."

http://worldofgnome.org/shell-new-notifications-goodbye-message-tray/
05/01/2014, "Les développeurs de GNOME prévoient des changements importants vers un tout nouveau système de notifications."

https://blogs.gnome.org/aday/2014/06/18/a-notifications-update/
Fedora 22 (GNOME 3.16) a introduit cette barre d'icônes héritée extensible dans le coin inférieur gauche de l'écran :

les anciennes icônes de "bac" sont affichées dans un "tiroir" qui utilise le masquage automatique dans le coin inférieur gauche de l'écran.
Notes de version de Gnome 3.16

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

canaux IRC gnome-design ou #gnome-shell

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

WingPanel du système d'exploitation élémentaire

Panneau supérieur élégant qui contient des indicateurs et génère un lanceur d'applications

OS élémentaire dépréciant les indicateurs d'ayatana :
https://github.com/dyson/indicator-workspaces/issues/3

Ces nouveaux indicateurs ont un peu plus de liberté (vous n'êtes pas confiné à une conception de menu, vous pouvez maintenant y avoir n'importe quel widget), donc cela pourrait être quelque chose à surveiller. ;) Les indicateurs Ayatana seront toujours supportés techniquement

Un exemple de travail avec des panneaux est l'application Workrave.
il a une classe pour chaque type de panneau.
https://github.com/rcaelers/workrave/tree/7cb9aef971f21c9a473146f9b72693b86a4a76f6/frontend/applets sont
"cannelle", "commun", "gnome-shell", "gnome2", "gnome3", "indicateur", "mate", "win32", "xfce"

Quelqu'un peut-il répondre à mes questions simples?

1) Pouvons-nous maintenant créer des icônes de plateau avec Eto ?
2) Quels systèmes d'exploitation sont pris en charge ?
3) Où puis-je lire ça ? Peut-être le nom de la classe ?

Mauvaise nouvelle, toujours pas de support, bonne nouvelle, j'allais l'implémenter pour Linux et Windows ce week-end :)

Vraiment cool! :) Seule la fusion est-elle requise maintenant ?

Et MAC OS ?

Je ne pense pas que nous ayons besoin d'émulation de plateau dans Android :)

Vraiment cool! :) Seule la fusion est-elle requise maintenant ?

Je n'ai toujours pas commencé à travailler dessus... mais je sais ce qu'il faut faire et j'ai dû faire le #714 avant.

Et MAC OS ?

Quelqu'un d'autre devra l'implémenter pour MacOS, le seul MacOS que j'ai est sur une VirtualBox, ce qui est lent comme l'enfer.

La version Linux Gtk est presque terminée :D

indicator

Bon travail! :)

S'agit-il d'une fenêtre normale ou d'une fenêtre contextuelle avec un contenu limité autorisé ?

Bon travail! :)

S'agit-il d'une fenêtre normale ou d'une fenêtre contextuelle avec un contenu limité autorisé ?

C'est à quoi ressemble le menu contextuel sur GNOME avec l'extension libappindicator sur :P

Sans les extensions bizarres que j'ai sur mon système, cela ressemble à:

withoutextension

C'est à quoi ressemble le menu contextuel sur GNOME avec l'extension libappindicator sur :P

Je ne suis pas sûr de comprendre... J'ai mentionné s'il est possible d'y afficher du contenu, par exemple une image au lieu de Hello World ? Par exemple, sous Windows, nous ne pouvons pas faire cela (uniquement les éléments de menu avec des icônes) .. pour obtenir cela, nous devons implémenter notre propre fenêtre et l'afficher près de l'icône de la barre d'état ou du clic de la souris. De plus, nous devrons traduire les coordonnées car l'icône de la barre d'état (qui sera très probablement utilisée) fait partie de Windows.Forms et non de WPF.

Encore une fois ... c'est juste à quoi ressemble un menu contextuel sur mon système ... regardez la deuxième capture d'écran, elle montre exactement la même chose, sauf qu'une partie de mon thème est désactivée.

@hardhub autant que je sache, vous pouvez mettre des contrôles personnalisés dans un élément de menu avec winforms (et macOS). Je ne sais pas si cela fonctionnerait sur GTK # cependant.

@cwensley Je dois juste signaler une chose négative à ce sujet, appindicator n'autorise pas le chargement d'icônes depuis la mémoire ... j'ai donc dû faire en sorte que l'API d'Eto pour TrayIcon le charge à partir d'un chemin de fichier réel ...

@cra0zy bien c'est assez nul. Peut-être que nous pouvons écrire dans un fichier temporaire ou quelque chose..

@cwensley ,

Je veux dire ceci :
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

Vous ne pouvez y mettre que du texte et des icônes...

@cra0zy bien c'est assez nul. Peut-être que nous pouvons écrire dans un fichier temporaire ou quelque chose..

C'est ce que j'ai déjà fait.

@hardhub ah oui, il utilise MenuItem , pas ToolStripMenuItem .. ugh. Dans tous les cas, nous pouvons simplement intégrer la fonctionnalité de fenêtre personnalisée dans la plate-forme Windows afin qu'elle n'ait pas à être implémentée manuellement lorsque vous souhaitez l'utiliser.

Parlez-vous d'une fenêtre de clic gauche comme le mélangeur de volume dans Windows 7 ? Je suis un peu confus...

Quoi qu'il en soit, voici la structure de l'API :
```c#
public bool Visible { obtenir ; ensemble; }

public string Titre { obtenir ; ensemble; }

événement public Activé { get; ensemble; }

public void SetMenu (menu ContextMenu);

public void SetIcon(Icône icône);

public void Show();

public void Hide();
```

@ cra0zy , je pense que le clic gauche ouvre une fenêtre personnalisée. J'ai écrit sur le clic droit. Au moins, votre exemple avec l'élément "Quitter" ressemble à un menu contextuel.

@cwensley

Nous pouvons essayer d'utiliser la propriété ContextMenuStrip... mais je pense qu'elle ne pourra rien ajouter de personnalisé...
https://msdn.microsoft.com/en-us/library/system.windows.forms.contextmenustrip (v=vs.110).aspx

Je pense que vous avez mentionné que nous pouvons ajouter une image à gauche de l'élément de menu... oui, nous le pouvons... mais j'ai parlé de la disposition personnalisée de la fenêtre contextuelle disponible dans la barre d'état système. J'ai mentionné l'image comme contenu personnalisé et non comme une petite icône à gauche de l'élément.

Implémentation de WinForms terminée :
winforms

Implémentation Gtk Mac/Windows terminée :
2

Implémentation Wpf terminée :
wpf

RP en hausse : # 731

@cwensley Cela peut être fermé.

@ cra0zy a encore besoin de faire le port Mac mais c'est couvert avec # 750

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

canton7 picture canton7  ·  22Commentaires

Sanae6 picture Sanae6  ·  4Commentaires

Serg-Norseman picture Serg-Norseman  ·  5Commentaires

Krakean picture Krakean  ·  6Commentaires

voronoipotato picture voronoipotato  ·  16Commentaires