Mercurial > hg > xemacs-beta
comparison src/keymap.c @ 1204:e22b0213b713
[xemacs-hg @ 2003-01-12 11:07:58 by michaels]
modules/ChangeLog:
2002-12-16 Ben Wing <ben@xemacs.org>
* postgresql/postgresql.c:
remove ifdef USE_KKCC.
src/ChangeLog:
2003-01-08 Mike Sperber <mike@xemacs.org>
* console.h (CDFW_CONSOLE): Don't lead to a crash if we're dealing
with a dead window/frame/device/console.
2002-12-20 Mike Sperber <mike@xemacs.org>
* ui-gtk.c: Fix typo from Ben's patch: emacs_ffi_data is a
typedef, not a struct. emacs_gtk_object_data is a typedef, not a
struct.
* gtk-glue.c (gdk_event_to_emacs_event): Fix typos from Ben's
patch: le -> emacs_event + rearrange the code.
* event-gtk.c (gtk_event_to_emacs_event): Fix typos from Ben's
patch: ..._UNDERLYING_GDK_EVENT -> ..._GDK_EVENT, ev -> key_event.
* device-gtk.c: Fix typo from Ben's patch: x_keysym_map_hash_table
-> x_keysym_map_hashtable.
2002-12-19 Mike Sperber <mike@xemacs.org>
* menubar-x.c (set_frame_menubar): Initialize protect_me field of
popup_data.
2002-12-16 Ben Wing <ben@xemacs.org>
Major cleanup of KKCC, etc.
KKCC, pdump-related:
-- descriptions are written for all objects. this required some
changes in the format of some objects, e.g. extents, popup-data,
coding system, lstream, lcrecord-list.
-- KKCC now handles weakness in markers, hash tables, elsewhere
correctly (formerly, you'd eventually get a stack overflow due
to endlessly expanding markers).
-- textual changes: lrecord_description -> memory_description,
struct_description -> sized_memory_description.
-- extensive comment describing descriptions and pdump.
-- redo XD_UNION so it works inline and change its format to provide
sufficient info for pdump. implement XD_UNION in pdump. also add
XD_UNION_DYNAMIC_SIZE, which works like XD_UNION except for when
auto-computing structure sizes.
-- add support for XD_INDIRECT in description offsets (used by
extents).
-- add support for "description maps", allowing for indirect
descriptions that are retrieved from an object at run-time. this
generalizes XD_CODING_SYSTEM_END, XD_SPECIFIER_END, etc., which
have now been eliminated.
-- add a fifth field "flags" to memory_description, to support flags
that can be specified for this particular line. Currently defined
flags are XD_FLAG_NO_KKCC (KKCC should ignore this entry; useful
for the weakness above in markers, etc.), XD_FLAG_NO_PDUMP (pdump
should ignore this entry), XD_FLAG_UNION_DEFAULT_ENTRY (in
union maps, this specifies a "default" entry for all remaining
values), and XD_FLAG_FREE_LISP_OBJECT (for use with lcrecord-lists).
-- clean up the kkcc-itis in events, so that the differences
between event data as separate objects and as a union are now
minimized to a small number of places. with the new XD_UNION, we
no longer need event data as separate objects, so this code is no
longer ifdef USE_KKCC, but instead ifdef EVENT_DATA_AS_OBJECTS,
not used by default. make sure that we explicitly free the
separate event data objects when no longer in use, to maintain the
invariant the event processing causes no consing.
-- also remove other USE_KKCC ifdefs when not necessary.
-- allow for KKCC compilation under MS Windows.
-- fix README.kkcc.
-- dump_add_root_object -> dump_add_root_lisp_object.
-- implement dump_add_root_block and use this to handle
dump_add_opaque.
-- factor out some code duplicated in kkcc and pdump.
Other allocation/object-related:
-- change various *slots.h so MARKED_SLOT() call no longer
includes semicolon.
-- free_marker() takes a Lisp_Object not a direct pointer.
-- make bit vectors lcrecords, like vectors, and eliminate code
that essentially duplicated the lcrecord handling.
-- additional asserts in FREE_FIXED_TYPE, formerly duplicated in
the various callers of this.
-- all lcrecord allocation functions now zero out the returned
lcrecords. unnecessary calls to zero_lcrecord removed. add long
comment describing these functions.
-- extract out process and coding system slots, like for buffers,
frames, etc.
-- lcrecords now set the type of items sitting on the free list to
lcrecord_type_free.
-- changes to the way that gap arrays are allocated, for kkcc's
benefit -- now, one single memory block with a stretchy array on
the end, instead of a separate block holding the array.
Error-checking-related:
-- now can compile with C++ under MS Windows. clean up compile errors
discovered that way. (a few were real problems)
-- add C++ error-checking code to verify problems with mismatched
GCPRO/UNGCPRO. (there were a few in the kkcc code.) add long
comment about how to catch insufficient GCPRO (yes, it's possible
using C++).
-- add debug_p4(), a simple object printer, when debug_print()
doesn't work.
-- add dp() and db() as short synonyms of debug_print(),
debug_backtrace().
-- `print' tries EXTREMELY hard to avoid core dumping when printing
when crashing or from debug_print(), and tries as hard as it
reasonably can in other situations.
-- Correct the message output upon crashing to be more up-to-date.
Event-related:
-- document event-matches-key-specifier-p better.
-- generalize the dispatch queues formerly duplicated in the
various event implementations. add event methods to drain pending
events. generalize and clean up QUIT handling, removing
event-specific quit processing. allow arbitrary keystrokes, not
just ASCII, to be the QUIT char. among other things, this should
fix some longstanding bugs in X quit handling. long comment
describing the various event queues.
-- implement delaying of XFlush() if there are pending expose events.
SOMEONE PLEASE TRY THIS OUT.
-- Fix `xemacs -batch -l dunnet' under Cygwin. Try to fix under
MS Windows but not quite there yet.
Other:
-- class -> class_ and no more C++ games with this item.
new -> new_ in the lwlib code, so far not elsewhere.
-- use `struct htentry' not `struct hentry' in elhash.c to avoid
debugger confusion with hash.c.
-- new macros ALIST_LOOP_3, ALIST_LOOP_4.
* README.kkcc:
* alloc.c:
* alloc.c (deadbeef_memory):
* alloc.c (allocate_lisp_storage):
* alloc.c (copy_lisp_object):
* alloc.c (ALLOCATE_FIXED_TYPE_1):
* alloc.c (FREE_FIXED_TYPE):
* alloc.c (make_vector_internal):
* alloc.c (make_bit_vector_internal):
* alloc.c (make_key_data):
* alloc.c (make_button_data):
* alloc.c (make_motion_data):
* alloc.c (make_process_data):
* alloc.c (make_timeout_data):
* alloc.c (make_magic_data):
* alloc.c (make_magic_eval_data):
* alloc.c (make_eval_data):
* alloc.c (make_misc_user_data):
* alloc.c (struct string_chars_block):
* alloc.c (mark_lcrecord_list):
* alloc.c (make_lcrecord_list):
* alloc.c (alloc_managed_lcrecord):
* alloc.c (free_managed_lcrecord):
* alloc.c (alloc_automanaged_lcrecord):
* alloc.c (staticpro_1):
* alloc.c (staticpro):
* alloc.c (lispdesc_indirect_count_1):
* alloc.c (lispdesc_indirect_description_1):
* alloc.c (lispdesc_one_description_line_size):
* alloc.c (lispdesc_structure_size):
* alloc.c (mark_object_maybe_checking_free):
* alloc.c (mark_with_description):
* alloc.c (mark_struct_contents):
* alloc.c (mark_object):
* alloc.c (tick_lcrecord_stats):
* alloc.c (free_cons):
* alloc.c (free_key_data):
* alloc.c (free_button_data):
* alloc.c (free_motion_data):
* alloc.c (free_process_data):
* alloc.c (free_timeout_data):
* alloc.c (free_magic_data):
* alloc.c (free_magic_eval_data):
* alloc.c (free_eval_data):
* alloc.c (free_misc_user_data):
* alloc.c (free_marker):
* alloc.c (compact_string_chars):
* alloc.c (gc_sweep):
* alloc.c (garbage_collect_1):
* alloc.c (Fgarbage_collect):
* alloc.c (common_init_alloc_early):
* alloc.c (init_alloc_early):
* alloc.c (init_alloc_once_early):
* buffer.c:
* buffer.c (mark_buffer):
* buffer.c (MARKED_SLOT):
* buffer.c (cleanup_buffer_undo_lists):
* buffer.c (Fget_file_buffer):
* buffer.h (MARKED_SLOT):
* bufslots.h:
* bytecode.c:
* callint.c:
* casetab.c:
* chartab.c:
* chartab.c (symbol_to_char_table_type):
* cmdloop.c:
* cmdloop.c (Fcommand_loop_1):
* config.h.in (new):
* conslots.h:
* console-gtk-impl.h (struct gtk_frame):
* console-impl.h:
* console-impl.h (struct console):
* console-impl.h (MARKED_SLOT):
* console-impl.h (CONSOLE_QUIT_EVENT):
* console-msw-impl.h (XM_BUMPQUEUE):
* console-msw.c (write_string_to_mswindows_debugging_output):
* console-msw.h:
* console-stream-impl.h:
* console-stream-impl.h (struct stream_console):
* console-stream.c:
* console-stream.c (stream_init_console):
* console-stream.h:
* console-tty.c:
* console-tty.h:
* console-x.h:
* console.c:
* console.c (mark_console):
* console.c (MARKED_SLOT):
* console.c (allocate_console):
* console.c (get_console_variant):
* console.c (create_console):
* console.c (delete_console_internal):
* console.c (Fset_input_mode):
* console.c (Fcurrent_input_mode):
* console.c (common_init_complex_vars_of_console):
* console.h:
* console.h (console_variant):
* console.h (device_metrics):
* data.c:
* data.c (Faref):
* data.c (Faset):
* data.c (decode_weak_list_type):
* database.c:
* debug.c (xemacs_debug_loop):
* debug.c (FROB):
* debug.c (Fadd_debug_class_to_check):
* debug.c (Fdelete_debug_class_to_check):
* debug.c (Fset_debug_classes_to_check):
* debug.c (Fset_debug_class_types_to_check):
* debug.c (Fdebug_types_being_checked):
* debug.h (DASSERT):
* device-gtk.c:
* device-impl.h (struct device):
* device-impl.h (MARKED_SLOT):
* device-msw.c:
* device-x.c:
* device-x.c (x_init_device_class):
* device-x.c (x_comp_visual_info):
* device-x.c (x_try_best_visual_class):
* device-x.c (x_init_device):
* device-x.c (construct_name_list):
* device-x.c (x_get_resource_prefix):
* device-x.c (Fx_get_resource):
* device-x.c (Fx_display_visual_class):
* device.c:
* device.c (MARKED_SLOT):
* device.c (allocate_device):
* device.c (Fmake_device):
* device.c (delete_device_internal):
* device.c (Fset_device_class):
* device.h:
* devslots.h:
* devslots.h (MARKED_SLOT):
* dialog-msw.c:
* dired-msw.c (mswindows_ls_sort_fcn):
* dired-msw.c (mswindows_get_files):
* dired-msw.c (mswindows_format_file):
* doprnt.c (parse_doprnt_spec):
* dumper.c:
* dumper.c (struct):
* dumper.c (dump_add_root_block):
* dumper.c (dump_add_root_struct_ptr):
* dumper.c (dump_add_root_lisp_object):
* dumper.c (pdump_struct_list_elt):
* dumper.c (pdump_get_entry_list):
* dumper.c (pdump_backtrace):
* dumper.c (pdump_bump_depth):
* dumper.c (pdump_register_sub):
* dumper.c (pdump_register_object):
* dumper.c (pdump_register_struct_contents):
* dumper.c (pdump_register_struct):
* dumper.c (pdump_store_new_pointer_offsets):
* dumper.c (pdump_dump_data):
* dumper.c (pdump_reloc_one):
* dumper.c (pdump_allocate_offset):
* dumper.c (pdump_scan_by_alignment):
* dumper.c (pdump_dump_root_blocks):
* dumper.c (pdump_dump_rtables):
* dumper.c (pdump_dump_root_lisp_objects):
* dumper.c (pdump):
* dumper.c (pdump_load_finish):
* dumper.c (pdump_file_get):
* dumper.c (pdump_resource_get):
* dumper.c (pdump_load):
* editfns.c (save_excursion_restore):
* editfns.c (user_login_name):
* editfns.c (save_restriction_restore):
* elhash.c:
* elhash.c (htentry):
* elhash.c (struct Lisp_Hash_Table):
* elhash.c (HTENTRY_CLEAR_P):
* elhash.c (LINEAR_PROBING_LOOP):
* elhash.c (check_hash_table_invariants):
* elhash.c (mark_hash_table):
* elhash.c (hash_table_equal):
* elhash.c (print_hash_table_data):
* elhash.c (free_hentries):
* elhash.c (make_general_lisp_hash_table):
* elhash.c (decode_hash_table_weakness):
* elhash.c (decode_hash_table_test):
* elhash.c (Fcopy_hash_table):
* elhash.c (resize_hash_table):
* elhash.c (pdump_reorganize_hash_table):
* elhash.c (find_htentry):
* elhash.c (Fgethash):
* elhash.c (Fputhash):
* elhash.c (remhash_1):
* elhash.c (Fremhash):
* elhash.c (Fclrhash):
* elhash.c (copy_compress_hentries):
* elhash.c (elisp_maphash_unsafe):
* elhash.c (finish_marking_weak_hash_tables):
* elhash.c (prune_weak_hash_tables):
* elhash.h:
* emacs.c:
* emacs.c (main_1):
* emacs.c (main):
* emacs.c (shut_down_emacs):
* emodules.h (dump_add_root_lisp_object):
* eval.c:
* eval.c (unwind_to_catch):
* eval.c (maybe_signal_error_1):
* eval.c (maybe_signal_continuable_error_1):
* eval.c (maybe_signal_error):
* eval.c (maybe_signal_continuable_error):
* eval.c (maybe_signal_error_2):
* eval.c (maybe_signal_continuable_error_2):
* eval.c (maybe_signal_ferror):
* eval.c (maybe_signal_continuable_ferror):
* eval.c (maybe_signal_ferror_with_frob):
* eval.c (maybe_signal_continuable_ferror_with_frob):
* eval.c (maybe_syntax_error):
* eval.c (maybe_sferror):
* eval.c (maybe_invalid_argument):
* eval.c (maybe_invalid_constant):
* eval.c (maybe_invalid_operation):
* eval.c (maybe_invalid_change):
* eval.c (maybe_invalid_state):
* eval.c (Feval):
* eval.c (call_trapping_problems):
* eval.c (call_with_suspended_errors):
* eval.c (warn_when_safe_lispobj):
* eval.c (warn_when_safe):
* eval.c (vars_of_eval):
* event-Xt.c:
* event-Xt.c (maybe_define_x_key_as_self_inserting_character):
* event-Xt.c (x_to_emacs_keysym):
* event-Xt.c (x_event_to_emacs_event):
* event-Xt.c (emacs_Xt_enqueue_focus_event):
* event-Xt.c (emacs_Xt_format_magic_event):
* event-Xt.c (emacs_Xt_compare_magic_event):
* event-Xt.c (emacs_Xt_hash_magic_event):
* event-Xt.c (emacs_Xt_handle_magic_event):
* event-Xt.c (Xt_timeout_to_emacs_event):
* event-Xt.c (Xt_process_to_emacs_event):
* event-Xt.c (signal_special_Xt_user_event):
* event-Xt.c (emacs_Xt_next_event):
* event-Xt.c (emacs_Xt_event_handler):
* event-Xt.c (emacs_Xt_drain_queue):
* event-Xt.c (emacs_Xt_event_pending_p):
* event-Xt.c (check_if_pending_expose_event):
* event-Xt.c (reinit_vars_of_event_Xt):
* event-Xt.c (vars_of_event_Xt):
* event-gtk.c:
* event-gtk.c (IS_MODIFIER_KEY):
* event-gtk.c (emacs_gtk_format_magic_event):
* event-gtk.c (emacs_gtk_compare_magic_event):
* event-gtk.c (emacs_gtk_hash_magic_event):
* event-gtk.c (emacs_gtk_handle_magic_event):
* event-gtk.c (gtk_to_emacs_keysym):
* event-gtk.c (gtk_timeout_to_emacs_event):
* event-gtk.c (gtk_process_to_emacs_event):
* event-gtk.c (dragndrop_data_received):
* event-gtk.c (signal_special_gtk_user_event):
* event-gtk.c (emacs_gtk_next_event):
* event-gtk.c (gtk_event_to_emacs_event):
* event-gtk.c (generic_event_handler):
* event-gtk.c (emacs_shell_event_handler):
* event-gtk.c (emacs_gtk_drain_queue):
* event-gtk.c (emacs_gtk_event_pending_p):
* event-gtk.c (reinit_vars_of_event_gtk):
* event-gtk.c (vars_of_event_gtk):
* event-msw.c:
* event-msw.c (struct winsock_stream):
* event-msw.c (winsock_reader):
* event-msw.c (winsock_writer):
* event-msw.c (mswindows_enqueue_dispatch_event):
* event-msw.c (mswindows_enqueue_misc_user_event):
* event-msw.c (mswindows_enqueue_magic_event):
* event-msw.c (mswindows_enqueue_process_event):
* event-msw.c (mswindows_enqueue_mouse_button_event):
* event-msw.c (mswindows_enqueue_keypress_event):
* event-msw.c (mswindows_dequeue_dispatch_event):
* event-msw.c (emacs_mswindows_drain_queue):
* event-msw.c (mswindows_need_event_in_modal_loop):
* event-msw.c (mswindows_need_event):
* event-msw.c (mswindows_wm_timer_callback):
* event-msw.c (dde_eval_string):
* event-msw.c (Fdde_alloc_advise_item):
* event-msw.c (mswindows_dde_callback):
* event-msw.c (mswindows_wnd_proc):
* event-msw.c (remove_timeout_mapper):
* event-msw.c (emacs_mswindows_remove_timeout):
* event-msw.c (emacs_mswindows_event_pending_p):
* event-msw.c (emacs_mswindows_format_magic_event):
* event-msw.c (emacs_mswindows_compare_magic_event):
* event-msw.c (emacs_mswindows_hash_magic_event):
* event-msw.c (emacs_mswindows_handle_magic_event):
* event-msw.c (emacs_mswindows_select_console):
* event-msw.c (emacs_mswindows_unselect_console):
* event-msw.c (reinit_vars_of_event_mswindows):
* event-msw.c (vars_of_event_mswindows):
* event-stream.c:
* event-stream.c (mark_command_builder):
* event-stream.c (reset_command_builder_event_chain):
* event-stream.c (allocate_command_builder):
* event-stream.c (copy_command_builder):
* event-stream.c (command_builder_append_event):
* event-stream.c (event_stream_event_pending_p):
* event-stream.c (event_stream_force_event_pending):
* event-stream.c (maybe_read_quit_event):
* event-stream.c (event_stream_drain_queue):
* event-stream.c (remove_quit_p_event):
* event-stream.c (event_stream_quit_p):
* event-stream.c (echo_key_event):
* event-stream.c (maybe_kbd_translate):
* event-stream.c (execute_help_form):
* event-stream.c (event_stream_generate_wakeup):
* event-stream.c (enqueue_dispatch_event):
* event-stream.c (enqueue_magic_eval_event):
* event-stream.c (Fenqueue_eval_event):
* event-stream.c (enqueue_misc_user_event):
* event-stream.c (enqueue_misc_user_event_pos):
* event-stream.c (next_event_internal):
* event-stream.c (Fnext_event):
* event-stream.c (Faccept_process_output):
* event-stream.c (execute_internal_event):
* event-stream.c (munge_keymap_translate):
* event-stream.c (command_builder_find_leaf_no_mule_processing):
* event-stream.c (command_builder_find_leaf):
* event-stream.c (lookup_command_event):
* event-stream.c (is_scrollbar_event):
* event-stream.c (execute_command_event):
* event-stream.c (Fdispatch_event):
* event-stream.c (Fread_key_sequence):
* event-stream.c (dribble_out_event):
* event-stream.c (vars_of_event_stream):
* event-tty.c (tty_timeout_to_emacs_event):
* event-tty.c (emacs_tty_next_event):
* event-tty.c (emacs_tty_drain_queue):
* event-tty.c (reinit_vars_of_event_tty):
* event-unixoid.c:
* event-unixoid.c (find_tty_or_stream_console_from_fd):
* event-unixoid.c (read_event_from_tty_or_stream_desc):
* event-unixoid.c (drain_tty_devices):
* event-unixoid.c (poll_fds_for_input):
* events.c:
* events.c (deinitialize_event):
* events.c (zero_event):
* events.c (mark_event):
* events.c (print_event_1):
* events.c (print_event):
* events.c (event_equal):
* events.c (event_hash):
* events.c (Fmake_event):
* events.c (Fdeallocate_event):
* events.c (Fcopy_event):
* events.c (map_event_chain_remove):
* events.c (character_to_event):
* events.c (event_to_character):
* events.c (Fevent_to_character):
* events.c (format_event_object):
* events.c (upshift_event):
* events.c (downshift_event):
* events.c (event_upshifted_p):
* events.c (Fevent_live_p):
* events.c (Fevent_type):
* events.c (Fevent_timestamp):
* events.c (CHECK_EVENT_TYPE):
* events.c (CHECK_EVENT_TYPE2):
* events.c (CHECK_EVENT_TYPE3):
* events.c (Fevent_key):
* events.c (Fevent_button):
* events.c (Fevent_modifier_bits):
* events.c (event_x_y_pixel_internal):
* events.c (event_pixel_translation):
* events.c (Fevent_process):
* events.c (Fevent_function):
* events.c (Fevent_object):
* events.c (Fevent_properties):
* events.c (syms_of_events):
* events.c (vars_of_events):
* events.h:
* events.h (struct event_stream):
* events.h (struct Lisp_Key_Data):
* events.h (KEY_DATA_KEYSYM):
* events.h (EVENT_KEY_KEYSYM):
* events.h (struct Lisp_Button_Data):
* events.h (EVENT_BUTTON_BUTTON):
* events.h (struct Lisp_Motion_Data):
* events.h (EVENT_MOTION_X):
* events.h (struct Lisp_Process_Data):
* events.h (EVENT_PROCESS_PROCESS):
* events.h (struct Lisp_Timeout_Data):
* events.h (EVENT_TIMEOUT_INTERVAL_ID):
* events.h (struct Lisp_Eval_Data):
* events.h (EVENT_EVAL_FUNCTION):
* events.h (struct Lisp_Misc_User_Data):
* events.h (EVENT_MISC_USER_FUNCTION):
* events.h (struct Lisp_Magic_Eval_Data):
* events.h (EVENT_MAGIC_EVAL_INTERNAL_FUNCTION):
* events.h (struct Lisp_Magic_Data):
* events.h (EVENT_MAGIC_UNDERLYING):
* events.h (EVENT_MAGIC_GDK_EVENT):
* events.h (struct Lisp_Event):
* events.h (XEVENT_CHANNEL):
* events.h (SET_EVENT_TIMESTAMP_ZERO):
* events.h (SET_EVENT_CHANNEL):
* events.h (SET_EVENT_NEXT):
* events.h (XSET_EVENT_TYPE):
* events.h (struct command_builder):
* extents.c:
* extents.c (gap_array_adjust_markers):
* extents.c (gap_array_recompute_derived_values):
* extents.c (gap_array_move_gap):
* extents.c (gap_array_make_gap):
* extents.c (gap_array_insert_els):
* extents.c (gap_array_delete_els):
* extents.c (gap_array_make_marker):
* extents.c (gap_array_delete_marker):
* extents.c (gap_array_move_marker):
* extents.c (make_gap_array):
* extents.c (free_gap_array):
* extents.c (extent_list_num_els):
* extents.c (extent_list_insert):
* extents.c (mark_extent_auxiliary):
* extents.c (allocate_extent_auxiliary):
* extents.c (decode_extent_at_flag):
* extents.c (verify_extent_mapper):
* extents.c (symbol_to_glyph_layout):
* extents.c (syms_of_extents):
* faces.c:
* file-coding.c:
* file-coding.c (struct_detector_category_description =):
* file-coding.c (detector_category_dynarr_description_1):
* file-coding.c (struct_detector_description =):
* file-coding.c (detector_dynarr_description_1):
* file-coding.c (MARKED_SLOT):
* file-coding.c (mark_coding_system):
* file-coding.c (coding_system_extra_description_map):
* file-coding.c (coding_system_description):
* file-coding.c (allocate_coding_system):
* file-coding.c (symbol_to_eol_type):
* file-coding.c (Fcoding_system_aliasee):
* file-coding.c (set_coding_stream_coding_system):
* file-coding.c (struct convert_eol_coding_system):
* file-coding.c (struct undecided_coding_system):
* file-coding.c (undecided_mark_coding_stream):
* file-coding.c (coding_category_symbol_to_id):
* file-coding.c (struct gzip_coding_system):
* file-coding.c (coding_system_type_create):
* file-coding.h:
* file-coding.h (struct Lisp_Coding_System):
* file-coding.h (CODING_SYSTEM_SLOT_DECLARATION):
* file-coding.h (coding_system_variant):
* file-coding.h (struct coding_system_methods):
* file-coding.h (DEFINE_CODING_SYSTEM_TYPE_WITH_DATA):
* file-coding.h (INITIALIZE_CODING_SYSTEM_TYPE_WITH_DATA):
* file-coding.h (struct coding_stream):
* fileio.c (Fsubstitute_in_file_name):
* floatfns.c:
* fns.c:
* fns.c (base64_encode_1):
* frame-gtk.c:
* frame-gtk.c (Fgtk_start_drag_internal):
* frame-impl.h (struct frame):
* frame-impl.h (MARKED_SLOT):
* frame-msw.c:
* frame-x.c:
* frame-x.c (Fcde_start_drag_internal):
* frame-x.c (Foffix_start_drag_internal):
* frame.c:
* frame.c (MARKED_SLOT):
* frame.c (allocate_frame_core):
* frame.c (delete_frame_internal):
* frame.c (Fmouse_position_as_motion_event):
* frameslots.h:
* frameslots.h (MARKED_SLOT_ARRAY):
* free-hook.c:
* glyphs-msw.c (mswindows_widget_instantiate):
* glyphs-x.c:
* glyphs-x.c (convert_EImage_to_XImage):
* glyphs.c:
* glyphs.c (process_image_string_instantiator):
* glyphs.c (mark_image_instance):
* glyphs.c (allocate_image_instance):
* glyphs.c (unmap_subwindow):
* glyphs.c (map_subwindow):
* glyphs.c (syms_of_glyphs):
* glyphs.c (specifier_type_create_image):
* glyphs.h:
* glyphs.h (struct text_image_instance):
* glyphs.h (struct Lisp_Image_Instance):
* gmalloc.c:
* gmalloc.c ("C"):
* gpmevent.c (Freceive_gpm_event):
* gpmevent.c (gpm_next_event_cb):
* gpmevent.c (vars_of_gpmevent):
* gtk-glue.c (gdk_event_to_emacs_event):
* gtk-xemacs.c (gtk_xemacs_class_init):
* gui-msw.c:
* gui-msw.c (mswindows_handle_gui_wm_command):
* gui-msw.c (mswindows_translate_menu_or_dialog_item):
* gui-x.c:
* gui-x.c (mark_popup_data):
* gui-x.c (snarf_widget_value_mapper):
* gui-x.c (gcpro_popup_callbacks):
* gui-x.c (ungcpro_popup_callbacks):
* gui-x.c (free_popup_widget_value_tree):
* gui-x.c (popup_selection_callback):
* gui-x.h:
* gui-x.h (struct popup_data):
* gui.c:
* gui.c (allocate_gui_item):
* gutter.c (decode_gutter_position):
* hash.c (NULL_ENTRY):
* indent.c (vmotion_1):
* indent.c (vmotion_pixels):
* input-method-motif.c (res):
* input-method-xlib.c (IMInstantiateCallback):
* input-method-xlib.c (XIM_init_device):
* input-method-xlib.c (res):
* intl-encap-win32.c:
* intl-encap-win32.c (qxeSHGetDataFromIDList):
* intl-win32.c:
* intl-win32.c (mswindows_multibyte_cp_type):
* intl-win32.c (struct mswindows_multibyte_coding_system):
* keymap.c:
* keymap.c (make_key_description):
* keymap.c (keymap_store):
* keymap.c (get_keyelt):
* keymap.c (keymap_lookup_1):
* keymap.c (define_key_parser):
* keymap.c (key_desc_list_to_event):
* keymap.c (event_matches_key_specifier_p):
* keymap.c (meta_prefix_char_p):
* keymap.c (ensure_meta_prefix_char_keymapp):
* keymap.c (Fdefine_key):
* keymap.c (struct raw_lookup_key_mapper_closure):
* keymap.c (raw_lookup_key):
* keymap.c (raw_lookup_key_mapper):
* keymap.c (lookup_keys):
* keymap.c (lookup_events):
* keymap.c (Flookup_key):
* keymap.c (struct map_keymap_unsorted_closure):
* keymap.c (map_keymap_unsorted_mapper):
* keymap.c (map_keymap_sorted):
* keymap.c (map_keymap_mapper):
* keymap.c (map_keymap):
* keymap.c (accessible_keymaps_mapper_1):
* keymap.c (Faccessible_keymaps):
* keymap.c (Fsingle_key_description):
* keymap.c (raw_keys_to_keys):
* keymap.c (format_raw_keys):
* keymap.c (where_is_recursive_mapper):
* keymap.c (where_is_internal):
* keymap.c (describe_map_mapper_shadow_search):
* keymap.c (keymap_lookup_inherited_mapper):
* keymap.c (describe_map_mapper):
* keymap.h (event_matches_key_specifier_p):
* lisp.h:
* lisp.h (this):
* lisp.h (RETURN_NOT_REACHED):
* lisp.h (struct Lisp_Vector):
* lisp.h (struct Lisp_Bit_Vector):
* lisp.h (UNGCPRO_1):
* lisp.h (NUNGCPRO):
* lisp.h (NNUNGCPRO):
* lisp.h (DECLARE_INLINE_HEADER):
* lrecord.h:
* lrecord.h (struct lrecord_header):
* lrecord.h (struct lcrecord_header):
* lrecord.h (lrecord_type):
* lrecord.h (struct lrecord_implementation):
* lrecord.h (RECORD_DUMPABLE):
* lrecord.h (memory_description_type):
* lrecord.h (data_description_entry_flags):
* lrecord.h (struct memory_description):
* lrecord.h (struct sized_memory_description):
* lrecord.h (XD_INDIRECT):
* lrecord.h (XD_IS_INDIRECT):
* lrecord.h (XD_DYNARR_DESC):
* lrecord.h (DEFINE_BASIC_LRECORD_IMPLEMENTATION):
* lrecord.h (MAKE_LRECORD_IMPLEMENTATION):
* lrecord.h (MAKE_EXTERNAL_LRECORD_IMPLEMENTATION):
* lrecord.h (alloc_lcrecord_type):
* lstream.c:
* lstream.c (Lstream_new):
* lstream.c (lisp_buffer_marker):
* lstream.h:
* lstream.h (lstream_implementation):
* lstream.h (DEFINE_LSTREAM_IMPLEMENTATION):
* lstream.h (DEFINE_LSTREAM_IMPLEMENTATION_WITH_DATA):
* marker.c:
* marker.c (copy_marker_1):
* mem-limits.h:
* menubar-gtk.c:
* menubar-gtk.c (gtk_popup_menu):
* menubar-msw.c:
* menubar-msw.c (mswindows_popup_menu):
* menubar-x.c (make_dummy_xbutton_event):
* menubar-x.c (command_builder_operate_menu_accelerator):
* menubar-x.c (menu_accelerator_safe_compare):
* menubar-x.c (menu_accelerator_safe_mod_compare):
* mule-charset.c:
* mule-charset.c (make_charset):
* mule-charset.c (Fcharset_property):
* mule-coding.c:
* mule-coding.c (ccs_description_1):
* mule-coding.c (ccs_description =):
* mule-coding.c (ccsd_description_1):
* mule-coding.c (ccsd_description =):
* nt.c (getpwnam):
* nt.c (init_mswindows_environment):
* nt.c (get_cached_volume_information):
* nt.c (mswindows_is_executable):
* nt.c (read_unc_volume):
* nt.c (mswindows_access):
* nt.c (mswindows_link):
* nt.c (mswindows_fstat):
* nt.c (mswindows_stat):
* nt.c (mswindows_executable_type):
* nt.c (Fmswindows_short_file_name):
* nt.c (Fmswindows_long_file_name):
* objects-impl.h (struct Lisp_Color_Instance):
* objects-impl.h (struct Lisp_Font_Instance):
* objects-tty.c:
* objects-x.c (allocate_nearest_color):
* objects.c:
* objects.c (Fmake_color_instance):
* objects.c (Fmake_font_instance):
* objects.c (font_instantiate):
* opaque.c:
* opaque.c (make_opaque):
* opaque.c (make_opaque_ptr):
* opaque.c (reinit_opaque_early):
* opaque.c (init_opaque_once_early):
* print.c:
* print.c (printing_badness):
* print.c (printing_major_badness):
* print.c (print_internal):
* print.c (debug_p4):
* print.c (dp):
* print.c (debug_backtrace):
* process-nt.c (nt_create_process):
* process-nt.c (get_internet_address):
* process-unix.c:
* process-unix.c (struct unix_process_data):
* process-unix.c (get_internet_address):
* process-unix.c (unix_alloc_process_data):
* process-unix.c (unix_create_process):
* process-unix.c (try_to_initialize_subtty):
* process-unix.c (unix_kill_child_process):
* process-unix.c (process_type_create_unix):
* process.c:
* process.c (mark_process):
* process.c (MARKED_SLOT):
* process.c (make_process_internal):
* process.c (Fprocess_tty_name):
* process.c (decode_signal):
* process.h:
* procimpl.h:
* procimpl.h (struct process_methods):
* procimpl.h (struct Lisp_Process):
* rangetab.c:
* realpath.c (readlink_and_correct_case):
* redisplay-x.c (x_window_output_end):
* redisplay-x.c (x_redraw_exposed_area):
* redisplay-x.c (x_clear_frame):
* redisplay.c:
* redisplay.h:
* redisplay.h (struct rune_dglyph):
* redisplay.h (struct rune):
* scrollbar.c:
* scrollbar.c (create_scrollbar_instance):
* specifier.c:
* specifier.c (specifier_empty_extra_description_1):
* specifier.c (make_specifier_internal):
* specifier.c (decode_locale_type):
* specifier.c (decode_how_to_add_specification):
* specifier.h:
* specifier.h (struct specifier_methods):
* specifier.h (DEFINE_SPECIFIER_TYPE_WITH_DATA):
* specifier.h (INITIALIZE_SPECIFIER_TYPE_WITH_DATA):
* symbols.c:
* symbols.c (Fsetplist):
* symbols.c (default_value):
* symbols.c (decode_magic_handler_type):
* symbols.c (handler_type_from_function_symbol):
* symbols.c (Fdefvaralias):
* symbols.c (init_symbols_once_early):
* symbols.c (reinit_symbols_early):
* symsinit.h:
* sysdep.c (sys_subshell):
* sysdep.c (tty_init_sys_modes_on_device):
* syswindows.h:
* text.c (dfc_convert_to_external_format):
* text.c (dfc_convert_to_internal_format):
* text.c (reinit_eistring_early):
* text.c (init_eistring_once_early):
* text.c (reinit_vars_of_text):
* text.h:
* text.h (INC_IBYTEPTR_FMT):
* text.h (DEC_IBYTEPTR_FMT):
* toolbar.c:
* toolbar.c (decode_toolbar_position):
* tooltalk.c:
* ui-gtk.c:
* unexnt.c:
* unexnt.c (_start):
* unexnt.c (unexec):
* unexnt.c (get_section_info):
* unicode.c:
* unicode.c (vars_of_unicode):
* window.c:
* window.c (allocate_window):
* window.c (new_window_mirror):
* window.c (update_mirror_internal):
* winslots.h:
author | michaels |
---|---|
date | Sun, 12 Jan 2003 11:08:22 +0000 |
parents | 0dc7756a58c4 |
children | a8d8f419b459 |
comparison
equal
deleted
inserted
replaced
1203:5f2f8dcbfb3e | 1204:e22b0213b713 |
---|---|
267 } | 267 } |
268 write_fmt_string (printcharfun, "size %ld 0x%x>", | 268 write_fmt_string (printcharfun, "size %ld 0x%x>", |
269 (long) XINT (Fkeymap_fullness (obj)), keymap->header.uid); | 269 (long) XINT (Fkeymap_fullness (obj)), keymap->header.uid); |
270 } | 270 } |
271 | 271 |
272 static const struct lrecord_description keymap_description[] = { | 272 static const struct memory_description keymap_description[] = { |
273 { XD_LISP_OBJECT, offsetof (Lisp_Keymap, parents) }, | 273 { XD_LISP_OBJECT, offsetof (Lisp_Keymap, parents) }, |
274 { XD_LISP_OBJECT, offsetof (Lisp_Keymap, prompt) }, | 274 { XD_LISP_OBJECT, offsetof (Lisp_Keymap, prompt) }, |
275 { XD_LISP_OBJECT, offsetof (Lisp_Keymap, table) }, | 275 { XD_LISP_OBJECT, offsetof (Lisp_Keymap, table) }, |
276 { XD_LISP_OBJECT, offsetof (Lisp_Keymap, inverse_table) }, | 276 { XD_LISP_OBJECT, offsetof (Lisp_Keymap, inverse_table) }, |
277 { XD_LISP_OBJECT, offsetof (Lisp_Keymap, default_binding) }, | 277 { XD_LISP_OBJECT, offsetof (Lisp_Keymap, default_binding) }, |
279 { XD_LISP_OBJECT, offsetof (Lisp_Keymap, name) }, | 279 { XD_LISP_OBJECT, offsetof (Lisp_Keymap, name) }, |
280 { XD_END } | 280 { XD_END } |
281 }; | 281 }; |
282 | 282 |
283 /* No need for keymap_equal #### Why not? */ | 283 /* No need for keymap_equal #### Why not? */ |
284 #ifdef USE_KKCC | |
285 DEFINE_LRECORD_IMPLEMENTATION ("keymap", keymap, | 284 DEFINE_LRECORD_IMPLEMENTATION ("keymap", keymap, |
286 1, /*dumpable-flag*/ | 285 1, /*dumpable-flag*/ |
287 mark_keymap, print_keymap, 0, 0, 0, | 286 mark_keymap, print_keymap, 0, 0, 0, |
288 keymap_description, | 287 keymap_description, |
289 Lisp_Keymap); | 288 Lisp_Keymap); |
290 #else /* not USE_KKCC */ | |
291 DEFINE_LRECORD_IMPLEMENTATION ("keymap", keymap, | |
292 mark_keymap, print_keymap, 0, 0, 0, | |
293 keymap_description, | |
294 Lisp_Keymap); | |
295 #endif /* not USE_KKCC */ | |
296 | 289 |
297 /************************************************************************/ | 290 /************************************************************************/ |
298 /* Traversing keymaps and their parents */ | 291 /* Traversing keymaps and their parents */ |
299 /************************************************************************/ | 292 /************************************************************************/ |
300 | 293 |
434 if (modifiers & XEMACS_MOD_META) frob = Fcons (Qmeta, frob); | 427 if (modifiers & XEMACS_MOD_META) frob = Fcons (Qmeta, frob); |
435 return frob; | 428 return frob; |
436 } | 429 } |
437 | 430 |
438 static Lisp_Object | 431 static Lisp_Object |
439 #ifdef USE_KKCC | |
440 make_key_description (const Lisp_Key_Data *key, int prettify) | 432 make_key_description (const Lisp_Key_Data *key, int prettify) |
441 { | 433 { |
442 Lisp_Object keysym = KEY_DATA_KEYSYM(key); | 434 Lisp_Object keysym = KEY_DATA_KEYSYM (key); |
443 int modifiers = KEY_DATA_MODIFIERS (key); | 435 int modifiers = KEY_DATA_MODIFIERS (key); |
444 #else /* not USE_KKCC */ | |
445 make_key_description (const struct key_data *key, int prettify) | |
446 { | |
447 Lisp_Object keysym = key->keysym; | |
448 int modifiers = key->modifiers; | |
449 #endif /* not USE_KKCC */ | |
450 if (prettify && CHARP (keysym)) | 436 if (prettify && CHARP (keysym)) |
451 { | 437 { |
452 /* This is a little slow, but (control a) is prettier than (control 65). | 438 /* This is a little slow, but (control a) is prettier than (control 65). |
453 It's now ok to do this for digit-chars too, since we've fixed the | 439 It's now ok to do this for digit-chars too, since we've fixed the |
454 bug where \9 read as the integer 9 instead of as the symbol with | 440 bug where \9 read as the integer 9 instead of as the symbol with |
468 /* Low-level keymap-store functions */ | 454 /* Low-level keymap-store functions */ |
469 /************************************************************************/ | 455 /************************************************************************/ |
470 | 456 |
471 static Lisp_Object | 457 static Lisp_Object |
472 raw_lookup_key (Lisp_Object keymap, | 458 raw_lookup_key (Lisp_Object keymap, |
473 #ifdef USE_KKCC | |
474 const Lisp_Key_Data *raw_keys, int raw_keys_count, | 459 const Lisp_Key_Data *raw_keys, int raw_keys_count, |
475 #else /* not USE_KKCC */ | |
476 const struct key_data *raw_keys, int raw_keys_count, | |
477 #endif /* not USE_KKCC */ | |
478 int keys_so_far, int accept_default); | 460 int keys_so_far, int accept_default); |
479 | 461 |
480 /* Relies on caller to gc-protect args */ | 462 /* Relies on caller to gc-protect args */ |
481 static Lisp_Object | 463 static Lisp_Object |
482 keymap_lookup_directly (Lisp_Object keymap, | 464 keymap_lookup_directly (Lisp_Object keymap, |
656 } | 638 } |
657 | 639 |
658 | 640 |
659 /* Relies on caller to gc-protect keymap, keysym, value */ | 641 /* Relies on caller to gc-protect keymap, keysym, value */ |
660 static void | 642 static void |
661 #ifdef USE_KKCC | |
662 keymap_store (Lisp_Object keymap, const Lisp_Key_Data *key, | 643 keymap_store (Lisp_Object keymap, const Lisp_Key_Data *key, |
663 #else /* not USE_KKCC */ | |
664 keymap_store (Lisp_Object keymap, const struct key_data *key, | |
665 #endif /* not USE_KKCC */ | |
666 Lisp_Object value) | 644 Lisp_Object value) |
667 { | 645 { |
668 #ifdef USE_KKCC | |
669 Lisp_Object keysym = KEY_DATA_KEYSYM (key); | 646 Lisp_Object keysym = KEY_DATA_KEYSYM (key); |
670 int modifiers = KEY_DATA_MODIFIERS (key); | 647 int modifiers = KEY_DATA_MODIFIERS (key); |
671 #else /* not USE_KKCC */ | |
672 Lisp_Object keysym = key->keysym; | |
673 int modifiers = key->modifiers; | |
674 #endif /* not USE_KKCC */ | |
675 Lisp_Keymap *k = XKEYMAP (keymap); | 648 Lisp_Keymap *k = XKEYMAP (keymap); |
676 | 649 |
677 modifiers &= ~(XEMACS_MOD_BUTTON1 | XEMACS_MOD_BUTTON2 | XEMACS_MOD_BUTTON3 | 650 modifiers &= ~(XEMACS_MOD_BUTTON1 | XEMACS_MOD_BUTTON2 | XEMACS_MOD_BUTTON3 |
678 | XEMACS_MOD_BUTTON4 | XEMACS_MOD_BUTTON5); | 651 | XEMACS_MOD_BUTTON4 | XEMACS_MOD_BUTTON5); |
679 assert ((modifiers & ~(XEMACS_MOD_CONTROL | XEMACS_MOD_META | 652 assert ((modifiers & ~(XEMACS_MOD_CONTROL | XEMACS_MOD_META |
1077 } | 1050 } |
1078 /* If the contents are (KEYMAP . ELEMENT), go indirect. */ | 1051 /* If the contents are (KEYMAP . ELEMENT), go indirect. */ |
1079 if (!NILP (map)) | 1052 if (!NILP (map)) |
1080 { | 1053 { |
1081 Lisp_Object idx = Fcdr (object); | 1054 Lisp_Object idx = Fcdr (object); |
1082 #ifdef USE_KKCC | |
1083 Lisp_Key_Data indirection; | 1055 Lisp_Key_Data indirection; |
1084 #else /* not USE_KKCC */ | |
1085 struct key_data indirection; | |
1086 #endif /* not USE_KKCC */ | |
1087 if (CHARP (idx)) | 1056 if (CHARP (idx)) |
1088 { | 1057 { |
1089 #ifdef USE_KKCC | |
1090 Lisp_Object event = Fmake_event (Qnil, Qnil); | 1058 Lisp_Object event = Fmake_event (Qnil, Qnil); |
1091 struct gcpro gcpro1; | 1059 struct gcpro gcpro1; |
1092 GCPRO1 (event); | 1060 GCPRO1 (event); |
1093 XSET_EVENT_TYPE (event, empty_event); | |
1094 character_to_event (XCHAR (idx), XEVENT (event), | 1061 character_to_event (XCHAR (idx), XEVENT (event), |
1095 XCONSOLE (Vselected_console), 0, 0); | 1062 XCONSOLE (Vselected_console), 0, 0); |
1096 indirection = *XKEY_DATA (XEVENT_DATA (event)); | 1063 indirection.keysym = XEVENT_KEY_KEYSYM (event); |
1097 #else /* not USE_KKCC */ | 1064 indirection.modifiers = XEVENT_KEY_MODIFIERS (event); |
1098 Lisp_Event event; | 1065 UNGCPRO; |
1099 event.event_type = empty_event; | |
1100 character_to_event (XCHAR (idx), &event, | |
1101 XCONSOLE (Vselected_console), 0, 0); | |
1102 indirection = event.event.key; | |
1103 #endif /* not USE_KKCC */ | |
1104 } | 1066 } |
1105 else if (CONSP (idx)) | 1067 else if (CONSP (idx)) |
1106 { | 1068 { |
1107 if (!INTP (XCDR (idx))) | 1069 if (!INTP (XCDR (idx))) |
1108 return Qnil; | 1070 return Qnil; |
1110 indirection.modifiers = (unsigned char) XINT (XCDR (idx)); | 1072 indirection.modifiers = (unsigned char) XINT (XCDR (idx)); |
1111 } | 1073 } |
1112 else if (SYMBOLP (idx)) | 1074 else if (SYMBOLP (idx)) |
1113 { | 1075 { |
1114 indirection.keysym = idx; | 1076 indirection.keysym = idx; |
1115 #ifdef USE_KKCC | |
1116 SET_KEY_DATA_MODIFIERS (&indirection, XINT (XCDR (idx))); | 1077 SET_KEY_DATA_MODIFIERS (&indirection, XINT (XCDR (idx))); |
1117 #else /* not USE_KKCC */ | |
1118 indirection.modifiers = 0; | |
1119 #endif /* not USE_KKCC */ | |
1120 } | 1078 } |
1121 else | 1079 else |
1122 { | 1080 { |
1123 /* Random junk */ | 1081 /* Random junk */ |
1124 return Qnil; | 1082 return Qnil; |
1140 return object; | 1098 return object; |
1141 } | 1099 } |
1142 } | 1100 } |
1143 | 1101 |
1144 static Lisp_Object | 1102 static Lisp_Object |
1145 #ifdef USE_KKCC | |
1146 keymap_lookup_1 (Lisp_Object keymap, const Lisp_Key_Data *key, | 1103 keymap_lookup_1 (Lisp_Object keymap, const Lisp_Key_Data *key, |
1147 #else /* not USE_KKCC */ | |
1148 keymap_lookup_1 (Lisp_Object keymap, const struct key_data *key, | |
1149 #endif /* not USE_KKCC */ | |
1150 int accept_default) | 1104 int accept_default) |
1151 { | 1105 { |
1152 /* This function can GC */ | 1106 /* This function can GC */ |
1153 #ifdef USE_KKCC | |
1154 return get_keyelt (keymap_lookup_directly (keymap, | 1107 return get_keyelt (keymap_lookup_directly (keymap, |
1155 KEY_DATA_KEYSYM (key), | 1108 KEY_DATA_KEYSYM (key), |
1156 KEY_DATA_MODIFIERS (key)), | 1109 KEY_DATA_MODIFIERS (key)), |
1157 accept_default); | 1110 accept_default); |
1158 #else /* not USE_KKCC */ | |
1159 return get_keyelt (keymap_lookup_directly (keymap, | |
1160 key->keysym, key->modifiers), | |
1161 accept_default); | |
1162 #endif /* not USE_KKCC */ | |
1163 } | 1111 } |
1164 | 1112 |
1165 | 1113 |
1166 /************************************************************************/ | 1114 /************************************************************************/ |
1167 /* Copying keymaps */ | 1115 /* Copying keymaps */ |
1450 -- integers are converted into the equivalent characters. | 1398 -- integers are converted into the equivalent characters. |
1451 -- one-character strings are converted into the equivalent characters. | 1399 -- one-character strings are converted into the equivalent characters. |
1452 */ | 1400 */ |
1453 | 1401 |
1454 static void | 1402 static void |
1455 #ifdef USE_KKCC | |
1456 define_key_parser (Lisp_Object spec, Lisp_Key_Data *returned_value) | 1403 define_key_parser (Lisp_Object spec, Lisp_Key_Data *returned_value) |
1457 #else /* not USE_KKCC */ | |
1458 define_key_parser (Lisp_Object spec, struct key_data *returned_value) | |
1459 #endif /* not USE_KKCC */ | |
1460 { | 1404 { |
1461 if (CHAR_OR_CHAR_INTP (spec)) | 1405 if (CHAR_OR_CHAR_INTP (spec)) |
1462 { | 1406 { |
1463 #ifdef USE_KKCC | |
1464 Lisp_Object event = Fmake_event (Qnil, Qnil); | 1407 Lisp_Object event = Fmake_event (Qnil, Qnil); |
1465 struct gcpro gcpro1; | 1408 struct gcpro gcpro1; |
1466 GCPRO1 (event); | 1409 GCPRO1 (event); |
1467 XSET_EVENT_TYPE (event, empty_event); | |
1468 character_to_event (XCHAR_OR_CHAR_INT (spec), XEVENT (event), | 1410 character_to_event (XCHAR_OR_CHAR_INT (spec), XEVENT (event), |
1469 XCONSOLE (Vselected_console), 0, 0); | 1411 XCONSOLE (Vselected_console), 0, 0); |
1470 SET_KEY_DATA_KEYSYM (returned_value, XKEY_DATA_KEYSYM (XEVENT_DATA (event))); | 1412 SET_KEY_DATA_KEYSYM (returned_value, XEVENT_KEY_KEYSYM (event)); |
1471 SET_KEY_DATA_MODIFIERS (returned_value, | 1413 SET_KEY_DATA_MODIFIERS (returned_value, |
1472 XKEY_DATA_MODIFIERS (XEVENT_DATA (event))); | 1414 XEVENT_KEY_MODIFIERS (event)); |
1473 #else /* not USE_KKCC */ | 1415 UNGCPRO; |
1474 Lisp_Event event; | |
1475 event.event_type = empty_event; | |
1476 character_to_event (XCHAR_OR_CHAR_INT (spec), &event, | |
1477 XCONSOLE (Vselected_console), 0, 0); | |
1478 returned_value->keysym = event.event.key.keysym; | |
1479 returned_value->modifiers = event.event.key.modifiers; | |
1480 #endif /* not USE_KKCC */ | |
1481 } | 1416 } |
1482 else if (EVENTP (spec)) | 1417 else if (EVENTP (spec)) |
1483 { | 1418 { |
1484 #ifdef USE_KKCC | |
1485 switch (XEVENT_TYPE (spec)) | 1419 switch (XEVENT_TYPE (spec)) |
1486 #else /* not USE_KKCC */ | |
1487 switch (XEVENT (spec)->event_type) | |
1488 #endif /* not USE_KKCC */ | |
1489 { | 1420 { |
1490 case key_press_event: | 1421 case key_press_event: |
1491 { | 1422 { |
1492 #ifdef USE_KKCC | 1423 SET_KEY_DATA_KEYSYM (returned_value, XEVENT_KEY_KEYSYM (spec)); |
1493 SET_KEY_DATA_KEYSYM (returned_value, XKEY_DATA_KEYSYM (XEVENT_DATA (spec))); | 1424 SET_KEY_DATA_MODIFIERS (returned_value, XEVENT_KEY_MODIFIERS (spec)); |
1494 SET_KEY_DATA_MODIFIERS (returned_value, XKEY_DATA_MODIFIERS (XEVENT_DATA (spec))); | |
1495 #else /* not USE_KKCC */ | |
1496 returned_value->keysym = XEVENT (spec)->event.key.keysym; | |
1497 returned_value->modifiers = XEVENT (spec)->event.key.modifiers; | |
1498 #endif /* not USE_KKCC */ | |
1499 break; | 1425 break; |
1500 } | 1426 } |
1501 case button_press_event: | 1427 case button_press_event: |
1502 case button_release_event: | 1428 case button_release_event: |
1503 { | 1429 { |
1504 #ifdef USE_KKCC | |
1505 int down = (XEVENT_TYPE (spec) == button_press_event); | 1430 int down = (XEVENT_TYPE (spec) == button_press_event); |
1506 switch (XBUTTON_DATA_BUTTON (XEVENT_DATA (spec))) | 1431 switch (XEVENT_BUTTON_BUTTON (spec)) |
1507 { | 1432 { |
1508 case 1: | 1433 case 1: |
1509 SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton1 : Qbutton1up)); | 1434 SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton1 : Qbutton1up)); |
1510 break; | 1435 break; |
1511 case 2: | 1436 case 2: |
1528 break; | 1453 break; |
1529 default: | 1454 default: |
1530 SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton0 : Qbutton0up)); | 1455 SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton0 : Qbutton0up)); |
1531 break; | 1456 break; |
1532 } | 1457 } |
1533 SET_KEY_DATA_MODIFIERS (returned_value, XBUTTON_DATA_MODIFIERS (XEVENT_DATA (spec))); | 1458 SET_KEY_DATA_MODIFIERS (returned_value, XEVENT_BUTTON_MODIFIERS (spec)); |
1534 #else /* not USE_KKCC */ | |
1535 int down = (XEVENT (spec)->event_type == button_press_event); | |
1536 switch (XEVENT (spec)->event.button.button) | |
1537 { | |
1538 case 1: | |
1539 returned_value->keysym = (down ? Qbutton1 : Qbutton1up); break; | |
1540 case 2: | |
1541 returned_value->keysym = (down ? Qbutton2 : Qbutton2up); break; | |
1542 case 3: | |
1543 returned_value->keysym = (down ? Qbutton3 : Qbutton3up); break; | |
1544 case 4: | |
1545 returned_value->keysym = (down ? Qbutton4 : Qbutton4up); break; | |
1546 case 5: | |
1547 returned_value->keysym = (down ? Qbutton5 : Qbutton5up); break; | |
1548 case 6: | |
1549 returned_value->keysym = (down ? Qbutton6 : Qbutton6up); break; | |
1550 case 7: | |
1551 returned_value->keysym = (down ? Qbutton7 : Qbutton7up); break; | |
1552 default: | |
1553 returned_value->keysym = (down ? Qbutton0 : Qbutton0up); break; | |
1554 } | |
1555 returned_value->modifiers = XEVENT (spec)->event.button.modifiers; | |
1556 #endif /* not USE_KKCC */ | |
1557 break; | 1459 break; |
1558 } | 1460 } |
1559 default: | 1461 default: |
1560 wtaerror ("unable to bind this type of event", spec); | 1462 wtaerror ("unable to bind this type of event", spec); |
1561 } | 1463 } |
1564 { | 1466 { |
1565 /* Be nice, allow = to mean (=) */ | 1467 /* Be nice, allow = to mean (=) */ |
1566 if (bucky_sym_to_bucky_bit (spec) != 0) | 1468 if (bucky_sym_to_bucky_bit (spec) != 0) |
1567 invalid_argument ("Key is a modifier name", spec); | 1469 invalid_argument ("Key is a modifier name", spec); |
1568 define_key_check_and_coerce_keysym (spec, &spec, 0); | 1470 define_key_check_and_coerce_keysym (spec, &spec, 0); |
1569 #ifdef USE_KKCC | |
1570 SET_KEY_DATA_KEYSYM (returned_value, spec); | 1471 SET_KEY_DATA_KEYSYM (returned_value, spec); |
1571 SET_KEY_DATA_MODIFIERS (returned_value, 0); | 1472 SET_KEY_DATA_MODIFIERS (returned_value, 0); |
1572 #else /* not USE_KKCC */ | |
1573 returned_value->keysym = spec; | |
1574 returned_value->modifiers = 0; | |
1575 #endif /* not USE_KKCC */ | |
1576 } | 1473 } |
1577 else if (CONSP (spec)) | 1474 else if (CONSP (spec)) |
1578 { | 1475 { |
1579 int modifiers = 0; | 1476 int modifiers = 0; |
1580 Lisp_Object keysym = Qnil; | 1477 Lisp_Object keysym = Qnil; |
1605 if (!NILP (rest)) | 1502 if (!NILP (rest)) |
1606 signal_error (Qlist_formation_error, | 1503 signal_error (Qlist_formation_error, |
1607 "List must be nil-terminated", spec); | 1504 "List must be nil-terminated", spec); |
1608 | 1505 |
1609 define_key_check_and_coerce_keysym (spec, &keysym, modifiers); | 1506 define_key_check_and_coerce_keysym (spec, &keysym, modifiers); |
1610 #ifdef USE_KKCC | |
1611 SET_KEY_DATA_KEYSYM(returned_value, keysym); | 1507 SET_KEY_DATA_KEYSYM(returned_value, keysym); |
1612 SET_KEY_DATA_MODIFIERS (returned_value, modifiers); | 1508 SET_KEY_DATA_MODIFIERS (returned_value, modifiers); |
1613 #else /* not USE_KKCC */ | |
1614 returned_value->keysym = keysym; | |
1615 returned_value->modifiers = modifiers; | |
1616 #endif /* not USE_KKCC */ | |
1617 } | 1509 } |
1618 else | 1510 else |
1619 { | 1511 { |
1620 invalid_argument ("Unknown key-sequence specifier", | 1512 invalid_argument ("Unknown key-sequence specifier", |
1621 spec); | 1513 spec); |
1625 /* Used by character-to-event */ | 1517 /* Used by character-to-event */ |
1626 void | 1518 void |
1627 key_desc_list_to_event (Lisp_Object list, Lisp_Object event, | 1519 key_desc_list_to_event (Lisp_Object list, Lisp_Object event, |
1628 int allow_menu_events) | 1520 int allow_menu_events) |
1629 { | 1521 { |
1630 #ifdef USE_KKCC | |
1631 Lisp_Key_Data raw_key; | 1522 Lisp_Key_Data raw_key; |
1632 #else /* not USE_KKCC */ | |
1633 struct key_data raw_key; | |
1634 #endif /* not USE_KKCC */ | |
1635 | 1523 |
1636 if (allow_menu_events && | 1524 if (allow_menu_events && |
1637 CONSP (list) && | 1525 CONSP (list) && |
1638 /* #### where the hell does this come from? */ | 1526 /* #### where the hell does this come from? */ |
1639 EQ (XCAR (list), Qmenu_selection)) | 1527 EQ (XCAR (list), Qmenu_selection)) |
1644 arg = Fcar (Fcdr (list)); | 1532 arg = Fcar (Fcdr (list)); |
1645 if (SYMBOLP (arg)) | 1533 if (SYMBOLP (arg)) |
1646 fn = Qcall_interactively; | 1534 fn = Qcall_interactively; |
1647 else | 1535 else |
1648 fn = Qeval; | 1536 fn = Qeval; |
1649 #ifdef USE_KKCC | |
1650 XSET_EVENT_TYPE (event, misc_user_event); | 1537 XSET_EVENT_TYPE (event, misc_user_event); |
1651 XSET_EVENT_CHANNEL (event, wrap_frame (selected_frame)); | 1538 XSET_EVENT_CHANNEL (event, wrap_frame (selected_frame ())); |
1652 XSET_MISC_USER_DATA_FUNCTION (XEVENT_DATA (event), fn); | 1539 XSET_EVENT_MISC_USER_FUNCTION (event, fn); |
1653 XSET_MISC_USER_DATA_OBJECT (XEVENT_DATA (event), arg); | 1540 XSET_EVENT_MISC_USER_OBJECT (event, arg); |
1654 #else /* not USE_KKCC */ | |
1655 XEVENT (event)->channel = wrap_frame (selected_frame ()); | |
1656 XEVENT (event)->event_type = misc_user_event; | |
1657 XEVENT (event)->event.eval.function = fn; | |
1658 XEVENT (event)->event.eval.object = arg; | |
1659 #endif /* not USE_KKCC */ | |
1660 return; | 1541 return; |
1661 } | 1542 } |
1662 | 1543 |
1663 define_key_parser (list, &raw_key); | 1544 define_key_parser (list, &raw_key); |
1664 | 1545 |
1671 EQ (raw_key.keysym, Qbutton6) || EQ (raw_key.keysym, Qbutton6up) || | 1552 EQ (raw_key.keysym, Qbutton6) || EQ (raw_key.keysym, Qbutton6up) || |
1672 EQ (raw_key.keysym, Qbutton7) || EQ (raw_key.keysym, Qbutton7up)) | 1553 EQ (raw_key.keysym, Qbutton7) || EQ (raw_key.keysym, Qbutton7up)) |
1673 invalid_operation ("Mouse-clicks can't appear in saved keyboard macros", | 1554 invalid_operation ("Mouse-clicks can't appear in saved keyboard macros", |
1674 Qunbound); | 1555 Qunbound); |
1675 | 1556 |
1676 #ifdef USE_KKCC | |
1677 XSET_EVENT_CHANNEL (event, Vselected_console); | 1557 XSET_EVENT_CHANNEL (event, Vselected_console); |
1678 XSET_EVENT_TYPE (event, key_press_event); | 1558 XSET_EVENT_TYPE (event, key_press_event); |
1679 XSET_KEY_DATA_KEYSYM (XEVENT_DATA (event), raw_key.keysym); | 1559 XSET_EVENT_KEY_KEYSYM (event, raw_key.keysym); |
1680 XSET_KEY_DATA_MODIFIERS (XEVENT_DATA (event), KEY_DATA_MODIFIERS (&raw_key)); | 1560 XSET_EVENT_KEY_MODIFIERS (event, KEY_DATA_MODIFIERS (&raw_key)); |
1681 #else /* not USE_KKCC */ | |
1682 XEVENT (event)->channel = Vselected_console; | |
1683 XEVENT (event)->event_type = key_press_event; | |
1684 XEVENT (event)->event.key.keysym = raw_key.keysym; | |
1685 XEVENT (event)->event.key.modifiers = raw_key.modifiers; | |
1686 #endif /* not USE_KKCC */ | |
1687 } | 1561 } |
1688 | 1562 |
1689 | 1563 |
1690 int | 1564 int |
1691 event_matches_key_specifier_p (Lisp_Event *event, Lisp_Object key_specifier) | 1565 event_matches_key_specifier_p (Lisp_Object event, Lisp_Object key_specifier) |
1692 { | 1566 { |
1693 Lisp_Object event2 = Qnil; | 1567 Lisp_Object event2 = Qnil; |
1694 int retval; | 1568 int retval; |
1695 struct gcpro gcpro1; | 1569 struct gcpro gcpro1; |
1696 | 1570 |
1697 if (event->event_type != key_press_event || NILP (key_specifier) || | 1571 if (XEVENT_TYPE (event) != key_press_event || NILP (key_specifier) || |
1698 (INTP (key_specifier) && !CHAR_INTP (key_specifier))) | 1572 (INTP (key_specifier) && !CHAR_INTP (key_specifier))) |
1699 return 0; | 1573 return 0; |
1700 | 1574 |
1701 /* if the specifier is an integer such as 27, then it should match | 1575 /* if the specifier is an integer such as 27, then it should match |
1702 both of the events 'escape' and 'control ['. Calling | 1576 both of the events 'escape' and 'control ['. Calling |
1714 is silently converted into 'escape' by the keyboard driver. | 1588 is silently converted into 'escape' by the keyboard driver. |
1715 In this case, ASCII is the only thing we know about, so we have | 1589 In this case, ASCII is the only thing we know about, so we have |
1716 to compare the ASCII values. */ | 1590 to compare the ASCII values. */ |
1717 | 1591 |
1718 GCPRO1 (event2); | 1592 GCPRO1 (event2); |
1719 event2 = Fmake_event (Qnil, Qnil); | 1593 if (EVENTP (key_specifier)) |
1720 Fcharacter_to_event (key_specifier, event2, Qnil, Qnil); | 1594 event2 = Fcopy_event (key_specifier, Qnil); |
1595 else | |
1596 event2 = Fcharacter_to_event (key_specifier, Qnil, Qnil, Qnil); | |
1721 if (XEVENT (event2)->event_type != key_press_event) | 1597 if (XEVENT (event2)->event_type != key_press_event) |
1722 retval = 0; | 1598 retval = 0; |
1723 else if (CONSOLE_TTY_P (XCONSOLE (EVENT_CHANNEL (event)))) | 1599 else if (CONSOLE_TTY_P (XCONSOLE (XEVENT_CHANNEL (event)))) |
1724 { | 1600 { |
1725 int ch1, ch2; | 1601 int ch1, ch2; |
1726 | 1602 |
1727 ch1 = event_to_character (event, 0, 0, 0); | 1603 ch1 = event_to_character (event, 0, 0, 0); |
1728 ch2 = event_to_character (XEVENT (event2), 0, 0, 0); | 1604 ch2 = event_to_character (event2, 0, 0, 0); |
1729 retval = (ch1 >= 0 && ch2 >= 0 && ch1 == ch2); | 1605 retval = (ch1 >= 0 && ch2 >= 0 && ch1 == ch2); |
1730 } | 1606 } |
1731 #ifdef USE_KKCC | 1607 else if (EQ (XEVENT_KEY_KEYSYM (event), XEVENT_KEY_KEYSYM (event2)) && |
1732 else if (EQ (XKEY_DATA_KEYSYM (EVENT_DATA (event)), XKEY_DATA_KEYSYM (XEVENT_DATA (event2))) && | 1608 XEVENT_KEY_MODIFIERS (event) == XEVENT_KEY_MODIFIERS (event2)) |
1733 XKEY_DATA_MODIFIERS (EVENT_DATA (event)) == XKEY_DATA_MODIFIERS (XEVENT_DATA (event2))) | |
1734 #else /* not USE_KKCC */ | |
1735 else if (EQ (event->event.key.keysym, XEVENT (event2)->event.key.keysym) && | |
1736 event->event.key.modifiers == XEVENT (event2)->event.key.modifiers) | |
1737 #endif /* not USE_KKCC */ | |
1738 retval = 1; | 1609 retval = 1; |
1739 else | 1610 else |
1740 retval = 0; | 1611 retval = 0; |
1741 Fdeallocate_event (event2); | 1612 Fdeallocate_event (event2); |
1742 UNGCPRO; | 1613 UNGCPRO; |
1743 return retval; | 1614 return retval; |
1744 } | 1615 } |
1745 | 1616 |
1746 static int | 1617 static int |
1747 #ifdef USE_KKCC | |
1748 meta_prefix_char_p (const Lisp_Key_Data *key) | 1618 meta_prefix_char_p (const Lisp_Key_Data *key) |
1749 #else /* not USE_KKCC */ | 1619 { |
1750 meta_prefix_char_p (const struct key_data *key) | |
1751 #endif /* not USE_KKCC */ | |
1752 { | |
1753 #ifdef USE_KKCC | |
1754 Lisp_Object event = Fmake_event (Qnil, Qnil); | 1620 Lisp_Object event = Fmake_event (Qnil, Qnil); |
1755 struct gcpro gcpro1; | 1621 struct gcpro gcpro1; |
1622 int retval; | |
1623 | |
1756 GCPRO1 (event); | 1624 GCPRO1 (event); |
1757 | 1625 |
1758 XSET_EVENT_TYPE (event, key_press_event); | 1626 XSET_EVENT_TYPE (event, key_press_event); |
1759 XSET_EVENT_CHANNEL (event, Vselected_console); | 1627 XSET_EVENT_CHANNEL (event, Vselected_console); |
1760 XSET_KEY_DATA_KEYSYM (XEVENT_DATA (event), KEY_DATA_KEYSYM (key)); | 1628 XSET_EVENT_KEY_KEYSYM (event, KEY_DATA_KEYSYM (key)); |
1761 XSET_KEY_DATA_MODIFIERS (XEVENT_DATA (event), KEY_DATA_MODIFIERS (key)); | 1629 XSET_EVENT_KEY_MODIFIERS (event, KEY_DATA_MODIFIERS (key)); |
1762 return event_matches_key_specifier_p (XEVENT(event), Vmeta_prefix_char); | 1630 retval = event_matches_key_specifier_p (event, Vmeta_prefix_char); |
1763 #else /* not USE_KKCC */ | 1631 UNGCPRO; |
1764 Lisp_Event event; | 1632 return retval; |
1765 | |
1766 event.event_type = key_press_event; | |
1767 event.channel = Vselected_console; | |
1768 event.event.key.keysym = key->keysym; | |
1769 event.event.key.modifiers = key->modifiers; | |
1770 return event_matches_key_specifier_p (&event, Vmeta_prefix_char); | |
1771 #endif /* not USE_KKCC */ | |
1772 } | 1633 } |
1773 | 1634 |
1774 DEFUN ("event-matches-key-specifier-p", Fevent_matches_key_specifier_p, 2, 2, 0, /* | 1635 DEFUN ("event-matches-key-specifier-p", Fevent_matches_key_specifier_p, 2, 2, 0, /* |
1775 Return non-nil if EVENT matches KEY-SPECIFIER. | 1636 Return non-nil if EVENT matches KEY-SPECIFIER. |
1776 This can be useful, e.g., to determine if the user pressed `help-char' or | 1637 This can be useful, e.g., to determine if the user pressed `help-char' or |
1777 `quit-char'. | 1638 `quit-char'. |
1639 | |
1640 KEY-SPECIFIER can be a character, integer, a symbol, a list of modifiers | |
1641 and symbols, or an event. | |
1642 | |
1643 What this actually happens is this: | |
1644 | |
1645 \(1) Return no, if EVENT is not a key press event or if KEY-SPECIFIER is nil | |
1646 or an integer that cannot be converted to a character. | |
1647 | |
1648 \(2) If KEY-SPECIFIER is a character or integer, | |
1649 (event-to-character EVENT nil nil nil) is called, and the characters are | |
1650 compared to get the result. The reason for special-casing this and doing | |
1651 it this way is to ensure that, e.g., a KEY-SPECIFIER of 27 matches both | |
1652 a key-press `escape' and a key-press `control ['. #### Think about META | |
1653 argument to event-to-character. | |
1654 | |
1655 \(3) If KEY-SPECIFIER is an event, fine; else, convert to an event using | |
1656 \(character-to-event KEY-SPECIFIER nil nil nil). If EVENT is not on a TTY, | |
1657 we just compare keysyms and modifiers and return yes if both are equal. | |
1658 For TTY, we do character-level comparison by converting both to a character | |
1659 with (event-to-character ... nil nil nil) and comparing the characters. | |
1660 | |
1778 */ | 1661 */ |
1779 (event, key_specifier)) | 1662 (event, key_specifier)) |
1780 { | 1663 { |
1781 CHECK_LIVE_EVENT (event); | 1664 CHECK_LIVE_EVENT (event); |
1782 return (event_matches_key_specifier_p (XEVENT (event), key_specifier) | 1665 return (event_matches_key_specifier_p (event, key_specifier) ? Qt : Qnil); |
1783 ? Qt : Qnil); | 1666 } |
1784 } | 1667 #define MACROLET(k, m) do { \ |
1785 #ifdef USE_KKCC | 1668 SET_KEY_DATA_KEYSYM (returned_value, k); \ |
1786 #define MACROLET(k,m) do { \ | 1669 SET_KEY_DATA_MODIFIERS (returned_value, m); \ |
1787 SET_KEY_DATA_KEYSYM(returned_value, k); \ | 1670 RETURN_SANS_WARNINGS; \ |
1788 SET_KEY_DATA_MODIFIERS(returned_value, m); \ | |
1789 RETURN_SANS_WARNINGS; \ | |
1790 } while (0) | 1671 } while (0) |
1791 #else /* not USE_KKCC */ | |
1792 #define MACROLET(k,m) do { \ | |
1793 returned_value->keysym = (k); \ | |
1794 returned_value->modifiers = (m); \ | |
1795 RETURN_SANS_WARNINGS; \ | |
1796 } while (0) | |
1797 #endif /* not USE_KKCC */ | |
1798 /* ASCII grunge. | 1672 /* ASCII grunge. |
1799 Given a keysym, return another keysym/modifier pair which could be | 1673 Given a keysym, return another keysym/modifier pair which could be |
1800 considered the same key in an ASCII world. Backspace returns ^H, for | 1674 considered the same key in an ASCII world. Backspace returns ^H, for |
1801 example. | 1675 example. |
1802 */ | 1676 */ |
1803 static void | 1677 static void |
1804 #ifdef USE_KKCC | |
1805 define_key_alternate_name (Lisp_Key_Data *key, | 1678 define_key_alternate_name (Lisp_Key_Data *key, |
1806 Lisp_Key_Data *returned_value) | 1679 Lisp_Key_Data *returned_value) |
1807 #else /* not USE_KKCC */ | 1680 { |
1808 define_key_alternate_name (struct key_data *key, | |
1809 struct key_data *returned_value) | |
1810 #endif /* not USE_KKCC */ | |
1811 { | |
1812 #ifdef USE_KKCC | |
1813 Lisp_Object keysym = KEY_DATA_KEYSYM (key); | 1681 Lisp_Object keysym = KEY_DATA_KEYSYM (key); |
1814 int modifiers = KEY_DATA_MODIFIERS (key); | 1682 int modifiers = KEY_DATA_MODIFIERS (key); |
1815 #else /* not USE_KKCC */ | |
1816 Lisp_Object keysym = key->keysym; | |
1817 int modifiers = key->modifiers; | |
1818 #endif /* not USE_KKCC */ | |
1819 int modifiers_sans_control = (modifiers & (~XEMACS_MOD_CONTROL)); | 1683 int modifiers_sans_control = (modifiers & (~XEMACS_MOD_CONTROL)); |
1820 int modifiers_sans_meta = (modifiers & (~XEMACS_MOD_META)); | 1684 int modifiers_sans_meta = (modifiers & (~XEMACS_MOD_META)); |
1821 #ifdef USE_KKCC | |
1822 SET_KEY_DATA_KEYSYM (returned_value, Qnil); /* By default, no "alternate" key */ | 1685 SET_KEY_DATA_KEYSYM (returned_value, Qnil); /* By default, no "alternate" key */ |
1823 SET_KEY_DATA_MODIFIERS (returned_value, 0); | 1686 SET_KEY_DATA_MODIFIERS (returned_value, 0); |
1824 #else /* not USE_KKCC */ | |
1825 returned_value->keysym = Qnil; /* By default, no "alternate" key */ | |
1826 returned_value->modifiers = 0; | |
1827 #endif /* not USE_KKCC */ | |
1828 if (modifiers_sans_meta == XEMACS_MOD_CONTROL) | 1687 if (modifiers_sans_meta == XEMACS_MOD_CONTROL) |
1829 { | 1688 { |
1830 if (EQ (keysym, QKspace)) | 1689 if (EQ (keysym, QKspace)) |
1831 MACROLET (make_char ('@'), modifiers); | 1690 MACROLET (make_char ('@'), modifiers); |
1832 else if (!CHARP (keysym)) | 1691 else if (!CHARP (keysym)) |
1864 else | 1723 else |
1865 return; | 1724 return; |
1866 #undef MACROLET | 1725 #undef MACROLET |
1867 } | 1726 } |
1868 | 1727 |
1869 | |
1870 static void | 1728 static void |
1871 ensure_meta_prefix_char_keymapp (Lisp_Object keys, int indx, | 1729 ensure_meta_prefix_char_keymapp (Lisp_Object keys, int indx, |
1872 Lisp_Object keymap) | 1730 Lisp_Object keymap) |
1873 { | 1731 { |
1874 /* This function can GC */ | 1732 /* This function can GC */ |
1875 Lisp_Object new_keys; | 1733 Lisp_Object new_keys; |
1876 int i; | 1734 int i; |
1877 Lisp_Object mpc_binding; | 1735 Lisp_Object mpc_binding; |
1878 #ifdef USE_KKCC | |
1879 Lisp_Key_Data meta_key; | 1736 Lisp_Key_Data meta_key; |
1880 #else /* not USE_KKCC */ | |
1881 struct key_data meta_key; | |
1882 #endif /* not USE_KKCC */ | |
1883 if (NILP (Vmeta_prefix_char) || | 1737 if (NILP (Vmeta_prefix_char) || |
1884 (INTP (Vmeta_prefix_char) && !CHAR_INTP (Vmeta_prefix_char))) | 1738 (INTP (Vmeta_prefix_char) && !CHAR_INTP (Vmeta_prefix_char))) |
1885 return; | 1739 return; |
1886 | 1740 |
1887 define_key_parser (Vmeta_prefix_char, &meta_key); | 1741 define_key_parser (Vmeta_prefix_char, &meta_key); |
2078 | 1932 |
2079 idx = 0; | 1933 idx = 0; |
2080 while (1) | 1934 while (1) |
2081 { | 1935 { |
2082 Lisp_Object c; | 1936 Lisp_Object c; |
2083 #ifdef USE_KKCC | |
2084 Lisp_Key_Data raw_key1; | 1937 Lisp_Key_Data raw_key1; |
2085 Lisp_Key_Data raw_key2; | 1938 Lisp_Key_Data raw_key2; |
2086 #else /* not USE_KKCC */ | |
2087 struct key_data raw_key1; | |
2088 struct key_data raw_key2; | |
2089 #endif /* not USE_KKCC */ | |
2090 if (STRINGP (keys)) | 1939 if (STRINGP (keys)) |
2091 c = make_char (string_ichar (keys, idx)); | 1940 c = make_char (string_ichar (keys, idx)); |
2092 else | 1941 else |
2093 c = XVECTOR_DATA (keys) [idx]; | 1942 c = XVECTOR_DATA (keys) [idx]; |
2094 | 1943 |
2198 to make where-is-internal really fly. */ | 2047 to make where-is-internal really fly. */ |
2199 | 2048 |
2200 struct raw_lookup_key_mapper_closure | 2049 struct raw_lookup_key_mapper_closure |
2201 { | 2050 { |
2202 int remaining; | 2051 int remaining; |
2203 #ifdef USE_KKCC | |
2204 const Lisp_Key_Data *raw_keys; | 2052 const Lisp_Key_Data *raw_keys; |
2205 #else /* not USE_KKCC */ | |
2206 const struct key_data *raw_keys; | |
2207 #endif /* not USE_KKCC */ | |
2208 int raw_keys_count; | 2053 int raw_keys_count; |
2209 int keys_so_far; | 2054 int keys_so_far; |
2210 int accept_default; | 2055 int accept_default; |
2211 }; | 2056 }; |
2212 | 2057 |
2213 static Lisp_Object raw_lookup_key_mapper (Lisp_Object k, void *); | 2058 static Lisp_Object raw_lookup_key_mapper (Lisp_Object k, void *); |
2214 | 2059 |
2215 /* Caller should gc-protect args (keymaps may autoload) */ | 2060 /* Caller should gc-protect args (keymaps may autoload) */ |
2216 static Lisp_Object | 2061 static Lisp_Object |
2217 raw_lookup_key (Lisp_Object keymap, | 2062 raw_lookup_key (Lisp_Object keymap, |
2218 #ifdef USE_KKCC | |
2219 const Lisp_Key_Data *raw_keys, int raw_keys_count, | 2063 const Lisp_Key_Data *raw_keys, int raw_keys_count, |
2220 #else /* not USE_KKCC */ | |
2221 const struct key_data *raw_keys, int raw_keys_count, | |
2222 #endif /* not USE_KKCC */ | |
2223 int keys_so_far, int accept_default) | 2064 int keys_so_far, int accept_default) |
2224 { | 2065 { |
2225 /* This function can GC */ | 2066 /* This function can GC */ |
2226 struct raw_lookup_key_mapper_closure c; | 2067 struct raw_lookup_key_mapper_closure c; |
2227 c.remaining = raw_keys_count - 1; | 2068 c.remaining = raw_keys_count - 1; |
2240 struct raw_lookup_key_mapper_closure *c = | 2081 struct raw_lookup_key_mapper_closure *c = |
2241 (struct raw_lookup_key_mapper_closure *) arg; | 2082 (struct raw_lookup_key_mapper_closure *) arg; |
2242 int accept_default = c->accept_default; | 2083 int accept_default = c->accept_default; |
2243 int remaining = c->remaining; | 2084 int remaining = c->remaining; |
2244 int keys_so_far = c->keys_so_far; | 2085 int keys_so_far = c->keys_so_far; |
2245 #ifdef USE_KKCC | |
2246 const Lisp_Key_Data *raw_keys = c->raw_keys; | 2086 const Lisp_Key_Data *raw_keys = c->raw_keys; |
2247 #else /* not USE_KKCC */ | |
2248 const struct key_data *raw_keys = c->raw_keys; | |
2249 #endif /* not USE_KKCC */ | |
2250 Lisp_Object cmd; | 2087 Lisp_Object cmd; |
2251 | 2088 |
2252 if (! meta_prefix_char_p (&(raw_keys[0]))) | 2089 if (! meta_prefix_char_p (&(raw_keys[0]))) |
2253 { | 2090 { |
2254 /* Normal case: every case except the meta-hack (see below). */ | 2091 /* Normal case: every case except the meta-hack (see below). */ |
2297 if (!NILP (cmd)) | 2134 if (!NILP (cmd)) |
2298 cmd = raw_lookup_key (cmd, raw_keys + 1, remaining, | 2135 cmd = raw_lookup_key (cmd, raw_keys + 1, remaining, |
2299 keys_so_far + 1, accept_default); | 2136 keys_so_far + 1, accept_default); |
2300 else if ((raw_keys[1].modifiers & XEMACS_MOD_META) == 0) | 2137 else if ((raw_keys[1].modifiers & XEMACS_MOD_META) == 0) |
2301 { | 2138 { |
2302 #ifdef USE_KKCC | |
2303 Lisp_Key_Data metified; | 2139 Lisp_Key_Data metified; |
2304 #else /* not USE_KKCC */ | |
2305 struct key_data metified; | |
2306 #endif /* not USE_KKCC */ | |
2307 metified.keysym = raw_keys[1].keysym; | 2140 metified.keysym = raw_keys[1].keysym; |
2308 metified.modifiers = raw_keys[1].modifiers | | 2141 metified.modifiers = raw_keys[1].modifiers | |
2309 (unsigned char) XEMACS_MOD_META; | 2142 (unsigned char) XEMACS_MOD_META; |
2310 | 2143 |
2311 /* Search for meta-next-char sequence directly */ | 2144 /* Search for meta-next-char sequence directly */ |
2333 static Lisp_Object | 2166 static Lisp_Object |
2334 lookup_keys (Lisp_Object keymap, int nkeys, Lisp_Object *keys, | 2167 lookup_keys (Lisp_Object keymap, int nkeys, Lisp_Object *keys, |
2335 int accept_default) | 2168 int accept_default) |
2336 { | 2169 { |
2337 /* This function can GC */ | 2170 /* This function can GC */ |
2338 #ifdef USE_KKCC | |
2339 Lisp_Key_Data kkk[20]; | 2171 Lisp_Key_Data kkk[20]; |
2340 Lisp_Key_Data *raw_keys; | 2172 Lisp_Key_Data *raw_keys; |
2341 #else /* not USE_KKCC */ | |
2342 struct key_data kkk[20]; | |
2343 struct key_data *raw_keys; | |
2344 #endif /* not USE_KKCC */ | |
2345 int i; | 2173 int i; |
2346 | 2174 |
2347 if (nkeys == 0) | 2175 if (nkeys == 0) |
2348 return Qnil; | 2176 return Qnil; |
2349 | 2177 |
2350 if (nkeys < countof (kkk)) | 2178 if (nkeys < countof (kkk)) |
2351 raw_keys = kkk; | 2179 raw_keys = kkk; |
2352 else | 2180 else |
2353 #ifdef USE_KKCC | |
2354 raw_keys = alloca_array (Lisp_Key_Data, nkeys); | 2181 raw_keys = alloca_array (Lisp_Key_Data, nkeys); |
2355 #else /* not USE_KKCC */ | |
2356 raw_keys = alloca_array (struct key_data, nkeys); | |
2357 #endif /* not USE_KKCC */ | |
2358 | 2182 |
2359 for (i = 0; i < nkeys; i++) | 2183 for (i = 0; i < nkeys; i++) |
2360 { | 2184 { |
2361 define_key_parser (keys[i], &(raw_keys[i])); | 2185 define_key_parser (keys[i], &(raw_keys[i])); |
2362 } | 2186 } |
2366 static Lisp_Object | 2190 static Lisp_Object |
2367 lookup_events (Lisp_Object event_head, int nmaps, Lisp_Object keymaps[], | 2191 lookup_events (Lisp_Object event_head, int nmaps, Lisp_Object keymaps[], |
2368 int accept_default) | 2192 int accept_default) |
2369 { | 2193 { |
2370 /* This function can GC */ | 2194 /* This function can GC */ |
2371 #ifdef USE_KKCC | |
2372 Lisp_Key_Data kkk[20]; | 2195 Lisp_Key_Data kkk[20]; |
2373 #else /* not USE_KKCC */ | |
2374 struct key_data kkk[20]; | |
2375 #endif /* not USE_KKCC */ | |
2376 Lisp_Object event; | 2196 Lisp_Object event; |
2377 | 2197 |
2378 int nkeys; | 2198 int nkeys; |
2379 #ifdef USE_KKCC | |
2380 Lisp_Key_Data *raw_keys; | 2199 Lisp_Key_Data *raw_keys; |
2381 #else /* not USE_KKCC */ | |
2382 struct key_data *raw_keys; | |
2383 #endif /* not USE_KKCC */ | |
2384 Lisp_Object tem = Qnil; | 2200 Lisp_Object tem = Qnil; |
2385 struct gcpro gcpro1, gcpro2; | 2201 struct gcpro gcpro1, gcpro2; |
2386 int iii; | 2202 int iii; |
2387 | 2203 |
2388 CHECK_LIVE_EVENT (event_head); | 2204 CHECK_LIVE_EVENT (event_head); |
2390 nkeys = event_chain_count (event_head); | 2206 nkeys = event_chain_count (event_head); |
2391 | 2207 |
2392 if (nkeys < countof (kkk)) | 2208 if (nkeys < countof (kkk)) |
2393 raw_keys = kkk; | 2209 raw_keys = kkk; |
2394 else | 2210 else |
2395 #ifdef USE_KKCC | |
2396 raw_keys = alloca_array (Lisp_Key_Data, nkeys); | 2211 raw_keys = alloca_array (Lisp_Key_Data, nkeys); |
2397 #else /* not USE_KKCC */ | |
2398 raw_keys = alloca_array (struct key_data, nkeys); | |
2399 #endif /* not USE_KKCC */ | |
2400 | 2212 |
2401 nkeys = 0; | 2213 nkeys = 0; |
2402 EVENT_CHAIN_LOOP (event, event_head) | 2214 EVENT_CHAIN_LOOP (event, event_head) |
2403 define_key_parser (event, &(raw_keys[nkeys++])); | 2215 define_key_parser (event, &(raw_keys[nkeys++])); |
2404 GCPRO2 (keymaps[0], event_head); | 2216 GCPRO2 (keymaps[0], event_head); |
2443 return lookup_keys (keymap, 1, &keys, !NILP (accept_default)); | 2255 return lookup_keys (keymap, 1, &keys, !NILP (accept_default)); |
2444 else if (STRINGP (keys)) | 2256 else if (STRINGP (keys)) |
2445 { | 2257 { |
2446 int length = string_char_length (keys); | 2258 int length = string_char_length (keys); |
2447 int i; | 2259 int i; |
2448 #ifdef USE_KKCC | |
2449 Lisp_Key_Data *raw_keys = alloca_array (Lisp_Key_Data, length); | 2260 Lisp_Key_Data *raw_keys = alloca_array (Lisp_Key_Data, length); |
2450 #else /* not USE_KKCC */ | |
2451 struct key_data *raw_keys = alloca_array (struct key_data, length); | |
2452 #endif /* not USE_KKCC */ | |
2453 if (length == 0) | 2261 if (length == 0) |
2454 return Qnil; | 2262 return Qnil; |
2455 | 2263 |
2456 for (i = 0; i < length; i++) | 2264 for (i = 0; i < length; i++) |
2457 { | 2265 { |
3026 outside of this file doesn't need to know about. | 2834 outside of this file doesn't need to know about. |
3027 */ | 2835 */ |
3028 | 2836 |
3029 struct map_keymap_unsorted_closure | 2837 struct map_keymap_unsorted_closure |
3030 { | 2838 { |
3031 #ifdef USE_KKCC | |
3032 void (*fn) (const Lisp_Key_Data *, Lisp_Object binding, void *arg); | 2839 void (*fn) (const Lisp_Key_Data *, Lisp_Object binding, void *arg); |
3033 #else /* not USE_KKCC */ | |
3034 void (*fn) (const struct key_data *, Lisp_Object binding, void *arg); | |
3035 #endif /* not USE_KKCC */ | |
3036 void *arg; | 2840 void *arg; |
3037 int modifiers; | 2841 int modifiers; |
3038 }; | 2842 }; |
3039 | 2843 |
3040 /* used by map_keymap() */ | 2844 /* used by map_keymap() */ |
3058 map_keymap_unsorted_closure); | 2862 map_keymap_unsorted_closure); |
3059 closure->modifiers = omod; | 2863 closure->modifiers = omod; |
3060 } | 2864 } |
3061 else | 2865 else |
3062 { | 2866 { |
3063 #ifdef USE_KKCC | |
3064 Lisp_Key_Data key; | 2867 Lisp_Key_Data key; |
3065 #else /* not USE_KKCC */ | |
3066 struct key_data key; | |
3067 #endif /* not USE_KKCC */ | |
3068 key.keysym = keysym; | 2868 key.keysym = keysym; |
3069 key.modifiers = modifiers; | 2869 key.modifiers = modifiers; |
3070 ((*closure->fn) (&key, value, closure->arg)); | 2870 ((*closure->fn) (&key, value, closure->arg)); |
3071 } | 2871 } |
3072 return 0; | 2872 return 0; |
3169 | 2969 |
3170 /* used by map_keymap() */ | 2970 /* used by map_keymap() */ |
3171 static void | 2971 static void |
3172 map_keymap_sorted (Lisp_Object keymap_table, | 2972 map_keymap_sorted (Lisp_Object keymap_table, |
3173 int modifiers, | 2973 int modifiers, |
3174 #ifdef USE_KKCC | |
3175 void (*function) (const Lisp_Key_Data *key, | 2974 void (*function) (const Lisp_Key_Data *key, |
3176 #else /* not USE_KKCC */ | |
3177 void (*function) (const struct key_data *key, | |
3178 #endif /* not USE_KKCC */ | |
3179 Lisp_Object binding, | 2975 Lisp_Object binding, |
3180 void *map_keymap_sorted_closure), | 2976 void *map_keymap_sorted_closure), |
3181 void *map_keymap_sorted_closure) | 2977 void *map_keymap_sorted_closure) |
3182 { | 2978 { |
3183 /* This function can GC */ | 2979 /* This function can GC */ |
3206 (modifiers | sub_bits), | 3002 (modifiers | sub_bits), |
3207 function, | 3003 function, |
3208 map_keymap_sorted_closure); | 3004 map_keymap_sorted_closure); |
3209 else | 3005 else |
3210 { | 3006 { |
3211 #ifdef USE_KKCC | |
3212 Lisp_Key_Data k; | 3007 Lisp_Key_Data k; |
3213 #else /* not USE_KKCC */ | |
3214 struct key_data k; | |
3215 #endif /* not USE_KKCC */ | |
3216 k.keysym = keysym; | 3008 k.keysym = keysym; |
3217 k.modifiers = modifiers; | 3009 k.modifiers = modifiers; |
3218 ((*function) (&k, binding, map_keymap_sorted_closure)); | 3010 ((*function) (&k, binding, map_keymap_sorted_closure)); |
3219 } | 3011 } |
3220 } | 3012 } |
3222 } | 3014 } |
3223 | 3015 |
3224 | 3016 |
3225 /* used by Fmap_keymap() */ | 3017 /* used by Fmap_keymap() */ |
3226 static void | 3018 static void |
3227 #ifdef USE_KKCC | |
3228 map_keymap_mapper (const Lisp_Key_Data *key, | 3019 map_keymap_mapper (const Lisp_Key_Data *key, |
3229 #else /* not USE_KKCC */ | |
3230 map_keymap_mapper (const struct key_data *key, | |
3231 #endif /* not USE_KKCC */ | |
3232 Lisp_Object binding, | 3020 Lisp_Object binding, |
3233 void *function) | 3021 void *function) |
3234 { | 3022 { |
3235 /* This function can GC */ | 3023 /* This function can GC */ |
3236 Lisp_Object fn; | 3024 Lisp_Object fn; |
3239 } | 3027 } |
3240 | 3028 |
3241 | 3029 |
3242 static void | 3030 static void |
3243 map_keymap (Lisp_Object keymap_table, int sort_first, | 3031 map_keymap (Lisp_Object keymap_table, int sort_first, |
3244 #ifdef USE_KKCC | |
3245 void (*function) (const Lisp_Key_Data *key, | 3032 void (*function) (const Lisp_Key_Data *key, |
3246 #else /* not USE_KKCC */ | |
3247 void (*function) (const struct key_data *key, | |
3248 #endif /* not USE_KKCC */ | |
3249 Lisp_Object binding, | 3033 Lisp_Object binding, |
3250 void *fn_arg), | 3034 void *fn_arg), |
3251 void *fn_arg) | 3035 void *fn_arg) |
3252 { | 3036 { |
3253 /* This function can GC */ | 3037 /* This function can GC */ |
3342 Lisp_Object thisseq = Fcar (Fcar (closure->tail)); | 3126 Lisp_Object thisseq = Fcar (Fcar (closure->tail)); |
3343 Lisp_Object cmd = get_keyelt (contents, 1); | 3127 Lisp_Object cmd = get_keyelt (contents, 1); |
3344 Lisp_Object vec; | 3128 Lisp_Object vec; |
3345 int j; | 3129 int j; |
3346 int len; | 3130 int len; |
3347 #ifdef USE_KKCC | |
3348 Lisp_Key_Data key; | 3131 Lisp_Key_Data key; |
3349 #else /* not USE_KKCC */ | |
3350 struct key_data key; | |
3351 #endif /* not USE_KKCC */ | |
3352 key.keysym = keysym; | 3132 key.keysym = keysym; |
3353 key.modifiers = modifiers; | 3133 key.modifiers = modifiers; |
3354 | 3134 |
3355 if (NILP (cmd)) | 3135 if (NILP (cmd)) |
3356 abort (); | 3136 abort (); |
3434 keymap = def; | 3214 keymap = def; |
3435 p = make_vector (len, Qnil); | 3215 p = make_vector (len, Qnil); |
3436 NGCPRO1 (p); | 3216 NGCPRO1 (p); |
3437 for (iii = 0; iii < len; iii++) | 3217 for (iii = 0; iii < len; iii++) |
3438 { | 3218 { |
3439 #ifdef USE_KKCC | |
3440 Lisp_Key_Data key; | 3219 Lisp_Key_Data key; |
3441 #else /* not USE_KKCC */ | |
3442 struct key_data key; | |
3443 #endif /* not USE_KKCC */ | |
3444 define_key_parser (Faref (prefix, make_int (iii)), &key); | 3220 define_key_parser (Faref (prefix, make_int (iii)), &key); |
3445 XVECTOR_DATA (p)[iii] = make_key_description (&key, 1); | 3221 XVECTOR_DATA (p)[iii] = make_key_description (&key, 1); |
3446 } | 3222 } |
3447 NUNGCPRO; | 3223 NUNGCPRO; |
3448 prefix = p; | 3224 prefix = p; |
3534 DECLARE_EISTRING_MALLOC (buf); | 3310 DECLARE_EISTRING_MALLOC (buf); |
3535 Lisp_Object str; | 3311 Lisp_Object str; |
3536 | 3312 |
3537 if (!EVENTP (key)) | 3313 if (!EVENTP (key)) |
3538 { | 3314 { |
3539 #ifdef USE_KKCC | |
3540 Lisp_Object event = Fmake_event (Qnil, Qnil); | 3315 Lisp_Object event = Fmake_event (Qnil, Qnil); |
3541 XSET_EVENT_TYPE (event, empty_event); | |
3542 CHECK_CHAR_COERCE_INT (key); | 3316 CHECK_CHAR_COERCE_INT (key); |
3543 character_to_event (XCHAR (key), XEVENT(event), | 3317 character_to_event (XCHAR (key), XEVENT (event), |
3544 XCONSOLE (Vselected_console), 0, 1); | 3318 XCONSOLE (Vselected_console), 0, 1); |
3545 format_event_object (buf, event, 1); | 3319 format_event_object (buf, event, 1); |
3320 Fdeallocate_event (event); | |
3546 } | 3321 } |
3547 else | 3322 else |
3548 format_event_object (buf, key, 1); | 3323 format_event_object (buf, key, 1); |
3549 #else /* not USE_KKCC */ | |
3550 Lisp_Event event; | |
3551 event.event_type = empty_event; | |
3552 CHECK_CHAR_COERCE_INT (key); | |
3553 character_to_event (XCHAR (key), &event, | |
3554 XCONSOLE (Vselected_console), 0, 1); | |
3555 format_event_object (buf, &event, 1); | |
3556 } | |
3557 else | |
3558 format_event_object (buf, XEVENT (key), 1); | |
3559 #endif /* not USE_KKCC */ | |
3560 str = eimake_string (buf); | 3324 str = eimake_string (buf); |
3561 eifree (buf); | 3325 eifree (buf); |
3562 return str; | 3326 return str; |
3563 } | 3327 } |
3564 | 3328 |
3778 where_is_internal (definition, maps, nmaps, Qt, buffer); | 3542 where_is_internal (definition, maps, nmaps, Qt, buffer); |
3779 } | 3543 } |
3780 | 3544 |
3781 | 3545 |
3782 static Lisp_Object | 3546 static Lisp_Object |
3783 #ifdef USE_KKCC | |
3784 raw_keys_to_keys (Lisp_Key_Data *keys, int count) | 3547 raw_keys_to_keys (Lisp_Key_Data *keys, int count) |
3785 #else /* not USE_KKCC */ | |
3786 raw_keys_to_keys (struct key_data *keys, int count) | |
3787 #endif /* not USE_KKCC */ | |
3788 { | 3548 { |
3789 Lisp_Object result = make_vector (count, Qnil); | 3549 Lisp_Object result = make_vector (count, Qnil); |
3790 while (count--) | 3550 while (count--) |
3791 XVECTOR_DATA (result) [count] = make_key_description (&(keys[count]), 1); | 3551 XVECTOR_DATA (result) [count] = make_key_description (&(keys[count]), 1); |
3792 return result; | 3552 return result; |
3793 } | 3553 } |
3794 | 3554 |
3795 | 3555 |
3796 static void | 3556 static void |
3797 #ifdef USE_KKCC | |
3798 format_raw_keys (Lisp_Key_Data *keys, int count, Eistring *buf) | 3557 format_raw_keys (Lisp_Key_Data *keys, int count, Eistring *buf) |
3799 #else /* not USE_KKCC */ | |
3800 format_raw_keys (struct key_data *keys, int count, Eistring *buf) | |
3801 #endif /* not USE_KKCC */ | |
3802 { | 3558 { |
3803 int i; | 3559 int i; |
3804 #ifdef USE_KKCC | |
3805 Lisp_Object event = Fmake_event (Qnil, Qnil); | 3560 Lisp_Object event = Fmake_event (Qnil, Qnil); |
3806 XSET_EVENT_TYPE (event, key_press_event); | 3561 XSET_EVENT_TYPE (event, key_press_event); |
3807 XSET_EVENT_CHANNEL (event, Vselected_console); | 3562 XSET_EVENT_CHANNEL (event, Vselected_console); |
3808 #else /* not USE_KKCC */ | |
3809 Lisp_Event event; | |
3810 event.event_type = key_press_event; | |
3811 event.channel = Vselected_console; | |
3812 #endif /* not USE_KKCC */ | |
3813 for (i = 0; i < count; i++) | 3563 for (i = 0; i < count; i++) |
3814 { | 3564 { |
3815 #ifdef USE_KKCC | 3565 XSET_EVENT_KEY_KEYSYM (event, keys[i].keysym); |
3816 XSET_KEY_DATA_KEYSYM (XEVENT_DATA (event), keys[i].keysym); | 3566 XSET_EVENT_KEY_MODIFIERS (event, KEY_DATA_MODIFIERS (&keys[i])); |
3817 XSET_KEY_DATA_MODIFIERS (XEVENT_DATA (event), KEY_DATA_MODIFIERS (&keys[i])); | |
3818 format_event_object (buf, event, 1); | 3567 format_event_object (buf, event, 1); |
3819 #else /* not USE_KKCC */ | |
3820 event.event.key.keysym = keys[i].keysym; | |
3821 event.event.key.modifiers = keys[i].modifiers; | |
3822 format_event_object (buf, &event, 1); | |
3823 #endif /* not USE_KKCC */ | |
3824 if (i < count - 1) | 3568 if (i < count - 1) |
3825 eicat_c (buf, " "); | 3569 eicat_c (buf, " "); |
3826 } | 3570 } |
3571 Fdeallocate_event (event); | |
3827 } | 3572 } |
3828 | 3573 |
3829 | 3574 |
3830 /* definition is the thing to look for. | 3575 /* definition is the thing to look for. |
3831 map is a keymap. | 3576 map is a keymap. |
3854 int shadow_count; | 3599 int shadow_count; |
3855 int firstonly; | 3600 int firstonly; |
3856 int keys_count; | 3601 int keys_count; |
3857 int modifiers_so_far; | 3602 int modifiers_so_far; |
3858 Eistring *target_buffer; | 3603 Eistring *target_buffer; |
3859 #ifdef USE_KKCC | |
3860 Lisp_Key_Data *keys_so_far; | 3604 Lisp_Key_Data *keys_so_far; |
3861 #else /* not USE_KKCC */ | |
3862 struct key_data *keys_so_far; | |
3863 #endif /* not USE_KKCC */ | |
3864 int keys_so_far_total_size; | 3605 int keys_so_far_total_size; |
3865 int keys_so_far_malloced; | 3606 int keys_so_far_malloced; |
3866 }; | 3607 }; |
3867 | 3608 |
3868 static Lisp_Object where_is_recursive_mapper (Lisp_Object map, void *arg); | 3609 static Lisp_Object where_is_recursive_mapper (Lisp_Object map, void *arg); |
3887 { | 3628 { |
3888 /* One or more keys in this map match the definition we're looking for. | 3629 /* One or more keys in this map match the definition we're looking for. |
3889 Verify that these bindings aren't shadowed by other bindings | 3630 Verify that these bindings aren't shadowed by other bindings |
3890 in the shadow maps. Either nil or number as value from | 3631 in the shadow maps. Either nil or number as value from |
3891 raw_lookup_key() means undefined. */ | 3632 raw_lookup_key() means undefined. */ |
3892 #ifdef USE_KKCC | |
3893 Lisp_Key_Data *so_far = c->keys_so_far; | 3633 Lisp_Key_Data *so_far = c->keys_so_far; |
3894 #else /* not USE_KKCC */ | |
3895 struct key_data *so_far = c->keys_so_far; | |
3896 #endif /* not USE_KKCC */ | |
3897 | 3634 |
3898 for (;;) /* loop over all keys that match */ | 3635 for (;;) /* loop over all keys that match */ |
3899 { | 3636 { |
3900 Lisp_Object k = CONSP (keys) ? XCAR (keys) : keys; | 3637 Lisp_Object k = CONSP (keys) ? XCAR (keys) : keys; |
3901 int i; | 3638 int i; |
3902 | 3639 |
3903 so_far [keys_count].keysym = k; | 3640 so_far [keys_count].keysym = k; |
3904 #ifdef USE_KKCC | |
3905 SET_KEY_DATA_MODIFIERS (&so_far [keys_count], modifiers_so_far); | 3641 SET_KEY_DATA_MODIFIERS (&so_far [keys_count], modifiers_so_far); |
3906 #else /* not USE_KKCC */ | |
3907 so_far [keys_count].modifiers = modifiers_so_far; | |
3908 #endif /* not USE_KKCC */ | |
3909 | 3642 |
3910 /* now loop over all shadow maps */ | 3643 /* now loop over all shadow maps */ |
3911 for (i = 0; i < c->shadow_count; i++) | 3644 for (i = 0; i < c->shadow_count; i++) |
3912 { | 3645 { |
3913 Lisp_Object shadowed = raw_lookup_key (c->shadow[i], | 3646 Lisp_Object shadowed = raw_lookup_key (c->shadow[i], |
3984 bucky = MODIFIER_HASH_KEY_BITS (key); | 3717 bucky = MODIFIER_HASH_KEY_BITS (key); |
3985 if (bucky != 0) | 3718 if (bucky != 0) |
3986 lower_modifiers = (modifiers_so_far | bucky); | 3719 lower_modifiers = (modifiers_so_far | bucky); |
3987 else | 3720 else |
3988 { | 3721 { |
3989 #ifdef USE_KKCC | |
3990 Lisp_Key_Data *so_far = c->keys_so_far; | 3722 Lisp_Key_Data *so_far = c->keys_so_far; |
3991 #else /* not USE_KKCC */ | |
3992 struct key_data *so_far = c->keys_so_far; | |
3993 #endif /* not USE_KKCC */ | |
3994 lower_modifiers = 0; | 3723 lower_modifiers = 0; |
3995 so_far [lower_keys_count].keysym = key; | 3724 so_far [lower_keys_count].keysym = key; |
3996 #ifdef USE_KKCC | |
3997 SET_KEY_DATA_MODIFIERS (&so_far [lower_keys_count], modifiers_so_far); | 3725 SET_KEY_DATA_MODIFIERS (&so_far [lower_keys_count], modifiers_so_far); |
3998 #else /* not USE_KKCC */ | |
3999 so_far [lower_keys_count].modifiers = modifiers_so_far; | |
4000 #endif /* not USE_KKCC */ | |
4001 lower_keys_count++; | 3726 lower_keys_count++; |
4002 } | 3727 } |
4003 | 3728 |
4004 if (lower_keys_count >= c->keys_so_far_total_size) | 3729 if (lower_keys_count >= c->keys_so_far_total_size) |
4005 { | 3730 { |
4006 int size = lower_keys_count + 50; | 3731 int size = lower_keys_count + 50; |
4007 if (! c->keys_so_far_malloced) | 3732 if (! c->keys_so_far_malloced) |
4008 { | 3733 { |
4009 #ifdef USE_KKCC | |
4010 Lisp_Key_Data *new = xnew_array (Lisp_Key_Data, size); | 3734 Lisp_Key_Data *new = xnew_array (Lisp_Key_Data, size); |
4011 #else /* not USE_KKCC */ | |
4012 struct key_data *new = xnew_array (struct key_data, size); | |
4013 #endif /* not USE_KKCC */ | |
4014 memcpy ((void *)new, (const void *)c->keys_so_far, | 3735 memcpy ((void *)new, (const void *)c->keys_so_far, |
4015 #ifdef USE_KKCC | |
4016 c->keys_so_far_total_size * sizeof (Lisp_Key_Data)); | 3736 c->keys_so_far_total_size * sizeof (Lisp_Key_Data)); |
4017 #else /* not USE_KKCC */ | |
4018 c->keys_so_far_total_size * sizeof (struct key_data)); | |
4019 #endif /* not USE_KKCC */ | |
4020 } | 3737 } |
4021 else | 3738 else |
4022 #ifdef USE_KKCC | |
4023 XREALLOC_ARRAY (c->keys_so_far, Lisp_Key_Data, size); | 3739 XREALLOC_ARRAY (c->keys_so_far, Lisp_Key_Data, size); |
4024 #else /* not USE_KKCC */ | |
4025 XREALLOC_ARRAY (c->keys_so_far, struct key_data, size); | |
4026 #endif /* not USE_KKCC */ | |
4027 | 3740 |
4028 c->keys_so_far_total_size = size; | 3741 c->keys_so_far_total_size = size; |
4029 c->keys_so_far_malloced = 1; | 3742 c->keys_so_far_malloced = 1; |
4030 } | 3743 } |
4031 | 3744 |
4055 Lisp_Object firstonly, Eistring *target_buffer) | 3768 Lisp_Object firstonly, Eistring *target_buffer) |
4056 { | 3769 { |
4057 /* This function can GC */ | 3770 /* This function can GC */ |
4058 Lisp_Object result = Qnil; | 3771 Lisp_Object result = Qnil; |
4059 int i; | 3772 int i; |
4060 #ifdef USE_KKCC | |
4061 Lisp_Key_Data raw[20]; | 3773 Lisp_Key_Data raw[20]; |
4062 #else /* not USE_KKCC */ | |
4063 struct key_data raw[20]; | |
4064 #endif /* not USE_KKCC */ | |
4065 struct where_is_closure c; | 3774 struct where_is_closure c; |
4066 | 3775 |
4067 c.definition = definition; | 3776 c.definition = definition; |
4068 c.shadow = maps; | 3777 c.shadow = maps; |
4069 c.firstonly = !NILP (firstonly); | 3778 c.firstonly = !NILP (firstonly); |
4274 int mice_only_p; /* whether we are to display only button bindings */ | 3983 int mice_only_p; /* whether we are to display only button bindings */ |
4275 }; | 3984 }; |
4276 | 3985 |
4277 struct describe_map_shadow_closure | 3986 struct describe_map_shadow_closure |
4278 { | 3987 { |
4279 #ifdef USE_KKCC | |
4280 const Lisp_Key_Data *raw_key; | 3988 const Lisp_Key_Data *raw_key; |
4281 #else /* not USE_KKCC */ | |
4282 const struct key_data *raw_key; | |
4283 #endif /* not USE_KKCC */ | |
4284 Lisp_Object self; | 3989 Lisp_Object self; |
4285 }; | 3990 }; |
4286 | 3991 |
4287 static Lisp_Object | 3992 static Lisp_Object |
4288 describe_map_mapper_shadow_search (Lisp_Object map, void *arg) | 3993 describe_map_mapper_shadow_search (Lisp_Object map, void *arg) |
4291 (struct describe_map_shadow_closure *) arg; | 3996 (struct describe_map_shadow_closure *) arg; |
4292 | 3997 |
4293 if (EQ (map, c->self)) | 3998 if (EQ (map, c->self)) |
4294 return Qzero; /* Not shadowed; terminate search */ | 3999 return Qzero; /* Not shadowed; terminate search */ |
4295 | 4000 |
4296 #ifdef USE_KKCC | |
4297 return !NILP (keymap_lookup_directly (map, | 4001 return !NILP (keymap_lookup_directly (map, |
4298 KEY_DATA_KEYSYM (c->raw_key), | 4002 KEY_DATA_KEYSYM (c->raw_key), |
4299 KEY_DATA_MODIFIERS (c->raw_key))) | 4003 KEY_DATA_MODIFIERS (c->raw_key))) |
4300 #else /* not USE_KKCC */ | |
4301 return !NILP (keymap_lookup_directly (map, | |
4302 c->raw_key->keysym, | |
4303 c->raw_key->modifiers)) | |
4304 #endif /* not USE_KKCC */ | |
4305 ? Qt : Qnil; | 4004 ? Qt : Qnil; |
4306 } | 4005 } |
4307 | 4006 |
4308 | 4007 |
4309 static Lisp_Object | 4008 static Lisp_Object |
4310 keymap_lookup_inherited_mapper (Lisp_Object km, void *arg) | 4009 keymap_lookup_inherited_mapper (Lisp_Object km, void *arg) |
4311 { | 4010 { |
4312 #ifdef USE_KKCC | |
4313 Lisp_Key_Data *k = (Lisp_Key_Data *) arg; | 4011 Lisp_Key_Data *k = (Lisp_Key_Data *) arg; |
4314 return keymap_lookup_directly (km, KEY_DATA_KEYSYM (k), KEY_DATA_MODIFIERS (k)); | 4012 return keymap_lookup_directly (km, KEY_DATA_KEYSYM (k), KEY_DATA_MODIFIERS (k)); |
4315 #else /* not USE_KKCC */ | |
4316 struct key_data *k = (struct key_data *) arg; | |
4317 return keymap_lookup_directly (km, k->keysym, k->modifiers); | |
4318 #endif /* not USE_KKCC */ | |
4319 } | 4013 } |
4320 | 4014 |
4321 | 4015 |
4322 static void | 4016 static void |
4323 #ifdef USE_KKCC | |
4324 describe_map_mapper (const Lisp_Key_Data *key, | 4017 describe_map_mapper (const Lisp_Key_Data *key, |
4325 #else /* not USE_KKCC */ | |
4326 describe_map_mapper (const struct key_data *key, | |
4327 #endif /* not USE_KKCC */ | |
4328 Lisp_Object binding, | 4018 Lisp_Object binding, |
4329 void *describe_map_closure) | 4019 void *describe_map_closure) |
4330 { | 4020 { |
4331 /* This function can GC */ | 4021 /* This function can GC */ |
4332 struct describe_map_closure *closure = | 4022 struct describe_map_closure *closure = |
4333 (struct describe_map_closure *) describe_map_closure; | 4023 (struct describe_map_closure *) describe_map_closure; |
4334 #ifdef USE_KKCC | |
4335 Lisp_Object keysym = KEY_DATA_KEYSYM (key); | 4024 Lisp_Object keysym = KEY_DATA_KEYSYM (key); |
4336 int modifiers = KEY_DATA_MODIFIERS (key); | 4025 int modifiers = KEY_DATA_MODIFIERS (key); |
4337 #else /* not USE_KKCC */ | |
4338 Lisp_Object keysym = key->keysym; | |
4339 int modifiers = key->modifiers; | |
4340 #endif /* not USE_KKCC */ | |
4341 | 4026 |
4342 /* Don't mention suppressed commands. */ | 4027 /* Don't mention suppressed commands. */ |
4343 if (SYMBOLP (binding) | 4028 if (SYMBOLP (binding) |
4344 && !NILP (closure->partial) | 4029 && !NILP (closure->partial) |
4345 && !NILP (Fget (binding, closure->partial, Qnil))) | 4030 && !NILP (Fget (binding, closure->partial, Qnil))) |