4 static GtkWidget *darea;
5 static GtkTreeStore *window_store = NULL;
6 static GtkWidget *treeview;
8 static void update_store (void);
11 window_has_impl (GdkWindow *window)
14 w = (GdkWindowObject *)window;
15 return w->parent == NULL || w->parent->impl != w->impl;
19 create_window (GdkWindow *parent,
20 int x, int y, int w, int h,
23 GdkWindowAttr attributes;
31 attributes.height = h;
32 attributes.window_type = GDK_WINDOW_CHILD;
33 attributes.event_mask = GDK_STRUCTURE_MASK
34 | GDK_BUTTON_MOTION_MASK
35 | GDK_BUTTON_PRESS_MASK
36 | GDK_BUTTON_RELEASE_MASK
38 | GDK_ENTER_NOTIFY_MASK
39 | GDK_LEAVE_NOTIFY_MASK;
40 attributes.wclass = GDK_INPUT_OUTPUT;
42 attributes_mask = GDK_WA_X | GDK_WA_Y;
44 window = gdk_window_new (parent, &attributes, attributes_mask);
45 gdk_window_set_user_data (window, darea);
47 bg = g_new (GdkColor, 1);
52 bg->red = g_random_int_range (0, 0xffff);
53 bg->blue = g_random_int_range (0, 0xffff);
54 bg->green = g_random_int_range (0, 0xffff);;
57 gdk_rgb_find_color (gtk_widget_get_colormap (darea), bg);
58 gdk_window_set_background (window, bg);
59 g_object_set_data_full (G_OBJECT (window), "color", bg, g_free);
61 gdk_window_show (window);
67 get_selected_window (void)
69 GtkTreeSelection *sel;
73 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
74 if (!gtk_tree_selection_get_selected (sel, NULL, &iter))
77 gtk_tree_model_get (GTK_TREE_MODEL (window_store),
85 find_window_helper (GtkTreeModel *model,
88 GtkTreeIter *selected_iter)
90 GtkTreeIter child_iter;
95 gtk_tree_model_get (model, iter,
100 *selected_iter = *iter;
104 if (gtk_tree_model_iter_children (model,
108 if (find_window_helper (model, window, &child_iter, selected_iter))
111 } while (gtk_tree_model_iter_next (model, iter));
117 find_window (GdkWindow *window,
118 GtkTreeIter *window_iter)
122 if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (window_store), &iter))
125 return find_window_helper (GTK_TREE_MODEL (window_store),
132 select_window (GdkWindow *window)
135 GtkTreeSelection *selection;
137 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
139 if (window != NULL &&
140 find_window (window, &iter))
141 gtk_tree_selection_select_iter (selection, &iter);
143 gtk_tree_selection_unselect_all (selection);
147 add_window_clicked (GtkWidget *button,
152 parent = get_selected_window ();
154 parent = darea->window;
156 create_window (parent, 10, 10, 100, 100, NULL);
161 remove_window_clicked (GtkWidget *button,
166 window = get_selected_window ();
170 gdk_window_destroy (window);
173 static void save_children (GString *s, GdkWindow *window);
176 save_window (GString *s,
182 gdk_window_get_position (window, &x, &y);
183 gdk_drawable_get_size (GDK_DRAWABLE (window), &w, &h);
184 color = g_object_get_data (G_OBJECT (window), "color");
186 g_string_append_printf (s, "%d,%d %dx%d (%d,%d,%d) %d %d\n",
188 color->red, color->green, color->blue,
189 window_has_impl (window),
190 g_list_length (gdk_window_peek_children (window)));
192 save_children (s, window);
197 save_children (GString *s,
203 for (l = g_list_reverse (gdk_window_peek_children (window));
209 save_window (s, child);
215 save_clicked (GtkWidget *button,
222 s = g_string_new ("");
224 save_children (s, darea->window);
226 dialog = gtk_file_chooser_dialog_new ("Filename for window data",
228 GTK_FILE_CHOOSER_ACTION_SAVE,
229 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
230 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
233 gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
235 if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
237 file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
239 g_file_replace_contents (file,
242 0, NULL, NULL, NULL);
244 g_object_unref (file);
247 gtk_widget_destroy (dialog);
248 g_string_free (s, TRUE);
252 destroy_children (GdkWindow *window)
257 for (l = gdk_window_peek_children (window);
263 destroy_children (child);
264 gdk_window_destroy (child);
269 parse_window (GdkWindow *parent, char **lines)
271 int x, y, w, h, r, g, b, native, n_children;
279 if (sscanf(*lines, "%d,%d %dx%d (%d,%d,%d) %d %d",
280 &x, &y, &w, &h, &r, &g, &b, &native, &n_children) == 9)
286 window = create_window (parent, x, y, w, h, &color);
288 gdk_window_set_has_native (window, TRUE);
290 for (i = 0; i < n_children; i++)
291 lines = parse_window (window, lines);
300 load_file (GFile *file)
305 if (g_file_load_contents (file, NULL, &data, NULL, NULL, NULL))
307 destroy_children (darea->window);
309 lines = g_strsplit (data, "\n", -1);
313 l = parse_window (darea->window, l);
320 move_window_clicked (GtkWidget *button,
324 GtkDirectionType direction;
327 direction = GPOINTER_TO_INT (data);
329 window = get_selected_window ();
334 gdk_window_get_position (window, &x, &y);
353 gdk_window_move (window, x, y);
357 raise_window_clicked (GtkWidget *button,
362 window = get_selected_window ();
366 gdk_window_raise (window);
371 lower_window_clicked (GtkWidget *button,
376 window = get_selected_window ();
380 gdk_window_lower (window);
386 smaller_window_clicked (GtkWidget *button,
392 window = get_selected_window ();
396 gdk_drawable_get_size (GDK_DRAWABLE (window), &w, &h);
405 gdk_window_resize (window, w, h);
409 larger_window_clicked (GtkWidget *button,
415 window = get_selected_window ();
419 gdk_drawable_get_size (GDK_DRAWABLE (window), &w, &h);
424 gdk_window_resize (window, w, h);
428 native_window_clicked (GtkWidget *button,
433 window = get_selected_window ();
437 gdk_window_set_has_native (window, TRUE);
442 darea_button_release_event (GtkWidget *widget,
443 GdkEventButton *event)
445 select_window (event->window);
450 render_window_cell (GtkTreeViewColumn *tree_column,
451 GtkCellRenderer *cell,
452 GtkTreeModel *tree_model,
459 gtk_tree_model_get (GTK_TREE_MODEL (window_store),
464 if (window_has_impl (window))
465 name = g_strdup_printf ("%p (native)", window);
467 name = g_strdup_printf ("%p", window);
470 "background-gdk", &((GdkWindowObject *)window)->bg_color,
475 add_children (GtkTreeStore *store,
477 GtkTreeIter *window_iter)
480 GtkTreeIter child_iter;
482 for (l = gdk_window_peek_children (window);
486 gtk_tree_store_append (store, &child_iter, window_iter);
487 gtk_tree_store_set (store, &child_iter,
491 add_children (store, l->data, &child_iter);
500 selected = get_selected_window ();
502 gtk_tree_store_clear (window_store);
504 add_children (window_store, darea->window, NULL);
505 gtk_tree_view_expand_all (GTK_TREE_VIEW (treeview));
507 select_window (selected);
512 main (int argc, char **argv)
514 GtkWidget *window, *vbox, *hbox, *frame;
515 GtkWidget *button, *scrolled, *table;
516 GtkTreeViewColumn *column;
517 GtkCellRenderer *renderer;
518 GdkColor black = {0};
521 gtk_init (&argc, &argv);
523 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
524 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
526 g_signal_connect (G_OBJECT (window), "delete-event", gtk_main_quit, NULL);
528 hbox = gtk_hbox_new (FALSE, 5);
529 gtk_container_add (GTK_CONTAINER (window), hbox);
530 gtk_widget_show (hbox);
532 frame = gtk_frame_new ("GdkWindows");
533 gtk_box_pack_start (GTK_BOX (hbox),
537 gtk_widget_show (frame);
539 darea = gtk_drawing_area_new ();
540 /*gtk_widget_set_double_buffered (darea, FALSE);*/
541 gtk_widget_add_events (darea, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
542 gtk_widget_set_size_request (darea, 500, 500);
543 g_signal_connect (darea, "button_release_event",
544 G_CALLBACK (darea_button_release_event),
548 gtk_container_add (GTK_CONTAINER (frame), darea);
549 gtk_widget_realize (darea);
550 gtk_widget_show (darea);
551 gtk_widget_modify_bg (darea, GTK_STATE_NORMAL,
555 vbox = gtk_vbox_new (FALSE, 5);
556 gtk_box_pack_start (GTK_BOX (hbox),
560 gtk_widget_show (vbox);
562 window_store = gtk_tree_store_new (1, GDK_TYPE_WINDOW);
564 treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (window_store));
565 gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
566 GTK_SELECTION_SINGLE);
567 column = gtk_tree_view_column_new ();
568 gtk_tree_view_column_set_title (column, "Window");
569 renderer = gtk_cell_renderer_text_new ();
570 gtk_tree_view_column_pack_start (column, renderer, TRUE);
571 gtk_tree_view_column_set_cell_data_func (column,
576 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
579 scrolled = gtk_scrolled_window_new (NULL, NULL);
580 gtk_widget_set_size_request (scrolled, 200, 400);
581 gtk_container_add (GTK_CONTAINER (scrolled), treeview);
582 gtk_box_pack_start (GTK_BOX (vbox),
586 gtk_widget_show (scrolled);
587 gtk_widget_show (treeview);
589 table = gtk_table_new (3, 3, TRUE);
590 gtk_box_pack_start (GTK_BOX (vbox),
594 gtk_widget_show (table);
596 button = gtk_button_new ();
597 gtk_button_set_image (GTK_BUTTON (button),
598 gtk_image_new_from_stock (GTK_STOCK_GO_BACK,
599 GTK_ICON_SIZE_BUTTON));
600 g_signal_connect (button, "clicked",
601 G_CALLBACK (move_window_clicked),
602 GINT_TO_POINTER (GTK_DIR_LEFT));
603 gtk_table_attach_defaults (GTK_TABLE (table),
607 gtk_widget_show (button);
609 button = gtk_button_new ();
610 gtk_button_set_image (GTK_BUTTON (button),
611 gtk_image_new_from_stock (GTK_STOCK_GO_UP,
612 GTK_ICON_SIZE_BUTTON));
613 g_signal_connect (button, "clicked",
614 G_CALLBACK (move_window_clicked),
615 GINT_TO_POINTER (GTK_DIR_UP));
616 gtk_table_attach_defaults (GTK_TABLE (table),
620 gtk_widget_show (button);
622 button = gtk_button_new ();
623 gtk_button_set_image (GTK_BUTTON (button),
624 gtk_image_new_from_stock (GTK_STOCK_GO_FORWARD,
625 GTK_ICON_SIZE_BUTTON));
626 g_signal_connect (button, "clicked",
627 G_CALLBACK (move_window_clicked),
628 GINT_TO_POINTER (GTK_DIR_RIGHT));
629 gtk_table_attach_defaults (GTK_TABLE (table),
633 gtk_widget_show (button);
635 button = gtk_button_new ();
636 gtk_button_set_image (GTK_BUTTON (button),
637 gtk_image_new_from_stock (GTK_STOCK_GO_DOWN,
638 GTK_ICON_SIZE_BUTTON));
639 g_signal_connect (button, "clicked",
640 G_CALLBACK (move_window_clicked),
641 GINT_TO_POINTER (GTK_DIR_DOWN));
642 gtk_table_attach_defaults (GTK_TABLE (table),
646 gtk_widget_show (button);
649 button = gtk_button_new_with_label ("Raise");
650 g_signal_connect (button, "clicked",
651 G_CALLBACK (raise_window_clicked),
653 gtk_table_attach_defaults (GTK_TABLE (table),
657 gtk_widget_show (button);
659 button = gtk_button_new_with_label ("Lower");
660 g_signal_connect (button, "clicked",
661 G_CALLBACK (lower_window_clicked),
663 gtk_table_attach_defaults (GTK_TABLE (table),
667 gtk_widget_show (button);
670 button = gtk_button_new_with_label ("Smaller");
671 g_signal_connect (button, "clicked",
672 G_CALLBACK (smaller_window_clicked),
674 gtk_table_attach_defaults (GTK_TABLE (table),
678 gtk_widget_show (button);
680 button = gtk_button_new_with_label ("Larger");
681 g_signal_connect (button, "clicked",
682 G_CALLBACK (larger_window_clicked),
684 gtk_table_attach_defaults (GTK_TABLE (table),
688 gtk_widget_show (button);
690 button = gtk_button_new_with_label ("Native");
691 g_signal_connect (button, "clicked",
692 G_CALLBACK (native_window_clicked),
694 gtk_table_attach_defaults (GTK_TABLE (table),
698 gtk_widget_show (button);
701 button = gtk_button_new_with_label ("Add window");
702 gtk_box_pack_start (GTK_BOX (vbox),
706 gtk_widget_show (button);
707 g_signal_connect (button, "clicked",
708 G_CALLBACK (add_window_clicked),
711 button = gtk_button_new_with_label ("Remove window");
712 gtk_box_pack_start (GTK_BOX (vbox),
716 gtk_widget_show (button);
717 g_signal_connect (button, "clicked",
718 G_CALLBACK (remove_window_clicked),
721 button = gtk_button_new_with_label ("Save");
722 gtk_box_pack_start (GTK_BOX (vbox),
726 gtk_widget_show (button);
727 g_signal_connect (button, "clicked",
728 G_CALLBACK (save_clicked),
731 gtk_widget_show (window);
735 file = g_file_new_for_commandline_arg (argv[1]);
737 g_object_unref (file);