]> Pileus Git - ~andy/gtk/blob - tests/testmultidisplay.c
perf/widgets.h tests/print-editor.c tests/prop-editor.h
[~andy/gtk] / tests / testmultidisplay.c
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 gchar *screen2_name = NULL;
25
26 typedef struct
27 {
28   GtkEntry *e1;
29   GtkEntry *e2;
30 }
31 MyDoubleGtkEntry;
32
33 void
34 get_screen_response (GtkDialog *dialog,
35                      gint       response_id,
36                      GtkEntry  *entry)
37 {
38   if (response_id == GTK_RESPONSE_DELETE_EVENT)
39     return;
40   g_free (screen2_name);
41   screen2_name = g_strdup (gtk_entry_get_text (entry));
42 }
43
44 void
45 entry_dialog_response (GtkDialog        *dialog,
46                        gint              response_id,
47                        MyDoubleGtkEntry *de)
48 {
49   if (response_id == GTK_RESPONSE_APPLY)
50     gtk_entry_set_text (de->e2, gtk_entry_get_text (de->e1));
51   else
52     gtk_main_quit ();
53 }
54
55 void
56 make_selection_dialog (GdkScreen * screen,
57                        GtkWidget * entry,
58                        GtkWidget * other_entry)
59 {
60   GtkWidget *window, *vbox;
61   MyDoubleGtkEntry *double_entry = g_new (MyDoubleGtkEntry, 1);
62   double_entry->e1 = GTK_ENTRY (entry);
63   double_entry->e2 = GTK_ENTRY (other_entry);
64
65   if (!screen)
66     screen = gdk_screen_get_default ();
67
68   window = gtk_widget_new (GTK_TYPE_DIALOG,
69                            "screen", screen,
70                            "user_data", NULL,
71                            "type", GTK_WINDOW_TOPLEVEL,
72                            "title", "MultiDisplay Cut & Paste",
73                            "border_width", 10, NULL);
74   g_signal_connect (window, "destroy",
75                     G_CALLBACK (gtk_main_quit), NULL);
76
77
78   vbox = gtk_widget_new (GTK_TYPE_VBOX,
79                          "border_width", 5,
80                          NULL);
81   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
82
83   gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
84   gtk_widget_grab_focus (entry);
85
86   gtk_dialog_add_buttons (GTK_DIALOG (window),
87                           GTK_STOCK_APPLY, GTK_RESPONSE_APPLY,
88                           GTK_STOCK_QUIT, GTK_RESPONSE_DELETE_EVENT,
89                           NULL);
90   gtk_dialog_set_default_response (GTK_DIALOG (window), GTK_RESPONSE_APPLY);
91
92   g_signal_connect (window, "response",
93                     G_CALLBACK (entry_dialog_response), double_entry);
94
95   gtk_widget_show_all (window);
96 }
97
98 int
99 main (int argc, char *argv[])
100 {
101   GtkWidget *dialog, *display_entry, *dialog_label;
102   GtkWidget *entry, *entry2;
103   GdkDisplay *dpy2;
104   GdkScreen *scr2 = NULL;       /* Quiet GCC */
105   gboolean correct_second_display = FALSE;
106
107   gtk_init (&argc, &argv);
108
109   if (argc == 2)
110     screen2_name = g_strdup (argv[1]);
111   
112   /* Get the second display information */
113
114   dialog = gtk_dialog_new_with_buttons ("Second Display Selection",
115                                         NULL,
116                                         GTK_DIALOG_MODAL,
117                                         GTK_STOCK_OK,
118                                         GTK_RESPONSE_OK, NULL);
119
120   gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
121   display_entry = gtk_entry_new ();
122   gtk_entry_set_activates_default (GTK_ENTRY (display_entry), TRUE);
123   dialog_label =
124     gtk_label_new ("Please enter the name of\nthe second display\n");
125
126   gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), dialog_label);
127   gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox),
128                      display_entry);
129   g_signal_connect (dialog, "response",
130                     G_CALLBACK (get_screen_response), display_entry);
131
132   gtk_widget_grab_focus (display_entry);
133   gtk_widget_show_all (GTK_BIN (dialog)->child);
134   
135   while (!correct_second_display)
136     {
137       if (screen2_name)
138         {
139           if (!g_ascii_strcasecmp (screen2_name, ""))
140             g_printerr ("No display name, reverting to default display\n");
141           
142           dpy2 = gdk_display_open (screen2_name);
143           if (dpy2)
144             {
145               scr2 = gdk_display_get_default_screen (dpy2);
146               correct_second_display = TRUE;
147             }
148           else
149             {
150               char *error_msg =
151                 g_strdup_printf  ("Can't open display :\n\t%s\nplease try another one\n",
152                                   screen2_name);
153               gtk_label_set_text (GTK_LABEL (dialog_label), error_msg);
154               g_free (error_msg);
155             }
156        }
157
158       if (!correct_second_display)
159         gtk_dialog_run (GTK_DIALOG (dialog));
160     }
161   
162   gtk_widget_destroy (dialog);
163
164   entry = gtk_widget_new (GTK_TYPE_ENTRY,
165                           "activates_default", TRUE,
166                           "visible", TRUE,
167                           NULL);
168   entry2 = gtk_widget_new (GTK_TYPE_ENTRY,
169                            "activates_default", TRUE,
170                            "visible", TRUE,
171                            NULL);
172
173   /* for default display */
174   make_selection_dialog (NULL, entry2, entry);
175   /* for selected display */
176   make_selection_dialog (scr2, entry, entry2);
177   gtk_main ();
178
179   return 0;
180 }