#include #include #include #include gboolean test_ok; int window_counter; GtkWidget* windows[2]; gulong signal_handler[2]; gboolean check_decorator (gpointer data) { GDir *dir = g_dir_open ("/proc", 0, NULL); gchar *name; while ((name = (gchar*)g_dir_read_name (dir)) != NULL) { if (name[0] >= '1' && name[0] <= '9') { const gchar *cmdline = g_strdup_printf ("/proc/%s/cmdline", name); if (g_file_test (cmdline, G_FILE_TEST_EXISTS)) { gchar buffer[1024]; FILE *fd = fopen (cmdline, "r"); if (!fd) continue; while (!feof (fd)) { int length = fread (buffer, 1, 1023, fd); if (length > 0 && g_str_has_suffix (buffer, "unity-window-decorator")) { test_ok = TRUE; gtk_main_quit (); } } fclose (fd); } g_free ((gpointer)cmdline); } } gtk_main_quit (); } gboolean transient_destroyed (GtkObject *window, gpointer data) { /* We allow for 0.5s for a crash to happen */ g_timeout_add (500, check_decorator, NULL); return FALSE; } gboolean close_transient (gpointer data) { gtk_widget_destroy (windows[0]); return FALSE; } void window_shown (GtkWidget *widget, GdkEvent *event, gpointer user_data) { int i; for (i=0; i<2; i++) { if (windows[i] == widget) { g_signal_handler_disconnect (widget, signal_handler[i]); } } window_counter++; if (window_counter >= 2) { g_timeout_add (200, close_transient, NULL); } } int main (int argc, char ** argv) { gtk_init (&argc, &argv); window_counter = 0; test_ok = FALSE; windows[0] = gtk_window_new (GTK_WINDOW_TOPLEVEL); windows[1] = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_show_all (windows[0]); gtk_widget_show_all (windows[1]); gtk_window_set_title (GTK_WINDOW(windows[0]), "WINDOW X"); gtk_window_set_title (GTK_WINDOW(windows[1]), "WINDOW Y"); signal_handler[0] = g_signal_connect (windows[0], "window-state-event", G_CALLBACK(window_shown), NULL); signal_handler[1] = g_signal_connect (windows[1], "window-state-event", G_CALLBACK(window_shown), NULL); g_signal_connect (windows[0], "destroy", G_CALLBACK(transient_destroyed), NULL); gtk_window_set_transient_for (GTK_WINDOW(windows[1]), GTK_WINDOW(windows[0])); g_message ("TEST: Closing the parent of a transient window"); gtk_main (); if (test_ok) { g_message ("Test passed successfully"); return 0; } g_error ("Test failed"); return 1; }