and return a value.tags/v0.99.beta14
| @@ -23,6 +23,9 @@ | |||
| #if !defined(__KERNEL__) | |||
| # include <stdlib.h> | |||
| # include <string.h> | |||
| # if defined(HAVE_ERRNO_H) | |||
| # include <errno.h> | |||
| # endif | |||
| #endif | |||
| #include "cucul.h" | |||
| @@ -30,7 +33,7 @@ | |||
| #include "caca.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. | |||
| * | |||
| @@ -39,6 +42,10 @@ static int caca_init_driver(caca_display_t *dp); | |||
| * libcucul canvas. Everything that gets drawn in the libcucul canvas can | |||
| * 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. | |||
| * \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)); | |||
| if(!dp) | |||
| { | |||
| #if defined(HAVE_ERRNO_H) | |||
| errno = ENOMEM; | |||
| #endif | |||
| return NULL; | |||
| } | |||
| dp->cv = cv; | |||
| if(caca_init_driver(dp)) | |||
| if(caca_select_driver(dp)) | |||
| { | |||
| free(dp); | |||
| #if defined(HAVE_ERRNO_H) | |||
| errno = ENODEV; | |||
| #endif | |||
| return NULL; | |||
| } | |||
| if(dp->drv.init_graphics(dp)) | |||
| { | |||
| free(dp); | |||
| #if defined(HAVE_ERRNO_H) | |||
| errno = ENODEV; | |||
| #endif | |||
| 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 | |||
| * attached to it afterwards. | |||
| * | |||
| * This function never fails. | |||
| * | |||
| * \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->cv->refcount--; | |||
| free(dp); | |||
| return 0; | |||
| } | |||
| /* | |||
| * 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) | |||
| char *var = getenv("CACA_DRIVER"); | |||
| @@ -150,9 +150,9 @@ enum caca_key | |||
| * | |||
| * @{ */ | |||
| 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_width(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); | |||
| unsigned int caca_get_mouse_x(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 | |||
| @@ -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) | |||
| { | |||
| return 0; | |||
| return -1; | |||
| } | |||
| 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) | |||
| { | |||
| return 0; | |||
| return -1; | |||
| } | |||
| 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) | |||
| { | |||
| return 0; | |||
| return -1; | |||
| } | |||
| 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) | |||
| { | |||
| /* FIXME */ | |||
| return 0; | |||
| return -1; | |||
| } | |||
| 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) | |||
| { | |||
| /* Unsupported, of course. */ | |||
| return 0; | |||
| return -1; | |||
| } | |||
| 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 | |||
| * 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 | |||
| * 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 | |||
| * the event will be sent. | |||
| * | |||
| * This function never fails. | |||
| * | |||
| * \param dp The libcaca graphical context. | |||
| * \param event_mask Bitmask of requested events. | |||
| * \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 | |||
| * the mouse is clicked. Other drivers such as X11 work well. | |||
| * | |||
| * This function never fails. | |||
| * | |||
| * \param dp The libcaca graphical context. | |||
| * \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 | |||
| * the mouse is clicked. Other drivers such as X11 work well. | |||
| * | |||
| * This function never fails. | |||
| * | |||
| * \param dp The libcaca graphical context. | |||
| * \return The Y mouse coordinate. | |||
| */ | |||
| @@ -18,6 +18,12 @@ | |||
| #include "config.h" | |||
| #include "common.h" | |||
| #if !defined(__KERNEL__) | |||
| # if defined(HAVE_ERRNO_H) | |||
| # include <errno.h> | |||
| # endif | |||
| #endif | |||
| #include "caca.h" | |||
| #include "caca_internals.h" | |||
| #include "cucul.h" | |||
| @@ -26,15 +32,25 @@ | |||
| /** \brief Set the display title. | |||
| * | |||
| * 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 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) | |||
| { | |||
| 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. | |||
| @@ -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 | |||
| * 6x10 font is being used. Note that the units are not necessarily pixels. | |||
| * | |||
| * This function never fails. | |||
| * | |||
| * \param dp The libcaca display context. | |||
| * \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 | |||
| * used. Note that the units are not necessarily pixels. | |||
| * | |||
| * This function never fails. | |||
| * | |||
| * \param dp The libcaca display context. | |||
| * \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 | |||
| * default behaviour. | |||
| * | |||
| * This function never fails. | |||
| * | |||
| * \param dp The libcaca display context. | |||
| * \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; | |||
| return 0; | |||
| } | |||
| /** \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 | |||
| * delay even if the real rendering time was shorter. | |||
| * | |||
| * This function never fails. | |||
| * | |||
| * \param dp The libcaca display context. | |||
| * \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(), | |||
| * the second call will be delayed before performing the screen refresh. | |||
| * | |||
| * This function never fails. | |||
| * | |||
| * \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) | |||
| #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(dp->lastticks > (int)dp->delay) | |||
| dp->lastticks = 0; | |||
| return 0; | |||
| } | |||
| /** \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 | |||
| * 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 flag 0 hides the pointer, 1 shows the system's default pointer | |||
| * (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; | |||
| } | |||
| /* | |||