1
/* Metacity window types/properties demo app */
4
* Copyright (C) 2002 Havoc Pennington
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License as
8
* published by the Free Software Foundation; either version 2 of the
9
* License, or (at your option) any later version.
11
* This program is distributed in the hope that it will be useful, but
12
* WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
24
#include <X11/Xatom.h>
27
static GtkWidget* do_appwindow (void);
32
set_gdk_window_struts (GdkWindow *window,
53
XChangeProperty (GDK_WINDOW_XDISPLAY (window),
54
GDK_WINDOW_XWINDOW (window),
55
XInternAtom (GDK_WINDOW_XDISPLAY (window),
56
"_NET_WM_STRUT_PARTIAL", False),
57
XA_CARDINAL, 32, PropModeReplace,
62
on_realize_set_struts (GtkWindow *window,
70
g_return_if_fail (GTK_WIDGET_REALIZED (window));
72
left = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-left"));
73
right = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-right"));
74
top = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-top"));
75
bottom = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-bottom"));
77
set_gdk_window_struts (GTK_WIDGET (window)->window,
78
left, right, top, bottom);
82
set_gtk_window_struts (GtkWidget *window,
88
g_object_set_data (G_OBJECT (window), "meta-strut-left",
89
GINT_TO_POINTER (left));
90
g_object_set_data (G_OBJECT (window), "meta-strut-right",
91
GINT_TO_POINTER (right));
92
g_object_set_data (G_OBJECT (window), "meta-strut-top",
93
GINT_TO_POINTER (top));
94
g_object_set_data (G_OBJECT (window), "meta-strut-bottom",
95
GINT_TO_POINTER (bottom));
97
g_signal_handlers_disconnect_by_func (G_OBJECT (window),
98
on_realize_set_struts,
101
g_signal_connect_after (G_OBJECT (window),
103
G_CALLBACK (on_realize_set_struts),
106
if (GTK_WIDGET_REALIZED (window))
107
set_gdk_window_struts (GTK_WIDGET (window)->window,
108
left, right, top, bottom);
112
set_gdk_window_type (GdkWindow *window,
115
Atom atoms[2] = { None, None };
117
atoms[0] = XInternAtom (GDK_WINDOW_XDISPLAY (window),
120
XChangeProperty (GDK_WINDOW_XDISPLAY (window),
121
GDK_WINDOW_XWINDOW (window),
122
XInternAtom (GDK_WINDOW_XDISPLAY (window), "_NET_WM_WINDOW_TYPE", False),
123
XA_ATOM, 32, PropModeReplace,
129
on_realize_set_type (GtkWindow *window,
134
g_return_if_fail (GTK_WIDGET_REALIZED (window));
136
type = g_object_get_data (G_OBJECT (window), "meta-window-type");
138
g_return_if_fail (type != NULL);
140
set_gdk_window_type (GTK_WIDGET (window)->window,
145
set_gtk_window_type (GtkWindow *window,
148
g_object_set_data (G_OBJECT (window), "meta-window-type", (char*) type);
150
g_signal_handlers_disconnect_by_func (G_OBJECT (window),
154
g_signal_connect_after (G_OBJECT (window),
156
G_CALLBACK (on_realize_set_type),
159
if (GTK_WIDGET_REALIZED (window))
160
set_gdk_window_type (GTK_WIDGET (window)->window,
165
set_gdk_window_border_only (GdkWindow *window)
167
gdk_window_set_decorations (window, GDK_DECOR_BORDER);
171
on_realize_set_border_only (GtkWindow *window,
174
g_return_if_fail (GTK_WIDGET_REALIZED (window));
176
set_gdk_window_border_only (GTK_WIDGET (window)->window);
180
set_gtk_window_border_only (GtkWindow *window)
182
g_signal_handlers_disconnect_by_func (G_OBJECT (window),
183
on_realize_set_border_only,
186
g_signal_connect_after (G_OBJECT (window),
188
G_CALLBACK (on_realize_set_border_only),
191
if (GTK_WIDGET_REALIZED (window))
192
set_gdk_window_border_only (GTK_WIDGET (window)->window);
196
main (int argc, char **argv)
202
gtk_init (&argc, &argv);
205
pixbuf = gdk_pixbuf_new_from_file (METACITY_ICON_DIR"/metacity-window-demo.png",
209
list = g_list_prepend (NULL, pixbuf);
211
gtk_window_set_default_icon_list (list);
213
g_object_unref (G_OBJECT (pixbuf));
217
g_printerr ("Could not load icon: %s\n", err->message);
229
response_cb (GtkDialog *dialog,
234
make_dialog (GtkWidget *parent,
240
dialog = gtk_message_dialog_new (parent ? GTK_WINDOW (parent) : NULL,
241
GTK_DIALOG_DESTROY_WITH_PARENT,
244
parent ? "Here is a dialog %d" :
245
"Here is a dialog %d with no transient parent",
248
str = g_strdup_printf ("%d dialog", depth);
249
gtk_window_set_title (GTK_WINDOW (dialog), str);
252
gtk_dialog_add_button (GTK_DIALOG (dialog),
254
GTK_RESPONSE_ACCEPT);
256
/* Close dialog on user response */
257
g_signal_connect (G_OBJECT (dialog),
259
G_CALLBACK (response_cb),
262
g_object_set_data (G_OBJECT (dialog), "depth",
263
GINT_TO_POINTER (depth));
265
gtk_widget_show (dialog);
269
response_cb (GtkDialog *dialog,
275
case GTK_RESPONSE_ACCEPT:
276
make_dialog (GTK_WIDGET (dialog),
277
GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dialog),
282
gtk_widget_destroy (GTK_WIDGET (dialog));
288
dialog_cb (gpointer callback_data,
289
guint callback_action,
292
make_dialog (GTK_WIDGET (callback_data), 1);
296
modal_dialog_cb (gpointer callback_data,
297
guint callback_action,
302
dialog = gtk_message_dialog_new (GTK_WINDOW (callback_data),
303
GTK_DIALOG_DESTROY_WITH_PARENT,
306
"Here is a MODAL dialog");
308
set_gtk_window_type (GTK_WINDOW (dialog), "_NET_WM_WINDOW_TYPE_MODAL_DIALOG");
310
gtk_dialog_run (GTK_DIALOG (dialog));
312
gtk_widget_destroy (dialog);
316
no_parent_dialog_cb (gpointer callback_data,
317
guint callback_action,
320
make_dialog (NULL, 1);
324
utility_cb (gpointer callback_data,
325
guint callback_action,
332
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
333
set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_UTILITY");
334
gtk_window_set_title (GTK_WINDOW (window), "Utility");
336
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (callback_data));
338
vbox = gtk_vbox_new (FALSE, 0);
340
gtk_container_add (GTK_CONTAINER (window), vbox);
342
button = gtk_button_new_with_mnemonic ("_A button");
343
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
345
button = gtk_button_new_with_mnemonic ("_B button");
346
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
348
button = gtk_button_new_with_mnemonic ("_C button");
349
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
351
button = gtk_button_new_with_mnemonic ("_D button");
352
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
354
gtk_widget_show_all (window);
358
toolbar_cb (gpointer callback_data,
359
guint callback_action,
366
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
367
set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_TOOLBAR");
368
gtk_window_set_title (GTK_WINDOW (window), "Toolbar");
370
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (callback_data));
372
vbox = gtk_vbox_new (FALSE, 0);
374
gtk_container_add (GTK_CONTAINER (window), vbox);
376
label = gtk_label_new ("FIXME this needs a resize grip, etc.");
377
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
379
gtk_widget_show_all (window);
383
menu_cb (gpointer callback_data,
384
guint callback_action,
391
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
392
set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_MENU");
393
gtk_window_set_title (GTK_WINDOW (window), "Menu");
395
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (callback_data));
397
vbox = gtk_vbox_new (FALSE, 0);
399
gtk_container_add (GTK_CONTAINER (window), vbox);
401
label = gtk_label_new ("FIXME this isn't a menu.");
402
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
404
gtk_widget_show_all (window);
408
override_redirect_cb (gpointer callback_data,
409
guint callback_action,
416
window = gtk_window_new (GTK_WINDOW_POPUP);
417
gtk_window_set_title (GTK_WINDOW (window), "Override Redirect");
419
vbox = gtk_vbox_new (FALSE, 0);
421
gtk_container_add (GTK_CONTAINER (window), vbox);
423
label = gtk_label_new ("This is an override\nredirect window\nand should not be managed");
424
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
426
gtk_widget_show_all (window);
430
border_only_cb (gpointer callback_data,
431
guint callback_action,
438
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
439
set_gtk_window_border_only (GTK_WINDOW (window));
440
gtk_window_set_title (GTK_WINDOW (window), "Border only");
442
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (callback_data));
444
vbox = gtk_vbox_new (FALSE, 0);
446
gtk_container_add (GTK_CONTAINER (window), vbox);
448
label = gtk_label_new ("This window is supposed to have a border but no titlebar.");
449
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
451
gtk_widget_show_all (window);
456
changing_icon_cb (gpointer callback_data,
457
guint callback_action,
464
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
465
gtk_window_set_title (GTK_WINDOW (window), "Changing Icon");
467
vbox = gtk_vbox_new (FALSE, 0);
469
gtk_container_add (GTK_CONTAINER (window), vbox);
471
label = gtk_label_new ("This window has an icon that changes over time");
472
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
474
gtk_widget_show_all (window);
479
focus_in_event_cb (GtkWidget *window,
485
widget = GTK_WIDGET (data);
487
gtk_label_set_text (GTK_LABEL (widget), "Has focus");
494
focus_out_event_cb (GtkWidget *window,
500
widget = GTK_WIDGET (data);
502
gtk_label_set_text (GTK_LABEL (widget), "Not focused");
508
focus_label (GtkWidget *window)
512
label = gtk_label_new ("Not focused");
514
g_signal_connect (G_OBJECT (window), "focus_in_event",
515
G_CALLBACK (focus_in_event_cb), label);
517
g_signal_connect (G_OBJECT (window), "focus_out_event",
518
G_CALLBACK (focus_out_event_cb), label);
524
splashscreen_cb (gpointer callback_data,
525
guint callback_action,
532
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
533
set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_SPLASHSCREEN");
534
gtk_window_set_title (GTK_WINDOW (window), "Splashscreen");
536
vbox = gtk_vbox_new (FALSE, 0);
538
image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG);
539
gtk_box_pack_start (GTK_BOX (vbox), image, FALSE, FALSE, 0);
541
gtk_box_pack_start (GTK_BOX (vbox), focus_label (window), FALSE, FALSE, 0);
543
gtk_container_add (GTK_CONTAINER (window), vbox);
545
gtk_widget_show_all (window);
565
g_return_if_fail (type != DOCK_ALL);
572
box = gtk_vbox_new (FALSE, 0);
576
box = gtk_hbox_new (FALSE, 0);
582
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
583
set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_DOCK");
585
image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG);
586
gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 0);
588
gtk_box_pack_start (GTK_BOX (box), focus_label (window), FALSE, FALSE, 0);
590
button = gtk_button_new_with_label ("Close");
591
gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
593
g_signal_connect_swapped (G_OBJECT (button), "clicked",
594
G_CALLBACK (gtk_widget_destroy), window);
596
gtk_container_add (GTK_CONTAINER (window), box);
602
gtk_widget_set_size_request (window, DOCK_SIZE, 400);
603
gtk_window_move (GTK_WINDOW (window), 0, 000);
604
set_gtk_window_struts (window, DOCK_SIZE, 0, 0, 0);
605
gtk_window_set_title (GTK_WINDOW (window), "LeftDock");
608
gtk_widget_set_size_request (window, DOCK_SIZE, 400);
609
gtk_window_move (GTK_WINDOW (window), gdk_screen_width () - DOCK_SIZE, 200);
610
set_gtk_window_struts (window, 0, DOCK_SIZE, 0, 0);
611
gtk_window_set_title (GTK_WINDOW (window), "RightDock");
614
gtk_widget_set_size_request (window, 600, DOCK_SIZE);
615
gtk_window_move (GTK_WINDOW (window), 76, 0);
616
set_gtk_window_struts (window, 0, 0, DOCK_SIZE, 0);
617
gtk_window_set_title (GTK_WINDOW (window), "TopDock");
620
gtk_widget_set_size_request (window, 600, DOCK_SIZE);
621
gtk_window_move (GTK_WINDOW (window), 200, gdk_screen_height () - DOCK_SIZE);
622
set_gtk_window_struts (window, 0, 0, 0, DOCK_SIZE);
623
gtk_window_set_title (GTK_WINDOW (window), "BottomDock");
629
gtk_widget_show_all (window);
633
dock_cb (gpointer callback_data,
634
guint callback_action,
637
if (callback_action == DOCK_ALL)
639
make_dock (DOCK_TOP);
640
make_dock (DOCK_BOTTOM);
641
make_dock (DOCK_LEFT);
642
make_dock (DOCK_RIGHT);
646
make_dock (callback_action);
651
desktop_cb (gpointer callback_data,
652
guint callback_action,
657
GdkColor desktop_color;
659
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
660
set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_DESKTOP");
661
gtk_window_set_title (GTK_WINDOW (window), "Desktop");
662
gtk_widget_set_size_request (window,
663
gdk_screen_width (), gdk_screen_height ());
664
gtk_window_move (GTK_WINDOW (window), 0, 0);
666
desktop_color.red = 0x5144;
667
desktop_color.green = 0x75D6;
668
desktop_color.blue = 0xA699;
670
gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &desktop_color);
672
label = focus_label (window);
674
gtk_container_add (GTK_CONTAINER (window), label);
676
gtk_widget_show_all (window);
679
static GtkItemFactoryEntry menu_items[] =
681
{ "/_Windows", NULL, NULL, 0, "<Branch>" },
682
{ "/Windows/tearoff", NULL, NULL, 0, "<Tearoff>" },
683
{ "/Windows/_Dialog", "<control>d", dialog_cb, 0, NULL },
684
{ "/Windows/_Modal dialog", NULL, modal_dialog_cb, 0, NULL },
685
{ "/Windows/_Parentless dialog", NULL, no_parent_dialog_cb, 0, NULL },
686
{ "/Windows/_Utility", "<control>u", utility_cb, 0, NULL },
687
{ "/Windows/_Splashscreen", "<control>s", splashscreen_cb, 0, NULL },
688
{ "/Windows/_Top dock", NULL, dock_cb, DOCK_TOP, NULL },
689
{ "/Windows/_Bottom dock", NULL, dock_cb, DOCK_BOTTOM, NULL },
690
{ "/Windows/_Left dock", NULL, dock_cb, DOCK_LEFT, NULL },
691
{ "/Windows/_Right dock", NULL, dock_cb, DOCK_RIGHT, NULL },
692
{ "/Windows/_All docks", NULL, dock_cb, DOCK_ALL, NULL },
693
{ "/Windows/Des_ktop", NULL, desktop_cb, 0, NULL },
694
{ "/Windows/Me_nu", NULL, menu_cb, 0, NULL },
695
{ "/Windows/Tool_bar", NULL, toolbar_cb, 0, NULL },
696
{ "/Windows/Override Redirect", NULL, override_redirect_cb, 0, NULL },
697
{ "/Windows/Border Only", NULL, border_only_cb, 0, NULL }
701
sleep_cb (GtkWidget *button,
708
toggle_aspect_ratio (GtkWidget *button,
717
geom.max_aspect = 65535;
721
geom.min_aspect = 1.777778;
722
geom.max_aspect = 1.777778;
725
aspect_on = !aspect_on;
727
window = gtk_widget_get_ancestor (button, GTK_TYPE_WINDOW);
729
gtk_window_set_geometry_hints (GTK_WINDOW (window),
737
toggle_decorated_cb (GtkWidget *button,
741
window = gtk_widget_get_ancestor (button, GTK_TYPE_WINDOW);
743
gtk_window_set_decorated (GTK_WINDOW (window),
744
!gtk_window_get_decorated (GTK_WINDOW (window)));
748
clicked_toolbar_cb (GtkWidget *button,
753
dialog = gtk_message_dialog_new (GTK_WINDOW (data),
754
GTK_DIALOG_DESTROY_WITH_PARENT,
757
"Clicking the toolbar buttons doesn't do anything");
759
/* Close dialog on user response */
760
g_signal_connect (G_OBJECT (dialog),
762
G_CALLBACK (gtk_widget_destroy),
765
gtk_widget_show (dialog);
769
update_statusbar (GtkTextBuffer *buffer,
770
GtkStatusbar *statusbar)
777
gtk_statusbar_pop (statusbar, 0); /* clear any previous message, underflow is allowed */
779
count = gtk_text_buffer_get_char_count (buffer);
781
gtk_text_buffer_get_iter_at_mark (buffer,
783
gtk_text_buffer_get_insert (buffer));
785
row = gtk_text_iter_get_line (&iter);
786
col = gtk_text_iter_get_line_offset (&iter);
788
msg = g_strdup_printf ("Cursor at row %d column %d - %d chars in document",
791
gtk_statusbar_push (statusbar, 0, msg);
797
mark_set_callback (GtkTextBuffer *buffer,
798
const GtkTextIter *new_location,
802
update_statusbar (buffer, GTK_STATUSBAR (data));
805
static int window_count = 0;
808
destroy_cb (GtkWidget *w, gpointer data)
811
if (window_count == 0)
821
GtkWidget *handlebox;
822
GtkWidget *statusbar;
825
GtkTextBuffer *buffer;
826
GtkAccelGroup *accel_group;
827
GtkItemFactory *item_factory;
829
/* Create the toplevel window
836
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
837
gtk_window_set_title (GTK_WINDOW (window), "Application Window");
839
g_signal_connect (G_OBJECT (window), "destroy",
840
G_CALLBACK (destroy_cb), NULL);
842
table = gtk_table_new (1, 4, FALSE);
844
gtk_container_add (GTK_CONTAINER (window), table);
846
/* Create the menubar
849
accel_group = gtk_accel_group_new ();
850
gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
851
g_object_unref (accel_group);
853
item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", accel_group);
855
/* Set up item factory to go away with the window */
856
g_object_ref (item_factory);
857
gtk_object_sink (GTK_OBJECT (item_factory));
858
g_object_set_data_full (G_OBJECT (window),
861
(GDestroyNotify) g_object_unref);
863
/* create menu items */
864
gtk_item_factory_create_items (item_factory, G_N_ELEMENTS (menu_items),
867
gtk_table_attach (GTK_TABLE (table),
868
gtk_item_factory_get_widget (item_factory, "<main>"),
869
/* X direction */ /* Y direction */
871
GTK_EXPAND | GTK_FILL, 0,
877
sw = gtk_scrolled_window_new (NULL, NULL);
879
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
880
GTK_POLICY_AUTOMATIC,
881
GTK_POLICY_AUTOMATIC);
883
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
886
gtk_table_attach (GTK_TABLE (table),
888
/* X direction */ /* Y direction */
890
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
893
gtk_window_set_default_size (GTK_WINDOW (window),
896
contents = gtk_text_view_new ();
897
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (contents),
900
gtk_container_add (GTK_CONTAINER (sw),
903
/* Create the toolbar
905
toolbar = gtk_toolbar_new ();
907
gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
909
"Open another one of these windows",
911
G_CALLBACK (do_appwindow),
912
window, /* user data for callback */
913
-1); /* -1 means "append" */
915
gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
917
"This is a demo button that locks up the demo",
919
G_CALLBACK (sleep_cb),
920
window, /* user data for callback */
921
-1); /* -1 means "append" */
923
gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
925
"This is a demo button that toggles window decorations",
927
G_CALLBACK (toggle_decorated_cb),
928
window, /* user data for callback */
929
-1); /* -1 means "append" */
931
gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
933
"This is a demo button that locks the aspect ratio using a hint",
935
G_CALLBACK (toggle_aspect_ratio),
936
contents, /* user data for callback */
937
-1); /* -1 means "append" */
939
gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
941
"This is a demo button with a 'quit' icon",
943
G_CALLBACK (clicked_toolbar_cb),
944
window, /* user data for callback */
945
-1); /* -1 means "append" */
947
handlebox = gtk_handle_box_new ();
949
gtk_container_add (GTK_CONTAINER (handlebox), toolbar);
951
gtk_table_attach (GTK_TABLE (table),
953
/* X direction */ /* Y direction */
955
GTK_EXPAND | GTK_FILL, 0,
958
/* Create statusbar */
960
statusbar = gtk_statusbar_new ();
961
gtk_table_attach (GTK_TABLE (table),
963
/* X direction */ /* Y direction */
965
GTK_EXPAND | GTK_FILL, 0,
968
/* Show text widget info in the statusbar */
969
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (contents));
971
gtk_text_buffer_set_text (buffer,
972
"This demo demonstrates various kinds of windows that "
973
"window managers and window manager themes should handle. "
974
"Be sure to tear off the menu and toolbar, those are also "
975
"a special kind of window.",
978
g_signal_connect_object (buffer,
980
G_CALLBACK (update_statusbar),
984
g_signal_connect_object (buffer,
985
"mark_set", /* cursor moved */
986
G_CALLBACK (mark_set_callback),
990
update_statusbar (buffer, GTK_STATUSBAR (statusbar));
992
gtk_widget_show_all (window);