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 
20 static GType _mix_displayx11_type = 0;
21 static MixDisplayClass *parent_class = NULL;
22 
23 #define _do_init { _mix_displayx11_type = g_define_type_id; }
24 
25 gboolean mix_displayx11_copy(MixDisplay * target, const MixDisplay * src);
26 MixDisplay *mix_displayx11_dup(const MixDisplay * obj);
27 gboolean mix_displayx11_equal(MixDisplay * first, MixDisplay * second);
28 static void mix_displayx11_finalize(MixDisplay * obj);
29 
30 G_DEFINE_TYPE_WITH_CODE (MixDisplayX11, mix_displayx11,
31 		MIX_TYPE_DISPLAY, _do_init);
32 
mix_displayx11_init(MixDisplayX11 * self)33 static void mix_displayx11_init(MixDisplayX11 * self) {
34 
35 	/* Initialize member varibles */
36 	self->display = NULL;
37 	self->drawable = 0;
38 }
39 
mix_displayx11_class_init(MixDisplayX11Class * klass)40 static 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 
52 MixDisplayX11 *
mix_displayx11_new(void)53 mix_displayx11_new(void) {
54 	MixDisplayX11 *ret = (MixDisplayX11 *) g_type_create_instance(
55 			MIX_TYPE_DISPLAYX11);
56 
57 	return ret;
58 }
59 
mix_displayx11_finalize(MixDisplay * obj)60 void 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 
72 MixDisplayX11 *
mix_displayx11_ref(MixDisplayX11 * mix)73 mix_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  */
84 MixDisplay *
mix_displayx11_dup(const MixDisplay * obj)85 mix_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  */
mix_displayx11_copy(MixDisplay * target,const MixDisplay * src)107 gboolean 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  */
mix_displayx11_equal(MixDisplay * first,MixDisplay * second)139 gboolean 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 
mix_displayx11_set_display(MixDisplayX11 * obj,Display * display)174 MIX_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 
mix_displayx11_get_display(MixDisplayX11 * obj,Display ** display)182 MIX_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 
mix_displayx11_set_drawable(MixDisplayX11 * obj,Drawable drawable)191 MIX_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 
mix_displayx11_get_drawable(MixDisplayX11 * obj,Drawable * drawable)199 MIX_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