3 #if defined (GDK_WINDOWING_X11)
5 #elif defined (GDK_WINDOWING_WIN32)
6 #include "win32/gdkwin32.h"
7 #define GDK_WINDOW_XWINDOW(w) (guint)GDK_WINDOW_HWND(w)
19 GtkWidget *lastsocket = NULL;
21 extern guint32 create_child_plug (guint32 xid,
25 quit_cb (gpointer callback_data,
26 guint callback_action,
29 GtkWidget *message_dialog = gtk_message_dialog_new (GTK_WINDOW (window), 0,
33 gtk_dialog_set_default_response (GTK_DIALOG (message_dialog), GTK_RESPONSE_NO);
35 if (gtk_dialog_run (GTK_DIALOG (message_dialog)) == GTK_RESPONSE_YES)
36 gtk_widget_destroy (window);
38 gtk_widget_destroy (message_dialog);
41 static GtkItemFactoryEntry menu_items[] =
43 { "/_File", NULL, 0, 0, "<Branch>" },
44 { "/File/_Quit", "<control>Q", quit_cb, 0 },
48 steal (GtkWidget *window, GtkEntry *entry)
54 text = gtk_entry_get_text (entry);
56 xid = strtol (text, NULL, 0);
59 g_warning ("Invalid window id '%s'\n", text);
63 socket = gtk_socket_new ();
64 gtk_box_pack_start (GTK_BOX (vbox), socket, TRUE, TRUE, 0);
65 gtk_widget_show (socket);
67 gtk_socket_steal (GTK_SOCKET (socket), xid);
71 remove_child (GtkWidget *window)
74 gtk_widget_destroy (lastsocket);
79 child_read_watch (GIOChannel *channel, GIOCondition cond, gpointer data)
87 status = g_io_channel_read_line (channel, &line, NULL, &term, &error);
90 case G_IO_STATUS_NORMAL:
92 xid = strtol (line, NULL, 0);
95 fprintf (stderr, "Invalid window id '%s'\n", line);
99 GtkWidget *socket = gtk_socket_new ();
100 gtk_box_pack_start (GTK_BOX (vbox), socket, TRUE, TRUE, 0);
101 gtk_widget_show (socket);
103 gtk_socket_steal (GTK_SOCKET (socket), xid);
107 case G_IO_STATUS_AGAIN:
109 case G_IO_STATUS_EOF:
111 g_io_channel_close (channel);
113 case G_IO_STATUS_ERROR:
114 fprintf (stderr, "Error reading fd from child: %s\n", error->message);
118 g_assert_not_reached ();
125 add_child (GtkWidget *window,
129 char *argv[3] = { "./testsocket_child", NULL, NULL };
133 GError *error = NULL;
135 socket = gtk_socket_new ();
136 gtk_box_pack_start (GTK_BOX (vbox), socket, TRUE, TRUE, 0);
137 gtk_widget_show (socket);
143 sprintf(buffer, "%#lx", GDK_WINDOW_XWINDOW (socket->window));
148 if (!g_spawn_async_with_pipes (NULL, argv, NULL, 0, NULL, NULL, NULL, NULL, &out_fd, NULL, &error))
150 fprintf (stderr, "Can't exec testsocket_child: %s\n", error->message);
155 channel = g_io_channel_unix_new (out_fd);
156 g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, &error);
159 fprintf (stderr, "Error making channel non-blocking: %s\n", error->message);
163 g_io_add_watch (channel, G_IO_IN | G_IO_HUP, child_read_watch, NULL);
166 fprintf(stderr,"%s\n", buffer);
171 add_active_child (GtkWidget *window)
173 add_child (window, TRUE);
177 add_passive_child (GtkWidget *window)
179 add_child (window, FALSE);
183 add_local_child (GtkWidget *window)
187 socket = gtk_socket_new ();
188 gtk_box_pack_start (GTK_BOX (vbox), socket, TRUE, TRUE, 0);
189 gtk_widget_show (socket);
193 create_child_plug (GDK_WINDOW_XWINDOW (socket->window), TRUE);
197 main (int argc, char *argv[])
202 GtkAccelGroup *accel_group;
203 GtkItemFactory *item_factory;
205 gtk_init (&argc, &argv);
207 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
208 gtk_signal_connect (GTK_OBJECT (window), "destroy",
209 (GtkSignalFunc) gtk_main_quit, NULL);
211 gtk_window_set_title (GTK_WINDOW (window), "Socket Test");
212 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
214 vbox = gtk_vbox_new (FALSE, 0);
215 gtk_container_add (GTK_CONTAINER (window), vbox);
217 accel_group = gtk_accel_group_new ();
218 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
219 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", accel_group);
222 gtk_item_factory_create_items (item_factory,
223 G_N_ELEMENTS (menu_items), menu_items,
226 gtk_box_pack_start (GTK_BOX (vbox),
227 gtk_item_factory_get_widget (item_factory, "<main>"),
230 button = gtk_button_new_with_label ("Add Active Child");
231 gtk_box_pack_start (GTK_BOX(vbox), button, FALSE, FALSE, 0);
233 gtk_signal_connect_object (GTK_OBJECT(button), "clicked",
234 GTK_SIGNAL_FUNC(add_active_child),
237 button = gtk_button_new_with_label ("Add Passive Child");
238 gtk_box_pack_start (GTK_BOX(vbox), button, FALSE, FALSE, 0);
240 gtk_signal_connect_object (GTK_OBJECT(button), "clicked",
241 GTK_SIGNAL_FUNC(add_passive_child),
244 button = gtk_button_new_with_label ("Add Local Child");
245 gtk_box_pack_start (GTK_BOX(vbox), button, FALSE, FALSE, 0);
247 gtk_signal_connect_object (GTK_OBJECT(button), "clicked",
248 GTK_SIGNAL_FUNC(add_local_child),
251 button = gtk_button_new_with_label ("Remove Last Child");
252 gtk_box_pack_start (GTK_BOX(vbox), button, FALSE, FALSE, 0);
254 gtk_signal_connect_object (GTK_OBJECT(button), "clicked",
255 GTK_SIGNAL_FUNC(remove_child),
258 hbox = gtk_hbox_new (FALSE, 0);
259 gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
261 entry = gtk_entry_new ();
262 gtk_box_pack_start (GTK_BOX(hbox), entry, FALSE, FALSE, 0);
264 button = gtk_button_new_with_label ("Steal");
265 gtk_box_pack_start (GTK_BOX(hbox), button, FALSE, FALSE, 0);
267 gtk_signal_connect (GTK_OBJECT(button), "clicked",
268 GTK_SIGNAL_FUNC(steal),
271 gtk_widget_show_all (window);
277 g_print ("Waiting for children to exit\n");
280 g_main_iteration (TRUE);