Ignore:
Timestamp:
Dec 22, 2003, 4:26:12 PM (17 years ago)
Author:
Sam Hocevar
Message:
  • src/graphics.c src/caca.c src/io.c: + Support for simultaneously compiled-in drivers. + Honour the CACA_DRIVER environment variable.
  • configure.ac: + Drivers are no longer mutually exclusive.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/src/caca.c

    r257 r265  
    3434#if defined(USE_SLANG)
    3535#   include <slang.h>
    36 #elif defined(USE_NCURSES)
     36#endif
     37#if defined(USE_NCURSES)
    3738#   include <curses.h>
    38 #elif defined(USE_CONIO)
     39#endif
     40#if defined(USE_CONIO)
    3941#   include <dos.h>
    4042#   include <conio.h>
    41 #elif defined(USE_X11)
     43#endif
     44#if defined(USE_X11)
    4245#   include <X11/Xlib.h>
    43 #else
    44 #   error "no graphics library detected"
    4546#endif
    4647
     
    5152#include "caca_internals.h"
    5253
     54static void caca_init_driver(void);
    5355static void caca_init_features(void);
    5456static void caca_init_terminal(void);
    5557
     58enum caca_driver _caca_driver;
     59
    5660#if defined(USE_NCURSES)
    5761static mmask_t oldmask;
     
    6872    mmask_t newmask;
    6973#endif
     74
     75    caca_init_driver();
     76
     77    if(_caca_driver == CACA_DRIVER_NONE)
     78        return -1;
    7079
    7180    caca_init_features();
     
    7382
    7483#if defined(USE_SLANG)
    75     /* Initialize slang library */
    76     SLsig_block_signals();
    77     SLtt_get_terminfo();
    78 
    79     if(SLkp_init() == -1)
    80     {
     84    if(_caca_driver == CACA_DRIVER_SLANG)
     85    {
     86        /* Initialise slang library */
     87        SLsig_block_signals();
     88        SLtt_get_terminfo();
     89
     90        if(SLkp_init() == -1)
     91        {
     92            SLsig_unblock_signals();
     93            return -1;
     94        }
     95
     96        SLang_init_tty(-1, 0, 1);
     97
     98        if(SLsmg_init_smg() == -1)
     99        {
     100            SLsig_unblock_signals();
     101            return -1;
     102        }
     103
    81104        SLsig_unblock_signals();
    82         return -1;
    83     }
    84 
    85     SLang_init_tty(-1, 0, 1);
    86 
    87     if(SLsmg_init_smg() == -1)
    88     {
    89         SLsig_unblock_signals();
    90         return -1;
    91     }
    92 
    93     SLsig_unblock_signals();
    94 
    95     SLsmg_cls();
    96     SLtt_set_cursor_visibility(0);
    97     SLkp_define_keysym("\e[M", 1001);
    98     SLtt_set_mouse_mode(1, 0);
    99     SLsmg_refresh();
    100 
    101     /* Disable scrolling so that hashmap scrolling optimization code
    102      * does not cause ugly refreshes due to slow terminals */
    103     SLtt_Term_Cannot_Scroll = 1;
    104 
    105 #elif defined(USE_NCURSES)
    106     initscr();
    107     keypad(stdscr, TRUE);
    108     nonl();
    109     cbreak();
    110     noecho();
    111     nodelay(stdscr, TRUE);
    112     curs_set(0);
    113 
    114     /* Activate mouse */
    115     newmask = ALL_MOUSE_EVENTS;
    116     mousemask(newmask, &oldmask);
    117 
    118 #elif defined(USE_CONIO)
    119     _wscroll = 0;
    120     _setcursortype(_NOCURSOR);
    121     clrscr();
    122 
    123 #elif defined(USE_X11)
    124     /* Nothing to do */
    125 
    126 #endif
     105
     106        SLsmg_cls();
     107        SLtt_set_cursor_visibility(0);
     108        SLkp_define_keysym("\e[M", 1001);
     109        SLtt_set_mouse_mode(1, 0);
     110        SLsmg_refresh();
     111
     112        /* Disable scrolling so that hashmap scrolling optimization code
     113         * does not cause ugly refreshes due to slow terminals */
     114        SLtt_Term_Cannot_Scroll = 1;
     115    }
     116    else
     117#endif
     118#if defined(USE_NCURSES)
     119    if(_caca_driver == CACA_DRIVER_NCURSES)
     120    {
     121        initscr();
     122        keypad(stdscr, TRUE);
     123        nonl();
     124        cbreak();
     125        noecho();
     126        nodelay(stdscr, TRUE);
     127        curs_set(0);
     128
     129        /* Activate mouse */
     130        newmask = ALL_MOUSE_EVENTS;
     131        mousemask(newmask, &oldmask);
     132    }
     133    else
     134#endif
     135#if defined(USE_CONIO)
     136    if(_caca_driver == CACA_DRIVER_CONIO)
     137    {
     138        _wscroll = 0;
     139        _setcursortype(_NOCURSOR);
     140        clrscr();
     141    }
     142    else
     143#endif
     144#if defined(USE_X11)
     145    {
     146        /* Nothing to do */
     147    }
     148#endif
     149
    127150    if(_caca_init_graphics())
    128151        return -1;
     
    282305
    283306#if defined(USE_SLANG)
    284     SLtt_set_mouse_mode(0, 0);
    285     SLtt_set_cursor_visibility(1);
    286     SLang_reset_tty();
    287     SLsmg_reset_smg();
    288 #elif defined(USE_NCURSES)
    289     mousemask(oldmask, NULL);
    290     curs_set(1);
    291     endwin();
    292 #elif defined(USE_CONIO)
    293     _wscroll = 1;
    294     textcolor((enum COLORS)WHITE);
    295     textbackground((enum COLORS)BLACK);
    296     gotoxy(_caca_width, _caca_height);
    297     cputs("\r\n");
    298     _setcursortype(_NORMALCURSOR);
    299 #elif defined(USE_X11)
    300     /* Nothing to do */
    301 #endif
     307    if(_caca_driver == CACA_DRIVER_SLANG)
     308    {
     309        SLtt_set_mouse_mode(0, 0);
     310        SLtt_set_cursor_visibility(1);
     311        SLang_reset_tty();
     312        SLsmg_reset_smg();
     313    }
     314    else
     315#endif
     316#if defined(USE_NCURSES)
     317    if(_caca_driver == CACA_DRIVER_NCURSES)
     318    {
     319        mousemask(oldmask, NULL);
     320        curs_set(1);
     321        endwin();
     322    }
     323    else
     324#endif
     325#if defined(USE_CONIO)
     326    if(_caca_driver == USE_CONIO)
     327    {
     328        _wscroll = 1;
     329        textcolor((enum COLORS)WHITE);
     330        textbackground((enum COLORS)BLACK);
     331        gotoxy(_caca_width, _caca_height);
     332        cputs("\r\n");
     333        _setcursortype(_NORMALCURSOR);
     334    }
     335    else
     336#endif
     337#if defined(USE_X11)
     338    if(_caca_driver == USE_X11)
     339    {
     340        /* Nothing to do */
     341    }
     342#endif
     343}
     344
     345static void caca_init_driver(void)
     346{
     347#if defined(HAVE_GETENV) && defined(HAVE_STRCASECMP)
     348    char *var = getenv("CACA_DRIVER");
     349
     350    /* If the environment variable was set, use it */
     351    if(var && *var)
     352    {
     353#if defined(USE_CONIO)
     354        if(!strcasecmp(var, "conio"))
     355            _caca_driver = CACA_DRIVER_CONIO;
     356        else
     357#endif
     358#if defined(USE_NCURSES)
     359        if(!strcasecmp(var, "ncurses"))
     360            _caca_driver = CACA_DRIVER_NCURSES;
     361        else
     362#endif
     363#if defined(USE_SLANG)
     364        if(!strcasecmp(var, "slang"))
     365            _caca_driver = CACA_DRIVER_SLANG;
     366        else
     367#endif
     368#if defined(USE_X11)
     369        if(!strcasecmp(var, "x11"))
     370            _caca_driver = CACA_DRIVER_X11;
     371        else
     372#endif
     373        _caca_driver = CACA_DRIVER_NONE;
     374
     375        return;
     376    }
     377#endif
     378
     379#if defined(USE_CONIO)
     380    _caca_driver = CACA_DRIVER_CONIO;
     381    return;
     382#endif
     383#if defined(USE_NCURSES)
     384    _caca_driver = CACA_DRIVER_NCURSES;
     385    return;
     386#endif
     387#if defined(USE_SLANG)
     388    _caca_driver = CACA_DRIVER_SLANG;
     389    return;
     390#endif
     391#if defined(USE_X11)
     392    _caca_driver = CACA_DRIVER_X11;
     393    return;
     394#endif
     395    _caca_driver = CACA_DRIVER_NONE;
     396    return;
    302397}
    303398
     
    352447    char *term, *colorterm, *other;
    353448
     449    if(_caca_driver != CACA_DRIVER_NCURSES &&
     450       _caca_driver != CACA_DRIVER_SLANG)
     451        return;
     452
    354453    term = getenv("TERM");
    355454    colorterm = getenv("COLORTERM");
     
    361460        {
    362461#if defined(USE_NCURSES)
    363             SCREEN *screen;
    364             screen = newterm("xterm-16color", stdout, stdin);
    365             if(screen == NULL)
    366                 return;
    367             endwin();
     462            if(_caca_driver == USE_NCURSES)
     463            {
     464                SCREEN *screen;
     465                screen = newterm("xterm-16color", stdout, stdin);
     466                if(screen == NULL)
     467                    return;
     468                endwin();
     469            }
    368470#endif
    369471            (void)putenv("TERM=xterm-16color");
     
    376478        {
    377479#if defined(USE_NCURSES)
    378             SCREEN *screen;
    379             screen = newterm("xterm-16color", stdout, stdin);
    380             if(screen == NULL)
    381                 return;
    382             endwin();
     480            if(_caca_driver == USE_NCURSES)
     481            {
     482                SCREEN *screen;
     483                screen = newterm("xterm-16color", stdout, stdin);
     484                if(screen == NULL)
     485                    return;
     486                endwin();
     487            }
    383488#endif
    384489            (void)putenv("TERM=xterm-16color");
Note: See TracChangeset for help on using the changeset viewer.