Index: /trunk/src/VBox/Additions/x11/VBoxClient/seamless-x11.cpp
===================================================================
--- /trunk/src/VBox/Additions/x11/VBoxClient/seamless-x11.cpp	(revision 52563)
+++ /trunk/src/VBox/Additions/x11/VBoxClient/seamless-x11.cpp	(revision 52564)
@@ -71,10 +71,10 @@
   * @returns true if it can handle seamless, false otherwise
   */
-int SeamlessX11::init(SeamlessHostProxy *pHost)
+int SeamlessX11::init(PFNSENDREGIONUPDATE pHostCallback)
 {
     int rc = VINF_SUCCESS;
 
     LogRelFlowFunc(("\n"));
-    if (0 != mHost)  /* Assertion */
+    if (mHostCallback != NULL)  /* Assertion */
     {
         LogRel(("VBoxClient: ERROR: attempt to initialise seamless guest object twice!\n"));
@@ -86,5 +86,5 @@
         return VERR_ACCESS_DENIED;
     }
-    mHost = pHost;
+    mHostCallback = pHostCallback;
     LogRelFlowFunc(("returning %Rrc\n", rc));
     return rc;
@@ -299,5 +299,5 @@
     {
         updateRects();
-        mHost->sendRegionUpdate(mpRects, mcRects);
+        mHostCallback(mpRects, mcRects);
     }
     mChanged = false;
Index: /trunk/src/VBox/Additions/x11/VBoxClient/seamless-x11.h
===================================================================
--- /trunk/src/VBox/Additions/x11/VBoxClient/seamless-x11.h	(revision 52563)
+++ /trunk/src/VBox/Additions/x11/VBoxClient/seamless-x11.h	(revision 52564)
@@ -34,14 +34,10 @@
 
 /**
- * Small virtual class which provides the interface for notifying the host of
- * changes to the X11 window configuration, mainly split out from
- * @a VBoxGuestSeamlessHost to simplify the unit test.
- */
-class SeamlessHostProxy
-{
-public:
-    virtual void sendRegionUpdate(RTRECT *pRects, size_t cRects) = 0;
-    virtual ~SeamlessHostProxy() {}
-};
+ * Callback which provides the interface for notifying the host of changes to
+ * the X11 window configuration, mainly split out from @a VBoxGuestSeamlessHost
+ * to simplify the unit test.
+ */
+typedef void FNSENDREGIONUPDATE(RTRECT *pRects, size_t cRects);
+typedef FNSENDREGIONUPDATE *PFNSENDREGIONUPDATE;
 
 /** Structure containing information about a guest window's position and visible area.
@@ -164,6 +160,6 @@
 
     // Private member variables
-    /** Pointer to the host class. */
-    SeamlessHostProxy *mHost;
+    /** Pointer to the host callback. */
+    PFNSENDREGIONUPDATE mHostCallback;
     /** Our connection to the X11 display we are running on. */
     Display *mDisplay;
@@ -205,10 +201,10 @@
     /**
      * Initialise the guest and ensure that it is capable of handling seamless mode
-     * @param   pHost Host interface class to notify of window configuration
+     * @param   pHost Host interface callback to notify of window configuration
      *                changes.
      *
      * @returns iprt status code
      */
-    int init(SeamlessHostProxy *pHost);
+    int init(PFNSENDREGIONUPDATE pHostCallback);
 
     /**
@@ -217,7 +213,7 @@
     void uninit(void)
     {
-        if (mHost)
+        if (mHostCallback)
             stop();
-        mHost = NULL;
+        mHostCallback = NULL;
         if (mDisplay)
             XCloseDisplay(mDisplay);
@@ -251,5 +247,5 @@
 
     SeamlessX11(void)
-        : mHost(0), mDisplay(NULL), mpRects(NULL), mcRects(0),
+        : mHostCallback(NULL), mDisplay(NULL), mpRects(NULL), mcRects(0),
           mSupportsShape(false), mEnabled(false), mChanged(false) {}
 
Index: /trunk/src/VBox/Additions/x11/VBoxClient/seamless.cpp
===================================================================
--- /trunk/src/VBox/Additions/x11/VBoxClient/seamless.cpp	(revision 52563)
+++ /trunk/src/VBox/Additions/x11/VBoxClient/seamless.cpp	(revision 52564)
@@ -50,4 +50,19 @@
 
 /**
+ * Update the set of visible rectangles in the host.
+ */
+static void sendRegionUpdate(RTRECT *pRects, size_t cRects)
+{
+    LogRelFlowFunc(("\n"));
+    if (cRects && !pRects)  /* Assertion */
+    {
+        LogRelFunc(("ERROR: called with null pointer!\n"));
+        return;
+    }
+    VbglR3SeamlessSendRects(cRects, pRects);
+    LogRelFlowFunc(("returning\n"));
+}
+
+/**
  * initialise the service.
  */
@@ -60,5 +75,5 @@
     do {
         pcszStage = "Connecting to the X server";
-        rc = mX11Monitor.init(this);
+        rc = mX11Monitor.init(sendRegionUpdate);
         if (RT_FAILURE(rc))
             break;
@@ -175,20 +190,4 @@
 
 /**
- * Update the set of visible rectangles in the host.
- */
-void SeamlessMain::sendRegionUpdate(RTRECT *pRects, size_t cRects)
-{
-    LogRelFlowFunc(("\n"));
-    if (cRects && !pRects)  /* Assertion */
-    {
-        LogRelThisFunc(("ERROR: called with null pointer!\n"));
-        return;
-    }
-    VbglR3SeamlessSendRects(cRects, pRects);
-    LogRelFlowFunc(("returning\n"));
-}
-
-
-/**
  * The actual X11 window configuration change monitor thread function.
  */
Index: /trunk/src/VBox/Additions/x11/VBoxClient/seamless.h
===================================================================
--- /trunk/src/VBox/Additions/x11/VBoxClient/seamless.h	(revision 52563)
+++ /trunk/src/VBox/Additions/x11/VBoxClient/seamless.h	(revision 52564)
@@ -29,5 +29,5 @@
  * Interface to the host
  */
-class SeamlessMain : public SeamlessHostProxy
+class SeamlessMain
 {
 private:
@@ -109,9 +109,4 @@
     int resume();
 
-    /**
-     * Update the set of visible rectangles in the host.
-     */
-    virtual void sendRegionUpdate(RTRECT *pRects, size_t cRects);
-
     /** Run a few tests to be sure everything is working as intended. */
     int selfTest();
Index: /trunk/src/VBox/Additions/x11/VBoxClient/testcase/tstSeamlessX11-auto.cpp
===================================================================
--- /trunk/src/VBox/Additions/x11/VBoxClient/testcase/tstSeamlessX11-auto.cpp	(revision 52563)
+++ /trunk/src/VBox/Additions/x11/VBoxClient/testcase/tstSeamlessX11-auto.cpp	(revision 52564)
@@ -297,17 +297,20 @@
 }
 
-/** Dummy host class */
-class testHost: public SeamlessHostProxy
-{
-    bool mfNotified;
-public:
-    testHost() : mfNotified(false) {}
-    virtual void sendRegionUpdate(RTRECT *pRects, size_t cRects)
-    {
-        mfNotified = true;
-    }
-    virtual ~testHost() {}
-    bool isNotified(void) { return mfNotified; }
-};
+/** Global "received a notification" flag. */
+static bool g_fNotified = false;
+
+/** Dummy host call-back. */
+static void sendRegionUpdate(RTRECT *pRects, size_t cRects)
+{
+    g_fNotified = true;
+}
+
+static bool gotNotification(void)
+{
+    if (!g_fNotified)
+        return false;
+    g_fNotified = false;
+    return true;
+}
 
 /*****************************
@@ -372,4 +375,6 @@
     /** The onscreen positions of those windows. */
     RTRECT *paReportedRects;
+    /** Do we expect notification after the event? */
+    bool fExpectNotification;
 };
 
@@ -419,5 +424,6 @@
     20,
     RT_ELEMENTS(g_aRects1),
-    g_aRects1
+    g_aRects1,
+    true
 };
 
@@ -454,5 +460,6 @@
     20,
     RT_ELEMENTS(g_aRects1),
-    g_aRects1
+    g_aRects1,
+    true
 };
 
@@ -484,5 +491,6 @@
     20,
     RT_ELEMENTS(g_aRects1),
-    g_aRects1
+    g_aRects1,
+    true
 };
 
@@ -514,5 +522,6 @@
     20,
     0,
-    NULL
+    NULL,
+    true
 };
 
@@ -545,5 +554,6 @@
     21,
     RT_ELEMENTS(g_aRects2),
-    g_aRects2
+    g_aRects2,
+    false
 };
 
@@ -574,5 +584,6 @@
     20,
     RT_ELEMENTS(g_aRects1),
-    g_aRects1
+    g_aRects1,
+    true
 };
 
@@ -599,8 +610,7 @@
 {
     SeamlessX11 subject;
-    testHost host;
     unsigned cErrs = 0;
 
-    subject.init(&host);
+    subject.init(sendRegionUpdate);
     smlsSetWindowAttributes(pFixture->paAttribsBefore,
                             pFixture->pahWindowsBefore,
@@ -619,5 +629,5 @@
                            pFixture->paShapeRectsAfter);
     smlsSetNextEvent(pFixture->x11EventType, pFixture->hEventWindow);
-    if (host.isNotified())  /* Initial window tree rebuild */
+    if (gotNotification())  /* Initial window tree rebuild */
     {
         RTPrintf("%s: fixture: %s.  Notification was set before the first event!!!\n",
@@ -626,5 +636,5 @@
     }
     subject.nextConfigurationEvent();
-    if (!host.isNotified())
+    if (!gotNotification())
     {
         RTPrintf("%s: fixture: %s.  No notification was sent for the initial window tree rebuild.\n",
@@ -634,5 +644,5 @@
     smlsSetNextEvent(0, 0);
     subject.nextConfigurationEvent();
-    if (!host.isNotified())
+    if (pFixture->fExpectNotification && !gotNotification())
     {
         RTPrintf("%s: fixture: %s.  No notification was sent after the event.\n",
