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.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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
Note: See TracChangeset for help on using the changeset viewer.