Eto: Tambahkan kontrol ikon baki

Dibuat pada 7 Mar 2015  ·  33Komentar  ·  Sumber: picoe/Eto

enhancement

Komentar yang paling membantu

Implementasi Wpf selesai:
wpf

Semua 33 komentar

Ya, ada kelas NotifyIcon di .Net framework, tetapi saya tidak dapat menggunakannya dengan benar.

"NotifyIcon umum tidak terlihat jika Anda menjalankan KDE-desktop default;
itu membutuhkan Panel Gnome yang disebut Notification Area Applet"
http://www.codeproject.com/Articles/466805/AmberIndicator-a-systray-app-under-Linux

"Pada openSUSE, Fedora dan Ubuntu, NotifyIcon tidak dapat digunakan"
https://bugzilla.novell.com/show_bug.cgi?id=590093

"NotifyIcon tidak muncul di systray (Diuji pada OS: Fedora, Arch. DE: MATE, Cinnamon)"
https://bugzilla.xamarin.com/show_bug.cgi?id=14976

Harus ada sesuatu yang lebih terintegrasi dengan DBus.

Ide dasarnya adalah membuat ikon di area notifikasi
kurang mengganggu daripada memunculkan dialog (dialog mengganggu pekerjaan saat ini, dan ikon dapat diabaikan oleh pengguna untuk beberapa waktu). Namun ikon juga lebih sulit untuk diperhatikan, jadi ada fitur yang memungkinkan ikon baki untuk memunculkan balon pesan kecil (dapatkah balon berisi gambar atau aliran video dari kamera pintu masuk? atau hanya menampilkan string?). Secara khusus, itu berarti bahwa balon akan menghilang setelah beberapa waktu (tetapi manajer Rigo melakukan kesalahan - ini mengharuskan pengguna untuk menutup balonnya secara manual)

Ada juga _Workspace Switcher Applet_ yang akan menyenangkan untuk diintegrasikan melalui DBus. Skenario penggunaan - Program MDI yang seharusnya menampilkan kumpulan dokumen yang berbeda pada ruang kerja yang berbeda. Saya membuat permintaan fitur lain untuk ruang kerja - https://github.com/picoe/Eto/issues/409

"Baki sistem GNOME bisa horizontal atau vertikal"

"Baki sistem mengoordinasikan pesan balon untuk memastikan bahwa mereka memiliki tampilan dan nuansa yang konsisten, dan untuk menghindari menampilkan beberapa pesan balon sekaligus. ... Baki sistem dapat menerima sebagian pesan dari beberapa ikon baki sekaligus, jadi diperlukan untuk memasang kembali pesan berdasarkan ID jendela ikon baki.... Pesan balon adalah pesan teks singkat.... Pesan mungkin memiliki batas waktu; jika demikian, pesan akan dihapus setelah batas waktu berakhir. ...Ikon baki mungkin ingin membatalkan pesan balon yang dikirim sebelumnya."

NotifyIcon mono di Notification Area

beberapa url:

  1. Panduan Antarmuka Manusia GNOME 2.2.3 Integrasi Desktop
    https://developer.gnome.org/hig-book/unstable/desktop-notification-area.html.en
  2. Spesifikasi Protokol Baki Sistem
    http://standards.freedesktop.org/systemtray-spec/latest/
  3. Manual Konvensi Komunikasi Antar-Klien
    http://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html
  4. Spesifikasi Protokol XEmbed (protokol untuk penyematan widget lintas-toolkit)
    http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html
  5. Petunjuk Manajer Jendela yang Diperpanjang
    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. Implementasi NotifyIcon di mono
    https://github.com/mono/mono/blob/ef380e3712af86ef7f8064fab19400523c7510c0/mcs/class/System.Windows.Forms/System.Windows.Forms/NotifyIcon.cs#L38
  8. Contoh untuk NotifyIcon 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 menggunakan NotifyIcon:
    http://sourceforge.net/p/keepass/bugs/1212/
  10. Contoh 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

Menurut GNOME HIG, ada 2 cara untuk menambahkan ikon ke panel:
panels-and-area

