Mercurial > emacs
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 |