Serviço indicador de sistema
Bem, é muito mais simples do que eu esperava. Não há uma API específica para isso. Porque é apenas um GSimpleActionGroup & amp; com os GMenu correspondentes exportados através do DBus, em seguida, o Unity é informado sobre sua presença usando o arquivo de declaração com o mesmo nome em código%. Não há necessidade de qualquer outra biblioteca.
Aqui está um exemplo muito pequeno da linguagem C :
-
Obtenha uma cópia de
/usr/share/unity/indicators/
detests/indicator-test-service.c
sourceapt-get source libindicator cp libindicator-*/tests/indicator-test-service.c . cp libindicator-*/tests/com.canonical.indicator.test* .
-
indicador-teste-serviço.c nenhuma mudança
#include <gio/gio.h> typedef struct { GSimpleActionGroup *actions; GMenu *menu; guint actions_export_id; guint menu_export_id; } IndicatorTestService; static void bus_acquired (GDBusConnection *connection, const gchar *name, gpointer user_data) { IndicatorTestService *indicator = user_data; GError *error = NULL; indicator->actions_export_id = g_dbus_connection_export_action_group (connection, "/com/canonical/indicator/test", G_ACTION_GROUP (indicator->actions), &error); if (indicator->actions_export_id == 0) { g_warning ("cannot export action group: %s", error->message); g_error_free (error); return; } indicator->menu_export_id = g_dbus_connection_export_menu_model (connection, "/com/canonical/indicator/test/desktop", G_MENU_MODEL (indicator->menu), &error); if (indicator->menu_export_id == 0) { g_warning ("cannot export menu: %s", error->message); g_error_free (error); return; } } static void name_lost (GDBusConnection *connection, const gchar *name, gpointer user_data) { IndicatorTestService *indicator = user_data; if (indicator->actions_export_id) g_dbus_connection_unexport_action_group (connection, indicator->actions_export_id); if (indicator->menu_export_id) g_dbus_connection_unexport_menu_model (connection, indicator->menu_export_id); } static void activate_show (GSimpleAction *action, GVariant *parameter, gpointer user_data) { g_message ("showing"); } int main (int argc, char **argv) { IndicatorTestService indicator = { 0 }; GMenuItem *item; GMenu *submenu; GActionEntry entries[] = { { "_header", NULL, NULL, "{'label': <'Test'>," " 'icon': <'indicator-test'>," " 'accessible-desc': <'Test indicator'> }", NULL }, { "show", activate_show, NULL, NULL, NULL } }; GMainLoop *loop; indicator.actions = g_simple_action_group_new (); g_simple_action_group_add_entries (indicator.actions, entries, G_N_ELEMENTS (entries), NULL); submenu = g_menu_new (); g_menu_append (submenu, "Show", "indicator.show"); item = g_menu_item_new (NULL, "indicator._header"); g_menu_item_set_attribute (item, "x-canonical-type", "s", "com.canonical.indicator.root"); g_menu_item_set_submenu (item, G_MENU_MODEL (submenu)); indicator.menu = g_menu_new (); g_menu_append_item (indicator.menu, item); g_bus_own_name (G_BUS_TYPE_SESSION, "com.canonical.indicator.test", G_BUS_NAME_OWNER_FLAGS_NONE, bus_acquired, NULL, name_lost, &indicator, NULL); loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (loop); g_object_unref (submenu); g_object_unref (item); g_object_unref (indicator.actions); g_object_unref (indicator.menu); g_object_unref (loop); return 0; }
-
com.canonical.indicator.test modificado para adicionar bloqueio & amp; modo de saudação
[Indicator Service] Name=indicator-test ObjectPath=/com/canonical/indicator/test [desktop] ObjectPath=/com/canonical/indicator/test/desktop [desktop_greeter] ObjectPath=/com/canonical/indicator/test/desktop [desktop_lockscreen] ObjectPath=/com/canonical/indicator/test/desktop
-
com.canonical.indicator.test.service remova
libindicator
postfix do nome do arquivo e altere o caminho do executável[D-BUS Service] Name=com.canonical.indicator.test Exec=/usr/lib/x86_64-linux-gnu/indicator-test/indicator-test-service
-
-
Compile
gcc -o indicator-test-service indicator-test-service.c 'pkg-config --cflags --libs gtk+-3.0'
-
Instalação manual
sudo su mkdir /usr/lib/x86_64-linux-gnu/indicator-test/ cp indicator-test-service /usr/lib/x86_64-linux-gnu/indicator-test/ cp com.canonical.indicator.test /usr/share/unity/indicators/ cp com.canonical.indicator.test.service /usr/share/dbus-1/services/
-
Configuração para Greeter, anule a lista de indicadores padrão
-
90_unity-greeter.gschema.override
[com.canonical.unity-greeter] indicators=['ug-accessibility', 'com.canonical.indicator.keyboard', 'com.canonical.indicator.session', 'com.canonical.indicator.datetime', 'com.canonical.indicator.power', 'com.canonical.indicator.sound', 'com.canonical.indicator.test', 'application']
-
Instalar
cp 90_unity-greeter.gschema.override /usr/share/glib-2.0/schemas/ glib-compile-schemas /usr/share/glib-2.0/schemas/
-
-
Teste
sudo service lightdm restart
Notas
-
O serviço DBus é problemático se você desejar que o usuário possa fechar o aplicativo a qualquer momento. É melhor usar o início automático, como os indicadores padrão.
-
Eu enviei arquivos prontos aqui:
e uma cópia modificada aqui:
Onde eu tentei menu diferente para o modo diferente. Pode ser instalado e testado rapidamente.
-
Isto parece muito simples e pode ser facilmente portado para qualquer outra linguagem que suporte a biblioteca GIO Gnome (incluindo o DBus). Como estou procurando por python, posso adicioná-lo mais tarde.
Referências:
Plugin de Indicador do Sistema
Este não é um indicador completo e independente como o acima, é apenas um plugin lib de compartilhamento, semelhante a .in
& amp; libappmenu.so
(menu de aplicativos e indicador da impressora). Pode ser mostrado apenas em sessões regulares de usuários & amp; saudação (não na tela de bloqueio).
Eu não consegui fazer funcionar na minha máquina atual, mas fiz antes. Aqui os passos, pode ser que esteja faltando alguma coisa.
-
Usando a mesma fonte acima de
libprintersmenu.so
libindicator
são exemplos (simples e visíveis, os que aparecem no painel) -
Compile
./autogen.sh make
-
Instalar
sudo cp tests/.libs/libdummy-indicator-visible.so /usr/lib/indicators3/7/libdummy.so
-
Configure para mostrar na tela de boas-vindas
-
90_unity-greeter.gschema.override use o mesmo nome sem
test/libdummy-indicator-*.c
prefixo elib
extensão.[com.canonical.unity-greeter] indicators=['ug-accessibility', 'com.canonical.indicator.keyboard', 'com.canonical.indicator.session', 'com.canonical.indicator.datetime', 'com.canonical.indicator.power', 'com.canonical.indicator.sound', 'application', 'dummy']
-
Instalar
cp 90_unity-greeter.gschema.override /usr/share/glib-2.0/schemas/ glib-compile-schemas /usr/share/glib-2.0/schemas/
-