]> code.delx.au - gnu-emacs/blobdiff - src/minibuf.c
Merge from origin/emacs-25
[gnu-emacs] / src / minibuf.c
index 3d34635c6c0fbed92db5298c0eef2124d73168bd..efce7e26b29519ab2c1edc9da3ee137c9f746e9b 100644 (file)
@@ -194,7 +194,7 @@ read_minibuf_noninteractive (Lisp_Object map, Lisp_Object initial,
   int c;
   unsigned char hide_char = 0;
   struct emacs_tty etty;
-  bool etty_valid;
+  bool etty_valid UNINIT;
 
   /* Check, whether we need to suppress echoing.  */
   if (CHARACTERP (Vread_hide_char))
@@ -203,10 +203,10 @@ read_minibuf_noninteractive (Lisp_Object map, Lisp_Object initial,
   /* Manipulate tty.  */
   if (hide_char)
     {
-      etty_valid = emacs_get_tty (fileno (stdin), &etty) == 0;
+      etty_valid = emacs_get_tty (STDIN_FILENO, &etty) == 0;
       if (etty_valid)
-       set_binary_mode (fileno (stdin), O_BINARY);
-      suppress_echo_on_tty (fileno (stdin));
+       set_binary_mode (STDIN_FILENO, O_BINARY);
+      suppress_echo_on_tty (STDIN_FILENO);
     }
 
   fwrite (SDATA (prompt), 1, SBYTES (prompt), stdout);
@@ -240,8 +240,8 @@ read_minibuf_noninteractive (Lisp_Object map, Lisp_Object initial,
       fprintf (stdout, "\n");
       if (etty_valid)
        {
-         emacs_set_tty (fileno (stdin), &etty, 0);
-         set_binary_mode (fileno (stdin), O_TEXT);
+         emacs_set_tty (STDIN_FILENO, &etty, 0);
+         set_binary_mode (STDIN_FILENO, O_TEXT);
        }
     }
 
@@ -630,8 +630,31 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt,
                            Qrear_nonsticky, Qt, Qnil);
        Fput_text_property (make_number (BEG), make_number (PT),
                            Qfield, Qt, Qnil);
-       Fadd_text_properties (make_number (BEG), make_number (PT),
-                             Vminibuffer_prompt_properties, Qnil);
+       if (CONSP (Vminibuffer_prompt_properties))
+         {
+           /* We want to apply all properties from
+              `minibuffer-prompt-properties' to the region normally,
+              but if the `face' property is present, add that
+              property to the end of the face properties to avoid
+              overwriting faces. */
+           Lisp_Object list = Vminibuffer_prompt_properties;
+           while (CONSP (list))
+             {
+               Lisp_Object key = XCAR (list);
+               list = XCDR (list);
+               if (CONSP (list))
+                 {
+                   Lisp_Object val = XCAR (list);
+                   list = XCDR (list);
+                   if (EQ (key, Qface))
+                     Fadd_face_text_property (make_number (BEG),
+                                              make_number (PT), val, Qt, Qnil);
+                   else
+                     Fput_text_property (make_number (BEG), make_number (PT),
+                                         key, val, Qnil);
+                 }
+             }
+         }
       }
     unbind_to (count1, Qnil);
   }
@@ -742,27 +765,25 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt,
 }
 
 /* Return a buffer to be used as the minibuffer at depth `depth'.
- depth = 0 is the lowest allowed argument, and that is the value
- used for nonrecursive minibuffer invocations.  */
  depth = 0 is the lowest allowed argument, and that is the value
  used for nonrecursive minibuffer invocations.  */
 
 Lisp_Object
 get_minibuffer (EMACS_INT depth)
 {
-  Lisp_Object tail, num, buf;
-  char name[sizeof " *Minibuf-*" + INT_STRLEN_BOUND (EMACS_INT)];
-
-  XSETFASTINT (num, depth);
-  tail = Fnthcdr (num, Vminibuffer_list);
+  Lisp_Object tail = Fnthcdr (make_number (depth), Vminibuffer_list);
   if (NILP (tail))
     {
       tail = list1 (Qnil);
       Vminibuffer_list = nconc2 (Vminibuffer_list, tail);
     }
-  buf = Fcar (tail);
+  Lisp_Object buf = Fcar (tail);
   if (NILP (buf) || !BUFFER_LIVE_P (XBUFFER (buf)))
     {
-      buf = Fget_buffer_create
-       (make_formatted_string (name, " *Minibuf-%"pI"d*", depth));
+      static char const name_fmt[] = " *Minibuf-%"pI"d*";
+      char name[sizeof name_fmt + INT_STRLEN_BOUND (EMACS_INT)];
+      AUTO_STRING_WITH_LEN (lname, name, sprintf (name, name_fmt, depth));
+      buf = Fget_buffer_create (lname);
 
       /* Although the buffer's name starts with a space, undo should be
         enabled in it.  */