More warning suppressions
[sxemacs] / src / ui / lwlib / lwlib.h
1 #ifndef INCLUDED_lwlib_h_
2 #define INCLUDED_lwlib_h_
3
4 #include <X11/Intrinsic.h>
5
6 #if defined (LWLIB_MENUBARS_LUCID) || defined (LWLIB_MENUBARS_MOTIF)
7 #define NEED_MENUBARS
8 #endif
9 #if defined (LWLIB_SCROLLBARS_LUCID) || defined (LWLIB_SCROLLBARS_MOTIF) || defined (LWLIB_SCROLLBARS_ATHENA)
10 #define NEED_SCROLLBARS
11 #endif
12 #if defined (LWLIB_DIALOGS_MOTIF) || defined (LWLIB_DIALOGS_ATHENA)
13 #define NEED_DIALOGS
14 #endif
15
16 /*
17 ** Widget values depend on the Widget type:
18 **
19 ** widget:   (name    value   key enabled data contents/selected)
20 **
21 ** label:    ("name" "string" NULL  NULL NULL NULL)
22 ** BUTTON:   ("name" "string" "key" T/F  data <default-button-p>)
23 ** CASCADE (button w/menu):
24 **           ("name" "string" "key" T/F  data (label|button|button w/menu...))
25 ** INCREMENTAL (button w/menu construction callback):
26 **           ("name" "string" NULL  T/F  <opaque pointer>)
27 ** menubar:  ("name" NULL     NULL  T/F  data (button w/menu))
28 ** scrollbar:("name" NULL     NULL  T/F  NULL NULL)
29 ** selectable thing:
30 **           ("name" "string" "key" T/F  data T/F)
31 ** checkbox: selectable thing
32 ** radio:    ("name" NULL     NULL  T/F  data (selectable thing...))
33 ** strings:  ("name" NULL     NULL  T/F  data (selectable thing...))
34 ** TEXT:     ("name" "string" <ign> T/F  data)
35 **
36 ** Note that the above is EXTREMELY bogus.  The "type" of the various entities
37 ** that a widget_value structure can represent is implicit in the contents of
38 ** half a dozen slots, instead of there simply being a type field.  This
39 ** should all be rethunk.  I've added a type field, but for now it's only used
40 ** by the new xlwmenu code.
41 */
42
43 typedef unsigned long LWLIB_ID;
44
45 typedef enum _change_type {
46         NO_CHANGE = 0,
47         INVISIBLE_CHANGE = 1,
48         VISIBLE_CHANGE = 2,
49         STRUCTURAL_CHANGE = 3
50 } change_type;
51
52 typedef enum _widget_value_type {
53         UNSPECIFIED_TYPE = 0,
54         BUTTON_TYPE = 1,
55         TOGGLE_TYPE = 2,
56         RADIO_TYPE = 3,
57         TEXT_TYPE = 4,
58         SEPARATOR_TYPE = 5,
59         CASCADE_TYPE = 6,
60         PUSHRIGHT_TYPE = 7,
61         INCREMENTAL_TYPE = 8
62 } widget_value_type;
63
64 typedef enum _scroll_action {
65         SCROLLBAR_LINE_UP = 0,
66         SCROLLBAR_LINE_DOWN = 1,
67         SCROLLBAR_PAGE_UP = 2,
68         SCROLLBAR_PAGE_DOWN = 3,
69         SCROLLBAR_DRAG = 4,
70         SCROLLBAR_CHANGE = 5,
71         SCROLLBAR_TOP = 6,
72         SCROLLBAR_BOTTOM = 7
73 } scroll_action;
74
75 typedef struct _scroll_event {
76         scroll_action action;
77         int slider_value;
78         Time time;
79 } scroll_event;
80
81 typedef struct _scrollbar_values {
82         int line_increment;
83         int page_increment;
84
85         int minimum;
86         int maximum;
87
88         int slider_size;
89         int slider_position;
90
91         int scrollbar_width, scrollbar_height;
92         int scrollbar_x, scrollbar_y;
93 } scrollbar_values;
94
95 typedef struct _widget_args {
96         /* some things are only possible at creation time. args are applied
97            to widgets at creation time.  */
98         ArgList args;
99         int nargs;
100         /* Copying args is impossible so we make the caller give us heap allocated
101            args and free them when no one wants them any more. */
102         int ref_count;
103         /* Since we are reference counting we need to be able to determine
104            when something has changed. */
105         Boolean args_changed;
106 } widget_args;
107
108 typedef struct _widget_value {
109         /* This slot is only partially utilized right now. */
110         widget_value_type type;
111
112         /* name of widget */
113         char *name;
114         /* value (meaning BOGUSLY depends on widget type) */
115         char *value;
116         /* keyboard equivalent. no implications for XtTranslations */
117         char *key;
118         /* accelerator key.  For XEmacs, this should be a Lisp_Object holding a
119            char or symbol suitable for passing to event_matches_key_specifier_p.
120            Outside of emacs, this can be anything: an X KeySym is a good idea.
121            lwlib provides support functions for keyboard traversal of menus.  Actual
122            implementation of those accelerators is up to the application.
123          */
124         XtPointer accel;
125         /* true if enabled */
126         Boolean enabled;
127         /* true if selected */
128         Boolean selected;
129         /* true if was edited (maintained by get_value) */
130         Boolean edited;
131         /* true if has changed (maintained by lw library) */
132         change_type change;
133         /* Contents of sub-widgets, also selected slot for checkbox */
134         struct _widget_value *contents;
135         /* data passed to callback */
136         XtPointer call_data;
137         /* next in the list of siblings */
138         struct _widget_value *next;
139         /* slot for the toolkit dependent part.  Always initialize to NULL. */
140         void *toolkit_data;
141         /* tell us if we should free the toolkit data slot when freeing the
142            widget_value itself. */
143         Boolean free_toolkit_data;
144
145         /* data defining a scrollbar; only valid if type == "scrollbar" */
146         scrollbar_values *scrollbar_data;
147
148         /* A reference counted arg structure. */
149         struct _widget_args *args;
150         /* we resource the widget_value structures; this points to the next
151            one on the free list if this one has been deallocated.  */
152         struct _widget_value *free_list;
153
154 } widget_value;
155
156 typedef void (*lw_callback) (Widget w, LWLIB_ID id, XtPointer data);
157
158 /* menu stuff */
159 /* maybe this should go into a generic lwmenu.h */
160
161 extern int lw_menu_active;
162
163 #if defined (LWLIB_MENUBARS_LUCID)
164 #ifndef INCLUDED_xlwmenu_h_
165 #include "xlwmenu.h"
166 #endif
167 #define lw_set_menu xlw_set_menu
168 #define lw_push_menu xlw_push_menu
169 #define lw_pop_menu xlw_pop_menu
170 #define lw_set_item xlw_set_item
171 #define lw_map_menu xlw_map_menu
172 #define lw_display_menu xlw_display_menu
173 #define lw_kill_menus xlw_kill_menus
174 #define lw_get_entries xlw_get_entries
175 #define lw_menu_level xlw_menu_level
176 #else                           /* LWLIB_MENUBARS_LUCID */
177 /* do this for the other toolkits too */
178 #endif                          /* LWLIB_MENUBARS_LUCID */
179
180 #if defined (LWLIB_TABS_LUCID)
181 #include "xlwtabs.h"
182 #endif
183
184 void lw_register_widget(const char *type, const char *name, LWLIB_ID id,
185                         widget_value * val, lw_callback pre_activate_cb,
186                         lw_callback selection_cb, lw_callback post_activate_cb);
187 Widget lw_get_widget(LWLIB_ID id, Widget parent, Boolean pop_up_p);
188 Widget lw_make_widget(LWLIB_ID id, Widget parent, Boolean pop_up_p);
189 Widget lw_create_widget(const char *type, const char *name, LWLIB_ID id,
190                         widget_value * val, Widget parent, Boolean pop_up_p,
191                         lw_callback pre_activate_cb,
192                         lw_callback selection_cb, lw_callback post_activate_cb);
193 LWLIB_ID lw_get_widget_id(Widget w);
194 int lw_map_widget_values(LWLIB_ID id, int (*mapfunc) (widget_value * value,
195                                                       void *closure),
196                          void *closure);
197 void lw_modify_all_widgets(LWLIB_ID id, widget_value * val, Boolean deep_p);
198 void lw_destroy_widget(Widget w);
199 void lw_destroy_all_widgets(LWLIB_ID id);
200 void lw_destroy_everything(void);
201 void lw_destroy_all_pop_ups(void);
202 Widget lw_raise_all_pop_up_widgets(void);
203 widget_value *lw_get_all_values(LWLIB_ID id);
204 Boolean lw_get_some_values(LWLIB_ID id, widget_value * val);
205 void lw_pop_up_all_widgets(LWLIB_ID id);
206 void lw_pop_down_all_widgets(LWLIB_ID id);
207 void lw_add_value_args_to_args(widget_value * wv, ArgList addto, int *offset);
208 void lw_add_widget_value_arg(widget_value * wv, String name, XtArgVal value);
209 XtArgVal lw_get_value_arg(widget_value * wv, String name);
210 void lw_copy_widget_value_args(widget_value * copy, widget_value * val);
211 widget_value *copy_widget_value_tree(widget_value * val, change_type change);
212
213 widget_value *malloc_widget_value(void);
214 void free_widget_value(widget_value *);
215 void free_widget_value_tree(widget_value * wv);
216 widget_value *replace_widget_value_tree(widget_value *, widget_value *);
217
218 void lw_popup_menu(Widget, XEvent *);
219
220 /* Toolkit independent way of focusing on a Widget at the Xt level. */
221 void lw_set_keyboard_focus(Widget parent, Widget w);
222
223  /* Silly Energize hack to invert the "sheet" button */
224 void lw_show_busy(Widget w, Boolean busy);
225
226 void lw_remove_accelerator_spec(char *val);
227
228 #endif                          /* INCLUDED_lwlib_h_ */