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 /gdk/x11 | |
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()
Diffstat (limited to 'gdk/x11')
-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 |
6 files changed, 47 insertions, 13 deletions
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; } |