summaryrefslogtreecommitdiff
path: root/gdk/x11
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2002-08-01 23:43:13 +0000
committerOwen Taylor <otaylor@src.gnome.org>2002-08-01 23:43:13 +0000
commit63489392e6c1e452054eb930fa7bd493e51cba9a (patch)
tree3ad603c3bbd2ea819fa025229dd02658fa08fd0e /gdk/x11
parent615deb3e4ad2411c61c6b5ed4c5e445218b139bf (diff)
downloadgtk+-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.c10
-rw-r--r--gdk/x11/gdkdisplay-x11.h2
-rw-r--r--gdk/x11/gdkevents-x11.c37
-rw-r--r--gdk/x11/gdkmain-x11.c5
-rw-r--r--gdk/x11/gdkprivate-x11.h3
-rw-r--r--gdk/x11/gdkscreen-x11.c3
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;
}