
Моя цель — написать графическое приложение для рабочего стола, которое будет использовать команды, найденные вhttps://askubuntu.com/a/14083/18330
pacmd list-sinks to list name or index number of possible sinks
pacmd set-default-sink "SINKNAME" to set the default output sink
pacmd set-default-source "SOURCENAME" to set the default input
pacmd set-sink-volume index volume
pacmd set-source-volume index volume for volume control (0 = Mute, 65536 = 100%)
Затем приложение будет иметь значок в трее, который показывает список звуковых устройств, которые можно будет нажать, чтобы переключить звуковое устройство на это. По мере нажатия громкость звука будет уменьшаться от 0 до текущей системной громкости (поэтому мне также нужен доступ к системной громкости).
Неизвестные:
- Как программно добавить иконку в трей в c++
- Как сделать так, чтобы при нажатии на значок в трее отображался раскрывающийся список, а также отображались элементы, на которые также можно нажать (подобно тому, как значок почты отображает Thunderbird)
- Как привязать события щелчка к функции C++, которая будет запущена (чтобы переключиться на это звуковое устройство, у меня будет готовая функция C++).
Мне просто нужны некоторые указания по идентификации компонента рабочего стола, которым я пытаюсь управлять, и где найти документацию по API для него.
Примечания:
- Использование Ubuntu 14.04 LTS amd64
- Напишу это как расширение Node.js с открытым исходным кодом, написанное на C++.
- Этопример уведомлений, написанных как расширение Node.js C++
решение1
Проверитьlibappindicator
. Он отвечает за размещение значка в трее. Выпадающее меню, отображаемое индикатором, являетсяGtkMenu
. Остальное должно быть вам знакомо, если вы работали с GTK+. Вот минимальный пример.
#include <gtk/gtk.h>
#include <libappindicator/app-indicator.h>
static void do_something(GtkWidget *widget, gpointer data) {
//...
}
int main (int argc, char **argv) {
gtk_init(&argc, &argv);
GtkWidget *menu = gtk_menu_new();
GtkWidget *menuitem = gtk_menu_item_new_with_mnemonic("_This is a menu item");
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
g_signal_connect(menuitem, "activate", G_CALLBACK(do_something), NULL);
/* the second parameter is the icon displayed */
AppIndicator* ind = app_indicator_new("test", "indicator-messages-new",
APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
app_indicator_set_menu(ind, GTK_MENU(menu));
gtk_main();
}
Вы компилируете его следующим образом. Вам понадобятся libgtk2.0-dev
и libappindicator-dev
пакеты.
$ gcc test.c `pkg-config --cflags --libs gtk+-2.0 appindicator-0.1`
Остальное вы поймете сами. Самый простой способ — проверить другие простые индикаторные приложения. Например, посмотрите индикатор изэтот ответ.