VirtualBox

source: vbox/trunk/src/VBox/Additions/x11/vboxmouse/VBoxUtils_68.c@ 19015

Last change on this file since 19015 was 17155, checked in by vboxsync, 16 years ago

Additions/x11/vboxmouse: don't spam the X server log if we can't access the VBox device

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.1 KB
Line 
1/** @file
2 *
3 * VirtualBox X11 Additions mouse driver utility functions
4 */
5
6/*
7 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22#include <iprt/assert.h>
23#include <VBox/VBoxGuest.h>
24#include "VBoxUtils.h"
25
26#include "xf86.h"
27#define NEED_XF86_TYPES
28#include "xf86_ansic.h"
29#include "compiler.h"
30
31#ifndef RT_OS_SOLARIS
32#include <asm/ioctl.h>
33#endif
34
35#ifdef RT_OS_SOLARIS /** @todo later Linux should also use R3 lib for this */
36int VBoxMouseInit(void)
37{
38 int rc = VbglR3Init();
39 if (RT_FAILURE(rc))
40 {
41 ErrorF("VbglR3Init failed.\n");
42 return 1;
43 }
44
45 rc = VbglR3SetMouseStatus(VBOXGUEST_MOUSE_GUEST_CAN_ABSOLUTE | VBOXGUEST_MOUSE_GUEST_NEEDS_HOST_CURSOR);
46 if (RT_FAILURE(rc))
47 {
48 ErrorF("Error sending mouse pointer capabilities to VMM! rc = %d (%s)\n",
49 errno, strerror(errno));
50 return 1;
51 }
52 xf86Msg(X_INFO, "VirtualBox mouse pointer integration available.\n");
53 return 0;
54}
55
56
57int VBoxMouseQueryPosition(unsigned int *puAbsXPos, unsigned int *puAbsYPos)
58{
59 int rc;
60 uint32_t pointerXPos;
61 uint32_t pointerYPos;
62
63 AssertPtrReturn(puAbsXPos, VERR_INVALID_PARAMETER);
64 AssertPtrReturn(puAbsYPos, VERR_INVALID_PARAMETER);
65 rc = VbglR3GetMouseStatus(NULL, &pointerXPos, &pointerYPos);
66 if (RT_SUCCESS(rc))
67 {
68 *puAbsXPos = pointerXPos;
69 *puAbsYPos = pointerYPos;
70 return 0;
71 }
72 return 2;
73}
74
75
76int VBoxMouseFini(void)
77{
78 int rc = VbglR3SetMouseStatus(0);
79 VbglR3Term();
80 return rc;
81}
82#else
83/* the vboxadd module file handle */
84static int g_vboxaddHandle = -1;
85/* the request structure */
86static VMMDevReqMouseStatus *g_vmmreqMouseStatus = NULL;
87
88/**
89 * Initialise mouse integration. Returns 0 on success and 1 on failure
90 * (for example, if the VBox kernel module is not loaded).
91 */
92int VBoxMouseInit(void)
93{
94 VMMDevReqMouseStatus req;
95
96 /* return immediately if already initialized */
97 if (g_vboxaddHandle != -1)
98 return 0;
99
100 /* open the driver */
101 g_vboxaddHandle = open(VBOXGUEST_DEVICE_NAME, O_RDWR, 0);
102 if (g_vboxaddHandle < 0)
103 {
104 ErrorF("Unable to open the virtual machine device: %s\n",
105 strerror(errno));
106 return 1;
107 }
108
109 /* prepare the request structure */
110 g_vmmreqMouseStatus = malloc(vmmdevGetRequestSize(VMMDevReq_GetMouseStatus));
111 if (!g_vmmreqMouseStatus)
112 {
113 ErrorF("Ran out of memory while querying the virtual machine for the mouse capabilities.\n");
114 return 1;
115 }
116 vmmdevInitRequest((VMMDevRequestHeader*)g_vmmreqMouseStatus, VMMDevReq_GetMouseStatus);
117
118 /* tell the host that we want absolute coordinates */
119 vmmdevInitRequest((VMMDevRequestHeader*)&req, VMMDevReq_SetMouseStatus);
120 req.mouseFeatures = VBOXGUEST_MOUSE_GUEST_CAN_ABSOLUTE | VBOXGUEST_MOUSE_GUEST_NEEDS_HOST_CURSOR;
121 req.pointerXPos = 0;
122 req.pointerYPos = 0;
123/** @todo r=bird: Michael, I thought we decided a long time ago that all these should be replaced by VbglR3. I assume this is just a leftover... */
124 if (ioctl(g_vboxaddHandle, VBOXGUEST_IOCTL_VMMREQUEST(sizeof(req)), (void*)&req) < 0)
125 {
126 ErrorF("Error sending mouse pointer capabilities to VMM! rc = %d (%s)\n",
127 errno, strerror(errno));
128 return 1;
129 }
130 /* everything is fine, put out some branding */
131 xf86Msg(X_INFO, "VirtualBox mouse pointer integration available.\n");
132 return 0;
133}
134
135/**
136 * Queries the absolute mouse position from the host.
137 *
138 * Returns 0 on success.
139 * Returns 1 when the host doesn't want absolute coordinates (no coordinates returned)
140 * Otherwise > 1 which means unsuccessful.
141 */
142int VBoxMouseQueryPosition(unsigned int *abs_x, unsigned int *abs_y)
143{
144 /* If we failed to initialise, say that we don't want absolute co-ordinates. */
145 if (g_vboxaddHandle < 0)
146 return 1;
147 /* perform VMM request */
148/** @todo r=bird: Michael, ditto. */
149 if (ioctl(g_vboxaddHandle, VBOXGUEST_IOCTL_VMMREQUEST(vmmdevGetRequestSize(VMMDevReq_GetMouseStatus)), (void*)g_vmmreqMouseStatus) >= 0)
150 {
151 if (RT_SUCCESS(g_vmmreqMouseStatus->header.rc))
152 {
153 /* does the host want absolute coordinates? */
154 if (g_vmmreqMouseStatus->mouseFeatures & VBOXGUEST_MOUSE_HOST_CAN_ABSOLUTE)
155 {
156 *abs_x = g_vmmreqMouseStatus->pointerXPos;
157 *abs_y = g_vmmreqMouseStatus->pointerYPos;
158 return 0;
159 }
160 return 1;
161 }
162 ErrorF("Error querying host mouse position! header.rc = %d\n", g_vmmreqMouseStatus->header.rc);
163 }
164 else
165 {
166 ErrorF("Error performing VMM request! errno = %d (%s)\n",
167 errno, strerror(errno));
168 }
169 /* error! */
170 return 2;
171}
172
173int VBoxMouseFini(void)
174{
175 VMMDevReqMouseStatus req;
176 /* If we are not initialised, there is nothing to do */
177 if (g_vboxaddHandle < 0)
178 return 0;
179 /* tell VMM that we no longer support absolute mouse handling */
180 vmmdevInitRequest((VMMDevRequestHeader*)&req, VMMDevReq_SetMouseStatus);
181 req.mouseFeatures = 0;
182 req.pointerXPos = 0;
183 req.pointerYPos = 0;
184/** @todo r=bird: Michael, ditto. */
185 if (ioctl(g_vboxaddHandle, VBOXGUEST_IOCTL_VMMREQUEST(sizeof(req)), (void*)&req) < 0)
186 {
187 ErrorF("ioctl to vboxadd module failed, rc = %d (%s)\n",
188 errno, strerror(errno));
189 }
190
191 free(g_vmmreqMouseStatus);
192 g_vmmreqMouseStatus = NULL;
193 close(g_vboxaddHandle);
194 g_vboxaddHandle = -1;
195 return 0;
196}
197#endif /* !RT_OS_SOLARIS */
198
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette