From 3cfb2a6e75c7c0c9824df8c5d2ed8d49c656b00c Mon Sep 17 00:00:00 2001 From: Vic Lee Date: Sun, 27 Dec 2009 23:42:28 +0800 Subject: [PATCH] Resize ephyr screen automatically when parent window is resized. Signed-off-by: Vic Lee --- hw/kdrive/ephyr/ephyr.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ hw/kdrive/ephyr/hostx.c | 37 +++++++++++++++++++++++++++++-------- hw/kdrive/ephyr/hostx.h | 10 +++++++++- 3 files changed, 82 insertions(+), 9 deletions(-) diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c index ab8459c..a4333c9 100644 --- a/hw/kdrive/ephyr/ephyr.c +++ b/hw/kdrive/ephyr/ephyr.c @@ -610,6 +610,42 @@ 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) + { + RRScreenSetSizeRange(pScreen, newwidth, newheight, newwidth, newheight); + ScreenRestructured(pScreen); + } + + return ret; +} #endif Bool @@ -994,6 +1030,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 d289d73..7cf7557 100644 --- a/hw/kdrive/ephyr/hostx.c +++ b/hw/kdrive/ephyr/hostx.c @@ -335,7 +335,8 @@ hostx_init (void) |PointerMotionMask |KeyPressMask |KeyReleaseMask - |ExposureMask; + |ExposureMask + |StructureNotifyMask; EPHYR_DBG("mark"); @@ -716,13 +717,16 @@ 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); + if (host_screen->win_pre_existing == None) + { + /* 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); @@ -1059,6 +1063,23 @@ 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); + + if (host_screen && host_screen->win_pre_existing != None) + { + 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; + } + } + return 0; + default: break; diff --git a/hw/kdrive/ephyr/hostx.h b/hw/kdrive/ephyr/hostx.h index c1b1958..43fa95f 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.6.3.3