Sebuah. Applet panel (ini di sebelah kiri dari "Wanda-the-fish")
B. Ikon area notifikasi (Panel notifikasi itu sendiri ditambahkan ke panel sebagai selera panel)

Mono mengimplementasikan "Ikon area notifikasi" di atas spesifikasi X11 (langsung, tanpa Gtk#).

mono menggunakan antarmuka XplatUI dengan metode
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
panggilan diteruskan ke anggota

 static XplatUIDriver driver;

yang mana tipenya??? untuk lingkungan MATE.

Saya tidak tahu apa yang memilih driver mana yang akan digunakan. Mungkin XplatUIX11, yang dipilih di baris ini:
https://github.com/mono/mono/blob/b7a308f660de8174b64697a422abfc7315d07b8c/mcs/class/System.Windows.Forms/System.Windows.Forms/XplatUI.cs#L112

ikon baki adalah jendela

Ikon baki adalah jendela yang akan disematkan di baki sistem.

kelas internal NotifyIconWindow : Formulir { ... // baris 57
jendela NotifyIconWindow pribadi; // baris 45
jendela = new NotifyIconWindow(ini); // baris 389
XplatUI.SystrayAdd(window.Handle, teks, ikon, keluar tooltip); // baris 524

Masalah dengan menggambar:
https://bugzilla.novell.com/show_bug.cgi?id=324237#c13
"Pada mesin 64bit, ikon TIDAK muncul di baki sama sekali."

Masalah dengan transparansi:
http://lists.ximian.com/pipermail/mono-winforms-list/2007-December/003173.html
alasan masalahnya adalah garis 189
(ini adalah bug yang tidak diperbaiki dengan sejarah 8 tahun)
tapi, lampiran dalam pesan milis berisi contoh kode aplikasi.
Lihat juga
http://standards.freedesktop.org/systemtray-spec/latest/ar01s06.html

Masalah dengan menggambar ulang:
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

Konvensi untuk pemilihan manajer didefinisikan dalam ICCCM ( http://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html#manager_selections ).
Baki sistem adalah klien X yang memiliki pilihan manajer khusus pada layar tertentu.
Aplikasi yang ingin memberikan ikon ke baki sistem harus terlebih dahulu menemukan baki sistem
dengan meminta pemilik jendela pemilihan manajer.
Jika pilihan manajer tidak memiliki pemilik, klien dapat menggunakan metode yang dijelaskan dalam ICCCM (menonton pesan klien MANAGER) untuk diberi tahu saat baki sistem muncul.

jendela pemilik pilihan tidak akan sama dengan jendela apa pun yang dapat dilihat pengguna yang disediakan oleh baki sistem (dengan kata lain - pemilihan manajer mungkin bukan jendela yang sama yang digunakan untuk memuat ikon baki sistem), karena jendela pemilik pilihan harus dimusnahkan ketika pemilihan manajer hilang.

baki sistem harus memperoleh pilihan pengelola yang disebut _NET_SYSTEM_TRAY_Sn, menggantikan n dengan nomor layar yang ingin digunakan baki:

  • 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

format pesan dijelaskan di sini:
http://standards.freedesktop.org/systemtray-spec/latest/ar01s04.html
Apakah mungkin mengirim pesan X tanpa menggunakan Xlib dan itu mendasari perpustakaan XCB
yaitu langsung dari kode C# ke "kawat"?

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

Ikon sebagai Panel Applet

https://en.wikipedia.org/wiki/D-Bus
D-BUS adalah sistem komunikasi antarproses (IPC), menyediakan mekanisme sederhana namun kuat yang memungkinkan aplikasi untuk berbicara satu sama lain, mengkomunikasikan informasi dan meminta layanan.
"D-BUS dapat menjadi mekanisme IPC terpadu dan agnostik yang digunakan oleh kedua desktop (GNOME dan KDE)"
_but, but, but - ICCCM juga interprocess, unified dan agnostic..._
lihat The Kernel Event Layer - DBus sebuah bus tunggal yang digunakan bersama oleh seluruh sistem memungkinkan penyebaran event, dari kernel ke aplikasi paling atas pada sistem.
Peristiwa seperti disk penuh dan antrian printer kosong atau bahkan daya baterai hampir habis dapat meningkatkan tumpukan sistem, tersedia untuk aplikasi apa pun yang peduli, memungkinkan sistem untuk merespons dan bereaksi.

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

  2. Pustaka DBus untuk C# (bukan pembungkus, C# murni)
    https://github.com/mono/dbus-sharp

  3. Manual Referensi Pustaka Applet Panel
    https://developer.gnome.org/panel-applet/stable/

  4. GnomeGoal adalah untuk mem-port semua applet Gnome ke api DBUS baru (dari Bonobo).
    https://wiki.gnome.org/Initiatives/GnomeGoals/AppletsDbusMigration

apakah ada yang namanya applet panel Ubuntu?

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

Indikator Aplikasi
( Ayatana , Unity, Ubuntu)

Spesifikasi Pemberitahu Status (SNI, org.freedesktop.StatusNotifierItem)
http://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/
"Ini dimaksudkan sebagai pengganti spesifikasi baki Sistem Freedesktop ...
itu digunakan dalam produksi oleh setidaknya KDE Plasma dan Unity"

  1. Indikator Panel Aplikasi
    https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators

Manual Referensi libappindicator
http://developer.ubuntu.com/api/devel/ubuntu-12.04/c/appindicator/

Indikator Ayatana di Panel Gnome:
https://launchpad.net/indicator-applet

Ada applet panel untuk MATE:
https://github.com/mate-desktop/mate-indicator-applet
untuk menampilkan informasi dari berbagai aplikasi secara konsisten di panel.

Ikon notifikasi di Ubuntu dengan contoh Unity dan Mono C#:
http://www.arvydas.co.uk/2012/08/notification-icon-in-ubuntu-with-unity-and-mono-c-sharp-example/

Setiap indikator menginstal file kecil di /usr/share/unity/indicators yang menentukan di mana menemukannya di DBus dan bagaimana seharusnya ditampilkan di panel. Proses indikator dikelola oleh daemon sesi init.

Spesifikasi Pemberitahuan Desktop
http://www.galago-project.org/specs/notification/0.9/index.html
" Gambar dapat ditempatkan di pemberitahuan, tetapi ini harus dilakukan dengan hati-hati. Gambar tidak boleh melebihi 200x100, tetapi ini harus dianggap sebagai ukuran maksimum."

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

Cara membuat panel menu transparan:
http://www.linuxandlife.com/2012/05/ubuntu-panel-transparent.html

"Indikator hanya dapat berisi label atau ikon di panel
tidak ada rendering khusus atau widget lain"
Indikator Aplikasi menggunakan ukuran ikon tetap 22 piksel.
https://bugs.launchpad.net/ubuntu/+source/indicator-application/+bug/533439
"Libindicator API tidak mengizinkan untuk menentukan ukuran ikon dan
oleh karena itu konvensinya adalah bahwa semua ukuran ikon adalah 22px."

ubah dan perbarui ikon status applet indikator yang sedang berjalan
http://www.helptouser.com/ubuntu/11162-is-it-possible-to-alter-and-update-the-status-icon-of-a-running-indicator-applet.html

Widget Baki Sistem (Plasma/KDE)

  1. Widget System Tray menampilkan informasi sistem, notifikasi, dan layanan
    https://userbase.kde.org/Plasma/SystemTray

item xembed dikodekan dengan keras ke 22 × 22 piksel

Spesifikasi Pemberitahu Status, kelas KstatusNotifierItem
https://github.com/lxde/lxqt/issues/359

Maret 2014-03-04, System Tray di Plasma Berikutnya
http://blog.martin-graesslin.com/blog/2014/03/system-tray-in-plasma-next/

"kami tidak ingin menginvestasikan waktu dalam mengimplementasikan sistem lama (xembed) untuk Plasma Berikutnya"
"sebagian besar aplikasi GTK+ juga menggunakan library appindicator untuk integrasi unity, jadi mereka bekerja seperti yang kita inginkan"
"Meskipun itu akan memakan waktu hingga Qt 5.4 hingga fitur tersebut berfungsi dengan baik."
"mungkin saja ada aplikasi yang masih menggunakan protokol lama dan itu akan rusak."

Baki Pesan Shell GNOME

https://wiki.gnome.org/Design/OS/MessageTray
"Halaman desain Baki Pesan kedaluwarsa, dan disimpan hanya untuk tujuan referensi. Untuk desain terbaru, lihat halaman notifikasi"
https://wiki.gnome.org/Design/OS/Notifications

Ada juga "Applet Indikator" pihak ke-3 untuk Gnome 3 di repositori Ubuntu:
https://code.launchpad.net/~jconti/indicator-applet/gnome3

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

GNOME Shell memungkinkan kustomisasi yang sangat terbatas (berdasarkan desain) dan baki sistem bukanlah salah satu dari area tersebut. Sebenarnya fakta bahwa itu ada hanya untuk mendukung aplikasi warisan tertentu.

"Ikon Systray dipandang sebagai sumber gangguan yang umum, yang ingin dihilangkan oleh para pengembang."

"Jika kita ingin menangani masalah dengan benar, kita perlu membuat API baru dan memberikan waktu bagi aplikasi untuk memindahkannya. Saat ini kami sedang mengerjakan rencana untuk ini."

http://worldofgnome.org/shell-new-notifications-goodbye-message-tray/
01-01-2014, "Pengembang GNOME merencanakan beberapa perubahan signifikan menuju sistem pemberitahuan yang benar-benar baru."

https://blogs.gnome.org/aday/2014/06/18/a-notifications-update/
Fedora 22 (GNOME 3.16) memperkenalkan bilah ikon warisan yang dapat diperluas ini di sudut kiri bawah layar:

ikon "baki" lama ditampilkan di "laci" yang menggunakan sembunyikan otomatis di sudut kiri bawah layar.
Catatan rilis Gnome 3.16

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

saluran IRC gnome-design atau #gnome-shell

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

WingPanel dari OS Dasar

Panel atas bergaya yang menyimpan indikator dan memunculkan peluncur aplikasi

OS dasar menghentikan indikator ayatana:
https://github.com/dyson/indicator-workspaces/issues/3

Indikator baru ini memiliki sedikit lebih banyak kebebasan (Anda tidak terbatas pada desain menu, sekarang dapat memiliki widget apa pun di dalamnya), jadi itu mungkin sesuatu yang harus Anda perhatikan. ;) Indikator Ayatana masih akan didukung secara teknis

Salah satu contoh bekerja dengan panel adalah aplikasi Workrave.
itu memiliki kelas untuk setiap jenis panel.
ada https://github.com/rcaelers/workrave/tree/7cb9aef971f21c9a473146f9b72693b86a4a76f6/frontend/applets berada
"kayu manis", "umum", "gnome-shell", "gnome2", "gnome3", "indikator", "mate", "win32", "xfce"

Adakah yang bisa menjawab pertanyaan sederhana saya?

1) Bisakah kita sekarang membuat ikon baki dengan Eto?
2) OS mana yang didukung?
3) Di mana saya bisa membacanya? Mungkin nama kelas?

