ephyr: Deal with non-root visual for window

glx will sometimes select a non-root visual, deal with that by
creating a suitable colormap and using that instead of attempting to
use the default colormap.

Signed-off-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
Keith Packard 2014-03-13 23:29:54 -07:00 committed by Eric Anholt
parent e27a839bf0
commit 14d82a2bc3

View File

@ -287,7 +287,8 @@ hostx_set_title(char *title)
int int
hostx_init(void) hostx_init(void)
{ {
uint32_t attr; uint32_t attrs[2];
uint32_t attr_mask = 0;
xcb_cursor_t empty_cursor; xcb_cursor_t empty_cursor;
xcb_pixmap_t cursor_pxm; xcb_pixmap_t cursor_pxm;
uint16_t red, green, blue; uint16_t red, green, blue;
@ -299,7 +300,7 @@ hostx_init(void)
const xcb_query_extension_reply_t *shm_rep; const xcb_query_extension_reply_t *shm_rep;
xcb_screen_t *xscreen; xcb_screen_t *xscreen;
attr = attrs[0] =
XCB_EVENT_MASK_BUTTON_PRESS XCB_EVENT_MASK_BUTTON_PRESS
| XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_BUTTON_RELEASE
| XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_POINTER_MOTION
@ -307,6 +308,7 @@ hostx_init(void)
| XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_KEY_RELEASE
| XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_EXPOSURE
| XCB_EVENT_MASK_STRUCTURE_NOTIFY; | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
attr_mask |= XCB_CW_EVENT_MASK;
EPHYR_DBG("mark"); EPHYR_DBG("mark");
#ifdef GLAMOR #ifdef GLAMOR
@ -325,9 +327,18 @@ hostx_init(void)
HostX.gc = xcb_generate_id(HostX.conn); HostX.gc = xcb_generate_id(HostX.conn);
HostX.depth = xscreen->root_depth; HostX.depth = xscreen->root_depth;
#ifdef GLAMOR #ifdef GLAMOR
if (ephyr_glamor) if (ephyr_glamor) {
HostX.visual = ephyr_glamor_get_visual(); HostX.visual = ephyr_glamor_get_visual();
else if (HostX.visual->visual_id != xscreen->root_visual) {
attrs[1] = xcb_generate_id(HostX.conn);
attr_mask |= XCB_CW_COLORMAP;
xcb_create_colormap(HostX.conn,
XCB_COLORMAP_ALLOC_NONE,
attrs[1],
HostX.winroot,
HostX.visual->visual_id);
}
} else
#endif #endif
HostX.visual = xcb_aux_find_visual_by_id(xscreen,xscreen->root_visual); HostX.visual = xcb_aux_find_visual_by_id(xscreen,xscreen->root_visual);
@ -379,9 +390,9 @@ hostx_init(void)
scrpriv->win_height, scrpriv->win_height,
0, 0,
XCB_WINDOW_CLASS_COPY_FROM_PARENT, XCB_WINDOW_CLASS_COPY_FROM_PARENT,
XCB_COPY_FROM_PARENT, HostX.visual->visual_id,
XCB_CW_EVENT_MASK, attr_mask,
&attr); attrs);
} }
else { else {
xcb_create_window(HostX.conn, xcb_create_window(HostX.conn,
@ -391,9 +402,9 @@ hostx_init(void)
0,0,100,100, /* will resize */ 0,0,100,100, /* will resize */
0, 0,
XCB_WINDOW_CLASS_COPY_FROM_PARENT, XCB_WINDOW_CLASS_COPY_FROM_PARENT,
XCB_COPY_FROM_PARENT, HostX.visual->visual_id,
XCB_CW_EVENT_MASK, attr_mask,
&attr); attrs);
hostx_set_win_title(screen, hostx_set_win_title(screen,
"(ctrl+shift grabs mouse and keyboard)"); "(ctrl+shift grabs mouse and keyboard)");