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