私は次の例を使用しています:https://gist.github.com/davidboy/1045233Ubuntu 14.04 [Gnome Classic] では、システム トレイ アイコンが表示されます。ただし、indicator-application-service が起動するとアイコンは消えます。indicator-application-service が停止すると、アイコンが再び表示されます。
シグナル「connection_changed」を使用すると、インジケーター アプリケーション サービスが実行中の場合はプロパティ「connected」が true になり、それ以外の場合は false になるようです。
「接続済み」が true のときに APP_INDICATOR_STATUS_PASSIVE を設定しても効果はありませんでした (以下によると)https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/appindicator/libappindicator-app-indicator.html#AppIndicator--接続済み)
要件:
- libappindicator-dev
- インジケーターアプリケーション
再現する手順:
- indicator-application-service が実行中の場合は停止します
- 例を実行する -> アイコンが表示される
- インジケーター アプリケーション サービスを起動 -> アイコンが消えた ("接続状態: 接続済み")
- インジケーター アプリケーション サービスを停止 -> アイコンが再び表示されます (「接続状態: 切断」)
コード (例 + connection_changed シグナル ハンドラー):
// gcc -Wall app_indicator.c `pkg-config --libs --cflags gtk+-2.0 appindicator-0.1`
#include <gtk/gtk.h>
#include <libappindicator/app-indicator.h>
void connection_changed(AppIndicator* indicator, gboolean connected, gpointer user_data) {
g_print ("Connection status: %s\n", connected ? "Connected" : "Disconnected");
}
int main (int argc, char **argv) {
gtk_init(&argc, &argv);
GtkWidget *menu;
GtkWidget *menu_item;
AppIndicator *indicator;
menu = gtk_menu_new();
menu_item = gtk_menu_item_new_with_label("Hello world!");
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
indicator = app_indicator_new ("example-simple-client",
"indicator-messages",
APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
g_signal_connect(G_OBJECT(indicator), "connection_changed", G_CALLBACK(connection_changed), 0);
app_indicator_set_status(indicator, APP_INDICATOR_STATUS_ACTIVE);
app_indicator_set_attention_icon (indicator, "indicator-messages-new");
app_indicator_set_menu (indicator, GTK_MENU (menu));
gtk_widget_show_all(menu);
gtk_main();
return 0;
}
たぶんこれが役に立つでしょう:
indicator-application-service が実行されていない場合、d-bus ログ (dbus-monitor) にはこのアプリケーション (example-simple-client) に関する情報は表示されません。
indicator-application-service が実行されている場合、d-bus ログには次の内容が含まれます。
signal sender=:1.84 -> dest=(null destination) serial=6 path=/org/ayatana/NotificationItem/example_simple_client/Menu; interface=com.canonical.dbusmenu; member=LayoutUpdated
uint32 2
int32 0
method call sender=:1.84 -> dest=org.freedesktop.DBus serial=7 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=GetNameOwner
string "org.kde.StatusNotifierWatcher"
method call sender=:1.84 -> dest=:1.39 serial=8 path=/StatusNotifierWatcher; interface=org.kde.StatusNotifierWatcher; member=RegisterStatusNotifierItem
string "/org/ayatana/NotificationItem/example_simple_client"
method return sender=:1.39 -> dest=:1.84 reply_serial=8
method call sender=:1.37 -> dest=org.freedesktop.DBus serial=33 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
string "type='signal',sender=':1.84',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged',path='/org/ayatana/NotificationItem/example_simple_client',arg0='org.kde.StatusNotifierItem'"
method call sender=:1.37 -> dest=org.freedesktop.DBus serial=34 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
string "type='signal',sender=':1.84',interface='org.kde.StatusNotifierItem',path='/org/ayatana/NotificationItem/example_simple_client'"
method call sender=:1.37 -> dest=:1.84 serial=35 path=/org/ayatana/NotificationItem/example_simple_client; interface=org.freedesktop.DBus.Properties; member=GetAll
string "org.kde.StatusNotifierItem"
method return sender=:1.84 -> dest=:1.37 reply_serial=35
array [
dict entry(
string "Id"
variant string "example-simple-client"
)
dict entry(
string "Category"
variant string "ApplicationStatus"
)
dict entry(
string "Status"
variant string "Active"
)
dict entry(
string "IconName"
variant string "indicator-messages"
)
dict entry(
string "IconAccessibleDesc"
variant string ""
)
dict entry(
string "AttentionIconName"
variant string "indicator-messages-new"
)
dict entry(
string "AttentionAccessibleDesc"
variant string ""
)
dict entry(
string "Title"
variant string "a.out"
)
dict entry(
string "IconThemePath"
variant string ""
)
dict entry(
string "Menu"
variant object path "/org/ayatana/NotificationItem/example_simple_client/Menu"
)
dict entry(
string "XAyatanaLabel"
variant string ""
)
dict entry(
string "XAyatanaLabelGuide"
variant string ""
)
dict entry(
string "XAyatanaOrderingIndex"
variant uint32 0
)
]
method call sender=:1.37 -> dest=org.freedesktop.DBus serial=36 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
string "type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',path='/org/freedesktop/DBus',arg0=':1.84'"
method call sender=:1.37 -> dest=org.freedesktop.DBus serial=37 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
string "type='signal',sender=':1.84',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged',path='/org/ayatana/NotificationItem/example_simple_client',arg0='org.freedesktop.DBus.Properties'"
method call sender=:1.37 -> dest=org.freedesktop.DBus serial=38 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
string "type='signal',sender=':1.84',interface='org.freedesktop.DBus.Properties',path='/org/ayatana/NotificationItem/example_simple_client'"
method call sender=:1.37 -> dest=:1.84 serial=39 path=/org/ayatana/NotificationItem/example_simple_client; interface=org.freedesktop.DBus.Properties; member=GetAll
string "org.freedesktop.DBus.Properties"
error sender=:1.84 -> dest=:1.37 error_name=org.freedesktop.DBus.Error.InvalidArgs reply_serial=39
string "Интерфейс отсутствует"
method call sender=:1.37 -> dest=:1.84 serial=40 path=/org/ayatana/NotificationItem/example_simple_client; interface=org.freedesktop.DBus.Properties; member=GetAll
string "org.kde.StatusNotifierItem"
method return sender=:1.84 -> dest=:1.37 reply_serial=40
array [
dict entry(
string "Id"
variant string "example-simple-client"
)
dict entry(
string "Category"
variant string "ApplicationStatus"
)
dict entry(
string "Status"
variant string "Active"
)
dict entry(
string "IconName"
variant string "indicator-messages"
)
dict entry(
string "IconAccessibleDesc"
variant string ""
)
dict entry(
string "AttentionIconName"
variant string "indicator-messages-new"
)
dict entry(
string "AttentionAccessibleDesc"
variant string ""
)
dict entry(
string "Title"
variant string "a.out"
)
dict entry(
string "IconThemePath"
variant string ""
)
dict entry(
string "Menu"
variant object path "/org/ayatana/NotificationItem/example_simple_client/Menu"
)
dict entry(
string "XAyatanaLabel"
variant string ""
)
dict entry(
string "XAyatanaLabelGuide"
variant string ""
)
dict entry(
string "XAyatanaOrderingIndex"
variant uint32 0
)
]
signal sender=:1.37 -> dest=(null destination) serial=41 path=/com/canonical/indicator/application/service; interface=com.canonical.indicator.application.service; member=ApplicationAdded
string "indicator-messages"
int32 0
string ":1.84"
object path "/org/ayatana/NotificationItem/example_simple_client/Menu"
string ""
string ""
string ""
string ""
string "example-simple-client"
string "a.out"