Mercurial > hg > xemacs-beta
annotate src/mule-ccl.h @ 1268:fffe735e63ee
[xemacs-hg @ 2003-02-07 11:50:50 by ben]
fixes for menu crashes + better preemption behavior
This contains two related changes:
(1) Fix problems with reentrant calling of lwlib and associated
crashes when selecting menu items.
(2) Improve redisplay handling of preemption. Turn on lazy lock
and hold down page-down or page-up and you'll see what I mean.
They are related because they both touch on the code that retrieves
events and handles the internal queues.
console-msw.h, event-msw.c, event-stream.c, events.h, menubar-msw.c, menubar-x.c, menubar.h: mswindows_protect_modal_loop() has been generalized to
event_stream_protect_modal_loop(), and moved to event-stream.c.
mswindows_in_modal_loop ->in_modal_loop likewise. Changes in
event-msw.c and menubar-msw.c for the new names and calling format
(use structures instead of static variables in menubar-msw.c).
Delete former in_menu_callback and use in_modal_loop in its place.
Remove emacs_mswindows_quit_check_disallowed_p(), superseded by
in_modal_loop. Use event_stream_protect_modal_loop() in
pre_activate_callback() so that we get no lwlib reentrancy.
Rearrange some of the code in event-msw.c to be grouped better.
Make mswindows_drain_windows_queue() respect in_modal_loop and
do nothing if so.
cmdloop.c, event-stream.c: Don't conditionalize on LWLIB_MENUBARS_LUCID when giving error when
in_modal_loop, and give better error.
event-Xt.c, event-gtk.c: If in_modal_loop, only retrieve process and timeout events.
Don't retrieve any X events because processing them can lead
to reentrancy in lwlib -> death.
event-stream.c: Remove unused parameter to check_event_stream_ok() and change
all callers.
lisp.h, event-stream.c: Rearrange some functions for increased clarity -- in particular,
group all the input-pending/QUIT-related stuff together, and
put right next to next-event stuff, to which it's related.
Add the concept of "HOW_MANY" -- when asking whether user input
is pending, you can ask if at least HOW_MANY events are pending,
not just if any are. Add parameter to detect_input_pending()
for this. Change recursive_sit_for from a Lisp_Object (which
could only be Qt or Qnil) to an int, like it should be.
event-Xt.c, event-gtk.c, event-xlike-inc.c: New file.
Abstract out similar code in event_{Xt/gtk}_pending_p() and write
only once, using include-file tricks. Rewrite this function to
implement HOW_MANY and only process events when not in_modal_loop.
event-msw.c: Implement HOW_MANY and only process events when not in_modal_loop.
event-tty.c: Implement HOW_MANY.
redisplay.c: Add var `max-preempts' to control maximum number of preempts.
(#### perhaps not useful) Rewrite preemption check so that,
rather than preempting when any user events are available, only
preempt when a certain number (currently 4) of them are backed up.
This effectively allows redisplay to proceed to completion in the
presence of a fast auto-repeat (usually the auto-repeating is
generated dynamically as necessary), and you get much better
display behavior with lazy-lock active.
event-unixoid.c: Comment changes.
event-stream.c: Rewrite discard-input much more simply and safely using the
drain-queue functions. I think the old version might loop
forever if called when in_modal_loop.
SEMI-UNRELATED CHANGES:
-----------------------
event-stream.c: Turn QUIT-checking back on when running the pre-idle hook so it
can be quit out of.
indent.c: Document exact functioning of `vertical-motion' better, and its
differences from GNU Emacs.
author | ben |
---|---|
date | Fri, 07 Feb 2003 11:50:54 +0000 |
parents | 023b83f4e54b |
children | 0c54de4c4b9d |
rev | line source |
---|---|
428 | 1 /* Header for CCL (Code Conversion Language) interpreter. |
444 | 2 Copyright (C) 1995 Electrotechnical Laboratory, JAPAN. |
428 | 3 Licensed to the Free Software Foundation. |
4 | |
5 This file is part of XEmacs. | |
6 | |
613 | 7 XEmacs is free software; you can redistribute it and/or modify |
428 | 8 it under the terms of the GNU General Public License as published by |
9 the Free Software Foundation; either version 2, or (at your option) | |
10 any later version. | |
11 | |
613 | 12 XEmacs is distributed in the hope that it will be useful, |
428 | 13 but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 GNU General Public License for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
613 | 18 along with XEmacs; see the file COPYING. If not, write to |
428 | 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
20 Boston, MA 02111-1307, USA. */ | |
21 | |
440 | 22 #ifndef INCLUDED_mule_ccl_h_ |
23 #define INCLUDED_mule_ccl_h_ | |
428 | 24 |
25 /* Macros for exit status of CCL program. */ | |
26 #define CCL_STAT_SUCCESS 0 /* Terminated successfully. */ | |
27 #define CCL_STAT_SUSPEND_BY_SRC 1 /* Terminated by empty input. */ | |
28 #define CCL_STAT_SUSPEND_BY_DST 2 /* Terminated by output buffer full. */ | |
29 #define CCL_STAT_INVALID_CMD 3 /* Terminated because of invalid | |
30 command. */ | |
31 #define CCL_STAT_QUIT 4 /* Terminated because of quit. */ | |
32 | |
33 /* Structure to hold information about running CCL code. Read | |
34 comments in the file ccl.c for the detail of each field. */ | |
35 struct ccl_program { | |
36 int size; /* Size of the compiled code. */ | |
37 Lisp_Object *prog; /* Pointer into the compiled code. */ | |
38 int ic; /* Instruction Counter (index for PROG). */ | |
39 int eof_ic; /* Instruction Counter for end-of-file | |
40 processing code. */ | |
41 int reg[8]; /* CCL registers, reg[7] is used for | |
42 condition flag of relational | |
43 operations. */ | |
44 int private_state; /* CCL instruction may use this | |
444 | 45 for private use, mainly for saving |
46 internal states on suspending. | |
428 | 47 This variable is set to 0 when ccl is |
48 set up. */ | |
49 int last_block; /* Set to 1 while processing the last | |
50 block. */ | |
51 int status; /* Exit status of the CCL program. */ | |
52 int buf_magnification; /* Output buffer magnification. How | |
53 many times bigger the output buffer | |
54 should be than the input buffer. */ | |
55 int stack_idx; /* How deep the call of CCL_Call is nested. */ | |
444 | 56 int eol_type; /* When the CCL program is used for |
57 encoding by a coding system, set to | |
58 the eol_type of the coding | |
59 system. */ | |
60 int multibyte; /* 1 if the source text is multibyte. */ | |
428 | 61 }; |
62 | |
63 #define CCL_MODE_ENCODING 0 | |
64 #define CCL_MODE_DECODING 1 | |
65 | |
444 | 66 #define CCL_CODING_EOL_LF 0 /* Line-feed only, same as Emacs' |
67 internal format. */ | |
68 #define CCL_CODING_EOL_CRLF 1 /* Sequence of carriage-return and | |
69 line-feed. */ | |
70 #define CCL_CODING_EOL_CR 2 /* Carriage-return only. */ | |
428 | 71 |
72 /* Alist of fontname patterns vs corresponding CCL program. */ | |
73 extern Lisp_Object Vfont_ccl_encoder_alist; | |
444 | 74 |
75 /* Setup fields of the structure pointed by CCL appropriately for the | |
76 execution of ccl program CCL_PROG (symbol or vector). */ | |
77 extern int setup_ccl_program (struct ccl_program *, Lisp_Object); | |
78 | |
79 extern int ccl_driver (struct ccl_program *, const unsigned char *, | |
80 unsigned_char_dynarr *, int, int *, int); | |
81 | |
82 EXFUN (Fregister_ccl_program, 2); | |
83 | |
428 | 84 extern Lisp_Object Qccl_program; |
85 | |
444 | 86 /* Vector of CCL program names vs corresponding program data. */ |
87 extern Lisp_Object Vccl_program_table; | |
88 | |
89 /* Symbols of ccl program have this property, a value of the property | |
90 is an index for Vccl_program_table. */ | |
91 extern Lisp_Object Qccl_program_idx; | |
92 | |
440 | 93 #endif /* INCLUDED_mule_ccl_h_ */ |