2014-01-06 1 views
1

Я использую библиотеку FLTK и использовал всплывающую функцию fl_input() от Fl_ask.h. Я хочу функцию, которая, если пользователь не вводит данные и данные в течение 3 секунд, функция должна вернуться. Как я могу вернуть эту функцию без нажатия OK или cancel. Нужно ли вообще обращаться к этому всплывающему диалогу? Это код, который я используюКак добавить тайм-аут в всплывающее диалоговое окно FLTK

const char *message = "Enter name here"; 

Fl::lock(); 
char *c = (char*)fl_input(message, ""); 
if(c == NULL) 
    c = ""; 
Fl::unlock(); 
+0

OK. Невозможно, чтобы он справился с этой функцией. Я сделаю свое собственное диалоговое окно. Может ли кто-нибудь показать мне пример для add_timeout. – harsh

ответ

0

Вы не можете сделать это легко, используя 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.