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 <config.h>
This skips events that are integers or symbols.
f -- Existing file name.
F -- Possibly nonexistent file name.
+G -- Possibly nonexistent file name, defaulting to just directory name.
i -- Ignored, i.e. always nil. Does not do I/O.
k -- Key sequence (downcase the last event if needed to get a definition).
K -- Key sequence to be redefined (do not downcase the last event).
r -- Region: point and mark as 2 numeric args, smallest first. Does no I/O.
s -- Any string. Does not inherit the current input method.
S -- Any symbol.
+U -- Mouse up event discarded by a previous k or K argument.
v -- Variable name: symbol that is user-variable-p.
x -- Lisp expression read but not evaluated.
X -- Lisp expression read and evaluated.
Lisp_Object *args, *visargs;
unsigned char **argstrings;
Lisp_Object fun;
- Lisp_Object funcar;
Lisp_Object specs;
Lisp_Object filter_specs;
Lisp_Object teml;
+ Lisp_Object up_event;
Lisp_Object enable;
int speccount = SPECPDL_INDEX ();
char prompt1[100];
char *tem1;
int arg_from_tty = 0;
- struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+ struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
int key_count;
int record_then_fail = 0;
The feature is not fully implemented. */
filter_specs = Qnil;
+ /* If k or K discard an up-event, save it here so it can be retrieved with U */
+ up_event = Qnil;
+
/* Decode the kind of function. Either handle it and return,
or go to `lose' if not interactive, or go to `retry'
to specify a different function, or set either STRING or SPECS. */
string++;
else if (*string == '@')
{
- Lisp_Object event;
+ Lisp_Object event, tem;
event = (next_event < key_count
? XVECTOR (keys)->contents[next_event]
: Qnil);
if (EVENT_HAS_PARAMETERS (event)
- && (event = XCDR (event), CONSP (event))
- && (event = XCAR (event), CONSP (event))
- && (event = XCAR (event), WINDOWP (event)))
+ && (tem = XCDR (event), CONSP (tem))
+ && (tem = XCAR (tem), CONSP (tem))
+ && (tem = XCAR (tem), WINDOWP (tem)))
{
- if (MINI_WINDOW_P (XWINDOW (event))
- && ! (minibuf_level > 0 && EQ (event, minibuf_window)))
+ if (MINI_WINDOW_P (XWINDOW (tem))
+ && ! (minibuf_level > 0 && EQ (tem, minibuf_window)))
error ("Attempt to select inactive minibuffer window");
/* If the current buffer wants to clean up, let it. */
if (!NILP (Vmouse_leave_buffer_hook))
call1 (Vrun_hooks, Qmouse_leave_buffer_hook);
- Fselect_window (event, Qnil);
+ Fselect_window (tem, Qnil);
}
string++;
}
varies[i] = 0;
}
- GCPRO4 (prefix_arg, function, *args, *visargs);
+ GCPRO5 (prefix_arg, function, *args, *visargs, up_event);
gcpro3.nvars = (count + 1);
gcpro4.nvars = (count + 1);
Qnil, Qnil, Qnil, Qnil, Qnil);
break;
+ case 'G': /* Possibly nonexistent file name,
+ default to directory alone. */
+ args[i] = Fread_file_name (build_string (callint_message),
+ Qnil, Qnil, Qnil, build_string (""), Qnil);
+ break;
+
case 'i': /* Ignore an argument -- Does not do I/O */
varies[i] = -1;
break;
/* Ignore first element, which is the base key. */
tem2 = Fmemq (intern ("down"), Fcdr (teml));
if (! NILP (tem2))
- Fread_event (Qnil, Qnil);
+ up_event = Fread_event (Qnil, Qnil);
}
}
break;
/* Ignore first element, which is the base key. */
tem2 = Fmemq (intern ("down"), Fcdr (teml));
if (! NILP (tem2))
- Fread_event (Qnil, Qnil);
+ up_event = Fread_event (Qnil, Qnil);
}
}
break;
+ case 'U': /* Up event from last k or K */
+ if (!NILP (up_event))
+ {
+ args[i] = Fmake_vector (make_number (1), up_event);
+ up_event = Qnil;
+ teml = args[i];
+ visargs[i] = Fkey_description (teml, Qnil);
+ }
+ break;
+
case 'e': /* The invoking event. */
if (next_event >= key_count)
error ("%s must be bound to an event with parameters",
tem = Fread_from_minibuffer (build_string (callint_message),
Qnil, Qnil, Qnil, Qnil, Qnil,
- Qnil);
+ Qnil, Qnil);
if (! STRINGP (tem) || SCHARS (tem) == 0)
args[i] = Qnil;
else