Какой компонент отвечает за трей и как им управлять с помощью C++?

Какой компонент отвечает за трей и как им управлять с помощью C++?

Моя цель — написать графическое приложение для рабочего стола, которое будет использовать команды, найденные в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 для него.

Примечания:

решение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`

Остальное вы поймете сами. Самый простой способ — проверить другие простые индикаторные приложения. Например, посмотрите индикатор изэтот ответ.

Связанный контент