diff options
author | Owen Taylor <otaylor@redhat.com> | 2002-08-01 23:43:13 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2002-08-01 23:43:13 +0000 |
commit | 63489392e6c1e452054eb930fa7bd493e51cba9a (patch) | |
tree | 3ad603c3bbd2ea819fa025229dd02658fa08fd0e | |
parent | 615deb3e4ad2411c61c6b5ed4c5e445218b139bf (diff) | |
download | gtk+-63489392e6c1e452054eb930fa7bd493e51cba9a.tar.gz |
New demo for window migration between different displays and screens.
Thu Aug 1 19:09:39 2002 Owen Taylor <otaylor@redhat.com>
* demos/gtk-demo/changedisplay.c: New demo for
window migration between different displays and screens.
* gtk/gtkrc.c gtkstyle.[ch]: Add
_gtk_style_init_for_settings(), so that gtkrc.c
can initialize the styles it creates for the
right display.
* gdk/gdkdisplaymanager.c (gdk_screen_get_default)
* gtk/gtksettings.c (gtk_settings_get_default)
* gtk/gtkstyle.c (gtk_style_init): Handle absence of
a default screen.
* gdk/x11/gdkmain-x11.c (_gdk_windowing_set_default_display):
Handle display == NULL.x
* gdk/gdkdisplay.c (gdk_display_dispose): Free the
event queue.
* gdk/x11/gdkevents-x11.c gdk/x11/gdkdisplay-x11.c:
Remove the event source when closing a display.
* gdk/gdkdisplay.[ch]: Add a ::closed signal, dispose()
isn't convenient enough by itself.
* gdk/x11/gdkevents-x11.c (gdk_xsettings_watch_cb):
Create foreign windows for watch windows if there isn't
an existing window, instead of installing a global filter.
* gdk/x11/gdkscreen-x11.c gdk/x11/gdkprivate-x11.h
gdk/x11/gdkevents-x11.c (_gdk_x11_events_uninit_screen):
Clean up the xsettings_client when we are done with
it.
* gdk/x11/gdkevents-x11.c (_gdk_events_init): Remove
excess call to _gdk_x11_events_init_screen()
-rw-r--r-- | ChangeLog | 39 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 39 | ||||
-rw-r--r-- | ChangeLog.pre-2-2 | 39 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 39 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 39 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 39 | ||||
-rw-r--r-- | demos/gtk-demo/Makefile.am | 1 | ||||
-rw-r--r-- | gdk/gdkdisplay.c | 38 | ||||
-rw-r--r-- | gdk/gdkdisplay.h | 5 | ||||
-rw-r--r-- | gdk/gdkdisplaymanager.c | 7 | ||||
-rw-r--r-- | gdk/gdkmarshalers.list | 1 | ||||
-rw-r--r-- | gdk/x11/gdkdisplay-x11.c | 10 | ||||
-rw-r--r-- | gdk/x11/gdkdisplay-x11.h | 2 | ||||
-rw-r--r-- | gdk/x11/gdkevents-x11.c | 37 | ||||
-rw-r--r-- | gdk/x11/gdkmain-x11.c | 5 | ||||
-rw-r--r-- | gdk/x11/gdkprivate-x11.h | 3 | ||||
-rw-r--r-- | gdk/x11/gdkscreen-x11.c | 3 | ||||
-rw-r--r-- | gtk/gtkrc.c | 24 | ||||
-rw-r--r-- | gtk/gtkrc.h | 1 | ||||
-rw-r--r-- | gtk/gtksettings.c | 10 | ||||
-rw-r--r-- | gtk/gtkstyle.c | 39 | ||||
-rw-r--r-- | gtk/gtkstyle.h | 3 |
22 files changed, 385 insertions, 38 deletions
@@ -1,3 +1,42 @@ +Thu Aug 1 19:09:39 2002 Owen Taylor <otaylor@redhat.com> + + * demos/gtk-demo/changedisplay.c: New demo for + window migration between different displays and screens. + + * gtk/gtkrc.c gtkstyle.[ch]: Add + _gtk_style_init_for_settings(), so that gtkrc.c + can initialize the styles it creates for the + right display. + + * gdk/gdkdisplaymanager.c (gdk_screen_get_default) + * gtk/gtksettings.c (gtk_settings_get_default) + * gtk/gtkstyle.c (gtk_style_init): Handle absence of + a default screen. + + * gdk/x11/gdkmain-x11.c (_gdk_windowing_set_default_display): + Handle display == NULL.x + + * gdk/gdkdisplay.c (gdk_display_dispose): Free the + event queue. + + * gdk/x11/gdkevents-x11.c gdk/x11/gdkdisplay-x11.c: + Remove the event source when closing a display. + + * gdk/gdkdisplay.[ch]: Add a ::closed signal, dispose() + isn't convenient enough by itself. + + * gdk/x11/gdkevents-x11.c (gdk_xsettings_watch_cb): + Create foreign windows for watch windows if there isn't + an existing window, instead of installing a global filter. + + * gdk/x11/gdkscreen-x11.c gdk/x11/gdkprivate-x11.h + gdk/x11/gdkevents-x11.c (_gdk_x11_events_uninit_screen): + Clean up the xsettings_client when we are done with + it. + + * gdk/x11/gdkevents-x11.c (_gdk_events_init): Remove + excess call to _gdk_x11_events_init_screen() + 2002-08-01 Sven Neumann <sven@gimp.org> Merge from stable: diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 2eaf4c4826..b2f732b092 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,42 @@ +Thu Aug 1 19:09:39 2002 Owen Taylor <otaylor@redhat.com> + + * demos/gtk-demo/changedisplay.c: New demo for + window migration between different displays and screens. + + * gtk/gtkrc.c gtkstyle.[ch]: Add + _gtk_style_init_for_settings(), so that gtkrc.c + can initialize the styles it creates for the + right display. + + * gdk/gdkdisplaymanager.c (gdk_screen_get_default) + * gtk/gtksettings.c (gtk_settings_get_default) + * gtk/gtkstyle.c (gtk_style_init): Handle absence of + a default screen. + + * gdk/x11/gdkmain-x11.c (_gdk_windowing_set_default_display): + Handle display == NULL.x + + * gdk/gdkdisplay.c (gdk_display_dispose): Free the + event queue. + + * gdk/x11/gdkevents-x11.c gdk/x11/gdkdisplay-x11.c: + Remove the event source when closing a display. + + * gdk/gdkdisplay.[ch]: Add a ::closed signal, dispose() + isn't convenient enough by itself. + + * gdk/x11/gdkevents-x11.c (gdk_xsettings_watch_cb): + Create foreign windows for watch windows if there isn't + an existing window, instead of installing a global filter. + + * gdk/x11/gdkscreen-x11.c gdk/x11/gdkprivate-x11.h + gdk/x11/gdkevents-x11.c (_gdk_x11_events_uninit_screen): + Clean up the xsettings_client when we are done with + it. + + * gdk/x11/gdkevents-x11.c (_gdk_events_init): Remove + excess call to _gdk_x11_events_init_screen() + 2002-08-01 Sven Neumann <sven@gimp.org> Merge from stable: diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 2eaf4c4826..b2f732b092 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,42 @@ +Thu Aug 1 19:09:39 2002 Owen Taylor <otaylor@redhat.com> + + * demos/gtk-demo/changedisplay.c: New demo for + window migration between different displays and screens. + + * gtk/gtkrc.c gtkstyle.[ch]: Add + _gtk_style_init_for_settings(), so that gtkrc.c + can initialize the styles it creates for the + right display. + + * gdk/gdkdisplaymanager.c (gdk_screen_get_default) + * gtk/gtksettings.c (gtk_settings_get_default) + * gtk/gtkstyle.c (gtk_style_init): Handle absence of + a default screen. + + * gdk/x11/gdkmain-x11.c (_gdk_windowing_set_default_display): + Handle display == NULL.x + + * gdk/gdkdisplay.c (gdk_display_dispose): Free the + event queue. + + * gdk/x11/gdkevents-x11.c gdk/x11/gdkdisplay-x11.c: + Remove the event source when closing a display. + + * gdk/gdkdisplay.[ch]: Add a ::closed signal, dispose() + isn't convenient enough by itself. + + * gdk/x11/gdkevents-x11.c (gdk_xsettings_watch_cb): + Create foreign windows for watch windows if there isn't + an existing window, instead of installing a global filter. + + * gdk/x11/gdkscreen-x11.c gdk/x11/gdkprivate-x11.h + gdk/x11/gdkevents-x11.c (_gdk_x11_events_uninit_screen): + Clean up the xsettings_client when we are done with + it. + + * gdk/x11/gdkevents-x11.c (_gdk_events_init): Remove + excess call to _gdk_x11_events_init_screen() + 2002-08-01 Sven Neumann <sven@gimp.org> Merge from stable: diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 2eaf4c4826..b2f732b092 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,42 @@ +Thu Aug 1 19:09:39 2002 Owen Taylor <otaylor@redhat.com> + + * demos/gtk-demo/changedisplay.c: New demo for + window migration between different displays and screens. + + * gtk/gtkrc.c gtkstyle.[ch]: Add + _gtk_style_init_for_settings(), so that gtkrc.c + can initialize the styles it creates for the + right display. + + * gdk/gdkdisplaymanager.c (gdk_screen_get_default) + * gtk/gtksettings.c (gtk_settings_get_default) + * gtk/gtkstyle.c (gtk_style_init): Handle absence of + a default screen. + + * gdk/x11/gdkmain-x11.c (_gdk_windowing_set_default_display): + Handle display == NULL.x + + * gdk/gdkdisplay.c (gdk_display_dispose): Free the + event queue. + + * gdk/x11/gdkevents-x11.c gdk/x11/gdkdisplay-x11.c: + Remove the event source when closing a display. + + * gdk/gdkdisplay.[ch]: Add a ::closed signal, dispose() + isn't convenient enough by itself. + + * gdk/x11/gdkevents-x11.c (gdk_xsettings_watch_cb): + Create foreign windows for watch windows if there isn't + an existing window, instead of installing a global filter. + + * gdk/x11/gdkscreen-x11.c gdk/x11/gdkprivate-x11.h + gdk/x11/gdkevents-x11.c (_gdk_x11_events_uninit_screen): + Clean up the xsettings_client when we are done with + it. + + * gdk/x11/gdkevents-x11.c (_gdk_events_init): Remove + excess call to _gdk_x11_events_init_screen() + 2002-08-01 Sven Neumann <sven@gimp.org> Merge from stable: diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 2eaf4c4826..b2f732b092 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,42 @@ +Thu Aug 1 19:09:39 2002 Owen Taylor <otaylor@redhat.com> + + * demos/gtk-demo/changedisplay.c: New demo for + window migration between different displays and screens. + + * gtk/gtkrc.c gtkstyle.[ch]: Add + _gtk_style_init_for_settings(), so that gtkrc.c + can initialize the styles it creates for the + right display. + + * gdk/gdkdisplaymanager.c (gdk_screen_get_default) + * gtk/gtksettings.c (gtk_settings_get_default) + * gtk/gtkstyle.c (gtk_style_init): Handle absence of + a default screen. + + * gdk/x11/gdkmain-x11.c (_gdk_windowing_set_default_display): + Handle display == NULL.x + + * gdk/gdkdisplay.c (gdk_display_dispose): Free the + event queue. + + * gdk/x11/gdkevents-x11.c gdk/x11/gdkdisplay-x11.c: + Remove the event source when closing a display. + + * gdk/gdkdisplay.[ch]: Add a ::closed signal, dispose() + isn't convenient enough by itself. + + * gdk/x11/gdkevents-x11.c (gdk_xsettings_watch_cb): + Create foreign windows for watch windows if there isn't + an existing window, instead of installing a global filter. + + * gdk/x11/gdkscreen-x11.c gdk/x11/gdkprivate-x11.h + gdk/x11/gdkevents-x11.c (_gdk_x11_events_uninit_screen): + Clean up the xsettings_client when we are done with + it. + + * gdk/x11/gdkevents-x11.c (_gdk_events_init): Remove + excess call to _gdk_x11_events_init_screen() + 2002-08-01 Sven Neumann <sven@gimp.org> Merge from stable: diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 2eaf4c4826..b2f732b092 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,42 @@ +Thu Aug 1 19:09:39 2002 Owen Taylor <otaylor@redhat.com> + + * demos/gtk-demo/changedisplay.c: New demo for + window migration between different displays and screens. + + * gtk/gtkrc.c gtkstyle.[ch]: Add + _gtk_style_init_for_settings(), so that gtkrc.c + can initialize the styles it creates for the + right display. + + * gdk/gdkdisplaymanager.c (gdk_screen_get_default) + * gtk/gtksettings.c (gtk_settings_get_default) + * gtk/gtkstyle.c (gtk_style_init): Handle absence of + a default screen. + + * gdk/x11/gdkmain-x11.c (_gdk_windowing_set_default_display): + Handle display == NULL.x + + * gdk/gdkdisplay.c (gdk_display_dispose): Free the + event queue. + + * gdk/x11/gdkevents-x11.c gdk/x11/gdkdisplay-x11.c: + Remove the event source when closing a display. + + * gdk/gdkdisplay.[ch]: Add a ::closed signal, dispose() + isn't convenient enough by itself. + + * gdk/x11/gdkevents-x11.c (gdk_xsettings_watch_cb): + Create foreign windows for watch windows if there isn't + an existing window, instead of installing a global filter. + + * gdk/x11/gdkscreen-x11.c gdk/x11/gdkprivate-x11.h + gdk/x11/gdkevents-x11.c (_gdk_x11_events_uninit_screen): + Clean up the xsettings_client when we are done with + it. + + * gdk/x11/gdkevents-x11.c (_gdk_events_init): Remove + excess call to _gdk_x11_events_init_screen() + 2002-08-01 Sven Neumann <sven@gimp.org> Merge from stable: diff --git a/demos/gtk-demo/Makefile.am b/demos/gtk-demo/Makefile.am index 5c94d68729..f0a0cadcb4 100644 --- a/demos/gtk-demo/Makefile.am +++ b/demos/gtk-demo/Makefile.am @@ -7,6 +7,7 @@ democodedir=$(datadir)/gtk-2.0/demo demos = @STRIP_BEGIN@ \ appwindow.c \ button_box.c \ + changedisplay.c \ colorsel.c \ dialog.c \ drawingarea.c \ diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index 05c9293893..47cb674f6b 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -25,13 +25,21 @@ #include "gdk.h" /* gdk_event_send_client_message() */ #include "gdkdisplay.h" #include "gdkinternals.h" +#include "gdkmarshalers.h" #include "gdkscreen.h" +enum { + CLOSED, + LAST_SIGNAL +}; + static void gdk_display_class_init (GdkDisplayClass *class); static void gdk_display_init (GdkDisplay *display); static void gdk_display_dispose (GObject *object); static void gdk_display_finalize (GObject *object); +static guint signals[LAST_SIGNAL] = { 0 }; + static GObjectClass *parent_class; GType @@ -69,6 +77,17 @@ gdk_display_class_init (GdkDisplayClass *class) object_class->finalize = gdk_display_finalize; object_class->dispose = gdk_display_dispose; + + signals[CLOSED] = + g_signal_new ("closed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GdkDisplayClass, closed), + NULL, NULL, + gdk_marshal_VOID__BOOLEAN, + G_TYPE_NONE, + 1, + G_TYPE_BOOLEAN); } static void @@ -87,6 +106,16 @@ static void gdk_display_dispose (GObject *object) { GdkDisplay *display = GDK_DISPLAY_OBJECT (object); + + g_list_foreach (display->queued_events, (GFunc)gdk_event_free, NULL); + g_list_free (display->queued_events); + display->queued_events = NULL; + display->queued_tail = NULL; + + _gdk_displays = g_slist_remove (_gdk_displays, object); + + if (gdk_display_get_default() == display) + gdk_display_manager_set_default_display (gdk_display_manager_get(), NULL); } static void @@ -94,12 +123,6 @@ gdk_display_finalize (GObject *object) { GdkDisplay *display = GDK_DISPLAY_OBJECT (object); - _gdk_displays = g_slist_remove (_gdk_displays, display); - - if (gdk_display_get_default() == display) - gdk_display_manager_set_default_display (gdk_display_manager_get(), - NULL); - parent_class->finalize (object); } @@ -118,7 +141,8 @@ gdk_display_close (GdkDisplay *display) if (!display->closed) { display->closed = TRUE; - + + g_signal_emit (display, signals[CLOSED], 0, FALSE); g_object_run_dispose (G_OBJECT (display)); g_object_unref (G_OBJECT (display)); diff --git a/gdk/gdkdisplay.h b/gdk/gdkdisplay.h index 25ed1e301d..76ca9126ce 100644 --- a/gdk/gdkdisplay.h +++ b/gdk/gdkdisplay.h @@ -70,6 +70,11 @@ struct _GdkDisplayClass GdkScreen * (*get_screen) (GdkDisplay *display, gint screen_num); GdkScreen * (*get_default_screen) (GdkDisplay *display); + + + /* Signals */ + void (*closed) (GdkDisplay *class, + gboolean is_error); }; GType gdk_display_get_type (void); diff --git a/gdk/gdkdisplaymanager.c b/gdk/gdkdisplaymanager.c index 2215cb8c24..31b8701728 100644 --- a/gdk/gdkdisplaymanager.c +++ b/gdk/gdkdisplaymanager.c @@ -214,12 +214,15 @@ gdk_display_get_default (void) * Gets the default screen for the default display. (See * gdk_display_get_default ()). * - * Returns: a #GdkScreen. + * Returns: a #GdkScreen, or %NULL if there is no default display. */ GdkScreen * gdk_screen_get_default (void) { - return gdk_display_get_default_screen (default_display); + if (default_display) + return gdk_display_get_default_screen (default_display); + else + return NULL; } /** diff --git a/gdk/gdkmarshalers.list b/gdk/gdkmarshalers.list index e22aea6aa5..3c0b1ff6c1 100644 --- a/gdk/gdkmarshalers.list +++ b/gdk/gdkmarshalers.list @@ -1 +1,2 @@ VOID:OBJECT +VOID:BOOLEAN diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index 28cea282bf..b4e1b9e81b 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -132,6 +132,12 @@ gdk_display_open (const gchar *display_name) for (i = 0; i < ScreenCount (display_x11->xdisplay); i++) display_x11->screens[i] = _gdk_x11_screen_new (display, i); + /* We need to initialize events after we have the screen + * structures in places + */ + for (i = 0; i < ScreenCount (display_x11->xdisplay); i++) + _gdk_x11_events_init_screen (display_x11->screens[i]); + /*set the default screen */ display_x11->default_screen = display_x11->screens[DefaultScreen (display_x11->xdisplay)]; display_x11->leader_window = XCreateSimpleWindow (display_x11->xdisplay, @@ -488,11 +494,13 @@ gdk_display_x11_dispose (GObject *object) GdkDisplayX11 *display_x11; gint i; - display_x11 = GDK_DISPLAY_X11 (object);; + display_x11 = GDK_DISPLAY_X11 (object); for (i = 0; i < ScreenCount (display_x11->xdisplay); i++) _gdk_screen_close (display_x11->screens[i]); + g_source_destroy (display_x11->event_source); + XCloseDisplay (display_x11->xdisplay); display_x11->xdisplay = NULL; diff --git a/gdk/x11/gdkdisplay-x11.h b/gdk/x11/gdkdisplay-x11.h index 329fada12a..f0a076ebfc 100644 --- a/gdk/x11/gdkdisplay-x11.h +++ b/gdk/x11/gdkdisplay-x11.h @@ -58,6 +58,8 @@ struct _GdkDisplayX11 GdkScreen *default_screen; GdkScreen **screens; + GSource *event_source; + gint grab_count; /* Keyboard related information */ diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c index 77ee7e0c8e..89f3176d12 100644 --- a/gdk/x11/gdkevents-x11.c +++ b/gdk/x11/gdkevents-x11.c @@ -169,6 +169,15 @@ _gdk_x11_events_init_screen (GdkScreen *screen) screen); } +void +_gdk_x11_events_uninit_screen (GdkScreen *screen) +{ + GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen); + + xsettings_client_destroy (screen_x11->xsettings_client); + screen_x11->xsettings_client = NULL; +} + void _gdk_events_init (GdkDisplay *display) { @@ -180,7 +189,7 @@ _gdk_events_init (GdkDisplay *display) GDK_NOTE (MISC, g_message ("connection number: %d", connection_number)); - source = gdk_display_source_new (display); + source = display_x11->event_source = gdk_display_source_new (display); display_source = (GdkDisplaySource*) source; g_source_set_priority (source, GDK_PRIORITY_EVENTS); @@ -198,8 +207,6 @@ _gdk_events_init (GdkDisplay *display) gdk_atom_intern ("WM_PROTOCOLS", FALSE), gdk_wm_protocols_filter, NULL); - - _gdk_x11_events_init_screen (display_x11->default_screen); } @@ -2371,17 +2378,29 @@ gdk_xsettings_client_event_filter (GdkXEvent *xevent, static void gdk_xsettings_watch_cb (Window window, - Bool is_start, - long mask, - void *cb_data) + Bool is_start, + long mask, + void *cb_data) { GdkWindow *gdkwin; GdkScreen *screen = cb_data; + GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen); gdkwin = gdk_window_lookup_for_display (gdk_screen_get_display (screen), window); - + if (is_start) - gdk_window_add_filter (gdkwin, gdk_xsettings_client_event_filter, screen); + { + if (!gdkwin) + gdkwin = gdk_window_foreign_new_for_display (gdk_screen_get_display (screen), window); + else + g_object_ref (gdkwin); + + gdk_window_add_filter (gdkwin, gdk_xsettings_client_event_filter, screen); + } else - gdk_window_remove_filter (gdkwin, gdk_xsettings_client_event_filter, screen); + { + g_assert (gdkwin); + gdk_window_remove_filter (gdkwin, gdk_xsettings_client_event_filter, screen); + g_object_unref (gdkwin); + } } diff --git a/gdk/x11/gdkmain-x11.c b/gdk/x11/gdkmain-x11.c index e38490c8f2..b74dbd447c 100644 --- a/gdk/x11/gdkmain-x11.c +++ b/gdk/x11/gdkmain-x11.c @@ -110,7 +110,10 @@ _gdk_windowing_init (gint *argc, void _gdk_windowing_set_default_display (GdkDisplay *display) { - gdk_display = GDK_DISPLAY_XDISPLAY (display); + if (display) + gdk_display = GDK_DISPLAY_XDISPLAY (display); + else + gdk_display = NULL; } void diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index d458c281f6..e63ba67d11 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -168,7 +168,8 @@ void _gdk_xgrab_check_destroy (GdkWindow *window); gboolean _gdk_x11_display_is_root_window (GdkDisplay *display, Window xroot_window); -void _gdk_x11_events_init_screen (GdkScreen *screen); +void _gdk_x11_events_init_screen (GdkScreen *screen); +void _gdk_x11_events_uninit_screen (GdkScreen *screen); void _gdk_events_init (GdkDisplay *display); void _gdk_windowing_window_init (GdkScreen *screen); diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c index cab6a9ad6c..9c3526f268 100644 --- a/gdk/x11/gdkscreen-x11.c +++ b/gdk/x11/gdkscreen-x11.c @@ -232,6 +232,8 @@ gdk_screen_x11_dispose (GObject *object) { GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (object); + _gdk_x11_events_uninit_screen (GDK_SCREEN (object)); + screen_x11->root_window = NULL; screen_x11->xdisplay = NULL; @@ -356,7 +358,6 @@ _gdk_x11_screen_new (GdkDisplay *display, _gdk_visual_init (screen); _gdk_windowing_window_init (screen); - _gdk_x11_events_init_screen (screen); return screen; } diff --git a/gtk/gtkrc.c b/gtk/gtkrc.c index 5fd9fc88fa..4fb271694d 100644 --- a/gtk/gtkrc.c +++ b/gtk/gtkrc.c @@ -119,8 +119,10 @@ static GSList * gtk_rc_styles_match (GSList *rc_styles guint path_length, const gchar *path, const gchar *path_reversed); -static GtkStyle * gtk_rc_style_to_style (GtkRcStyle *rc_style); -static GtkStyle* gtk_rc_init_style (GSList *rc_styles); +static GtkStyle * gtk_rc_style_to_style (GtkRcContext *context, + GtkRcStyle *rc_style); +static GtkStyle* gtk_rc_init_style (GtkRcContext *context, + GSList *rc_styles); static void gtk_rc_parse_default_files (GtkRcContext *context); static void gtk_rc_parse_named (GtkRcContext *context, const gchar *name, @@ -1635,11 +1637,14 @@ gtk_rc_get_style (GtkWidget *widget) rc_styles = g_slist_prepend (rc_styles, widget_rc_style); if (rc_styles) - return gtk_rc_init_style (rc_styles); + return gtk_rc_init_style (context, rc_styles); else { if (!context->default_style) - context->default_style = gtk_style_new (); + { + context->default_style = gtk_style_new (); + _gtk_style_init_for_settings (context->default_style, context->settings); + } return context->default_style; } @@ -1741,7 +1746,7 @@ gtk_rc_get_style_by_paths (GtkSettings *settings, rc_styles = sort_and_dereference_sets (rc_styles); if (rc_styles) - return gtk_rc_init_style (rc_styles); + return gtk_rc_init_style (context, rc_styles); return NULL; } @@ -1967,11 +1972,13 @@ gtk_rc_style_find (GtkRcContext *context, } static GtkStyle * -gtk_rc_style_to_style (GtkRcStyle *rc_style) +gtk_rc_style_to_style (GtkRcContext *context, + GtkRcStyle *rc_style) { GtkStyle *style; style = GTK_RC_STYLE_GET_CLASS (rc_style)->create_style (rc_style); + _gtk_style_init_for_settings (style, context->settings); style->rc_style = rc_style; @@ -1984,7 +1991,8 @@ gtk_rc_style_to_style (GtkRcStyle *rc_style) /* Reuses or frees rc_styles */ static GtkStyle * -gtk_rc_init_style (GSList *rc_styles) +gtk_rc_init_style (GtkRcContext *context, + GSList *rc_styles) { GtkStyle *style = NULL; gint i; @@ -2069,7 +2077,7 @@ gtk_rc_init_style (GSList *rc_styles) proto_style->bg_pixmap_name[i] = NULL; } - style = gtk_rc_style_to_style (proto_style); + style = gtk_rc_style_to_style (context, proto_style); gtk_rc_style_unref (proto_style); g_hash_table_insert (realized_style_ht, rc_styles, style); diff --git a/gtk/gtkrc.h b/gtk/gtkrc.h index 9b582337e3..770760097e 100644 --- a/gtk/gtkrc.h +++ b/gtk/gtkrc.h @@ -37,7 +37,6 @@ extern "C" { /* Forward declarations */ typedef struct _GtkIconFactory GtkIconFactory; typedef struct _GtkRcContext GtkRcContext; -typedef struct _GtkSettings GtkSettings; typedef struct _GtkRcStyleClass GtkRcStyleClass; diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c index a9b4d8b633..8d06dad8ad 100644 --- a/gtk/gtksettings.c +++ b/gtk/gtksettings.c @@ -266,12 +266,18 @@ gtk_settings_get_for_screen (GdkScreen *screen) * Gets the #GtkSettings object for the default GDK screen, creating * it if necessary. See gtk_settings_get_for_screen(). * - * Return value: a #GtkSettings object + * Return value: a #GtkSettings object. If there is no default + * screen, then returns %NULL. **/ GtkSettings* gtk_settings_get_default (void) { - return gtk_settings_get_for_screen (gdk_screen_get_default ()); + GdkScreen *screen = gdk_screen_get_default (); + + if (screen) + return gtk_settings_get_for_screen (screen); + else + return NULL; } static void diff --git a/gtk/gtkstyle.c b/gtk/gtkstyle.c index b7b39e6e51..06216faace 100644 --- a/gtk/gtkstyle.c +++ b/gtk/gtkstyle.c @@ -481,14 +481,30 @@ gtk_style_get_type (void) return style_type; } -static void -gtk_style_init (GtkStyle *style) +/** + * _gtk_style_init_for_settings: + * @style: a #GtkStyle + * @settings: a #GtkSettings + * + * Initializes the font description in @style accoridng to the default + * font name of @settings. This is called for gtk_style_new() with + * the settings for the default screen (if any); if we are creating + * a style for a particular screen, we then call it again in a + * location where we know the correct settings. + * The reason for this is that gtk_rc_style_create_style() doesn't + * take the screen for an argument. + **/ +void +_gtk_style_init_for_settings (GtkStyle *style, + GtkSettings *settings) { - gint i; - const gchar *font_name = _gtk_rc_context_get_default_font_name (gtk_settings_get_default ()); + const gchar *font_name = _gtk_rc_context_get_default_font_name (settings); + if (style->font_desc) + pango_font_description_free (style->font_desc); + style->font_desc = pango_font_description_from_string (font_name); - + if (!pango_font_description_get_family (style->font_desc)) { g_warning ("Default font does not have a family set"); @@ -499,6 +515,19 @@ gtk_style_init (GtkStyle *style) g_warning ("Default font does not have a positive size"); pango_font_description_set_size (style->font_desc, 10 * PANGO_SCALE); } +} + +static void +gtk_style_init (GtkStyle *style) +{ + gint i; + + GtkSettings *settings = gtk_settings_get_default (); + + if (settings) + _gtk_style_init_for_settings (style, settings); + else + style->font_desc = pango_font_description_from_string ("Sans 10"); style->attach_count = 0; style->colormap = NULL; diff --git a/gtk/gtkstyle.h b/gtk/gtkstyle.h index ce4c3901c1..0fbdf06fdb 100644 --- a/gtk/gtkstyle.h +++ b/gtk/gtkstyle.h @@ -56,6 +56,7 @@ typedef struct _GtkRcStyle GtkRcStyle; typedef struct _GtkIconSet GtkIconSet; typedef struct _GtkIconSource GtkIconSource; typedef struct _GtkRcProperty GtkRcProperty; +typedef struct _GtkSettings GtkSettings; typedef gboolean (*GtkRcPropertyParser) (const GParamSpec *pspec, const GString *rc_string, GValue *property_value); @@ -861,6 +862,8 @@ const GValue* _gtk_style_peek_property_value (GtkStyle *style, GParamSpec *pspec, GtkRcPropertyParser parser); +void _gtk_style_init_for_settings (GtkStyle *style, + GtkSettings *settings); /* deprecated */ #ifndef GTK_DISABLE_DEPRECATED |