Dorp last sync with wine and userhook
authorMagnus Olsen <magnus@greatlord.com>
Tue, 17 May 2005 15:20:24 +0000 (15:20 +0000)
committerMagnus Olsen <magnus@greatlord.com>
Tue, 17 May 2005 15:20:24 +0000 (15:20 +0000)
Before we can sync with wine we need to rewrite the enum
and reg of device so it working fine in reactos and windows.

Add svn rev 15043 + only userhooks for the mouse
at last the mouse are working in tribles windows mode
but in full screen it is bit chopy. Not tested tribles
in reactos with the new code.

svn path=/trunk/; revision=15376

reactos/lib/dinput/Makefile.in
reactos/lib/dinput/data_formats.c
reactos/lib/dinput/device.c
reactos/lib/dinput/dinput_main.c
reactos/lib/dinput/dinput_private.h
reactos/lib/dinput/joystick_linux.c
reactos/lib/dinput/joystick_linuxinput.c
reactos/lib/dinput/keyboard.c
reactos/lib/dinput/mouse.c

index ab30072..1b36151 100644 (file)
@@ -11,7 +11,7 @@ C_SRCS = \
        device.c \\r
        dinput_main.c \\r
        joystick_linux.c \\r
-       joystick_linuxinput.c \      \r
+       joystick_linuxinput.c \\r
        keyboard.c \\r
        mouse.c \\r
        regsvr.c\r
index 9edaaab..7962a67 100644 (file)
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
  */\r
 \r
+/* TODO:\r
+ * add keyboard\r
+ */\r
+\r
 #include <stdarg.h>\r
 \r
 #include "windef.h"\r
@@ -23,7 +27,7 @@
 \r
 #define numObjects(x) (sizeof(x) / sizeof(x[0]))\r
 \r
