Mercurial > hg > xemacs-beta
diff src/gui.h @ 412:697ef44129c6 r21-2-14
Import from CVS: tag r21-2-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:20:41 +0200 |
parents | b8cc9ab3f761 |
children | e804706bfb8c |
line wrap: on
line diff
--- a/src/gui.h Mon Aug 13 11:19:22 2007 +0200 +++ b/src/gui.h Mon Aug 13 11:20:41 2007 +0200 @@ -24,26 +24,20 @@ /* Written by kkm on 12/24/97 */ -#ifndef INCLUDED_gui_h_ -#define INCLUDED_gui_h_ +#ifndef _XEMACS_GUI_H_ +#define _XEMACS_GUI_H_ -int separator_string_p (const char *s); +int separator_string_p (CONST char *s); void get_gui_callback (Lisp_Object, Lisp_Object *, Lisp_Object *); extern int popup_up_p; -/************************************************************************/ -/* Image Instance Object */ -/************************************************************************/ - /* This structure describes gui button, menu item or submenu properties */ -struct Lisp_Gui_Item +struct gui_item { - struct lcrecord_header header; Lisp_Object name; /* String */ Lisp_Object callback; /* Symbol or form */ - Lisp_Object callback_ex; /* Form taking context arguments */ Lisp_Object suffix; /* String */ Lisp_Object active; /* Form */ Lisp_Object included; /* Form */ @@ -52,49 +46,50 @@ Lisp_Object style; /* Symbol */ Lisp_Object selected; /* Form */ Lisp_Object keys; /* String */ - Lisp_Object accelerator; /* Char or Symbol */ - Lisp_Object value; /* Anything you like */ }; +#define GUI_ITEM_LAST_GCPROED keys +#define GUI_ITEM_GCPRO_COUNT \ + (slot_offset(struct gui_item, GUI_ITEM_LAST_GCPROED) / sizeof(Lisp_Object) + 1) -DECLARE_LRECORD (gui_item, Lisp_Gui_Item); -#define XGUI_ITEM(x) XRECORD (x, gui_item, Lisp_Gui_Item) -#define XSETGUI_ITEM(x, p) XSETRECORD (x, p, gui_item) -#define GUI_ITEMP(x) RECORDP (x, gui_item) -#define CHECK_GUI_ITEM(x) CHECK_RECORD (x, gui_item) -#define CONCHECK_GUI_ITEM(x) CONCHECK_RECORD (x, gui_item) +/* + * gui_item is a struct containing a bunch of Lisp_Object + * members. We need to GC-protect all the member slots. + * Rather than build a long chain of individual gcpro structs + * that protect the slots individually, we protect all the + * member slots by pretending the struct is an array. ANSI C + * requires this hack to work, ugly though it is. + */ +#define GCPRO_GUI_ITEM(pgui_item) \ + do { \ + Lisp_Object *gui_item_array = (Lisp_Object *) pgui_item; \ + GCPRO1 (gui_item_array[0]); \ + gcpro1.nvars = GUI_ITEM_GCPRO_COUNT; \ + } while (0); extern Lisp_Object Q_accelerator, Q_active, Q_config, Q_filter, Q_included; extern Lisp_Object Q_keys, Q_selected, Q_suffix, Qradio, Qtoggle; -extern Lisp_Object Q_key_sequence, Q_label, Q_callback, Q_callback_ex, Q_value; +extern Lisp_Object Q_key_sequence, Q_label, Q_callback; -void gui_item_add_keyval_pair (Lisp_Object, +void gui_item_init (struct gui_item *pgui_item); +void gui_item_add_keyval_pair (struct gui_item *pgui_item, Lisp_Object key, Lisp_Object val, Error_behavior errb); -Lisp_Object gui_parse_item_keywords (Lisp_Object item); -Lisp_Object gui_parse_item_keywords_no_errors (Lisp_Object item); -void gui_add_item_keywords_to_plist (Lisp_Object plist, Lisp_Object gui_item); -int gui_item_active_p (Lisp_Object); -int gui_item_selected_p (Lisp_Object); -int gui_item_included_p (Lisp_Object, Lisp_Object into); -Lisp_Object gui_item_accelerator (Lisp_Object gui_item); -Lisp_Object gui_name_accelerator (Lisp_Object name); -int gui_item_id_hash (Lisp_Object, Lisp_Object gui_item, int); -unsigned int gui_item_display_flush_left (Lisp_Object pgui_item, +void gui_parse_item_keywords (Lisp_Object item, struct gui_item *pgui_item); +void gui_parse_item_keywords_no_errors (Lisp_Object item, struct gui_item *pgui_item); +int gui_item_active_p (CONST struct gui_item *pgui_item); +int gui_item_selected_p (CONST struct gui_item *pgui_item); +int gui_item_included_p (CONST struct gui_item *pgui_item, Lisp_Object into); +int gui_item_hash (Lisp_Object, struct gui_item*, int); +Lisp_Object mark_gui_item (struct gui_item* p, void (*markobj) (Lisp_Object)); +unsigned int gui_item_display_flush_left (CONST struct gui_item *pgui_item, char* buf, Bytecount buf_len); -unsigned int gui_item_display_flush_right (Lisp_Object gui_item, +unsigned int gui_item_display_flush_right (CONST struct gui_item *pgui_item, char* buf, Bytecount buf_len); -Lisp_Object allocate_gui_item (void); -void gui_item_init (Lisp_Object gui_item); -Lisp_Object parse_gui_item_tree_children (Lisp_Object list); -Lisp_Object copy_gui_item_tree (Lisp_Object arg); - /* this is mswindows biased but reasonably safe I think */ #define GUI_ITEM_ID_SLOTS 8 #define GUI_ITEM_ID_MIN(s) (s * 0x2000) #define GUI_ITEM_ID_MAX(s) (0x1FFF + GUI_ITEM_ID_MIN (s)) #define GUI_ITEM_ID_BITS(x,s) (((x) & 0x1FFF) + GUI_ITEM_ID_MIN (s)) -#define MAX_MENUITEM_LENGTH 128 - -#endif /* INCLUDED_gui_h_ */ +#endif /* _XEMACS_GUI_H_ */