Home | History | Annotate | Line # | Download | only in dab
      1 /*	$NetBSD: ttyscrn.cc,v 1.6 2021/12/05 09:22:45 rillig Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2003 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Christos Zoulas.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 /*
     33  * Curses screen implementation for dots
     34  */
     35 
     36 #include "defs.h"
     37 RCSID("$NetBSD: ttyscrn.cc,v 1.6 2021/12/05 09:22:45 rillig Exp $")
     38 
     39 #include <stdio.h>
     40 #include <curses.h>
     41 #include <sys/ioctl.h>
     42 
     43 #include "player.h"
     44 #include "ttyscrn.h"
     45 
     46 void TTYSCRN::clean(void)
     47 {
     48     clear();
     49 }
     50 
     51 void TTYSCRN::moveto(size_t y, size_t x)
     52 {
     53     move(y + TTYSCRN::offsy, x + TTYSCRN::offsx);
     54 }
     55 
     56 void TTYSCRN::addsym(const int sym)
     57 {
     58     addch(sym);
     59 }
     60 
     61 void TTYSCRN::addedge(const int sym)
     62 {
     63     int nsym;
     64 #ifdef A_ALTCHARSET
     65     if (_acs) {
     66 	switch (sym) {
     67 	case GS_HLINE:
     68 	    nsym = ACS_HLINE;
     69 	    break;
     70 	case GS_VLINE:
     71 	    nsym = ACS_VLINE;
     72 	    break;
     73 	case GS_ULCORNER:
     74 	    nsym = ACS_ULCORNER;
     75 	    break;
     76 	case GS_URCORNER:
     77 	    nsym = ACS_URCORNER;
     78 	    break;
     79 	case GS_LLCORNER:
     80 	    nsym = ACS_LLCORNER;
     81 	    break;
     82 	case GS_LRCORNER:
     83 	    nsym = ACS_LRCORNER;
     84 	    break;
     85 	case GS_LTEE:
     86 	    nsym = ACS_LTEE;
     87 	    break;
     88 	case GS_RTEE:
     89 	    nsym = ACS_RTEE;
     90 	    break;
     91 	case GS_TTEE:
     92 	    nsym = ACS_TTEE;
     93 	    break;
     94 	case GS_BTEE:
     95 	    nsym = ACS_BTEE;
     96 	    break;
     97 	case GS_PLUS:
     98 	    nsym = ACS_PLUS;
     99 	    break;
    100 	case ' ':
    101 	    addsym(' ');
    102 	    return;
    103 	default:
    104 	    ::abort();
    105 	}
    106 	attron(A_ALTCHARSET);
    107 	addch(nsym);
    108 	attroff(A_ALTCHARSET);
    109 	return;
    110     }
    111 #endif
    112     switch (sym) {
    113     case GS_HLINE:
    114 	nsym = '-';
    115 	break;
    116     case GS_VLINE:
    117 	nsym = '|';
    118 	break;
    119     case GS_ULCORNER:
    120 	nsym = '.';
    121 	break;
    122     case GS_URCORNER:
    123 	nsym = '.';
    124 	break;
    125     case GS_LLCORNER:
    126 	nsym = '.';
    127 	break;
    128     case GS_LRCORNER:
    129 	nsym = '.';
    130 	break;
    131     case GS_LTEE:
    132 	nsym = '.';
    133 	break;
    134     case GS_RTEE:
    135 	nsym = '.';
    136 	break;
    137     case GS_TTEE:
    138 	nsym = '.';
    139 	break;
    140     case GS_BTEE:
    141 	nsym = '.';
    142 	break;
    143     case GS_PLUS:
    144 	nsym = '+';
    145 	break;
    146     case ' ':
    147 	addsym(' ');
    148 	return;
    149     default:
    150 	::abort();
    151     }
    152     addsym(nsym);
    153 }
    154 
    155 void TTYSCRN::redraw(void)
    156 {
    157     refresh();
    158     doupdate();
    159 }
    160 
    161 void TTYSCRN::bell(void)
    162 {
    163     putc('\007', stdout);
    164 }
    165 
    166 int TTYSCRN::getinput(void)
    167 {
    168     return getch();
    169 }
    170 
    171 void TTYSCRN::score(size_t s, const PLAYER& p)
    172 {
    173     mvwprintw(stdscr, _sy + s + TTYSCRN::offsscore, _sx, "S %c:%5zd", p.getWho(),
    174 	      p.getScore());
    175 }
    176 
    177 void TTYSCRN::total(size_t s, const PLAYER& p)
    178 {
    179     mvwprintw(stdscr, _sy + s + TTYSCRN::offstotal, _sx, "T %c:%5zd", p.getWho(),
    180 	      p.getTotal());
    181 }
    182 
    183 void TTYSCRN::games(size_t s, const PLAYER& p)
    184 {
    185     mvwprintw(stdscr, _sy + s + TTYSCRN::offsgames, _sx, "G %c:%5zd", p.getWho(),
    186 	      p.getGames());
    187 }
    188 
    189 void TTYSCRN::ties(const PLAYER& p)
    190 {
    191     mvwprintw(stdscr, _sy + TTYSCRN::offsties, _sx, "G =:%5zd", p.getTies());
    192 }
    193 
    194 TTYSCRN* TTYSCRN::create(int acs, size_t *y, size_t *x)
    195 {
    196     int tx, ty;
    197 
    198     initscr();
    199 
    200     tx = getmaxx(stdscr);
    201     ty = getmaxy(stdscr);
    202 
    203     if (tx == ERR || ty == ERR
    204 	|| static_cast<size_t>(tx) < *x * 2 + TTYSCRN::offsx + 14
    205 	|| static_cast<size_t>(ty) < *y * 2 + TTYSCRN::offsy) {
    206 	endwin();
    207 	return NULL;
    208     }
    209     if (*x == 0)
    210 	*x = (tx - 14 - TTYSCRN::offsx) / 2;
    211     if (*y == 0)
    212 	*y = (ty - TTYSCRN::offsy) / 2;
    213     cbreak();
    214     noecho();
    215 
    216 
    217     TTYSCRN* that = new TTYSCRN;
    218 
    219     that->_tx = tx;
    220     that->_ty = ty;
    221     that->_sx = tx - 12;
    222     that->_sy = TTYSCRN::offsy;
    223     that->_acs = acs;
    224 
    225     return that;
    226 }
    227 
    228 TTYSCRN::~TTYSCRN(void)
    229 {
    230     nocbreak();
    231     echo();
    232     endwin();
    233 }
    234