Eto: トレイアイコンコントロールを追加する

作成日 2015年03月07日  ·  33コメント  ·  ソース: picoe/Eto

enhancement

最も参考になるコメント

完了したWpfの実装:
wpf

全てのコメント33件

はい、.Net FrameworkにはNotifyIconクラスがありますが、正しく使用できませんでした。

「デフォルトのKDEデスクトップを実行している場合、一般的なNotifyIconは表示されません。
通知領域アプレットと呼ばれる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がシステムトレイに表示されない(OSでテスト済み:Fedora、Arch。DE:MATE、Cinnamon)」
https://bugzilla.xamarin.com/show_bug.cgi?id=14976

DBusともっと統合された何かがあるはずです。

基本的な考え方は、通知領域にアイコンを作成することです
ダイアログをポップアップするよりも煩わしくないです(ダイアログは現在の作業を中断し、アイコンはしばらくの間ユーザーによって無視される可能性があります)。 ただし、アイコンも気づきにくいため、トレイアイコンで小さなメッセージバルーンをポップアップできる機能があります(バルーンには玄関のカメラからの画像やビデオストリームを含めることができますか?それとも文字列のみを表示できますか?)。 特に、それはバルーンがしばらくすると消えるはずであることを意味します(しかし、Rigoマネージャーは間違っています-ユーザーがバルーンを手動で閉じる必要があります)

DBusを介して統合すると便利な_WorkspaceSwitcherApplet_もあります。 使用シナリオ-さまざまなワークスペースにさまざまなドキュメントのセットを表示する必要があるMDIプログラム。 ワークスペース用に別の機能リクエストを作成しました-https://github.com/picoe/Eto/issues/409

「GNOMEシステムトレイは水平または垂直にすることができます」

「システムトレイは、バルーンメッセージを調整して、一貫したルックアンドフィールを確保し、一度に複数のバルーンメッセージが表示されないようにします。...システムトレイは、複数のトレイアイコンからメッセージの一部を一度に受信する可能性があるため、必須です。トレイアイコンのウィンドウIDに基づいてメッセージを再構成します...バルーンメッセージは短いテキストメッセージです...メッセージにはタイムアウトがある場合があります。その場合、タイムアウトの期限が切れるとメッセージは削除されます。 ...トレイアイコンは、以前に送信されたバルーンメッセージをキャンセルしたい場合があります。」

通知領域での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. System.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

a。 パネルアプレット(これらは「Wanda-the-fish」の左側にあります)
b。 通知領域アイコン(通知パネル自体がパネルアペとしてパネルに追加されます)

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行目
window = new NotifyIconWindow(this); // 389行
XplatUI.SystrayAdd(window.Handle、text、icon、outツールチップ); // 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
Xlibとその下にあるXCBライブラリを使用せずにXメッセージを送信することは可能ですか?
つまり、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は、両方のデスクトップ(GNOMEとKDE)で使用される統一された不可知論的なIPCメカニズムになる可能性があります。」
_しかし、しかし-ICCCMもプロセス間であり、統一されており、不可知論者です..._
カーネルイベントレイヤーを参照してください-DBusシステム全体で共有される単一のバスにより、カーネルからシステムの最上位のアプリケーションへのイベントの伝播が可能になります。
ディスクがいっぱいになったり、プリンタキューが空になったり、バッテリの電力が低下したりするなどのイベントによって、システムスタックがバブルアップし、アプリケーションが気にするものなら何でも利用できるようになり、システムが応答して反応できるようになります。

  1. D-Bus仕様
    http://dbus.freedesktop.org/doc/dbus-specification.html

  2. C#用のDBusライブラリ(ラッパーではなく、純粋なC#)
    https://github.com/mono/dbus-sharp

  3. パネルアプレットライブラリリファレンスマニュアル
    https://developer.gnome.org/panel-applet/stable/

  4. GnomeGoalは、すべてのGnomeアプレットを(Bonoboからの)新しいDBUSAPIに移植することです。
    https://wiki.gnome.org/Initiatives/GnomeGoals/AppletsDbusMigration

Ubuntuパネルアプレットのようなものはありますか?

