Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 12 Oct 2013 22:38:51 +0100 (BST)
From:      Iain Hibbert <plunky@ogmig.net>
To:        Alexey Dokuchaev <danfe@nsu.ru>
Cc:        bluetooth@freebsd.org
Subject:   Re: Apple's "magic" bluetooth mouse
Message-ID:  <alpine.NEB.2.00.1310122219310.523@galant.ogmig.net>
In-Reply-To: <20131012083133.GA22060@regency.nsu.ru>
References:  <20131012083133.GA22060@regency.nsu.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.

--0-1971321511-1381613931=:523
Content-Type: TEXT/PLAIN; charset=US-ASCII

On Sat, 12 Oct 2013, Alexey Dokuchaev wrote:

> Today I got a chance to play with this glamorous rat from Apple, and was
> curious how it gets along with FreeBSD.  Well, it worked, but only as a
> pointer.  Even simplest features like vertical scrolling did not work.
> xev(1) reported of no events coming from when I touch the stupid mouse.
> It looks like they are not being proxied as virtual buttons clicks, but
> implemented somehow differently.  I've also found that in Linux, they
> kinda use a special driver to make it work [1].

yes, also I wrote one for NetBSD[1]

the mouse itself provides a HID profile but the descriptor does not
properly describe the actions of the mouse, and the extra reports are
enabled by setting a feature. it should work as a basic mouse with x & y
and two buttons though..

although the driver is long, mostly the only bits you need to care about
are the input routines and the btmagic_enable() function. You can probably
add this stuff to bthidd(8) I don't know how easy that would be

> Any clues how to investigate this issue?  I probably won't be able to
> make use of all fancy multi-touch features of the mouse, but I'd like to
> at least "export" some of the common gestures, like mouse wheel scroll,
> as a legacy button clicks (so they can be propagated up to the X.org).

I don't know why it doesn't work but I thought legacy button clicks were
built into the normal mouse (did you push? it is not just touch..)

middle button and scrolling will not work without a driver though, that is
all handled in software.. the mouse itself just reports up to five finger
positions, which are stored and compared for each report. after a
threshold then scrolling is activated.

> I guess I could study how we ourselves handle Synaptics touchpads, but
> given this mouse is bluetooth, I figured I better ask here first.

I have a tool i wrote to parse the input via a hci sniffer (attached for
interest) and another tool which I used to send something to the mouse (i
don't remember how that worked, if I had a special driver during
development)

regards,
iain

[1] http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/dev/bluetooth/btmagic.c
--0-1971321511-1381613931=:523
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=magic.c
Content-Transfer-Encoding: BASE64
Content-ID: <alpine.NEB.2.00.1310122238510.523@galant.ogmig.net>
Content-Description: parse magic mouse data
Content-Disposition: attachment; filename=magic.c

