diff --git a/cogl/cogl/cogl-onscreen-private.h b/cogl/cogl/cogl-onscreen-private.h index 52b2359c6..9718708d0 100644 --- a/cogl/cogl/cogl-onscreen-private.h +++ b/cogl/cogl/cogl-onscreen-private.h @@ -59,12 +59,6 @@ struct _CoglOnscreen { CoglFramebuffer _parent; -#ifdef COGL_HAS_X11_SUPPORT - uint32_t foreign_xid; - CoglOnscreenX11MaskCallback foreign_update_mask_callback; - void *foreign_update_mask_data; -#endif - CoglList frame_closures; gboolean resizable; diff --git a/cogl/cogl/cogl-onscreen.c b/cogl/cogl/cogl-onscreen.c index 8af1e1de1..e5e7ac711 100644 --- a/cogl/cogl/cogl-onscreen.c +++ b/cogl/cogl/cogl-onscreen.c @@ -411,37 +411,16 @@ cogl_onscreen_get_buffer_age (CoglOnscreen *onscreen) } #ifdef COGL_HAS_X11_SUPPORT -void -cogl_x11_onscreen_set_foreign_window_xid (CoglOnscreen *onscreen, - uint32_t xid, - CoglOnscreenX11MaskCallback update, - void *user_data) -{ - /* We don't wan't applications to get away with being lazy here and not - * passing an update callback... */ - g_return_if_fail (update); - - onscreen->foreign_xid = xid; - onscreen->foreign_update_mask_callback = update; - onscreen->foreign_update_mask_data = user_data; -} - uint32_t cogl_x11_onscreen_get_window_xid (CoglOnscreen *onscreen) { CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); + const CoglWinsysVtable *winsys = _cogl_framebuffer_get_winsys (framebuffer); - if (onscreen->foreign_xid) - return onscreen->foreign_xid; - else - { - const CoglWinsysVtable *winsys = _cogl_framebuffer_get_winsys (framebuffer); + /* This should only be called for x11 onscreens */ + g_return_val_if_fail (winsys->onscreen_x11_get_window_xid != NULL, 0); - /* This should only be called for x11 onscreens */ - g_return_val_if_fail (winsys->onscreen_x11_get_window_xid != NULL, 0); - - return winsys->onscreen_x11_get_window_xid (onscreen); - } + return winsys->onscreen_x11_get_window_xid (onscreen); } #endif /* COGL_HAS_X11_SUPPORT */ diff --git a/cogl/cogl/cogl-onscreen.h b/cogl/cogl/cogl-onscreen.h index 8b2fd7245..4d76d5bf4 100644 --- a/cogl/cogl/cogl-onscreen.h +++ b/cogl/cogl/cogl-onscreen.h @@ -75,67 +75,6 @@ CoglOnscreen * cogl_onscreen_new (CoglContext *context, int width, int height); #ifdef COGL_HAS_X11 -typedef void (*CoglOnscreenX11MaskCallback) (CoglOnscreen *onscreen, - uint32_t event_mask, - void *user_data); - -/** - * cogl_x11_onscreen_set_foreign_window_xid: - * @onscreen: The unallocated framebuffer to associated with an X - * window. - * @xid: The XID of an existing X window - * @update: (scope async): A callback that notifies of updates to what Cogl - * requires to be in the core X protocol event mask. - * @user_data: user data passed to @update - * - * Ideally we would recommend that you let Cogl be responsible for - * creating any X window required to back an onscreen framebuffer but - * if you really need to target a window created manually this - * function can be called before @onscreen has been allocated to set a - * foreign XID for your existing X window. - * - * Since Cogl needs, for example, to track changes to the size of an X - * window it requires that certain events be selected for via the core - * X protocol. This requirement may also be changed asynchronously so - * you must pass in an @update callback to inform you of Cogl's - * required event mask. - * - * For example if you are using Xlib you could use this API roughly - * as follows: - * [{ - * static void - * my_update_cogl_x11_event_mask (CoglOnscreen *onscreen, - * uint32_t event_mask, - * void *user_data) - * { - * XSetWindowAttributes attrs; - * MyData *data = user_data; - * attrs.event_mask = event_mask | data->my_event_mask; - * XChangeWindowAttributes (data->xdpy, - * data->xwin, - * CWEventMask, - * &attrs); - * } - * - * { - * *snip* - * cogl_x11_onscreen_set_foreign_window_xid (onscreen, - * data->xwin, - * my_update_cogl_x11_event_mask, - * data); - * *snip* - * } - * }] - * - * Since: 2.0 - * Stability: Unstable - */ -void -cogl_x11_onscreen_set_foreign_window_xid (CoglOnscreen *onscreen, - uint32_t xid, - CoglOnscreenX11MaskCallback update, - void *user_data); - /** * cogl_x11_onscreen_get_window_xid: * @onscreen: A #CoglOnscreen framebuffer diff --git a/cogl/cogl/winsys/cogl-winsys-egl-x11.c b/cogl/cogl/winsys/cogl-winsys-egl-x11.c index dafe7a6a7..a87d0c110 100644 --- a/cogl/cogl/winsys/cogl-winsys-egl-x11.c +++ b/cogl/cogl/winsys/cogl-winsys-egl-x11.c @@ -60,7 +60,6 @@ typedef struct _CoglDisplayXlib typedef struct _CoglOnscreenXlib { Window xwin; - gboolean is_foreign_xwin; } CoglOnscreenXlib; #ifdef EGL_KHR_image_pixmap @@ -425,51 +424,10 @@ _cogl_winsys_egl_onscreen_init (CoglOnscreen *onscreen, Window xwin; /* FIXME: We need to explicitly Select for ConfigureNotify events. - * For foreign windows we need to be careful not to mess up any - * existing event mask. * We need to document that for windows we create then toolkits * must be careful not to clear event mask bits that we select. */ - /* XXX: Note we ignore the user's original width/height when - * given a foreign X window. */ - if (onscreen->foreign_xid) - { - Status status; - CoglXlibTrapState state; - XWindowAttributes attr; - int xerror; - - xwin = onscreen->foreign_xid; - - _cogl_xlib_renderer_trap_errors (display->renderer, &state); - - status = XGetWindowAttributes (xlib_renderer->xdpy, xwin, &attr); - xerror = _cogl_xlib_renderer_untrap_errors (display->renderer, - &state); - if (status == 0 || xerror) - { - char message[1000]; - XGetErrorText (xlib_renderer->xdpy, xerror, - message, sizeof (message)); - g_set_error (error, COGL_WINSYS_ERROR, - COGL_WINSYS_ERROR_CREATE_ONSCREEN, - "Unable to query geometry of foreign " - "xid 0x%08lX: %s", - xwin, message); - return FALSE; - } - - _cogl_framebuffer_winsys_update_size (framebuffer, - attr.width, attr.height); - - /* Make sure the app selects for the events we require... */ - onscreen->foreign_update_mask_callback (onscreen, - COGL_ONSCREEN_X11_EVENT_MASK, - onscreen-> - foreign_update_mask_data); - } - else { int width; int height; @@ -541,7 +499,6 @@ _cogl_winsys_egl_onscreen_init (CoglOnscreen *onscreen, egl_onscreen->platform = xlib_onscreen; xlib_onscreen->xwin = xwin; - xlib_onscreen->is_foreign_xwin = onscreen->foreign_xid ? TRUE : FALSE; egl_onscreen->egl_surface = eglCreateWindowSurface (egl_renderer->edpy, @@ -566,7 +523,7 @@ _cogl_winsys_egl_onscreen_deinit (CoglOnscreen *onscreen) _cogl_xlib_renderer_trap_errors (renderer, &old_state); - if (!xlib_onscreen->is_foreign_xwin && xlib_onscreen->xwin != None) + if (xlib_onscreen->xwin != None) { XDestroyWindow (xlib_renderer->xdpy, xlib_onscreen->xwin); xlib_onscreen->xwin = None; diff --git a/cogl/cogl/winsys/cogl-winsys-glx.c b/cogl/cogl/winsys/cogl-winsys-glx.c index 58876601e..72e1073f6 100644 --- a/cogl/cogl/winsys/cogl-winsys-glx.c +++ b/cogl/cogl/winsys/cogl-winsys-glx.c @@ -88,7 +88,6 @@ typedef struct _CoglOnscreenXlib { Window xwin; int x, y; - gboolean is_foreign_xwin; CoglOutput *output; } CoglOnscreenXlib; @@ -524,7 +523,6 @@ notify_resize (CoglContext *context, glx_onscreen->pending_resize_notify++; - if (!xlib_onscreen->is_foreign_xwin) { int x, y; @@ -1345,48 +1343,9 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen, } /* FIXME: We need to explicitly Select for ConfigureNotify events. - * For foreign windows we need to be careful not to mess up any - * existing event mask. * We need to document that for windows we create then toolkits * must be careful not to clear event mask bits that we select. */ - - /* XXX: Note we ignore the user's original width/height when - * given a foreign X window. */ - if (onscreen->foreign_xid) - { - Status status; - CoglXlibTrapState state; - XWindowAttributes attr; - int xerror; - - xwin = onscreen->foreign_xid; - - _cogl_xlib_renderer_trap_errors (display->renderer, &state); - - status = XGetWindowAttributes (xlib_renderer->xdpy, xwin, &attr); - XSync (xlib_renderer->xdpy, False); - xerror = _cogl_xlib_renderer_untrap_errors (display->renderer, &state); - if (status == 0 || xerror) - { - char message[1000]; - XGetErrorText (xlib_renderer->xdpy, xerror, message, sizeof(message)); - g_set_error (error, COGL_WINSYS_ERROR, - COGL_WINSYS_ERROR_CREATE_ONSCREEN, - "Unable to query geometry of foreign xid 0x%08lX: %s", - xwin, message); - return FALSE; - } - - _cogl_framebuffer_winsys_update_size (framebuffer, - attr.width, attr.height); - - /* Make sure the app selects for the events we require... */ - onscreen->foreign_update_mask_callback (onscreen, - COGL_ONSCREEN_X11_EVENT_MASK, - onscreen->foreign_update_mask_data); - } - else { int width; int height; @@ -1457,7 +1416,6 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen, glx_onscreen = onscreen->winsys; xlib_onscreen->xwin = xwin; - xlib_onscreen->is_foreign_xwin = onscreen->foreign_xid ? TRUE : FALSE; /* Try and create a GLXWindow to use with extensions dependent on * GLX versions >= 1.3 that don't accept regular X Windows as GLX @@ -1546,7 +1504,7 @@ _cogl_winsys_onscreen_deinit (CoglOnscreen *onscreen) glx_onscreen->glxwin = None; } - if (!xlib_onscreen->is_foreign_xwin && xlib_onscreen->xwin != None) + if (xlib_onscreen->xwin != None) { XDestroyWindow (xlib_renderer->xdpy, xlib_onscreen->xwin); xlib_onscreen->xwin = None; @@ -1585,10 +1543,9 @@ _cogl_winsys_onscreen_bind (CoglOnscreen *onscreen) _cogl_xlib_renderer_trap_errors (context->display->renderer, &old_state); COGL_NOTE (WINSYS, - "MakeContextCurrent dpy: %p, window: 0x%x (%s), context: %p", + "MakeContextCurrent dpy: %p, window: 0x%x, context: %p", xlib_renderer->xdpy, (unsigned int) drawable, - xlib_onscreen->is_foreign_xwin ? "foreign" : "native", glx_display->glx_context); glx_renderer->glXMakeContextCurrent (xlib_renderer->xdpy, @@ -1917,24 +1874,23 @@ _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen, if (have_counter) glx_onscreen->last_swap_vsync_counter = end_frame_vsync_counter; - if (!xlib_onscreen->is_foreign_xwin) - { - CoglOutput *output; + { + CoglOutput *output; - x_min = CLAMP (x_min, 0, framebuffer_width); - x_max = CLAMP (x_max, 0, framebuffer_width); - y_min = CLAMP (y_min, 0, framebuffer_width); - y_max = CLAMP (y_max, 0, framebuffer_height); + x_min = CLAMP (x_min, 0, framebuffer_width); + x_max = CLAMP (x_max, 0, framebuffer_width); + y_min = CLAMP (y_min, 0, framebuffer_width); + y_max = CLAMP (y_max, 0, framebuffer_height); - output = - _cogl_xlib_renderer_output_for_rectangle (context->display->renderer, - xlib_onscreen->x + x_min, - xlib_onscreen->y + y_min, - x_max - x_min, - y_max - y_min); + output = + _cogl_xlib_renderer_output_for_rectangle (context->display->renderer, + xlib_onscreen->x + x_min, + xlib_onscreen->y + y_min, + x_max - x_min, + y_max - y_min); - set_frame_info_output (onscreen, output); - } + set_frame_info_output (onscreen, output); + } /* XXX: we don't get SwapComplete events based on how we implement * the _swap_region() API but if cogl-onscreen.c knows we are