Browse Source

* Implement caca_create_display_with_driver() to specify an output driver

without using environment variables..
  * Implement caca_get_display_driver() to return the current display's
    output driver.
  * Add a simple example program to test caca_create_display_with_driver().
tags/v0.99.beta14
Sam Hocevar sam 17 years ago
parent
commit
e15e962928
16 changed files with 163 additions and 27 deletions
  1. +61
    -13
      caca/caca.c
  2. +4
    -1
      caca/caca.h
  3. +2
    -1
      caca/caca_internals.h
  4. +2
    -1
      caca/driver_cocoa.m
  5. +2
    -1
      caca/driver_conio.c
  6. +2
    -1
      caca/driver_gl.c
  7. +2
    -1
      caca/driver_ncurses.c
  8. +2
    -1
      caca/driver_raw.c
  9. +2
    -1
      caca/driver_slang.c
  10. +2
    -1
      caca/driver_vga.c
  11. +2
    -1
      caca/driver_win32.c
  12. +2
    -1
      caca/driver_x11.c
  13. +2
    -2
      caca/event.c
  14. +1
    -0
      examples/.gitignore
  15. +4
    -1
      examples/Makefile.am
  16. +71
    -0
      examples/driver.c

+ 61
- 13
caca/caca.c View File

@@ -37,12 +37,12 @@
#include "caca_internals.h"

#if defined(USE_PLUGINS)
# define gl_install(p) caca_plugin_install("gl", p)
# define x11_install(p) caca_plugin_install("x11", p)
# define gl_install(p) caca_plugin_install(p, "gl")
# define x11_install(p) caca_plugin_install(p, "x11")
#endif

static int caca_can_resize(caca_display_t *);
static int caca_select_driver(caca_display_t *);
static int caca_select_driver(caca_display_t *, char const *);
#if defined(USE_PLUGINS)
static int caca_plugin_install(char const *, caca_display_t *);
#endif
@@ -58,14 +58,44 @@ static int caca_plugin_install(char const *, caca_display_t *);
* retrieved using caca_get_canvas() and it is automatically destroyed when
* caca_free_display() is called.
*
* See also caca_create_display_with_driver().
*
* If an error occurs, NULL is returned and \b errno is set accordingly:
* - \c ENOMEM Not enough memory.
* - \c ENODEV Graphical device could not be initialised.
*
* \param cv The cucul cavas.
* \param cv The cucul canvas or NULL to create a canvas automatically.
* \return The caca graphical context or NULL if an error occurred.
*/
caca_display_t * caca_create_display(cucul_canvas_t *cv)
{
return caca_create_display_with_driver(cv, NULL);
}

