Mouse.cpp revision ef78fcbc798650f56698f8978bd4194fcfc55a78
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering/* $Revision$ */
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering/** @file
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * VBoxGuestLibR0 - Mouse Integration.
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering */
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering/*
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * Copyright (C) 2012 Oracle Corporation
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering *
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * This file is part of VirtualBox Open Source Edition (OSE), as
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * available from http://www.virtualbox.org. This file is free software;
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * you can redistribute it and/or modify it under the terms of the GNU
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * General Public License (GPL) as published by the Free Software
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * Foundation, in version 2 as it comes in the "COPYING" file of the
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering *
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * The contents of this file may alternatively be used under the terms
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * of the Common Development and Distribution License Version 1.0
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * VirtualBox OSE distribution, in which case the provisions of the
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering * CDDL are applicable instead of those of the GPL.
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering *
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * You may elect to license modified versions of this file under the
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * terms and conditions of either the GPL or the CDDL or both.
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering */
b5efdb8af40ea759a1ea584c1bc44ecc81dd00ceLennart Poettering
3ffd4af22052963e7a29431721ee204e634bea75Lennart Poettering#include "VBGLInternal.h"
0d39fa9c69b97a2ceb156053deef69c0866c2b97Lennart Poettering
d15d0333be6a1ca7fdd99a1881d967b6be8f387aZbigniew Jędrzejewski-Szmek/**
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering * Sets the function which is called back on each mouse pointer event. Only
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering * one callback can be active at once, so if you need several for any reason
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering * you must multiplex yourself. Call backs can be disabled by passing NULL
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * as the function pointer.
4349cd7c1d153c4ffa23cf1cff1644e0afa9bcf0Lennart Poettering *
6bedfcbb2970e06a4d3280c8fb62083d252ede73Lennart Poettering * @remarks Ring-0.
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering * @returns iprt status code.
4e731273edfe852a3eee2949cd20f49fd5b4f6d7Lennart Poettering * @returns VERR_TRY_AGAIN if the main guest driver hasn't finished
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * initialising.
8fcde01280adcbd07e8205b91ac52b06305b6208Lennart Poettering *
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering * @param pfnNotify the function to call back. NULL to disable call backs.
059cb3858acd038ff2cef10a3a99119bf71a8fc6Lennart Poettering * @param pvUser user supplied data/cookie to be passed to the function.
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering */
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart PoetteringDECLVBGL(int) VbglSetMouseNotifyCallback(PFNVBOXGUESTMOUSENOTIFY pfnNotify,
689aede8c622ba68d9060e4edee27364445b2007Lennart Poettering void *pvUser)
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering{
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering VBoxGuestMouseSetNotifyCallback NotifyCallback;
e48fdd84432bbf9c2ecc339183258c7c33116032Lennart Poettering VBGLDRIVER *pDriver;
6db615c17ee7a434f9e0c40d67a1f833d8f3cc9dLennart Poettering int rc;
6db615c17ee7a434f9e0c40d67a1f833d8f3cc9dLennart Poettering
6db615c17ee7a434f9e0c40d67a1f833d8f3cc9dLennart Poettering rc = vbglGetDriver(&pDriver);
6db615c17ee7a434f9e0c40d67a1f833d8f3cc9dLennart Poettering if (RT_FAILURE(rc))
9f103625b145a397e67c3714766775b615c8b587Tobias Hunger return rc;
9f103625b145a397e67c3714766775b615c8b587Tobias Hunger NotifyCallback.pfnNotify = pfnNotify;
9f103625b145a397e67c3714766775b615c8b587Tobias Hunger NotifyCallback.pvUser = pvUser;
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering return vbglDriverIOCtl(pDriver, VBOXGUEST_IOCTL_SET_MOUSE_NOTIFY_CALLBACK,
5607d856b8606ba75446a07ab5e9048753e1d7a6Zbigniew Jędrzejewski-Szmek &NotifyCallback, sizeof(NotifyCallback));
5607d856b8606ba75446a07ab5e9048753e1d7a6Zbigniew Jędrzejewski-Szmek}
5607d856b8606ba75446a07ab5e9048753e1d7a6Zbigniew Jędrzejewski-Szmek
5607d856b8606ba75446a07ab5e9048753e1d7a6Zbigniew Jędrzejewski-Szmek/**
5607d856b8606ba75446a07ab5e9048753e1d7a6Zbigniew Jędrzejewski-Szmek * Retrieve mouse coordinates and features from the host.
5607d856b8606ba75446a07ab5e9048753e1d7a6Zbigniew Jędrzejewski-Szmek *
bf1d7ba70aceddb5dae0cd2e370b8afaf0c81b05Karel Zak * @remarks Ring-0.
7fd1b19bc9e9f5574f2877936b8ac267c7706947Harald Hoyer * @returns VBox status code.
bf1d7ba70aceddb5dae0cd2e370b8afaf0c81b05Karel Zak *
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * @param pfFeatures Where to store the mouse features.
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * @param px Where to store the X co-ordinate.
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * @param py Where to store the Y co-ordinate.
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering */
00b4ffdecbb39d849af65c0ab741be482325a4a9Lennart PoetteringDECLVBGL(int) VbglGetMouseStatus(uint32_t *pfFeatures, uint32_t *px,
00b4ffdecbb39d849af65c0ab741be482325a4a9Lennart Poettering uint32_t *py)
00b4ffdecbb39d849af65c0ab741be482325a4a9Lennart Poettering{
00b4ffdecbb39d849af65c0ab741be482325a4a9Lennart Poettering VMMDevReqMouseStatus Req;
00b4ffdecbb39d849af65c0ab741be482325a4a9Lennart Poettering VBGLDRIVER *pDriver;
75f86906c52735c98dc0aa7e24b773edb42ee814Lennart Poettering int rc;
689aede8c622ba68d9060e4edee27364445b2007Lennart Poettering
689aede8c622ba68d9060e4edee27364445b2007Lennart Poettering rc = vbglGetDriver(&pDriver);
689aede8c622ba68d9060e4edee27364445b2007Lennart Poettering if (RT_FAILURE(rc))
689aede8c622ba68d9060e4edee27364445b2007Lennart Poettering return rc;
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering vmmdevInitRequest(&Req.header, VMMDevReq_GetMouseStatus);
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering Req.mouseFeatures = 0;
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering Req.pointerXPos = 0;
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering Req.pointerYPos = 0;
b7def684941808600c344f0be7a2b9fcdda97e0fLennart Poettering rc = vbglDriverIOCtl(pDriver, VBOXGUEST_IOCTL_VMMREQUEST(sizeof(Req)),
d0aa9ce51915f6f7448adfeb4be0f46cc1356124Zbigniew Jędrzejewski-Szmek &Req.header, sizeof(Req));
d0aa9ce51915f6f7448adfeb4be0f46cc1356124Zbigniew Jędrzejewski-Szmek if (RT_FAILURE(rc))
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering return rc;
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering if (pfFeatures)
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering *pfFeatures = Req.mouseFeatures;
67ab5f761f9b854d8ce85f9ee47b298e497f8bd9Tom Gundersen if (px)
67ab5f761f9b854d8ce85f9ee47b298e497f8bd9Tom Gundersen *px = Req.pointerXPos;
67ab5f761f9b854d8ce85f9ee47b298e497f8bd9Tom Gundersen if (py)
56f64d95763a799ba4475daf44d8e9f72a1bd474Michal Schmidt *py = Req.pointerYPos;
d0aa9ce51915f6f7448adfeb4be0f46cc1356124Zbigniew Jędrzejewski-Szmek return VINF_SUCCESS;
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering}
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering/**
64347fc2b983f33e7efb0fd2bb44e133fb9f30f4Tom Gundersen * Send mouse features to the host.
64347fc2b983f33e7efb0fd2bb44e133fb9f30f4Tom Gundersen *
c3834f9b881f2b1a68dc7d797c134f0b66b47b57Lennart Poettering * @remarks Ring-0.
c3834f9b881f2b1a68dc7d797c134f0b66b47b57Lennart Poettering * @returns VBox status code.
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering *
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * @param fFeatures Supported mouse pointer features. The main guest driver
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * will mediate different callers and show the host any
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * feature enabled by any guest caller.
bf1d7ba70aceddb5dae0cd2e370b8afaf0c81b05Karel Zak */
bf1d7ba70aceddb5dae0cd2e370b8afaf0c81b05Karel ZakDECLVBGL(int) VbglSetMouseStatus(uint32_t fFeatures)
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering{
47cb901e38cd7092576fc8e76cc4a14f39bf719dLennart Poettering VBGLDRIVER *pDriver;
23bbb0de4e3f85d9704a5c12a5afa2dfa0159e41Michal Schmidt int rc;
23bbb0de4e3f85d9704a5c12a5afa2dfa0159e41Michal Schmidt
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering rc = vbglGetDriver(&pDriver);
b3208b662948b51ff34e7b7752e28ec7a48708aeZbigniew Jędrzejewski-Szmek if (RT_FAILURE(rc))
bf1d7ba70aceddb5dae0cd2e370b8afaf0c81b05Karel Zak return rc;
b3208b662948b51ff34e7b7752e28ec7a48708aeZbigniew Jędrzejewski-Szmek return vbglDriverIOCtl(pDriver, VBOXGUEST_IOCTL_SET_MOUSE_STATUS,
b3208b662948b51ff34e7b7752e28ec7a48708aeZbigniew Jędrzejewski-Szmek &fFeatures, sizeof(fFeatures));
b3208b662948b51ff34e7b7752e28ec7a48708aeZbigniew Jędrzejewski-Szmek}
4e82fe5213bedcb70e25c0270e516d5f2706d8c8Tom Gundersen