簡體   English   中英

在 C++ 中構建 Gtk 系統托盤的正確方法

[英]Proper way of building Gtk system tray in c++

int main(int argc, char *argv[]) {

    gtk_init (&argc, &argv);
    GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window), "GtkStatusIcon Example");
    gtk_widget_set_size_request (window, 200, -1);    

設置嘗試圖標文件

    GtkStatusIcon *trayIcon  = gtk_status_icon_new_from_file ("/root/Desktop/icon.png");

設置托盤圖標的彈出菜單

    GtkWidget *menu, *menuItemView, *menuItemExit;
    menu = gtk_menu_new();
    menuItemView = gtk_menu_item_new_with_label ("View");
    menuItemExit = gtk_menu_item_new_with_label ("Exit");
    g_signal_connect (G_OBJECT (menuItemView), "activate", G_CALLBACK (trayView), window);
    g_signal_connect (G_OBJECT (menuItemExit), "activate", G_CALLBACK (trayExit), NULL);
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuItemView);
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuItemExit);
    gtk_widget_show_all (menu);

}

//gcc 托盤圖標.c -o 托盤圖標pkg-config --cflags --libs gtk+-2.0 .

#include <gtk/gtk.h>

靜態無效的托盤視圖(GtkMenuItem *item,gpointer user_data);

靜態無效托盤退出(GtkMenuItem *item,gpointer user_data);

靜態無效的trayIconActivated(GObject *trayIcon,gpointer數據);

static void trayIconPopup(GtkStatusIcon *status_icon, guint button, guint32 activate_time, gpointer popUpMenu);

靜態無效銷毀(GtkWidget*,gpointer);

靜態 gboolean delete_event (GtkWidget*, GdkEvent*, gpointer);

靜態 gboolean window_state_event (GtkWidget *widget, gdkEventWindowState *event, gpointer user_data);

int main(int argc, char *argv[]) {

gtk_init (&argc, &argv);
GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "GtkStatusIcon Example");
gtk_widget_set_size_request (window, 200, -1);

//set try icon file
GtkStatusIcon *trayIcon  = gtk_status_icon_new_from_file ("/root/Desktop/icon.png");
//set popup menu for tray icon
GtkWidget *menu, *menuItemView, *menuItemExit;
menu = gtk_menu_new();
menuItemView = gtk_menu_item_new_with_label ("View");
menuItemExit = gtk_menu_item_new_with_label ("Exit");
g_signal_connect (G_OBJECT (menuItemView), "activate", G_CALLBACK (trayView), window);
g_signal_connect (G_OBJECT (menuItemExit), "activate", G_CALLBACK (trayExit), NULL);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuItemView);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuItemExit);
gtk_widget_show_all (menu);
//set tooltip
gtk_status_icon_set_tooltip (trayIcon, "MsgWatcherGTK");
//connect handlers for mouse events
g_signal_connect(GTK_STATUS_ICON (trayIcon), "activate", GTK_SIGNAL_FUNC (trayIconActivated), window);
g_signal_connect(GTK_STATUS_ICON (trayIcon), "popup-menu", GTK_SIGNAL_FUNC (trayIconPopup), menu);
gtk_status_icon_set_visible(trayIcon, FALSE); //set icon initially invisible


GtkWidget *menuBar, *menuItemTopLvl, *mainMenu, *mainMenuItemExit;
menuBar = gtk_menu_bar_new ();
menuItemTopLvl = gtk_menu_item_new_with_label ("Menu");
gtk_menu_shell_append (GTK_MENU_SHELL (menuBar), menuItemTopLvl);

mainMenu = gtk_menu_new ();
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuItemTopLvl), mainMenu);
mainMenuItemExit = gtk_menu_item_new_with_label ("Quit");
g_signal_connect (G_OBJECT (mainMenuItemExit), "activate", G_CALLBACK (trayExit), NULL);
gtk_menu_shell_append (GTK_MENU_SHELL (mainMenu), mainMenuItemExit);

g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL);
g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), trayIcon);
g_signal_connect (G_OBJECT (window), "window-state-event", G_CALLBACK (window_state_event), trayIcon);
gtk_container_add (GTK_CONTAINER (window), menuBar);
gtk_widget_show_all (window);
gtk_main ();
return 0;

}

靜態無效托盤視圖(GtkMenuItem *項目,gpointer窗口){

gtk_widget_show(GTK_WIDGET(window));
gtk_window_deiconify(GTK_WINDOW(window));    

}

靜態無效托盤退出(GtkMenuItem *item,gpointer user_data){

printf("exit");
gtk_main_quit();

}

靜態無效的trayIconActivated(GObject *trayIcon,gpointer窗口){

gtk_widget_show(GTK_WIDGET(window));
gtk_window_deiconify(GTK_WINDOW(window));

}

靜態無效的trayIconPopup(GtkStatusIcon *status_icon,guint按鈕,guint32 activate_time,gpointer popUpMenu){

gtk_menu_popup(GTK_MENU(popUpMenu), NULL, NULL, gtk_status_icon_position_menu, status_icon, button, activate_time);

}

static void destroy (GtkWidget *window, gpointer 數據) {

gtk_main_quit (); }

靜態 gboolean delete_event (GtkWidget *window, GdkEvent *event, gpointer 數據) {

return FALSE;

}

靜態 gboolean window_state_event (GtkWidget *widget, GdkEventWindowState *event, gpointer trayIcon) {

if(event->changed_mask == GDK_WINDOW_STATE_ICONIFIED && (event->new_window_state == GDK_WINDOW_STATE_ICONIFIED || event->new_window_state == (GDK_WINDOW_STATE_ICONIFIED | GDK_WINDOW_STATE_MAXIMIZED)))
{

    gtk_widget_hide (GTK_WIDGET(widget));
    gtk_status_icon_set_visible(GTK_STATUS_ICON(trayIcon), TRUE);
}

else if(event->changed_mask == GDK_WINDOW_STATE_WITHDRAWN && (event->new_window_state == GDK_WINDOW_STATE_ICONIFIED || event->new_window_state == (GDK_WINDOW_STATE_ICONIFIED | GDK_WINDOW_STATE_MAXIMIZED)))
{

    gtk_status_icon_set_visible(GTK_STATUS_ICON(trayIcon), FALSE);
}

return TRUE;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM