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
befb0a06
Commit
befb0a06
authored
Jan 29, 2009
by
Vincent Pelletier
Committed by
Alexandre Julliard
Feb 02, 2009
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dinput: Move gain support from effect to device.
parent
981f733e
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
97 additions
and
10 deletions
+97
-10
effect_linuxinput.c
dlls/dinput/effect_linuxinput.c
+3
-7
joystick_linuxinput.c
dlls/dinput/joystick_linuxinput.c
+34
-3
joystick.c
dlls/dinput/tests/joystick.c
+60
-0
No files found.
dlls/dinput/effect_linuxinput.c
View file @
befb0a06
...
...
@@ -512,12 +512,6 @@ static HRESULT WINAPI LinuxInputEffectImpl_Start(
}
event
.
type
=
EV_FF
;
event
.
code
=
FF_GAIN
;
event
.
value
=
This
->
gain
;
if
(
write
(
*
(
This
->
fd
),
&
event
,
sizeof
(
event
))
==
-
1
)
FIXME
(
"Failed setting gain. Error: %d
\"
%s
\"
.
\n
"
,
errno
,
strerror
(
errno
));
event
.
code
=
This
->
effect
.
id
;
event
.
value
=
dwIterations
;
if
(
write
(
*
(
This
->
fd
),
&
event
,
sizeof
(
event
))
==
-
1
)
{
...
...
@@ -627,8 +621,10 @@ static HRESULT WINAPI LinuxInputEffectImpl_SetParameters(
/* Gain and Sample Period settings are not supported by the linux
* event system */
if
(
dwFlags
&
DIEP_GAIN
)
if
(
dwFlags
&
DIEP_GAIN
)
{
This
->
gain
=
0xFFFF
*
peff
->
dwGain
/
10000
;
TRACE
(
"Effect gain requested but no effect gain functionality present.
\n
"
);
}
if
(
dwFlags
&
DIEP_SAMPLEPERIOD
)
TRACE
(
"Sample period requested but no sample period functionality present.
\n
"
);
...
...
dlls/dinput/joystick_linuxinput.c
View file @
befb0a06
...
...
@@ -194,6 +194,7 @@ struct JoystickImpl
struct
list
ff_effects
;
int
ff_state
;
int
ff_autocenter
;
int
ff_gain
;
};
static
void
fake_current_js_state
(
JoystickImpl
*
ji
);
...
...
@@ -461,6 +462,7 @@ static JoystickImpl *alloc_device(REFGUID rguid, const void *jvt, IDirectInputIm
Instead, track it with ff_autocenter, and assume it's initialy
enabled. */
newDevice
->
ff_autocenter
=
1
;
newDevice
->
ff_gain
=
0xFFFF
;
InitializeCriticalSection
(
&
newDevice
->
base
.
crit
);
newDevice
->
base
.
crit
.
DebugInfo
->
Spare
[
0
]
=
(
DWORD_PTR
)(
__FILE__
": JoystickImpl*->base.crit"
);
...
...
@@ -670,12 +672,16 @@ static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
}
else
{
struct
input_event
event
;
event
.
type
=
EV_FF
;
event
.
code
=
FF_GAIN
;
event
.
value
=
This
->
ff_gain
;
if
(
write
(
This
->
joyfd
,
&
event
,
sizeof
(
event
))
==
-
1
)
ERR
(
"Failed to set gain (%i): %d %s
\n
"
,
This
->
ff_gain
,
errno
,
strerror
(
errno
));
if
(
!
This
->
ff_autocenter
)
{
struct
input_event
event
;
/* Disable autocenter. */
event
.
type
=
EV_FF
;
event
.
code
=
FF_AUTOCENTER
;
event
.
value
=
0
;
if
(
write
(
This
->
joyfd
,
&
event
,
sizeof
(
event
))
==
-
1
)
...
...
@@ -974,6 +980,23 @@ static HRESULT WINAPI JoystickAImpl_SetProperty(LPDIRECTINPUTDEVICE8A iface,
fake_current_js_state
(
This
);
break
;
}
case
(
DWORD_PTR
)
DIPROP_FFGAIN
:
{
LPCDIPROPDWORD
pd
=
(
LPCDIPROPDWORD
)
ph
;
TRACE
(
"DIPROP_FFGAIN(%d)
\n
"
,
pd
->
dwData
);
This
->
ff_gain
=
MulDiv
(
pd
->
dwData
,
0xFFFF
,
10000
);
if
(
This
->
base
.
acquired
)
{
/* Update immediately. */
struct
input_event
event
;
event
.
type
=
EV_FF
;
event
.
code
=
FF_GAIN
;
event
.
value
=
This
->
ff_gain
;
if
(
write
(
This
->
joyfd
,
&
event
,
sizeof
(
event
))
==
-
1
)
ERR
(
"Failed to set gain (%i): %d %s
\n
"
,
This
->
ff_gain
,
errno
,
strerror
(
errno
));
}
break
;
}
default:
return
IDirectInputDevice2AImpl_SetProperty
(
iface
,
rguid
,
ph
);
}
...
...
@@ -1085,6 +1108,14 @@ static HRESULT WINAPI JoystickAImpl_GetProperty(LPDIRECTINPUTDEVICE8A iface,
TRACE
(
"autocenter(%d)
\n
"
,
pd
->
dwData
);
break
;
}
case
(
DWORD_PTR
)
DIPROP_FFGAIN
:
{
LPDIPROPDWORD
pd
=
(
LPDIPROPDWORD
)
pdiph
;
pd
->
dwData
=
MulDiv
(
This
->
ff_gain
,
10000
,
0xFFFF
);
TRACE
(
"DIPROP_FFGAIN(%d)
\n
"
,
pd
->
dwData
);
break
;
}
default:
return
IDirectInputDevice2AImpl_GetProperty
(
iface
,
rguid
,
pdiph
);
...
...
dlls/dinput/tests/joystick.c
View file @
befb0a06
...
...
@@ -330,6 +330,7 @@ static BOOL CALLBACK EnumJoysticks(
LONG
cnt1
,
cnt2
;
HWND
real_hWnd
;
HINSTANCE
hInstance
=
GetModuleHandle
(
NULL
);
DIPROPDWORD
dip_gain_set
,
dip_gain_get
;
trace
(
"Testing force-feedback
\n
"
);
memset
(
&
eff
,
0
,
sizeof
(
eff
));
...
...
@@ -486,6 +487,65 @@ static BOOL CALLBACK EnumJoysticks(
ok
(
hr
==
DI_OK
,
"IDirectInputDevice_Acquire() failed: %08x
\n
"
,
hr
);
hr
=
IDirectInputDevice2_GetProperty
(
pJoystick
,
DIPROP_AUTOCENTER
,
&
diprop_word
.
diph
);
/* Device gain (DIPROP_FFGAIN).
* From MSDN:
* 0..10000 range, otherwise DIERR_INVALIDPARAM.
* Can be changed even if device is acquired.
* Difference found by tests:
* <0 is refused, >10000 is accepted
*/
dip_gain_set
.
diph
.
dwSize
=
sizeof
(
DIPROPDWORD
);
dip_gain_set
.
diph
.
dwHeaderSize
=
sizeof
(
DIPROPHEADER
);
dip_gain_set
.
diph
.
dwObj
=
0
;
dip_gain_set
.
diph
.
dwHow
=
DIPH_DEVICE
;
dip_gain_set
.
dwData
=
10000
;
dip_gain_get
.
diph
.
dwSize
=
sizeof
(
DIPROPDWORD
);
dip_gain_get
.
diph
.
dwHeaderSize
=
sizeof
(
DIPROPHEADER
);
dip_gain_get
.
diph
.
dwObj
=
0
;
dip_gain_get
.
diph
.
dwHow
=
DIPH_DEVICE
;
dip_gain_get
.
dwData
=
0
;
/* Test device is acquisition (non)impact. */
hr
=
IDirectInputDevice_Unacquire
(
pJoystick
);
ok
(
hr
==
DI_OK
,
"IDirectInputDevice_Unacquire() should have returned S_FALSE, got: %08x
\n
"
,
hr
);
dip_gain_set
.
dwData
=
1
;
hr
=
IDirectInputDevice_SetProperty
(
pJoystick
,
DIPROP_FFGAIN
,
&
dip_gain_set
.
diph
);
ok
(
hr
==
DI_OK
,
"IDirectInputDevice_SetProperty() failed: %08x
\n
"
,
hr
);
hr
=
IDirectInputDevice_GetProperty
(
pJoystick
,
DIPROP_FFGAIN
,
&
dip_gain_get
.
diph
);
ok
(
hr
==
DI_OK
,
"IDirectInputDevice_GetProperty() failed: %08x
\n
"
,
hr
);
ok
(
dip_gain_get
.
dwData
==
dip_gain_set
.
dwData
,
"Gain not udated: %i
\n
"
,
dip_gain_get
.
dwData
);
hr
=
IDirectInputDevice_Acquire
(
pJoystick
);
ok
(
hr
==
DI_OK
,
"IDirectInputDevice_Acquire() failed: %08x
\n
"
,
hr
);
dip_gain_set
.
dwData
=
2
;
hr
=
IDirectInputDevice_SetProperty
(
pJoystick
,
DIPROP_FFGAIN
,
&
dip_gain_set
.
diph
);
ok
(
hr
==
DI_OK
,
"IDirectInputDevice_SetProperty() failed: %08x
\n
"
,
hr
);
hr
=
IDirectInputDevice_GetProperty
(
pJoystick
,
DIPROP_FFGAIN
,
&
dip_gain_get
.
diph
);
ok
(
hr
==
DI_OK
,
"IDirectInputDevice_GetProperty() failed: %08x
\n
"
,
hr
);
ok
(
dip_gain_get
.
dwData
==
dip_gain_set
.
dwData
,
"Gain not udated: %i
\n
"
,
dip_gain_get
.
dwData
);
/* Test range and internal clamping. */
dip_gain_set
.
dwData
=
-
1
;
hr
=
IDirectInputDevice_SetProperty
(
pJoystick
,
DIPROP_FFGAIN
,
&
dip_gain_set
.
diph
);
todo_wine
ok
(
hr
==
DIERR_INVALIDPARAM
,
"IDirectInputDevice_SetProperty() should have returned %08x: %08x
\n
"
,
DIERR_INVALIDPARAM
,
hr
);
dip_gain_set
.
dwData
=
0
;
hr
=
IDirectInputDevice_SetProperty
(
pJoystick
,
DIPROP_FFGAIN
,
&
dip_gain_set
.
diph
);
ok
(
hr
==
DI_OK
,
"IDirectInputDevice_SetProperty() failed: %08x
\n
"
,
hr
);
hr
=
IDirectInputDevice_GetProperty
(
pJoystick
,
DIPROP_FFGAIN
,
&
dip_gain_get
.
diph
);
ok
(
hr
==
DI_OK
,
"IDirectInputDevice_GetProperty() failed: %08x
\n
"
,
hr
);
ok
(
dip_gain_get
.
dwData
==
dip_gain_set
.
dwData
,
"Gain not updated: %i
\n
"
,
dip_gain_get
.
dwData
);
dip_gain_set
.
dwData
=
10000
;
hr
=
IDirectInputDevice_SetProperty
(
pJoystick
,
DIPROP_FFGAIN
,
&
dip_gain_set
.
diph
);
ok
(
hr
==
DI_OK
,
"IDirectInputDevice_SetProperty() failed: %08x
\n
"
,
hr
);
hr
=
IDirectInputDevice_GetProperty
(
pJoystick
,
DIPROP_FFGAIN
,
&
dip_gain_get
.
diph
);
ok
(
hr
==
DI_OK
,
"IDirectInputDevice_GetProperty() failed: %08x
\n
"
,
hr
);
ok
(
dip_gain_get
.
dwData
==
dip_gain_set
.
dwData
,
"Gain not updated: %i
\n
"
,
dip_gain_get
.
dwData
);
/* WARNING: This call succeeds, on the contrary of what is stated on MSDN. */
dip_gain_set
.
dwData
=
10001
;
hr
=
IDirectInputDevice_SetProperty
(
pJoystick
,
DIPROP_FFGAIN
,
&
dip_gain_set
.
diph
);
ok
(
hr
==
DI_OK
,
"IDirectInputDevice_SetProperty() failed: %08x
\n
"
,
hr
);
hr
=
IDirectInputDevice_GetProperty
(
pJoystick
,
DIPROP_FFGAIN
,
&
dip_gain_get
.
diph
);
ok
(
hr
==
DI_OK
,
"IDirectInputDevice_GetProperty() failed: %08x
\n
"
,
hr
);
ok
(
dip_gain_get
.
dwData
==
dip_gain_set
.
dwData
,
"Gain not updated: %i
\n
"
,
dip_gain_get
.
dwData
);
ref
=
IUnknown_Release
(
effect
);
ok
(
ref
==
0
,
"IDirectInputDevice_Release() reference count = %d
\n
"
,
ref
);
}
...
...
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