-static const DIOBJECTDATAFORMAT dfDIJoystick[] = {\r
+DIOBJECTDATAFORMAT dfDIJoystick[] = {\r
   { &GUID_XAxis,DIJOFS_X,DIDFT_OPTIONAL|DIDFT_AXIS|DIDFT_ANYINSTANCE,0},\r
   { &GUID_YAxis,DIJOFS_Y,DIDFT_OPTIONAL|DIDFT_AXIS|DIDFT_ANYINSTANCE,0},\r
   { &GUID_ZAxis,DIJOFS_Z,DIDFT_OPTIONAL|DIDFT_AXIS|DIDFT_ANYINSTANCE,0},\r
@@ -76,10 +80,10 @@ const DIDATAFORMAT c_dfDIJoystick = {
     DIDF_ABSAXIS,\r
     sizeof(DIJOYSTATE2),\r
     numObjects(dfDIJoystick),\r
-    (LPDIOBJECTDATAFORMAT)dfDIJoystick\r
+    dfDIJoystick\r
 };\r
 \r
-static const DIOBJECTDATAFORMAT dfDIJoystick2[] = {\r
+DIOBJECTDATAFORMAT dfDIJoystick2[] = {\r
   { &GUID_XAxis,DIJOFS_X,DIDFT_OPTIONAL|DIDFT_AXIS|DIDFT_ANYINSTANCE,0},\r
   { &GUID_YAxis,DIJOFS_Y,DIDFT_OPTIONAL|DIDFT_AXIS|DIDFT_ANYINSTANCE,0},\r
   { &GUID_ZAxis,DIJOFS_Z,DIDFT_OPTIONAL|DIDFT_AXIS|DIDFT_ANYINSTANCE,0},\r
@@ -252,10 +256,10 @@ const DIDATAFORMAT c_dfDIJoystick2 = {
     DIDF_ABSAXIS,\r
     sizeof(DIJOYSTATE2),\r
     numObjects(dfDIJoystick2),\r
-    (LPDIOBJECTDATAFORMAT)dfDIJoystick2\r
+    dfDIJoystick2\r
 };\r
 \r
-static const DIOBJECTDATAFORMAT dfDIMouse[] = {\r
+DIOBJECTDATAFORMAT dfDIMouse[] = {\r
   { &GUID_XAxis,  DIMOFS_X, DIDFT_ANYINSTANCE | DIDFT_AXIS, 0 },\r
   { &GUID_YAxis,  DIMOFS_Y, DIDFT_ANYINSTANCE | DIDFT_AXIS, 0 },\r
   { &GUID_ZAxis,  DIMOFS_Z, DIDFT_OPTIONAL | DIDFT_ANYINSTANCE | DIDFT_AXIS, 0 },\r
@@ -271,10 +275,10 @@ const DIDATAFORMAT c_dfDIMouse = {
     DIDF_RELAXIS,\r
     sizeof(DIMOUSESTATE),\r
     numObjects(dfDIMouse),\r
-    (LPDIOBJECTDATAFORMAT)dfDIMouse\r
+    dfDIMouse\r
 };\r
 \r
-static const DIOBJECTDATAFORMAT dfDIMouse2[] = {\r
+DIOBJECTDATAFORMAT dfDIMouse2[] = {\r
   { &GUID_XAxis,  DIMOFS_X, DIDFT_ANYINSTANCE | DIDFT_AXIS, 0 },\r
   { &GUID_YAxis,  DIMOFS_Y, DIDFT_ANYINSTANCE | DIDFT_AXIS, 0 },\r
   { &GUID_ZAxis,  DIMOFS_Z, DIDFT_OPTIONAL | DIDFT_ANYINSTANCE | DIDFT_AXIS, 0 },\r
@@ -294,273 +298,5 @@ const DIDATAFORMAT c_dfDIMouse2 = {
     DIDF_RELAXIS,\r
     sizeof(DIMOUSESTATE2),\r
     numObjects(dfDIMouse2),\r
-    (LPDIOBJECTDATAFORMAT)dfDIMouse2\r
-};\r
-\r
-static const DIOBJECTDATAFORMAT dfDIKeyboard[] = {\r
-  { &GUID_Key,0,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(0),0},\r
-  { &GUID_Key,1,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(1),0},\r
-  { &GUID_Key,2,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(2),0},\r
-  { &GUID_Key,3,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(3),0},\r
-  { &GUID_Key,4,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(4),0},\r
-  { &GUID_Key,5,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(5),0},\r
-  { &GUID_Key,6,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(6),0},\r
-  { &GUID_Key,7,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(7),0},\r
-  { &GUID_Key,8,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(8),0},\r
-  { &GUID_Key,9,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(9),0},\r
-  { &GUID_Key,10,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(10),0},\r
-  { &GUID_Key,11,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(11),0},\r
-  { &GUID_Key,12,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(12),0},\r
-  { &GUID_Key,13,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(13),0},\r
-  { &GUID_Key,14,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(14),0},\r
-  { &GUID_Key,15,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(15),0},\r
-  { &GUID_Key,16,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(16),0},\r
-  { &GUID_Key,17,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(17),0},\r
-  { &GUID_Key,18,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(18),0},\r
-  { &GUID_Key,19,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(19),0},\r
-  { &GUID_Key,20,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(20),0},\r
-  { &GUID_Key,21,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(21),0},\r
-  { &GUID_Key,22,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(22),0},\r
-  { &GUID_Key,23,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(23),0},\r
-  { &GUID_Key,24,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(24),0},\r
-  { &GUID_Key,25,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(25),0},\r
-  { &GUID_Key,26,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(26),0},\r
-  { &GUID_Key,27,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(27),0},\r
-  { &GUID_Key,28,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(28),0},\r
-  { &GUID_Key,29,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(29),0},\r
-  { &GUID_Key,30,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(30),0},\r
-  { &GUID_Key,31,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(31),0},\r
-  { &GUID_Key,32,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(32),0},\r
-  { &GUID_Key,33,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(33),0},\r
-  { &GUID_Key,34,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(34),0},\r
-  { &GUID_Key,35,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(35),0},\r
-  { &GUID_Key,36,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(36),0},\r
-  { &GUID_Key,37,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(37),0},\r
-  { &GUID_Key,38,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(38),0},\r
-  { &GUID_Key,39,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(39),0},\r
-  { &GUID_Key,40,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(40),0},\r
-  { &GUID_Key,41,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(41),0},\r
-  { &GUID_Key,42,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(42),0},\r
-  { &GUID_Key,43,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(43),0},\r
-  { &GUID_Key,44,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(44),0},\r
-  { &GUID_Key,45,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(45),0},\r
-  { &GUID_Key,46,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(46),0},\r
-  { &GUID_Key,47,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(47),0},\r
-  { &GUID_Key,48,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(48),0},\r
-  { &GUID_Key,49,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(49),0},\r
-  { &GUID_Key,50,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(50),0},\r
-  { &GUID_Key,51,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(51),0},\r
-  { &GUID_Key,52,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(52),0},\r
-  { &GUID_Key,53,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(53),0},\r
-  { &GUID_Key,54,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(54),0},\r
-  { &GUID_Key,55,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(55),0},\r
-  { &GUID_Key,56,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(56),0},\r
-  { &GUID_Key,57,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(57),0},\r
-  { &GUID_Key,58,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(58),0},\r
-  { &GUID_Key,59,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(59),0},\r
-  { &GUID_Key,60,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(60),0},\r
-  { &GUID_Key,61,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(61),0},\r
-  { &GUID_Key,62,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(62),0},\r
-  { &GUID_Key,63,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(63),0},\r
-  { &GUID_Key,64,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(64),0},\r
-  { &GUID_Key,65,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(65),0},\r
-  { &GUID_Key,66,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(66),0},\r
-  { &GUID_Key,67,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(67),0},\r
-  { &GUID_Key,68,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(68),0},\r
-  { &GUID_Key,69,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(69),0},\r
-  { &GUID_Key,70,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(70),0},\r
-  { &GUID_Key,71,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(71),0},\r
-  { &GUID_Key,72,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(72),0},\r
-  { &GUID_Key,73,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(73),0},\r
-  { &GUID_Key,74,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(74),0},\r
-  { &GUID_Key,75,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(75),0},\r
-  { &GUID_Key,76,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(76),0},\r
-  { &GUID_Key,77,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(77),0},\r
-  { &GUID_Key,78,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(78),0},\r
-  { &GUID_Key,79,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(79),0},\r
-  { &GUID_Key,80,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(80),0},\r
-  { &GUID_Key,81,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(81),0},\r
-  { &GUID_Key,82,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(82),0},\r
-  { &GUID_Key,83,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(83),0},\r
-  { &GUID_Key,84,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(84),0},\r
-  { &GUID_Key,85,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(85),0},\r
-  { &GUID_Key,86,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(86),0},\r
-  { &GUID_Key,87,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(87),0},\r
-  { &GUID_Key,88,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(88),0},\r
-  { &GUID_Key,89,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(89),0},\r
-  { &GUID_Key,90,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(90),0},\r
-  { &GUID_Key,91,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(91),0},\r
-  { &GUID_Key,92,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(92),0},\r
-  { &GUID_Key,93,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(93),0},\r
-  { &GUID_Key,94,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(94),0},\r
-  { &GUID_Key,95,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(95),0},\r
-  { &GUID_Key,96,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(96),0},\r
-  { &GUID_Key,97,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(97),0},\r
-  { &GUID_Key,98,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(98),0},\r
-  { &GUID_Key,99,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(99),0},\r
-  { &GUID_Key,100,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(100),0},\r
-  { &GUID_Key,101,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(101),0},\r
-  { &GUID_Key,102,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(102),0},\r
-  { &GUID_Key,103,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(103),0},\r
-  { &GUID_Key,104,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(104),0},\r
-  { &GUID_Key,105,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(105),0},\r
-  { &GUID_Key,106,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(106),0},\r
-  { &GUID_Key,107,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(107),0},\r
-  { &GUID_Key,108,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(108),0},\r
-  { &GUID_Key,109,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(109),0},\r
-  { &GUID_Key,110,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(110),0},\r
-  { &GUID_Key,111,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(111),0},\r
-  { &GUID_Key,112,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(112),0},\r
-  { &GUID_Key,113,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(113),0},\r
-  { &GUID_Key,114,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(114),0},\r
-  { &GUID_Key,115,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(115),0},\r
-  { &GUID_Key,116,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(116),0},\r
-  { &GUID_Key,117,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(117),0},\r
-  { &GUID_Key,118,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(118),0},\r
-  { &GUID_Key,119,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(119),0},\r
-  { &GUID_Key,120,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(120),0},\r
-  { &GUID_Key,121,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(121),0},\r
-  { &GUID_Key,122,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(122),0},\r
-  { &GUID_Key,123,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(123),0},\r
-  { &GUID_Key,124,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(124),0},\r
-  { &GUID_Key,125,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(125),0},\r
-  { &GUID_Key,126,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(126),0},\r
-  { &GUID_Key,127,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(127),0},\r
-  { &GUID_Key,128,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(128),0},\r
-  { &GUID_Key,129,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(129),0},\r
-  { &GUID_Key,130,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(130),0},\r
-  { &GUID_Key,131,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(131),0},\r
-  { &GUID_Key,132,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(132),0},\r
-  { &GUID_Key,133,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(133),0},\r
-  { &GUID_Key,134,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(134),0},\r
-  { &GUID_Key,135,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(135),0},\r
-  { &GUID_Key,136,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(136),0},\r
-  { &GUID_Key,137,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(137),0},\r
-  { &GUID_Key,138,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(138),0},\r
-  { &GUID_Key,139,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(139),0},\r
-  { &GUID_Key,140,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(140),0},\r
-  { &GUID_Key,141,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(141),0},\r
-  { &GUID_Key,142,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(142),0},\r
-  { &GUID_Key,143,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(143),0},\r
-  { &GUID_Key,144,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(144),0},\r
-  { &GUID_Key,145,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(145),0},\r
-  { &GUID_Key,146,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(146),0},\r
-  { &GUID_Key,147,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(147),0},\r
-  { &GUID_Key,148,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(148),0},\r
-  { &GUID_Key,149,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(149),0},\r
-  { &GUID_Key,150,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(150),0},\r
-  { &GUID_Key,151,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(151),0},\r
-  { &GUID_Key,152,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(152),0},\r
-  { &GUID_Key,153,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(153),0},\r
-  { &GUID_Key,154,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(154),0},\r
-  { &GUID_Key,155,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(155),0},\r
-  { &GUID_Key,156,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(156),0},\r
-  { &GUID_Key,157,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(157),0},\r
-  { &GUID_Key,158,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(158),0},\r
-  { &GUID_Key,159,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(159),0},\r
-  { &GUID_Key,160,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(160),0},\r
-  { &GUID_Key,161,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(161),0},\r
-  { &GUID_Key,162,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(162),0},\r
-  { &GUID_Key,163,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(163),0},\r
-  { &GUID_Key,164,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(164),0},\r
-  { &GUID_Key,165,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(165),0},\r
-  { &GUID_Key,166,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(166),0},\r
-  { &GUID_Key,167,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(167),0},\r
-  { &GUID_Key,168,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(168),0},\r
-  { &GUID_Key,169,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(169),0},\r
-  { &GUID_Key,170,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(170),0},\r
-  { &GUID_Key,171,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(171),0},\r
-  { &GUID_Key,172,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(172),0},\r
-  { &GUID_Key,173,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(173),0},\r
-  { &GUID_Key,174,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(174),0},\r
-  { &GUID_Key,175,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(175),0},\r
-  { &GUID_Key,176,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(176),0},\r
-  { &GUID_Key,177,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(177),0},\r
-  { &GUID_Key,178,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(178),0},\r
-  { &GUID_Key,179,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(179),0},\r
-  { &GUID_Key,180,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(180),0},\r
-  { &GUID_Key,181,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(181),0},\r
-  { &GUID_Key,182,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(182),0},\r
-  { &GUID_Key,183,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(183),0},\r
-  { &GUID_Key,184,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(184),0},\r
-  { &GUID_Key,185,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(185),0},\r
-  { &GUID_Key,186,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(186),0},\r
-  { &GUID_Key,187,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(187),0},\r
-  { &GUID_Key,188,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(188),0},\r
-  { &GUID_Key,189,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(189),0},\r
-  { &GUID_Key,190,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(190),0},\r
-  { &GUID_Key,191,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(191),0},\r
-  { &GUID_Key,192,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(192),0},\r
-  { &GUID_Key,193,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(193),0},\r
-  { &GUID_Key,194,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(194),0},\r
-  { &GUID_Key,195,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(195),0},\r
-  { &GUID_Key,196,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(196),0},\r
-  { &GUID_Key,197,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(197),0},\r
-  { &GUID_Key,198,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(198),0},\r
-  { &GUID_Key,199,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(199),0},\r
-  { &GUID_Key,200,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(200),0},\r
-  { &GUID_Key,201,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(201),0},\r
-  { &GUID_Key,202,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(202),0},\r
-  { &GUID_Key,203,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(203),0},\r
-  { &GUID_Key,204,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(204),0},\r
-  { &GUID_Key,205,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(205),0},\r
-  { &GUID_Key,206,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(206),0},\r
-  { &GUID_Key,207,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(207),0},\r
-  { &GUID_Key,208,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(208),0},\r
-  { &GUID_Key,209,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(209),0},\r
-  { &GUID_Key,210,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(210),0},\r
-  { &GUID_Key,211,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(211),0},\r
-  { &GUID_Key,212,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(212),0},\r
-  { &GUID_Key,213,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(213),0},\r
-  { &GUID_Key,214,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(214),0},\r
-  { &GUID_Key,215,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(215),0},\r
-  { &GUID_Key,216,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(216),0},\r
-  { &GUID_Key,217,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(217),0},\r
-  { &GUID_Key,218,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(218),0},\r
-  { &GUID_Key,219,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(219),0},\r
-  { &GUID_Key,220,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(220),0},\r
-  { &GUID_Key,221,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(221),0},\r
-  { &GUID_Key,222,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(222),0},\r
-  { &GUID_Key,223,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(223),0},\r
-  { &GUID_Key,224,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(224),0},\r
-  { &GUID_Key,225,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(225),0},\r
-  { &GUID_Key,226,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(226),0},\r
-  { &GUID_Key,227,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(227),0},\r
-  { &GUID_Key,228,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(228),0},\r
-  { &GUID_Key,229,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(229),0},\r
-  { &GUID_Key,230,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(230),0},\r
-  { &GUID_Key,231,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(231),0},\r
-  { &GUID_Key,232,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(232),0},\r
-  { &GUID_Key,233,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(233),0},\r
-  { &GUID_Key,234,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(234),0},\r
-  { &GUID_Key,235,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(235),0},\r
-  { &GUID_Key,236,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(236),0},\r
-  { &GUID_Key,237,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(237),0},\r
-  { &GUID_Key,238,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(238),0},\r
-  { &GUID_Key,239,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(239),0},\r
-  { &GUID_Key,240,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(240),0},\r
-  { &GUID_Key,241,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(241),0},\r
-  { &GUID_Key,242,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(242),0},\r
-  { &GUID_Key,243,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(243),0},\r
-  { &GUID_Key,244,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(244),0},\r
-  { &GUID_Key,245,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(245),0},\r
-  { &GUID_Key,246,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(246),0},\r
-  { &GUID_Key,247,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(247),0},\r
-  { &GUID_Key,248,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(248),0},\r
-  { &GUID_Key,249,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(249),0},\r
-  { &GUID_Key,250,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(250),0},\r
-  { &GUID_Key,251,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(251),0},\r
-  { &GUID_Key,252,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(252),0},\r
-  { &GUID_Key,253,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(253),0},\r
-  { &GUID_Key,254,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(254),0},\r
-  { &GUID_Key,255,DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(255),0}\r
-};\r
-\r
-const DIDATAFORMAT c_dfDIKeyboard = {\r
-    sizeof(DIDATAFORMAT),\r
-    sizeof(DIOBJECTDATAFORMAT),\r
-    DIDF_RELAXIS,\r
-    256,\r
-    numObjects(dfDIKeyboard),\r
-    (LPDIOBJECTDATAFORMAT)dfDIKeyboard\r
+    dfDIMouse2\r
 };\r
index b9c8790..2980c3c 100644 (file)
@@ -290,12 +290,12 @@ DataFormat *create_DataFormat(const DIDATAFORMAT *wine_format, LPCDIDATAFORMAT a
     int index = 0;\r
     DWORD next = 0;\r
     \r
-    ret = HeapAlloc(GetProcessHeap(), 0, sizeof(DataFormat));\r
+    ret = (DataFormat *) HeapAlloc(GetProcessHeap(), 0, sizeof(DataFormat));\r
     \r
-    done = HeapAlloc(GetProcessHeap(), 0, sizeof(int) * asked_format->dwNumObjs);\r
+    done = (int *) HeapAlloc(GetProcessHeap(), 0, sizeof(int) * asked_format->dwNumObjs);\r
     memset(done, 0, sizeof(int) * asked_format->dwNumObjs);\r
     \r
-    dt = HeapAlloc(GetProcessHeap(), 0, asked_format->dwNumObjs * sizeof(DataTransform));\r
+    dt = (DataTransform *) HeapAlloc(GetProcessHeap(), 0, asked_format->dwNumObjs * sizeof(DataTransform));\r
     \r
     TRACE("Creating DataTransform : \n");\r
     \r
index ee0e938..bd003d0 100644 (file)
@@ -53,14 +53,10 @@ static IDirectInput7WVtbl ddi7wvt;
 static IDirectInput8AVtbl ddi8avt;\r
 static IDirectInput8WVtbl ddi8wvt;\r
 \r
-static const struct dinput_device *dinput_devices[] =\r
-{\r
-    &mouse_device,\r
-    &keyboard_device,\r
-    &joystick_linuxinput_device,\r
-    &joystick_linux_device\r
-};\r
-#define NB_DINPUT_DEVICES (sizeof(dinput_devices)/sizeof(dinput_devices[0]))\r
+/* This array will be filled a dinput.so loading */\r
+#define MAX_WINE_DINPUT_DEVICES 4\r
+static dinput_device * dinput_devices[MAX_WINE_DINPUT_DEVICES];\r
+static int nrof_dinput_devices = 0;\r
 \r
 HINSTANCE DINPUT_instance = NULL;\r
 \r
@@ -78,7 +74,28 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserv)
     return TRUE;\r
 }\r
 \r
+/* register a direct draw driver. We better not use malloc for we are in\r
+ * the ELF startup initialisation at this point.\r
+ */\r
+void dinput_register_device(dinput_device *device) {\r
+    int        i;\r
+\r
+    /* insert according to priority */\r
+    for (i=0;i<nrof_dinput_devices;i++) {\r
+       if (dinput_devices[i]->pref <= device->pref) {\r
+           memcpy(dinput_devices+i+1,dinput_devices+i,sizeof(dinput_devices[0])*(nrof_dinput_devices-i));\r
+           dinput_devices[i] = device;\r
+           break;\r
+       }\r
+    }\r
+    if (i==nrof_dinput_devices)        /* not found, or too low priority */\r
+       dinput_devices[nrof_dinput_devices] = device;\r
+\r
+    nrof_dinput_devices++;\r
 \r
+    /* increase MAX_DDRAW_DRIVERS if the line below triggers */\r
+    assert(nrof_dinput_devices <= MAX_WINE_DINPUT_DEVICES);\r
+}\r
 \r
 /******************************************************************************\r
  *     DirectInputCreateEx (DINPUT.@)\r
@@ -94,7 +111,7 @@ HRESULT WINAPI DirectInputCreateEx(
        if (IsEqualGUID(&IID_IDirectInputA,riid) ||\r
            IsEqualGUID(&IID_IDirectInput2A,riid) ||\r
            IsEqualGUID(&IID_IDirectInput7A,riid)) {\r
-         This = HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl));\r
+         This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl));\r
          This->lpVtbl = &ddi7avt;\r
          This->ref = 1;\r
          This->version = 1;\r
@@ -106,7 +123,7 @@ HRESULT WINAPI DirectInputCreateEx(
        if (IsEqualGUID(&IID_IDirectInputW,riid) ||\r
            IsEqualGUID(&IID_IDirectInput2W,riid) ||\r
            IsEqualGUID(&IID_IDirectInput7W,riid)) {\r
-         This = HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl));\r
+         This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl));\r
          This->lpVtbl = &ddi7wvt;\r
          This->ref = 1;\r
          This->version = 1;\r
@@ -116,7 +133,7 @@ HRESULT WINAPI DirectInputCreateEx(
        }\r
 \r
        if (IsEqualGUID(&IID_IDirectInput8A,riid)) {\r
-         This = HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl));\r
+         This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl));\r
          This->lpVtbl = &ddi8avt;\r
          This->ref = 1;\r
          This->version = 8;\r
@@ -126,7 +143,7 @@ HRESULT WINAPI DirectInputCreateEx(
        }\r
 \r
        if (IsEqualGUID(&IID_IDirectInput8W,riid)) {\r
-         This = HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl));\r
+         This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl));\r
          This->lpVtbl = &ddi8wvt;\r
          This->ref = 1;\r
          This->version = 8;\r
@@ -147,7 +164,7 @@ HRESULT WINAPI DirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPU
        TRACE("(0x%08lx,%04lx,%p,%p)\n", (DWORD)hinst,dwVersion,ppDI,punkOuter);\r
 \r
        //trace:dinput:DirectInputCreateA (0x00400000,0500,0x42bafc54,(nil))\r
-       This = HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl));\r
+       This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl));\r
        This->lpVtbl = &ddi7avt;\r
        This->ref = 1;\r
        if (dwVersion > 0x0700) {\r
@@ -168,7 +185,7 @@ HRESULT WINAPI DirectInputCreateW(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPU
 {\r
        IDirectInputImpl* This;\r
        TRACE("(0x%08lx,%04lx,%p,%p)\n", (DWORD)hinst,dwVersion,ppDI,punkOuter);\r
-       This = HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl));\r
+       This = (IDirectInputImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDirectInputImpl));\r
        This->lpVtbl = &ddi7wvt;\r
        This->ref = 1;\r
        if (dwVersion >= 0x0800) {\r
@@ -185,7 +202,7 @@ static const char *_dump_DIDEVTYPE_value(DWORD dwDevType) {
     switch (dwDevType) {\r
         case 0: return "All devices";\r
        case DIDEVTYPE_MOUSE: return "DIDEVTYPE_MOUSE";\r
-       case DIDEVTYPE_KEYBOARD: return "DIDEVTYPE_KEYBOARD";    \r
+       case DIDEVTYPE_KEYBOARD: return "DIDEVTYPE_KEYBOARD";\r
        case DIDEVTYPE_JOYSTICK: return "DIDEVTYPE_JOYSTICK";\r
        case DIDEVTYPE_DEVICE: return "DIDEVTYPE_DEVICE";\r
        default: return "Unkown";\r
@@ -231,22 +248,16 @@ static HRESULT WINAPI IDirectInputAImpl_EnumDevices(
     TRACE("(this=%p,0x%04lx '%s',%p,%p,%04lx)\n",\r
          This, dwDevType, _dump_DIDEVTYPE_value(dwDevType),\r
          lpCallback, pvRef, dwFlags);\r
-#ifdef __REACTOS__\r
-       /* hack geting keyboard and mouse working */\r
-       if (NB_DINPUT_DEVICES==0){\r
+\r
+       if (nrof_dinput_devices==0){\r
          scan_mouse();\r
          scan_keyboard();\r
        }\r
-#endif \r
+       \r
     TRACE(" flags: "); _dump_EnumDevices_dwFlags(dwFlags); TRACE("\n");\r
     \r
 \r
-    for (i = 0; i < NB_DINPUT_DEVICES; i++) {\r
-#ifndef __REACTOS__   \r
-               /* Wine Dinput does not support windows enum \r
-                  we need a hack here                     */\r
-        if (!dinput_devices[i]->enum_deviceA) continue;\r
-#endif\r
+    for (i = 0; i < nrof_dinput_devices; i++) {\r
         for (j = 0, r = -1; r != 0; j++) {\r
            devInstance.dwSize = sizeof(devInstance);\r
            TRACE("  - checking device %d ('%s')\n", i, dinput_devices[i]->name);\r
@@ -272,13 +283,10 @@ static HRESULT WINAPI IDirectInputWImpl_EnumDevices(
     DIDEVICEINSTANCEW devInstance;\r
     int i, j, r;\r
     \r
-#ifdef __REACTOS__\r
-       /* hack geting keyboard and mouse working */\r
-       if (NB_DINPUT_DEVICES==0){\r
+               if (nrof_dinput_devices==0){\r
          scan_mouse();\r
          scan_keyboard();\r
        }\r
-#endif \r
 \r
     TRACE("(this=%p,0x%04lx '%s',%p,%p,%04lx)\n",\r
          This, dwDevType, _dump_DIDEVTYPE_value(dwDevType),\r
@@ -286,13 +294,7 @@ static HRESULT WINAPI IDirectInputWImpl_EnumDevices(
     TRACE(" flags: "); _dump_EnumDevices_dwFlags(dwFlags); TRACE("\n");\r
 \r
 \r
-    for (i = 0; i < NB_DINPUT_DEVICES; i++) {\r
-#ifndef __REACTOS__   \r
-               /* Wine Dinput does not support windows enum \r
-                  we need a hack here                     */\r
-        if (!dinput_devices[i]->enum_deviceW) continue;\r
-#endif\r
-\r
+    for (i = 0; i < nrof_dinput_devices; i++) {\r
         for (j = 0, r = -1; r != 0; j++) {\r
            devInstance.dwSize = sizeof(devInstance);\r
            TRACE("  - checking device %d ('%s')\n", i, dinput_devices[i]->name);\r
@@ -364,20 +366,14 @@ static HRESULT WINAPI IDirectInputAImpl_CreateDevice(
 \r
        TRACE("(this=%p,%s,%p,%p)\n",This,debugstr_guid(rguid),pdev,punk);\r
        \r
-#ifdef __REACTOS__\r
-       /* hack geting keyboard and mouse working */\r
-       if (NB_DINPUT_DEVICES==0){\r
+       if (nrof_dinput_devices==0){\r
          scan_mouse();\r
          scan_keyboard();\r
        }\r
-#endif \r
        \r
        /* Loop on all the devices to see if anyone matches the given GUID */\r
-       for (i = 0; i < NB_DINPUT_DEVICES; i++) {\r
+       for (i = 0; i < nrof_dinput_devices; i++) {\r
          HRESULT ret;\r
-#ifndef __REACTOS__        \r
-         if (!dinput_devices[i]->create_deviceA) continue; \r
-#endif\r
          if ((ret = dinput_devices[i]->create_deviceA(This, rguid, NULL, pdev)) == DI_OK)\r
            return DI_OK;\r
 \r
@@ -396,20 +392,14 @@ static HRESULT WINAPI IDirectInputWImpl_CreateDevice(LPDIRECTINPUT7A iface,
     \r
        TRACE("(this=%p,%s,%p,%p)\n",This,debugstr_guid(rguid),pdev,punk);\r
 \r
-#ifdef __REACTOS__\r
-       /* hack geting keyboard and mouse working */\r
-       if (NB_DINPUT_DEVICES==0){\r
+       if (nrof_dinput_devices==0){\r
          scan_mouse();\r
          scan_keyboard();\r
        }\r
-#endif \r
        \r
        /* Loop on all the devices to see if anyone matches the given GUID */\r
-       for (i = 0; i < NB_DINPUT_DEVICES; i++) {\r
+       for (i = 0; i < nrof_dinput_devices; i++) {\r
          HRESULT ret;\r
-#ifndef __REACTOS__\r
-         if (!dinput_devices[i]->create_deviceW) continue;\r
-#endif\r
          if ((ret = dinput_devices[i]->create_deviceW(This, rguid, NULL, pdev)) == DI_OK)\r
            return DI_OK;\r
 \r
@@ -467,20 +457,14 @@ static HRESULT WINAPI IDirectInput7AImpl_CreateDeviceEx(LPDIRECTINPUT7A iface, R
 \r
   TRACE("(%p)->(%s, %s, %p, %p)\n", This, debugstr_guid(rguid), debugstr_guid(riid), pvOut, lpUnknownOuter);\r
 \r
-#ifdef __REACTOS__\r
-       /* hack geting keyboard and mouse working */\r
-       if (NB_DINPUT_DEVICES==0){\r
-         scan_mouse();\r
-         scan_keyboard();\r
-       }\r
-#endif \r
+  if (nrof_dinput_devices==0){\r
+    scan_mouse();\r
+    scan_keyboard();\r
+  }  \r
 \r
   /* Loop on all the devices to see if anyone matches the given GUID */\r
-  for (i = 0; i < NB_DINPUT_DEVICES; i++) {\r
+  for (i = 0; i < nrof_dinput_devices; i++) {\r
     HRESULT ret;\r
-#ifndef __REACTOS__\r
-    if (!dinput_devices[i]->create_deviceA) continue;\r
-#endif\r
     if ((ret = dinput_devices[i]->create_deviceA(This, rguid, riid, (LPDIRECTINPUTDEVICEA*) pvOut)) == DI_OK)\r
       return DI_OK;\r
 \r
@@ -500,7 +484,7 @@ static HRESULT WINAPI IDirectInput7WImpl_CreateDeviceEx(LPDIRECTINPUT7W iface, R
 \r
   TRACE("(%p)->(%s, %s, %p, %p)\n", This, debugstr_guid(rguid), debugstr_guid(riid), pvOut, lpUnknownOuter);\r
 \r
-       if (NB_DINPUT_DEVICES==0){\r
+       if (nrof_dinput_devices==0){\r
          scan_mouse();\r
          scan_keyboard();\r
        }\r
@@ -508,11 +492,8 @@ static HRESULT WINAPI IDirectInput7WImpl_CreateDeviceEx(LPDIRECTINPUT7W iface, R
 \r
 \r
   /* Loop on all the devices to see if anyone matches the given GUID */\r
-  for (i = 0; i < NB_DINPUT_DEVICES; i++) {\r
+  for (i = 0; i < nrof_dinput_devices; i++) {\r
     HRESULT ret;\r
-#ifndef __REACTOS__\r
-    if (!dinput_devices[i]->create_deviceW) continue;\r
-#endif\r
     if ((ret = dinput_devices[i]->create_deviceW(This, rguid, riid, (LPDIRECTINPUTDEVICEW*) pvOut)) == DI_OK)\r
       return DI_OK;\r
 \r
index 92e92ca..ce7b54a 100644 (file)
@@ -39,18 +39,16 @@ struct IDirectInputImpl
 };\r
 \r
 /* Function called by all devices that Wine supports */\r
-struct dinput_device {\r
+typedef struct dinput_device {\r
+    INT pref;\r
     const char *name;\r
     BOOL (*enum_deviceA)(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, int version, int id);\r
     BOOL (*enum_deviceW)(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, int version, int id);\r
     HRESULT (*create_deviceA)(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev);\r
     HRESULT (*create_deviceW)(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEW* pdev);\r
-};\r
+} dinput_device;\r
 \r
-extern const struct dinput_device mouse_device;\r
-extern const struct dinput_device keyboard_device;\r
-extern const struct dinput_device joystick_linux_device;\r
-extern const struct dinput_device joystick_linuxinput_device;\r
+extern void dinput_register_device(dinput_device *device);\r
 \r
 extern HINSTANCE DINPUT_instance;\r
 \r
index 99834e6..138ded7 100644 (file)
@@ -28,6 +28,8 @@
 #include "config.h"\r
 #include "wine/port.h"\r
 \r
+#ifdef HAVE_LINUX_22_JOYSTICK_API\r
+\r
 #include <stdarg.h>\r
 #include <stdio.h>\r
 #include <string.h>\r
@@ -53,6 +55,7 @@
 #ifdef HAVE_LINUX_JOYSTICK_H\r
 # include <linux/joystick.h>\r
 #endif\r
+#define JOYDEV "/dev/js"\r
 \r
 #include "wine/debug.h"\r
 #include "wine/unicode.h"\r
 \r
 WINE_DEFAULT_DEBUG_CHANNEL(dinput);\r
 \r
-#ifdef HAVE_LINUX_22_JOYSTICK_API\r
-\r
-#define JOYDEV "/dev/js"\r
-\r
 typedef struct {\r
     LONG lMin;\r
     LONG lMax;\r
@@ -647,7 +646,8 @@ static HRESULT joydev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, RE
   return DIERR_DEVICENOTREG;\r
 }\r
 \r
-const struct dinput_device joystick_linux_device = {\r
+static dinput_device joydev = {\r
+  10,\r
   "Wine Linux joystick driver",\r
   joydev_enum_deviceA,\r
   joydev_enum_deviceW,\r
@@ -655,6 +655,8 @@ const struct dinput_device joystick_linux_device = {
   joydev_create_deviceW\r
 };\r
 \r
+DECL_GLOBAL_CONSTRUCTOR(joydev_register) { dinput_register_device(&joydev); }\r
+\r
 \r
 \r
 /******************************************************************************\r
@@ -1695,14 +1697,4 @@ static IDirectInputDevice8WVtbl SysJoystickWvt =
 };\r
 #undef XCAST\r
 \r
-#else  /* HAVE_LINUX_22_JOYSTICK_API */\r
-\r
-const struct dinput_device joystick_linux_device = {\r
-  "Wine Linux joystick driver",\r
-  NULL,\r
-  NULL,\r
-  NULL,\r
-  NULL\r
-};\r
-\r
 #endif  /* HAVE_LINUX_22_JOYSTICK_API */\r
index 563897a..673cc38 100644 (file)
@@ -22,6 +22,8 @@
 #include "config.h"\r
 #include "wine/port.h"\r
 \r
+#ifdef HAVE_LINUX_INPUT_H\r
+\r
 #include <assert.h>\r
 #include <stdarg.h>\r
 #include <stdio.h>\r
 #ifdef HAVE_SYS_ERRNO_H\r
 # include <sys/errno.h>\r
 #endif\r
+\r
+#ifdef HAVE_CORRECT_LINUXINPUT_H\r
+\r
 #ifdef HAVE_LINUX_INPUT_H\r
 # include <linux/input.h>\r
 #endif\r
 \r
+\r
+#define EVDEVPREFIX    "/dev/input/event"\r
+\r
 #include "wine/debug.h"\r
 #include "wine/unicode.h"\r
 #include "windef.h"\r
 \r
 WINE_DEFAULT_DEBUG_CHANNEL(dinput);\r
 \r
-#ifdef HAVE_CORRECT_LINUXINPUT_H\r
-\r
-#define EVDEVPREFIX    "/dev/input/event"\r
-\r
 /* Wine joystick driver object instances */\r
 #define WINE_JOYSTICK_AXIS_BASE   0\r
 #define WINE_JOYSTICK_BUTTON_BASE 8\r
@@ -318,7 +322,8 @@ static HRESULT joydev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, RE
   return DIERR_DEVICENOTREG;\r
 }\r
 \r
-const struct dinput_device joystick_linuxinput_device = {\r
+static dinput_device joydev = {\r
+  20,\r
   "Wine Linux-input joystick driver",\r
   joydev_enum_deviceA,\r
   joydev_enum_deviceW,\r
@@ -326,6 +331,8 @@ const struct dinput_device joystick_linuxinput_device = {
   joydev_create_deviceW\r
 };\r
 \r
+DECL_GLOBAL_CONSTRUCTOR(joydev_register) { dinput_register_device(&joydev); }\r
+\r
 /******************************************************************************\r
  *     Joystick\r
  */\r
@@ -971,7 +978,7 @@ static HRESULT WINAPI JoystickAImpl_GetProperty(LPDIRECTINPUTDEVICE8A iface,
 {\r
   JoystickImpl *This = (JoystickImpl *)iface;\r
 \r
-  TRACE("(this=%p,%s,%p)\n",\r
+  TRACE("(this=%p,%s,%p): stub!\n",\r
        iface, debugstr_guid(rguid), pdiph);\r
 \r
   if (TRACE_ON(dinput))\r
@@ -1087,14 +1094,6 @@ static IDirectInputDevice8WVtbl JoystickWvt =
 };\r
 #undef XCAST\r
 \r
-#else  /* HAVE_CORRECT_LINUXINPUT_H */\r
+#endif  /* HAVE_LINUX_INPUT_H */\r
 \r
-const struct dinput_device joystick_linuxinput_device = {\r
-  "Wine Linux-input joystick driver",\r
-  NULL,\r
-  NULL,\r
-  NULL,\r
-  NULL\r
-};\r
-\r
-#endif  /* HAVE_CORRECT_LINUXINPUT_H */\r
+#endif\r
index 2d14f38..08acc18 100644 (file)
@@ -3,7 +3,6 @@
  * Copyright 1998 Marcus Meissner\r
  * Copyright 1998,1999 Lionel Ulmer\r
  * Copyright 2000-2001 TransGaming Technologies Inc.\r
- * Copyright 2005 Raphael Junqueira\r
  *\r
  * This library is free software; you can redistribute it and/or\r
  * modify it under the terms of the GNU Lesser General Public\r
 \r
 WINE_DEFAULT_DEBUG_CHANNEL(dinput);\r
 \r
-#define WINE_DINPUT_KEYBOARD_MAX_KEYS 256\r
+//fast fix misning from mingw headers\r
+#ifdef __REACTOS__\r
+#define LLKHF_INJECTED       0x00000010\r
+#endif\r
 \r
 static IDirectInputDevice8AVtbl SysKeyboardAvt;\r
 static IDirectInputDevice8WVtbl SysKeyboardWvt;\r
@@ -68,15 +70,14 @@ struct SysKeyboardImpl
         CRITICAL_SECTION                crit;\r
 };\r
 \r
-static SysKeyboardImpl* current_lock = NULL; \r
-/* Today's acquired device\r
- * FIXME: currently this can be only one.\r
- * Maybe this should be a linked list or st.\r
- * I don't know what the rules are for multiple acquired keyboards,\r
- * but 'DI_LOSTFOCUS' and 'DI_UNACQUIRED' exist for a reason.\r
+SysKeyboardImpl *current; /* Today's acquired device\r
+FIXME: currently this can be only one.\r
+Maybe this should be a linked list or st.\r
+I don't know what the rules are for multiple acquired keyboards,\r
+but 'DI_LOSTFOCUS' and 'DI_UNACQUIRED' exist for a reason.\r
 */\r
 \r
-static BYTE DInputKeyState[WINE_DINPUT_KEYBOARD_MAX_KEYS]; /* array for 'GetDeviceState' */\r
+static BYTE DInputKeyState[256]; /* array for 'GetDeviceState' */\r
 \r
 static CRITICAL_SECTION keyboard_crit;\r
 static CRITICAL_SECTION_DEBUG critsect_debug =\r
@@ -87,65 +88,118 @@ static CRITICAL_SECTION_DEBUG critsect_debug =
 };\r
 static CRITICAL_SECTION keyboard_crit = { &critsect_debug, -1, 0, 0, 0, 0 };\r
 \r
-static DWORD keyboard_users = 0;\r
-static HHOOK keyboard_hook = NULL;\r
+static DWORD keyboard_users;\r
 \r
-LRESULT CALLBACK KeyboardCallback( int code, WPARAM wparam, LPARAM lparam )\r
-{\r
-  BYTE dik_code;\r
-  BOOL down;\r
-  DWORD timestamp;\r
-  KBDLLHOOKSTRUCT *hook = (KBDLLHOOKSTRUCT *)lparam;\r
-  BYTE new_diks;\r
+#ifndef __REACTOS__\r
+static HHOOK keyboard_hook;\r
+#endif\r
 \r
-  TRACE("(%d,%d,%ld)\n", code, wparam, lparam);\r
+#ifdef __REACTOS__\r
+void reactos_input_keyboard();\r
 \r
-  /** returns now if not HC_ACTION */\r
-  if (code != HC_ACTION) return CallNextHookEx(keyboard_hook, code, wparam, lparam);\r
+void reactos_input_keyboard()\r
+{\r
+  MSG msg;\r
+  BOOL fDone;\r
+  int disk_code = -1;\r
+  BOOL down;\r
+  BYTE oldDInputKeyState[256];\r
+  int t;\r
+  \r
+  memcpy(&oldDInputKeyState,&DInputKeyState,256);\r
+  GetKeyboardState(DInputKeyState);\r
   \r
+  for( t=0;t<255;t++)\r
   {\r
-    dik_code = hook->scanCode;\r
-    if (hook->flags & LLKHF_EXTENDED) dik_code |= 0x80;\r
-    down = !(hook->flags & LLKHF_UP);\r
-    timestamp = hook->time;\r
+         if (oldDInputKeyState[t]!=DInputKeyState[t]) disk_code=t;       \r
   }\r
+       \r
 \r
-  /** returns now if key event already known */\r
-  new_diks = (down ? 0x80 : 0);\r
-  /*if (new_diks != DInputKeyState[dik_code]) return CallNextHookEx(keyboard_hook, code, wparam, lparam); TO BE FIXED */\r
-\r
-  DInputKeyState[dik_code] = new_diks;\r
-  TRACE(" setting %02X to %02X\n", dik_code, DInputKeyState[dik_code]);\r
-      \r
-  if (current_lock != NULL) {\r
-    if (current_lock->hEvent) SetEvent(current_lock->hEvent);\r
-    \r
-    if (current_lock->buffer != NULL) {\r
+  if (disk_code!=-1) {\r
+         if (current->buffer != NULL)\r
+     {\r
       int n;\r
+      n = (current->start + current->count) % current->buffersize;\r
+\r
+      current->buffer[n].dwOfs = (BYTE) disk_code;\r
+      current->buffer[n].dwData = DInputKeyState[disk_code];\r
+      current->buffer[n].dwTimeStamp = 10;\r
+      current->buffer[n].dwSequence = current->dinput->evsequence++;\r
+\r
+         \r
+      if (current->count == current->buffersize)\r
+                {\r
+                  current->start = ++current->start % current->buffersize;\r
+                  current->overflow = TRUE;\r
+                }\r
+              else\r
+                current->count++;\r
+              \r
+            }\r
+  }\r
+\r
+\r
+}\r
+#endif\r
+#ifndef __REACTOS__\r
+LRESULT CALLBACK KeyboardCallback( int code, WPARAM wparam, LPARAM lparam )\r
+{\r
+  TRACE("(%d,%d,%ld)\n", code, wparam, lparam);\r
+\r
+  if (code == HC_ACTION)\r
+    {\r
+      BYTE dik_code;\r
+      BOOL down;\r
+      DWORD timestamp;\r
       \r
-      EnterCriticalSection(&(current_lock->crit));\r
-      \r
-      n = (current_lock->start + current_lock->count) % current_lock->buffersize;\r
-      \r
-      current_lock->buffer[n].dwOfs = dik_code;\r
-      current_lock->buffer[n].dwData = down ? 0x80 : 0;\r
-      current_lock->buffer[n].dwTimeStamp = timestamp;\r
-      current_lock->buffer[n].dwSequence = current_lock->dinput->evsequence++;\r
-      \r
-      TRACE("Adding event at offset %d : %ld - %ld - %ld - %ld\n", n,\r
-           current_lock->buffer[n].dwOfs, current_lock->buffer[n].dwData, current_lock->buffer[n].dwTimeStamp, current_lock->buffer[n].dwSequence);\r
-      \r
-      if (current_lock->count == current_lock->buffersize) {\r
-       current_lock->start = ++current_lock->start % current_lock->buffersize;\r
-       current_lock->overflow = TRUE;\r
-      } else\r
-       current_lock->count++;\r
+      {\r
+        KBDLLHOOKSTRUCT *hook = (KBDLLHOOKSTRUCT *)lparam;\r
+        dik_code = hook->scanCode;\r
+        if (hook->flags & LLKHF_EXTENDED) dik_code |= 0x80;\r
+        down = !(hook->flags & LLKHF_UP);\r
+        timestamp = hook->time;\r
+      }\r
+\r
+      DInputKeyState[dik_code] = (down ? 0x80 : 0);\r
+      TRACE(" setting %02X to %02X\n", dik_code, DInputKeyState[dik_code]);\r
       \r
-      LeaveCriticalSection(&(current_lock->crit));\r
+      if (current != NULL)\r
+        {\r
+          if (current->hEvent)\r
+            SetEvent(current->hEvent);\r
+\r
+          if (current->buffer != NULL)\r
+            {\r
+              int n;\r
+\r
+              EnterCriticalSection(&(current->crit));\r
+\r
+              n = (current->start + current->count) % current->buffersize;\r
+\r
+              current->buffer[n].dwOfs = dik_code;\r
+              current->buffer[n].dwData = down ? 0x80 : 0;\r
+              current->buffer[n].dwTimeStamp = timestamp;\r
+              current->buffer[n].dwSequence = current->dinput->evsequence++;\r
+\r
+             TRACE("Adding event at offset %d : %ld - %ld - %ld - %ld\n", n,\r
+                   current->buffer[n].dwOfs, current->buffer[n].dwData, current->buffer[n].dwTimeStamp, current->buffer[n].dwSequence);\r
+\r
+              if (current->count == current->buffersize)\r
+                {\r
+                  current->start = ++current->start % current->buffersize;\r
+                  current->overflow = TRUE;\r
+                }\r
+              else\r
+                current->count++;\r
+\r
+              LeaveCriticalSection(&(current->crit));\r
+            }\r
+        }\r
     }\r
-  }\r
+\r
   return CallNextHookEx(keyboard_hook, code, wparam, lparam);\r
 }\r
+#endif\r
 \r
 static GUID DInput_Wine_Keyboard_GUID = { /* 0ab8648a-7735-11d2-8c73-71df54a96441 */\r
   0x0ab8648a,\r
@@ -238,25 +292,23 @@ static BOOL keyboarddev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEI
   return FALSE;\r
 }\r
 \r
-static SysKeyboardImpl *alloc_device(REFGUID rguid, LPVOID kvt, IDirectInputImpl *dinput)\r
+static SysKeyboardImpl *alloc_device_keyboard(REFGUID rguid, LPVOID kvt, IDirectInputImpl *dinput)\r
 {\r
     SysKeyboardImpl* newDevice;\r
-    DWORD kbd_users;\r
-\r
     newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysKeyboardImpl));\r
     newDevice->lpVtbl = kvt;\r
     newDevice->ref = 1;\r
     memcpy(&(newDevice->guid),rguid,sizeof(*rguid));\r
     newDevice->dinput = dinput;\r
-    InitializeCriticalSection(&(newDevice->crit));\r
 \r
+#ifndef __REACTOS__\r
     EnterCriticalSection(&keyboard_crit);\r
-    kbd_users = InterlockedIncrement(&keyboard_users);\r
-    if (1 == kbd_users) {\r
-      keyboard_hook = SetWindowsHookExW( WH_KEYBOARD_LL, KeyboardCallback, DINPUT_instance, 0 );\r
-    }\r
-    LeaveCriticalSection(&keyboard_crit);\r
 \r
+    if (!keyboard_users++)\r
+        keyboard_hook = SetWindowsHookExW( WH_KEYBOARD_LL, KeyboardCallback, DINPUT_instance, 0 );\r
+\r
+    LeaveCriticalSection(&keyboard_crit);\r
+#endif\r
     return newDevice;\r
 }\r
 \r
@@ -270,7 +322,7 @@ static HRESULT keyboarddev_create_deviceA(IDirectInputImpl *dinput, REFGUID rgui
        IsEqualGUID(&IID_IDirectInputDevice2A,riid) ||\r
        IsEqualGUID(&IID_IDirectInputDevice7A,riid) ||\r
        IsEqualGUID(&IID_IDirectInputDevice8A,riid)) {\r
-      *pdev = (IDirectInputDeviceA*) alloc_device(rguid, &SysKeyboardAvt, dinput);\r
+      *pdev = (IDirectInputDeviceA*) alloc_device_keyboard(rguid, &SysKeyboardAvt, dinput);\r
       TRACE("Creating a Keyboard device (%p)\n", *pdev);\r
       return DI_OK;\r
     } else\r
@@ -288,7 +340,7 @@ static HRESULT keyboarddev_create_deviceW(IDirectInputImpl *dinput, REFGUID rgui
        IsEqualGUID(&IID_IDirectInputDevice2W,riid) ||\r
        IsEqualGUID(&IID_IDirectInputDevice7W,riid) ||\r
        IsEqualGUID(&IID_IDirectInputDevice8W,riid)) {\r
-      *pdev = (IDirectInputDeviceW*) alloc_device(rguid, &SysKeyboardWvt, dinput);\r
+      *pdev = (IDirectInputDeviceW*) alloc_device_keyboard(rguid, &SysKeyboardWvt, dinput);\r
       TRACE("Creating a Keyboard device (%p)\n", *pdev);\r
       return DI_OK;\r
     } else\r
@@ -297,7 +349,8 @@ static HRESULT keyboarddev_create_deviceW(IDirectInputImpl *dinput, REFGUID rgui
   return DIERR_DEVICENOTREG;\r
 }\r
 \r
-const struct dinput_device keyboard_device = {\r
+dinput_device keyboarddev = {\r
+  100,\r
   "Wine keyboard driver",\r
   keyboarddev_enum_deviceA,\r
   keyboarddev_enum_deviceW,\r
@@ -305,23 +358,30 @@ const struct dinput_device keyboard_device = {
   keyboarddev_create_deviceW\r
 };\r
 \r
+void scan_keyboard()\r
+{\r
+    dinput_register_device(&keyboarddev);\r
+}\r
+\r
+DECL_GLOBAL_CONSTRUCTOR(keyboarddev_register) { dinput_register_device(&keyboarddev); }\r
+\r
 static ULONG WINAPI SysKeyboardAImpl_Release(LPDIRECTINPUTDEVICE8A iface)\r
 {\r
        SysKeyboardImpl *This = (SysKeyboardImpl *)iface;\r
        ULONG ref;\r
-       DWORD kbd_users;\r
 \r
        ref = InterlockedDecrement(&(This->ref));\r
        if (ref)\r
                return ref;\r
 \r
-       EnterCriticalSection(&keyboard_crit);   \r
-       kbd_users = InterlockedDecrement(&keyboard_users);\r
-       if (0 == kbd_users) {\r
+#ifndef __REACTOS__\r
+       EnterCriticalSection(&keyboard_crit);\r
+       if (!--keyboard_users) {\r
            UnhookWindowsHookEx( keyboard_hook );\r
            keyboard_hook = 0;\r
        }\r
        LeaveCriticalSection(&keyboard_crit);\r
+#endif\r
 \r
        /* Free the data queue */\r
        HeapFree(GetProcessHeap(),0,This->buffer);\r
@@ -363,64 +423,33 @@ static HRESULT WINAPI SysKeyboardAImpl_SetProperty(
        return DI_OK;\r
 }\r
 \r
-static HRESULT WINAPI SysKeyboardAImpl_GetProperty(\r
-       LPDIRECTINPUTDEVICE8A iface,REFGUID rguid,LPDIPROPHEADER ph\r
-)\r
-{\r
-       SysKeyboardImpl *This = (SysKeyboardImpl *)iface;\r
-\r
-       TRACE("(this=%p,%s,%p)\n",This,debugstr_guid(rguid),ph);\r
-       TRACE("(size=%ld,headersize=%ld,obj=%ld,how=%ld\n",\r
-            ph->dwSize,ph->dwHeaderSize,ph->dwObj,ph->dwHow);\r
-       if (!HIWORD(rguid)) {\r
-               switch ((DWORD)rguid) {\r
-               case (DWORD) DIPROP_BUFFERSIZE: {\r
-                       LPDIPROPDWORD   pd = (LPDIPROPDWORD)ph;\r
-\r
-                       TRACE("(buffersize=%ld)\n",pd->dwData);\r
-\r
-                        if (This->acquired)\r
-                           return DIERR_INVALIDPARAM;\r
-\r
-                        pd->dwData = This->buffersize;\r
-\r
-                       break;\r
-               }\r
-               default:\r
-                       WARN("Unknown type %ld\n",(DWORD)rguid);\r
-                       break;\r
-               }\r
-       }\r
-       return DI_OK;\r
-}\r
 \r
 static HRESULT WINAPI SysKeyboardAImpl_GetDeviceState(\r
        LPDIRECTINPUTDEVICE8A iface,DWORD len,LPVOID ptr\r
 )\r
 {\r
-    SysKeyboardImpl *This = (SysKeyboardImpl *)iface;\r
-    TRACE("(%p)->(%ld,%p)\n", This, len, ptr);\r
+    TRACE("(%p)->(%ld,%p)\n", iface, len, ptr);\r
+       \r
+#ifdef __REACTOS__\r
+       reactos_input_keyboard();\r
+#endif\r
 \r
     /* Note: device does not need to be acquired */\r
-    if (len != WINE_DINPUT_KEYBOARD_MAX_KEYS)\r
+    if (len != 256)\r
       return DIERR_INVALIDPARAM;\r
 \r
-    MsgWaitForMultipleObjectsEx(0, NULL, 0, QS_ALLINPUT, 0);\r
-\r
-    EnterCriticalSection(&(This->crit));\r
+    MsgWaitForMultipleObjectsEx(0, NULL, 0, 0, 0);\r
 \r
     if (TRACE_ON(dinput)) {\r
        int i;\r
-       for (i = 0; i < WINE_DINPUT_KEYBOARD_MAX_KEYS; i++) {\r
+       for (i = 0; i < 256; i++) {\r
            if (DInputKeyState[i] != 0x00) {\r
                TRACE(" - %02X: %02x\n", i, DInputKeyState[i]);\r
            }\r
        }\r
     }\r
     \r
-    memcpy(ptr, DInputKeyState, WINE_DINPUT_KEYBOARD_MAX_KEYS);\r
-    LeaveCriticalSection(&(This->crit));\r
-\r
+    memcpy(ptr, DInputKeyState, 256);\r
     return DI_OK;\r
 }\r
 \r
@@ -429,8 +458,12 @@ static HRESULT WINAPI SysKeyboardAImpl_GetDeviceData(
        LPDWORD entries,DWORD flags\r
 )\r
 {\r
+       \r
        SysKeyboardImpl *This = (SysKeyboardImpl *)iface;\r
        int ret = DI_OK, i = 0;\r
+#ifdef __REACTOS__\r
+     reactos_input_keyboard();\r
+#endif\r
 \r
        TRACE("(this=%p,%ld,%p,%p(%ld)),0x%08lx)\n",\r
              This,dodsize,dod,entries,entries?*entries:0,flags);\r
@@ -444,7 +477,7 @@ static HRESULT WINAPI SysKeyboardAImpl_GetDeviceData(
         if (dodsize < sizeof(DIDEVICEOBJECTDATA_DX3))\r
           return DIERR_INVALIDPARAM;\r
 \r
-        MsgWaitForMultipleObjectsEx(0, NULL, 0, QS_ALLINPUT, 0);\r
+        MsgWaitForMultipleObjectsEx(0, NULL, 0, 0, 0);\r
 \r
         EnterCriticalSection(&(This->crit));\r
 \r
@@ -505,7 +538,7 @@ static HRESULT WINAPI SysKeyboardAImpl_EnumObjects(
     memset(&ddoi, 0, sizeof(ddoi));\r
     ddoi.dwSize = FIELD_OFFSET(DIDEVICEOBJECTINSTANCEA, dwFFMaxForce);\r
 \r
-    for (i = 0; i < WINE_DINPUT_KEYBOARD_MAX_KEYS; i++) {\r
+    for (i = 0; i < 256; i++) {\r
         /* Report 255 keys :-) */\r
         ddoi.guidType = GUID_Key;\r
        ddoi.dwOfs = i;\r
@@ -546,24 +579,26 @@ static HRESULT WINAPI SysKeyboardAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
 \r
         This->acquired = 1;\r
 \r
-        if (current_lock != NULL) {\r
-         FIXME("Not more than one keyboard can be acquired at the same time.\n");\r
-         SysKeyboardAImpl_Unacquire(iface);\r
-       }\r
-       \r
-        current_lock = This;\r
-\r
-        if (This->buffersize > 0) {\r
-         This->buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,\r
-                                  This->buffersize * sizeof(*(This->buffer)));\r
-         This->start = 0;\r
-         This->count = 0;\r
-         This->overflow = FALSE;\r
-       } else {\r
+        if (current != NULL)\r
+          {\r
+            FIXME("Not more than one keyboard can be acquired at the same time.\n");\r
+            SysKeyboardAImpl_Unacquire(iface);\r
+          }\r
+\r
+        current = This;\r
+\r
+        if (This->buffersize > 0)\r
+          {\r
+            This->buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,\r
+                                     This->buffersize * sizeof(*(This->buffer)));\r
+            This->start = 0;\r
+            This->count = 0;\r
+            This->overflow = FALSE;\r
+            InitializeCriticalSection(&(This->crit));\r
+          }\r
+        else\r
           This->buffer = NULL;\r
-       }\r
 \r
-       /*keyboard_hook = SetWindowsHookExW( WH_KEYBOARD_LL, KeyboardCallback, DINPUT_instance, 0 );*/\r
 \r
        return DI_OK;\r
 }\r
@@ -576,19 +611,19 @@ static HRESULT WINAPI SysKeyboardAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface)
         if (This->acquired == 0)\r
           return DI_NOEFFECT;\r
 \r
-       /* No more locks */\r
-        if (current_lock == This)\r
-          current_lock = NULL;\r
+        if (current == This)\r
+          current = NULL;\r
         else\r
-          ERR("this != current_lock\n");\r
+          ERR("this != current\n");\r
 \r
-       /* Unacquire device */\r
         This->acquired = 0;\r
 \r
-        if (This->buffersize >= 0) {\r
-         HeapFree(GetProcessHeap(), 0, This->buffer);\r
-         This->buffer = NULL;\r
-       }\r
+        if (This->buffersize >= 0)\r
+          {\r
+            HeapFree(GetProcessHeap(), 0, This->buffer);\r
+            This->buffer = NULL;\r
+            DeleteCriticalSection(&(This->crit));\r
+          }\r
 \r
        return DI_OK;\r
 }\r
@@ -627,7 +662,7 @@ static HRESULT WINAPI SysKeyboardAImpl_GetCapabilities(
     else\r
        devcaps.dwDevType = DIDEVTYPE_KEYBOARD | (DIDEVTYPEKEYBOARD_UNKNOWN << 8);\r
     devcaps.dwAxes = 0;\r
-    devcaps.dwButtons = WINE_DINPUT_KEYBOARD_MAX_KEYS;\r
+    devcaps.dwButtons = 256;\r
     devcaps.dwPOVs = 0;\r
     devcaps.dwFFSamplePeriod = 0;\r
     devcaps.dwFFMinTimeResolution = 0;\r
@@ -723,7 +758,7 @@ static HRESULT WINAPI SysKeyboardAImpl_GetDeviceInfo(
     TRACE("(this=%p,%p)\n", This, pdidi);\r
 \r
     if (pdidi->dwSize != sizeof(DIDEVICEINSTANCEA)) {\r
-        WARN(" dinput3 not supported yet...\n");\r
+        WARN(" dinput3 not supporte yet...\n");\r
        return DI_OK;\r
     }\r
 \r
@@ -738,7 +773,7 @@ static HRESULT WINAPI SysKeyboardWImpl_GetDeviceInfo(LPDIRECTINPUTDEVICE8W iface
     TRACE("(this=%p,%p)\n", This, pdidi);\r
 \r
     if (pdidi->dwSize != sizeof(DIDEVICEINSTANCEW)) {\r
-        WARN(" dinput3 not supported yet...\n");\r
+        WARN(" dinput3 not supporte yet...\n");\r
        return DI_OK;\r
     }\r
 \r
@@ -754,7 +789,7 @@ static IDirectInputDevice8AVtbl SysKeyboardAvt =
        SysKeyboardAImpl_Release,\r
        SysKeyboardAImpl_GetCapabilities,\r
        SysKeyboardAImpl_EnumObjects,\r
-       SysKeyboardAImpl_GetProperty,\r
+       IDirectInputDevice2AImpl_GetProperty,\r
        SysKeyboardAImpl_SetProperty,\r
        SysKeyboardAImpl_Acquire,\r
        SysKeyboardAImpl_Unacquire,\r
@@ -796,7 +831,7 @@ static IDirectInputDevice8WVtbl SysKeyboardWvt =
        XCAST(Release)SysKeyboardAImpl_Release,\r
        XCAST(GetCapabilities)SysKeyboardAImpl_GetCapabilities,\r
        SysKeyboardWImpl_EnumObjects,\r
-       XCAST(GetProperty)SysKeyboardAImpl_GetProperty,\r
+       XCAST(GetProperty)IDirectInputDevice2AImpl_GetProperty,\r
        XCAST(SetProperty)SysKeyboardAImpl_SetProperty,\r
        XCAST(Acquire)SysKeyboardAImpl_Acquire,\r
        XCAST(Unacquire)SysKeyboardAImpl_Unacquire,\r
index aa5a50a..104951c 100644 (file)
@@ -41,6 +41,7 @@
 \r
 WINE_DEFAULT_DEBUG_CHANNEL(dinput);\r
 \r
+\r
 /* Wine mouse driver object instances */\r
 #define WINE_MOUSE_X_AXIS_INSTANCE   0\r
 #define WINE_MOUSE_Y_AXIS_INSTANCE   1\r
@@ -256,15 +257,15 @@ static SysMouseImpl *alloc_device_mouse(REFGUID rguid, LPVOID mvt, IDirectInputI
     newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(SysMouseImpl));\r
     newDevice->ref = 1;\r
     newDevice->lpVtbl = mvt;\r
-\r
+#ifndef __REACTOS__\r
     InitializeCriticalSection(&(newDevice->crit));\r
-\r
+#endif\r
     memcpy(&(newDevice->guid),rguid,sizeof(*rguid));\r
 \r
     /* Per default, Wine uses its internal data format */\r
     newDevice->df = (DIDATAFORMAT *) &Wine_InternalMouseFormat;\r
     memcpy(newDevice->offset_array, offset_array, WINE_INTERNALMOUSE_NUM_OBJS * sizeof(int));\r
-    newDevice->wine_df = HeapAlloc(GetProcessHeap(), 0, sizeof(DataFormat));\r
+    newDevice->wine_df = (DataFormat *) HeapAlloc(GetProcessHeap(), 0, sizeof(DataFormat));\r
     newDevice->wine_df->size = 0;\r
     newDevice->wine_df->internal_format_size = Wine_InternalMouseFormat.dwDataSize;\r
     newDevice->wine_df->dt = NULL;\r
@@ -311,7 +312,8 @@ static HRESULT mousedev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid,
     return DIERR_DEVICENOTREG;\r
 }\r
 \r
-const struct dinput_device mouse_device = {\r
+static dinput_device mousedev = {\r
+    100,\r
     "Wine mouse driver",\r
     mousedev_enum_deviceA,\r
     mousedev_enum_deviceW,\r
@@ -319,6 +321,15 @@ const struct dinput_device mouse_device = {
     mousedev_create_deviceW\r
 };\r
 \r
+#ifdef __REACTOS__\r
+void scan_mouse()\r
+{\r
+    dinput_register_device(&mousedev);\r
+}\r
+\r
+DECL_GLOBAL_CONSTRUCTOR(mousedev_register) { dinput_register_device(&mousedev); }\r
+#endif\r
+\r
 /******************************************************************************\r
  *     SysMouseA (DInput Mouse support)\r
  */\r
@@ -344,10 +355,11 @@ static ULONG WINAPI SysMouseAImpl_Release(LPDIRECTINPUTDEVICE8A iface)
        if (This->dwCoopLevel & DISCL_EXCLUSIVE)\r
             ShowCursor(TRUE); /* show cursor */\r
     }\r
+#ifndef __REACTOS__\r
     DeleteCriticalSection(&(This->crit));\r
+#endif\r
 \r
-\r
-    /* Free the DataFormat */\r
+       /* Free the DataFormat */\r
     if (This->df != &(Wine_InternalMouseFormat)) {\r
        HeapFree(GetProcessHeap(), 0, This->df->rgodf);\r
        HeapFree(GetProcessHeap(), 0, This->df);\r
@@ -431,16 +443,18 @@ static LRESULT CALLBACK dinput_mouse_hook( int code, WPARAM wparam, LPARAM lpara
 \r
     if (code != HC_ACTION) return CallNextHookEx( This->hook, code, wparam, lparam );\r
 \r
+#ifndef __REACTOS__\r
     EnterCriticalSection(&(This->crit));\r
+#endif\r
+\r
     dwCoop = This->dwCoopLevel;\r
 \r
     /* Only allow mouse events every 10 ms.\r
      * This is to allow the cursor to start acceleration before\r
      * the warps happen. But if it involves a mouse button event we\r
      * allow it since we don't want to lose the clicks.\r
-        * in reactos 1ms instead for 10ms\r
      */\r
-    if (((GetCurrentTime() - last_event) < 1)\r
+    if (((GetCurrentTime() - last_event) < 10)\r
         && wparam == WM_MOUSEMOVE)\r
        goto end;\r
     else last_event = GetCurrentTime();\r
@@ -549,7 +563,9 @@ static LRESULT CALLBACK dinput_mouse_hook( int code, WPARAM wparam, LPARAM lpara
          This->m_state.rgbButtons[0], This->m_state.rgbButtons[2], This->m_state.rgbButtons[1]);\r
     \r
   end:\r
+#ifndef __REACTOS__\r
     LeaveCriticalSection(&(This->crit));\r
+#endif\r
     \r
     if (dwCoop & DISCL_NONEXCLUSIVE) {\r
        /* Pass the events down to previous handlers (e.g. win32 input) */\r
@@ -579,72 +595,73 @@ static void dinput_window_check(SysMouseImpl* This) {
     MapWindowPoints(This->win, HWND_DESKTOP, &This->mapped_center, 1);\r
 }\r
 \r
-#ifdef __REACTOS__  \r
-int poll_mouse=0;\r
-#endif\r
+\r
 /******************************************************************************\r
   *     Acquire : gets exclusive control of the mouse\r
   */\r
 static HRESULT WINAPI SysMouseAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)\r
 {\r
     SysMouseImpl *This = (SysMouseImpl *)iface;\r
-    RECT  rect;\r
-    POINT point;\r
+    RECT       rect;\r
     \r
     TRACE("(this=%p)\n",This);\r
     \r
-    if (This->acquired)\r
-      return S_FALSE;\r
-    \r
-    This->acquired = 1;\r
-\r
-    /* Store (in a global variable) the current lock */\r
-    current_lock = (IDirectInputDevice8A*)This;\r
-    \r
-    /* Init the mouse state */\r
-    GetCursorPos( &point );\r
-    if (This->absolute) {\r
-      This->m_state.lX = point.x;\r
-      This->m_state.lY = point.y;\r
-      This->prevX = point.x;\r
-      This->prevY = point.y;\r
-    } else {\r
-      This->m_state.lX = 0;\r
-      This->m_state.lY = 0;\r
-      This->org_coords = point;\r
-    }\r
-    This->m_state.lZ = 0;\r
-    This->m_state.rgbButtons[0] = ((GetKeyState(VK_LBUTTON) & 0x80) ? 0xFF : 0x00);\r
-    This->m_state.rgbButtons[1] = ((GetKeyState(VK_RBUTTON) & 0x80) ? 0xFF : 0x00);\r
-    This->m_state.rgbButtons[2] = ((GetKeyState(VK_MBUTTON) & 0x80) ? 0xFF : 0x00);\r
-    \r
-    /* Install our mouse hook */\r
-    if (This->dwCoopLevel & DISCL_EXCLUSIVE)\r
-      ShowCursor(FALSE); /* hide cursor */\r
+       \r
 \r
-    This->hook = SetWindowsHookExA( WH_MOUSE_LL, dinput_mouse_hook, DINPUT_instance, 0 );\r
+    if (This->acquired == 0) {\r
+       POINT point;\r
+       \r
+       \r
 \r
-    /* Get the window dimension and find the center */    \r
-       GetWindowRect(This->win, &rect);\r
-    This->win_centerX = (rect.right  - rect.left) / 2;\r
-    This->win_centerY = (rect.bottom - rect.top ) / 2;\r
+       /* Store (in a global variable) the current lock */\r
+       current_lock = (IDirectInputDevice8A*)This;\r
+       \r
+       /* Init the mouse state */\r
+       GetCursorPos( &point );\r
+       if (This->absolute) {\r
+           This->m_state.lX = point.x;\r
+           This->m_state.lY = point.y;\r
+           This->prevX = point.x;\r
+           This->prevY = point.y;\r
+       } else {\r
+           This->m_state.lX = 0;\r
+           This->m_state.lY = 0;\r
+           This->org_coords = point;\r
+       }\r
+       This->m_state.lZ = 0;\r
+       This->m_state.rgbButtons[0] = ((GetKeyState(VK_LBUTTON) & 0x80) ? 0xFF : 0x00);\r
+       This->m_state.rgbButtons[1] = ((GetKeyState(VK_RBUTTON) & 0x80) ? 0xFF : 0x00);\r
+       This->m_state.rgbButtons[2] = ((GetKeyState(VK_MBUTTON) & 0x80) ? 0xFF : 0x00);\r
+       \r
+       /* Install our mouse hook */\r
+       if (This->dwCoopLevel & DISCL_EXCLUSIVE)\r
+           ShowCursor(FALSE); /* hide cursor */\r
 \r
+       This->hook = SetWindowsHookExA( WH_MOUSE_LL, dinput_mouse_hook, DINPUT_instance, 0 );\r
 \r
-    /* Warp the mouse to the center of the window */\r
-    if (This->absolute == 0) {\r
-      This->mapped_center.x = This->win_centerX;\r
-      This->mapped_center.y = This->win_centerY;\r
-      MapWindowPoints(This->win, HWND_DESKTOP, &This->mapped_center, 1);\r
-      TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y);\r
-      SetCursorPos( This->mapped_center.x, This->mapped_center.y );\r
+       /* Get the window dimension and find the center */\r
+       GetWindowRect(This->win, &rect);\r
+       This->win_centerX = (rect.right  - rect.left) / 2;\r
+       This->win_centerY = (rect.bottom - rect.top ) / 2;\r
+       \r
+       /* Warp the mouse to the center of the window */\r
+       if (This->absolute == 0) {\r
+           This->mapped_center.x = This->win_centerX;\r
+           This->mapped_center.y = This->win_centerY;\r
+           MapWindowPoints(This->win, HWND_DESKTOP, &This->mapped_center, 1);\r
+           TRACE("Warping mouse to %ld - %ld\n", This->mapped_center.x, This->mapped_center.y);\r
+           SetCursorPos( This->mapped_center.x, This->mapped_center.y );\r
 #ifdef MOUSE_HACK\r
-      This->need_warp = WARP_DONE;\r
+           This->need_warp = WARP_DONE;\r
 #else\r
-      This->need_warp = WARP_STARTED;\r
+           This->need_warp = WARP_STARTED;\r
 #endif\r
-    }\r
+       }\r
        \r
-    return DI_OK;\r
+       This->acquired = 1;\r
+       return DI_OK;\r
+    }\r
+    return S_FALSE;\r
 }\r
 \r
 /******************************************************************************\r
@@ -656,33 +673,31 @@ static HRESULT WINAPI SysMouseAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface)
     \r
     TRACE("(this=%p)\n",This);\r
     \r
-    if (0 == This->acquired) {\r
-       return DI_NOEFFECT;\r
-    }\r
+    if (This->acquired) {\r
+       /* Reinstall previous mouse event handler */\r
 \r
-    /* Reinstall previous mouse event handler */\r
-    if (This->hook) {\r
 \r
-      UnhookWindowsHookEx( This->hook );\r
-      This->hook = 0;\r
-      \r
-      if (This->dwCoopLevel & DISCL_EXCLUSIVE)\r
-       ShowCursor(TRUE); /* show cursor */\r
-    }\r
+       if (This->hook) {\r
+           UnhookWindowsHookEx( This->hook );\r
+           This->hook = 0;\r
+\r
+           if (This->dwCoopLevel & DISCL_EXCLUSIVE)\r
+               ShowCursor(TRUE); /* show cursor */\r
+        }\r
+\r
+        /* No more locks */\r
+        current_lock = NULL;\r
        \r
-    /* No more locks */\r
-    if (current_lock == (IDirectInputDevice8A*) This)\r
-      current_lock = NULL;\r
-    else\r
-      ERR("this(%p) != current_lock(%p)\n", This, current_lock);\r
+        /* Unacquire device */\r
+        This->acquired = 0;\r
 \r
-    /* Unacquire device */\r
-    This->acquired = 0;\r
-    \r
-    /* And put the mouse cursor back where it was at acquire time */\r
-    if (This->absolute == 0) {\r
-      TRACE(" warping mouse back to (%ld , %ld)\n", This->org_coords.x, This->org_coords.y);\r
-      SetCursorPos(This->org_coords.x, This->org_coords.y);\r
+       /* And put the mouse cursor back where it was at acquire time */\r
+       if (This->absolute == 0) {\r
+           TRACE(" warping mouse back to (%ld , %ld)\n", This->org_coords.x, This->org_coords.y);\r
+           SetCursorPos(This->org_coords.x, This->org_coords.y);\r
+       }\r
+    } else {\r
+       return DI_NOEFFECT;\r
     }\r
        \r
     return DI_OK;\r
@@ -690,25 +705,70 @@ static HRESULT WINAPI SysMouseAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface)
 \r
 // if you call poll then to getdevicestate\r
 // it did not send back right value in windows \r
+int poll_mouse=0;\r
 \r
+#ifdef __REACTOS__\r
+void getmousesvalue(LPDIRECTINPUTDEVICE8A iface);\r
+int filp=0;\r
+void getmousesvalue(LPDIRECTINPUTDEVICE8A iface)\r
+{\r
+       static long last_event = 0;\r
+\r
+    POINT point;\r
+       SysMouseImpl *This = (SysMouseImpl *)iface;        \r
 \r
+       This->m_state.rgbButtons[0] =  ((GetKeyState(VK_LBUTTON) & 0x80) ? 0xFF : 0x00);        \r
+       This->m_state.rgbButtons[1] =  ((GetKeyState(VK_RBUTTON) & 0x80) ? 0xFF : 0x00);        \r
+       This->m_state.rgbButtons[2] =  ((GetKeyState(VK_MBUTTON) & 0x80) ? 0xFF : 0x00);        \r
+       This->m_state.rgbButtons[3] =  ((GetKeyState(VK_XBUTTON1) & 0x80) ? 0xFF : 0x00);       \r
+       This->m_state.rgbButtons[4] =  ((GetKeyState(VK_XBUTTON2) & 0x80) ? 0xFF : 0x00);       \r
+\r
+    \r
+       \r
\r
+       if (poll_mouse==1) filp=0;\r
+       if (filp==2) filp=0;\r
+       if (filp==0) {\r
+                  GetCursorPos( &point );      \r
+               \r
+       if (This->prevX == point.x) This->m_state.lX = 0;\r
+       else {\r
+          This->prevX = point.x;\r
+          This->m_state.lX = point.x - This->org_coords.x; \r
+             } \r
+\r
+       if (This->prevY == point.y) This->m_state.lY = 0;\r
+       else {\r
+         This->prevY = point.y;\r
+          This->m_state.lY = point.y - This->org_coords.y; \r
+           } \r
+\r
+       }\r
+       else \r
+       {\r
+        This->m_state.lX = 0;\r
+     This->m_state.lY = 0;      \r
+       }\r
+    filp++;\r
+    \r
+// check see if buffer have been set\r
+\r
+}\r
+\r
+#endif\r
 \r
-/* wine does not implement poll but we do, this is from GDI patch from the mouse */\r
 static HRESULT WINAPI SysMouseAImpl_Poll(LPDIRECTINPUTDEVICE8A iface)\r
 {\r
  int retValue = DI_OK;\r
-\r
  \r
 SysMouseImpl *This = (SysMouseImpl *)iface;           \r
-\r
-\r
- if (poll_mouse==0) {                                                                   \r
+ if (poll_mouse==0) {\r
+                        retValue=SysMouseAImpl_Acquire(iface); \r
                      poll_mouse=1; \r
-                                        retValue=SysMouseAImpl_Acquire(iface);\r
                                         if (retValue!=DI_OK) retValue=DIERR_NOTACQUIRED;\r
                      else retValue = DI_OK;\r
                      }\r
\r
+\r
  return retValue;\r
 }\r
        \r
@@ -725,15 +785,16 @@ static HRESULT WINAPI SysMouseAImpl_GetDeviceState(
     SysMouseImpl *This = (SysMouseImpl *)iface;        \r
     POINT point;        \r
 \r
+#ifndef __REACTOS__\r
     EnterCriticalSection(&(This->crit));\r
-\r
+#endif\r
 \r
     TRACE("(this=%p,0x%08lx,%p): \n",This,len,ptr);\r
        \r
     /* Copy the current mouse state */    \r
     fill_DataFormat(ptr, &(This->m_state), This->wine_df);\r
 \r
-\r
+#ifdef __REACTOS__\r
        // this fix windows bugs when \r
        // some program calling on mouse poll\r
        if (poll_mouse==1) poll_mouse=0;                 \r
@@ -744,7 +805,7 @@ static HRESULT WINAPI SysMouseAImpl_GetDeviceState(
                               This->m_state.lZ = 0;\r
                               } \r
             }\r
-       \r
+#endif \r
        \r
     /* Check if we need to do a mouse warping */\r
     if (This->need_warp == WARP_NEEDED) {\r
@@ -762,9 +823,9 @@ static HRESULT WINAPI SysMouseAImpl_GetDeviceState(
 #endif\r
     }\r
 \r
-\r
+#ifndef __REACTOS__\r
     LeaveCriticalSection(&(This->crit));\r
-\r
+#endif\r
 \r
     TRACE("(X: %ld - Y: %ld - Z: %ld  L: %02x M: %02x R: %02x)\n",\r
          This->m_state.lX, This->m_state.lY, This->m_state.lZ,\r
@@ -790,21 +851,30 @@ static HRESULT WINAPI SysMouseAImpl_GetDeviceData(LPDIRECTINPUTDEVICE8A iface,
 \r
     \r
     TRACE("(%p)->(dods=%ld,entries=%ld,fl=0x%08lx)\n",This,dodsize,*entries,flags);\r
-       \r
+        \r
+\r
   if (This->acquired == 0) {\r
        WARN(" application tries to get data from an unacquired device !\n");\r
-       return DIERR_NOTACQUIRED;\r
+       //return DIERR_NOTACQUIRED;\r
 \r
        // windows does not get any data if \r
        // we do not call manual to mouse Acquire\r
        // this is only need if some apps calling on getdevice data direcly\r
        // in windows GetdeviceData does always update first the data\r
        // then return it.\r
+        SysMouseAImpl_Acquire(iface);\r
        }\r
        \r
-    EnterCriticalSection(&(This->crit));\r
+    \r
+\r
+   \r
 \r
 \r
+\r
+#ifndef __REACTOS__\r
+    EnterCriticalSection(&(This->crit));\r
+#endif\r
+\r
        // FIXME mouse are bit choppy here. \r
 \r
     len = ((This->queue_head < This->queue_tail) ? This->queue_len : 0)\r
@@ -846,9 +916,9 @@ static HRESULT WINAPI SysMouseAImpl_GetDeviceData(LPDIRECTINPUTDEVICE8A iface,
     }\r
     if (!(flags & DIGDD_PEEK))\r
        This->queue_tail = nqtail;\r
-\r
+#ifndef __REACTOS__\r
     LeaveCriticalSection(&(This->crit));\r
-\r
+#endif\r
     /* Check if we need to do a mouse warping */\r
    \r
 \r
@@ -865,8 +935,7 @@ static HRESULT WINAPI SysMouseAImpl_GetDeviceData(LPDIRECTINPUTDEVICE8A iface,
 #else\r
        This->need_warp = WARP_STARTED;\r
 #endif\r
-    }\r
-\r
+    }    \r
     return DI_OK;\r
 }\r
 \r
@@ -888,7 +957,8 @@ static HRESULT WINAPI SysMouseAImpl_SetProperty(LPDIRECTINPUTDEVICE8A iface,
                \r
                TRACE("buffersize = %ld\n",pd->dwData);\r
                \r
-               This->data_queue = HeapAlloc(GetProcessHeap(),0, pd->dwData * sizeof(DIDEVICEOBJECTDATA));\r
+               This->data_queue = (LPDIDEVICEOBJECTDATA)HeapAlloc(GetProcessHeap(),0,\r
+                                                                  pd->dwData * sizeof(DIDEVICEOBJECTDATA));\r
                This->queue_head = 0;\r
                This->queue_tail = 0;\r
                This->queue_len  = pd->dwData;\r
@@ -919,7 +989,7 @@ static HRESULT WINAPI SysMouseAImpl_GetProperty(LPDIRECTINPUTDEVICE8A iface,
 {\r
     SysMouseImpl *This = (SysMouseImpl *)iface;\r
     \r
-    TRACE("(this=%p,%s,%p)\n",\r
+    TRACE("(this=%p,%s,%p): stub!\n",\r
          iface, debugstr_guid(rguid), pdiph);\r
     \r
     if (TRACE_ON(dinput))\r