static void print_at_pos(void) { mvwaddstr(change_win, curr, col, "*"); }
void curses_update_stats() { char buf[BUFSZ]; int count, enc, orient, sx_start; WINDOW *win = curses_get_nhwin(STATUS_WIN); static boolean first = TRUE; boolean horiz; int sx = 0; int sy = 0; boolean border = curses_window_has_border(STATUS_WIN); if (border) { sx++; sy++; } sx_start = sx; if (first) { init_stats(); first = FALSE; } orient = curses_get_window_orientation(STATUS_WIN); if ((orient == ALIGN_RIGHT) || (orient == ALIGN_LEFT)) { horiz = FALSE; } else { horiz = TRUE; } curses_clear_nhwin(STATUS_WIN); /* Line 1 */ /* Player name and title */ strcpy(buf, plname); if ('a' <= buf[0] && buf[0] <= 'z') buf[0] += 'A'-'a'; strcat(buf, " the "); if (u.mtimedone) { char mname[BUFSZ]; int k = 0; strcpy(mname, mons[u.umonnum].mname); while(mname[k] != 0) { if ((k == 0 || (k > 0 && mname[k-1] == ' ')) && 'a' <= mname[k] && mname[k] <= 'z') { mname[k] += 'A' - 'a'; } k++; } strcat(buf, mname); } else { strcat(buf, rank_of(u.ulevel, pl_character[0], flags.female)); } if (strcmp(buf, prevname.txt) != 0) /* Title changed */ { prevname.highlight_turns = 5; prevname.highlight_color = HIGHLIGHT_COLOR; free(prevname.txt); prevname.txt = curses_copy_of(buf); } if (prevname.label != NULL) { mvwaddstr(win, sy, sx, prevname.label); sx += strlen(prevname.label); } if (prevname.highlight_turns > 0) { curses_toggle_color_attr(win, prevname.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevname.txt); curses_toggle_color_attr(win, prevname.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevname.txt); } if (horiz) { sx += strlen(prevname.txt) + 1; } else { sx = sx_start; sy++; } /* Strength */ if (ACURR(A_STR) != prevstr.value) /* Strength changed */ { if (ACURR(A_STR) > prevstr.value) { prevstr.highlight_color = STAT_UP_COLOR; } else { prevstr.highlight_color = STAT_DOWN_COLOR; } prevstr.value = ACURR(A_STR); if (ACURR(A_STR) > 118) { sprintf(buf, "%d", ACURR(A_STR) - 100); } else if (ACURR(A_STR)==118) { sprintf(buf, "18/**"); } else if(ACURR(A_STR) > 18) { sprintf(buf, "18/%02d", ACURR(A_STR) - 18); } else { sprintf(buf, "%d", ACURR(A_STR)); } free(prevstr.txt); prevstr.txt = curses_copy_of(buf); prevstr.highlight_turns = 5; } if (prevstr.label != NULL) { mvwaddstr(win, sy, sx, prevstr.label); sx += strlen(prevstr.label); } if (prevstr.highlight_turns > 0) { curses_toggle_color_attr(win, prevstr.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevstr.txt); curses_toggle_color_attr(win, prevstr.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevstr.txt); } if (horiz) { sx += strlen(prevstr.txt) + 1; } else { sx = sx_start; sy++; } /* Intelligence */ if (ACURR(A_INT) != prevint.value) /* Intelligence changed */ { if (ACURR(A_INT) > prevint.value) { prevint.highlight_color = STAT_UP_COLOR; } else { prevint.highlight_color = STAT_DOWN_COLOR; } prevint.value = ACURR(A_INT); sprintf(buf, "%d", ACURR(A_INT)); free(prevint.txt); prevint.txt = curses_copy_of(buf); prevint.highlight_turns = 5; } if (prevint.label != NULL) { mvwaddstr(win, sy, sx, prevint.label); sx += strlen(prevint.label); } if (prevint.highlight_turns > 0) { curses_toggle_color_attr(win, prevint.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevint.txt); curses_toggle_color_attr(win, prevint.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevint.txt); } if (horiz) { sx += strlen(prevint.txt) + 1; } else { sx = sx_start; sy++; } /* Wisdom */ if (ACURR(A_WIS) != prevwis.value) /* Wisdom changed */ { if (ACURR(A_WIS) > prevwis.value) { prevwis.highlight_color = STAT_UP_COLOR; } else { prevwis.highlight_color = STAT_DOWN_COLOR; } prevwis.value = ACURR(A_WIS); sprintf(buf, "%d", ACURR(A_WIS)); free(prevwis.txt); prevwis.txt = curses_copy_of(buf); prevwis.highlight_turns = 5; } if (prevwis.label != NULL) { mvwaddstr(win, sy, sx, prevwis.label); sx += strlen(prevwis.label); } if (prevwis.highlight_turns > 0) { curses_toggle_color_attr(win, prevwis.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevwis.txt); curses_toggle_color_attr(win, prevwis.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevwis.txt); } if (horiz) { sx += strlen(prevwis.txt) + 1; } else { sx = sx_start; sy++; } /* Dexterity */ if (ACURR(A_DEX) != prevdex.value) /* Dexterity changed */ { if (ACURR(A_DEX) > prevdex.value) { prevdex.highlight_color = STAT_UP_COLOR; } else { prevdex.highlight_color = STAT_DOWN_COLOR; } prevdex.value = ACURR(A_DEX); sprintf(buf, "%d", ACURR(A_DEX)); free(prevdex.txt); prevdex.txt = curses_copy_of(buf); prevdex.highlight_turns = 5; } if (prevdex.label != NULL) { mvwaddstr(win, sy, sx, prevdex.label); sx += strlen(prevdex.label); } if (prevdex.highlight_turns > 0) { curses_toggle_color_attr(win, prevdex.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevdex.txt); curses_toggle_color_attr(win, prevdex.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevdex.txt); } if (horiz) { sx += strlen(prevdex.txt) + 1; } else { sx = sx_start; sy++; } /* Constitution */ if (ACURR(A_CON) != prevcon.value) /* Constitution changed */ { if (ACURR(A_CON) > prevcon.value) { prevcon.highlight_color = STAT_UP_COLOR; } else { prevcon.highlight_color = STAT_DOWN_COLOR; } prevcon.value = ACURR(A_CON); sprintf(buf, "%d", ACURR(A_CON)); free(prevcon.txt); prevcon.txt = curses_copy_of(buf); prevcon.highlight_turns = 5; } if (prevcon.label != NULL) { mvwaddstr(win, sy, sx, prevcon.label); sx += strlen(prevcon.label); } if (prevcon.highlight_turns > 0) { curses_toggle_color_attr(win, prevcon.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevcon.txt); curses_toggle_color_attr(win, prevcon.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevcon.txt); } if (horiz) { sx += strlen(prevcon.txt) + 1; } else { sx = sx_start; sy++; } /* Charisma */ if (ACURR(A_CHA) != prevcha.value) /* Charisma changed */ { if (ACURR(A_CHA) > prevcha.value) { prevcha.highlight_color = STAT_UP_COLOR; } else { prevcha.highlight_color = STAT_DOWN_COLOR; } prevcha.value = ACURR(A_CHA); sprintf(buf, "%d", ACURR(A_CHA)); free(prevcha.txt); prevcha.txt = curses_copy_of(buf); prevcha.highlight_turns = 5; } if (prevcha.label != NULL) { mvwaddstr(win, sy, sx, prevcha.label); sx += strlen(prevcha.label); } if (prevcha.highlight_turns > 0) { curses_toggle_color_attr(win, prevcha.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevcha.txt); curses_toggle_color_attr(win, prevcha.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevcha.txt); } if (horiz) { sx += strlen(prevcha.txt) + 1; } else { sx = sx_start; sy++; } /* Alignment */ if (prevalign.alignment != u.ualign.type) /* Alignment changed */ { prevalign.highlight_color = HIGHLIGHT_COLOR; prevalign.highlight_turns = 10; /* This is a major change! */ prevalign.alignment = u.ualign.type; free(prevalign.txt); switch (u.ualign.type) { case A_LAWFUL: { prevalign.txt = curses_copy_of("Lawful"); break; } case A_NEUTRAL: { prevalign.txt = curses_copy_of("Neutral"); break; } case A_CHAOTIC: { prevalign.txt = curses_copy_of("Chaotic"); break; } } } if (prevalign.label != NULL) { mvwaddstr(win, sy, sx, prevalign.label); sx += strlen(prevalign.label); } if (prevalign.highlight_turns > 0) { curses_toggle_color_attr(win, prevalign.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevalign.txt); curses_toggle_color_attr(win, prevalign.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevalign.txt); } /* Line 2 */ sx = sx_start; sy++; /* Dungeon Level */ if (depth(&u.uz) != prevdepth.value) /* Dungeon level changed */ { prevdepth.highlight_color = HIGHLIGHT_COLOR; prevdepth.highlight_turns = 5; prevdepth.value = depth(&u.uz); free(prevdepth.txt); if (In_endgame(&u.uz)) { strcpy(buf, (Is_astralevel(&u.uz) ? "Astral Plane":"End Game")); } else { sprintf(buf, "%d", depth(&u.uz)); } prevdepth.txt = curses_copy_of(buf); } if (prevdepth.label != NULL) { mvwaddstr(win, sy, sx, prevdepth.label); sx += strlen(prevdepth.label); } if (prevdepth.highlight_turns > 0) { curses_toggle_color_attr(win, prevdepth.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevdepth.txt); curses_toggle_color_attr(win, prevdepth.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevdepth.txt); } if (horiz) { sx += strlen(prevdepth.txt) + 1; } else { sx = sx_start; sy++; } /* Gold */ #ifndef GOLDOBJ if (prevau.value != u.ugold) /* Gold changed */ { if (u.ugold > prevau.value) { #else if (prevau.value != money_cnt(invent)) /* Gold changed */ { if (money_cnt(invent) > prevau.value) { #endif prevau.highlight_color = HI_GOLD; } else { prevau.highlight_color = STAT_DOWN_COLOR; } #ifndef GOLDOBJ prevau.value = u.ugold; sprintf(buf,"%ld", u.ugold); #else prevau.value = money_cnt(invent); sprintf(buf,"%ld", money_cnt(invent)); #endif free(prevau.txt); prevau.txt = curses_copy_of(buf); prevau.highlight_turns = 5; } if (prevau.label != NULL) { mvwaddstr(win, sy, sx, prevau.label); sx += strlen(prevau.label); } if (prevau.highlight_turns > 0) { curses_toggle_color_attr(win, prevau.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevau.txt); curses_toggle_color_attr(win, prevau.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevau.txt); } if (horiz) { sx += strlen(prevau.txt) + 1; } else { sx = sx_start; sy++; } /* Hit Points */ if (u.mtimedone) /* Currently polymorphed - show monster HP */ { if (u.mh != prevhp.value) { if (u.mh > prevhp.value) { prevhp.highlight_color = STAT_UP_COLOR; } else { prevhp.highlight_color = STAT_DOWN_COLOR; } prevhp.highlight_turns = 3; prevhp.value = u.mh; sprintf(buf, "%d", u.mh); free(prevhp.txt); prevhp.txt = curses_copy_of(buf); } } else if (u.uhp != prevhp.value) /* Not polymorphed */ { if (u.uhp > prevhp.value) { prevhp.highlight_color = STAT_UP_COLOR; } else { prevhp.highlight_color = STAT_DOWN_COLOR; } prevhp.value = u.uhp; sprintf(buf, "%d", u.uhp); free(prevhp.txt); prevhp.txt = curses_copy_of(buf); prevhp.highlight_turns = 3; } if (prevhp.label != NULL) { mvwaddstr(win, sy, sx, prevhp.label); sx += strlen(prevhp.label); } if (prevhp.highlight_turns > 0) { curses_toggle_color_attr(win, prevhp.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevhp.txt); curses_toggle_color_attr(win, prevhp.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevhp.txt); } sx += strlen(prevhp.txt); /* Max Hit Points */ if (u.mtimedone) /* Currently polymorphed - show monster HP */ { if (u.mhmax != prevmhp.value) { if (u.mhmax > prevmhp.value) { prevmhp.highlight_color = STAT_UP_COLOR; } else { prevmhp.highlight_color = STAT_DOWN_COLOR; } prevmhp.value = u.mhmax; sprintf(buf, "%d", u.mhmax); free(prevmhp.txt); prevmhp.txt = curses_copy_of(buf); prevmhp.highlight_turns = 3; } } else if (u.uhpmax != prevmhp.value) /* Not polymorphed */ { if (u.uhpmax > prevmhp.value) { prevmhp.highlight_color = STAT_UP_COLOR; } else { prevmhp.highlight_color = STAT_DOWN_COLOR; } prevmhp.value = u.uhpmax; sprintf(buf, "%d", u.uhpmax); free(prevmhp.txt); prevmhp.txt = curses_copy_of(buf); prevmhp.highlight_turns = 3; } if (prevmhp.label != NULL) { mvwaddstr(win, sy, sx, prevmhp.label); sx += strlen(prevmhp.label); } if (prevmhp.highlight_turns > 0) { curses_toggle_color_attr(win, prevmhp.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevmhp.txt); curses_toggle_color_attr(win, prevmhp.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevmhp.txt); } if (horiz) { sx += strlen(prevmhp.txt) + 1; } else { sx = sx_start; sy++; } /* Power */ if (u.uen != prevpow.value) { if (u.uen > prevpow.value) { prevpow.highlight_color = STAT_UP_COLOR; } else { prevpow.highlight_color = STAT_DOWN_COLOR; } prevpow.value = u.uen; sprintf(buf, "%d", u.uen); free(prevpow.txt); prevpow.txt = curses_copy_of(buf); prevpow.highlight_turns = 3; } if (prevpow.label != NULL) { mvwaddstr(win, sy, sx, prevpow.label); sx += strlen(prevpow.label); } if (prevpow.highlight_turns > 0) { curses_toggle_color_attr(win, prevpow.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevpow.txt); curses_toggle_color_attr(win, prevpow.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevpow.txt); } sx += strlen(prevpow.txt); /* Max Power */ if (u.uenmax != prevmpow.value) { if (u.uenmax > prevmpow.value) { prevmpow.highlight_color = STAT_UP_COLOR; } else { prevmpow.highlight_color = STAT_DOWN_COLOR; } prevmpow.value = u.uenmax; sprintf(buf, "%d", u.uenmax); free(prevmpow.txt); prevmpow.txt = curses_copy_of(buf); prevmpow.highlight_turns = 3; } if (prevmpow.label != NULL) { mvwaddstr(win, sy, sx, prevmpow.label); sx += strlen(prevmpow.label); } if (prevmpow.highlight_turns > 0) { curses_toggle_color_attr(win, prevmpow.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevmpow.txt); curses_toggle_color_attr(win, prevmpow.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevmpow.txt); } if (horiz) { sx += strlen(prevmpow.txt) + 1; } else { sx = sx_start; sy++; } /* Armor Class */ if (u.uac != prevac.value) { if (u.uac > prevac.value) /* Lower is better for AC */ { prevac.highlight_color = STAT_DOWN_COLOR; } else { prevac.highlight_color = STAT_UP_COLOR; } prevac.value = u.uac; sprintf(buf, "%d", u.uac); free(prevac.txt); prevac.txt = curses_copy_of(buf); prevac.highlight_turns = 5; } if (prevac.label != NULL) { mvwaddstr(win, sy, sx, prevac.label); sx += strlen(prevac.label); } if (prevac.highlight_turns > 0) { curses_toggle_color_attr(win, prevac.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevac.txt); curses_toggle_color_attr(win, prevac.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevac.txt); } if (horiz) { sx += strlen(prevac.txt) + 1; } else { sx = sx_start; sy++; } /* Experience */ #ifdef EXP_ON_BOTL if (prevexp.display != flags.showexp) /* Setting has changed */ { prevexp.display = flags.showexp; free(prevlevel.label); if (prevexp.display) { prevlevel.label = curses_copy_of("/"); } else { prevlevel.label = curses_copy_of("Lvl:"); } } if (prevexp.display && !u.mtimedone) { if (u.uexp != prevexp.value) { if (u.uexp > prevexp.value) { prevexp.highlight_color = STAT_UP_COLOR; } else { prevexp.highlight_color = STAT_DOWN_COLOR; } sprintf(buf, "%d", u.uexp); free(prevexp.txt); prevexp.txt = curses_copy_of(buf); prevexp.highlight_turns = 3; } if (prevexp.label != NULL) { mvwaddstr(win, sy, sx, prevexp.label); sx += strlen(prevexp.label); } if (prevexp.highlight_turns > 0) { curses_toggle_color_attr(win, prevexp.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevexp.txt); curses_toggle_color_attr(win, prevexp.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevexp.txt); } sx += strlen(prevexp.txt); } prevexp.value = u.uexp; /* Track it even when it's not displayed */ #endif /* EXP_ON_BOTL */ /* Level */ if (u.mtimedone) /* Currently polymorphed - show monster HD */ { if (strncmp(prevlevel.label, "HD:", 3) != 0) { free(prevlevel.label); prevlevel.label = curses_copy_of("HD:"); } if (mons[u.umonnum].mlevel != prevlevel.value) { if (mons[u.umonnum].mlevel > prevlevel.value) { prevlevel.highlight_color = STAT_UP_COLOR; } else { prevlevel.highlight_color = STAT_DOWN_COLOR; } prevlevel.highlight_turns = 5; } prevlevel.value = mons[u.umonnum].mlevel; sprintf(buf, "%d", mons[u.umonnum].mlevel); free(prevlevel.txt); prevlevel.txt = curses_copy_of(buf); } else /* Not polymorphed */ { if (strncmp(prevlevel.label, "HD:", 3) == 0) { free(prevlevel.label); if (prevexp.display) { prevlevel.label = curses_copy_of("/"); } else { prevlevel.label = curses_copy_of("Lvl:"); } } if (u.ulevel > prevlevel.value) { prevlevel.highlight_color = STAT_UP_COLOR; prevlevel.highlight_turns = 5; } else if (u.ulevel < prevlevel.value) { prevlevel.highlight_color = STAT_DOWN_COLOR; prevlevel.highlight_turns = 5; } prevlevel.value = u.ulevel; sprintf(buf, "%d", u.ulevel); free(prevlevel.txt); prevlevel.txt = curses_copy_of(buf); } if (prevlevel.label != NULL) { mvwaddstr(win, sy, sx, prevlevel.label); sx += strlen(prevlevel.label); } if (prevlevel.highlight_turns > 0) { curses_toggle_color_attr(win, prevlevel.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevlevel.txt); curses_toggle_color_attr(win, prevlevel.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevlevel.txt); } if (horiz) { sx += strlen(prevlevel.txt) + 1; } else { sx = sx_start; sy++; } /* Time */ if (prevtime.display != flags.time) /* Setting has changed */ { prevtime.display = flags.time; } if (prevtime.display) { if (moves != prevtime.value) { sprintf(buf, "%ld", moves); free(prevtime.txt); prevtime.txt = curses_copy_of(buf); } if (prevtime.label != NULL) { mvwaddstr(win, sy, sx, prevtime.label); sx += strlen(prevtime.label); } mvwaddstr(win, sy, sx, prevtime.txt); if (horiz) { sx += strlen(prevtime.txt) + 1; } else { sx = sx_start; sy++; } } /* Score */ #ifdef SCORE_ON_BOTL if (prevscore.display != flags.showscore) /* Setting has changed */ { prevscore.display = flags.showscore; } if (prevscore.display) { if (botl_score() != prevscore.value) { if (botl_score() > prevscore.value) { prevscore.highlight_color = STAT_UP_COLOR; } else /* Not sure this is possible */ { prevscore.highlight_color = STAT_DOWN_COLOR; } sprintf(buf, "%ld", botl_score()); free(prevscore.txt); prevscore.txt = curses_copy_of(buf); prevscore.highlight_turns = 3; } if (prevscore.label != NULL) { mvwaddstr(win, sy, sx, prevscore.label); sx += strlen(prevscore.label); } if (prevscore.highlight_turns > 0) { curses_toggle_color_attr(win, prevscore.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevscore.txt); curses_toggle_color_attr(win, prevscore.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevscore.txt); } if (horiz) { sx += strlen(prevscore.txt) + 1; } else { sx = sx_start; sy++; } } prevscore.value = botl_score(); /* Track it even when it's not displayed */ #endif /* SCORE_ON_BOTL */ /* Hunger */ if (u.uhs != prevhunger.value) { if ((u.uhs > prevhunger.value) || (u.uhs > 3)) { prevhunger.highlight_color = STAT_DOWN_COLOR; } else { prevhunger.highlight_color = STAT_UP_COLOR; } prevhunger.value = u.uhs; for (count = 0; count < strlen(hu_stat[u.uhs]); count++) { if ((hu_stat[u.uhs][count]) == ' ') { break; } buf[count] = hu_stat[u.uhs][count]; } buf[count] = '\0'; free(prevhunger.txt); prevhunger.txt = curses_copy_of(buf); prevhunger.highlight_turns = 5; } if (prevhunger.label != NULL) { mvwaddstr(win, sy, sx, prevhunger.label); sx += strlen(prevhunger.label); } if (prevhunger.highlight_turns > 0) { curses_toggle_color_attr(win, prevhunger.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevhunger.txt); curses_toggle_color_attr(win, prevhunger.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevhunger.txt); } if (strlen(prevhunger.txt) > 0) { if (horiz) { sx += strlen(prevhunger.txt) + 1; } else { sx = sx_start; sy++; } } /* Confusion */ if (Confusion != prevconf.value) { prevconf.highlight_color = STAT_DOWN_COLOR; if (prevconf.txt != NULL) { free(prevconf.txt); } if (Confusion) { prevconf.txt = curses_copy_of("Conf"); } else { prevconf.txt = NULL; } if (prevconf.value == 0) { prevconf.highlight_turns = 5; } prevconf.value = Confusion; } if (prevconf.label != NULL) { mvwaddstr(win, sy, sx, prevconf.label); sx += strlen(prevconf.label); } if (prevconf.txt != NULL) { if (prevconf.highlight_turns > 0) { curses_toggle_color_attr(win, prevconf.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevconf.txt); curses_toggle_color_attr(win, prevconf.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevconf.txt); } } if (prevconf.txt != NULL) { if (horiz) { sx += strlen(prevconf.txt) + 1; } else { sx = sx_start; sy++; } } /* Blindness */ if (Blind != prevblind.value) { prevblind.highlight_color = STAT_DOWN_COLOR; if (prevblind.txt != NULL) { free(prevblind.txt); } if (Blind) { prevblind.txt = curses_copy_of("Blind"); } else { prevblind.txt = NULL; } if (prevblind.value == 0) { prevblind.highlight_turns = 5; } prevblind.value = Blind; } if (prevblind.label != NULL) { mvwaddstr(win, sy, sx, prevblind.label); sx += strlen(prevblind.label); } if (prevblind.txt != NULL) { if (prevblind.highlight_turns > 0) { curses_toggle_color_attr(win, prevblind.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevblind.txt); curses_toggle_color_attr(win, prevblind.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevblind.txt); } } if (prevblind.txt != NULL) { if (horiz) { sx += strlen(prevblind.txt) + 1; } else { sx = sx_start; sy++; } } /* Stun */ if (Stunned != prevstun.value) { prevstun.highlight_color = STAT_DOWN_COLOR; if (prevstun.txt != NULL) { free(prevstun.txt); } if (Stunned) { prevstun.txt = curses_copy_of("Stun"); } else { prevstun.txt = NULL; } if (prevstun.value == 0) { prevstun.highlight_turns = 5; } prevstun.value = Stunned; } if (prevstun.label != NULL) { mvwaddstr(win, sy, sx, prevstun.label); sx += strlen(prevstun.label); } if (prevstun.txt != NULL) { if (prevstun.highlight_turns > 0) { curses_toggle_color_attr(win, prevstun.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevstun.txt); curses_toggle_color_attr(win, prevstun.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevstun.txt); } } if (prevstun.txt != NULL) { if (horiz) { sx += strlen(prevstun.txt) + 1; } else { sx = sx_start; sy++; } } /* Hallucination */ if (Hallucination != prevhallu.value) { prevhallu.highlight_color = STAT_DOWN_COLOR; if (prevhallu.txt != NULL) { free(prevhallu.txt); } if (Hallucination) { prevhallu.txt = curses_copy_of("Hallu"); } else { prevhallu.txt = NULL; } if (prevhallu.value == 0) { prevhallu.highlight_turns = 5; } prevhallu.value = Hallucination; } if (prevhallu.label != NULL) { mvwaddstr(win, sy, sx, prevhallu.label); sx += strlen(prevhallu.label); } if (prevhallu.txt != NULL) { if (prevhallu.highlight_turns > 0) { curses_toggle_color_attr(win, prevhallu.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevhallu.txt); curses_toggle_color_attr(win, prevhallu.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevhallu.txt); } } if (prevhallu.txt != NULL) { if (horiz) { sx += strlen(prevhallu.txt) + 1; } else { sx = sx_start; sy++; } } /* Sick */ if (Sick != prevsick.value) { prevsick.highlight_color = STAT_DOWN_COLOR; if (prevsick.txt != NULL) { free(prevsick.txt); } if (Sick) { if (u.usick_type & SICK_VOMITABLE) { prevsick.txt = curses_copy_of("FoodPois"); } else { prevsick.txt = curses_copy_of("Ill"); } } else { prevsick.txt = NULL; } if (prevsick.value == 0) { prevsick.highlight_turns = 5; } prevsick.value = Sick; } if (prevsick.label != NULL) { mvwaddstr(win, sy, sx, prevsick.label); sx += strlen(prevsick.label); } if (prevsick.txt != NULL) { if (prevsick.highlight_turns > 0) { curses_toggle_color_attr(win, prevsick.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevsick.txt); curses_toggle_color_attr(win, prevsick.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevsick.txt); } } if (prevsick.txt != NULL) { if (horiz) { sx += strlen(prevsick.txt) + 1; } else { sx = sx_start; sy++; } } /* Slime */ if (Slimed != prevslime.value) { prevslime.highlight_color = STAT_DOWN_COLOR; if (prevslime.txt != NULL) { free(prevslime.txt); } if (Slimed) { prevslime.txt = curses_copy_of("Slime"); } else { prevslime.txt = NULL; } if (prevslime.value == 0) { prevslime.highlight_turns = 5; } prevslime.value = Slimed; } if (prevslime.label != NULL) { mvwaddstr(win, sy, sx, prevslime.label); sx += strlen(prevslime.label); } if (prevslime.txt != NULL) { if (prevslime.highlight_turns > 0) { curses_toggle_color_attr(win, prevslime.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevslime.txt); curses_toggle_color_attr(win, prevslime.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevslime.txt); } } if (prevslime.txt != NULL) { if (horiz) { sx += strlen(prevslime.txt) + 1; } else { sx = sx_start; sy++; } } /* Encumberance */ enc = near_capacity(); if (enc != prevencumb.value) { if (enc < prevencumb.value) { prevencumb.highlight_color = STAT_UP_COLOR; } else { prevencumb.highlight_color = STAT_DOWN_COLOR; } if (prevencumb.txt != NULL) { free(prevencumb.txt); } if (enc > UNENCUMBERED) { sprintf(buf, "%s", enc_stat[enc]); prevencumb.txt = curses_copy_of(buf); prevencumb.highlight_turns = 5; } else { prevencumb.txt = NULL; } prevencumb.value = enc; } if (prevencumb.label != NULL) { mvwaddstr(win, sy, sx, prevencumb.label); sx += strlen(prevencumb.label); } if (prevencumb.txt != NULL) { if (prevencumb.highlight_turns > 0) { curses_toggle_color_attr(win, prevencumb.highlight_color, NONE, ON); mvwaddstr(win, sy, sx, prevencumb.txt); curses_toggle_color_attr(win, prevencumb.highlight_color, NONE, OFF); } else { mvwaddstr(win, sy, sx, prevencumb.txt); } } if (prevencumb.txt != NULL) { if (horiz) { sx += strlen(prevencumb.txt) + 1; } else { sx = sx_start; sy++; } } wrefresh(win); } /* Decrement the highlight_turns for all stats. Call curses_update_stats if needed to unhighlight a stat */ void curses_decrement_highlight() { boolean unhighlight = FALSE; if (prevname.highlight_turns > 0) { prevname.highlight_turns--; if (prevname.highlight_turns == 0) { unhighlight = TRUE; } } if (prevdepth.highlight_turns > 0) { prevdepth.highlight_turns--; if (prevdepth.highlight_turns == 0) { unhighlight = TRUE; } } if (prevstr.highlight_turns > 0) { prevstr.highlight_turns--; if (prevstr.highlight_turns == 0) { unhighlight = TRUE; } } if (prevint.highlight_turns > 0) { prevint.highlight_turns--; if (prevint.highlight_turns == 0) { unhighlight = TRUE; } } if (prevwis.highlight_turns > 0) { prevwis.highlight_turns--; if (prevwis.highlight_turns == 0) { unhighlight = TRUE; } } if (prevdex.highlight_turns > 0) { prevdex.highlight_turns--; if (prevdex.highlight_turns == 0) { unhighlight = TRUE; } } if (prevcon.highlight_turns > 0) { prevcon.highlight_turns--; if (prevcon.highlight_turns == 0) { unhighlight = TRUE; } } if (prevcha.highlight_turns > 0) { prevcha.highlight_turns--; if (prevcha.highlight_turns == 0) { unhighlight = TRUE; } } if (prevalign.highlight_turns > 0) { prevalign.highlight_turns--; if (prevalign.highlight_turns == 0) { unhighlight = TRUE; } } if (prevau.highlight_turns > 0) { prevau.highlight_turns--; if (prevau.highlight_turns == 0) { unhighlight = TRUE; } } if (prevhp.highlight_turns > 0) { prevhp.highlight_turns--; if (prevhp.highlight_turns == 0) { unhighlight = TRUE; } } if (prevmhp.highlight_turns > 0) { prevmhp.highlight_turns--; if (prevmhp.highlight_turns == 0) { unhighlight = TRUE; } } if (prevlevel.highlight_turns > 0) { prevlevel.highlight_turns--; if (prevlevel.highlight_turns == 0) { unhighlight = TRUE; } } if (prevpow.highlight_turns > 0) { prevpow.highlight_turns--; if (prevpow.highlight_turns == 0) { unhighlight = TRUE; } } if (prevmpow.highlight_turns > 0) { prevmpow.highlight_turns--; if (prevmpow.highlight_turns == 0) { unhighlight = TRUE; } } if (prevac.highlight_turns > 0) { prevac.highlight_turns--; if (prevac.highlight_turns == 0) { unhighlight = TRUE; } } #ifdef EXP_ON_BOTL if (prevexp.highlight_turns > 0) { prevexp.highlight_turns--; if (prevexp.highlight_turns == 0) { unhighlight = TRUE; } } #endif if (prevtime.highlight_turns > 0) { prevtime.highlight_turns--; if (prevtime.highlight_turns == 0) { unhighlight = TRUE; } } #ifdef SCORE_ON_BOTL if (prevscore.highlight_turns > 0) { prevscore.highlight_turns--; if (prevscore.highlight_turns == 0) { unhighlight = TRUE; } } #endif if (prevhunger.highlight_turns > 0) { prevhunger.highlight_turns--; if (prevhunger.highlight_turns == 0) { unhighlight = TRUE; } } if (prevconf.highlight_turns > 0) { prevconf.highlight_turns--; if (prevconf.highlight_turns == 0) { unhighlight = TRUE; } } if (prevblind.highlight_turns > 0) { prevblind.highlight_turns--; if (prevblind.highlight_turns == 0) { unhighlight = TRUE; } } if (prevstun.highlight_turns > 0) { prevstun.highlight_turns--; if (prevstun.highlight_turns == 0) { unhighlight = TRUE; } } if (prevhallu.highlight_turns > 0) { prevhallu.highlight_turns--; if (prevhallu.highlight_turns == 0) { unhighlight = TRUE; } } if (prevsick.highlight_turns > 0) { prevsick.highlight_turns--; if (prevsick.highlight_turns == 0) { unhighlight = TRUE; } } if (prevslime.highlight_turns > 0) { prevslime.highlight_turns--; if (prevslime.highlight_turns == 0) { unhighlight = TRUE; } } if (prevencumb.highlight_turns > 0) { prevencumb.highlight_turns--; if (prevencumb.highlight_turns == 0) { unhighlight = TRUE; } } if (unhighlight) { curses_update_stats(); } } /* Initialize the stats with beginning values. */ static void init_stats() { char buf[BUFSZ]; int count; /* Player name and title */ strcpy(buf, plname); if ('a' <= buf[0] && buf[0] <= 'z') buf[0] += 'A'-'a'; strcat(buf, " the "); if (u.mtimedone) { char mname[BUFSZ]; int k = 0; strcpy(mname, mons[u.umonnum].mname); while(mname[k] != 0) { if ((k == 0 || (k > 0 && mname[k-1] == ' ')) && 'a' <= mname[k] && mname[k] <= 'z') { mname[k] += 'A' - 'a'; } k++; } strcat(buf, mname); } else { strcat(buf, rank_of(u.ulevel, pl_character[0], flags.female)); } prevname.txt = curses_copy_of(buf); prevname.display = TRUE; prevname.highlight_turns = 0; prevname.label = NULL; /* Strength */ if (ACURR(A_STR) > 118) { sprintf(buf, "%d", ACURR(A_STR) - 100); } else if (ACURR(A_STR)==118) { sprintf(buf, "18/**"); } else if(ACURR(A_STR) > 18) { sprintf(buf, "18/%02d", ACURR(A_STR) - 18); } else { sprintf(buf, "%d", ACURR(A_STR)); } prevstr.value = ACURR(A_STR); prevstr.txt = curses_copy_of(buf); prevstr.display = TRUE; prevstr.highlight_turns = 0; prevstr.label = curses_copy_of("Str:"); /* Intelligence */ sprintf(buf, "%d", ACURR(A_INT)); prevint.value = ACURR(A_INT); prevint.txt = curses_copy_of(buf); prevint.display = TRUE; prevint.highlight_turns = 0; prevint.label = curses_copy_of("Int:"); /* Wisdom */ sprintf(buf, "%d", ACURR(A_WIS)); prevwis.value = ACURR(A_WIS); prevwis.txt = curses_copy_of(buf); prevwis.display = TRUE; prevwis.highlight_turns = 0; prevwis.label = curses_copy_of("Wis:"); /* Dexterity */ sprintf(buf, "%d", ACURR(A_DEX)); prevdex.value = ACURR(A_DEX); prevdex.txt = curses_copy_of(buf); prevdex.display = TRUE; prevdex.highlight_turns = 0; prevdex.label = curses_copy_of("Dex:"); /* Constitution */ sprintf(buf, "%d", ACURR(A_CON)); prevcon.value = ACURR(A_CON); prevcon.txt = curses_copy_of(buf); prevcon.display = TRUE; prevcon.highlight_turns = 0; prevcon.label = curses_copy_of("Con:"); /* Charisma */ sprintf(buf, "%d", ACURR(A_CHA)); prevcha.value = ACURR(A_CHA); prevcha.txt = curses_copy_of(buf); prevcha.display = TRUE; prevcha.highlight_turns = 0; prevcha.label = curses_copy_of("Cha:"); /* Alignment */ switch (u.ualign.type) { case A_LAWFUL: { prevalign.txt = curses_copy_of("Lawful"); break; } case A_NEUTRAL: { prevalign.txt = curses_copy_of("Neutral"); break; } case A_CHAOTIC: { prevalign.txt = curses_copy_of("Chaotic"); break; } } prevalign.alignment = u.ualign.type; prevalign.display = TRUE; prevalign.highlight_turns = 0; prevalign.label = NULL; /* Dungeon level */ if (In_endgame(&u.uz)) { strcpy(buf, (Is_astralevel(&u.uz) ? "Astral Plane":"End Game")); } else { sprintf(buf, "%d", depth(&u.uz)); } prevdepth.value = depth(&u.uz); prevdepth.txt = curses_copy_of(buf); prevdepth.display = TRUE; prevdepth.highlight_turns = 0; prevdepth.label = curses_copy_of("Dlvl:"); /* Gold */ #ifndef GOLDOBJ sprintf(buf,"%ld", u.ugold); prevau.value = u.ugold; #else sprintf(buf,"%ld", money_cnt(invent)); prevau.value = money_cnt(invent); #endif prevau.txt = curses_copy_of(buf); prevau.display = TRUE; prevau.highlight_turns = 0; sprintf(buf, "%c:", GOLD_SYM); prevau.label = curses_copy_of(buf); /* Hit Points */ if (u.mtimedone) /* Currently polymorphed - show monster HP */ { prevhp.value = u.mh; sprintf(buf, "%d", u.mh); prevhp.txt = curses_copy_of(buf); } else if (u.uhp != prevhp.value) /* Not polymorphed */ { prevhp.value = u.uhp; sprintf(buf, "%d", u.uhp); prevhp.txt = curses_copy_of(buf); } prevhp.display = TRUE; prevhp.highlight_turns = 0; prevhp.label = curses_copy_of("HP:"); /* Max Hit Points */ if (u.mtimedone) /* Currently polymorphed - show monster HP */ { prevmhp.value = u.mhmax; sprintf(buf, "%d", u.mhmax); prevmhp.txt = curses_copy_of(buf); } else /* Not polymorphed */ { prevmhp.value = u.uhpmax; sprintf(buf, "%d", u.uhpmax); prevmhp.txt = curses_copy_of(buf); } prevmhp.display = TRUE; prevmhp.highlight_turns = 0; prevmhp.label = curses_copy_of("/"); /* Power */ prevpow.value = u.uen; sprintf(buf, "%d", u.uen); prevpow.txt = curses_copy_of(buf); prevpow.display = TRUE; prevpow.highlight_turns = 0; prevpow.label = curses_copy_of("Pw:"); /* Max Power */ prevmpow.value = u.uenmax; sprintf(buf, "%d", u.uenmax); prevmpow.txt = curses_copy_of(buf); prevmpow.display = TRUE; prevmpow.highlight_turns = 0; prevmpow.label = curses_copy_of("/"); /* Armor Class */ prevac.value = u.uac; sprintf(buf, "%d", u.uac); prevac.txt = curses_copy_of(buf); prevac.display = TRUE; prevac.highlight_turns = 0; prevac.label = curses_copy_of("AC:"); /* Experience */ #ifdef EXP_ON_BOTL prevexp.value = u.uexp; sprintf(buf, "%ld", u.uexp); prevexp.txt = curses_copy_of(buf); prevexp.display = flags.showexp; prevexp.highlight_turns = 0; prevexp.label = curses_copy_of("Xp:"); #endif /* Level */ if (u.mtimedone) /* Currently polymorphed - show monster HP */ { prevlevel.value = mons[u.umonnum].mlevel; sprintf(buf, "%d", mons[u.umonnum].mlevel); prevlevel.txt = curses_copy_of(buf); prevlevel.label = curses_copy_of("HD:"); } else if (u.ulevel != prevlevel.value) /* Not polymorphed */ { prevlevel.value = u.ulevel; sprintf(buf, "%d", u.ulevel); prevlevel.txt = curses_copy_of(buf); if (prevexp.display) { prevlevel.label = curses_copy_of("/"); } else { prevlevel.label = curses_copy_of("Lvl:"); } } prevlevel.display = TRUE; prevlevel.highlight_turns = 0; /* Time */ prevtime.value = moves; sprintf(buf, "%ld", moves); prevtime.txt = curses_copy_of(buf); prevtime.display = flags.time; prevtime.highlight_turns = 0; prevtime.label = curses_copy_of("T:"); /* Score */ #ifdef SCORE_ON_BOTL prevscore.value = botl_score(); sprintf(buf, "%ld", botl_score()); prevscore.txt = curses_copy_of(buf); prevscore.display = flags.showscore; prevscore.highlight_turns = 0; prevscore.label = curses_copy_of("S:"); #endif /* Hunger */ prevhunger.value = u.uhs; for (count = 0; count < strlen(hu_stat[u.uhs]); count++) { if ((hu_stat[u.uhs][count]) == ' ') { break; } buf[count] = hu_stat[u.uhs][count]; } buf[count] = '\0'; prevhunger.txt = curses_copy_of(buf); prevhunger.display = TRUE; prevhunger.highlight_turns = 0; prevhunger.label = NULL; /* Confusion */ prevconf.value = Confusion; if (Confusion) { prevconf.txt = curses_copy_of("Conf"); } else { prevconf.txt = NULL; } prevconf.display = TRUE; prevconf.highlight_turns = 0; prevconf.label = NULL; /* Blindness */ prevblind.value = Blind; if (Blind) { prevblind.txt = curses_copy_of("Blind"); } else { prevblind.txt = NULL; } prevblind.display = TRUE; prevblind.highlight_turns = 0; prevblind.label = NULL; /* Stun */ prevstun.value = Stunned; if (Stunned) { prevstun.txt = curses_copy_of("Stun"); } else { prevstun.txt = NULL; } prevstun.display = TRUE; prevstun.highlight_turns = 0; prevstun.label = NULL; /* Hallucination */ prevhallu.value = Hallucination; if (Hallucination) { prevhallu.txt = curses_copy_of("Hallu"); } else { prevhallu.txt = NULL; } prevhallu.display = TRUE; prevhallu.highlight_turns = 0; prevhallu.label = NULL; /* Sick */ prevsick.value = Sick; if (Sick) { if (u.usick_type & SICK_VOMITABLE) { prevsick.txt = curses_copy_of("Sick"); } else { prevsick.txt = curses_copy_of("Ill"); } } else { prevsick.txt = NULL; } prevsick.display = TRUE; prevsick.highlight_turns = 0; prevsick.label = NULL; /* Slimed */ prevslime.value = Slimed; if (Slimed) { prevslime.txt = curses_copy_of("Slime"); } else { prevslime.txt = NULL; } prevslime.display = TRUE; prevslime.highlight_turns = 0; prevslime.label = NULL; /* Encumberance */ prevencumb.value = near_capacity(); if (prevencumb.value > UNENCUMBERED) { sprintf(buf, "%s", enc_stat[prevencumb.value]); prevencumb.txt = curses_copy_of(buf); } else { prevencumb.txt = NULL; } prevencumb.display = TRUE; prevencumb.highlight_turns = 0; prevencumb.label = NULL; }
int main(int argc, char *argv[]) { char dir[PATH_MAX]; char config_dir[PATH_MAX]; char *console = NULL; int x; int rwin_args = 0; int lwin_args = 0; struct stat stat_buf; setlocale(LC_ALL, ""); getcwd(dir, sizeof(dir)); SetConsoleTitle("Vifm"); /* Window initializations */ rwin.curr_line = 0; rwin.top_line = 0; rwin.list_rows = 0; rwin.list_pos = 0; rwin.selected_filelist = NULL; rwin.history_num = 0; rwin.invert = 0; rwin.color_scheme = 0; lwin.curr_line = 0; lwin.top_line = 0; lwin.list_rows = 0; lwin.list_pos = 0; lwin.selected_filelist = NULL; lwin.history_num = 0; lwin.invert = 0; lwin.color_scheme = 0; /* These need to be initialized before reading the configuration file */ cfg.command_num = 0; cfg.filetypes_num = 0; cfg.nmapped_num = 0; cfg.vim_filter = 0; cfg.show_one_window = 0; command_list = NULL; filetypes = NULL; cfg.search_history_len = 15; cfg.search_history_num = -1; cfg.search_history = (char **)calloc(cfg.search_history_len, sizeof(char*)); cfg.cmd_history_len = 15; cfg.cmd_history_num = -1; cfg.cmd_history = (char **)calloc(cfg.cmd_history_len, sizeof(char *)); cfg.auto_execute = 0; cfg.color_scheme_num = 0; //col_schemes = (Col_scheme *)calloc(1, sizeof(Col_scheme*)); cfg.shell_cmd = strdup("cmd"); /* Maximum argument length to pass to the shell */ cfg.max_args = 4096; /* POSIX MINIMUM */ init_config(); set_config_dir(); read_config_file(); /* Misc configuration */ lwin.prev_invert = lwin.invert; lwin.hide_dot = 1; strncpy(lwin.regexp, "\\..~$", sizeof(lwin.regexp)); rwin.prev_invert = rwin.invert; rwin.hide_dot = 1; strncpy(rwin.regexp, "\\..~$", sizeof(rwin.regexp)); cfg.timer = 10; curr_stats.yanked_files = NULL; curr_stats.num_yanked_files = 0; curr_stats.need_redraw = 0; curr_stats.getting_input = 0; curr_stats.menu = 0; curr_stats.redraw_menu = 0; curr_stats.is_updir = 0; curr_stats.last_char = 0; curr_stats.is_console = 0; curr_stats.search = 0; curr_stats.save_msg = 0; curr_stats.use_register = 0; curr_stats.curr_register = -1; curr_stats.register_saved = 0; curr_stats.show_full = 0; curr_stats.view = 0; if (cfg.show_one_window) curr_stats.number_of_windows = 1; else curr_stats.number_of_windows = 2; if(stat(config_dir, &stat_buf) == 0) curr_stats.config_file_mtime = stat_buf.st_mtime; else curr_stats.config_file_mtime = 0; /* Check if running in X */ console = getenv("DISPLAY"); if(!console || !*console) curr_stats.is_console = 1; /* Setup the ncurses interface. */ if(!setup_ncurses_interface()) return -1; /* Load the initial directory */ snprintf(rwin.curr_dir, sizeof(rwin.curr_dir), "%s", dir); snprintf(lwin.curr_dir, sizeof(lwin.curr_dir), "%s", dir); rwin.dir_entry = (dir_entry_t *)malloc(sizeof(dir_entry_t)); lwin.dir_entry = (dir_entry_t *)malloc(sizeof(dir_entry_t)); rwin.dir_entry[0].name = malloc(sizeof("../") +1); lwin.dir_entry[0].name = malloc(sizeof("../") +1); strcpy(rwin.dir_entry[0].name, "../"); strcpy(lwin.dir_entry[0].name, "../"); change_directory(&rwin, dir); change_directory(&lwin, dir); other_view = &lwin; curr_view = &rwin; /* Get Command Line Arguments */ for(x = 1; x < argc; x++) { if(argv[x] != NULL) { if(!strcmp(argv[x], "-f")) { cfg.vim_filter = 1; } else if(!strcmp(argv[x], "--version")) { endwin(); system("clear"); printf("vifm %.1f\n\n", VERSION); exit(0); } else if(!strcmp(argv[x], "--help")) { endwin(); show_help_msg(); exit(0); } else if(is_dir(argv[x])) { if(lwin_args) { snprintf(rwin.curr_dir, sizeof(rwin.curr_dir), "%s", argv[x]); rwin_args++; } else { snprintf(lwin.curr_dir, sizeof(lwin.curr_dir), "%s", argv[x]); lwin_args++; } } else { endwin(); show_help_msg(); exit(0); } } } load_dir_list(&rwin, 0); if (rwin_args) { change_directory(&rwin, rwin.curr_dir); load_dir_list(&rwin, 0); } mvwaddstr(rwin.win, rwin.curr_line, 0, "*"); wrefresh(rwin.win); /* This is needed for the sort_dir_list() which uses curr_view */ switch_views(); load_dir_list(&lwin, 0); if (lwin_args) { change_directory(&lwin, lwin.curr_dir); load_dir_list(&lwin, 0); } moveto_list_pos(&lwin, 0); update_all_windows(); werase(status_bar); wnoutrefresh(status_bar); if(cfg.vim_filter) curr_stats.number_of_windows = 1; /* Enter the main loop. */ main_key_press_cb(curr_view); return 0; }
int mapaddch(const char *c, uint8_t y, uint8_t x) { mvwaddstr(mapwindow,y,x,c); return 0; }
int main(int argc, char **argv) { int itmp, y; if (argc > 1 && atol(argv[1])) nap_msec = atol(argv[1]); #ifdef XCURSES Xinitscr(argc, argv); #else initscr(); #endif backfill(); for (y = 0; y < 5; y++) { p1 = mkpanel(10, 10, 0, 0); set_panel_userptr(p1, "p1"); p2 = mkpanel(14, 14, 5, 5); set_panel_userptr(p2, "p2"); p3 = mkpanel(6, 8, 12, 12); set_panel_userptr(p3, "p3"); p4 = mkpanel(10, 10, 10, 30); w4 = panel_window(p4); set_panel_userptr(p4, "p4"); p5 = mkpanel(10, 10, 13, 37); w5 = panel_window(p5); set_panel_userptr(p5, "p5"); fill_panel(p1); fill_panel(p2); fill_panel(p3); fill_panel(p4); fill_panel(p5); hide_panel(p4); hide_panel(p5); pflush(); wait_a_while(nap_msec); saywhat("h3 s1 s2 s4 s5;"); move_panel(p1, 0, 0); hide_panel(p3); show_panel(p1); show_panel(p2); show_panel(p4); show_panel(p5); pflush(); wait_a_while(nap_msec); saywhat("s1;"); show_panel(p1); pflush(); wait_a_while(nap_msec); saywhat("s2;"); show_panel(p2); pflush(); wait_a_while(nap_msec); saywhat("m2;"); move_panel(p2, 10, 10); pflush(); wait_a_while(nap_msec); saywhat("s3;"); show_panel(p3); pflush(); wait_a_while(nap_msec); saywhat("m3;"); move_panel(p3, 5, 5); pflush(); wait_a_while(nap_msec); saywhat("b3;"); bottom_panel(p3); pflush(); wait_a_while(nap_msec); saywhat("s4;"); show_panel(p4); pflush(); wait_a_while(nap_msec); saywhat("s5;"); show_panel(p5); pflush(); wait_a_while(nap_msec); saywhat("t3;"); top_panel(p3); pflush(); wait_a_while(nap_msec); saywhat("t1;"); top_panel(p1); pflush(); wait_a_while(nap_msec); saywhat("t2;"); top_panel(p2); pflush(); wait_a_while(nap_msec); saywhat("t3;"); top_panel(p3); pflush(); wait_a_while(nap_msec); saywhat("t4;"); top_panel(p4); pflush(); wait_a_while(nap_msec); for (itmp = 0; itmp < 6; itmp++) { saywhat("m4;"); mvwaddstr(w4, 3, 1, mod[itmp]); move_panel(p4, 4, itmp * 10); mvwaddstr(w5, 4, 1, mod[itmp]); pflush(); wait_a_while(nap_msec); saywhat("m5;"); mvwaddstr(w4, 4, 1, mod[itmp]); move_panel(p5, 7, itmp * 10 + 6); mvwaddstr(w5, 3, 1, mod[itmp]); pflush(); wait_a_while(nap_msec); } saywhat("m4;"); move_panel(p4, 4, itmp * 10); pflush(); wait_a_while(nap_msec); saywhat("t5;"); top_panel(p5); pflush(); wait_a_while(nap_msec); saywhat("t2;"); top_panel(p2); pflush(); wait_a_while(nap_msec); saywhat("t1;"); top_panel(p1); pflush(); wait_a_while(nap_msec); saywhat("d2;"); rmpanel(p2); pflush(); wait_a_while(nap_msec); saywhat("h3;"); hide_panel(p3); pflush(); wait_a_while(nap_msec); saywhat("d1;"); rmpanel(p1); pflush(); wait_a_while(nap_msec); saywhat("d4; "); rmpanel(p4); pflush(); wait_a_while(nap_msec); saywhat("d5; "); rmpanel(p5); pflush(); wait_a_while(nap_msec); if (nap_msec == 1) break; nap_msec = 100L; } endwin(); return 0; } /* end of main */
void interface_adv(disk_t *disk_car, const int verbose,const int dump_ind, const unsigned int expert, char**current_cmd) { #ifdef HAVE_NCURSES int offset=0; int current_element_num=0; int old_LINES=LINES; #endif int rewrite=1; unsigned int menu=0; list_part_t *element; list_part_t *list_part; list_part_t *current_element; log_info("\nInterface Advanced\n"); list_part=disk_car->arch->read_part(disk_car,verbose,0); current_element=list_part; log_all_partitions(disk_car, list_part); while(1) { const char *options; static struct MenuItem menuAdv[]= { {'t',"Type","Change type, this setting will not be saved on disk"}, {'b',"Boot","Boot sector recovery"}, {'s',"Superblock",NULL}, {'l',"List", "List and copy files"}, {'u',"Undelete", "File undelete"}, {'c',"Image Creation", "Create an image"}, // {'a',"Add", "Add temporary partition (Expert only)"}, {'q',"Quit","Return to main menu"}, {0,NULL,NULL} }; int command; #ifdef HAVE_NCURSES int i; if(old_LINES!=LINES) { old_LINES=LINES; rewrite=1; } if(rewrite!=0) { aff_copy(stdscr); wmove(stdscr,4,0); wprintw(stdscr,"%s",disk_car->description(disk_car)); if(list_part!=NULL) mvwaddstr(stdscr,6,0,msg_PART_HEADER_LONG); rewrite=0; } for(i=0,element=list_part; element!=NULL && i<offset+INTER_ADV; element=element->next,i++) { if(i<offset) continue; wmove(stdscr,7+i-offset,0); wclrtoeol(stdscr); /* before addstr for BSD compatibility */ if(element==current_element) { wattrset(stdscr, A_REVERSE); waddstr(stdscr, ">"); aff_part(stdscr,AFF_PART_ORDER|AFF_PART_STATUS,disk_car,element->part); wattroff(stdscr, A_REVERSE); } else { waddstr(stdscr, " "); aff_part(stdscr,AFF_PART_ORDER|AFF_PART_STATUS,disk_car,element->part); } } wmove(stdscr,7+INTER_ADV,5); wclrtoeol(stdscr); if(element!=NULL) wprintw(stdscr, "Next"); #endif if(current_element==NULL) { options="q"; #ifdef HAVE_NCURSES wmove(stdscr,7,0); wattrset(stdscr, A_REVERSE); wprintw(stdscr,"No partition available."); wattroff(stdscr, A_REVERSE); #endif } else { const partition_t *partition=current_element->part; if(menu==0 && (disk_car->arch!=&arch_none || partition->upart_type!=UP_UNK)) menu=1; if(is_part_fat(partition)) { options="tubcq"; menu=(partition->upart_type==UP_UNK?1:4); } else if(is_part_ntfs(partition)) options="tlubcq"; else if(is_part_linux(partition)) { if(partition->upart_type==UP_EXT2) options="tuscq"; else options="tlscq"; menuAdv[2].desc="Locate ext2/ext3/ext4 backup superblock"; } else if(is_part_hfs(partition) || is_part_hfsp(partition)) { options="tscq"; menuAdv[2].desc="Locate HFS/HFS+ backup volume header"; } else if(is_fat(partition)) options="tubcq"; else if(is_ntfs(partition)) options="tlubcq"; else if(is_exfat(partition)) options="tlubcq"; else if(is_linux(partition)) { if(partition->upart_type==UP_EXT2) options="tluscq"; else options="tlscq"; menuAdv[2].desc="Locate ext2/ext3/ext4 backup superblock"; } else if(is_hfs(partition) || is_hfsp(partition)) { options="tscq"; menuAdv[2].desc="Locate HFS/HFS+ backup volume header"; } else options="tcq"; } if(*current_cmd!=NULL) { int keep_asking; command='q'; do { keep_asking=0; while(*current_cmd[0]==',') (*current_cmd)++; if(strncmp(*current_cmd,"type",4)==0) { (*current_cmd)+=4; command='t'; } else if(strncmp(*current_cmd,"addpart",7)==0) { (*current_cmd)+=7; command='a'; } else if(strncmp(*current_cmd,"boot",4)==0) { (*current_cmd)+=4; command='b'; } else if(strncmp(*current_cmd,"copy",4)==0) { (*current_cmd)+=4; command='c'; } else if(strncmp(*current_cmd,"list",4)==0) { (*current_cmd)+=4; command='l'; } else if(strncmp(*current_cmd,"undelete",8)==0) { (*current_cmd)+=8; command='u'; } else if(strncmp(*current_cmd,"superblock",10)==0) { (*current_cmd)+=10; command='s'; } else if(isdigit(*current_cmd[0])) { const unsigned int order= atoi(*current_cmd); while(*current_cmd[0]!=',' && *current_cmd[0]!='\0') (*current_cmd)++; for(element=list_part; element!=NULL && element->part->order!=order; element=element->next); if(element!=NULL) { current_element=element; keep_asking=1; } } } while(keep_asking>0); } else { #ifdef HAVE_NCURSES command = wmenuSelect_ext(stdscr, INTER_ADV_Y+1, INTER_ADV_Y, INTER_ADV_X, menuAdv, 8, options, MENU_HORIZ | MENU_BUTTON | MENU_ACCEPT_OTHERS, &menu, NULL); #else command = 'q'; #endif } switch(command) { case 'q': case 'Q': part_free_list(list_part); return; #ifdef HAVE_NCURSES case 'a': case 'A': if(disk_car->arch!=&arch_none) { if(*current_cmd!=NULL) list_part=add_partition_cli(disk_car, list_part, current_cmd); else list_part=add_partition_ncurses(disk_car, list_part); current_element=list_part; rewrite=1; } break; #endif } #ifdef HAVE_NCURSES if(current_element!=NULL) { switch(command) { case 'p': case 'P': case KEY_UP: if(current_element->prev!=NULL) { current_element=current_element->prev; current_element_num--; } break; case 'n': case 'N': case KEY_DOWN: if(current_element->next!=NULL) { current_element=current_element->next; current_element_num++; } break; case KEY_PPAGE: for(i=0; i<INTER_ADV-1 && current_element->prev!=NULL; i++) { current_element=current_element->prev; current_element_num--; } break; case KEY_NPAGE: for(i=0; i<INTER_ADV-1 && current_element->next!=NULL; i++) { current_element=current_element->next; current_element_num++; } break; case 'b': case 'B': { partition_t *partition=current_element->part; if(is_part_fat32(partition)) { fat32_boot_sector(disk_car, partition, verbose, dump_ind, expert,current_cmd); rewrite=1; } else if(is_part_fat12(partition) || is_part_fat16(partition)) { fat1x_boot_sector(disk_car, partition, verbose, dump_ind,expert,current_cmd); rewrite=1; } else if(is_part_ntfs(partition)) { if(partition->upart_type==UP_EXFAT) exFAT_boot_sector(disk_car, partition, verbose, current_cmd); else ntfs_boot_sector(disk_car, partition, verbose, expert, current_cmd); rewrite=1; } else if(partition->upart_type==UP_FAT32) { fat32_boot_sector(disk_car, partition, verbose, dump_ind, expert,current_cmd); rewrite=1; } else if(partition->upart_type==UP_FAT12 || partition->upart_type==UP_FAT16) { fat1x_boot_sector(disk_car, partition, verbose, dump_ind,expert,current_cmd); rewrite=1; } else if(partition->upart_type==UP_NTFS) { ntfs_boot_sector(disk_car, partition, verbose, expert, current_cmd); rewrite=1; } else if(partition->upart_type==UP_EXFAT) { exFAT_boot_sector(disk_car, partition, verbose, current_cmd); rewrite=1; } } break; case 'c': case 'C': { char *dst_path; #ifdef HAVE_NCURSES if(*current_cmd!=NULL) dst_path=get_default_location(); else { char msg[256]; snprintf(msg, sizeof(msg), "Please select where to store the file image.dd (%u MB), an image of the partition", (unsigned int)(current_element->part->part_size/1000/1000)); dst_path=ask_location(msg, "", NULL); } #else dst_path=get_default_location(); #endif if(dst_path!=NULL) { char *filename=(char *)MALLOC(strlen(dst_path) + 1 + strlen(DEFAULT_IMAGE_NAME) + 1); strcpy(filename, dst_path); strcat(filename, "/"); strcat(filename, DEFAULT_IMAGE_NAME); disk_image(disk_car, current_element->part, filename); free(filename); free(dst_path); } } rewrite=1; break; case 'u': case 'U': { partition_t *partition=current_element->part; if(partition->sb_offset!=0 && partition->sb_size>0) { io_redir_add_redir(disk_car, partition->part_offset+partition->sborg_offset, partition->sb_size, partition->part_offset+partition->sb_offset, NULL); if(partition->upart_type==UP_NTFS || (is_part_ntfs(partition) && partition->upart_type!=UP_EXFAT)) ntfs_undelete_part(disk_car, partition, verbose, current_cmd); else dir_partition(disk_car, partition, 0, current_cmd); io_redir_del_redir(disk_car, partition->part_offset+partition->sborg_offset); } else { if(partition->upart_type==UP_NTFS || (is_part_ntfs(partition) && partition->upart_type!=UP_EXFAT)) ntfs_undelete_part(disk_car, partition, verbose, current_cmd); else dir_partition(disk_car, partition, 0, current_cmd); } } rewrite=1; break; case 'l': case 'L': { partition_t *partition=current_element->part; if(partition->sb_offset!=0 && partition->sb_size>0) { io_redir_add_redir(disk_car, partition->part_offset+partition->sborg_offset, partition->sb_size, partition->part_offset+partition->sb_offset, NULL); dir_partition(disk_car,partition,verbose, current_cmd); io_redir_del_redir(disk_car, partition->part_offset+partition->sborg_offset); } else dir_partition(disk_car,partition,verbose, current_cmd); } rewrite=1; break; case 's': case 'S': { if(is_linux(current_element->part)) { list_part_t *list_sb=search_superblock(disk_car,current_element->part,verbose,dump_ind,1); interface_superblock(disk_car,list_sb,current_cmd); part_free_list(list_sb); } if(is_hfs(current_element->part) || is_hfsp(current_element->part)) { HFS_HFSP_boot_sector(disk_car, current_element->part, verbose, current_cmd); } rewrite=1; } break; case 't': case 'T': if(*current_cmd!=NULL) change_part_type_cli(disk_car, current_element->part, current_cmd); else change_part_type_ncurses(disk_car, current_element->part); rewrite=1; break; } if(current_element_num<offset) offset=current_element_num; if(current_element_num>=offset+INTER_ADV) offset=current_element_num-INTER_ADV+1; } #endif } }
static bool sirf_initialize(void) { /*@-globstate@*/ unsigned int i; /*@ -onlytrans @*/ mid2win = subwin(devicewin, 6, 80, 1, 0); mid4win = subwin(devicewin, SIRF_CHANNELS + 3, 30, 7, 0); mid6win = subwin(devicewin, 3, 50, 7, 30); mid7win = subwin(devicewin, 4, 50, 13, 30); mid9win = subwin(devicewin, 3, 50, 10, 30); mid13win = subwin(devicewin, 3, 50, 17, 30); mid19win = newwin(16, 50, 7, 30); mid27win = subwin(devicewin, 3, 50, 20, 30); if (mid2win == NULL || mid4win == NULL || mid6win == NULL || mid9win == NULL || mid13win == NULL || mid19win == NULL || mid27win == NULL) return false; (void)syncok(mid2win, true); (void)syncok(mid4win, true); (void)syncok(mid6win, true); (void)syncok(mid7win, true); (void)syncok(mid9win, true); (void)syncok(mid13win, true); (void)syncok(mid27win, true); /*@ -nullpass @*/ (void)wborder(mid2win, 0, 0, 0, 0, 0, 0, 0, 0), (void)wattrset(mid2win, A_BOLD); (void)wmove(mid2win, 0, 1); display(mid2win, 0, 12, " X "); display(mid2win, 0, 21, " Y "); display(mid2win, 0, 30, " Z "); display(mid2win, 0, 43, " North "); display(mid2win, 0, 54, " East "); display(mid2win, 0, 65, " Alt "); (void)wmove(mid2win, 1, 1); (void)wprintw(mid2win, "Pos: m m"); (void)wmove(mid2win, 2, 1); (void)wprintw(mid2win, "Vel: m/s climb m/s"); (void)wmove(mid2win, 3, 1); (void)wprintw(mid2win, "Time: Leap: Heading: speed m/s"); (void)wmove(mid2win, 4, 1); (void)wprintw(mid2win, "Fix: HDOP: M1: M2: "); display(mid2win, 5, 24, " Packet type 2 (0x02) "); (void)wattrset(mid2win, A_NORMAL); (void)wborder(mid4win, 0, 0, 0, 0, 0, 0, 0, 0), (void)wattrset(mid4win, A_BOLD); display(mid4win, 1, 1, "Ch PRN Az El Stat C/N ? SF"); for (i = 0; i < SIRF_CHANNELS; i++) { display(mid4win, (int)(i + 2), 1, "%2d", i); } display(mid4win, 0, 1, " Measured Tracker "); display(mid4win, 14, 4, " Packet Type 4 (0x04) "); (void)wattrset(mid4win, A_NORMAL); (void)wborder(mid19win, 0, 0, 0, 0, 0, 0, 0, 0), (void)wattrset(mid19win, A_BOLD); display(mid19win, 1, 1, "Alt. hold mode:"); display(mid19win, 2, 1, "Alt. hold source:"); display(mid19win, 3, 1, "Alt. source input:"); display(mid19win, 4, 1, "Degraded timeout:"); display(mid19win, 5, 1, "DR timeout:"); display(mid19win, 6, 1, "Track smooth mode:"); display(mid19win, 7, 1, "Static Navigation:"); display(mid19win, 8, 1, "3SV Least Squares:"); display(mid19win, 9, 1, "DOP Mask mode:"); display(mid19win, 10, 1, "Nav. Elev. mask:"); display(mid19win, 11, 1, "Nav. Power mask:"); display(mid19win, 12, 1, "DGPS Source:"); display(mid19win, 13, 1, "DGPS Mode:"); display(mid19win, 14, 1, "DGPS Timeout:"); display(mid19win, 1, 26, "LP Push-to-Fix:"); display(mid19win, 2, 26, "LP On Time:"); display(mid19win, 3, 26, "LP Interval:"); display(mid19win, 4, 26, "U. Tasks Enab.:"); display(mid19win, 5, 26, "U. Task Inter.:"); display(mid19win, 6, 26, "LP Pwr Cyc En:"); display(mid19win, 7, 26, "LP Max Acq Srch:"); display(mid19win, 8, 26, "LP Max Off Time:"); display(mid19win, 9, 26, "APM enabled:"); display(mid19win, 10, 26, "# of Fixes:"); display(mid19win, 11, 26, "Time btw Fixes:"); display(mid19win, 12, 26, "H/V Error Max:"); display(mid19win, 13, 26, "Rsp Time Max:"); display(mid19win, 14, 26, "Time/Accu:"); display(mid19win, 15, 8, " Packet type 19 (0x13) "); (void)wattrset(mid19win, A_NORMAL); (void)wborder(mid6win, 0, 0, 0, 0, 0, 0, 0, 0), (void)wattrset(mid6win, A_BOLD); display(mid6win, 0, 1, " Firmware Version "); display(mid6win, 2, 8, " Packet Type 6 (0x06) "); (void)wattrset(mid6win, A_NORMAL); (void)wborder(mid7win, 0, 0, 0, 0, 0, 0, 0, 0), (void)wattrset(mid7win, A_BOLD); display(mid7win, 0, 1, " Clock Status "); display(mid7win, 1, 1, "SVs: "); display(mid7win, 1, 9, "Drift: "); display(mid7win, 1, 23, "Bias: "); display(mid7win, 2, 1, "GPS Time: "); display(mid7win, 2, 23, "PPS: "); #ifndef PPS_ENABLE (void)mvwaddstr(mid7win, 2, 40, "N/A"); #endif /* PPS_ENABLE */ display(mid7win, 3, 8, " Packet type 7 (0x07) "); (void)wattrset(mid7win, A_NORMAL); (void)wborder(mid9win, 0, 0, 0, 0, 0, 0, 0, 0), (void)wattrset(mid9win, A_BOLD); display(mid9win, 0, 1, " CPU Throughput "); display(mid9win, 1, 1, "Max: "); display(mid9win, 1, 13, "Lat: "); display(mid9win, 1, 25, "Time: "); display(mid9win, 1, 39, "MS: "); display(mid9win, 2, 8, " Packet type 9 (0x09) "); (void)wattrset(mid9win, A_NORMAL); (void)wborder(mid13win, 0, 0, 0, 0, 0, 0, 0, 0), (void)wattrset(mid13win, A_BOLD); display(mid13win, 0, 1, " Visible List "); display(mid13win, 2, 8, " Packet type 13 (0x0D) "); (void)wattrset(mid13win, A_NORMAL); (void)wborder(mid27win, 0, 0, 0, 0, 0, 0, 0, 0), (void)wattrset(mid27win, A_BOLD); display(mid27win, 0, 1, " DGPS Status "); display(mid27win, 2, 8, " Packet type 27 (0x1B) "); (void)wattrset(mid27win, A_NORMAL); /*@ +nullpass @*/ /*@ -onlytrans @*/ #ifdef CONTROLSEND_ENABLE /* probe for version */ /*@ -compdef @*/ (void)monitor_control_send((unsigned char *)"\x84\x00", 2); /*@ +compdef @*/ #endif /* CONTROLSEND_ENABLE */ /* initialize the GPS context's time fields */ gpsd_time_init(session.context, time(NULL)); return true; /*@+globstate@*/ }
void CTextEdit::update(int c) { if(_visible) { bool alwaysFocused = false; #ifdef NO_MOUSE alwaysfocused = true; // If we have no mouse, we can't focus widgets so let's have it always focused. #endif if((_requireFocused ? focused() : true) && (_parent ? _parent->focused() || alwaysFocused : true)) { switch(c) { case ERR: break; #ifdef __PDCURSES__ case 3: // copy { string clipboard = UTIL_Latin1ToUTF8(_text); PDC_setclipboard(clipboard.c_str(), clipboard.length()); break; } case 22: // paste { char *clipboard = NULL; long length = 0; if(PDC_getclipboard(&clipboard, &length) == PDC_CLIP_SUCCESS) { _text += string(clipboard, length); PDC_freeclipboard(clipboard); } break; } #endif case KEY_UP: if(!_history.empty()) { if(_selectedHistory > 0) _text = _history[--_selectedHistory]; else if(_selectedHistory == 0) _text = _history[0]; } break; case KEY_DOWN: if(!_history.empty()) { if(_selectedHistory < _history.size() - 1) _text = _history[++_selectedHistory]; else if(_selectedHistory == _history.size() - 1) _text = _history[_history.size() - 1]; } break; case 8: case 127: case KEY_BACKSPACE: case KEY_DC: if(!_text.empty()) _text.erase(_text.end() - 1); break; case 27: _text.clear(); break; case 10: case 13: #ifdef WIN32 case PADENTER: #endif if(!_text.empty()) { _history.push_back(_text); _selectedHistory = _history.size(); forward( new CFwdData(_fwdTypeEnter, _text, 0 )); _text.clear(); } break; #ifdef WIN32 case PADSLASH: _text += '/'; break; case PADSTAR: _text += '*'; break; case PADMINUS: _text += '-'; break; case PADPLUS: _text += '+'; break; #endif default: if(c >= 32 && c <= 255) _text += c; break; } } if(c != ERR) { move_panel(_panel, _pos.y(), _pos.x()); top_panel(_panel); wclear(_window); string temp = UTIL_Latin1ToUTF8(_text); // print text mvwaddstr(_window, 0, 0, temp.c_str()); } } }
void CTabWidget::update(int c) { if(_visible) { move_panel(_panel, _pos.y(), _pos.x()); //top_panel(_panel); wclear(_window); if(_listenKeys) { if(c == KEY_LEFT) { if(currentIndex() - 1 >= 0) setCurrentIndex(currentIndex() - 1); else setCurrentIndex(count() - 1); } else if(c == KEY_RIGHT) { if(currentIndex() + 1 < int(count())) setCurrentIndex(currentIndex() + 1); else setCurrentIndex(0); } } uint tw = _size.width() - _leftMargin - _rightMargin; // Is left mouse button pressed? #ifdef __PDCURSES__ bool leftClick = focused() && Mouse_status.button[0] == BUTTON_PRESSED; #else bool leftClick = false; MEVENT event; if(getmouse(&event) == OK) leftClick = focused() && (event.bstate & BUTTON1_PRESSED); #endif int k = 0; for(uint i = 0; i < _widgets.size(); ++i) { if(leftClick) { if(_mousePos.x() >= _pos.x() + _leftMargin + k && _mousePos.x() < _pos.x() + _leftMargin + k + _widgets[i]->name().size() && _mousePos.y() == (_bottom ? _pos.y() + _size.height() - 1 : _pos.y())) { // select tab setCurrentIndex(i); } } if(currentIndex() == i) wattr_on(_window, A_BOLD, 0); mvwaddstr(_window, _bottom ? _size.height() - 1 : 0, _leftMargin + k, _widgets[i]->name().c_str()); if(_currentIndex == i) wattr_off(_window, A_BOLD, 0); k += _widgets[i]->name().size() + 1; } if(_layout) { if(_changed) { DEBUG_ui("CTabWidget::update, 0"); _layout->setSize(_size.width(), _size.height() - 1); _layout->setPosition(_pos.x(), _bottom ? _pos.y() : _pos.y() + 1); _changed = false; DEBUG_ui("CTabWidget::update, 1"); } _layout->update(c); } } }
int main(int argc, char *argv[]) { /***** * boolean value indicates when to break main loop * (and thus finish this configuration tool) *****/ int request_finish = 0; int current = 0; /***** menu selection related variables */ int menu_items = 5; enum state status[] = {active, active, active, active, active}; WINDOW *mainscr; /***** ncurses related variables */ int i, j; /***** load configuration */ if (loadConfiguration() == 0) { fprintf(stderr, "couldn't load configuration!"); exit(-1); } /***** setup speaker model */ model = (Model *) malloc(sizeof(Model)); initModel(model); /***** ignore Ctrl-C */ signal(SIGINT, SIG_IGN); /***** ncurses stuff */ initscr(); /***** initialize the curses library */ if (color_term != -1) /***** define dialog color pairs if terminal supports colors */ { start_color (); if ((color_term = has_colors ())) { color_term = 1; init_pair (1, COLOR_WHITE, COLOR_BLUE); init_pair (2, COLOR_YELLOW, COLOR_BLUE); init_pair (3, COLOR_BLUE, COLOR_YELLOW); init_pair (4, COLOR_YELLOW, COLOR_CYAN); } } else color_term = 0; keypad(stdscr, TRUE); /* enable keyboard mapping */ scrollok (stdscr, FALSE); cbreak(); /* take input chars one at a time, no wait for \n */ noecho(); /* don't echo input */ refresh(); mainscr = popupWindow(COLS, LINES); /***** dialog window that contains the main menu */ leaveok (mainscr, FALSE); while (!request_finish) { wattrset (mainscr, color_term ? COLOR_PAIR(2) | A_BOLD : A_NORMAL); /***** set bg color of the dialog */ /***** * draw a box around the dialog window * and empty it. *****/ box(mainscr, 0, 0); for (i = 1; i < COLS-1; i++) for (j = 1; j < LINES-1; j++) mvwaddch(mainscr, j, i, ' '); /***** dialog header */ mvwaddstr(mainscr, 1, 2, "CVoiceControl"); mvwaddstrrght(mainscr, 1, COLS, "(c) 2000 Daniel Kiecza"); mvwaddseparator(mainscr, 2, COLS); mvwaddstrcntr(mainscr, 3, COLS, "Speaker Model Editor"); mvwaddseparator(mainscr, 4, COLS); /***** display main menu */ mvwaddstr(mainscr, 5, 2, "Please Select:"); mvwaddstr(mainscr, 5, 35, "Model:"); if (model_file_name != NULL) mvwaddstr(mainscr, 5, 42, model_file_name); else mvwaddstr(mainscr, 5, 42, "(none)"); setHighlight(mainscr, status[0], current == 0); mvwaddstr(mainscr, 7, 5,"New Speaker Model"); setHighlight(mainscr, status[1], current == 1); mvwaddstr(mainscr, 8, 5,"Load Speaker Model"); setHighlight(mainscr, status[2], current == 2); mvwaddstr(mainscr, 9, 5,"Edit Speaker Model"); setHighlight(mainscr, status[3], current == 3); mvwaddstr(mainscr, 10, 5,"Save Speaker Model"); setHighlight(mainscr, status[4], current == 4); mvwaddstr(mainscr, 11, 5,"Exit"); wmove(mainscr, 5, 17); /***** move cursor to an appropriate location */ wrefresh(mainscr); /***** refresh dialog window */ /* process the command keystroke */ switch(getch()) { case KEY_UP: /***** cursor up */ current = (current == 0 ? menu_items - 1 : current - 1); break; case KEY_DOWN: /***** cursor down */ current = (current == menu_items-1 ? 0 : current + 1); break; case ENTER: /***** handle menu selections */ case BLANK: switch (current) { case 0: /***** reset model, but make sure no data gets lost */ safeResetModel(); break; case 1: /***** load model */ if (safeResetModel()) { int max_file_length = 80; char *file_name; char show_file_name[82]; int width = 45, height = 11, i, j; /***** ncurses related variables */ WINDOW *loadscr = popupWindow (width, height); wattrset (loadscr, color_term ? COLOR_PAIR(2) | A_BOLD : A_NORMAL); /***** set bg color of the dialog */ /***** * draw a box around the dialog window * and empty it. *****/ werase (loadscr); box (loadscr, 0, 0); for (i = 1; i < width-1; i++) for (j = 1; j < height-1; j++) mvwaddch(loadscr, j, i, ' '); /***** dialog header */ mvwaddstr(loadscr, 1, 2, "Please enter file name:"); mvwaddseparator(loadscr, 2, width); wrefresh (loadscr); wattroff(loadscr, A_BOLD); file_name = wstringInput(loadscr, 4, 2, max_file_length, width-5, ""); /***** get file name */ /***** * show_file_name is set to "file" if the file_name is longer * than 15 characters. That way dialog messages stay within the * boundaries of the dialog *****/ if (strlen(file_name) <= 15) strcpy(show_file_name, file_name); else strcpy(show_file_name, "file"); /***** display information that model is being loaded */ wattrset (loadscr, color_term ? COLOR_PAIR(2) | A_BOLD : A_NORMAL); mvwaddstr(loadscr, 6, 2, "Loading"); mvwaddstr(loadscr, 6, 10, show_file_name); mvwaddstr(loadscr, 6, 11+strlen(show_file_name), "..."); wrefresh(loadscr); if (loadModel(model, file_name, 1) == 1) /***** loading model is successful */ { mvwaddstr(loadscr, 6, 15+strlen(show_file_name), "success!"); /***** set variable model_file_name */ if (strstr(file_name, model_file_extension) != file_name+strlen(file_name)-strlen(model_file_extension)) { model_file_name = malloc(strlen(file_name) + strlen(model_file_extension) + 1); strcpy(model_file_name, file_name); strcat(model_file_name, model_file_extension); } else { model_file_name = malloc(strlen(file_name) + 1); strcpy(model_file_name, file_name); } } else /***** loading model has failed */ mvwaddstr(loadscr, 6, 15+strlen(show_file_name), "failed!"); mvwaddstrcntr(loadscr, 8, width,"Press <Space> to return to menu ..."); wrefresh(loadscr); /***** refresh dialog */ getch(); /***** wait for keyboard input */ delwin(loadscr); /***** delete ncurses dialog window */ free (file_name); } break; case 2: /***** edit the speaker model */ editModel(); break; case 3: /***** save the speaker model */ if (model->number_of_items > 0) { char *file_name; int max_file_length = 84; int width = 45, height = 11, i, j; /***** ncurses related variables */ WINDOW *savescr = popupWindow (width, height); wattrset (savescr, color_term ? COLOR_PAIR(2) | A_BOLD : A_NORMAL); /***** set bg color of the dialog */ /***** * draw a box around the dialog window * and empty it. *****/ werase (savescr); box (savescr, 0, 0); for (i = 1; i < width-1; i++) for (j = 1; j < height-1; j++) mvwaddch(savescr, j, i, ' '); /***** display dialog header */ mvwaddstr(savescr, 1, 2, "Please enter file name:"); mvwaddseparator(savescr, 2, width); wrefresh (savescr); wattroff(savescr, A_BOLD); file_name = wstringInput(savescr, 4, 2, max_file_length, width-5, model_file_name); /***** get file name */ /***** display information that model is being saved */ wattrset (savescr, color_term ? COLOR_PAIR(2) | A_BOLD : A_NORMAL); mvwaddstr(savescr, 6, 2, "Saving ..."); wrefresh(savescr); if (saveModel(model, file_name) == 1) /***** saving successful */ { mvwaddstr(savescr, 6, 13, "success!"); /***** update model_file_name if necessary */ if (model_file_name != NULL && strcmp(model_file_name, file_name) != 0) { free(model_file_name); model_file_name = malloc(strlen(file_name) + 1); strcpy(model_file_name, file_name); } modified = 0; /***** switch modified to '0' */ } else /***** saving failed */ mvwaddstr(savescr, 6, 13, "failed!"); mvwaddstrcntr(savescr, 8, width,"Press <Space> to return to menu ..."); wrefresh(savescr); /***** refresh dialog */ getch(); /***** wait for keyboard input */ delwin(savescr); /***** delete ncurses dialog window */ free (file_name); } break; case 4: /***** quit program */ if (safeResetModel()) { wrefresh(mainscr); request_finish = 1; delwin(mainscr); /***** delete ncurses dialog window */ } break; } break; } } endwin(); /***** wrap up ncurses stuff */ exit(0); /***** exit program */ }
int safeResetModel() { int retval = 0; /***** return value */ /***** * if speaker model has been modified, * display a "warning" dialog to avoid an accidental loss of data *****/ if (modified) { int width = 45, height = 11, i, j; /***** ncurses related variables */ WINDOW *resetscr = popupWindow (width, height); wattrset (resetscr, color_term ? COLOR_PAIR(2) | A_BOLD : A_NORMAL); /***** set bg color of the dialog */ /***** * draw a box around the dialog window * and empty it. *****/ werase(resetscr); box (resetscr, 0, 0); for (i = 1; i < width-1; i++) for (j = 1; j < height-1; j++) mvwaddch(resetscr, j, i, ' '); /***** dialog header */ mvwaddstr(resetscr, 1, 2, "Warning!"); mvwaddseparator(resetscr, 2, width); /***** dialog message */ mvwaddstr(resetscr, 4, 2,"You did not save the current model!"); mvwaddstr(resetscr, 5, 2,"Press 'y' to proceed. **Caution**"); mvwaddstr(resetscr, 6, 2,"All data in the model will be lost!!"); mvwaddstr(resetscr, 7, 2,"Press any other key to return to the"); mvwaddstr(resetscr, 8, 2,"menu ..."); wmove(resetscr, 1, 11); /***** set cursor to a convenient location */ wrefresh (resetscr); /***** and display dialog */ /***** wait for keyboard input */ if (getch() == 'y') /***** if user hits 'y' */ { modified = 0; /***** we reset the speaker model */ resetModel(model); if (model_file_name != NULL) /***** if a file name had been specified, ... */ free(model_file_name); /***** free any memory used by it */ model_file_name = NULL; retval = 1; /***** return ok */ } else /***** any other key -> keep speaker model */ retval = 0; delwin(resetscr); /***** delete ncurses dialog window */ } else retval = 1; /***** if speaker model hasn't been modified, return ok */ return(retval); }
void editModel() { int width = 65, height = 22, i, j; /***** ncurses related variables */ WINDOW *editscr = popupWindow(width, height); int top = 0, current = 0; /***** menu selection related variables */ int max_view = 10; int request_finish = 0; /***** request_finish = 1 breaks the main while loop */ while (!request_finish) { wattrset (editscr, color_term ? COLOR_PAIR(2) | A_BOLD : A_NORMAL); /***** set bg color of the dialog */ /***** * draw a box around the dialog window * and empty it. *****/ werase (editscr); box (editscr, 0, 0); for (i = 1; i < width-1; i++) for (j = 1; j < height-1; j++) mvwaddch(editscr, j, i, ' '); /***** dialog header */ mvwaddstr(editscr, 1, 2, "Edit Speaker Model"); mvwaddseparator(editscr, 2, width); /***** display help at the bottom */ mvwaddseparator(editscr, height-4, width); mvwaddstr(editscr, height-3, 2, "a = add item, d = delete item, Enter = edit item"); mvwaddstr(editscr, height-2, 2, "b = back to main menu"); /***** display information about current speaker model in a table */ mvwaddstr(editscr, 4, 2, "Number of items:"); mvwaddint(editscr, 4, 19, model->number_of_items); mvwaddstr(editscr, 6, 4, "Label"); mvwaddch(editscr, 6,25, ACS_VLINE); mvwaddstr(editscr, 6,27, "Command"); mvwaddch(editscr, 6,48, ACS_VLINE); mvwaddstr(editscr, 6,50, "Samples"); /***** display table */ for (i = 0; i < 55; i++) mvwaddch(editscr, 7, 3+i, ACS_HLINE); mvwaddch(editscr, 7,25, ACS_PLUS); mvwaddch(editscr, 7,48, ACS_PLUS); for (i = 0; i < max_view; i++) { mvwaddch(editscr, 8+i, 25, ACS_VLINE); mvwaddch(editscr, 8+i, 48, ACS_VLINE); } /***** fill table */ for (i = 0; i < MIN2(model->number_of_items, max_view); i++) { setHighlight(editscr, active, i == current); mvwaddstr(editscr, 8+i, 3, " "); mvwaddstr(editscr, 8+i, 26, " "); mvwaddstr(editscr, 8+i, 49, " "); mvwaddnstr(editscr, 8+i, 4, getModelItem(model, top+i)->label, 20); mvwaddnstr(editscr, 8+i, 27, getModelItem(model, top+i)->command, 20); mvwaddint(editscr, 8+i, 53, getModelItem(model, top+i)->number_of_samples); } wattroff(editscr, A_REVERSE); /***** up/down arrows indicate that not all items can be displayed */ if (top > 0) { mvwaddch(editscr, 8, 2, ACS_UARROW); mvwaddch(editscr, 8+1, 2, ACS_VLINE); } if (model->number_of_items > max_view && top+max_view <= model->number_of_items-1) { mvwaddch(editscr, 8+max_view-2, 2, ACS_VLINE); mvwaddch(editscr, 8+max_view-1, 2, ACS_DARROW); } wmove(editscr, 1,21); /***** move cursor to an appropriate location */ wrefresh(editscr); /***** refresh dialog window */ /* process the command keystroke */ switch(getch()) { case KEY_UP: /***** cursor up */ if (top+current > 0) { if (current > 0) current--; else top--; } break; case KEY_DOWN: /***** cursor down */ if (top+current < model->number_of_items-1) { if (current < max_view-1) current++; else top++; } break; case 'b': /***** * allow leaving of the menu only if a predefined minimum amount of * sample utterances has been donated for each model item *****/ j = MIN_NR_SAMPLES_PER_ITEM; for (i = 0; i < model->number_of_items; i++) if (getModelItem(model, i)->number_of_samples < j) { j = 0; break; } if (j < MIN_NR_SAMPLES_PER_ITEM) /***** at least one model item doesn't meet requirements */ { int width = 42, height = 10, i, j; /***** ncurses related variables */ WINDOW *warnscr = popupWindow (width, height); char tmp_string[80]; wattrset (warnscr, color_term ? COLOR_PAIR(2) | A_BOLD : A_NORMAL); /***** set bg color of the dialog */ /***** * draw a box around the dialog window * and empty it. *****/ werase (warnscr); box (warnscr, 0, 0); for (i = 1; i < width-1; i++) for (j = 1; j < height-1; j++) mvwaddch(warnscr, j, i, ' '); /***** dialog header */ mvwaddstr(warnscr, 1, 2, "Warning!"); mvwaddseparator(warnscr, 2, width); /***** dialog message */ sprintf(tmp_string, "We need at least %d sample utterances", MIN_NR_SAMPLES_PER_ITEM); mvwaddstr(warnscr, 3, 2, tmp_string); mvwaddstr(warnscr, 4, 2,"for each speaker model item!!!"); mvwaddstr(warnscr, 5, 2,"Please donate the minimum number of "); mvwaddstr(warnscr, 6, 2,"samples before leaving this menu!"); mvwaddstrcntr(warnscr, 8, width, "Press any key to continue ..."); wmove(warnscr, 1, 11); /***** move cursor to an appropriate location */ wrefresh (warnscr); /***** refresh dialog window */ getch(); /***** wait for keyboard input */ delwin(warnscr); /***** delete ncurses dialog window */ } else request_finish = 1; /***** otherwise prepare to leave menu */ break; case ENTER: /***** edit the currently selected model item */ if (model->number_of_items > 0) editModelItem(getModelItem(model, top+current)); break; case 'a': /***** append a new item to the speaker model */ appendEmptyModelItem(model, "New Item", "New Command"); modified = 1; /***** switch 'modified' to 1 */ /***** set cursor to show new item */ current = model->number_of_items-1 - top; while (current > max_view-1) { current--; top++; } break; case 'd': /***** delete currently selected item from model */ deleteModelItem(model, top+current); modified = 1; /***** switch 'modified' to 1 */ /***** set cursor to a valid value */ if (top+current == model->number_of_items) { if (top > 0) top--; else if (current > 0) current--; } break; } } }
void editModelItem(ModelItem *model_item) { int width = 65, height = 22, i, j; /***** ncurses related variables */ WINDOW *itemscr = popupWindow (width, height); int top = 0, current = 0; /***** menu selection related variables */ int max_view = 6; int input_field_width = 40; /***** width of string input field */ int request_finish = 0; /***** request_finish = 1 breaks the main while loop */ while (!request_finish) { wattrset (itemscr, color_term ? COLOR_PAIR(2) | A_BOLD : A_NORMAL); /***** set bg color of the dialog */ /***** * draw a box around the dialog window * and empty it. *****/ werase (itemscr); box (itemscr, 0, 0); for (i = 1; i < width-1; i++) for (j = 1; j < height-1; j++) mvwaddch(itemscr, j, i, ' '); /***** dialog header */ mvwaddstr(itemscr, 1, 2, "Edit Speaker Model Item"); mvwaddseparator(itemscr, 2, width); /***** display help at the bottom */ mvwaddseparator(itemscr, height-4, width); mvwaddstr(itemscr, height-3, 2, "r = record sample, d = delete sample, enter = play sample"); mvwaddstr(itemscr, height-2, 2, "b = back to model menu, l = edit label, c = edit command"); /***** display information about current speaker item */ mvwaddstr(itemscr, 4, 2, "Label :"); mvwaddnstr(itemscr, 4, 12, model_item->label, input_field_width); mvwaddstr(itemscr, 5, 2, "Command :"); mvwaddnstr(itemscr, 5, 12, model_item->command, input_field_width); mvwaddstr(itemscr, 7, 2, "Number of samples:"); mvwaddint(itemscr, 7, 21, model_item->number_of_samples); /***** show sample utterances in a list. */ mvwaddstr(itemscr, 9, 4, "ID"); /***** header */ for (i = 0; i < 28; i++) mvwaddch(itemscr,10, 3+i, ACS_HLINE); /***** list items */ for (i = 0; i < MIN2(model_item->number_of_samples, max_view); i++) { setHighlight(itemscr, active, i == current); mvwaddstr(itemscr,11+i, 3, " "); mvwaddstr(itemscr,11+i, 4, getModelItemSample(model_item, top+i)->id); } wattroff(itemscr, A_REVERSE); /***** up/down arrows indicate that not all items can be displayed */ if (top > 0) { mvwaddch(itemscr,11, 2, ACS_UARROW); mvwaddch(itemscr,11+1, 2, ACS_VLINE); } if (model_item->number_of_samples > max_view && top+max_view <= model_item->number_of_samples-1) { mvwaddch(itemscr,11+max_view-2, 2, ACS_VLINE); mvwaddch(itemscr,11+max_view-1, 2, ACS_DARROW); } wmove(itemscr, 1,26); /***** move cursor to a convenient location */ wrefresh(itemscr); /***** refresh dialog window */ /* process the command keystroke */ switch(getch()) { case KEY_UP: /***** cursor up */ if (top+current > 0) { if (current > 0) current--; else top--; } break; case KEY_DOWN: /***** cursor down */ if (top+current < model_item->number_of_samples-1) { if (current < max_view-1) current++; else top++; } break; case 'b': /***** leave menu */ request_finish = 1; break; case ENTER: /***** play selected utterance */ if (model_item->number_of_samples > 0) { int width = 42, height = 8, i, j; /* ncurses related variables */ WINDOW *playbackscr = popupWindow (width, height); wattrset (playbackscr, color_term ? COLOR_PAIR(2) | A_BOLD : A_NORMAL); /***** set bg color of the dialog */ /***** * draw a box around the dialog window * and empty it. *****/ werase (playbackscr); box (playbackscr, 0, 0); for (i = 1; i < width-1; i++) for (j = 1; j < height-1; j++) mvwaddch(playbackscr, j, i, ' '); /***** dialog header */ mvwaddstr(playbackscr, 1, 2, "Playback"); mvwaddseparator(playbackscr, 2, width); /***** play wave if present */ if (getModelItemSample(model_item, top+current)->has_wav) { /***** dialog message */ mvwaddstr(playbackscr, 3, 2,"Utterance is being played ... "); /* mvwaddstrcntr(playbackscr, 6, width, "Press any key to cancel ..."); */ wmove(playbackscr, 1, 11); /***** move cursor to an appropriate location */ wrefresh (playbackscr); /***** refresh dialog window */ /***** if play fails or was cancelled ....*/ if (playSample(getModelItemSample(model_item, top+current)) != AUDIO_OK) { /***** display information */ mvwaddstr(playbackscr, 1, 2, "Warning! "); mvwaddstr(playbackscr, 3, 2,"Either playback has been cancelled "); mvwaddstr(playbackscr, 4, 2,"or wave couldn't be sent to your "); mvwaddstr(playbackscr, 5, 2,"soundcard ! "); mvwaddstrcntr(playbackscr, 6, width, "Press any key to continue ..."); wmove(playbackscr, 1, 11); /***** move cursor to an appropriate location */ wrefresh (playbackscr); /***** refresh dialog window */ getch(); /***** wait for keyboard input */ } } else /***** no wave data present! */ { mvwaddstr(playbackscr, 3, 2,"Utterance can't be played! No wave "); mvwaddstr(playbackscr, 4, 2,"data available! Note: KvoiceControl "); mvwaddstr(playbackscr, 5, 2,"did NOT save the original wave data!"); mvwaddstrcntr(playbackscr, 6, width, "Press any key to cancel ..."); wmove(playbackscr, 1, 11); /***** move cursor to an appropriate location */ wrefresh (playbackscr); /***** refresh dialog window */ getch(); /***** wait for keyboard input */ } delwin(playbackscr); /***** delete ncurses dialog window */ } break; case 'r': /***** record sample utterance */ { int width = 42, height = 8, i, j; /***** ncurses related variables */ WINDOW *recordscr = popupWindow (width, height); ModelItemSample *new_sample; /***** temporary pointer to new utterance */ wattrset (recordscr, color_term ? COLOR_PAIR(2) | A_BOLD : A_NORMAL); /***** set bg color of the dialog */ /***** * draw a box around the dialog window * and empty it. *****/ werase (recordscr); box (recordscr, 0, 0); for (i = 1; i < width-1; i++) for (j = 1; j < height-1; j++) mvwaddch(recordscr, j, i, ' '); /***** dialog header */ mvwaddstr(recordscr, 1, 2, "Recording"); mvwaddseparator(recordscr, 2, width); /***** dialog message */ mvwaddstr(recordscr, 3, 2,"Utterance is recorded automatically!"); mvwaddstr(recordscr, 4, 2,"Please say what you want to say ..."); mvwaddstrcntr(recordscr, 6, width, "Press any key to cancel ..."); wmove(recordscr, 1, 12); /***** move cursor to a convenient location */ wrefresh (recordscr); /***** refresh dialog screen */ new_sample = recordSample(); /***** auto record a sample utterance */ if (new_sample != NULL) /***** if the recording was successful ... */ { appendModelItemSample(model_item, new_sample); /***** add the sample to the model */ /***** set cursor to be over new sample utterance */ current = model_item->number_of_samples-1 - top; while (current > max_view-1) { current--; top++; } } else /***** recording has failed or was cancelled */ { /***** dialog message */ mvwaddstr(recordscr, 1, 2, "Cancel! "); mvwaddstr(recordscr, 3, 2,"Nothing has been recorded! Either "); mvwaddstr(recordscr, 4, 2,"you cancelled or no data could be "); mvwaddstr(recordscr, 5, 2,"recorded ! "); mvwaddstrcntr(recordscr, 6, width, "Press any key to continue ..."); wmove(recordscr, 1, 10); /***** move cursor to a convenient location */ wrefresh (recordscr); /***** refresh dialog screen */ getch(); /***** wait for keyboard input */ } delwin(recordscr); /***** delete ncurses dialog window */ } break; case 'l': /***** edit label */ { /***** * use wstringInput to edit the label of the current utterance * if the label has changed, switch 'modified' to 1 *****/ char tmp_string[1000]; strcpy(tmp_string, model_item->label); free(model_item->label); model_item->label = wstringInput(itemscr, 4, 12, 255, input_field_width, tmp_string); if (strcmp(tmp_string, model_item->label) != 0) modified = 1; } break; case 'c': /***** edit command */ { /***** * use wstringInput to edit the commandd of the current utterance * if the command has changed, switch 'modified' to 1 *****/ char tmp_string[1000]; strcpy(tmp_string, model_item->command); free(model_item->command); model_item->command = wstringInput(itemscr, 5, 12, 255, input_field_width, tmp_string); if (strcmp(tmp_string, model_item->command) != 0) modified = 1; } break; case 'd': /***** * delete currently selected sample utterance from model item * and switch 'modified' to 1 *****/ deleteModelItemSample(model_item, top+current); modified = 1; /***** set cursor to a valid value */ if (top+current == model_item->number_of_samples) { if (top > 0) top--; else if (current > 0) current--; } break; } } }
static void test_inserts(int level) { static bool first = TRUE; wint_t ch; int code; int limit; int row = 1; int col; int row2, col2; int length; wchar_t buffer[BUFSIZ]; WINDOW *look = 0; WINDOW *work = 0; WINDOW *show = 0; int margin = (2 * TABSIZE) - 1; Options option = ((m_opt ? oMove : oDefault) | ((w_opt || (level > 0)) ? oWindow : oDefault)); if (first) { static char cmd[80]; setlocale(LC_ALL, ""); putenv(strcpy(cmd, "TABSIZE=8")); initscr(); (void) cbreak(); /* take input chars one at a time, no wait for \n */ (void) noecho(); /* don't echo input */ keypad(stdscr, TRUE); } limit = LINES - 5; if (level > 0) { look = newwin(limit, COLS - (2 * (level - 1)), 0, level - 1); work = newwin(limit - 2, COLS - (2 * level), 1, level); show = newwin(4, COLS, limit + 1, 0); box(look, 0, 0); wnoutrefresh(look); limit -= 2; } else { work = stdscr; show = derwin(stdscr, 4, COLS, limit + 1, 0); } keypad(work, TRUE); for (col = margin + 1; col < COLS; col += TABSIZE) mvwvline(work, row, col, '.', limit - 2); mvwvline(work, row, margin, ACS_VLINE, limit - 2); mvwvline(work, row, margin + 1, ACS_VLINE, limit - 2); limit /= 2; mvwaddstr(work, 1, 2, "String"); mvwaddstr(work, limit + 1, 2, "Chars"); wnoutrefresh(work); buffer[length = 0] = '\0'; legend(show, level, option, buffer, length); wnoutrefresh(show); doupdate(); /* * Show the characters inserted in color, to distinguish from those that * are shifted. */ if (has_colors()) { start_color(); init_pair(1, COLOR_WHITE, COLOR_BLUE); wbkgdset(work, COLOR_PAIR(1) | ' '); } while ((code = wget_wch(work, &ch)) != ERR) { if (code == KEY_CODE_YES) { switch (ch) { case KEY_DOWN: ch = CTRL('N'); break; case KEY_BACKSPACE: ch = '\b'; break; default: beep(); continue; } } else if (code == ERR) { beep(); break; } if (ch == 'q') break; wmove(work, row, margin + 1); switch (ch) { case 'w': test_inserts(level + 1); touchwin(look); touchwin(work); touchwin(show); wnoutrefresh(look); wnoutrefresh(work); wnoutrefresh(show); doupdate(); break; case CTRL('N'): if (row < limit) { ++row; /* put the whole string in, all at once */ col2 = margin + 1; switch (option) { case oDefault: if (n_opt > 1) { for (col = 0; col < length; col += n_opt) { col2 = ColOf(buffer, col, margin); if (move(row, col2) != ERR) { InsNStr(buffer + col, LEN(col)); } } } else { if (move(row, col2) != ERR) { InsStr(buffer); } } break; case oMove: if (n_opt > 1) { for (col = 0; col < length; col += n_opt) { col2 = ColOf(buffer, col, margin); MvInsNStr(row, col2, buffer + col, LEN(col)); } } else { MvInsStr(row, col2, buffer); } break; case oWindow: if (n_opt > 1) { for (col = 0; col < length; col += n_opt) { col2 = ColOf(buffer, col, margin); if (wmove(work, row, col2) != ERR) { WInsNStr(work, buffer + col, LEN(col)); } } } else { if (wmove(work, row, col2) != ERR) { WInsStr(work, buffer); } } break; case oMoveWindow: if (n_opt > 1) { for (col = 0; col < length; col += n_opt) { col2 = ColOf(buffer, col, margin); MvWInsNStr(work, row, col2, buffer + col, LEN(col)); } } else { MvWInsStr(work, row, col2, buffer); } break; } /* do the corresponding single-character insertion */ row2 = limit + row; for (col = 0; col < length; ++col) { col2 = ColOf(buffer, col, margin); switch (option) { case oDefault: if (move(row2, col2) != ERR) { InsCh((chtype) buffer[col]); } break; case oMove: MvInsCh(row2, col2, (chtype) buffer[col]); break; case oWindow: if (wmove(work, row2, col2) != ERR) { WInsCh(work, (chtype) buffer[col]); } break; case oMoveWindow: MvWInsCh(work, row2, col2, (chtype) buffer[col]); break; } } } else { beep(); } break; case KEY_BACKSPACE: ch = '\b'; /* FALLTHRU */ default: buffer[length++] = ch; buffer[length] = '\0'; /* put the string in, one character at a time */ col = ColOf(buffer, length - 1, margin); switch (option) { case oDefault: if (move(row, col) != ERR) { InsStr(buffer + length - 1); } break; case oMove: MvInsStr(row, col, buffer + length - 1); break; case oWindow: if (wmove(work, row, col) != ERR) { WInsStr(work, buffer + length - 1); } break; case oMoveWindow: MvWInsStr(work, row, col, buffer + length - 1); break; } /* do the corresponding single-character insertion */ switch (option) { case oDefault: if (move(limit + row, col) != ERR) { InsCh(ch); } break; case oMove: MvInsCh(limit + row, col, ch); break; case oWindow: if (wmove(work, limit + row, col) != ERR) { WInsCh(work, ch); } break; case oMoveWindow: MvWInsCh(work, limit + row, col, ch); break; } wnoutrefresh(work); legend(show, level, option, buffer, length); wnoutrefresh(show); doupdate(); break; } } if (level > 0) { delwin(show); delwin(work); delwin(look); } }