@# @# This is the source for the Adime readme, in Allegro's custom format. Read @# allegro/docs/makedoc.c for a description of what is going on... @# @# And don't read this file; read readme.{txt|html|rtf|info|man} instead. @# @ignore_css @multiplefiles @multiwordheaders @#locale=latin1 @document_title=Adime - API Reference @html_footer=Back to Contents @rtfh=Adime - Allegro Dialogs Made Easy @# Note: this version number is patched by fixver.sh @manh="version 2.2.1" "Adime" "Adime API Reference" @mans=#include @$\input texinfo @$@setfilename adime.inf @$@settitle Adime API Reference @$@setchapternewpage odd @$@paragraphindent 0 @$ @$@ifinfo @$@direntry @$* Adime: (adime). The Adime API Reference @$@end direntry @$This is the Info version of the Adime API Reference @$ @$By Sven Sandberg @$@end ifinfo @$ @$@node Top, , (dir), (dir) @
@!indent

                              _      _ _
                             /_\  __| (_)_ __  ___
                            / _ \/ _` | | '  \/ -_)
                           /_/ \_\__,_|_|_|_|_\___|

                           Allegro Dialogs Made Easy

                                 API Reference

                               by Sven Sandberg


@indent
@
@!text @heading Contents @htmlindex License @htmlindex Readme @shortcontents @text @heading Main Dialog Functions @@int @adime_init(void); @xref adime_exit Initializes the Adime system. Call it before using any other Adime functions and after calling `allegro_init()'. Returns zero on success and nonzero on error. @@int @adime_exit(void); @xref adime_init Shuts down the Adime system. You don't normally need to call this function since `adime_init()' will arrange for it to be called automatically when your program exits or `allegro_exit()' is called. @@#define @ADIME_VERSION_MAJOR @@#define @ADIME_VERSION_MINOR @@#define @ADIME_VERSION_PATCH @@#define @ADIME_DATE The version number (major.minor.patch) of your version of Adime, and the date when it was released in the form yyyymmdd. @@int @adime_dialogf(const char *title, int x, y, w, const char *format, ...); @xref adime_init @xref adime_vdialogf @xref Adime Colors, adime_bmp, adime_font @xref adime_va_list @#xref message_box Displays a dialog letting the user edit several different kinds of data. `title' specifies the caption of the dialog while `x' and `y' specify the top left corner of the dialog. Alternatively, either `x' or `y' or both can be set to `ADIME_ALIGN_CENTRE' or `ADIME_ALIGN_RIGHT', in which case the dialog will be centred respectively right aligned. `w' specifies the width of the input field. The total width of the dialog depends on this number, and on the length of the strings given to the dialog. The format string consists of one or more field descriptions, each followed be exactly one format specifier. The field description is a hint text used to help the user know what the field should contain. The format specifier is a percent sign, followed by an identifier, followed by a pair of square brackets (possibly with some extra options between (which I will refer to as "format modifier")) and can be any of the following: Any special characters mentioned here can be escaped by placing a percent sign ('%') before it, e.g. if you need a literal ']' character somewhere in the format string. The field description may contain newlines. Returns 1 if the user selected the OK button, and 2 if he selected the Cancel button. The `...' parameters will be left untouched if the user clicked Cancel but they will change to the new values if he clicked OK. The initial values of the parameters will be taken as default values in the dialog objects. The debug library is very useful when you use this function: It can detect almost all illegal format strings. If it finds one, it shuts down the program with a traceback and writes a description of the error to the file allegro.log. An example may help to clarify things (see also the programs in the examples directory):
      char name_buffer[1024] = "";
      int age = 20;
      int shoe_size = 40;
      int married = 0;
      char filename_buffer[1024] = "";

      adime_dialogf("Fill in personal data",
                    ADIME_ALIGN_CENTRE, ADIME_ALIGN_CENTRE, 200,
                    "Name%string[1024]"
                    "Age (years)%int[0,150]"
                    "%line"
                    "Shoe size (Swedish units)%float[10,60]"
                    "Married%bool[]"
                    "Favourite text file%filename[1024,txt,Select a text file]",
                    name_buffer,
                    &age,
                    &shoe_size,
                    &married,
                    filename_buffer);
