and return a value.tags/v0.99.beta14
| @@ -23,6 +23,9 @@ | |||||
| #if !defined(__KERNEL__) | #if !defined(__KERNEL__) | ||||
| # include <stdlib.h> | # include <stdlib.h> | ||||
| # include <string.h> | # include <string.h> | ||||
| # if defined(HAVE_ERRNO_H) | |||||
| # include <errno.h> | |||||
| # endif | |||||
| #endif | #endif | ||||
| #include "cucul.h" | #include "cucul.h" | ||||
| @@ -30,7 +33,7 @@ | |||||
| #include "caca.h" | #include "caca.h" | ||||
| #include "caca_internals.h" | #include "caca_internals.h" | ||||
| static int caca_init_driver(caca_display_t *dp); | |||||
| static int caca_select_driver(caca_display_t *dp); | |||||
| /** \brief Attach a caca graphical context to a cucul canvas. | /** \brief Attach a caca graphical context to a cucul canvas. | ||||
| * | * | ||||
| @@ -39,6 +42,10 @@ static int caca_init_driver(caca_display_t *dp); | |||||
| * libcucul canvas. Everything that gets drawn in the libcucul canvas can | * libcucul canvas. Everything that gets drawn in the libcucul canvas can | ||||
| * then be displayed by the libcaca driver. | * then be displayed by the libcaca 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 cavas. | ||||
| * \return The caca graphical context or NULL if an error occurred. | * \return The caca graphical context or NULL if an error occurred. | ||||
| */ | */ | ||||
| @@ -46,17 +53,31 @@ caca_display_t * caca_create_display(cucul_canvas_t * cv) | |||||
| { | { | ||||
| caca_display_t *dp = malloc(sizeof(caca_display_t)); | caca_display_t *dp = malloc(sizeof(caca_display_t)); | ||||
| if(!dp) | |||||
| { | |||||
| #if defined(HAVE_ERRNO_H) | |||||
| errno = ENOMEM; | |||||
| #endif | |||||
| return NULL; | |||||
| } | |||||
| dp->cv = cv; | dp->cv = cv; | ||||
| if(caca_init_driver(dp)) | |||||
| if(caca_select_driver(dp)) | |||||
| { | { | ||||
| free(dp); | free(dp); | ||||
| #if defined(HAVE_ERRNO_H) | |||||
| errno = ENODEV; | |||||
| #endif | |||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| if(dp->drv.init_graphics(dp)) | if(dp->drv.init_graphics(dp)) | ||||
| { | { | ||||
| free(dp); | free(dp); | ||||
| #if defined(HAVE_ERRNO_H) | |||||
| errno = ENODEV; | |||||
| #endif | |||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| @@ -99,20 +120,25 @@ caca_display_t * caca_create_display(cucul_canvas_t * cv) | |||||
| * libcucul canvas continues to exist and other graphical contexts can be | * libcucul canvas continues to exist and other graphical contexts can be | ||||
| * attached to it afterwards. | * attached to it afterwards. | ||||
| * | * | ||||
| * This function never fails. | |||||
| * | |||||
| * \param dp The libcaca graphical context. | * \param dp The libcaca graphical context. | ||||
| * \return This function always returns 0. | |||||
| */ | */ | ||||
| void caca_free_display(caca_display_t *dp) | |||||
| int caca_free_display(caca_display_t *dp) | |||||
| { | { | ||||
| dp->drv.end_graphics(dp); | dp->drv.end_graphics(dp); | ||||
| dp->cv->refcount--; | dp->cv->refcount--; | ||||
| free(dp); | free(dp); | ||||
| return 0; | |||||
| } | } | ||||
| /* | /* | ||||
| * XXX: The following functions are local. | * XXX: The following functions are local. | ||||
| */ | */ | ||||
| static int caca_init_driver(caca_display_t *dp) | |||||
| static int caca_select_driver(caca_display_t *dp) | |||||
| { | { | ||||
| #if defined(HAVE_GETENV) && defined(HAVE_STRCASECMP) | #if defined(HAVE_GETENV) && defined(HAVE_STRCASECMP) | ||||
| char *var = getenv("CACA_DRIVER"); | char *var = getenv("CACA_DRIVER"); | ||||
| @@ -150,9 +150,9 @@ enum caca_key | |||||
| * | * | ||||
| * @{ */ | * @{ */ | ||||
| caca_display_t * caca_create_display(cucul_canvas_t *); | caca_display_t * caca_create_display(cucul_canvas_t *); | ||||
| void caca_free_display(caca_display_t *); | |||||
| void caca_refresh_display(caca_display_t *); | |||||
| void caca_set_display_time(caca_display_t *, unsigned int); | |||||
| int caca_free_display(caca_display_t *); | |||||
| int caca_refresh_display(caca_display_t *); | |||||
| int caca_set_display_time(caca_display_t *, unsigned int); | |||||
| unsigned int caca_get_display_time(caca_display_t *); | unsigned int caca_get_display_time(caca_display_t *); | ||||
| unsigned int caca_get_display_width(caca_display_t *); | unsigned int caca_get_display_width(caca_display_t *); | ||||
| unsigned int caca_get_display_height(caca_display_t *); | unsigned int caca_get_display_height(caca_display_t *); | ||||
| @@ -168,7 +168,7 @@ int caca_set_display_title(caca_display_t *, char const *); | |||||
| int caca_get_event(caca_display_t *, unsigned int, caca_event_t *, int); | int caca_get_event(caca_display_t *, unsigned int, caca_event_t *, int); | ||||
| unsigned int caca_get_mouse_x(caca_display_t *); | unsigned int caca_get_mouse_x(caca_display_t *); | ||||
| unsigned int caca_get_mouse_y(caca_display_t *); | unsigned int caca_get_mouse_y(caca_display_t *); | ||||
| void caca_set_mouse(caca_display_t *, int); | |||||
| int caca_set_mouse(caca_display_t *, int); | |||||
| /* @} */ | /* @} */ | ||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||
| @@ -79,7 +79,7 @@ static int conio_end_graphics(caca_display_t *dp) | |||||
| static int conio_set_display_title(caca_display_t *dp, char const *title) | static int conio_set_display_title(caca_display_t *dp, char const *title) | ||||
| { | { | ||||
| return 0; | |||||
| return -1; | |||||
| } | } | ||||
| static unsigned int conio_get_display_width(caca_display_t *dp) | static unsigned int conio_get_display_width(caca_display_t *dp) | ||||
| @@ -178,7 +178,7 @@ static int ncurses_end_graphics(caca_display_t *dp) | |||||
| static int ncurses_set_display_title(caca_display_t *dp, char const *title) | static int ncurses_set_display_title(caca_display_t *dp, char const *title) | ||||
| { | { | ||||
| return 0; | |||||
| return -1; | |||||
| } | } | ||||
| static unsigned int ncurses_get_display_width(caca_display_t *dp) | static unsigned int ncurses_get_display_width(caca_display_t *dp) | ||||
| @@ -39,7 +39,7 @@ static int raw_end_graphics(caca_display_t *dp) | |||||
| static int raw_set_display_title(caca_display_t *dp, char const *title) | static int raw_set_display_title(caca_display_t *dp, char const *title) | ||||
| { | { | ||||
| return 0; | |||||
| return -1; | |||||
| } | } | ||||
| static unsigned int raw_get_display_width(caca_display_t *dp) | static unsigned int raw_get_display_width(caca_display_t *dp) | ||||
| @@ -183,7 +183,7 @@ static int slang_end_graphics(caca_display_t *dp) | |||||
| static int slang_set_display_title(caca_display_t *dp, char const *title) | static int slang_set_display_title(caca_display_t *dp, char const *title) | ||||
| { | { | ||||
| /* FIXME */ | /* FIXME */ | ||||
| return 0; | |||||
| return -1; | |||||
| } | } | ||||
| static unsigned int slang_get_display_width(caca_display_t *dp) | static unsigned int slang_get_display_width(caca_display_t *dp) | ||||
| @@ -97,7 +97,7 @@ static int vga_end_graphics(caca_display_t *dp) | |||||
| static int vga_set_display_title(caca_display_t *dp, char const *title) | static int vga_set_display_title(caca_display_t *dp, char const *title) | ||||
| { | { | ||||
| /* Unsupported, of course. */ | /* Unsupported, of course. */ | ||||
| return 0; | |||||
| return -1; | |||||
| } | } | ||||
| static unsigned int vga_get_display_width(caca_display_t *dp) | static unsigned int vga_get_display_width(caca_display_t *dp) | ||||
| @@ -44,7 +44,7 @@ static int _lowlevel_event(caca_display_t *, caca_event_t *); | |||||
| * | * | ||||
| * This function polls the event queue for mouse or keyboard events matching | * This function polls the event queue for mouse or keyboard events matching | ||||
| * the event mask and returns the first matching event. Non-matching events | * the event mask and returns the first matching event. Non-matching events | ||||
| * are discarded. \c event_mask must have a non-zero value. | |||||
| * are discarded. If \c event_mask is zero, the function returns immediately. | |||||
| * | * | ||||
| * The timeout value tells how long this function needs to wait for an | * The timeout value tells how long this function needs to wait for an | ||||
| * event. A value of zero returns immediately and the function returns zero | * event. A value of zero returns immediately and the function returns zero | ||||
| @@ -55,6 +55,8 @@ static int _lowlevel_event(caca_display_t *, caca_event_t *); | |||||
| * received. If null, the function will return but no information about | * received. If null, the function will return but no information about | ||||
| * the event will be sent. | * the event will be sent. | ||||
| * | * | ||||
| * This function never fails. | |||||
| * | |||||
| * \param dp The libcaca graphical context. | * \param dp The libcaca graphical context. | ||||
| * \param event_mask Bitmask of requested events. | * \param event_mask Bitmask of requested events. | ||||
| * \param timeout A timeout value in microseconds, -1 for blocking behaviour | * \param timeout A timeout value in microseconds, -1 for blocking behaviour | ||||
| @@ -117,6 +119,8 @@ int caca_get_event(caca_display_t *dp, unsigned int event_mask, | |||||
| * drivers are being used, because mouse position is only detected when | * drivers are being used, because mouse position is only detected when | ||||
| * the mouse is clicked. Other drivers such as X11 work well. | * the mouse is clicked. Other drivers such as X11 work well. | ||||
| * | * | ||||
| * This function never fails. | |||||
| * | |||||
| * \param dp The libcaca graphical context. | * \param dp The libcaca graphical context. | ||||
| * \return The X mouse coordinate. | * \return The X mouse coordinate. | ||||
| */ | */ | ||||
| @@ -135,6 +139,8 @@ unsigned int caca_get_mouse_x(caca_display_t *dp) | |||||
| * drivers are being used, because mouse position is only detected when | * drivers are being used, because mouse position is only detected when | ||||
| * the mouse is clicked. Other drivers such as X11 work well. | * the mouse is clicked. Other drivers such as X11 work well. | ||||
| * | * | ||||
| * This function never fails. | |||||
| * | |||||
| * \param dp The libcaca graphical context. | * \param dp The libcaca graphical context. | ||||
| * \return The Y mouse coordinate. | * \return The Y mouse coordinate. | ||||
| */ | */ | ||||
| @@ -18,6 +18,12 @@ | |||||
| #include "config.h" | #include "config.h" | ||||
| #include "common.h" | #include "common.h" | ||||
| #if !defined(__KERNEL__) | |||||
| # if defined(HAVE_ERRNO_H) | |||||
| # include <errno.h> | |||||
| # endif | |||||
| #endif | |||||
| #include "caca.h" | #include "caca.h" | ||||
| #include "caca_internals.h" | #include "caca_internals.h" | ||||
| #include "cucul.h" | #include "cucul.h" | ||||
| @@ -26,15 +32,25 @@ | |||||
| /** \brief Set the display title. | /** \brief Set the display title. | ||||
| * | * | ||||
| * If libcaca runs in a window, try to change its title. This works with | * If libcaca runs in a window, try to change its title. This works with | ||||
| * the X11 and Win32 drivers. | |||||
| * the OpenGL, X11 and Win32 drivers. | |||||
| * | |||||
| * If an error occurs, -1 is returned and \b errno is set accordingly: | |||||
| * - \c ENOSYS Display driver does not support setting the window title. | |||||
| * | * | ||||
| * \param dp The libcaca display context. | * \param dp The libcaca display context. | ||||
| * \param title The desired display title. | * \param title The desired display title. | ||||
| * \return 0 upon success, a non-zero value if an error occurs. | |||||
| * \return 0 upon success, -1 if an error occurred. | |||||
| */ | */ | ||||
| int caca_set_display_title(caca_display_t *dp, char const *title) | int caca_set_display_title(caca_display_t *dp, char const *title) | ||||
| { | { | ||||
| return dp->drv.set_display_title(dp, title); | |||||
| int ret = dp->drv.set_display_title(dp, title); | |||||
| #if defined(HAVE_ERRNO_H) | |||||
| if(ret) | |||||
| errno = ENOSYS; | |||||
| #endif | |||||
| return ret; | |||||
| } | } | ||||
| /** \brief Get the display width. | /** \brief Get the display width. | ||||
| @@ -44,6 +60,8 @@ int caca_set_display_title(caca_display_t *dp, char const *title) | |||||
| * or if there is no way to know the font size, most drivers will assume a | * or if there is no way to know the font size, most drivers will assume a | ||||
| * 6x10 font is being used. Note that the units are not necessarily pixels. | * 6x10 font is being used. Note that the units are not necessarily pixels. | ||||
| * | * | ||||
| * This function never fails. | |||||
| * | |||||
| * \param dp The libcaca display context. | * \param dp The libcaca display context. | ||||
| * \return The display width. | * \return The display width. | ||||
| */ | */ | ||||
| @@ -59,6 +77,8 @@ unsigned int caca_get_display_width(caca_display_t *dp) | |||||
| * or if there is no way to know the font size, assume a 6x10 font is being | * or if there is no way to know the font size, assume a 6x10 font is being | ||||
| * used. Note that the units are not necessarily pixels. | * used. Note that the units are not necessarily pixels. | ||||
| * | * | ||||
| * This function never fails. | |||||
| * | |||||
| * \param dp The libcaca display context. | * \param dp The libcaca display context. | ||||
| * \return The display height. | * \return The display height. | ||||
| */ | */ | ||||
| @@ -76,12 +96,16 @@ unsigned int caca_get_display_height(caca_display_t *dp) | |||||
| * If the argument is zero, constant framerate is disabled. This is the | * If the argument is zero, constant framerate is disabled. This is the | ||||
| * default behaviour. | * default behaviour. | ||||
| * | * | ||||
| * This function never fails. | |||||
| * | |||||
| * \param dp The libcaca display context. | * \param dp The libcaca display context. | ||||
| * \param usec The refresh delay in microseconds. | * \param usec The refresh delay in microseconds. | ||||
| * \return This function always returns 0. | |||||
| */ | */ | ||||
| void caca_set_display_time(caca_display_t *dp, unsigned int usec) | |||||
| int caca_set_display_time(caca_display_t *dp, unsigned int usec) | |||||
| { | { | ||||
| dp->delay = usec; | dp->delay = usec; | ||||
| return 0; | |||||
| } | } | ||||
| /** \brief Get the display's average rendering time. | /** \brief Get the display's average rendering time. | ||||
| @@ -92,6 +116,8 @@ void caca_set_display_time(caca_display_t *dp, unsigned int usec) | |||||
| * average rendering time will not be considerably shorter than the requested | * average rendering time will not be considerably shorter than the requested | ||||
| * delay even if the real rendering time was shorter. | * delay even if the real rendering time was shorter. | ||||
| * | * | ||||
| * This function never fails. | |||||
| * | |||||
| * \param dp The libcaca display context. | * \param dp The libcaca display context. | ||||
| * \return The render time in microseconds. | * \return The render time in microseconds. | ||||
| */ | */ | ||||
| @@ -112,9 +138,12 @@ unsigned int caca_get_display_time(caca_display_t *dp) | |||||
| * a time range shorter than the value set with caca_set_display_time(), | * a time range shorter than the value set with caca_set_display_time(), | ||||
| * the second call will be delayed before performing the screen refresh. | * the second call will be delayed before performing the screen refresh. | ||||
| * | * | ||||
| * This function never fails. | |||||
| * | |||||
| * \param dp The libcaca display context. | * \param dp The libcaca display context. | ||||
| * \return This function always returns 0. | |||||
| */ | */ | ||||
| void caca_refresh_display(caca_display_t *dp) | |||||
| int caca_refresh_display(caca_display_t *dp) | |||||
| { | { | ||||
| #if !defined(_DOXYGEN_SKIP_ME) | #if !defined(_DOXYGEN_SKIP_ME) | ||||
| #define IDLE_USEC 5000 | #define IDLE_USEC 5000 | ||||
| @@ -147,6 +176,8 @@ void caca_refresh_display(caca_display_t *dp) | |||||
| /* If we drifted too much, it's bad, bad, bad. */ | /* If we drifted too much, it's bad, bad, bad. */ | ||||
| if(dp->lastticks > (int)dp->delay) | if(dp->lastticks > (int)dp->delay) | ||||
| dp->lastticks = 0; | dp->lastticks = 0; | ||||
| return 0; | |||||
| } | } | ||||
| /** \brief Show or hide the mouse pointer. | /** \brief Show or hide the mouse pointer. | ||||
| @@ -154,14 +185,26 @@ void caca_refresh_display(caca_display_t *dp) | |||||
| * This function shows or hides the mouse pointer, for devices that | * This function shows or hides the mouse pointer, for devices that | ||||
| * support it. | * support it. | ||||
| * | * | ||||
| * If an error occurs, -1 is returned and \b errno is set accordingly: | |||||
| * - \c ENOSYS Display driver does not support hiding the mouse pointer. | |||||
| * | |||||
| * \param dp The libcaca display context. | * \param dp The libcaca display context. | ||||
| * \param flag 0 hides the pointer, 1 shows the system's default pointer | * \param flag 0 hides the pointer, 1 shows the system's default pointer | ||||
| * (usually an arrow). Other values are reserved for future use. | * (usually an arrow). Other values are reserved for future use. | ||||
| * \return 0 upon success, -1 if an error occurred. | |||||
| */ | */ | ||||
| void caca_set_mouse(caca_display_t *dp, int flag) | |||||
| int caca_set_mouse(caca_display_t *dp, int flag) | |||||
| { | { | ||||
| if(dp->drv.set_mouse) | |||||
| dp->drv.set_mouse(dp, flag); | |||||
| if(!dp->drv.set_mouse) | |||||
| { | |||||
| #if defined(HAVE_ERRNO_H) | |||||
| errno = ENOSYS; | |||||
| #endif | |||||
| return -1; | |||||
| } | |||||
| dp->drv.set_mouse(dp, flag); | |||||
| return 0; | |||||
| } | } | ||||
| /* | /* | ||||