We can include xcb bits from the same place as server headers, so there's no need to hide them any more. --- hw/kdrive/ephyr/ephyr.c | 26 +--- hw/kdrive/ephyr/ephyr.h | 20 ++- hw/kdrive/ephyr/ephyrinit.c | 5 +- hw/kdrive/ephyr/hostx.c | 372 ++++++++++++++++++++------------------------ hw/kdrive/ephyr/hostx.h | 3 - 5 files changed, 192 insertions(+), 234 deletions(-)
diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c index cd2cae1..bc6b14b 100644 --- a/hw/kdrive/ephyr/ephyr.c +++ b/hw/kdrive/ephyr/ephyr.c @@ -100,8 +100,9 @@ ephyrCardInit(KdCardInfo * card) } Bool -ephyrScreenInitialize(KdScreenInfo * screen, EphyrScrPriv * scrpriv) +ephyrScreenInitialize(KdScreenInfo *screen) { + EphyrScrPriv *scrpriv = screen->driver; int width = 640, height = 480; CARD32 redMask, greenMask, blueMask; @@ -118,7 +119,7 @@ ephyrScreenInitialize(KdScreenInfo * screen, EphyrScrPriv * scrpriv) if (screen->fb.depth < hostx_get_depth() && (screen->fb.depth == 24 || screen->fb.depth == 16 || screen->fb.depth == 8)) { - hostx_set_server_depth(screen, screen->fb.depth); + scrpriv->server_depth = screen->fb.depth; } else ErrorF @@ -181,27 +182,6 @@ ephyrScreenInitialize(KdScreenInfo * screen, EphyrScrPriv * scrpriv) return ephyrMapFramebuffer(screen); } -Bool -ephyrScreenInit(KdScreenInfo * screen) -{ - EphyrScrPriv *scrpriv; - - scrpriv = calloc(1, sizeof(EphyrScrPriv)); - - if (!scrpriv) - return FALSE; - - screen->driver = scrpriv; - - if (!ephyrScreenInitialize(screen, scrpriv)) { - screen->driver = 0; - free(scrpriv); - return FALSE; - } - - return TRUE; -} - void * ephyrWindowLinear(ScreenPtr pScreen, CARD32 row, diff --git a/hw/kdrive/ephyr/ephyr.h b/hw/kdrive/ephyr/ephyr.h index be910c1..73fdb59 100644 --- a/hw/kdrive/ephyr/ephyr.h +++ b/hw/kdrive/ephyr/ephyr.h @@ -29,6 +29,7 @@ #include <unistd.h> #include <signal.h> #include <libgen.h> +#include <xcb/xcb_image.h> #include "os.h" /* for OsSignal() */ #include "kdrive.h" @@ -61,10 +62,24 @@ typedef struct _ephyrFakexaPriv { } EphyrFakexaPriv; typedef struct _ephyrScrPriv { + /* ephyr server info */ Rotation randr; Bool shadow; DamagePtr pDamage; EphyrFakexaPriv *fakexa; + + /* Host X window info */ + xcb_window_t win; + xcb_window_t win_pre_existing; /* Set via -parent option like xnest */ + xcb_window_t peer_win; /* Used for GL; should be at most one */ + xcb_image_t *ximg; + int win_width, win_height; + int server_depth; + unsigned char *fb_data; /* only used when host bpp != server bpp */ + xcb_shm_segment_info_t shminfo; + + KdScreenInfo *screen; + int mynum; /* Screen number */ } EphyrScrPriv; extern KdCardFuncs ephyrFuncs; @@ -80,10 +95,7 @@ Bool ephyrCardInit(KdCardInfo * card); Bool - ephyrScreenInit(KdScreenInfo * screen); - -Bool - ephyrScreenInitialize(KdScreenInfo * screen, EphyrScrPriv * scrpriv); +ephyrScreenInitialize(KdScreenInfo *screen); Bool ephyrInitScreen(ScreenPtr pScreen); diff --git a/hw/kdrive/ephyr/ephyrinit.c b/hw/kdrive/ephyr/ephyrinit.c index 9a1dd7d..7812dbe 100644 --- a/hw/kdrive/ephyr/ephyrinit.c +++ b/hw/kdrive/ephyr/ephyrinit.c @@ -147,6 +147,9 @@ processScreenArg(const char *screen_size, char *parent_id) screen = KdScreenInfoAdd(card); KdParseScreen(screen, screen_size); + screen->driver = calloc(1, sizeof(EphyrScrPriv)); + if (!screen->driver) + FatalError("Couldn't alloc screen private\n"); if (parent_id) { p_id = strtol(parent_id, NULL, 0); @@ -369,7 +372,7 @@ ephyrCursorEnable(ScreenPtr pScreen) KdCardFuncs ephyrFuncs = { ephyrCardInit, /* cardinit */ - ephyrScreenInit, /* scrinit */ + ephyrScreenInitialize, /* scrinit */ ephyrInitScreen, /* initScreen */ ephyrFinishInitScreen, /* finishInitScreen */ ephyrCreateResources, /* createRes */ diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c index 6d780cd..c2754e3 100644 --- a/hw/kdrive/ephyr/hostx.c +++ b/hw/kdrive/ephyr/hostx.c @@ -56,20 +56,6 @@ #include "ephyrlog.h" #include "ephyr.h" -struct EphyrHostScreen { - Window win; - Window win_pre_existing; /* Set via -parent option like xnest */ - Window peer_win; /* Used for GL; should be at most one */ - xcb_image_t *ximg; - int win_width, win_height; - int server_depth; - unsigned char *fb_data; /* only used when host bpp != server bpp */ - xcb_shm_segment_info_t shminfo; - - KdScreenInfo *screen; - int mynum; /* Screen number */ -}; - struct EphyrHostXVars { char *server_dpy_name; xcb_connection_t *conn; @@ -83,7 +69,7 @@ struct EphyrHostXVars { Bool have_shm; int n_screens; - struct EphyrHostScreen *screens; + KdScreenInfo **screens; long damage_debug_msec; @@ -111,29 +97,15 @@ static void #define host_depth_matches_server(_vars) (HostX.depth == (_vars)->server_depth) -static struct EphyrHostScreen * -host_screen_from_screen_info(KdScreenInfo *screen) -{ - int i; - - for (i = 0; i < HostX.n_screens; i++) { - if (HostX.screens[i].screen == screen) { - return &HostX.screens[i]; - } - } - return NULL; -} - int hostx_want_screen_size(KdScreenInfo *screen, int *width, int *height) { - struct EphyrHostScreen *host_screen = host_screen_from_screen_info(screen); + EphyrScrPriv *scrpriv = screen->driver; - if (host_screen && - (host_screen->win_pre_existing != None || - HostX.use_fullscreen == TRUE)) { - *width = host_screen->win_width; - *height = host_screen->win_height; + if (scrpriv && (scrpriv->win_pre_existing != None || + HostX.use_fullscreen == TRUE)) { + *width = scrpriv->win_width; + *height = scrpriv->win_height; return 1; } @@ -143,15 +115,16 @@ hostx_want_screen_size(KdScreenInfo *screen, int *width, int *height) void hostx_add_screen(KdScreenInfo *screen, unsigned long win_id, int screen_num) { + EphyrScrPriv *scrpriv = screen->driver; int index = HostX.n_screens; HostX.n_screens += 1; HostX.screens = realloc(HostX.screens, - HostX.n_screens * sizeof(struct EphyrHostScreen)); - memset(&HostX.screens[index], 0, sizeof(struct EphyrHostScreen)); + HostX.n_screens * sizeof(HostX.screens[0])); + HostX.screens[index] = screen; - HostX.screens[index].screen = screen; - HostX.screens[index].win_pre_existing = win_id; + scrpriv->screen = screen; + scrpriv->win_pre_existing = win_id; } void @@ -163,25 +136,25 @@ hostx_set_display_name(char *name) void hostx_set_screen_number(KdScreenInfo *screen, int number) { - struct EphyrHostScreen *host_screen = host_screen_from_screen_info(screen); + EphyrScrPriv *scrpriv = screen->driver; - if (host_screen) { - host_screen->mynum = number; - hostx_set_win_title(host_screen->screen, ""); + if (scrpriv) { + scrpriv->mynum = number; + hostx_set_win_title(screen, ""); } } void hostx_set_win_title(KdScreenInfo *screen, const char *extra_text) { - struct EphyrHostScreen *host_screen = host_screen_from_screen_info(screen); + EphyrScrPriv *scrpriv = screen->driver; - if (!host_screen) + if (!scrpriv) return; if (ephyrTitle) { xcb_icccm_set_wm_name(HostX.conn, - host_screen->win, + scrpriv->win, XCB_ATOM_STRING, 8, strlen(ephyrTitle), @@ -193,10 +166,10 @@ hostx_set_win_title(KdScreenInfo *screen, const char *extra_text) memset(buf, 0, BUF_LEN + 1); snprintf(buf, BUF_LEN, "Xephyr on %s.%d %s", HostX.server_dpy_name, - host_screen->mynum, (extra_text != NULL) ? extra_text : ""); + scrpriv->mynum, (extra_text != NULL) ? extra_text : ""); xcb_icccm_set_wm_name(HostX.conn, - host_screen->win, + scrpriv->win, XCB_ATOM_STRING, 8, strlen(buf), @@ -219,9 +192,9 @@ hostx_use_host_cursor(void) int hostx_want_preexisting_window(KdScreenInfo *screen) { - struct EphyrHostScreen *host_screen = host_screen_from_screen_info(screen); + EphyrScrPriv *scrpriv = screen->driver; - if (host_screen && host_screen->win_pre_existing) { + if (scrpriv && scrpriv->win_pre_existing) { return 1; } else { @@ -261,9 +234,10 @@ hostx_set_fullscreen_hint(void) free(reply); for (index = 0; index < HostX.n_screens; index++) { + EphyrScrPriv *scrpriv = HostX.screens[index]->driver; xcb_change_property(HostX.conn, PropModeReplace, - HostX.screens[index].win, + scrpriv->win, atom_WINDOW_STATE, XCB_ATOM_ATOM, 32, @@ -316,7 +290,7 @@ hostx_init(void) char *class_hint; size_t class_len; const xcb_query_extension_reply_t *shm_rep; - xcb_screen_t *screen; + xcb_screen_t *xscreen; attr = XCB_EVENT_MASK_BUTTON_PRESS @@ -334,11 +308,11 @@ hostx_init(void) exit(1); } - screen = xcb_aux_get_screen(HostX.conn, HostX.screen); - HostX.winroot = screen->root; + xscreen = xcb_aux_get_screen(HostX.conn, HostX.screen); + HostX.winroot = xscreen->root; HostX.gc = xcb_generate_id(HostX.conn); - HostX.depth = screen->root_depth; - HostX.visual = xcb_aux_find_visual_by_id(screen, screen->root_visual); + HostX.depth = xscreen->root_depth; + HostX.visual = xcb_aux_find_visual_by_id(xscreen, xscreen->root_visual); xcb_create_gc(HostX.conn, HostX.gc, HostX.winroot, 0, NULL); cookie_WINDOW_STATE = xcb_intern_atom(HostX.conn, FALSE, @@ -350,19 +324,21 @@ hostx_init(void) "_NET_WM_STATE_FULLSCREEN"); for (index = 0; index < HostX.n_screens; index++) { - struct EphyrHostScreen *host_screen = &HostX.screens[index]; + KdScreenInfo *screen = HostX.screens[index]; + EphyrScrPriv *scrpriv = screen->driver; - host_screen->win = xcb_generate_id(HostX.conn); - host_screen->server_depth = HostX.depth; + scrpriv->win = xcb_generate_id(HostX.conn); + scrpriv->server_depth = HostX.depth; + scrpriv->ximg = NULL; - if (host_screen->win_pre_existing != XCB_WINDOW_NONE) { + if (scrpriv->win_pre_existing != XCB_WINDOW_NONE) { xcb_get_geometry_reply_t *prewin_geom; xcb_get_geometry_cookie_t cookie; xcb_generic_error_t *e = NULL; /* Get screen size from existing window */ cookie = xcb_get_geometry(HostX.conn, - host_screen->win_pre_existing); + scrpriv->win_pre_existing); prewin_geom = xcb_get_geometry_reply(HostX.conn, cookie, &e); if (e) { @@ -372,18 +348,18 @@ hostx_init(void) exit (1); } - host_screen->win_width = prewin_geom->width; - host_screen->win_height = prewin_geom->height; + scrpriv->win_width = prewin_geom->width; + scrpriv->win_height = prewin_geom->height; free(prewin_geom); xcb_create_window(HostX.conn, XCB_COPY_FROM_PARENT, - host_screen->win, - host_screen->win_pre_existing, + scrpriv->win, + scrpriv->win_pre_existing, 0,0, - host_screen->win_width, - host_screen->win_height, + scrpriv->win_width, + scrpriv->win_height, 0, XCB_WINDOW_CLASS_COPY_FROM_PARENT, XCB_COPY_FROM_PARENT, @@ -393,7 +369,7 @@ hostx_init(void) else { xcb_create_window(HostX.conn, XCB_COPY_FROM_PARENT, - host_screen->win, + scrpriv->win, HostX.winroot, 0,0,100,100, /* will resize */ 0, @@ -402,12 +378,12 @@ hostx_init(void) XCB_CW_EVENT_MASK, &attr); - hostx_set_win_title (host_screen->screen, - "(ctrl+shift grabs mouse and keyboard)"); + hostx_set_win_title(screen, + "(ctrl+shift grabs mouse and keyboard)"); if (HostX.use_fullscreen) { - host_screen->win_width = screen->width_in_pixels; - host_screen->win_height = screen->height_in_pixels; + scrpriv->win_width = xscreen->width_in_pixels; + scrpriv->win_height = xscreen->height_in_pixels; hostx_set_fullscreen_hint(); } @@ -422,7 +398,7 @@ hostx_init(void) strcpy(class_hint + strlen(ephyrResName) + 1, "Xephyr"); xcb_change_property(HostX.conn, XCB_PROP_MODE_REPLACE, - host_screen->win, + scrpriv->win, XCB_ATOM_WM_CLASS, XCB_ATOM_STRING, 8, @@ -435,7 +411,7 @@ hostx_init(void) if (!xcb_aux_parse_color("red", &red, &green, &blue)) { xcb_lookup_color_cookie_t c = - xcb_lookup_color(HostX.conn, screen->default_colormap, 3, "red"); + xcb_lookup_color(HostX.conn, xscreen->default_colormap, 3, "red"); xcb_lookup_color_reply_t *reply = xcb_lookup_color_reply(HostX.conn, c, NULL); red = reply->exact_red; @@ -446,7 +422,7 @@ hostx_init(void) { xcb_alloc_color_cookie_t c = xcb_alloc_color(HostX.conn, - screen->default_colormap, + xscreen->default_colormap, red, green, blue); xcb_alloc_color_reply_t *r = xcb_alloc_color_reply(HostX.conn, c, NULL); red = r->red; @@ -470,18 +446,17 @@ hostx_init(void) 0,0,0, 1,1); for (index = 0; index < HostX.n_screens; index++) { + KdScreenInfo *screen = HostX.screens[index]; + EphyrScrPriv *scrpriv = screen->driver; + xcb_change_window_attributes(HostX.conn, - HostX.screens[index].win, + scrpriv->win, XCB_CW_CURSOR, &empty_cursor); } xcb_free_pixmap(HostX.conn, cursor_pxm); } - for (index = 0; index < HostX.n_screens; index++) { - HostX.screens[index].ximg = NULL; - } - /* Try to get share memory ximages for a little bit more speed */ shm_rep = xcb_get_extension_data(HostX.conn, &xcb_shm_id); if (!shm_rep || !shm_rep->present || getenv("XEPHYR_NO_SHM")) { @@ -538,49 +513,40 @@ hostx_get_depth(void) int hostx_get_server_depth(KdScreenInfo *screen) { - struct EphyrHostScreen *host_screen = host_screen_from_screen_info(screen); + EphyrScrPriv *scrpriv = screen->driver; - return host_screen ? host_screen->server_depth : 0; -} - -void -hostx_set_server_depth(KdScreenInfo *screen, int depth) -{ - struct EphyrHostScreen *host_screen = host_screen_from_screen_info(screen); - - if (host_screen) - host_screen->server_depth = depth; + return scrpriv ? scrpriv->server_depth : 0; } int hostx_get_bpp(KdScreenInfo *screen) { - struct EphyrHostScreen *host_screen = host_screen_from_screen_info(screen); + EphyrScrPriv *scrpriv = screen->driver; - if (!host_screen) + if (!scrpriv) return 0; - if (host_depth_matches_server (host_screen)) + if (host_depth_matches_server(scrpriv)) return HostX.visual->bits_per_rgb_value; else - return host_screen->server_depth; /*XXX correct ?*/ + return scrpriv->server_depth; /*XXX correct ?*/ } void hostx_get_visual_masks(KdScreenInfo *screen, CARD32 *rmsk, CARD32 *gmsk, CARD32 *bmsk) { - struct EphyrHostScreen *host_screen = host_screen_from_screen_info(screen); + EphyrScrPriv *scrpriv = screen->driver; - if (!host_screen) + if (!scrpriv) return; - if (host_depth_matches_server(host_screen)) { + if (host_depth_matches_server(scrpriv)) { *rmsk = HostX.visual->red_mask; *gmsk = HostX.visual->green_mask; *bmsk = HostX.visual->blue_mask; } - else if (host_screen->server_depth == 16) { + else if (scrpriv->server_depth == 16) { /* Assume 16bpp 565 */ *rmsk = 0xf800; *gmsk = 0x07e0; @@ -645,11 +611,10 @@ hostx_screen_init(KdScreenInfo *screen, int width, int height, int buffer_height, int *bytes_per_line, int *bits_per_pixel) { + EphyrScrPriv *scrpriv = screen->driver; Bool shm_success = FALSE; - struct EphyrHostScreen *host_screen = host_screen_from_screen_info(screen); - - if (!host_screen) { + if (!scrpriv) { fprintf(stderr, "%s: Error in accessing hostx data\n", __func__); exit(1); } @@ -657,64 +622,64 @@ hostx_screen_init(KdScreenInfo *screen, EPHYR_DBG("host_screen=%p wxh=%dx%d, buffer_height=%d", host_screen, width, height, buffer_height); - if (host_screen->ximg != NULL) { + if (scrpriv->ximg != NULL) { /* Free up the image data if previously used * i.ie called by server reset */ if (HostX.have_shm) { - xcb_shm_detach(HostX.conn, host_screen->shminfo.shmseg); - xcb_image_destroy (host_screen->ximg); - shmdt(host_screen->shminfo.shmaddr); - shmctl(host_screen->shminfo.shmid, IPC_RMID, 0); + xcb_shm_detach(HostX.conn, scrpriv->shminfo.shmseg); + xcb_image_destroy(scrpriv->ximg); + shmdt(scrpriv->shminfo.shmaddr); + shmctl(scrpriv->shminfo.shmid, IPC_RMID, 0); } else { - free(host_screen->ximg->data); - host_screen->ximg->data = NULL; + free(scrpriv->ximg->data); + scrpriv->ximg->data = NULL; - xcb_image_destroy(host_screen->ximg); + xcb_image_destroy(scrpriv->ximg); } } if (HostX.have_shm) { - host_screen->ximg = xcb_image_create_native(HostX.conn, - width, - buffer_height, - XCB_IMAGE_FORMAT_Z_PIXMAP, - HostX.depth, - NULL, - ~0, - NULL); - - host_screen->shminfo.shmid = + scrpriv->ximg = xcb_image_create_native(HostX.conn, + width, + buffer_height, + XCB_IMAGE_FORMAT_Z_PIXMAP, + HostX.depth, + NULL, + ~0, + NULL); + + scrpriv->shminfo.shmid = shmget(IPC_PRIVATE, - host_screen->ximg->stride * buffer_height, + scrpriv->ximg->stride * buffer_height, IPC_CREAT | 0777); - host_screen->ximg->data = shmat(host_screen->shminfo.shmid, 0, 0); - host_screen->shminfo.shmaddr = host_screen->ximg->data; + scrpriv->ximg->data = shmat(scrpriv->shminfo.shmid, 0, 0); + scrpriv->shminfo.shmaddr = scrpriv->ximg->data; - if (host_screen->ximg->data == (uint8_t *) -1) { + if (scrpriv->ximg->data == (uint8_t *) -1) { EPHYR_DBG ("Can't attach SHM Segment, falling back to plain XImages"); HostX.have_shm = FALSE; - xcb_image_destroy (host_screen->ximg); - shmctl(host_screen->shminfo.shmid, IPC_RMID, 0); + xcb_image_destroy (scrpriv->ximg); + shmctl(scrpriv->shminfo.shmid, IPC_RMID, 0); } else { - EPHYR_DBG("SHM segment attached %p", host_screen->shminfo.shmaddr); - host_screen->shminfo.shmseg = xcb_generate_id(HostX.conn); + EPHYR_DBG("SHM segment attached %p", scrpriv->shminfo.shmaddr); + scrpriv->shminfo.shmseg = xcb_generate_id(HostX.conn); xcb_shm_attach(HostX.conn, - host_screen->shminfo.shmseg, - host_screen->shminfo.shmid, + scrpriv->shminfo.shmseg, + scrpriv->shminfo.shmid, FALSE); shm_success = TRUE; } } if (!shm_success) { - EPHYR_DBG("Creating image %dx%d for screen host_screen=%p\n", - width, buffer_height, host_screen); - host_screen->ximg = xcb_image_create_native(HostX.conn, + EPHYR_DBG("Creating image %dx%d for screen scrpriv=%p\n", + width, buffer_height, scrpriv); + scrpriv->ximg = xcb_image_create_native(HostX.conn, width, buffer_height, XCB_IMAGE_FORMAT_Z_PIXMAP, @@ -723,53 +688,53 @@ hostx_screen_init(KdScreenInfo *screen, ~0, NULL); - host_screen->ximg->data = - malloc(host_screen->ximg->stride * buffer_height); + scrpriv->ximg->data = + malloc(scrpriv->ximg->stride * buffer_height); } - *bytes_per_line = host_screen->ximg->stride; - *bits_per_pixel = host_screen->ximg->bpp; + *bytes_per_line = scrpriv->ximg->stride; + *bits_per_pixel = scrpriv->ximg->bpp; - if (host_screen->win_pre_existing == None && !EphyrWantResize) { + if (scrpriv->win_pre_existing == None && !EphyrWantResize) { /* Ask the WM to keep our size static */ xcb_size_hints_t size_hints = {0}; size_hints.max_width = size_hints.min_width = width; size_hints.max_height = size_hints.min_height = height; size_hints.flags = (XCB_ICCCM_SIZE_HINT_P_MIN_SIZE | XCB_ICCCM_SIZE_HINT_P_MAX_SIZE); - xcb_icccm_set_wm_normal_hints(HostX.conn, host_screen->win, + xcb_icccm_set_wm_normal_hints(HostX.conn, scrpriv->win, &size_hints); } - xcb_map_window(HostX.conn, host_screen->win); + xcb_map_window(HostX.conn, scrpriv->win); xcb_aux_sync(HostX.conn); - host_screen->win_width = width; - host_screen->win_height = height; + scrpriv->win_width = width; + scrpriv->win_height = height; - if (host_depth_matches_server(host_screen)) { + if (host_depth_matches_server(scrpriv)) { EPHYR_DBG("Host matches server"); - return host_screen->ximg->data; + return scrpriv->ximg->data; } else { - EPHYR_DBG("server bpp %i", host_screen->server_depth >> 3); - host_screen->fb_data = - malloc(width * buffer_height * (host_screen->server_depth >> 3)); - return host_screen->fb_data; + EPHYR_DBG("server bpp %i", scrpriv->server_depth >> 3); + scrpriv->fb_data = + malloc(width * buffer_height * (scrpriv->server_depth >> 3)); + return scrpriv->fb_data; } } -static void hostx_paint_debug_rect(struct EphyrHostScreen *host_screen, +static void hostx_paint_debug_rect(KdScreenInfo *screen, int x, int y, int width, int height); void hostx_paint_rect(KdScreenInfo *screen, int sx, int sy, int dx, int dy, int width, int height) { - struct EphyrHostScreen *host_screen = host_screen_from_screen_info(screen); + EphyrScrPriv *scrpriv = screen->driver; - EPHYR_DBG("painting in screen %d\n", host_screen->mynum); + EPHYR_DBG("painting in screen %d\n", scrpriv->mynum); /* * Copy the image data updated by the shadow layer @@ -777,7 +742,7 @@ hostx_paint_rect(KdScreenInfo *screen, */ if (HostXWantDamageDebug) { - hostx_paint_debug_rect(host_screen, dx, dy, width, height); + hostx_paint_debug_rect(screen, dx, dy, width, height); } /* @@ -792,23 +757,23 @@ hostx_paint_rect(KdScreenInfo *screen, * ... and it will be slower than the matching depth case. */ - if (!host_depth_matches_server(host_screen)) { - int x, y, idx, bytes_per_pixel = (host_screen->server_depth >> 3); + if (!host_depth_matches_server(scrpriv)) { + int x, y, idx, bytes_per_pixel = (scrpriv->server_depth >> 3); unsigned char r, g, b; unsigned long host_pixel; - EPHYR_DBG("Unmatched host depth host_screen=%p\n", host_screen); + EPHYR_DBG("Unmatched host depth scrpriv=%p\n", scrpriv); for (y = sy; y < sy + height; y++) for (x = sx; x < sx + width; x++) { idx = - (host_screen->win_width * y * bytes_per_pixel) + + (scrpriv->win_width * y * bytes_per_pixel) + (x * bytes_per_pixel); - switch (host_screen->server_depth) { + switch (scrpriv->server_depth) { case 16: { unsigned short pixel = - *(unsigned short *) (host_screen->fb_data + idx); + *(unsigned short *) (scrpriv->fb_data + idx); r = ((pixel & 0xf800) >> 8); g = ((pixel & 0x07e0) >> 3); @@ -816,14 +781,14 @@ hostx_paint_rect(KdScreenInfo *screen, host_pixel = (r << 16) | (g << 8) | (b); - xcb_image_put_pixel(host_screen->ximg, x, y, host_pixel); + xcb_image_put_pixel(scrpriv->ximg, x, y, host_pixel); break; } case 8: { unsigned char pixel = - *(unsigned char *) (host_screen->fb_data + idx); - xcb_image_put_pixel(host_screen->ximg, x, y, + *(unsigned char *) (scrpriv->fb_data + idx); + xcb_image_put_pixel(scrpriv->ximg, x, y, HostX.cmap[pixel]); break; } @@ -834,13 +799,13 @@ hostx_paint_rect(KdScreenInfo *screen, } if (HostX.have_shm) { - xcb_image_shm_put(HostX.conn, host_screen->win, - HostX.gc, host_screen->ximg, - host_screen->shminfo, + xcb_image_shm_put(HostX.conn, scrpriv->win, + HostX.gc, scrpriv->ximg, + scrpriv->shminfo, sx, sy, dx, dy, width, height, FALSE); } else { - xcb_image_put(HostX.conn, host_screen->win, HostX.gc, host_screen->ximg, + xcb_image_put(HostX.conn, scrpriv->win, HostX.gc, scrpriv->ximg, dx, dy, 0); } @@ -848,9 +813,10 @@ hostx_paint_rect(KdScreenInfo *screen, } static void -hostx_paint_debug_rect(struct EphyrHostScreen *host_screen, +hostx_paint_debug_rect(KdScreenInfo *screen, int x, int y, int width, int height) { + EphyrScrPriv *scrpriv = screen->driver; struct timespec tspec; xcb_rectangle_t rect = { .x = x, .y = y, .width = width, .height = height }; xcb_void_cookie_t cookie; @@ -864,7 +830,7 @@ hostx_paint_debug_rect(struct EphyrHostScreen *host_screen, /* fprintf(stderr, "Xephyr updating: %i+%i %ix%i\n", x, y, width, height); */ - cookie = xcb_poly_fill_rectangle_checked(HostX.conn, host_screen->win, + cookie = xcb_poly_fill_rectangle_checked(HostX.conn, scrpriv->win, HostX.gc, 1, &rect); e = xcb_request_check(HostX.conn, cookie); free(e); @@ -887,23 +853,21 @@ hostx_load_keymap(void) ephyrKeySyms.maxKeyCode = max_keycode; } -static struct EphyrHostScreen * -host_screen_from_window(Window w) +static KdScreenInfo * +screen_from_window(Window w) { int index = 0; - struct EphyrHostScreen *result = NULL; for (index = 0; index < HostX.n_screens; index++) { - if (HostX.screens[index].win == w - || HostX.screens[index].peer_win == w - || HostX.screens[index].win_pre_existing == w) { - result = &HostX.screens[index]; - goto out; + EphyrScrPriv *scrpriv = HostX.screens[index]->driver; + if (scrpriv->win == w + || scrpriv->peer_win == w + || scrpriv->win_pre_existing == w) { + return HostX.screens[index]; } } - out: - return result; + return NULL; } int @@ -948,8 +912,8 @@ hostx_get_event(EphyrHostXEvent * ev) case XCB_EXPOSE: { xcb_expose_event_t *expose = (xcb_expose_event_t *)xev; - struct EphyrHostScreen *host_screen = - host_screen_from_window(expose->window); + KdScreenInfo *screen = screen_from_window(expose->window); + EphyrScrPriv *scrpriv = screen->driver; /* Wait for the last expose event in a series of cliprects * to actually paint our screen. @@ -957,10 +921,10 @@ hostx_get_event(EphyrHostXEvent * ev) if (expose->count != 0) break; - if (host_screen) { - hostx_paint_rect(host_screen->screen, 0, 0, 0, 0, - host_screen->win_width, - host_screen->win_height); + if (scrpriv) { + hostx_paint_rect(screen, 0, 0, 0, 0, + scrpriv->win_width, + scrpriv->win_height); } else { EPHYR_LOG_ERROR("failed to get host screen\n"); @@ -974,15 +938,14 @@ hostx_get_event(EphyrHostXEvent * ev) case XCB_MOTION_NOTIFY: { xcb_motion_notify_event_t *motion = (xcb_motion_notify_event_t *)xev; - struct EphyrHostScreen *host_screen = - host_screen_from_window(motion->event); + KdScreenInfo *screen = screen_from_window(motion->event); + EphyrScrPriv *scrpriv = screen->driver; ev->type = EPHYR_EV_MOUSE_MOTION; ev->data.mouse_motion.x = motion->event_x; ev->data.mouse_motion.y = motion->event_y; ev->data.mouse_motion.window = motion->event; - ev->data.mouse_motion.screen = - (host_screen ? host_screen->mynum : -1); + ev->data.mouse_motion.screen = scrpriv ? scrpriv->mynum : -1; free(xev); return 1; } @@ -1023,14 +986,14 @@ hostx_get_event(EphyrHostXEvent * ev) if ((xcb_key_symbols_get_keysym(keysyms, key->detail, 0) == XK_Shift_L || xcb_key_symbols_get_keysym(keysyms, key->detail, 0) == XK_Shift_R) && (key->state & XCB_MOD_MASK_CONTROL)) { - struct EphyrHostScreen *host_screen = - host_screen_from_window(key->event); + KdScreenInfo *screen = screen_from_window(key->event); + EphyrScrPriv *scrpriv = screen->driver; if (grabbed_screen != -1) { xcb_ungrab_keyboard(HostX.conn, XCB_TIME_CURRENT_TIME); xcb_ungrab_pointer(HostX.conn, XCB_TIME_CURRENT_TIME); grabbed_screen = -1; - hostx_set_win_title(host_screen->screen, + hostx_set_win_title(screen, "(ctrl+shift grabs mouse and keyboard)"); } else { @@ -1038,7 +1001,7 @@ hostx_get_event(EphyrHostXEvent * ev) xcb_grab_keyboard_cookie_t kbgrabc = xcb_grab_keyboard(HostX.conn, TRUE, - host_screen->win, + scrpriv->win, XCB_TIME_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC); @@ -1046,11 +1009,11 @@ hostx_get_event(EphyrHostXEvent * ev) xcb_grab_pointer_cookie_t pgrabc = xcb_grab_pointer(HostX.conn, TRUE, - host_screen->win, + scrpriv->win, 0, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, - host_screen->win, + scrpriv->win, XCB_NONE, XCB_TIME_CURRENT_TIME); xcb_grab_pointer_reply_t *pgrabr; @@ -1065,9 +1028,9 @@ hostx_get_event(EphyrHostXEvent * ev) xcb_ungrab_keyboard(HostX.conn, XCB_TIME_CURRENT_TIME); } else { - grabbed_screen = host_screen->mynum; + grabbed_screen = scrpriv->mynum; hostx_set_win_title - (host_screen->screen, + (screen, "(ctrl+shift releases mouse and keyboard)"); } } @@ -1087,14 +1050,13 @@ hostx_get_event(EphyrHostXEvent * ev) case ConfigureNotify: { - struct EphyrHostScreen *host_screen; xcb_configure_notify_event_t *configure = (xcb_configure_notify_event_t *)xev; + KdScreenInfo *screen = screen_from_window(configure->window); + EphyrScrPriv *scrpriv = screen->driver; - host_screen = host_screen_from_window(configure->window); - - if (!host_screen || - (host_screen->win_pre_existing == None && !EphyrWantResize)) { + if (!scrpriv || + (scrpriv->win_pre_existing == None && !EphyrWantResize)) { free(xev); return 0; } @@ -1103,7 +1065,7 @@ hostx_get_event(EphyrHostXEvent * ev) ev->data.configure.width = configure->width; ev->data.configure.height = configure->height; ev->data.configure.window = configure->window; - ev->data.configure.screen = host_screen->mynum; + ev->data.configure.screen = scrpriv->mynum; free(xev); return 1; @@ -1131,11 +1093,13 @@ hostx_get_screen(void) int hostx_get_window(int a_screen_number) { + EphyrScrPriv *scrpriv; if (a_screen_number < 0 || a_screen_number >= HostX.n_screens) { EPHYR_LOG_ERROR("bad screen number:%d\n", a_screen_number); return 0; } - return HostX.screens[a_screen_number].win; + scrpriv = HostX.screens[a_screen_number]->driver; + return scrpriv->win; } int @@ -1228,6 +1192,8 @@ hostx_create_window(int a_screen_number, xcb_screen_t *screen = xcb_aux_get_screen(HostX.conn, hostx_get_screen()); xcb_visualtype_t *visual; int depth = 0; + EphyrScrPriv *scrpriv = HostX.screens[a_screen_number]->driver; + EPHYR_RETURN_VAL_IF_FAIL(screen && a_geometry, FALSE); EPHYR_LOG("enter\n"); @@ -1264,8 +1230,8 @@ hostx_create_window(int a_screen_number, XCB_WINDOW_CLASS_COPY_FROM_PARENT, a_visual_id, winmask, attrs); - if (HostX.screens[a_screen_number].peer_win == XCB_NONE) { - HostX.screens[a_screen_number].peer_win = win; + if (scrpriv->peer_win == XCB_NONE) { + scrpriv->peer_win = win; } else { EPHYR_LOG_ERROR("multiple peer windows created for same screen\n"); diff --git a/hw/kdrive/ephyr/hostx.h b/hw/kdrive/ephyr/hostx.h index b582e66..8018f94 100644 --- a/hw/kdrive/ephyr/hostx.h +++ b/hw/kdrive/ephyr/hostx.h @@ -177,9 +177,6 @@ int int hostx_get_server_depth(KdScreenInfo *screen); -void -hostx_set_server_depth(KdScreenInfo *screen, int depth); - int hostx_get_bpp(KdScreenInfo *screen); -- 1.8.4.rc3 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel