Это не дубликат того, Как создать индикаторы Unity?. Я ищу системный индикатор не индикатор приложения.
Backgound:
От этих двух вопросов:
Я узнал, что существует два типа индикаторов:
ps ax | grep indicator
)Все индикаторы приложения обрабатываются/показываются приложением индикатора (система одна). Системные индикаторы, показал непосредственно панелью Unity.
Оба вопроса о добавляющих/удаляющих индикаторах от входа в систему и блокируют экран. Первой была прямая установка (при контакте с системными индикаторами). Второй была жесткая установка (при контакте с индикаторами приложения), которому нужно изменение источника сервиса панели (пакет единицы) для экрана блокировки и источника зазывалы единицы для экрана входа в систему.
Как случай sysmonitor
, мне, который был обходным решением. Лучшее решение состоит в том, чтобы реализовать системный индикатор вместо приложения один.
Тема:
Есть ли объединенный API для системных индикаторов (Предпочтительно: Python затем C/C++)? Ссылка на официальную документацию.
Большинство системных индикаторов записано с помощью языка программирования Vala. Кто-либо мог писать мелко демонстрацию для системного индикатора с помощью Python или C?
Обновление:
Я нашел немного ссылок, которые могут дать нажатие:
На странице проекта Индикаторов приложения Они перечислили ссылки на AppIndicator-0.3 API (C & Python), используемый для индикаторов приложения.
Они перечислили, также Указывают на 0,7 API (C & Python).Что это такое? Ну, это - DBus обменивающийся сообщениями канал между Настольными приложениями.
На другой руке, на Системной странице проекта Индикаторов, они упомянули:
Системные API индикатора
Обмен сообщениями Меню, использующего libindicate.- Звуковое Меню с помощью libunity.
Индикатор даты/Времени с помощью Сервера данных эволюции
Они кажутся Данными списка API не Разработка Индикатора API как для Сервера данных эволюции. Но не уверенный в libindicate и libunity. Кто-либо работал с этими двумя библиотеками?
Попробовать apt-cache rdepends libunity9 libindicator7 libindicator3-7
видеть, какой индикатор передает эти библиотеки.
Update2: Это для держания заинтересованных пользователей в курсе.
Из того, что я собрался до настоящего времени, вот порядок возможных решений:
libindicator3-7
(высоко, индикаторы Many зависят от него),
Я нашел некоторые тестовые примеры в источнике, некоторые фиктивные индикаторы, которые я попробовал, могли быть установлены в /usr/lib/indicators3/7/
, они - совместно использованный lib .so
. Я мог отобразить их во Входе в систему и Очередной сессии, но Не на Экране Блокировки.
Однако существуют некоторые сервисы контрольного индикатора, который походит на системные Единицы. Я еще не судил их.
libindicator7
Из того же источника как libindicator3-7, от rdepends:
mate-indicator-applet
lxpanel-indicator-applet-plugin
Это, кажется, используется для создания контейнера для индикаторов в панелях.
libunity9
(низко)
Никакое исследование все же
Ну, это действительно более просто затем, я ожидал. Нет никакого определенного API для него. Поскольку это - просто GSimpleActionGroup и с соответствующим GMenu's, экспортируемым через DBus затем, Единица сказана об их присутствии с помощью файла объявления с тем же вставленным именем /usr/share/unity/indicators/
. Никакая потребность в любой другой библиотеке.
Здесь очень небольшой пример языка C:
Получите копию tests/indicator-test-service.c
от libindicator
источник
apt-get source libindicator
cp libindicator-*/tests/indicator-test-service.c .
cp libindicator-*/tests/com.canonical.indicator.test* .
indicator-test-service.c никакие изменения
#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, измененный для добавления блокировки и режима зазывалы
[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 удаляют .in
постфикс от имени файла и изменения исполняемый путь
[D-BUS Service]
Name=com.canonical.indicator.test
Exec=/usr/lib/x86_64-linux-gnu/indicator-test/indicator-test-service
Скомпилируйте его
gcc -o indicator-test-service indicator-test-service.c `pkg-config --cflags --libs gtk+-3.0`
Ручная установка
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/
Конфигурация для Зазывалы, переопределите список индикаторов по умолчанию
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']
Установка
cp 90_unity-greeter.gschema.override /usr/share/glib-2.0/schemas/
glib-compile-schemas /usr/share/glib-2.0/schemas/
Тест
sudo service lightdm restart
Сервис DBus неприятен, если Вы хотите, чтобы пользователь смог закрыть приложение в любое время. Лучше использовать автоматический запуск вместо этого, как индикаторы по умолчанию делают.
Я загрузил готовые файлы здесь:
https://github.com/sneetsher/mysystemindicator_minimum
и измененная копия здесь:
https://github.com/sneetsher/mysystemindicator
Где я попробовал другое меню за другой режим. Это могло быть установлено и протестировано быстро.
Это кажется слишком простым и может быть легко портировано на любой другой язык, которые имеют поддержку lib Gnome GIO (включая DBus). Поскольку я ищу Python, я могу добавить его позже.
Это не полный автономный индикатор как тот выше, это - просто плагин lib доли, подобный libappmenu.so
& libprintersmenu.so
(меню приложения и индикатор принтера). Это можно было показать только на сессии обычного пользователя и зазывале (Не на экране блокировки).
Я не мог заставить его работать в моей текущей машине, но я сделал прежде. Здесь шаги, может быть, я пропускаю что-то.
Используя тот же источник выше libindicator
test/libdummy-indicator-*.c
примеры (простой и видимый, те обнаруживаются на панели),
Скомпилировать
./autogen.sh
make
Установка
sudo cp tests/.libs/libdummy-indicator-visible.so /usr/lib/indicators3/7/libdummy.so
Настройте для показа на экране зазывалы
90_unity-greeter.gschema.override используют то же имя без lib
префикс и .so
расширение.
[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']
Установка
cp 90_unity-greeter.gschema.override /usr/share/glib-2.0/schemas/
glib-compile-schemas /usr/share/glib-2.0/schemas/
ПРИМЕЧАНИЕ: проверьте, что нижняя часть этого сообщения для финала говорит относительно этого ответа.
я не знаю, имею ли я действительно помощь, но я надеюсь, что эта идея может быть полезной.
Из того, что я искал, различия в Системе и Индикаторах приложения являются явными. Принимая это во внимание, я теперь представляю сомнительное понятие:
использование Индикатора приложения API в Системном Индикаторе (в настроенном против создания нового, объединенного API для той же цели)
идея прибыла ко мне при рассмотрении следующих сообщений:
https://askubuntu.com/a/234204/408654
https://askubuntu.com/a/42213/408654
Единица API, кажется, прежде всего, создается для использования с Индикаторами приложения, но и Система и Индикаторы приложения могут использовать подобное программирование (C Ленг). Однако Вы упомянули ранее, что эти два типа Индикаторов обрабатываются двумя различными системами. По сути, я затем продолжил читать один из Ваших источников:
, Как я добавляю или управляю Индикаторами Приложения/Системы на экране входа в систему?
основной ответ включил переопределение уже существующего пользователя для получения доступа, которого они потребовали. Это также предоставило решение для добавления и удаления всех существующих Индикаторов. Это - объединенное решение по управлению для Индикаторов. Было бы возможно переопределить значение по умолчанию (существующее ранее) пользователь для выполнения/представления Системного Индикатора?
Системный Индикатор может использовать Индикатор приложения Единицы API (API может использоваться и отображаться правильно панелью Unity)? Если бы ответы на них да, который насытил бы ситуацию - если она не вызывает другие проблемы в результате. Я знаю, что это не будет сразу походить на ответ, таким образом, я разъясню то, чего я делал попытку - я пытаюсь повредить задачу в меньшие цели. Основное цель быть, узнавая, может ли Индикатор приложения API использоваться для кодирования Системных Индикаторов (как существование ранее, объединил API для Системных Индикаторов).
В ответ на эту часть Вашего запроса:
"Там объединенный API для системных индикаторов"
, К сожалению, тем не менее, нет никакого способа использовать API Индикатора приложения для Системных Индикаторов. По сути, мое решение является пустым :(