(syms_of_ntproc) <w32-get-true-file-attributes>: Doc fix.
[bpt/emacs.git] / src / xfns.c
index e49f8cb..bfbc6ac 100644 (file)
@@ -1,6 +1,7 @@
 /* Functions for the X window system.
    Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-                 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+                 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+                 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -41,6 +42,7 @@ Boston, MA 02110-1301, USA.  */
 #include "keyboard.h"
 #include "blockinput.h"
 #include <epaths.h>
+#include "character.h"
 #include "charset.h"
 #include "coding.h"
 #include "fontset.h"
@@ -49,6 +51,10 @@ Boston, MA 02110-1301, USA.  */
 #include "atimer.h"
 #include "termchar.h"
 
+#ifdef USE_FONT_BACKEND
+#include "font.h"
+#endif /* USE_FONT_BACKEND */
+
 #ifdef HAVE_X_WINDOWS
 
 #include <ctype.h>
@@ -138,11 +144,7 @@ static Lisp_Object Vgtk_version_string;
 
 #endif /* USE_GTK */
 
-#ifdef HAVE_X11R4
 #define MAXREQUEST(dpy) (XMaxRequestSize (dpy))
-#else
-#define MAXREQUEST(dpy) ((dpy)->max_request_size)
-#endif
 
 /* The gray bitmap `bitmaps/gray'.  This is done because xterm.c uses
    it, and including `bitmaps/gray' more than once is a problem when
@@ -280,7 +282,7 @@ check_x_display_info (object)
     }
   else if (INTEGERP (object))
     {
-      struct terminal *t = get_terminal (XINT (object), 1);
+      struct terminal *t = get_terminal (object, 1);
 
       if (t->type != output_x_window)
         error ("Terminal %d is not an X display", XINT (object));
@@ -314,10 +316,10 @@ x_window_to_frame (dpyinfo, wdesc)
 
   if (wdesc == None) return 0;
 
-  for (tail = Vframe_list; GC_CONSP (tail); tail = XCDR (tail))
+  for (tail = Vframe_list; CONSP (tail); tail = XCDR (tail))
     {
       frame = XCAR (tail);
-      if (!GC_FRAMEP (frame))
+      if (!FRAMEP (frame))
         continue;
       f = XFRAME (frame);
       if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo)
@@ -366,10 +368,10 @@ x_any_window_to_frame (dpyinfo, wdesc)
   if (wdesc == None) return NULL;
 
   found = NULL;
-  for (tail = Vframe_list; GC_CONSP (tail) && !found; tail = XCDR (tail))
+  for (tail = Vframe_list; CONSP (tail) && !found; tail = XCDR (tail))
     {
       frame = XCAR (tail);
-      if (!GC_FRAMEP (frame))
+      if (!FRAMEP (frame))
         continue;
 
       f = XFRAME (frame);
@@ -421,10 +423,10 @@ x_non_menubar_window_to_frame (dpyinfo, wdesc)
 
   if (wdesc == None) return 0;
 
-  for (tail = Vframe_list; GC_CONSP (tail); tail = XCDR (tail))
+  for (tail = Vframe_list; CONSP (tail); tail = XCDR (tail))
     {
       frame = XCAR (tail);
-      if (!GC_FRAMEP (frame))
+      if (!FRAMEP (frame))
         continue;
       f = XFRAME (frame);
       if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo)
@@ -469,10 +471,10 @@ x_menubar_window_to_frame (dpyinfo, wdesc)
 
   if (wdesc == None) return 0;
 
-  for (tail = Vframe_list; GC_CONSP (tail); tail = XCDR (tail))
+  for (tail = Vframe_list; CONSP (tail); tail = XCDR (tail))
     {
       frame = XCAR (tail);
-      if (!GC_FRAMEP (frame))
+      if (!FRAMEP (frame))
         continue;
       f = XFRAME (frame);
       if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo)
@@ -516,10 +518,10 @@ x_top_window_to_frame (dpyinfo, wdesc)
 
   if (wdesc == None) return 0;
 
-  for (tail = Vframe_list; GC_CONSP (tail); tail = XCDR (tail))
+  for (tail = Vframe_list; CONSP (tail); tail = XCDR (tail))
     {
       frame = XCAR (tail);
-      if (!GC_FRAMEP (frame))
+      if (!FRAMEP (frame))
         continue;
       f = XFRAME (frame);
       if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo)
@@ -556,6 +558,8 @@ x_top_window_to_frame (dpyinfo, wdesc)
 
 \f
 
+static void x_default_font_parameter P_ ((struct frame *, Lisp_Object));
+
 static Lisp_Object unwind_create_frame P_ ((Lisp_Object));
 static Lisp_Object unwind_create_tip_frame P_ ((Lisp_Object));
 
@@ -935,7 +939,7 @@ x_set_background_color (f, arg, oldval)
             !NILP (bar);
             bar = XSCROLL_BAR (bar)->next)
          {
-           Window window = SCROLL_BAR_X_WINDOW (XSCROLL_BAR (bar));
+           Window window = XSCROLL_BAR (bar)->x_window;
            XSetWindowBackground (dpy, window, bg);
          }
       }
@@ -1555,55 +1559,30 @@ x_encode_text (string, coding_system, selectionp, text_bytes, stringp, freep)
      int selectionp;
      int *freep;
 {
-  unsigned char *str = SDATA (string);
-  int chars = SCHARS (string);
-  int bytes = SBYTES (string);
-  int charset_info;
-  int bufsize;
-  unsigned char *buf;
+  int result = string_xstring_p (string);
   struct coding_system coding;
-  extern Lisp_Object Qcompound_text_with_extensions;
 
-  charset_info = find_charset_in_text (str, chars, bytes, NULL, Qnil);
-  if (charset_info == 0)
+  if (result == 0)
     {
       /* No multibyte character in OBJ.  We need not encode it.  */