I2luY2x1ZGUgPHN5cy9wYXJhbS5oPg0KDQojaW5jbHVkZSA8Ymx1ZXRvb3Ro
Lmg+DQojaW5jbHVkZSA8ZXJyLmg+DQojaW5jbHVkZSA8c3RkYm9vbC5oPg0K
I2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPHN0cmluZy5oPg0KI2lu
Y2x1ZGUgPHVuaXN0ZC5oPg0KI2luY2x1ZGUgPHVzYmhpZC5oPg0KDQojaW5j
bHVkZSA8YnRoaWQuaD4NCg0KLyoNCiAqIHByb3ZpZGUgY29uc3QgbG9jYXRv
cnMgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEgZGVzY3JpcHRvci4NCiAqLw0K
DQpzdGF0aWMgY29uc3Qgc3RydWN0IHsNCgloaWRfaXRlbV90IGJ1dHRvbjE7
DQoJaGlkX2l0ZW1fdCBidXR0b24yOw0KCWhpZF9pdGVtX3QgcGFkZGluZzsN
CgloaWRfaXRlbV90IGRYOw0KCWhpZF9pdGVtX3QgZFk7DQp9IGJhc2ljID0g
ew0KCS5idXR0b24xID0geyAucG9zID0gMCwgLnJlcG9ydF9zaXplID0gMSB9
LA0KCS5idXR0b24yID0geyAucG9zID0gMSwgLnJlcG9ydF9zaXplID0gMSB9
LA0KCS5wYWRkaW5nID0geyAucG9zID0gMiwgLnJlcG9ydF9zaXplID0gNiB9
LA0KCS5kWCA9IHsgLnBvcyA9ICA4LCAucmVwb3J0X3NpemUgPSAxNiwgLmxv
Z2ljYWxfbWluaW11bSA9IC01MTEgfSwNCgkuZFkgPSB7IC5wb3MgPSAyNCwg
LnJlcG9ydF9zaXplID0gMTYsIC5sb2dpY2FsX21pbmltdW0gPSAtNTExIH0s
DQp9Ow0KDQpzdGF0aWMgY29uc3Qgc3RydWN0IHsNCgkvKiA0MC1iaXQgaGVh
ZGVyICovDQoJaGlkX2l0ZW1fdCBkWGw7DQoJaGlkX2l0ZW1fdCBkWWw7DQoJ
aGlkX2l0ZW1fdCBidXR0b24xOw0KCWhpZF9pdGVtX3QgYnV0dG9uMjsNCglo
aWRfaXRlbV90IGRYbTsNCgloaWRfaXRlbV90IGRZbTsNCgloaWRfaXRlbV90
IHRpbWVzdGFtcDsNCg0KCS8qIDY0LWJpdCB0b3VjaCByZXBvcnQgKi8NCglo
aWRfaXRlbV90IGFXOw0KCWhpZF9pdGVtX3QgYVo7DQoJaGlkX2l0ZW1fdCBt
YWpvcjsNCgloaWRfaXRlbV90IG1pbm9yOw0KCWhpZF9pdGVtX3QgcHJlc3N1
cmU7DQoJaGlkX2l0ZW1fdCBpZDsNCgloaWRfaXRlbV90IGFuZ2xlOw0KCWhp
ZF9pdGVtX3QgdW5rbm93bjsNCgloaWRfaXRlbV90IHBoYXNlOw0KfSBtb3Vz
ZSA9IHsNCgkvKiBoZWFkZXIgKi8NCgkuZFhsID0geyAucG9zID0gMCwgLnJl
cG9ydF9zaXplID0gOCB9LA0KCS5kWWwgPSB7IC5wb3MgPSA4LCAucmVwb3J0
X3NpemUgPSA4IH0sDQoJLmJ1dHRvbjEgPSB7IC5wb3MgPSAxNiwgLnJlcG9y
dF9zaXplID0gMSB9LA0KCS5idXR0b24yID0geyAucG9zID0gMTcsIC5yZXBv
cnRfc2l6ZSA9IDEgfSwNCgkuZFhtID0geyAucG9zID0gMTgsIC5yZXBvcnRf
c2l6ZSA9IDIsIC5sb2dpY2FsX21pbmltdW0gPSAtMiB9LA0KCS5kWW0gPSB7
IC5wb3MgPSAyMCwgLnJlcG9ydF9zaXplID0gMiwgLmxvZ2ljYWxfbWluaW11
bSA9IC0yIH0sDQoJLnRpbWVzdGFtcCA9IHsgLnBvcyA9IDIyLCAucmVwb3J0
X3NpemUgPSAxOCB9LA0KDQoJLyogcGVyIHRvdWNoICovDQoJLmFXID0geyAu
cG9zID0gMCwgLnJlcG9ydF9zaXplID0gMTIsIC5sb2dpY2FsX21pbmltdW0g
PSAtMTQ0MCB9LA0KCS5hWiA9IHsgLnBvcyA9IDEyLCAucmVwb3J0X3NpemUg
PSAxMiwgLmxvZ2ljYWxfbWluaW11bSA9IC0yMDQ4IH0sDQoJLm1ham9yID0g
eyAucG9zID0gMjQsIC5yZXBvcnRfc2l6ZSA9IDggfSwNCgkubWlub3IgPSB7
IC5wb3MgPSAzMiwgLnJlcG9ydF9zaXplID0gOCB9LA0KCS5wcmVzc3VyZSA9
IHsgLnBvcyA9IDQwLCAucmVwb3J0X3NpemUgPSA2IH0sDQoJLmlkID0geyAu
cG9zID0gNDYsIC5yZXBvcnRfc2l6ZSA9IDQgfSwNCgkuYW5nbGUgPSB7IC5w
b3MgPSA1MCwgLnJlcG9ydF9zaXplID0gNiB9LA0KCS51bmtub3duID0geyAu
cG9zID0gNTYsIC5yZXBvcnRfc2l6ZSA9IDQgfSwNCgkucGhhc2UgPSB7IC5w
b3MgPSA2MCwgLnJlcG9ydF9zaXplID0gNCB9LA0KfTsNCg0Kc3RhdGljIGNv
bnN0IHN0cnVjdCB7DQoJLyogMzItYml0IGhlYWRlciAqLw0KCWhpZF9pdGVt
X3QgY2xpY2tzOw0KCWhpZF9pdGVtX3QgdW5rbm93bjE7DQoJaGlkX2l0ZW1f
dCB0aW1lc3RhbXA7DQoNCgkvKiA3Mi1iaXQgdG91Y2ggcmVwb3J0ICovDQoJ
aGlkX2l0ZW1fdCBhWDsNCgloaWRfaXRlbV90IGFZOw0KCWhpZF9pdGVtX3Qg
dW5rbm93bjI7DQoJaGlkX2l0ZW1fdCBtYWpvcjsNCgloaWRfaXRlbV90IG1p
bm9yOw0KCWhpZF9pdGVtX3QgcHJlc3N1cmU7DQoJaGlkX2l0ZW1fdCBpZDsN
CgloaWRfaXRlbV90IGFuZ2xlOw0KCWhpZF9pdGVtX3QgdW5rbm93bjM7DQoJ
aGlkX2l0ZW1fdCBwaGFzZTsNCn0gdHJhY2sgPSB7DQoJLyogaGVhZGVyICov
DQoJLmNsaWNrcyA9IHsgLnBvcyA9IDAsIC5yZXBvcnRfc2l6ZSA9IDggfSwN
CgkudW5rbm93bjEgPSB7IC5wb3MgPSA4LCAucmVwb3J0X3NpemUgPSA2IH0s
DQoJLnRpbWVzdGFtcCA9IHsgLnBvcyA9IDE0LCAucmVwb3J0X3NpemUgPSAx
OCB9LA0KDQoJLyogcGVyIHRvdWNoICovDQoJLmFYID0geyAucG9zID0gMCwg
LnJlcG9ydF9zaXplID0gMTMgfSwNCgkuYVkgPSB7IC5wb3MgPSAxMywgLnJl
cG9ydF9zaXplID0gMTMgfSwNCgkudW5rbm93bjIgPSB7IC5wb3MgPSAyNiwg
LnJlcG9ydF9zaXplID0gNiB9LA0KCS5tYWpvciA9IHsgLnBvcyA9IDMyLCAu
cmVwb3J0X3NpemUgPSA4IH0sDQoJLm1pbm9yID0geyAucG9zID0gNDAsIC5y
ZXBvcnRfc2l6ZSA9IDggfSwNCgkucHJlc3N1cmUgPSB7IC5wb3MgPSA0OCwg
LnJlcG9ydF9zaXplID0gNiB9LA0KCS5pZCA9IHsgLnBvcyA9IDU0LCAucmVw
b3J0X3NpemUgPSA4IH0sDQoJLmFuZ2xlID0geyAucG9zID0gNjIsIC5yZXBv
cnRfc2l6ZSA9IDIgfSwNCgkudW5rbm93bjMgPSB7IC5wb3MgPSA2NCwgLnJl
cG9ydF9zaXplID0gNCB9LA0KCS5waGFzZSA9IHsgLnBvcyA9IDY4LCAucmVw
b3J0X3NpemUgPSA0IH0sDQp9Ow0KDQpzdGF0aWMgdm9pZCByZWFkX2ZpbGUo
Y2hhciAqKTsNCnN0YXRpYyB2b2lkIHJlYWRfZGV2aWNlKGNoYXIgKik7DQoN
CnN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpOw0Kc3RhdGljIHZvaWQgZHVtcChj
b25zdCBjaGFyICosIHVpbnQ4X3QgKiwgc2l6ZV90KTsNCnN0YXRpYyB2b2lk
IHByaW50Yihjb25zdCBjaGFyICosIHVpbnQ4X3QgKiwgY29uc3QgaGlkX2l0
ZW1fdCAqKTsNCg0Kc3RhdGljIGludCBoY2lfYWNsKGludCwgdWludDhfdCAq
LCBzaXplX3QpOw0Kc3RhdGljIGludCBoY2lfZXZlbnQoaW50LCB1aW50OF90
ICosIHNpemVfdCk7DQpzdGF0aWMgaW50IGwyY2FwX3JlY3YodWludDhfdCAq
LCBzaXplX3QpOw0Kc3RhdGljIGludCBoaWRfcmVjdih1aW50OF90ICosIHNp
emVfdCk7DQpzdGF0aWMgaW50IGJhc2ljX2lucHV0KHVpbnQ4X3QgKiwgc2l6
ZV90KTsNCnN0YXRpYyBpbnQgdHJhY2tfaW5wdXQodWludDhfdCAqLCBzaXpl
X3QpOw0Kc3RhdGljIGludCBtb3VzZV9pbnB1dCh1aW50OF90ICosIHNpemVf
dCk7DQoNCmludA0KbWFpbihpbnQgYWMsIGNoYXIgKmF2W10pDQp7DQoJY2hh
ciAqZGV2aWNlLCAqcGF0aDsNCglpbnQgY2g7DQoNCglkZXZpY2UgPSBOVUxM
Ow0KCXBhdGggPSBOVUxMOw0KDQoJd2hpbGUgKChjaCA9IGdldG9wdChhYywg
YXYsICJkOnI6IikpICE9IC0xKSB7DQoJCXN3aXRjaCAoY2gpIHsNCgkJY2Fz
ZSAnZCc6IC8qIGxvY2FsIGRldmljZSAqLw0KCQkJZGV2aWNlID0gb3B0YXJn
Ow0KCQkJYnJlYWs7DQoNCgkJY2FzZSAncic6IC8qIHJlYWQgZmlsZSAqLw0K
CQkJcGF0aCA9IG9wdGFyZzsNCgkJCWJyZWFrOw0KDQoJCWRlZmF1bHQ6DQoJ
CQl1c2FnZSgpOw0KCQkJLyogTk9UIFJFQUNIRUQgKi8NCgkJfQ0KCX0NCg0K
CWlmIChkZXZpY2UgIT0gTlVMTCAmJiBwYXRoICE9IE5VTEwpDQoJCXVzYWdl
KCk7DQoNCglpZiAocGF0aCAhPSBOVUxMKQ0KCQlyZWFkX2ZpbGUocGF0aCk7
DQoJZWxzZQ0KCQlyZWFkX2RldmljZShkZXZpY2UpOw0KDQoJcmV0dXJuIDA7
DQp9DQoNCnN0YXRpYyB2b2lkDQpyZWFkX2ZpbGUoY2hhciAqcGF0aCkNCnsN
Cn0NCg0Kc3RhdGljIHZvaWQNCnJlYWRfZGV2aWNlKGNoYXIgKmRldmljZSkN
CnsNCglzdHJ1Y3QgYnRfZGV2ZmlsdGVyIGY7DQoJdWludDhfdCBidWZbMTAy
NF07DQoJc3NpemVfdCBucjsNCglpbnQgZmQsIGhhbmRsZTsNCg0KCWZkID0g
YnRfZGV2b3BlbihkZXZpY2UsIDApOw0KCWlmIChmZCA9PSAtMSkNCgkJZXJy
KEVYSVRfRkFJTFVSRSwgImJ0X2Rldm9wZW4iKTsNCgkNCgltZW1zZXQoJmYs
IDAsIHNpemVvZihmKSk7DQoJYnRfZGV2ZmlsdGVyX3BrdF9zZXQoJmYsIEhD
SV9BQ0xfREFUQV9QS1QpOw0KCWJ0X2RldmZpbHRlcl9wa3Rfc2V0KCZmLCBI
Q0lfRVZFTlRfUEtUKTsNCglidF9kZXZmaWx0ZXJfZXZ0X3NldCgmZiwgSENJ
X0VWRU5UX0RJU0NPTl9DT01QTCk7DQoJaWYgKGJ0X2RldmZpbHRlcihmZCwg
JmYsIE5VTEwpID09IC0xKQ0KCQllcnIoRVhJVF9GQUlMVVJFLCAiYnRfZGV2
ZmlsdGVyIik7DQoNCgloYW5kbGUgPSAwOw0KDQoJZm9yICg7Oykgew0KCQlu
ciA9IGJ0X2RldnJlY3YoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIC0xKTsNCgkJ
aWYgKG5yIDwgMCkNCgkJCWVycihFWElUX0ZBSUxVUkUsICJidF9kZXZyZWN2
Iik7DQoNCgkJaWYgKG5yID09IDApDQoJCQlicmVhazsNCg0KCQlzd2l0Y2gg
KGJ1ZlswXSkgew0KCQljYXNlIEhDSV9BQ0xfREFUQV9QS1Q6DQoJCQloYW5k
bGUgPSBoY2lfYWNsKGhhbmRsZSwgYnVmLCAoc2l6ZV90KW5yKTsNCgkJCWJy
ZWFrOw0KDQoJCWNhc2UgSENJX0VWRU5UX1BLVDoNCgkJCWhhbmRsZSA9IGhj
aV9ldmVudChoYW5kbGUsIGJ1ZiwgKHNpemVfdClucik7DQoJCQlicmVhazsN
Cg0KCQlkZWZhdWx0Og0KCQkJYnJlYWs7DQoJCX0NCgl9DQoNCgljbG9zZShm
ZCk7DQp9DQoNCnN0YXRpYyB2b2lkDQp1c2FnZSh2b2lkKQ0Kew0KDQoJZnBy
aW50ZihzdGRlcnIsICJVc2FnZTogJXMgeyBbLWQgZGV2aWNlXSB8IC1yIHBh
dGggfVxuIiwNCgkgICAgZ2V0cHJvZ25hbWUoKSk7DQoNCglleGl0KDApOw0K
fQ0KDQovKg0KICogZHVtcCBidWZmZXIgYXMgaGV4IGJ5dGVzDQogKi8NCnN0
YXRpYyB2b2lkDQpkdW1wKGNvbnN0IGNoYXIgKnN0ciwgdWludDhfdCAqYnVm
LCBzaXplX3QgbGVuKQ0Kew0KDQoJcHJpbnRmKCIlczoiLCBzdHIpOw0KCXdo
aWxlIChsZW4tLSA+IDApDQoJCXByaW50ZigiIDB4JTAyeCIsICpidWYrKyk7
DQoNCglwcmludGYoIlxuIik7DQp9DQoNCi8qDQogKiBwcmludCBoaWQgaXRl
bSBhcyBiaW5hcnkNCiAqLw0Kc3RhdGljIHZvaWQNCnByaW50Yihjb25zdCBj
aGFyICpzdHIsIHVpbnQ4X3QgKmJ1ZiwgY29uc3QgaGlkX2l0ZW1fdCAqaXRl
bSkNCnsNCglpbnQgbnVtID0gaXRlbS0+cmVwb3J0X3NpemU7DQoJdW5zaWdu
ZWQgaW50IHZhbHVlID0gaGlkX2dldF9kYXRhKGJ1ZiwgaXRlbSk7DQoNCglw
cmludGYoIiVzIiwgc3RyKTsNCg0KCXdoaWxlIChudW0tLSA+IDApDQoJCXBy
aW50ZigiJWMiLCAodmFsdWUgJiBfX0JJVChudW0pKSA/ICcxJyA6ICcwJyk7
DQp9DQoNCnN0YXRpYyBpbnQNCmhjaV9hY2woaW50IGhhbmRsZSwgdWludDhf
dCAqYnVmLCBzaXplX3QgbGVuKQ0Kew0KCXN0YXRpYyB1aW50OF90IHhidWZb
MTAyNF07DQoJc3RhdGljIHNpemVfdCB4bGVuOw0KCWludCBoOw0KDQoJLy9k
dW1wKCJhY2wiLCBidWYsIGxlbik7DQoJaWYgKGxlbiA8IDUgfHwgbGVuICE9
IChzaXplX3QpKGxlMTZkZWMoYnVmICsgMykgKyA1KSkNCgkJcmV0dXJuIGhh
bmRsZTsNCg0KCWggPSBsZTE2ZGVjKGJ1ZiArIDEpOw0KDQoJaWYgKEhDSV9Q
Ql9GTEFHKGgpID09IEhDSV9QQUNLRVRfU1RBUlQpDQoJCXhsZW4gPSAwOw0K
CW1lbWNweSh4YnVmICsgeGxlbiwgYnVmICsgNSwgbGVuIC0gNSk7DQoJeGxl
biArPSBsZW4gLSA1Ow0KCWlmICh4bGVuIDwgbGUxNmRlYyh4YnVmKSkNCgkJ
cmV0dXJuIGhhbmRsZTsJLyogdG8gYmUgY29udGludWVkLi4uICovDQoNCglp
ZiAoaGFuZGxlID09IDApIHsNCgkJaGFuZGxlID0gSENJX0NPTl9IQU5ETEUo
aCk7DQoJCXByaW50ZigidHJ5aW5nIGhhbmRsZSAlZFxuIiwgaGFuZGxlKTsN
Cgl9DQoJaWYgKGhhbmRsZSA9PSBIQ0lfQ09OX0hBTkRMRShoKSkgew0KCQlp
ZiAobDJjYXBfcmVjdih4YnVmLCB4bGVuKSA9PSAwKSB7DQoJCQlwcmludGYo
ImFiYW5kb24gaGFuZGxlICVkXG4iLCBoYW5kbGUpOw0KCQkJaGFuZGxlID0g
MDsNCgkJfQ0KCX0NCglyZXR1cm4gaGFuZGxlOw0KfQ0KDQpzdGF0aWMgaW50
DQpoY2lfZXZlbnQoaW50IGhhbmRsZSwgdWludDhfdCAqYnVmLCBzaXplX3Qg
bGVuKQ0Kew0KDQoJLy9kdW1wKCJldmVudCIsIGJ1ZiwgbGVuKTsNCglpZiAo
bGVuIDwgMyB8fCBsZW4gIT0gKHNpemVfdCkoYnVmWzJdICsgMykpDQoJCXJl
dHVybiBoYW5kbGU7DQoNCglzd2l0Y2ggKGJ1ZlsxXSkgew0KCWNhc2UgSENJ
X0VWRU5UX0RJU0NPTl9DT01QTDoNCgkJaWYgKGxlbiAhPSA3IHx8IGJ1Zlsz
XSAhPSAweDAwIHx8IGxlMTZkZWMoYnVmICsgNCkgIT0gaGFuZGxlKQ0KCQkJ
YnJlYWs7DQoNCgkJcHJpbnRmKCJoYW5kbGUgJWQgZGlzY29ubmVjdGVkIChy
ZWFzb24gMHglMDJ4KVxuIiwgaGFuZGxlLCBidWZbNl0pOw0KCQloYW5kbGUg
PSAwOw0KCQlicmVhazsNCg0KCWRlZmF1bHQ6DQoJCWJyZWFrOw0KCX0NCg0K
CXJldHVybiBoYW5kbGU7DQp9DQoNCnN0YXRpYyBpbnQNCmwyY2FwX3JlY3Yo
dWludDhfdCAqYnVmLCBzaXplX3QgbGVuKQ0Kew0KCWludCBkY2lkOw0KDQoJ
Ly9kdW1wKCJsMmNhcCIsIGJ1ZiwgbGVuKTsNCglpZiAobGVuIDwgNCB8fCBs
ZW4gIT0gKHNpemVfdCkobGUxNmRlYyhidWYpICsgNCkpDQoJCXJldHVybiAw
Ow0KDQoJZGNpZCA9IGxlMTZkZWMoYnVmICsgMik7DQoJaWYgKGRjaWQgPCBM
MkNBUF9GSVJTVF9DSUQpDQoJCS8qIGlnbm9yZSBzaWduYWxzICovOw0KCWVs
c2UgaWYgKGhpZF9yZWN2KGJ1ZiArIDQsIGxlbiAtIDQpKQ0KCQlyZXR1cm4g
MTsNCg0KCXJldHVybiAwOw0KfQ0KDQojZGVmaW5lIERBVEEodHlwZSwgaWQp
CSAoKCgoQlRISURfREFUQSA8PCA0KSB8IEJUSElEX0RBVEFfIyN0eXBlKSA8
PCA4KSB8IGlkKQ0KDQpzdGF0aWMgaW50DQpoaWRfcmVjdih1aW50OF90ICpi
dWYsIHNpemVfdCBsZW4pDQp7DQoNCgkvL2R1bXAoImhpZCIsIGJ1ZiwgbGVu
KTsNCglpZiAobGVuIDwgMSkNCgkJcmV0dXJuIDA7DQoNCglzd2l0Y2ggKEJU
SElEX1RZUEUoYnVmWzBdKSkgew0KCWNhc2UgQlRISURfSEFORFNIQUtFOg0K
CQlpZiAobGVuICE9IDEpIHJldHVybiAwOw0KCQlwcmludGYoImhhbmRzaGFr
ZTogMHgleFxuIiwgQlRISURfSEFORFNIQUtFX1BBUkFNKGJ1ZlswXSkpOw0K
CQlicmVhazsNCg0KCWNhc2UgQlRISURfREFUQToNCgkJaWYgKGxlbiA8IDIp
IHJldHVybiAwOw0KCQlzd2l0Y2ggKGJlMTZkZWMoYnVmKSkgew0KCQljYXNl
IERBVEEoSU5QVVQsIDB4MTApOiAvKiBCYXNpYyByZXBvcnQgKi8NCgkJCWlm
ICghYmFzaWNfaW5wdXQoYnVmICsgMiwgbGVuIC0gMikpDQoJCQkJcmV0dXJu
IDA7DQoJCQlicmVhazsNCg0KCQljYXNlIERBVEEoSU5QVVQsIDB4MjgpOgkv
KiBUcmFjayByZXBvcnQgKi8NCgkJCWlmICghdHJhY2tfaW5wdXQoYnVmICsg
MiwgbGVuIC0gMikpDQoJCQkJcmV0dXJuIDA7DQoJCQlicmVhazsNCg0KCQlj
YXNlIERBVEEoSU5QVVQsIDB4MjkpOiAvKiBNb3VzZSByZXBvcnQgKi8NCgkJ
CWlmICghbW91c2VfaW5wdXQoYnVmICsgMiwgbGVuIC0gMikpDQoJCQkJcmV0
dXJuIDA7DQoJCQlicmVhazsNCg0KCQljYXNlIERBVEEoSU5QVVQsIDB4MmEp
OiAvKiBCYXR0ZXJ5IHdhcm5pbmcgKi8NCgkJCWlmIChsZW4gIT0gMykgcmV0
dXJuIDA7DQoJCQlwcmludGYoImJhdHRlcnkgJXNcbiIsIGJ1ZlsyXSA+IDEg
PyAiY3JpdGljYWwiIDogIndhcm5pbmciKTsNCgkJCWJyZWFrOw0KDQoJCWNh
c2UgREFUQShJTlBVVCwgMHg2MSk6IC8qIFN1cmZhY2UgZGV0ZWN0aW9uICov
DQoJCQlpZiAobGVuICE9IDMpIHJldHVybiAwOw0KCQkJcHJpbnRmKCJtb3Vz
ZSAlc1xuIiwgYnVmWzJdID4gMCA/ICJyYWlzZWQiIDogImxvd2VyZWQiKTsN
CgkJCWJyZWFrOw0KDQoJCWNhc2UgREFUQShGRUFUVVJFLCAweDQ3KTogLyog
QmF0dGVyeSBzdGF0dXMgKi8NCgkJCWlmIChsZW4gIT0gMikgcmV0dXJuIDA7
DQoJCQlwcmludGYoImJhdHRlcnkgJWQlJVxuIiwgYnVmWzJdKTsNCgkJCWJy
ZWFrOw0KDQoJCWNhc2UgREFUQShGRUFUVVJFLCAweGQ3KTogLyogVG91Y2gg
cmVwb3J0cyAqLw0KCQkJaWYgKGxlbiAhPSAzKSByZXR1cm4gMDsNCgkJCXBy
aW50ZigidG91Y2ggcmVwb3J0cyAlc2FibGVkXG4iLCBidWZbMl0gPyAiZW4i
IDogImRpcyIpOw0KCQkJYnJlYWs7DQoNCgkJY2FzZSBEQVRBKElOUFVULCAw
eDMwKToNCgkJY2FzZSBEQVRBKElOUFVULCAweDYwKToNCgkJY2FzZSBEQVRB
KElOUFVULCAweGY3KToNCgkJCWR1bXAoImlucHV0IiwgYnVmLCBsZW4pOw0K
CQkJYnJlYWs7DQoNCgkJY2FzZSBEQVRBKEZFQVRVUkUsIDB4ZjApOg0KCQlj
YXNlIERBVEEoRkVBVFVSRSwgMHhmMSk6DQoJCQlkdW1wKCJmZWF0dXJlIiwg
YnVmLCBsZW4pOw0KCQkJYnJlYWs7DQoJCQkNCgkJZGVmYXVsdDoNCgkJCWR1
bXAoImRhdGEiLCBidWYsIGxlbik7DQoJCQlyZXR1cm4gMDsNCgkJfQ0KCQli
cmVhazsNCg0KCWNhc2UgQlRISURfR0VUX1JFUE9SVDoNCgkJZHVtcCgiZ2V0
IHJlcG9ydCIsIGJ1ZiwgbGVuKTsNCgkJYnJlYWs7DQoNCgljYXNlIEJUSElE
X1NFVF9SRVBPUlQ6DQoJCWR1bXAoInNldCByZXBvcnQiLCBidWYsIGxlbik7
DQoJCWJyZWFrOw0KDQoJY2FzZSBCVEhJRF9DT05UUk9MOg0KCWNhc2UgQlRI
SURfR0VUX1BST1RPQ09MOg0KCWNhc2UgQlRISURfU0VUX1BST1RPQ09MOg0K
CWNhc2UgQlRISURfR0VUX0lETEU6DQoJY2FzZSBCVEhJRF9TRVRfSURMRToN
CgljYXNlIEJUSElEX0RBVEM6DQoJZGVmYXVsdDoNCgkJZHVtcCgiaGlkIiwg
YnVmLCBsZW4pOw0KCQlyZXR1cm4gMDsNCgl9DQoNCglyZXR1cm4gMTsNCn0N
Cg0Kc3RhdGljIGludA0KYmFzaWNfaW5wdXQodWludDhfdCAqYnVmLCBzaXpl
X3QgbGVuKQ0Kew0KCQ0KCWlmIChsZW4gIT0gNSkNCgkJcmV0dXJuIDA7DQoN
CglwcmludGYoImJhc2ljIGR4JTRkLCBkeSU0ZCwgbWIgJWQlZCIsDQoJICAg
IGhpZF9nZXRfZGF0YShidWYsICZiYXNpYy5kWCksDQoJICAgIGhpZF9nZXRf
ZGF0YShidWYsICZiYXNpYy5kWSksDQoJICAgIGhpZF9nZXRfZGF0YShidWYs
ICZiYXNpYy5idXR0b24xKSA/IDEgOiAwLA0KCSAgICBoaWRfZ2V0X2RhdGEo
YnVmLCAmYmFzaWMuYnV0dG9uMikgPyAxIDogMCk7DQoNCglwcmludGYoIlxu
Iik7DQoJcmV0dXJuIDE7DQp9DQoNCnN0YXRpYyBpbnQNCnRyYWNrX2lucHV0
KHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbikNCnsNCglpZiAoKChsZW4gLSA0
KSAlIDkpICE9IDApDQoJCXJldHVybiAwOw0KDQoJcHJpbnRmKCJ0cmFjayBj
bGlja3MlNGQsIHRzIDB4JTA1eCIsDQoJICAgIGhpZF9nZXRfZGF0YShidWYs
ICZ0cmFjay5jbGlja3MpLA0KCSAgICBoaWRfZ2V0X2RhdGEoYnVmLCAmdHJh
Y2sudGltZXN0YW1wKSk7DQoJcHJpbnRiKCIsICIsIGJ1ZiwgJnRyYWNrLnVu
a25vd24xKTsNCg0KCWZvciAoYnVmICs9IDQsIGxlbiAtPSA0OyBsZW4gPiAw
OyBsZW4gLT0gOSwgYnVmICs9IDkpIHsNCgkJcHJpbnRmKCIgaWQgJXggeyAl
ZDolZCglZCksICVkLiVkLyVkIiwNCgkJICAgIGhpZF9nZXRfZGF0YShidWYs
ICZ0cmFjay5pZCksDQoJCSAgICBoaWRfZ2V0X2RhdGEoYnVmLCAmdHJhY2su
YVgpLA0KCQkgICAgaGlkX2dldF9kYXRhKGJ1ZiwgJnRyYWNrLmFZKSwNCgkJ
ICAgIGhpZF9nZXRfZGF0YShidWYsICZ0cmFjay5wcmVzc3VyZSksDQoJCSAg
ICBoaWRfZ2V0X2RhdGEoYnVmLCAmdHJhY2subWFqb3IpLA0KCQkgICAgaGlk
X2dldF9kYXRhKGJ1ZiwgJnRyYWNrLm1pbm9yKSwNCgkJICAgIGhpZF9nZXRf
ZGF0YShidWYsICZ0cmFjay5hbmdsZSkpOw0KCQlwcmludGIoIiwgIiwgYnVm
LCAmdHJhY2sudW5rbm93bjIpOw0KCQlwcmludGIoIiwgIiwgYnVmLCAmdHJh
Y2sudW5rbm93bjMpOw0KCQlwcmludGIoIiwgIiwgYnVmLCAmdHJhY2sucGhh
c2UpOw0KCQlwcmludGYoIn0iKTsNCgl9DQoNCglwcmludGYoIlxuIik7DQoJ
cmV0dXJuIDE7DQp9DQoNCnN0YXRpYyBpbnQNCm1vdXNlX2lucHV0KHVpbnQ4
X3QgKmJ1Ziwgc2l6ZV90IGxlbikNCnsNCg0KCWlmICgoKGxlbiAtIDUpICUg
OCkgIT0gMCkNCgkJcmV0dXJuIDA7DQoNCglwcmludGYoIm1vdXNlIGR4JTRk
LCBkeSU0ZCwgbWIgJWQlZCwgdHMgMHglMDV4IiwNCgkgICAgKGhpZF9nZXRf
ZGF0YShidWYsICZtb3VzZS5kWG0pIDw8IDgpIHwgKGhpZF9nZXRfZGF0YShi
dWYsICZtb3VzZS5kWGwpICYgMHhmZiksDQoJICAgIChoaWRfZ2V0X2RhdGEo
YnVmLCAmbW91c2UuZFltKSA8PCA4KSB8IChoaWRfZ2V0X2RhdGEoYnVmLCAm
bW91c2UuZFlsKSAmIDB4ZmYpLA0KCSAgICBoaWRfZ2V0X2RhdGEoYnVmLCAm
bW91c2UuYnV0dG9uMSkgPyAxIDogMCwNCgkgICAgaGlkX2dldF9kYXRhKGJ1
ZiwgJm1vdXNlLmJ1dHRvbjIpID8gMSA6IDAsDQoJICAgIGhpZF9nZXRfZGF0
YShidWYsICZtb3VzZS50aW1lc3RhbXApKTsNCg0KCWZvciAoYnVmICs9IDUs
IGxlbiAtPSA1OyBsZW4gPiAwOyBsZW4gLT0gOCwgYnVmICs9IDgpIHsNCgkJ
cHJpbnRmKCIsIGlkICV4IHslZDolZCglZCksICVkLiVkLyVkIiwNCgkJICAg
IGhpZF9nZXRfZGF0YShidWYsICZtb3VzZS5pZCksDQoJCSAgICBoaWRfZ2V0
X2RhdGEoYnVmLCAmbW91c2UuYVcpLA0KCQkgICAgaGlkX2dldF9kYXRhKGJ1
ZiwgJm1vdXNlLmFaKSwNCgkJICAgIGhpZF9nZXRfZGF0YShidWYsICZtb3Vz
ZS5wcmVzc3VyZSksDQoJCSAgICBoaWRfZ2V0X2RhdGEoYnVmLCAmbW91c2Uu
bWFqb3IpLA0KCQkgICAgaGlkX2dldF9kYXRhKGJ1ZiwgJm1vdXNlLm1pbm9y
KSwNCgkJICAgIGhpZF9nZXRfZGF0YShidWYsICZtb3VzZS5hbmdsZSkpOw0K
CQlwcmludGIoIiwgIiwgYnVmLCAmbW91c2UudW5rbm93bik7DQoJCXByaW50
YigiLCAiLCBidWYsICZtb3VzZS5waGFzZSk7DQoJCXByaW50ZigifSIpOw0K
CX0NCg0KCXByaW50ZigiXG4iKTsNCglyZXR1cm4gMTsNCn0NCg==

