Вы не можете сделать это легко, используя fl_input, потому что ручка к окну отсутствует. Посмотрите источник fl_input в src/fl_ask.cxx. Вы увидите, что он вызывает input_innards. Если вы отслеживаете входные данные, вы увидите, что он вызывает внутренности. Если вы затем следуют внутренностей, вы найдете время цикла, который считывает
while (message_form->shown()) Fl::wait();
Сделайте копию fl_ask.cxx, скажем timed_ask.cxx. Сделать все процедуры fl_ статическими. Изменение fl_input следующим образом:
const char* timed_input(double timeout, const char *fmt, const char *defstr, ...) {
if (avoidRecursion) return 0;
va_list ap;
va_start(ap, defstr);
const char* r = timed_input_innards(timeout, fmt, ap, defstr, FL_NORMAL_INPUT);
va_end(ap);
return r;
}
Сделайте копию input_innards и переименовать новую для timed_input_innards (это держит другое fl_routines счастливо, если вы не хотите, чтобы удалить их).
static const char* timed_input_innards(double timeout, const char* fmt, va_list ap,
const char* defstr, uchar type) {
...
int r = timed_innards(timeout, fmt, ap, fl_cancel, fl_ok, 0);
...
Сделайте копию внутренностей и переименовать новый, чтобы timed_innards
static int timed_innards(double timeout, const char* fmt, va_list ap,
const char *b0,
const char *b1,
const char *b2)
{
...
Fl::add_timeout(timeout, hide_form, message_form);
while (message_form->shown()) Fl::wait();
...
}
Добавить таймаут рутинную
void hide_form(void* data)
{
// You could do this or use message_form directly
Fl_Window* form = reinterpret_cast<Fl_Window*>(data);
form->hide();
}
Это приведет к message_form-> показано(), чтобы быть ложными и выйдите из цикла while.
OK. Невозможно, чтобы он справился с этой функцией. Я сделаю свое собственное диалоговое окно. Может ли кто-нибудь показать мне пример для add_timeout. – harsh