Statistics
| Branch: | Revision:

root / hw / msmouse.c @ f753ff16

History | View | Annotate | Download (2.6 kB)

1 aa71cf80 aurel32
/*
2 aa71cf80 aurel32
 * QEMU Microsoft serial mouse emulation
3 aa71cf80 aurel32
 *
4 aa71cf80 aurel32
 * Copyright (c) 2008 Lubomir Rintel
5 aa71cf80 aurel32
 *
6 aa71cf80 aurel32
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 aa71cf80 aurel32
 * of this software and associated documentation files (the "Software"), to deal
8 aa71cf80 aurel32
 * in the Software without restriction, including without limitation the rights
9 aa71cf80 aurel32
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 aa71cf80 aurel32
 * copies of the Software, and to permit persons to whom the Software is
11 aa71cf80 aurel32
 * furnished to do so, subject to the following conditions:
12 aa71cf80 aurel32
 *
13 aa71cf80 aurel32
 * The above copyright notice and this permission notice shall be included in
14 aa71cf80 aurel32
 * all copies or substantial portions of the Software.
15 aa71cf80 aurel32
 *
16 aa71cf80 aurel32
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 aa71cf80 aurel32
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 aa71cf80 aurel32
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 aa71cf80 aurel32
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 aa71cf80 aurel32
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 aa71cf80 aurel32
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 aa71cf80 aurel32
 * THE SOFTWARE.
23 aa71cf80 aurel32
 */
24 aa71cf80 aurel32
#include <stdlib.h>
25 aa71cf80 aurel32
#include "../qemu-common.h"
26 aa71cf80 aurel32
#include "../qemu-char.h"
27 aa71cf80 aurel32
#include "../console.h"
28 aa71cf80 aurel32
#include "msmouse.h"
29 aa71cf80 aurel32
30 aa71cf80 aurel32
#define MSMOUSE_LO6(n) ((n) & 0x3f)
31 aa71cf80 aurel32
#define MSMOUSE_HI2(n) (((n) & 0xc0) >> 6)
32 aa71cf80 aurel32
33 aa71cf80 aurel32
static void msmouse_event(void *opaque,
34 aa71cf80 aurel32
                          int dx, int dy, int dz, int buttons_state)
35 aa71cf80 aurel32
{
36 aa71cf80 aurel32
    CharDriverState *chr = (CharDriverState *)opaque;
37 aa71cf80 aurel32
38 aa71cf80 aurel32
    unsigned char bytes[4] = { 0x40, 0x00, 0x00, 0x00 };
39 aa71cf80 aurel32
40 aa71cf80 aurel32
    /* Movement deltas */
41 aa71cf80 aurel32
    bytes[0] |= (MSMOUSE_HI2(dy) << 2) | MSMOUSE_HI2(dx);
42 aa71cf80 aurel32
    bytes[1] |= MSMOUSE_LO6(dx);
43 aa71cf80 aurel32
    bytes[2] |= MSMOUSE_LO6(dy);
44 aa71cf80 aurel32
45 aa71cf80 aurel32
    /* Buttons */
46 aa71cf80 aurel32
    bytes[0] |= (buttons_state & 0x01 ? 0x20 : 0x00);
47 aa71cf80 aurel32
    bytes[0] |= (buttons_state & 0x02 ? 0x10 : 0x00);
48 aa71cf80 aurel32
    bytes[3] |= (buttons_state & 0x04 ? 0x20 : 0x00);
49 aa71cf80 aurel32
50 aa71cf80 aurel32
    /* We always send the packet of, so that we do not have to keep track
51 aa71cf80 aurel32
       of previous state of the middle button. This can potentially confuse
52 aa71cf80 aurel32
       some very old drivers for two button mice though. */
53 aa71cf80 aurel32
    qemu_chr_read(chr, bytes, 4);
54 aa71cf80 aurel32
}
55 aa71cf80 aurel32
56 aa71cf80 aurel32
static int msmouse_chr_write (struct CharDriverState *s, const uint8_t *buf, int len)
57 aa71cf80 aurel32
{
58 aa71cf80 aurel32
    /* Ignore writes to mouse port */
59 aa71cf80 aurel32
    return len;
60 aa71cf80 aurel32
}
61 aa71cf80 aurel32
62 aa71cf80 aurel32
static void msmouse_chr_close (struct CharDriverState *chr)
63 aa71cf80 aurel32
{
64 aa71cf80 aurel32
    qemu_free (chr);
65 aa71cf80 aurel32
}
66 aa71cf80 aurel32
67 aa71cf80 aurel32
CharDriverState *qemu_chr_open_msmouse(void)
68 aa71cf80 aurel32
{
69 aa71cf80 aurel32
    CharDriverState *chr;
70 aa71cf80 aurel32
71 aa71cf80 aurel32
    chr = qemu_mallocz(sizeof(CharDriverState));
72 aa71cf80 aurel32
    chr->chr_write = msmouse_chr_write;
73 aa71cf80 aurel32
    chr->chr_close = msmouse_chr_close;
74 aa71cf80 aurel32
75 aa71cf80 aurel32
    qemu_add_mouse_event_handler(msmouse_event, chr, 0, "QEMU Microsoft Mouse");
76 aa71cf80 aurel32
77 aa71cf80 aurel32
    return chr;
78 aa71cf80 aurel32
}