
我的目標是編寫一個桌面 GUI 應用程序,它將利用以下命令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 文件。
筆記:
- 使用 Ubuntu 14.04 LTS amd64
- 將其編寫為用 C++ 編寫的開源 Node.js 擴展
- 這是一作為 Node.js C++ 擴充功能編寫的通知範例
答案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`
剩下的你就會明白了。最簡單的方法是查看其他簡單的指標應用程式。例如,查看指標這個答案。