/*
INTEL CONFIDENTIAL
Copyright 2009 Intel Corporation All Rights Reserved.
The source code contained or described herein and all documents related to the source code ("Material") are owned by Intel Corporation or its suppliers or licensors. Title to the Material remains with Intel Corporation or its suppliers and licensors. The Material contains trade secrets and proprietary and confidential information of Intel or its suppliers and licensors. The Material is protected by worldwide copyright and trade secret laws and treaty provisions. No part of the Material may be used, copied, reproduced, modified, published, uploaded, posted, transmitted, distributed, or disclosed in any way without Intel’s prior express written permission.

No license under any patent, copyright, trade secret or other intellectual property right is granted to or conferred upon you by disclosure or delivery of the Materials, either expressly, by implication, inducement, estoppel or otherwise. Any license under such intellectual property rights must be express and approved by Intel in writing.
*/

#ifndef __MIX_DISPLAYX11_H__
#define __MIX_DISPLAYX11_H__

#include "mixdisplay.h"
#include "mixvideodef.h"
#include <X11/Xlib.h>

G_BEGIN_DECLS

/**
* MIX_TYPE_DISPLAYX11:
*
* Get type of class.
*/
#define MIX_TYPE_DISPLAYX11 (mix_displayx11_get_type ())

/**
* MIX_DISPLAYX11:
* @obj: object to be type-casted.
*/
#define MIX_DISPLAYX11(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIX_TYPE_DISPLAYX11, MixDisplayX11))

/**
* MIX_IS_DISPLAYX11:
* @obj: an object.
*
* Checks if the given object is an instance of #MixDisplay
*/
#define MIX_IS_DISPLAYX11(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIX_TYPE_DISPLAYX11))

/**
* MIX_DISPLAYX11_CLASS:
* @klass: class to be type-casted.
*/
#define MIX_DISPLAYX11_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MIX_TYPE_DISPLAYX11, MixDisplayX11Class))

/**
* MIX_IS_DISPLAYX11_CLASS:
* @klass: a class.
*
* Checks if the given class is #MixDisplayClass
*/
#define MIX_IS_DISPLAYX11_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MIX_TYPE_DISPLAYX11))

/**
* MIX_DISPLAYX11_GET_CLASS:
* @obj: a #MixDisplay object.
*
* Get the class instance of the object.
*/
#define MIX_DISPLAYX11_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MIX_TYPE_DISPLAYX11, MixDisplayX11Class))

typedef struct _MixDisplayX11 MixDisplayX11;
typedef struct _MixDisplayX11Class MixDisplayX11Class;

/**
* MixDisplayX11:
*
* MI-X VideoInit Parameter object
*/
struct _MixDisplayX11
{
    /*< public > */
    MixDisplay parent;

    /*< public > */

    /* Pointer to a X Window Display structure */
    Display *display;

    /* An X Window Drawable that is either a Window
     * or a Pixmap. This field is not used in
     * mix_video_initialize().
     * See X11/Xlib.h for Display and Drawable definitions.*/
    Drawable drawable;
};

/**
* MixDisplayX11Class:
*
* MI-X VideoInit object class
*/
struct _MixDisplayX11Class
{
    /*< public > */
    MixDisplayClass parent_class;

    /* class members */
};

/**
* mix_displayx11_get_type:
* @returns: type
*
* Get the type of object.
*/
GType mix_displayx11_get_type (void);

/**
* mix_displayx11_new:
* @returns: A newly allocated instance of #MixDisplayX11
*
* Use this method to create new instance of #MixDisplayX11
*/
MixDisplayX11 *mix_displayx11_new (void);
/**
* mix_displayx11_ref:
* @mix: object to add reference
* @returns: the #MixDisplayX11 instance where reference count has been increased.
*
* Add reference count.
*/
MixDisplayX11 *mix_displayx11_ref (MixDisplayX11 * mix);

/**
* mix_displayx11_unref:
* @obj: object to unref.
*
* Decrement reference count of the object.
*/
#define mix_displayx11_unref(obj) mix_display_unref(MIX_DISPLAY(obj))

/* Class Methods */


/**
 * mix_displayx11_set_display:
 * @obj: #MixDisplayX11 object
 * @display: Pointer to a X Window Display structure
 * @returns: <link linkend="MixVideo-mixvideodef">Common Video Error Return Codes</link>
 *
 * Set Display
 */
MIX_RESULT mix_displayx11_set_display (MixDisplayX11 * obj,
                                       Display * display);

/**
 * mix_displayx11_get_display:
 * @obj: #MixDisplayX11 object
 * @display: Pointer to pointer of X Window Display structure
 * @returns: <link linkend="MixVideo-mixvideodef">Common Video Error Return Codes</link>
 *
 * Get Display
 */
MIX_RESULT mix_displayx11_get_display (MixDisplayX11 * obj,
                                       Display ** dislay);

/**
 * mix_displayx11_set_drawable:
 * @obj: #MixDisplayX11 object
 * @drawable: An X Window Drawable that is either a Window or a Pixmap.
 * @returns: <link linkend="MixVideo-mixvideodef">Common Video Error Return Codes</link>
 *
 * Set drawable
 */
MIX_RESULT mix_displayx11_set_drawable (MixDisplayX11 * obj,
                                        Drawable drawable);

/**
 * mix_displayx11_get_drawable:
 * @obj: #MixDisplayX11 object
 * @drawable: An X Window Drawable that is either a Window or a Pixmap to be returned.
 * @returns: <link linkend="MixVideo-mixvideodef">Common Video Error Return Codes</link>
 *
 * Get drawable
 */
MIX_RESULT mix_displayx11_get_drawable (MixDisplayX11 * obj,
                                        Drawable * drawable);

G_END_DECLS

#endif /* __MIX_DISPLAYX11_H__ */
