
Mi objetivo es escribir una aplicación GUI de escritorio que utilice estos comandos que se encuentran enhttps://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%)
Luego, la aplicación tendrá un icono de bandeja que muestra una lista de dispositivos de sonido en los que se podrá hacer clic para cambiar el dispositivo de sonido a ese. A medida que se hace clic en ellos, el volumen del sonido disminuirá desde 0 hasta el punto del volumen actual del sistema (por lo tanto, también necesito acceso al volumen del sistema).
Desconocidos:
- Cómo agregar mediante programación un icono de bandeja en C++
- Cómo hacer que se muestre un menú desplegable cuando se hace clic en el ícono de esa bandeja y hacer que muestre elementos en los que también se puede hacer clic (muy parecido a cómo el ícono de correo muestra Thunderbird)
- Cómo vincular los eventos de clic a una función de C++ que se ejecutará (para cambiar a ese dispositivo de sonido, tendré una función de C++ lista).
Solo necesito orientación para identificar el componente de escritorio que estoy intentando manipular y dónde encontrar la documentación API correspondiente.
Notas:
- Usando Ubuntu 14.04 LTS amd64
- Voy a escribir esto como una extensión Node.js de código abierto escrita en C++
- Esto es unejemplo de notificaciones escritas como una extensión de Node.js C++
Respuesta1
Verificarlibappindicator
. Se encarga de poner el icono en la bandeja. El menú desplegable que muestra el indicador es unGtkMenu
. El resto debería resultarte familiar si trabajaste con GTK+. He aquí un ejemplo 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();
}
Lo compilas con lo siguiente. Necesitarás libgtk2.0-dev
y libappindicator-dev
paquetes.
$ gcc test.c `pkg-config --cflags --libs gtk+-2.0 appindicator-0.1`
Ya descubrirás el resto. La forma más sencilla es consultar otras aplicaciones de indicadores sencillas. Por ejemplo, vea el indicador deesta respuesta.