2 #include <cogl/cogl-xlib.h>
9 #define X11_FOREIGN_EVENT_MASK \
17 update_cogl_x11_event_mask (CoglOnscreen *onscreen,
21 Display *xdpy = user_data;
22 XSetWindowAttributes attrs;
25 attrs.event_mask = event_mask | X11_FOREIGN_EVENT_MASK;
26 xwin = cogl_x11_onscreen_get_window_xid (onscreen);
28 XChangeWindowAttributes (xdpy,
35 main (int argc, char **argv)
38 CoglRenderer *renderer;
40 CoglOnscreenTemplate *onscreen_template;
43 CoglOnscreen *onscreen;
45 CoglPipeline *pipeline;
48 XVisualInfo template, *xvisinfo;
50 XSetWindowAttributes xattr;
53 CoglVertexP2C4 triangle_vertices[] = {
54 {0, 0.7, 0xff, 0x00, 0x00, 0x80},
55 {-0.7, -0.7, 0x00, 0xff, 0x00, 0xff},
56 {0.7, -0.7, 0x00, 0x00, 0xff, 0xff}
58 CoglPrimitive *triangle;
61 /* Since we want to test external ownership of the X display,
62 * connect to X manually... */
63 xdpy = XOpenDisplay (NULL);
66 fprintf (stderr, "Failed to open X Display\n");
70 /* Conceptually choose a GPU... */
71 renderer = cogl_renderer_new ();
72 /* FIXME: This should conceptually be part of the configuration of
74 cogl_xlib_renderer_set_foreign_display (renderer, xdpy);
75 if (!cogl_renderer_connect (renderer, &error))
77 fprintf (stderr, "Failed to connect to a renderer: %s\n",
81 chain = cogl_swap_chain_new ();
82 cogl_swap_chain_set_has_alpha (chain, TRUE);
84 /* Conceptually declare upfront the kinds of windows we anticipate
85 * creating so that when we configure the display pipeline we can avoid
86 * having an impedance miss-match between the format of windows and the
87 * format the display pipeline expects. */
88 onscreen_template = cogl_onscreen_template_new (chain);
89 cogl_object_unref (chain);
91 /* Conceptually setup a display pipeline */
92 display = cogl_display_new (renderer, onscreen_template);
93 cogl_object_unref (renderer);
94 if (!cogl_display_setup (display, &error))
96 fprintf (stderr, "Failed to setup a display pipeline: %s\n",
101 ctx = cogl_context_new (display, &error);
104 fprintf (stderr, "Failed to create context: %s\n", error->message);
108 onscreen = cogl_onscreen_new (ctx, 640, 480);
110 /* We want to test that Cogl can handle foreign X windows... */
112 visual = cogl_x11_onscreen_get_visual_xid (onscreen);
115 fprintf (stderr, "Failed to query an X visual suitable for the "
116 "configured CoglOnscreen framebuffer\n");
120 template.visualid = visual;
121 xvisinfo = XGetVisualInfo (xdpy, VisualIDMask, &template, &visinfos_count);
123 /* window attributes */
124 xattr.background_pixel = WhitePixel (xdpy, DefaultScreen (xdpy));
125 xattr.border_pixel = 0;
126 xattr.colormap = XCreateColormap (xdpy,
127 DefaultRootWindow (xdpy),
130 mask = CWBorderPixel | CWColormap;
132 xwin = XCreateWindow (xdpy,
133 DefaultRootWindow (xdpy),
144 cogl_x11_onscreen_set_foreign_window_xid (onscreen, xwin,
145 update_cogl_x11_event_mask,
148 XMapWindow (xdpy, xwin);
150 fb = COGL_FRAMEBUFFER (onscreen);
152 triangle = cogl_primitive_new_p2c4 (ctx, COGL_VERTICES_MODE_TRIANGLES,
153 3, triangle_vertices);
154 pipeline = cogl_pipeline_new (ctx);
157 CoglPollFD *poll_fds;
161 while (XPending (xdpy))
164 XNextEvent (xdpy, &event);
171 cogl_xlib_renderer_handle_event (renderer, &event);
173 cogl_framebuffer_clear4f (fb, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 1);
174 cogl_framebuffer_draw_primitive (fb, pipeline, triangle);
175 cogl_onscreen_swap_buffers (onscreen);
177 cogl_poll_get_info (ctx, &poll_fds, &n_poll_fds, &timeout);
178 g_poll ((GPollFD *) poll_fds, n_poll_fds, 0);
179 cogl_poll_dispatch (ctx, poll_fds, n_poll_fds);