/************************************************************************** Do default Widget action when pressed, and then call widget callback function. example for Button: set flags FW_Pressed redraw button ( pressed ) refresh screen ( to see result ) wait 300 ms ( to see result :) If exist (button callback function) then call (button callback function) Function normal return Widget ID. NOTE: NOZERO return of this function deterninate exit of MAIN_SDL_GAME_LOOP if ( pWidget->action ) if ( pWidget->action(pWidget) ) ID = 0; if widget callback function return = 0 then return NOZERO I default return (-1) from Widget callback functions. **************************************************************************/ Uint16 widget_pressed_action(struct widget * pWidget) { Uint16 ID = 0; if (!pWidget) { return 0; } widget_info_counter = 0; if (pInfo_Area) { sdl_dirty_rect(*pInfo_Area); FC_FREE(pInfo_Area); FREESURFACE(pInfo_Label); } switch (get_wtype(pWidget)) { case WT_TI_BUTTON: case WT_I_BUTTON: case WT_ICON: case WT_ICON2: if (Main.event.button.button == SDL_BUTTON_LEFT) { set_wstate(pWidget, FC_WS_PRESSED); widget_redraw(pWidget); widget_mark_dirty(pWidget); flush_dirty(); set_wstate(pWidget, FC_WS_SELLECTED); SDL_Delay(300); } ID = pWidget->ID; if (pWidget->action) { if (pWidget->action(pWidget)) { ID = 0; } } break; case WT_EDIT: { if (Main.event.button.button == SDL_BUTTON_LEFT) { bool ret, loop = ((get_wflags(pWidget) & WF_EDIT_LOOP) == WF_EDIT_LOOP); enum Edit_Return_Codes change; do { ret = FALSE; change = edit_field(pWidget); if (change != ED_FORCE_EXIT && (!loop || change != ED_RETURN)) { widget_redraw(pWidget); widget_mark_dirty(pWidget); flush_dirty(); } if (change != ED_FORCE_EXIT && change != ED_ESC && pWidget->action) { if (pWidget->action(pWidget)) { ID = 0; } } if (loop && change == ED_RETURN) { ret = TRUE; } } while(ret); ID = 0; } break; } case WT_VSCROLLBAR: case WT_HSCROLLBAR: if (Main.event.button.button == SDL_BUTTON_LEFT) { set_wstate(pWidget, FC_WS_PRESSED); widget_redraw(pWidget); widget_mark_dirty(pWidget); flush_dirty(); } ID = pWidget->ID; if (pWidget->action) { if (pWidget->action(pWidget)) { ID = 0; } } break; case WT_CHECKBOX: case WT_TCHECKBOX: if (Main.event.button.button == SDL_BUTTON_LEFT) { set_wstate(pWidget, FC_WS_PRESSED); widget_redraw(pWidget); widget_mark_dirty(pWidget); flush_dirty(); set_wstate(pWidget, FC_WS_SELLECTED); togle_checkbox(pWidget); SDL_Delay(300); } ID = pWidget->ID; if (pWidget->action) { if (pWidget->action(pWidget)) { ID = 0; } } break; case WT_COMBO: if (Main.event.button.button == SDL_BUTTON_LEFT) { set_wstate(pWidget, FC_WS_PRESSED); combo_popup(pWidget); } else { combo_popdown(pWidget); } break; default: ID = pWidget->ID; if (pWidget->action) { if (pWidget->action(pWidget) != 0) { ID = 0; } } break; } return ID; }
static void demo_forms(void) { WINDOW *w; FORM *form; FIELD *f[100]; /* FIXME memset to zero */ int finished = 0, c; unsigned n = 0; int pg; WINDOW *also; #ifdef NCURSES_MOUSE_VERSION mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0); #endif help_edit_field(); MvAddStr(4, 57, "Forms Entry Test"); show_insert_mode(TRUE); refresh(); /* describe the form */ memset(f, 0, sizeof(f)); for (pg = 0; pg < 4; ++pg) { char label[80]; sprintf(label, "Sample Form Page %d", pg + 1); f[n++] = make_label(0, 15, label); set_new_page(f[n - 1], TRUE); switch (pg) { default: f[n++] = make_label(2, 0, "Last Name"); f[n++] = make_field(3, 0, 1, 18); set_field_type(f[n - 1], TYPE_ALPHA, 1); f[n++] = make_label(2, 20, "First Name"); f[n++] = make_field(3, 20, 1, 12); set_field_type(f[n - 1], TYPE_ALPHA, 1); f[n++] = make_label(2, 34, "Middle Name"); f[n++] = make_field(3, 34, 1, 12); set_field_type(f[n - 1], TYPE_ALPHA, 1); break; case 1: f[n++] = make_label(2, 0, "Last Name"); f[n++] = make_field(3, 0, 1, 18); set_field_type(f[n - 1], TYPE_ALPHA, 1); f[n++] = make_label(2, 20, "First Name"); f[n++] = make_field(3, 20, 1, 12); set_field_type(f[n - 1], TYPE_ALPHA, 1); f[n++] = make_label(2, 34, "MI"); f[n++] = make_field(3, 34, 1, 1); set_field_pad(f[n - 1], '?'); set_field_type(f[n - 1], TYPE_ALPHA, 1); break; case 2: f[n++] = make_label(2, 0, "Host Name"); f[n++] = make_field(3, 0, 1, 18); set_field_type(f[n - 1], TYPE_ALNUM, 1); #ifdef NCURSES_VERSION f[n++] = make_label(2, 20, "IP Address"); f[n++] = make_field(3, 20, 1, 12); set_field_type(f[n - 1], TYPE_IPV4, 1); #endif break; case 3: f[n++] = make_label(2, 0, "Four digits"); f[n++] = make_field(3, 0, 1, 18); set_field_type(f[n - 1], TYPE_INTEGER, 4, 0, 0); f[n++] = make_label(2, 20, "Numeric"); f[n++] = make_field(3, 20, 1, 12); set_field_type(f[n - 1], TYPE_NUMERIC, 3, -10000.0, 100000000.0); break; } f[n++] = make_label(5, 0, "Comments"); f[n++] = make_field(6, 0, 4, 46); set_field_buffer(f[n - 1], 0, "HELLO\nWORLD!"); set_field_buffer(f[n - 1], 1, "Hello\nWorld!"); } f[n] = (FIELD *) 0; if ((form = new_form(f)) != 0) { display_form(form); w = form_win(form); also = newwin(getmaxy(stdscr) - getmaxy(w), COLS, getmaxy(w), 0); show_current_field(also, form); while (!finished) { switch (edit_field(form, &c)) { case E_OK: break; case E_UNKNOWN_COMMAND: finished = my_form_driver(form, c); break; default: beep(); break; } show_current_field(also, form); } erase_form(form); free_form(form); } for (c = 0; f[c] != 0; c++) { void *ptr = field_userptr(f[c]); free(ptr); free_field(f[c]); } noraw(); nl(); #ifdef NCURSES_MOUSE_VERSION mousemask(0, (mmask_t *) 0); #endif }
void E_F(int areanr) { FILE *fil; char temp[PATH_MAX], help[81]; int i, y, o, records, Ondisk; static char *menu = (char *)"0"; int offset; time_t Time; struct stat statfile; unsigned int crc, crc1; clr_index(); snprintf(temp, PATH_MAX, "%s/var/fdb/file%d.data", getenv("MBSE_ROOT"), areanr); if ((fil = fopen(temp, "r+")) == NULL) { working(2, 0, 0); return; } if (! check_free()) return; fread(&fdbhdr, sizeof(fdbhdr), 1, fil); fseek(fil, 0, SEEK_END); records = ((ftell(fil) - fdbhdr.hdrsize) / fdbhdr.recsize); o = 0; for (;;) { clr_index(); set_color(WHITE, BLACK); mbse_mvprintw(5, 4, "14. EDIT FILES DATABASE"); y = 8; working(1, 0, 0); set_color(YELLOW, BLUE); mbse_mvprintw(7, 1, " Nr Filename Size Date Time Description "); /* 1234 12345678901234 12345678 12-34-1998 12:45 123456789012345678901234567890*/ set_color(CYAN, BLACK); for (i = 1; i <= 10; i++) { if ((o + i) <= records) { offset = (((o + i) - 1) * fdbhdr.recsize) + fdbhdr.hdrsize; fseek(fil, offset, SEEK_SET); fread(&fdb, fdbhdr.recsize, 1, fil); set_color(WHITE, BLACK); mbse_mvprintw(y, 1, (char *)"%4d.", o + i); snprintf(temp, PATH_MAX, "%s/%s", area.Path, fdb.LName); Ondisk = ((stat(temp, &statfile)) != -1); if (fdb.Deleted) set_color(LIGHTBLUE, BLACK); else if (Ondisk) set_color(CYAN, BLACK); else set_color(LIGHTRED, BLACK); mbse_mvprintw(y, 8, (char *)"%-14s", fdb.Name); if (Ondisk) { if (fdb.Size == statfile.st_size) set_color(CYAN, BLACK); else set_color(LIGHTRED, BLACK); mbse_mvprintw(y,23, (char *)"%8ld", fdb.Size); if (fdb.FileDate == statfile.st_mtime) set_color(CYAN, BLACK); else set_color(LIGHTRED, BLACK); Time = fdb.FileDate; mbse_mvprintw(y,32, (char *)"%s %s", StrDateDMY(Time), StrTimeHM(Time)); } set_color(CYAN, BLACK); snprintf(temp, 81, "%s", fdb.Desc[0]); temp[30] = '\0'; mbse_mvprintw(y,49, (char *)"%s", temp); y++; } } if (records) if (records > 10) snprintf(help, 81, "^1..%d^ Edit, ^-^ Return, ^N^/^P^ Page", records); else snprintf(help, 81, "^1..%d^ Edit, ^-^ Return", records); else snprintf(help, 81, "^-^ Return"); showhelp(help); while(TRUE) { mbse_mvprintw(LINES - 4, 6, "Enter your choice >"); menu = (char *)"-"; menu = edit_field(LINES - 4, 26, 6, '!', menu); mbse_locate(LINES - 4, 6); clrtoeol(); if (strncmp(menu, "-", 1) == 0) { fclose(fil); open_bbs(); return; } if (records > 10) { if (strncmp(menu, "N", 1) == 0) if ((o + 10) < records) { o += 10; break; } if (strncmp(menu, "P", 1) == 0) if ((o - 10) >= 0) { o -= 10; break; } } if ((atoi(menu) > 0) && (atoi(menu) <= records)) { working(1, 0, 0); offset = ((atoi(menu) - 1) * fdbhdr.recsize) + fdbhdr.hdrsize; fseek(fil, offset, SEEK_SET); fread(&fdb, fdbhdr.recsize, 1, fil); crc = 0xffffffff; crc = upd_crc32((char *)&fdb, crc, fdbhdr.recsize); o = ((atoi(menu) - 1) / 10) * 10; snprintf(temp, PATH_MAX, "%s/%s", area.Path, fdb.LName); EditFile(); crc1 = 0xffffffff; crc1 = upd_crc32((char *)&fdb, crc1, fdbhdr.recsize); if (crc != crc1) { if (yes_no((char *)"Record is changed, save") == 1) { working(1, 0, 0); fseek(fil, offset, SEEK_SET); fwrite(&fdb, fdbhdr.recsize, 1, fil); working(6, 0, 0); } } break; } } } }