1/*
2 INTEL CONFIDENTIAL
3 Copyright 2009 Intel Corporation All Rights Reserved.
4 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.
5
6 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.
7 */
8
9/**
10 * SECTION:mixdisplayx11
11 * @short_description: VideoInit parameters
12 *
13 * A data object which stores videoinit specific parameters.
14 */
15
16#include "mixdisplayx11.h"
17
18#define SAFE_FREE(p) if(p) { g_free(p); p = NULL; }
19
20static GType _mix_displayx11_type = 0;
21static MixDisplayClass *parent_class = NULL;
22
23#define _do_init { _mix_displayx11_type = g_define_type_id; }
24
25gboolean mix_displayx11_copy(MixDisplay * target, const MixDisplay * src);
26MixDisplay *mix_displayx11_dup(const MixDisplay * obj);
27gboolean mix_displayx11_equal(MixDisplay * first, MixDisplay * second);
28static void mix_displayx11_finalize(MixDisplay * obj);
29
30G_DEFINE_TYPE_WITH_CODE (MixDisplayX11, mix_displayx11,
31		MIX_TYPE_DISPLAY, _do_init);
32
33static void mix_displayx11_init(MixDisplayX11 * self) {
34
35	/* Initialize member varibles */
36	self->display = NULL;
37	self->drawable = 0;
38}
39
40static void mix_displayx11_class_init(MixDisplayX11Class * klass) {
41	MixDisplayClass *mixdisplay_class = MIX_DISPLAY_CLASS(klass);
42
43	/* setup static parent class */
44	parent_class = (MixDisplayClass *) g_type_class_peek_parent(klass);
45
46	mixdisplay_class->finalize = mix_displayx11_finalize;
47	mixdisplay_class->copy = (MixDisplayCopyFunction) mix_displayx11_copy;
48	mixdisplay_class->dup = (MixDisplayDupFunction) mix_displayx11_dup;
49	mixdisplay_class->equal = (MixDisplayEqualFunction) mix_displayx11_equal;
50}
51
52MixDisplayX11 *
53mix_displayx11_new(void) {
54	MixDisplayX11 *ret = (MixDisplayX11 *) g_type_create_instance(
55			MIX_TYPE_DISPLAYX11);
56
57	return ret;
58}
59
60void mix_displayx11_finalize(MixDisplay * obj) {
61	/* clean up here. */
62	/* MixDisplayX11 *self = MIX_DISPLAYX11 (obj); */
63
64	/* NOTE: we don't need to do anything
65	 * with display and drawable */
66
67	/* Chain up parent */
68	if (parent_class->finalize)
69		parent_class->finalize(obj);
70}
71
72MixDisplayX11 *
73mix_displayx11_ref(MixDisplayX11 * mix) {
74	return (MixDisplayX11 *) mix_display_ref(MIX_DISPLAY(mix));
75}
76
77/**
78 * mix_mixdisplayx11_dup:
79 * @obj: a #MixDisplayX11 object
80 * @returns: a newly allocated duplicate of the object.
81 *
82 * Copy duplicate of the object.
83 */
84MixDisplay *
85mix_displayx11_dup(const MixDisplay * obj) {
86	MixDisplay *ret = NULL;
87
88	if (MIX_IS_DISPLAYX11(obj)) {
89		MixDisplayX11 *duplicate = mix_displayx11_new();
90		if (mix_displayx11_copy(MIX_DISPLAY(duplicate), MIX_DISPLAY(obj))) {
91			ret = MIX_DISPLAY(duplicate);
92		} else {
93			mix_displayx11_unref(duplicate);
94		}
95	}
96	return ret;
97}
98
99/**
100 * mix_mixdisplayx11_copy:
101 * @target: copy to target
102 * @src: copy from src
103 * @returns: boolean indicates if copy is successful.
104 *
105 * Copy instance data from @src to @target.
106 */
107gboolean mix_displayx11_copy(MixDisplay * target, const MixDisplay * src) {
108	MixDisplayX11 *this_target, *this_src;
109
110	if (MIX_IS_DISPLAYX11(target) && MIX_IS_DISPLAYX11(src)) {
111		// Cast the base object to this child object
112		this_target = MIX_DISPLAYX11(target);
113		this_src = MIX_DISPLAYX11(src);
114
115		// Copy properties from source to target.
116
117		this_target->display = this_src->display;
118		this_target->drawable = this_src->drawable;
119
120		// Now chainup base class
121		if (parent_class->copy) {
122			return parent_class->copy(MIX_DISPLAY_CAST(target),
123					MIX_DISPLAY_CAST(src));
124		} else {
125			return TRUE;
126		}
127	}
128	return FALSE;
129}
130
131/**
132 * mix_mixdisplayx11_equal:
133 * @first: first object to compare
134 * @second: seond object to compare
135 * @returns: boolean indicates if instance are equal.
136 *
137 * Copy instance data from @src to @target.
138 */
139gboolean mix_displayx11_equal(MixDisplay * first, MixDisplay * second) {
140	gboolean ret = FALSE;
141
142	MixDisplayX11 *this_first, *this_second;
143
144	this_first = MIX_DISPLAYX11(first);
145	this_second = MIX_DISPLAYX11(second);
146
147	if (MIX_IS_DISPLAYX11(first) && MIX_IS_DISPLAYX11(second)) {
148		// Compare member variables
149
150		// TODO: if in the copy method we just copy the pointer of display, the comparison
151		//      below is enough. But we need to decide how to copy!
152
153		if (this_first->display == this_second->display && this_first->drawable
154				== this_second->drawable) {
155			// members within this scope equal. chaining up.
156			MixDisplayClass *klass = MIX_DISPLAY_CLASS(parent_class);
157			if (klass->equal)
158				ret = parent_class->equal(first, second);
159			else
160				ret = TRUE;
161		}
162	}
163	return ret;
164}
165
166#define MIX_DISPLAYX11_SETTER_CHECK_INPUT(obj) \
167	if(!obj) return MIX_RESULT_NULL_PTR; \
168	if(!MIX_IS_DISPLAYX11(obj)) return MIX_RESULT_FAIL; \
169
170#define MIX_DISPLAYX11_GETTER_CHECK_INPUT(obj, prop) \
171	if(!obj || !prop) return MIX_RESULT_NULL_PTR; \
172	if(!MIX_IS_DISPLAYX11(obj)) return MIX_RESULT_FAIL; \
173
174MIX_RESULT mix_displayx11_set_display(MixDisplayX11 * obj, Display * display) {
175	MIX_DISPLAYX11_SETTER_CHECK_INPUT (obj);
176
177	// TODO: needs to decide to clone or just copy pointer
178	obj->display = display;
179	return MIX_RESULT_SUCCESS;
180}
181
182MIX_RESULT mix_displayx11_get_display(MixDisplayX11 * obj, Display ** display) {
183	MIX_DISPLAYX11_GETTER_CHECK_INPUT (obj, display);
184
185	// TODO: needs to decide to clone or just copy pointer
186	*display = obj->display;
187
188	return MIX_RESULT_SUCCESS;
189}
190
191MIX_RESULT mix_displayx11_set_drawable(MixDisplayX11 * obj, Drawable drawable) {
192	MIX_DISPLAYX11_SETTER_CHECK_INPUT (obj);
193
194	// TODO: needs to decide to clone or just copy pointer
195	obj->drawable = drawable;
196	return MIX_RESULT_SUCCESS;
197}
198
199MIX_RESULT mix_displayx11_get_drawable(MixDisplayX11 * obj, Drawable * drawable) {
200	MIX_DISPLAYX11_GETTER_CHECK_INPUT (obj, drawable);
201
202	// TODO: needs to decide to clone or just copy pointer
203	*drawable = obj->drawable;
204	return MIX_RESULT_SUCCESS;
205}
206