gint viper_form_driver(FORM *form,gint request,guint32 flags, chtype active,chtype normal,gshort cursor_color) { WINDOW *window; chtype eraser; chtype temp_ch; gint x,y; gint retval; gshort fg,bg; if(form==NULL) return ERR; if(form_sub(form)!=form_win(form)) window=form_sub(form); else window=form_win(form); getyx(window,y,x); eraser=field_back(current_field(form)); mvwchgat(window,y,x,1,(eraser & A_ATTRIBUTES), PAIR_NUMBER(eraser & A_COLOR),NULL); retval=form_driver(form,request); if(flags & FORM_COLORIZE) viper_form_colorize(form,active,normal,active,normal); if(flags & FORM_CURSOR_NONE) return retval; temp_ch=termattrs(); if((flags & FORM_CURSOR_ULINE) && !(temp_ch & A_UNDERLINE)) return ERR; getyx(window,y,x); temp_ch=field_fore(current_field(form)); if(flags & FORM_CURSOR_ULINE) mvwchgat(window,y,x,1,(temp_ch & A_ATTRIBUTES) | A_UNDERLINE, PAIR_NUMBER(temp_ch & A_COLOR),NULL); else { pair_content(PAIR_NUMBER(temp_ch & A_COLOR),&fg,&bg); if(cursor_color!=-1) { bg=cursor_color; mvwchgat(window,y,x,1,A_NORMAL,viper_color_pair(fg,bg),NULL); } else mvwchgat(window,y,x,1,A_REVERSE,viper_color_pair(fg,bg),NULL); } return E_OK; }
static void show_current_field(WINDOW *win, FORM * form) { FIELD *field; FIELDTYPE *type; char *buffer; int nbuf; int field_rows, field_cols, field_max; int currow, curcol; if (has_colors()) { wbkgd(win, (chtype) COLOR_PAIR(1)); } werase(win); form_getyx(form, currow, curcol); wprintw(win, "Cursor: %d,%d", currow, curcol); if (data_ahead(form)) waddstr(win, " ahead"); if (data_behind(form)) waddstr(win, " behind"); waddch(win, '\n'); if ((field = current_field(form)) != 0) { wprintw(win, "Page %d%s, Field %d/%d%s:", form_page(form), new_page(field) ? "*" : "", field_index(field), field_count(form), field_arg(field) ? "(arg)" : ""); if ((type = field_type(field)) != 0) { if (type == TYPE_ALNUM) waddstr(win, "ALNUM"); else if (type == TYPE_ALPHA) waddstr(win, "ALPHA"); else if (type == TYPE_ENUM) waddstr(win, "ENUM"); else if (type == TYPE_INTEGER) waddstr(win, "INTEGER"); #ifdef NCURSES_VERSION else if (type == TYPE_IPV4) waddstr(win, "IPV4"); #endif else if (type == TYPE_NUMERIC) waddstr(win, "NUMERIC"); else if (type == TYPE_REGEXP) waddstr(win, "REGEXP"); else waddstr(win, "other"); } if ((unsigned) field_opts(field) & O_EDIT) waddstr(win, " editable"); else waddstr(win, " readonly"); if (field_status(field)) waddstr(win, " modified"); if (dynamic_field_info(field, &field_rows, &field_cols, &field_max) != ERR) { wprintw(win, " size %dx%d (max %d)", field_rows, field_cols, field_max); } waddch(win, ' '); (void) wattrset(win, (int) field_fore(field)); waddstr(win, "fore"); wattroff(win, (int) field_fore(field)); waddch(win, '/'); (void) wattrset(win, (int) field_back(field)); waddstr(win, "back"); wattroff(win, (int) field_back(field)); wprintw(win, ", pad '%c'", field_pad(field)); waddstr(win, "\n"); for (nbuf = 0; nbuf <= 2; ++nbuf) { if ((buffer = field_buffer(field, nbuf)) != 0) { wprintw(win, "buffer %d:", nbuf); (void) wattrset(win, A_REVERSE); waddstr(win, buffer); wattroff(win, A_REVERSE); waddstr(win, "\n"); } } } wrefresh(win); }