source: libcaca/trunk/caca/driver/slang.c @ 3470

Last change on this file since 3470 was 3470, checked in by Sam Hocevar, 11 years ago

Change the dirty rectangle API so that it can handle several rectangles. The
inner implementation still only handles one dirty rectangle, but this way
we can prepare supporting applictions for the future.

  • Property svn:keywords set to Id
File size: 17.0 KB
RevLine 
[35]1/*
[672]2 *  libcaca       Colour ASCII-Art library
[527]3 *  Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
[268]4 *                All Rights Reserved
[35]5 *
[769]6 *  $Id: slang.c 3470 2009-05-19 00:51:47Z sam $
7 *
[1462]8 *  This library is free software. It comes without any warranty, to
[1452]9 *  the extent permitted by applicable law. You can redistribute it
10 *  and/or modify it under the terms of the Do What The Fuck You Want
11 *  To Public License, Version 2, as published by Sam Hocevar. See
[522]12 *  http://sam.zoy.org/wtfpl/COPYING for more details.
[35]13 */
[17]14
[769]15/*
[540]16 *  This file contains the libcaca SLang input and output driver
[205]17 */
18
[63]19#include "config.h"
20
[539]21#if defined(USE_SLANG)
22
23#if defined(HAVE_SLANG_SLANG_H)
24#   include <slang/slang.h>
25#else
26#   include <slang.h>
27#endif
28
[550]29#include <stdlib.h>
30#include <string.h>
31
[348]32#if defined(HAVE_SIGNAL_H)
33#   include <signal.h>
34#endif
35
[185]36#include "caca.h"
37#include "caca_internals.h"
[17]38
[247]39/*
40 * Global variables
41 */
42
[742]43/* Tables generated by tools/optipal.c */
[305]44static int const slang_palette[2*16*16] =
[293]45{
46     1,  0,   2,  0,   3,  0,   4,  0,   5,  0,   6,  0,   7,  0,   8,  0,
47     9,  0,  10,  0,  11,  0,  12,  0,  13,  0,  14,  0,  15,  0,   0,  8,
48     8,  7,   7,  8,  15,  7,   7, 15,  15,  9,   9, 15,   1,  9,   9,  1,
49     7,  9,   9,  7,   8,  1,   1,  8,   0,  1,  15, 10,  10, 15,   2, 10,
50    10,  2,   7, 10,  10,  7,   8,  2,   2,  8,   0,  2,  15, 11,  11, 15,
51     3, 11,  11,  3,   7, 11,  11,  7,   8,  3,   3,  8,   0,  3,  15, 12,
52    12, 15,   4, 12,  12,  4,   7, 12,  12,  7,   8,  4,   4,  8,   0,  4,
53    15, 13,  13, 15,   5, 13,  13,  5,   7, 13,  13,  7,   8,  5,   5,  8,
54     0,  5,  15, 14,  14, 15,   6, 14,  14,  6,   7, 14,  14,  7,   8,  6,
55     6,  8,   0,  6,   4,  6,   6,  4,  12, 14,  14, 12,   6,  2,   2,  6,
56    14, 10,  10, 14,   2,  3,   3,  2,  10, 11,  11, 10,   3,  1,   1,  3,
57    11,  9,   9, 11,   1,  5,   5,  1,   9, 13,  13,  9,   5,  4,   4,  5,
58    13, 12,  12, 13,   4, 14,   6, 12,  12,  6,  14,  4,   6, 10,   2, 14,
59    14,  2,  10,  6,   2, 11,   3, 10,  10,  3,  11,  2,   3,  9,   1, 11,
60    11,  1,   9,  3,   1, 13,   5,  9,   9,  5,  13,  1,   5, 12,   4, 13,
61    13,  4,  12,  5,   0,  7,   0, 15,  15,  8,   8, 15,  15,  1,   7,  1,
62     1,  6,   2,  5,   3,  4,   4,  3,   5,  2,   6,  1,   0,  0,   1,  1,
63     9,  6,  10,  5,  11,  4,  12,  3,  13,  2,  14,  1,   2,  2,   3,  3,
64     4,  4,   5,  5,   6,  6,   7,  7,  14,  9,   1, 15,   8,  9,   8,  8,
65     9,  9,   1,  7,   0,  9,   9,  8,   6,  9,  13, 10,   2, 15,   8, 10,
66     7,  2,  15,  2,   2,  7,   0, 10,  10,  8,   5, 10,  12, 11,   3, 15,
67     8, 11,   7,  3,  15,  3,   3,  7,   0, 11,  11,  8,   4, 11,  11, 12,
68     4, 15,   8, 12,   7,  4,  15,  4,   4,  7,   0, 12,  12,  8,   3, 12,
69    10, 13,   5, 15,   8, 13,   7,  5,  15,  5,   5,  7,   0, 13,  13,  8,
70     2, 13,   9, 14,   6, 15,   8, 14,   7,  6,  15,  6,   6,  7,   0, 14,
71    14,  8,   1, 14,   5,  6,   2,  4,  13, 14,  10, 12,   4,  2,   3,  6,
72    12, 10,  11, 14,   6,  3,   1,  2,  14, 11,   9, 10,   2,  1,   5,  3,
73    10,  9,  13, 11,   3,  5,   4,  1,  11, 13,  12,  9,   1,  4,   6,  5,
74     9, 12,  14, 13,   5, 14,   2, 12,  13,  6,  10,  4,   4, 10,   3, 14,
75    12,  2,  11,  6,   6, 11,   1, 10,  14,  3,   9,  2,   2,  9,   5, 11,
76    10,  1,  13,  3,   3, 13,   4,  9,  11,  5,  12,  1,   1, 12,   6, 13,
77     9,  4,  14,  5,  10, 10,  11, 11,  12, 12,  13, 13,  14, 14,  15, 15,
78};
79
[305]80static int const slang_assoc[16*16] =
[293]81{
82    134, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
83    28, 135, 214, 86, 219, 91, 133, 127, 26, 23, 240, 112, 245, 117, 141, 126,
84    37, 211, 142, 83, 206, 132, 78, 160, 35, 237, 32, 109, 232, 140, 104, 161,
85    46, 87, 82, 143, 131, 215, 210, 169, 44, 113, 108, 41, 139, 241, 236, 170,
86    55, 222, 203, 130, 144, 94, 75, 178, 53, 248, 229, 138, 50, 120, 101, 179,
87    64, 90, 129, 218, 95, 145, 223, 187, 62, 116, 137, 244, 121, 59, 249, 188,
88    73, 128, 79, 207, 74, 202, 146, 196, 71, 136, 105, 233, 100, 228, 68, 197,
89    122, 153, 162, 171, 180, 189, 198, 147, 16, 25, 34, 43, 52, 61, 70, 18,
90    15, 27, 36, 45, 54, 63, 72, 17, 151, 155, 164, 173, 182, 191, 200, 124,
91    154, 22, 238, 110, 243, 115, 156, 24, 150, 152, 216, 88, 221, 93, 148, 20,
92    163, 235, 31, 107, 230, 165, 102, 33, 159, 213, 250, 85, 208, 157, 80, 29,
93    172, 111, 106, 40, 174, 239, 234, 42, 168, 89, 84, 251, 166, 217, 212, 38,
94    181, 246, 227, 183, 49, 118, 99, 51, 177, 224, 205, 175, 252, 96, 77, 47,
95    190, 114, 192, 242, 119, 58, 247, 60, 186, 92, 184, 220, 97, 253, 225, 56,
96    199, 201, 103, 231, 98, 226, 67, 69, 195, 193, 81, 209, 76, 204, 254, 65,
97    123, 149, 158, 167, 176, 185, 194, 19, 125, 21, 30, 39, 48, 57, 66, 255,
98};
[281]99
100/*
101 * Local functions
102 */
103static void slang_init_palette(void);
[579]104static void slang_write_utf32(uint32_t);
[281]105
[539]106#if defined(HAVE_SIGNAL)
[348]107static RETSIGTYPE sigwinch_handler(int);
[811]108static caca_display_t *sigwinch_d; /* FIXME: we ought to get rid of this */
[348]109#endif
[550]110#if defined(HAVE_GETENV) && defined(HAVE_PUTENV)
[2142]111static void slang_install_terminal(caca_display_t *);
112static void slang_uninstall_terminal(caca_display_t *);
[550]113#endif
[348]114
[2142]115struct driver_private
116{
117    char *term;
118};
119
[811]120static int slang_init_graphics(caca_display_t *dp)
[227]121{
[2142]122    dp->drv.p = malloc(sizeof(struct driver_private));
123
[550]124#if defined(HAVE_GETENV) && defined(HAVE_PUTENV)
[2142]125    slang_install_terminal(dp);
[550]126#endif
127
[539]128#if defined(HAVE_SIGNAL)
[811]129    sigwinch_d = dp;
[348]130    signal(SIGWINCH, sigwinch_handler);
131#endif
132
[1392]133    _caca_set_term_title("caca for S-Lang");
[1391]134
[539]135    /* Initialise slang library */
136    SLsig_block_signals();
137    SLtt_get_terminfo();
[227]138
[539]139    if(SLkp_init() == -1)
[227]140    {
[539]141        SLsig_unblock_signals();
[540]142        return -1;
[265]143    }
[251]144
[539]145    SLang_init_tty(-1, 0, 1);
[261]146
[539]147    if(SLsmg_init_smg() == -1)
[286]148    {
[539]149        SLsig_unblock_signals();
[540]150        return -1;
[336]151    }
[491]152
[539]153    SLsig_unblock_signals();
[483]154
[539]155    SLsmg_cls();
156    SLtt_set_cursor_visibility(0);
157    SLkp_define_keysym("\e[M", 1001);
158    SLtt_set_mouse_mode(1, 0);
159    SLsmg_refresh();
[524]160
[539]161    /* Disable scrolling so that hashmap scrolling optimization code
162     * does not cause ugly refreshes due to slow terminals */
163    SLtt_Term_Cannot_Scroll = 1;
[483]164
[539]165    slang_init_palette();
[483]166
[1774]167#if defined(VMS) || defined(REAL_UNIX_SYSTEM)
[539]168    /* Disable alt charset support so that we get a chance to have all
169     * 256 colour pairs */
170    SLtt_Has_Alt_Charset = 0;
[1774]171#endif
[527]172
[610]173#ifdef HAVE_SLSMG_UTF8_ENABLE
[579]174    SLsmg_utf8_enable(1); /* 1 == force, 0 == disable, -1 == autodetect */
175    SLtt_utf8_enable(1);
[610]176#endif
[527]177
[2055]178    dp->resize.allow = 1;
[2821]179    caca_set_canvas_size(dp->cv, SLtt_Screen_Cols, SLtt_Screen_Rows);
[2055]180    dp->resize.allow = 0;
[579]181
[227]182    return 0;
183}
184
[811]185static int slang_end_graphics(caca_display_t *dp)
[251]186{
[1392]187    _caca_set_term_title("");
[539]188    SLtt_set_mouse_mode(0, 0);
189    SLtt_set_cursor_visibility(1);
190    SLang_reset_tty();
191    SLsmg_reset_smg();
[300]192
[2142]193#if defined HAVE_GETENV && defined HAVE_PUTENV
194    slang_uninstall_terminal(dp);
195#endif
196
197    free(dp->drv.p);
198
[251]199    return 0;
200}
201
[819]202static int slang_set_display_title(caca_display_t *dp, char const *title)
[343]203{
[1392]204    _caca_set_term_title(title);
[1391]205
206    return 0;
[343]207}
208
[2305]209static int slang_get_display_width(caca_display_t const *dp)
[352]210{
211    /* Fallback to a 6x10 font */
[2821]212    return caca_get_canvas_width(dp->cv) * 6;
[352]213}
214
[2305]215static int slang_get_display_height(caca_display_t const *dp)
[352]216{
217    /* Fallback to a 6x10 font */
[2821]218    return caca_get_canvas_height(dp->cv) * 10;
[352]219}
220
[811]221static void slang_display(caca_display_t *dp)
[227]222{
[2821]223    uint32_t const *cvchars = (uint32_t const *)caca_get_canvas_chars(dp->cv);
224    uint32_t const *cvattrs = (uint32_t const *)caca_get_canvas_attrs(dp->cv);
[3470]225    int x, y, i;
[2056]226
[3470]227    for(i = 0; i < caca_get_dirty_rectangle_count(dp->cv); i++)
228    {
229        int xmin, ymin, xmax, ymax;
[3469]230
[3470]231        caca_get_dirty_rectangle(dp->cv, i, &xmin, &ymin, &xmax, &ymax);
232
233        for(y = ymin; y <= ymax; y++)
[527]234        {
[3470]235            SLsmg_gotorc(y, 0);
236            for(x = xmax; x >= xmin; x--)
237            {
238                uint32_t ch = *cvchars++;
[557]239
[539]240#if defined(OPTIMISE_SLANG_PALETTE)
[3470]241                /* If foreground == background, just don't use this colour
242                 * pair, and print a space instead of the real character. */
243                /* XXX: disabled, because I can't remember what it was
244                 * here for, and in cases where SLang does not render
245                 * bright backgrounds, it's just fucked up. */
[982]246#if 0
[3470]247                uint8_t fgcolor = caca_attr_to_ansi_fg(*cvattrs);
248                uint8_t bgcolor = caca_attr_to_ansi_bg(*cvattrs);
[557]249
[3470]250                if(fgcolor >= 0x10)
251                    fgcolor = CACA_LIGHTGRAY;
[1332]252
[3470]253                if(bgcolor >= 0x10)
254                    bgcolor = CACA_BLACK; /* FIXME: handle transparency */
[1332]255
[3470]256                if(fgcolor == bgcolor)
257                {
258                    if(fgcolor == CACA_BLACK)
259                        fgcolor = CACA_WHITE;
260                    else if(fgcolor == CACA_WHITE
261                             || fgcolor <= CACA_LIGHTGRAY)
262                        fgcolor = CACA_BLACK;
263                    else
264                        fgcolor = CACA_WHITE;
265                    SLsmg_set_color(slang_assoc[fgcolor + 16 * bgcolor]);
266                    SLsmg_write_char(' ');
267                    cvattrs++;
268                }
[539]269                else
[982]270#endif
[3470]271                {
272                    SLsmg_set_color(slang_assoc[caca_attr_to_ansi(*cvattrs++)]);
273                    slang_write_utf32(ch);
274                }
275#else
276                SLsmg_set_color(caca_attr_to_ansi(*cvattrs++));
[982]277                slang_write_utf32(ch);
[3470]278#endif
[982]279            }
[527]280        }
[265]281    }
[2821]282    SLsmg_gotorc(caca_get_cursor_y(dp->cv), caca_get_cursor_x(dp->cv));
[539]283    SLsmg_refresh();
[227]284}
285
[811]286static void slang_handle_resize(caca_display_t *dp)
[347]287{
[539]288    SLtt_get_screen_size();
[811]289    dp->resize.w = SLtt_Screen_Cols;
290    dp->resize.h = SLtt_Screen_Rows;
[349]291
[2821]292    if(dp->resize.w != caca_get_canvas_width(dp->cv)
293        || dp->resize.h != caca_get_canvas_height(dp->cv))
[539]294        SLsmg_reinit_smg();
[347]295}
296
[2049]297static int slang_get_event(caca_display_t *dp, caca_privevent_t *ev)
[548]298{
299    int intkey;
300
301    if(!SLang_input_pending(0))
[681]302    {
303        ev->type = CACA_EVENT_NONE;
304        return 0;
305    }
[548]306
307    /* We first use SLang_getkey() to see whether Esc was pressed
308     * alone, then (if it wasn't) we unget the key and use SLkp_getkey()
309     * instead, so that escape sequences are interpreted. */
310    intkey = SLang_getkey();
311
312    if(intkey != 0x1b /* Esc */ || SLang_input_pending(0))
313    {
314        SLang_ungetkey(intkey);
315        intkey = SLkp_getkey();
316    }
317
318    /* If the key was ASCII, return it immediately */
[974]319    if(intkey < 0x7f)
[548]320    {
[681]321        ev->type = CACA_EVENT_KEY_PRESS;
[810]322        ev->data.key.ch = intkey;
[970]323        ev->data.key.utf32 = intkey;
324        ev->data.key.utf8[0] = intkey;
325        ev->data.key.utf8[1] = '\0';
[681]326        return 1;
[548]327    }
328
[982]329    /* If the key was UTF-8, parse the whole sequence */
330    if(intkey >= 0x80 && intkey < 0x100)
331    {
332        int keys[7]; /* Necessary for ungetkey(); */
333        char utf8[7];
334        uint32_t utf32;
[2305]335        size_t i, bytes = 0;
[982]336
337        keys[0] = intkey;
338        utf8[0] = intkey;
339
340        for(i = 1; i < 6; i++)
341        {
342            if(!SLang_input_pending(0))
343                break;
344            keys[i] = SLang_getkey();
345            utf8[i] = (unsigned char)keys[i];
346        }
347
348        utf8[i] = '\0';
[2821]349        utf32 = caca_utf8_to_utf32(utf8, &bytes);
[982]350
351        while(i > bytes)
352            SLang_ungetkey(keys[--i]);
353
354        if(bytes)
355        {
356            ev->type = CACA_EVENT_KEY_PRESS;
357            ev->data.key.ch = 0;
358            ev->data.key.utf32 = utf32;
359            strcpy(ev->data.key.utf8, utf8);
360            return 1;
361        }
362    }
363
[548]364    if(intkey == 0x3e9)
365    {
366        int button = (SLang_getkey() - ' ' + 1) & 0xf;
[2305]367        int x = SLang_getkey() - '!';
368        int y = SLang_getkey() - '!';
[548]369
[681]370        ev->data.mouse.button = button;
371        ev->type = CACA_EVENT_MOUSE_PRESS;
[811]372        _push_event(dp, ev);
[681]373        ev->type = CACA_EVENT_MOUSE_RELEASE;
[811]374        _push_event(dp, ev);
[681]375
[811]376        if(dp->mouse.x == x && dp->mouse.y == y)
377            return _pop_event(dp, ev);
[548]378
[811]379        dp->mouse.x = x;
380        dp->mouse.y = y;
[548]381
[681]382        ev->type = CACA_EVENT_MOUSE_MOTION;
[811]383        ev->data.mouse.x = dp->mouse.x;
384        ev->data.mouse.y = dp->mouse.y;
[681]385        return 1;
[548]386    }
387
388    switch(intkey)
389    {
[810]390        case SL_KEY_UP: ev->data.key.ch = CACA_KEY_UP; break;
391        case SL_KEY_DOWN: ev->data.key.ch = CACA_KEY_DOWN; break;
392        case SL_KEY_LEFT: ev->data.key.ch = CACA_KEY_LEFT; break;
393        case SL_KEY_RIGHT: ev->data.key.ch = CACA_KEY_RIGHT; break;
[548]394
[810]395        case SL_KEY_IC: ev->data.key.ch = CACA_KEY_INSERT; break;
396        case SL_KEY_DELETE: ev->data.key.ch = CACA_KEY_DELETE; break;
[974]397        case 0x7f:
[970]398        case SL_KEY_BACKSPACE: ev->data.key.ch = CACA_KEY_BACKSPACE; break;
[810]399        case SL_KEY_HOME: ev->data.key.ch = CACA_KEY_HOME; break;
400        case SL_KEY_END: ev->data.key.ch = CACA_KEY_END; break;
401        case SL_KEY_PPAGE: ev->data.key.ch = CACA_KEY_PAGEUP; break;
402        case SL_KEY_NPAGE: ev->data.key.ch = CACA_KEY_PAGEDOWN; break;
[548]403
[810]404        case SL_KEY_F(1): ev->data.key.ch = CACA_KEY_F1; break;
405        case SL_KEY_F(2): ev->data.key.ch = CACA_KEY_F2; break;
406        case SL_KEY_F(3): ev->data.key.ch = CACA_KEY_F3; break;
407        case SL_KEY_F(4): ev->data.key.ch = CACA_KEY_F4; break;
408        case SL_KEY_F(5): ev->data.key.ch = CACA_KEY_F5; break;
409        case SL_KEY_F(6): ev->data.key.ch = CACA_KEY_F6; break;
410        case SL_KEY_F(7): ev->data.key.ch = CACA_KEY_F7; break;
411        case SL_KEY_F(8): ev->data.key.ch = CACA_KEY_F8; break;
412        case SL_KEY_F(9): ev->data.key.ch = CACA_KEY_F9; break;
413        case SL_KEY_F(10): ev->data.key.ch = CACA_KEY_F10; break;
414        case SL_KEY_F(11): ev->data.key.ch = CACA_KEY_F11; break;
415        case SL_KEY_F(12): ev->data.key.ch = CACA_KEY_F12; break;
[681]416
[982]417        default:
418            /* Unknown key */
419            ev->type = CACA_EVENT_NONE; return 0;
[548]420    }
421
[681]422    ev->type = CACA_EVENT_KEY_PRESS;
[969]423    ev->data.key.utf32 = 0;
[681]424    ev->data.key.utf8[0] = '\0';
425    return 1;
[548]426}
427
[1837]428static void slang_set_cursor(caca_display_t *dp, int flags)
429{
430    SLtt_set_cursor_visibility(flags ? 1 : 0);
431}
432
[540]433/*
434 * XXX: following functions are local
435 */
436
[281]437static void slang_init_palette(void)
438{
439    /* See SLang ref., 5.4.4. */
440    static char *slang_colors[16] =
441    {
442        /* Standard colours */
443        "black",
444        "blue",
445        "green",
446        "cyan",
447        "red",
448        "magenta",
449        "brown",
450        "lightgray",
451        /* Bright colours */
452        "gray",
453        "brightblue",
454        "brightgreen",
455        "brightcyan",
456        "brightred",
457        "brightmagenta",
458        "yellow",
459        "white",
460    };
461
[300]462#if defined(OPTIMISE_SLANG_PALETTE)
463    int i;
464
465    for(i = 0; i < 16 * 16; i++)
466        SLtt_set_color(i, NULL, slang_colors[slang_palette[i * 2]],
467                                slang_colors[slang_palette[i * 2 + 1]]);
468#else
[281]469    int fg, bg;
470
471    for(bg = 0; bg < 16; bg++)
472        for(fg = 0; fg < 16; fg++)
473        {
474            int i = fg + 16 * bg;
475            SLtt_set_color(i, NULL, slang_colors[fg], slang_colors[bg]);
476        }
477#endif
478}
479
[811]480static void slang_write_utf32(uint32_t ch)
[579]481{
[630]482#ifdef HAVE_SLSMG_UTF8_ENABLE
[929]483    char buf[10];
[579]484    int bytes;
[1776]485#else
486    char ascii;
[1218]487#endif
[579]488
[2821]489    if(ch == CACA_MAGIC_FULLWIDTH)
[1218]490        return;
491
492#ifdef HAVE_SLSMG_UTF8_ENABLE
[2821]493    bytes = caca_utf32_to_utf8(buf, ch);
[579]494    buf[bytes] = '\0';
495    SLsmg_write_string(buf);
[610]496#else
[2821]497    ascii = caca_utf32_to_ascii(ch);
[1776]498    SLsmg_write_char(ascii);
[2821]499    if(caca_utf32_is_fullwidth(ch))
[1776]500        SLsmg_write_char(ascii);
[610]501#endif
[579]502}
503
[539]504#if defined(HAVE_SIGNAL)
[348]505static RETSIGTYPE sigwinch_handler(int sig)
506{
[811]507    sigwinch_d->resize.resized = 1;
[348]508
[610]509    signal(SIGWINCH, sigwinch_handler);
[348]510}
511#endif
512
[550]513#if defined(HAVE_GETENV) && defined(HAVE_PUTENV)
[2142]514static void slang_install_terminal(caca_display_t *dp)
[550]515{
[1033]516    char *term, *colorterm;
[550]517
[2142]518    dp->drv.p->term = NULL;
519
[550]520    term = getenv("TERM");
521    colorterm = getenv("COLORTERM");
522
[986]523    if(!term || strcmp(term, "xterm"))
524        return;
525
526    /* If we are using gnome-terminal, it's really a 16 colour terminal.
527     * Ditto if we are using xfce4-terminal, or Konsole. */
528    if((colorterm && (!strcmp(colorterm, "gnome-terminal")
529                       || !strcmp(colorterm, "Terminal")))
530         || getenv("KONSOLE_DCOP_SESSION"))
[550]531    {
[986]532        (void)putenv("TERM=xterm-16color");
[2142]533        dp->drv.p->term = strdup(term);
[986]534        return;
[550]535    }
536}
[2142]537
538static void slang_uninstall_terminal(caca_display_t *dp)
539{
540    /* Needs to be persistent because we use putenv() */
541    static char termenv[1024];
542
543    if(!dp->drv.p->term)
544        return;
545
546    snprintf(termenv, 1023, "TERM=%s", dp->drv.p->term);
547    free(dp->drv.p->term);
548    (void)putenv(termenv);
549}
[550]550#endif
551
[539]552/*
553 * Driver initialisation
554 */
[527]555
[811]556int slang_install(caca_display_t *dp)
[511]557{
[2138]558    dp->drv.id = CACA_DRIVER_SLANG;
559    dp->drv.driver = "slang";
[527]560
[811]561    dp->drv.init_graphics = slang_init_graphics;
562    dp->drv.end_graphics = slang_end_graphics;
[819]563    dp->drv.set_display_title = slang_set_display_title;
564    dp->drv.get_display_width = slang_get_display_width;
565    dp->drv.get_display_height = slang_get_display_height;
[811]566    dp->drv.display = slang_display;
567    dp->drv.handle_resize = slang_handle_resize;
568    dp->drv.get_event = slang_get_event;
569    dp->drv.set_mouse = NULL;
[1837]570    dp->drv.set_cursor = slang_set_cursor;
[684]571
572    return 0;
[511]573}
574
[539]575#endif /* USE_SLANG */
[527]576
Note: See TracBrowser for help on using the repository browser.