X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftinfo%2Ftinfo_driver.c;h=84611c83b46be3440dae795af3a178a2b8e8fc7f;hp=589df2e036a3beb788a5a026a784ced320921d97;hb=dff527f594001b2aed593868bd7774c86eec813d;hpb=c002077d39fa24ddfe33793eb22942d9518da6fd diff --git a/ncurses/tinfo/tinfo_driver.c b/ncurses/tinfo/tinfo_driver.c index 589df2e0..84611c83 100644 --- a/ncurses/tinfo/tinfo_driver.c +++ b/ncurses/tinfo/tinfo_driver.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 2008-2010,2011 Free Software Foundation, Inc. * + * Copyright (c) 2008-2012,2013 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -50,7 +50,7 @@ # endif #endif -MODULE_ID("$Id: tinfo_driver.c,v 1.15 2011/08/13 16:11:15 tom Exp $") +MODULE_ID("$Id: tinfo_driver.c,v 1.30 2013/05/25 20:16:46 tom Exp $") /* * SCO defines TIOCGSIZE and the corresponding struct. Other systems (SunOS, @@ -93,7 +93,7 @@ NCURSES_EXPORT_VAR(int) COLORS = 0; #define TCBMAGIC NCDRV_MAGIC(NCDRV_TINFO) #define AssertTCB() assert(TCB!=0 && TCB->magic==TCBMAGIC) -#define SetSP() assert(TCB->csp!=0); sp = TCB->csp +#define SetSP() assert(TCB->csp!=0); sp = TCB->csp; (void) sp /* * This routine needs to do all the work to make curscr look @@ -119,7 +119,7 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret) sp = TCB->csp; TCB->magic = TCBMAGIC; -#if (USE_DATABASE || USE_TERMCAP) +#if (NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP) status = _nc_setup_tinfo(tname, &termp->type); #else status = TGETENT_NO; @@ -145,7 +145,7 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret) } result = TRUE; #if !USE_REENTRANT - strncpy(ttytype, termp->type.term_names, NAMESIZE - 1); + strncpy(ttytype, termp->type.term_names, (size_t) NAMESIZE - 1); ttytype[NAMESIZE - 1] = '\0'; #endif @@ -173,7 +173,7 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret) } static int -drv_dobeepflash(TERMINAL_CONTROL_BLOCK * TCB, bool beepFlag) +drv_dobeepflash(TERMINAL_CONTROL_BLOCK * TCB, int beepFlag) { SCREEN *sp; int res = ERR; @@ -184,22 +184,18 @@ drv_dobeepflash(TERMINAL_CONTROL_BLOCK * TCB, bool beepFlag) /* FIXME: should make sure that we are not in altchar mode */ if (beepFlag) { if (bell) { - res = NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "bell", bell); + res = NCURSES_PUTP2("bell", bell); NCURSES_SP_NAME(_nc_flush) (sp); } else if (flash_screen) { - res = NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx - "flash_screen", - flash_screen); + res = NCURSES_PUTP2("flash_screen", flash_screen); NCURSES_SP_NAME(_nc_flush) (sp); } } else { if (flash_screen) { - res = NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx - "flash_screen", - flash_screen); + res = NCURSES_PUTP2("flash_screen", flash_screen); NCURSES_SP_NAME(_nc_flush) (sp); } else if (bell) { - res = NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "bell", bell); + res = NCURSES_PUTP2("bell", bell); NCURSES_SP_NAME(_nc_flush) (sp); } } @@ -271,7 +267,7 @@ drv_defaultcolors(TERMINAL_CONTROL_BLOCK * TCB, int fg, int bg) static void drv_setcolor(TERMINAL_CONTROL_BLOCK * TCB, - bool fore, + int fore, int color, NCURSES_SP_OUTC outc) { @@ -315,7 +311,7 @@ drv_rescol(TERMINAL_CONTROL_BLOCK * TCB) SetSP(); if (orig_pair != 0) { - NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "orig_pair", orig_pair); + NCURSES_PUTP2("orig_pair", orig_pair); result = TRUE; } return result; @@ -331,7 +327,7 @@ drv_rescolors(TERMINAL_CONTROL_BLOCK * TCB) SetSP(); if (orig_colors != 0) { - NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "orig_colors", orig_colors); + NCURSES_PUTP2("orig_colors", orig_colors); result = TRUE; } return result; @@ -342,14 +338,18 @@ drv_size(TERMINAL_CONTROL_BLOCK * TCB, int *linep, int *colp) { SCREEN *sp; bool useEnv = TRUE; + bool useTioctl = TRUE; AssertTCB(); sp = TCB->csp; /* can be null here */ if (sp) { useEnv = sp->_use_env; - } else + useTioctl = sp->_use_tioctl; + } else { useEnv = _nc_prescreen.use_env; + useTioctl = _nc_prescreen.use_tioctl; + } /* figure out the size of the screen */ T(("screen size: terminfo lines = %d columns = %d", lines, columns)); @@ -357,7 +357,7 @@ drv_size(TERMINAL_CONTROL_BLOCK * TCB, int *linep, int *colp) *linep = (int) lines; *colp = (int) columns; - if (useEnv) { + if (useEnv || useTioctl) { int value; #ifdef __EMX__ @@ -365,7 +365,9 @@ drv_size(TERMINAL_CONTROL_BLOCK * TCB, int *linep, int *colp) int screendata[2]; _scrsize(screendata); *colp = screendata[0]; - *linep = screendata[1]; + *linep = ((sp != 0 && sp->_filtered) + ? 1 + : screendata[1]); T(("EMX screen size: environment LINES = %d COLUMNS = %d", *linep, *colp)); } @@ -394,19 +396,33 @@ drv_size(TERMINAL_CONTROL_BLOCK * TCB, int *linep, int *colp) } #endif /* HAVE_SIZECHANGE */ - /* - * Finally, look for environment variables. - * - * Solaris lets users override either dimension with an environment - * variable. - */ - if ((value = _nc_getenv_num("LINES")) > 0) { - *linep = value; - T(("screen size: environment LINES = %d", *linep)); - } - if ((value = _nc_getenv_num("COLUMNS")) > 0) { - *colp = value; - T(("screen size: environment COLUMNS = %d", *colp)); + if (useEnv) { + if (useTioctl) { + /* + * If environment variables are used, update them. + */ + if ((sp == 0 || !sp->_filtered) && _nc_getenv_num("LINES") > 0) { + _nc_setenv_num("LINES", *linep); + } + if (_nc_getenv_num("COLUMNS") > 0) { + _nc_setenv_num("COLUMNS", *colp); + } + } + + /* + * Finally, look for environment variables. + * + * Solaris lets users override either dimension with an environment + * variable. + */ + if ((value = _nc_getenv_num("LINES")) > 0) { + *linep = value; + T(("screen size: environment LINES = %d", *linep)); + } + if ((value = _nc_getenv_num("COLUMNS")) > 0) { + *colp = value; + T(("screen size: environment COLUMNS = %d", *colp)); + } } /* if we can't get dynamic info about the size, use static */ @@ -457,7 +473,7 @@ drv_setsize(TERMINAL_CONTROL_BLOCK * TCB, int l, int c) } static int -drv_sgmode(TERMINAL_CONTROL_BLOCK * TCB, bool setFlag, TTY * buf) +drv_sgmode(TERMINAL_CONTROL_BLOCK * TCB, int setFlag, TTY * buf) { SCREEN *sp = TCB->csp; TERMINAL *_term = (TERMINAL *) TCB; @@ -491,7 +507,7 @@ drv_sgmode(TERMINAL_CONTROL_BLOCK * TCB, bool setFlag, TTY * buf) } static int -drv_mode(TERMINAL_CONTROL_BLOCK * TCB, bool progFlag, bool defFlag) +drv_mode(TERMINAL_CONTROL_BLOCK * TCB, int progFlag, int defFlag) { SCREEN *sp; TERMINAL *_term = (TERMINAL *) TCB; @@ -614,15 +630,13 @@ drv_screen_init(SCREEN *sp) static void drv_init(TERMINAL_CONTROL_BLOCK * TCB) { - SCREEN *sp; TERMINAL *trm; AssertTCB(); trm = (TERMINAL *) TCB; - sp = TCB->csp; - TCB->info.initcolor = initialize_color; + TCB->info.initcolor = VALID_STRING(initialize_color); TCB->info.canchange = can_change; TCB->info.hascolor = ((VALID_NUMERIC(max_colors) && VALID_NUMERIC(max_pairs) && (((set_foreground != NULL) @@ -659,7 +673,7 @@ drv_init(TERMINAL_CONTROL_BLOCK * TCB) #define InPalette(n) ((n) >= 0 && (n) < MAX_PALETTE) static void -drv_initpair(TERMINAL_CONTROL_BLOCK * TCB, short pair, short f, short b) +drv_initpair(TERMINAL_CONTROL_BLOCK * TCB, int pair, int f, int b) { SCREEN *sp; @@ -675,12 +689,11 @@ drv_initpair(TERMINAL_CONTROL_BLOCK * TCB, short pair, short f, short b) tp[f].red, tp[f].green, tp[f].blue, tp[b].red, tp[b].green, tp[b].blue)); - NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx - "initialize_pair", - TPARM_7(initialize_pair, - pair, - tp[f].red, tp[f].green, tp[f].blue, - tp[b].red, tp[b].green, tp[b].blue)); + NCURSES_PUTP2("initialize_pair", + TPARM_7(initialize_pair, + pair, + tp[f].red, tp[f].green, tp[f].blue, + tp[b].red, tp[b].green, tp[b].blue)); } } @@ -706,23 +719,22 @@ default_bg(SCREEN *sp) static void drv_initcolor(TERMINAL_CONTROL_BLOCK * TCB, - short color, short r, short g, short b) + int color, int r, int g, int b) { SCREEN *sp = TCB->csp; AssertTCB(); if (initialize_color != NULL) { - NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx - "initialize_color", - TPARM_4(initialize_color, color, r, g, b)); + NCURSES_PUTP2("initialize_color", + TPARM_4(initialize_color, color, r, g, b)); } } static void drv_do_color(TERMINAL_CONTROL_BLOCK * TCB, - short old_pair, - short pair, - bool reverse, + int old_pair, + int pair, + int reverse, NCURSES_SP_OUTC outc) { SCREEN *sp = TCB->csp; @@ -753,7 +765,7 @@ drv_do_color(TERMINAL_CONTROL_BLOCK * TCB, if (old_pair >= 0 && sp != 0 && NCURSES_SP_NAME(pair_content) (NCURSES_SP_ARGx - old_pair, + (short) old_pair, &old_fg, &old_bg) !=ERR) { if ((isDefaultColor(fg) && !isDefaultColor(old_fg)) @@ -839,7 +851,9 @@ drv_initmouse(TERMINAL_CONTROL_BLOCK * TCB) } static int -drv_testmouse(TERMINAL_CONTROL_BLOCK * TCB, int delay) +drv_testmouse(TERMINAL_CONTROL_BLOCK * TCB, + int delay + EVENTLIST_2nd(_nc_eventlist * evl)) { int rc = 0; SCREEN *sp; @@ -876,7 +890,7 @@ drv_mvcur(TERMINAL_CONTROL_BLOCK * TCB, int yold, int xold, int ynew, int xnew) { SCREEN *sp = TCB->csp; AssertTCB(); - return TINFO_MVCUR(sp, yold, xold, ynew, xnew); + return NCURSES_SP_NAME(_nc_mvcur) (sp, yold, xold, ynew, xnew); } static void @@ -886,22 +900,21 @@ drv_hwlabel(TERMINAL_CONTROL_BLOCK * TCB, int labnum, char *text) AssertTCB(); if (labnum > 0 && labnum <= num_labels) { - NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx - "plab_norm", - TPARM_2(plab_norm, labnum, text)); + NCURSES_PUTP2("plab_norm", + TPARM_2(plab_norm, labnum, text)); } } static void -drv_hwlabelOnOff(TERMINAL_CONTROL_BLOCK * TCB, bool OnFlag) +drv_hwlabelOnOff(TERMINAL_CONTROL_BLOCK * TCB, int OnFlag) { SCREEN *sp = TCB->csp; AssertTCB(); if (OnFlag) { - NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "label_on", label_on); + NCURSES_PUTP2("label_on", label_on); } else { - NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "label_off", label_off); + NCURSES_PUTP2("label_off", label_off); } } @@ -966,7 +979,7 @@ drv_initacs(TERMINAL_CONTROL_BLOCK * TCB, chtype *real_map, chtype *fake_map) AssertTCB(); assert(sp != 0); if (ena_acs != NULL) { - NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "ena_acs", ena_acs); + NCURSES_PUTP2("ena_acs", ena_acs); } #if NCURSES_EXT_FUNCS /* @@ -1170,7 +1183,7 @@ drv_read(TERMINAL_CONTROL_BLOCK * TCB, int *buf) if ((pthread_self) && (pthread_kill) && (pthread_equal)) _nc_globals.read_thread = pthread_self(); # endif - n = read(sp->_ifd, &c2, 1); + n = read(sp->_ifd, &c2, (size_t) 1); #if USE_PTHREADS_EINTR _nc_globals.read_thread = 0; #endif @@ -1203,7 +1216,7 @@ __nc_putp(SCREEN *sp, const char *name GCC_UNUSED, const char *value) int rc = ERR; if (value) { - rc = NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx name, value); + rc = NCURSES_PUTP2(name, value); } return rc; } @@ -1219,7 +1232,7 @@ __nc_putp_flush(SCREEN *sp, const char *name, const char *value) } static int -drv_kpad(TERMINAL_CONTROL_BLOCK * TCB, bool flag) +drv_kpad(TERMINAL_CONTROL_BLOCK * TCB, int flag) { int ret = ERR; SCREEN *sp; @@ -1245,7 +1258,7 @@ drv_kpad(TERMINAL_CONTROL_BLOCK * TCB, bool flag) } static int -drv_keyok(TERMINAL_CONTROL_BLOCK * TCB, int c, bool flag) +drv_keyok(TERMINAL_CONTROL_BLOCK * TCB, int c, int flag) { SCREEN *sp; int code = ERR; @@ -1258,7 +1271,8 @@ drv_keyok(TERMINAL_CONTROL_BLOCK * TCB, int c, bool flag) if (c >= 0) { unsigned ch = (unsigned) c; if (flag) { - while ((s = _nc_expand_try(sp->_key_ok, ch, &count, 0)) != 0 + while ((s = _nc_expand_try(sp->_key_ok, + ch, &count, (size_t) 0)) != 0 && _nc_remove_key(&(sp->_key_ok), ch)) { code = _nc_add_to_try(&(sp->_keytry), s, ch); free(s); @@ -1267,7 +1281,8 @@ drv_keyok(TERMINAL_CONTROL_BLOCK * TCB, int c, bool flag) break; } } else { - while ((s = _nc_expand_try(sp->_keytry, ch, &count, 0)) != 0 + while ((s = _nc_expand_try(sp->_keytry, + ch, &count, (size_t) 0)) != 0 && _nc_remove_key(&(sp->_keytry), ch)) { code = _nc_add_to_try(&(sp->_key_ok), s, ch); free(s);