@\int @adime_vdialogf(const char *title, int x, y, w, const char *format, @@ adime_va_list args); @xref adime_dialogf, adime_va_list This is the same as `adime_dialogf()', but with an `adime_va_list' instead of variable number of arguments. @\int @adime_lowlevel_dialogf(const char *title, int x, y, w, @@ const char *format, ...); @xref adime_dialogf This is the same as `adime_dialogf()', except it doesn't include the default `OK' and `Cancel' buttons. You will normally want to call this function with the last format being "%buttonrow[]". @\int @adime_lowlevel_vdialogf(const char *title, int x, y, w, @@ const char *format, adime_va_list args); @xref adime_dialogf, adime_va_list This is the same as `adime_lowlevel_dialogf()', but with an `adime_va_list' instead of variable number of arguments. @@typedef @adime_va_list; @@void @adime_va_start(adime_va_list ap, first_arg); @@TYPE @adime_va_arg(adime_va_list ap, TYPE); @@void @adime_va_end(adime_va_list ap); @xref adime_vdialogf, adime_dialogf, adime_lowlevel_vdialogf Because of weirdnesses in the C language, some things that Adime does with va_lists would not be portable if it used a va_list directly. Instead you always have to use this replacement API, which works exactly like the standard API for va_lists, but is more portable. Also, if you pass an `adime_va_list' to another function, which reads an argument with `adime_va_arg()', then the `adime_va_list' will have advanced to the same position in the calling function as in the called function. In particular, after calling `adime_vdialogf()', the `adime_va_list' will have advanced to after the last argument used by Adime. The following example shows how `adime_dialogf()' is implemented in terms of `adime_vdialogf()':
      int adime_dialogf(char *title, int x, int y, int edit_w,
                        char *format, ...)
      {
         int ret;
         va_list ap;

         va_start(ap, format);
         ret = adime_vdialogf(title, x, y, edit_w, format, ap);
         va_end(ap);

         return ret;
      }
See documentation for the standard `va_list', `va_start()', `va_arg()' and `va_end()' for more information. @# @# Not yet implemented. @# @#@\int @message_box(const char *title, const char *buttons, @#@@const char *text, ...); @#@xref vmessage_box, adime_dialogf @#@xref Adime Colors, adime_font, adime_bmp @# This is like Allegro's alert() function, but much more flexible. It takes @# a dialog title as first argument and a message in the usual printf format @# as last argument. The text will be word-wrapped automatically. You may @# force line breaks in it using '\n'. The `buttons' argument is a format @# string on the following form: @#
@#    "&Yes;@&No;&Cancel[esc];&Help[f1]"
@#
@# The button texts are separated by semicolons. The (optional) shortcut @# character is preceded by an ampersand (so pressing 'y' in the example is @# the same as clicking the Yes button). The default button is preceded by @# an @ character. Any additional shortcuts are enclosed in []. @# @# Returns the index of the button that was pressed, beginning with 1 for @# the first one. @# @# Example: @#
@#      message_box("Error", "&Try again;&Cancel",
@#                  "Invalid color depth: %d.\nYou bastard!", 17);
@#
@#@\int @vmessage_box(const char *title, const char *buttons, @#@@ const char *text, va_list args); @#@xref message_box @# This is the same as `message_box()', but with a `va_list' instead of @# variable number of arguments. @heading Dialog Configuration Variables By tweaking the variables in this section, you can change the general appearance of Adime's dialogs. @@BITMAP *@adime_bmp; @xref adime_dialogf, adime_font If you want the dialog to be displayed on a certain video bitmap other than `screen', set this to point to that bitmap. This is particulary useful if you for some reason have scrolled away from the top left area of the video memory and want the dialog to be displayed on currently visible video memory rather than on the default location. If this is NULL (it is by default), `adime_dialogf()' & co will scroll to the top left corner of screen and use that part to display the dialog on. @@FONT *@adime_font; @@FONT *@adime_title_font; @@FONT *@adime_button_font; @xref adime_dialogf, adime_bmp The font used in general by Adime dialogs and objects, the font for the title of the dialogs and the font for the OK and Cancel buttons. If one of them is NULL (they all are by default), Allegro's `font' will be used. @@int @adime_yield; @xref adime_dialogf, adime_clean_screen Flag indicating whether or not Adime dialogs should call Allegro's function `yield_timeslice()' continuously when it has nothing better to do. Default is `TRUE'. This flag has no effect while the file selector is open: `yield_timeslice()' will always be called then. @@int @adime_clean_screen; @xref adime_dialogf, adime_yield, adime_window_visible Flag indicating whether or not Adime dialogs should restore the screen after they have been closed. Default is `TRUE', indicating that the screen should be restored. @@int @adime_window_visible; @xref adime_dialogf, adime_yield, adime_clean_screen Flag indicating whether the background window of Adime dialogs should be drawn. Default is `TRUE', indicating it should be drawn. @@void (*@adime_callback)(DIALOG *d) @xref adime_dialogf If you set this to something else than `NULL', then that function will be called continuously as long as a Adime dialog is open. The argument `d' will point to the first object of the current Adime dialog, or the first object of Allegro's file selector when it's open. See adime/examples/exanim.c for an example on how to use this to do animation while a dialog is open. @hnode Adime Colors @xref adime_dialogf @#xref adime_message_box extern RGB @hnode Adime Metrics @xref adime_dialogf @#xref adime_message_box extern int @heading Other GUI Functions NOTE: Many, maybe all, of these functions may soon move to another library, and their API may change at that point. So they may not be forwards compatible. @\int @adime_file_select(const char *message, char *path, const char *ext, @@ int size, int w, int h); @xref adime_dialogf, Adime Metrics Like Allegro's `file_select_ex()', but with Adime's 3d look and feel. It is not affected by all `adime_window_*' variables though, only the ones beginning with `adime_window_title_*'. Also, it has the extra feature of not changing `path' if it gets cancelled. @@int @adime_d_double_calc_edit_proc(int msg, DIALOG *d, int c); @xref adime_d_calc_edit_result_proc @xref adime_d_int_calc_edit_proc Gui proc for an edit box accepting a mathematical expression whose result is a floating point number. The result is calculated and displayed on a separate gui object as the user types. The edit box has a 3d-ish look.
The dp2 field points to a `struct ADIME_EDIT_NUMBER *' which holds some information about the behavior of the edit box:
   typedef struct ADIME_EDIT_NUMBER
   {
      int is_signed;          /* Set for integer formats if it is signed. */
      int is_float;           /* Set if we only have float, not double. */
      double min_val, max_val;/* Range for numbers. */
      DIALOG *result_object;  /* DIALOG object to display result in. */
   } ADIME_EDIT_NUMBER;
The `result_object' will be used to display the result of the expression. There is an `adime_d_calc_edit_result_proc' object type which is designed to be used as `result_object', but you may of course write your own object to take care of this. Whenever the user changes the text in the `adime_d_double_calc_edit_proc', the result is printed to the `dp' field of `result_object'; hence you must have set the dp field of `result_object' to a text buffer with enough space (256 bytes is safe). The `result_object' will then be sent a `MSG_DRAW' message with the `c' parameter set to 2 if there is an error in the expression or 1 if it is ok. @@int @adime_d_int_calc_edit_proc(int msg, DIALOG *d, int c); @xref adime_d_double_calc_edit_proc @xref adime_d_calc_edit_result_proc Like `adime_d_double_calc_edit_proc()', but displaying the result as an integer. If the user tries to enter a floating point value, it will be rounded. @@int @adime_d_calc_edit_result_proc(int msg, DIALOG *d, int c); @xref adime_d_int_calc_edit_proc @xref adime_d_double_calc_edit_proc Dialog proc for the result of a calculator edit box. The difference between this and Allegro's `d_text_proc()' is that it uses the c parameter to find the color to draw with (see `d_double_calc_edit_proc()'), and it also erases its whole area even if the text doesn't fill it. @@int @adime_d_line_proc(int msg, DIALOG *d, int c); A simple dialog object which draws a 3d-ish horizontal or vertical line (depending on whether its `w' field is greater or less than its `h' field). @@int @adime_d_check_proc(int msg, DIALOG *d, int c) @xref adime_d_greyable_check_proc Like Allegro's `d_check_box()', but with 3d-ish style. @@int @adime_d_greyable_check_proc(int msg, DIALOG *d, int c) @xref adime_d_check_proc A three-state greyable version of `adime_d_check_box()'. Unlike `adime_d_check_proc()', this does not use the (flags & D_SELECTED) flag to determine the state of the check box. Instead, the d1 field is 0 for off, 1 for on, and 2 for greyed. @@int @adime_d_list_proc(int msg, DIALOG *d, int c) Like Allegro's `d_list_proc()', but with 3d-ish style. @@int @adime_d_text_list_proc(int msg, DIALOG *d, int c) Like Allegro's `d_text_list_proc()', but with 3d-ish style. @@int @adime_d_edit_proc(int msg, DIALOG *d, int c) Like Allegro's `d_edit_proc()', but with 3d-ish style. Note that the 3d border is three pixels wide, so you have to add those pixels to the size of the edit box. It also adds an extra feature: The `d->d1' field, if positive, is the maximal number of characters, just like with d_edit_proc(). But you may also set it to be negative, meaning that (after removing the sign) it is the maximal number of bytes occupied by the string, including the trailing zero. (This may be different from the number of characters when you use Unicode.) @@int @adime_d_button_proc(int msg, DIALOG *d, int c) Similar to Allegro's `d_button_proc()', but with 3d-ish style. It also has a slightly different behaviour: Unlike `d_button_proc()', the D_EXIT flag has no effect. Instead you need to set the `d1' field to one of the three constants: @@int @adime_d_multiline_text_proc(int msg, DIALOG *d, int c) Like Allegro's `d_text_proc()', but supports newlines ('\n') in the string. @@int @adime_d_window_proc(int msg, DIALOG *d, int c) Gui proc that draws a window. The `dp' field should be the caption of the dialog, as a string. All fields except x, y, w, h are ignored. Note that this object is purely cosmetical: you can't move or resize the window. @\void @adime_draw_empty_button(BITMAP *bmp, int x1, int y1, int x2, int y2, @\ int face_color, int xlight, int light, @@ int dark, int xdark) @xref adime_draw_text_button, adime_draw_picture_button Draws an empty button on the given position of the bitmap, using the given colors. @\void @adime_draw_text_button(BITMAP *bmp, int x1, int y1, int x2, int y2, @\ int face_color, int text_color, @\ int xlight, int light, int dark, int xdark, @@ const FONT *f, const char *text) @xref adime_draw_text_button_down, adime_draw_empty_button @xref adime_draw_picture_button Draws a button with a text on it, at the given position of the bitmap and using the given colors and font. @\void @adime_draw_text_button_down(BITMAP *bmp, @\ int x1, int y1, int x2, int y2, @\ int face_color, int text_color, @\ int xlight, int light, int dark, int xdark, @@ const FONT *f, const char *text) @xref adime_draw_text_button Like `adime_draw_text_button()', but draws the button pressed down. @\void @adime_draw_picture_button(BITMAP *bmp, int x1, int y1, int x2, int y2, @\ int face,int xlight, int light, int dark, int xdark, @@ BITMAP *sprite) @xref adime_draw_picture_button_down, adime_draw_empty_button @xref adime_draw_text_button Draws a button with a sprite on it at the given position of the bitmap and using the given colors and sprite. @\void @adime_draw_picture_button_down(BITMAP *bmp, @\ int x1, int y1, int x2, int y2, @\ int face, int xlight, int light, @\ int dark, int xdark, @@ BITMAP *sprite) @xref adime_draw_picture_button Like `adime_draw_picture_button()', but draws the button pressed down. @\void @adime_fill_textout(BITMAP *bmp, const FONT *f, const char *text, @@ int x, int y, int w, int fg, int bg) Like Allegro's `textout()', but erases the whole area of width `w' if the text doesn't cover it. If the text is longer than `w' it will be clipped. @# I'll finish adding gui stuff for these before making them official. @# The api may change later because edit() may want one unicode key argument, @# one scancode argument and one key_shifts argument along with the `EDITBOX' @# argument. @# @#@heading @#Edit box functions @# @#Adime provides some functions for handling edit boxes in a more advanced way @#than Allegro does. You can type text, move the cursor using the arrow keys, @#delete text, select text and use clipboard. In the current version, the @#functions can only change the string and move the cursor, not for drawing the @#edit box or inserting it into a gui. I'll add this to a later version if I @#get time, if I need it badly or if someone does it for me. See the help for @#`edit()' for more information on how you can use the functions already. There @#are also some (mostly internal) functions for handling clipboard. @# @#@@int @edit(EDITBOX *ed, int key, int shifts) @#@xref create_edit, destroy_edit, EDITBOX @# Top-level function for handling keypresses in an EDITBOX. Pass it the @# return value from `readkey()' as second parameter, and a copy of Allegro's @# variable `key_shifts' as third.
@# To use edit box functions you should:
@# 1. Declare an `EDITBOX *' variable.
@# 2. Initialize it using `create_edit()'.
@# 3. Call `edit()' each time the user presses a key.
@# 4. Draw the edit box using your own routines.
@# 5. Repeat step 3 and 4 until you're happy with the text in the edit box.
@# 6. Free the memory used by the edit box by calling `destroy_edit()'.
@# @#@@typedef struct @EDITBOX { @# char *text;
@# int pos;
@# int selstart, sellength;
@# EDITBOX_OPTIONS *options;
@#} EDITBOX;
@#@xref EDITBOX_OPTIONS, create_edit, edit @# Holds information about an edit box. `text' is the text and `pos' is the @# current cursor position. If there is a selection, `selstart' tells where @# the selection starts, and `sellength' tells the length of the selection.
@# There are some more fields in the struct as well, but only such that are @# used internally.
@# @#@@typedef struct @EDITBOX_OPTIONS { @# int max_length;
@# int max_bytes;
@# int max_pixel_width;
@# FONT *font;
@# int write_protected;
@# int dynamic;
@# int free_text_on_destroy;
@# int clipboard_functions;
@#} EDITBOX_OPTIONS;
@#@xref EDITBOX, create_edit @# Short description:
@# Long description: @# @#@@EDITBOX *@create_edit(EDITBOX_OPTIONS *eo, const char *text) @#@xref destroy_edit, edit, EDITBOX, EDITBOX_OPTIONS @# Creates a new edit box and returns it. You should normally pass it the @# address of the predefined variable `_normal_edit', which defines an edit @# box with unlimited text length, dynamically realloced text, full clipboard @# functionality and which uses Allegro's font. If these default options @# don't suit your program, change them before you call `create_edit()'. The @# second parameter is the text to edit. Be aware that it won't be @# duplicated, so if the dynamic flag in the `EDITBOX_OPTIONS' is set, you @# must make sure the memory is actually dynamically allocated. @# @#@@void @destroy_edit(EDITBOX *ed) @#@xref create_edit, EDITBOX @# Destroys an edit box when you are finished with it. If the @# `free_text_on_destroy'-flag in the `EDITBOX_OPTIONS' struct is set, the @# text will be freed. @# @#@@int @edit_set_text(EDITBOX *ed, const char *text) @#@xref edit_set_pos @# Copies the specified text to the edit box. You should normally use this @# function rather than explicitly patching in the `text' field in the @# `EDITBOX' struct. @# @#@@int @edit_set_pos(EDITBOX *ed, int pos) @#@xref edit_select_to_pos, edit_select_all, edit_select_word_at_pos @#@xref edit_set_text @# Places the cursor at the position `pos' in the edit box. If text was @# selected, this function will unselect it. @# @#@@int @edit_select_to_pos(EDITBOX *ed, int pos) @#@xref edit_set_pos, edit_select_all, edit_select_word_at_pos @# Extends the selection of the edit box so that the current position is @# `pos'. In most windows editors this is what happens when you hold down @# shift and click with the mouse at position `pos'. @# @#@@int @edit_select_all(EDITBOX *ed) @#@xref edit_set_pos, edit_select_to_pos, edit_select_word_at_pos @# Selects the whole text in the edit box. @# @#@@int @edit_select_word_at_pos(EDITBOX *ed, int pos) @#@xref edit_set_pos, edit_select_to_pos, edit_select_all @# Selects one word at the position `pos' in the edit box. @# @#@@int @edit_delete_sel(EDITBOX *ed) @#@xref edit_cut @# Deletes the text in the selection. (Does nothing if there is no @# selection.) @# @#@@int @edit_cut(EDITBOX *ed) @#@xref edit_delete_sel, edit_copy, edit_paste @# Cuts text from the edit box into clipboard (if there is a selection). @# @#@@int @edit_copy(EDITBOX *ed) @#@xref edit_cut, edit_paste @# Copies text into clipboard (if there is a selection). @# @#@@int @edit_paste(EDITBOX *ed) @#@xref edit_cut, edit_copy @# Pastes text from clipboard (unless clipboard is empty). @# @# @# @heading Other Functions @\double @adime_evaluate(const char *equation, int *error, @@ double (*var)(const char *name)); @xref adime_uevaluate Helper function for evaluating arithmetic expressions, which may be useful in your programs even though it isn't really logically connected to the other functions (i.e. it's not a gui function). It evaluates the provided equation, returning the result, and storing a nonzero value in `error' if anything goes wrong. If the `var' function is not NULL, this will be called whenever a variable is encountered in the expression, allowing you to look up and return a suitable value for it. For more information on the expressions, see expressi.txt @\double @adime_uevaluate(const char *equation, int *error, @@ double (*var)(const char *name)); @xref adime_evaluate Like `adime_evaluate()', but tweaked to fit Adime's purposes better: It silently accepts an empty string without error (being equivalent to "0"), it supports Unicode and it gives an error if the result is NaN. @@void @adime_double2string(double x, char *buf); @xref adime_udouble2string Function for pretty-printing floating point numbers: The number gets at most 10 digits to the left of the decimal point, at most 9 to the right of it, and at most 10 totally. If the absolute value of the number is >= 10000000000 or < 0.000001, it is written in exponential form instead. Exponential form has at most 6 digits in the mantissa, so that the total number of digits never exceeds 9. Does not support Unicode. @@void @adime_udouble2string(double val, char *buf) @xref adime_double2string Unicode-aware version of `adime_double2string()'. @@char *@adime_scancode_to_short_name(int scancode, char *buf) @xref adime_scancode_to_pretty_name, adime_short_name_to_scancode Converts a keyboard scancode to a string. The string is exactly the text after `KEY_' in the macro name for the key (so the function returns "DELETE" if you feed it with KEY_DELETE). Returns the buffer, or NULL if the scancode didn't match any known key. @@char *@adime_scancode_to_pretty_name(int scancode, char *buf) @xref adime_scancode_to_short_name, adime_short_name_to_scancode The result from `adime_scancode_to_short_name()' is sometimes an abbreviation and may contain underscores. You may want to use this function instead if you are going to display the result for the user: it returns more user-friendly strings. @@int @adime_short_name_to_scancode(const char *short_name) @xref adime_scancode_to_short_name, adime_scancode_to_pretty_name Given the name for a key as a string (in the format given by `adime_scancode_to_short_name()'), this function returns the scancode for the key, or -1 if the string doesn't represent any known scancode. @headingnocontent Reducing the Executable Size If you don't use all the adime_dialogf() formats, then you can declare a list of all formats that you use so that the others don't get linked into the executable. This will only save up to about 10 KB, but see Allegro's documentation (the "Reducing your executable size" section) for more hints on how to get rid of much more size. The list of formats should look like this:
   ADIME_BEGIN_FORMAT_LIST
      format1
      format2
      etc...
   ADIME_END_FORMAT_LIST
