Changeset 550


Ignore:
Timestamp:
Mar 8, 2006, 11:33:01 AM (15 years ago)
Author:
Sam Hocevar
Message:
  • Finished moving everything driver-specific to the apropriate driver_*.c files. Phew. Now they just need a few comments.
Location:
libcaca/trunk/caca
Files:
10 edited

Legend:

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

    r541 r550  
    3131
    3232static int caca_init_driver(caca_t *kk);
    33 static void caca_check_terminal(caca_t *kk);
    3433
    3534/** \brief Attach a caca graphical context to a cucul backend context.
     
    5554    }
    5655
    57     /* Only needed for slang and ncurses */
    58     caca_check_terminal(kk);
    59 
    60     if(kk->driver.init_graphics(kk))
     56    if(kk->drv.init_graphics(kk))
    6157    {
    6258        free(kk);
     
    10399void caca_detach(caca_t *kk)
    104100{
    105     kk->driver.end_graphics(kk);
     101    kk->drv.end_graphics(kk);
    106102    kk->qq->refcount--;
    107103    free(kk);
     
    194190}
    195191
    196 static void caca_check_terminal(caca_t *kk)
    197 {
    198 #if defined(HAVE_GETENV) && defined(HAVE_PUTENV) && \
    199      (defined(USE_SLANG) || defined(USE_NCURSES))
    200     char *term, *colorterm, *other;
    201 #endif
    202 
    203 #if defined(USE_SLANG)
    204     if(kk->driver.driver != CACA_DRIVER_SLANG)
    205 #endif
    206 #if defined(USE_NCURSES)
    207     if(kk->driver.driver != CACA_DRIVER_NCURSES)
    208 #endif
    209     return;
    210 
    211 #if defined(HAVE_GETENV) && defined(HAVE_PUTENV) && \
    212      (defined(USE_SLANG) || defined(USE_NCURSES))
    213     term = getenv("TERM");
    214     colorterm = getenv("COLORTERM");
    215 
    216     if(term && !strcmp(term, "xterm"))
    217     {
    218         /* If we are using gnome-terminal, it's really a 16 colour terminal */
    219         if(colorterm && !strcmp(colorterm, "gnome-terminal"))
    220         {
    221 #if defined(USE_NCURSES)
    222             if(kk->driver.driver == CACA_DRIVER_NCURSES)
    223             {
    224                 SCREEN *screen;
    225                 screen = newterm("xterm-16color", stdout, stdin);
    226                 if(screen == NULL)
    227                     return;
    228                 endwin();
    229             }
    230 #endif
    231             (void)putenv("TERM=xterm-16color");
    232             return;
    233         }
    234 
    235         /* Ditto if we are using Konsole */
    236         other = getenv("KONSOLE_DCOP_SESSION");
    237         if(other)
    238         {
    239 #if defined(USE_NCURSES)
    240             if(kk->driver.driver == CACA_DRIVER_NCURSES)
    241             {
    242                 SCREEN *screen;
    243                 screen = newterm("xterm-16color", stdout, stdin);
    244                 if(screen == NULL)
    245                     return;
    246                 endwin();
    247             }
    248 #endif
    249             (void)putenv("TERM=xterm-16color");
    250             return;
    251         }
    252     }
    253 #endif
    254 }
    255 
  • libcaca/trunk/caca/caca_internals.h

    r548 r550  
    2828typedef unsigned short uint16_t;
    2929typedef unsigned int uint32_t;
    30 #endif
    31 
    32 #if defined(USE_CONIO)
    33 #   include <conio.h>
    34 #endif
    35 #if defined(USE_GL)
    36 #   include <GL/glut.h>
    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_WIN32)
    46 #   include <windows.h>
    47 #endif
    48 #if defined(USE_X11)
    49 #   include <X11/Xlib.h>
    5030#endif
    5131
     
    10989    cucul_t *qq;
    11090
    111     struct driver
     91    struct drv
    11292    {
    11393        enum caca_driver driver;
     94        struct driver_private *p;
    11495
    11596        int (* init_graphics) (caca_t *);
     
    121102        void (* handle_resize) (caca_t *, unsigned int *, unsigned int *);
    122103        unsigned int (* get_event) (caca_t *);
    123     } driver;
     104    } drv;
    124105
    125106    //unsigned int width, height;
     
    146127#endif
    147128    } events;
    148 
    149     /* FIXME: maybe this should go away */
    150 #if defined(USE_X11) && !defined(_DOXYGEN_SKIP_ME)
    151     struct x11
    152     {
    153         Display *dpy;
    154         Window window;
    155         Pixmap pixmap;
    156         GC gc;
    157         long int event_mask;
    158         int font_width, font_height;
    159         unsigned int new_width, new_height;
    160         int colors[16];
    161         Font font;
    162         XFontStruct *font_struct;
    163         int font_offset;
    164 #if defined(HAVE_X11_XKBLIB_H)
    165         Bool autorepeat;
    166 #endif
    167     } x11;
    168 #endif
    169 #if defined(USE_NCURSES)
    170     struct ncurses
    171     {
    172         int attr[16*16];
    173         mmask_t oldmask;
    174     } ncurses;
    175 #endif
    176 #if defined(USE_CONIO)
    177     struct conio
    178     {
    179         struct text_info ti;
    180         char *screen;
    181     } conio;
    182 #endif
    183 #if defined(USE_WIN32)
    184     struct win32
    185     {
    186         HANDLE hin, hout;
    187         HANDLE front, back;
    188         CHAR_INFO *buffer;
    189         CONSOLE_CURSOR_INFO cci;
    190     } win32;
    191 #endif
    192 #if defined(USE_GL)
    193     struct gl
    194     {
    195         int window;
    196         unsigned int width, height;
    197         float font_width, font_height;
    198         float incx, incy;
    199         int id[94];
    200         unsigned char resized, bit;
    201         unsigned char mouse_changed, mouse_clicked;
    202         unsigned int mouse_x, mouse_y;
    203         unsigned int mouse_button, mouse_state;
    204 
    205         unsigned char key;
    206         int special_key;
    207         int new_width;
    208         int new_height;
    209 
    210         float sw, sh;
    211     } gl;
    212 #endif
    213129};
    214130
  • libcaca/trunk/caca/driver_conio.c

    r549 r550  
    2828#endif
    2929
     30#include <stdlib.h>
     31
    3032#include "caca.h"
    3133#include "caca_internals.h"
     
    3335#include "cucul_internals.h"
    3436
     37struct driver_private
     38{
     39    struct text_info ti;
     40    char *screen;
     41};
     42
    3543static int conio_init_graphics(caca_t *kk)
    3644{
     45    kk->drv.p = malloc(sizeof(struct driver_private));
     46
    3747    _wscroll = 0;
    3848    _setcursortype(_NOCURSOR);
    3949    clrscr();
    4050
    41     gettextinfo(&kk->conio.ti);
    42     kk->conio.screen = malloc(2 * kk->conio.ti.screenwidth
    43                                 * kk->conio.ti.screenheight * sizeof(char));
    44     if(kk->conio.screen == NULL)
     51    gettextinfo(&kk->drv.p->ti);
     52    kk->drv.p->screen = malloc(2 * kk->drv.p->ti.screenwidth
     53                                 * kk->drv.p->ti.screenheight * sizeof(char));
     54    if(kk->drv.p->screen == NULL)
    4555        return -1;
    4656#   if defined(SCREENUPDATE_IN_PC_H)
    47     ScreenRetrieve(kk->conio.screen);
     57    ScreenRetrieve(kk->drv.p->screen);
    4858#   else
    4959    /* FIXME */
    5060#   endif
    51     cucul_set_size(kk->qq, kk->conio.ti.screenwidth,
    52                            kk->conio.ti.screenheight);
     61    cucul_set_size(kk->qq, kk->drv.p->ti.screenwidth,
     62                           kk->drv.p->ti.screenheight);
    5363    return 0;
    5464}
     
    6373    _setcursortype(_NORMALCURSOR);
    6474
    65     free(kk->conio.screen);
     75    free(kk->drv.p->screen);
     76    free(kk->drv.p);
    6677
    6778    return 0;
     
    8899{
    89100    int n;
    90     char *screen = kk->conio.screen;
     101    char *screen = kk->drv.p->screen;
    91102    uint8_t *attr = kk->qq->attr;
    92103    uint32_t *chars = kk->qq->chars;
     
    97108    }
    98109#   if defined(SCREENUPDATE_IN_PC_H)
    99     ScreenUpdate(kk->conio.screen);
     110    ScreenUpdate(kk->drv.p->screen);
    100111#   else
    101112    /* FIXME */
     
    128139void conio_init_driver(caca_t *kk)
    129140{
    130     kk->driver.driver = CACA_DRIVER_CONIO;
     141    kk->drv.driver = CACA_DRIVER_CONIO;
    131142
    132     kk->driver.init_graphics = conio_init_graphics;
    133     kk->driver.end_graphics = conio_end_graphics;
    134     kk->driver.set_window_title = conio_set_window_title;
    135     kk->driver.get_window_width = conio_get_window_width;
    136     kk->driver.get_window_height = conio_get_window_height;
    137     kk->driver.display = conio_display;
    138     kk->driver.handle_resize = conio_handle_resize;
    139     kk->driver.get_event = conio_get_event;
     143    kk->drv.init_graphics = conio_init_graphics;
     144    kk->drv.end_graphics = conio_end_graphics;
     145    kk->drv.set_window_title = conio_set_window_title;
     146    kk->drv.get_window_width = conio_get_window_width;
     147    kk->drv.get_window_height = conio_get_window_height;
     148    kk->drv.display = conio_display;
     149    kk->drv.handle_resize = conio_handle_resize;
     150    kk->drv.get_event = conio_get_event;
    140151}
    141152
  • libcaca/trunk/caca/driver_gl.c

    r549 r550  
    2828#include <string.h>
    2929#include <stdlib.h>
     30#include <stdio.h>
    3031
    3132#include "caca.h"
     
    7172static void gl_handle_mouse_motion(int, int);
    7273
     74struct driver_private
     75{
     76    int window;
     77    unsigned int width, height;
     78    float font_width, font_height;
     79    float incx, incy;
     80    int id[94];
     81    unsigned char resized, bit;
     82    unsigned char mouse_changed, mouse_clicked;
     83    unsigned int mouse_x, mouse_y;
     84    unsigned int mouse_button, mouse_state;
     85
     86    unsigned char key;
     87    int special_key;
     88    int new_width;
     89    int new_height;
     90
     91    float sw, sh;
     92};
     93
    7394static int gl_init_graphics(caca_t *kk)
    7495{
     
    80101    int i;
    81102
     103    kk->drv.p = malloc(sizeof(struct driver_private));
     104
    82105    gl_kk = kk;
    83106
     
    89112        cucul_set_size(kk->qq, width, height);
    90113
    91     kk->gl.font_width = 9;
    92     kk->gl.font_height = 15;
    93 
    94     kk->gl.width = kk->qq->width * kk->gl.font_width;
    95     kk->gl.height = kk->qq->height * kk->gl.font_height;
    96 
    97     kk->gl.resized = 0;
    98     kk->gl.bit = 0;
    99 
    100     kk->gl.mouse_changed = kk->gl.mouse_clicked = 0;
    101     kk->gl.mouse_button = kk->gl.mouse_state = 0;
    102 
    103     kk->gl.key = 0;
    104     kk->gl.special_key = 0;
    105 
    106     kk->gl.sw = 9.0f / 16.0f;
    107     kk->gl.sh = 15.0f / 16.0f;
     114    kk->drv.p->font_width = 9;
     115    kk->drv.p->font_height = 15;
     116
     117    kk->drv.p->width = kk->qq->width * kk->drv.p->font_width;
     118    kk->drv.p->height = kk->qq->height * kk->drv.p->font_height;
     119
     120    kk->drv.p->resized = 0;
     121    kk->drv.p->bit = 0;
     122
     123    kk->drv.p->mouse_changed = kk->drv.p->mouse_clicked = 0;
     124    kk->drv.p->mouse_button = kk->drv.p->mouse_state = 0;
     125
     126    kk->drv.p->key = 0;
     127    kk->drv.p->special_key = 0;
     128
     129    kk->drv.p->sw = 9.0f / 16.0f;
     130    kk->drv.p->sh = 15.0f / 16.0f;
    108131
    109132    glutInit(&argc, argv);
    110133
    111134    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    112     glutInitWindowSize(kk->gl.width, kk->gl.height);
    113     kk->gl.window = glutCreateWindow("caca for GL");
    114 
    115     gluOrtho2D(0, kk->gl.width, kk->gl.height, 0);
     135    glutInitWindowSize(kk->drv.p->width, kk->drv.p->height);
     136    kk->drv.p->window = glutCreateWindow("caca for GL");
     137
     138    gluOrtho2D(0, kk->drv.p->width, kk->drv.p->height, 0);
    116139
    117140    glDisable(GL_CULL_FACE);
     
    131154    glPushMatrix();
    132155    glLoadIdentity();
    133     gluOrtho2D(0, kk->gl.width, kk->gl.height, 0);
     156    gluOrtho2D(0, kk->drv.p->width, kk->drv.p->height, 0);
    134157
    135158    glMatrixMode(GL_MODELVIEW);
     
    146169    for(i = 0; i < 94; i++)
    147170    {
    148         glGenTextures(1, (GLuint*)&kk->gl.id[i]);
    149         glBindTexture(GL_TEXTURE_2D, kk->gl.id[i]);
     171        glGenTextures(1, (GLuint*)&kk->drv.p->id[i]);
     172        glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[i]);
    150173        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    151174        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     
    164187
    165188        glEnable(GL_TEXTURE_2D);
    166         glBindTexture(GL_TEXTURE_2D, kk->gl.id[i]);
     189        glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[i]);
    167190        glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
    168                          0, kk->gl.height - 16, 16, 16, 0);
     191                         0, kk->drv.p->height - 16, 16, 16, 0);
    169192
    170193        glutMainLoopEvent();
     
    177200static int gl_end_graphics(caca_t *kk)
    178201{
    179     glutDestroyWindow(kk->gl.window);
     202    glutDestroyWindow(kk->drv.p->window);
     203    free(kk->drv.p);
    180204    return 0;
    181205}
     
    189213static unsigned int gl_get_window_width(caca_t *kk)
    190214{
    191     return kk->gl.width;
     215    return kk->drv.p->width;
    192216}
    193217
    194218static unsigned int gl_get_window_height(caca_t *kk)
    195219{
    196     return kk->gl.height;
     220    return kk->drv.p->height;
    197221}
    198222
     
    204228
    205229    line = 0;
    206     for(y = 0; y < kk->gl.height; y += kk->gl.font_height)
     230    for(y = 0; y < kk->drv.p->height; y += kk->drv.p->font_height)
    207231    {
    208232        uint8_t *attr = kk->qq->attr + line * kk->qq->width;
    209233
    210         for(x = 0; x < kk->gl.width; x += kk->gl.font_width)
     234        for(x = 0; x < kk->drv.p->width; x += kk->drv.p->font_width)
    211235        {
    212236            glDisable(GL_TEXTURE_2D);
     
    214238            glBegin(GL_QUADS);
    215239                glVertex2f(x, y);
    216                 glVertex2f(x + kk->gl.font_width, y);
    217                 glVertex2f(x + kk->gl.font_width, y + kk->gl.font_height);
    218                 glVertex2f(x, y + kk->gl.font_height);
     240                glVertex2f(x + kk->drv.p->font_width, y);
     241                glVertex2f(x + kk->drv.p->font_width, y + kk->drv.p->font_height);
     242                glVertex2f(x, y + kk->drv.p->font_height);
    219243            glEnd();
    220244
     
    231255
    232256    line = 0;
    233     for(y = 0; y < kk->gl.height; y += kk->gl.font_height)
     257    for(y = 0; y < kk->drv.p->height; y += kk->drv.p->font_height)
    234258    {
    235259        uint8_t *attr = kk->qq->attr + line * kk->qq->width;
    236260        uint32_t *chars = kk->qq->chars + line * kk->qq->width;
    237261
    238         for(x = 0; x < kk->gl.width; x += kk->gl.font_width)
     262        for(x = 0; x < kk->drv.p->width; x += kk->drv.p->font_width)
    239263        {
    240264            if(*chars != (uint32_t)' ')
     
    243267
    244268                /* FIXME: check ch bounds */
    245                 glBindTexture(GL_TEXTURE_2D, kk->gl.id[ch - 32]);
     269                glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[ch - 32]);
    246270                glColor4bv(gl_bgpal[attr[0] & 0xf]);
    247271                glBegin(GL_QUADS);
    248                     glTexCoord2f(0, kk->gl.sh);
     272                    glTexCoord2f(0, kk->drv.p->sh);
    249273                    glVertex2f(x, y);
    250                     glTexCoord2f(kk->gl.sw, kk->gl.sh);
    251                     glVertex2f(x + kk->gl.font_width, y);
    252                     glTexCoord2f(kk->gl.sw, 0);
    253                     glVertex2f(x + kk->gl.font_width, y + kk->gl.font_height);
     274                    glTexCoord2f(kk->drv.p->sw, kk->drv.p->sh);
     275                    glVertex2f(x + kk->drv.p->font_width, y);
     276                    glTexCoord2f(kk->drv.p->sw, 0);
     277                    glVertex2f(x + kk->drv.p->font_width, y + kk->drv.p->font_height);
    254278                    glTexCoord2f(0, 0);
    255                     glVertex2f(x, y + kk->gl.font_height);
     279                    glVertex2f(x, y + kk->drv.p->font_height);
    256280                glEnd();
    257281            }
     
    273297                                         unsigned int *new_height)
    274298{
    275     kk->gl.width = kk->gl.new_width;
    276     kk->gl.height = kk->gl.new_height;
    277 
    278     *new_width = kk->gl.width / kk->gl.font_width;
    279     *new_height = (kk->gl.height / kk->gl.font_height) + 1;
     299    kk->drv.p->width = kk->drv.p->new_width;
     300    kk->drv.p->height = kk->drv.p->new_height;
     301
     302    *new_width = kk->drv.p->width / kk->drv.p->font_width;
     303    *new_height = (kk->drv.p->height / kk->drv.p->font_height) + 1;
    280304
    281305    glMatrixMode(GL_PROJECTION);
     
    283307    glLoadIdentity();
    284308
    285     glViewport(0, 0, kk->gl.width, kk->gl.height);
    286     gluOrtho2D(0, kk->gl.width, kk->gl.height, 0);
     309    glViewport(0, 0, kk->drv.p->width, kk->drv.p->height);
     310    gluOrtho2D(0, kk->drv.p->width, kk->drv.p->height, 0);
    287311    glMatrixMode(GL_MODELVIEW);
    288312}
     
    294318    glutMainLoopEvent();
    295319
    296     if(kk->gl.resized && !kk->resize)
     320    if(kk->drv.p->resized && !kk->resize)
    297321    {
    298322        kk->resize = 1;
    299         kk->gl.resized = 0;
     323        kk->drv.p->resized = 0;
    300324        return CACA_EVENT_RESIZE;
    301325    }
    302326
    303     if(kk->gl.mouse_changed)
    304     {
    305         if(kk->gl.mouse_clicked)
     327    if(kk->drv.p->mouse_changed)
     328    {
     329        if(kk->drv.p->mouse_clicked)
    306330        {
    307             event |= CACA_EVENT_MOUSE_PRESS | kk->gl.mouse_button;
    308             kk->gl.mouse_clicked = 0;
     331            event |= CACA_EVENT_MOUSE_PRESS | kk->drv.p->mouse_button;
     332            kk->drv.p->mouse_clicked = 0;
    309333        }
    310         kk->mouse_x = kk->gl.mouse_x;
    311         kk->mouse_y = kk->gl.mouse_y;
     334        kk->mouse_x = kk->drv.p->mouse_x;
     335        kk->mouse_y = kk->drv.p->mouse_y;
    312336        event |= CACA_EVENT_MOUSE_MOTION | (kk->mouse_x << 12) | kk->mouse_y;
    313         kk->gl.mouse_changed = 0;
    314     }
    315 
    316     if(kk->gl.key != 0)
     337        kk->drv.p->mouse_changed = 0;
     338    }
     339
     340    if(kk->drv.p->key != 0)
    317341    {
    318342        event |= CACA_EVENT_KEY_PRESS;
    319         event |= kk->gl.key;
    320         kk->gl.key = 0;
     343        event |= kk->drv.p->key;
     344        kk->drv.p->key = 0;
    321345        return event;
    322346    }
    323347
    324     if(kk->gl.special_key != 0)
     348    if(kk->drv.p->special_key != 0)
    325349    {
    326350        event |= CACA_EVENT_KEY_PRESS;
    327351
    328         switch(kk->gl.special_key)
     352        switch(kk->drv.p->special_key)
    329353        {
    330             case GLUT_KEY_F1 : kk->gl.special_key = 0; return event | CACA_KEY_F1;
    331             case GLUT_KEY_F2 : kk->gl.special_key = 0; return event | CACA_KEY_F2;
    332             case GLUT_KEY_F3 : kk->gl.special_key = 0; return event | CACA_KEY_F3;
    333             case GLUT_KEY_F4 : kk->gl.special_key = 0; return event | CACA_KEY_F4;
    334             case GLUT_KEY_F5 : kk->gl.special_key = 0; return event | CACA_KEY_F5;
    335             case GLUT_KEY_F6 : kk->gl.special_key = 0; return event | CACA_KEY_F6;
    336             case GLUT_KEY_F7 : kk->gl.special_key = 0; return event | CACA_KEY_F7;
    337             case GLUT_KEY_F8 : kk->gl.special_key = 0; return event | CACA_KEY_F8;
    338             case GLUT_KEY_F9 : kk->gl.special_key = 0; return event | CACA_KEY_F9;
    339             case GLUT_KEY_F10: kk->gl.special_key = 0; return event | CACA_KEY_F10;
    340             case GLUT_KEY_F11: kk->gl.special_key = 0; return event | CACA_KEY_F11;
    341             case GLUT_KEY_F12: kk->gl.special_key = 0; return event | CACA_KEY_F12;
    342             case GLUT_KEY_LEFT : kk->gl.special_key = 0; return event | CACA_KEY_LEFT;
    343             case GLUT_KEY_RIGHT: kk->gl.special_key = 0; return event | CACA_KEY_RIGHT;
    344             case GLUT_KEY_UP   : kk->gl.special_key = 0; return event | CACA_KEY_UP;
    345             case GLUT_KEY_DOWN : kk->gl.special_key = 0; return event | CACA_KEY_DOWN;
     354            case GLUT_KEY_F1 : kk->drv.p->special_key = 0; return event | CACA_KEY_F1;
     355            case GLUT_KEY_F2 : kk->drv.p->special_key = 0; return event | CACA_KEY_F2;
     356            case GLUT_KEY_F3 : kk->drv.p->special_key = 0; return event | CACA_KEY_F3;
     357            case GLUT_KEY_F4 : kk->drv.p->special_key = 0; return event | CACA_KEY_F4;
     358            case GLUT_KEY_F5 : kk->drv.p->special_key = 0; return event | CACA_KEY_F5;
     359            case GLUT_KEY_F6 : kk->drv.p->special_key = 0; return event | CACA_KEY_F6;
     360            case GLUT_KEY_F7 : kk->drv.p->special_key = 0; return event | CACA_KEY_F7;
     361            case GLUT_KEY_F8 : kk->drv.p->special_key = 0; return event | CACA_KEY_F8;
     362            case GLUT_KEY_F9 : kk->drv.p->special_key = 0; return event | CACA_KEY_F9;
     363            case GLUT_KEY_F10: kk->drv.p->special_key = 0; return event | CACA_KEY_F10;
     364            case GLUT_KEY_F11: kk->drv.p->special_key = 0; return event | CACA_KEY_F11;
     365            case GLUT_KEY_F12: kk->drv.p->special_key = 0; return event | CACA_KEY_F12;
     366            case GLUT_KEY_LEFT : kk->drv.p->special_key = 0; return event | CACA_KEY_LEFT;
     367            case GLUT_KEY_RIGHT: kk->drv.p->special_key = 0; return event | CACA_KEY_RIGHT;
     368            case GLUT_KEY_UP   : kk->drv.p->special_key = 0; return event | CACA_KEY_UP;
     369            case GLUT_KEY_DOWN : kk->drv.p->special_key = 0; return event | CACA_KEY_DOWN;
    346370            default: return CACA_EVENT_NONE;
    347371        }
     
    358382    caca_t *kk = gl_kk;
    359383
    360     kk->gl.key = key;
     384    kk->drv.p->key = key;
    361385}
    362386
     
    365389    caca_t *kk = gl_kk;
    366390
    367     kk->gl.special_key = key;
     391    kk->drv.p->special_key = key;
    368392}
    369393
     
    372396    caca_t *kk = gl_kk;
    373397
    374     if(kk->gl.bit) /* Do not handle reshaping at the first time */
    375     {
    376         kk->gl.new_width = w;
    377         kk->gl.new_height = h;
    378 
    379         kk->gl.resized = 1;
     398    if(kk->drv.p->bit) /* Do not handle reshaping at the first time */
     399    {
     400        kk->drv.p->new_width = w;
     401        kk->drv.p->new_height = h;
     402
     403        kk->drv.p->resized = 1;
    380404    }
    381405    else
    382         kk->gl.bit = 1;
     406        kk->drv.p->bit = 1;
    383407}
    384408
     
    387411    caca_t *kk = gl_kk;
    388412
    389     kk->gl.mouse_clicked = 1;
    390     kk->gl.mouse_button = button;
    391     kk->gl.mouse_state = state;
    392     kk->gl.mouse_x = x / kk->gl.font_width;
    393     kk->gl.mouse_y = y / kk->gl.font_height;
    394     kk->gl.mouse_changed = 1;
     413    kk->drv.p->mouse_clicked = 1;
     414    kk->drv.p->mouse_button = button;
     415    kk->drv.p->mouse_state = state;
     416    kk->drv.p->mouse_x = x / kk->drv.p->font_width;
     417    kk->drv.p->mouse_y = y / kk->drv.p->font_height;
     418    kk->drv.p->mouse_changed = 1;
    395419}
    396420
     
    399423    caca_t *kk = gl_kk;
    400424
    401     kk->gl.mouse_x = x / kk->gl.font_width;
    402     kk->gl.mouse_y = y / kk->gl.font_height;
    403     kk->gl.mouse_changed = 1;
     425    kk->drv.p->mouse_x = x / kk->drv.p->font_width;
     426    kk->drv.p->mouse_y = y / kk->drv.p->font_height;
     427    kk->drv.p->mouse_changed = 1;
    404428}
    405429
     
    410434void gl_init_driver(caca_t *kk)
    411435{
    412     kk->driver.driver = CACA_DRIVER_GL;
    413 
    414     kk->driver.init_graphics = gl_init_graphics;
    415     kk->driver.end_graphics = gl_end_graphics;
    416     kk->driver.set_window_title = gl_set_window_title;
    417     kk->driver.get_window_width = gl_get_window_width;
    418     kk->driver.get_window_height = gl_get_window_height;
    419     kk->driver.display = gl_display;
    420     kk->driver.handle_resize = gl_handle_resize;
    421     kk->driver.get_event = gl_get_event;
     436    kk->drv.driver = CACA_DRIVER_GL;
     437
     438    kk->drv.init_graphics = gl_init_graphics;
     439    kk->drv.end_graphics = gl_end_graphics;
     440    kk->drv.set_window_title = gl_set_window_title;
     441    kk->drv.get_window_width = gl_get_window_width;
     442    kk->drv.get_window_height = gl_get_window_height;
     443    kk->drv.display = gl_display;
     444    kk->drv.handle_resize = gl_handle_resize;
     445    kk->drv.get_event = gl_get_event;
    422446}
    423447
  • libcaca/trunk/caca/driver_ncurses.c

    r549 r550  
    2828#endif
    2929
     30#include <stdlib.h>
     31#include <string.h>
     32
    3033#if defined(HAVE_SIGNAL_H)
    3134#   include <signal.h>
     
    4851static caca_t *sigwinch_kk; /* FIXME: we ought to get rid of this */
    4952#endif
     53#if defined(HAVE_GETENV) && defined(HAVE_PUTENV)
     54static void ncurses_check_terminal(void);
     55#endif
     56
     57struct driver_private
     58{
     59    int attr[16*16];
     60    mmask_t oldmask;
     61};
    5062
    5163static int ncurses_init_graphics(caca_t *kk)
     
    7688    int fg, bg, max;
    7789
     90    kk->drv.p = malloc(sizeof(struct driver_private));
     91
     92#if defined(HAVE_GETENV) && defined(HAVE_PUTENV)
     93    ncurses_check_terminal();
     94#endif
     95
    7896#if defined(HAVE_SIGNAL)
    7997    sigwinch_kk = kk;
     
    91109    /* Activate mouse */
    92110    newmask = REPORT_MOUSE_POSITION | ALL_MOUSE_EVENTS;
    93     mousemask(newmask, &kk->ncurses.oldmask);
     111    mousemask(newmask, &kk->drv.p->oldmask);
    94112    mouseinterval(-1); /* No click emulation */
    95113
     
    116134            int col = ((max + 7 - fg) % max) + max * bg;
    117135            init_pair(col, curses_colors[fg], curses_colors[bg]);
    118             kk->ncurses.attr[fg + 16 * bg] = COLOR_PAIR(col);
     136            kk->drv.p->attr[fg + 16 * bg] = COLOR_PAIR(col);
    119137
    120138            if(max == 8)
    121139            {
    122140                /* Bright fg on simple bg */
    123                 kk->ncurses.attr[fg + 8 + 16 * bg] = A_BOLD | COLOR_PAIR(col);
     141                kk->drv.p->attr[fg + 8 + 16 * bg] = A_BOLD | COLOR_PAIR(col);
    124142                /* Simple fg on bright bg */
    125                 kk->ncurses.attr[fg + 16 * (bg + 8)] = A_BLINK
     143                kk->drv.p->attr[fg + 16 * (bg + 8)] = A_BLINK
    126144                                                    | COLOR_PAIR(col);
    127145                /* Bright fg on bright bg */
    128                 kk->ncurses.attr[fg + 8 + 16 * (bg + 8)] = A_BLINK | A_BOLD
     146                kk->drv.p->attr[fg + 8 + 16 * (bg + 8)] = A_BLINK | A_BOLD
    129147                                                        | COLOR_PAIR(col);
    130148            }
     
    138156static int ncurses_end_graphics(caca_t *kk)
    139157{
    140     mousemask(kk->ncurses.oldmask, NULL);
     158    mousemask(kk->drv.p->oldmask, NULL);
    141159    curs_set(1);
    142160    noraw();
    143161    endwin();
     162
     163    free(kk->drv.p);
    144164
    145165    return 0;
     
    173193        for(x = kk->qq->width; x--; )
    174194        {
    175             attrset(kk->ncurses.attr[*attr++]);
     195            attrset(kk->drv.p->attr[*attr++]);
    176196            addch(*chars++ & 0x7f);
    177197        }
     
    397417#endif
    398418
     419#if defined(HAVE_GETENV) && defined(HAVE_PUTENV)
     420static void ncurses_check_terminal(void)
     421{
     422    char *term, *colorterm, *other;
     423
     424    term = getenv("TERM");
     425    colorterm = getenv("COLORTERM");
     426
     427    if(term && !strcmp(term, "xterm"))
     428    {
     429        /* If we are using gnome-terminal, it's really a 16 colour terminal */
     430        if(colorterm && !strcmp(colorterm, "gnome-terminal"))
     431        {
     432            SCREEN *screen;
     433            screen = newterm("xterm-16color", stdout, stdin);
     434            if(screen == NULL)
     435                return;
     436            endwin();
     437            (void)putenv("TERM=xterm-16color");
     438            return;
     439        }
     440
     441        /* Ditto if we are using Konsole */
     442        other = getenv("KONSOLE_DCOP_SESSION");
     443        if(other)
     444        {
     445            SCREEN *screen;
     446            screen = newterm("xterm-16color", stdout, stdin);
     447            if(screen == NULL)
     448                return;
     449            endwin();
     450            (void)putenv("TERM=xterm-16color");
     451            return;
     452        }
     453    }
     454}
     455#endif
     456
    399457/*
    400458 * Driver initialisation
     
    403461void ncurses_init_driver(caca_t *kk)
    404462{
    405     kk->driver.driver = CACA_DRIVER_NCURSES;
    406 
    407     kk->driver.init_graphics = ncurses_init_graphics;
    408     kk->driver.end_graphics = ncurses_end_graphics;
    409     kk->driver.set_window_title = ncurses_set_window_title;
    410     kk->driver.get_window_width = ncurses_get_window_width;
    411     kk->driver.get_window_height = ncurses_get_window_height;
    412     kk->driver.display = ncurses_display;
    413     kk->driver.handle_resize = ncurses_handle_resize;
    414     kk->driver.get_event = ncurses_get_event;
     463    kk->drv.driver = CACA_DRIVER_NCURSES;
     464
     465    kk->drv.init_graphics = ncurses_init_graphics;
     466    kk->drv.end_graphics = ncurses_end_graphics;
     467    kk->drv.set_window_title = ncurses_set_window_title;
     468    kk->drv.get_window_width = ncurses_get_window_width;
     469    kk->drv.get_window_height = ncurses_get_window_height;
     470    kk->drv.display = ncurses_display;
     471    kk->drv.handle_resize = ncurses_handle_resize;
     472    kk->drv.get_event = ncurses_get_event;
    415473}
    416474
  • libcaca/trunk/caca/driver_slang.c

    r549 r550  
    2727#   include <slang.h>
    2828#endif
     29
     30#include <stdlib.h>
     31#include <string.h>
    2932
    3033#if defined(HAVE_SIGNAL_H)
     
    107110static caca_t *sigwinch_kk; /* FIXME: we ought to get rid of this */
    108111#endif
     112#if defined(HAVE_GETENV) && defined(HAVE_PUTENV)
     113static void slang_check_terminal(void);
     114#endif
    109115
    110116static int slang_init_graphics(caca_t *kk)
    111117{
     118#if defined(HAVE_GETENV) && defined(HAVE_PUTENV)
     119    slang_check_terminal();
     120#endif
     121
    112122#if defined(HAVE_SIGNAL)
    113123    sigwinch_kk = kk;
     
    376386#endif
    377387
     388#if defined(HAVE_GETENV) && defined(HAVE_PUTENV)
     389static void slang_check_terminal(void)
     390{
     391    char *term, *colorterm, *other;
     392
     393    term = getenv("TERM");
     394    colorterm = getenv("COLORTERM");
     395
     396    if(term && !strcmp(term, "xterm"))
     397    {
     398        /* If we are using gnome-terminal, it's really a 16 colour terminal */
     399        if(colorterm && !strcmp(colorterm, "gnome-terminal"))
     400        {
     401            (void)putenv("TERM=xterm-16color");
     402            return;
     403        }
     404
     405        /* Ditto if we are using Konsole */
     406        other = getenv("KONSOLE_DCOP_SESSION");
     407        if(other)
     408        {
     409            (void)putenv("TERM=xterm-16color");
     410            return;
     411        }
     412    }
     413}
     414#endif
     415
    378416/*
    379417 * Driver initialisation
     
    382420void slang_init_driver(caca_t *kk)
    383421{
    384     kk->driver.driver = CACA_DRIVER_SLANG;
    385 
    386     kk->driver.init_graphics = slang_init_graphics;
    387     kk->driver.end_graphics = slang_end_graphics;
    388     kk->driver.set_window_title = slang_set_window_title;
    389     kk->driver.get_window_width = slang_get_window_width;
    390     kk->driver.get_window_height = slang_get_window_height;
    391     kk->driver.display = slang_display;
    392     kk->driver.handle_resize = slang_handle_resize;
    393     kk->driver.get_event = slang_get_event;
     422    kk->drv.driver = CACA_DRIVER_SLANG;
     423
     424    kk->drv.init_graphics = slang_init_graphics;
     425    kk->drv.end_graphics = slang_end_graphics;
     426    kk->drv.set_window_title = slang_set_window_title;
     427    kk->drv.get_window_width = slang_get_window_width;
     428    kk->drv.get_window_height = slang_get_window_height;
     429    kk->drv.display = slang_display;
     430    kk->drv.handle_resize = slang_handle_resize;
     431    kk->drv.get_event = slang_get_event;
    394432}
    395433
  • libcaca/trunk/caca/driver_win32.c

    r549 r550  
    2323
    2424#include <windows.h>
     25
     26#include <stdlib.h>
    2527
    2628#include "caca.h"
     
    7375};
    7476
     77struct driver_private
     78{
     79    HANDLE hin, hout;
     80    HANDLE front, back;
     81    CHAR_INFO *buffer;
     82    CONSOLE_CURSOR_INFO cci;
     83};
     84
    7585static int win32_init_graphics(caca_t *kk)
    7686{
     
    7888    COORD size;
    7989
     90    kk->drv.p = malloc(sizeof(struct driver_private));
     91
    8092    /* This call is allowed to fail in case we already have a console */
    8193    AllocConsole();
    8294
    83     kk->win32.hin = GetStdHandle(STD_INPUT_HANDLE);
    84     kk->win32.hout = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE,
    85                                 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
    86                                 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    87     if(kk->win32.hout == INVALID_HANDLE_VALUE)
    88         return -1;
    89 
    90     GetConsoleCursorInfo(kk->win32.hout, &kk->win32.cci);
    91     kk->win32.cci.bVisible = FALSE;
    92     SetConsoleCursorInfo(kk->win32.hout, &kk->win32.cci);
    93 
    94     SetConsoleMode(kk->win32.hout, ENABLE_MOUSE_INPUT);
    95 
    96     kk->win32.front =
     95    kk->drv.p->hin = GetStdHandle(STD_INPUT_HANDLE);
     96    kk->drv.p->hout = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE,
     97                                 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
     98                                 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
     99    if(kk->drv.p->hout == INVALID_HANDLE_VALUE)
     100        return -1;
     101
     102    GetConsoleCursorInfo(kk->drv.p->hout, &kk->drv.p->cci);
     103    kk->drv.p->cci.bVisible = FALSE;
     104    SetConsoleCursorInfo(kk->drv.p->hout, &kk->drv.p->cci);
     105
     106    SetConsoleMode(kk->drv.p->hout, ENABLE_MOUSE_INPUT);
     107
     108    kk->drv.p->front =
    97109        CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE,
    98110                                  0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
    99     if(!kk->win32.front || kk->win32.front == INVALID_HANDLE_VALUE)
    100         return -1;
    101 
    102     kk->win32.back =
     111    if(!kk->drv.p->front || kk->drv.p->front == INVALID_HANDLE_VALUE)
     112        return -1;
     113
     114    kk->drv.p->back =
    103115        CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE,
    104116                                  0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
    105     if(!kk->win32.back || kk->win32.back == INVALID_HANDLE_VALUE)
    106         return -1;
    107 
    108     if(!GetConsoleScreenBufferInfo(kk->win32.hout, &csbi))
     117    if(!kk->drv.p->back || kk->drv.p->back == INVALID_HANDLE_VALUE)
     118        return -1;
     119
     120    if(!GetConsoleScreenBufferInfo(kk->drv.p->hout, &csbi))
    109121        return -1;
    110122
    111123    /* Sample code to get the biggest possible window */
    112     //size = GetLargestConsoleWindowSize(kk->win32.hout);
     124    //size = GetLargestConsoleWindowSize(kk->drv.p->hout);
    113125    cucul_set_size(kk->qq, csbi.srWindow.Right - csbi.srWindow.Left + 1,
    114126                           csbi.srWindow.Bottom - csbi.srWindow.Top + 1);
    115127    size.X = kk->qq->width;
    116128    size.Y = kk->qq->height;
    117     SetConsoleScreenBufferSize(kk->win32.front, size);
    118     SetConsoleScreenBufferSize(kk->win32.back, size);
    119 
    120     SetConsoleMode(kk->win32.front, 0);
    121     SetConsoleMode(kk->win32.back, 0);
    122 
    123     GetConsoleCursorInfo(kk->win32.front, &kk->win32.cci);
    124     kk->win32.cci.dwSize = 0;
    125     kk->win32.cci.bVisible = FALSE;
    126     SetConsoleCursorInfo(kk->win32.front, &kk->win32.cci);
    127     SetConsoleCursorInfo(kk->win32.back, &kk->win32.cci);
    128 
    129     SetConsoleActiveScreenBuffer(kk->win32.front);
    130 
    131     kk->win32.buffer = malloc(kk->qq->width * kk->qq->height
     129    SetConsoleScreenBufferSize(kk->drv.p->front, size);
     130    SetConsoleScreenBufferSize(kk->drv.p->back, size);
     131
     132    SetConsoleMode(kk->drv.p->front, 0);
     133    SetConsoleMode(kk->drv.p->back, 0);
     134
     135    GetConsoleCursorInfo(kk->drv.p->front, &kk->drv.p->cci);
     136    kk->drv.p->cci.dwSize = 0;
     137    kk->drv.p->cci.bVisible = FALSE;
     138    SetConsoleCursorInfo(kk->drv.p->front, &kk->drv.p->cci);
     139    SetConsoleCursorInfo(kk->drv.p->back, &kk->drv.p->cci);
     140
     141    SetConsoleActiveScreenBuffer(kk->drv.p->front);
     142
     143    kk->drv.p->buffer = malloc(kk->qq->width * kk->qq->height
    132144                               * sizeof(CHAR_INFO));
    133     if(kk->win32.buffer == NULL)
     145    if(kk->drv.p->buffer == NULL)
    134146        return -1;
    135147
     
    139151static int win32_end_graphics(caca_t *kk)
    140152{
    141     SetConsoleActiveScreenBuffer(kk->win32.hout);
    142     CloseHandle(kk->win32.back);
    143     CloseHandle(kk->win32.front);
    144 
    145     SetConsoleTextAttribute(kk->win32.hout, FOREGROUND_INTENSITY
     153    SetConsoleActiveScreenBuffer(kk->drv.p->hout);
     154    CloseHandle(kk->drv.p->back);
     155    CloseHandle(kk->drv.p->front);
     156
     157    SetConsoleTextAttribute(kk->drv.p->hout, FOREGROUND_INTENSITY
    146158                                             | FOREGROUND_RED
    147159                                             | FOREGROUND_GREEN
    148160                                             | FOREGROUND_BLUE);
    149     kk->win32.cci.bVisible = TRUE;
    150     SetConsoleCursorInfo(kk->win32.hout, &kk->win32.cci);
    151     CloseHandle(kk->win32.hout);
     161    kk->drv.p->cci.bVisible = TRUE;
     162    SetConsoleCursorInfo(kk->drv.p->hout, &kk->drv.p->cci);
     163    CloseHandle(kk->drv.p->hout);
     164
     165    free(kk->drv.p);
    152166
    153167    return 0;
     
    185199    for(i = 0; i < kk->qq->width * kk->qq->height; i++)
    186200    {
    187         kk->win32.buffer[i].Char.AsciiChar = kk->qq->chars[i] & 0x7f;
    188         kk->win32.buffer[i].Attributes =
     201        kk->drv.p->buffer[i].Char.AsciiChar = kk->qq->chars[i] & 0x7f;
     202        kk->drv.p->buffer[i].Attributes =
    189203                win32_fg_palette[kk->qq->attr[i] & 0xf]
    190204                 | win32_bg_palette[kk->qq->attr[i] >> 4];
     
    198212    rect.Right = kk->qq->width - 1;
    199213    rect.Bottom = kk->qq->height - 1;
    200     WriteConsoleOutput(kk->win32.front, kk->win32.buffer, size, pos, &rect);
     214    WriteConsoleOutput(kk->drv.p->front, kk->drv.p->buffer, size, pos, &rect);
    201215}
    202216
     
    216230    for( ; ; )
    217231    {
    218         GetNumberOfConsoleInputEvents(kk->win32.hin, &num);
     232        GetNumberOfConsoleInputEvents(kk->drv.p->hin, &num);
    219233        if(num == 0)
    220234            break;
    221235
    222         ReadConsoleInput(kk->win32.hin, &rec, 1, &num);
     236        ReadConsoleInput(kk->drv.p->hin, &rec, 1, &num);
    223237        if(rec.EventType == KEY_EVENT)
    224238        {
     
    289303void win32_init_driver(caca_t *kk)
    290304{
    291     kk->driver.driver = CACA_DRIVER_WIN32;
    292 
    293     kk->driver.init_graphics = win32_init_graphics;
    294     kk->driver.end_graphics = win32_end_graphics;
    295     kk->driver.set_window_title = win32_set_window_title;
    296     kk->driver.get_window_width = win32_get_window_width;
    297     kk->driver.get_window_height = win32_get_window_height;
    298     kk->driver.display = win32_display;
    299     kk->driver.handle_resize = win32_handle_resize;
    300     kk->driver.get_event = win32_get_event;
     305    kk->drv.driver = CACA_DRIVER_WIN32;
     306
     307    kk->drv.init_graphics = win32_init_graphics;
     308    kk->drv.end_graphics = win32_end_graphics;
     309    kk->drv.set_window_title = win32_set_window_title;
     310    kk->drv.get_window_width = win32_get_window_width;
     311    kk->drv.get_window_height = win32_get_window_height;
     312    kk->drv.display = win32_display;
     313    kk->drv.handle_resize = win32_handle_resize;
     314    kk->drv.get_event = win32_get_event;
    301315}
    302316
  • libcaca/trunk/caca/driver_x11.c

    r549 r550  
    4141 */
    4242static int x11_error_handler(Display *, XErrorEvent *);
     43
     44struct driver_private
     45{
     46    Display *dpy;
     47    Window window;
     48    Pixmap pixmap;
     49    GC gc;
     50    long int event_mask;
     51    int font_width, font_height;
     52    unsigned int new_width, new_height;
     53    int colors[16];
     54    Font font;
     55    XFontStruct *font_struct;
     56    int font_offset;
     57#if defined(HAVE_X11_XKBLIB_H)
     58    Bool autorepeat;
     59#endif
     60};
    4361
    4462static int x11_init_graphics(caca_t *kk)
     
    7492    int i;
    7593
     94    kk->drv.p = malloc(sizeof(struct driver_private));
     95
    7696    geometry = getenv("CACA_GEOMETRY");
    7797    if(geometry && *(geometry))
     
    81101        cucul_set_size(kk->qq, width, height);
    82102
    83     kk->x11.dpy = XOpenDisplay(NULL);
    84     if(kk->x11.dpy == NULL)
     103    kk->drv.p->dpy = XOpenDisplay(NULL);
     104    if(kk->drv.p->dpy == NULL)
    85105        return -1;
    86106
     
    100120        {
    101121            XSetErrorHandler(old_error_handler);
    102             XCloseDisplay(kk->x11.dpy);
     122            XCloseDisplay(kk->drv.p->dpy);
    103123            return -1;
    104124        }
    105125
    106         kk->x11.font = XLoadFont(kk->x11.dpy, *parser);
    107         if(!kk->x11.font)
     126        kk->drv.p->font = XLoadFont(kk->drv.p->dpy, *parser);
     127        if(!kk->drv.p->font)
    108128            continue;
    109129
    110         kk->x11.font_struct = XQueryFont(kk->x11.dpy, kk->x11.font);
    111         if(!kk->x11.font_struct)
    112         {
    113             XUnloadFont(kk->x11.dpy, kk->x11.font);
     130        kk->drv.p->font_struct = XQueryFont(kk->drv.p->dpy, kk->drv.p->font);
     131        if(!kk->drv.p->font_struct)
     132        {
     133            XUnloadFont(kk->drv.p->dpy, kk->drv.p->font);
    114134            continue;
    115135        }
     
    121141    XSetErrorHandler(old_error_handler);
    122142
    123     kk->x11.font_width = kk->x11.font_struct->max_bounds.width;
    124     kk->x11.font_height = kk->x11.font_struct->max_bounds.ascent
    125                          + kk->x11.font_struct->max_bounds.descent;
    126     kk->x11.font_offset = kk->x11.font_struct->max_bounds.descent;
    127 
    128     colormap = DefaultColormap(kk->x11.dpy, DefaultScreen(kk->x11.dpy));
     143    kk->drv.p->font_width = kk->drv.p->font_struct->max_bounds.width;
     144    kk->drv.p->font_height = kk->drv.p->font_struct->max_bounds.ascent
     145                         + kk->drv.p->font_struct->max_bounds.descent;
     146    kk->drv.p->font_offset = kk->drv.p->font_struct->max_bounds.descent;
     147
     148    colormap = DefaultColormap(kk->drv.p->dpy, DefaultScreen(kk->drv.p->dpy));
    129149    for(i = 0; i < 16; i++)
    130150    {
     
    133153        color.green = x11_palette[i * 3 + 1];
    134154        color.blue = x11_palette[i * 3 + 2];
    135         XAllocColor(kk->x11.dpy, colormap, &color);
    136         kk->x11.colors[i] = color.pixel;
     155        XAllocColor(kk->drv.p->dpy, colormap, &color);
     156        kk->drv.p->colors[i] = color.pixel;
    137157    }
    138158
    139159    x11_winattr.backing_store = Always;
    140     x11_winattr.background_pixel = kk->x11.colors[0];
     160    x11_winattr.background_pixel = kk->drv.p->colors[0];
    141161    x11_winattr.event_mask = ExposureMask | StructureNotifyMask;
    142162
    143     kk->x11.window =
    144         XCreateWindow(kk->x11.dpy, DefaultRootWindow(kk->x11.dpy), 0, 0,
    145                       kk->qq->width * kk->x11.font_width,
    146                       kk->qq->height * kk->x11.font_height,
     163    kk->drv.p->window =
     164        XCreateWindow(kk->drv.p->dpy, DefaultRootWindow(kk->drv.p->dpy), 0, 0,
     165                      kk->qq->width * kk->drv.p->font_width,
     166                      kk->qq->height * kk->drv.p->font_height,
    147167                      0, 0, InputOutput, 0,
    148168                      CWBackingStore | CWBackPixel | CWEventMask,
    149169                      &x11_winattr);
    150170
    151     XStoreName(kk->x11.dpy, kk->x11.window, "caca for X");
    152 
    153     XSelectInput(kk->x11.dpy, kk->x11.window, StructureNotifyMask);
    154     XMapWindow(kk->x11.dpy, kk->x11.window);
    155 
    156     kk->x11.gc = XCreateGC(kk->x11.dpy, kk->x11.window, 0, NULL);
    157     XSetForeground(kk->x11.dpy, kk->x11.gc, kk->x11.colors[15]);
    158     XSetFont(kk->x11.dpy, kk->x11.gc, kk->x11.font);
     171    XStoreName(kk->drv.p->dpy, kk->drv.p->window, "caca for X");
     172
     173    XSelectInput(kk->drv.p->dpy, kk->drv.p->window, StructureNotifyMask);
     174    XMapWindow(kk->drv.p->dpy, kk->drv.p->window);
     175
     176    kk->drv.p->gc = XCreateGC(kk->drv.p->dpy, kk->drv.p->window, 0, NULL);
     177    XSetForeground(kk->drv.p->dpy, kk->drv.p->gc, kk->drv.p->colors[15]);
     178    XSetFont(kk->drv.p->dpy, kk->drv.p->gc, kk->drv.p->font);
    159179
    160180    for(;;)
    161181    {
    162182        XEvent xevent;
    163         XNextEvent(kk->x11.dpy, &xevent);
     183        XNextEvent(kk->drv.p->dpy, &xevent);
    164184        if (xevent.type == MapNotify)
    165185            break;
     
    168188#if defined(HAVE_X11_XKBLIB_H)
    169189    /* Disable autorepeat */
    170     XkbSetDetectableAutoRepeat(kk->x11.dpy, True, &kk->x11.autorepeat);
    171     if(!kk->x11.autorepeat)
    172         XAutoRepeatOff(kk->x11.dpy);
     190    XkbSetDetectableAutoRepeat(kk->drv.p->dpy, True, &kk->drv.p->autorepeat);
     191    if(!kk->drv.p->autorepeat)
     192        XAutoRepeatOff(kk->drv.p->dpy);
    173193#endif
    174194
    175     kk->x11.event_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask
     195    kk->drv.p->event_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask
    176196          | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask
    177197          | ExposureMask;
    178198
    179     XSelectInput(kk->x11.dpy, kk->x11.window, kk->x11.event_mask);
    180 
    181     XSync(kk->x11.dpy, False);
    182 
    183     kk->x11.pixmap = XCreatePixmap(kk->x11.dpy, kk->x11.window,
    184                                    kk->qq->width * kk->x11.font_width,
    185                                    kk->qq->height * kk->x11.font_height,
    186                                    DefaultDepth(kk->x11.dpy,
    187                                             DefaultScreen(kk->x11.dpy)));
    188 
    189     kk->x11.new_width = kk->x11.new_height = 0;
     199    XSelectInput(kk->drv.p->dpy, kk->drv.p->window, kk->drv.p->event_mask);
     200
     201    XSync(kk->drv.p->dpy, False);
     202
     203    kk->drv.p->pixmap = XCreatePixmap(kk->drv.p->dpy, kk->drv.p->window,
     204                                   kk->qq->width * kk->drv.p->font_width,
     205                                   kk->qq->height * kk->drv.p->font_height,
     206                                   DefaultDepth(kk->drv.p->dpy,
     207                                            DefaultScreen(kk->drv.p->dpy)));
     208
     209    kk->drv.p->new_width = kk->drv.p->new_height = 0;
    190210
    191211    return 0;
     
    194214static int x11_end_graphics(caca_t *kk)
    195215{
    196     XSync(kk->x11.dpy, False);
     216    XSync(kk->drv.p->dpy, False);
    197217#if defined(HAVE_X11_XKBLIB_H)
    198     if(!kk->x11.autorepeat)
    199         XAutoRepeatOn(kk->x11.dpy);
     218    if(!kk->drv.p->autorepeat)
     219        XAutoRepeatOn(kk->drv.p->dpy);
    200220#endif
    201     XFreePixmap(kk->x11.dpy, kk->x11.pixmap);
    202     XFreeFont(kk->x11.dpy, kk->x11.font_struct);
    203     XFreeGC(kk->x11.dpy, kk->x11.gc);
    204     XUnmapWindow(kk->x11.dpy, kk->x11.window);
    205     XDestroyWindow(kk->x11.dpy, kk->x11.window);
    206     XCloseDisplay(kk->x11.dpy);
     221    XFreePixmap(kk->drv.p->dpy, kk->drv.p->pixmap);
     222    XFreeFont(kk->drv.p->dpy, kk->drv.p->font_struct);
     223    XFreeGC(kk->drv.p->dpy, kk->drv.p->gc);
     224    XUnmapWindow(kk->drv.p->dpy, kk->drv.p->window);
     225    XDestroyWindow(kk->drv.p->dpy, kk->drv.p->window);
     226    XCloseDisplay(kk->drv.p->dpy);
     227
     228    free(kk->drv.p);
    207229
    208230    return 0;
     
    211233static int x11_set_window_title(caca_t *kk, char const *title)
    212234{
    213     XStoreName(kk->x11.dpy, kk->x11.window, title);
     235    XStoreName(kk->drv.p->dpy, kk->drv.p->window, title);
    214236    return 0;
    215237}
     
    217239static unsigned int x11_get_window_width(caca_t *kk)
    218240{
    219     return kk->qq->width * kk->x11.font_width;
     241    return kk->qq->width * kk->drv.p->font_width;
    220242}
    221243
    222244static unsigned int x11_get_window_height(caca_t *kk)
    223245{
    224     return kk->qq->height * kk->x11.font_height;
     246    return kk->qq->height * kk->drv.p->font_height;
    225247}
    226248
     
    242264                len++;
    243265
    244             XSetForeground(kk->x11.dpy, kk->x11.gc,
    245                            kk->x11.colors[attr[0] >> 4]);
    246             XFillRectangle(kk->x11.dpy, kk->x11.pixmap, kk->x11.gc,
    247                            x * kk->x11.font_width, y * kk->x11.font_height,
    248                            len * kk->x11.font_width, kk->x11.font_height);
     266            XSetForeground(kk->drv.p->dpy, kk->drv.p->gc,
     267                           kk->drv.p->colors[attr[0] >> 4]);
     268            XFillRectangle(kk->drv.p->dpy, kk->drv.p->pixmap, kk->drv.p->gc,
     269                           x * kk->drv.p->font_width, y * kk->drv.p->font_height,
     270                           len * kk->drv.p->font_width, kk->drv.p->font_height);
    249271        }
    250272    }
     
    274296            }
    275297
    276             XSetForeground(kk->x11.dpy, kk->x11.gc, kk->x11.colors[attr[0] & 0xf]);
    277             XDrawString(kk->x11.dpy, kk->x11.pixmap, kk->x11.gc,
    278                         x * kk->x11.font_width,
    279                         (y + 1) * kk->x11.font_height - kk->x11.font_offset,
     298            XSetForeground(kk->drv.p->dpy, kk->drv.p->gc, kk->drv.p->colors[attr[0] & 0xf]);
     299            XDrawString(kk->drv.p->dpy, kk->drv.p->pixmap, kk->drv.p->gc,
     300                        x * kk->drv.p->font_width,
     301                        (y + 1) * kk->drv.p->font_height - kk->drv.p->font_offset,
    280302                        buffer, len);
    281303        }
    282304    }
    283305
    284     XCopyArea(kk->x11.dpy, kk->x11.pixmap, kk->x11.window, kk->x11.gc, 0, 0,
    285               kk->qq->width * kk->x11.font_width,
    286               kk->qq->height * kk->x11.font_height,
     306    XCopyArea(kk->drv.p->dpy, kk->drv.p->pixmap, kk->drv.p->window, kk->drv.p->gc, 0, 0,
     307              kk->qq->width * kk->drv.p->font_width,
     308              kk->qq->height * kk->drv.p->font_height,
    287309              0, 0);
    288     XFlush(kk->x11.dpy);
     310    XFlush(kk->drv.p->dpy);
    289311}
    290312
     
    294316    Pixmap new_pixmap;
    295317
    296     *new_width = kk->x11.new_width;
    297     *new_height = kk->x11.new_height;
    298 
    299     new_pixmap = XCreatePixmap(kk->x11.dpy, kk->x11.window,
    300                                kk->qq->width * kk->x11.font_width,
    301                                kk->qq->height * kk->x11.font_height,
    302                                DefaultDepth(kk->x11.dpy,
    303                                             DefaultScreen(kk->x11.dpy)));
    304     XCopyArea(kk->x11.dpy, kk->x11.pixmap, new_pixmap, kk->x11.gc, 0, 0,
    305               kk->qq->width * kk->x11.font_width,
    306               kk->qq->height * kk->x11.font_height, 0, 0);
    307     XFreePixmap(kk->x11.dpy, kk->x11.pixmap);
    308     kk->x11.pixmap = new_pixmap;
     318    *new_width = kk->drv.p->new_width;
     319    *new_height = kk->drv.p->new_height;
     320
     321    new_pixmap = XCreatePixmap(kk->drv.p->dpy, kk->drv.p->window,
     322                               kk->qq->width * kk->drv.p->font_width,
     323                               kk->qq->height * kk->drv.p->font_height,
     324                               DefaultDepth(kk->drv.p->dpy,
     325                                            DefaultScreen(kk->drv.p->dpy)));
     326    XCopyArea(kk->drv.p->dpy, kk->drv.p->pixmap, new_pixmap, kk->drv.p->gc, 0, 0,
     327              kk->qq->width * kk->drv.p->font_width,
     328              kk->qq->height * kk->drv.p->font_height, 0, 0);
     329    XFreePixmap(kk->drv.p->dpy, kk->drv.p->pixmap);
     330    kk->drv.p->pixmap = new_pixmap;
    309331}
    310332
     
    315337    char key;
    316338
    317     while(XCheckWindowEvent(kk->x11.dpy, kk->x11.window,
    318                             kk->x11.event_mask, &xevent) == True)
     339    while(XCheckWindowEvent(kk->drv.p->dpy, kk->drv.p->window,
     340                            kk->drv.p->event_mask, &xevent) == True)
    319341    {
    320342        KeySym keysym;
     
    323345        if(xevent.type == Expose)
    324346        {
    325             XCopyArea(kk->x11.dpy, kk->x11.pixmap,
    326                       kk->x11.window, kk->x11.gc, 0, 0,
    327                       kk->qq->width * kk->x11.font_width,
    328                       kk->qq->height * kk->x11.font_height, 0, 0);
     347            XCopyArea(kk->drv.p->dpy, kk->drv.p->pixmap,
     348                      kk->drv.p->window, kk->drv.p->gc, 0, 0,
     349                      kk->qq->width * kk->drv.p->font_width,
     350                      kk->qq->height * kk->drv.p->font_height, 0, 0);
    329351            continue;
    330352        }
     
    335357            unsigned int w, h;
    336358
    337             w = (xevent.xconfigure.width + kk->x11.font_width / 3)
    338                   / kk->x11.font_width;
    339             h = (xevent.xconfigure.height + kk->x11.font_height / 3)
    340                   / kk->x11.font_height;
     359            w = (xevent.xconfigure.width + kk->drv.p->font_width / 3)
     360                  / kk->drv.p->font_width;
     361            h = (xevent.xconfigure.height + kk->drv.p->font_height / 3)
     362                  / kk->drv.p->font_height;
    341363
    342364            if(!w || !h || (w == kk->qq->width && h == kk->qq->height))
    343365                continue;
    344366
    345             kk->x11.new_width = w;
    346             kk->x11.new_height = h;
     367            kk->drv.p->new_width = w;
     368            kk->drv.p->new_height = h;
    347369
    348370            /* If we are already resizing, ignore the new signal */
     
    358380        if(xevent.type == MotionNotify)
    359381        {
    360             unsigned int newx = xevent.xmotion.x / kk->x11.font_width;
    361             unsigned int newy = xevent.xmotion.y / kk->x11.font_height;
     382            unsigned int newx = xevent.xmotion.x / kk->drv.p->font_width;
     383            unsigned int newy = xevent.xmotion.y / kk->drv.p->font_height;
    362384
    363385            if(newx >= kk->qq->width)
     
    395417            return event | key;
    396418
    397         keysym = XKeycodeToKeysym(kk->x11.dpy, xevent.xkey.keycode, 0);
     419        keysym = XKeycodeToKeysym(kk->drv.p->dpy, xevent.xkey.keycode, 0);
    398420        switch(keysym)
    399421        {
     
    440462void x11_init_driver(caca_t *kk)
    441463{
    442     kk->driver.driver = CACA_DRIVER_X11;
    443 
    444     kk->driver.init_graphics = x11_init_graphics;
    445     kk->driver.end_graphics = x11_end_graphics;
    446     kk->driver.set_window_title = x11_set_window_title;
    447     kk->driver.get_window_width = x11_get_window_width;
    448     kk->driver.get_window_height = x11_get_window_height;
    449     kk->driver.display = x11_display;
    450     kk->driver.handle_resize = x11_handle_resize;
    451     kk->driver.get_event = x11_get_event;
     464    kk->drv.driver = CACA_DRIVER_X11;
     465
     466    kk->drv.init_graphics = x11_init_graphics;
     467    kk->drv.end_graphics = x11_end_graphics;
     468    kk->drv.set_window_title = x11_set_window_title;
     469    kk->drv.get_window_width = x11_get_window_width;
     470    kk->drv.get_window_height = x11_get_window_height;
     471    kk->drv.display = x11_display;
     472    kk->drv.handle_resize = x11_handle_resize;
     473    kk->drv.get_event = x11_get_event;
    452474}
    453475
  • libcaca/trunk/caca/event.c

    r548 r550  
    141141
    142142#if defined(USE_SLANG)
    143     if(kk->driver.driver != CACA_DRIVER_SLANG)
     143    if(kk->drv.driver != CACA_DRIVER_SLANG)
    144144#endif
    145145#if defined(USE_NCURSES)
    146     if(kk->driver.driver != CACA_DRIVER_NCURSES)
     146    if(kk->drv.driver != CACA_DRIVER_NCURSES)
    147147#endif
    148148    return event;
     
    206206#endif
    207207
    208     return kk->driver.get_event(kk);
     208    return kk->drv.get_event(kk);
    209209}
    210210
  • libcaca/trunk/caca/graphics.c

    r540 r550  
    4848int caca_set_window_title(caca_t *kk, char const *title)
    4949{
    50     return kk->driver.set_window_title(kk, title);
     50    return kk->drv.set_window_title(kk, title);
    5151}
    5252
     
    6262unsigned int caca_get_window_width(caca_t *kk)
    6363{
    64     return kk->driver.get_window_width(kk);
     64    return kk->drv.get_window_width(kk);
    6565}
    6666
     
    7676unsigned int caca_get_window_height(caca_t *kk)
    7777{
    78     return kk->driver.get_window_height(kk);
     78    return kk->drv.get_window_height(kk);
    7979}
    8080
     
    129129    int ticks = kk->lastticks + _caca_getticks(&kk->timer);
    130130
    131     kk->driver.display(kk);
     131    kk->drv.display(kk);
    132132
    133133    /* FIXME handle this somewhere else */
     
    165165    unsigned int new_width, new_height;
    166166
    167     kk->driver.handle_resize(kk, &new_width, &new_height);
     167    kk->drv.handle_resize(kk, &new_width, &new_height);
    168168
    169169    /* Tell libcucul we changed size */
Note: See TracChangeset for help on using the changeset viewer.