diff -up tightvnc-1.5.0-20081015svn3022/unix/tx/TXViewport.cxx.viewer-reparent tightvnc-1.5.0-20081015svn3022/unix/tx/TXViewport.cxx --- tightvnc-1.5.0-20081015svn3022/unix/tx/TXViewport.cxx.viewer-reparent 2008-03-14 14:37:09.000000000 +0100 +++ tightvnc-1.5.0-20081015svn3022/unix/tx/TXViewport.cxx 2008-10-23 13:11:39.000000000 +0200 @@ -44,6 +44,21 @@ TXViewport::~TXViewport() delete vScrollbar; } +void TXViewport::reparent(long embed_window) +{ + XReparentWindow(dpy, win(), (Window)embed_window, 0, 0); + XSelectInput(dpy, embed_window, child->eventMask); + if (!eventHandler) + this->setEventHandler(this); +} + +void TXViewport::handleEvent(TXWindow* w, XEvent* ev) +{ + if (child && child->eventHandler) + ((TXEventHandler *)child->eventHandler)->handleEvent(child, ev); +} + + void TXViewport::setChild(TXWindow* child_) { child = child_; diff -up tightvnc-1.5.0-20081015svn3022/unix/tx/TXViewport.h.viewer-reparent tightvnc-1.5.0-20081015svn3022/unix/tx/TXViewport.h --- tightvnc-1.5.0-20081015svn3022/unix/tx/TXViewport.h.viewer-reparent 2008-03-14 14:37:09.000000000 +0100 +++ tightvnc-1.5.0-20081015svn3022/unix/tx/TXViewport.h 2008-10-23 13:11:39.000000000 +0200 @@ -32,8 +32,8 @@ #include "TXWindow.h" #include "TXScrollbar.h" -class TXViewport : public TXWindow, public TXScrollbarCallback, - public rfb::Timer::Callback { +class TXViewport : public TXWindow, public TXScrollbarCallback, + public TXEventHandler, public rfb::Timer::Callback { public: TXViewport(Display* dpy_, int width, int height, TXWindow* parent_=0); virtual ~TXViewport(); @@ -59,6 +59,12 @@ public: // normally. bool bumpScrollEvent(XMotionEvent* ev); + // reparent the viewport into a new window + void reparent(long embed_window); + + // event handler + void handleEvent(TXWindow* w, XEvent* ev); + private: virtual void resizeNotify(); virtual void scrollbarPos(int x, int y, TXScrollbar* sb); diff -up tightvnc-1.5.0-20081015svn3022/unix/tx/TXWindow.h.viewer-reparent tightvnc-1.5.0-20081015svn3022/unix/tx/TXWindow.h --- tightvnc-1.5.0-20081015svn3022/unix/tx/TXWindow.h.viewer-reparent 2006-05-18 13:08:21.000000000 +0200 +++ tightvnc-1.5.0-20081015svn3022/unix/tx/TXWindow.h 2008-10-23 13:11:39.000000000 +0200 @@ -183,6 +183,9 @@ public: Display* const dpy; + TXEventHandler* eventHandler; + long eventMask; + int xPad, yPad, bevel; private: @@ -195,9 +198,7 @@ private: TXWindow* parent; Window win_; int width_, height_; - TXEventHandler* eventHandler; TXDeleteWindowCallback* dwc; - long eventMask; XSizeHints sizeHints; std::map selectionOwnTime; std::map selectionOwner_; diff -up tightvnc-1.5.0-20081015svn3022/vncviewer/CConn.cxx.viewer-reparent tightvnc-1.5.0-20081015svn3022/vncviewer/CConn.cxx --- tightvnc-1.5.0-20081015svn3022/vncviewer/CConn.cxx.viewer-reparent 2008-10-23 13:11:39.000000000 +0200 +++ tightvnc-1.5.0-20081015svn3022/vncviewer/CConn.cxx 2008-10-23 13:11:39.000000000 +0200 @@ -647,10 +647,18 @@ void CConn::recreateViewport() void CConn::reconfigureViewport() { + const char * par = embedParent.getValueStr(); viewport->setMaxSize(cp.width, cp.height); if (fullScreen) { viewport->resize(DisplayWidth(dpy,DefaultScreen(dpy)), DisplayHeight(dpy,DefaultScreen(dpy))); + } else if (strlen(par) != 0) { + XWindowAttributes win_attr; + Window w = strtol(par, (char **)NULL, 0); + + XGetWindowAttributes(dpy, w, &win_attr); + viewport->reparent(w); + viewport->resize(win_attr.width, win_attr.height); } else { int w = cp.width; int h = cp.height; diff -up tightvnc-1.5.0-20081015svn3022/vncviewer/parameters.h.viewer-reparent tightvnc-1.5.0-20081015svn3022/vncviewer/parameters.h --- tightvnc-1.5.0-20081015svn3022/vncviewer/parameters.h.viewer-reparent 2008-10-23 13:11:39.000000000 +0200 +++ tightvnc-1.5.0-20081015svn3022/vncviewer/parameters.h 2008-10-23 13:12:41.000000000 +0200 @@ -42,6 +42,7 @@ extern rfb::IntParameter compressLevel; extern rfb::BoolParameter noJpeg; extern rfb::IntParameter qualityLevel; extern rfb::BoolParameter passwdInput; +extern rfb::StringParameter embedParent; extern char aboutText[]; extern char* programName; diff -up tightvnc-1.5.0-20081015svn3022/vncviewer/parameters.cxx.viewer-reparent tightvnc-1.5.0-20081015svn3022/vncviewer/parameters.cxx --- tightvnc-1.5.0-20081015svn3022/vncviewer/parameters.cxx.viewer-reparent 2008-10-23 13:11:39.000000000 +0200 +++ tightvnc-1.5.0-20081015svn3022/vncviewer/parameters.cxx 2008-10-23 13:12:59.000000000 +0200 @@ -106,6 +106,9 @@ StringParameter displayname("display", " StringParameter preferredEncoding("PreferredEncoding", "Preferred encoding to use (Tight, ZRLE, Hextile or" " Raw)", "Tight"); +/* Support for reparenting */ +StringParameter embedParent("Parent", "X Window to use as a parent", ""); + BoolParameter customCompressLevel("CustomCompressLevel", "Use custom compression level. " "Default if CompressLevel is specified.", false);