![Qual componente é responsável pela bandeja e como manipulá-la usando C++?](https://rvso.com/image/1083762/Qual%20componente%20%C3%A9%20respons%C3%A1vel%20pela%20bandeja%20e%20como%20manipul%C3%A1-la%20usando%20C%2B%2B%3F.png)
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:
- Usando Ubuntu 14.04 LTS amd64
- Vou escrever isso como uma extensão Node.js de código aberto escrita em C++
- Isto é umexemplo de notificações escritas como uma extensão Node.js C++
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-dev
de libappindicator-dev
pacotes.
$ 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.