2011-03-17 15:32:54 -04:00
|
|
|
#include <cogl/cogl.h>
|
2011-10-17 12:55:35 -04:00
|
|
|
#include <cogl/cogl-xlib.h>
|
2011-03-17 15:32:54 -04:00
|
|
|
#include <glib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
#include <X11/Xlib.h>
|
|
|
|
#include <X11/Xutil.h>
|
|
|
|
|
2011-06-13 05:29:05 -04:00
|
|
|
#define X11_FOREIGN_EVENT_MASK \
|
|
|
|
(KeyPressMask | \
|
|
|
|
KeyReleaseMask | \
|
|
|
|
ButtonPressMask | \
|
|
|
|
ButtonReleaseMask | \
|
|
|
|
PointerMotionMask)
|
|
|
|
|
|
|
|
CoglColor black;
|
|
|
|
|
2011-05-04 12:02:04 -04:00
|
|
|
static void
|
|
|
|
update_cogl_x11_event_mask (CoglOnscreen *onscreen,
|
|
|
|
guint32 event_mask,
|
|
|
|
void *user_data)
|
|
|
|
{
|
2011-05-05 15:38:13 -04:00
|
|
|
Display *xdpy = user_data;
|
2011-05-04 12:02:04 -04:00
|
|
|
XSetWindowAttributes attrs;
|
|
|
|
guint32 xwin;
|
|
|
|
|
2011-06-13 05:29:05 -04:00
|
|
|
attrs.event_mask = event_mask | X11_FOREIGN_EVENT_MASK;
|
2011-06-30 20:58:38 -04:00
|
|
|
xwin = cogl_x11_onscreen_get_window_xid (onscreen);
|
2011-05-04 12:02:04 -04:00
|
|
|
|
|
|
|
XChangeWindowAttributes (xdpy,
|
|
|
|
(Window)xwin,
|
|
|
|
CWEventMask,
|
|
|
|
&attrs);
|
|
|
|
}
|
|
|
|
|
2011-03-17 15:32:54 -04:00
|
|
|
int
|
|
|
|
main (int argc, char **argv)
|
|
|
|
{
|
|
|
|
Display *xdpy;
|
|
|
|
CoglRenderer *renderer;
|
|
|
|
CoglSwapChain *chain;
|
|
|
|
CoglOnscreenTemplate *onscreen_template;
|
|
|
|
CoglDisplay *display;
|
|
|
|
CoglContext *ctx;
|
|
|
|
CoglOnscreen *onscreen;
|
|
|
|
CoglFramebuffer *fb;
|
|
|
|
GError *error = NULL;
|
|
|
|
guint32 visual;
|
|
|
|
XVisualInfo template, *xvisinfo;
|
|
|
|
int visinfos_count;
|
|
|
|
XSetWindowAttributes xattr;
|
|
|
|
unsigned long mask;
|
|
|
|
Window xwin;
|
2011-06-13 05:29:05 -04:00
|
|
|
CoglVertexP2C4 triangle_vertices[] = {
|
|
|
|
{0, 0.7, 0xff, 0x00, 0x00, 0x80},
|
|
|
|
{-0.7, -0.7, 0x00, 0xff, 0x00, 0xff},
|
|
|
|
{0.7, -0.7, 0x00, 0x00, 0xff, 0xff}
|
|
|
|
};
|
|
|
|
CoglPrimitive *triangle;
|
|
|
|
|
2011-03-17 15:32:54 -04:00
|
|
|
|
|
|
|
/* Since we want to test external ownership of the X display,
|
|
|
|
* connect to X manually... */
|
|
|
|
xdpy = XOpenDisplay (NULL);
|
|
|
|
if (!xdpy)
|
|
|
|
{
|
|
|
|
fprintf (stderr, "Failed to open X Display\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Conceptually choose a GPU... */
|
|
|
|
renderer = cogl_renderer_new ();
|
|
|
|
/* FIXME: This should conceptually be part of the configuration of
|
|
|
|
* a renderer. */
|
2011-06-28 09:16:24 -04:00
|
|
|
cogl_xlib_renderer_set_foreign_display (renderer, xdpy);
|
2011-03-17 15:32:54 -04:00
|
|
|
if (!cogl_renderer_connect (renderer, &error))
|
|
|
|
{
|
|
|
|
fprintf (stderr, "Failed to connect to a renderer: %s\n",
|
|
|
|
error->message);
|
|
|
|
}
|
|
|
|
|
|
|
|
chain = cogl_swap_chain_new ();
|
|
|
|
cogl_swap_chain_set_has_alpha (chain, TRUE);
|
|
|
|
|
|
|
|
/* Conceptually declare upfront the kinds of windows we anticipate
|
|
|
|
* creating so that when we configure the display pipeline we can avoid
|
|
|
|
* having an impedance miss-match between the format of windows and the
|
|
|
|
* format the display pipeline expects. */
|
|
|
|
onscreen_template = cogl_onscreen_template_new (chain);
|
|
|
|
cogl_object_unref (chain);
|
|
|
|
|
|
|
|
/* Conceptually setup a display pipeline */
|
|
|
|
display = cogl_display_new (renderer, onscreen_template);
|
|
|
|
cogl_object_unref (renderer);
|
|
|
|
if (!cogl_display_setup (display, &error))
|
|
|
|
{
|
|
|
|
fprintf (stderr, "Failed to setup a display pipeline: %s\n",
|
|
|
|
error->message);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx = cogl_context_new (display, &error);
|
|
|
|
if (!ctx)
|
|
|
|
{
|
|
|
|
fprintf (stderr, "Failed to create context: %s\n", error->message);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
onscreen = cogl_onscreen_new (ctx, 640, 480);
|
|
|
|
|
|
|
|
/* We want to test that Cogl can handle foreign X windows... */
|
|
|
|
|
2011-06-30 20:58:38 -04:00
|
|
|
visual = cogl_x11_onscreen_get_visual_xid (onscreen);
|
2011-03-17 15:32:54 -04:00
|
|
|
if (!visual)
|
|
|
|
{
|
|
|
|
fprintf (stderr, "Failed to query an X visual suitable for the "
|
|
|
|
"configured CoglOnscreen framebuffer\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
template.visualid = visual;
|
|
|
|
xvisinfo = XGetVisualInfo (xdpy, VisualIDMask, &template, &visinfos_count);
|
|
|
|
|
|
|
|
/* window attributes */
|
|
|
|
xattr.background_pixel = WhitePixel (xdpy, DefaultScreen (xdpy));
|
|
|
|
xattr.border_pixel = 0;
|
|
|
|
xattr.colormap = XCreateColormap (xdpy,
|
|
|
|
DefaultRootWindow (xdpy),
|
|
|
|
xvisinfo->visual,
|
|
|
|
AllocNone);
|
|
|
|
mask = CWBorderPixel | CWColormap;
|
|
|
|
|
|
|
|
xwin = XCreateWindow (xdpy,
|
|
|
|
DefaultRootWindow (xdpy),
|
|
|
|
0, 0,
|
|
|
|
800, 600,
|
|
|
|
0,
|
|
|
|
xvisinfo->depth,
|
|
|
|
InputOutput,
|
|
|
|
xvisinfo->visual,
|
|
|
|
mask, &xattr);
|
|
|
|
|
|
|
|
XFree (xvisinfo);
|
|
|
|
|
2011-06-30 20:58:38 -04:00
|
|
|
cogl_x11_onscreen_set_foreign_window_xid (onscreen, xwin,
|
2011-05-04 12:02:04 -04:00
|
|
|
update_cogl_x11_event_mask,
|
|
|
|
xdpy);
|
2011-03-17 15:32:54 -04:00
|
|
|
|
|
|
|
XMapWindow (xdpy, xwin);
|
|
|
|
|
2012-01-07 18:10:25 -05:00
|
|
|
fb = COGL_FRAMEBUFFER (onscreen);
|
2011-03-17 15:32:54 -04:00
|
|
|
cogl_push_framebuffer (fb);
|
|
|
|
|
2011-06-13 05:29:05 -04:00
|
|
|
triangle = cogl_primitive_new_p2c4 (COGL_VERTICES_MODE_TRIANGLES,
|
|
|
|
3, triangle_vertices);
|
2011-03-17 15:32:54 -04:00
|
|
|
for (;;)
|
|
|
|
{
|
2011-12-19 10:40:55 -05:00
|
|
|
CoglPollFD *poll_fds;
|
|
|
|
int n_poll_fds;
|
|
|
|
gint64 timeout;
|
|
|
|
|
2011-06-13 05:29:05 -04:00
|
|
|
while (XPending (xdpy))
|
|
|
|
{
|
|
|
|
XEvent event;
|
|
|
|
XNextEvent (xdpy, &event);
|
|
|
|
switch (event.type)
|
|
|
|
{
|
|
|
|
case KeyRelease:
|
|
|
|
case ButtonRelease:
|
|
|
|
return 0;
|
|
|
|
}
|
2011-06-28 08:38:50 -04:00
|
|
|
cogl_xlib_renderer_handle_event (renderer, &event);
|
2011-06-13 05:29:05 -04:00
|
|
|
}
|
|
|
|
cogl_clear (&black, COGL_BUFFER_BIT_COLOR);
|
|
|
|
cogl_primitive_draw (triangle);
|
2011-03-17 15:32:54 -04:00
|
|
|
cogl_framebuffer_swap_buffers (fb);
|
2011-12-19 10:40:55 -05:00
|
|
|
|
|
|
|
cogl_poll_get_info (ctx, &poll_fds, &n_poll_fds, &timeout);
|
|
|
|
g_poll ((GPollFD *) poll_fds, n_poll_fds, 0);
|
|
|
|
cogl_poll_dispatch (ctx, poll_fds, n_poll_fds);
|
2011-03-17 15:32:54 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|