VirtualBox

source: vbox/trunk/src/VBox/Additions/x11/xmouse/VBoxUtils_68.c@ 7278

Last change on this file since 7278 was 7086, checked in by vboxsync, 17 years ago

Additions/x11: reverted the XFree86/X.org 6.8 additions to their old state (not using IPRT or the guest library)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.7 KB
Line 
1/** @file
2 *
3 * VirtualBox X11 Additions mouse driver utility functions
4 */
5
6/*
7 * Copyright (C) 2006-2007 innotek GmbH
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
18#include <iprt/assert.h>
19#include <VBox/VBoxGuest.h>
20#include "VBoxUtils.h"
21
22#include "xf86.h"
23#define NEED_XF86_TYPES
24#include "xf86_ansic.h"
25#include "compiler.h"
26
27#ifndef RT_OS_SOLARIS
28#include <asm/ioctl.h>
29#endif
30
31#ifdef RT_OS_SOLARIS /** @todo later Linux should also use R3 lib for this */
32int VBoxMouseInit(void)
33{
34 int rc = VbglR3Init();
35 if (RT_FAILURE(rc))
36 {
37 ErrorF("VbglR3Init failed.\n");
38 return 1;
39 }
40
41 rc = VbglR3SetMouseStatus(VBOXGUEST_MOUSE_GUEST_CAN_ABSOLUTE | VBOXGUEST_MOUSE_GUEST_NEEDS_HOST_CURSOR);
42 if (VBOX_FAILURE(rc))
43 {
44 ErrorF("Error sending mouse pointer capabilities to VMM! rc = %d (%s)\n",
45 errno, strerror(errno));
46 return 1;
47 }
48 xf86Msg(X_INFO, "VirtualBox mouse pointer integration available.\n");
49 return 0;
50}
51
52
53int VBoxMouseQueryPosition(unsigned int *puAbsXPos, unsigned int *puAbsYPos)
54{
55 int rc;
56 uint32_t pointerXPos;
57 uint32_t pointerYPos;
58
59 AssertPtrReturn(puAbsXPos, VERR_INVALID_PARAMETER);
60 AssertPtrReturn(puAbsYPos, VERR_INVALID_PARAMETER);
61 rc = VbglR3GetMouseStatus(NULL, &pointerXPos, &pointerYPos);
62 if (VBOX_SUCCESS(rc))
63 {
64 *puAbsXPos = pointerXPos;
65 *puAbsYPos = pointerYPos;
66 return 0;
67 }
68 ErrorF("Error querying host mouse position! rc = %d\n", rc);
69 return 2;
70}
71
72
73int VBoxMouseFini(void)
74{
75 int rc = VbglR3SetMouseStatus(0);
76 VbglR3Term();
77 return rc;
78}
79#else
80/* the vboxadd module file handle */
81static int g_vboxaddHandle = -1;
82/* the request structure */
83static VMMDevReqMouseStatus *g_vmmreqMouseStatus = NULL;
84
85/**
86 * Initialise mouse integration. Returns 0 on success and 1 on failure
87 * (for example, if the VBox kernel module is not loaded).
88 */
89int VBoxMouseInit(void)
90{
91 VMMDevReqMouseStatus req;
92
93 /* return immediately if already initialized */
94 if (g_vboxaddHandle != -1)
95 return 0;
96
97 /* open the driver */
98 g_vboxaddHandle = open(VBOXGUEST_DEVICE_NAME, O_RDWR, 0);
99 if (g_vboxaddHandle < 0)
100 {
101 ErrorF("Unable to open the virtual machine device: %s\n",
102 strerror(errno));
103 return 1;
104 }
105
106 /* prepare the request structure */
107 g_vmmreqMouseStatus = malloc(vmmdevGetRequestSize(VMMDevReq_GetMouseStatus));
108 if (!g_vmmreqMouseStatus)
109 {
110 ErrorF("Ran out of memory while querying the virtual machine for the mouse capabilities.\n");
111 return 1;
112 }
113 vmmdevInitRequest((VMMDevRequestHeader*)g_vmmreqMouseStatus, VMMDevReq_GetMouseStatus);
114
115 /* tell the host that we want absolute coordinates */
116 vmmdevInitRequest((VMMDevRequestHeader*)&req, VMMDevReq_SetMouseStatus);
117 req.mouseFeatures = VBOXGUEST_MOUSE_GUEST_CAN_ABSOLUTE | VBOXGUEST_MOUSE_GUEST_NEEDS_HOST_CURSOR;
118 req.pointerXPos = 0;
119 req.pointerYPos = 0;
120 if (ioctl(g_vboxaddHandle, IOCTL_VBOXGUEST_VMMREQUEST, (void*)&req) < 0)
121 {
122 ErrorF("Error sending mouse pointer capabilities to VMM! rc = %d (%s)\n",
123 errno, strerror(errno));
124 return 1;
125 }
126 /* everything is fine, put out some branding */
127 xf86Msg(X_INFO, "VirtualBox mouse pointer integration available.\n");
128 return 0;
129}
130
131/**
132 * Queries the absolute mouse position from the host.
133 *
134 * Returns 0 on success.
135 * Returns 1 when the host doesn't want absolute coordinates (no coordinates returned)
136 * Otherwise > 1 which means unsuccessful.
137 */
138int VBoxMouseQueryPosition(unsigned int *abs_x, unsigned int *abs_y)
139{
140 /* If we failed to initialise, say that we don't want absolute co-ordinates. */
141 if (g_vboxaddHandle < 0)
142 return 1;
143 /* perform VMM request */
144 if (ioctl(g_vboxaddHandle, IOCTL_VBOXGUEST_VMMREQUEST, (void*)g_vmmreqMouseStatus) >= 0)
145 {
146 if (VBOX_SUCCESS(g_vmmreqMouseStatus->header.rc))
147 {
148 /* does the host want absolute coordinates? */
149 if (g_vmmreqMouseStatus->mouseFeatures & VBOXGUEST_MOUSE_HOST_CAN_ABSOLUTE)
150 {
151 *abs_x = g_vmmreqMouseStatus->pointerXPos;
152 *abs_y = g_vmmreqMouseStatus->pointerYPos;
153 return 0;
154 }
155 else
156 return 1;
157 }
158 else
159 {
160 ErrorF("Error querying host mouse position! header.rc = %d\n", g_vmmreqMouseStatus->header.rc);
161 }
162 }
163 else
164 {
165 ErrorF("Error performing VMM request! errno = %d (%s)\n",
166 errno, strerror(errno));
167 }
168 /* error! */
169 return 2;
170}
171
172int VBoxMouseFini(void)
173{
174 VMMDevReqMouseStatus req;
175 /* If we are not initialised, there is nothing to do */
176 if (g_vboxaddHandle < 0)
177 return 0;
178 /* tell VMM that we no longer support absolute mouse handling */
179 vmmdevInitRequest((VMMDevRequestHeader*)&req, VMMDevReq_SetMouseStatus);
180 req.mouseFeatures = 0;
181 req.pointerXPos = 0;
182 req.pointerYPos = 0;
183 if (ioctl(g_vboxaddHandle, IOCTL_VBOXGUEST_VMMREQUEST, (void*)&req) < 0)
184 {
185 ErrorF("ioctl to vboxadd module failed, rc = %d (%s)\n",
186 errno, strerror(errno));
187 }
188
189 free(g_vmmreqMouseStatus);
190 g_vmmreqMouseStatus = NULL;
191 close(g_vboxaddHandle);
192 g_vboxaddHandle = -1;
193 return 0;
194}
195#endif /* !RT_OS_SOLARIS */
196
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