Qual componente é responsável pela bandeja e como manipulá-la usando C++?

Qual componente é responsável pela bandeja e como manipulá-la usando C++?

Meu objetivo é escrever um aplicativo desktop gui que utilize esses comandos encontrados emhttps://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%)

Em seguida, o aplicativo terá um ícone na bandeja que mostra uma lista de dispositivos de som que poderão ser clicados para alternar o dispositivo de som para aquele. À medida que eles são clicados, o volume do som diminuirá de 0 até o ponto do volume atual do sistema (portanto, também preciso acessar o volume do sistema).

Desconhecidos:

  • Como adicionar programaticamente um ícone de bandeja em c++
  • Como fazer uma exibição suspensa quando clicado no ícone da bandeja e exibir itens que também são clicáveis ​​(da mesma forma que o ícone de e-mail exibe o Thunderbird)
  • Como vincular os eventos de clique a uma função c++ que será executada (para mudar para esse dispositivo de som, terei uma função c++ pronta).

Só preciso de orientação sobre como identificar o componente da área de trabalho que estou tentando manipular e onde encontrar a documentação da API para ele.

Notas:

Responder1

Confiralibappindicator. É responsável por colocar o ícone na bandeja. O menu suspenso exibido pelo indicador é umGtkMenu. O resto deve ser familiar se você trabalhou com GTK+. Aqui está um exemplo mínimo.

#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();
}

Você o compila com o seguinte. Você precisará libgtk2.0-devde libappindicator-devpacotes.

$ gcc test.c `pkg-config --cflags --libs gtk+-2.0 appindicator-0.1`

Você descobrirá o resto. A maneira mais fácil é verificar outras aplicações simples de indicadores. Por exemplo, veja o indicador deesta resposta.

informação relacionada