]> Pileus Git - ~andy/gtk/blob - tests/testsocket.c
Add plug-socket tests. (Won't work worth a darn until I commit the rest of
[~andy/gtk] / tests / testsocket.c
1 #include <gtk/gtk.h>
2 #include "x11/gdkx.h"
3
4 #include <unistd.h>
5 #include <stdlib.h>
6 #include <stdio.h>
7
8 GtkWidget *window;
9 GtkWidget *vbox;
10 GtkWidget *lastsocket = NULL;
11
12 static void
13 quit_cb (gpointer        callback_data,
14          guint           callback_action,
15          GtkWidget      *widget)
16 {
17   GtkWidget *message_dialog = gtk_message_dialog_new (GTK_WINDOW (window), 0,
18                                                       GTK_MESSAGE_QUESTION,
19                                                       GTK_BUTTONS_YES_NO,
20                                                       "Really Quit?");
21   gtk_dialog_set_default_response (GTK_DIALOG (message_dialog), GTK_RESPONSE_NO);
22
23   if (gtk_dialog_run (GTK_DIALOG (message_dialog)) == GTK_RESPONSE_YES)
24     gtk_widget_destroy (window);
25
26   gtk_widget_destroy (message_dialog);
27 }
28
29 static GtkItemFactoryEntry menu_items[] =
30 {
31   { "/_File",            NULL,         0,                     0, "<Branch>" },
32   { "/File/_Quit",       "<control>Q", quit_cb,               0 },
33 };
34
35 void
36 steal (GtkWidget *window, GtkEntry *entry)
37 {
38   guint32 xid;
39   gchar *text;
40   GtkWidget *socket;
41
42   text = gtk_entry_get_text (entry);
43
44   xid = strtol (text, NULL, 0);
45   if (xid == 0)
46     {
47       g_warning ("Invalid window id '%s'\n", text);
48       return;
49     }
50
51   socket = gtk_socket_new ();
52   gtk_box_pack_start (GTK_BOX (vbox), socket, TRUE, TRUE, 0);
53   gtk_widget_show (socket);
54
55   gtk_socket_steal (GTK_SOCKET (socket), xid);
56 }
57
58 void
59 remove_child (GtkWidget *window)
60 {
61   if(lastsocket)
62     gtk_widget_destroy (lastsocket);
63   lastsocket = NULL;
64 }
65
66 void
67 add_child (GtkWidget *window)
68 {
69   GtkWidget *socket;
70   char *argv[3] = { "./testsocket_child", NULL, NULL };
71   char buffer[20];
72   GError *error = NULL;
73
74   socket = gtk_socket_new ();
75   gtk_box_pack_start (GTK_BOX (vbox), socket, TRUE, TRUE, 0);
76   gtk_widget_show (socket);
77
78   lastsocket = socket;
79
80   sprintf(buffer, "%#lx", GDK_WINDOW_XWINDOW (socket->window));
81   argv[1] = buffer;
82   
83 #if 1
84   if (!g_spawn_async (NULL, argv, NULL, 0, NULL, NULL, NULL, &error))
85     {
86       fprintf (stderr, "Can't exec testsocket_child: %s\n", error->message);
87       exit (1);
88     }
89 #else
90   fprintf(stderr,"%s\n", buffer);
91 #endif
92 }
93
94 int
95 main (int argc, char *argv[])
96 {
97   GtkWidget *button;
98   GtkWidget *hbox;
99   GtkWidget *entry;
100   GtkItemFactory *item_factory;
101
102   gtk_init (&argc, &argv);
103
104   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
105   gtk_signal_connect (GTK_OBJECT (window), "destroy",
106                       (GtkSignalFunc) gtk_main_quit, NULL);
107   
108   gtk_window_set_title (GTK_WINDOW (window), "Socket Test");
109   gtk_container_set_border_width (GTK_CONTAINER (window), 0);
110
111   vbox = gtk_vbox_new (FALSE, 0);
112   gtk_container_add (GTK_CONTAINER (window), vbox);
113
114   item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>",
115                                        gtk_window_get_default_accel_group (GTK_WINDOW (window)));
116   gtk_item_factory_create_items (item_factory,
117                                  G_N_ELEMENTS (menu_items), menu_items,
118                                  NULL);
119       
120   gtk_box_pack_start (GTK_BOX (vbox),
121                       gtk_item_factory_get_widget (item_factory, "<main>"),
122                       FALSE, FALSE, 0);
123
124   button = gtk_button_new_with_label ("Add Child");
125   gtk_box_pack_start (GTK_BOX(vbox), button, FALSE, FALSE, 0);
126
127   gtk_signal_connect_object (GTK_OBJECT(button), "clicked",
128                              GTK_SIGNAL_FUNC(add_child),
129                              GTK_OBJECT(vbox));
130
131   button = gtk_button_new_with_label ("Remove Last Child");
132   gtk_box_pack_start (GTK_BOX(vbox), button, FALSE, FALSE, 0);
133
134   gtk_signal_connect_object (GTK_OBJECT(button), "clicked",
135                              GTK_SIGNAL_FUNC(remove_child),
136                              GTK_OBJECT(vbox));
137
138   hbox = gtk_hbox_new (FALSE, 0);
139   gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
140
141   entry = gtk_entry_new ();
142   gtk_box_pack_start (GTK_BOX(hbox), entry, FALSE, FALSE, 0);
143
144   button = gtk_button_new_with_label ("Steal");
145   gtk_box_pack_start (GTK_BOX(hbox), button, FALSE, FALSE, 0);
146
147   gtk_signal_connect (GTK_OBJECT(button), "clicked",
148                       GTK_SIGNAL_FUNC(steal),
149                       entry);
150
151   gtk_widget_show_all (window);
152
153   gtk_main ();
154
155   return 0;
156 }
157
158