comparison src/gtkutil.c @ 98555:440d088b9a23

(xg_display_open): Reset default display if none exists. (xg_display_close): Allow Emacs to close all displays (bug#985).
author Chong Yidong <cyd@stupidchicken.com>
date Tue, 07 Oct 2008 17:46:48 +0000
parents d19cd21bc42d
children f5d2a2e44839
comparison
equal deleted inserted replaced
98554:feee2c660e49 98555:440d088b9a23
51 Display handling functions 51 Display handling functions
52 ***********************************************************************/ 52 ***********************************************************************/
53 53
54 #ifdef HAVE_GTK_MULTIDISPLAY 54 #ifdef HAVE_GTK_MULTIDISPLAY
55 55
56 /* Gtk does not work well without any display open. Emacs may close 56 /* Keep track of the default display, or NULL if there is none. Emacs
57 all its displays. In that case, keep a display around just for 57 may close all its displays. */
58 the purpose of having one. */
59 58
60 static GdkDisplay *gdpy_def; 59 static GdkDisplay *gdpy_def;
61
62 60
63 /* Return the GdkDisplay that corresponds to the X display DPY. */ 61 /* Return the GdkDisplay that corresponds to the X display DPY. */
64 62
65 static GdkDisplay * 63 static GdkDisplay *
66 xg_get_gdk_display (dpy) 64 xg_get_gdk_display (dpy)
119 { 117 {
120 #ifdef HAVE_GTK_MULTIDISPLAY 118 #ifdef HAVE_GTK_MULTIDISPLAY
121 GdkDisplay *gdpy; 119 GdkDisplay *gdpy;
122 120
123 gdpy = gdk_display_open (display_name); 121 gdpy = gdk_display_open (display_name);
122 if (!gdpy_def)
123 gdk_display_manager_set_default_display (gdk_display_manager_get (),
124 gdpy);
125
124 *dpy = gdpy ? GDK_DISPLAY_XDISPLAY (gdpy) : NULL; 126 *dpy = gdpy ? GDK_DISPLAY_XDISPLAY (gdpy) : NULL;
125
126 return gdpy != NULL; 127 return gdpy != NULL;
127 128
128 #else /* not HAVE_GTK_MULTIDISPLAY */ 129 #else /* not HAVE_GTK_MULTIDISPLAY */
129 130
130 return -1; 131 return -1;
138 xg_display_close (Display *dpy) 139 xg_display_close (Display *dpy)
139 { 140 {
140 #ifdef HAVE_GTK_MULTIDISPLAY 141 #ifdef HAVE_GTK_MULTIDISPLAY
141 GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (dpy); 142 GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (dpy);
142 143
143 /* If this is the default display, we must change it before calling 144 /* If this is the default display, try to change it before closing.
144 dispose, otherwise it will crash on some Gtk+ versions. */ 145 If there is no other display to use, gdpy_def is set to NULL, and
146 the next call to xg_display_open resets the default display. */
145 if (gdk_display_get_default () == gdpy) 147 if (gdk_display_get_default () == gdpy)
146 { 148 {
147 struct x_display_info *dpyinfo; 149 struct x_display_info *dpyinfo;
148 Display *new_dpy = 0; 150 GdkDisplay *gdpy_new = NULL;
149 GdkDisplay *gdpy_new;
150 151
151 /* Find another display. */ 152 /* Find another display. */
152 for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next) 153 for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next)
153 if (dpyinfo->display != dpy) 154 if (dpyinfo->display != dpy)
154 { 155 {
155 new_dpy = dpyinfo->display; 156 gdpy_new = gdk_x11_lookup_xdisplay (dpyinfo->display);
157 gdk_display_manager_set_default_display (gdk_display_manager_get (),
158 gdpy_new);
156 break; 159 break;
157 } 160 }
158 161 gdpy_def = gdpy_new;
159 if (new_dpy) 162 }
160 gdpy_new = gdk_x11_lookup_xdisplay (new_dpy); 163
161 else 164 #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 10
162 {
163 if (!gdpy_def)
164 gdpy_def = gdk_display_open (gdk_display_get_name (gdpy));
165 gdpy_new = gdpy_def;
166 }
167
168 gdk_display_manager_set_default_display (gdk_display_manager_get (),
169 gdpy_new);
170 }
171
172 /* GTK 2.2-2.8 has a bug that makes gdk_display_close crash (bug 165 /* GTK 2.2-2.8 has a bug that makes gdk_display_close crash (bug
173 http://bugzilla.gnome.org/show_bug.cgi?id=85715). This way 166 http://bugzilla.gnome.org/show_bug.cgi?id=85715). This way we
174 we can continue running, but there will be memory leaks. */ 167 can continue running, but there will be memory leaks. */
175
176 #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 10
177 g_object_run_dispose (G_OBJECT (gdpy)); 168 g_object_run_dispose (G_OBJECT (gdpy));
178 #else 169 #else
179 /* This seems to be fixed in GTK 2.10. */ 170 /* This seems to be fixed in GTK 2.10. */
180 gdk_display_close (gdpy); 171 gdk_display_close (gdpy);
181 #endif 172 #endif