-      *text_bytes = bytes;
+      *text_bytes = SBYTES (string);
       *stringp = 1;
       *freep = 0;
-      return str;
+      return SDATA (string);
     }
 
   setup_coding_system (coding_system, &coding);
-  if (selectionp
-      && SYMBOLP (coding.pre_write_conversion)
-      && !NILP (Ffboundp (coding.pre_write_conversion)))
-    {
-      struct gcpro gcpro1;
-      /* We don't need to GCPRO string.  */
-      GCPRO1 (coding_system);
-      string = run_pre_post_conversion_on_str (string, &coding, 1);
-      UNGCPRO;
-      str = SDATA (string);
-      chars = SCHARS (string);
-      bytes = SBYTES (string);
-    }
-  coding.src_multibyte = 1;
-  coding.dst_multibyte = 0;
-  coding.mode |= CODING_MODE_LAST_BLOCK;
-  if (coding.type == coding_type_iso2022)
-    coding.flags |= CODING_FLAG_ISO_SAFE;
+  coding.mode |= (CODING_MODE_SAFE_ENCODING | CODING_MODE_LAST_BLOCK);
   /* We suppress producing escape sequences for composition.  */
-  coding.composing = COMPOSITION_DISABLED;
-  bufsize = encoding_buffer_size (&coding, bytes);
-  buf = (unsigned char *) xmalloc (bufsize);
-  encode_coding (&coding, str, buf, bytes, bufsize);
+  coding.common_flags &= ~CODING_ANNOTATION_MASK;
+  coding.dst_bytes = SCHARS (string) * 2;
+  coding.destination = (unsigned char *) xmalloc (coding.dst_bytes);
+  encode_coding_object (&coding, string, 0, 0,
+                       SCHARS (string), SBYTES (string), Qnil);
   *text_bytes = coding.produced;
-  *stringp = (charset_info == 1
-             || (!EQ (coding_system, Qcompound_text)
-                 && !EQ (coding_system, Qcompound_text_with_extensions)));
+  *stringp = (result == 1 || !EQ (coding_system, Qcompound_text));
   *freep = 1;
-  return buf;
+  return coding.destination;
 }
 
 \f
@@ -1619,7 +1598,6 @@ x_set_name_internal (f, name)
   if (FRAME_X_WINDOW (f))
     {
       BLOCK_INPUT;
-#ifdef HAVE_X11R4
       {
        XTextProperty text, icon;
        int bytes, stringp;
@@ -1687,12 +1665,6 @@ x_set_name_internal (f, name)
        if (do_free_text_value)
          xfree (text.value);
       }
-#else /* not HAVE_X11R4 */
-      XSetIconName (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
-                   SDATA (name));
-      XStoreName (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
-                 SDATA (name));
-#endif /* not HAVE_X11R4 */
       UNBLOCK_INPUT;
     }
 }
@@ -1778,15 +1750,7 @@ x_implicitly_set_name (f, arg, oldval)
 }
 \f
 /* Change the title of frame F to NAME.
-   If NAME is nil, use the frame name as the title.
-
-   If EXPLICIT is non-zero, that indicates that lisp code is setting the
-       name; if NAME is a string, set F's name to NAME and set
-       F->explicit_name; if NAME is Qnil, then clear F->explicit_name.
-
-   If EXPLICIT is zero, that indicates that Emacs redisplay code is
-       suggesting a new name, which lisp code should override; if
-       F->explicit_name is set, ignore the new name; otherwise, set it.  */
+   If NAME is nil, use the frame name as the title.  */
 
 void
 x_set_title (f, name, old_name)
@@ -1887,23 +1851,6 @@ x_default_scroll_bar_color_parameter (f, alist, prop, xprop, xclass,
 
 
 
-#if !defined (HAVE_X11R4) && !defined (HAVE_XSETWMPROTOCOLS)
-
-Status
-XSetWMProtocols (dpy, w, protocols, count)
-     Display *dpy;
-     Window w;
-     Atom *protocols;
-     int count;
-{
-  Atom prop;
-  prop = XInternAtom (dpy, "WM_PROTOCOLS", False);
-  if (prop == None) return False;
-  XChangeProperty (dpy, w, prop, XA_ATOM, 32, PropModeReplace,
-                  (unsigned char *) protocols, count);
-  return True;
-}
-#endif /* not HAVE_X11R4 && not HAVE_XSETWMPROTOCOLS */
 \f
 #ifdef USE_X_TOOLKIT
 
@@ -1982,6 +1929,7 @@ hack_wm_protocols (f, widget)
 #ifdef HAVE_X_I18N
 
 static XFontSet xic_create_xfontset P_ ((struct frame *, char *));
+static XFontSet xic_create_xfontset2 P_ ((struct frame *));
 static XIMStyle best_xim_style P_ ((XIMStyles *, XIMStyles *));
 
 
@@ -2133,6 +2081,29 @@ xic_create_fontsetname (base_fontname, motif)
   return fontsetname;
 }
 
+#ifdef DEBUG_XIC_FONTSET
+static void
+print_fontset_result (xfs, name, missing_list, missing_count)
+     XFontSet xfs;
+     char *name;
+     char **missing_list;
+     int missing_count;
+{
+  if (xfs)
+    fprintf (stderr, "XIC Fontset created: %s\n", name);
+  else
+    {
+      fprintf (stderr, "XIC Fontset failed: %s\n", name);
+      while (missing_count-- > 0)
+       {
+         fprintf (stderr, "  missing: %s\n", *missing_list);
+         missing_list++;
+       }
+    }
+
+}
+#endif
+
 static XFontSet
 xic_create_xfontset (f, base_fontname)
      struct frame *f;
@@ -2169,6 +2140,9 @@ xic_create_xfontset (f, base_fontname)
       xfs = XCreateFontSet (FRAME_X_DISPLAY (f),
                            fontsetname, &missing_list,
                            &missing_count, &def_string);
+#ifdef DEBUG_XIC_FONTSET
+      print_fontset_result (xfs, fontsetname, missing_list, missing_count);
+#endif
       if (missing_list)
        XFreeStringList (missing_list);
       if (! xfs)
@@ -2187,6 +2161,9 @@ xic_create_xfontset (f, base_fontname)
              xfs = XCreateFontSet (FRAME_X_DISPLAY (f),
                                    p0, &missing_list,
                                    &missing_count, &def_string);
+#ifdef DEBUG_XIC_FONTSET
+             print_fontset_result (xfs, p0, missing_list, missing_count);
+#endif
              if (missing_list)
                XFreeStringList (missing_list);
              if (xfs)
@@ -2195,6 +2172,20 @@ xic_create_xfontset (f, base_fontname)
            }
        }
       xfree (fontsetname);
+      if (! xfs && base_fontname != xic_defaut_fontset)
+       {
+         /* Try the default fontset name at a last resort.  */
+         fontsetname = xic_create_fontsetname (xic_defaut_fontset, False);
+         xfs = XCreateFontSet (FRAME_X_DISPLAY (f),
+                               fontsetname, &missing_list,
+                               &missing_count, &def_string);
+#ifdef DEBUG_XIC_FONTSET
+         print_fontset_result (xfs, fontsetname, missing_list, missing_count);
+#endif
+         if (missing_list)
+           XFreeStringList (missing_list);
+         xfree (fontsetname);
+       }
     }
 
   if (FRAME_XIC_BASE_FONTNAME (f))
@@ -2205,6 +2196,107 @@ xic_create_xfontset (f, base_fontname)
   return xfs;
 }
 
+#ifdef USE_FONT_BACKEND
+
+static XFontSet
+xic_create_xfontset2 (f)
+     struct frame *f;
+{
+  XFontSet xfs = NULL;
+  struct font *font = FRAME_FONT_OBJECT (f);
+  int pixel_size = font->pixel_size;
+  Lisp_Object rest, frame;
+
+  /* See if there is another frame already using same fontset.  */
+  FOR_EACH_FRAME (rest, frame)
+    {
+      struct frame *cf = XFRAME (frame);
+
+      if (cf != f && FRAME_LIVE_P (f) && FRAME_X_P (cf)
+          && FRAME_X_DISPLAY_INFO (cf) == FRAME_X_DISPLAY_INFO (f)
+         && FRAME_FONT_OBJECT (f)
+         && FRAME_FONT_OBJECT (f)->pixel_size == pixel_size)
+        {
+          xfs = FRAME_XIC_FONTSET (cf);
+          break;
+        }
+    }
+
+  if (! xfs)
+    {
+      char buf[256];
+      char **missing_list;
+      int missing_count;
+      char *def_string;
+      char *xlfd_format = "-*-*-medium-r-normal--%d-*-*-*-*-*";
+
+      sprintf (buf, xlfd_format, pixel_size);
+      missing_list = NULL;
+      xfs = XCreateFontSet (FRAME_X_DISPLAY (f), buf,
+                           &missing_list, &missing_count, &def_string);
+#ifdef DEBUG_XIC_FONTSET
+      print_fontset_result (xfs, buf, missing_list, missing_count);
+#endif
+      if (missing_list)
+       XFreeStringList (missing_list);
+      if (! xfs)
+       {
+         /* List of pixel sizes most likely available.  Find one that
+            is closest to pixel_size.  */
+         int sizes[] = {0, 8, 10, 11, 12, 14, 17, 18, 20, 24, 26, 34, 0};
+         int *smaller, *larger;
+
+         for (smaller = sizes; smaller[1]; smaller++)
+           if (smaller[1] >= pixel_size)
+             break;
+         larger = smaller + 1;
+         if (*larger == pixel_size)
+           larger++;
+         while (*smaller || *larger)
+           {
+             int this_size;
+
+             if (! *larger)
+               this_size = *smaller--;
+             else if (! *smaller)
+               this_size = *larger++;
+             else if (pixel_size - *smaller < *larger - pixel_size)
+               this_size = *smaller--;
+             else
+               this_size = *larger++;
+             sprintf (buf, xlfd_format, this_size);
+             missing_list = NULL;
+             xfs = XCreateFontSet (FRAME_X_DISPLAY (f), buf,
+                                   &missing_list, &missing_count, &def_string);
+#ifdef DEBUG_XIC_FONTSET
+             print_fontset_result (xfs, buf, missing_list, missing_count);
+#endif
+             if (missing_list)
+               XFreeStringList (missing_list);
+             if (xfs)
+               break;
+           }
+       }
+      if (! xfs)
+       {
+         char *last_resort = "-*-*-*-r-normal--*-*-*-*-*-*";
+
+         missing_list = NULL;
+         xfs = XCreateFontSet (FRAME_X_DISPLAY (f), last_resort,
+                               &missing_list, &missing_count, &def_string);
+#ifdef DEBUG_XIC_FONTSET
+         print_fontset_result (xfs, last_resort, missing_list, missing_count);
+#endif
+         if (missing_list)
+           XFreeStringList (missing_list);
+       }
+
+    }
+
+  return xfs;
+}
+#endif /* USE_FONT_BACKEND */
+
 /* Free the X fontset of frame F if it is the last frame using it.  */
 
 void
@@ -2277,6 +2369,11 @@ create_frame_xic (f)
     return;
 
   /* Create X fontset. */
+#ifdef USE_FONT_BACKEND
+  if (enable_font_backend)
+    xfs = xic_create_xfontset2 (f);
+  else
+#endif
   xfs = xic_create_xfontset
     (f, (FRAME_FONTSET (f) < 0) ? NULL
         : (char *) SDATA (fontset_ascii (FRAME_FONTSET (f))));
@@ -2435,6 +2532,11 @@ xic_set_xfontset (f, base_fontname)
 
   xic_free_xfontset (f);
 
+#ifdef USE_FONT_BACKEND
+  if (enable_font_backend)
+    xfs = xic_create_xfontset2 (f);
+  else
+#endif
   xfs = xic_create_xfontset (f, base_fontname);
 
   attr = XVaCreateNestedList (0, XNFontSet, xfs, NULL);
@@ -2618,6 +2720,10 @@ x_window (f, window_prompting, minibuffer_only)
   XtManageChild (pane_widget);
   XtRealizeWidget (shell_widget);
 
+  if (FRAME_X_EMBEDDED_P (f))
+    XReparentWindow (FRAME_X_DISPLAY (f), XtWindow (shell_widget),
+                    f->output_data.x->parent_desc, 0, 0);
+
   FRAME_X_WINDOW (f) = XtWindow (frame_widget);
 
   validate_x_resource_name ();
@@ -2874,7 +2980,9 @@ x_icon (f, parms)
      Lisp_Object parms;
 {
   Lisp_Object icon_x, icon_y;
+#if 0
   struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
+#endif
 
   /* Set the position of the icon.  Note that twm groups all
      icons in an icon window.  */
@@ -2934,6 +3042,11 @@ x_make_gc (f)
      Note that many default values are used.  */
 
   /* Normal video */
+#ifdef USE_FONT_BACKEND
+  if (enable_font_backend)
+    gc_values.font = FRAME_X_DISPLAY_INFO (f)->font->fid;
+  else
+#endif
   gc_values.font = FRAME_FONT (f)->fid;
   gc_values.foreground = FRAME_FOREGROUND_PIXEL (f);
   gc_values.background = FRAME_BACKGROUND_PIXEL (f);
@@ -3060,11 +3173,49 @@ unwind_create_frame (frame)
   return Qnil;
 }
 
+#ifdef USE_FONT_BACKEND
+static void
+x_default_font_parameter (f, parms)
+     struct frame *f;
+     Lisp_Object parms;
+{
+  struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
+  Lisp_Object font = x_get_arg (dpyinfo, parms, Qfont, "font", "Font",
+                               RES_TYPE_STRING);
+
+  if (! STRINGP (font))
+    {
+      char *names[]
+       = { "-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1",
+           "-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-1",
+           "-*-*-medium-r-normal-*-*-140-*-*-c-*-iso8859-1",
+           /* This was formerly the first thing tried, but it finds
+              too many fonts and takes too long.  */
+           "-*-*-medium-r-*-*-*-*-*-*-c-*-iso8859-1",
+           /* If those didn't work, look for something which will
+              at least work.  */
+           "-*-fixed-*-*-*-*-*-140-*-*-c-*-iso8859-1",
+           "fixed",
+           NULL };
+      int i;
+
+      for (i = 0; names[i]; i++)
+       {
+         font = font_open_by_name (f, names[i]);
+         if (! NILP (font))
+           break;
+       }
+      if (NILP (font))
+       error ("No suitable font was found");
+    }
+  x_default_parameter (f, parms, Qfont, font, "font", "Font", RES_TYPE_STRING);
+}
+#endif /* USE_FONT_BACKEND */
 
 DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
        1, 1, 0,
        doc: /* Make a new X window, which is called a "frame" in Emacs terms.
-Returns an Emacs frame object.
+Return an Emacs frame object.
 ALIST is an alist of frame parameters.
 If the parameters specify that the frame should not have a minibuffer,
 and do not specify a specific minibuffer window to use,
@@ -3106,8 +3257,8 @@ This function is an internal primitive--use `make-frame' instead.  */)
   kb = &the_only_kboard;
 #endif
 
-  if (dpyinfo->terminal->deleted)
-    error ("Terminal is being deleted, can't create new frames on it");
+  if (!dpyinfo->terminal->name)
+    error ("Terminal is not live, can't create new frames on it");
 
   name = x_get_arg (dpyinfo, parms, Qname, "name", "Name", RES_TYPE_STRING);
   if (!STRINGP (name)
@@ -3175,7 +3326,7 @@ This function is an internal primitive--use `make-frame' instead.  */)
   /* With FRAME_X_DISPLAY_INFO set up, this unwind-protect is safe.  */
   record_unwind_protect (unwind_create_frame, frame);
 #if GLYPH_DEBUG
-  image_cache_refcount = FRAME_X_IMAGE_CACHE (f)->refcount;
+  image_cache_refcount = FRAME_IMAGE_CACHE (f)->refcount;
   dpyinfo_refcount = dpyinfo->reference_count;
 #endif /* GLYPH_DEBUG */
 
@@ -3240,43 +3391,75 @@ This function is an internal primitive--use `make-frame' instead.  */)
       specbind (Qx_resource_name, name);
     }
 
+  f->resx = dpyinfo->resx;
+  f->resy = dpyinfo->resy;
+
+#ifdef USE_FONT_BACKEND
+  if (enable_font_backend)
+    {
+      /* Perhaps, we must allow frame parameter, say `font-backend',
+        to specify which font backends to use.  */
+#ifdef HAVE_FREETYPE
+#ifdef HAVE_XFT
+      register_font_driver (&xftfont_driver, f);
+#else  /* not HAVE_XFT */
+      register_font_driver (&ftxfont_driver, f);
+#endif /* not HAVE_XFT */
+#endif /* HAVE_FREETYPE */
+      register_font_driver (&xfont_driver, f);
+
+      x_default_parameter (f, parms, Qfont_backend, Qnil,
+                          "fontBackend", "FontBackend", RES_TYPE_STRING);
+    }
+#endif /* USE_FONT_BACKEND */
+
   /* Extract the window parameters from the supplied values
      that are needed to determine window geometry.  */
+#ifdef USE_FONT_BACKEND
+  if (enable_font_backend)
+    x_default_font_parameter (f, parms);
+else
+#endif /* USE_FONT_BACKEND */
   {
     Lisp_Object font;
 
     font = x_get_arg (dpyinfo, parms, Qfont, "font", "Font", RES_TYPE_STRING);
 
-    BLOCK_INPUT;
-    /* First, try whatever font the caller has specified.  */
-    if (STRINGP (font))
-      {
-       tem = Fquery_fontset (font, Qnil);
-       if (STRINGP (tem))
-         font = x_new_fontset (f, SDATA (tem));
-       else
-         font = x_new_font (f, SDATA (font));
-      }
-
-    /* Try out a font which we hope has bold and italic variations.  */
-    if (!STRINGP (font))
-      font = x_new_font (f, "-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1");
+    /* If the caller has specified no font, try out fonts which we
+       hope have bold and italic variations.  */
     if (!STRINGP (font))
-      font = x_new_font (f, "-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-1");
-    if (! STRINGP (font))
-      font = x_new_font (f, "-*-*-medium-r-normal-*-*-140-*-*-c-*-iso8859-1");
-    if (! STRINGP (font))
-      /* This was formerly the first thing tried, but it finds too many fonts
-        and takes too long.  */
-      font = x_new_font (f, "-*-*-medium-r-*-*-*-*-*-*-c-*-iso8859-1");
-    /* If those didn't work, look for something which will at least work.  */
-    if (! STRINGP (font))
-      font = x_new_font (f, "-*-fixed-*-*-*-*-*-140-*-*-c-*-iso8859-1");
-    UNBLOCK_INPUT;
-    if (! STRINGP (font))
-      font = build_string ("fixed");
+      {
+       char *names[]
+         = { "-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1",
+             "-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-1",
+             "-*-*-medium-r-normal-*-*-140-*-*-c-*-iso8859-1",
+             /* This was formerly the first thing tried, but it finds
+                too many fonts and takes too long.  */
+             "-*-*-medium-r-*-*-*-*-*-*-c-*-iso8859-1",
+             /* If those didn't work, look for something which will
+                at least work.  */
+             "-*-fixed-*-*-*-*-*-140-*-*-c-*-iso8859-1",
+             NULL };
+       int i;
+
+       BLOCK_INPUT;
+       for (i = 0; names[i]; i++)
+         {
+           Lisp_Object list;
 
-    x_set_frame_parameters (f, Fcons (Fcons (Qfont, font), Qnil));
+           list = x_list_fonts (f, build_string (names[i]), 0, 1);
+           if (CONSP (list))
+             {
+               font = XCAR (list);
+               break;
+             }
+         }
+       UNBLOCK_INPUT;
+       if (! STRINGP (font))
+         font = build_string ("fixed");
+      }
+    x_default_parameter (f, parms, Qfont, font,
+                        "font", "Font", RES_TYPE_STRING);
   }
 
 #ifdef USE_LUCID
@@ -3285,8 +3468,10 @@ This function is an internal primitive--use `make-frame' instead.  */)
   xlwmenu_default_font = FRAME_FONT (f);
 #endif
 
-  x_default_parameter (f, parms, Qborder_width, make_number (2),
-                      "borderWidth", "BorderWidth", RES_TYPE_NUMBER);
+  /* Frame contents get displaced if an embedded X window has a border.  */
+  if (! FRAME_X_EMBEDDED_P (f))
+    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
      internalBorderWidth or internalBorder (which is what xterm calls
@@ -3357,8 +3542,6 @@ This function is an internal primitive--use `make-frame' instead.  */)
   x_default_parameter (f, parms, Qfullscreen, Qnil,
                        "fullscreen", "Fullscreen", RES_TYPE_SYMBOL);
 
-  f->output_data.x->parent_desc = FRAME_X_DISPLAY_INFO (f)->root_window;
-
   /* Compute the size of the X window.  */
   window_prompting = x_figure_window_size (f, parms, 1);
 
@@ -3474,12 +3657,10 @@ This function is an internal primitive--use `make-frame' instead.  */)
 
   /* All remaining specified parameters, which have not been "used"
      by x_get_arg and friends, now go in the misc. alist of the frame.  */
-  for (tem = parms; !NILP (tem); tem = XCDR (tem))
+  for (tem = parms; CONSP (tem); tem = XCDR (tem))
     if (CONSP (XCAR (tem)) && !NILP (XCAR (XCAR (tem))))
       f->param_alist = Fcons (XCAR (tem), f->param_alist);
 
-  store_frame_param (f, Qwindow_system, Qx);
-
   UNGCPRO;
 
   /* Make sure windows on this frame appear in calls to next-window
@@ -3627,7 +3808,7 @@ 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 TERMINAL.
+       doc: /* Return the width in pixels of the X display TERMINAL.
 The optional argument TERMINAL specifies which display to ask about.
 TERMINAL should be a terminal id, a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -3641,7 +3822,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 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 TERMINAL.
+       doc: /* Return the height in pixels of the X display TERMINAL.
 The optional argument TERMINAL specifies which display to ask about.
 TERMINAL should be a terminal id, a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -3655,7 +3836,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes,
        0, 1, 0,
-       doc: /* Returns the number of bitplanes of the X display TERMINAL.
+       doc: /* Return the number of bitplanes of the X display TERMINAL.
 The optional argument TERMINAL specifies which display to ask about.
 TERMINAL should be a terminal id, a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -3669,7 +3850,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 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 TERMINAL.
+       doc: /* Return the number of color cells of the X display TERMINAL.
 The optional argument TERMINAL specifies which display to ask about.
 TERMINAL should be a terminal id, a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -3694,7 +3875,7 @@ 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 TERMINAL.
+       doc: /* Return the maximum request size of the X server of display TERMINAL.
 The optional argument TERMINAL specifies which display to ask about.
 TERMINAL should be a terminal id, a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -3707,7 +3888,7 @@ If omitted or nil, that stands for the selected frame's 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 TERMINAL.
+       doc: /* Return the "vendor ID" string of the X server of display TERMINAL.
 \(Labelling every distributor as a "vendor" embodies the false assumption
 that operating systems cannot be developed and distributed noncommercially.)
 The optional argument TERMINAL specifies which display to ask about.
@@ -3724,7 +3905,7 @@ 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 TERMINAL.
+       doc: /* Return the version numbers of the X server of display TERMINAL.
 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'.
@@ -3784,7 +3965,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-backing-store", Fx_display_backing_store,
        Sx_display_backing_store, 0, 1, 0,
-       doc: /* Returns an indication of whether X display TERMINAL does backing store.
+       doc: /* Return an indication of whether X display TERMINAL does backing store.
 The value may be `always', `when-mapped', or `not-useful'.
 The optional argument TERMINAL specifies which display to ask about.
 TERMINAL should be a terminal id, a frame or a display name (a string).
@@ -3862,7 +4043,7 @@ 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 TERMINAL supports the save-under feature.
+       doc: /* Return t if the X display TERMINAL supports the save-under feature.
 The optional argument TERMINAL specifies which display to ask about.
 TERMINAL should be a terminal id, a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -4021,11 +4202,7 @@ select_visual (dpyinfo)
 
       dpyinfo->visual = DefaultVisualOfScreen (screen);
 
-#ifdef HAVE_X11R4
       vinfo_template.visualid = XVisualIDFromVisual (dpyinfo->visual);
-#else
-      vinfo_template.visualid = dpyinfo->visual->visualid;
-#endif
       vinfo_template.screen = XScreenNumberOfScreen (screen);
       vinfo = XGetVisualInfo (dpy, VisualIDMask | VisualScreenMask,
                              &vinfo_template, &n_visuals);
@@ -4162,7 +4339,7 @@ DEFUN ("x-display-list", Fx_display_list, Sx_display_list, 0, 0, 0,
   Lisp_Object tail, result;
 
   result = Qnil;
-  for (tail = x_display_name_list; ! NILP (tail); tail = XCDR (tail))
+  for (tail = x_display_name_list; CONSP (tail); tail = XCDR (tail))
     result = Fcons (XCAR (XCAR (tail)), result);
 
   return result;
@@ -4701,8 +4878,8 @@ x_create_tip_frame (dpyinfo, parms, text)
 
   check_x ();
 
-  if (dpyinfo->terminal->deleted)
-    error ("Terminal is being deleted, can't create new frames on it");
+  if (!dpyinfo->terminal->name)
+    error ("Terminal is not live, can't create new frames on it");
 
   parms = Fcopy_alist (parms);
 
@@ -4753,7 +4930,7 @@ x_create_tip_frame (dpyinfo, parms, text)
   f->icon_name = Qnil;
   FRAME_X_DISPLAY_INFO (f) = dpyinfo;
 #if GLYPH_DEBUG
-  image_cache_refcount = FRAME_X_IMAGE_CACHE (f)->refcount;
+  image_cache_refcount = FRAME_IMAGE_CACHE (f)->refcount;
   dpyinfo_refcount = dpyinfo->reference_count;
 #endif /* GLYPH_DEBUG */
   f->output_data.x->parent_desc = FRAME_X_DISPLAY_INFO (f)->root_window;
@@ -4807,8 +4984,35 @@ x_create_tip_frame (dpyinfo, parms, text)
       specbind (Qx_resource_name, name);
     }
 
+  f->resx = dpyinfo->resx;
+  f->resy = dpyinfo->resy;
+
+#ifdef USE_FONT_BACKEND
+  if (enable_font_backend)
+    {
+      /* Perhaps, we must allow frame parameter, say `font-backend',
+        to specify which font backends to use.  */
+#ifdef HAVE_FREETYPE
+#ifdef HAVE_XFT
+      register_font_driver (&xftfont_driver, f);
+#else  /* not HAVE_XFT */
+      register_font_driver (&ftxfont_driver, f);
+#endif /* not HAVE_XFT */
+#endif /* HAVE_FREETYPE */
+      register_font_driver (&xfont_driver, f);
+
+      x_default_parameter (f, parms, Qfont_backend, Qnil,
+                          "fontBackend", "FontBackend", RES_TYPE_STRING);
+    }
+#endif /* USE_FONT_BACKEND */
+
   /* Extract the window parameters from the supplied values that are
      needed to determine window geometry.  */
