]> Pileus Git - ~andy/gtk/blob - tests/testmultiscreen.c
Multi-screen test case form multihead branch with a few cleanups. (Get rid
[~andy/gtk] / tests / testmultiscreen.c
1 #include <gtk/gtk.h>
2
3 static GtkWidget **images;
4 static GtkWidget **vbox;
5
6 static void
7 hello (GtkWidget * button, char *label)
8 {
9   g_print ("Click from %s\n", label);
10 }
11
12 static void
13 show_hide (GtkWidget * button, gpointer data)
14 {
15   gint num_screen = GPOINTER_TO_INT (data);
16     
17   static gboolean visible = TRUE;
18   if (visible)
19     {
20       gtk_widget_hide (images[num_screen]);
21       gtk_button_set_label (GTK_BUTTON (button), "Show Icon");
22       visible = FALSE;
23     }
24   else
25     {
26       gtk_widget_show (images[num_screen]);
27       gtk_button_set_label (GTK_BUTTON (button), "Hide Icon");
28       visible = TRUE;
29     }
30 }
31
32 static void
33 move (GtkWidget *button, GtkVBox *vbox)
34 {
35   GdkScreen *screen = gtk_widget_get_screen (button);
36   GtkWidget *toplevel = gtk_widget_get_toplevel (button);
37   GtkWidget *new_toplevel;  
38   GdkDisplay *display = gdk_screen_get_display (screen);
39   gint number_of_screens = gdk_display_get_n_screens (display);
40   gint screen_num = gdk_screen_get_number (screen);
41   
42   g_print ("This button is on screen %d\n", gdk_screen_get_number (screen));
43   
44   new_toplevel = gtk_window_new (GTK_WINDOW_TOPLEVEL);
45   
46   if ((screen_num +1) < number_of_screens)
47     gtk_window_set_screen (GTK_WINDOW (new_toplevel), 
48                            gdk_display_get_screen (display,
49                                                    screen_num + 1));
50   else
51     gtk_window_set_screen (GTK_WINDOW (new_toplevel), 
52                            gdk_display_get_screen (display, 0));
53   
54   gtk_widget_reparent (GTK_WIDGET (vbox), new_toplevel);
55   gtk_widget_destroy (toplevel);
56   gtk_widget_show_all (new_toplevel);
57 }
58
59
60 int
61 main (int argc, char *argv[])
62 {
63   GtkWidget **window;
64   GtkWidget *moving_window, *moving_button, *moving_vbox, *moving_image;
65   gint num_screen = 0;
66   gchar *displayname = NULL;
67   gint i;
68   GdkScreen **screen_list;
69   GdkDisplay *dpy;
70   GSList *ids;
71   
72   gtk_init (&argc, &argv);
73
74   dpy = gdk_get_default_display ();
75   num_screen = gdk_display_get_n_screens (dpy);
76   displayname = g_strdup (gdk_display_get_name (dpy));
77   g_print ("This X Server (%s) manages %d screen(s).\n",
78            displayname, num_screen);
79   screen_list = g_new (GdkScreen *, num_screen);
80   window = g_new (GtkWidget *, num_screen);
81   images = g_new (GtkWidget *, num_screen);
82   vbox = g_new (GtkWidget *, num_screen);
83
84   ids = gtk_stock_list_ids ();
85
86   for (i = 0; i < num_screen; i++)
87     {
88       char *label = g_strdup_printf ("Screen %d", i);
89       GtkWidget *button;
90       
91       screen_list[i] = gdk_display_get_screen (dpy, i);
92
93       window[i] = gtk_widget_new (GTK_TYPE_WINDOW,
94                                   "screen", screen_list[i],
95                                   "user_data", NULL,
96                                   "type", GTK_WINDOW_TOPLEVEL,
97                                   "title", label,
98                                   "allow_grow", FALSE,
99                                   "allow_shrink", FALSE,
100                                   "border_width", 10, NULL,
101                                   NULL);
102       g_signal_connect (window[i], "destroy",
103                         G_CALLBACK (gtk_main_quit), NULL);
104
105       vbox[i] = gtk_vbox_new (TRUE, 0);
106       gtk_container_add (GTK_CONTAINER (window[i]), vbox[i]);
107
108       button = gtk_widget_new (GTK_TYPE_BUTTON,
109                                "label", label,
110                                "parent", vbox[i],
111                                "visible", TRUE, NULL,
112                                NULL);
113       g_signal_connect (button, "clicked",
114                         G_CALLBACK (hello), label);
115   
116       images[i] = gtk_image_new_from_stock (g_slist_nth (ids, i+1)->data,
117                                              GTK_ICON_SIZE_BUTTON);
118       
119       gtk_container_add (GTK_CONTAINER (vbox[i]), images[i]);
120
121       button = gtk_widget_new (GTK_TYPE_BUTTON,
122                                "label", "Hide Icon",
123                                "parent", vbox[i],
124                                "visible", TRUE, NULL,
125                                NULL);
126       g_signal_connect (button, "clicked",
127                         G_CALLBACK (show_hide), GINT_TO_POINTER (i));
128     }
129   
130   for (i = 0; i < num_screen; i++)
131     gtk_widget_show_all (window[i]);
132   
133   moving_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
134   moving_vbox = gtk_vbox_new (TRUE, 0);
135   
136   gtk_container_add (GTK_CONTAINER (moving_window), moving_vbox);
137   moving_button = gtk_widget_new (GTK_TYPE_BUTTON,
138                                   "label", "Move to Next Screen",
139                                   "visible", TRUE,
140                                   NULL);
141   
142   g_signal_connect (G_OBJECT (moving_button), "clicked", 
143                     G_CALLBACK (move), moving_vbox);
144   
145   gtk_container_add (GTK_CONTAINER (moving_vbox), moving_button);
146   
147   moving_image = gtk_image_new_from_stock (g_slist_nth (ids, num_screen + 2)->data,
148                                            GTK_ICON_SIZE_BUTTON);
149   gtk_container_add (GTK_CONTAINER (moving_vbox), moving_image);
150   gtk_widget_show_all (moving_window);
151
152   gtk_main ();
153
154   return 0;
155 }