]> Pileus Git - ~andy/gtk/blob - tests/testsocket_common.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / tests / testsocket_common.c
1 /* testsocket_common.c
2  * Copyright (C) 2001 Red Hat, Inc
3  * Author: Owen Taylor
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include "config.h"
20 #include <gtk/gtk.h>
21 #if defined (GDK_WINDOWING_X11)
22 #include <gtk/gtkx.h>
23 #elif defined (GDK_WINDOWING_WIN32)
24 #include "win32/gdkwin32.h"
25 #endif
26
27 enum
28 {
29   ACTION_FILE_NEW,
30   ACTION_FILE_OPEN,
31   ACTION_OK,
32   ACTION_HELP_ABOUT
33 };
34
35 static void
36 print_hello (GtkWidget *w,
37              guint      action)
38 {
39   switch (action)
40     {
41     case ACTION_FILE_NEW:
42       g_message ("File New activated");
43       break;
44     case ACTION_FILE_OPEN:
45       g_message ("File Open activated");
46       break;
47     case ACTION_OK:
48       g_message ("OK activated");
49       break;
50     case ACTION_HELP_ABOUT:
51       g_message ("Help About activated ");
52       break;
53     default:
54       g_assert_not_reached ();
55       break;
56     }
57 }
58
59 static void
60 remove_buttons (GtkWidget *widget, GtkWidget *other_button)
61 {
62   gtk_widget_destroy (other_button);
63   gtk_widget_destroy (widget);
64 }
65
66 static gboolean
67 blink_cb (gpointer data)
68 {
69   GtkWidget *widget = data;
70
71   gtk_widget_show (widget);
72   g_object_set_data (G_OBJECT (widget), "blink", NULL);
73
74   return FALSE;
75 }
76
77 static void
78 blink (GtkWidget *widget,
79        GtkWidget *window)
80 {
81   guint blink_timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (window), "blink"));
82   
83   if (!blink_timeout)
84     {
85       blink_timeout = gdk_threads_add_timeout (1000, blink_cb, window);
86       gtk_widget_hide (window);
87
88       g_object_set_data (G_OBJECT (window), "blink", GUINT_TO_POINTER (blink_timeout));
89     }
90 }
91
92 static void
93 local_destroy (GtkWidget *window)
94 {
95   guint blink_timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (window), "blink"));
96   if (blink_timeout)
97     g_source_remove (blink_timeout);
98 }
99
100 static void
101 remote_destroy (GtkWidget *window)
102 {
103   local_destroy (window);
104   gtk_main_quit ();
105 }
106
107 static void
108 add_buttons (GtkWidget *widget, GtkWidget *box)
109 {
110   GtkWidget *add_button;
111   GtkWidget *remove_button;
112
113   add_button = gtk_button_new_with_mnemonic ("_Add");
114   gtk_box_pack_start (GTK_BOX (box), add_button, TRUE, TRUE, 0);
115   gtk_widget_show (add_button);
116
117   g_signal_connect (add_button, "clicked",
118                     G_CALLBACK (add_buttons),
119                     box);
120
121   remove_button = gtk_button_new_with_mnemonic ("_Remove");
122   gtk_box_pack_start (GTK_BOX (box), remove_button, TRUE, TRUE, 0);
123   gtk_widget_show (remove_button);
124
125   g_signal_connect (remove_button, "clicked",
126                     G_CALLBACK (remove_buttons),
127                     add_button);
128 }
129
130 static GtkWidget *
131 create_combo (void)
132 {
133   GtkComboBoxText *combo;
134   GtkWidget *entry;
135
136   combo = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new_with_entry ());
137
138   gtk_combo_box_text_append_text (combo, "item0");
139   gtk_combo_box_text_append_text (combo, "item1 item1");
140   gtk_combo_box_text_append_text (combo, "item2 item2 item2");
141   gtk_combo_box_text_append_text (combo, "item3 item3 item3 item3");
142   gtk_combo_box_text_append_text (combo, "item4 item4 item4 item4 item4");
143   gtk_combo_box_text_append_text (combo, "item5 item5 item5 item5 item5 item5");
144   gtk_combo_box_text_append_text (combo, "item6 item6 item6 item6 item6");
145   gtk_combo_box_text_append_text (combo, "item7 item7 item7 item7");
146   gtk_combo_box_text_append_text (combo, "item8 item8 item8");
147   gtk_combo_box_text_append_text (combo, "item9 item9");
148
149   entry = gtk_bin_get_child (GTK_BIN (combo));
150   gtk_entry_set_text (GTK_ENTRY (entry), "hello world");
151   gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1);
152
153   return GTK_WIDGET (combo);
154 }
155
156 static GtkWidget *
157 create_menubar (GtkWindow *window)
158 {
159   GtkAccelGroup *accel_group=NULL;
160   GtkWidget *menubar;
161   GtkWidget *menuitem;
162   GtkWidget *menu;
163
164   accel_group = gtk_accel_group_new ();
165   gtk_window_add_accel_group (window, accel_group);
166
167   menubar = gtk_menu_bar_new ();
168
169   menuitem = gtk_menu_item_new_with_mnemonic ("_File");
170   gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
171   menu = gtk_menu_new ();
172   gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
173   menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, NULL);
174   g_signal_connect (menuitem, "activate", G_CALLBACK (print_hello), window);
175   gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
176   menuitem = gtk_separator_menu_item_new ();
177   gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
178   menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_QUIT, NULL);
179   g_signal_connect (menuitem, "activate", G_CALLBACK (gtk_main_quit), window);
180   gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
181
182   menuitem = gtk_menu_item_new_with_mnemonic ("O_K");
183   gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
184
185   menuitem = gtk_menu_item_new_with_mnemonic ("_Help");
186   gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
187   menu = gtk_menu_new ();
188   gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
189   menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_ABOUT, NULL);
190   g_signal_connect (menuitem, "activate", G_CALLBACK (print_hello), window);
191   gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
192
193   return menubar;
194 }
195
196 static GtkWidget *
197 create_combo_box (void)
198 {
199   GtkComboBoxText *combo_box = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new ());
200
201   gtk_combo_box_text_append_text (combo_box, "This");
202   gtk_combo_box_text_append_text (combo_box, "Is");
203   gtk_combo_box_text_append_text (combo_box, "A");
204   gtk_combo_box_text_append_text (combo_box, "ComboBox");
205   
206   return GTK_WIDGET (combo_box);
207 }
208
209 static GtkWidget *
210 create_content (GtkWindow *window, gboolean local)
211 {
212   GtkWidget *vbox;
213   GtkWidget *button;
214   GtkWidget *frame;
215
216   frame = gtk_frame_new (local? "Local" : "Remote");
217   gtk_container_set_border_width (GTK_CONTAINER (frame), 3);
218   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
219   gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
220   gtk_container_set_border_width (GTK_CONTAINER (vbox), 3);
221
222   gtk_container_add (GTK_CONTAINER (frame), vbox);
223   
224   /* Combo */
225   gtk_box_pack_start (GTK_BOX (vbox), create_combo(), TRUE, TRUE, 0);
226
227   /* Entry */
228   gtk_box_pack_start (GTK_BOX (vbox), gtk_entry_new(), TRUE, TRUE, 0);
229
230   /* Close Button */
231   button = gtk_button_new_with_mnemonic ("_Close");
232   gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
233   g_signal_connect_swapped (button, "clicked",
234                             G_CALLBACK (gtk_widget_destroy), window);
235
236   /* Blink Button */
237   button = gtk_button_new_with_mnemonic ("_Blink");
238   gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
239   g_signal_connect (button, "clicked",
240                     G_CALLBACK (blink),
241                     window);
242
243   /* Menubar */
244   gtk_box_pack_start (GTK_BOX (vbox), create_menubar (GTK_WINDOW (window)),
245                       TRUE, TRUE, 0);
246
247   /* Combo Box */
248   gtk_box_pack_start (GTK_BOX (vbox), create_combo_box (), TRUE, TRUE, 0);
249   
250   add_buttons (NULL, vbox);
251
252   return frame;
253 }
254
255 guint32
256 create_child_plug (guint32  xid,
257                    gboolean local)
258 {
259   GtkWidget *window;
260   GtkWidget *content;
261
262   window = gtk_plug_new (xid);
263
264   g_signal_connect (window, "destroy",
265                     local ? G_CALLBACK (local_destroy)
266                           : G_CALLBACK (remote_destroy),
267                     NULL);
268   gtk_container_set_border_width (GTK_CONTAINER (window), 0);
269
270   content = create_content (GTK_WINDOW (window), local);
271   
272   gtk_container_add (GTK_CONTAINER (window), content);
273
274   gtk_widget_show_all (window);
275
276   if (gtk_widget_get_realized (window))
277 #if defined (GDK_WINDOWING_X11)
278     return GDK_WINDOW_XID (gtk_widget_get_window (window));
279 #elif defined (GDK_WINDOWING_WIN32)
280     return (guint32) GDK_WINDOW_HWND (gtk_widget_get_window (window));
281 #elif defined (GDK_WINDOWING_BROADWAY)
282     return (guint32) 0; /* Child windows not supported */
283 #endif
284   else
285     return 0;
286 }