[PATCH] make Xephyr resizeable

Adam Jackson ajax at redhat.com
Thu Dec 15 14:01:19 PST 2011


From: Vic Lee <llyzs at 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 <ajax at redhat.com>
Signed-off-by: Vic Lee <llyzs at 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



More information about the xorg-devel mailing list