1 //
2 // "$Id: Enumerations.H 8710 2011-05-21 21:55:59Z manolo $"
3 //
4 // Enumerations for the Fast Light Tool Kit (FLTK).
5 //
6 // Copyright 1998-2011 by Bill Spitzak and others.
7 //
8 // This library is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU Library General Public
10 // License as published by the Free Software Foundation; either
11 // version 2 of the License, or (at your option) any later version.
12 //
13 // This library is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 // Library General Public License for more details.
17 //
18 // You should have received a copy of the GNU Library General Public
19 // License along with this library; if not, write to the Free Software
20 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
21 // USA.
22 //
23 // Please report all bugs and problems on the following page:
24 //
25 //     http://www.fltk.org/str.php
26 //
27 
28 /** \file
29     This file contains type definitions and general enumerations.
30  */
31 
32 #ifndef Fl_Enumerations_H
33 #define Fl_Enumerations_H
34 
35 #  include "Fl_Export.H"
36 #  include "fl_types.h"
37 
38 /** \name Version Numbers
39 
40     FLTK defines some constants to help the programmer to
41     find out, for which FLTK version a program is compiled.
42 
43     The following constants are defined:
44  */
45 /*@{*/
46 
47 #define NTK_MAJOR_VERSION 1
48 #define NTK_MINOR_VERSION 0
49 #define NTK_PATCH_VERSION 0
50 
51 #define NTK_VERSION		((double)NTK_MAJOR_VERSION + \
52 				 (double)NTK_MINOR_VERSION * 0.01 + \
53 				 (double)NTK_PATCH_VERSION * 0.0001)
54 
55 /**
56    The major release version of this FLTK library.
57    \sa FL_VERSION
58  */
59 #define FL_MAJOR_VERSION	1
60 
61 /**
62    The minor release version for this library.
63 
64    FLTK remains mostly source-code compatible between minor version changes.
65  */
66 #define FL_MINOR_VERSION	3
67 
68 /**
69    The patch version for this library.
70 
71    FLTK remains binary compatible between patches.
72  */
73 #define FL_PATCH_VERSION	0
74 
75 /**
76     The FLTK version number as a \em double.
77 
78     FL_VERSION is a double that describes the major and minor version numbers.
79     Version 1.1 is actually stored as 1.01 to allow for more than 9 minor
80     releases.
81 
82     The FL_MAJOR_VERSION, FL_MINOR_VERSION, and FL_PATCH_VERSION constants
83     give the integral values for the major, minor, and patch releases
84     respectively.
85  */
86 #define FL_VERSION		((double)FL_MAJOR_VERSION + \
87 				 (double)FL_MINOR_VERSION * 0.01 + \
88 				 (double)FL_PATCH_VERSION * 0.0001)
89 
90 /*@}*/	// group: Version Numbers
91 
92 /**
93     Every time a user moves the mouse pointer, clicks a button,
94     or presses a key, an event is generated and sent to your
95     application. Events can also come from other programs like the
96     window manager.
97 
98     Events are identified by the integer argument passed to the
99     Fl_Widget::handle() virtual method. Other information about the
100     most recent event is stored in static locations and acquired  by
101     calling the Fl::event_*() methods. This static information remains
102     valid until the next event is read from the window system, so it
103     is ok to look at it outside of the handle() method.
104 
105     \sa Fl::event_text(), Fl::event_key(), class Fl::
106  */
107 enum Fl_Event {	// events
108   /** No event. */
109   FL_NO_EVENT		= 0,
110 
111   /** A mouse button has gone down with the mouse pointing at this
112       widget. You can find out what button by calling Fl::event_button().
113       You find out the mouse position by calling Fl::event_x() and
114       Fl::event_y().
115 
116       A widget indicates that it "wants" the mouse click by returning non-zero
117       from its Fl_Widget::handle() method. It will then become the
118       Fl::pushed() widget and will get FL_DRAG and the matching FL_RELEASE events.
119       If Fl_Widget::handle() returns zero then FLTK will try sending the FL_PUSH
120       to another widget.
121    */
122   FL_PUSH		= 1,
123 
124   /** A mouse button has been released. You can find out what button by
125       calling Fl::event_button().
126 
127       In order to receive the FL_RELEASE event, the widget must return
128       non-zero when handling FL_PUSH.
129    */
130   FL_RELEASE		= 2,
131 
132   /** The mouse has been moved to point at this widget.  This can
133       be used for highlighting feedback.  If a widget wants to
134       highlight or otherwise track the mouse, it indicates this by
135       returning non-zero from its handle() method. It then
136       becomes the Fl::belowmouse() widget and will receive
137       FL_MOVE and FL_LEAVE events.
138    */
139   FL_ENTER		= 3,
140 
141   /** The mouse has moved out of the widget.
142       In order to receive the FL_LEAVE event, the widget must
143       return non-zero when handling FL_ENTER.
144    */
145   FL_LEAVE		= 4,
146 
147   /** The mouse has moved with a button held down. The current button state
148       is in Fl::event_state(). The mouse position is in Fl::event_x() and
149       Fl::event_y().
150 
151       In order to receive FL_DRAG events, the widget must return non-zero
152       when handling FL_PUSH.
153    */
154   FL_DRAG		= 5,
155 
156   /** This indicates an <I>attempt</I> to give a widget the keyboard focus.
157 
158       If a widget wants the focus, it should change itself to display the
159       fact that it has the focus, and return non-zero from its handle() method.
160       It then becomes the Fl::focus() widget and gets FL_KEYDOWN, FL_KEYUP,
161       and FL_UNFOCUS events.
162 
163       The focus will change either because the window manager changed which
164       window gets the focus, or because the user tried to navigate using tab,
165       arrows, or other keys. You can check Fl::event_key() to figure out why
166       it moved. For navigation it will be the key pressed and for interaction
167       with the window manager it will be zero.
168    */
169   FL_FOCUS		= 6,
170 
171   /** This event is sent to the previous Fl::focus() widget when another
172       widget gets the focus or the window loses focus.
173    */
174   FL_UNFOCUS		= 7,
175 
176   /** A key was pressed (FL_KEYDOWN) or released (FL_KEYUP).
177       Fl_KEYBOARD is a synonym for FL_KEYDOWN.
178       The key can be found in Fl::event_key().
179       The text that the key should insert can be found with Fl::event_text()
180       and its length is in Fl::event_length(). If you use the key handle()
181       should return 1. If you return zero then FLTK assumes you ignored the
182       key and will then attempt to send it to a parent widget. If none of
183       them want it, it will change the event into a FL_SHORTCUT event.
184 
185       To receive FL_KEYBOARD events you must also respond to the FL_FOCUS
186       and FL_UNFOCUS events.
187 
188       If you are writing a text-editing widget you may also want to call
189       the Fl::compose() function to translate individual keystrokes into
190       non-ASCII characters.
191 
192       FL_KEYUP events are sent to the widget that currently has focus. This
193       is not necessarily the same widget that received the corresponding
194       FL_KEYDOWN event because focus may have changed between events.
195    */
196   FL_KEYDOWN		= 8,
197 
198   /** Equivalent to FL_KEYDOWN.
199       \see FL_KEYDOWN
200    */
201   FL_KEYBOARD		= 8,
202 
203   /** Key release event.
204       \see FL_KEYDOWN
205    */
206   FL_KEYUP		= 9,
207 
208   /** The user clicked the close button of a window.
209       This event is used internally only to trigger the callback of
210       Fl_Window derived classed. The default callback closes the
211       window calling Fl_Window::hide().
212    */
213   FL_CLOSE		= 10,
214 
215   /** The mouse has moved without any mouse buttons held down.
216       This event is sent to the Fl::belowmouse() widget.
217 
218       In order to receive FL_MOVE events, the widget must return
219       non-zero when handling FL_ENTER.
220    */
221   FL_MOVE		= 11,
222 
223   /** If the Fl::focus() widget is zero or ignores an FL_KEYBOARD
224       event then FLTK tries sending this event to every widget it
225       can, until one of them returns non-zero. FL_SHORTCUT is first
226       sent to the Fl::belowmouse() widget, then its parents and siblings,
227       and eventually to every widget in the window, trying to find an
228       object that returns non-zero. FLTK tries really hard to not to ignore
229       any keystrokes!
230 
231       You can also make "global" shortcuts by using Fl::add_handler(). A
232       global shortcut will work no matter what windows are displayed or
233       which one has the focus.
234    */
235   FL_SHORTCUT		= 12,
236 
237   /** This widget is no longer active, due to Fl_Widget::deactivate()
238       being called on it or one of its parents. Fl_Widget::active() may
239       still be true after this, the widget is only active if Fl_Widget::active()
240       is true on it and all its parents (use Fl_Widget::active_r() to check this).
241    */
242   FL_DEACTIVATE		= 13,
243 
244   /** This widget is now active, due to Fl_Widget::activate() being
245       called on it or one of its parents.
246    */
247   FL_ACTIVATE		= 14,
248 
249   /** This widget is no longer visible, due to Fl_Widget::hide() being
250       called on it or one of its parents, or due to a parent window being
251       minimized.  Fl_Widget::visible() may still be true after this, but the
252       widget is visible only if visible() is true for it and all its
253       parents (use Fl_Widget::visible_r() to check this).
254    */
255   FL_HIDE		= 15,
256 
257   /** This widget is visible again, due to Fl_Widget::show() being called on
258       it or one of its parents, or due to a parent window being restored.
259       Child Fl_Windows respond to this by actually creating the window if not
260       done already, so if you subclass a window, be sure to pass FL_SHOW
261       to the base class Fl_Widget::handle() method!
262    */
263   FL_SHOW		= 16,
264 
265   /** You should get this event some time after you call Fl::paste().
266       The contents of Fl::event_text() is the text to insert and the number
267       of characters is in Fl::event_length().
268    */
269   FL_PASTE		= 17,
270 
271   /** The Fl::selection_owner() will get this event before the selection is
272       moved to another widget. This indicates that some other widget or program
273       has claimed the selection. Motif programs used this to clear the selection
274       indication. Most modern programs ignore this.
275    */
276   FL_SELECTIONCLEAR	= 18,
277 
278   /** The user has moved the mouse wheel. The Fl::event_dx() and Fl::event_dy()
279       methods can be used to find the amount to scroll horizontally and vertically.
280    */
281   FL_MOUSEWHEEL		= 19,
282 
283   /** The mouse has been moved to point at this widget. A widget that is
284       interested in receiving drag'n'drop data must return 1 to receive
285       FL_DND_DRAG, FL_DND_LEAVE and FL_DND_RELEASE events.
286    */
287   FL_DND_ENTER		= 20,
288 
289   /** The mouse has been moved inside a widget while dragging data.  A
290       widget that is interested in receiving drag'n'drop data should
291       indicate the possible drop position.
292    */
293   FL_DND_DRAG		= 21,
294 
295   /** The mouse has moved out of the widget.
296    */
297   FL_DND_LEAVE		= 22,
298 
299   /** The user has released the mouse button dropping data into the widget.
300       If the widget returns 1, it will receive the data in the immediately
301       following FL_PASTE event.
302    */
303   FL_DND_RELEASE	= 23
304 };
305 
306 /** \name When Conditions */
307 /*@{*/
308 /** These constants determine when a callback is performed.
309 
310     \sa Fl_Widget::when();
311     \todo doxygen comments for values are incomplete and maybe wrong or unclear
312  */
313 enum Fl_When { // Fl_Widget::when():
314   FL_WHEN_NEVER		= 0,	///< Never call the callback
315   FL_WHEN_CHANGED	= 1,	///< Do the callback only when the widget value changes
316   FL_WHEN_NOT_CHANGED	= 2,	///< Do the callback whenever the user interacts with the widget
317   FL_WHEN_RELEASE	= 4,	///< Do the callback when the button or key is released and the value changes
318   FL_WHEN_RELEASE_ALWAYS= 6,	///< Do the callback when the button or key is released, even if the value doesn't change
319   FL_WHEN_ENTER_KEY	= 8,	///< Do the callback when the user presses the ENTER key and the value changes
320   FL_WHEN_ENTER_KEY_ALWAYS=10,	///< Do the callback when the user presses the ENTER key, even if the value doesn't change
321   FL_WHEN_ENTER_KEY_CHANGED=11	///< ?
322 };
323 
324 /*@}*/		// group: When Conditions
325 
326 /** \name Mouse and Keyboard Events
327 
328 	This and the following constants define the non-ASCII keys on the
329 	keyboard for FL_KEYBOARD and FL_SHORTCUT events.
330 
331 	\todo	FL_Button and FL_key... constants could be structured better
332 		(use an enum or some doxygen grouping ?)
333 
334 	\sa	Fl::event_key() and Fl::get_key(int) (use ascii letters for all other keys):
335  */
336 
337 /*@{*/
338 
339 // FIXME: These codes collide with valid Unicode keys
340 
341 #define FL_Button	0xfee8	///< A mouse button; use Fl_Button + n for mouse button n.
342 #define FL_BackSpace	0xff08	///< The backspace key.
343 #define FL_Tab		0xff09	///< The tab key.
344 #define FL_Enter	0xff0d	///< The enter key.
345 #define FL_Pause	0xff13	///< The pause key.
346 #define FL_Scroll_Lock	0xff14	///< The scroll lock key.
347 #define FL_Escape	0xff1b	///< The escape key.
348 #define FL_Home		0xff50	///< The home key.
349 #define FL_Left		0xff51	///< The left arrow key.
350 #define FL_Up		0xff52	///< The up arrow key.
351 #define FL_Right	0xff53	///< The right arrow key.
352 #define FL_Down		0xff54	///< The down arrow key.
353 #define FL_Page_Up	0xff55	///< The page-up key.
354 #define FL_Page_Down	0xff56	///< The page-down key.
355 #define FL_End		0xff57	///< The end key.
356 #define FL_Print	0xff61	///< The print (or print-screen) key.
357 #define FL_Insert	0xff63	///< The insert key.
358 #define FL_Menu		0xff67	///< The menu key.
359 #define FL_Help		0xff68	///< The 'help' key on Mac keyboards
360 #define FL_Num_Lock	0xff7f	///< The num lock key.
361 #define FL_KP		0xff80	///< One of the keypad numbers; use FL_KP + n for number n.
362 #define FL_KP_Enter	0xff8d	///< The enter key on the keypad, same as Fl_KP+'\\r'.
363 #define FL_KP_Last	0xffbd	///< The last keypad key; use to range-check keypad.
364 #define FL_F		0xffbd	///< One of the function keys; use FL_F + n for function key n.
365 #define FL_F_Last	0xffe0	///< The last function key; use to range-check function keys.
366 #define FL_Shift_L	0xffe1	///< The lefthand shift key.
367 #define FL_Shift_R	0xffe2	///< The righthand shift key.
368 #define FL_Control_L	0xffe3	///< The lefthand control key.
369 #define FL_Control_R	0xffe4	///< The righthand control key.
370 #define FL_Caps_Lock	0xffe5	///< The caps lock key.
371 #define FL_Meta_L	0xffe7	///< The left meta/Windows key.
372 #define FL_Meta_R	0xffe8	///< The right meta/Windows key.
373 #define FL_Alt_L	0xffe9	///< The left alt key.
374 #define FL_Alt_R	0xffea	///< The right alt key.
375 #define FL_Delete	0xffff	///< The delete key.
376 
377 // These use the Private Use Area (PUA) of the Basic Multilingual Plane
378 // of Unicode. Guaranteed not to conflict with a proper Unicode character.
379 
380 // These primarily map to the XFree86 keysym range
381 #define FL_Volume_Down  0xEF11   /* Volume control down        */
382 #define FL_Volume_Mute  0xEF12   /* Mute sound from the system */
383 #define FL_Volume_Up    0xEF13   /* Volume control up          */
384 #define FL_Media_Play   0xEF14   /* Start playing of audio     */
385 #define FL_Media_Stop   0xEF15   /* Stop playing audio         */
386 #define FL_Media_Prev   0xEF16   /* Previous track             */
387 #define FL_Media_Next   0xEF17   /* Next track                 */
388 #define FL_Home_Page    0xEF18   /* Display user's home page   */
389 #define FL_Mail         0xEF19   /* Invoke user's mail program */
390 #define FL_Search       0xEF1B   /* Search                     */
391 #define FL_Back         0xEF26   /* Like back on a browser     */
392 #define FL_Forward      0xEF27   /* Like forward on a browser  */
393 #define FL_Stop         0xEF28   /* Stop current operation     */
394 #define FL_Refresh      0xEF29   /* Refresh the page           */
395 #define FL_Sleep        0xEF2F   /* Put system to sleep        */
396 #define FL_Favorites    0xEF30   /* Show favorite locations    */
397 
398 /*@}*/	// group: Mouse and Keyboard Events
399 
400 /** \name Mouse Buttons
401 
402 	These constants define the button numbers for FL_PUSH and FL_RELEASE events.
403 
404 	\sa Fl::event_button()
405 */
406 
407 /*@{*/
408 
409 #define FL_LEFT_MOUSE	1	///< The left mouse button
410 #define FL_MIDDLE_MOUSE	2	///< The middle mouse button
411 #define FL_RIGHT_MOUSE	3	///< The right mouse button
412 
413 /*@}*/		// group: Mouse Buttons
414 
415 
416 /** \name	Event States
417 
418 	The following constants define bits in the Fl::event_state() value.
419 */
420 
421 /*@{*/		// group: Event States
422 
423 // FIXME: it would be nice to have the modifiers in the upper 8 bit so that
424 //        a unicode ke (24bit) can be sent as an unsigned with the modifiers.
425 
426 #define FL_SHIFT	0x00010000	///< One of the shift keys is down
427 #define FL_CAPS_LOCK	0x00020000	///< The caps lock is on
428 #define FL_CTRL		0x00040000	///< One of the ctrl keys is down
429 #define FL_ALT		0x00080000	///< One of the alt keys is down
430 #define FL_NUM_LOCK	0x00100000	///< The num lock is on
431 					// most X servers do this?
432 #define FL_META		0x00400000	///< One of the meta/Windows keys is down
433 					// correct for XFree86
434 #define FL_SCROLL_LOCK	0x00800000	///< The scroll lock is on
435 					// correct for XFree86
436 #define FL_BUTTON1	0x01000000	///< Mouse button 1 is pushed
437 #define FL_BUTTON2	0x02000000	///< Mouse button 2 is pushed
438 #define FL_BUTTON3	0x04000000	///< Mouse button 3 is pushed
439 #define FL_BUTTONS	0x7f000000	///< Any mouse button is pushed
440 #define FL_BUTTON(n)	(0x00800000<<(n)) ///< Mouse button n (n > 0) is pushed
441 
442 #define FL_KEY_MASK 0x0000ffff		///< All keys are 16 bit for now
443 					//   FIXME: Unicode needs 24 bits!
444 
445 #ifdef __APPLE__
446 #  define FL_COMMAND	FL_META		///< An alias for FL_CTRL on WIN32 and X11, or FL_META on MacOS X
447 #  define FL_CONTROL 	FL_CTRL		///< An alias for FL_META on WIN32 and X11, or FL_CTRL on MacOS X
448 #else
449 #  define FL_COMMAND	FL_CTRL		///< An alias for FL_CTRL on WIN32 and X11, or FL_META on MacOS X
450 #  define FL_CONTROL	FL_META		///< An alias for FL_META on WIN32 and X11, or FL_CTRL on MacOS X
451 #endif // __APPLE__
452 
453 /*@}*/		// group: Event States
454 
455 /** \name Box Types
456     \brief FLTK standard box types
457 
458     This enum defines the standard box types included with FLTK.
459 
460     FL_NO_BOX means nothing is drawn at all, so whatever is already
461     on the screen remains. The FL_..._FRAME types only draw their edges,
462     leaving the interior unchanged. The blue color in Figure 1
463     is the area that is not drawn by the frame types.
464 
465     \image html boxtypes.png "Figure 1: FLTK standard box types"
466     \image latex boxtypes.png "FLTK standard box types" width=10cm
467     \todo	Description of boxtypes is incomplete.
468     		See below for the defined enum Fl_Boxtype.
469 		\see src/Fl_get_system_colors.cxx
470 */
471 /*@{*/
472 enum Fl_Boxtype { // boxtypes (if you change these you must fix fl_boxtype.C):
473 
474   FL_NO_BOX = 0,		///< nothing is drawn at all, this box is invisible
475   FL_FLAT_BOX,			///< a flat box
476   FL_UP_BOX,			///< see figure 1
477   FL_DOWN_BOX,			///< see figure 1
478   FL_UP_FRAME,			///< see figure 1
479   FL_DOWN_FRAME,		///< see figure 1
480   FL_THIN_UP_BOX,		///< see figure 1
481   FL_THIN_DOWN_BOX,		///< see figure 1
482   FL_THIN_UP_FRAME,		///< see figure 1
483   FL_THIN_DOWN_FRAME,		///< see figure 1
484   FL_ENGRAVED_BOX,		///< see figure 1
485   FL_EMBOSSED_BOX,		///< see figure 1
486   FL_ENGRAVED_FRAME,		///< see figure 1
487   FL_EMBOSSED_FRAME,		///< see figure 1
488   FL_BORDER_BOX,		///< see figure 1
489   _FL_SHADOW_BOX,		///< see figure 1
490   FL_BORDER_FRAME,		///< see figure 1
491   _FL_SHADOW_FRAME,		///< see figure 1
492   _FL_ROUNDED_BOX,		///< see figure 1
493   _FL_RSHADOW_BOX,		///< see figure 1
494   _FL_ROUNDED_FRAME,		///< see figure 1
495   _FL_RFLAT_BOX,		///< see figure 1
496   _FL_ROUND_UP_BOX,		///< see figure 1
497   _FL_ROUND_DOWN_BOX,		///< see figure 1
498   _FL_DIAMOND_UP_BOX,		///< see figure 1
499   _FL_DIAMOND_DOWN_BOX,		///< see figure 1
500   _FL_OVAL_BOX,			///< see figure 1
501   _FL_OSHADOW_BOX,		///< see figure 1
502   _FL_OVAL_FRAME,		///< see figure 1
503   _FL_OFLAT_BOX,		///< see figure 1
504   FL_FOCUS_FRAME,
505   _FL_ASYM_BOX,
506   _FL_ASYM_FLAT_BOX,
507   FL_FREE_BOXTYPE		///< the first free box type for creation of new box types
508 };
509 extern FL_EXPORT Fl_Boxtype fl_define_FL_ROUND_UP_BOX();
510 #define FL_ROUND_UP_BOX fl_define_FL_ROUND_UP_BOX()
511 #define FL_ROUND_DOWN_BOX (Fl_Boxtype)(fl_define_FL_ROUND_UP_BOX()+1)
512 extern FL_EXPORT Fl_Boxtype fl_define_FL_SHADOW_BOX();
513 #define FL_SHADOW_BOX fl_define_FL_SHADOW_BOX()
514 #define FL_SHADOW_FRAME (Fl_Boxtype)(fl_define_FL_SHADOW_BOX()+2)
515 extern FL_EXPORT Fl_Boxtype fl_define_FL_ROUNDED_BOX();
516 #define FL_ROUNDED_BOX fl_define_FL_ROUNDED_BOX()
517 #define FL_ROUNDED_FRAME (Fl_Boxtype)(fl_define_FL_ROUNDED_BOX()+2)
518 extern FL_EXPORT Fl_Boxtype fl_define_FL_RFLAT_BOX();
519 #define FL_RFLAT_BOX fl_define_FL_RFLAT_BOX()
520 extern FL_EXPORT Fl_Boxtype fl_define_FL_RSHADOW_BOX();
521 #define FL_RSHADOW_BOX fl_define_FL_RSHADOW_BOX()
522 extern FL_EXPORT Fl_Boxtype fl_define_FL_DIAMOND_BOX();
523 #define FL_DIAMOND_UP_BOX fl_define_FL_DIAMOND_BOX()
524 #define FL_DIAMOND_DOWN_BOX (Fl_Boxtype)(fl_define_FL_DIAMOND_BOX()+1)
525 extern FL_EXPORT Fl_Boxtype fl_define_FL_OVAL_BOX();
526 #define FL_OVAL_BOX fl_define_FL_OVAL_BOX()
527 #define FL_OSHADOW_BOX (Fl_Boxtype)(fl_define_FL_OVAL_BOX()+1)
528 #define FL_OVAL_FRAME (Fl_Boxtype)(fl_define_FL_OVAL_BOX()+2)
529 #define FL_OFLAT_BOX (Fl_Boxtype)(fl_define_FL_OVAL_BOX()+3)
530 
531 extern FL_EXPORT Fl_Boxtype fl_define_FL_ASYM_BOX();
532 #define FL_ASYM_BOX fl_define_FL_ASYM_BOX()
533 #define FL_ASYM_FLAT_BOX (Fl_Boxtype)(fl_define_FL_ASYM_BOX()+1)
534 
535 #define FL_PLASTIC_UP_BOX FL_UP_BOX
536 #define FL_PLASTIC_DOWN_BOX FL_DOWN_BOX
537 #define FL_PLASTIC_UP_FRAME FL_UP_FRAME
538 #define FL_PLASTIC_DOWN_FRAME FL_DOWN_FRAME
539 #define FL_PLASTIC_THIN_UP_BOX FL_THIN_UP_BOX
540 #define FL_PLASTIC_THIN_DOWN_BOX FL_THIN_DOWN_BOX
541 #define FL_PLASTIC_ROUND_UP_BOX FL_ROUND_UP_BOX
542 #define FL_PLASTIC_ROUND_DOWN_BOX FL_ROUND_DOWN_BOX
543 
544 #define FL_GTK_UP_BOX FL_UP_BOX
545 #define FL_GTK_DOWN_BOX FL_DOWN_BOX
546 #define FL_GTK_UP_FRAME FL_UP_FRAME
547 #define FL_GTK_DOWN_FRAME FL_DOWN_FRAME
548 #define FL_GTK_THIN_UP_BOX FL_THIN_UP_BOX
549 #define FL_GTK_THIN_UP_FRAME FL_THIN_UP_FRAME
550 #define FL_GTK_THIN_DOWN_FRAME FL_THIN_DOWN_FRAME
551 #define FL_GTK_THIN_DOWN_BOX FL_THIN_DOWN_BOX
552 #define FL_GTK_ROUND_UP_BOX FL_ROUND_UP_BOX
553 #define FL_GTK_ROUND_DOWN_BOX FL_ROUND_DOWN_BOX
554 
555 // conversions of box types to other boxtypes:
556 /**
557   Get the filled version of a frame.
558   If no filled version of a given frame exists, the behavior of this function
559   is undefined and some random box or frame is returned.
560  */
fl_box(Fl_Boxtype b)561 inline Fl_Boxtype fl_box(Fl_Boxtype b) {
562   return (Fl_Boxtype)((b<FL_UP_BOX||b%4>1)?b:(b-2));
563 }
564 /**
565   Get the "pressed" or "down" version of a box.
566   If no "down" version of a given box exists, the behavior of this function
567   is undefined and some random box or frame is returned.
568  */
fl_down(Fl_Boxtype b)569 inline Fl_Boxtype fl_down(Fl_Boxtype b) {
570   return (Fl_Boxtype)((b<FL_UP_BOX)?b:(b|1));
571 }
572 /**
573   Get the unfilled, frame only version of a box.
574   If no frame version of a given box exists, the behavior of this function
575   is undefined and some random box or frame is returned.
576  */
fl_frame(Fl_Boxtype b)577 inline Fl_Boxtype fl_frame(Fl_Boxtype b) {
578   return (Fl_Boxtype)((b%4<2)?b:(b+2));
579 }
580 
581 // back-compatibility box types:
582 #define FL_FRAME FL_ENGRAVED_FRAME
583 #define FL_FRAME_BOX FL_ENGRAVED_BOX
584 #define FL_CIRCLE_BOX FL_ROUND_DOWN_BOX
585 #define FL_DIAMOND_BOX FL_DIAMOND_DOWN_BOX
586 
587 /*@}*/	// group: Box Types
588 
589 /**
590    The labeltype() method sets the type of the label.
591 
592    The following standard label types are included:
593 
594    \todo	The doxygen comments are incomplete, and some labeltypes
595    		are starting with an underscore. Also, there are three
596 		external functions undocumented (yet):
597 		  - fl_define_FL_SHADOW_LABEL()
598 		  - fl_define_FL_ENGRAVED_LABEL()
599 		  - fl_define_FL_EMBOSSED_LABEL()
600 */
601 enum Fl_Labeltype {	// labeltypes:
602   FL_NORMAL_LABEL	= 0,	///< draws the text (0)
603   FL_NO_LABEL,			///< does nothing
604   _FL_SHADOW_LABEL,		///< draws a drop shadow under the text
605   _FL_ENGRAVED_LABEL,		///< draws edges as though the text is engraved
606   _FL_EMBOSSED_LABEL,		///< draws edges as though the text is raised
607   _FL_MULTI_LABEL,		///< ?
608   _FL_ICON_LABEL,		///< draws the icon associated with the text
609   _FL_IMAGE_LABEL,		///< ?
610 
611   FL_FREE_LABELTYPE		///< first free labeltype to use for creating own labeltypes
612 };
613 
614 /**
615   Sets the current label type and return its corresponding Fl_Labeltype value.
616   @{
617 */
618 #define FL_SYMBOL_LABEL FL_NORMAL_LABEL
619 extern Fl_Labeltype FL_EXPORT fl_define_FL_SHADOW_LABEL();
620 #define FL_SHADOW_LABEL fl_define_FL_SHADOW_LABEL()
621 extern Fl_Labeltype FL_EXPORT fl_define_FL_ENGRAVED_LABEL();
622 #define FL_ENGRAVED_LABEL fl_define_FL_ENGRAVED_LABEL()
623 extern Fl_Labeltype FL_EXPORT fl_define_FL_EMBOSSED_LABEL();
624 #define FL_EMBOSSED_LABEL fl_define_FL_EMBOSSED_LABEL()
625 /** @} */
626 
627 /** \name Alignment Flags
628     Flags to control the label alignment.
629     This controls how the label is displayed next to or inside the widget.
630     The default value is FL_ALIGN_CENTER for most widgets, which centers the label
631     inside the widget.
632 
633     Flags can be or'd to achieve a combination of alignments.
634 
635     \code
636     Outside alignments:
637                TOP_LEFT        TOP       TOP_RIGHT
638        LEFT_TOP+---------------------------------+RIGHT_TOP
639                |                                 |
640            LEFT|                                 |RIGHT
641                |                                 |
642     LEFT_BOTTOM+---------------------------------+RIGHT_BOTTOM
643                BOTTOM_RIGHT   BOTTOM   BOTTOM_LEFT
644 
645     Inside alignments:
646                +---------------------------------+
647                |TOP_LEFT       TOP      TOP_RIGHT|
648                |                                 |
649                |LEFT                        RIGHT|
650                |                                 |
651                |BOTTOM_RIGHT  BOTTOM  BOTTOM_LEFT|
652                +---------------------------------+
653     \endcode
654     \see #FL_ALIGN_CENTER, etc.
655  */
656 /*@{*/
657 /** FLTK type for alignment control */
658 typedef unsigned Fl_Align;
659   /** Align the label horizontally in the middle. */
660 const Fl_Align FL_ALIGN_CENTER		= (Fl_Align)0;
661   /** Align the label at the top of the widget. Inside labels appear below the top,
662       outside labels are drawn on top of the widget. */
663 const Fl_Align FL_ALIGN_TOP		= (Fl_Align)1;
664   /** Align the label at the bottom of the widget. */
665 const Fl_Align FL_ALIGN_BOTTOM		= (Fl_Align)2;
666   /** Align the label at the left of the widget. Inside labels appear left-justified
667       starting at the left side of the widget, outside labels are right-justified and
668       drawn to the left of the widget. */
669 const Fl_Align FL_ALIGN_LEFT		= (Fl_Align)4;
670   /** Align the label to the right of the widget. */
671 const Fl_Align FL_ALIGN_RIGHT		= (Fl_Align)8;
672   /** Draw the label inside of the widget. */
673 const Fl_Align FL_ALIGN_INSIDE		= (Fl_Align)16;
674   /** If the label contains an image, draw the text on top of the image. */
675 const Fl_Align FL_ALIGN_TEXT_OVER_IMAGE	= (Fl_Align)0x0020;
676   /** If the label contains an image, draw the text below the image. */
677 const Fl_Align FL_ALIGN_IMAGE_OVER_TEXT	= (Fl_Align)0x0000;
678   /** All parts of the label that are lager than the widget will not be drawn . */
679 const Fl_Align FL_ALIGN_CLIP		= (Fl_Align)64;
680   /** Wrap text that does not fit the width of the widget. */
681 const Fl_Align FL_ALIGN_WRAP		= (Fl_Align)128;
682   /** If the label contains an image, draw the text to the right of the image. */
683 const Fl_Align FL_ALIGN_IMAGE_NEXT_TO_TEXT = (Fl_Align)0x0100;
684   /** If the label contains an image, draw the text to the left of the image. */
685 const Fl_Align FL_ALIGN_TEXT_NEXT_TO_IMAGE = (Fl_Align)0x0120;
686 /** If the label contains an image, draw the image or deimage in the background. */
687 const Fl_Align FL_ALIGN_IMAGE_BACKDROP  = (Fl_Align)0x0200;
688 const Fl_Align FL_ALIGN_TOP_LEFT	= FL_ALIGN_TOP | FL_ALIGN_LEFT;
689 const Fl_Align FL_ALIGN_TOP_RIGHT	= FL_ALIGN_TOP | FL_ALIGN_RIGHT;
690 const Fl_Align FL_ALIGN_BOTTOM_LEFT	= FL_ALIGN_BOTTOM | FL_ALIGN_LEFT;
691 const Fl_Align FL_ALIGN_BOTTOM_RIGHT	= FL_ALIGN_BOTTOM | FL_ALIGN_RIGHT;
692 const Fl_Align FL_ALIGN_LEFT_TOP	= 0x0007; // magic value
693 const Fl_Align FL_ALIGN_RIGHT_TOP	= 0x000b; // magic value
694 const Fl_Align FL_ALIGN_LEFT_BOTTOM	= 0x000d; // magic value
695 const Fl_Align FL_ALIGN_RIGHT_BOTTOM	= 0x000e; // magic value
696 const Fl_Align FL_ALIGN_NOWRAP		= (Fl_Align)0; // for back compatibility
697 const Fl_Align FL_ALIGN_POSITION_MASK   = 0x000f; // left, right, top, bottom
698 const Fl_Align FL_ALIGN_IMAGE_MASK      = 0x0320; // l/r, t/b, backdrop
699 /*@}*/
700 
701 
702 /** \name Font Numbers
703     The following constants define the standard FLTK fonts:
704  */
705 /*@{*/
706 /** A font number is an index into the internal font table. */
707 typedef int Fl_Font;
708 
709 const Fl_Font FL_HELVETICA              = 0;	///< Helvetica (or Arial) normal (0)
710 const Fl_Font FL_HELVETICA_BOLD         = 1;	///< Helvetica (or Arial) bold
711 const Fl_Font FL_HELVETICA_ITALIC       = 2;	///< Helvetica (or Arial) oblique
712 const Fl_Font FL_HELVETICA_BOLD_ITALIC  = 3;	///< Helvetica (or Arial) bold-oblique
713 const Fl_Font FL_COURIER                = 4;	///< Courier normal
714 const Fl_Font FL_COURIER_BOLD           = 5;	///< Courier bold
715 const Fl_Font FL_COURIER_ITALIC         = 6;	///< Courier italic
716 const Fl_Font FL_COURIER_BOLD_ITALIC    = 7;	///< Courier bold-italic
717 const Fl_Font FL_TIMES                  = 8;	///< Times roman
718 const Fl_Font FL_TIMES_BOLD             = 9;	///< Times roman bold
719 const Fl_Font FL_TIMES_ITALIC           = 10;	///< Times roman italic
720 const Fl_Font FL_TIMES_BOLD_ITALIC      = 11;	///< Times roman bold-italic
721 const Fl_Font FL_SYMBOL                 = 12;	///< Standard symbol font
722 const Fl_Font FL_SCREEN                 = 13;	///< Default monospaced screen font
723 const Fl_Font FL_SCREEN_BOLD            = 14;	///< Default monospaced bold screen font
724 const Fl_Font FL_ZAPF_DINGBATS          = 15;	///< Zapf-dingbats font
725 
726 const Fl_Font FL_FREE_FONT              = 16;	///< first one to allocate
727 const Fl_Font FL_BOLD                   = 1;	///< add this to helvetica, courier, or times
728 const Fl_Font FL_ITALIC                 = 2;	///< add this to helvetica, courier, or times
729 const Fl_Font FL_BOLD_ITALIC            = 3;	///< add this to helvetica, courier, or times
730 
731 /*@}*/
732 
733 /** Size of a font in pixels.
734     This is the approximate height of a font in pixels.
735  */
736 typedef int Fl_Fontsize;
737 
738 extern FL_EXPORT Fl_Fontsize FL_NORMAL_SIZE;	///< normal font size
739 
740 /** \name Colors
741     The Fl_Color type holds an FLTK color value.
742 
743     Colors are either 8-bit indexes into a virtual colormap
744     or 24-bit RGB color values.
745 
746     Color indices occupy the lower 8 bits of the value, while
747     RGB colors occupy the upper 24 bits, for a byte organization of RGBI.
748 
749 <pre>
750  Fl_Color => 0xrrggbbii
751                 | | | |
752                 | | | +--- index between 0 and 255
753                 | | +----- blue color component (8 bit)
754                 | +------- green component (8 bit)
755                 +--------- red component (8 bit)
756  </pre>
757 
758     A color can have either an index or an rgb value. Colors with rgb set
759     and an index >0 are reserved for special use.
760 
761  */
762 /*@{*/
763 /** an FLTK color value */
764 typedef unsigned int Fl_Color;
765 
766 // Standard colors. These are used as default colors in widgets and altered as necessary
767 const Fl_Color FL_FOREGROUND_COLOR  = 0;	///< the default foreground color (0) used for labels and text
768 const Fl_Color FL_BACKGROUND2_COLOR = 7;	///< the default background color for text, list, and valuator widgets
769 const Fl_Color FL_INACTIVE_COLOR    = 8;	///< the inactive foreground color
770 const Fl_Color FL_SELECTION_COLOR   = 15;	///< the default selection/highlight color
771 
772   // boxtypes generally limit themselves to these colors so
773   // the whole ramp is not allocated:
774 
775 const Fl_Color FL_GRAY0   = 32;			// 'A'
776 const Fl_Color FL_DARK3   = 39;			// 'H'
777 const Fl_Color FL_DARK2   = 45;			// 'N'
778 const Fl_Color FL_DARK1   = 47;			// 'P'
779 const Fl_Color FL_BACKGROUND_COLOR  = 49;	// 'R' default background color
780 const Fl_Color FL_LIGHT1  = 50;			// 'S'
781 const Fl_Color FL_LIGHT2  = 52;			// 'U'
782 const Fl_Color FL_LIGHT3  = 54;			// 'W'
783 
784   // FLTK provides a 5x8x5 color cube that is used with colormap visuals
785 
786 const Fl_Color FL_BLACK   = 56;
787 const Fl_Color FL_RED     = 88;
788 const Fl_Color FL_GREEN   = 63;
789 const Fl_Color FL_YELLOW  = 95;
790 const Fl_Color FL_BLUE    = 216;
791 const Fl_Color FL_MAGENTA = 248;
792 const Fl_Color FL_CYAN    = 223;
793 const Fl_Color FL_DARK_RED = 72;
794 
795 const Fl_Color FL_DARK_GREEN    = 60;
796 const Fl_Color FL_DARK_YELLOW   = 76;
797 const Fl_Color FL_DARK_BLUE     = 136;
798 const Fl_Color FL_DARK_MAGENTA  = 152;
799 const Fl_Color FL_DARK_CYAN     = 140;
800 
801 const Fl_Color FL_WHITE         = 255;
802 
803 
804 #define FL_FREE_COLOR     (Fl_Color)16
805 #define FL_NUM_FREE_COLOR 16
806 #define FL_GRAY_RAMP      (Fl_Color)32
807 #define FL_NUM_GRAY       24
808 #define FL_GRAY           FL_BACKGROUND_COLOR
809 #define FL_COLOR_CUBE     (Fl_Color)56
810 #define FL_NUM_RED        5
811 #define FL_NUM_GREEN      8
812 #define FL_NUM_BLUE       5
813 
814 FL_EXPORT Fl_Color fl_inactive(Fl_Color c);
815 
816 FL_EXPORT Fl_Color fl_contrast(Fl_Color fg, Fl_Color bg);
817 
818 FL_EXPORT Fl_Color fl_color_average(Fl_Color c1, Fl_Color c2, float weight);
819 
820 FL_EXPORT Fl_Color fl_color_add_alpha( Fl_Color c, uchar alpha );
821 
822 /** Returns a lighter version of the specified color. */
fl_lighter(Fl_Color c)823 inline Fl_Color fl_lighter(Fl_Color c) { return fl_color_average(c, FL_WHITE, .67f); }
824 
825 /** Returns a darker version of the specified color. */
fl_darker(Fl_Color c)826 inline Fl_Color fl_darker(Fl_Color c) { return fl_color_average(c, FL_BLACK, .67f); }
827 
828 /** Returns the 24-bit color value closest to \p r, \p g, \p b. */
fl_rgb_color(uchar r,uchar g,uchar b)829 inline Fl_Color fl_rgb_color(uchar r, uchar g, uchar b) {
830   if (!r && !g && !b) return FL_BLACK;
831   else return (Fl_Color)(((((r << 8) | g) << 8) | b) << 8);
832 }
833 
834 /** Returns the 24-bit color value closest to \p g (grayscale). */
fl_rgb_color(uchar g)835 inline Fl_Color fl_rgb_color(uchar g) {
836   if (!g) return FL_BLACK;
837   else return (Fl_Color)(((((g << 8) | g) << 8) | g) << 8);
838 }
839 
840 /** Returns a gray color value from black (i == 0) to white (i == FL_NUM_GRAY - 1).
841     FL_NUM_GRAY is defined to be 24 in the current FLTK release.
842     To get the closest FLTK gray value to an 8-bit grayscale color 'I' use:
843 
844  \code
845    fl_gray_ramp(I * (FL_NUM_GRAY - 1) / 255)
846  \endcode
847 */
fl_gray_ramp(int i)848 inline Fl_Color fl_gray_ramp(int i) {return (Fl_Color)(i+FL_GRAY_RAMP);}
849 
850 /** Returns a color out of the color cube.
851 
852   \p r must be in the range 0 to FL_NUM_RED (5) minus 1,
853   \p g must be in the range 0 to FL_NUM_GREEN (8) minus 1,
854   \p b must be in the range 0 to FL_NUM_BLUE (5) minus 1.
855 
856   To get the closest color to a 8-bit set of R,G,B values use:
857 
858   \code
859     fl_color_cube(R * (FL_NUM_RED - 1) / 255,
860        G * (FL_NUM_GREEN - 1) / 255,
861        B * (FL_NUM_BLUE - 1) / 255);
862   \endcode
863  */
fl_color_cube(int r,int g,int b)864 inline Fl_Color fl_color_cube(int r, int g, int b) {
865   return (Fl_Color)((b*FL_NUM_RED + r) * FL_NUM_GREEN + g + FL_COLOR_CUBE);}
866 
867 /*@}*/		// group: Colors
868 
869 /** \name Cursors */
870 /*@{*/
871 
872 /** The following constants define the mouse cursors that are available in FLTK.
873 
874     The double-headed arrows are bitmaps provided by FLTK on X, the others
875     are provided by system-defined cursors.
876 
877     \todo enum Fl_Cursor needs maybe an image.
878 */
879 enum Fl_Cursor {
880   FL_CURSOR_DEFAULT	=  0, /**< the default cursor, usually an arrow. */
881   FL_CURSOR_ARROW	= 35, /**< an arrow pointer. */
882   FL_CURSOR_CROSS	= 66, /**< crosshair. */
883   FL_CURSOR_WAIT	= 76, /**< watch or hourglass. */
884   FL_CURSOR_INSERT	= 77, /**< I-beam. */
885   FL_CURSOR_HAND	= 31, /**< hand (uparrow on MSWindows). */
886   FL_CURSOR_HELP	= 47, /**< question mark. */
887   FL_CURSOR_MOVE	= 27, /**< 4-pointed arrow. */
888   // fltk provides bitmaps for these:
889   FL_CURSOR_NS		= 78, /**< up/down arrow. */
890   FL_CURSOR_WE		= 79, /**< left/right arrow. */
891   FL_CURSOR_NWSE	= 80, /**< diagonal arrow. */
892   FL_CURSOR_NESW	= 81, /**< diagonal arrow. */
893   FL_CURSOR_NONE	=255, /**< invisible. */
894   // for back compatibility (non MSWindows ones):
895   FL_CURSOR_N		= 70, /**< for back compatibility. */
896   FL_CURSOR_NE		= 69, /**< for back compatibility. */
897   FL_CURSOR_E		= 49, /**< for back compatibility. */
898   FL_CURSOR_SE		=  8, /**< for back compatibility. */
899   FL_CURSOR_S		=  9, /**< for back compatibility. */
900   FL_CURSOR_SW		=  7, /**< for back compatibility. */
901   FL_CURSOR_W		= 36, /**< for back compatibility. */
902   FL_CURSOR_NW		= 68 /**< for back compatibility. */
903 };
904 /*@}*/		// group: Cursors
905 
906 /** FD "when" conditions */
907 enum { // values for "when" passed to Fl::add_fd()
908   FL_READ   = 1, /**< Call the callback when there is data to be read. */
909   FL_WRITE  = 4, /**< Call the callback when data can be written without blocking. */
910   FL_EXCEPT = 8  /**< Call the callback if an exception occurs on the file. */
911 };
912 
913 /** visual types and Fl_Gl_Window::mode() (values match Glut) */
914 enum Fl_Mode {
915   FL_RGB	= 0,
916   FL_INDEX	= 1,
917   FL_SINGLE	= 0,
918   FL_DOUBLE	= 2,
919   FL_ACCUM	= 4,
920   FL_ALPHA	= 8,
921   FL_DEPTH	= 16,
922   FL_STENCIL	= 32,
923   FL_RGB8	= 64,
924   FL_MULTISAMPLE= 128,
925   FL_STEREO     = 256,
926   FL_FAKE_SINGLE = 512	// Fake single buffered windows using double-buffer
927 };
928 
929 // image alpha blending
930 
931 #define FL_IMAGE_WITH_ALPHA 0x40000000
932 
933 /** Damage masks */
934 enum Fl_Damage {
935   FL_DAMAGE_CHILD    = 0x01, /**< A child needs to be redrawn. */
936   FL_DAMAGE_EXPOSE   = 0x02, /**< The window was exposed. */
937   FL_DAMAGE_SCROLL   = 0x04, /**< The Fl_Scroll widget was scrolled. */
938   FL_DAMAGE_OVERLAY  = 0x08, /**< The overlay planes need to be redrawn. */
939   FL_DAMAGE_USER1    = 0x10, /**< First user-defined damage bit. */
940   FL_DAMAGE_USER2    = 0x20, /**< Second user-defined damage bit. */
941   FL_DAMAGE_ALL      = 0x80  /**< Everything needs to be redrawn. */
942 };
943 
944 // FLTK 1.0.x compatibility definitions...
945 #  ifdef FLTK_1_0_COMPAT
946 #    define contrast	fl_contrast
947 #    define down	fl_down
948 #    define frame	fl_frame
949 #    define inactive	fl_inactive
950 #  endif // FLTK_1_0_COMPAT
951 
952 #endif
953 
954 //
955 // End of "$Id: Enumerations.H 8710 2011-05-21 21:55:59Z manolo $".
956 //
957