Berita buruk, masih tidak ada dukungan, kabar baik, saya akan menerapkan ini untuk Linux dan Windows selama akhir pekan ini :)

Benar-benar keren! :) Apakah hanya penggabungan yang diperlukan sekarang?

Dan MACOS?

Saya tidak berpikir kita perlu emulasi baki di Android :)

Benar-benar keren! :) Apakah hanya penggabungan yang diperlukan sekarang?

Saya masih belum mulai mengerjakannya... namun saya tahu apa yang harus dilakukan dan saya harus melakukan #714 sebelumnya.

Dan MACOS?

Orang lain perlu mengimplementasikannya untuk MacOS, satu-satunya MacOS yang saya miliki adalah di VirtualBox, yang sangat lambat.

Versi Linux Gtk hampir selesai :D

indicator

Kerja bagus! :)

Apakah jendela biasa atau popup dengan konten terbatas diperbolehkan?

Kerja bagus! :)

Apakah jendela biasa atau popup dengan konten terbatas diperbolehkan?

Begitulah tampilan menu konteks di GNOME dengan ekstensi libappindicator di :P

Tanpa ekstensi aneh yang saya miliki di sistem saya, sepertinya:

withoutextension

Begitulah tampilan menu konteks di GNOME dengan ekstensi libappindicator di :P

Tidak yakin saya mengerti ... Saya sebutkan apakah mungkin untuk menampilkan konten apa pun di sana misalnya gambar, bukan Hello World? Misalnya di Windows kita tidak bisa melakukan itu (hanya item menu dengan ikon) .. untuk mendapatkan itu kita harus menerapkan jendela sendiri dan menampilkannya di dekat ikon baki atau klik mouse. Selain itu kita harus menerjemahkan koordinat karena ikon baki (yang kemungkinan besar akan digunakan) adalah bagian dari Windows.Forms bukan WPF.

Sekali lagi ... itu hanya bagaimana menu konteks terlihat di sistem saya ... lihat tangkapan layar kedua, itu menunjukkan hal yang sama persis kecuali dengan bagian dari tema saya dinonaktifkan.

@hardhub afaik, Anda dapat menempatkan kontrol khusus di item menu dengan winforms (dan macOS). Saya tidak tahu apakah ini akan berhasil di GTK#.

@cwensley Saya hanya perlu melaporkan satu hal negatif tentang ini, appindicator tidak mengizinkan memuat ikon dari memori ... jadi saya harus membuat API Eto untuk TrayIcon memuatnya dari jalur file yang sebenarnya ...

@cra0zy yah itu cukup menyebalkan. Mungkin kita bisa menulis ke file temp atau sesuatu..

@cwensley ,

maksud saya ini:
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

Anda hanya dapat menempatkan teks dan ikon di sana...

@cra0zy yah itu cukup menyebalkan. Mungkin kita bisa menulis ke file temp atau sesuatu..

Itu sudah saya lakukan.

@hardhub ah benar, itu menggunakan MenuItem , bukan ToolStripMenuItem .. ugh. Either way, kita hanya bisa membangun fungsionalitas jendela kustom ke dalam platform windows sehingga tidak perlu diimplementasikan secara manual saat Anda ingin menggunakannya.

Apakah kalian berbicara tentang jendela klik kiri seperti volume mixer di Windows 7? Saya sedikit bingung...

Pokoknya berikut ini adalah struktur API:
```c#
publik bo Terlihat { dapatkan; mengatur; }

Judul string publik { dapatkan; mengatur; }

acara publik Diaktifkan { dapatkan; mengatur; }

public void SetMenu(menu ContextMenu);

public void SetIcon(ikon Ikon);

publik batal Tampilkan();

kekosongan publik Sembunyikan();
```

@cra0zy , saya pikir klik kiri membuka jendela khusus. Saya menulis tentang klik kanan. Setidaknya Anda contoh dengan item "Keluar" seperti menu klik kanan.

@cwensley

Kami dapat mencoba menggunakan properti ContextMenuStrip... tetapi saya pikir itu tidak akan dapat menambahkan apa pun khusus...
https://msdn.microsoft.com/en-us/library/system.windows.forms.contextmenustrip (v=vs.110).aspx

Saya pikir Anda menyebutkan kami dapat menambahkan gambar di sebelah kiri item menu ... ya kami bisa .. tapi saya katakan tentang tata letak kustom popup yang tersedia dari baki sistem. Saya menyebutkan gambar sebagai konten khusus bukan sebagai ikon kecil di sebelah kiri item.

Implementasi WinForms selesai:
winforms

Implementasi Gtk Mac/Windows selesai:
2

Implementasi Wpf selesai:
wpf

PR naik: #731

@cwensley Ini bisa ditutup.

@cra0zy masih perlu melakukan port Mac tapi itu ditutupi dengan #750

Apakah halaman ini membantu?
0 / 5 - 0 peringkat