annotate src/gui.c @ 5127:a9c41067dd88 ben-lisp-object

more cleanups, terminology clarification, lots of doc work -------------------- ChangeLog entries follow: -------------------- man/ChangeLog addition: 2010-03-05 Ben Wing <ben@xemacs.org> * internals/internals.texi (Introduction to Allocation): * internals/internals.texi (Integers and Characters): * internals/internals.texi (Allocation from Frob Blocks): * internals/internals.texi (lrecords): * internals/internals.texi (Low-level allocation): Rewrite section on allocation of Lisp objects to reflect the new reality. Remove references to nonexistent XSETINT and XSETCHAR. modules/ChangeLog addition: 2010-03-05 Ben Wing <ben@xemacs.org> * postgresql/postgresql.c (allocate_pgconn): * postgresql/postgresql.c (allocate_pgresult): * postgresql/postgresql.h (struct Lisp_PGconn): * postgresql/postgresql.h (struct Lisp_PGresult): * ldap/eldap.c (allocate_ldap): * ldap/eldap.h (struct Lisp_LDAP): Same changes as in src/ dir. See large log there in ChangeLog, but basically: ALLOC_LISP_OBJECT -> ALLOC_NORMAL_LISP_OBJECT LISP_OBJECT_HEADER -> NORMAL_LISP_OBJECT_HEADER ../hlo/src/ChangeLog addition: 2010-03-05 Ben Wing <ben@xemacs.org> * alloc.c: * alloc.c (old_alloc_sized_lcrecord): * alloc.c (very_old_free_lcrecord): * alloc.c (copy_lisp_object): * alloc.c (zero_sized_lisp_object): * alloc.c (zero_nonsized_lisp_object): * alloc.c (lisp_object_storage_size): * alloc.c (free_normal_lisp_object): * alloc.c (FREE_FIXED_TYPE_WHEN_NOT_IN_GC): * alloc.c (ALLOC_FROB_BLOCK_LISP_OBJECT): * alloc.c (Fcons): * alloc.c (noseeum_cons): * alloc.c (make_float): * alloc.c (make_bignum): * alloc.c (make_bignum_bg): * alloc.c (make_ratio): * alloc.c (make_ratio_bg): * alloc.c (make_ratio_rt): * alloc.c (make_bigfloat): * alloc.c (make_bigfloat_bf): * alloc.c (size_vector): * alloc.c (make_compiled_function): * alloc.c (Fmake_symbol): * alloc.c (allocate_extent): * alloc.c (allocate_event): * 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 (Fmake_marker): * alloc.c (noseeum_make_marker): * alloc.c (size_string_direct_data): * alloc.c (make_uninit_string): * alloc.c (make_string_nocopy): * alloc.c (mark_lcrecord_list): * alloc.c (alloc_managed_lcrecord): * alloc.c (free_managed_lcrecord): * alloc.c (sweep_lcrecords_1): * alloc.c (malloced_storage_size): * buffer.c (allocate_buffer): * buffer.c (compute_buffer_usage): * buffer.c (DEFVAR_BUFFER_LOCAL_1): * buffer.c (nuke_all_buffer_slots): * buffer.c (common_init_complex_vars_of_buffer): * buffer.h (struct buffer_text): * buffer.h (struct buffer): * bytecode.c: * bytecode.c (make_compiled_function_args): * bytecode.c (size_compiled_function_args): * bytecode.h (struct compiled_function_args): * casetab.c (allocate_case_table): * casetab.h (struct Lisp_Case_Table): * charset.h (struct Lisp_Charset): * chartab.c (fill_char_table): * chartab.c (Fmake_char_table): * chartab.c (make_char_table_entry): * chartab.c (copy_char_table_entry): * chartab.c (Fcopy_char_table): * chartab.c (put_char_table): * chartab.h (struct Lisp_Char_Table_Entry): * chartab.h (struct Lisp_Char_Table): * console-gtk-impl.h (struct gtk_device): * console-gtk-impl.h (struct gtk_frame): * console-impl.h (struct console): * console-msw-impl.h (struct Lisp_Devmode): * console-msw-impl.h (struct mswindows_device): * console-msw-impl.h (struct msprinter_device): * console-msw-impl.h (struct mswindows_frame): * console-msw-impl.h (struct mswindows_dialog_id): * console-stream-impl.h (struct stream_console): * console-stream.c (stream_init_console): * console-tty-impl.h (struct tty_console): * console-tty-impl.h (struct tty_device): * console-tty.c (allocate_tty_console_struct): * console-x-impl.h (struct x_device): * console-x-impl.h (struct x_frame): * console.c (allocate_console): * console.c (nuke_all_console_slots): * console.c (DEFVAR_CONSOLE_LOCAL_1): * console.c (common_init_complex_vars_of_console): * data.c (make_weak_list): * data.c (make_weak_box): * data.c (make_ephemeron): * database.c: * database.c (struct Lisp_Database): * database.c (allocate_database): * database.c (finalize_database): * device-gtk.c (allocate_gtk_device_struct): * device-impl.h (struct device): * device-msw.c: * device-msw.c (mswindows_init_device): * device-msw.c (msprinter_init_device): * device-msw.c (finalize_devmode): * device-msw.c (allocate_devmode): * device-tty.c (allocate_tty_device_struct): * device-x.c (allocate_x_device_struct): * device.c: * device.c (nuke_all_device_slots): * device.c (allocate_device): * dialog-msw.c (handle_question_dialog_box): * elhash.c: * elhash.c (struct Lisp_Hash_Table): * elhash.c (finalize_hash_table): * elhash.c (make_general_lisp_hash_table): * elhash.c (Fcopy_hash_table): * elhash.h (htentry): * emacs.c (main_1): * eval.c: * eval.c (size_multiple_value): * event-stream.c (finalize_command_builder): * event-stream.c (allocate_command_builder): * event-stream.c (free_command_builder): * event-stream.c (event_stream_generate_wakeup): * event-stream.c (event_stream_resignal_wakeup): * event-stream.c (event_stream_disable_wakeup): * event-stream.c (event_stream_wakeup_pending_p): * events.h (struct Lisp_Timeout): * events.h (struct command_builder): * extents-impl.h: * extents-impl.h (struct extent_auxiliary): * extents-impl.h (struct extent_info): * extents-impl.h (set_extent_no_chase_aux_field): * extents-impl.h (set_extent_no_chase_normal_field): * extents.c: * extents.c (gap_array_marker): * extents.c (gap_array): * extents.c (extent_list_marker): * extents.c (extent_list): * extents.c (stack_of_extents): * extents.c (gap_array_make_marker): * extents.c (extent_list_make_marker): * extents.c (allocate_extent_list): * extents.c (SLOT): * extents.c (mark_extent_auxiliary): * extents.c (allocate_extent_auxiliary): * extents.c (attach_extent_auxiliary): * extents.c (size_gap_array): * extents.c (finalize_extent_info): * extents.c (allocate_extent_info): * extents.c (uninit_buffer_extents): * extents.c (allocate_soe): * extents.c (copy_extent): * extents.c (vars_of_extents): * extents.h: * faces.c (allocate_face): * faces.h (struct Lisp_Face): * faces.h (struct face_cachel): * file-coding.c: * file-coding.c (finalize_coding_system): * file-coding.c (sizeof_coding_system): * file-coding.c (Fcopy_coding_system): * file-coding.h (struct Lisp_Coding_System): * file-coding.h (MARKED_SLOT): * fns.c (size_bit_vector): * font-mgr.c: * font-mgr.c (finalize_fc_pattern): * font-mgr.c (print_fc_pattern): * font-mgr.c (Ffc_pattern_p): * font-mgr.c (Ffc_pattern_create): * font-mgr.c (Ffc_name_parse): * font-mgr.c (Ffc_name_unparse): * font-mgr.c (Ffc_pattern_duplicate): * font-mgr.c (Ffc_pattern_add): * font-mgr.c (Ffc_pattern_del): * font-mgr.c (Ffc_pattern_get): * font-mgr.c (fc_config_create_using): * font-mgr.c (fc_strlist_to_lisp_using): * font-mgr.c (fontset_to_list): * font-mgr.c (Ffc_config_p): * font-mgr.c (Ffc_config_up_to_date): * font-mgr.c (Ffc_config_build_fonts): * font-mgr.c (Ffc_config_get_cache): * font-mgr.c (Ffc_config_get_fonts): * font-mgr.c (Ffc_config_set_current): * font-mgr.c (Ffc_config_get_blanks): * font-mgr.c (Ffc_config_get_rescan_interval): * font-mgr.c (Ffc_config_set_rescan_interval): * font-mgr.c (Ffc_config_app_font_add_file): * font-mgr.c (Ffc_config_app_font_add_dir): * font-mgr.c (Ffc_config_app_font_clear): * font-mgr.c (size): * font-mgr.c (Ffc_config_substitute): * font-mgr.c (Ffc_font_render_prepare): * font-mgr.c (Ffc_font_match): * font-mgr.c (Ffc_font_sort): * font-mgr.c (finalize_fc_config): * font-mgr.c (print_fc_config): * font-mgr.h: * font-mgr.h (struct fc_pattern): * font-mgr.h (XFC_PATTERN): * font-mgr.h (struct fc_config): * font-mgr.h (XFC_CONFIG): * frame-gtk.c (allocate_gtk_frame_struct): * frame-impl.h (struct frame): * frame-msw.c (mswindows_init_frame_1): * frame-x.c (allocate_x_frame_struct): * frame.c (nuke_all_frame_slots): * frame.c (allocate_frame_core): * gc.c: * gc.c (GC_CHECK_NOT_FREE): * glyphs.c (finalize_image_instance): * glyphs.c (allocate_image_instance): * glyphs.c (Fcolorize_image_instance): * glyphs.c (allocate_glyph): * glyphs.c (unmap_subwindow_instance_cache_mapper): * glyphs.c (register_ignored_expose): * glyphs.h (struct Lisp_Image_Instance): * glyphs.h (struct Lisp_Glyph): * glyphs.h (struct glyph_cachel): * glyphs.h (struct expose_ignore): * gui.c (allocate_gui_item): * gui.h (struct Lisp_Gui_Item): * keymap.c (struct Lisp_Keymap): * keymap.c (make_keymap): * lisp.h: * lisp.h (struct Lisp_String_Direct_Data): * lisp.h (struct Lisp_String_Indirect_Data): * lisp.h (struct Lisp_Vector): * lisp.h (struct Lisp_Bit_Vector): * lisp.h (DECLARE_INLINE_LISP_BIT_VECTOR): * lisp.h (struct weak_box): * lisp.h (struct ephemeron): * lisp.h (struct weak_list): * lrecord.h: * lrecord.h (struct lrecord_implementation): * lrecord.h (MC_ALLOC_CALL_FINALIZER): * lrecord.h (struct lcrecord_list): * lstream.c (finalize_lstream): * lstream.c (sizeof_lstream): * lstream.c (Lstream_new): * lstream.c (Lstream_delete): * lstream.h (struct lstream): * marker.c: * marker.c (finalize_marker): * marker.c (compute_buffer_marker_usage): * mule-charset.c: * mule-charset.c (make_charset): * mule-charset.c (compute_charset_usage): * objects-impl.h (struct Lisp_Color_Instance): * objects-impl.h (struct Lisp_Font_Instance): * objects-tty-impl.h (struct tty_color_instance_data): * objects-tty-impl.h (struct tty_font_instance_data): * objects-tty.c (tty_initialize_color_instance): * objects-tty.c (tty_initialize_font_instance): * objects.c (finalize_color_instance): * objects.c (Fmake_color_instance): * objects.c (finalize_font_instance): * objects.c (Fmake_font_instance): * objects.c (reinit_vars_of_objects): * opaque.c: * opaque.c (sizeof_opaque): * opaque.c (make_opaque_ptr): * opaque.c (free_opaque_ptr): * opaque.h: * opaque.h (Lisp_Opaque): * opaque.h (Lisp_Opaque_Ptr): * print.c (printing_unreadable_lcrecord): * print.c (external_object_printer): * print.c (debug_p4): * process.c (finalize_process): * process.c (make_process_internal): * procimpl.h (struct Lisp_Process): * rangetab.c (Fmake_range_table): * rangetab.c (Fcopy_range_table): * rangetab.h (struct Lisp_Range_Table): * scrollbar.c: * scrollbar.c (create_scrollbar_instance): * scrollbar.c (compute_scrollbar_instance_usage): * scrollbar.h (struct scrollbar_instance): * specifier.c (finalize_specifier): * specifier.c (sizeof_specifier): * specifier.c (set_specifier_caching): * specifier.h (struct Lisp_Specifier): * specifier.h (struct specifier_caching): * symeval.h: * symeval.h (SYMBOL_VALUE_MAGIC_P): * symeval.h (DEFVAR_SYMVAL_FWD): * symsinit.h: * syntax.c (init_buffer_syntax_cache): * syntax.h (struct syntax_cache): * toolbar.c: * toolbar.c (allocate_toolbar_button): * toolbar.c (update_toolbar_button): * toolbar.h (struct toolbar_button): * tooltalk.c (struct Lisp_Tooltalk_Message): * tooltalk.c (make_tooltalk_message): * tooltalk.c (struct Lisp_Tooltalk_Pattern): * tooltalk.c (make_tooltalk_pattern): * ui-gtk.c: * ui-gtk.c (allocate_ffi_data): * ui-gtk.c (emacs_gtk_object_finalizer): * ui-gtk.c (allocate_emacs_gtk_object_data): * ui-gtk.c (allocate_emacs_gtk_boxed_data): * ui-gtk.h: * window-impl.h (struct window): * window-impl.h (struct window_mirror): * window.c (finalize_window): * window.c (allocate_window): * window.c (new_window_mirror): * window.c (mark_window_as_deleted): * window.c (make_dummy_parent): * window.c (compute_window_mirror_usage): * window.c (compute_window_usage): Overall point of this change and previous ones in this repository: (1) Introduce new, clearer terminology: everything other than int or char is a "record" object, which comes in two types: "normal objects" and "frob-block objects". Fix up all places that referred to frob-block objects as "simple", "basic", etc. (2) Provide an advertised interface for doing operations on Lisp objects, including creating new types, that is clean and consistent in its naming, uses the above-referenced terms and avoids referencing "lrecords", "old lcrecords", etc., which should hide under the surface. (3) Make the size_in_bytes and finalizer methods take a Lisp_Object rather than a void * for consistency with other methods. (4) Separate finalizer method into finalizer and disksaver, so that normal finalize methods don't have to worry about disksaving. Other specifics: (1) Renaming: LISP_OBJECT_HEADER -> NORMAL_LISP_OBJECT_HEADER ALLOC_LISP_OBJECT -> ALLOC_NORMAL_LISP_OBJECT implementation->basic_p -> implementation->frob_block_p ALLOCATE_FIXED_TYPE_AND_SET_IMPL -> ALLOC_FROB_BLOCK_LISP_OBJECT *FCCONFIG*, wrap_fcconfig -> *FC_CONFIG*, wrap_fc_config *FCPATTERN*, wrap_fcpattern -> *FC_PATTERN*, wrap_fc_pattern (the last two changes make the naming of these macros consistent with the naming of all other macros, since the objects are named fc-config and fc-pattern with a hyphen) (2) Lots of documentation fixes in lrecord.h. (3) Eliminate macros for copying, freeing, zeroing objects, getting their storage size. Instead, new functions: zero_sized_lisp_object() zero_nonsized_lisp_object() lisp_object_storage_size() free_normal_lisp_object() (copy_lisp_object() already exists) LISP_OBJECT_FROB_BLOCK_P() (actually a macro) Eliminated: free_lrecord() zero_lrecord() copy_lrecord() copy_sized_lrecord() old_copy_lcrecord() old_copy_sized_lcrecord() old_zero_lcrecord() old_zero_sized_lcrecord() LISP_OBJECT_STORAGE_SIZE() COPY_SIZED_LISP_OBJECT() COPY_SIZED_LCRECORD() COPY_LISP_OBJECT() ZERO_LISP_OBJECT() FREE_LISP_OBJECT() (4) Catch the remaining places where lrecord stuff was used directly and use the advertised interface, e.g. alloc_sized_lrecord() -> ALLOC_SIZED_LISP_OBJECT(). (5) Make certain statically-declared pseudo-objects (buffer_local_flags, console_local_flags) have their lheader initialized correctly, so things like copy_lisp_object() can work on them. Make extent_auxiliary_defaults a proper heap object Vextent_auxiliary_defaults, and make extent auxiliaries dumpable so that this object can be dumped. allocate_extent_auxiliary() now just creates the object, and attach_extent_auxiliary() creates an extent auxiliary and attaches to an extent, like the old allocate_extent_auxiliary(). (6) Create EXTENT_AUXILIARY_SLOTS macro, similar to the foo-slots.h files but in a macro instead of a file. The purpose is to avoid duplication when iterating over all the slots in an extent auxiliary. Use it. (7) In lstream.c, don't zero out object after allocation because allocation routines take care of this. (8) In marker.c, fix a mistake in computing marker overhead. (9) In print.c, clean up printing_unreadable_lcrecord(), external_object_printer() to avoid lots of ifdef NEW_GC's. (10) Separate toolbar-button allocation into a separate allocate_toolbar_button() function for use in the example code in lrecord.h.
author Ben Wing <ben@xemacs.org>
date Fri, 05 Mar 2010 04:08:17 -0600
parents b5df3737028a
children f965e31a35f0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* Generic GUI code. (menubars, scrollbars, toolbars, dialogs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1995 Board of Trustees, University of Illinois.
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
3 Copyright (C) 1995, 1996, 2000, 2001, 2002, 2003 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 Copyright (C) 1995 Sun Microsystems, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 Copyright (C) 1998 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
26 /* This file Mule-ized by Ben Wing, 3-24-02. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
27
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 #include "lisp.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
30
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
31 #include "buffer.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #include "bytecode.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
33 #include "elhash.h"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
34 #include "gui.h"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
35 #include "menubar.h"
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
36 #include "redisplay.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
38 Lisp_Object Qmenu_no_selection_hook;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
39 Lisp_Object Vmenu_no_selection_hook;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 static Lisp_Object parse_gui_item_tree_list (Lisp_Object list);
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
42 Lisp_Object find_keyword_in_vector (Lisp_Object vector, Lisp_Object keyword);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
44 Lisp_Object Qgui_error;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
45
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 #ifdef HAVE_POPUPS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 /* count of menus/dboxes currently up */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 int popup_up_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 DEFUN ("popup-up-p", Fpopup_up_p, 0, 0, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 Return t if a popup menu or dialog box is up, nil otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 See `popup-menu' and `popup-dialog-box'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 return popup_up_p ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 #endif /* HAVE_POPUPS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 int
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 853
diff changeset
62 separator_string_p (const Ibyte *s)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 {
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 853
diff changeset
64 const Ibyte *p;
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 853
diff changeset
65 Ibyte first;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 if (!s || s[0] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 first = s[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 if (first != '-' && first != '=')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 for (p = s; *p == first; p++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 return (*p == '!' || *p == ':' || *p == '\0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 /* Massage DATA to find the correct function and argument. Used by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 popup_selection_callback() and the msw code. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 get_gui_callback (Lisp_Object data, Lisp_Object *fn, Lisp_Object *arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
83 if (EQ (data, Qquit))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
84 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
85 *fn = Qeval;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
86 *arg = list3 (Qsignal, list2 (Qquote, Qquit), Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
87 Vquit_flag = Qt;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
88 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
89 else if (SYMBOLP (data)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
90 || (COMPILED_FUNCTIONP (data)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
91 && XCOMPILED_FUNCTION (data)->flags.interactivep)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
92 || (CONSP (data) && (EQ (XCAR (data), Qlambda))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
93 && !NILP (Fassq (Qinteractive, Fcdr (Fcdr (data))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 *fn = Qcall_interactively;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 *arg = data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 else if (CONSP (data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 *fn = Qeval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 *arg = data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 *fn = Qeval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 *arg = list3 (Qsignal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 list2 (Qquote, Qerror),
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
108 list2 (Qquote, list2 (build_msg_string
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 ("illegal callback"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 data)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 * Add a value VAL associated with keyword KEY into PGUI_ITEM
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 * structure. If KEY is not a keyword, or is an unknown keyword, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 * error is signaled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 */
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
119 int
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 gui_item_add_keyval_pair (Lisp_Object gui_item,
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
121 Lisp_Object key, Lisp_Object val,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 569
diff changeset
122 Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
124 Lisp_Gui_Item *pgui_item = XGUI_ITEM (gui_item);
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
125 int retval = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 if (!KEYWORDP (key))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
128 sferror_2 ("Non-keyword in gui item", key, pgui_item->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
130 if (EQ (key, Q_descriptor))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
131 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
132 if (!EQ (pgui_item->name, val))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
133 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
134 retval = 1;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
135 pgui_item->name = val;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
136 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
137 }
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
138 #define FROB(slot) \
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
139 else if (EQ (key, Q_##slot)) \
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
140 { \
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
141 if (!EQ (pgui_item->slot, val)) \
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
142 { \
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
143 retval = 1; \
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
144 pgui_item->slot = val; \
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
145 } \
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
146 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
147 FROB (suffix)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
148 FROB (active)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
149 FROB (included)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
150 FROB (config)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
151 FROB (filter)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
152 FROB (style)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
153 FROB (selected)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
154 FROB (keys)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
155 FROB (callback)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
156 FROB (callback_ex)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
157 FROB (value)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
158 #undef FROB
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
159 else if (EQ (key, Q_key_sequence)) ; /* ignored for FSF compatibility */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 else if (EQ (key, Q_label)) ; /* ignored for 21.0 implement in 21.2 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 else if (EQ (key, Q_accelerator))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 {
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
163 if (!EQ (pgui_item->accelerator, val))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
164 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
165 retval = 1;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
166 if (SYMBOLP (val) || CHARP (val))
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
167 pgui_item->accelerator = val;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
168 else if (ERRB_EQ (errb, ERROR_ME))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
169 invalid_argument ("Bad keyboard accelerator", val);
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
170 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 else if (ERRB_EQ (errb, ERROR_ME))
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
173 invalid_argument_2 ("Unknown keyword in gui item", key, pgui_item->name);
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
174 return retval;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 gui_item_init (Lisp_Object gui_item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
180 Lisp_Gui_Item *lp = XGUI_ITEM (gui_item);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 lp->name = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 lp->callback = Qnil;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
184 lp->callback_ex = Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 lp->suffix = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 lp->active = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 lp->included = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 lp->config = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 lp->filter = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 lp->style = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 lp->selected = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 lp->keys = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 lp->accelerator = Qnil;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
194 lp->value = Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 allocate_gui_item (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 {
5127
a9c41067dd88 more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents: 5125
diff changeset
200 Lisp_Object obj = ALLOC_NORMAL_LISP_OBJECT (gui_item);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201
5117
3742ea8250b5 Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents: 3017
diff changeset
202 gui_item_init (obj);
3742ea8250b5 Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents: 3017
diff changeset
203 return obj;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 * ITEM is a lisp vector, describing a menu item or a button. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 * function extracts the description of the item into the PGUI_ITEM
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 * structure.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 make_gui_item_from_keywords_internal (Lisp_Object item,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 569
diff changeset
213 Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 int length, plist_p, start;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 Lisp_Object *contents;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 Lisp_Object gui_item = allocate_gui_item ();
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
218 Lisp_Gui_Item *pgui_item = XGUI_ITEM (gui_item);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 CHECK_VECTOR (item);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 length = XVECTOR_LENGTH (item);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 contents = XVECTOR_DATA (item);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 if (length < 1)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
225 sferror ("GUI item descriptors must be at least 1 elts long", item);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 /* length 1: [ "name" ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 length 2: [ "name" callback ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 length 3: [ "name" callback active-p ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 or [ "name" keyword value ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 length 4: [ "name" callback active-p suffix ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 or [ "name" callback keyword value ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 length 5+: [ "name" callback [ keyword value ]+ ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 or [ "name" [ keyword value ]+ ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 plist_p = (length > 2 && (KEYWORDP (contents [1])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 || KEYWORDP (contents [2])));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 pgui_item->name = contents [0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 if (length > 1 && !KEYWORDP (contents [1]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 pgui_item->callback = contents [1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 start = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 }
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
245 else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 start =1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 if (!plist_p && length > 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 /* the old way */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 pgui_item->active = contents [2];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 if (length == 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 pgui_item->suffix = contents [3];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 /* the new way */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 if ((length - start) & 1)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
260 sferror (
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 "GUI item descriptor has an odd number of keywords and values",
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
262 item);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 for (i = start; i < length;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 Lisp_Object key = contents [i++];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 Lisp_Object val = contents [i++];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 gui_item_add_keyval_pair (gui_item, key, val, errb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 return gui_item;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
274 /* This will only work with descriptors in the new format. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
275 Lisp_Object
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
276 widget_gui_parse_item_keywords (Lisp_Object item)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
277 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
278 int i, length;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
279 Lisp_Object *contents;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
280 Lisp_Object gui_item = allocate_gui_item ();
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
281 Lisp_Object desc = find_keyword_in_vector (item, Q_descriptor);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
282
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
283 CHECK_VECTOR (item);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
284 length = XVECTOR_LENGTH (item);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
285 contents = XVECTOR_DATA (item);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
286
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
287 if (!NILP (desc) && !STRINGP (desc) && !VECTORP (desc))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
288 sferror ("Invalid GUI item descriptor", item);
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
289
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
290 if (length & 1)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
291 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
292 if (!SYMBOLP (contents [0]))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
293 sferror ("Invalid GUI item descriptor", item);
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
294 contents++; /* Ignore the leading symbol. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
295 length--;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
296 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
297
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
298 for (i = 0; i < length;)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
299 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
300 Lisp_Object key = contents [i++];
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
301 Lisp_Object val = contents [i++];
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
302 gui_item_add_keyval_pair (gui_item, key, val, ERROR_ME_NOT);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
303 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
304
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
305 return gui_item;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
306 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
307
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
308 /* Update a gui item from a partial descriptor. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
309 int
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
310 update_gui_item_keywords (Lisp_Object gui_item, Lisp_Object item)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
311 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
312 int i, length, retval = 0;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
313 Lisp_Object *contents;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
314
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
315 CHECK_VECTOR (item);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
316 length = XVECTOR_LENGTH (item);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
317 contents = XVECTOR_DATA (item);
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
318
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
319 if (length & 1)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
320 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
321 if (!SYMBOLP (contents [0]))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
322 sferror ("Invalid GUI item descriptor", item);
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
323 contents++; /* Ignore the leading symbol. */
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
324 length--;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
325 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
326
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
327 for (i = 0; i < length;)
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
328 {
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
329 Lisp_Object key = contents [i++];
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
330 Lisp_Object val = contents [i++];
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
331 if (gui_item_add_keyval_pair (gui_item, key, val, ERROR_ME_DEBUG_WARN))
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
332 retval = 1;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
333 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
334 return retval;
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
335 }
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
336
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 gui_parse_item_keywords (Lisp_Object item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 return make_gui_item_from_keywords_internal (item, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 gui_parse_item_keywords_no_errors (Lisp_Object item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
346 return make_gui_item_from_keywords_internal (item, ERROR_ME_DEBUG_WARN);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 /* convert a gui item into plist properties */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 gui_add_item_keywords_to_plist (Lisp_Object plist, Lisp_Object gui_item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
353 Lisp_Gui_Item *pgui_item = XGUI_ITEM (gui_item);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
354
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 if (!NILP (pgui_item->callback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 Fplist_put (plist, Q_callback, pgui_item->callback);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
357 if (!NILP (pgui_item->callback_ex))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
358 Fplist_put (plist, Q_callback_ex, pgui_item->callback_ex);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 if (!NILP (pgui_item->suffix))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 Fplist_put (plist, Q_suffix, pgui_item->suffix);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 if (!NILP (pgui_item->active))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 Fplist_put (plist, Q_active, pgui_item->active);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 if (!NILP (pgui_item->included))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 Fplist_put (plist, Q_included, pgui_item->included);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 if (!NILP (pgui_item->config))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 Fplist_put (plist, Q_config, pgui_item->config);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 if (!NILP (pgui_item->filter))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 Fplist_put (plist, Q_filter, pgui_item->filter);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 if (!NILP (pgui_item->style))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 Fplist_put (plist, Q_style, pgui_item->style);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 if (!NILP (pgui_item->selected))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 Fplist_put (plist, Q_selected, pgui_item->selected);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 if (!NILP (pgui_item->keys))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 Fplist_put (plist, Q_keys, pgui_item->keys);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 if (!NILP (pgui_item->accelerator))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 Fplist_put (plist, Q_accelerator, pgui_item->accelerator);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
377 if (!NILP (pgui_item->value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
378 Fplist_put (plist, Q_value, pgui_item->value);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
381 static int
1913
7473844a83d3 [xemacs-hg @ 2004-02-17 15:20:41 by james]
james
parents: 1318
diff changeset
382 gui_item_value (Lisp_Object form)
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
383 {
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
384 /* This function can call Lisp. */
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
385 #ifndef ERROR_CHECK_DISPLAY
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
386 /* Shortcut to avoid evaluating Qt/Qnil each time; but don't do it when
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
387 error-checking so we catch unprotected eval within redisplay quicker */
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
388 if (NILP (form))
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
389 return 0;
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
390 if (EQ (form, Qt))
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
391 return 1;
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
392 #endif
4677
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3263
diff changeset
393 return !NILP (in_display ?
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3263
diff changeset
394 IGNORE_MULTIPLE_VALUES (eval_within_redisplay (form))
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3263
diff changeset
395 : IGNORE_MULTIPLE_VALUES (Feval (form)));
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
396 }
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
397
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 * Decide whether a GUI item is active by evaluating its :active form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 * if any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 int
1913
7473844a83d3 [xemacs-hg @ 2004-02-17 15:20:41 by james]
james
parents: 1318
diff changeset
403 gui_item_active_p (Lisp_Object gui_item)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 {
1913
7473844a83d3 [xemacs-hg @ 2004-02-17 15:20:41 by james]
james
parents: 1318
diff changeset
405 return gui_item_value (XGUI_ITEM (gui_item)->active);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 /* set menu accelerator key to first underlined character in menu name */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 gui_item_accelerator (Lisp_Object gui_item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
412 Lisp_Gui_Item *pgui = XGUI_ITEM (gui_item);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
413
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 if (!NILP (pgui->accelerator))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 return pgui->accelerator;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
418 return gui_name_accelerator (pgui->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 gui_name_accelerator (Lisp_Object nm)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 {
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 853
diff changeset
424 Ibyte *name = XSTRING_DATA (nm);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
426 while (*name)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
427 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
428 if (*name == '%')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
430 ++name;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
431 if (!(*name))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
432 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
433 if (*name == '_' && *(name + 1))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
434 {
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 853
diff changeset
435 Ichar accelerator = itext_ichar (name + 1);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
436 return make_char (DOWNCASE (0, accelerator));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
437 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 }
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 853
diff changeset
439 INC_IBYTEPTR (name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 }
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 853
diff changeset
441 return make_char (DOWNCASE (0, itext_ichar (XSTRING_DATA (nm))));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 * Decide whether a GUI item is selected by evaluating its :selected form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 * if any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 int
1913
7473844a83d3 [xemacs-hg @ 2004-02-17 15:20:41 by james]
james
parents: 1318
diff changeset
449 gui_item_selected_p (Lisp_Object gui_item)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 {
1913
7473844a83d3 [xemacs-hg @ 2004-02-17 15:20:41 by james]
james
parents: 1318
diff changeset
451 return gui_item_value (XGUI_ITEM (gui_item)->selected);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
454 Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
455 gui_item_list_find_selected (Lisp_Object gui_item_list)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
456 {
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
457 /* This function can call Lisp but cannot GC because it is called within
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
458 redisplay, and redisplay disables GC. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
459 Lisp_Object rest;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
460 LIST_LOOP (rest, gui_item_list)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
461 {
1913
7473844a83d3 [xemacs-hg @ 2004-02-17 15:20:41 by james]
james
parents: 1318
diff changeset
462 if (gui_item_selected_p (XCAR (rest)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
463 return XCAR (rest);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
464 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
465 return XCAR (gui_item_list);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
466 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
467
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 * Decide whether a GUI item is included by evaluating its :included
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 * form if given, and testing its :config form against supplied CONFLIST
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 * configuration variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 gui_item_included_p (Lisp_Object gui_item, Lisp_Object conflist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 /* This function can call lisp */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
477 Lisp_Gui_Item *pgui_item = XGUI_ITEM (gui_item);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 /* Evaluate :included first. Shortcut to avoid evaluating Qt each time */
1913
7473844a83d3 [xemacs-hg @ 2004-02-17 15:20:41 by james]
james
parents: 1318
diff changeset
480 if (!gui_item_value (pgui_item->included))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 /* Do :config if conflist is given */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 if (!NILP (conflist) && !NILP (pgui_item->config)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 && NILP (Fmemq (pgui_item->config, conflist)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 /*
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
492 * Format "left flush" display portion of an item.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
494 Lisp_Object
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
495 gui_item_display_flush_left (Lisp_Object gui_item)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 /* This function can call lisp */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
498 Lisp_Gui_Item *pgui_item = XGUI_ITEM (gui_item);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
499 Lisp_Object retval;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 CHECK_STRING (pgui_item->name);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
502 retval = pgui_item->name;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 if (!NILP (pgui_item->suffix))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 Lisp_Object suffix = pgui_item->suffix;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 /* Shortcut to avoid evaluating suffix each time */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 if (!STRINGP (suffix))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 suffix = Feval (suffix);
4677
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3263
diff changeset
511 suffix = IGNORE_MULTIPLE_VALUES (suffix);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 CHECK_STRING (suffix);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4846
diff changeset
515 retval = concat3 (pgui_item->name, build_ascstring (" "), suffix);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 }
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
517
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
518 return retval;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 /*
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
522 * Format "right flush" display portion of an item into BUF.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
524 Lisp_Object
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
525 gui_item_display_flush_right (Lisp_Object gui_item)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
527 Lisp_Gui_Item *pgui_item = XGUI_ITEM (gui_item);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 #ifdef HAVE_MENUBARS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 /* Have keys? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 if (!menubar_show_keybindings)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
532 return Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 /* Try :keys first */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 if (!NILP (pgui_item->keys))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 CHECK_STRING (pgui_item->keys);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
539 return pgui_item->keys;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 /* See if we can derive keys out of callback symbol */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 if (SYMBOLP (pgui_item->callback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
545 DECLARE_EISTRING_MALLOC (buf);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
546 Lisp_Object str;
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
547
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
548 where_is_to_char (pgui_item->callback, buf);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
549 str = eimake_string (buf);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
550 eifree (buf);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
551 return str;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 /* No keys - no right flush display */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
555 return Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 934
diff changeset
558 static const struct memory_description gui_item_description [] = {
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
559 { XD_LISP_OBJECT, offsetof (struct Lisp_Gui_Item, name) },
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
560 { XD_LISP_OBJECT, offsetof (struct Lisp_Gui_Item, callback) },
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
561 { XD_LISP_OBJECT, offsetof (struct Lisp_Gui_Item, callback_ex) },
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
562 { XD_LISP_OBJECT, offsetof (struct Lisp_Gui_Item, suffix) },
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
563 { XD_LISP_OBJECT, offsetof (struct Lisp_Gui_Item, active) },
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
564 { XD_LISP_OBJECT, offsetof (struct Lisp_Gui_Item, included) },
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
565 { XD_LISP_OBJECT, offsetof (struct Lisp_Gui_Item, config) },
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
566 { XD_LISP_OBJECT, offsetof (struct Lisp_Gui_Item, filter) },
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
567 { XD_LISP_OBJECT, offsetof (struct Lisp_Gui_Item, style) },
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
568 { XD_LISP_OBJECT, offsetof (struct Lisp_Gui_Item, selected) },
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
569 { XD_LISP_OBJECT, offsetof (struct Lisp_Gui_Item, keys) },
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
570 { XD_LISP_OBJECT, offsetof (struct Lisp_Gui_Item, accelerator) },
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
571 { XD_LISP_OBJECT, offsetof (struct Lisp_Gui_Item, value) },
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
572 { XD_END }
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
573 };
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 872
diff changeset
574
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 mark_gui_item (Lisp_Object obj)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
578 Lisp_Gui_Item *p = XGUI_ITEM (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 mark_object (p->name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 mark_object (p->callback);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
582 mark_object (p->callback_ex);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 mark_object (p->config);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 mark_object (p->suffix);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 mark_object (p->active);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 mark_object (p->included);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 mark_object (p->config);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 mark_object (p->filter);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 mark_object (p->style);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 mark_object (p->selected);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 mark_object (p->keys);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 mark_object (p->accelerator);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
593 mark_object (p->value);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
598 static Hashcode
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 gui_item_hash (Lisp_Object obj, int depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
601 Lisp_Gui_Item *p = XGUI_ITEM (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
603 return HASH2 (HASH6 (internal_hash (p->name, depth + 1),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 internal_hash (p->callback, depth + 1),
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
605 internal_hash (p->callback_ex, depth + 1),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 internal_hash (p->suffix, depth + 1),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 internal_hash (p->active, depth + 1),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 internal_hash (p->included, depth + 1)),
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
609 HASH6 (internal_hash (p->config, depth + 1),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 internal_hash (p->filter, depth + 1),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 internal_hash (p->style, depth + 1),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 internal_hash (p->selected, depth + 1),
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
613 internal_hash (p->keys, depth + 1),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
614 internal_hash (p->value, depth + 1)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 gui_item_id_hash (Lisp_Object hashtable, Lisp_Object gitem, int slot)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 int hashid = gui_item_hash (gitem, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 int id = GUI_ITEM_ID_BITS (hashid, slot);
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 793
diff changeset
622 while (!UNBOUNDP (Fgethash (make_int (id), hashtable, Qunbound)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 id = GUI_ITEM_ID_BITS (id + 1, slot);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 return id;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
629 static int
1913
7473844a83d3 [xemacs-hg @ 2004-02-17 15:20:41 by james]
james
parents: 1318
diff changeset
630 gui_value_equal (Lisp_Object a, Lisp_Object b, int depth)
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
631 {
1913
7473844a83d3 [xemacs-hg @ 2004-02-17 15:20:41 by james]
james
parents: 1318
diff changeset
632 if (in_display)
1318
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
633 return internal_equal_trapping_problems
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
634 (Qredisplay, "Error calling function within redisplay", 0, 0,
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
635 /* say they're not equal in case of error; code calling
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
636 gui_item_equal_sans_selected() in redisplay does extra stuff
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
637 only when equal */
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
638 0, a, b, depth);
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
639 else
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
640 return internal_equal (a, b, depth);
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
641 }
b531bf8658e9 [xemacs-hg @ 2003-02-21 06:56:46 by ben]
ben
parents: 1204
diff changeset
642
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
643 int
1913
7473844a83d3 [xemacs-hg @ 2004-02-17 15:20:41 by james]
james
parents: 1318
diff changeset
644 gui_item_equal_sans_selected (Lisp_Object obj1, Lisp_Object obj2, int depth)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
646 Lisp_Gui_Item *p1 = XGUI_ITEM (obj1);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
647 Lisp_Gui_Item *p2 = XGUI_ITEM (obj2);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648
1913
7473844a83d3 [xemacs-hg @ 2004-02-17 15:20:41 by james]
james
parents: 1318
diff changeset
649 if (!(gui_value_equal (p1->name, p2->name, depth + 1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 &&
1913
7473844a83d3 [xemacs-hg @ 2004-02-17 15:20:41 by james]
james
parents: 1318
diff changeset
651 gui_value_equal (p1->callback, p2->callback, depth + 1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 &&
1913
7473844a83d3 [xemacs-hg @ 2004-02-17 15:20:41 by james]
james
parents: 1318
diff changeset
653 gui_value_equal (p1->callback_ex, p2->callback_ex, depth + 1)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
654 &&
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 EQ (p1->suffix, p2->suffix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 EQ (p1->active, p2->active)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 EQ (p1->included, p2->included)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 EQ (p1->config, p2->config)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 EQ (p1->filter, p2->filter)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 EQ (p1->style, p2->style)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 EQ (p1->accelerator, p2->accelerator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 &&
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
669 EQ (p1->keys, p2->keys)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
670 &&
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
671 EQ (p1->value, p2->value)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
672 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
673 return 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
674 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
675
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
676 static int
4906
6ef8256a020a implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents: 4846
diff changeset
677 gui_item_equal (Lisp_Object obj1, Lisp_Object obj2, int depth,
6ef8256a020a implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents: 4846
diff changeset
678 int UNUSED (foldcase))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
679 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
680 Lisp_Gui_Item *p1 = XGUI_ITEM (obj1);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
681 Lisp_Gui_Item *p2 = XGUI_ITEM (obj2);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
682
1913
7473844a83d3 [xemacs-hg @ 2004-02-17 15:20:41 by james]
james
parents: 1318
diff changeset
683 if (!(gui_item_equal_sans_selected (obj1, obj2, depth) &&
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
684 EQ (p1->selected, p2->selected)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1913
diff changeset
690 print_gui_item (Lisp_Object obj, Lisp_Object printcharfun,
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1913
diff changeset
691 int UNUSED (escapeflag))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
693 Lisp_Gui_Item *g = XGUI_ITEM (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 if (print_readably)
4846
a98ca4640147 clean up object print methods
Ben Wing <ben@xemacs.org>
parents: 4677
diff changeset
696 printing_unreadable_lcrecord (obj, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
698 write_fmt_string (printcharfun, "#<gui-item 0x%x>", g->header.uid);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700
454
d7a9135ec789 Import from CVS: tag r21-2-42
cvs
parents: 442
diff changeset
701 Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
702 copy_gui_item (Lisp_Object gui_item)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
703 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
704 Lisp_Object ret = allocate_gui_item ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
705 Lisp_Gui_Item *lp, *g = XGUI_ITEM (gui_item);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
706
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
707 lp = XGUI_ITEM (ret);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
708 lp->name = g->name;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
709 lp->callback = g->callback;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
710 lp->callback_ex = g->callback_ex;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
711 lp->suffix = g->suffix;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
712 lp->active = g->active;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
713 lp->included = g->included;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
714 lp->config = g->config;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
715 lp->filter = g->filter;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
716 lp->style = g->style;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
717 lp->selected = g->selected;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
718 lp->keys = g->keys;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
719 lp->accelerator = g->accelerator;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
720 lp->value = g->value;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
721
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
722 return ret;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
723 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
724
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
725 Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
726 copy_gui_item_tree (Lisp_Object arg)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
727 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
728 if (CONSP (arg))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
729 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
730 Lisp_Object rest = arg = Fcopy_sequence (arg);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
731 while (CONSP (rest))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
732 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
733 XCAR (rest) = copy_gui_item_tree (XCAR (rest));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
734 rest = XCDR (rest);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
735 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
736 return arg;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
737 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
738 else if (GUI_ITEMP (arg))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
739 return copy_gui_item (arg);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
740 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
741 return arg;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
742 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
743
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 /* parse a glyph descriptor into a tree of gui items.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 The gui_item slot of an image instance can be a single item or an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 arbitrarily nested hierarchy of item lists. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
749 static Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
750 parse_gui_item_tree_item (Lisp_Object entry)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 Lisp_Object ret = entry;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
753 struct gcpro gcpro1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
754
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
755 GCPRO1 (ret);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
756
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 if (VECTORP (entry))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
759 ret = gui_parse_item_keywords_no_errors (entry);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 else if (STRINGP (entry))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 CHECK_STRING (entry);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 else
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
766 sferror ("item must be a vector or a string", entry);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
768 RETURN_UNGCPRO (ret);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
771 Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
772 parse_gui_item_tree_children (Lisp_Object list)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
774 Lisp_Object rest, ret = Qnil, sub = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
775 struct gcpro gcpro1, gcpro2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
776
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
777 GCPRO2 (ret, sub);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 CHECK_CONS (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 /* recursively add items to the tree view */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 LIST_LOOP (rest, list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 if (CONSP (XCAR (rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 sub = parse_gui_item_tree_list (XCAR (rest));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 sub = parse_gui_item_tree_item (XCAR (rest));
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
786
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 ret = Fcons (sub, ret);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 /* make the order the same as the items we have parsed */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
790 RETURN_UNGCPRO (Fnreverse (ret));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
793 static Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
794 parse_gui_item_tree_list (Lisp_Object list)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 Lisp_Object ret;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
797 struct gcpro gcpro1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 CHECK_CONS (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 /* first one can never be a list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 ret = parse_gui_item_tree_item (XCAR (list));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
801 GCPRO1 (ret);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
802 ret = Fcons (ret, parse_gui_item_tree_children (XCDR (list)));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
803 RETURN_UNGCPRO (ret);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
804 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
805
5118
e0db3c197671 merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents: 5117 4677
diff changeset
806 DEFINE_NODUMP_LISP_OBJECT ("gui-item", gui_item,
5124
623d57b7fbe8 separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents: 5118
diff changeset
807 mark_gui_item, print_gui_item,
623d57b7fbe8 separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents: 5118
diff changeset
808 0, gui_item_equal,
623d57b7fbe8 separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents: 5118
diff changeset
809 gui_item_hash,
623d57b7fbe8 separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents: 5118
diff changeset
810 gui_item_description,
623d57b7fbe8 separate regular and disksave finalization, print method fixes.
Ben Wing <ben@xemacs.org>
parents: 5118
diff changeset
811 Lisp_Gui_Item);
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
812
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
813 DOESNT_RETURN
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
814 gui_error (const Ascbyte *reason, Lisp_Object frob)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
815 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
816 signal_error (Qgui_error, reason, frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
817 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
818
569
9cdcb214753f [xemacs-hg @ 2001-05-24 12:20:33 by yoshiki]
yoshiki
parents: 563
diff changeset
819 DOESNT_RETURN
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
820 gui_error_2 (const Ascbyte *reason, Lisp_Object frob0, Lisp_Object frob1)
569
9cdcb214753f [xemacs-hg @ 2001-05-24 12:20:33 by yoshiki]
yoshiki
parents: 563
diff changeset
821 {
9cdcb214753f [xemacs-hg @ 2001-05-24 12:20:33 by yoshiki]
yoshiki
parents: 563
diff changeset
822 signal_error_2 (Qgui_error, reason, frob0, frob1);
9cdcb214753f [xemacs-hg @ 2001-05-24 12:20:33 by yoshiki]
yoshiki
parents: 563
diff changeset
823 }
9cdcb214753f [xemacs-hg @ 2001-05-24 12:20:33 by yoshiki]
yoshiki
parents: 563
diff changeset
824
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 syms_of_gui (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 {
5117
3742ea8250b5 Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents: 3017
diff changeset
828 INIT_LISP_OBJECT (gui_item);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
830 DEFSYMBOL (Qmenu_no_selection_hook);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
832 DEFERROR_STANDARD (Qgui_error, Qio_error);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 454
diff changeset
833
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 #ifdef HAVE_POPUPS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 DEFSUBR (Fpopup_up_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 vars_of_gui (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
842 DEFVAR_LISP ("menu-no-selection-hook", &Vmenu_no_selection_hook /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
843 Function or functions to call when a menu or dialog box is dismissed
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
844 without a selection having been made.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
845 */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
846 Vmenu_no_selection_hook = Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 }