#include <gtk/gtk.h>
namespace gtk_test
{
GtkWidget *window;
GtkWidget *button;
GtkStatusIcon *tray_icon;
GtkWidget *menu;
GtkWidget *submenu;
bool current_state = false;
bool opt_gdebug = false;
}
using namespace gtk_test;
static void tray_menu_new_item (GtkWidget *menu, char *label, void *callback, void *userdata);
static void tray_menu_destroy (GtkWidget *menu, gpointer userdata);
static void destroy( GtkWidget *widget, gpointer data );
static void set_state( )
{
if (GTK_WIDGET_VISIBLE(window))
{
if(current_state)
{
gtk_button_set_label((GtkButton*)button,"start");
}
else
{
gtk_button_set_label((GtkButton*)button,"stop");
}
}
current_state = !current_state;
}
void tray_icon_on_click(GtkStatusIcon *status_icon,
gpointer user_data)
{
if (window->window)
{
gtk_widget_show(window);
if(!current_state)
{
gtk_button_set_label((GtkButton*)button,"start");
}
else
{
gtk_button_set_label((GtkButton*)button,"stop");
}
gtk_window_present((GtkWindow *)window);
}
}
void tray_icon_on_menu(GtkStatusIcon *status_icon, guint menu_button,
guint activate_time, gpointer user_data)
{
menu = gtk_menu_new();
if (current_state)
{
tray_menu_new_item (menu, ("_Stop"), (void*)set_state, NULL);
}
else
{
tray_menu_new_item (menu, ("_Start"), (void*)set_state, NULL);
}
g_object_ref (menu);
g_object_ref_sink (menu);
g_object_unref (menu);
g_signal_connect (G_OBJECT (menu), "selection-done", G_CALLBACK (tray_menu_destroy), NULL);
gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL,
user_data, menu_button, activate_time);
gtk_widget_show_all (GTK_WIDGET (menu));
}
static GtkStatusIcon *create_tray_icon() {
tray_icon = gtk_status_icon_new();
g_signal_connect(G_OBJECT(tray_icon), "activate", G_CALLBACK(tray_icon_on_click), NULL);
g_signal_connect(G_OBJECT(tray_icon), "popup-menu", G_CALLBACK(tray_icon_on_menu), NULL);
gtk_status_icon_set_from_icon_name(tray_icon, GTK_STOCK_MEDIA_STOP);
gtk_status_icon_set_tooltip(tray_icon, "Example Tray Icon");
gtk_status_icon_set_visible(tray_icon, TRUE);
return tray_icon;
}
void tray_icon_cleanup()
{
if (tray_icon)
{
g_object_unref ((GObject *)tray_icon);
tray_icon = NULL;
}
}
static gboolean delete_event( GtkWidget *widget,
GdkEvent *event,
gpointer data )
{
tray_icon_cleanup();
return FALSE;
}
static void destroy( GtkWidget *widget, gpointer data )
{
gtk_main_quit ();
}
/* Another callback */
static void window_state( GtkWidget *widget, gpointer data )
{
if (widget->window)
{
if (gdk_window_get_state(widget->window) & GDK_WINDOW_STATE_ICONIFIED)
{
g_print ("iconified");
gtk_window_deiconify((GtkWindow *)window);
gtk_widget_hide(widget);
}
}
}
static void tray_menu_new_item (GtkWidget *menu, char *label, void *callback, void *userdata)
{
GtkWidget *item;
if (label)
item = gtk_menu_item_new_with_mnemonic (label);
else
item = gtk_menu_item_new ();
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (callback), userdata);
gtk_widget_show (item);
}
static void tray_menu_destroy (GtkWidget *menu, gpointer userdata)
{
gtk_widget_destroy (menu);
g_object_unref (menu);
}
int main( int argc,
char *argv[] )
{
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL);
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL);
g_signal_connect (G_OBJECT (window), "window_state_event", G_CALLBACK (window_state), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
button = gtk_button_new_with_label ("start");
g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (set_state), NULL);
GtkStatusIcon* tray_icon = create_tray_icon();
gtk_container_add (GTK_CONTAINER (window), button);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS);
gtk_widget_show (button);
gtk_widget_show (window);
gtk_main ();
return 0;
}