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

Reply via email to