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