Mercurial > hg > xemacs-beta
annotate src/gui-x.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 | c925bacdda60 |
children | 465bd3c7d932 |
rev | line source |
---|---|
428 | 1 /* General GUI code -- X-specific. (menubars, scrollbars, toolbars, dialogs) |
2 Copyright (C) 1995 Board of Trustees, University of Illinois. | |
793 | 3 Copyright (C) 1995, 1996, 2000, 2001, 2002 Ben Wing. |
428 | 4 Copyright (C) 1995 Sun Microsystems, Inc. |
5 Copyright (C) 1998 Free Software Foundation, Inc. | |
6 | |
7 This file is part of XEmacs. | |
8 | |
9 XEmacs is free software; you can redistribute it and/or modify it | |
10 under the terms of the GNU General Public License as published by the | |
11 Free Software Foundation; either version 2, or (at your option) any | |
12 later version. | |
13 | |
14 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
17 for more details. | |
18 | |
19 You should have received a copy of the GNU General Public License | |
20 along with XEmacs; see the file COPYING. If not, write to | |
21 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
22 Boston, MA 02111-1307, USA. */ | |
23 | |
24 /* Synched up with: Not in FSF. */ | |
25 | |
442 | 26 /* This file Mule-ized by Ben Wing, 7-8-00. */ |
27 | |
428 | 28 #include <config.h> |
29 #include "lisp.h" | |
30 | |
872 | 31 #include "buffer.h" |
32 #include "device-impl.h" | |
33 #include "events.h" | |
34 #include "frame.h" | |
35 #include "glyphs.h" | |
36 #include "gui.h" | |
37 #include "menubar.h" | |
38 #include "opaque.h" | |
39 #include "redisplay.h" | |
40 | |
41 #include "console-x-impl.h" | |
42 #include "gui-x.h" | |
43 | |
428 | 44 #ifdef LWLIB_USES_MOTIF |
45 #include <Xm/Xm.h> /* for XmVersion */ | |
46 #endif | |
47 | |
48 /* we need a unique id for each popup menu, dialog box, and scrollbar */ | |
647 | 49 static LWLIB_ID lwlib_id_tick; |
428 | 50 |
51 LWLIB_ID | |
52 new_lwlib_id (void) | |
53 { | |
54 return ++lwlib_id_tick; | |
55 } | |
56 | |
57 widget_value * | |
58 xmalloc_widget_value (void) | |
59 { | |
60 widget_value *tmp = malloc_widget_value (); | |
61 if (!tmp) memory_full (); | |
62 return tmp; | |
63 } | |
64 | |
65 | |
66 static Lisp_Object | |
67 mark_popup_data (Lisp_Object obj) | |
68 { | |
69 struct popup_data *data = (struct popup_data *) XPOPUP_DATA (obj); | |
70 | |
1204 | 71 mark_object (data->last_menubar_buffer); |
72 return data->protect_me; | |
428 | 73 } |
74 | |
1204 | 75 static const struct memory_description popup_data_description [] = { |
76 { XD_LISP_OBJECT, offsetof (struct popup_data, last_menubar_buffer) }, | |
77 { XD_LISP_OBJECT, offsetof (struct popup_data, protect_me) }, | |
78 { XD_END } | |
79 }; | |
80 | |
934 | 81 DEFINE_LRECORD_IMPLEMENTATION ("popup-data", popup_data, |
82 0, /*dumpable-flag*/ | |
83 mark_popup_data, internal_object_printer, | |
1204 | 84 0, 0, 0, |
85 popup_data_description, | |
86 struct popup_data); | |
428 | 87 |
88 /* This is like FRAME_MENUBAR_DATA (f), but contains an alist of | |
89 (id . popup-data) for GCPRO'ing the callbacks of the popup menus | |
90 and dialog boxes. */ | |
91 static Lisp_Object Vpopup_callbacks; | |
92 | |
1204 | 93 static int |
94 snarf_widget_value_mapper (widget_value *val, void *closure) | |
95 { | |
96 struct popup_data *pdata = (struct popup_data *) closure; | |
97 | |
98 if (val->call_data) | |
99 pdata->protect_me = Fcons (VOID_TO_LISP (val->call_data), | |
100 pdata->protect_me); | |
101 if (val->accel) | |
102 pdata->protect_me = Fcons (VOID_TO_LISP (val->accel), | |
103 pdata->protect_me); | |
104 | |
105 return 0; | |
106 } | |
107 | |
428 | 108 void |
109 gcpro_popup_callbacks (LWLIB_ID id) | |
110 { | |
111 struct popup_data *pdata; | |
112 Lisp_Object lid = make_int (id); | |
113 Lisp_Object lpdata; | |
114 | |
115 assert (NILP (assq_no_quit (lid, Vpopup_callbacks))); | |
116 pdata = alloc_lcrecord_type (struct popup_data, &lrecord_popup_data); | |
117 pdata->id = id; | |
118 pdata->last_menubar_buffer = Qnil; | |
1204 | 119 pdata->protect_me = Qnil; |
428 | 120 pdata->menubar_contents_up_to_date = 0; |
793 | 121 lpdata = wrap_popup_data (pdata); |
1204 | 122 |
123 /* Now snarf the callbacks and such that are hidden in the lwlib | |
124 call-data and accel and stick them into the list for proper | |
125 marking. */ | |
126 | |
127 if (pdata->id) | |
128 lw_map_widget_values (pdata->id, snarf_widget_value_mapper, pdata); | |
129 | |
428 | 130 Vpopup_callbacks = Fcons (Fcons (lid, lpdata), Vpopup_callbacks); |
131 } | |
132 | |
133 void | |
134 ungcpro_popup_callbacks (LWLIB_ID id) | |
135 { | |
1204 | 136 struct popup_data *pdata; |
428 | 137 Lisp_Object lid = make_int (id); |
138 Lisp_Object this = assq_no_quit (lid, Vpopup_callbacks); | |
139 assert (!NILP (this)); | |
1204 | 140 pdata = XPOPUP_DATA (XCDR (this)); |
141 free_list (pdata->protect_me); | |
142 pdata->protect_me = Qnil; | |
428 | 143 Vpopup_callbacks = delq_no_quit (this, Vpopup_callbacks); |
144 } | |
145 | |
146 int | |
147 popup_handled_p (LWLIB_ID id) | |
148 { | |
149 return NILP (assq_no_quit (make_int (id), Vpopup_callbacks)); | |
150 } | |
151 | |
152 /* menu_item_descriptor_to_widget_value() et al. mallocs a | |
153 widget_value, but then may signal lisp errors. If an error does | |
154 not occur, the opaque ptr we have here has had its pointer set to 0 | |
155 to tell us not to do anything. Otherwise we free the widget value. | |
156 (This has nothing to do with GC, it's just about not dropping | |
157 pointers to malloc'd data when errors happen.) */ | |
158 | |
159 Lisp_Object | |
160 widget_value_unwind (Lisp_Object closure) | |
161 { | |
162 widget_value *wv = (widget_value *) get_opaque_ptr (closure); | |
163 free_opaque_ptr (closure); | |
164 if (wv) | |
436 | 165 free_widget_value_tree (wv); |
428 | 166 return Qnil; |
167 } | |
168 | |
169 #if 0 | |
170 static void | |
171 print_widget_value (widget_value *wv, int depth) | |
172 { | |
442 | 173 /* strings in wv are in external format; use printf not stdout_out |
174 because the latter takes internal-format strings */ | |
175 Extbyte d [200]; | |
428 | 176 int i; |
177 for (i = 0; i < depth; i++) d[i] = ' '; | |
178 d[depth]=0; | |
179 /* #### - print type field */ | |
180 printf ("%sname: %s\n", d, (wv->name ? wv->name : "(null)")); | |
181 if (wv->value) printf ("%svalue: %s\n", d, wv->value); | |
182 if (wv->key) printf ("%skey: %s\n", d, wv->key); | |
183 printf ("%senabled: %d\n", d, wv->enabled); | |
184 if (wv->contents) | |
185 { | |
186 printf ("\n%scontents: \n", d); | |
187 print_widget_value (wv->contents, depth + 5); | |
188 } | |
189 if (wv->next) | |
190 { | |
191 printf ("\n"); | |
192 print_widget_value (wv->next, depth); | |
193 } | |
194 } | |
195 #endif | |
196 | |
197 /* This recursively calls free_widget_value() on the tree of widgets. | |
198 It must free all data that was malloc'ed for these widget_values. | |
199 | |
200 It used to be that emacs only allocated new storage for the `key' slot. | |
201 All other slots are pointers into the data of Lisp_Strings, and must be | |
202 left alone. */ | |
203 void | |
204 free_popup_widget_value_tree (widget_value *wv) | |
205 { | |
206 if (! wv) return; | |
207 if (wv->key) xfree (wv->key); | |
208 if (wv->value) xfree (wv->value); | |
436 | 209 if (wv->name) xfree (wv->name); |
428 | 210 |
1204 | 211 wv->name = wv->value = wv->key = (char *) 0xDEADBEEF; /* -559038737 base 10*/ |
428 | 212 |
213 if (wv->contents && (wv->contents != (widget_value*)1)) | |
214 { | |
215 free_popup_widget_value_tree (wv->contents); | |
216 wv->contents = (widget_value *) 0xDEADBEEF; | |
217 } | |
218 if (wv->next) | |
219 { | |
220 free_popup_widget_value_tree (wv->next); | |
221 wv->next = (widget_value *) 0xDEADBEEF; | |
222 } | |
223 free_widget_value (wv); | |
224 } | |
225 | |
226 /* The following is actually called from somewhere within XtDispatchEvent(), | |
227 called from XtAppProcessEvent() in event-Xt.c */ | |
228 | |
229 void | |
230 popup_selection_callback (Widget widget, LWLIB_ID ignored_id, | |
231 XtPointer client_data) | |
232 { | |
442 | 233 Lisp_Object data, image_instance, callback, callback_ex; |
234 Lisp_Object frame, event; | |
235 int update_subwindows_p = 0; | |
428 | 236 struct device *d = get_device_from_display (XtDisplay (widget)); |
237 struct frame *f = x_any_widget_or_parent_to_frame (d, widget); | |
238 | |
872 | 239 #ifdef HAVE_MENUBARS |
428 | 240 /* set in lwlib to the time stamp associated with the most recent menu |
241 operation */ | |
242 extern Time x_focus_timestamp_really_sucks_fix_me_better; | |
872 | 243 #endif |
428 | 244 |
245 if (!f) | |
246 return; | |
247 if (((EMACS_INT) client_data) == 0) | |
248 return; | |
826 | 249 data = VOID_TO_LISP (client_data); |
793 | 250 frame = wrap_frame (f); |
428 | 251 |
252 #if 0 | |
253 /* #### What the hell? I can't understand why this call is here, | |
254 and doing it is really courting disaster in the new event | |
255 model, since popup_selection_callback is called from | |
256 within next_event_internal() and Faccept_process_output() | |
257 itself calls next_event_internal(). --Ben */ | |
258 | |
259 /* Flush the X and process input */ | |
260 Faccept_process_output (Qnil, Qnil, Qnil); | |
261 #endif | |
262 | |
263 if (((EMACS_INT) client_data) == -1) | |
264 { | |
442 | 265 event = Fmake_event (Qnil, Qnil); |
266 | |
934 | 267 XSET_EVENT_TYPE (event, misc_user_event); |
268 XSET_EVENT_CHANNEL (event, frame); | |
1204 | 269 XSET_EVENT_MISC_USER_FUNCTION (event, Qrun_hooks); |
270 XSET_EVENT_MISC_USER_OBJECT (event, Qmenu_no_selection_hook); | |
428 | 271 } |
272 else | |
273 { | |
442 | 274 image_instance = XCAR (data); |
275 callback = XCAR (XCDR (data)); | |
276 callback_ex = XCDR (XCDR (data)); | |
277 update_subwindows_p = 1; | |
278 /* It is possible for a widget action to cause it to get out of | |
279 sync with its instantiator. Thus it is necessary to signal | |
280 this possibility. */ | |
281 if (IMAGE_INSTANCEP (image_instance)) | |
282 XIMAGE_INSTANCE_WIDGET_ACTION_OCCURRED (image_instance) = 1; | |
283 | |
284 if (!NILP (callback_ex) && !UNBOUNDP (callback_ex)) | |
285 { | |
286 event = Fmake_event (Qnil, Qnil); | |
287 | |
934 | 288 XSET_EVENT_TYPE (event, misc_user_event); |
289 XSET_EVENT_CHANNEL (event, frame); | |
1204 | 290 XSET_EVENT_MISC_USER_FUNCTION (event, Qeval); |
291 XSET_EVENT_MISC_USER_OBJECT (event, list4 (Qfuncall, callback_ex, image_instance, event)); | |
442 | 292 } |
293 else if (NILP (callback) || UNBOUNDP (callback)) | |
294 event = Qnil; | |
295 else | |
296 { | |
297 Lisp_Object fn, arg; | |
298 | |
299 event = Fmake_event (Qnil, Qnil); | |
300 | |
301 get_gui_callback (callback, &fn, &arg); | |
934 | 302 XSET_EVENT_TYPE (event, misc_user_event); |
303 XSET_EVENT_CHANNEL (event, frame); | |
1204 | 304 XSET_EVENT_MISC_USER_FUNCTION (event, fn); |
305 XSET_EVENT_MISC_USER_OBJECT (event, arg); | |
442 | 306 } |
428 | 307 } |
308 | |
309 /* This is the timestamp used for asserting focus so we need to get an | |
444 | 310 up-to-date value event if no events have been dispatched to emacs |
428 | 311 */ |
872 | 312 #ifdef HAVE_MENUBARS |
428 | 313 DEVICE_X_MOUSE_TIMESTAMP (d) = x_focus_timestamp_really_sucks_fix_me_better; |
314 #else | |
315 DEVICE_X_MOUSE_TIMESTAMP (d) = DEVICE_X_GLOBAL_MOUSE_TIMESTAMP (d); | |
316 #endif | |
442 | 317 if (!NILP (event)) |
1204 | 318 enqueue_dispatch_event (event); |
442 | 319 /* The result of this evaluation could cause other instances to change so |
320 enqueue an update callback to check this. */ | |
321 if (update_subwindows_p && !NILP (event)) | |
322 enqueue_magic_eval_event (update_widget_instances, frame); | |
428 | 323 } |
324 | |
325 #if 1 | |
326 /* Eval the activep slot of the menu item */ | |
327 # define wv_set_evalable_slot(slot,form) do { \ | |
328 Lisp_Object wses_form = (form); \ | |
329 (slot) = (NILP (wses_form) ? 0 : \ | |
330 EQ (wses_form, Qt) ? 1 : \ | |
331 !NILP (Feval (wses_form))); \ | |
332 } while (0) | |
333 #else | |
334 /* Treat the activep slot of the menu item as a boolean */ | |
335 # define wv_set_evalable_slot(slot,form) \ | |
336 ((void) (slot = (!NILP (form)))) | |
337 #endif | |
338 | |
442 | 339 Extbyte * |
867 | 340 menu_separator_style_and_to_external (const Ibyte *s) |
428 | 341 { |
867 | 342 const Ibyte *p; |
343 Ibyte first; | |
428 | 344 |
345 if (!s || s[0] == '\0') | |
346 return NULL; | |
347 first = s[0]; | |
348 if (first != '-' && first != '=') | |
349 return NULL; | |
350 for (p = s; *p == first; p++) | |
351 DO_NOTHING; | |
352 | |
353 /* #### - cannot currently specify a separator tag "--!tag" and a | |
354 separator style "--:style" at the same time. */ | |
355 /* #### - Also, the motif menubar code doesn't deal with the | |
356 double etched style yet, so it's not good to get into the habit of | |
357 using "===" in menubars to get double-etched lines */ | |
358 if (*p == '!' || *p == '\0') | |
359 return ((first == '-') | |
360 ? NULL /* single etched is the default */ | |
361 : xstrdup ("shadowDoubleEtchedIn")); | |
362 else if (*p == ':') | |
442 | 363 { |
364 Extbyte *retval; | |
365 | |
366 C_STRING_TO_EXTERNAL_MALLOC (p + 1, retval, Qlwlib_encoding); | |
367 return retval; | |
368 } | |
428 | 369 |
370 return NULL; | |
371 } | |
372 | |
442 | 373 Extbyte * |
374 add_accel_and_to_external (Lisp_Object string) | |
375 { | |
376 int i; | |
377 int found_accel = 0; | |
378 Extbyte *retval; | |
867 | 379 Ibyte *name = XSTRING_DATA (string); |
442 | 380 |
381 for (i = 0; name[i]; ++i) | |
382 if (name[i] == '%' && name[i+1] == '_') | |
383 { | |
384 found_accel = 1; | |
385 break; | |
386 } | |
387 | |
388 if (found_accel) | |
389 LISP_STRING_TO_EXTERNAL_MALLOC (string, retval, Qlwlib_encoding); | |
390 else | |
391 { | |
647 | 392 Bytecount namelen = XSTRING_LENGTH (string); |
867 | 393 Ibyte *chars = (Ibyte *) ALLOCA (namelen + 3); |
442 | 394 chars[0] = '%'; |
395 chars[1] = '_'; | |
396 memcpy (chars + 2, name, namelen + 1); | |
397 C_STRING_TO_EXTERNAL_MALLOC (chars, retval, Qlwlib_encoding); | |
398 } | |
399 | |
400 return retval; | |
401 } | |
428 | 402 |
853 | 403 /* This does the dirty work. GC is inhibited when this is called. |
404 */ | |
428 | 405 int |
442 | 406 button_item_to_widget_value (Lisp_Object gui_object_instance, |
407 Lisp_Object gui_item, widget_value *wv, | |
408 int allow_text_field_p, int no_keys_p, | |
409 int menu_entry_p, int accel_p) | |
428 | 410 { |
853 | 411 /* This function cannot GC because GC is inhibited when it's called */ |
440 | 412 Lisp_Gui_Item* pgui = 0; |
428 | 413 |
414 /* degenerate case */ | |
415 if (STRINGP (gui_item)) | |
416 { | |
417 wv->type = TEXT_TYPE; | |
442 | 418 if (accel_p) |
419 wv->name = add_accel_and_to_external (gui_item); | |
420 else | |
421 LISP_STRING_TO_EXTERNAL_MALLOC (gui_item, wv->name, Qlwlib_encoding); | |
428 | 422 return 1; |
423 } | |
424 else if (!GUI_ITEMP (gui_item)) | |
563 | 425 invalid_argument ("need a string or a gui_item here", gui_item); |
428 | 426 |
427 pgui = XGUI_ITEM (gui_item); | |
428 | |
429 if (!NILP (pgui->filter)) | |
563 | 430 sferror (":filter keyword not permitted on leaf nodes", gui_item); |
428 | 431 |
432 #ifdef HAVE_MENUBARS | |
442 | 433 if (menu_entry_p && !gui_item_included_p (gui_item, Vmenubar_configuration)) |
428 | 434 { |
435 /* the include specification says to ignore this item. */ | |
436 return 0; | |
437 } | |
438 #endif /* HAVE_MENUBARS */ | |
439 | |
442 | 440 if (!STRINGP (pgui->name)) |
441 pgui->name = Feval (pgui->name); | |
442 | |
428 | 443 CHECK_STRING (pgui->name); |
442 | 444 if (accel_p) |
445 { | |
446 wv->name = add_accel_and_to_external (pgui->name); | |
447 wv->accel = LISP_TO_VOID (gui_item_accelerator (gui_item)); | |
448 } | |
449 else | |
450 { | |
451 LISP_STRING_TO_EXTERNAL_MALLOC (pgui->name, wv->name, Qlwlib_encoding); | |
452 wv->accel = LISP_TO_VOID (Qnil); | |
453 } | |
428 | 454 |
455 if (!NILP (pgui->suffix)) | |
456 { | |
457 Lisp_Object suffix2; | |
458 | |
459 /* Shortcut to avoid evaluating suffix each time */ | |
460 if (STRINGP (pgui->suffix)) | |
461 suffix2 = pgui->suffix; | |
462 else | |
463 { | |
464 suffix2 = Feval (pgui->suffix); | |
465 CHECK_STRING (suffix2); | |
466 } | |
467 | |
442 | 468 LISP_STRING_TO_EXTERNAL_MALLOC (suffix2, wv->value, Qlwlib_encoding); |
428 | 469 } |
470 | |
471 wv_set_evalable_slot (wv->enabled, pgui->active); | |
472 wv_set_evalable_slot (wv->selected, pgui->selected); | |
473 | |
442 | 474 if (!NILP (pgui->callback) || !NILP (pgui->callback_ex)) |
475 wv->call_data = LISP_TO_VOID (cons3 (gui_object_instance, | |
476 pgui->callback, | |
477 pgui->callback_ex)); | |
428 | 478 |
479 if (no_keys_p | |
480 #ifdef HAVE_MENUBARS | |
442 | 481 || (menu_entry_p && !menubar_show_keybindings) |
428 | 482 #endif |
483 ) | |
484 wv->key = 0; | |
485 else if (!NILP (pgui->keys)) /* Use this string to generate key bindings */ | |
486 { | |
487 CHECK_STRING (pgui->keys); | |
488 pgui->keys = Fsubstitute_command_keys (pgui->keys); | |
489 if (XSTRING_LENGTH (pgui->keys) > 0) | |
442 | 490 LISP_STRING_TO_EXTERNAL_MALLOC (pgui->keys, wv->key, Qlwlib_encoding); |
428 | 491 else |
492 wv->key = 0; | |
493 } | |
494 else if (SYMBOLP (pgui->callback)) /* Show the binding of this command. */ | |
495 { | |
793 | 496 DECLARE_EISTRING_MALLOC (buf); |
428 | 497 /* #### Warning, dependency here on current_buffer and point */ |
498 where_is_to_char (pgui->callback, buf); | |
793 | 499 if (eilen (buf) > 0) |
500 C_STRING_TO_EXTERNAL_MALLOC (eidata (buf), wv->key, Qlwlib_encoding); | |
428 | 501 else |
502 wv->key = 0; | |
793 | 503 eifree (buf); |
428 | 504 } |
505 | |
506 CHECK_SYMBOL (pgui->style); | |
507 if (NILP (pgui->style)) | |
508 { | |
867 | 509 Ibyte *intname; |
444 | 510 Bytecount intlen; |
428 | 511 /* If the callback is nil, treat this item like unselectable text. |
512 This way, dashes will show up as a separator. */ | |
513 if (!wv->enabled) | |
514 wv->type = BUTTON_TYPE; | |
444 | 515 TO_INTERNAL_FORMAT (C_STRING, wv->name, |
516 ALLOCA, (intname, intlen), | |
517 Qlwlib_encoding); | |
442 | 518 if (separator_string_p (intname)) |
428 | 519 { |
520 wv->type = SEPARATOR_TYPE; | |
442 | 521 wv->value = menu_separator_style_and_to_external (intname); |
428 | 522 } |
523 else | |
524 { | |
525 #if 0 | |
526 /* #### - this is generally desirable for menubars, but it breaks | |
527 a package that uses dialog boxes and next_command_event magic | |
528 to use the callback slot in dialog buttons for data instead of | |
529 a real callback. | |
530 | |
531 Code is data, right? The beauty of LISP abuse. --Stig */ | |
532 if (NILP (callback)) | |
533 wv->type = TEXT_TYPE; | |
534 else | |
535 #endif | |
536 wv->type = BUTTON_TYPE; | |
537 } | |
538 } | |
539 else if (EQ (pgui->style, Qbutton)) | |
540 wv->type = BUTTON_TYPE; | |
541 else if (EQ (pgui->style, Qtoggle)) | |
542 wv->type = TOGGLE_TYPE; | |
543 else if (EQ (pgui->style, Qradio)) | |
544 wv->type = RADIO_TYPE; | |
545 else if (EQ (pgui->style, Qtext)) | |
546 { | |
547 wv->type = TEXT_TYPE; | |
548 #if 0 | |
549 wv->value = wv->name; | |
550 wv->name = "value"; | |
551 #endif | |
552 } | |
553 else | |
563 | 554 invalid_constant_2 ("Unknown style", pgui->style, gui_item); |
428 | 555 |
556 if (!allow_text_field_p && (wv->type == TEXT_TYPE)) | |
563 | 557 sferror ("Text field not allowed in this context", gui_item); |
428 | 558 |
559 if (!NILP (pgui->selected) && EQ (pgui->style, Qtext)) | |
563 | 560 sferror |
442 | 561 (":selected only makes sense with :style toggle, radio or button", |
562 gui_item); | |
428 | 563 return 1; |
564 } | |
565 | |
566 /* parse tree's of gui items into widget_value hierarchies */ | |
442 | 567 static void gui_item_children_to_widget_values (Lisp_Object |
568 gui_object_instance, | |
569 Lisp_Object items, | |
570 widget_value* parent, | |
571 int accel_p); | |
428 | 572 |
573 static widget_value * | |
442 | 574 gui_items_to_widget_values_1 (Lisp_Object gui_object_instance, |
575 Lisp_Object items, widget_value* parent, | |
576 widget_value* prev, int accel_p) | |
428 | 577 { |
578 widget_value* wv = 0; | |
579 | |
580 assert ((parent || prev) && !(parent && prev)); | |
581 /* now walk the tree creating widget_values as appropriate */ | |
582 if (!CONSP (items)) | |
583 { | |
442 | 584 wv = xmalloc_widget_value (); |
428 | 585 if (parent) |
586 parent->contents = wv; | |
440 | 587 else |
428 | 588 prev->next = wv; |
442 | 589 if (!button_item_to_widget_value (gui_object_instance, |
590 items, wv, 0, 1, 0, accel_p)) | |
428 | 591 { |
436 | 592 free_widget_value_tree (wv); |
428 | 593 if (parent) |
594 parent->contents = 0; | |
440 | 595 else |
428 | 596 prev->next = 0; |
597 } | |
440 | 598 else |
442 | 599 wv->value = xstrdup (wv->name); /* what a mess... */ |
428 | 600 } |
601 else | |
602 { | |
603 /* first one is the parent */ | |
604 if (CONSP (XCAR (items))) | |
563 | 605 sferror ("parent item must not be a list", XCAR (items)); |
428 | 606 |
607 if (parent) | |
442 | 608 wv = gui_items_to_widget_values_1 (gui_object_instance, |
609 XCAR (items), parent, 0, accel_p); | |
428 | 610 else |
442 | 611 wv = gui_items_to_widget_values_1 (gui_object_instance, |
612 XCAR (items), 0, prev, accel_p); | |
428 | 613 /* the rest are the children */ |
442 | 614 gui_item_children_to_widget_values (gui_object_instance, |
615 XCDR (items), wv, accel_p); | |
428 | 616 } |
617 return wv; | |
618 } | |
619 | |
620 static void | |
442 | 621 gui_item_children_to_widget_values (Lisp_Object gui_object_instance, |
622 Lisp_Object items, widget_value* parent, | |
623 int accel_p) | |
428 | 624 { |
625 widget_value* wv = 0, *prev = 0; | |
626 Lisp_Object rest; | |
627 CHECK_CONS (items); | |
628 | |
629 /* first one is master */ | |
442 | 630 prev = gui_items_to_widget_values_1 (gui_object_instance, XCAR (items), |
631 parent, 0, accel_p); | |
428 | 632 /* the rest are the children */ |
633 LIST_LOOP (rest, XCDR (items)) | |
634 { | |
635 Lisp_Object tab = XCAR (rest); | |
442 | 636 wv = gui_items_to_widget_values_1 (gui_object_instance, tab, 0, prev, |
637 accel_p); | |
428 | 638 prev = wv; |
639 } | |
640 } | |
641 | |
642 widget_value * | |
442 | 643 gui_items_to_widget_values (Lisp_Object gui_object_instance, Lisp_Object items, |
644 int accel_p) | |
428 | 645 { |
646 /* This function can GC */ | |
647 widget_value *control = 0, *tmp = 0; | |
771 | 648 int count; |
428 | 649 Lisp_Object wv_closure; |
650 | |
651 if (NILP (items)) | |
563 | 652 sferror ("must have some items", items); |
428 | 653 |
654 /* Inhibit GC during this conversion. The reasons for this are | |
655 the same as in menu_item_descriptor_to_widget_value(); see | |
656 the large comment above that function. */ | |
771 | 657 count = begin_gc_forbidden (); |
428 | 658 |
659 /* Also make sure that we free the partially-created widget_value | |
660 tree on Lisp error. */ | |
442 | 661 control = xmalloc_widget_value (); |
428 | 662 wv_closure = make_opaque_ptr (control); |
663 record_unwind_protect (widget_value_unwind, wv_closure); | |
664 | |
442 | 665 gui_items_to_widget_values_1 (gui_object_instance, items, control, 0, |
666 accel_p); | |
428 | 667 |
668 /* mess about getting the data we really want */ | |
669 tmp = control; | |
670 control = control->contents; | |
671 tmp->next = 0; | |
672 tmp->contents = 0; | |
436 | 673 free_widget_value_tree (tmp); |
428 | 674 |
675 /* No more need to free the half-filled-in structures. */ | |
676 set_opaque_ptr (wv_closure, 0); | |
771 | 677 unbind_to (count); |
428 | 678 |
679 return control; | |
680 } | |
681 | |
682 void | |
683 syms_of_gui_x (void) | |
684 { | |
442 | 685 INIT_LRECORD_IMPLEMENTATION (popup_data); |
428 | 686 } |
687 | |
688 void | |
689 reinit_vars_of_gui_x (void) | |
690 { | |
691 lwlib_id_tick = (1<<16); /* start big, to not conflict with Energize */ | |
692 #ifdef HAVE_POPUPS | |
693 popup_up_p = 0; | |
694 #endif | |
695 } | |
696 | |
697 void | |
698 vars_of_gui_x (void) | |
699 { | |
700 reinit_vars_of_gui_x (); | |
701 | |
702 Vpopup_callbacks = Qnil; | |
703 staticpro (&Vpopup_callbacks); | |
704 } |