Release Clutter 1.11.4 (snapshot)
[profile/ivi/clutter.git] / clutter / clutter-stage-window.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4
5 #include <glib-object.h>
6
7 #include "clutter-actor.h"
8 #include "clutter-stage-window.h"
9 #include "clutter-private.h"
10
11 #define clutter_stage_window_get_type   _clutter_stage_window_get_type
12
13 typedef ClutterStageWindowIface ClutterStageWindowInterface;
14
15 G_DEFINE_INTERFACE (ClutterStageWindow, clutter_stage_window, G_TYPE_OBJECT);
16
17 static void
18 clutter_stage_window_default_init (ClutterStageWindowInterface *iface)
19 {
20   GParamSpec *pspec;
21
22   pspec = g_param_spec_object ("backend",
23                                "Backend",
24                                "Back pointer to the Backend instance",
25                                CLUTTER_TYPE_BACKEND,
26                                G_PARAM_WRITABLE |
27                                G_PARAM_CONSTRUCT_ONLY |
28                                G_PARAM_STATIC_STRINGS);
29   g_object_interface_install_property (iface, pspec);
30
31   pspec = g_param_spec_object ("wrapper",
32                                "Wrapper",
33                                "Back pointer to the Stage actor",
34                                CLUTTER_TYPE_STAGE,
35                                G_PARAM_WRITABLE |
36                                G_PARAM_CONSTRUCT_ONLY |
37                                G_PARAM_STATIC_STRINGS);
38   g_object_interface_install_property (iface, pspec);
39 }
40
41 ClutterActor *
42 _clutter_stage_window_get_wrapper (ClutterStageWindow *window)
43 {
44   return CLUTTER_STAGE_WINDOW_GET_IFACE (window)->get_wrapper (window);
45 }
46
47 void
48 _clutter_stage_window_set_title (ClutterStageWindow *window,
49                                  const gchar        *title)
50 {
51   ClutterStageWindowIface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
52
53   if (iface->set_title)
54     iface->set_title (window, title);
55 }
56
57 void
58 _clutter_stage_window_set_fullscreen (ClutterStageWindow *window,
59                                       gboolean            is_fullscreen)
60 {
61   ClutterStageWindowIface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
62
63   if (iface->set_fullscreen)
64     iface->set_fullscreen (window, is_fullscreen);
65 }
66
67 void
68 _clutter_stage_window_set_cursor_visible (ClutterStageWindow *window,
69                                           gboolean            is_visible)
70 {
71   ClutterStageWindowIface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
72
73   if (iface->set_cursor_visible)
74     iface->set_cursor_visible (window, is_visible);
75 }
76
77 void
78 _clutter_stage_window_set_user_resizable (ClutterStageWindow *window,
79                                           gboolean            is_resizable)
80 {
81   CLUTTER_STAGE_WINDOW_GET_IFACE (window)->set_user_resizable (window,
82                                                                is_resizable);
83 }
84
85 gboolean
86 _clutter_stage_window_realize (ClutterStageWindow *window)
87 {
88   return CLUTTER_STAGE_WINDOW_GET_IFACE (window)->realize (window);
89 }
90
91 void
92 _clutter_stage_window_unrealize (ClutterStageWindow *window)
93 {
94   CLUTTER_STAGE_WINDOW_GET_IFACE (window)->unrealize (window);
95 }
96
97 void
98 _clutter_stage_window_show (ClutterStageWindow *window,
99                             gboolean            do_raise)
100 {
101   CLUTTER_STAGE_WINDOW_GET_IFACE (window)->show (window, do_raise);
102 }
103
104 void
105 _clutter_stage_window_hide (ClutterStageWindow *window)
106 {
107   CLUTTER_STAGE_WINDOW_GET_IFACE (window)->hide (window);
108 }
109
110 void
111 _clutter_stage_window_resize (ClutterStageWindow *window,
112                               gint                width,
113                               gint                height)
114 {
115   CLUTTER_STAGE_WINDOW_GET_IFACE (window)->resize (window, width, height);
116 }
117
118 void
119 _clutter_stage_window_get_geometry (ClutterStageWindow    *window,
120                                     cairo_rectangle_int_t *geometry)
121 {
122   CLUTTER_STAGE_WINDOW_GET_IFACE (window)->get_geometry (window, geometry);
123 }
124
125 int
126 _clutter_stage_window_get_pending_swaps (ClutterStageWindow *window)
127 {
128   ClutterStageWindowIface *iface;
129
130   g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), 0);
131
132   iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
133   if (iface->get_pending_swaps == NULL)
134     {
135       g_assert (!clutter_feature_available (CLUTTER_FEATURE_SWAP_EVENTS));
136       return 0;
137     }
138
139   return iface->get_pending_swaps (window);
140 }
141
142 void
143 _clutter_stage_window_add_redraw_clip (ClutterStageWindow    *window,
144                                        cairo_rectangle_int_t *stage_clip)
145 {
146   ClutterStageWindowIface *iface;
147
148   g_return_if_fail (CLUTTER_IS_STAGE_WINDOW (window));
149
150   iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
151   if (iface->add_redraw_clip != NULL)
152     iface->add_redraw_clip (window, stage_clip);
153 }
154
155 /* Determines if the backend will clip the rendering of the next
156  * frame.
157  *
158  * Note: at the start of each new frame there is an implied clip that
159  * clips everything (i.e. nothing would be drawn) so this function
160  * will return True at the start of a new frame if the backend
161  * supports clipped redraws.
162  */
163 gboolean
164 _clutter_stage_window_has_redraw_clips (ClutterStageWindow *window)
165 {
166   ClutterStageWindowIface *iface;
167
168   g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
169
170   iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
171   if (iface->has_redraw_clips != NULL)
172     return iface->has_redraw_clips (window);
173
174   return FALSE;
175 }
176
177 /* Determines if the backend will discard any additional redraw clips
178  * and instead promote them to a full stage redraw.
179  *
180  * The ideas is that backend may have some heuristics that cause it to
181  * give up tracking redraw clips so this can be used to avoid the cost
182  * of calculating a redraw clip when we know it's going to be ignored
183  * anyway.
184  */
185 gboolean
186 _clutter_stage_window_ignoring_redraw_clips (ClutterStageWindow *window)
187 {
188   ClutterStageWindowIface *iface;
189
190   g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
191
192   iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
193   if (iface->ignoring_redraw_clips != NULL)
194     return iface->ignoring_redraw_clips (window);
195
196   return TRUE;
197 }
198
199 gboolean
200 _clutter_stage_window_get_redraw_clip_bounds (ClutterStageWindow    *window,
201                                               cairo_rectangle_int_t *stage_clip)
202 {
203   ClutterStageWindowIface *iface;
204
205   g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
206
207   iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
208   if (iface->get_redraw_clip_bounds != NULL)
209     return iface->get_redraw_clip_bounds (window, stage_clip);
210
211   return FALSE;
212 }
213
214 void
215 _clutter_stage_window_set_accept_focus (ClutterStageWindow *window,
216                                         gboolean            accept_focus)
217 {
218   ClutterStageWindowIface *iface;
219
220   g_return_if_fail (CLUTTER_IS_STAGE_WINDOW (window));
221
222   iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
223   if (iface->set_accept_focus)
224     iface->set_accept_focus (window, accept_focus);
225 }
226
227 void
228 _clutter_stage_window_redraw (ClutterStageWindow *window)
229 {
230   ClutterStageWindowIface *iface;
231
232   g_return_if_fail (CLUTTER_IS_STAGE_WINDOW (window));
233
234   iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
235   if (iface->redraw)
236     iface->redraw (window);
237 }
238
239 /* NB: The presumption shouldn't be that a stage can't be comprised of
240  * multiple internal framebuffers, so instead of simply naming this
241  * function _clutter_stage_window_get_framebuffer(), the "active"
242  * infix is intended to clarify that it gets the framebuffer that is
243  * currently in use/being painted.
244  */
245 CoglFramebuffer *
246 _clutter_stage_window_get_active_framebuffer (ClutterStageWindow *window)
247 {
248   ClutterStageWindowIface *iface;
249
250   g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), NULL);
251
252   iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
253   if (iface->get_active_framebuffer)
254     return iface->get_active_framebuffer (window);
255   else
256     return NULL;
257 }
258
259 gboolean
260 _clutter_stage_window_can_clip_redraws (ClutterStageWindow *window)
261 {
262   ClutterStageWindowIface *iface;
263
264   g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
265
266   iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
267   if (iface->can_clip_redraws != NULL)
268     return iface->can_clip_redraws (window);
269
270   return FALSE;
271 }