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

4

Meu objetivo é escrever um aplicativo de gui de área de trabalho que utilizará esses comandos encontrados no link

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 de bandeja que mostra uma lista de dispositivos de som que serão clicáveis para alternar o dispositivo de som para aquele. À medida que são clicados, o volume do som diminuirá o volume de 0 para o 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 ao clicar no ícone da bandeja e fazer com que ele exiba itens que também são clicáveis (muito parecido com o modo como o ícone de e-mail exibe o Thunderbird)
  • Como ligar os eventos de clique a uma função c ++ que será executada (para alternar para esse dispositivo de som, terei uma função c ++ pronta).

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

Notas:

  • Usando o Ubuntu 14.04 LTS amd64
  • Vai escrever isso como uma extensão Node.js de código aberto escrita em C ++
  • Este é um exemplo de notificações escrito como um Node.js. Extensão C ++
por Logan 19.10.2014 / 22:50

1 resposta

1

Confira libappindicator . É responsável por colocar o ícone na bandeja. O menu suspenso exibido pelo indicador é um GtkMenu . O resto deve ser familiar se você trabalhou com o 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ê compila com o seguinte. Você precisará de libgtk2.0-dev e libappindicator-dev packages.

$ 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 de indicadores simples. Por exemplo, veja o indicador de esta resposta .

    
por mkayaalp 09.02.2015 / 09:35