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
@@ -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) | |||
{ | |||
@@ -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 *); | |||
@@ -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 *); | |||
@@ -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; | |||
@@ -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; | |||
@@ -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; | |||
@@ -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; | |||
@@ -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; | |||
@@ -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; | |||
@@ -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; | |||
@@ -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; | |||
@@ -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; | |||
@@ -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; | |||
@@ -4,6 +4,7 @@ cucul | |||
demo | |||
demo0 | |||
dithering | |||
driver | |||
event | |||
export | |||
figfont | |||
@@ -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 | |||
@@ -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; | |||
} | |||