X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/e6b2f88783f2c89bedcd2a761c6362fb353dc7a3..fbf349734468d48b421c3d03074bb66dfcf3115b:/src/xfns.c diff --git a/src/xfns.c b/src/xfns.c index db2e3f7404..11f4c2eadb 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -1,6 +1,6 @@ /* Functions for the X window system. Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005 Free Software Foundation. + 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -16,11 +16,10 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ #include -#include #include #include @@ -240,17 +239,18 @@ check_x_frame (frame) return f; } -/* Let the user specify an X display with a frame. +/* Let the user specify an X display with a Lisp object. + OBJECT may be nil, a frame or a device id. nil stands for the selected frame--or, if that is not an X frame, the first X display on the list. */ struct x_display_info * -check_x_display_info (frame) - Lisp_Object frame; +check_x_display_info (object) + Lisp_Object object; { struct x_display_info *dpyinfo = NULL; - if (NILP (frame)) + if (NILP (object)) { struct frame *sf = XFRAME (selected_frame); @@ -261,22 +261,20 @@ check_x_display_info (frame) else error ("X windows are not in use or not initialized"); } - else if (INTEGERP (frame)) + else if (INTEGERP (object)) { - struct display *d = get_display (XINT (frame)); + struct device *d = get_device (XINT (object), 1); - if (!d) - wrong_type_argument (Qdisplay_live_p, frame); if (d->type != output_x_window) - error ("Display %d is not an X display", XINT (frame)); + error ("Display %d is not an X display", XINT (object)); dpyinfo = d->display_info.x; } - else if (STRINGP (frame)) - dpyinfo = x_display_info_for_name (frame); + else if (STRINGP (object)) + dpyinfo = x_display_info_for_name (object); else { - FRAME_PTR f = check_x_frame (frame); + FRAME_PTR f = check_x_frame (object); dpyinfo = FRAME_X_DISPLAY_INFO (f); } @@ -1447,10 +1445,10 @@ x_set_scroll_bar_foreground (f, value, oldval) if (FRAME_X_WINDOW (f) && FRAME_VISIBLE_P (f)) { /* Remove all scroll bars because they have wrong colors. */ - if (FRAME_DISPLAY (f)->condemn_scroll_bars_hook) - (*FRAME_DISPLAY (f)->condemn_scroll_bars_hook) (f); - if (FRAME_DISPLAY (f)->judge_scroll_bars_hook) - (*FRAME_DISPLAY (f)->judge_scroll_bars_hook) (f); + if (FRAME_DEVICE (f)->condemn_scroll_bars_hook) + (*FRAME_DEVICE (f)->condemn_scroll_bars_hook) (f); + if (FRAME_DEVICE (f)->judge_scroll_bars_hook) + (*FRAME_DEVICE (f)->judge_scroll_bars_hook) (f); update_face_from_frame_parameter (f, Qscroll_bar_foreground, value); redraw_frame (f); @@ -1496,10 +1494,10 @@ x_set_scroll_bar_background (f, value, oldval) if (FRAME_X_WINDOW (f) && FRAME_VISIBLE_P (f)) { /* Remove all scroll bars because they have wrong colors. */ - if (FRAME_DISPLAY (f)->condemn_scroll_bars_hook) - (*FRAME_DISPLAY (f)->condemn_scroll_bars_hook) (f); - if (FRAME_DISPLAY (f)->judge_scroll_bars_hook) - (*FRAME_DISPLAY (f)->judge_scroll_bars_hook) (f); + if (FRAME_DEVICE (f)->condemn_scroll_bars_hook) + (*FRAME_DEVICE (f)->condemn_scroll_bars_hook) (f); + if (FRAME_DEVICE (f)->judge_scroll_bars_hook) + (*FRAME_DEVICE (f)->judge_scroll_bars_hook) (f); update_face_from_frame_parameter (f, Qscroll_bar_background, value); redraw_frame (f); @@ -1969,6 +1967,114 @@ static XIMStyle supported_xim_styles[] = /* Create an X fontset on frame F with base font name BASE_FONTNAME. */ +char xic_defaut_fontset[] = "-*-*-*-r-normal--14-*-*-*-*-*-*-*"; + +/* Create an Xt fontset spec from the name of a base font. + If `motif' is True use the Motif syntax. */ +char * +xic_create_fontsetname (base_fontname, motif) + char *base_fontname; + Bool motif; +{ + const char *sep = motif ? ";" : ","; + char *fontsetname; + + /* Make a fontset name from the base font name. */ + if (xic_defaut_fontset == base_fontname) + { /* There is no base font name, use the default. */ + int len = strlen (base_fontname) + 2; + fontsetname = xmalloc (len); + bzero (fontsetname, len); + strcpy (fontsetname, base_fontname); + } + else + { + /* Make a fontset name from the base font name. + The font set will be made of the following elements: + - the base font. + - the base font where the charset spec is replaced by -*-*. + - the same but with the family also replaced with -*-*-. */ + char *p = base_fontname; + int i; + + for (i = 0; *p; p++) + if (*p == '-') i++; + if (i != 14) + { /* As the font name doesn't conform to XLFD, we can't + modify it to generalize it to allcs and allfamilies. + Use the specified font plus the default. */ + int len = strlen (base_fontname) + strlen (xic_defaut_fontset) + 3; + fontsetname = xmalloc (len); + bzero (fontsetname, len); + strcpy (fontsetname, base_fontname); + strcat (fontsetname, sep); + strcat (fontsetname, xic_defaut_fontset); + } + else + { + int len; + char *p1 = NULL, *p2 = NULL; + char *font_allcs = NULL; + char *font_allfamilies = NULL; + char *font_all = NULL; + char *allcs = "*-*-*-*-*-*-*"; + char *allfamilies = "-*-*-"; + char *all = "*-*-*-*-"; + + for (i = 0, p = base_fontname; i < 8; p++) + { + if (*p == '-') + { + i++; + if (i == 3) + p1 = p + 1; + else if (i == 7) + p2 = p + 1; + } + } + /* Build the font spec that matches all charsets. */ + len = p - base_fontname + strlen (allcs) + 1; + font_allcs = (char *) alloca (len); + bzero (font_allcs, len); + bcopy (base_fontname, font_allcs, p - base_fontname); + strcat (font_allcs, allcs); + + /* Build the font spec that matches all families. */ + len = p - p1 + strlen (allcs) + strlen (allfamilies) + 1; + font_allfamilies = (char *) alloca (len); + bzero (font_allfamilies, len); + strcpy (font_allfamilies, allfamilies); + bcopy (p1, font_allfamilies + strlen (allfamilies), p - p1); + strcat (font_allfamilies, allcs); + + /* Build the font spec that matches all. */ + len = p - p2 + strlen (allcs) + strlen (all) + strlen (allfamilies) + 1; + font_all = (char *) alloca (len); + bzero (font_all, len); + strcpy (font_all, allfamilies); + strcat (font_all, all); + bcopy (p2, font_all + strlen (all) + strlen (allfamilies), p - p2); + strcat (font_all, allcs); + + /* Build the actual font set name. */ + len = strlen (base_fontname) + strlen (font_allcs) + + strlen (font_allfamilies) + strlen (font_all) + 5; + fontsetname = xmalloc (len); + bzero (fontsetname, len); + strcpy (fontsetname, base_fontname); + strcat (fontsetname, sep); + strcat (fontsetname, font_allcs); + strcat (fontsetname, sep); + strcat (fontsetname, font_allfamilies); + strcat (fontsetname, sep); + strcat (fontsetname, font_all); + } + } + if (motif) + strcat (fontsetname, ":"); + return fontsetname; +} + static XFontSet xic_create_xfontset (f, base_fontname) struct frame *f; @@ -1980,6 +2086,9 @@ xic_create_xfontset (f, base_fontname) char *def_string; Lisp_Object rest, frame; + if (!base_fontname) + base_fontname = xic_defaut_fontset; + /* See if there is another frame already using same fontset. */ FOR_EACH_FRAME (rest, frame) { @@ -1996,12 +2105,15 @@ xic_create_xfontset (f, base_fontname) if (!xfs) { + char *fontsetname = xic_create_fontsetname (base_fontname, False); + /* New fontset. */ xfs = XCreateFontSet (FRAME_X_DISPLAY (f), - base_fontname, &missing_list, + fontsetname, &missing_list, &missing_count, &def_string); if (missing_list) XFreeStringList (missing_list); + xfree (fontsetname); } if (FRAME_XIC_BASE_FONTNAME (f)) @@ -2083,6 +2195,11 @@ create_frame_xic (f) if (FRAME_XIC (f)) return; + /* Create X fontset. */ + xfs = xic_create_xfontset + (f, (FRAME_FONTSET (f) < 0) ? NULL + : (char *) SDATA (fontset_ascii (FRAME_FONTSET (f)))); + xim = FRAME_X_XIM (f); if (xim) { @@ -2090,52 +2207,9 @@ create_frame_xic (f) XPoint spot; XVaNestedList preedit_attr; XVaNestedList status_attr; - char *base_fontname; - int fontset; s_area.x = 0; s_area.y = 0; s_area.width = 1; s_area.height = 1; spot.x = 0; spot.y = 1; - /* Create X fontset. */ - fontset = FRAME_FONTSET (f); - if (fontset < 0) - base_fontname = "-*-*-*-r-normal--14-*-*-*-*-*-*-*"; - else - { - /* Determine the base fontname from the ASCII font name of - FONTSET. */ - char *ascii_font = (char *) SDATA (fontset_ascii (fontset)); - char *p = ascii_font; - int i; - - for (i = 0; *p; p++) - if (*p == '-') i++; - if (i != 14) - /* As the font name doesn't conform to XLFD, we can't - modify it to get a suitable base fontname for the - frame. */ - base_fontname = "-*-*-*-r-normal--14-*-*-*-*-*-*-*"; - else - { - int len = strlen (ascii_font) + 1; - char *p1 = NULL; - - for (i = 0, p = ascii_font; i < 8; p++) - { - if (*p == '-') - { - i++; - if (i == 3) - p1 = p + 1; - } - } - base_fontname = (char *) alloca (len); - bzero (base_fontname, len); - strcpy (base_fontname, "-*-*-"); - bcopy (p1, base_fontname + 5, p - p1); - strcat (base_fontname, "*-*-*-*-*-*-*"); - } - } - xfs = xic_create_xfontset (f, base_fontname); /* Determine XIC style. */ if (xic_style == 0) @@ -2876,6 +2950,12 @@ unwind_create_frame (frame) { struct frame *f = XFRAME (frame); + /* If frame is already dead, nothing to do. This can happen if the + display is disconnected after the frame has become official, but + before x_create_frame removes the unwind protect. */ + if (!FRAME_LIVE_P (f)) + return Qnil; + /* If frame is ``official'', nothing to do. */ if (!CONSP (Vframe_list) || !EQ (XCAR (Vframe_list), frame)) { @@ -2928,14 +3008,14 @@ This function is an internal primitive--use `make-frame' instead. */) until we know if this frame has a specified name. */ Vx_resource_name = Vinvocation_name; - display = x_get_arg (dpyinfo, parms, Qdisplay_id, 0, 0, RES_TYPE_NUMBER); + display = x_get_arg (dpyinfo, parms, Qdevice, 0, 0, RES_TYPE_NUMBER); if (EQ (display, Qunbound)) display = x_get_arg (dpyinfo, parms, Qdisplay, 0, 0, RES_TYPE_STRING); if (EQ (display, Qunbound)) display = Qnil; dpyinfo = check_x_display_info (display); #ifdef MULTI_KBOARD - kb = dpyinfo->kboard; + kb = dpyinfo->device->kboard; #else kb = &the_only_kboard; #endif @@ -2980,8 +3060,8 @@ This function is an internal primitive--use `make-frame' instead. */) /* Note that X Windows does support scroll bars. */ FRAME_CAN_HAVE_SCROLL_BARS (f) = 1; - f->display = dpyinfo->frame_display; - f->display->reference_count++; + f->device = dpyinfo->device; + f->device->reference_count++; f->output_method = output_x_window; f->output_data.x = (struct x_output *) xmalloc (sizeof (struct x_output)); @@ -3007,9 +3087,6 @@ This function is an internal primitive--use `make-frame' instead. */) image_cache_refcount = FRAME_X_IMAGE_CACHE (f)->refcount; dpyinfo_refcount = dpyinfo->reference_count; #endif /* GLYPH_DEBUG */ -#ifdef MULTI_KBOARD - FRAME_KBOARD (f) = kb; -#endif /* These colors will be set anyway later, but it's important to get the color reference counts right, so initialize them! */ @@ -3399,10 +3476,10 @@ DEFUN ("xw-color-values", Fxw_color_values, Sxw_color_values, 1, 2, 0, DEFUN ("xw-display-color-p", Fxw_display_color_p, Sxw_display_color_p, 0, 1, 0, doc: /* Internal function called by `display-color-p', which see. */) - (display) - Lisp_Object display; + (device) + Lisp_Object device; { - struct x_display_info *dpyinfo = check_x_display_info (display); + struct x_display_info *dpyinfo = check_x_display_info (device); if (dpyinfo->n_planes <= 2) return Qnil; @@ -3424,13 +3501,13 @@ DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p, Sx_display_grayscale_p, 0, 1, 0, doc: /* Return t if the X display supports shades of gray. Note that color displays do support shades of gray. -The optional argument DISPLAY specifies which display to ask about. -DISPLAY should be either a frame or a display name (a string). -If omitted or nil, that stands for the selected frame's display. */) - (display) - Lisp_Object display; +The optional argument DEVICE specifies which display to ask about. +DEVICE should be a device id, a frame or a display name (a string). +If omitted or nil, that stands for the selected frame's display device. */) + (device) + Lisp_Object device; { - struct x_display_info *dpyinfo = check_x_display_info (display); + struct x_display_info *dpyinfo = check_x_display_info (device); if (dpyinfo->n_planes <= 1) return Qnil; @@ -3452,56 +3529,56 @@ If omitted or nil, that stands for the selected frame's display. */) DEFUN ("x-display-pixel-width", Fx_display_pixel_width, Sx_display_pixel_width, 0, 1, 0, - doc: /* Returns the width in pixels of the X display DISPLAY. -The optional argument DISPLAY specifies which display to ask about. -DISPLAY should be either a frame or a display name (a string). + doc: /* Returns the width in pixels of the X display DEVICE. +The optional argument DEVICE specifies which display to ask about. +DEVICE should be a device id, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (display) - Lisp_Object display; + (device) + Lisp_Object device; { - struct x_display_info *dpyinfo = check_x_display_info (display); + struct x_display_info *dpyinfo = check_x_display_info (device); return make_number (dpyinfo->width); } DEFUN ("x-display-pixel-height", Fx_display_pixel_height, Sx_display_pixel_height, 0, 1, 0, - doc: /* Returns the height in pixels of the X display DISPLAY. -The optional argument DISPLAY specifies which display to ask about. -DISPLAY should be either a frame or a display name (a string). + doc: /* Returns the height in pixels of the X display DEVICE. +The optional argument DEVICE specifies which display to ask about. +DEVICE should be a device id, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (display) - Lisp_Object display; + (device) + Lisp_Object device; { - struct x_display_info *dpyinfo = check_x_display_info (display); + struct x_display_info *dpyinfo = check_x_display_info (device); return make_number (dpyinfo->height); } DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes, 0, 1, 0, - doc: /* Returns the number of bitplanes of the X display DISPLAY. -The optional argument DISPLAY specifies which display to ask about. -DISPLAY should be either a frame or a display name (a string). + doc: /* Returns the number of bitplanes of the X display DEVICE. +The optional argument DEVICE specifies which display to ask about. +DEVICE should be a device id, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (display) - Lisp_Object display; + (device) + Lisp_Object device; { - struct x_display_info *dpyinfo = check_x_display_info (display); + struct x_display_info *dpyinfo = check_x_display_info (device); return make_number (dpyinfo->n_planes); } DEFUN ("x-display-color-cells", Fx_display_color_cells, Sx_display_color_cells, 0, 1, 0, - doc: /* Returns the number of color cells of the X display DISPLAY. -The optional argument DISPLAY specifies which display to ask about. -DISPLAY should be either a frame or a display name (a string). + doc: /* Returns the number of color cells of the X display DEVICE. +The optional argument DEVICE specifies which display to ask about. +DEVICE should be a device id, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (display) - Lisp_Object display; + (device) + Lisp_Object device; { - struct x_display_info *dpyinfo = check_x_display_info (display); + struct x_display_info *dpyinfo = check_x_display_info (device); int nr_planes = DisplayPlanes (dpyinfo->display, XScreenNumberOfScreen (dpyinfo->screen)); @@ -3519,29 +3596,29 @@ If omitted or nil, that stands for the selected frame's display. */) DEFUN ("x-server-max-request-size", Fx_server_max_request_size, Sx_server_max_request_size, 0, 1, 0, - doc: /* Returns the maximum request size of the X server of display DISPLAY. -The optional argument DISPLAY specifies which display to ask about. -DISPLAY should be either a frame or a display name (a string). + doc: /* Returns the maximum request size of the X server of display DEVICE. +The optional argument DEVICE specifies which display to ask about. +DEVICE should be a device id, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (display) - Lisp_Object display; + (device) + Lisp_Object device; { - struct x_display_info *dpyinfo = check_x_display_info (display); + struct x_display_info *dpyinfo = check_x_display_info (device); return make_number (MAXREQUEST (dpyinfo->display)); } DEFUN ("x-server-vendor", Fx_server_vendor, Sx_server_vendor, 0, 1, 0, - doc: /* Returns the "vendor ID" string of the X server of display DISPLAY. + doc: /* Returns the "vendor ID" string of the X server of display DEVICE. \(Labelling every distributor as a "vendor" embodies the false assumption that operating systems cannot be developed and distributed noncommercially.) -The optional argument DISPLAY specifies which display to ask about. -DISPLAY should be either a frame or a display name (a string). +The optional argument DEVICE specifies which display to ask about. +DEVICE should be a device id, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (display) - Lisp_Object display; + (device) + Lisp_Object device; { - struct x_display_info *dpyinfo = check_x_display_info (display); + struct x_display_info *dpyinfo = check_x_display_info (device); char *vendor = ServerVendor (dpyinfo->display); if (! vendor) vendor = ""; @@ -3549,18 +3626,18 @@ If omitted or nil, that stands for the selected frame's display. */) } DEFUN ("x-server-version", Fx_server_version, Sx_server_version, 0, 1, 0, - doc: /* Returns the version numbers of the X server of display DISPLAY. + doc: /* Returns the version numbers of the X server of display DEVICE. The value is a list of three integers: the major and minor version numbers of the X Protocol in use, and the distributor-specific release number. See also the function `x-server-vendor'. -The optional argument DISPLAY specifies which display to ask about. -DISPLAY should be either a frame or a display name (a string). +The optional argument DEVICE specifies which display to ask about. +DEVICE should be a device id, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (display) - Lisp_Object display; + (device) + Lisp_Object device; { - struct x_display_info *dpyinfo = check_x_display_info (display); + struct x_display_info *dpyinfo = check_x_display_info (device); Display *dpy = dpyinfo->display; return Fcons (make_number (ProtocolVersion (dpy)), @@ -3569,55 +3646,55 @@ If omitted or nil, that stands for the selected frame's display. */) } DEFUN ("x-display-screens", Fx_display_screens, Sx_display_screens, 0, 1, 0, - doc: /* Return the number of screens on the X server of display DISPLAY. -The optional argument DISPLAY specifies which display to ask about. -DISPLAY should be either a frame or a display name (a string). + doc: /* Return the number of screens on the X server of display DEVICE. +The optional argument DEVICE specifies which display to ask about. +DEVICE should be a device id, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (display) - Lisp_Object display; + (device) + Lisp_Object device; { - struct x_display_info *dpyinfo = check_x_display_info (display); + struct x_display_info *dpyinfo = check_x_display_info (device); return make_number (ScreenCount (dpyinfo->display)); } DEFUN ("x-display-mm-height", Fx_display_mm_height, Sx_display_mm_height, 0, 1, 0, - doc: /* Return the height in millimeters of the X display DISPLAY. -The optional argument DISPLAY specifies which display to ask about. -DISPLAY should be either a frame or a display name (a string). + doc: /* Return the height in millimeters of the X display DEVICE. +The optional argument DEVICE specifies which display to ask about. +DEVICE should be a device id, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (display) - Lisp_Object display; + (device) + Lisp_Object device; { - struct x_display_info *dpyinfo = check_x_display_info (display); + struct x_display_info *dpyinfo = check_x_display_info (device); return make_number (HeightMMOfScreen (dpyinfo->screen)); } DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width, 0, 1, 0, - doc: /* Return the width in millimeters of the X display DISPLAY. -The optional argument DISPLAY specifies which display to ask about. -DISPLAY should be either a frame or a display name (a string). + doc: /* Return the width in millimeters of the X display DEVICE. +The optional argument DEVICE specifies which display to ask about. +DEVICE should be a device id, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (display) - Lisp_Object display; + (device) + Lisp_Object device; { - struct x_display_info *dpyinfo = check_x_display_info (display); + struct x_display_info *dpyinfo = check_x_display_info (device); return make_number (WidthMMOfScreen (dpyinfo->screen)); } DEFUN ("x-display-backing-store", Fx_display_backing_store, Sx_display_backing_store, 0, 1, 0, - doc: /* Returns an indication of whether X display DISPLAY does backing store. + doc: /* Returns an indication of whether X display DEVICE does backing store. The value may be `always', `when-mapped', or `not-useful'. -The optional argument DISPLAY specifies which display to ask about. -DISPLAY should be either a frame or a display name (a string). +The optional argument DEVICE specifies which display to ask about. +DEVICE should be a device id, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (display) - Lisp_Object display; + (device) + Lisp_Object device; { - struct x_display_info *dpyinfo = check_x_display_info (display); + struct x_display_info *dpyinfo = check_x_display_info (device); Lisp_Object result; switch (DoesBackingStore (dpyinfo->screen)) @@ -3644,17 +3721,17 @@ If omitted or nil, that stands for the selected frame's display. */) DEFUN ("x-display-visual-class", Fx_display_visual_class, Sx_display_visual_class, 0, 1, 0, - doc: /* Return the visual class of the X display DISPLAY. + doc: /* Return the visual class of the X display DEVICE. The value is one of the symbols `static-gray', `gray-scale', `static-color', `pseudo-color', `true-color', or `direct-color'. -The optional argument DISPLAY specifies which display to ask about. -DISPLAY should be either a frame or a display name (a string). +The optional argument DEVICE specifies which display to ask about. +DEVICE should a device id, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (display) - Lisp_Object display; + (device) + Lisp_Object device; { - struct x_display_info *dpyinfo = check_x_display_info (display); + struct x_display_info *dpyinfo = check_x_display_info (device); Lisp_Object result; switch (dpyinfo->visual->class) @@ -3687,14 +3764,14 @@ If omitted or nil, that stands for the selected frame's display. */) DEFUN ("x-display-save-under", Fx_display_save_under, Sx_display_save_under, 0, 1, 0, - doc: /* Returns t if the X display DISPLAY supports the save-under feature. -The optional argument DISPLAY specifies which display to ask about. -DISPLAY should be either a frame or a display name (a string). + doc: /* Returns t if the X display DEVICE supports the save-under feature. +The optional argument DEVICE specifies which display to ask about. +DEVICE should be a device id, a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) - (display) - Lisp_Object display; + (device) + Lisp_Object device; { - struct x_display_info *dpyinfo = check_x_display_info (display); + struct x_display_info *dpyinfo = check_x_display_info (device); if (DoesSaveUnders (dpyinfo->screen) == True) return Qt; @@ -3970,30 +4047,11 @@ If DISPLAY is nil, that stands for the selected frame's display. */) Lisp_Object display; { struct x_display_info *dpyinfo = check_x_display_info (display); - int i; if (dpyinfo->reference_count > 0) error ("Display still has frames on it"); - BLOCK_INPUT; - /* Free the fonts in the font table. */ - for (i = 0; i < dpyinfo->n_fonts; i++) - if (dpyinfo->font_table[i].name) - { - XFreeFont (dpyinfo->display, dpyinfo->font_table[i].font); - } - - x_destroy_all_bitmaps (dpyinfo); - XSetCloseDownMode (dpyinfo->display, DestroyAll); - -#ifdef USE_X_TOOLKIT - XtCloseDisplay (dpyinfo->display); -#else - XCloseDisplay (dpyinfo->display); -#endif - - x_delete_display (dpyinfo); - UNBLOCK_INPUT; + x_delete_device (dpyinfo->device); return Qnil; } @@ -4310,6 +4368,14 @@ static Lisp_Object Vhourglass_delay; static void show_hourglass P_ ((struct atimer *)); static void hide_hourglass P_ ((void)); +/* Return non-zero if houglass timer has been started or hourglass is shown. */ + +int +hourglass_started () +{ + return hourglass_shown_p || hourglass_atimer != NULL; +} + /* Cancel a currently active hourglass timer, and start a new one. */ @@ -4530,23 +4596,12 @@ x_create_tip_frame (dpyinfo, parms, text) int width, height; int count = SPECPDL_INDEX (); struct gcpro gcpro1, gcpro2, gcpro3; - struct kboard *kb; int face_change_count_before = face_change_count; Lisp_Object buffer; struct buffer *old_buffer; check_x (); - /* Use this general default value to start with until we know if - this frame has a specified name. */ - Vx_resource_name = Vinvocation_name; - -#ifdef MULTI_KBOARD - kb = dpyinfo->kboard; -#else - kb = &the_only_kboard; -#endif - /* Get the name of the frame to use for resource lookup. */ name = x_get_arg (dpyinfo, parms, Qname, "name", "Name", RES_TYPE_STRING); if (!STRINGP (name) @@ -4554,8 +4609,6 @@ x_create_tip_frame (dpyinfo, parms, text) && !NILP (name)) error ("Invalid frame name--not a string or nil"); - Vx_resource_name = name; - frame = Qnil; GCPRO3 (parms, name, frame); f = make_frame (1); @@ -4575,8 +4628,8 @@ x_create_tip_frame (dpyinfo, parms, text) FRAME_CAN_HAVE_SCROLL_BARS (f) = 0; record_unwind_protect (unwind_create_tip_frame, frame); - f->display = dpyinfo->frame_display; - f->display->reference_count++; + f->device = dpyinfo->device; + f->device->reference_count++; /* By setting the output method, we're essentially saying that the frame is live, as per FRAME_LIVE_P. If we get a signal @@ -4599,9 +4652,6 @@ x_create_tip_frame (dpyinfo, parms, text) image_cache_refcount = FRAME_X_IMAGE_CACHE (f)->refcount; dpyinfo_refcount = dpyinfo->reference_count; #endif /* GLYPH_DEBUG */ -#ifdef MULTI_KBOARD - FRAME_KBOARD (f) = kb; -#endif f->output_data.x->parent_desc = FRAME_X_DISPLAY_INFO (f)->root_window; f->output_data.x->explicit_parent = 0; @@ -4696,7 +4746,7 @@ x_create_tip_frame (dpyinfo, parms, text) x_default_parameter (f, parms, Qborder_width, make_number (2), "borderWidth", "BorderWidth", RES_TYPE_NUMBER); - /* This defaults to 1 in order to match xterm. We recognize either + /* This defaults to 2 in order to match xterm. We recognize either internalBorderWidth or internalBorder (which is what xterm calls it). */ if (NILP (Fassq (Qinternal_border_width, parms))) @@ -5038,7 +5088,7 @@ Text larger than the specified size is clipped. */) clear_glyph_matrix (w->desired_matrix); clear_glyph_matrix (w->current_matrix); SET_TEXT_POS (pos, BEGV, BEGV_BYTE); - try_window (FRAME_ROOT_WINDOW (f), pos); + try_window (FRAME_ROOT_WINDOW (f), pos, 0); /* Compute width and height of the tooltip. */ width = height = 0;