From 087fd22c506799b896b39239664ea0aa41ba2639 Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Tue, 30 Apr 2002 23:44:14 +0000 Subject: [PATCH] Make it work, even if the window is already realized or mapped. Tue Apr 30 18:42:25 2002 Owen Taylor * gtk/gtkwindow.c (gtk_window_set_screen): Make it work, even if the window is already realized or mapped. * tests/testgtk.c: Erwann's multihead changes, slightly dumbed down. (Removed logic for pulling windows onto the current screen, people can click twice on the demo to destroy and create again.) * tests/prop-editor.c: Set the screen on the property editor if the edited object is a widget. --- ChangeLog | 1 - ChangeLog.pre-2-10 | 1 - ChangeLog.pre-2-2 | 1 - ChangeLog.pre-2-4 | 1 - ChangeLog.pre-2-6 | 1 - ChangeLog.pre-2-8 | 1 - gtk/gtkwindow.c | 31 +- tests/prop-editor.c | 8 +- tests/prop-editor.h | 4 +- tests/testgtk.c | 819 +++++++++++++++++++++++++++++++++----------- 10 files changed, 648 insertions(+), 220 deletions(-) diff --git a/ChangeLog b/ChangeLog index a600cb000f..b51f71b15a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -56,7 +56,6 @@ Tue Apr 30 14:15:14 2002 Owen Taylor * gtk/gtkfilesel.c gtk/gtkselection.c: Doc fixes. ->>>>>>> 1.3389 2002-04-30 Erwann Chenede - * gdk/x11/gdkimage-x11.c : rationalized multihead code diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index a600cb000f..b51f71b15a 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -56,7 +56,6 @@ Tue Apr 30 14:15:14 2002 Owen Taylor * gtk/gtkfilesel.c gtk/gtkselection.c: Doc fixes. ->>>>>>> 1.3389 2002-04-30 Erwann Chenede - * gdk/x11/gdkimage-x11.c : rationalized multihead code diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index a600cb000f..b51f71b15a 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -56,7 +56,6 @@ Tue Apr 30 14:15:14 2002 Owen Taylor * gtk/gtkfilesel.c gtk/gtkselection.c: Doc fixes. ->>>>>>> 1.3389 2002-04-30 Erwann Chenede - * gdk/x11/gdkimage-x11.c : rationalized multihead code diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index a600cb000f..b51f71b15a 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -56,7 +56,6 @@ Tue Apr 30 14:15:14 2002 Owen Taylor * gtk/gtkfilesel.c gtk/gtkselection.c: Doc fixes. ->>>>>>> 1.3389 2002-04-30 Erwann Chenede - * gdk/x11/gdkimage-x11.c : rationalized multihead code diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index a600cb000f..b51f71b15a 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -56,7 +56,6 @@ Tue Apr 30 14:15:14 2002 Owen Taylor * gtk/gtkfilesel.c gtk/gtkselection.c: Doc fixes. ->>>>>>> 1.3389 2002-04-30 Erwann Chenede - * gdk/x11/gdkimage-x11.c : rationalized multihead code diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index a600cb000f..b51f71b15a 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -56,7 +56,6 @@ Tue Apr 30 14:15:14 2002 Owen Taylor * gtk/gtkfilesel.c gtk/gtkselection.c: Doc fixes. ->>>>>>> 1.3389 2002-04-30 Erwann Chenede - * gdk/x11/gdkimage-x11.c : rationalized multihead code diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index e61211c237..88006793a6 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -5386,26 +5386,41 @@ gtk_window_begin_move_drag (GtkWindow *window, * @window: a #GtkWindow. * @screen: a #GtkScreen. * - * Sets the #GdkScreen where the @window will be displayed. - * This function has to be called before the @window - * object is realized otherwise it will fail. + * Sets the #GdkScreen where the @window is displayed; if + * the window is already mapped, it will be unmapped, and + * then remapped on the new screen. */ void gtk_window_set_screen (GtkWindow *window, GdkScreen *screen) { + GtkWidget *widget; + gboolean was_mapped; + g_return_if_fail (GTK_IS_WINDOW (window)); g_return_if_fail (GDK_IS_SCREEN (screen)); - if (GTK_WIDGET_REALIZED (window)) - { - g_warning ("Trying to change the window's screen while widget is visible"); - return; - } + if (screen == window->screen) + return; + + widget = GTK_WIDGET (window); + + was_mapped = GTK_WIDGET_MAPPED (widget); + + if (was_mapped) + gtk_widget_unmap (widget); + if (GTK_WIDGET_REALIZED (widget)) + gtk_widget_unrealize (widget); gtk_window_free_key_hash (window); window->screen = screen; + gtk_widget_reset_rc_styles (widget); + g_object_notify (G_OBJECT (window), "screen"); + + if (was_mapped) + gtk_widget_map (widget); } + /** * gtk_window_get_screen: * @window: a #GtkWindow. diff --git a/tests/prop-editor.c b/tests/prop-editor.c index 7b86a2a870..7da76d5143 100644 --- a/tests/prop-editor.c +++ b/tests/prop-editor.c @@ -735,7 +735,8 @@ properties_from_type (GObject *object, /* Pass zero for type if you want all properties */ GtkWidget* -create_prop_editor (GObject *object, GType type) +create_prop_editor (GObject *object, + GType type) { GtkWidget *win; GtkWidget *notebook; @@ -751,7 +752,10 @@ create_prop_editor (GObject *object, GType type) } win = gtk_window_new (GTK_WINDOW_TOPLEVEL); - + if (GTK_IS_WIDGET (object)) + gtk_window_set_screen (GTK_WINDOW (win), + gtk_widget_get_screen (GTK_WIDGET (object))); + tips = gtk_tooltips_new (); gtk_signal_connect_object (GTK_OBJECT (win), "destroy", GTK_SIGNAL_FUNC (gtk_object_destroy), GTK_OBJECT (tips)); diff --git a/tests/prop-editor.h b/tests/prop-editor.h index a39537d82b..1f86d9be11 100644 --- a/tests/prop-editor.h +++ b/tests/prop-editor.h @@ -23,8 +23,8 @@ G_BEGIN_DECLS -GtkWidget *create_prop_editor (GObject *object, - GType type); +GtkWidget *create_prop_editor (GObject *object, + GType type); G_END_DECLS diff --git a/tests/testgtk.c b/tests/testgtk.c index 997ba0c633..62c8036089 100644 --- a/tests/testgtk.c +++ b/tests/testgtk.c @@ -61,19 +61,20 @@ file_exists (const char *filename) } GtkWidget * -shape_create_icon (char *xpm_file, - gint x, - gint y, - gint px, - gint py, - gint window_type); +shape_create_icon (GdkScreen *screen, + char *xpm_file, + gint x, + gint y, + gint px, + gint py, + gint window_type); static GtkWidget * -build_option_menu (gchar *items[], - gint num_items, - gint history, - void (*func)(GtkWidget *widget, gpointer data), - gpointer data); +build_option_menu (gchar *items[], + gint num_items, + gint history, + void (*func)(GtkWidget *widget, gpointer data), + gpointer data); /* macro, structure and variables used by tree window demos */ #define DEFAULT_NUMBER_OF_ITEM 3 @@ -100,11 +101,11 @@ typedef struct sTreeButtons { /* end of tree section */ static GtkWidget * -build_option_menu (gchar *items[], - gint num_items, - gint history, - void (*func)(GtkWidget *widget, gpointer data), - gpointer data) +build_option_menu (gchar *items[], + gint num_items, + gint history, + void (*func)(GtkWidget *widget, gpointer data), + gpointer data) { GtkWidget *omenu; GtkWidget *menu; @@ -280,7 +281,7 @@ pattern_realize (GtkWidget *widget, } static void -create_big_windows (void) +create_big_windows (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *darea, *table, *scrollbar; @@ -289,7 +290,7 @@ create_big_windows (void) GtkAdjustment *vadj; static gint current_x; static gint current_y; - + if (!window) { current_x = 0; @@ -300,6 +301,9 @@ create_big_windows (void) GTK_STOCK_CLOSE, GTK_RESPONSE_NONE, NULL); + + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_window_set_default_size (GTK_WINDOW (window), 200, 300); @@ -377,7 +381,7 @@ button_window (GtkWidget *widget, } static void -create_buttons (void) +create_buttons (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *box1; @@ -389,6 +393,8 @@ create_buttons (void) if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), @@ -499,7 +505,7 @@ create_buttons (void) */ static void -create_toggle_buttons (void) +create_toggle_buttons (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *box1; @@ -510,6 +516,8 @@ create_toggle_buttons (void) if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), @@ -565,17 +573,19 @@ create_toggle_buttons (void) */ static void -create_check_buttons (void) +create_check_buttons (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *box1; GtkWidget *box2; GtkWidget *button; GtkWidget *separator; - + if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), @@ -631,7 +641,7 @@ create_check_buttons (void) */ static void -create_radio_buttons (void) +create_radio_buttons (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *box1; @@ -643,6 +653,9 @@ create_radio_buttons (void) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window); @@ -766,7 +779,7 @@ create_bbox (gint horizontal, } static void -create_button_box (void) +create_button_box (GtkWidget *widget) { static GtkWidget* window = NULL; GtkWidget *main_vbox; @@ -774,10 +787,11 @@ create_button_box (void) GtkWidget *hbox; GtkWidget *frame_horz; GtkWidget *frame_vert; - + if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget)); gtk_window_set_title (GTK_WINDOW (window), "Button Boxes"); gtk_signal_connect (GTK_OBJECT (window), "destroy", @@ -944,7 +958,7 @@ set_toolbar_disable (GtkWidget *widget, } static void -create_toolbar (void) +create_toolbar (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *toolbar; @@ -953,6 +967,9 @@ create_toolbar (void) if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_window_set_title (GTK_WINDOW (window), "Toolbar test"); gtk_window_set_resizable (GTK_WINDOW (window), FALSE); @@ -1198,7 +1215,7 @@ statusbar_contexts (GtkStatusbar *statusbar) } static void -create_statusbar (void) +create_statusbar (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *box1; @@ -1210,6 +1227,8 @@ create_statusbar (void) if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), @@ -1453,7 +1472,7 @@ create_subtree(GtkWidget* item, guint level, guint nb_item_max, guint recursion_ } static void -create_tree_sample(guint selection_mode, +create_tree_sample(GdkScreen *screen, guint selection_mode, guint draw_line, guint view_line, guint no_root_item, guint nb_item_max, guint recursion_level_max) { @@ -1477,6 +1496,7 @@ create_tree_sample(guint selection_mode, /* create top level window */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), screen); gtk_window_set_title(GTK_WINDOW(window), "Tree Sample"); gtk_signal_connect(GTK_OBJECT(window), "destroy", (GtkSignalFunc) cb_tree_destroy_event, NULL); @@ -1614,11 +1634,13 @@ cb_create_tree(GtkWidget* w) return; } - create_tree_sample(selection_mode, draw_line, view_line, no_root_item, nb_item, recursion_level); + create_tree_sample(gtk_widget_get_screen (w), + selection_mode, draw_line, + view_line, no_root_item, nb_item, recursion_level); } void -create_tree_mode_window(void) +create_tree_mode_window(GtkWidget *widget) { static GtkWidget* window; GtkWidget* box1; @@ -1637,6 +1659,8 @@ create_tree_mode_window(void) { /* create toplevel window */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_window_set_title(GTK_WINDOW(window), "Set Tree Parameters"); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), @@ -1830,6 +1854,9 @@ gridded_geometry_response (GtkDialog *dialog, "Reset", 1, GTK_STOCK_CLOSE, GTK_RESPONSE_NONE, NULL); + + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (GTK_WIDGET (dialog))); g_free (title); g_signal_connect (window, "response", G_CALLBACK (gridded_geometry_subresponse), geometry_string); @@ -1875,7 +1902,7 @@ gridded_geometry_response (GtkDialog *dialog, } static void -create_gridded_geometry (void) +create_gridded_geometry (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *entry; @@ -1888,6 +1915,9 @@ create_gridded_geometry (void) "Create", 1, GTK_STOCK_CLOSE, GTK_RESPONSE_NONE, NULL); + + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); label = gtk_label_new ("Geometry string:"); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label, FALSE, FALSE, 0); @@ -1922,7 +1952,7 @@ handle_box_child_signal (GtkHandleBox *hb, } static void -create_handle_box (void) +create_handle_box (GtkWidget *widget) { static GtkWidget* window = NULL; GtkWidget *handle_box; @@ -1932,10 +1962,14 @@ create_handle_box (void) GtkWidget *toolbar; GtkWidget *label; GtkWidget *separator; - + if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_window_set_title (GTK_WINDOW (window), "Handle Box Test"); gtk_window_set_resizable (GTK_WINDOW (window), FALSE); @@ -2250,7 +2284,7 @@ image_source_expose (GtkWidget *da, } static void -create_get_image (void) +create_get_image (GtkWidget *widget) { static GtkWidget *window = NULL; @@ -2269,6 +2303,9 @@ create_get_image (void) gid = g_new (struct GetImageData, 1); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (window), "destroy", @@ -2424,7 +2461,7 @@ create_selectable_control (GtkWidget *widget) return button; } -void create_labels (void) +void create_labels (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *hbox; @@ -2432,10 +2469,14 @@ void create_labels (void) GtkWidget *frame; GtkWidget *label; GtkWidget *button; - + if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window); @@ -2603,7 +2644,7 @@ set_parent_signal (GtkWidget *child, } static void -create_reparent (void) +create_reparent (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *box1; @@ -2619,6 +2660,9 @@ create_reparent (void) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window); @@ -2736,7 +2780,7 @@ uposition_stop_configure (GtkToggleButton *toggle, } static void -create_saved_position (void) +create_saved_position (GtkWidget *widget) { static GtkWidget *window = NULL; @@ -2760,6 +2804,10 @@ create_saved_position (void) "signal::configure_event", uposition_configure, NULL, NULL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window); @@ -2837,7 +2885,7 @@ create_saved_position (void) */ static void -create_pixmap (void) +create_pixmap (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *box1; @@ -2852,6 +2900,9 @@ create_pixmap (void) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window); @@ -2946,7 +2997,7 @@ tips_query_widget_selected (GtkWidget *tips_query, } static void -create_tooltips (void) +create_tooltips (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *box1; @@ -2972,6 +3023,9 @@ create_tooltips (void) "GtkWidget::width", 200, NULL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (destroy_tooltips), &window); @@ -3094,10 +3148,10 @@ pack_image (GtkWidget *box, } static void -create_image (void) +create_image (GtkWidget *widget) { static GtkWidget *window = NULL; - + if (window == NULL) { GtkWidget *vbox; @@ -3105,6 +3159,10 @@ create_image (void) GdkBitmap *mask; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + /* this is bogus for testing drawing when allocation < request, * don't copy into real code */ @@ -3143,7 +3201,7 @@ create_image (void) */ static GtkWidget* -create_menu (gint depth, gint length, gboolean tearoff) +create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff) { GtkWidget *menu; GtkWidget *menuitem; @@ -3156,6 +3214,8 @@ create_menu (gint depth, gint length, gboolean tearoff) return NULL; menu = gtk_menu_new (); + gtk_menu_set_screen (GTK_MENU (menu), screen); + group = NULL; if (tearoff) @@ -3193,14 +3253,15 @@ create_menu (gint depth, gint length, gboolean tearoff) TRUE); if (i < 5) - gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (depth - 1, 5, TRUE)); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), + create_menu (screen, depth - 1, 5, TRUE)); } return menu; } static void -create_menus (void) +create_menus (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *box1; @@ -3216,8 +3277,11 @@ create_menus (void) GtkWidget *menuitem; GtkAccelGroup *accel_group; GtkWidget *image; + GdkScreen *screen = gtk_widget_get_screen (widget); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + gtk_window_set_screen (GTK_WINDOW (window), screen); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), @@ -3241,7 +3305,7 @@ create_menus (void) gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0); gtk_widget_show (menubar); - menu = create_menu (2, 50, TRUE); + menu = create_menu (screen, 2, 50, TRUE); menuitem = gtk_menu_item_new_with_label ("test\nline2"); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu); @@ -3249,7 +3313,7 @@ create_menus (void) gtk_widget_show (menuitem); menuitem = gtk_menu_item_new_with_label ("foo"); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (3, 5, TRUE)); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE)); gtk_menu_bar_append (GTK_MENU_BAR (menubar), menuitem); gtk_widget_show (menuitem); @@ -3258,7 +3322,7 @@ create_menus (void) gtk_widget_show (image); menuitem = gtk_image_menu_item_new_with_label ("Help"); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (4, 5, TRUE)); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE)); gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE); gtk_menu_bar_append (GTK_MENU_BAR (menubar), menuitem); gtk_widget_show (menuitem); @@ -3267,7 +3331,7 @@ create_menus (void) gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0); gtk_widget_show (menubar); - menu = create_menu (2, 10, TRUE); + menu = create_menu (screen, 2, 10, TRUE); menuitem = gtk_menu_item_new_with_label ("Second menu bar"); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu); @@ -3279,7 +3343,7 @@ create_menus (void) gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0); gtk_widget_show (box2); - menu = create_menu (1, 5, FALSE); + menu = create_menu (screen, 1, 5, FALSE); gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group); @@ -3521,7 +3585,7 @@ static GtkItemFactoryEntry menu_items[] = static int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]); static void -create_item_factory (void) +create_item_factory (GtkWidget *widget) { static GtkWidget *window = NULL; @@ -3537,6 +3601,9 @@ create_item_factory (void) window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window); @@ -3625,10 +3692,10 @@ accel_button_new (GtkAccelGroup *accel_group, } static void -create_key_lookup (void) +create_key_lookup (GtkWidget *widget) { static GtkWidget *window = NULL; - + if (!window) { GtkAccelGroup *accel_group = gtk_accel_group_new (); @@ -3638,6 +3705,9 @@ create_key_lookup (void) GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + /* We have to expand it so the accel labels will draw their labels */ gtk_window_set_default_size (GTK_WINDOW (window), 300, -1); @@ -3695,6 +3765,8 @@ cmw_color (GtkWidget *widget, GtkWidget *parent) csd=gtk_color_selection_dialog_new ("This is a modal color selection dialog"); + gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent)); + gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (csd)->colorsel), TRUE); @@ -3726,6 +3798,8 @@ cmw_file (GtkWidget *widget, GtkWidget *parent) fs = gtk_file_selection_new("This is a modal file selection dialog"); + gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent)); + /* Set as modal */ gtk_window_set_modal (GTK_WINDOW(fs),TRUE); @@ -3750,7 +3824,7 @@ cmw_file (GtkWidget *widget, GtkWidget *parent) static void -create_modal_window (void) +create_modal_window (GtkWidget *widget) { GtkWidget *window = NULL; GtkWidget *box1,*box2; @@ -3758,7 +3832,10 @@ create_modal_window (void) GtkWidget *btnColor,*btnFile,*btnClose; /* Create modal window (Here you can use any window descendent )*/ - window=gtk_window_new (GTK_WINDOW_TOPLEVEL); + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_window_set_title (GTK_WINDOW(window),"This window is modal"); /* Set window as modal */ @@ -3810,7 +3887,8 @@ create_modal_window (void) */ static void -make_message_dialog (GtkWidget **dialog, +make_message_dialog (GdkScreen *screen, + GtkWidget **dialog, GtkMessageType type, GtkButtonsType buttons, guint default_response) @@ -3825,6 +3903,8 @@ make_message_dialog (GtkWidget **dialog, *dialog = gtk_message_dialog_new (NULL, 0, type, buttons, "This is a message dialog; it can wrap long lines. This is a long line. La la la. Look this line is wrapped. Blah blah blah blah blah blah. (Note: testgtk has a nonstandard gtkrc that changes some of the message dialog icons.)"); + gtk_window_set_screen (GTK_WINDOW (*dialog), screen); + gtk_signal_connect_object (GTK_OBJECT (*dialog), "response", GTK_SIGNAL_FUNC (gtk_widget_destroy), @@ -3841,17 +3921,18 @@ make_message_dialog (GtkWidget **dialog, } static void -create_message_dialog (void) +create_message_dialog (GtkWidget *widget) { static GtkWidget *info = NULL; static GtkWidget *warning = NULL; static GtkWidget *error = NULL; static GtkWidget *question = NULL; + GdkScreen *screen = gtk_widget_get_screen (widget); - make_message_dialog (&info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK); - make_message_dialog (&warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_OK); - make_message_dialog (&error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK); - make_message_dialog (&question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_YES); + make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK); + make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_OK); + make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK); + make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_YES); } /* @@ -3902,6 +3983,9 @@ scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin) { sw_parent = scrollwin->parent; sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (sw_float_parent), + gtk_widget_get_screen (widget)); + gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200); gtk_widget_reparent (scrollwin, sw_float_parent); @@ -3916,7 +4000,7 @@ scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin) } static void -create_scrolled_windows (void) +create_scrolled_windows (GtkWidget *widget) { static GtkWidget *window; GtkWidget *scrolled_window; @@ -3929,6 +4013,9 @@ create_scrolled_windows (void) { window = gtk_dialog_new (); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window); @@ -4025,7 +4112,7 @@ entry_props_clicked (GtkWidget *button, } static void -create_entry (void) +create_entry (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *box1; @@ -4052,6 +4139,8 @@ create_entry (void) cbitems = g_list_append(cbitems, "item9 item9"); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), @@ -4149,7 +4238,8 @@ size_group_vsize_changed (GtkSpinButton *spin_button, } static GtkWidget * -create_size_group_window (GtkSizeGroup *master_size_group) +create_size_group_window (GdkScreen *screen, + GtkSizeGroup *master_size_group) { GtkWidget *window; GtkWidget *table; @@ -4168,6 +4258,8 @@ create_size_group_window (GtkSizeGroup *master_size_group) GTK_RESPONSE_NONE, NULL); + gtk_window_set_screen (GTK_WINDOW (window), screen); + gtk_window_set_resizable (GTK_WINDOW (window), FALSE); gtk_signal_connect (GTK_OBJECT (window), "response", @@ -4246,7 +4338,7 @@ create_size_group_window (GtkSizeGroup *master_size_group) } static void -create_size_groups (void) +create_size_groups (GtkWidget *widget) { static GtkWidget *window1 = NULL; static GtkWidget *window2 = NULL; @@ -4254,10 +4346,11 @@ create_size_groups (void) if (!master_size_group) master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH); - + if (!window1) { - window1 = create_size_group_window (master_size_group); + window1 = create_size_group_window (gtk_widget_get_screen (widget), + master_size_group); gtk_signal_connect (GTK_OBJECT (window1), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), @@ -4266,7 +4359,8 @@ create_size_groups (void) if (!window2) { - window2 = create_size_group_window (master_size_group); + window2 = create_size_group_window (gtk_widget_get_screen (widget), + master_size_group); gtk_signal_connect (GTK_OBJECT (window2), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), @@ -4445,7 +4539,7 @@ spin_button_hex_output_func (GtkSpinButton *spin_button) } static void -create_spins (void) +create_spins (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *frame; @@ -4463,6 +4557,8 @@ create_spins (void) if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), @@ -4732,7 +4828,7 @@ set_cursor (GtkWidget *spinner, else gtk_label_set_text (GTK_LABEL (label), ""); - cursor = gdk_cursor_new (c); + cursor = gdk_cursor_new_for_screen (gtk_widget_get_screen (widget), c); gdk_window_set_cursor (widget->window, cursor); gdk_cursor_unref (cursor); } @@ -4755,7 +4851,7 @@ cursor_event (GtkWidget *widget, } static void -create_cursors (void) +create_cursors (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *frame; @@ -4772,6 +4868,8 @@ create_cursors (void) if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), @@ -4960,7 +5058,7 @@ list_toggle_sel_mode (GtkWidget *widget, gpointer data) } static void -create_list (void) +create_list (GtkWidget *widget) { static GtkWidget *window = NULL; @@ -4970,7 +5068,7 @@ create_list (void) "Browse", "Multiple" }; - + if (!window) { GtkWidget *cbox; @@ -4985,6 +5083,9 @@ create_list (void) window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window); @@ -5445,7 +5546,7 @@ clist_click_column (GtkCList *clist, gint column, gpointer data) } static void -create_clist (void) +create_clist (GtkWidget *widget) { gint i; static GtkWidget *window = NULL; @@ -5486,6 +5587,8 @@ create_clist (void) { clist_rows = 0; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window); @@ -5672,12 +5775,15 @@ create_clist (void) * GtkCTree */ -GdkPixmap *pixmap1; -GdkPixmap *pixmap2; -GdkPixmap *pixmap3; -GdkBitmap *mask1; -GdkBitmap *mask2; -GdkBitmap *mask3; +typedef struct +{ + GdkPixmap *pixmap1; + GdkPixmap *pixmap2; + GdkPixmap *pixmap3; + GdkBitmap *mask1; + GdkBitmap *mask2; + GdkBitmap *mask3; +} CTreePixmaps; static gint books = 0; static gint pages = 0; @@ -5695,6 +5801,34 @@ static GtkWidget *spin2; static GtkWidget *spin3; static gint line_style; + +static CTreePixmaps * +get_ctree_pixmaps (GtkCTree *ctree) +{ + GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (ctree)); + CTreePixmaps *pixmaps = g_object_get_data (G_OBJECT (screen), "ctree-pixmaps"); + + if (!pixmaps) + { + GdkColormap *colormap = gdk_screen_get_rgb_colormap (screen); + pixmaps = g_new (CTreePixmaps, 1); + + pixmaps->pixmap1 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, + &pixmaps->mask1, + NULL, book_closed_xpm); + pixmaps->pixmap2 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, + &pixmaps->mask2, + NULL, book_open_xpm); + pixmaps->pixmap3 = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, + &pixmaps->mask3, + NULL, mini_page_xpm); + + g_object_set_data (G_OBJECT (screen), "ctree-pixmaps", pixmaps); + } + + return pixmaps; +} + void after_press (GtkCTree *ctree, gpointer data) { char buf[80]; @@ -5869,23 +6003,26 @@ gnode2ctree (GtkCTree *ctree, GdkBitmap *mask_closed; GdkPixmap *pixmap_opened; GdkBitmap *mask_opened; + CTreePixmaps *pixmaps; if (!cnode || !gnode || (!(es = gnode->data))) return FALSE; + pixmaps = get_ctree_pixmaps (ctree); + if (es->is_leaf) { - pixmap_closed = pixmap3; - mask_closed = mask3; + pixmap_closed = pixmaps->pixmap3; + mask_closed = pixmaps->mask3; pixmap_opened = NULL; mask_opened = NULL; } else { - pixmap_closed = pixmap1; - mask_closed = mask1; - pixmap_opened = pixmap2; - mask_opened = mask2; + pixmap_closed = pixmaps->pixmap1; + mask_closed = pixmaps->mask1; + pixmap_opened = pixmaps->pixmap2; + mask_opened = pixmaps->mask2; } gtk_ctree_set_node_info (ctree, cnode, es->tree, 2, pixmap_closed, @@ -5933,6 +6070,9 @@ void export_ctree (GtkWidget *widget, GtkCTree *ctree) if (!export_window) { export_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + gtk_window_set_screen (GTK_WINDOW (export_window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (export_window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), @@ -6103,19 +6243,22 @@ void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth, gchar buf1[60]; gchar buf2[60]; GtkCTreeNode *sibling; + CTreePixmaps *pixmaps; gint i; text[0] = buf1; text[1] = buf2; sibling = NULL; + pixmaps = get_ctree_pixmaps (ctree); + for (i = num_pages + num_books; i > num_books; i--) { pages++; sprintf (buf1, "Page %02d", (gint) rand() % 100); sprintf (buf2, "Item %d-%d", cur_depth, i); sibling = gtk_ctree_insert_node (ctree, parent, sibling, text, 5, - pixmap3, mask3, NULL, NULL, + pixmaps->pixmap3, pixmaps->mask3, NULL, NULL, TRUE, FALSE); if (parent && ctree->line_style == GTK_CTREE_LINES_TABBED) @@ -6134,7 +6277,7 @@ void build_recursive (GtkCTree *ctree, gint cur_depth, gint depth, sprintf (buf1, "Book %02d", (gint) rand() % 100); sprintf (buf2, "Item %d-%d", cur_depth, i); sibling = gtk_ctree_insert_node (ctree, parent, sibling, text, 5, - pixmap1, mask1, pixmap2, mask2, + pixmaps->pixmap1, pixmaps->mask1, pixmaps->pixmap2, pixmaps->mask2, FALSE, FALSE); style = gtk_style_new (); @@ -6175,6 +6318,9 @@ void rebuild_tree (GtkWidget *widget, GtkCTree *ctree) GtkCTreeNode *parent; GtkStyle *style; guint b, d, p, n; + CTreePixmaps *pixmaps; + + pixmaps = get_ctree_pixmaps (ctree); text[0] = label1; text[1] = label2; @@ -6197,8 +6343,8 @@ void rebuild_tree (GtkWidget *widget, GtkCTree *ctree) books = 1; pages = 0; - parent = gtk_ctree_insert_node (ctree, NULL, NULL, text, 5, pixmap1, - mask1, pixmap2, mask2, FALSE, TRUE); + parent = gtk_ctree_insert_node (ctree, NULL, NULL, text, 5, pixmaps->pixmap1, + pixmaps->mask1, pixmaps->pixmap2, pixmaps->mask2, FALSE, TRUE); style = gtk_style_new (); style->base[GTK_STATE_NORMAL].red = 0; @@ -6235,7 +6381,7 @@ ctree_click_column (GtkCTree *ctree, gint column, gpointer data) gtk_ctree_sort_recursive (ctree, NULL); } -void create_ctree (void) +void create_ctree (GtkWidget *widget) { static GtkWidget *window = NULL; GtkTooltips *tooltips; @@ -6252,7 +6398,6 @@ void create_ctree (void) GtkWidget *check; GtkAdjustment *adj; GtkWidget *spinner; - GdkColor transparent = { 0 }; char *title[] = { "Tree" , "Info" }; char buf[80]; @@ -6289,6 +6434,8 @@ void create_ctree (void) if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), @@ -6503,17 +6650,7 @@ void create_ctree (void) NULL); gtk_widget_realize (window); - - if (!pixmap1) - pixmap1 = gdk_pixmap_create_from_xpm_d (window->window, &mask1, - &transparent, book_closed_xpm); - if (!pixmap2) - pixmap2 = gdk_pixmap_create_from_xpm_d (window->window, &mask2, - &transparent, book_open_xpm); - if (!pixmap3) - pixmap3 = gdk_pixmap_create_from_xpm_d (window->window, &mask3, - &transparent, mini_page_xpm); - + gtk_widget_set_usize (GTK_WIDGET (ctree), 0, 300); frame = gtk_frame_new (NULL); @@ -6645,7 +6782,7 @@ palette_toggled_cb (GtkWidget *w, } void -create_color_selection (void) +create_color_selection (GtkWidget *widget) { static GtkWidget *window = NULL; @@ -6655,6 +6792,9 @@ create_color_selection (void) GtkWidget *check_button; window = gtk_color_selection_dialog_new ("color selection dialog"); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_widget_show (GTK_COLOR_SELECTION_DIALOG (window)->help_button); gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE); @@ -6749,7 +6889,7 @@ file_selection_ok (GtkFileSelection *fs) } void -create_file_selection (void) +create_file_selection (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *button; @@ -6757,6 +6897,8 @@ create_file_selection (void) if (!window) { window = gtk_file_selection_new ("file selection dialog"); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (window)); @@ -6808,7 +6950,7 @@ flipping_toggled_cb (GtkWidget *widget, gpointer data) } void -create_flipping (void) +create_flipping (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *check_button, *button; @@ -6817,6 +6959,9 @@ create_flipping (void) { window = gtk_dialog_new (); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window); @@ -6897,10 +7042,10 @@ make_focus_table (GList **list) } static void -create_focus (void) +create_focus (GtkWidget *widget) { static GtkWidget *window = NULL; - + if (!window) { GtkWidget *table; @@ -6913,6 +7058,9 @@ create_focus (void) GTK_RESPONSE_NONE, NULL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window); @@ -6972,13 +7120,16 @@ font_selection_ok (GtkWidget *w, } void -create_font_selection (void) +create_font_selection (GtkWidget *widget) { static GtkWidget *window = NULL; if (!window) { window = gtk_font_selection_dialog_new ("Font Selection Dialog"); + + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE); @@ -7043,7 +7194,7 @@ print_response (GtkWidget *dialog, } static void -create_dialog (void) +create_dialog (GtkWidget *widget) { static GtkWidget *label; GtkWidget *button; @@ -7056,6 +7207,8 @@ create_dialog (void) */ dialog_window = gtk_dialog_new (); + gtk_window_set_screen (GTK_WINDOW (dialog_window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (dialog_window), "response", @@ -7103,6 +7256,169 @@ create_dialog (void) gtk_widget_destroy (dialog_window); } +/* Display & Screen test + */ + +typedef struct +{ + GtkEntry *entry; + GtkWidget *radio_dpy; + GtkWidget *toplevel; + GtkWidget *dialog_window; + GList *valid_display_list; +} ScreenDisplaySelection; + +static gint +display_name_cmp (gconstpointer a, + gconstpointer b) +{ + return g_ascii_strcasecmp (a,b); +} + +static void +screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data) +{ + char *display_name; + GdkDisplay *display = gtk_widget_get_display (widget); + GtkWidget *dialog; + GdkScreen *new_screen = NULL; + GdkScreen *current_screen = gtk_widget_get_screen (widget); + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy))) + { + display_name = g_strdup (gtk_entry_get_text (data->entry)); + display = gdk_open_display (display_name); + + if (!display) + { + dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + "The display :\n%s\ncannot be opened", + display_name); + gtk_window_set_screen (GTK_WINDOW (dialog), current_screen); + gtk_widget_show (dialog); + g_signal_connect (G_OBJECT (dialog), "response", + G_CALLBACK (gtk_widget_destroy), + NULL); + } + else + { + if (!g_list_find_custom (data->valid_display_list, + display_name, + display_name_cmp)) + data->valid_display_list = g_list_append (data->valid_display_list, + display_name); + + new_screen = gdk_display_get_default_screen (display); + } + } + else + { + gint number_of_screens = gdk_display_get_n_screens (display); + gint screen_num = gdk_screen_get_number (current_screen); + if ((screen_num +1) < number_of_screens) + new_screen = gdk_display_get_screen (display, screen_num + 1); + else + new_screen = gdk_display_get_screen (display, 0); + } + + if (new_screen) + { + gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen); + gtk_widget_destroy (data->dialog_window); + } +} + +void +screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data) +{ + gtk_widget_destroy (data); +} + +void +create_display_screen (GtkWidget *widget) +{ + GtkWidget *table, *frame, *window, *combo_dpy, *vbox; + GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb; + GtkWidget *bbox; + ScreenDisplaySelection *scr_dpy_data; + GdkScreen *screen = gtk_widget_get_screen (widget); + static GList *valid_display_list = NULL; + + GdkDisplay *display = gdk_screen_get_display (screen); + + window = gtk_widget_new (gtk_window_get_type (), + "screen", screen, + "user_data", NULL, + "type", GTK_WINDOW_TOPLEVEL, + "title", + "Screen or Display selection", + "border_width", 10, NULL); + g_signal_connect (G_OBJECT (window), "destroy", + G_CALLBACK (gtk_widget_destroy), NULL); + + vbox = gtk_vbox_new (FALSE, 3); + gtk_container_add (GTK_CONTAINER (window), vbox); + + frame = gtk_frame_new ("Select screen or display"); + gtk_container_add (GTK_CONTAINER (vbox), frame); + + table = gtk_table_new (2, 2, TRUE); + gtk_table_set_row_spacings (GTK_TABLE (table), 3); + gtk_table_set_col_spacings (GTK_TABLE (table), 3); + + gtk_container_add (GTK_CONTAINER (frame), table); + + radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display"); + if (gdk_display_get_n_screens(display) > 1) + radio_scr = gtk_radio_button_new_with_label + (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen"); + else + { + radio_scr = gtk_radio_button_new_with_label + (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), + "only one screen on the current display"); + gtk_widget_set_sensitive (radio_scr, FALSE); + } + combo_dpy = gtk_combo_new (); + if (!valid_display_list) + valid_display_list = g_list_append (valid_display_list, "diabolo:0.0"); + + gtk_combo_set_popdown_strings (GTK_COMBO (combo_dpy), valid_display_list); + + gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo_dpy)->entry), + ":."); + + gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1); + gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2); + gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1); + + bbox = gtk_hbutton_box_new (); + applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY); + cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL); + + gtk_container_add (GTK_CONTAINER (vbox), bbox); + + gtk_container_add (GTK_CONTAINER (bbox), applyb); + gtk_container_add (GTK_CONTAINER (bbox), cancelb); + + scr_dpy_data = g_new0 (ScreenDisplaySelection, 1); + + scr_dpy_data->entry = GTK_ENTRY (GTK_COMBO (combo_dpy)->entry); + scr_dpy_data->radio_dpy = radio_dpy; + scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget); + scr_dpy_data->dialog_window = window; + scr_dpy_data->valid_display_list = valid_display_list; + + g_signal_connect (G_OBJECT (cancelb), "clicked", + G_CALLBACK (screen_display_destroy_diag), G_OBJECT (window)); + g_signal_connect (G_OBJECT (applyb), "clicked", + G_CALLBACK (screen_display_check), scr_dpy_data); + gtk_widget_show_all (window); +} + /* Event Watcher */ static gboolean event_watcher_enter_id = 0; @@ -7154,13 +7470,15 @@ event_watcher_toggle (void) } static void -create_event_watcher (void) +create_event_watcher (GtkWidget *widget) { GtkWidget *button; if (!dialog_window) { dialog_window = gtk_dialog_new (); + gtk_window_set_screen (GTK_WINDOW (dialog_window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (dialog_window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), @@ -7213,7 +7531,7 @@ reformat_value (GtkScale *scale, } static void -create_range_controls (void) +create_range_controls (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *box1; @@ -7229,6 +7547,9 @@ create_range_controls (void) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window); @@ -7335,7 +7656,7 @@ create_range_controls (void) */ void -create_rulers (void) +create_rulers (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *table; @@ -7344,6 +7665,10 @@ create_rulers (void) if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_window_set_policy (GTK_WINDOW (window), TRUE, TRUE, FALSE); gtk_signal_connect (GTK_OBJECT (window), "destroy", @@ -7443,7 +7768,7 @@ text_insert_random (GtkWidget *w, GtkText *text) } void -create_text (void) +create_text (GtkWidget *widget) { int i, j; @@ -7462,6 +7787,9 @@ create_text (void) if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_widget_set_name (window, "text window"); gtk_widget_set_usize (window, 500, 500); gtk_window_set_policy (GTK_WINDOW(window), TRUE, TRUE, FALSE); @@ -7604,15 +7932,12 @@ create_text (void) * GtkNotebook */ -GdkPixmap *book_open; -GdkPixmap *book_closed; -GdkBitmap *book_open_mask; -GdkBitmap *book_closed_mask; +GdkPixbuf *book_open; +GdkPixbuf *book_closed; GtkWidget *sample_notebook; static void -set_page_pixmaps (GtkNotebook *notebook, gint page_num, - GdkPixmap *pixmap, GdkPixmap *mask) +set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf) { GtkWidget *page_widget; GtkWidget *pixwid; @@ -7620,10 +7945,10 @@ set_page_pixmaps (GtkNotebook *notebook, gint page_num, page_widget = gtk_notebook_get_nth_page (notebook, page_num); pixwid = gtk_object_get_data (GTK_OBJECT (page_widget), "tab_pixmap"); - gtk_pixmap_set (GTK_PIXMAP (pixwid), pixmap, mask); + gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf); pixwid = gtk_object_get_data (GTK_OBJECT (page_widget), "menu_pixmap"); - gtk_pixmap_set (GTK_PIXMAP (pixwid), pixmap, mask); + gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf); } static void @@ -7635,10 +7960,10 @@ page_switch (GtkWidget *widget, GtkNotebookPage *page, gint page_num) if (page_num == old_page_num) return; - set_page_pixmaps (notebook, page_num, book_open, book_open_mask); + set_page_image (notebook, page_num, book_open); if (old_page_num != -1) - set_page_pixmaps (notebook, old_page_num, book_closed, book_closed_mask); + set_page_image (notebook, old_page_num, book_closed); } static void @@ -7733,7 +8058,7 @@ create_pages (GtkNotebook *notebook, gint start, gint end) gtk_widget_show_all (child); label_box = gtk_hbox_new (FALSE, 0); - pixwid = gtk_pixmap_new (book_closed, book_closed_mask); + pixwid = gtk_image_new_from_pixbuf (book_closed); gtk_object_set_data (GTK_OBJECT (child), "tab_pixmap", pixwid); gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0); @@ -7744,7 +8069,7 @@ create_pages (GtkNotebook *notebook, gint start, gint end) menu_box = gtk_hbox_new (FALSE, 0); - pixwid = gtk_pixmap_new (book_closed, book_closed_mask); + pixwid = gtk_image_new_from_pixbuf (book_closed); gtk_object_set_data (GTK_OBJECT (child), "menu_pixmap", pixwid); gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0); @@ -7846,7 +8171,7 @@ notebook_homogeneous (GtkToggleButton *button, } static void -create_notebook (void) +create_notebook (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *box1; @@ -7854,7 +8179,6 @@ create_notebook (void) GtkWidget *button; GtkWidget *separator; GtkWidget *omenu; - GdkColor *transparent = NULL; GtkWidget *label; static gchar *items[] = @@ -7864,10 +8188,12 @@ create_notebook (void) "Borderless", "Scrollable" }; - + if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), @@ -7887,16 +8213,12 @@ create_notebook (void) gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10); gtk_widget_realize (sample_notebook); + if (!book_open) - book_open = gdk_pixmap_create_from_xpm_d (sample_notebook->window, - &book_open_mask, - transparent, - book_open_xpm); + book_open = gdk_pixbuf_new_from_xpm_data ((const char **)book_open_xpm); + if (!book_closed) - book_closed = gdk_pixmap_create_from_xpm_d (sample_notebook->window, - &book_closed_mask, - transparent, - book_closed_xpm); + book_closed = gdk_pixbuf_new_from_xpm_data ((const char **)book_closed_xpm); create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5); @@ -8023,7 +8345,7 @@ paned_props_clicked (GtkWidget *button, GObject *paned) { GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED); - + gtk_window_set_title (GTK_WINDOW (window), "Paned Properties"); } @@ -8098,7 +8420,7 @@ create_pane_options (GtkPaned *paned, } void -create_panes (void) +create_panes (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *frame; @@ -8111,6 +8433,9 @@ create_panes (void) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window); @@ -8176,7 +8501,7 @@ create_panes (void) */ static GtkWidget* -paned_keyboard_window1 (void) +paned_keyboard_window1 (GtkWidget *widget) { GtkWidget *window1; GtkWidget *hpaned1; @@ -8201,6 +8526,8 @@ paned_keyboard_window1 (void) window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation"); + gtk_window_set_screen (GTK_WINDOW (window1), + gtk_widget_get_screen (widget)); hpaned1 = gtk_hpaned_new (); gtk_container_add (GTK_CONTAINER (window1), hpaned1); @@ -8276,7 +8603,7 @@ paned_keyboard_window1 (void) } static GtkWidget* -paned_keyboard_window2 (void) +paned_keyboard_window2 (GtkWidget *widget) { GtkWidget *window2; GtkWidget *hpaned2; @@ -8293,6 +8620,9 @@ paned_keyboard_window2 (void) window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane"); + gtk_window_set_screen (GTK_WINDOW (window2), + gtk_widget_get_screen (widget)); + hpaned2 = gtk_hpaned_new (); gtk_container_add (GTK_CONTAINER (window2), hpaned2); @@ -8330,7 +8660,7 @@ paned_keyboard_window2 (void) } static GtkWidget* -paned_keyboard_window3 (void) +paned_keyboard_window3 (GtkWidget *widget) { GtkWidget *window3; GtkWidget *vbox2; @@ -8351,6 +8681,10 @@ paned_keyboard_window3 (void) gtk_object_set_data (GTK_OBJECT (window3), "window3", window3); gtk_window_set_title (GTK_WINDOW (window3), "Nested panes"); + gtk_window_set_screen (GTK_WINDOW (window3), + gtk_widget_get_screen (widget)); + + vbox2 = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window3), vbox2); @@ -8398,7 +8732,7 @@ paned_keyboard_window3 (void) } static GtkWidget* -paned_keyboard_window4 (void) +paned_keyboard_window4 (GtkWidget *widget) { GtkWidget *window4; GtkWidget *vbox3; @@ -8422,6 +8756,9 @@ paned_keyboard_window4 (void) gtk_object_set_data (GTK_OBJECT (window4), "window4", window4); gtk_window_set_title (GTK_WINDOW (window4), "window4"); + gtk_window_set_screen (GTK_WINDOW (window4), + gtk_widget_get_screen (widget)); + vbox3 = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window4), vbox3); @@ -8475,16 +8812,25 @@ paned_keyboard_window4 (void) } static void -create_paned_keyboard_navigation (void) +create_paned_keyboard_navigation (GtkWidget *widget) { static GtkWidget *window1 = NULL; static GtkWidget *window2 = NULL; static GtkWidget *window3 = NULL; static GtkWidget *window4 = NULL; + if (window1 && + (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget))) + { + gtk_widget_destroy (window1); + gtk_widget_destroy (window2); + gtk_widget_destroy (window3); + gtk_widget_destroy (window4); + } + if (!window1) { - window1 = paned_keyboard_window1 (); + window1 = paned_keyboard_window1 (widget); gtk_signal_connect (GTK_OBJECT (window1), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window1); @@ -8492,7 +8838,7 @@ create_paned_keyboard_navigation (void) if (!window2) { - window2 = paned_keyboard_window2 (); + window2 = paned_keyboard_window2 (widget); gtk_signal_connect (GTK_OBJECT (window2), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window2); @@ -8500,7 +8846,7 @@ create_paned_keyboard_navigation (void) if (!window3) { - window3 = paned_keyboard_window3 (); + window3 = paned_keyboard_window3 (widget); gtk_signal_connect (GTK_OBJECT (window3), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window3); @@ -8508,7 +8854,7 @@ create_paned_keyboard_navigation (void) if (!window4) { - window4 = paned_keyboard_window4 (); + window4 = paned_keyboard_window4 (widget); gtk_signal_connect (GTK_OBJECT (window4), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window4); @@ -8567,7 +8913,8 @@ static void shape_released (GtkWidget *widget) { gtk_grab_remove (widget); - gdk_pointer_ungrab (0); + gdk_display_pointer_ungrab (gtk_widget_get_display (widget), + GDK_CURRENT_TIME); } static void @@ -8589,12 +8936,13 @@ shape_motion (GtkWidget *widget, } GtkWidget * -shape_create_icon (char *xpm_file, - gint x, - gint y, - gint px, - gint py, - gint window_type) +shape_create_icon (GdkScreen *screen, + char *xpm_file, + gint x, + gint y, + gint px, + gint py, + gint window_type) { GtkWidget *window; GtkWidget *pixmap; @@ -8612,6 +8960,7 @@ shape_create_icon (char *xpm_file, * GDK_WINDOW_TOPLEVEL works also, giving you a title border */ window = gtk_window_new (window_type); + gtk_window_set_screen (GTK_WINDOW (window), screen); fixed = gtk_fixed_new (); gtk_widget_set_usize (fixed, 100,100); @@ -8655,13 +9004,14 @@ shape_create_icon (char *xpm_file, } void -create_shapes (void) +create_shapes (GtkWidget *widget) { /* Variables used by the Drag/Drop and Shape Window demos */ static GtkWidget *modeller = NULL; static GtkWidget *sheets = NULL; static GtkWidget *rings = NULL; static GtkWidget *with_region = NULL; + GdkScreen *screen = gtk_widget_get_screen (widget); if (!(file_exists ("Modeller.xpm") && file_exists ("FilesQueue.xpm") && @@ -8671,7 +9021,7 @@ create_shapes (void) if (!modeller) { - modeller = shape_create_icon ("Modeller.xpm", + modeller = shape_create_icon (screen, "Modeller.xpm", 440, 140, 0,0, GTK_WINDOW_POPUP); gtk_signal_connect (GTK_OBJECT (modeller), "destroy", @@ -8683,7 +9033,7 @@ create_shapes (void) if (!sheets) { - sheets = shape_create_icon ("FilesQueue.xpm", + sheets = shape_create_icon (screen, "FilesQueue.xpm", 580, 170, 0,0, GTK_WINDOW_POPUP); gtk_signal_connect (GTK_OBJECT (sheets), "destroy", @@ -8696,7 +9046,7 @@ create_shapes (void) if (!rings) { - rings = shape_create_icon ("3DRings.xpm", + rings = shape_create_icon (screen, "3DRings.xpm", 460, 270, 25,25, GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT (rings), "destroy", @@ -8711,7 +9061,7 @@ create_shapes (void) GdkRegion *region; gint x, y; - with_region = shape_create_icon ("3DRings.xpm", + with_region = shape_create_icon (screen, "3DRings.xpm", 460, 270, 25,25, GTK_WINDOW_TOPLEVEL); gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE); @@ -8756,7 +9106,7 @@ create_shapes (void) */ void -create_wmhints (void) +create_wmhints (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *label; @@ -8771,6 +9121,9 @@ create_wmhints (void) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window); @@ -8974,7 +9327,7 @@ get_state_controls (GtkWidget *window) } void -create_window_states (void) +create_window_states (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *label; @@ -8982,10 +9335,12 @@ create_window_states (void) GtkWidget *iconified; GtkWidget *normal; GtkWidget *controls; - + if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), @@ -8997,6 +9352,10 @@ create_window_states (void) gtk_container_add (GTK_CONTAINER (window), box1); iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + gtk_window_set_screen (GTK_WINDOW (iconified), + gtk_widget_get_screen (widget)); + gtk_signal_connect_object (GTK_OBJECT (iconified), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT (window)); @@ -9006,6 +9365,10 @@ create_window_states (void) gtk_container_add (GTK_CONTAINER (iconified), controls); normal = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + gtk_window_set_screen (GTK_WINDOW (normal), + gtk_widget_get_screen (widget)); + gtk_signal_connect_object (GTK_OBJECT (normal), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT (window)); @@ -9232,24 +9595,25 @@ get_screen_corner (GtkWindow *window, gint *y) { int w, h; + GdkScreen * screen = gtk_window_get_screen (window); gtk_window_get_size (GTK_WINDOW (window), &w, &h); switch (gtk_window_get_gravity (window)) { case GDK_GRAVITY_SOUTH_EAST: - *x = gdk_screen_width () - w; - *y = gdk_screen_height () - h; + *x = gdk_screen_get_width (screen) - w; + *y = gdk_screen_get_height (screen) - h; break; case GDK_GRAVITY_NORTH_EAST: - *x = gdk_screen_width () - w; + *x = gdk_screen_get_width (screen) - w; *y = 0; break; case GDK_GRAVITY_SOUTH_WEST: *x = 0; - *y = gdk_screen_height () - h; + *y = gdk_screen_get_height (screen) - h; break; case GDK_GRAVITY_NORTH_WEST: @@ -9258,28 +9622,28 @@ get_screen_corner (GtkWindow *window, break; case GDK_GRAVITY_SOUTH: - *x = (gdk_screen_width () - w) / 2; - *y = gdk_screen_height () - h; + *x = (gdk_screen_get_width (screen) - w) / 2; + *y = gdk_screen_get_height (screen) - h; break; case GDK_GRAVITY_NORTH: - *x = (gdk_screen_width () - w) / 2; + *x = (gdk_screen_get_width (screen) - w) / 2; *y = 0; break; case GDK_GRAVITY_WEST: *x = 0; - *y = (gdk_screen_height () - h) / 2; + *y = (gdk_screen_get_height (screen) - h) / 2; break; case GDK_GRAVITY_EAST: - *x = gdk_screen_width () - w; - *y = (gdk_screen_height () - h) / 2; + *x = gdk_screen_get_width (screen) - w; + *y = (gdk_screen_get_height (screen) - h) / 2; break; case GDK_GRAVITY_CENTER: - *x = (gdk_screen_width () - w) / 2; - *y = (gdk_screen_height () - h) / 2; + *x = (gdk_screen_get_width (screen) - w) / 2; + *y = (gdk_screen_get_height (screen) - h) / 2; break; case GDK_GRAVITY_STATIC: @@ -9321,6 +9685,9 @@ make_gravity_window (GtkWidget *destroy_with, window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (destroy_with)); + vbox = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox); @@ -9440,6 +9807,9 @@ window_controls (GtkWidget *window) control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (control_window), + gtk_widget_get_screen (window)); + gtk_window_set_title (GTK_WINDOW (control_window), "Size controls"); g_object_set_data (G_OBJECT (control_window), @@ -9680,17 +10050,18 @@ window_controls (GtkWidget *window) } void -create_window_sizing (void) +create_window_sizing (GtkWidget *widget) { static GtkWidget *window = NULL; static GtkWidget *target_window = NULL; - + if (!target_window) { GtkWidget *label; target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - + gtk_window_set_screen (GTK_WINDOW (target_window), + gtk_widget_get_screen (widget)); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), "Window being resized\nBlah blah blah blah\nblah blah blah\nblah blah blah blah blah"); gtk_container_add (GTK_CONTAINER (target_window), label); @@ -9882,7 +10253,7 @@ entry_changed (GtkWidget *widget, ProgressData *pdata) } void -create_progress_bar (void) +create_progress_bar (GtkWidget *widget) { GtkWidget *button; GtkWidget *vbox; @@ -9909,7 +10280,7 @@ create_progress_bar (void) "Continuous", "Discrete" }; - + if (!pdata) pdata = g_new0 (ProgressData, 1); @@ -9917,6 +10288,9 @@ create_progress_bar (void) { pdata->window = gtk_dialog_new (); + gtk_window_set_screen (GTK_WINDOW (pdata->window), + gtk_widget_get_screen (widget)); + gtk_window_set_policy (GTK_WINDOW (pdata->window), FALSE, FALSE, TRUE); gtk_signal_connect (GTK_OBJECT (pdata->window), "destroy", @@ -10232,14 +10606,14 @@ find_widget (GtkWidget *widget, FindWidgetData *data) } static GtkWidget * -find_widget_at_pointer (void) +find_widget_at_pointer (GdkScreen *screen) { GtkWidget *widget = NULL; GdkWindow *pointer_window; gint x, y; FindWidgetData data; - pointer_window = gdk_window_at_pointer (NULL, NULL); + pointer_window = gdk_screen_get_window_at_pointer (screen, NULL, NULL); if (pointer_window) gdk_window_get_user_data (pointer_window, (gpointer*) &widget); @@ -10307,11 +10681,16 @@ property_query_event (GtkWidget *widget, if (event->type == GDK_BUTTON_RELEASE) { gtk_grab_remove (widget); - gdk_pointer_ungrab (GDK_CURRENT_TIME); + gdk_display_pointer_ungrab (gtk_widget_get_display (widget), + GDK_CURRENT_TIME); - res_widget = find_widget_at_pointer (); + res_widget = find_widget_at_pointer (gtk_widget_get_screen (widget)); if (res_widget) - create_prop_editor (G_OBJECT (res_widget), 0); + { + g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen", + gtk_widget_get_screen (widget)); + create_prop_editor (G_OBJECT (res_widget), 0); + } data->in_query = FALSE; } @@ -10330,7 +10709,8 @@ query_properties (GtkButton *button, if (!data->cursor) - data->cursor = gdk_cursor_new (GDK_TARGET); + data->cursor = gdk_cursor_new_for_screen (gtk_widget_get_screen (GTK_WIDGET (button)), + GDK_TARGET); failure = gdk_pointer_grab (GTK_WIDGET (button)->window, TRUE, @@ -10345,7 +10725,7 @@ query_properties (GtkButton *button, } static void -create_properties (void) +create_properties (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *button; @@ -10363,6 +10743,9 @@ create_properties (void) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + data->handler = gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(destroy_properties), data); @@ -10435,7 +10818,7 @@ color_preview_destroy (GtkWidget *widget, } void -create_color_preview (void) +create_color_preview (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *preview; @@ -10444,9 +10827,10 @@ create_color_preview (void) if (!window) { - gtk_widget_push_colormap (gdk_rgb_get_cmap ()); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_pop_colormap (); + + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(color_preview_destroy), @@ -10520,7 +10904,7 @@ gray_preview_destroy (GtkWidget *widget, } void -create_gray_preview (void) +create_gray_preview (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *preview; @@ -10531,6 +10915,9 @@ create_gray_preview (void) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gray_preview_destroy), &window); @@ -10627,7 +11014,7 @@ selection_test_get_targets (GtkWidget *widget, GtkWidget *list) } void -create_selection_test (void) +create_selection_test (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *button; @@ -10639,6 +11026,9 @@ create_selection_test (void) if (!window) { window = gtk_dialog_new (); + + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), @@ -10698,17 +11088,20 @@ create_selection_test (void) */ void -create_gamma_curve (void) +create_gamma_curve (GtkWidget *widget) { static GtkWidget *window = NULL, *curve; static int count = 0; gfloat vec[256]; gint max; gint i; - + if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_window_set_title (GTK_WINDOW (window), "test"); gtk_container_set_border_width (GTK_CONTAINER (window), 10); @@ -10814,7 +11207,7 @@ scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget) void -create_scroll_test (void) +create_scroll_test (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *hbox; @@ -10824,11 +11217,14 @@ create_scroll_test (void) GtkAdjustment *adj; GdkGeometry geometry; GdkWindowHints geometry_mask; - + if (!window) { window = gtk_dialog_new (); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window); @@ -10949,7 +11345,7 @@ destroy_timeout_test (GtkWidget *widget, } void -create_timeout_test (void) +create_timeout_test (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *button; @@ -10959,6 +11355,9 @@ create_timeout_test (void) { window = gtk_dialog_new (); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(destroy_timeout_test), &window); @@ -11063,7 +11462,7 @@ toggle_idle_container (GtkObject *button, } static void -create_idle_test (void) +create_idle_test (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *button; @@ -11078,6 +11477,9 @@ create_idle_test (void) window = gtk_dialog_new (); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(destroy_idle_test), &window); @@ -11203,7 +11605,7 @@ reload_all_rc_files (void) } void -create_rc_file (void) +create_rc_file (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *button; @@ -11215,6 +11617,9 @@ create_rc_file (void) { window = gtk_dialog_new (); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(destroy_idle_test), &window); @@ -11282,7 +11687,7 @@ mainloop_destroyed (GtkWidget *w, GtkWidget **window) } void -create_mainloop (void) +create_mainloop (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *label; @@ -11292,6 +11697,9 @@ create_mainloop (void) { window = gtk_dialog_new (); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop"); gtk_signal_connect (GTK_OBJECT (window), "destroy", @@ -11362,7 +11770,7 @@ layout_expose_handler (GtkWidget *widget, GdkEventExpose *event) return FALSE; } -void create_layout (void) +void create_layout (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *layout; @@ -11376,6 +11784,9 @@ void create_layout (void) gint i, j; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window); @@ -11439,7 +11850,7 @@ void create_layout (void) } void -create_styles (void) +create_styles (GtkWidget *widget) { static GtkWidget *window = NULL; GtkWidget *label; @@ -11458,6 +11869,9 @@ create_styles (void) if (!window) { window = gtk_dialog_new (); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (widget)); + gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window); @@ -11581,6 +11995,7 @@ struct { { "ctree", create_ctree }, { "cursors", create_cursors }, { "dialog", create_dialog }, + { "display & screen", create_display_screen }, { "entry", create_entry }, { "event watcher", create_event_watcher }, { "file selection", create_file_selection },