where format1, format2 etc are any of the macros:
   ADIME_FORMAT_BOOL
   ADIME_FORMAT_BUTTON
   ADIME_FORMAT_STRING
   ADIME_FORMAT_FILENAME
   ADIME_FORMAT_VLIST
   ADIME_FORMAT_LIST
   ADIME_FORMAT_DATAFILE
   ADIME_FORMAT_WVLIST
   ADIME_FORMAT_WLIST
   ADIME_FORMAT_WDATAFILE
   ADIME_FORMAT_DIALOGF
   ADIME_FORMAT_VDIALOGF
   ADIME_FORMAT_INT
   ADIME_FORMAT_PINT
   ADIME_FORMAT_UINT
   ADIME_FORMAT_PUINT
   ADIME_FORMAT_SHORT
   ADIME_FORMAT_PSHORT
   ADIME_FORMAT_USHORT
   ADIME_FORMAT_PUSHORT
   ADIME_FORMAT_CHAR
   ADIME_FORMAT_PCHAR
   ADIME_FORMAT_UCHAR
   ADIME_FORMAT_PUCHAR
   ADIME_FORMAT_DOUBLE
   ADIME_FORMAT_PDOUBLE
   ADIME_FORMAT_FLOAT
   ADIME_FORMAT_PFLOAT
   ADIME_FORMAT_LINE
   ADIME_FORMAT_NOTHING
   ADIME_FORMAT_BUTTONROW
   ADIME_FORMAT_CHAIN
Like in Allegro, this will only work for the statically linked library. Note that ADIME_FORMAT_BUTTONROW and ADIME_FORMAT_CHAIN are used internally, so you shouldn't remove them unless you are sure that you know what you are doing. @htmlindex Internal @htmlindex Expressi @htmlindex Changes @htmlindex Thanks @htmlindex Wishlist