Ignore:
Timestamp:
Mar 7, 2006, 12:01:59 AM (15 years ago)
Author:
Sam Hocevar
Message:
  • Split caca/graphics.c into driver-specific files. Resize is currently broken, and event handling is not yet in the driver-specific files, but I will of course fix that later.
File:
1 edited

Legend:

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

    r536 r539  
    2929#endif
    3030
    31 #if defined(USE_SLANG)
    32 #   if defined(HAVE_SLANG_SLANG_H)
    33 #       include <slang/slang.h>
    34 #   else
    35 #       include <slang.h>
    36 #   endif
    37 #endif
    38 #if defined(USE_NCURSES)
    39 #   if defined(HAVE_NCURSES_H)
    40 #       include <ncurses.h>
    41 #   else
    42 #       include <curses.h>
    43 #   endif
    44 #endif
    45 #if defined(USE_CONIO)
    46 #   include <dos.h>
    47 #   include <conio.h>
    48 #endif
    49 #if defined(USE_X11)
    50 #   include <X11/Xlib.h>
    51 #endif
    52 #if defined(USE_WIN32)
    53 #   include <windows.h>
    54 #endif
    55 #if defined(USE_GL)
    56 #   include <GL/gl.h>
    57 #endif
    5831#include <stdlib.h>
    5932#include <string.h>
     
    6437#include "caca_internals.h"
    6538
    66 static void caca_init_driver(caca_t *kk);
     39static int caca_init_driver(caca_t *kk);
    6740static void caca_init_terminal(caca_t *kk);
    6841
    69 #if defined(USE_NCURSES)
    70 static mmask_t oldmask;
    71 #endif
    72 
    73 #if defined(USE_WIN32)
    74 static CONSOLE_CURSOR_INFO cci;
    75 #endif
    76 
    7742caca_t * caca_attach(cucul_t * qq)
    7843{
     44    int ret;
    7945    caca_t *kk = malloc(sizeof(caca_t));
    8046
    81 #if defined(USE_NCURSES)
    82     mmask_t newmask;
    83 #endif
    84 
    85     caca_init_driver(kk);
    86 
    87     if(kk->driver == CACA_DRIVER_NONE)
     47    ret = caca_init_driver(kk);
     48
     49    if(ret)
     50    {
     51        free(kk);
    8852        return NULL;
    89 
     53    }
     54
     55    qq->refcount++;
     56    kk->qq = qq;
     57
     58    /* Only for slang and ncurses */
    9059    caca_init_terminal(kk);
    9160
    92 #if defined(USE_SLANG)
    93     if(kk->driver == CACA_DRIVER_SLANG)
    94     {
    95         /* Initialise slang library */
    96         SLsig_block_signals();
    97         SLtt_get_terminfo();
    98 
    99         if(SLkp_init() == -1)
    100         {
    101             SLsig_unblock_signals();
    102             return NULL;
    103         }
    104 
    105         SLang_init_tty(-1, 0, 1);
    106 
    107         if(SLsmg_init_smg() == -1)
    108         {
    109             SLsig_unblock_signals();
    110             return NULL;
    111         }
    112 
    113         SLsig_unblock_signals();
    114 
    115         SLsmg_cls();
    116         SLtt_set_cursor_visibility(0);
    117         SLkp_define_keysym("\e[M", 1001);
    118         SLtt_set_mouse_mode(1, 0);
    119         SLsmg_refresh();
    120 
    121         /* Disable scrolling so that hashmap scrolling optimization code
    122          * does not cause ugly refreshes due to slow terminals */
    123         SLtt_Term_Cannot_Scroll = 1;
    124     }
    125     else
    126 #endif
    127 #if defined(USE_NCURSES)
    128     if(kk->driver == CACA_DRIVER_NCURSES)
    129     {
    130         initscr();
    131         keypad(stdscr, TRUE);
    132         nonl();
    133         raw();
    134         noecho();
    135         nodelay(stdscr, TRUE);
    136         curs_set(0);
    137 
    138         /* Activate mouse */
    139         newmask = REPORT_MOUSE_POSITION | ALL_MOUSE_EVENTS;
    140         mousemask(newmask, &oldmask);
    141         mouseinterval(-1); /* No click emulation */
    142 
    143         /* Set the escape delay to a ridiculously low value */
    144         ESCDELAY = 10;
    145     }
    146     else
    147 #endif
    148 #if defined(USE_CONIO)
    149     if(kk->driver == CACA_DRIVER_CONIO)
    150     {
    151         _wscroll = 0;
    152         _setcursortype(_NOCURSOR);
    153         clrscr();
    154     }
    155     else
    156 #endif
    157 #if defined(USE_X11)
    158     if(kk->driver == CACA_DRIVER_X11)
    159     {
    160         /* Nothing to do */
    161         kk->x11.event_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask
    162               | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask
    163               | ExposureMask;
    164     }
    165     else
    166 #endif
    167 #if defined(USE_WIN32)
    168     if(kk->driver == CACA_DRIVER_WIN32)
    169     {
    170         /* This call is allowed to fail in case we already have a console */
    171         AllocConsole();
    172 
    173         kk->win32.hin = GetStdHandle(STD_INPUT_HANDLE);
    174         kk->win32.hout = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE,
    175                                     FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
    176                                     OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    177 
    178         if(kk->win32.hout == INVALID_HANDLE_VALUE)
    179             return NULL;
    180 
    181         GetConsoleCursorInfo(kk->win32.hout, &cci);
    182         cci.bVisible = FALSE;
    183         SetConsoleCursorInfo(kk->win32.hout, &cci);
    184 
    185         SetConsoleMode(kk->win32.hout, ENABLE_MOUSE_INPUT);
    186     }
    187     else
    188 #endif
    189 #if defined(USE_GL)
    190     if(kk->driver == CACA_DRIVER_GL)
    191     {
    192         /* Nothing to do */
    193     }
    194     else
    195 #endif
    196     {
    197         /* Dummy */
     61    if(_caca_init_graphics(kk))
     62    {
     63        qq->refcount--;
     64        free(kk);
     65        return NULL;
    19866    }
    19967
     
    20573    kk->events.last_key = 0;
    20674
    207     qq->refcount++;
    208     kk->qq = qq;
    209 
    21075    kk->timer.last_sec = 0;
    21176    kk->timer.last_usec = 0;
     
    21580    kk->resize_event = 0;
    21681
    217     if(_caca_init_graphics(kk))
    218         return NULL;
    219 
    22082    return kk;
    22183}
     
    22385void caca_detach(caca_t *kk)
    22486{
    225     _caca_end_graphics(kk);
    226 
    227 #if defined(USE_SLANG)
    228     if(kk->driver == CACA_DRIVER_SLANG)
    229     {
    230         SLtt_set_mouse_mode(0, 0);
    231         SLtt_set_cursor_visibility(1);
    232         SLang_reset_tty();
    233         SLsmg_reset_smg();
    234     }
    235     else
    236 #endif
    237 #if defined(USE_NCURSES)
    238     if(kk->driver == CACA_DRIVER_NCURSES)
    239     {
    240         mousemask(oldmask, NULL);
    241         curs_set(1);
    242         noraw();
    243         endwin();
    244     }
    245     else
    246 #endif
    247 #if defined(USE_CONIO)
    248     if(kk->driver == CACA_DRIVER_CONIO)
    249     {
    250         _wscroll = 1;
    251         textcolor((enum COLORS)WHITE);
    252         textbackground((enum COLORS)BLACK);
    253         gotoxy(_caca_width, _caca_height);
    254         cputs("\r\n");
    255         _setcursortype(_NORMALCURSOR);
    256     }
    257     else
    258 #endif
    259 #if defined(USE_X11)
    260     if(kk->driver == CACA_DRIVER_X11)
    261     {
    262         /* Nothing to do */
    263     }
    264     else
    265 #endif
    266 #if defined(USE_WIN32)
    267     if(kk->driver == CACA_DRIVER_WIN32)
    268     {
    269         SetConsoleTextAttribute(kk->win32.hout, FOREGROUND_INTENSITY
    270                                                  | FOREGROUND_RED
    271                                                  | FOREGROUND_GREEN
    272                                                  | FOREGROUND_BLUE);
    273         cci.bVisible = TRUE;
    274         SetConsoleCursorInfo(kk->win32.hout, &cci);
    275         CloseHandle(kk->win32.hout);
    276     }
    277     else
    278 #endif
    279 #if defined(USE_GL)
    280     if(kk->driver == CACA_DRIVER_GL)
    281     {
    282         /* Nothing to do */
    283     }
    284     else
    285 #endif
    286     {
    287         /* Dummy */
    288     }
    289 
     87    kk->driver.end_graphics(kk);
    29088    kk->qq->refcount--;
    291 
    29289    free(kk);
    29390}
     
    29794 */
    29895
    299 static void caca_init_driver(caca_t *kk)
     96static int caca_init_driver(caca_t *kk)
    30097{
    30198#if defined(HAVE_GETENV) && defined(HAVE_STRCASECMP)
     
    307104#if defined(USE_WIN32)
    308105        if(!strcasecmp(var, "win32"))
    309             kk->driver = CACA_DRIVER_WIN32;
     106            win32_init_driver(kk);
    310107        else
    311108#endif
    312109#if defined(USE_CONIO)
    313110        if(!strcasecmp(var, "conio"))
    314             kk->driver = CACA_DRIVER_CONIO;
     111            conio_init_driver(kk);
    315112        else
    316113#endif
    317114#if defined(USE_X11)
    318115        if(!strcasecmp(var, "x11"))
    319             kk->driver = CACA_DRIVER_X11;
     116            x11_init_driver(kk);
    320117        else
    321118#endif
    322119#if defined(USE_GL)
    323120        if(!strcasecmp(var, "gl"))
    324             kk->driver = CACA_DRIVER_GL;
     121            gl_init_driver(kk);
    325122        else
    326123#endif
    327124#if defined(USE_SLANG)
    328125        if(!strcasecmp(var, "slang"))
    329             kk->driver = CACA_DRIVER_SLANG;
     126            slang_init_driver(kk);
    330127        else
    331128#endif
    332129#if defined(USE_NCURSES)
    333130        if(!strcasecmp(var, "ncurses"))
    334             kk->driver = CACA_DRIVER_NCURSES;
    335         else
    336 #endif
    337 
    338             kk->driver = CACA_DRIVER_NONE;
    339 
    340         return;
     131            ncurses_init_driver(kk);
     132        else
     133#endif
     134            return -1;
     135
     136        return 0;
    341137    }
    342138#endif
    343139
    344140#if defined(USE_WIN32)
    345     kk->driver = CACA_DRIVER_WIN32;
    346     return;
     141    win32_init_driver(kk);
     142    return 0;
    347143#endif
    348144#if defined(USE_CONIO)
    349     kk->driver = CACA_DRIVER_CONIO;
    350     return;
     145    conio_init_driver(kk);
     146    return 0;
    351147#endif
    352148#if defined(USE_X11)
     
    355151#endif
    356152    {
    357         kk->driver = CACA_DRIVER_X11;
    358         return;
     153        x11_init_driver(kk);
     154        return 0;
    359155    }
    360156#endif
     
    364160#endif
    365161    {
    366         kk->driver = CACA_DRIVER_GL;
    367         return;
     162        gl_init_driver(kk);
     163        return 0;
    368164    }
    369165#endif
    370166#if defined(USE_SLANG)
    371     kk->driver = CACA_DRIVER_SLANG;
    372     return;
    373 #endif
    374 #if defined(USE_NCURSES)
    375     kk->driver = CACA_DRIVER_NCURSES;
    376     return;
    377 #endif
    378 
    379     kk->driver = CACA_DRIVER_NONE;
    380     return;
     167    slang_init_driver(kk);
     168    return 0;
     169#endif
     170#if defined(USE_NCURSES)
     171    slang_init_driver(kk);
     172    return 0;
     173#endif
     174
     175    return -1;
    381176}
    382177
     
    389184
    390185#if defined(USE_SLANG)
    391     if(kk->driver != CACA_DRIVER_SLANG)
    392 #endif
    393 #if defined(USE_NCURSES)
    394     if(kk->driver != CACA_DRIVER_NCURSES)
     186    if(kk->driver.driver != CACA_DRIVER_SLANG)
     187#endif
     188#if defined(USE_NCURSES)
     189    if(kk->driver.driver != CACA_DRIVER_NCURSES)
    395190#endif
    396191    return;
     
    407202        {
    408203#if defined(USE_NCURSES)
    409             if(kk->driver == CACA_DRIVER_NCURSES)
     204            if(kk->driver.driver == CACA_DRIVER_NCURSES)
    410205            {
    411206                SCREEN *screen;
     
    425220        {
    426221#if defined(USE_NCURSES)
    427             if(kk->driver == CACA_DRIVER_NCURSES)
     222            if(kk->driver.driver == CACA_DRIVER_NCURSES)
    428223            {
    429224                SCREEN *screen;
Note: See TracChangeset for help on using the changeset viewer.