/* gcc -g `pkg-config --cflags gtk+-2.0` `pkg-config --cflags appindicator-0.1` -o appindicator appindicator.c `pkg-config --libs gtk+-2.0` `pkg-config --libs appindicator-0.1` */ #include #include #include #include #include #include static gboolean loop(gpointer data) { AppIndicator *indicator = data; GtkMenu *menu = GTK_MENU(gtk_menu_new()); int i; struct rusage usage; for (i = 0; i < 20; i++) { char label[16]; sprintf(label, "item %d", i); GtkMenuItem * item = GTK_MENU_ITEM(gtk_menu_item_new_with_label(label)); gtk_menu_shell_append(GTK_MENU_SHELL(menu), GTK_WIDGET(item)); } gtk_widget_show_all(GTK_WIDGET(menu)); /* app_indicator sinks the floating reference */ app_indicator_set_menu (indicator, menu); getrusage(RUSAGE_SELF, &usage); printf("%ld\n", usage.ru_maxrss); return TRUE; } static void handler(int sig) { gtk_main_quit(); } int main (int argc, char **argv) { AppIndicator *indicator; struct sigaction sigact; sigact.sa_handler = handler; sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; sigaction(SIGINT, &sigact, NULL); gtk_init (&argc, &argv); indicator = app_indicator_new ("app-indicator-memory-leak", "nm-no-connection", APP_INDICATOR_CATEGORY_APPLICATION_STATUS); app_indicator_set_status (indicator, APP_INDICATOR_STATUS_ACTIVE); g_timeout_add_seconds(1, loop, indicator); gtk_main (); g_object_unref(indicator); return 0; }