summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMiles Bader <miles@gnu.org>2006-08-16 14:08:49 +0000
committerMiles Bader <miles@gnu.org>2006-08-16 14:08:49 +0000
commitde20e0ccdb039a2ac27e5bbd3e06ab70c4e7bb65 (patch)
tree80243ce02b52cbf7945c614bd213dd63142b861a /src
parent7a5c2a42040b12b037940a067aee6ac6fde01680 (diff)
parent5ebdc2990a95cc38b21f772eea4de3ceee149e54 (diff)
Merge from emacs--devo--0
Patches applied: * emacs--devo--0 (patch 382-398) - Update from CVS - Update from erc--emacs--22 - Fix ERC bug introduced in last patch - Merge from gnus--rel--5.10 * gnus--rel--5.10 (patch 123-125) - Update from CVS Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-101
Diffstat (limited to 'src')
-rw-r--r--src/.gdbinit6
-rw-r--r--src/ChangeLog135
-rw-r--r--src/alloc.c27
-rw-r--r--src/buffer.c12
-rw-r--r--src/editfns.c24
-rw-r--r--src/frame.c13
-rw-r--r--src/keyboard.c71
-rw-r--r--src/keyboard.h3
-rw-r--r--src/print.c9
-rw-r--r--src/puresize.h2
-rw-r--r--src/w32.c22
-rw-r--r--src/w32.h3
-rw-r--r--src/w32fns.c41
-rw-r--r--src/w32menu.c6
-rw-r--r--src/xselect.c51
-rw-r--r--src/xterm.c9
-rw-r--r--src/xterm.h6
17 files changed, 394 insertions, 46 deletions
diff --git a/src/.gdbinit b/src/.gdbinit
index 60730536ae9..e1ad68e9eb3 100644
--- a/src/.gdbinit
+++ b/src/.gdbinit
@@ -164,6 +164,10 @@ define pitx
if ($it->current.pos.charpos != $it->current.pos.bytepos)
printf "[%d]", $it->current.pos.bytepos
end
+ printf " pos=%d", $it->position.charpos
+ if ($it->position.charpos != $it->position.bytepos)
+ printf "[%d]", $it->position.bytepos
+ end
printf " start=%d", $it->start.pos.charpos
if ($it->start.pos.charpos != $it->start.pos.bytepos)
printf "[%d]", $it->start.pos.bytepos
@@ -218,7 +222,7 @@ define pitx
printf " max=%d+%d=%d", $it->max_ascent, $it->max_descent, $it->max_ascent+$it->max_descent
printf "\n"
set $i = 0
- while ($i < $it->sp)
+ while ($i < $it->sp && $i < 4)
set $e = $it->stack[$i]
printf "stack[%d]: ", $i
output $e->method
diff --git a/src/ChangeLog b/src/ChangeLog
index 474ead0cde6..1d7e22867e3 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,138 @@
+2006-08-16 Andreas Schwab <schwab@suse.de>
+
+ * print.c (debug_output_compilation_hack): Fix return type.
+
+2006-08-16 Richard Stallman <rms@gnu.org>
+
+ * print.c (debug_output_compilation_hack): New function.
+
+2006-08-16 Kenichi Handa <handa@m17n.org>
+
+ * fileio.c (choose_write_coding_system): Use LF for end-of-line
+ in auto-saving.
+
+2006-08-15 Chong Yidong <cyd@stupidchicken.com>
+
+ * keyboard.c (read_char): Don't change idle timer state at all if
+ end_time is supplied.
+
+2006-08-15 Kenichi Handa <handa@m17n.org>
+
+ * coding.c (ONE_MORE_BYTE_CHECK_MULTIBYTE): New arg RET. If SRC
+ is exhausted, return with RET.
+ (detect_coding_emacs_mule, detect_coding_iso2022)
+ (detect_coding_sjis, detect_coding_big5, detect_coding_utf_8)
+ (detect_coding_utf_16, detect_coding_ccl): Adjusted for the above
+ change.
+
+2006-08-14 Chong Yidong <cyd@stupidchicken.com>
+
+ * keyboard.c (read_char): Don't reset idle timers if a time limit
+ is supplied.
+
+2006-08-14 Kim F. Storm <storm@cua.dk>
+
+ * .gdbinit (pitx): Print iterator position.
+ Limit stack dump in case iterator is not initialized.
+
+2006-08-12 Eli Zaretskii <eliz@gnu.org>
+
+ * frame.c (Fmouse_position, Fmouse_pixel_position)
+ (Fset_mouse_position, Fset_mouse_pixel_position): Doc fix.
+
+2006-08-11 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
+
+ * xselect.c (Fx_register_dnd_atom): New function.
+ (syms_of_xselect): Defsubr it.
+ (x_handle_dnd_message): Check that message_type is in
+ dpyinfo->x_dnd_atoms before generating lisp event.
+
+ * xterm.h (struct x_display_info): Add x_dnd_atoms* to keep track
+ of drag and drop Atoms.
+
+ * xterm.c (x_term_init): Initialize dpyinfo->x_dnd_atoms*
+
+
+2006-08-10 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
+
+ * keyboard.c: Define in_sighandler.
+ (input_available_signal): Set in_sighandler.
+ (init_keyboard): Initialize in_sighandler.
+
+ * keyboard.h: Declare in_sighandler.
+
+ * alloc.c (UNBLOCK_INPUT_ALLOC, BLOCK_INPUT_ALLOC): Use in_sighandler
+ to check if mutex should be locked or not.
+
+2006-08-09 Richard Stallman <rms@gnu.org>
+
+ * keyboard.c (keyremap_step): No-op if fkey->parent = nil.
+ (read_key_sequence): Always start fkey.start and fkey.end at 0,
+ and likewise for keytran.
+
+2006-08-09 Kenichi Handa <handa@m17n.org>
+
+ * coding.c (syms_of_coding): Improve the docstring
+ file-coding-system-alist.
+
+2006-08-07 Andreas Schwab <schwab@suse.de>
+
+ * puresize.h (BASE_PURESIZE): Increase to 1120000.
+
+2006-08-06 Chong Yidong <cyd@stupidchicken.com>
+
+ * buffer.c (Vchange_major_mode_hook, Qchange_major_mode_hook): New vars.
+ (Fkill_all_local_variables): Use it.
+ (syms_of_buffer): Defvar it.
+
+2006-08-05 Eli Zaretskii <eliz@gnu.org>
+
+ * w32.c (w32_valid_pointer_p): New function.
+
+ * w32.h: Add prototype for w32_valid_pointer_p.
+
+ * alloc.c: Include w32.h.
+ (valid_lisp_object_p) [WINDOWSNT]: Call w32_valid_pointer_p to do
+ the job.
+
+ * keyboard.c (kbd_buffer_get_event): Return Qnil when current time
+ is exactly equal to end_time, not only when it is past that.
+
+2006-08-04 Chong Yidong <cyd@stupidchicken.com>
+
+ * keyboard.c (read_char): Rebalance specpdl after receiving jump.
+
+ * process.c: Reapply 2006-08-01 change.
+
+2006-08-04 Eli Zaretskii <eliz@gnu.org>
+
+ * w32fns.c (w32_query_font): Fix last change: use stricmp.
+
+2006-08-04 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * editfns.c (Fsubst_char_in_region): Redo the setup work after running
+ the before-change-functions since they may have altered the buffer.
+
+2006-08-04 Ralf Angeli <angeli@caeruleus.net>
+
+ * w32fns.c (w32_createwindow): Handle -geometry command line option
+ and the geometry settings in the Registry.
+
+2006-08-04 Kenichi Handa <handa@m17n.org>
+
+ * w32fns.c (w32_query_font): Compare names by ignoring case.
+
+ * xterm.c (x_query_font): Compare names by ignoring case.
+
+2006-08-03 Jason Rumney <jasonr@gnu.org>
+
+ * w32menu.c (w32_menu_show, w32_dialog_show): Call Fsignal to quit
+ when no option selected.
+
+2006-08-03 Chong Yidong <cyd@stupidchicken.com>
+
+ * process.c: Revert last change.
+
2006-08-01 Kim F. Storm <storm@cua.dk>
* process.c (wait_reading_process_output_unwind): New function.
diff --git a/src/alloc.c b/src/alloc.c
index 171cdade81a..9cd87503c5a 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -80,6 +80,7 @@ extern POINTER_TYPE *sbrk ();
#ifdef WINDOWSNT
#include <fcntl.h>
+#include "w32.h"
#endif
#ifdef DOUG_LEA_MALLOC
@@ -129,17 +130,27 @@ static pthread_mutex_t alloc_mutex;
#define BLOCK_INPUT_ALLOC \
do \
{ \
- pthread_mutex_lock (&alloc_mutex); \
- if (pthread_self () == main_thread) \
- BLOCK_INPUT; \
+ if (!in_sighandler) \
+ { \
+ pthread_mutex_lock (&alloc_mutex); \
+ if (pthread_self () == main_thread) \
+ BLOCK_INPUT; \
+ else \
+ sigblock (sigmask (SIGIO)); \
+ } \
} \
while (0)
#define UNBLOCK_INPUT_ALLOC \
do \
{ \
- if (pthread_self () == main_thread) \
- UNBLOCK_INPUT; \
- pthread_mutex_unlock (&alloc_mutex); \
+ if (!in_sighandler) \
+ { \
+ pthread_mutex_unlock (&alloc_mutex); \
+ if (pthread_self () == main_thread) \
+ UNBLOCK_INPUT; \
+ else \
+ sigunblock (sigmask (SIGIO)); \
+ } \
} \
while (0)
@@ -4572,6 +4583,9 @@ int
valid_pointer_p (p)
void *p;
{
+#ifdef WINDOWSNT
+ return w32_valid_pointer_p (p, 16);
+#else
int fd;
/* Obviously, we cannot just access it (we would SEGV trying), so we
@@ -4588,6 +4602,7 @@ valid_pointer_p (p)
}
return -1;
+#endif
}
/* Return 1 if OBJ is a valid lisp object.
diff --git a/src/buffer.c b/src/buffer.c
index 6115f727deb..d26c4451d13 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -146,6 +146,9 @@ Lisp_Object Vinhibit_read_only;
Lisp_Object Vkill_buffer_query_functions;
Lisp_Object Qkill_buffer_query_functions;
+/* Hook run before changing a major mode. */
+Lisp_Object Vchange_major_mode_hook, Qchange_major_mode_hook;
+
/* List of functions to call before changing an unmodified buffer. */
Lisp_Object Vfirst_change_hook;
@@ -2402,7 +2405,7 @@ the normal hook `change-major-mode-hook'. */)
Lisp_Object oalist;
if (!NILP (Vrun_hooks))
- call1 (Vrun_hooks, intern ("change-major-mode-hook"));
+ call1 (Vrun_hooks, Qchange_major_mode_hook);
oalist = current_buffer->local_var_alist;
/* Make sure none of the bindings in oalist
@@ -6014,6 +6017,13 @@ t means to use hollow box cursor. See `cursor-type' for other values. */);
doc: /* List of functions called with no args to query before killing a buffer. */);
Vkill_buffer_query_functions = Qnil;
+ DEFVAR_LISP ("change-major-mode-hook", &Vchange_major_mode_hook,
+ doc: /* Normal hook run before changing the major mode of a buffer.
+The function `kill-all-local-variables' runs this before doing anything else. */);
+ Vchange_major_mode_hook = Qnil;
+ Qchange_major_mode_hook = intern ("change-major-mode-hook");
+ staticpro (&Qchange_major_mode_hook);
+
defsubr (&Sbuffer_live_p);
defsubr (&Sbuffer_list);
defsubr (&Sget_buffer);
diff --git a/src/editfns.c b/src/editfns.c
index 02ea2d2abb8..aa6ad457676 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -2712,6 +2712,10 @@ Both characters must have the same length of multi-byte form. */)
Lisp_Object start, end, fromchar, tochar, noundo;
{
register int pos, pos_byte, stop, i, len, end_byte;
+ /* Keep track of the first change in the buffer:
+ if 0 we haven't found it yet.
+ if < 0 we've found it and we've run the before-change-function.
+ if > 0 we've actually performed it and the value is its position. */
int changed = 0;
unsigned char fromstr[MAX_MULTIBYTE_LENGTH], tostr[MAX_MULTIBYTE_LENGTH];
unsigned char *p;
@@ -2724,6 +2728,8 @@ Both characters must have the same length of multi-byte form. */)
int last_changed = 0;
int multibyte_p = !NILP (current_buffer->enable_multibyte_characters);
+ restart:
+
validate_region (&start, &end);
CHECK_NUMBER (fromchar);
CHECK_NUMBER (tochar);
@@ -2761,7 +2767,7 @@ Both characters must have the same length of multi-byte form. */)
That's faster than getting rid of things,
and it prevents even the entry for a first change.
Also inhibit locking the file. */
- if (!NILP (noundo))
+ if (!changed && !NILP (noundo))
{
record_unwind_protect (subst_char_in_region_unwind,
current_buffer->undo_list);
@@ -2795,10 +2801,14 @@ Both characters must have the same length of multi-byte form. */)
&& (len == 2 || (p[2] == fromstr[2]
&& (len == 3 || p[3] == fromstr[3]))))))
{
- if (! changed)
+ if (changed < 0)
+ /* We've already seen this and run the before-change-function;
+ this time we only need to record the actual position. */
+ changed = pos;
+ else if (!changed)
{
- changed = pos;
- modify_region (current_buffer, changed, XINT (end));
+ changed = -1;
+ modify_region (current_buffer, pos, XINT (end));
if (! NILP (noundo))
{
@@ -2807,6 +2817,10 @@ Both characters must have the same length of multi-byte form. */)
if (MODIFF - 1 == current_buffer->auto_save_modified)
current_buffer->auto_save_modified++;
}
+
+ /* The before-change-function may have moved the gap
+ or even modified the buffer so we should start over. */
+ goto restart;
}
/* Take care of the case where the new character
@@ -2859,7 +2873,7 @@ Both characters must have the same length of multi-byte form. */)
pos++;
}
- if (changed)
+ if (changed > 0)
{
signal_after_change (changed,
last_changed - changed, last_changed - changed);
diff --git a/src/frame.c b/src/frame.c
index 9bbdcd592aa..c57618696eb 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -1439,7 +1439,8 @@ The functions are run with one arg, the frame to be deleted. */)
DEFUN ("mouse-position", Fmouse_position, Smouse_position, 0, 0, 0,
doc: /* Return a list (FRAME X . Y) giving the current mouse frame and position.
The position is given in character cells, where (0, 0) is the
-upper-left corner.
+upper-left corner of the frame, X is the horizontal offset, and Y is
+the vertical offset.
If Emacs is running on a mouseless terminal or hasn't been programmed
to read the mouse position, it returns the selected frame for FRAME
and nil for X and Y.
@@ -1487,7 +1488,8 @@ DEFUN ("mouse-pixel-position", Fmouse_pixel_position,
Smouse_pixel_position, 0, 0, 0,
doc: /* Return a list (FRAME X . Y) giving the current mouse frame and position.
The position is given in pixel units, where (0, 0) is the
-upper-left corner.
+upper-left corner of the frame, X is the horizontal offset, and Y is
+the vertical offset.
If Emacs is running on a mouseless terminal or hasn't been programmed
to read the mouse position, it returns the selected frame for FRAME
and nil for X and Y. */)
@@ -1520,6 +1522,10 @@ Coordinates are relative to the frame, not a window,
so the coordinates of the top left character in the frame
may be nonzero due to left-hand scroll bars or the menu bar.
+The position is given in character cells, where (0, 0) is the
+upper-left corner of the frame, X is the horizontal offset, and Y is
+the vertical offset.
+
This function is a no-op for an X frame that is not visible.
If you have just created a frame, you must wait for it to become visible
before calling this function on it, like this.
@@ -1552,6 +1558,9 @@ before calling this function on it, like this.
DEFUN ("set-mouse-pixel-position", Fset_mouse_pixel_position,
Sset_mouse_pixel_position, 3, 3, 0,
doc: /* Move the mouse pointer to pixel position (X,Y) in FRAME.
+The position is given in pixels, where (0, 0) is the upper-left corner
+of the frame, X is the horizontal offset, and Y is the vertical offset.
+
Note, this is a no-op for an X frame that is not visible.
If you have just created a frame, you must wait for it to become visible
before calling this function on it, like this.
diff --git a/src/keyboard.c b/src/keyboard.c
index 45d5832a905..62c862f69d1 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -100,6 +100,9 @@ int interrupt_input_pending;
/* File descriptor to use for input. */
extern int input_fd;
+/* Nonzero if we are executing from the SIGIO signal handler. */
+int in_sighandler;
+
#ifdef HAVE_WINDOW_SYSTEM
/* Make all keyboard buffers much bigger when using X windows. */
#ifdef MAC_OS8
@@ -2403,7 +2406,7 @@ read_char (commandflag, nmaps, maps, prev_event, used_mouse_menu, end_time)
EMACS_TIME *end_time;
{
volatile Lisp_Object c;
- int count;
+ int count, jmpcount;
jmp_buf local_getcjmp;
jmp_buf save_jump;
volatile int key_already_recorded = 0;
@@ -2629,11 +2632,13 @@ read_char (commandflag, nmaps, maps, prev_event, used_mouse_menu, end_time)
around any call to sit_for or kbd_buffer_get_event;
it *must not* be in effect when we call redisplay. */
+ jmpcount = SPECPDL_INDEX ();
if (_setjmp (local_getcjmp))
{
/* We must have saved the outer value of getcjmp here,
so restore it now. */
restore_getcjmp (save_jump);
+ unbind_to (jmpcount, Qnil);
XSETINT (c, quit_char);
internal_last_event_frame = selected_frame;
Vlast_event_frame = internal_last_event_frame;
@@ -2674,7 +2679,12 @@ read_char (commandflag, nmaps, maps, prev_event, used_mouse_menu, end_time)
goto non_reread;
}
- timer_start_idle ();
+ /* Start idle timers if no time limit is supplied. We don't do it
+ if a time limit is supplied to avoid an infinite recursion in the
+ situation where an idle timer calls `sit-for'. */
+
+ if (!end_time)
+ timer_start_idle ();
/* If in middle of key sequence and minibuffer not active,
start echoing if enough time elapses. */
@@ -2744,7 +2754,8 @@ read_char (commandflag, nmaps, maps, prev_event, used_mouse_menu, end_time)
c = read_char_x_menu_prompt (nmaps, maps, prev_event, used_mouse_menu);
/* Now that we have read an event, Emacs is not idle. */
- timer_stop_idle ();
+ if (!end_time)
+ timer_stop_idle ();
goto exit;
}
@@ -2874,7 +2885,8 @@ read_char (commandflag, nmaps, maps, prev_event, used_mouse_menu, end_time)
/* Actually read a character, waiting if necessary. */
save_getcjmp (save_jump);
restore_getcjmp (local_getcjmp);
- timer_start_idle ();
+ if (!end_time)
+ timer_start_idle ();
c = kbd_buffer_get_event (&kb, used_mouse_menu, end_time);
restore_getcjmp (save_jump);
@@ -2926,7 +2938,8 @@ read_char (commandflag, nmaps, maps, prev_event, used_mouse_menu, end_time)
non_reread:
- timer_stop_idle ();
+ if (!end_time)
+ timer_stop_idle ();
RESUME_POLLING;
if (NILP (c))
@@ -2960,7 +2973,7 @@ read_char (commandflag, nmaps, maps, prev_event, used_mouse_menu, end_time)
last_input_char = c;
Fcommand_execute (tem, Qnil, Fvector (1, &last_input_char), Qt);
- if (CONSP (c) && EQ (XCAR (c), Qselect_window))
+ if (CONSP (c) && EQ (XCAR (c), Qselect_window) && !end_time)
/* We stopped being idle for this event; undo that. This
prevents automatic window selection (under
mouse_autoselect_window from acting as a real input event, for
@@ -3166,7 +3179,8 @@ read_char (commandflag, nmaps, maps, prev_event, used_mouse_menu, end_time)
show_help_echo (help, window, object, position, 0);
/* We stopped being idle for this event; undo that. */
- timer_resume_idle ();
+ if (!end_time)
+ timer_resume_idle ();
goto retry;
}
@@ -3952,13 +3966,15 @@ kbd_buffer_get_event (kbp, used_mouse_menu, end_time)
{
EMACS_TIME duration;
EMACS_GET_TIME (duration);
- EMACS_SUB_TIME (duration, *end_time, duration);
- if (EMACS_TIME_NEG_P (duration))
- return Qnil;
+ if (EMACS_TIME_GE (duration, *end_time))
+ return Qnil; /* finished waiting */
else
- wait_reading_process_output (EMACS_SECS (duration),
- EMACS_USECS (duration),
- -1, 1, Qnil, NULL, 0);
+ {
+ EMACS_SUB_TIME (duration, *end_time, duration);
+ wait_reading_process_output (EMACS_SECS (duration),
+ EMACS_USECS (duration),
+ -1, 1, Qnil, NULL, 0);
+ }
}
else
wait_reading_process_output (0, 0, -1, 1, Qnil, NULL, 0);
@@ -6920,6 +6936,8 @@ input_available_signal (signo)
SIGNAL_THREAD_CHECK (signo);
#endif
+ in_sighandler = 1;
+
if (input_available_clear_time)
EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
@@ -6931,6 +6949,7 @@ input_available_signal (signo)
sigfree ();
#endif
errno = old_errno;
+ in_sighandler = 0;
}
#endif /* SIGIO */
@@ -8381,7 +8400,15 @@ follow_key (key, nmaps, current, defs, next)
such as Vfunction_key_map and Vkey_translation_map. */
typedef struct keyremap
{
- Lisp_Object map, parent;
+ /* This is the map originally specified for this use. */
+ Lisp_Object parent;
+ /* This is a submap reached by looking up, in PARENT,
+ the events from START to END. */
+ Lisp_Object map;
+ /* Positions [START, END) in the key sequence buffer
+ are the key that we have scanned so far.
+ Those events are the ones that we will replace
+ if PAREHT maps them into a key sequence. */
int start, end;
} keyremap;
@@ -8454,7 +8481,11 @@ keyremap_step (keybuf, bufsize, fkey, input, doit, diff, prompt)
Lisp_Object next, key;
key = keybuf[fkey->end++];
- next = access_keymap_keyremap (fkey->map, key, prompt, doit);
+
+ if (KEYMAPP (fkey->parent))
+ next = access_keymap_keyremap (fkey->map, key, prompt, doit);
+ else
+ next = Qnil;
/* If keybuf[fkey->start..fkey->end] is bound in the
map and we're in a position to do the key remapping, replace it with
@@ -8652,9 +8683,8 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
delayed_switch_frame = Qnil;
fkey.map = fkey.parent = Vfunction_key_map;
keytran.map = keytran.parent = Vkey_translation_map;
- /* If there is no translation-map, turn off scanning. */
- fkey.start = fkey.end = KEYMAPP (fkey.map) ? 0 : bufsize + 1;
- keytran.start = keytran.end = KEYMAPP (keytran.map) ? 0 : bufsize + 1;
+ fkey.start = fkey.end = 0;
+ keytran.start = keytran.end = 0;
if (INTERACTIVE)
{
@@ -9481,8 +9511,8 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
keybuf[t - 1] = new_key;
mock_input = max (t, mock_input);
- fkey.start = fkey.end = KEYMAPP (fkey.map) ? 0 : bufsize + 1;
- keytran.start = keytran.end = KEYMAPP (keytran.map) ? 0 : bufsize + 1;
+ fkey.start = fkey.end = 0;
+ keytran.start = keytran.end = 0;
goto replay_sequence;
}
@@ -10786,6 +10816,7 @@ init_keyboard ()
do_mouse_tracking = Qnil;
#endif
input_pending = 0;
+ in_sighandler = 0;
/* This means that command_loop_1 won't try to select anything the first
time through. */
diff --git a/src/keyboard.h b/src/keyboard.h
index 96ac7d2e856..f8d8f789c08 100644
--- a/src/keyboard.h
+++ b/src/keyboard.h
@@ -190,6 +190,9 @@ extern EMACS_INT num_nonmacro_input_events;
/* Nonzero means polling for input is temporarily suppressed. */
extern int poll_suppress_count;
+/* Nonzero if we are executing from the SIGIO signal handler. */
+extern int in_sighandler;
+
/* Keymap mapping ASCII function key sequences onto their preferred forms.
Initialized by the terminal-specific lisp files. */
extern Lisp_Object Vfunction_key_map;
diff --git a/src/print.c b/src/print.c
index 6fdd41ada04..80fe22c7149 100644
--- a/src/print.c
+++ b/src/print.c
@@ -924,6 +924,15 @@ to make it write to the debugging output. */)
return character;
}
+/* This function is never called. Its purpose is to prevent
+ print_output_debug_flag from being optimized away. */
+
+void
+debug_output_compilation_hack (x)
+ int x;
+{
+ print_output_debug_flag = x;
+}
#if defined(GNU_LINUX)
diff --git a/src/puresize.h b/src/puresize.h
index bae7cbb6d6a..5dd374af207 100644
--- a/src/puresize.h
+++ b/src/puresize.h
@@ -43,7 +43,7 @@ Boston, MA 02110-1301, USA. */
#endif
#ifndef BASE_PURESIZE
-#define BASE_PURESIZE (1102000 + SYSTEM_PURESIZE_EXTRA + SITELOAD_PURESIZE_EXTRA)
+#define BASE_PURESIZE (1120000 + SYSTEM_PURESIZE_EXTRA + SITELOAD_PURESIZE_EXTRA)
#endif
/* Increase BASE_PURESIZE by a ratio depending on the machine's word size. */
diff --git a/src/w32.c b/src/w32.c
index c093eab599e..0da908ff932 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -323,6 +323,28 @@ w32_strerror (int error_no)
return buf;
}
+/* Return 1 if P is a valid pointer to an object of size SIZE. Return
+ 0 if P is NOT a valid pointer. Return -1 if we cannot validate P.
+
+ This is called from alloc.c:valid_pointer_p. */
+int
+w32_valid_pointer_p (void *p, int size)
+{
+ SIZE_T done;
+ HANDLE h = OpenProcess (PROCESS_VM_READ, FALSE, GetCurrentProcessId ());
+
+ if (h)
+ {
+ unsigned char *buf = alloca (size);
+ int retval = ReadProcessMemory (h, p, buf, size, &done);
+
+ CloseHandle (h);
+ return retval;
+ }
+ else
+ return -1;
+}
+
static char startup_dir[MAXPATHLEN];
/* Get the current working directory. */
diff --git a/src/w32.h b/src/w32.h
index 1d5dbee6d40..6ba25a42403 100644
--- a/src/w32.h
+++ b/src/w32.h
@@ -110,6 +110,9 @@ extern void delete_child (child_process *cp);
/* Equivalent of strerror for W32 error codes. */
extern char * w32_strerror (int error_no);
+/* Validate a pointer. */
+extern int w32_valid_pointer_p (void *, int);
+
/* Get long (aka "true") form of file name, if it exists. */
extern BOOL w32_get_long_filename (char * name, char * buf, int size);
diff --git a/src/w32fns.c b/src/w32fns.c
index 9c0198f288d..f0060de7933 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -2067,7 +2067,8 @@ w32_createwindow (f)
{
HWND hwnd;
RECT rect;
- Lisp_Object top, left;
+ Lisp_Object top = Qunbound;
+ Lisp_Object left = Qunbound;
rect.left = rect.top = 0;
rect.right = FRAME_PIXEL_WIDTH (f);
@@ -2080,13 +2081,41 @@ w32_createwindow (f)
if (!hprevinst)
{
+ Lisp_Object ifa;
+
w32_init_class (hinst);
+
+ /* Handle the -geometry command line option and the geometry
+ settings in the registry. They are decoded and put into
+ initial-frame-alist by w32-win.el:x-handle-geometry. */
+ ifa = Fsymbol_value (intern ("initial-frame-alist"));
+ if (CONSP (ifa))
+ {
+ Lisp_Object lt = Fassq (Qleft, ifa);
+ Lisp_Object tp = Fassq (Qtop, ifa);
+
+ if (!NILP (lt))
+ {
+ lt = XCDR (lt);
+ if (INTEGERP (lt))
+ left = lt;
+ }
+ if (!NILP (tp))
+ {
+ tp = XCDR (tp);
+ if (INTEGERP (tp))
+ top = tp;
+ }
+ }
}
- /* When called with RES_TYPE_NUMBER, w32_get_arg will return zero
- for anything that is not a number and is not Qunbound. */
- left = w32_get_arg (Qnil, Qleft, "left", "Left", RES_TYPE_NUMBER);
- top = w32_get_arg (Qnil, Qtop, "top", "Top", RES_TYPE_NUMBER);
+ if (EQ (left, Qunbound) && EQ (top, Qunbound))
+ {
+ /* When called with RES_TYPE_NUMBER, w32_get_arg will return zero
+ for anything that is not a number and is not Qunbound. */
+ left = w32_get_arg (Qnil, Qleft, "left", "Left", RES_TYPE_NUMBER);
+ top = w32_get_arg (Qnil, Qtop, "top", "Top", RES_TYPE_NUMBER);
+ }
FRAME_W32_WINDOW (f) = hwnd
= CreateWindow (EMACS_CLASS,
@@ -6269,7 +6298,7 @@ w32_query_font (struct frame *f, char *fontname)
for (i = 0; i < one_w32_display_info.n_fonts ;i++, pfi++)
{
- if (strcmp(pfi->name, fontname) == 0) return pfi;
+ if (stricmp(pfi->name, fontname) == 0) return pfi;
}
return NULL;
diff --git a/src/w32menu.c b/src/w32menu.c
index 389e6c5b856..11af1d66b6f 100644
--- a/src/w32menu.c
+++ b/src/w32menu.c
@@ -1994,6 +1994,9 @@ w32_menu_show (f, x, y, for_click, keymaps, title, error)
}
}
}
+ else if (!for_click)
+ /* Make "Cancel" equivalent to C-g. */
+ Fsignal (Qquit, Qnil);
return Qnil;
}
@@ -2186,6 +2189,9 @@ w32_dialog_show (f, keymaps, title, header, error)
}
}
}
+ else
+ /* Make "Cancel" equivalent to C-g. */
+ Fsignal (Qquit, Qnil);
return Qnil;
}
diff --git a/src/xselect.c b/src/xselect.c
index fcac2860359..013a52dbdb1 100644
--- a/src/xselect.c
+++ b/src/xselect.c
@@ -2677,8 +2677,48 @@ If the value is 0 or the atom is not known, return the empty string. */)
return ret;
}
-/* Convert an XClientMessageEvent to a Lisp event of type DRAG_N_DROP_EVENT.
- TODO: Check if this client event really is a DND event? */
+DEFUN ("x-register-dnd-atom", Fx_register_dnd_atom,
+ Sx_register_dnd_atom, 1, 2, 0,
+ doc: /* Request that dnd events are made for ClientMessages with ATOM.
+ATOM can be a symbol or a string. The ATOM is interned on the display that
+FRAME is on. If FRAME is nil, the selected frame is used. */)
+ (atom, frame)
+ Lisp_Object atom, frame;
+{
+ Atom x_atom;
+ struct frame *f = check_x_frame (frame);
+ size_t i;
+ struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
+
+
+ if (SYMBOLP (atom))
+ x_atom = symbol_to_x_atom (dpyinfo, FRAME_X_DISPLAY (f), atom);
+ else if (STRINGP (atom))
+ {
+ BLOCK_INPUT;
+ x_atom = XInternAtom (FRAME_X_DISPLAY (f), (char *) SDATA (atom), False);
+ UNBLOCK_INPUT;
+ }
+ else
+ error ("ATOM must be a symbol or a string");
+
+ for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i)
+ if (dpyinfo->x_dnd_atoms[i] == x_atom)
+ return Qnil;
+
+ if (dpyinfo->x_dnd_atoms_length == dpyinfo->x_dnd_atoms_size)
+ {
+ dpyinfo->x_dnd_atoms_size *= 2;
+ dpyinfo->x_dnd_atoms = xrealloc (dpyinfo->x_dnd_atoms,
+ sizeof (*dpyinfo->x_dnd_atoms)
+ * dpyinfo->x_dnd_atoms_size);
+ }
+
+ dpyinfo->x_dnd_atoms[dpyinfo->x_dnd_atoms_length++] = x_atom;
+ return Qnil;
+}
+
+/* Convert an XClientMessageEvent to a Lisp event of type DRAG_N_DROP_EVENT. */
int
x_handle_dnd_message (f, event, dpyinfo, bufp)
@@ -2694,6 +2734,12 @@ x_handle_dnd_message (f, event, dpyinfo, bufp)
int x, y;
unsigned char *data = (unsigned char *) event->data.b;
int idata[5];
+ size_t i;
+
+ for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i)
+ if (dpyinfo->x_dnd_atoms[i] == event->message_type) break;
+
+ if (i == dpyinfo->x_dnd_atoms_length) return 0;
XSETFRAME (frame, f);
@@ -2867,6 +2913,7 @@ syms_of_xselect ()
defsubr (&Sx_get_atom_name);
defsubr (&Sx_send_client_message);
+ defsubr (&Sx_register_dnd_atom);
reading_selection_reply = Fcons (Qnil, Qnil);
staticpro (&reading_selection_reply);
diff --git a/src/xterm.c b/src/xterm.c
index 126d954a3a4..9cd945ae63b 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -10362,8 +10362,8 @@ x_query_font (f, fontname)
for (i = 0; i < dpyinfo->n_fonts; i++)
if (dpyinfo->font_table[i].name
- && (!strcmp (dpyinfo->font_table[i].name, fontname)
- || !strcmp (dpyinfo->font_table[i].full_name, fontname)))
+ && (!strcasecmp (dpyinfo->font_table[i].name, fontname)
+ || !strcasecmp (dpyinfo->font_table[i].full_name, fontname)))
return (dpyinfo->font_table + i);
return NULL;
}
@@ -11044,6 +11044,11 @@ x_term_init (display_name, xrm_option, resource_name)
dpyinfo->cut_buffers_initialized = 0;
+ dpyinfo->x_dnd_atoms_size = 8;
+ dpyinfo->x_dnd_atoms_length = 0;
+ dpyinfo->x_dnd_atoms = xmalloc (sizeof (*dpyinfo->x_dnd_atoms)
+ * dpyinfo->x_dnd_atoms_size);
+
connection = ConnectionNumber (dpyinfo->display);
dpyinfo->connection = connection;
diff --git a/src/xterm.h b/src/xterm.h
index 8bc9782b02b..1c5d215f864 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -389,6 +389,12 @@ struct x_display_info
X_WMTYPE_A,
X_WMTYPE_B
} wm_type;
+
+
+ /* Atoms that are drag and drop atoms */
+ Atom *x_dnd_atoms;
+ size_t x_dnd_atoms_size;
+ size_t x_dnd_atoms_length;
};
#ifdef HAVE_X_I18N