[Change] Seperated dialogues from toolkit.
This commit is contained in:
parent
8e4b78621e
commit
b748f0f18e
280
src/dialogue.c
Normal file
280
src/dialogue.c
Normal file
@ -0,0 +1,280 @@
|
||||
/**
|
||||
* @file dialogue.c.
|
||||
*
|
||||
* @brief Handles dialogue stuff.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
#include "lephisto.h"
|
||||
#include "log.h"
|
||||
#include "toolkit.h"
|
||||
#include "pause.h"
|
||||
#include "opengl.h"
|
||||
#include "input.h"
|
||||
#include "dialogue.h"
|
||||
|
||||
/* Extern. */
|
||||
extern void main_loop(void); /* From lephisto.c */
|
||||
|
||||
/* Dialogues. */
|
||||
static glFont* dialogue_getSize(char* msg, int* w, int* h);
|
||||
static void dialogue_alertClose(char* str);
|
||||
static void dialogue_msgClose(char* str);
|
||||
static void dialogue_YesNoClose(char* str);
|
||||
static void dialogue_inputClose(char* str);
|
||||
static void dialogue_inputCancel(char* str);
|
||||
|
||||
/* Secondary loop hack. */
|
||||
static int loop_done;
|
||||
static int toolkit_loop(void);
|
||||
|
||||
/**
|
||||
* @fn void dialogue_alert(const char* fmt, ...)
|
||||
*
|
||||
* @brief Display an alert popup with only an ok button and a message.
|
||||
* @param fmt Printf stype message to display.
|
||||
*/
|
||||
void dialogue_alert(const char* fmt, ...) {
|
||||
char msg[512];
|
||||
va_list ap;
|
||||
unsigned int wdw;
|
||||
int h;
|
||||
|
||||
if(window_exists("Warning")) return;
|
||||
|
||||
if(fmt == NULL) return;
|
||||
else { /* Get the message. */
|
||||
va_start(ap, fmt);
|
||||
vsprintf(msg, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
h = gl_printHeight(&gl_smallFont, 260, msg);
|
||||
|
||||
wdw = window_create("Warning", -1, -1, 300, 90+h);
|
||||
window_addText(wdw, 20, -30, 260, h, 0, "txtAlert",
|
||||
&gl_smallFont, &cBlack, msg);
|
||||
window_addButton(wdw, 135, 20, 50, 30, "btnOK", "OK",
|
||||
dialogue_alertClose);
|
||||
}
|
||||
|
||||
/**
|
||||
* @fn static void dialogue_alertClose(char* str)
|
||||
*
|
||||
* @brief Closes the alert dialogue.
|
||||
* @param str Unused.
|
||||
*/
|
||||
static void dialogue_alertClose(char* str) {
|
||||
(void)str;
|
||||
if(window_exists("Warning"))
|
||||
window_destroy(window_get("Warning"));
|
||||
}
|
||||
|
||||
/**
|
||||
* @fn static glFont* dialogue_getSize(char* msg, int* w, int* h)
|
||||
*
|
||||
* @brief Get the size needed for the dialogue.
|
||||
* @param msg Message of the dialogue.
|
||||
* @param[out] w Get the width needed.
|
||||
* @param[out] h Get the height needed.
|
||||
*/
|
||||
static glFont* dialogue_getSize(char* msg, int* w, int* h) {
|
||||
glFont* font;
|
||||
|
||||
font = &gl_smallFont; /* Try to use small font. */
|
||||
|
||||
(*h) = gl_printHeight(font, (*w)-40, msg);
|
||||
if(strlen(msg) > 100) { /* Make font bigger for large texts. */
|
||||
font = &gl_defFont;
|
||||
(*h) = gl_printHeight(font, (*w)-40, msg);
|
||||
if((*h) > 200) (*w) += MIN((*h)-200, 600); /* Too big, so we make it wider. */
|
||||
(*h) = gl_printHeight(font, (*w)-40, msg);
|
||||
}
|
||||
return font;
|
||||
}
|
||||
|
||||
/* Displays an alert popup with only an ok button and a message. */
|
||||
static unsigned int msg_wid = 0;
|
||||
void dialogue_msg(char* caption, const char* fmt, ...) {
|
||||
char msg[4096];
|
||||
va_list ap;
|
||||
int w, h;
|
||||
glFont* font;
|
||||
|
||||
if(msg_wid) return;
|
||||
|
||||
if(fmt == NULL) return;
|
||||
else {
|
||||
va_start(ap, fmt);
|
||||
vsprintf(msg, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
w = 300; /* Default width. */
|
||||
font = dialogue_getSize(msg, &w, &h);
|
||||
|
||||
/* Create the window. */
|
||||
msg_wid = window_create(caption, -1, -1, w, 110 + h);
|
||||
window_addText(msg_wid, 20, -40, w-40, h, 0, "txtMsg",
|
||||
font, &cBlack, msg);
|
||||
window_addButton(msg_wid, (w-50)/2, 20, 50, 30, "btnOK", "OK",
|
||||
dialogue_msgClose);
|
||||
|
||||
toolkit_loop();
|
||||
}
|
||||
|
||||
static void dialogue_msgClose(char* str) {
|
||||
(void)str;
|
||||
window_destroy(msg_wid);
|
||||
msg_wid = 0;
|
||||
loop_done = 1;
|
||||
}
|
||||
|
||||
/* Run a dialogue with a Yes and No button, return 1 if yes, 0 for no. */
|
||||
static int yesno_result;
|
||||
static unsigned int yesno_wid = 0;
|
||||
int dialogue_YesNo(char* caption, const char* fmt, ...) {
|
||||
char msg[4096];
|
||||
va_list ap;
|
||||
int w, h;
|
||||
glFont* font;
|
||||
|
||||
if(yesno_wid) return -1;
|
||||
|
||||
if(fmt == NULL) return -1;
|
||||
else { /* Get the message. */
|
||||
va_start(ap, fmt);
|
||||
vsprintf(msg, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
w = 300;
|
||||
font = dialogue_getSize(msg, &w, &h);
|
||||
|
||||
/* Create the window. */
|
||||
yesno_wid = window_create(caption, -1, -1, w, h+110);
|
||||
|
||||
/* Text. */
|
||||
window_addText(yesno_wid, 20, -40, w-40, h, 0, "txtYesNo",
|
||||
font, &cBlack, msg);
|
||||
|
||||
/* Buttons. */
|
||||
window_addButton(yesno_wid, w/2-50-10, 20, 50, 30, "btnYes", "Yes",
|
||||
dialogue_YesNoClose);
|
||||
window_addButton(yesno_wid, w/2+10, 20, 50, 30, "btnNo", "No",
|
||||
dialogue_YesNoClose);
|
||||
|
||||
/* Tricky secondary loop. */
|
||||
toolkit_loop();
|
||||
|
||||
/* Return the result. */
|
||||
return yesno_result;
|
||||
}
|
||||
|
||||
static void dialogue_YesNoClose(char* str) {
|
||||
/* Store the result. */
|
||||
if(strcmp(str, "btnYes")==0) yesno_result = 1;
|
||||
else if(strcmp(str, "btnNo")==0) yesno_result = 0;
|
||||
|
||||
/* Destroy the window. */
|
||||
window_destroy(yesno_wid);
|
||||
yesno_wid = 0;
|
||||
|
||||
loop_done = 1;
|
||||
}
|
||||
|
||||
/* Toolkit input boxes, returns the input. */
|
||||
static unsigned int input_wid = 0;
|
||||
static int input_cancelled = 0;
|
||||
char* dialogue_input(char* title, int min, int max, const char* fmt, ...) {
|
||||
char msg[512], *input;
|
||||
va_list ap;
|
||||
int h;
|
||||
|
||||
if(input_wid) return NULL;
|
||||
|
||||
if(fmt == NULL) return NULL;
|
||||
else { /* Get the message. */
|
||||
va_start(ap, fmt);
|
||||
vsprintf(msg, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
/* Start out not cancelled. */
|
||||
input_cancelled = 0;
|
||||
|
||||
/* Get text height. */
|
||||
h = gl_printHeight(&gl_smallFont, 200, msg);
|
||||
|
||||
/* Create Window. */
|
||||
input_wid = window_create(title, -1, -1, 240, h+140);
|
||||
window_setAccept(input_wid, dialogue_inputClose);
|
||||
window_setCancel(input_wid, dialogue_inputCancel);
|
||||
|
||||
/* Input. */
|
||||
window_addText(input_wid, 30, -30, 200, h, 0, "txtInput",
|
||||
&gl_smallFont, &cDConsole, msg);
|
||||
window_addButton(input_wid, -20, 20, 80, 30,
|
||||
"btnClose", "Done", dialogue_inputClose);
|
||||
|
||||
/* Tricky secondary. */
|
||||
input = NULL;
|
||||
while(!input_cancelled && (!input ||
|
||||
((int) strlen(input) < min))) { /* Must be longer than min. */
|
||||
|
||||
if(input) {
|
||||
dialogue_alert("Input must be at least %d characters long!", min);
|
||||
free(input);
|
||||
input = NULL;
|
||||
}
|
||||
|
||||
if(toolkit_loop() != 0) /* Error in loop -> quit. */
|
||||
return NULL;
|
||||
|
||||
if(input_cancelled != 0)
|
||||
input = NULL;
|
||||
else
|
||||
input = strdup(window_getInput(input_wid, "inpInput"));
|
||||
}
|
||||
|
||||
/* Cleanup plox. */
|
||||
window_destroy(input_wid);
|
||||
input_wid = 0;
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
static void dialogue_inputClose(char* str) {
|
||||
(void)str;
|
||||
|
||||
/* Break the loop. */
|
||||
loop_done = 1;
|
||||
}
|
||||
|
||||
static void dialogue_inputCancel(char* str) {
|
||||
input_cancelled = 1;
|
||||
dialogue_inputClose(str);
|
||||
}
|
||||
|
||||
/*
|
||||
* Spawns a secondary loop that only works until the toolkit dies,
|
||||
* alot like the main while loop in lephisto.c
|
||||
*/
|
||||
static int toolkit_loop(void) {
|
||||
SDL_Event event, quit = { .type = SDL_QUIT };
|
||||
|
||||
loop_done = 0;
|
||||
while(!loop_done && toolkit) {
|
||||
while(SDL_PollEvent(&event)) { /* Event loop. */
|
||||
if(event.type == SDL_QUIT) { /* Pass quit event to main engine. */
|
||||
loop_done = 1;
|
||||
SDL_PushEvent(&quit);
|
||||
return -1;
|
||||
}
|
||||
input_handle(&event); /* Handles all the events and player keybinds. */
|
||||
}
|
||||
main_loop();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
10
src/dialogue.h
Normal file
10
src/dialogue.h
Normal file
@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
/*
|
||||
* Popups and alerts.
|
||||
*/
|
||||
void dialogue_alert(const char* ftm, ...); /* Does not pause execution. */
|
||||
void dialogue_msg(char* caption, const char* fmt, ...);
|
||||
int dialogue_YesNo(char* caption, const char* fmt, ...); /* Yes = 1, No = 0. */
|
||||
char* dialogue_input(char* title, int min, int max, const char* fmt, ...);
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "lephisto.h"
|
||||
#include "log.h"
|
||||
#include "toolkit.h"
|
||||
#include "dialogue.h"
|
||||
#include "player.h"
|
||||
#include "rng.h"
|
||||
#include "music.h"
|
||||
|
@ -4,7 +4,7 @@
|
||||
#include "lephisto.h"
|
||||
#include "rng.h"
|
||||
#include "ltime.h"
|
||||
#include "toolkit.h"
|
||||
#include "dialogue.h"
|
||||
#include "space.h"
|
||||
#include "land.h"
|
||||
#include "map.h"
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include <SDL.h>
|
||||
|
||||
#include "toolkit.h"
|
||||
#include "dialogue.h"
|
||||
#include "log.h"
|
||||
#include "lephisto.h"
|
||||
#include "pilot.h"
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "pause.h"
|
||||
#include "menu.h"
|
||||
#include "toolkit.h"
|
||||
#include "dialogue.h"
|
||||
#include "mission.h"
|
||||
#include "misn_lua.h"
|
||||
#include "ltime.h"
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "xml.h"
|
||||
#include "player.h"
|
||||
#include "toolkit.h"
|
||||
#include "dialogue.h"
|
||||
#include "menu.h"
|
||||
#include "lfile.h"
|
||||
#include "hook.h"
|
||||
|
256
src/toolkit.c
256
src/toolkit.c
@ -124,9 +124,6 @@ static glColour* toolkit_colLight = &cGrey90;
|
||||
static glColour* toolkit_col = &cGrey70;
|
||||
static glColour* toolkit_colDark = &cGrey30;
|
||||
|
||||
/* Extern. */
|
||||
extern void main_loop(void); /* lephisto.c */
|
||||
/* Static. */
|
||||
/* Widgets. */
|
||||
static Widget* window_newWidget(Window* w);
|
||||
static void widget_cleanup(Widget* widget);
|
||||
@ -159,16 +156,6 @@ static void toolkit_clip(double x, double y, double w, double h);
|
||||
static void toolkit_unclip(void);
|
||||
static void toolkit_drawRect(double x, double y, double w, double h,
|
||||
glColour* c, glColour* lc);
|
||||
/* Dialogues.. */
|
||||
static glFont* dialogue_getSize(char* msg, int* w, int* h);
|
||||
static void dialogue_alertClose(char* str);
|
||||
static void dialogue_msgClose(char* str);
|
||||
static void dialogue_YesNoClose(char* str);
|
||||
static void dialogue_inputClose(char* str);
|
||||
static void dialogue_inputCancel(char* str);
|
||||
/* Secondary loop hack. */
|
||||
static int loop_done;
|
||||
static int toolkit_loop(void);
|
||||
|
||||
/* Set the internal widget position. */
|
||||
static void toolkit_setPos(Window* wdw, Widget* wgt, int x, int y) {
|
||||
@ -1499,226 +1486,6 @@ static Widget* toolkit_getFocus(void) {
|
||||
return &wdw->widgets[wdw->focus];
|
||||
}
|
||||
|
||||
void dialogue_alert(const char* fmt, ...) {
|
||||
char msg[512];
|
||||
va_list ap;
|
||||
unsigned int wdw;
|
||||
int h;
|
||||
|
||||
if(window_exists("Warning")) return;
|
||||
|
||||
if(fmt == NULL) return;
|
||||
else {
|
||||
/* Get the message. */
|
||||
va_start(ap, fmt);
|
||||
vsprintf(msg, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
h = gl_printHeight(&gl_smallFont, 260, msg);
|
||||
|
||||
/* Create window. */
|
||||
wdw = window_create("Warning", -1, -1, 300, 90+h);
|
||||
|
||||
window_addText(wdw, 20, -30, 260, h, 0, "txtAlert",
|
||||
&gl_smallFont, &cBlack, msg);
|
||||
|
||||
window_addButton(wdw, 135, 20, 50, 30, "btnOK", "OK",
|
||||
dialogue_alertClose);
|
||||
}
|
||||
|
||||
static void dialogue_alertClose(char* str) {
|
||||
(void)str;
|
||||
if(window_exists("Warning"))
|
||||
window_destroy(window_get("Warning"));
|
||||
}
|
||||
|
||||
static glFont* dialogue_getSize(char* msg, int* w, int* h) {
|
||||
glFont* font;
|
||||
|
||||
font = &gl_smallFont; /* Try to use smallfont. */
|
||||
(*h) = gl_printHeight(font, (*w)-40, msg);
|
||||
if(strlen(msg) > 100) {
|
||||
/* Make font bigger for large text area's. */
|
||||
font = &gl_defFont;
|
||||
(*h) = gl_printHeight(font, (*w)-40, msg);
|
||||
if((*h) > 200) (*w) += MIN((*h)-200, 600); /* Too big, so we make it wider. */
|
||||
(*h) = gl_printHeight(font, (*w)-40, msg);
|
||||
}
|
||||
return font;
|
||||
}
|
||||
|
||||
/* Display an alert popup with only an OK button and a message. */
|
||||
static unsigned int msg_wid = 0;
|
||||
void dialogue_msg(char* caption, const char* fmt, ...) {
|
||||
char msg[4096];
|
||||
va_list ap;
|
||||
int w, h;
|
||||
glFont* font;
|
||||
|
||||
if(msg_wid) return;
|
||||
|
||||
if(fmt == NULL) return;
|
||||
else {
|
||||
/* Get the message. */
|
||||
va_start(ap, fmt);
|
||||
vsprintf(msg, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
w = 300; /* Default width. */
|
||||
font = dialogue_getSize(msg, &w, &h);
|
||||
|
||||
/* Create the window. */
|
||||
msg_wid = window_create(caption, -1, -1, w, 110+h);
|
||||
window_addText(msg_wid, 20, -40, w-40, h, 0, "txtMsg",
|
||||
font, &cBlack, msg);
|
||||
|
||||
window_addButton(msg_wid, (w-50)/2, 20, 50, 30, "btnOK", "OK",
|
||||
dialogue_msgClose);
|
||||
|
||||
toolkit_loop();
|
||||
}
|
||||
|
||||
static void dialogue_msgClose(char* str) {
|
||||
(void)str;
|
||||
window_destroy(msg_wid);
|
||||
msg_wid = 0;
|
||||
loop_done = 1;
|
||||
}
|
||||
|
||||
/* Runs a dialogue with a Yes No button, return 1 if yes. */
|
||||
static int yesno_result;
|
||||
static unsigned int yesno_wid = 0;
|
||||
int dialogue_YesNo(char* caption, const char* fmt, ...) {
|
||||
char msg[4096];
|
||||
va_list ap;
|
||||
int w, h;
|
||||
glFont* font;
|
||||
|
||||
if(yesno_wid) return -1;
|
||||
|
||||
if(fmt == NULL) return -1;
|
||||
else {
|
||||
/* Get the message. */
|
||||
va_start(ap, fmt);
|
||||
vsprintf(msg, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
w = 300;
|
||||
font = dialogue_getSize(msg, &w, &h);
|
||||
|
||||
/* Create window. */
|
||||
yesno_wid = window_create(caption, -1, -1, w, h+110);
|
||||
/* Text. */
|
||||
window_addText(yesno_wid, 20, -40, w-40, h, 0, "txtYesNo",
|
||||
font, &cBlack, msg);
|
||||
/* Buttons. */
|
||||
window_addButton(yesno_wid, w/2-50-10, 20, 50, 30, "btnYes", "Yes",
|
||||
dialogue_YesNoClose);
|
||||
|
||||
window_addButton(yesno_wid, w/2+50+10, 20, 50, 30, "btnNo", "No",
|
||||
dialogue_YesNoClose);
|
||||
|
||||
/* Tricky secondary loop. */
|
||||
toolkit_loop();
|
||||
|
||||
/* Return the result. */
|
||||
return yesno_result;
|
||||
}
|
||||
|
||||
static void dialogue_YesNoClose(char* str) {
|
||||
/* Store the result. */
|
||||
if(strcmp(str, "btnYes")==0) yesno_result = 1;
|
||||
else if(strcmp(str, "btnNo")==0) yesno_result = 0;
|
||||
|
||||
/* Destroy the window. */
|
||||
window_destroy(yesno_wid);
|
||||
yesno_wid = 0;
|
||||
|
||||
loop_done = 1;
|
||||
}
|
||||
|
||||
/* Toolkit input boxes, return input. */
|
||||
static unsigned int input_wid = 0;
|
||||
static int input_cancelled = 0;
|
||||
char* dialogue_input(char* title, int min, int max, const char* fmt, ...) {
|
||||
char msg[512], *input;
|
||||
va_list ap;
|
||||
int h;
|
||||
|
||||
if(input_wid) return NULL;
|
||||
|
||||
if(fmt == NULL) return NULL;
|
||||
else {
|
||||
/* Get the message. */
|
||||
va_start(ap, fmt);
|
||||
vsprintf(msg, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
/* Start out not cancelled. */
|
||||
input_cancelled = 0;
|
||||
|
||||
/* Get text height. */
|
||||
h = gl_printHeight(&gl_smallFont, 200, msg);
|
||||
|
||||
/* Create the window. */
|
||||
input_wid = window_create(title, -1, -1, 240, h+140);
|
||||
window_setAccept(input_wid, dialogue_inputClose);
|
||||
window_setCancel(input_wid, dialogue_inputCancel);
|
||||
/* Text. */
|
||||
window_addText(input_wid, 30, -30, 200, h, 0, "txtInput",
|
||||
&gl_smallFont, &cDConsole, msg);
|
||||
|
||||
/* Input. */
|
||||
window_addInput(input_wid, 20, -50-h, 200, 20, "inpInput", max, 1);
|
||||
|
||||
/*Button. */
|
||||
window_addButton(input_wid, -20, 20, 80, 30,
|
||||
"btnClose", "Done", dialogue_inputClose);
|
||||
|
||||
/* Tricky secondary loop. */
|
||||
input = NULL;
|
||||
while(!input_cancelled && (!input ||
|
||||
((int)strlen(input) < min))) { /* Must be longer then min. */
|
||||
/* Must be longer than min. */
|
||||
if(input) {
|
||||
dialogue_alert("Input must be at least %d characters long!", min);
|
||||
free(input);
|
||||
input = NULL;
|
||||
}
|
||||
|
||||
if(toolkit_loop() != 0) /* Error in loop -> quit. */
|
||||
return NULL;
|
||||
|
||||
/* Save the input. */
|
||||
if(input_cancelled != 0)
|
||||
input = NULL;
|
||||
else
|
||||
input = strdup(window_getInput(input_wid, "inpInput"));
|
||||
}
|
||||
|
||||
/* Cleanup. */
|
||||
window_destroy(input_wid);
|
||||
input_wid = 0;
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
static void dialogue_inputClose(char* str) {
|
||||
(void)str;
|
||||
|
||||
/* Break the loop. */
|
||||
loop_done = 1;
|
||||
}
|
||||
|
||||
static void dialogue_inputCancel(char* str) {
|
||||
input_cancelled = 1;
|
||||
dialogue_inputClose(str);
|
||||
}
|
||||
|
||||
/* Init. */
|
||||
int toolkit_init(void) {
|
||||
windows = malloc(sizeof(Window)*MIN_WINDOWS);
|
||||
@ -1735,26 +1502,3 @@ void toolkit_exit(void) {
|
||||
free(windows);
|
||||
}
|
||||
|
||||
/* Spawns a secondary loop that only works until the toolkit dies. */
|
||||
/* A lot like the main while loop in lephisto.c. */
|
||||
static int toolkit_loop(void) {
|
||||
SDL_Event event, quit = { .type = SDL_QUIT };
|
||||
|
||||
loop_done = 0;
|
||||
while(!loop_done && toolkit) {
|
||||
while(SDL_PollEvent(&event)) {
|
||||
/* Event loopz. */
|
||||
if(event.type == SDL_QUIT) {
|
||||
/* Pass quit event to main engine. */
|
||||
loop_done = 1;
|
||||
SDL_PushEvent(&quit);
|
||||
return 1;
|
||||
}
|
||||
/* Handles all the events and player keybinds. */
|
||||
input_handle(&event);
|
||||
}
|
||||
main_loop();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -43,15 +43,6 @@ void window_addInput(const unsigned int wid,
|
||||
const int w, const int h,
|
||||
char* name, const int max, const int oneline);
|
||||
|
||||
/* Popups and alerts. */
|
||||
|
||||
/* Does not pause execution. */
|
||||
void dialogue_alert(const char* fmt, ...);
|
||||
void dialogue_msg(char* caption, const char* fmt, ...);
|
||||
/* Yes = 1, No = 0. */
|
||||
int dialogue_YesNo(char* caption, const char* fmt, ...);
|
||||
char* dialogue_input(char* title, int min, int max, const char* fmt, ...);
|
||||
|
||||
/* Modification. */
|
||||
void window_setAccept(const unsigned int wid, void(*fptr)(char*));
|
||||
void window_setCancel(const unsigned int wid, void(*cancel)(char*));
|
||||
|
Loading…
Reference in New Issue
Block a user