1 /* testmultidisplay.c
2 * Copyright (C) 2001 Sun Microsystems Inc.
3 * Author: Erwann Chenede <erwann.chenede@sun.com>
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, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
19 */
20
21 #include "config.h"
22 #include <gtk/gtk.h>
23
24 static GtkWidget **images;
25 static GtkWidget **vbox;
26
27 static void
hello(GtkWidget * button,char * label)28 hello (GtkWidget * button, char *label)
29 {
30 g_print ("Click from %s\n", label);
31 }
32
33 static void
show_hide(GtkWidget * button,gpointer data)34 show_hide (GtkWidget * button, gpointer data)
35 {
36 gint num_screen = GPOINTER_TO_INT (data);
37
38 static gboolean visible = TRUE;
39 if (visible)
40 {
41 gtk_widget_hide (images[num_screen]);
42 gtk_button_set_label (GTK_BUTTON (button), "Show Icon");
43 visible = FALSE;
44 }
45 else
46 {
47 gtk_widget_show (images[num_screen]);
48 gtk_button_set_label (GTK_BUTTON (button), "Hide Icon");
49 visible = TRUE;
50 }
51 }
52
53 static void
move(GtkWidget * button,GtkVBox * vbox)54 move (GtkWidget *button, GtkVBox *vbox)
55 {
56 GdkScreen *screen = gtk_widget_get_screen (button);
57 GtkWidget *toplevel = gtk_widget_get_toplevel (button);
58 GtkWidget *new_toplevel;
59 GdkDisplay *display = gdk_screen_get_display (screen);
60 gint number_of_screens = gdk_display_get_n_screens (display);
61 gint screen_num = gdk_screen_get_number (screen);
62
63 g_print ("This button is on screen %d\n", gdk_screen_get_number (screen));
64
65 new_toplevel = gtk_window_new (GTK_WINDOW_TOPLEVEL);
66
67 if ((screen_num +1) < number_of_screens)
68 gtk_window_set_screen (GTK_WINDOW (new_toplevel),
69 gdk_display_get_screen (display,
70 screen_num + 1));
71 else
72 gtk_window_set_screen (GTK_WINDOW (new_toplevel),
73 gdk_display_get_screen (display, 0));
74
75 gtk_widget_reparent (GTK_WIDGET (vbox), new_toplevel);
76 gtk_widget_destroy (toplevel);
77 gtk_widget_show_all (new_toplevel);
78 }
79
80
81 int
main(int argc,char * argv[])82 main (int argc, char *argv[])
83 {
84 GtkWidget **window;
85 GtkWidget *moving_window, *moving_button, *moving_vbox, *moving_image;
86 gint num_screen = 0;
87 gchar *displayname = NULL;
88 gint i;
89 GdkScreen **screen_list;
90 GdkDisplay *dpy;
91 GSList *ids;
92
93 gtk_init (&argc, &argv);
94
95 dpy = gdk_display_get_default ();
96 num_screen = gdk_display_get_n_screens (dpy);
97 displayname = g_strdup (gdk_display_get_name (dpy));
98 g_print ("This X Server (%s) manages %d screen(s).\n",
99 displayname, num_screen);
100 screen_list = g_new (GdkScreen *, num_screen);
101 window = g_new (GtkWidget *, num_screen);
102 images = g_new (GtkWidget *, num_screen);
103 vbox = g_new (GtkWidget *, num_screen);
104
105 ids = gtk_stock_list_ids ();
106
107 for (i = 0; i < num_screen; i++)
108 {
109 char *label = g_strdup_printf ("Screen %d", i);
110 GtkWidget *button;
111
112 screen_list[i] = gdk_display_get_screen (dpy, i);
113
114 window[i] = g_object_new (GTK_TYPE_WINDOW,
115 "screen", screen_list[i],
116 "user_data", NULL,
117 "type", GTK_WINDOW_TOPLEVEL,
118 "title", label,
119 "allow_grow", FALSE,
120 "allow_shrink", FALSE,
121 "border_width", 10, NULL,
122 NULL);
123 g_signal_connect (window[i], "destroy",
124 G_CALLBACK (gtk_main_quit), NULL);
125
126 vbox[i] = gtk_vbox_new (TRUE, 0);
127 gtk_container_add (GTK_CONTAINER (window[i]), vbox[i]);
128
129 button = g_object_new (GTK_TYPE_BUTTON,
130 "label", label,
131 "parent", vbox[i],
132 "visible", TRUE, NULL,
133 NULL);
134 g_signal_connect (button, "clicked",
135 G_CALLBACK (hello), label);
136
137 images[i] = gtk_image_new_from_stock (g_slist_nth (ids, i+1)->data,
138 GTK_ICON_SIZE_BUTTON);
139
140 gtk_container_add (GTK_CONTAINER (vbox[i]), images[i]);
141
142 button = g_object_new (GTK_TYPE_BUTTON,
143 "label", "Hide Icon",
144 "parent", vbox[i],
145 "visible", TRUE, NULL,
146 NULL);
147 g_signal_connect (button, "clicked",
148 G_CALLBACK (show_hide), GINT_TO_POINTER (i));
149 }
150
151 for (i = 0; i < num_screen; i++)
152 gtk_widget_show_all (window[i]);
153
154 moving_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
155 moving_vbox = gtk_vbox_new (TRUE, 0);
156
157 gtk_container_add (GTK_CONTAINER (moving_window), moving_vbox);
158 moving_button = g_object_new (GTK_TYPE_BUTTON,
159 "label", "Move to Next Screen",
160 "visible", TRUE,
161 NULL);
162
163 g_signal_connect (moving_button, "clicked",
164 G_CALLBACK (move), moving_vbox);
165
166 gtk_container_add (GTK_CONTAINER (moving_vbox), moving_button);
167
168 moving_image = gtk_image_new_from_stock (g_slist_nth (ids, num_screen + 2)->data,
169 GTK_ICON_SIZE_BUTTON);
170 gtk_container_add (GTK_CONTAINER (moving_vbox), moving_image);
171 gtk_widget_show_all (moving_window);
172
173 gtk_main ();
174
175 return 0;
176 }
177