From: Vic Lee <ll...@163.com> Modified from Vic's original patch to make Xephyr always be resizeable, instead of only if embedded in something else.
https://bugs.freedesktop.org/show_bug.cgi?id=25804 Reviewed-by: Adam Jackson <a...@redhat.com> Signed-off-by: Vic Lee <ll...@163.com> --- hw/kdrive/ephyr/ephyr.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++ hw/kdrive/ephyr/hostx.c | 24 +++++++++++++--------- hw/kdrive/ephyr/hostx.h | 10 ++++++++- 3 files changed, 72 insertions(+), 11 deletions(-) diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c index 254fcbc..14ab591 100644 --- a/hw/kdrive/ephyr/ephyr.c +++ b/hw/kdrive/ephyr/ephyr.c @@ -578,6 +578,8 @@ ephyrRandRSetConfig (ScreenPtr pScreen, if (wasEnabled) KdEnableScreen (pScreen); + RRScreenSizeNotify(pScreen); + return TRUE; bail4: @@ -610,6 +612,45 @@ ephyrRandRInit (ScreenPtr pScreen) pScrPriv->rrSetConfig = ephyrRandRSetConfig; return TRUE; } + +static Bool +ephyrResizeScreen (ScreenPtr pScreen, + int newwidth, + int newheight) +{ + KdScreenPriv(pScreen); + KdScreenInfo *screen = pScreenPriv->screen; + RRScreenSize size = {0}; + Bool ret; + int t; + + if (screen->randr & (RR_Rotate_90|RR_Rotate_270)) + { + t = newwidth; + newwidth = newheight; + newheight = t; + } + + if (newwidth == screen->width && newheight == screen->height) + { + return FALSE; + } + + size.width = newwidth; + size.height = newheight; + + ret = ephyrRandRSetConfig (pScreen, screen->randr, 0, &size); + if (ret) + { + RROutputPtr output; + + output = RRFirstOutput(pScreen); + if (!output) return FALSE; + RROutputSetModes(output, NULL, 0, 0); + } + + return ret; +} #endif Bool @@ -1008,6 +1049,14 @@ ephyrPoll(void) break; #endif /* XF86DRI */ +#ifdef RANDR + case EPHYR_EV_CONFIGURE: + ephyrResizeScreen (screenInfo.screens[ev.data.configure.screen], + ev.data.configure.width, + ev.data.configure.height); + break; +#endif /* RANDR */ + default: break; } diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c index d546370..cdb019d 100644 --- a/hw/kdrive/ephyr/hostx.c +++ b/hw/kdrive/ephyr/hostx.c @@ -348,7 +348,8 @@ hostx_init (void) |PointerMotionMask |KeyPressMask |KeyReleaseMask - |ExposureMask; + |ExposureMask + |StructureNotifyMask; EPHYR_DBG("mark"); @@ -642,7 +643,6 @@ hostx_screen_init (EphyrScreenInfo screen, { int bitmap_pad; Bool shm_success = False; - XSizeHints *size_hints; struct EphyrHostScreen *host_screen = host_screen_from_screen_info (screen); if (!host_screen) @@ -729,14 +729,6 @@ hostx_screen_init (EphyrScreenInfo screen, XResizeWindow (HostX.dpy, host_screen->win, width, height); - /* Ask the WM to keep our size static */ - size_hints = XAllocSizeHints(); - size_hints->max_width = size_hints->min_width = width; - size_hints->max_height = size_hints->min_height = height; - size_hints->flags = PMinSize|PMaxSize; - XSetWMNormalHints(HostX.dpy, host_screen->win, size_hints); - XFree(size_hints); - XMapWindow(HostX.dpy, host_screen->win); XSync(HostX.dpy, False); @@ -1054,6 +1046,18 @@ hostx_get_event(EphyrHostXEvent *ev) ev->data.key_up.scancode = xev.xkey.keycode; return 1; + case ConfigureNotify: + { + struct EphyrHostScreen *host_screen = + host_screen_from_window (xev.xconfigure.window); + ev->type = EPHYR_EV_CONFIGURE; + ev->data.configure.width = xev.xconfigure.width; + ev->data.configure.height = xev.xconfigure.height; + ev->data.configure.window = xev.xconfigure.window; + ev->data.configure.screen = host_screen->mynum; + return 1; + } + default: break; diff --git a/hw/kdrive/ephyr/hostx.h b/hw/kdrive/ephyr/hostx.h index e65e0c9..69e3ceb 100644 --- a/hw/kdrive/ephyr/hostx.h +++ b/hw/kdrive/ephyr/hostx.h @@ -48,7 +48,8 @@ typedef enum EphyrHostXEventType EPHYR_EV_MOUSE_RELEASE, EPHYR_EV_KEY_PRESS, EPHYR_EV_KEY_RELEASE, - EPHYR_EV_EXPOSE + EPHYR_EV_EXPOSE, + EPHYR_EV_CONFIGURE } EphyrHostXEventType; @@ -93,6 +94,13 @@ struct EphyrHostXEvent int window; } expose; + struct configure { + int width; + int height; + int screen; + int window; + } configure; + } data; int key_state; -- 1.7.1 _______________________________________________ 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