Gnome-とUnity-パネル(アプレット)の互換性
http://ubuntu.itsprite.com/ubuntugnome-vs-unity-panel-applet-compatibility/

アプリケーションインジケーター
Ayatana 、Unity、Ubuntu)

ステータス通知機能の仕様(SNI、org.freedesktop.StatusNotifierItem)
http://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/
「これは、FreedesktopSystemトレイ仕様の代替となることを目的としています...
少なくともKDEPlasmaとUnityによる本番環境で使用されています。」

  1. アプリケーションパネルインジケーター
    https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators

libappindicatorリファレンスマニュアル
http://developer.ubuntu.com/api/devel/ubuntu-12.04/c/appindicator/

GnomeパネルのAyatanaインジケーター:
https://launchpad.net/indicator-applet

MATE用のパネルアプレットがあります。
https://github.com/mate-desktop/mate-indicator-applet
パネルにさまざまなアプリケーションからの情報を一貫して表示します。

UnityとMonoC#の例を使用したUbuntuの通知アイコン:
http://www.arvydas.co.uk/2012/08/notification-icon-in-ubuntu-with-unity-and-mono-c-sharp-example/

各インジケーターは、/ usr / share / unity /インジケーターに小さなファイルをインストールします。このファイルは、DBusのどこにあるか、パネルにどのように表示されるかを定義します。 インジケータープロセスは、セッションinitデーモンによって管理されます。

デスクトップ通知仕様
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
「LibindicatorAPIでは、アイコンのサイズと
したがって、慣例では、すべてのアイコンサイズは22pxです。」

実行中のインジケータアプレットのステータスアイコンを変更および更新します
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. システムトレイウィジェットは、システム情報、通知、およびサービスを表示します
    https://userbase.kde.org/Plasma/SystemTray

xembedアイテムは22×22ピクセルにハードコードされています

ステータス通知機能の仕様、KStatusNotifierItemクラス
https://github.com/lxde/lxqt/issues/359

2014年3月-03-04、プラズマ次のシステムトレイ
http://blog.martin-graesslin.com/blog/2014/03/system-tray-in-plasma-next/

「PlasmaNextのレガシー(xembed)システムの実装に時間を費やしたくありません」
「ほとんどのGTK +アプリケーションは、Unity統合のためにappindicatorライブラリも使用しているため、希望どおりに機能します。」
「機能が正しく機能するようになるまで、Qt5.4までかかりますが。」
「レガシープロトコルをまだ使用しているアプリケーションがあり、それが機能しなくなる可能性があります。」

GNOMEシェルメッセージトレイ

https://wiki.gnome.org/Design/OS/MessageTray
「メッセージトレイのデザインページは古く、参照目的でのみ保持されています。最新のデザインについては、通知ページを参照してください。」
https://wiki.gnome.org/Design/OS/Notifications

Ubuntuのリポジトリには、Gnome3用のサードパーティの「IndicatorApplet」もあります。
https://code.launchpad.net/~jconti/indicator-applet/gnome3

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

GNOME Shellは(設計上)非常に限定されたカスタマイズを可能にし、システムトレイはそれらの領域の1つではありません。 実際、それが存在するという事実は、特定のレガシーアプリケーションをサポートするためだけのものです。

「システムトレイアイコンは、開発者が取り除きたいと思う一般的な注意散漫の原因と見なされています。」

「問題に適切に対処する場合は、新しいAPIを確立し、アプリケーションに移植する時間を与える必要があります。現在、この計画に取り組んでいます。」

http://worldofgnome.org/shell-new-notifications-goodbye-message-tray/
2014-01-05、「GNOME開発者は、完全に新しい通知システムに向けていくつかの重要な変更を計画しています。」

https://blogs.gnome.org/aday/2014/06/18/a-notifications-update/
Fedora 22(GNOME 3.16)は、画面の左下隅にこの拡張可能なレガシーアイコンバーを導入しました。

従来の「トレイ」アイコンは、画面の左下隅にある自動非表示を使用する「引き出し」に表示されます。
Gnome3.16リリースノート

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

gnome-designまたは#gnome-shellIRCチャネル

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

ElementaryOSのWingPanel

インジケーターを保持し、アプリケーションランチャーを生成するスタイリッシュなトップパネル

ayatanaインジケーターを廃止するエレメンタリーOS:
https://github.com/dyson/indicator-workspaces/issues/3

これらの新しいインジケーターには、かなり自由度があります(メニューデザインに限定されず、ウィジェットを含めることができます)。そのため、注意が必要な場合があります。 ;)アヤタナインジケーターは引き続き技術的にサポートされます

パネルを操作する1つの例は、Workraveアプリケーションです。
パネルの種類ごとにクラスがあります。
そこにhttps://github.com/rcaelers/workrave/tree/7cb9aef971f21c9a473146f9b72693b86a4a76f6/frontend/appletsがあります
「シナモン」、「共通」、「gnome-shell」、「gnome2」、「gnome3」、「indicator」、「mate」、「win32」、「xfce」

誰かが私の簡単な質問に答えることができますか?

1)Etoでトレイアイコンを作成できますか?
2)どのOSがサポートされていますか?
3)どこで読むことができますか? たぶんクラス名?

悪いニュース、まだサポートがない、良いニュース、私は今週末にLinuxとWindowsにこれを実装するつもりでした:)

すごくかっこいい! :)今はマージだけが必要ですか?

そしてMACOS?

Androidではトレイエミュレーションは必要ないと思います:)

すごくかっこいい! :)今はマージだけが必要ですか?

私はまだそれに取り組んでいません...しかし、私は何をする必要があるかを知っています、そして私は前もって#714をしなければなりませんでした。

そしてMACOS?

他の誰かがMacOS用にそれを実装する必要があります。私が持っている唯一のMacOSはVirtualBox上にあります。これは地獄のように遅いです。

Linux Gtkバージョンはほぼ完成しました:D

indicator

よくできました! :)

コンテンツが制限された通常のウィンドウまたはポップアップが許可されていますか?

よくできました! :)

コンテンツが制限された通常のウィンドウまたはポップアップが許可されていますか?

これが、:Pにlibappindicator拡張子が付いたGNOMEのコンテキストメニューの外観です。

私のシステムにある奇妙な拡張機能がないと、次のようになります。

withoutextension

これが、:Pにlibappindicator拡張子が付いたGNOMEのコンテキストメニューの外観です。

わかりません... Hello Worldの代わりに画像などのコンテンツを表示できるかどうかを説明しましたか? たとえば、Windowsではそれを行うことはできません(アイコン付きのメニュー項目のみ)。これを取得するには、独自のウィンドウを実装し、トレイアイコンまたはマウスクリックの近くに表示する必要があります。 さらに、トレイアイコン(おそらく使用される)はWindows.Formsの一部であり、WPFではないため、座標を変換する必要があります。

繰り返しますが...これは私のシステムでコンテキストメニューがどのように表示されるかです... 2番目のスクリーンショットを見てください。テーマの一部が無効になっていることを除いて、まったく同じものが表示されています。

@hardhub afaik、winforms(およびmacOS)を使用してメニュー項目にカスタムコントロールを配置できます。 しかし、これがGTK#で機能するかどうかはわかりません。

@cwensley私はこれについて1つの否定的なことを報告する必要があります、appindicatorはメモリからアイコンをロードすることを許可しません...それで私はTrayIcon用のEtoのAPIに実際のファイルパスからそれをロードさせる必要がありました...

@ cra0zyまあそれはかなり厄介です。 おそらく、一時ファイルなどに書き込むことができます。

@cwensley

私はこれを意味します:
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ああ、それは$#$ 1 $#$ではなくToolStripMenuItem MenuItemを使用します。 いずれにせよ、カスタムウィンドウ機能をWindowsプラットフォームに組み込むだけなので、使用するときに手動で実装する必要はありません。

ボリュームミキサーがWindows7にあったように、左クリックウィンドウについて話しているのですか? 私は少し混乱しています...

とにかく、以下はAPIの構造です。
`` `c#
public bool Visible {get; セットする; }

public string Title {get; セットする; }

公開イベントActivated {get; セットする; }

public void SetMenu(ContextMenu menu);

public void SetIcon(アイコンアイコン);

public void Show();

public void Hide();
`` `

@ 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 評価