~darkxst/ubuntu/raring/cogl/lp1163025

« back to all changes in this revision

Viewing changes to cogl/cogl-xlib-renderer.c

  • Committer: Package Import Robot
  • Author(s): Jeremy Bicha
  • Date: 2012-03-13 19:11:11 UTC
  • mfrom: (1.1.4)
  • Revision ID: package-import@ubuntu.com-20120313191111-3hgk529qkh9m6uk2
Tags: 1.9.8-0ubuntu1
* New upstream release (LP: #941617)
* Updated symbols & library name for soname update
* debian/control.in: Bump minimum glib to 2.28
* debian/patches/02_disable_armv5t_specific_optimization.patch: Disabled

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
#include "config.h"
29
29
#endif
30
30
 
31
 
#include "cogl.h"
 
31
#include "cogl-xlib-renderer.h"
 
32
#include "cogl-util.h"
32
33
#include "cogl-internal.h"
33
34
#include "cogl-object.h"
34
35
 
46
47
static GList *_cogl_xlib_renderers = NULL;
47
48
 
48
49
static void
 
50
destroy_xlib_renderer_data (void *user_data)
 
51
{
 
52
  g_slice_free (CoglXlibRenderer, user_data);
 
53
}
 
54
 
 
55
CoglXlibRenderer *
 
56
_cogl_xlib_renderer_get_data (CoglRenderer *renderer)
 
57
{
 
58
  static CoglUserDataKey key;
 
59
  CoglXlibRenderer *data;
 
60
 
 
61
  /* Constructs a CoglXlibRenderer struct on demand and attaches it to
 
62
     the object using user data. It's done this way instead of using a
 
63
     subclassing hierarchy in the winsys data because all EGL winsys's
 
64
     need the EGL winsys data but only one of them wants the Xlib
 
65
     data. */
 
66
 
 
67
  data = cogl_object_get_user_data (COGL_OBJECT (renderer), &key);
 
68
 
 
69
  if (data == NULL)
 
70
    {
 
71
      data = g_slice_new0 (CoglXlibRenderer);
 
72
 
 
73
      cogl_object_set_user_data (COGL_OBJECT (renderer),
 
74
                                 &key,
 
75
                                 data,
 
76
                                 destroy_xlib_renderer_data);
 
77
    }
 
78
 
 
79
  return data;
 
80
}
 
81
 
 
82
static void
49
83
register_xlib_renderer (CoglRenderer *renderer)
50
84
{
51
85
  GList *l;
71
105
  for (l = _cogl_xlib_renderers; l; l = l->next)
72
106
    {
73
107
      CoglRenderer *renderer = l->data;
74
 
      CoglXlibRenderer *xlib_renderer = renderer->winsys;
 
108
      CoglXlibRenderer *xlib_renderer =
 
109
        _cogl_xlib_renderer_get_data (renderer);
75
110
 
76
111
      if (xlib_renderer->xdpy == xdpy)
77
112
        return renderer;
89
124
 
90
125
  renderer = get_renderer_for_xdisplay (xdpy);
91
126
 
92
 
  xlib_renderer = renderer->winsys;
 
127
  xlib_renderer = _cogl_xlib_renderer_get_data (renderer);
93
128
  g_assert (xlib_renderer->trap_state);
94
129
 
95
130
  xlib_renderer->trap_state->trapped_error_code = error->error_code;
103
138
{
104
139
  CoglXlibRenderer *xlib_renderer;
105
140
 
106
 
  xlib_renderer = renderer->winsys;
 
141
  xlib_renderer = _cogl_xlib_renderer_get_data (renderer);
107
142
 
108
143
  state->trapped_error_code = 0;
109
144
  state->old_error_handler = XSetErrorHandler (error_handler);
118
153
{
119
154
  CoglXlibRenderer *xlib_renderer;
120
155
 
121
 
  xlib_renderer = renderer->winsys;
 
156
  xlib_renderer = _cogl_xlib_renderer_get_data (renderer);
122
157
  g_assert (state == xlib_renderer->trap_state);
123
158
 
124
159
  XSetErrorHandler (state->old_error_handler);
132
167
assert_xlib_display (CoglRenderer *renderer, GError **error)
133
168
{
134
169
  Display *xdpy = cogl_xlib_renderer_get_foreign_display (renderer);
135
 
  CoglXlibRenderer *xlib_renderer = renderer->winsys;
 
170
  CoglXlibRenderer *xlib_renderer = _cogl_xlib_renderer_get_data (renderer);
136
171
 
137
172
  /* A foreign display may have already been set... */
138
173
  if (xdpy)
158
193
gboolean
159
194
_cogl_xlib_renderer_connect (CoglRenderer *renderer, GError **error)
160
195
{
161
 
  CoglXlibRenderer *xlib_renderer = renderer->winsys;
162
 
  CoglX11Renderer *x11_renderer = renderer->winsys;
 
196
  CoglXlibRenderer *xlib_renderer =
 
197
    _cogl_xlib_renderer_get_data (renderer);
 
198
  CoglX11Renderer *x11_renderer =
 
199
    (CoglX11Renderer *) xlib_renderer;
163
200
  int damage_error;
164
201
 
165
202
  if (!assert_xlib_display (renderer, error))
176
213
 
177
214
  xlib_renderer->trap_state = NULL;
178
215
 
 
216
  xlib_renderer->poll_fd.fd = ConnectionNumber (xlib_renderer->xdpy);
 
217
  xlib_renderer->poll_fd.events = COGL_POLL_FD_EVENT_IN;
 
218
 
179
219
  register_xlib_renderer (renderer);
180
220
 
181
221
  return TRUE;
184
224
void
185
225
_cogl_xlib_renderer_disconnect (CoglRenderer *renderer)
186
226
{
187
 
  CoglXlibRenderer *xlib_renderer = renderer->winsys;
 
227
  CoglXlibRenderer *xlib_renderer =
 
228
    _cogl_xlib_renderer_get_data (renderer);
188
229
 
189
230
  if (!renderer->foreign_xdpy && xlib_renderer->xdpy)
190
231
    XCloseDisplay (xlib_renderer->xdpy);
197
238
{
198
239
  CoglXlibRenderer *xlib_renderer;
199
240
 
200
 
  g_return_val_if_fail (cogl_is_renderer (renderer), NULL);
 
241
  _COGL_RETURN_VAL_IF_FAIL (cogl_is_renderer (renderer), NULL);
201
242
 
202
 
  xlib_renderer = renderer->winsys;
 
243
  xlib_renderer = _cogl_xlib_renderer_get_data (renderer);
203
244
 
204
245
  return xlib_renderer->xdpy;
205
246
}
229
270
                                       (CoglNativeFilterFunc)func, data);
230
271
}
231
272
 
 
273
void
 
274
_cogl_xlib_renderer_poll_get_info (CoglRenderer *renderer,
 
275
                                   CoglPollFD **poll_fds,
 
276
                                   int *n_poll_fds,
 
277
                                   gint64 *timeout)
 
278
{
 
279
  CoglXlibRenderer *xlib_renderer = _cogl_xlib_renderer_get_data (renderer);
 
280
 
 
281
  if (renderer->xlib_enable_event_retrieval)
 
282
    {
 
283
      *n_poll_fds = 1;
 
284
      *poll_fds = &xlib_renderer->poll_fd;
 
285
      if (XPending (xlib_renderer->xdpy))
 
286
        *timeout = 0;
 
287
      else
 
288
        *timeout = -1;
 
289
    }
 
290
  else
 
291
    {
 
292
      *n_poll_fds = 0;
 
293
      *poll_fds = NULL;
 
294
      *timeout = -1;
 
295
    }
 
296
}
 
297
 
 
298
void
 
299
_cogl_xlib_renderer_poll_dispatch (CoglRenderer *renderer,
 
300
                                   const CoglPollFD *poll_fds,
 
301
                                   int n_poll_fds)
 
302
{
 
303
  CoglXlibRenderer *xlib_renderer = _cogl_xlib_renderer_get_data (renderer);
 
304
 
 
305
  if (renderer->xlib_enable_event_retrieval)
 
306
    while (XPending (xlib_renderer->xdpy))
 
307
      {
 
308
        XEvent xevent;
 
309
 
 
310
        XNextEvent (xlib_renderer->xdpy, &xevent);
 
311
 
 
312
        cogl_xlib_renderer_handle_event (renderer, &xevent);
 
313
      }
 
314
}