Mercurial > hg > xemacs-beta
annotate lwlib/lwlib.h @ 4792:95b04754ea8c
Make #'equalp more compatible with CL; add a compiler macro, test & doc it.
lisp/ChangeLog addition:
2009-11-08 Aidan Kehoe <kehoea@parhasard.net>
* cl-extra.el (cl-string-vector-equalp)
(cl-bit-vector-vector-equalp, cl-vector-array-equalp)
(cl-hash-table-contents-equalp): New functions, to implement
equalp treating arrays with identical contents as equivalent, as
specified by Common Lisp.
(equalp): Revise this function to implement array equivalence,
and the hash-table equalp behaviour specified by CL.
* cl-macs.el (equalp): Add a compiler macro for this function,
used when one of the arguments is constant, and as such, its type
is known at compile time.
man/ChangeLog addition:
2009-11-08 Aidan Kehoe <kehoea@parhasard.net>
* lispref/objects.texi (Equality Predicates):
Document #'equalp here, as well as #'equal and #'eq.
tests/ChangeLog addition:
2009-12-31 Aidan Kehoe <kehoea@parhasard.net>
* automated/lisp-tests.el:
Test much of the functionality of equalp; add a pointer to Paul
Dietz' ANSI test suite for this function, converted to Emacs
Lisp. Not including the tests themselves in XEmacs because who
owns the copyright on the files is unclear and the GCL people
didn't respond to my queries.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Thu, 31 Dec 2009 15:09:41 +0000 |
parents | 726060ee587c |
children | ade4c7e2c6cb |
rev | line source |
---|---|
440 | 1 #ifndef INCLUDED_lwlib_h_ |
2 #define INCLUDED_lwlib_h_ | |
428 | 3 |
4 #include <X11/Intrinsic.h> | |
4528
726060ee587c
First draft of g++ 4.3 warning removal patch. Builds. *Needs ChangeLogs.*
Stephen J. Turnbull <stephen@xemacs.org>
parents:
4522
diff
changeset
|
5 #include "xt-wrappers.h" |
428 | 6 |
7 #if defined (LWLIB_MENUBARS_LUCID) || defined (LWLIB_MENUBARS_MOTIF) || defined (LWLIB_MENUBARS_ATHENA) | |
8 #define NEED_MENUBARS | |
9 #endif | |
10 #if defined (LWLIB_SCROLLBARS_LUCID) || defined (LWLIB_SCROLLBARS_MOTIF) || defined (LWLIB_SCROLLBARS_ATHENA) | |
11 #define NEED_SCROLLBARS | |
12 #endif | |
13 #if defined (LWLIB_DIALOGS_LUCID) || defined (LWLIB_DIALOGS_MOTIF) || defined (LWLIB_DIALOGS_ATHENA) | |
14 #define NEED_DIALOGS | |
15 #endif | |
16 | |
17 /* | |
18 ** Widget values depend on the Widget type: | |
19 ** | |
20 ** widget: (name value key enabled data contents/selected) | |
21 ** | |
22 ** label: ("name" "string" NULL NULL NULL NULL) | |
23 ** BUTTON: ("name" "string" "key" T/F data <default-button-p>) | |
24 ** CASCADE (button w/menu): | |
25 ** ("name" "string" "key" T/F data (label|button|button w/menu...)) | |
26 ** INCREMENTAL (button w/menu construction callback): | |
27 ** ("name" "string" NULL T/F <opaque pointer>) | |
28 ** menubar: ("name" NULL NULL T/F data (button w/menu)) | |
29 ** scrollbar:("name" NULL NULL T/F NULL NULL) | |
30 ** selectable thing: | |
31 ** ("name" "string" "key" T/F data T/F) | |
32 ** checkbox: selectable thing | |
33 ** radio: ("name" NULL NULL T/F data (selectable thing...)) | |
34 ** strings: ("name" NULL NULL T/F data (selectable thing...)) | |
35 ** TEXT: ("name" "string" <ign> T/F data) | |
36 ** | |
37 ** Note that the above is EXTREMELY bogus. The "type" of the various entities | |
38 ** that a widget_value structure can represent is implicit in the contents of | |
39 ** half a dozen slots, instead of there simply being a type field. This | |
40 ** should all be rethunk. I've added a type field, but for now it's only used | |
41 ** by the new xlwmenu code. | |
42 */ | |
43 | |
44 typedef unsigned long LWLIB_ID; | |
45 | |
46 typedef enum _change_type | |
47 { | |
48 NO_CHANGE = 0, | |
49 INVISIBLE_CHANGE = 1, | |
50 VISIBLE_CHANGE = 2, | |
51 STRUCTURAL_CHANGE = 3 | |
52 } change_type; | |
53 | |
54 typedef enum _widget_value_type | |
55 { | |
56 UNSPECIFIED_TYPE = 0, | |
57 BUTTON_TYPE = 1, | |
58 TOGGLE_TYPE = 2, | |
59 RADIO_TYPE = 3, | |
60 TEXT_TYPE = 4, | |
61 SEPARATOR_TYPE = 5, | |
62 CASCADE_TYPE = 6, | |
63 PUSHRIGHT_TYPE = 7, | |
64 INCREMENTAL_TYPE = 8 | |
65 } widget_value_type; | |
66 | |
67 typedef enum _scroll_action | |
68 { | |
69 SCROLLBAR_LINE_UP = 0, | |
70 SCROLLBAR_LINE_DOWN = 1, | |
71 SCROLLBAR_PAGE_UP = 2, | |
72 SCROLLBAR_PAGE_DOWN = 3, | |
73 SCROLLBAR_DRAG = 4, | |
74 SCROLLBAR_CHANGE = 5, | |
75 SCROLLBAR_TOP = 6, | |
76 SCROLLBAR_BOTTOM = 7 | |
77 } scroll_action; | |
78 | |
79 typedef struct _scroll_event | |
80 { | |
81 scroll_action action; | |
82 int slider_value; | |
83 Time time; | |
84 } scroll_event; | |
85 | |
86 typedef struct _scrollbar_values | |
87 { | |
88 int line_increment; | |
89 int page_increment; | |
90 | |
91 int minimum; | |
92 int maximum; | |
93 | |
94 int slider_size; | |
95 int slider_position; | |
96 | |
97 int scrollbar_width, scrollbar_height; | |
98 int scrollbar_x, scrollbar_y; | |
99 } scrollbar_values; | |
100 | |
434 | 101 typedef struct _widget_args |
102 { | |
103 /* some things are only possible at creation time. args are applied | |
104 to widgets at creation time. */ | |
105 ArgList args; | |
106 int nargs; | |
107 /* Copying args is impossible so we make the caller give us heap allocated | |
444 | 108 args and free them when no one wants them any more. */ |
434 | 109 int ref_count; |
450 | 110 /* Since we are reference counting we need to be able to determine |
111 when something has changed. */ | |
112 Boolean args_changed; | |
434 | 113 } widget_args; |
114 | |
428 | 115 typedef struct _widget_value |
116 { | |
117 /* This slot is only partially utilized right now. */ | |
118 widget_value_type type; | |
119 | |
120 /* name of widget */ | |
121 char* name; | |
444 | 122 /* value (meaning BOGUSLY depends on widget type) */ |
428 | 123 char* value; |
124 /* keyboard equivalent. no implications for XtTranslations */ | |
125 char* key; | |
126 /* accelerator key. For XEmacs, this should be a Lisp_Object holding a | |
127 char or symbol suitable for passing to event_matches_key_specifier_p. | |
128 Outside of emacs, this can be anything: an X KeySym is a good idea. | |
129 lwlib provides support functions for keyboard traversal of menus. Actual | |
130 implementation of those accelerators is up to the application. | |
131 */ | |
132 XtPointer accel; | |
133 /* true if enabled */ | |
134 Boolean enabled; | |
135 /* true if selected */ | |
136 Boolean selected; | |
137 /* true if was edited (maintained by get_value) */ | |
138 Boolean edited; | |
139 /* true if has changed (maintained by lw library) */ | |
140 change_type change; | |
444 | 141 /* Contents of sub-widgets, also selected slot for checkbox */ |
428 | 142 struct _widget_value* contents; |
143 /* data passed to callback */ | |
144 XtPointer call_data; | |
444 | 145 /* next in the list of siblings */ |
428 | 146 struct _widget_value* next; |
147 /* slot for the toolkit dependent part. Always initialize to NULL. */ | |
148 void* toolkit_data; | |
149 /* tell us if we should free the toolkit data slot when freeing the | |
150 widget_value itself. */ | |
151 Boolean free_toolkit_data; | |
152 | |
153 /* data defining a scrollbar; only valid if type == "scrollbar" */ | |
154 scrollbar_values *scrollbar_data; | |
155 | |
434 | 156 /* A reference counted arg structure. */ |
157 struct _widget_args *args; | |
428 | 158 /* we resource the widget_value structures; this points to the next |
159 one on the free list if this one has been deallocated. */ | |
160 struct _widget_value *free_list; | |
161 | |
162 } widget_value; | |
163 | |
164 | |
165 typedef void (*lw_callback) (Widget w, LWLIB_ID id, XtPointer data); | |
166 | |
167 /* menu stuff */ | |
168 /* maybe this should go into a generic lwmenu.h */ | |
169 | |
170 extern int lw_menu_active; | |
171 | |
172 #if defined (LWLIB_MENUBARS_LUCID) | |
173 #include "xlwmenu.h" | |
174 #define lw_set_menu xlw_set_menu | |
175 #define lw_push_menu xlw_push_menu | |
176 #define lw_pop_menu xlw_pop_menu | |
177 #define lw_set_item xlw_set_item | |
178 #define lw_map_menu xlw_map_menu | |
179 #define lw_display_menu xlw_display_menu | |
180 #define lw_kill_menus xlw_kill_menus | |
181 #define lw_get_entries xlw_get_entries | |
182 #define lw_menu_level xlw_menu_level | |
183 #else /* LWLIB_MENUBARS_LUCID */ | |
184 /* do this for the other toolkits too */ | |
185 #endif /* LWLIB_MENUBARS_LUCID */ | |
186 | |
187 #if defined (LWLIB_TABS_LUCID) | |
188 #include "xlwtabs.h" | |
189 #endif | |
190 | |
442 | 191 void lw_register_widget (const char* type, const char* name, LWLIB_ID id, |
428 | 192 widget_value* val, lw_callback pre_activate_cb, |
193 lw_callback selection_cb, | |
194 lw_callback post_activate_cb); | |
195 Widget lw_get_widget (LWLIB_ID id, Widget parent, Boolean pop_up_p); | |
196 Widget lw_make_widget (LWLIB_ID id, Widget parent, Boolean pop_up_p); | |
442 | 197 Widget lw_create_widget (const char* type, const char* name, LWLIB_ID id, |
428 | 198 widget_value* val, Widget parent, Boolean pop_up_p, |
199 lw_callback pre_activate_cb, | |
200 lw_callback selection_cb, | |
201 lw_callback post_activate_cb); | |
202 LWLIB_ID lw_get_widget_id (Widget w); | |
203 int lw_map_widget_values (LWLIB_ID id, int (*mapfunc) (widget_value *value, | |
204 void *closure), | |
205 void *closure); | |
206 void lw_modify_all_widgets (LWLIB_ID id, widget_value* val, Boolean deep_p); | |
207 void lw_destroy_widget (Widget w); | |
208 void lw_destroy_all_widgets (LWLIB_ID id); | |
209 void lw_destroy_everything (void); | |
210 void lw_destroy_all_pop_ups (void); | |
211 Widget lw_raise_all_pop_up_widgets (void); | |
212 widget_value* lw_get_all_values (LWLIB_ID id); | |
213 Boolean lw_get_some_values (LWLIB_ID id, widget_value* val); | |
214 void lw_pop_up_all_widgets (LWLIB_ID id); | |
215 void lw_pop_down_all_widgets (LWLIB_ID id); | |
216 void lw_add_value_args_to_args (widget_value* wv, ArgList addto, int* offset); | |
434 | 217 void lw_add_widget_value_arg (widget_value* wv, String name, XtArgVal value); |
639 | 218 XtArgVal lw_get_value_arg (widget_value* wv, String name); |
434 | 219 void lw_copy_widget_value_args (widget_value* copy, widget_value* val); |
442 | 220 widget_value * copy_widget_value_tree (widget_value *val, change_type change); |
428 | 221 |
222 widget_value *malloc_widget_value (void); | |
223 void free_widget_value (widget_value *); | |
224 void free_widget_value_tree (widget_value *wv); | |
225 widget_value *replace_widget_value_tree (widget_value*, widget_value*); | |
226 | |
227 void lw_popup_menu (Widget, XEvent *); | |
228 | |
229 /* Toolkit independent way of focusing on a Widget at the Xt level. */ | |
230 void lw_set_keyboard_focus (Widget parent, Widget w); | |
231 | |
232 /* Silly Energize hack to invert the "sheet" button */ | |
233 void lw_show_busy (Widget w, Boolean busy); | |
234 | |
442 | 235 void lw_remove_accelerator_spec (char *val); |
236 | |
440 | 237 #endif /* INCLUDED_lwlib_h_ */ |