Mercurial > hg > xemacs-beta
annotate lisp/menubar.el @ 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 | a307f9a2021d |
children | 9caf26dd924f |
rev | line source |
---|---|
428 | 1 ;;; menubar.el --- Menubar support for XEmacs |
2 | |
3 ;; Copyright (C) 1991-4, 1997-1998 Free Software Foundation, Inc. | |
4 ;; Copyright (C) 1995 Tinker Systems and INS Engineering Corp. | |
5 ;; Copyright (C) 1995, 1996 Ben Wing. | |
6 | |
7 ;; Maintainer: XEmacs Development Team | |
8 ;; Keywords: internal, extensions, dumped | |
9 | |
10 ;; This file is part of XEmacs. | |
11 | |
12 ;; XEmacs is free software; you can redistribute it and/or modify it | |
13 ;; under the terms of the GNU General Public License as published by | |
14 ;; the Free Software Foundation; either version 2, or (at your option) | |
15 ;; any later version. | |
16 | |
17 ;; XEmacs is distributed in the hope that it will be useful, but | |
18 ;; WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
20 ;; General Public License for more details. | |
21 | |
22 ;; You should have received a copy of the GNU General Public License | |
444 | 23 ;; along with XEmacs; see the file COPYING. If not, write to the |
428 | 24 ;; Free Software Foundation, 59 Temple Place - Suite 330, |
25 ;; Boston, MA 02111-1307, USA. | |
26 | |
27 ;;; Synched up with: Not in FSF. (Completely divergent from FSF menu-bar.el) | |
28 | |
29 ;;; Commentary: | |
30 | |
31 ;; This file is dumped with XEmacs (when menubar support is compiled in). | |
32 | |
442 | 33 ;; Some stuff in FSF menu-bar.el is in menubar-items.el |
428 | 34 |
35 ;;; Code: | |
36 | |
37 (defgroup menu nil | |
38 "Input from the menus." | |
39 :group 'environment) | |
40 | |
41 (defvar default-menubar nil) | |
42 | |
43 ;; this function is considered "part of the lexicon" by many, | |
44 ;; so we'll leave it here. | |
45 (defun kill-this-buffer () ; for the menubar | |
46 "Kill the current buffer." | |
47 (interactive) | |
48 (kill-buffer (current-buffer))) | |
49 | |
50 (defun set-menubar-dirty-flag () | |
51 "Tell XEmacs that the menubar has to be updated. | |
52 NOTE: XEmacs now recognizes when you set a different value for | |
53 `current-menubar'. You *only* need to call this function if you | |
54 destructively modify a part of the menubar and don't set `current-menubar'. | |
55 Note that all the functions that modify a menu call this automatically." | |
56 (setq-default current-menubar (default-value 'current-menubar))) | |
57 | |
58 ;; #### shouldn't this perhaps be `copy-tree'? | |
59 (defun set-menubar (menubar) | |
60 "Set the default menubar to be MENUBAR. | |
61 See `current-menubar' for a description of the syntax of a menubar." | |
62 (check-menu-syntax menubar t) | |
63 (setq-default current-menubar (copy-sequence menubar))) | |
64 | |
65 (defun set-buffer-menubar (menubar) | |
66 "Set the buffer-local menubar to be MENUBAR. | |
67 See `current-menubar' for a description of the syntax of a menubar." | |
68 (check-menu-syntax menubar t) | |
69 (make-local-variable 'current-menubar) | |
70 (setq current-menubar (copy-sequence menubar))) | |
71 | |
72 (defun check-menu-syntax (menu &optional menubar-p) | |
73 ;; The C code does syntax checking on the value of `current-menubar', | |
74 ;; but it's better to do it early, before things have gotten messed up. | |
75 (if menubar-p | |
76 nil | |
77 (or (stringp (car menu)) | |
78 (signal 'error | |
79 (list "menu name (first element) must be a string" menu))) | |
80 ;;(or (cdr menu) (signal 'error (list "menu is empty" menu))) | |
81 (setq menu (cdr menu))) | |
82 (let (menuitem item) | |
83 (while (keywordp (setq item (car menu))) | |
84 (or (memq item '(:config :included :filter :accelerator)) | |
85 (signal 'error | |
86 (list "menu keyword must be :config, :included, :accelerator or :filter" | |
87 item))) | |
88 (if (or (not (cdr menu)) | |
89 (vectorp (nth 1 menu)) | |
90 (keywordp (nth 1 menu))) | |
91 (signal 'error (list "strange keyword value" item (nth 1 menu)))) | |
92 (setq menu (nthcdr 2 menu))) | |
93 (while menu | |
94 (setq menuitem (car menu)) | |
95 (cond | |
96 ((stringp menuitem) | |
97 (and (string-match "^\\(-+\\|=+\\):\\(.*\\)" menuitem) | |
98 (setq item (match-string 2 menuitem)) | |
444 | 99 (or (member item '(;; Motif-compatible |
428 | 100 "singleLine" |
101 "doubleLine" | |
102 "singleDashedLine" | |
103 "doubleDashedLine" | |
104 "noLine" | |
105 "shadowEtchedIn" | |
106 "shadowEtchedOut" | |
107 "shadowEtchedInDash" | |
108 "shadowEtchedOutDash" | |
109 ;; non-Motif (Lucid menubar widget only) | |
110 "shadowDoubleEtchedIn" | |
111 "shadowDoubleEtchedOut" | |
112 "shadowDoubleEtchedInDash" | |
113 "shadowDoubleEtchedOutDash" | |
114 )) | |
115 (signal 'error (list "bogus separator style in menu item" item))) | |
116 )) | |
117 ((null menuitem) | |
118 (or menubar-p | |
119 (signal 'error (list "nil is only permitted in the top level of menubars")))) | |
120 ((consp menuitem) | |
121 (check-menu-syntax menuitem)) | |
122 ((vectorp menuitem) | |
123 (let ((L (length menuitem)) | |
124 plistp) | |
125 (and (< L 2) | |
126 (signal 'error | |
127 (list "button descriptors must be at least 2 long" | |
128 menuitem))) | |
129 (setq plistp (or (>= L 5) | |
130 (and (> L 2) (keywordp (aref menuitem 2))))) | |
131 (if plistp | |
132 (let ((i 2) | |
133 selp | |
134 style | |
135 item) | |
136 (while (< i L) | |
137 (setq item (aref menuitem i)) | |
138 (cond ((not (memq item '(:active :suffix :keys :style | |
139 :full :included :selected | |
140 :accelerator))) | |
141 (signal 'error | |
142 (list (if (keywordp item) | |
143 "unknown menu item keyword" | |
144 "not a keyword") | |
145 item menuitem))) | |
146 ((eq item :style) | |
147 (setq style (aref menuitem (1+ i))) | |
148 (or (memq style '(nil toggle radio button text)) | |
149 (signal 'error (list "unknown style" style | |
150 menuitem)))) | |
151 ((eq item :selected) (setq selp t)) | |
152 ) | |
153 (setq i (+ i (if (eq item :full) 1 2)))) | |
154 (if (and selp (not (memq style '(toggle button radio)))) | |
155 (signal 'error | |
156 (list | |
157 ":selected only makes sense with :style toggle, radio, or button" | |
158 menuitem))) | |
159 ))) | |
160 ) | |
161 ;; (t (signal 'error (list "unrecognized menu descriptor" menuitem)))) | |
162 (t (message "unrecognized menu descriptor %s" (prin1-to-string menuitem)))) | |
163 (setq menu (cdr menu))))) | |
164 | |
165 | |
166 ;;; menu manipulation functions | |
167 | |
168 (defun find-menu-item (menubar item-path-list &optional parent) | |
169 "Search MENUBAR for item given by ITEM-PATH-LIST starting from PARENT. | |
170 Returns (ITEM . PARENT), where PARENT is the immediate parent of | |
171 the item found. | |
172 If the item does not exist, the car of the returned value is nil. | |
173 If some menu in the ITEM-PATH-LIST does not exist, an error is signalled." | |
174 (check-argument-type 'listp item-path-list) | |
175 (unless parent | |
176 (setq item-path-list (mapcar 'normalize-menu-item-name item-path-list))) | |
177 (if (not (consp menubar)) | |
178 nil | |
179 (let ((rest menubar) | |
180 result) | |
181 (when (stringp (car rest)) | |
182 (setq rest (cdr rest))) | |
183 (while (keywordp (car rest)) | |
184 (setq rest (cddr rest))) | |
185 (while rest | |
186 (if (and (car rest) | |
187 (equal (car item-path-list) | |
188 (normalize-menu-item-name | |
189 (cond ((vectorp (car rest)) | |
190 (aref (car rest) 0)) | |
191 ((stringp (car rest)) | |
192 (car rest)) | |
193 (t | |
194 (caar rest)))))) | |
195 (setq result (car rest) | |
196 rest nil) | |
197 (setq rest (cdr rest)))) | |
198 (if (cdr item-path-list) | |
199 (cond ((consp result) | |
200 (find-menu-item (cdr result) (cdr item-path-list) result)) | |
201 (result | |
202 (signal 'error (list (gettext "not a submenu") result))) | |
203 (t | |
204 (signal 'error (list (gettext "no such submenu") | |
205 (car item-path-list))))) | |
206 (cons result parent))))) | |
207 | |
208 (defun add-menu-item-1 (leaf-p menu-path new-item before in-menu) | |
209 ;; This code looks like it could be cleaned up some more | |
210 ;; Do we really need 6 calls to find-menu-item? | |
211 (when before (setq before (normalize-menu-item-name before))) | |
212 (let* ((item-name | |
213 (cond ((vectorp new-item) (aref new-item 0)) | |
214 ((consp new-item) (car new-item)) | |
215 (t nil))) | |
216 (menubar (or in-menu current-menubar)) | |
217 (menu (condition-case () | |
218 (car (find-menu-item menubar menu-path)) | |
219 (error nil))) | |
220 (item-found (cond | |
221 ((null item-name) | |
222 nil) | |
223 ((not (listp menu)) | |
224 (signal 'error (list (gettext "not a submenu") | |
225 menu-path))) | |
226 (menu | |
227 (find-menu-item (cdr menu) (list item-name))) | |
228 (t | |
229 (find-menu-item menubar (list item-name))) | |
230 ))) | |
231 (unless menubar | |
232 (error "`current-menubar' is nil: can't add menus to it.")) | |
233 (unless menu | |
234 (let ((rest menu-path) | |
235 (so-far menubar)) | |
236 (while rest | |
237 ;;; (setq menu (car (find-menu-item (cdr so-far) (list (car rest))))) | |
238 (setq menu | |
239 (if (eq so-far menubar) | |
240 (car (find-menu-item so-far (list (car rest)))) | |
241 (car (find-menu-item (cdr so-far) (list (car rest)))))) | |
242 (unless menu | |
243 (let ((rest2 so-far)) | |
244 (while (and (cdr rest2) (car (cdr rest2))) | |
245 (setq rest2 (cdr rest2))) | |
246 (setcdr rest2 | |
247 (nconc (list (setq menu (list (car rest)))) | |
248 (cdr rest2))))) | |
249 (setq so-far menu) | |
250 (setq rest (cdr rest))))) | |
251 (if (and item-found (car item-found)) | |
252 ;; hack the item in place. | |
253 (if menu | |
254 ;; Isn't it very bad form to use nsubstitute for side effects? | |
255 (nsubstitute new-item (car item-found) menu) | |
256 (setq current-menubar (nsubstitute new-item | |
257 (car item-found) | |
258 current-menubar))) | |
259 ;; OK, we have to add the whole thing... | |
260 ;; if BEFORE is specified, try to add it there. | |
261 (unless menu (setq menu current-menubar)) | |
262 (when before | |
263 (setq before (car (find-menu-item menu (list before))))) | |
264 (let ((rest menu) | |
265 (added-before nil)) | |
266 (while rest | |
267 (if (eq before (car (cdr rest))) | |
268 (progn | |
269 (setcdr rest (cons new-item (cdr rest))) | |
270 (setq rest nil added-before t)) | |
271 (setq rest (cdr rest)))) | |
272 (when (not added-before) | |
273 ;; adding before the first item on the menubar itself is harder | |
274 (if (and (eq menu menubar) (eq before (car menu))) | |
275 (setq menu (cons new-item menu) | |
276 current-menubar menu) | |
277 ;; otherwise, add the item to the end. | |
278 (nconc menu (list new-item)))))) | |
279 (set-menubar-dirty-flag) | |
280 new-item)) | |
281 | |
282 (defun add-menu-button (menu-path menu-leaf &optional before in-menu) | |
283 "Add a menu item to some menu, creating the menu first if necessary. | |
284 If the named item exists already, it is changed. | |
285 MENU-PATH identifies the menu under which the new menu item should be inserted. | |
286 It is a list of strings; for example, (\"File\") names the top-level \"File\" | |
287 menu. (\"File\" \"Foo\") names a hypothetical submenu of \"File\". | |
288 MENU-LEAF is a menubar leaf node. See the documentation of `current-menubar'. | |
289 BEFORE, if provided, is the name of a menu item before which this item should | |
290 be added, if this item is not on the menu already. If the item is already | |
291 present, it will not be moved. | |
444 | 292 IN-MENU, if provided, means use that instead of `current-menubar' as the |
293 menu to change." | |
428 | 294 ;; Note easymenu.el uses the fact that menu-leaf can be a submenu. |
295 (add-menu-item-1 t menu-path menu-leaf before in-menu)) | |
296 | |
297 ;; I actually liked the old name better, but the interface has changed too | |
444 | 298 ;; drastically to keep it. --Stig |
428 | 299 (defun add-submenu (menu-path submenu &optional before in-menu) |
300 "Add a menu to the menubar or one of its submenus. | |
301 If the named menu exists already, it is changed. | |
302 MENU-PATH identifies the menu under which the new menu should be inserted. | |
303 It is a list of strings; for example, (\"File\") names the top-level \"File\" | |
304 menu. (\"File\" \"Foo\") names a hypothetical submenu of \"File\". | |
305 If MENU-PATH is nil, then the menu will be added to the menubar itself. | |
306 SUBMENU is the new menu to add. | |
307 See the documentation of `current-menubar' for the syntax. | |
308 BEFORE, if provided, is the name of a menu before which this menu should | |
309 be added, if this menu is not on its parent already. If the menu is already | |
444 | 310 present, it will not be moved. |
311 IN-MENU, if provided, means use that instead of `current-menubar' as the | |
312 menu to change." | |
428 | 313 (check-menu-syntax submenu nil) |
314 (add-menu-item-1 nil menu-path submenu before in-menu)) | |
444 | 315 ;; purespace is no more, so this function is unnecessary |
316 ;(defun purecopy-menubar (x) | |
317 ; ;; this calls purecopy on the strings, and the contents of the vectors, | |
318 ; ;; but not on the vectors themselves, or the conses - those must be | |
319 ; ;; writable. | |
320 ; (cond ((vectorp x) | |
321 ; (let ((i (length x))) | |
322 ; (while (> i 0) | |
323 ; (aset x (1- i) (purecopy (aref x (1- i)))) | |
324 ; (setq i (1- i)))) | |
325 ; x) | |
326 ; ((consp x) | |
327 ; (let ((rest x)) | |
328 ; (while rest | |
329 ; (setcar rest (purecopy-menubar (car rest))) | |
330 ; (setq rest (cdr rest)))) | |
331 ; x) | |
332 ; (t | |
333 ; (purecopy x)))) | |
428 | 334 |
335 (defun delete-menu-item (path &optional from-menu) | |
336 "Remove the named menu item from the menu hierarchy. | |
444 | 337 PATH is a list of strings which identify the position of the menu item |
338 in the menu hierarchy. The documentation of `add-submenu' describes | |
339 menu paths. | |
340 FROM-MENU, if provided, means use that instead of `current-menubar' | |
341 as the menu to change." | |
428 | 342 (let* ((pair (condition-case nil (find-menu-item (or from-menu |
343 current-menubar) path) | |
344 (error nil))) | |
345 (item (car pair)) | |
346 (parent (or (cdr pair) current-menubar))) | |
347 (if (not item) | |
348 nil | |
349 ;; the menubar is the only special case, because other menus begin | |
350 ;; with their name. | |
351 (if (eq parent current-menubar) | |
352 (setq current-menubar (delq item parent)) | |
353 (delq item parent)) | |
354 (set-menubar-dirty-flag) | |
355 item))) | |
356 | |
357 (defun relabel-menu-item (path new-name) | |
358 "Change the string of the specified menu item. | |
444 | 359 PATH is a list of strings which identify the position of the menu item in |
428 | 360 the menu hierarchy. (\"File\" \"Save\") means the menu item called \"Save\" |
444 | 361 under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the |
428 | 362 menu item called \"Item\" under the \"Foo\" submenu of \"Menu\". |
363 NEW-NAME is the string that the menu item will be printed as from now on." | |
446 | 364 (check-type new-name string) |
428 | 365 (let* ((menubar current-menubar) |
366 (pair (find-menu-item menubar path)) | |
367 (item (car pair)) | |
368 (menu (cdr pair))) | |
369 (or item | |
370 (signal 'error (list (if menu (gettext "No such menu item") | |
371 (gettext "No such menu")) | |
372 path))) | |
373 (if (and (consp item) | |
374 (stringp (car item))) | |
375 (setcar item new-name) | |
376 (aset item 0 new-name)) | |
377 (set-menubar-dirty-flag) | |
378 item)) | |
379 | |
380 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
381 ;; | |
382 ;; these are all bad style. Why in the world would we put evaluable forms | |
383 ;; into the menubar if we didn't want people to use 'em? | |
384 ;; x-font-menu.el is the only known offender right now and that ought to be | |
385 ;; rehashed a bit. | |
444 | 386 ;; |
428 | 387 |
388 (defun enable-menu-item-1 (path toggle-p on-p) | |
389 (let (menu item) | |
390 (if (and (vectorp path) (> (length path) 2)) ; limited syntax checking... | |
391 (setq item path) | |
392 (let* ((menubar current-menubar) | |
393 (pair (find-menu-item menubar path))) | |
394 (setq item (car pair) | |
395 menu (cdr pair)) | |
396 (or item | |
397 (signal 'error (list (if menu | |
398 "No such menu item" | |
399 "No such menu") | |
400 path))) | |
401 (if (consp item) | |
402 (error "%S is a menu, not a menu item" path)))) | |
403 (if (or (> (length item) 4) | |
404 (and (symbolp (aref item 2)) | |
405 (= ?: (aref (symbol-name (aref item 2)) 0)))) | |
406 ;; plist-like syntax | |
407 (let ((i 2) | |
408 (keyword (if toggle-p :selected :active)) | |
409 (ok nil)) | |
410 (while (< i (length item)) | |
411 (cond ((eq (aref item i) keyword) | |
412 (aset item (1+ i) on-p) | |
413 (setq ok t))) | |
414 (setq i (+ i 2))) | |
415 (cond (ok nil) | |
416 (toggle-p | |
417 (signal 'error (list "not a toggle menu item" item))) | |
418 (t | |
419 ;; Need to copy the item to extend it, sigh... | |
420 (let ((cons (memq item menu)) | |
421 (new-item (vconcat item (list keyword on-p)))) | |
422 (if cons | |
423 (setcar cons (setq item new-item)) | |
424 (if menu | |
425 (error "couldn't find %S on its parent?" item) | |
426 (error "no %S slot to set: %S" keyword item))))))) | |
427 ;; positional syntax | |
428 (if toggle-p | |
429 (signal 'error (list "not a toggle menu item" item)) | |
430 (aset item 2 on-p))) | |
431 (set-menubar-dirty-flag) | |
432 item)) | |
433 | |
434 (defun enable-menu-item (path) | |
435 "Make the named menu item be selectable. | |
444 | 436 PATH is a list of strings which identify the position of the menu item in |
428 | 437 the menu hierarchy. (\"File\" \"Save\") means the menu item called \"Save\" |
444 | 438 under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the |
428 | 439 menu item called \"Item\" under the \"Foo\" submenu of \"Menu\"." |
440 (enable-menu-item-1 path nil t)) | |
441 | |
442 (defun disable-menu-item (path) | |
443 "Make the named menu item be unselectable. | |
444 | 444 PATH is a list of strings which identify the position of the menu item in |
428 | 445 the menu hierarchy. (\"File\" \"Save\") means the menu item called \"Save\" |
444 | 446 under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the |
428 | 447 menu item called \"Item\" under the \"Foo\" submenu of \"Menu\"." |
448 (enable-menu-item-1 path nil nil)) | |
449 | |
450 (defun select-toggle-menu-item (path) | |
451 "Make the named toggle- or radio-style menu item be in the `selected' state. | |
444 | 452 PATH is a list of strings which identify the position of the menu item in |
428 | 453 the menu hierarchy. (\"File\" \"Save\") means the menu item called \"Save\" |
444 | 454 under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the |
428 | 455 menu item called \"Item\" under the \"Foo\" submenu of \"Menu\"." |
456 (enable-menu-item-1 path t t)) | |
457 | |
458 (defun deselect-toggle-menu-item (path) | |
459 "Make the named toggle- or radio-style menu item be in the `unselected' state. | |
444 | 460 PATH is a list of strings which identify the position of the menu item in |
428 | 461 the menu hierarchy. (\"File\" \"Save\") means the menu item called \"Save\" |
444 | 462 under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the |
428 | 463 menu item called \"Item\" under the \"Foo\" submenu of \"Menu\"." |
464 (enable-menu-item-1 path t nil)) | |
465 | |
466 | |
442 | 467 |
468 ;;;;;;; popup menus | |
469 | |
470 (defvar global-popup-menu nil | |
471 "The global popup menu. This is present in all modes. | |
472 See the function `popup-menu' for a description of menu syntax.") | |
473 | |
474 (defvar mode-popup-menu nil | |
475 "The mode-specific popup menu. Automatically buffer local. | |
476 This is appended to the default items in `global-popup-menu'. | |
477 See the function `popup-menu' for a description of menu syntax.") | |
478 (make-variable-buffer-local 'mode-popup-menu) | |
479 | |
480 (defvar activate-popup-menu-hook nil | |
481 "Function or functions run before a mode-specific popup menu is made visible. | |
482 These functions are called with no arguments, and should interrogate and | |
483 modify the value of `global-popup-menu' or `mode-popup-menu' as desired. | |
484 Note: this hook is only run if you use `popup-mode-menu' for activating the | |
485 global and mode-specific commands; if you have your own binding for button3, | |
486 this hook won't be run.") | |
487 | |
488 (defvar last-popup-menu-event nil | |
489 "The mouse event that invoked the last popup menu. | |
490 NOTE: This is EXPERIMENTAL and may change at any time.") | |
491 | |
492 (defun popup-mode-menu (&optional event) | |
493 "Pop up a menu of global and mode-specific commands. | |
494 The menu is computed by combining `global-popup-menu' and `mode-popup-menu' | |
495 with any items derived from the `context-menu' property of the extent where the | |
496 button was clicked." | |
497 (interactive "_e") | |
498 (setq last-popup-menu-event | |
499 (or (and event (button-event-p event) event) | |
500 (let* ((mouse-pos (mouse-position)) | |
501 (win (car mouse-pos)) | |
502 (x (cadr mouse-pos)) | |
503 (y (cddr mouse-pos)) | |
504 (edges (window-pixel-edges win)) | |
505 (winx (first edges)) | |
506 (winy (second edges)) | |
507 (x (+ x winx)) | |
508 (y (+ y winy))) | |
509 (make-event 'button-press | |
510 `(button 3 x ,x y ,y channel ,(window-frame win) | |
511 timestamp ,(current-event-timestamp | |
512 (cdfw-console win))))))) | |
513 (run-hooks 'activate-popup-menu-hook) | |
514 (let* ((context-window (and event (event-window event))) | |
515 (context-point (and event (event-point event))) | |
516 (context-extents (and context-window | |
517 context-point | |
518 (extents-at context-point | |
519 (window-buffer context-window) | |
520 'context-menu))) | |
521 (context-menu-items | |
522 (apply 'append (mapcar #'(lambda (extent) | |
523 (extent-property extent 'context-menu)) | |
524 context-extents)))) | |
525 (popup-menu | |
462 | 526 (progn |
442 | 527 ;; Merge global-popup-menu and mode-popup-menu |
462 | 528 (and mode-popup-menu (check-menu-syntax mode-popup-menu)) |
529 (let* ((mode-title (and (stringp (car mode-popup-menu)) | |
530 (car mode-popup-menu))) | |
531 (mode-items (if mode-title (cdr mode-popup-menu) | |
532 mode-popup-menu)) | |
533 (global-title (and (stringp (car global-popup-menu)) | |
534 (car global-popup-menu))) | |
535 (global-items (if global-title (cdr global-popup-menu) | |
536 global-popup-menu)) | |
442 | 537 mode-filters) |
538 ;; Strip keywords from local menu for attaching them at the top | |
462 | 539 (while (and mode-items |
540 (keywordp (car mode-items))) | |
442 | 541 ;; Push both keyword and its argument. |
462 | 542 (push (pop mode-items) mode-filters) |
543 (push (pop mode-items) mode-filters)) | |
442 | 544 (setq mode-filters (nreverse mode-filters)) |
545 ;; If mode-filters contains a keyword already present in | |
546 ;; `global-popup-menu', you will probably lose. | |
462 | 547 (append (and popup-menu-titles |
548 (cond (mode-title (list mode-title)) | |
549 (global-title (list global-title)) | |
550 (t ""))) | |
442 | 551 mode-filters |
462 | 552 context-menu-items |
553 (and context-menu-items mode-items '("---")) | |
554 mode-items | |
555 (and (or context-menu-items mode-items) | |
556 global-items '("---" "---")) | |
557 (and global-title (list global-title)) | |
558 global-items | |
559 )))) | |
442 | 560 |
561 (while (popup-up-p) | |
562 (dispatch-event (next-event))) | |
563 | |
564 )) | |
444 | 565 |
442 | 566 (defun popup-buffer-menu (event) |
502 | 567 "Pop up a copy of the menubar Buffers menu where the mouse is clicked." |
442 | 568 (interactive "e") |
569 (let ((window (and (event-over-text-area-p event) (event-window event))) | |
570 (bmenu nil)) | |
571 (or window | |
572 (error "Pointer must be in a normal window")) | |
573 (select-window window) | |
574 (if current-menubar | |
575 (setq bmenu (assoc "%_Buffers" current-menubar))) | |
576 (if (null bmenu) | |
577 (setq bmenu (assoc "%_Buffers" default-menubar))) | |
578 (if (null bmenu) | |
579 (error "Can't find the Buffers menu")) | |
580 (popup-menu bmenu))) | |
581 | |
582 (defun popup-menubar-menu (event) | |
583 "Pop up a copy of menu that also appears in the menubar." | |
584 (interactive "e") | |
585 (let ((window (and (event-over-text-area-p event) (event-window event))) | |
586 popup-menubar) | |
587 (or window | |
588 (error "Pointer must be in a normal window")) | |
589 (select-window window) | |
590 (and current-menubar (run-hooks 'activate-menubar-hook)) | |
591 ;; #### Instead of having to copy this just to safely get rid of | |
592 ;; any nil what we should really do is fix up the internal menubar | |
593 ;; code to just ignore nil if generating a popup menu | |
594 (setq popup-menubar (delete nil (copy-sequence (or current-menubar | |
595 default-menubar)))) | |
596 (popup-menu (cons "%_Menubar Menu" popup-menubar)) | |
597 )) | |
598 | |
599 (defun menu-call-at-event (form &optional event default-behavior-fallback) | |
600 "Call FORM while temporarily setting point to the position in EVENT. | |
601 NOTE: This is EXPERIMENTAL and may change at any time. | |
602 | |
603 FORM is called the way forms in menu specs are: i.e. if a symbol, it's called | |
604 with `call-interactively', otherwise with `eval'. EVENT defaults to | |
605 `last-popup-menu-event', making this function especially useful in popup | |
606 menus. The buffer and point are set temporarily within a `save-excursion'. | |
607 If EVENT is not a mouse event, or was not over a buffer, nothing | |
608 happens unless DEFAULT-BEHAVIOR-FALLBACK is non-nil, in which case the | |
609 FORM is called normally." | |
610 (or event (setq event last-popup-menu-event)) | |
611 (let ((buf (event-buffer event)) | |
612 (p (event-closest-point event))) | |
613 (cond ((and buf p (> p 0)) | |
614 (save-excursion | |
615 (set-buffer buf) | |
616 (goto-char p) | |
617 (if (symbolp form) | |
618 (call-interactively form) | |
619 (eval form)))) | |
620 (default-behavior-fallback | |
621 (if (symbolp form) | |
622 (call-interactively form) | |
623 (eval form)))))) | |
624 | |
625 (global-set-key 'button3 'popup-mode-menu) | |
626 ;; shift button3 and shift button2 are reserved for Hyperbole | |
627 (global-set-key '(meta control button3) 'popup-buffer-menu) | |
628 ;; The following command is way too dangerous with Custom. | |
629 ;; (global-set-key '(meta shift button3) 'popup-menubar-menu) | |
630 | |
631 ;; Here's a test of the cool new menu features (from Stig). | |
632 | |
633 ;;(setq mode-popup-menu | |
634 ;; '("Test Popup Menu" | |
635 ;; :filter cdr | |
636 ;; ["this item won't appear because of the menu filter" ding t] | |
637 ;; "--:singleLine" | |
638 ;; "singleLine" | |
639 ;; "--:doubleLine" | |
640 ;; "doubleLine" | |
641 ;; "--:singleDashedLine" | |
642 ;; "singleDashedLine" | |
643 ;; "--:doubleDashedLine" | |
644 ;; "doubleDashedLine" | |
645 ;; "--:noLine" | |
646 ;; "noLine" | |
647 ;; "--:shadowEtchedIn" | |
648 ;; "shadowEtchedIn" | |
649 ;; "--:shadowEtchedOut" | |
650 ;; "shadowEtchedOut" | |
651 ;; "--:shadowDoubleEtchedIn" | |
652 ;; "shadowDoubleEtchedIn" | |
653 ;; "--:shadowDoubleEtchedOut" | |
654 ;; "shadowDoubleEtchedOut" | |
655 ;; "--:shadowEtchedInDash" | |
656 ;; "shadowEtchedInDash" | |
657 ;; "--:shadowEtchedOutDash" | |
658 ;; "shadowEtchedOutDash" | |
659 ;; "--:shadowDoubleEtchedInDash" | |
660 ;; "shadowDoubleEtchedInDash" | |
661 ;; "--:shadowDoubleEtchedOutDash" | |
662 ;; "shadowDoubleEtchedOutDash" | |
663 ;; )) | |
664 | |
428 | 665 (defun get-popup-menu-response (menu-desc &optional event) |
666 "Pop up the given menu and wait for a response. | |
667 This blocks until the response is received, and returns the misc-user | |
668 event that encapsulates the response. To execute it, you can do | |
669 (funcall (event-function response) (event-object response)) | |
670 If no response was received, nil is returned. | |
671 | |
672 MENU-DESC and EVENT are as in the call to `popup-menu'." | |
673 ;; partially stolen from w3 | |
707 | 674 |
675 ;; This function is way gross and assumes to much about menu | |
676 ;; processing that is X specific. Under mswindows popup menus behave | |
677 ;; in reasonable ways that you can't obstruct. | |
428 | 678 (let ((echo-keystrokes 0) |
679 new-event) | |
680 (popup-menu menu-desc event) | |
681 (catch 'popup-done | |
682 (while t | |
683 (setq new-event (next-command-event new-event)) | |
684 (cond ((misc-user-event-p new-event) | |
685 (throw 'popup-done new-event)) | |
707 | 686 ((button-release-event-p new-event);; don't beep twice |
687 nil) | |
688 ;; It shows how bogus this function is that the event | |
689 ;; arg could be missing and no-one noticed ... | |
690 ((event-matches-key-specifier-p new-event (quit-char)) | |
691 (signal 'quit nil)) | |
692 ;; mswindows has no pop-down processing (selection is | |
693 ;; atomic) so doing anything more makes no sense. Since | |
694 ;; popup-up-p is always false under mswindows, this | |
695 ;; function has been ordered to do essentially X-specifc | |
696 ;; processing after this check. | |
697 ((not (popup-up-p)) | |
428 | 698 (setq unread-command-events (cons new-event |
699 unread-command-events)) | |
700 (throw 'popup-done nil)) | |
707 | 701 ;; mswindows never gets here |
428 | 702 (t |
703 (beep) | |
704 (message "please make a choice from the menu."))))))) | |
705 | |
706 (defun popup-menu-and-execute-in-window (menu-desc event) | |
707 "Pop up the given menu and execute its response in EVENT's window. | |
708 This blocks until the response is received, temporarily selects | |
709 EVENT's window, and executes the command specified in the response. | |
710 EVENT can also be a window. See `popup-menu' for the semantics of | |
711 MENU-DESC." | |
712 (let ((response | |
713 (get-popup-menu-response menu-desc | |
714 (and (eventp event) event)))) | |
715 (and (misc-user-event-p response) | |
716 (save-selected-window | |
717 (select-window (if (windowp event) event | |
718 (event-window event))) | |
719 (funcall (event-function response) | |
720 (event-object response)))))) | |
721 | |
722 ;; provide default bindings for menu accelerator map | |
723 (and (boundp 'menu-accelerator-map) | |
724 (keymapp menu-accelerator-map) | |
725 (progn | |
726 (define-key menu-accelerator-map "\e" 'menu-escape) | |
727 (define-key menu-accelerator-map [left] 'menu-left) | |
728 (define-key menu-accelerator-map [right] 'menu-right) | |
729 (define-key menu-accelerator-map [up] 'menu-up) | |
730 (define-key menu-accelerator-map [down] 'menu-down) | |
731 (define-key menu-accelerator-map [return] 'menu-select) | |
502 | 732 (define-key menu-accelerator-map [kp-down] 'menu-down) |
733 (define-key menu-accelerator-map [kp-up] 'menu-down) | |
734 (define-key menu-accelerator-map [kp-left] 'menu-left) | |
735 (define-key menu-accelerator-map [kp-right] 'menu-right) | |
736 (define-key menu-accelerator-map [kp-enter] 'menu-select) | |
428 | 737 (define-key menu-accelerator-map "\C-g" 'menu-quit))) |
738 | |
739 | |
740 (provide 'menubar) | |
741 | |
742 ;;; menubar.el ends here |