--0-1971321511-1381613931=:523
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=send.c
Content-Transfer-Encoding: BASE64
Content-ID: <alpine.NEB.2.00.1310122238511.523@galant.ogmig.net>
Content-Description: send data to mouse
Content-Disposition: attachment; filename=send.c

I2luY2x1ZGUgPHN5cy9wYXJhbS5oPg0KI2luY2x1ZGUgPHN5cy9pb2N0bC5o
Pg0KDQojaW5jbHVkZSA8ZXJyLmg+DQojaW5jbHVkZSA8ZmNudGwuaD4NCiNp
bmNsdWRlIDxzdGRpby5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1
ZGUgPHN0cmluZy5oPg0KI2luY2x1ZGUgPHVuaXN0ZC5oPg0KDQojaW5jbHVk
ZSA8YnRoaWQuaD4NCg0Kc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCk7DQoNCmNv
bnN0IGNoYXIgKmRldmljZSA9ICIvZGV2L3dzbW91c2UiOw0KDQpzdHJ1Y3Qg
YnRtYWdpY19pbyB7DQoJc2l6ZV90CWxlbjsNCgl1aW50OF90CWJ1ZlsyNTZd
Ow0KfTsNCg0KaW50DQptYWluKGludCBhYywgY2hhciAqYXZbXSkNCnsNCglz
dHJ1Y3QgYnRtYWdpY19pbyBiOw0KCWludCBjaCwgZmQ7DQoNCgl3aGlsZSAo
KGNoID0gZ2V0b3B0KGFjLCBhdiwgImQ6IikpICE9IC0xKSB7DQoJCXN3aXRj
aCAoY2gpIHsNCgkJY2FzZSAnZCc6DQoJCQlkZXZpY2UgPSBvcHRhcmc7DQoJ
CQlicmVhazsNCg0KCQlkZWZhdWx0Og0KCQkJdXNhZ2UoKTsNCgkJCS8qIE5P
VCBSRUFDSEVEICovDQoJCX0NCgl9DQoNCglhYyAtPSBvcHRpbmQ7DQoJYXYg
Kz0gb3B0aW5kOw0KDQoJaWYgKGFjID09IDApDQoJCXVzYWdlKCk7DQoNCglt
ZW1zZXQoJmIsIDAsIHNpemVvZihiKSk7DQoJd2hpbGUgKGFjLS0gPiAwKQ0K
CQliLmJ1ZltiLmxlbisrXSA9ICh1aW50OF90KXN0cnRvdWwoKmF2KyssIE5V
TEwsIDApOw0KDQoJZmQgPSBvcGVuKGRldmljZSwgT19XUk9OTFksIDApOw0K
CWlmIChmZCA9PSAtMSkNCgkJZmQgPSBvcGVuKGRldmljZSwgT19SRE9OTFks
IDApOw0KCWlmIChmZCA9PSAtMSkNCgkJZXJyKEVYSVRfRkFJTFVSRSwgIiVz
IiwgZGV2aWNlKTsNCg0KCWlmIChpb2N0bChmZCwgX0lPVygnYicsIDB4ZmYs
IHN0cnVjdCBidG1hZ2ljX2lvKSwgJmIpID09IC0xKQ0KCQllcnIoRVhJVF9G
QUlMVVJFLCAiYnRtYWdpY19zZW5kIik7DQoNCgljbG9zZShmZCk7DQoJcmV0
dXJuIDA7DQp9DQoNCnN0YXRpYyB2b2lkDQp1c2FnZSh2b2lkKQ0Kew0KCWZw
cmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZCBkZXZpY2VdIC4uLlxuIiwN
CgkgICAgZ2V0cHJvZ25hbWUoKSk7DQoNCglleGl0KDApOw0KfQ0K

--0-1971321511-1381613931=:523--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?alpine.NEB.2.00.1310122219310.523>