int reset_prog_mode(void) { PDC_LOG(("reset_prog_mode() - called\n")); _restore_mode(PDC_PR_TTY); PDC_reset_prog_mode(); return OK; }
int PDC_scr_open(int argc, char **argv) { const char *str; CONSOLE_SCREEN_BUFFER_INFO csbi; HMODULE h_kernel; BOOL result; int i; PDC_LOG(("PDC_scr_open() - called\n")); SP = calloc(1, sizeof(SCREEN)); if (!SP) return ERR; for (i = 0; i < 16; i++) { pdc_curstoreal[realtocurs[i]] = i; pdc_curstoansi[ansitocurs[i]] = i; } _reset_old_colors(); std_con_out = pdc_con_out = GetStdHandle(STD_OUTPUT_HANDLE); pdc_con_in = GetStdHandle(STD_INPUT_HANDLE); if (GetFileType(pdc_con_in) != FILE_TYPE_CHAR) { fprintf(stderr, "\nRedirection is not supported.\n"); exit(1); } is_nt = !(GetVersion() & 0x80000000); str = getenv("ConEmuANSI"); pdc_conemu = !!str; pdc_ansi = pdc_conemu ? !strcmp(str, "ON") : FALSE; GetConsoleScreenBufferInfo(pdc_con_out, &csbi); GetConsoleScreenBufferInfo(pdc_con_out, &orig_scr); GetConsoleMode(pdc_con_in, &old_console_mode); /* preserve QuickEdit Mode setting for use in PDC_mouse_set() when the mouse is not enabled -- other console input settings are cleared */ pdc_quick_edit = old_console_mode & 0x0040; SP->lines = (str = getenv("LINES")) ? atoi(str) : PDC_get_rows(); SP->cols = (str = getenv("COLS")) ? atoi(str) : PDC_get_columns(); SP->mouse_wait = PDC_CLICK_PERIOD; SP->audible = TRUE; SP->termattrs = A_COLOR | A_REVERSE; if (SP->lines < 2 || SP->lines > csbi.dwMaximumWindowSize.Y) { fprintf(stderr, "LINES value must be >= 2 and <= %d: got %d\n", csbi.dwMaximumWindowSize.Y, SP->lines); return ERR; } if (SP->cols < 2 || SP->cols > csbi.dwMaximumWindowSize.X) { fprintf(stderr, "COLS value must be >= 2 and <= %d: got %d\n", csbi.dwMaximumWindowSize.X, SP->cols); return ERR; } SP->orig_fore = csbi.wAttributes & 0x0f; SP->orig_back = (csbi.wAttributes & 0xf0) >> 4; SP->orig_attr = TRUE; SP->_restore = PDC_RESTORE_NONE; if ((str = getenv("PDC_RESTORE_SCREEN")) == NULL || *str != '0') { /* Create a new console buffer */ pdc_con_out = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); if (pdc_con_out == INVALID_HANDLE_VALUE) { PDC_LOG(("PDC_scr_open() - screen buffer failure\n")); pdc_con_out = std_con_out; } else SP->_restore = PDC_RESTORE_BUFFER; } xcpt_filter = SetUnhandledExceptionFilter(_restore_console); SetConsoleCtrlHandler(_ctrl_break, TRUE); SP->_preserve = (getenv("PDC_PRESERVE_SCREEN") != NULL); /* ENABLE_LVB_GRID_WORLDWIDE */ result = SetConsoleMode(pdc_con_out, 0x0010); if (result) SP->termattrs |= A_UNDERLINE | A_LEFT | A_RIGHT; PDC_reset_prog_mode(); SP->mono = FALSE; h_kernel = GetModuleHandleA("kernel32.dll"); pGetConsoleScreenBufferInfoEx = (GetConsoleScreenBufferInfoExFn)GetProcAddress(h_kernel, "GetConsoleScreenBufferInfoEx"); pSetConsoleScreenBufferInfoEx = (SetConsoleScreenBufferInfoExFn)GetProcAddress(h_kernel, "SetConsoleScreenBufferInfoEx"); return OK; }
int PDC_scr_open(int argc, char **argv) { int i; PDC_LOG(("PDC_scr_open() - called\n")); SP = calloc(1, sizeof(SCREEN)); if (!SP) return ERR; pdc_own_screen = !pdc_screen; if (pdc_own_screen) { if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) < 0) { fprintf(stderr, "Could not start SDL: %s\n", SDL_GetError()); return ERR; } atexit(SDL_Quit); } if (!pdc_font) { const char *fname = getenv("PDC_FONT"); pdc_font = SDL_LoadBMP(fname ? fname : "pdcfont.bmp"); } if (!pdc_font) pdc_font = SDL_LoadBMP_RW(SDL_RWFromMem(deffont, sizeof(deffont)), 0); if (!pdc_font) { fprintf(stderr, "Could not load font\n"); return ERR; } SP->mono = !pdc_font->format->palette; if (!SP->mono && !pdc_back) { const char *bname = getenv("PDC_BACKGROUND"); pdc_back = SDL_LoadBMP(bname ? bname : "pdcback.bmp"); } if (!SP->mono && (pdc_back || !pdc_own_screen)) { SP->orig_attr = TRUE; SP->orig_fore = COLOR_WHITE; SP->orig_back = -1; } else SP->orig_attr = FALSE; pdc_fheight = pdc_font->h / 8; pdc_fwidth = pdc_font->w / 32; if (!SP->mono) pdc_flastc = pdc_font->format->palette->ncolors - 1; if (pdc_own_screen && !pdc_icon) { const char *iname = getenv("PDC_ICON"); pdc_icon = SDL_LoadBMP(iname ? iname : "pdcicon.bmp"); if (!pdc_icon) pdc_icon = SDL_LoadBMP_RW(SDL_RWFromMem(deficon, sizeof(deficon)), 0); if (pdc_icon) SDL_WM_SetIcon(pdc_icon, NULL); } if (pdc_own_screen) { const char *env = getenv("PDC_LINES"); pdc_sheight = (env ? atoi(env) : 25) * pdc_fheight; env = getenv("PDC_COLS"); pdc_swidth = (env ? atoi(env) : 80) * pdc_fwidth; pdc_screen = SDL_SetVideoMode(pdc_swidth, pdc_sheight, 0, SDL_SWSURFACE|SDL_ANYFORMAT|SDL_RESIZABLE); } else { if (!pdc_sheight) pdc_sheight = pdc_screen->h - pdc_yoffset; if (!pdc_swidth) pdc_swidth = pdc_screen->w - pdc_xoffset; } if (!pdc_screen) { fprintf(stderr, "Couldn't create a surface: %s\n", SDL_GetError()); return ERR; } if (SP->orig_attr) PDC_retile(); for (i = 0; i < 8; i++) { pdc_color[i].r = (i & COLOR_RED) ? 0xc0 : 0; pdc_color[i].g = (i & COLOR_GREEN) ? 0xc0 : 0; pdc_color[i].b = (i & COLOR_BLUE) ? 0xc0 : 0; pdc_color[i + 8].r = (i & COLOR_RED) ? 0xff : 0x40; pdc_color[i + 8].g = (i & COLOR_GREEN) ? 0xff : 0x40; pdc_color[i + 8].b = (i & COLOR_BLUE) ? 0xff : 0x40; } for (i = 0; i < 16; i++) pdc_mapped[i] = SDL_MapRGB(pdc_screen->format, pdc_color[i].r, pdc_color[i].g, pdc_color[i].b); SDL_EnableUNICODE(1); PDC_mouse_set(); if (pdc_own_screen) PDC_set_title(argc ? argv[0] : "PDCurses"); SP->lines = PDC_get_rows(); SP->cols = PDC_get_columns(); SP->mouse_wait = PDC_CLICK_PERIOD; SP->audible = FALSE; PDC_reset_prog_mode(); return OK; }
int PDC_scr_open(int argc, char **argv) { PDC_LOG(("PDC_scr_open() - called\n")); SP = calloc(1, sizeof(SCREEN)); if (!SP) return ERR; pdc_own_screen = !pdc_screen; if (pdc_own_screen) { if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) < 0) { fprintf(stderr, "Could not start SDL: %s\n", SDL_GetError()); return ERR; } atexit(_clean); } #ifdef PDC_WIDE if (!pdc_ttffont) { const char *ptsz, *fname; if (TTF_Init() == -1) { fprintf(stderr, "Could not start SDL_TTF: %s\n", SDL_GetError()); return ERR; } ptsz = getenv("PDC_FONT_SIZE"); if (ptsz != NULL) pdc_font_size = atoi(ptsz); if (pdc_font_size <= 0) pdc_font_size = 18; fname = getenv("PDC_FONT"); pdc_ttffont = TTF_OpenFont(fname ? fname : PDC_FONT_PATH, pdc_font_size); } if (!pdc_ttffont) { fprintf(stderr, "Could not load font\n"); return ERR; } TTF_SetFontKerning(pdc_ttffont, 0); TTF_SetFontHinting(pdc_ttffont, TTF_HINTING_MONO); SP->mono = FALSE; #else if (!pdc_font) { const char *fname = getenv("PDC_FONT"); pdc_font = SDL_LoadBMP(fname ? fname : "pdcfont.bmp"); } if (!pdc_font) pdc_font = SDL_LoadBMP_RW(SDL_RWFromMem(font437, sizeof(font437)), 0); if (!pdc_font) { fprintf(stderr, "Could not load font\n"); return ERR; } SP->mono = !pdc_font->format->palette; #endif if (!SP->mono && !pdc_back) { const char *bname = getenv("PDC_BACKGROUND"); pdc_back = SDL_LoadBMP(bname ? bname : "pdcback.bmp"); } if (!SP->mono && (pdc_back || !pdc_own_screen)) { SP->orig_attr = TRUE; SP->orig_fore = COLOR_WHITE; SP->orig_back = -1; } else SP->orig_attr = FALSE; #ifdef PDC_WIDE TTF_SizeText(pdc_ttffont, "W", &pdc_fwidth, &pdc_fheight); pdc_fthick = pdc_font_size / 20 + 1; #else pdc_fheight = pdc_font->h / 8; pdc_fwidth = pdc_font->w / 32; pdc_fthick = 1; if (!SP->mono) pdc_flastc = pdc_font->format->palette->ncolors - 1; #endif if (pdc_own_screen && !pdc_icon) { const char *iname = getenv("PDC_ICON"); pdc_icon = SDL_LoadBMP(iname ? iname : "pdcicon.bmp"); if (!pdc_icon) pdc_icon = SDL_LoadBMP_RW(SDL_RWFromMem(iconbmp, sizeof(iconbmp)), 0); if (pdc_icon) SDL_WM_SetIcon(pdc_icon, NULL); } if (pdc_own_screen) { const SDL_VideoInfo *info = SDL_GetVideoInfo(); max_height = info->current_h; max_width = info->current_w; const char *env = getenv("PDC_LINES"); pdc_sheight = (env ? atoi(env) : 25) * pdc_fheight; env = getenv("PDC_COLS"); pdc_swidth = (env ? atoi(env) : 80) * pdc_fwidth; pdc_screen = SDL_SetVideoMode(pdc_swidth, pdc_sheight, 0, SDL_SWSURFACE|SDL_ANYFORMAT|SDL_RESIZABLE); } else { if (!pdc_sheight) pdc_sheight = pdc_screen->h - pdc_yoffset; if (!pdc_swidth) pdc_swidth = pdc_screen->w - pdc_xoffset; } if (!pdc_screen) { fprintf(stderr, "Couldn't create a surface: %s\n", SDL_GetError()); return ERR; } if (SP->orig_attr) PDC_retile(); _initialize_colors(); SDL_EnableUNICODE(1); PDC_mouse_set(); if (pdc_own_screen) PDC_set_title(argc ? argv[0] : "PDCurses"); SP->lines = PDC_get_rows(); SP->cols = PDC_get_columns(); SP->mouse_wait = PDC_CLICK_PERIOD; SP->audible = FALSE; SP->termattrs = A_COLOR | A_UNDERLINE | A_LEFT | A_RIGHT | A_REVERSE; #ifdef PDC_WIDE SP->termattrs |= A_ITALIC; #endif PDC_reset_prog_mode(); return OK; }