adime_dialogf(3)
β¨ adime_dialogf(3) β¨ β Adime API Reference
NAME
adime_dialogf β bestie, this is literally the function that opens a dialog so your user can edit all kinds of data. It's giving main character energy, no cap. π
SYNOPSIS
#include <adime.h>
int adime_dialogf(const char *title, int x, y, w, const char *format,
...);
DESCRIPTION
Okay so listen up, bestie. adime_dialogf displays a dialog letting the user edit several different kinds of data. Iconic behavior. β¨
title is the caption of the dialog. x and y are the top left corner. But wait β plot twist: either x or y or both can be set to ADIME_ALIGN_CENTRE or ADIME_ALIGN_RIGHT, and then the dialog will be centred or right aligned respectively. Slay. 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. So yeah, it's giving geometry but make it cute. π
The format string consists of one or more field descriptions, each followed by 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 a "format modifier") and can be any of the following, bestie:
%bool[]
A check box, which can be either on or off. Next argument should be an int *, which will be set to 0 for off and 1 for on. Don't use other values! π«
%greybool[]
A three-state greyable check box. Next argument should be an int *, which will be set to 0 for off, 1 for on, or 2 for greyed. Don't use other values! π«
Number formats: %double[x,y], %float[x,y], %int[x,y], %short[x,y], %char[x,y], %uint[x,y], %ushort[x,y], %uchar[x,y]
A number in the given format (uchar, ushort and uint are unsigned). The number will be clamped to the interval x to y, inclusive. You may omit x or y or both (but keep the comma!) to make it be the minimum respectively maximum for the data type. Next argument should be a pointer to the given data type. Lowkey useful. β¨
Plain number formats: %pdouble[x,y], %pfloat[x,y], %pint[x,y], %pshort[x,y], %pchar[x,y], %puint[x,y], %pushort[x,y], %puchar[x,y]
"Plain" number formats: With the corresponding formats not prefixed by "p", the user can actually enter any mathematical expression, but these formats disable that feature so he can only enter numbers. Otherwise equal to their non-p-prefixed counterparts.
%string[bytes]
A string of length <= bytes (in bytes). Next argument should be a char * with room for at least the given number of characters. Remember that the number of characters that fit in the string will be less if you use Unicode. With UTF-8, a character may be as long as six bytes, and with Unicode they are always 2 bytes. The byte math is real, bestie. π
%filename[len,extension,title]
A filename of length <= len. Next argument should be a char * with room for at least the given number of bytes (this really is bytes, not characters, and a UTF-8 string can have characters that are 6 bytes long, so you should allocate six times as many bytes as you want characters!). The user will be able to enter the filename as a text or click a button to bring up a file selector. extension is a semicolon-separated list of file extensions (ie in the format "bmp;pcx;tga;foo") which will be accepted by the file selector. You may omit extension (but keep the commas!), meaning that all file formats will be accepted. title is the title of the file selector dialog. You may also omit title (but keep the commas!), meaning that the description text for this field will be used.
%list[lines,list]
The user can select an element in a list of strings. lines specifies the height, in lines, of the list box (this can be omitted to let the function calculate the height for you). list is a semicolon-separated list of strings (if one or more strings needs to contain a semicolon (;) or an end bracket (]), the character can be escaped by a percent sign (%)). Next argument should be an int *, which will be set to the index of the string.
%vlist[lines]
The user can select an element in a list of strings. lines specifies the height, in lines, of the list box (this can be omitted to let the function calculate the height for you). Next argument should be an int *, which will be set to the index of the selected string, and then a char ** which specifies the strings to choose among, then an int which tells how many strings the list contains.
%datafile[lines,types]
The user can select an element in an Allegro DATAFILE. You should pass first an int *, which will be set to the index of the datafile that was selected, and then a DATAFILE *, which should be the datafile to look in. lines specifies the height, in lines, of the list box (this can be omitted to let the function calculate the height for you). types is a semicolon-separated list of datafile types. You must include all four characters in each type, so it could for example look like this:
"%datafile[7,BMP ;RLE ;XCMP; CMP]"
%wlist[lines,title,list], %wvlist[lines,title], %wdatafile[lines,title,types]
Like %list[], %vlist[] and %datafile, but rather than having the list box in the window, a button will be displayed. When the user clicks the button, a new window with the actual list in (and with the given title) will be opened.
%nothing[]
No input data. Will only display the preceding description text as usually. This can be used if you want a section of the dialog to have a special header.
%line[]
No input data. Will only display the preceding description text (if there is any) as usually, and then a horizontal delimitor line. Like %nothing[], this can be used if you want a section of the dialog to be delimited from the rest of the dialog.
%button[text]
A button (with the given text on) which calls your custom callback. Next argument should be a function pointer, pointing to a function of the type
int my_callback(DIALOG *d);
This will be called when the user clicks the button. It will be given the dialog object representing the button. Its return value is a bit special: If it is 0, then nothing happens. If it is ADIME_REDRAW (which is defined to be the smallest negative number), then the dialog will be redrawn. If it is any other positive number, then the dialog will exit with that return value not saving the results of the dialog (the usual behavior of a cancel button). If it is any other negative number, then the sign will be removed and the unsigned number returned, and the contents of the dialog will be saved (the usual behavior of the ok button).
You are allowed to open a new dialog inside your callback, which may be a less messy and more flexible alternative to %dialogf[]. π
%buttonrow[BUTTONS]
One or more buttons in a horizontal row. These are displayed the same way as the OK and Cancel buttons (actually, the OK and Cancel buttons are implemented by appending a %buttonrow[] to the end of the dialog). Next argument should be a function pointer, pointing to a function of the type:
int my_callback(DIALOG *d, int n);
This will be called with the dialog object for the clicked button as the first argument and the index of this button as the second (i.e., n=1 for the first button, n=2 for the second and so on). The return value works the same way as for %button[] (see above).
The modifier (BUTTONS) is itself a format string, consisting of a comma-separated list of buttons. Each button begins with the text which will appear on the button. Then comes an optional semicolon-separated list of shortcuts to this button. An example may help to clarify:
%buttonrow[OK;CTRL+O;ENTER,Cancel;ESC,Help;F1;ALT+H]
This format will display four buttons: OK, Cancel and Help. The OK button has the shortcuts CTRL-O and ENTER. The Cancel button has the shortcut ESC. The Help button has the shortcuts F1 and ALT-H. Shortcuts are specified in uppercase, with the state of shift, ctrl, alt etc preceding the key to press. The key has the same name as the KEY_* macro defined by Allegro (i.e., "ENTER" for KEY_ENTER, "3" for KEY_3 and "NUMLOCK" for KEY_NUMLOCK). The state consists of zero or more key shift flags separated by plus signs. The names of these are the same as Allegro's KB_*_FLAG macros (i.e., "SHIFT" for KB_SHIFT_FLAG and "CAPSLOCK" for KB_CAPSLOCK_FLAG). If you write e.g. CTRL+O, it means that CTRL must be held down while pressing O in order to activate the shortcut, while it is optional to hold down other key modifiers, e.g., SHIFT. If you don't want the shortcut to be activated when SHIFT is down (for instance), then you can write CTRL+-SHIFT+O, i.e., you precede the forbidden key with a minus sign.
%dialogf[buttontext]
A button which opens another adime_dialogf() sub-dialog. Next argument should be the title of the dialog as a char *, followed by x, y, edit_w as ints and then format as a char *. These arguments correspond to the arguments given to adime_dialogf(). Depending on what format contains, you then have to add more parameters which the sub-dialog will alter. buttontext is the text which will be displayed on the button which opens the sub-dialog. An example may help to clarify:
adime_dialogf("My dialog",
ADIME_ALIGN_CENTRE, ADIME_ALIGN_CENTRE, 200,
"Open sub-dialog:%dialog[Click me!]",
"My sub-dialog",
ADIME_ALIGN_CENTRE, ADIME_ALIGN_CENTRE, 200,
"Save in text format:%bool[]",
&text_format);
%vdialogf[buttontext]
This is like %dialogf[], except that the ... arguments are given as an adime_va_list rather than being expanded into the same argument list. (see also adime_va_list)
%chain[]
This is like an "inline" version of %vdialogf[]: You should pass two arguments, first a format string and then an adime_va_list. The dialog defined by this format string and adime_va_list will be inserted directly into this dialog. (See exchain.c for an example.)
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.
Okay so bestie, one more thing before we get to the example, and it's kind of a big deal π
The debug library is so useful when you're using this function. Like, genuinely iconic behaviour: it can detect almost all illegal format strings. And if it finds one? It does not whisper. It shuts down the program with a traceback and writes a description of the error to the file allegro.log. Dramatic? Yes. Helpful? Also yes. π
π«Ά Lowkey a glow-up for your debugging sessions, ngl.
πΈ An example, because words are hard πΈ
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);
Look at her go π¦ β buffers for the strings, pointers for the numbers, and one lil %line breaking up the vibe. That's the whole pattern, fr fr.
π SEE ALSO π
And that's the page, bestie π this lil slice of manual-page magic is from Adime, version 2.2.1, and it lives in section 3 of the manual as adime_dialogf(3) π
go forth and format responsibly β¨πΈπ
π¦ where this page comes from
- fedora 43: adime-devel 2.2.1-42.fc43 Β· zlib
- fedora 43: adime-devel 2.2.1-42.fc43 Β· zlib
- fedora 44: adime-devel 2.2.1-44.fc44 Β· zlib
- fedora 44: adime-devel 2.2.1-44.fc44 Β· zlib
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms