1
/* Mutter 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);
29
static gboolean aspect_on;
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,
71
widget = GTK_WIDGET (window);
73
g_return_if_fail (gtk_widget_get_realized (widget));
75
left = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-left"));
76
right = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-right"));
77
top = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-top"));
78
bottom = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-bottom"));
80
set_gdk_window_struts (gtk_widget_get_window (widget),
81
left, right, top, bottom);
85
set_gtk_window_struts (GtkWidget *window,
93
widget = GTK_WIDGET (window);
95
g_object_set_data (G_OBJECT (window), "meta-strut-left",
96
GINT_TO_POINTER (left));
97
g_object_set_data (G_OBJECT (window), "meta-strut-right",
98
GINT_TO_POINTER (right));
99
g_object_set_data (G_OBJECT (window), "meta-strut-top",
100
GINT_TO_POINTER (top));
101
g_object_set_data (G_OBJECT (window), "meta-strut-bottom",
102
GINT_TO_POINTER (bottom));
104
g_signal_handlers_disconnect_by_func (G_OBJECT (window),
105
on_realize_set_struts,
108
g_signal_connect_after (G_OBJECT (window),
110
G_CALLBACK (on_realize_set_struts),
113
if (gtk_widget_get_realized (widget))
114
set_gdk_window_struts (gtk_widget_get_window (widget),
115
left, right, top, bottom);
119
set_gdk_window_type (GdkWindow *window,
122
Atom atoms[2] = { None, None };
124
atoms[0] = XInternAtom (GDK_WINDOW_XDISPLAY (window),
127
XChangeProperty (GDK_WINDOW_XDISPLAY (window),
128
GDK_WINDOW_XWINDOW (window),
129
XInternAtom (GDK_WINDOW_XDISPLAY (window), "_NET_WM_WINDOW_TYPE", False),
130
XA_ATOM, 32, PropModeReplace,
136
on_realize_set_type (GtkWindow *window,
142
widget = GTK_WIDGET (window);
144
g_return_if_fail (gtk_widget_get_realized (widget));
146
type = g_object_get_data (G_OBJECT (window), "meta-window-type");
148
g_return_if_fail (type != NULL);
150
set_gdk_window_type (gtk_widget_get_window (widget),
155
set_gtk_window_type (GtkWindow *window,
160
widget = GTK_WIDGET (window);
162
g_object_set_data (G_OBJECT (window), "meta-window-type", (char*) type);
164
g_signal_handlers_disconnect_by_func (G_OBJECT (window),
168
g_signal_connect_after (G_OBJECT (window),
170
G_CALLBACK (on_realize_set_type),
173
if (gtk_widget_get_realized (widget))
174
set_gdk_window_type (gtk_widget_get_window (widget),
179
set_gdk_window_border_only (GdkWindow *window)
181
gdk_window_set_decorations (window, GDK_DECOR_BORDER);
185
on_realize_set_border_only (GtkWindow *window,
190
widget = GTK_WIDGET (window);
192
g_return_if_fail (gtk_widget_get_realized (widget));
194
set_gdk_window_border_only (gtk_widget_get_window (widget));
198
set_gtk_window_border_only (GtkWindow *window)
202
widget = GTK_WIDGET (window);
204
g_signal_handlers_disconnect_by_func (G_OBJECT (window),
205
on_realize_set_border_only,
208
g_signal_connect_after (G_OBJECT (window),
210
G_CALLBACK (on_realize_set_border_only),
213
if (gtk_widget_get_realized (widget))
214
set_gdk_window_border_only (gtk_widget_get_window (widget));
218
main (int argc, char **argv)
224
gtk_init (&argc, &argv);
227
pixbuf = gdk_pixbuf_new_from_file (MUTTER_ICON_DIR"/mutter-window-demo.png",
231
list = g_list_prepend (NULL, pixbuf);
233
gtk_window_set_default_icon_list (list);
235
g_object_unref (G_OBJECT (pixbuf));
239
g_printerr ("Could not load icon: %s\n", err->message);
251
response_cb (GtkDialog *dialog,
256
make_dialog (GtkWidget *parent,
262
dialog = gtk_message_dialog_new (parent ? GTK_WINDOW (parent) : NULL,
263
GTK_DIALOG_DESTROY_WITH_PARENT,
266
parent ? "Here is a dialog %d" :
267
"Here is a dialog %d with no transient parent",
270
str = g_strdup_printf ("%d dialog", depth);
271
gtk_window_set_title (GTK_WINDOW (dialog), str);
274
gtk_dialog_add_button (GTK_DIALOG (dialog),
276
GTK_RESPONSE_ACCEPT);
278
/* Close dialog on user response */
279
g_signal_connect (G_OBJECT (dialog),
281
G_CALLBACK (response_cb),
284
g_object_set_data (G_OBJECT (dialog), "depth",
285
GINT_TO_POINTER (depth));
287
gtk_widget_show (dialog);
291
response_cb (GtkDialog *dialog,
297
case GTK_RESPONSE_ACCEPT:
298
make_dialog (GTK_WIDGET (dialog),
299
GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dialog),
304
gtk_widget_destroy (GTK_WIDGET (dialog));
310
dialog_cb (GtkAction *action,
311
gpointer callback_data)
313
make_dialog (GTK_WIDGET (callback_data), 1);
317
modal_dialog_cb (GtkAction *action,
318
gpointer callback_data)
322
dialog = gtk_message_dialog_new (GTK_WINDOW (callback_data),
323
GTK_DIALOG_DESTROY_WITH_PARENT,
326
"Here is a MODAL dialog");
328
set_gtk_window_type (GTK_WINDOW (dialog), "_NET_WM_WINDOW_TYPE_MODAL_DIALOG");
330
gtk_dialog_run (GTK_DIALOG (dialog));
332
gtk_widget_destroy (dialog);
336
no_parent_dialog_cb (GtkAction *action,
337
gpointer callback_data)
339
make_dialog (NULL, 1);
343
utility_cb (GtkAction *action,
344
gpointer callback_data)
350
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
351
set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_UTILITY");
352
gtk_window_set_title (GTK_WINDOW (window), "Utility");
354
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (callback_data));
356
vbox = gtk_vbox_new (FALSE, 0);
358
gtk_container_add (GTK_CONTAINER (window), vbox);
360
button = gtk_button_new_with_mnemonic ("_A button");
361
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
363
button = gtk_button_new_with_mnemonic ("_B button");
364
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
366
button = gtk_button_new_with_mnemonic ("_C button");
367
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
369
button = gtk_button_new_with_mnemonic ("_D button");
370
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
372
gtk_widget_show_all (window);
376
toolbar_cb (GtkAction *action,
377
gpointer callback_data)
383
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
384
set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_TOOLBAR");
385
gtk_window_set_title (GTK_WINDOW (window), "Toolbar");
387
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (callback_data));
389
vbox = gtk_vbox_new (FALSE, 0);
391
gtk_container_add (GTK_CONTAINER (window), vbox);
393
label = gtk_label_new ("FIXME this needs a resize grip, etc.");
394
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
396
gtk_widget_show_all (window);
400
menu_cb (GtkAction *action,
401
gpointer callback_data)
407
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
408
set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_MENU");
409
gtk_window_set_title (GTK_WINDOW (window), "Menu");
411
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (callback_data));
413
vbox = gtk_vbox_new (FALSE, 0);
415
gtk_container_add (GTK_CONTAINER (window), vbox);
417
label = gtk_label_new ("FIXME this isn't a menu.");
418
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
420
gtk_widget_show_all (window);
424
override_redirect_cb (GtkAction *action,
425
gpointer callback_data)
431
window = gtk_window_new (GTK_WINDOW_POPUP);
432
gtk_window_set_title (GTK_WINDOW (window), "Override Redirect");
434
vbox = gtk_vbox_new (FALSE, 0);
436
gtk_container_add (GTK_CONTAINER (window), vbox);
438
label = gtk_label_new ("This is an override\nredirect window\nand should not be managed");
439
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
441
gtk_widget_show_all (window);
445
border_only_cb (GtkAction *action,
446
gpointer callback_data)
452
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
453
set_gtk_window_border_only (GTK_WINDOW (window));
454
gtk_window_set_title (GTK_WINDOW (window), "Border only");
456
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (callback_data));
458
vbox = gtk_vbox_new (FALSE, 0);
460
gtk_container_add (GTK_CONTAINER (window), vbox);
462
label = gtk_label_new ("This window is supposed to have a border but no titlebar.");
463
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
465
gtk_widget_show_all (window);
470
changing_icon_cb (GtkAction *action,
471
gpointer callback_data)
477
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
478
gtk_window_set_title (GTK_WINDOW (window), "Changing Icon");
480
vbox = gtk_vbox_new (FALSE, 0);
482
gtk_container_add (GTK_CONTAINER (window), vbox);
484
label = gtk_label_new ("This window has an icon that changes over time");
485
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
487
gtk_widget_show_all (window);
492
focus_in_event_cb (GtkWidget *window,
498
widget = GTK_WIDGET (data);
500
gtk_label_set_text (GTK_LABEL (widget), "Has focus");
507
focus_out_event_cb (GtkWidget *window,
513
widget = GTK_WIDGET (data);
515
gtk_label_set_text (GTK_LABEL (widget), "Not focused");
521
focus_label (GtkWidget *window)
525
label = gtk_label_new ("Not focused");
527
g_signal_connect (G_OBJECT (window), "focus_in_event",
528
G_CALLBACK (focus_in_event_cb), label);
530
g_signal_connect (G_OBJECT (window), "focus_out_event",
531
G_CALLBACK (focus_out_event_cb), label);
537
splashscreen_cb (GtkAction *action,
538
gpointer callback_data)
544
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
545
set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_SPLASHSCREEN");
546
gtk_window_set_title (GTK_WINDOW (window), "Splashscreen");
548
vbox = gtk_vbox_new (FALSE, 0);
550
image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG);
551
gtk_box_pack_start (GTK_BOX (vbox), image, FALSE, FALSE, 0);
553
gtk_box_pack_start (GTK_BOX (vbox), focus_label (window), FALSE, FALSE, 0);
555
gtk_container_add (GTK_CONTAINER (window), vbox);
557
gtk_widget_show_all (window);
577
g_return_if_fail (type != DOCK_ALL);
584
box = gtk_vbox_new (FALSE, 0);
588
box = gtk_hbox_new (FALSE, 0);
594
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
595
set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_DOCK");
597
image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG);
598
gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 0);
600
gtk_box_pack_start (GTK_BOX (box), focus_label (window), FALSE, FALSE, 0);
602
button = gtk_button_new_with_label ("Close");
603
gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
605
g_signal_connect_swapped (G_OBJECT (button), "clicked",
606
G_CALLBACK (gtk_widget_destroy), window);
608
gtk_container_add (GTK_CONTAINER (window), box);
614
gtk_widget_set_size_request (window, DOCK_SIZE, 400);
615
gtk_window_move (GTK_WINDOW (window), 0, 000);
616
set_gtk_window_struts (window, DOCK_SIZE, 0, 0, 0);
617
gtk_window_set_title (GTK_WINDOW (window), "LeftDock");
620
gtk_widget_set_size_request (window, DOCK_SIZE, 400);
621
gtk_window_move (GTK_WINDOW (window), gdk_screen_width () - DOCK_SIZE, 200);
622
set_gtk_window_struts (window, 0, DOCK_SIZE, 0, 0);
623
gtk_window_set_title (GTK_WINDOW (window), "RightDock");
626
gtk_widget_set_size_request (window, 600, DOCK_SIZE);
627
gtk_window_move (GTK_WINDOW (window), 76, 0);
628
set_gtk_window_struts (window, 0, 0, DOCK_SIZE, 0);
629
gtk_window_set_title (GTK_WINDOW (window), "TopDock");
632
gtk_widget_set_size_request (window, 600, DOCK_SIZE);
633
gtk_window_move (GTK_WINDOW (window), 200, gdk_screen_height () - DOCK_SIZE);
634
set_gtk_window_struts (window, 0, 0, 0, DOCK_SIZE);
635
gtk_window_set_title (GTK_WINDOW (window), "BottomDock");
641
gtk_widget_show_all (window);
645
dock_cb (GtkAction *action,
646
gpointer callback_data)
648
guint callback_action;
651
name = gtk_action_get_name (action);
653
if (!g_strcmp0 (name, "Top dock"))
654
callback_action = DOCK_TOP;
655
else if (!g_strcmp0 (name, "Bottom dock"))
656
callback_action = DOCK_BOTTOM;
657
else if (!g_strcmp0 (name, "Left dock"))
658
callback_action = DOCK_LEFT;
659
else if (!g_strcmp0 (name, "Right dock"))
660
callback_action = DOCK_RIGHT;
661
else if (!g_strcmp0 (name, "All docks"))
662
callback_action = DOCK_ALL;
666
if (callback_action == DOCK_ALL)
668
make_dock (DOCK_TOP);
669
make_dock (DOCK_BOTTOM);
670
make_dock (DOCK_LEFT);
671
make_dock (DOCK_RIGHT);
675
make_dock (callback_action);
680
desktop_cb (GtkAction *action,
681
gpointer callback_data)
685
GdkColor desktop_color;
687
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
688
set_gtk_window_type (GTK_WINDOW (window), "_NET_WM_WINDOW_TYPE_DESKTOP");
689
gtk_window_set_title (GTK_WINDOW (window), "Desktop");
690
gtk_widget_set_size_request (window,
691
gdk_screen_width (), gdk_screen_height ());
692
gtk_window_move (GTK_WINDOW (window), 0, 0);
694
desktop_color.red = 0x5144;
695
desktop_color.green = 0x75D6;
696
desktop_color.blue = 0xA699;
698
gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &desktop_color);
700
label = focus_label (window);
702
gtk_container_add (GTK_CONTAINER (window), label);
704
gtk_widget_show_all (window);
708
sleep_cb (GtkAction *action,
715
toggle_aspect_ratio (GtkAction *action,
720
GtkWidget *widget = GTK_WIDGET (data);
725
geom.max_aspect = 65535;
729
geom.min_aspect = 1.777778;
730
geom.max_aspect = 1.777778;
733
aspect_on = !aspect_on;
735
window = gtk_widget_get_ancestor (widget, GTK_TYPE_WINDOW);
737
gtk_window_set_geometry_hints (GTK_WINDOW (window),
745
toggle_decorated_cb (GtkWidget *button,
749
window = gtk_widget_get_ancestor (data, GTK_TYPE_WINDOW);
751
gtk_window_set_decorated (GTK_WINDOW (window),
752
!gtk_window_get_decorated (GTK_WINDOW (window)));
756
clicked_toolbar_cb (GtkWidget *button,
761
dialog = gtk_message_dialog_new (GTK_WINDOW (data),
762
GTK_DIALOG_DESTROY_WITH_PARENT,
765
"Clicking the toolbar buttons doesn't do anything");
767
/* Close dialog on user response */
768
g_signal_connect (G_OBJECT (dialog),
770
G_CALLBACK (gtk_widget_destroy),
773
gtk_widget_show (dialog);
777
update_statusbar (GtkTextBuffer *buffer,
778
GtkStatusbar *statusbar)
785
gtk_statusbar_pop (statusbar, 0); /* clear any previous message, underflow is allowed */
787
count = gtk_text_buffer_get_char_count (buffer);
789
gtk_text_buffer_get_iter_at_mark (buffer,
791
gtk_text_buffer_get_insert (buffer));
793
row = gtk_text_iter_get_line (&iter);
794
col = gtk_text_iter_get_line_offset (&iter);
796
msg = g_strdup_printf ("Cursor at row %d column %d - %d chars in document",
799
gtk_statusbar_push (statusbar, 0, msg);
805
mark_set_callback (GtkTextBuffer *buffer,
806
const GtkTextIter *new_location,
810
update_statusbar (buffer, GTK_STATUSBAR (data));
813
static int window_count = 0;
816
destroy_cb (GtkWidget *w, gpointer data)
819
if (window_count == 0)
823
static const gchar *menu_item_string =
826
"<menu name='Windows' action='Windows'>\n"
827
"<menuitem name='Dialog' action='Dialog'/>\n"
828
"<menuitem name='Modal dialog' action='Modal dialog'/>\n"
829
"<menuitem name='Parentless dialog' action='Parentless dialog'/>\n"
830
"<menuitem name='Utility' action='Utility'/>\n"
831
"<menuitem name='Splashscreen' action='Splashscreen'/>\n"
832
"<menuitem name='Top dock' action='Top dock'/>\n"
833
"<menuitem name='Bottom dock' action='Bottom dock'/>\n"
834
"<menuitem name='Left dock' action='Left dock'/>\n"
835
"<menuitem name='Right dock' action='Right dock'/>\n"
836
"<menuitem name='All docks' action='All docks'/>\n"
837
"<menuitem name='Desktop' action='Desktop'/>\n"
838
"<menuitem name='Menu' action='Menu'/>\n"
839
"<menuitem name='Toolbar' action='Toolbar'/>\n"
840
"<menuitem name='Override Redirect' action='Override Redirect'/>\n"
841
"<menuitem name='Border Only' action='Border Only'/>\n"
845
"<toolitem name='New' action='New'/>\n"
846
"<toolitem name='Lock' action='Lock'/>\n"
847
"<toolitem name='Decorations' action='Decorations'/>\n"
848
"<toolitem name='Ratio' action='Ratio'/>\n"
849
"<toolitem name='Quit' action='Quit'/>\n"
853
static const GtkActionEntry menu_items[] =
855
{ "Windows", NULL, "_Windows", NULL,
857
{ "Dialog", NULL, "_Dialog", "<control>d",
858
NULL, G_CALLBACK (dialog_cb) },
859
{ "Modal dialog", NULL, "_Modal dialog", NULL,
860
NULL, G_CALLBACK (modal_dialog_cb) },
861
{ "Parentless dialog", NULL, "_Parentless dialog", NULL,
862
NULL, G_CALLBACK (no_parent_dialog_cb) },
863
{ "Utility", NULL, "_Utility", "<control>u",
864
NULL, G_CALLBACK (utility_cb) },
865
{ "Splashscreen", NULL, "_Splashscreen", "<control>s",
866
NULL, G_CALLBACK (splashscreen_cb) },
867
{ "Top dock", NULL, "_Top dock", NULL,
868
NULL, G_CALLBACK (dock_cb) },
869
{ "Bottom dock", NULL, "_Bottom dock", NULL,
870
NULL, G_CALLBACK (dock_cb) },
871
{ "Left dock", NULL, "_Left dock", NULL,
872
NULL, G_CALLBACK (dock_cb) },
873
{ "Right dock", NULL, "_Right dock", NULL,
874
NULL, G_CALLBACK (dock_cb) },
875
{ "All docks", NULL, "_All docks", NULL,
876
NULL, G_CALLBACK (dock_cb) },
877
{ "Desktop", NULL, "Des_ktop", NULL,
878
NULL, G_CALLBACK (desktop_cb) },
879
{ "Menu", NULL, "Me_nu", NULL,
880
NULL, G_CALLBACK (menu_cb) },
881
{ "Toolbar", NULL, "Tool_bar", NULL,
882
NULL, G_CALLBACK (toolbar_cb) },
883
{ "Override Redirect", NULL, "Override Redirect", NULL,
884
NULL, G_CALLBACK (override_redirect_cb) },
885
{ "Border Only", NULL, "Border Only", NULL,
886
NULL, G_CALLBACK (border_only_cb) }
889
static const GtkActionEntry tool_items[] =
891
{ "New", GTK_STOCK_NEW, NULL, NULL,
892
"Open another one of these windows", G_CALLBACK (do_appwindow) },
893
{ "Lock", GTK_STOCK_OPEN, NULL, NULL,
894
"This is a demo button that"
895
" locks up the demo", G_CALLBACK (sleep_cb) },
896
{ "Decorations", GTK_STOCK_OPEN, NULL, NULL,
897
"This is a demo button that "
898
"toggles window decorations", G_CALLBACK (toggle_decorated_cb) },
899
{ "Quit", GTK_STOCK_QUIT, NULL, NULL,
900
"This is a demo button with "
901
" a 'quit' icon", G_CALLBACK (clicked_toolbar_cb) },
902
{ "Ratio", GTK_STOCK_OPEN, NULL, NULL,
903
"This is a demo button that locks the aspect ratio "
904
"using a hint", G_CALLBACK (toggle_aspect_ratio) }
912
GtkWidget *handlebox;
913
GtkWidget *statusbar;
916
GtkTextBuffer *buffer;
917
GtkActionGroup *action_group;
918
GtkUIManager *ui_manager;
920
/* Create the toplevel window
927
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
928
gtk_window_set_title (GTK_WINDOW (window), "Application Window");
930
g_signal_connect (G_OBJECT (window), "destroy",
931
G_CALLBACK (destroy_cb), NULL);
933
table = gtk_table_new (1, 4, FALSE);
935
gtk_container_add (GTK_CONTAINER (window), table);
937
/* Create the menubar
940
contents = gtk_text_view_new ();
942
action_group = gtk_action_group_new ("mainmenu");
943
gtk_action_group_add_actions (action_group,
945
G_N_ELEMENTS (menu_items),
947
gtk_action_group_add_actions (action_group,
949
G_N_ELEMENTS (tool_items),
952
ui_manager = gtk_ui_manager_new ();
954
gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
956
/* create menu items */
958
gtk_ui_manager_add_ui_from_string (ui_manager, menu_item_string, -1, NULL);
960
gtk_table_attach (GTK_TABLE (table),
961
gtk_ui_manager_get_widget (ui_manager, "/ui/menubar"),
962
/* X direction */ /* Y direction */
964
GTK_EXPAND | GTK_FILL, 0,
970
sw = gtk_scrolled_window_new (NULL, NULL);
972
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
973
GTK_POLICY_AUTOMATIC,
974
GTK_POLICY_AUTOMATIC);
976
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
979
gtk_table_attach (GTK_TABLE (table),
981
/* X direction */ /* Y direction */
983
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
986
gtk_window_set_default_size (GTK_WINDOW (window),
989
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (contents),
992
gtk_container_add (GTK_CONTAINER (sw),
995
/* Create the toolbar
998
handlebox = gtk_handle_box_new ();
1000
gtk_container_add (GTK_CONTAINER (handlebox),
1001
gtk_ui_manager_get_widget (ui_manager, "/ui/toolbar"));
1003
gtk_table_attach (GTK_TABLE (table),
1005
/* X direction */ /* Y direction */
1007
GTK_EXPAND | GTK_FILL, 0,
1010
/* Create statusbar */
1012
statusbar = gtk_statusbar_new ();
1013
gtk_table_attach (GTK_TABLE (table),
1015
/* X direction */ /* Y direction */
1017
GTK_EXPAND | GTK_FILL, 0,
1020
/* Show text widget info in the statusbar */
1021
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (contents));
1023
gtk_text_buffer_set_text (buffer,
1024
"This demo demonstrates various kinds of windows that "
1025
"window managers and window manager themes should handle. "
1026
"Be sure to tear off the menu and toolbar, those are also "
1027
"a special kind of window.",
1030
g_signal_connect_object (buffer,
1032
G_CALLBACK (update_statusbar),
1036
g_signal_connect_object (buffer,
1037
"mark_set", /* cursor moved */
1038
G_CALLBACK (mark_set_callback),
1042
update_statusbar (buffer, GTK_STATUSBAR (statusbar));
1044
gtk_widget_show_all (window);
1046
g_object_unref (ui_manager);