Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
1cda1509
Commit
1cda1509
authored
Mar 20, 2023
by
Rémi Bernon
Committed by
Alexandre Julliard
Mar 20, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dinput: Pass additional information to enum_object callback.
parent
1e594b1c
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
59 additions
and
33 deletions
+59
-33
device.c
dlls/dinput/device.c
+35
-16
device_private.h
dlls/dinput/device_private.h
+7
-1
joystick_hid.c
dlls/dinput/joystick_hid.c
+0
-0
keyboard.c
dlls/dinput/keyboard.c
+9
-9
mouse.c
dlls/dinput/mouse.c
+8
-7
No files found.
dlls/dinput/device.c
View file @
1cda1509
...
...
@@ -792,8 +792,22 @@ static ULONG WINAPI dinput_device_AddRef( IDirectInputDevice8W *iface )
return
ref
;
}
static
HRESULT
WINAPI
dinput_device_EnumObjects
(
IDirectInputDevice8W
*
iface
,
LPDIENUMDEVICEOBJECTSCALLBACKW
callback
,
struct
enum_objects_params
{
LPDIENUMDEVICEOBJECTSCALLBACKW
callback
;
void
*
context
;
};
static
BOOL
enum_objects_callback
(
struct
dinput_device
*
impl
,
UINT
index
,
struct
hid_value_caps
*
caps
,
const
DIDEVICEOBJECTINSTANCEW
*
instance
,
void
*
data
)
{
struct
enum_objects_params
*
params
=
data
;
if
(
instance
->
wUsagePage
==
HID_USAGE_PAGE_PID
&&
!
(
instance
->
dwType
&
DIDFT_NODATA
))
return
DIENUM_CONTINUE
;
return
params
->
callback
(
instance
,
params
->
context
);
}
static
HRESULT
WINAPI
dinput_device_EnumObjects
(
IDirectInputDevice8W
*
iface
,
LPDIENUMDEVICEOBJECTSCALLBACKW
callback
,
void
*
context
,
DWORD
flags
)
{
static
const
DIPROPHEADER
filter
=
...
...
@@ -802,6 +816,7 @@ static HRESULT WINAPI dinput_device_EnumObjects( IDirectInputDevice8W *iface,
.
dwHeaderSize
=
sizeof
(
filter
),
.
dwHow
=
DIPH_DEVICE
,
};
struct
enum_objects_params
params
=
{.
callback
=
callback
,
.
context
=
context
};
struct
dinput_device
*
impl
=
impl_from_IDirectInputDevice8W
(
iface
);
HRESULT
hr
;
...
...
@@ -813,25 +828,25 @@ static HRESULT WINAPI dinput_device_EnumObjects( IDirectInputDevice8W *iface,
if
(
flags
==
DIDFT_ALL
||
(
flags
&
DIDFT_AXIS
))
{
hr
=
impl
->
vtbl
->
enum_objects
(
iface
,
&
filter
,
DIDFT_AXIS
,
callback
,
context
);
hr
=
impl
->
vtbl
->
enum_objects
(
iface
,
&
filter
,
DIDFT_AXIS
,
enum_objects_callback
,
&
params
);
if
(
FAILED
(
hr
))
return
hr
;
if
(
hr
!=
DIENUM_CONTINUE
)
return
DI_OK
;
}
if
(
flags
==
DIDFT_ALL
||
(
flags
&
DIDFT_POV
))
{
hr
=
impl
->
vtbl
->
enum_objects
(
iface
,
&
filter
,
DIDFT_POV
,
callback
,
context
);
hr
=
impl
->
vtbl
->
enum_objects
(
iface
,
&
filter
,
DIDFT_POV
,
enum_objects_callback
,
&
params
);
if
(
FAILED
(
hr
))
return
hr
;
if
(
hr
!=
DIENUM_CONTINUE
)
return
DI_OK
;
}
if
(
flags
==
DIDFT_ALL
||
(
flags
&
DIDFT_BUTTON
))
{
hr
=
impl
->
vtbl
->
enum_objects
(
iface
,
&
filter
,
DIDFT_BUTTON
,
callback
,
context
);
hr
=
impl
->
vtbl
->
enum_objects
(
iface
,
&
filter
,
DIDFT_BUTTON
,
enum_objects_callback
,
&
params
);
if
(
FAILED
(
hr
))
return
hr
;
if
(
hr
!=
DIENUM_CONTINUE
)
return
DI_OK
;
}
if
(
flags
==
DIDFT_ALL
||
(
flags
&
(
DIDFT_NODATA
|
DIDFT_COLLECTION
)))
{
hr
=
impl
->
vtbl
->
enum_objects
(
iface
,
&
filter
,
DIDFT_NODATA
,
callback
,
context
);
hr
=
impl
->
vtbl
->
enum_objects
(
iface
,
&
filter
,
DIDFT_NODATA
,
enum_objects_callback
,
&
params
);
if
(
FAILED
(
hr
))
return
hr
;
if
(
hr
!=
DIENUM_CONTINUE
)
return
DI_OK
;
}
...
...
@@ -1045,9 +1060,10 @@ static HRESULT check_property( struct dinput_device *impl, const GUID *guid, con
return
DI_OK
;
}
static
BOOL
CALLBACK
find_object
(
const
DIDEVICEOBJECTINSTANCEW
*
instance
,
void
*
context
)
static
BOOL
find_object
(
struct
dinput_device
*
device
,
UINT
index
,
struct
hid_value_caps
*
caps
,
const
DIDEVICEOBJECTINSTANCEW
*
instance
,
void
*
data
)
{
*
(
DIDEVICEOBJECTINSTANCEW
*
)
context
=
*
instance
;
*
(
DIDEVICEOBJECTINSTANCEW
*
)
data
=
*
instance
;
return
DIENUM_STOP
;
}
...
...
@@ -1058,7 +1074,8 @@ struct get_object_property_params
DWORD
property
;
};
static
BOOL
CALLBACK
get_object_property
(
const
DIDEVICEOBJECTINSTANCEW
*
instance
,
void
*
context
)
static
BOOL
get_object_property
(
struct
dinput_device
*
device
,
UINT
index
,
struct
hid_value_caps
*
caps
,
const
DIDEVICEOBJECTINSTANCEW
*
instance
,
void
*
data
)
{
static
const
struct
object_properties
default_properties
=
{
...
...
@@ -1066,7 +1083,7 @@ static BOOL CALLBACK get_object_property( const DIDEVICEOBJECTINSTANCEW *instanc
.
range_max
=
DIPROPRANGE_NOMAX
,
.
granularity
=
1
,
};
struct
get_object_property_params
*
params
=
context
;
struct
get_object_property_params
*
params
=
data
;
struct
dinput_device
*
impl
=
impl_from_IDirectInputDevice8W
(
params
->
iface
);
const
struct
object_properties
*
properties
=
NULL
;
...
...
@@ -1235,9 +1252,10 @@ struct set_object_property_params
DWORD
property
;
};
static
BOOL
CALLBACK
set_object_property
(
const
DIDEVICEOBJECTINSTANCEW
*
instance
,
void
*
context
)
static
BOOL
set_object_property
(
struct
dinput_device
*
device
,
UINT
index
,
struct
hid_value_caps
*
caps
,
const
DIDEVICEOBJECTINSTANCEW
*
instance
,
void
*
data
)
{
struct
set_object_property_params
*
params
=
context
;
struct
set_object_property_params
*
params
=
data
;
struct
dinput_device
*
impl
=
impl_from_IDirectInputDevice8W
(
params
->
iface
);
struct
object_properties
*
properties
=
NULL
;
...
...
@@ -1276,9 +1294,9 @@ static BOOL CALLBACK set_object_property( const DIDEVICEOBJECTINSTANCEW *instanc
return
DIENUM_STOP
;
}
static
BOOL
CALLBACK
reset_object_value
(
const
DIDEVICEOBJECTINSTANCEW
*
instance
,
void
*
context
)
static
BOOL
reset_object_value
(
struct
dinput_device
*
impl
,
UINT
index
,
struct
hid_value_caps
*
caps
,
const
DIDEVICEOBJECTINSTANCEW
*
instance
,
void
*
context
)
{
struct
dinput_device
*
impl
=
context
;
struct
object_properties
*
properties
;
LONG
tmp
=
-
1
;
...
...
@@ -1445,7 +1463,8 @@ static void dinput_device_set_username( struct dinput_device *impl, const DIPROP
lstrcpynW
(
device_player
->
username
,
value
->
wsz
,
ARRAY_SIZE
(
device_player
->
username
)
);
}
static
BOOL
CALLBACK
get_object_info
(
const
DIDEVICEOBJECTINSTANCEW
*
instance
,
void
*
data
)
static
BOOL
get_object_info
(
struct
dinput_device
*
device
,
UINT
index
,
struct
hid_value_caps
*
caps
,
const
DIDEVICEOBJECTINSTANCEW
*
instance
,
void
*
data
)
{
DIDEVICEOBJECTINSTANCEW
*
dest
=
data
;
DWORD
size
=
dest
->
dwSize
;
...
...
@@ -2194,7 +2213,7 @@ static BOOL CALLBACK enum_objects_init( const DIDEVICEOBJECTINSTANCEW *instance,
}
if
(
impl
->
object_properties
&&
(
instance
->
dwType
&
(
DIDFT_AXIS
|
DIDFT_POV
)))
reset_object_value
(
i
nstance
,
impl
);
reset_object_value
(
i
mpl
,
format
->
dwNumObjs
,
NULL
,
instance
,
NULL
);
format
->
dwNumObjs
++
;
return
DIENUM_CONTINUE
;
...
...
dlls/dinput/device_private.h
View file @
1cda1509
...
...
@@ -34,6 +34,12 @@ typedef struct
UINT_PTR
uAppData
;
}
ActionMap
;
struct
dinput_device
;
struct
hid_value_caps
;
typedef
BOOL
(
*
enum_object_callback
)(
struct
dinput_device
*
impl
,
UINT
index
,
struct
hid_value_caps
*
caps
,
const
DIDEVICEOBJECTINSTANCEW
*
instance
,
void
*
data
);
struct
dinput_device_vtbl
{
void
(
*
destroy
)(
IDirectInputDevice8W
*
iface
);
...
...
@@ -42,7 +48,7 @@ struct dinput_device_vtbl
HRESULT
(
*
acquire
)(
IDirectInputDevice8W
*
iface
);
HRESULT
(
*
unacquire
)(
IDirectInputDevice8W
*
iface
);
HRESULT
(
*
enum_objects
)(
IDirectInputDevice8W
*
iface
,
const
DIPROPHEADER
*
filter
,
DWORD
flags
,
LPDIENUMDEVICEOBJECTSCALLBACKW
callback
,
void
*
context
);
enum_object_callback
callback
,
void
*
context
);
HRESULT
(
*
get_property
)(
IDirectInputDevice8W
*
iface
,
DWORD
property
,
DIPROPHEADER
*
header
,
const
DIDEVICEOBJECTINSTANCEW
*
instance
);
HRESULT
(
*
get_effect_info
)(
IDirectInputDevice8W
*
iface
,
DIEFFECTINFOW
*
info
,
const
GUID
*
guid
);
...
...
dlls/dinput/joystick_hid.c
View file @
1cda1509
This diff is collapsed.
Click to expand it.
dlls/dinput/keyboard.c
View file @
1cda1509
...
...
@@ -228,28 +228,28 @@ static HRESULT keyboard_unacquire( IDirectInputDevice8W *iface )
return
DI_OK
;
}
static
BOOL
try_enum_object
(
const
DIPROPHEADER
*
filter
,
DWORD
flags
,
LPDIENUMDEVICEOBJECTSCALLBACKW
callback
,
DIDEVICEOBJECTINSTANCEW
*
instance
,
void
*
data
)
static
BOOL
try_enum_object
(
struct
dinput_device
*
impl
,
const
DIPROPHEADER
*
filter
,
DWORD
flags
,
enum_object_callback
callback
,
UINT
index
,
DIDEVICEOBJECTINSTANCEW
*
instance
,
void
*
data
)
{
if
(
flags
!=
DIDFT_ALL
&&
!
(
flags
&
DIDFT_GETTYPE
(
instance
->
dwType
)))
return
DIENUM_CONTINUE
;
switch
(
filter
->
dwHow
)
{
case
DIPH_DEVICE
:
return
callback
(
instance
,
data
);
return
callback
(
i
mpl
,
index
,
NULL
,
i
nstance
,
data
);
case
DIPH_BYOFFSET
:
if
(
filter
->
dwObj
!=
instance
->
dwOfs
)
return
DIENUM_CONTINUE
;
return
callback
(
instance
,
data
);
return
callback
(
i
mpl
,
index
,
NULL
,
i
nstance
,
data
);
case
DIPH_BYID
:
if
((
filter
->
dwObj
&
0x00ffffff
)
!=
(
instance
->
dwType
&
0x00ffffff
))
return
DIENUM_CONTINUE
;
return
callback
(
instance
,
data
);
return
callback
(
i
mpl
,
index
,
NULL
,
i
nstance
,
data
);
}
return
DIENUM_CONTINUE
;
}
static
HRESULT
keyboard_enum_objects
(
IDirectInputDevice8W
*
iface
,
const
DIPROPHEADER
*
filter
,
DWORD
flags
,
LPDIENUMDEVICEOBJECTSCALLBACKW
callback
,
void
*
context
)
DWORD
flags
,
enum_object_callback
callback
,
void
*
context
)
{
struct
keyboard
*
impl
=
impl_from_IDirectInputDevice8W
(
iface
);
BYTE
subtype
=
GET_DIDEVICE_SUBTYPE
(
impl
->
base
.
instance
.
dwDevType
);
...
...
@@ -260,16 +260,16 @@ static HRESULT keyboard_enum_objects( IDirectInputDevice8W *iface, const DIPROPH
.
dwOfs
=
DIK_ESCAPE
,
.
dwType
=
DIDFT_PSHBUTTON
|
DIDFT_MAKEINSTANCE
(
DIK_ESCAPE
),
};
DWORD
i
,
dik
;
DWORD
i
ndex
,
i
,
dik
;
BOOL
ret
;
for
(
i
=
0
;
i
<
512
;
++
i
)
for
(
i
=
0
,
index
=
0
;
i
<
512
;
++
i
)
{
if
(
!
GetKeyNameTextW
(
i
<<
16
,
instance
.
tszName
,
ARRAY_SIZE
(
instance
.
tszName
)
))
continue
;
if
(
!
(
dik
=
map_dik_code
(
i
,
0
,
subtype
,
impl
->
base
.
dinput
->
dwVersion
)))
continue
;
instance
.
dwOfs
=
dik
;
instance
.
dwType
=
DIDFT_PSHBUTTON
|
DIDFT_MAKEINSTANCE
(
dik
);
ret
=
try_enum_object
(
filter
,
flags
,
callback
,
&
instance
,
context
);
ret
=
try_enum_object
(
&
impl
->
base
,
filter
,
flags
,
callback
,
index
++
,
&
instance
,
context
);
if
(
ret
!=
DIENUM_CONTINUE
)
return
DIENUM_STOP
;
}
...
...
dlls/dinput/mouse.c
View file @
1cda1509
...
...
@@ -456,29 +456,30 @@ static HRESULT mouse_unacquire( IDirectInputDevice8W *iface )
return
DI_OK
;
}
static
BOOL
try_enum_object
(
const
DIPROPHEADER
*
filter
,
DWORD
flags
,
LPDIENUMDEVICEOBJECTSCALLBACKW
callback
,
DIDEVICEOBJECTINSTANCEW
*
instance
,
void
*
data
)
static
BOOL
try_enum_object
(
struct
dinput_device
*
impl
,
const
DIPROPHEADER
*
filter
,
DWORD
flags
,
enum_object_callback
callback
,
UINT
index
,
DIDEVICEOBJECTINSTANCEW
*
instance
,
void
*
data
)
{
if
(
flags
!=
DIDFT_ALL
&&
!
(
flags
&
DIDFT_GETTYPE
(
instance
->
dwType
)))
return
DIENUM_CONTINUE
;
switch
(
filter
->
dwHow
)
{
case
DIPH_DEVICE
:
return
callback
(
instance
,
data
);
return
callback
(
i
mpl
,
index
,
NULL
,
i
nstance
,
data
);
case
DIPH_BYOFFSET
:
if
(
filter
->
dwObj
!=
instance
->
dwOfs
)
return
DIENUM_CONTINUE
;
return
callback
(
instance
,
data
);
return
callback
(
i
mpl
,
index
,
NULL
,
i
nstance
,
data
);
case
DIPH_BYID
:
if
((
filter
->
dwObj
&
0x00ffffff
)
!=
(
instance
->
dwType
&
0x00ffffff
))
return
DIENUM_CONTINUE
;
return
callback
(
instance
,
data
);
return
callback
(
i
mpl
,
index
,
NULL
,
i
nstance
,
data
);
}
return
DIENUM_CONTINUE
;
}
static
HRESULT
mouse_enum_objects
(
IDirectInputDevice8W
*
iface
,
const
DIPROPHEADER
*
filter
,
DWORD
flags
,
LPDIENUMDEVICEOBJECTSCALLBACKW
callback
,
void
*
context
)
DWORD
flags
,
enum_object_callback
callback
,
void
*
context
)
{
struct
mouse
*
impl
=
impl_from_IDirectInputDevice8W
(
iface
);
DIDEVICEOBJECTINSTANCEW
instances
[]
=
{
{
...
...
@@ -546,7 +547,7 @@ static HRESULT mouse_enum_objects( IDirectInputDevice8W *iface, const DIPROPHEAD
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
instances
);
++
i
)
{
ret
=
try_enum_object
(
filter
,
flags
,
callback
,
instances
+
i
,
context
);
ret
=
try_enum_object
(
&
impl
->
base
,
filter
,
flags
,
callback
,
i
,
instances
+
i
,
context
);
if
(
ret
!=
DIENUM_CONTINUE
)
return
DIENUM_STOP
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment