seamless.h revision a2760a4d593af57a19ec32cdfd1723b68495df8c
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt/** @file
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews *
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt * Guest client: seamless mode.
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews */
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews/*
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt * Copyright (C) 2006-2007 innotek GmbH
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User *
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * This file is part of VirtualBox Open Source Edition (OSE), as
83a28ca274521e15086fc39febde507bcc4e145eMark Andrews * available from http://www.virtualbox.org. This file is free software;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * you can redistribute it and/or modify it under the terms of the GNU
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * General Public License (GPL) as published by the Free Software
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * Foundation, in version 2 as it comes in the "COPYING" file of the
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt */
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt#ifndef __Additions_xclient_seamless_h
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt# define __Additions_xclient_seamless_h
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt#include "seamless-host.h"
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt#include "seamless-guest.h"
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt#include "seamless-glue.h"
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt/** Thread function class for VBoxGuestSeamlessX11. */
351b62535d4c4f89883bfdba025999dd32490266Evan Huntclass VBoxGuestSeamlessGuestThread: public VBoxGuestThreadFunction
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt{
351b62535d4c4f89883bfdba025999dd32490266Evan Huntprivate:
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt /** The guest class "owning" us. */
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt VBoxGuestSeamlessGuestImpl *mGuest;
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt /** Should we exit the thread? */
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt bool mExit;
938440694b33cd752e9e4b71a526368b4811c177Tinderbox User
19c7b1a0293498a3e36692c59646ed6e15ffc8d0Tinderbox User // Copying or assigning a thread object is not sensible
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews VBoxGuestSeamlessGuestThread(const VBoxGuestSeamlessGuestThread&);
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt VBoxGuestSeamlessGuestThread& operator=(const VBoxGuestSeamlessGuestThread&);
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt
351b62535d4c4f89883bfdba025999dd32490266Evan Huntpublic:
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt VBoxGuestSeamlessGuestThread(VBoxGuestSeamlessGuestImpl *pGuest)
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt { mGuest = pGuest; mExit = false; }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt virtual ~VBoxGuestSeamlessGuestThread(void) {}
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt /**
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * The actual thread function.
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt *
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * @returns iprt status code as thread return value
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * @param pParent the VBoxGuestThread running this thread function
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt */
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt virtual int threadFunction(VBoxGuestThread *pThread)
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt while (!pThread->isStopping)
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt {
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt mGuest->nextEvent();
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt return VINF_SUCCESS;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt }
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt /**
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt * Send a signal to the thread function that it should exit
b67b58ebe73b98f2907d7f3ea02e69a7fa8ba35eFrancis Dupont */
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt virtual void stop(void) { mGuest->interruptEvent(); }
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt};
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt/** Observer for the host class - start and stop seamless reporting in the guest when the
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrews host requests. */
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Huntclass VBoxGuestSeamlessHostObserver : public VBoxGuestSeamlessObserver
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt{
d51e441520ac756af17e4b5589e31e8eac60d1e2Evan Huntprivate:
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt VBoxGuestSeamlessHost *mHost;
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt VBoxGuestSeamlessGuestImpl *mGuest;
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Huntpublic:
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt VBoxGuestSeamlessHostObserver(VBoxGuestSeamlessHost *pHost,
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt VBoxGuestSeamlessGuestImpl *pGuest)
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt {
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt mHost = pHost;
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt mGuest = pGuest;
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt }
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt void notify(void)
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt {
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt switch (mHost->getState())
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt {
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt case VBoxGuestSeamlessGuest::ENABLE:
e9a9bb6b14df7dd5f86ea869e51a03387b64e0e2Evan Hunt mGuest->start();
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt break;
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt case VBoxGuestSeamlessGuest::DISABLE:
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt mGuest->stop();
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt break;
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt default:
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt break;
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt }
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt }
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt};
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt/** Observer for the guest class - send the host updated seamless rectangle information when
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrews it becomes available. */
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Huntclass VBoxGuestSeamlessGuestObserver : public VBoxGuestSeamlessObserver
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt{
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Huntprivate:
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt VBoxGuestSeamlessHost *mHost;
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Hunt VBoxGuestSeamlessGuestImpl *mGuest;
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt
14a656f94b1fd0ababd84a772228dfa52276ba15Evan Huntpublic:
30eec077db2bdcb6f2a0dc388a3cdde2ede75ec1Mark Andrews VBoxGuestSeamlessGuestObserver(VBoxGuestSeamlessHost *pHost,
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt VBoxGuestSeamlessGuestImpl *pGuest)
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt {
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt mHost = pHost;
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt mGuest = pGuest;
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt }
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt void notify(void)
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt {
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt mHost->updateRects(mGuest->getRects());
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt }
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt};
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt
351b62535d4c4f89883bfdba025999dd32490266Evan Huntclass VBoxGuestSeamless
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt{
351b62535d4c4f89883bfdba025999dd32490266Evan Huntprivate:
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt VBoxGuestSeamlessHost mHost;
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt VBoxGuestSeamlessGuestImpl mGuest;
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt VBoxGuestSeamlessHostObserver mHostObs;
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt VBoxGuestSeamlessGuestObserver mGuestObs;
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt VBoxGuestSeamlessGuestThread mGuestFunction;
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt VBoxGuestThread mGuestThread;
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt bool isInitialised;
351b62535d4c4f89883bfdba025999dd32490266Evan Huntpublic:
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt int init(void)
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt {
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt int rc = VINF_SUCCESS;
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt if (isInitialised) /* Assertion */
45d4d69a8d662b6a00e3723c5488af40174a63cbTatuya JINMEI 神明達哉 {
6493425eaa8d09485bcbf78e4f854b1a35ef71edTatuya JINMEI 神明達哉 LogRelFunc(("error: called a second time!\n"));
45d4d69a8d662b6a00e3723c5488af40174a63cbTatuya JINMEI 神明達哉 rc = VERR_INTERNAL_ERROR;
45d4d69a8d662b6a00e3723c5488af40174a63cbTatuya JINMEI 神明達哉 }
45d4d69a8d662b6a00e3723c5488af40174a63cbTatuya JINMEI 神明達哉 if (RT_SUCCESS(rc))
45d4d69a8d662b6a00e3723c5488af40174a63cbTatuya JINMEI 神明達哉 {
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt rc = mHost.init(&mHostObs);
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt }
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt if (RT_SUCCESS(rc))
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt {
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt rc = mGuest.init(&mGuestObs);
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt }
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt if (RT_SUCCESS(rc))
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt {
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt rc = mHost.start();
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt }
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt if (RT_SUCCESS(rc))
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt {
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt rc = mGuestThread.start();
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt }
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt isInitialised = true;
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt return rc;
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt }
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt void uninit(void)
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt {
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt if (isInitialised)
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt {
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt mGuestThread.stop();
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt mHost.stop();
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt mGuest.uninit();
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt isInitialised = false;
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt }
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt }
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt VBoxGuestSeamless() : mHostObs(&mHost, &mGuest), mHostObs(&mHost, &mGuest),
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt mGuestFunction(&mGuest), mGuestThread(&mGuestFunction)
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt {
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt isInitialised = false;
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt }
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt ~VBoxGuestSeamless() { uninit(); }
45d4d69a8d662b6a00e3723c5488af40174a63cbTatuya JINMEI 神明達哉};
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt
351b62535d4c4f89883bfdba025999dd32490266Evan Hunt#endif /* __Additions_xclient_seamless_h not defined */
46bc64f4b1a0e84ab0397943453fe83a17baf2c4Evan Hunt