#ifndef XOSD_H
#define XOSD_H


#ifdef __cplusplus
extern "C"
{
#endif

#ifndef __deprecated
#if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3
#define __deprecated	__attribute__((deprecated))
#else
#define __deprecated
#endif
#endif

/* Error message when a routine returns failure */
  extern const char *xosd_error;
  extern const char * const osd_default_font;
  extern const char * const osd_default_colour;

/* The XOSD display "object" */
  typedef struct xosd xosd;

/* The type of data that can be displayed. */
  typedef enum
  {
    XOSD_percentage,            /* Percentage bar (like a progress bar) */
    XOSD_string,                /* Text */
    XOSD_printf,                /* Formatted Text */
    XOSD_slider                 /* Slider (like a volume control) */
  } xosd_command;

/* Position of the display */
  typedef enum
  {
    XOSD_top = 0,               /* Top of the screen. */
    XOSD_bottom,                /* Bottom of the screen. */
    XOSD_middle                 /* middle of the screen. */
  } xosd_pos;

/* Alignment of the display */
  typedef enum
  {
    XOSD_left = 0,
    XOSD_center,
    XOSD_right
  } xosd_align;

/* xosd_create -- Create a new xosd "object"
 *
 * ARGUMENTS
 *     number_lines   Number of lines of the display.
 *
 * RETURNS
 *     A new xosd structure.
 */
  xosd *xosd_create(int number_lines);

/*
 * xosd_create_xinerama -- Create a new xosd "object" choosing xinerama screen
 *
 * ARGUMENTS
 *     number_lines     Number of lines of the display.
 *     xinerama_screen  # of xinerama screen to be used, -1 for all screens.
 *
 * RETURNS
 *     A new xosd structure
 */
  xosd *xosd_create_xinerama(int number_lines, int xinerama_screen);

/* xosd_init -- Create a new xosd "object" -- deprecated by xosd_create
 *
 * ARGUMENTS
 *     font           X Logical Font Descriptor, see "xfontsel".
 *     colour         X colour, see "rgb.txt" that comes with your X11
 *                    distribution.
 *     timeout        Seconds before the display is hidden (-1 for
 *                    never).
 *     pos            Position to write text (top or bottom).
 *     offset         Number of pixels between the "pos" and the
 *                    text.
 *     shadow_offset  Number of pixels that the shadow is offset from
 *                    the text.
 *     number_lines   Number of lines of the display.
 *
 * RETURNS
 *     A new xosd structure.
 */
  xosd *__deprecated xosd_init(const char *font, const char *colour,
                               int timeout, xosd_pos pos, int offset,
                               int shadow_offset, int number_lines);

/* xosd_destroy -- Destroy a xosd "object"
 *
 * ARGUMENTS
 *     osd  The xosd "object" to destroy.
 *
 * RETURNS
 *   0 on success
 *  -1 on failure
 */
  int xosd_destroy(xosd * osd);

/* xosd_uninit -- Destroy a xosd "object -- deprecated by xosd_destroy
 *
 * ARGUMENTS
 *     osd  The xosd "object" to destroy.
 *
 * RETURNS
 *   0 on success
 *  -1 on failure
 */
  int __deprecated xosd_uninit(xosd * osd);

/* xosd_set_bar_length  -- Set length of percentage and slider bar
 *
 * ARGUMENTS
 *     osd     The xosd "object"
 *     length  Desired bar length (set to -1 for old behaviour)
 *
 * RETURNS
 *     -1 on error (invalid xosd object).
 *      0 on success
 */
  int xosd_set_bar_length(xosd * osd, int length);

/* xosd_display -- Display information
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *     line     Which one of "NLINES" to display.
 *     command  The type of information to display.
 *     ...      The argument to "command":
 *                  int     (between 0 and 100) if "command" is
 *                          "XOSD_percentage",
 *                  char *  if "command" is "XOSD_string",
 *                  int     (between 0 and 100) if "command" is
 *                          "XOSD_slider".
 * RETURNS
 *     The percentage (between 0 and 100) for "XOSD_percentage" or
 *     "XOSD_slider", or the number of characters displayed for
 *     "XOSD_string". -1 is returned on failure.
 */
  int xosd_display(xosd * osd, int line, xosd_command command, ...);

/* xosd_is_onscreen -- Returns weather the display is show
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *
 * RETURNS
 *     1 if the display is shown (mapped)
 *     0 otherwise
 *    -1 on failure
 */
  int xosd_is_onscreen(xosd * osd);

/* xosd_wait_until_no_display -- Wait until nothing is displayed
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *
 * RETURNS
 *   0 on success
 *  -1 on failure
 */
  int xosd_wait_until_no_display(xosd * osd);

/* xosd_hide -- hide the display
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *
 * RETURNS
 *   0 on success
 *  -1 on failure
 */
  int xosd_hide(xosd * osd);

/* xosd_show -- Show the display after being hidden
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *
 * RETURNS
 *   0 on success
 *  -1 on failure
 */
  int xosd_show(xosd * osd);

/* xosd_set_pos -- Change the vertical position of the display
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *     pos      The new position of the display: top middle bottom
 *
 * RETURNS
 *   0 on success
 *  -1 on failure
 */
  int xosd_set_pos(xosd * osd, xosd_pos pos);

/* xosd_set_align -- Change the horizontal alignment of the display
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *     align    The new alignment of the display: left center right
 *
 * RETURNS
 *   0 on success
 *  -1 on failure
 */
  int xosd_set_align(xosd * osd, xosd_align align);

/* xosd_set_shadow_offset -- Change the offset of the text shadow
 *
 * ARGUMENTS
 *     osd            The xosd "object".
 *     shadow_offset  The new shadow offset in pixels.
 *
 * RETURNS
 *   0 on success
 *  -1 on failure
 */
  int xosd_set_shadow_offset(xosd * osd, int shadow_offset);

/* xosd_set_outline_offset -- Change the offset of the text outline
 *
 * ARGUMENTS
 *     osd             The xosd "object".
 *     outline_offset  The new outline offset in pixels.
 *
 *  The outline is drawn over the shadow.
 *
 * RETURNS
 *   0 on success
 *  -1 on failure
 */
  int xosd_set_outline_offset(xosd * osd, int outline_offset);

/* xosd_set_bbox_offset -- Change the offset of the text bounding box
 *
 * ARGUMENTS
 *     osd            The xosd "object".
 *     bbox_offset    The new bounding box offset in pixels.
 *
 *  The outline is drawn over the shadow.  The bounding box is drawn
 *  under the outline and shadow.
 *
 * RETURNS
 *   0 on success
 *  -1 on failure
 */
  int xosd_set_bbox_offset(xosd * osd, int bbox_offset);

/* xosd_set_shadow_colour -- Change the colour of the shadow
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *     colour   The new colour of the display.  (See "rgb.txt" in the
 *              X11 distribution of a list of colours.)
 *
 * RETURNS
 *   0 on success
 *  -1 on failure, and colour is set to black
 */
  int xosd_set_shadow_colour(xosd * osd, const char *colour);

/* xosd_set_outline_colour -- Change the colour of the outline
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *     colour   The new colour of the display.  (See "rgb.txt" in the
 *              X11 distribution of a list of colours.)
 *
 * RETURNS
 *   0 on success
 *  -1 on failure, and colour is set to black
 */
  int xosd_set_outline_colour(xosd * osd, const char *colour);

/* xosd_set_bbox_colour -- Change the colour of the bounding box
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *     colour   The new colour of the display.  (See "rgb.txt" in the
 *              X11 distribution of a list of colours.)
 *
 * RETURNS
 *   0 on success
 *  -1 on failure, and colour is set to black
 */
  int xosd_set_bbox_colour(xosd * osd, const char *colour);

/* xosd_set_horizontal_offset -- Change the number of pixels the display is
 *                    offset from the position
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *     offset   The number of pixels the display is offset from the
 *              position.
 *
 * RETURNS
 *   0 on success
 *  -1 on failure
 */
  int xosd_set_horizontal_offset(xosd * osd, int offset);

/* xosd_set_vertical_offset -- Change the number of pixels the display is
 *                    offset from the position
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *     offset   The number of pixels the display is offset from the
 *              position.
 *
 * RETURNS
 *   0 on success
 *  -1 on failure
 */
  int xosd_set_vertical_offset(xosd * osd, int offset);

/* xosd_set_timeout -- Change the time before display is hidden.
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *     timeout  The number of seconds before the display is hidden.
 *
 * RETURNS
 *   0 on success
 *  -1 on failure
 */
  int xosd_set_timeout(xosd * osd, int timeout);

/* xosd_set_colour -- Change the colour of the display
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *     colour   The new colour of the display.  (See "rgb.txt" in the
 *              X11 distribution of a list of colours.)
 *
 * RETURNS
 *   0 on success
 *  -1 on failure, and colour is set to white
 */
  int xosd_set_colour(xosd * osd, const char *colour);

/* xosd_set_font -- Change the text-display font
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *     font     The XLFD of the new font, see "xfontsel".
 *
 * RETURNS
 *     0 on success
 *    -1 on failure
 */
  int xosd_set_font(xosd * osd, const char *font);

/* xosd_get_colour -- Gets the RGB value of the display's colour
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *     red      Return value for the red value.
 *     green    Return value for the green value.
 *     blue     Return value for the blue value.
 *
 * RETURNS
 *   0 on success
 *  -1 on failure
 */
  int xosd_get_colour(xosd * osd, int *red, int *green, int *blue);

/* xosd_scroll -- Scroll the display
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *     lines    The number of lines to scroll the display.
 *
 * RETURNS
 *   0 on success
 *  -1 on failure
 */
  int xosd_scroll(xosd * osd, int lines);

/* xosd_get_number_lines -- Get the maximum number of lines allowed
 *
 * ARGUMENTS
 *     osd      The xosd "object".
 *
 * RETURNS
 *   the number of lines on success
 *  -1 on failure
 */
  int xosd_get_number_lines(xosd * osd);

#ifdef __cplusplus
};
#endif


#endif