int main() { WINDOW *fred,*barney; initscr(); /* Build window & wait */ fred = newwin(0,0,0,0); waddstr(fred,"This is the original window, Fred.\n"); wrefresh(fred); getch(); /* Create and show barney */ barney = dupwin(fred); waddstr(barney,"This is the Barney copy of window Fred.\n"); wrefresh(barney); getch(); /* Go back to fred */ waddstr(fred,"Nice to see you again!\n"); wrefresh(fred); getch(); /* One more time to barney */ waddstr(barney,"And Barney says 'Hi' as well.\n"); touchwin(barney); wrefresh(barney); endwin(); return(0); }
scr_set(const char *file) { T((T_CALLED("scr_set(%s)"), _nc_visbuf(file))); if (scr_init(file) == ERR) { returnCode(ERR); } else { delwin(newscr); SP->_newscr = newscr = dupwin(curscr); returnCode(OK); } }
scr_set(const char *file) { T((T_CALLED("scr_set(%s)"), _nc_visbuf(file))); if (scr_init(file) == ERR) { returnCode(ERR); } else { delwin(newscr); SP->_newscr = dupwin(curscr); #if !USE_REENTRANT newscr = SP->_newscr; #endif returnCode(OK); } }
NCURSES_SP_NAME(scr_set) (NCURSES_SP_DCLx const char *file) { T((T_CALLED("scr_set(%p,%s)"), (void *) SP_PARM, _nc_visbuf(file))); if (NCURSES_SP_NAME(scr_init) (NCURSES_SP_ARGx file) == ERR) { returnCode(ERR); } else { delwin(NewScreen(SP_PARM)); NewScreen(SP_PARM) = dupwin(curscr); #if !USE_REENTRANT newscr = NewScreen(SP_PARM); #endif returnCode(OK); } }
NCURSES_SP_NAME(scr_set) (NCURSES_SP_DCLx const char *file) { int code = ERR; T((T_CALLED("scr_set(%p,%s)"), (void *) SP_PARM, _nc_visbuf(file))); if (NCURSES_SP_NAME(scr_init) (NCURSES_SP_ARGx file) == OK) { delwin(NewScreen(SP_PARM)); NewScreen(SP_PARM) = dupwin(curscr); #if !USE_REENTRANT newscr = NewScreen(SP_PARM); #endif if (NewScreen(SP_PARM) != 0) { code = OK; } } returnCode(code); }
static void preinsure(dialogMenuItem *self, int is_selected) { if (is_selected) { static WINDOW *w; /* This has to be here first if you want to see selection traverse properly in the invoking menu */ refresh(); w = dupwin(newscr); DialogX = 1; DialogY = 13; dialog_radiolist("How much insurance would you like to take out?", "If you're really going to do this, we recommend some insurance\n" "first! What kind of life insurance policy would you like?", -1, -1, 3, 3, insurance, NULL); touchwin(w); wrefresh(w); delwin(w); } }
int main(void) { WINDOW *alpha,*beta; int x; initscr(); start_color(); init_pair(1,COLOR_WHITE,COLOR_BLUE); init_pair(2,COLOR_WHITE,COLOR_RED); /* create and populate the original window */ alpha = newwin(5,30,0,0); wbkgd(alpha,COLOR_PAIR(1)); for(x=0;x<75;x++) wprintw(alpha,"O "); wrefresh(alpha); getch(); /* duplicate window alpha to window beta */ beta = dupwin(alpha); if( beta == NULL) { endwin(); puts("Error creating duplicate window"); return 1; } /* move new window and change color */ mvwin(beta,10,40); wbkgd(beta,COLOR_PAIR(2)); mvwaddstr(alpha,0,0,"This is window Alpha!"); mvwaddstr(beta,0,0,"This is window Beta!"); wrefresh(alpha); wrefresh(beta); getch(); endwin(); return 0; }
int scr_reset(FILE *filep, int type) { WINDOW *win = NULL, *win1 = NULL; int *hash, y; char clearit = FALSE; short magic; struct stat statbuf; time_t ttytime; if (type != 1 && exit_ca_mode && *exit_ca_mode && non_rev_rmcup) { if (type == 0) goto err; else { #ifdef DEBUG if (outf) fprintf(outf, "clear it because of " "exit_ca_mode\n"); #endif /* DEBUG */ clearit = TRUE; } } /* check magic number */ if (fread((char *) &magic, sizeof (short), 1, filep) != 1) goto err; if (magic != SVR3_DUMP_MAGIC_NUMBER) goto err; /* get modification time of image in file */ if (fread((char *) &ttytime, sizeof (time_t), 1, filep) != 1) goto err; if ((type != 1) && ((ttyname(cur_term->Filedes) == NULL) || (fstat(cur_term->Filedes, &statbuf) < 0) || (statbuf.st_mtime != ttytime))) { if (type == 0) goto err; else { #ifdef DEBUG if (outf) fprintf(outf, "Filedes = %hd, " "statbuf.st_mtime = %d, " "ttytime = %d\n", cur_term->Filedes, statbuf.st_mtime, ttytime); #endif /* DEBUG */ clearit = TRUE; } } /* if get here, everything is ok, read the curscr image */ if (((win = getwin(filep)) == NULL) || ((type == 2) && ((win1 = dupwin(win)) == NULL)) || (win->_maxy != curscr->_maxy) || (win->_maxx != curscr->_maxx) || /* soft labels */ (fread((char *) &magic, sizeof (int), 1, filep) != 1)) goto err; /* * if soft labels were dumped, we would like either read them * or advance the file pointer pass them */ if (magic) { short i, labmax, lablen; SLK_MAP *slk = SP->slk; /* * Why doesn't the following line and the two below * that access those variables work ? */ /* * char **labdis = SP->slk->_ldis, **labval = SP->slk->_lval; */ if ((fread((char *) &labmax, sizeof (short), 1, filep) != 1) || (fread((char *) &lablen, sizeof (short), 1, filep) != 1)) { goto err; } if (slk != NULL) { if ((labmax != slk->_num) || (lablen != (slk->_len + 1))) goto err; for (i = 0; i < labmax; i++) { /* * if ((fread(labdis[i], sizeof (char), lablen, * filep) != lablen) || * (fread(labval[i], sizeof (char), lablen, * filep != lablen)) */ if ((fread(slk->_ldis[i], sizeof (char), lablen, filep) != lablen) || (fread(slk->_lval[i], sizeof (char), lablen, filep) != lablen)) { goto err; } } (*_do_slk_tch)(); } else { if (fseek(filep, (long) (2 * labmax * lablen * sizeof (char)), 1) != 0) goto err; } } /* read the color information(if any) from the file */ if (fread((char *) &magic, sizeof (int), 1, filep) != 1) goto err; if (magic) { int colors, color_pairs; bool could_change; int i; /* if the new terminal doesn't support colors, or it supports */ /* less colors (or color_pairs) than the old terminal, or */ /* start_color() has not been called, simply advance the file */ /* pointer pass the color related info. */ /* Note: must to read the first line of color info, even if the */ /* new terminal doesn't support color, in order to know how to */ /* deal with the rest of the file */ if ((fread((char *) &colors, sizeof (int), 1, filep) != 1) || (fread((char *) &color_pairs, sizeof (int), 1, filep) != 1) || (fread((char *) &could_change, sizeof (char), 1, filep) != 1)) goto err; if (max_pairs == -1 || cur_term->_pairs_tbl == NULL || colors > max_colors || color_pairs > max_pairs) { if (fseek(filep, (long) (colors * sizeof (_Color) + color_pairs * sizeof (_Color_pair)), 1) != 0) goto err; } else { _Color_pair *ptp, *save_ptp; /* if both old and new terminals could modify colors, read in */ /* color table, and call init_color for each color */ if (could_change) { if (can_change) { _Color *ctp, *save_ctp; if ((save_ctp = (ctp = (_Color *) malloc(colors * sizeof (_Color)))) == NULL) goto err; if (fread(ctp, sizeof (_Color), colors, filep) != colors) goto err; for (i = 0; i < colors; i++, ctp++) { /* LINTED */ (void) init_color((short)i, ctp->r, ctp->g, ctp->b); } free(save_ctp); } else { /* the old terminal could modify colors, by the new one */ /* cannot skip over color_table info. */ if (fseek(filep, (long) (colors * sizeof (_Color)), 1) != 0) goto err; } } /* read color_pairs info. call init_pair for each pair */ if ((save_ptp = (ptp = (_Color_pair *) malloc(color_pairs * sizeof (_Color_pair)))) == NULL) goto err; if (fread(ptp, sizeof (_Color_pair), color_pairs, filep) != color_pairs) { err: if (win != NULL) (void) delwin(win); if (win1 != NULL) (void) delwin(win1); if (type == 0) curscr->_clear = TRUE; return (ERR); } for (i = 1, ++ptp; i <= color_pairs; i++, ptp++) { if (ptp->init) /* LINTED */ (void) init_pair((short)i, ptp->foreground, ptp->background); } free(save_ptp); } } /* substitute read in window for the curscr */ switch (type) { case 1: case 2: (void) delwin(_virtscr); hash = _VIRTHASH; if (type == 1) { SP->virt_scr = _virtscr = win; _VIRTTOP = 0; _VIRTBOT = curscr->_maxy - 1; break; } SP->virt_scr = _virtscr = win1; _VIRTTOP = curscr->_maxy; _VIRTBOT = -1; /* clear the hash table */ for (y = curscr->_maxy; y > 0; --y) *hash++ = _NOHASH; /* LINTED */ /* Known fall-through on case statement. */ case 0: { int saveflag = curscr->_flags & _CANT_BE_IMMED; (void) delwin(curscr); SP->cur_scr = curscr = win; curscr->_sync = TRUE; curscr->_flags |= saveflag; hash = _CURHASH; } } /* clear the hash table */ for (y = curscr->_maxy; y > 0; --y) *hash++ = _NOHASH; curscr->_clear = clearit; return (OK); }
/* * Display a dialog box with a list of options that can be turned on or off */ int dialog_checklist(unsigned char *title, unsigned char *prompt, int height, int width, int list_height, int cnt, void *it, unsigned char *result) { int i, j, x, y, cur_x, cur_y, old_x, old_y, box_x, box_y, key = 0, button, choice, l, k, scroll, max_choice, item_no = 0, *status; int redraw_menu = FALSE, cursor_reset = FALSE; int rval = 0, onlist = 1, ok_space, cancel_space; char okButton, cancelButton; WINDOW *dialog, *list; unsigned char **items = NULL; dialogMenuItem *ditems; int list_width, check_x, item_x; /* Allocate space for storing item on/off status */ if ((status = alloca(sizeof(int) * abs(cnt))) == NULL) { endwin(); fprintf(stderr, "\nCan't allocate memory in dialog_checklist().\n"); exit(-1); } draw: choice = scroll = button = 0; /* Previous calling syntax, e.g. just a list of strings? */ if (cnt >= 0) { items = it; ditems = NULL; item_no = cnt; /* Initializes status */ for (i = 0; i < item_no; i++) status[i] = !strcasecmp(items[i*3 + 2], "on"); } /* It's the new specification format - fake the rest of the code out */ else { item_no = abs(cnt); ditems = it; if (!items) items = (unsigned char **)alloca((item_no * 3) * sizeof(unsigned char *)); /* Initializes status */ for (i = 0; i < item_no; i++) { status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE; items[i*3] = ditems[i].prompt; items[i*3 + 1] = ditems[i].title; items[i*3 + 2] = status[i] ? "on" : "off"; } } max_choice = MIN(list_height, item_no); check_x = 0; item_x = 0; /* Find length of longest item in order to center checklist */ for (i = 0; i < item_no; i++) { l = strlen(items[i*3]); for (j = 0; j < item_no; j++) { k = strlen(items[j*3 + 1]); check_x = MAX(check_x, l + k + 6); } item_x = MAX(item_x, l); } if (height < 0) height = strheight(prompt)+list_height+4+2; if (width < 0) { i = strwidth(prompt); j = ((title != NULL) ? strwidth(title) : 0); width = MAX(i,j); width = MAX(width,check_x+4)+4; } width = MAX(width,24); if (width > COLS) width = COLS; if (height > LINES) height = LINES; /* center dialog box on screen */ x = (COLS - width)/2; y = (LINES - height)/2; #ifdef HAVE_NCURSES if (use_shadow) draw_shadow(stdscr, y, x, height, width); #endif dialog = newwin(height, width, y, x); if (dialog == NULL) { endwin(); fprintf(stderr, "\nnewwin(%d,%d,%d,%d) failed, maybe wrong dims\n", height,width, y, x); return -1; } keypad(dialog, TRUE); draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr); wattrset(dialog, border_attr); wmove(dialog, height-3, 0); waddch(dialog, ACS_LTEE); for (i = 0; i < width-2; i++) waddch(dialog, ACS_HLINE); wattrset(dialog, dialog_attr); waddch(dialog, ACS_RTEE); wmove(dialog, height-2, 1); for (i = 0; i < width-2; i++) waddch(dialog, ' '); if (title != NULL) { wattrset(dialog, title_attr); wmove(dialog, 0, (width - strlen(title))/2 - 1); waddch(dialog, ' '); waddstr(dialog, title); waddch(dialog, ' '); } wattrset(dialog, dialog_attr); wmove(dialog, 1, 2); print_autowrap(dialog, prompt, height - 1, width - 2, width, 1, 2, TRUE, FALSE); list_width = width - 6; getyx(dialog, cur_y, cur_x); box_y = cur_y + 1; box_x = (width - list_width) / 2 - 1; /* create new window for the list */ list = subwin(dialog, list_height, list_width, y + box_y + 1, x + box_x + 1); if (list == NULL) { delwin(dialog); endwin(); fprintf(stderr, "\nsubwin(dialog,%d,%d,%d,%d) failed, maybe wrong dims\n", list_height, list_width, y + box_y + 1, x + box_x + 1); return -1; } keypad(list, TRUE); /* draw a box around the list items */ draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2, menubox_border_attr, menubox_attr); check_x = (list_width - check_x) / 2; item_x = check_x + item_x + 6; /* Print the list */ for (i = 0; i < max_choice; i++) print_item(list, items[i * 3], items[i * 3 + 1], status[i], i, i == choice, DREF(ditems, i), list_width, item_x, check_x); wnoutrefresh(list); print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); display_helpline(dialog, height - 1, width); x = width / 2 - 11; y = height - 2; /* Is this a fancy new style argument string where we get to override * the buttons, or an old style one where they're fixed? */ if (ditems && result) { cancelButton = toupper(ditems[CANCEL_BUTTON].prompt[0]); print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : FALSE); okButton = toupper(ditems[OK_BUTTON].prompt[0]); print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : TRUE); } else { cancelButton = 'C'; print_button(dialog, "Cancel", y, x + 14, FALSE); okButton = 'O'; print_button(dialog, " OK ", y, x, TRUE); } wnoutrefresh(dialog); wmove(list, choice, check_x+1); wrefresh(list); /* * XXX Black magic voodoo that allows printing to the checklist * window. For some reason, if this "refresh" code is not in * place, printing to the window from the selected callback * prints "behind" the checklist window. There is probably a * better way to do this. */ draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2, menubox_border_attr, menubox_attr); for (i = 0; i < max_choice; i++) print_item(list, items[i * 3], items[i * 3 + 1], status[i], i, i == choice, DREF(ditems, i), list_width, item_x, check_x); print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); wmove(list, choice, check_x+1); wnoutrefresh(dialog); wrefresh(list); /* XXX Black magic XXX */ while (key != ESC) { key = wgetch(dialog); /* Shortcut to OK? */ if (toupper(key) == okButton) { if (ditems) { if (result && ditems[OK_BUTTON].fire) { int st; WINDOW *save; save = dupwin(newscr); st = ditems[OK_BUTTON].fire(&ditems[OK_BUTTON]); if (st & DITEM_RESTORE) { touchwin(save); wrefresh(save); } delwin(save); } } else if (result) { *result = '\0'; for (i = 0; i < item_no; i++) { if (status[i]) { strcat(result, items[i*3]); strcat(result, "\n"); } } } rval = 0; key = ESC; /* Lemme out! */ break; } /* Shortcut to cancel? */ if (toupper(key) == cancelButton) { if (ditems && result && ditems[CANCEL_BUTTON].fire) { int st; WINDOW *save; save = dupwin(newscr); st = ditems[CANCEL_BUTTON].fire(&ditems[CANCEL_BUTTON]); if (st & DITEM_RESTORE) { touchwin(save); wrefresh(save); wmove(dialog, cur_y, cur_x); } delwin(save); } rval = 1; key = ESC; /* I gotta go! */ break; } /* Check if key pressed matches first character of any item tag in list */ for (i = 0; i < max_choice; i++) if (key != ' ' && key < 0x100 && toupper(key) == toupper(items[(scroll+i)*3][0])) break; if (i < max_choice || (key >= '1' && key <= MIN('9', '0'+max_choice)) || KEY_IS_UP(key) || KEY_IS_DOWN(key) || ((key == ' ' || key == '\n' || key == '\r') && onlist)) { /* if moving from buttons to the list, reset and redraw buttons */ if (!onlist) { onlist = 1; button = 0; if (ditems && result) { print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); } else { print_button(dialog, "Cancel", y, x + 14, button); print_button(dialog, " OK ", y, x, !button); } wmove(list, choice, check_x+1); wnoutrefresh(dialog); wrefresh(list); } if (key >= '1' && key <= MIN('9', '0'+max_choice)) i = key - '1'; else if (KEY_IS_UP(key)) { if (!choice) { if (scroll) { /* Scroll list down */ getyx(dialog, cur_y, cur_x); /* Save cursor position */ if (list_height > 1) { /* De-highlight current first item before scrolling down */ print_item(list, items[scroll * 3], items[scroll * 3 + 1], status[scroll], 0, FALSE, DREF(ditems, scroll), list_width, item_x, check_x); scrollok(list, TRUE); wscrl(list, -1); scrollok(list, FALSE); } scroll--; print_item(list, items[scroll*3], items[scroll*3 + 1], status[scroll], 0, TRUE, DREF(ditems, scroll), list_width, item_x, check_x); print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); wmove(list, choice, check_x+1); wnoutrefresh(dialog); wrefresh(list); } continue; /* wait for another key press */ } else i = choice - 1; } else if (KEY_IS_DOWN(key)) { if (choice == max_choice - 1) { if (scroll + choice < item_no - 1) { /* Scroll list up */ getyx(dialog, cur_y, cur_x); /* Save cursor position */ if (list_height > 1) { /* De-highlight current last item before scrolling up */ print_item(list, items[(scroll + max_choice - 1) * 3], items[(scroll + max_choice - 1) * 3 + 1], status[scroll + max_choice - 1], max_choice - 1, FALSE, DREF(ditems, scroll + max_choice - 1), list_width, item_x, check_x); scrollok(list, TRUE); scroll(list); scrollok(list, FALSE); } scroll++; print_item(list, items[(scroll + max_choice - 1) * 3], items[(scroll + max_choice - 1) * 3 + 1], status[scroll + max_choice - 1], max_choice - 1, TRUE, DREF(ditems, scroll + max_choice - 1), list_width, item_x, check_x); print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); wmove(list, choice, check_x+1); wnoutrefresh(dialog); wrefresh(list); } continue; /* wait for another key press */ } else i = choice + 1; } else if ((key == ' ' || key == '\n' || key == '\r') && onlist) { /* Toggle item status */ char lbra = 0, rbra = 0, mark = 0; getyx(list, old_y, old_x); /* Save cursor position */ if (ditems) { if (ditems[scroll + choice].fire) { int st; WINDOW *save; save = dupwin(newscr); st = ditems[scroll + choice].fire(&ditems[scroll + choice]); /* Call "fire" action */ if (st & DITEM_RESTORE) { touchwin(save); wrefresh(save); } delwin(save); if (st & DITEM_REDRAW) { wclear(list); for (i = 0; i < item_no; i++) status[i] = ditems[i].checked ? ditems[i].checked(&ditems[i]) : FALSE; for (i = 0; i < max_choice; i++) { print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1], status[scroll + i], i, i == choice, DREF(ditems, scroll + i), list_width, item_x, check_x); } wnoutrefresh(list); print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); wrefresh(dialog); } if (st & DITEM_LEAVE_MENU) { /* Allow a fire action to take us out of the menu */ key = ESC; rval = 0; break; } else if (st & DITEM_RECREATE) { delwin(list); delwin(dialog); dialog_clear(); goto draw; } } status[scroll + choice] = ditems[scroll + choice].checked ? ditems[scroll + choice].checked(&ditems[scroll + choice]) : FALSE; lbra = ditems[scroll + choice].lbra; rbra = ditems[scroll + choice].rbra; mark = ditems[scroll + choice].mark; } else status[scroll + choice] = !status[scroll + choice]; wmove(list, choice, check_x); wattrset(list, check_selected_attr); if (!lbra) lbra = '['; if (!rbra) rbra = ']'; if (!mark) mark = 'X'; wprintw(list, "%c%c%c", lbra, status[scroll + choice] ? mark : ' ', rbra); wmove(list, old_y, old_x); /* Restore cursor to previous position */ wrefresh(list); continue; /* wait for another key press */ } if (i != choice) { /* De-highlight current item */ getyx(dialog, cur_y, cur_x); /* Save cursor position */ print_item(list, items[(scroll + choice) * 3], items[(scroll + choice) * 3 + 1], status[scroll + choice], choice, FALSE, DREF(ditems, scroll + choice), list_width, item_x, check_x); /* Highlight new item */ choice = i; print_item(list, items[(scroll + choice) * 3], items[(scroll + choice) * 3 + 1], status[scroll + choice], choice, TRUE, DREF(ditems, scroll + choice), list_width, item_x, check_x); wmove(list, choice, check_x+1); /* Restore cursor to previous position */ wrefresh(list); } continue; /* wait for another key press */ } switch (key) { case KEY_PPAGE: /* can we go up? */ if (scroll > height - 4) scroll -= (height-4); else scroll = 0; redraw_menu = TRUE; if (!onlist) { onlist = 1; button = 0; } break; case KEY_NPAGE: /* can we go down a full page? */ if (scroll + list_height >= item_no-1 - list_height) { scroll = item_no - list_height; if (scroll < 0) scroll = 0; } else scroll += list_height; redraw_menu = TRUE; if (!onlist) { onlist = 1; button = 0; } break; case KEY_HOME: /* go to the top */ scroll = 0; choice = 0; redraw_menu = TRUE; cursor_reset = TRUE; onlist = 1; break; case KEY_END: /* Go to the bottom */ scroll = item_no - list_height; if (scroll < 0) scroll = 0; choice = max_choice - 1; redraw_menu = TRUE; cursor_reset = TRUE; onlist = 1; break; case TAB: case KEY_BTAB: /* move to next component */ if (onlist) { /* on list, next is ok button */ onlist = 0; if (ditems && result) { print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); ok_space = 1; cancel_space = strlen(ditems[OK_BUTTON].prompt) + 6; } else { print_button(dialog, "Cancel", y, x + 14, button); print_button(dialog, " OK ", y, x, !button); ok_space = 3; cancel_space = 15; } if (button) wmove(dialog, y, x + cancel_space); else wmove(dialog, y, x + ok_space); wrefresh(dialog); break; } else if (button) { /* on cancel button, next is list */ button = 0; onlist = 1; redraw_menu = TRUE; break; } /* on ok button, next is cancel button, same as left/right case */ case KEY_LEFT: case KEY_RIGHT: onlist = 0; button = !button; if (ditems && result) { print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); ok_space = 1; cancel_space = strlen(ditems[OK_BUTTON].prompt) + 6; } else { print_button(dialog, "Cancel", y, x + 14, button); print_button(dialog, " OK ", y, x, !button); ok_space = 3; cancel_space = 15; } if (button) wmove(dialog, y, x + cancel_space); else wmove(dialog, y, x + ok_space); wrefresh(dialog); break; case ' ': case '\n': case '\r': if (!onlist) { if (ditems) { if (result && ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire) { int st; WINDOW *save = dupwin(newscr); st = ditems[button ? CANCEL_BUTTON : OK_BUTTON].fire(&ditems[button ? CANCEL_BUTTON : OK_BUTTON]); if (st & DITEM_RESTORE) { touchwin(save); wrefresh(save); } delwin(save); if (st == DITEM_FAILURE) continue; } } else if (result) { *result = '\0'; for (i = 0; i < item_no; i++) { if (status[i]) { strcat(result, items[i*3]); strcat(result, "\n"); } } } rval = button; key = ESC; /* Bail out! */ break; } /* Let me outta here! */ case ESC: rval = -1; break; /* Help! */ case KEY_F(1): case '?': display_helpfile(); break; } if (redraw_menu) { getyx(list, old_y, old_x); wclear(list); /* * Re-draw a box around the list items. It is required * if amount of list items is smaller than height of listbox. * Otherwise un-redrawn field will be filled with default * screen attributes instead of dialog attributes. */ draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2, menubox_border_attr, menubox_attr); for (i = 0; i < max_choice; i++) print_item(list, items[(scroll + i) * 3], items[(scroll + i) * 3 + 1], status[scroll + i], i, i == choice, DREF(ditems, scroll + i), list_width, item_x, check_x); print_arrows(dialog, scroll, list_height, item_no, box_x, box_y, check_x + 4, cur_x, cur_y); /* redraw buttons to fix highlighting */ if (ditems && result) { print_button(dialog, ditems[CANCEL_BUTTON].prompt, y, x + strlen(ditems[OK_BUTTON].prompt) + 5, ditems[CANCEL_BUTTON].checked ? ditems[CANCEL_BUTTON].checked(&ditems[CANCEL_BUTTON]) : button); print_button(dialog, ditems[OK_BUTTON].prompt, y, x, ditems[OK_BUTTON].checked ? ditems[OK_BUTTON].checked(&ditems[OK_BUTTON]) : !button); } else { print_button(dialog, "Cancel", y, x + 14, button); print_button(dialog, " OK ", y, x, !button); } wnoutrefresh(dialog); if (cursor_reset) { wmove(list, choice, check_x+1); cursor_reset = FALSE; } else { wmove(list, old_y, old_x); } wrefresh(list); redraw_menu = FALSE; } } delwin(list); delwin(dialog); return rval; }
EIF_POINTER c_ecurses_dupwin (EIF_POINTER w) { return (EIF_POINTER) dupwin((WINDOW *)w); };
mvwin(WINDOW *win, int by, int bx) { T((T_CALLED("mvwin(%p,%d,%d)"), win, by, bx)); if (!win || (win->_flags & _ISPAD)) returnCode(ERR); /* * mvwin() should only modify the indices. See test/demo_menus.c and * test/movewindow.c for examples. */ #if 0 /* Copying subwindows is allowed, but it is expensive... */ if (win->_flags & _SUBWIN) { int err = ERR; WINDOW *parent = win->_parent; if (parent) { /* Now comes the complicated and costly part, you should really * try to avoid to move subwindows. Because a subwindow shares * the text buffers with its parent, one can't do a simple * memmove of the text buffers. One has to create a copy, then * to relocate the subwindow and then to do a copy. */ if ((by - parent->_begy == win->_pary) && (bx - parent->_begx == win->_parx)) err = OK; /* we don't actually move */ else { WINDOW *clone = dupwin(win); if (clone) { /* now we have the clone, so relocate win */ werase(win); /* Erase the original place */ /* fill with parents background */ wbkgrnd(win, CHREF(parent->_nc_bkgd)); wsyncup(win); /* Tell the parent(s) */ err = mvderwin(win, by - parent->_begy, bx - parent->_begx); if (err != ERR) { err = copywin(clone, win, 0, 0, 0, 0, win->_maxy, win->_maxx, 0); if (ERR != err) wsyncup(win); } if (ERR == delwin(clone)) err = ERR; } } } returnCode(err); } #endif if (by + win->_maxy > screen_lines - 1 || bx + win->_maxx > screen_columns - 1 || by < 0 || bx < 0) returnCode(ERR); /* * Whether or not the window is moved, touch the window's contents so * that a following call to 'wrefresh()' will paint the window at the * new location. This ensures that if the caller has refreshed another * window at the same location, that this one will be displayed. */ win->_begy = by; win->_begx = bx; returnCode(touchwin(win)); }
static void begin_popup(void) { doupdate(); old_window = dupwin(curscr); }