+#ifdef USE_FONT_BACKEND
+  if (enable_font_backend)
+    x_default_font_parameter (f, parms);
+else
+#endif /* USE_FONT_BACKEND */
   {
     Lisp_Object font;
 
@@ -4820,7 +5024,7 @@ x_create_tip_frame (dpyinfo, parms, text)
       {
        tem = Fquery_fontset (font, Qnil);
        if (STRINGP (tem))
-         font = x_new_fontset (f, SDATA (tem));
+         font = x_new_fontset (f, tem);
        else
          font = x_new_font (f, SDATA (font));
       }
@@ -4843,8 +5047,7 @@ x_create_tip_frame (dpyinfo, parms, text)
     if (! STRINGP (font))
       font = build_string ("fixed");
 
-    x_default_parameter (f, parms, Qfont, font,
-                        "font", "Font", RES_TYPE_STRING);
+    x_set_frame_parameters (f, Fcons (Fcons (Qfont, font), Qnil));
   }
 
   x_default_parameter (f, parms, Qborder_width, make_number (2),
@@ -4945,6 +5148,26 @@ x_create_tip_frame (dpyinfo, parms, text)
     Fmodify_frame_parameters (frame, Fcons (Fcons (intern ("tooltip"), Qt),
                                            Qnil));
 
+  /* FIXME - can this be done in a similar way to normal frames?
+     http://lists.gnu.org/archive/html/emacs-devel/2007-10/msg00641.html */
+
+  /* Set the `display-type' frame parameter before setting up faces. */
+  {
+    Lisp_Object disptype;
+
+    if (FRAME_X_DISPLAY_INFO (f)->n_planes == 1)
+      disptype = intern ("mono");
+    else if (FRAME_X_DISPLAY_INFO (f)->visual->class == GrayScale
+             || FRAME_X_DISPLAY_INFO (f)->visual->class == StaticGray)
+      disptype = intern ("grayscale");
+    else
+      disptype = intern ("color");
+
+    if (NILP (Fframe_parameter (frame, Qdisplay_type)))
+      Fmodify_frame_parameters (frame, Fcons (Fcons (Qdisplay_type, disptype),
+                                              Qnil));
+  }
+
   /* Set up faces after all frame parameters are known.  This call
      also merges in face attributes specified for new frames.
 
@@ -4965,8 +5188,6 @@ x_create_tip_frame (dpyinfo, parms, text)
                                              Qnil));
   }
 
-  Fmodify_frame_parameters (frame, Fcons (Fcons (Qwindow_system, Qx), Qnil));
-
   f->no_split = 1;
 
   UNGCPRO;
@@ -5096,6 +5317,9 @@ Text larger than the specified size is clipped.  */)
   GCPRO4 (string, parms, frame, timeout);
 
   CHECK_STRING (string);
+  if (SCHARS (string) == 0)
+    string = make_unibyte_string (" ", 1);
+
   f = check_x_frame (frame);
   if (NILP (timeout))
     timeout = make_number (5);
@@ -5767,6 +5991,9 @@ frame_parm_handler x_frame_parm_handlers[] =
   x_set_fringe_width,
   x_set_wait_for_wm,
   x_set_fullscreen,
+#ifdef USE_FONT_BACKEND
+  x_set_font_backend
+#endif /* USE_FONT_BACKEND */
 };
 
 void
@@ -5977,6 +6204,7 @@ the tool bar buttons.  */);
   find_ccl_program_func = x_find_ccl_program;
   query_font_func = x_query_font;
   set_frame_fontset_func = x_set_font;
+  get_font_repertory_func = x_get_font_repertory;
   check_window_system_func = check_x;
 
   hourglass_atimer = NULL;