/** \brief Attach a caca graphical context to a cucul canvas.
*
* Create a graphical context using device-dependent features (ncurses for
* terminals, an X11 window, a DOS command window...) that attaches to a
* libcucul canvas. Everything that gets drawn in the libcucul canvas can
* then be displayed by the libcaca driver.
*
* If no cucul canvas is provided, a new one is created. Its handle can be
* retrieved using caca_get_canvas() and it is automatically destroyed when
* caca_free_display() is called.
*
* See also caca_create_display().
*
* If an error occurs, NULL is returned and \b errno is set accordingly:
* - \c ENOMEM Not enough memory.
* - \c ENODEV Graphical device could not be initialised.
*
* \param cv The cucul canvas or NULL to create a canvas automatically.
* \param driver A string describing the desired output driver or NULL to
* choose the best driver automatically.
* \return The caca graphical context or NULL if an error occurred.
*/
caca_display_t * caca_create_display_with_driver(cucul_canvas_t *cv,
char const *driver)
{
caca_display_t *dp = malloc(sizeof(caca_display_t));

@@ -95,7 +125,7 @@ caca_display_t * caca_create_display(cucul_canvas_t *cv)
dp->plugin = NULL;
#endif

if(caca_select_driver(dp))
if(caca_select_driver(dp, driver))
{
#if defined(USE_PLUGINS)
if(dp->plugin)
@@ -154,6 +184,20 @@ caca_display_t * caca_create_display(cucul_canvas_t *cv)
return dp;
}

/** \brief Return the current output driver
*
* Return the given display's current output driver.
*
* This function never fails.
*
* \param dp The caca display.
* \return A static string.
*/
char const * caca_get_display_driver(caca_display_t *dp)
{
return dp->drv.driver;
}

/** \brief Detach a caca graphical context from a cucul backend context.
*
* Detach a graphical context from its cucul backend and destroy it. The
@@ -223,7 +267,7 @@ char const * caca_get_version(void)
* \param dp Display object.
* \return An array of strings.
*/
char const * const * caca_get_display_driver_list(caca_display_t *dp)
char const * const * caca_get_display_driver_list(void)
{
static char const * const list[] =
{
@@ -269,11 +313,15 @@ static int caca_can_resize(caca_display_t *dp)
return dp->resize.allow;
}

static int caca_select_driver(caca_display_t *dp)
static int caca_select_driver(caca_display_t *dp, char const *driver)
{
#if defined(HAVE_GETENV) && defined(HAVE_STRCASECMP)
char *var = getenv("CACA_DRIVER");
char const *var = driver;
#if defined(HAVE_GETENV)
if(!var)
var = getenv("CACA_DRIVER");
#endif

#if defined(HAVE_STRCASECMP)
/* If the environment variable was set, use it */
if(var && *var)
{
@@ -339,22 +387,22 @@ static int caca_select_driver(caca_display_t *dp)
}

#if defined(USE_PLUGINS)
static int caca_plugin_install(char const *name, caca_display_t *dp)
static int caca_plugin_install(caca_display_t *dp, char const *driver)
{
char buf[512];
int (*sym) (caca_display_t *);

sprintf(buf, "%s/lib%s_plugin.so", PLUGINDIR, name);
sprintf(buf, "%s/lib%s_plugin.so", PLUGINDIR, driver);
dp->plugin = dlopen(buf, RTLD_NOW);
if(!dp->plugin)
{
sprintf(buf, "lib%s_plugin.so", name);
sprintf(buf, "lib%s_plugin.so", driver);
dp->plugin = dlopen(buf, RTLD_NOW);
if(!dp->plugin)
return -1;
}

sprintf(buf, "%s_install", name);
sprintf(buf, "%s_install", driver);
sym = dlsym(dp->plugin, buf);
if(!sym)
{


+ 4
- 1
caca/caca.h View File

@@ -154,10 +154,13 @@ enum caca_key
*
* @{ */
__extern caca_display_t * caca_create_display(cucul_canvas_t *);
__extern caca_display_t * caca_create_display_with_driver(cucul_canvas_t *,
char const *);
__extern char const * caca_get_display_driver(caca_display_t *);
__extern int caca_free_display(caca_display_t *);
__extern cucul_canvas_t * caca_get_canvas(caca_display_t *);
__extern int caca_refresh_display(caca_display_t *);
__extern char const * const * caca_get_display_driver_list(caca_display_t *);
__extern char const * const * caca_get_display_driver_list(void);
__extern int caca_set_display_time(caca_display_t *, unsigned int);
__extern unsigned int caca_get_display_time(caca_display_t const *);
__extern unsigned int caca_get_display_width(caca_display_t const *);


+ 2
- 1
caca/caca_internals.h View File

@@ -117,7 +117,8 @@ struct caca_display
/* Device-specific functions */
struct drv
{
enum caca_driver driver;
char const * driver;
enum caca_driver id;
struct driver_private *p;

int (* init_graphics) (caca_display_t *);


+ 2
- 1
caca/driver_cocoa.m View File

@@ -997,7 +997,8 @@ static void cocoa_set_mouse(caca_display_t *dp, int flag)

int cocoa_install(caca_display_t *dp)
{
dp->drv.driver = CACA_DRIVER_RAW;
dp->drv.id = CACA_DRIVER_COCOA;
dp->drv.driver = "cocoa";

dp->drv.init_graphics = cocoa_init_graphics;
dp->drv.end_graphics = cocoa_end_graphics;


+ 2
- 1
caca/driver_conio.c View File

@@ -166,7 +166,8 @@ static int conio_get_event(caca_display_t *dp, caca_privevent_t *ev)

int conio_install(caca_display_t *dp)
{
dp->drv.driver = CACA_DRIVER_CONIO;
dp->drv.id = CACA_DRIVER_CONIO;
dp->drv.driver = "conio";

dp->drv.init_graphics = conio_init_graphics;
dp->drv.end_graphics = conio_end_graphics;


+ 2
- 1
caca/driver_gl.c View File

@@ -597,7 +597,8 @@ int gl_install(caca_display_t *dp)
return -1;
#endif

dp->drv.driver = CACA_DRIVER_GL;
dp->drv.id = CACA_DRIVER_GL;
dp->drv.driver = "gl";

dp->drv.init_graphics = gl_init_graphics;
dp->drv.end_graphics = gl_end_graphics;


+ 2
- 1
caca/driver_ncurses.c View File

@@ -808,7 +808,8 @@ static void ncurses_write_utf32(uint32_t ch)

int ncurses_install(caca_display_t *dp)
{
dp->drv.driver = CACA_DRIVER_NCURSES;
dp->drv.id = CACA_DRIVER_NCURSES;
dp->drv.driver = "ncurses";

dp->drv.init_graphics = ncurses_init_graphics;
dp->drv.end_graphics = ncurses_end_graphics;


+ 2
- 1
caca/driver_raw.c View File

@@ -97,7 +97,8 @@ static int raw_get_event(caca_display_t *dp, caca_privevent_t *ev)

int raw_install(caca_display_t *dp)
{
dp->drv.driver = CACA_DRIVER_RAW;
dp->drv.id = CACA_DRIVER_RAW;
dp->drv.driver = "raw";

dp->drv.init_graphics = raw_init_graphics;
dp->drv.end_graphics = raw_end_graphics;


+ 2
- 1
caca/driver_slang.c View File

@@ -522,7 +522,8 @@ static void slang_check_terminal(void)

int slang_install(caca_display_t *dp)
{
dp->drv.driver = CACA_DRIVER_SLANG;
dp->drv.id = CACA_DRIVER_SLANG;
dp->drv.driver = "slang";

dp->drv.init_graphics = slang_init_graphics;
dp->drv.end_graphics = slang_end_graphics;


+ 2
- 1
caca/driver_vga.c View File

@@ -159,7 +159,8 @@ static int vga_get_event(caca_display_t *dp, caca_privevent_t *ev)

int vga_install(caca_display_t *dp)
{
dp->drv.driver = CACA_DRIVER_VGA;
dp->drv.id = CACA_DRIVER_VGA;
dp->drv.driver = "vga";

dp->drv.init_graphics = vga_init_graphics;
dp->drv.end_graphics = vga_end_graphics;


+ 2
- 1
caca/driver_win32.c View File

@@ -349,7 +349,8 @@ static int win32_get_event(caca_display_t *dp, caca_privevent_t *ev)

int win32_install(caca_display_t *dp)
{
dp->drv.driver = CACA_DRIVER_WIN32;
dp->drv.id = CACA_DRIVER_WIN32;
dp->drv.driver = "win32";

dp->drv.init_graphics = win32_init_graphics;
dp->drv.end_graphics = win32_end_graphics;


+ 2
- 1
caca/driver_x11.c View File

@@ -789,7 +789,8 @@ int x11_install(caca_display_t *dp)
return -1;
#endif

dp->drv.driver = CACA_DRIVER_X11;
dp->drv.id = CACA_DRIVER_X11;
dp->drv.driver = "x11";

dp->drv.init_graphics = x11_init_graphics;
dp->drv.end_graphics = x11_end_graphics;


+ 2
- 2
caca/event.c View File

@@ -344,10 +344,10 @@ static int _get_next_event(caca_display_t *dp, caca_privevent_t *ev)
ret = _lowlevel_event(dp, ev);

#if defined(USE_SLANG)
if(dp->drv.driver != CACA_DRIVER_SLANG)
if(dp->drv.id != CACA_DRIVER_SLANG)
#endif
#if defined(USE_NCURSES)
if(dp->drv.driver != CACA_DRIVER_NCURSES)
if(dp->drv.id != CACA_DRIVER_NCURSES)
#endif
return ret;



+ 1
- 0
examples/.gitignore View File

@@ -4,6 +4,7 @@ cucul
demo
demo0
dithering
driver
event
export
figfont


+ 4
- 1
examples/Makefile.am View File

@@ -2,7 +2,7 @@

AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/cucul -I$(top_srcdir)/caca -DDATADIR=\"$(pkgdatadir)\"

noinst_PROGRAMS = blit colors cucul demo demo0 dithering event export figfont font font2tga frames fullwidth gamma hsv input spritedit swallow text transform truecolor unicode import
noinst_PROGRAMS = blit colors cucul demo demo0 dithering driver event export figfont font font2tga frames fullwidth gamma hsv input spritedit swallow text transform truecolor unicode import

blit_SOURCES = blit.c
blit_LDADD = ../caca/libcaca.la ../cucul/libcucul.la
@@ -24,6 +24,9 @@ demo0_LDFLAGS = @MATH_LIBS@
dithering_SOURCES = dithering.c
dithering_LDADD = ../caca/libcaca.la ../cucul/libcucul.la

driver_SOURCES = driver.c
driver_LDADD = ../caca/libcaca.la ../cucul/libcucul.la

event_SOURCES = event.c
event_LDADD = ../caca/libcaca.la ../cucul/libcucul.la



+ 71
- 0
examples/driver.c View File

@@ -0,0 +1,71 @@
/*
* driver libcaca Unicode rendering test program
* Copyright (c) 2007 Sam Hocevar <sam@zoy.org>
* All Rights Reserved
*
* $Id$
*
* This program is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*/

#include "config.h"
#include "common.h"

#if !defined(__KERNEL__)
# include <stdio.h>
#endif

#include "cucul.h"
#include "caca.h"

int main(int argc, char *argv[])
{
char const * const * list;
caca_display_t *dp;
cucul_canvas_t *cv;

list = caca_get_display_driver_list();
if(argc <= 1)
{
printf("Available drivers:\n");

while(*list)
{
printf(" %s (%s)\n", list[0], list[1]);
list += 2;
}

return 0;
}

cv = cucul_create_canvas(0, 0);
if(cv == NULL)
{
printf("cannot create canvas\n");
return -1;
}
dp = caca_create_display_with_driver(cv, argv[1]);
if(dp == NULL)
{
printf("cannot create display\n");
return -1;
}

cucul_set_color_ansi(cv, CUCUL_WHITE, CUCUL_BLUE);
cucul_draw_line(cv, 0, 0, 9999, 0, ' ');
cucul_printf(cv, 1, 0, "Current driver: %s", argv[1]);

caca_refresh_display(dp);

caca_get_event(dp, CACA_EVENT_KEY_PRESS, NULL, -1);

caca_free_display(dp);
cucul_free_canvas(cv);

return 0;
}


Loading…
Cancel
Save