Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
libinput
libinput
Commits
d2054c81
Commit
d2054c81
authored
Jun 02, 2017
by
Peter Hutterer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
touchpad: use the "is internal keyboard" tag to enable dwt
Signed-off-by:
Peter Hutterer
<
peter.hutterer@who-t.net
>
parent
3a17d0da
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
13 additions
and
101 deletions
+13
-101
src/evdev-mt-touchpad.c
src/evdev-mt-touchpad.c
+10
-31
test/test-touchpad.c
test/test-touchpad.c
+3
-70
No files found.
src/evdev-mt-touchpad.c
View file @
d2054c81
...
...
@@ -1581,8 +1581,6 @@ static bool
tp_want_dwt
(
struct
evdev_device
*
touchpad
,
struct
evdev_device
*
keyboard
)
{
unsigned
int
bus_tp
=
libevdev_get_id_bustype
(
touchpad
->
evdev
),
bus_kbd
=
libevdev_get_id_bustype
(
keyboard
->
evdev
);
unsigned
int
vendor_tp
=
evdev_device_get_id_vendor
(
touchpad
);
unsigned
int
vendor_kbd
=
evdev_device_get_id_vendor
(
keyboard
);
unsigned
int
product_tp
=
evdev_device_get_id_product
(
touchpad
);
...
...
@@ -1592,22 +1590,12 @@ tp_want_dwt(struct evdev_device *touchpad,
considered a happy couple */
if
(
touchpad
->
tags
&
EVDEV_TAG_EXTERNAL_TOUCHPAD
)
return
vendor_tp
==
vendor_kbd
&&
product_tp
==
product_kbd
;
else
if
(
keyboard
->
tags
&
EVDEV_TAG_INTERNAL_KEYBOARD
)
return
true
;
/* If the touchpad is on serio, the keyboard is too, so ignore any
other devices */
if
(
bus_tp
==
BUS_I8042
&&
bus_kbd
!=
bus_tp
)
return
false
;
/* For Apple touchpads, always use its internal keyboard */
if
(
vendor_tp
==
VENDOR_ID_APPLE
)
{
return
vendor_kbd
==
vendor_tp
&&
keyboard
->
tags
&
EVDEV_TAG_INTERNAL_KEYBOARD
;
}
/* everything else we don't really know, so we have to assume
they go together */
return
true
;
/* keyboard is not tagged as internal keyboard and it's not part of
* a combo */
return
false
;
}
static
void
...
...
@@ -1615,7 +1603,9 @@ tp_dwt_pair_keyboard(struct evdev_device *touchpad,
struct
evdev_device
*
keyboard
)
{
struct
tp_dispatch
*
tp
=
(
struct
tp_dispatch
*
)
touchpad
->
dispatch
;
unsigned
int
bus_kbd
=
libevdev_get_id_bustype
(
keyboard
->
evdev
);
if
(
tp
->
dwt
.
keyboard
)
return
;
if
((
keyboard
->
tags
&
EVDEV_TAG_KEYBOARD
)
==
0
)
return
;
...
...
@@ -1623,20 +1613,9 @@ tp_dwt_pair_keyboard(struct evdev_device *touchpad,
if
(
!
tp_want_dwt
(
touchpad
,
keyboard
))
return
;
/* If we already have a keyboard paired, override it if the new one
* is a serio device. Otherwise keep the current one */
if
(
tp
->
dwt
.
keyboard
)
{
if
(
bus_kbd
!=
BUS_I8042
)
return
;
memset
(
tp
->
dwt
.
key_mask
,
0
,
sizeof
(
tp
->
dwt
.
key_mask
));
memset
(
tp
->
dwt
.
mod_mask
,
0
,
sizeof
(
tp
->
dwt
.
mod_mask
));
libinput_device_remove_event_listener
(
&
tp
->
dwt
.
keyboard_listener
);
}
libinput_device_add_event_listener
(
&
keyboard
->
base
,
&
tp
->
dwt
.
keyboard_listener
,
tp_keyboard_event
,
tp
);
&
tp
->
dwt
.
keyboard_listener
,
tp_keyboard_event
,
tp
);
tp
->
dwt
.
keyboard
=
keyboard
;
tp
->
dwt
.
keyboard_active
=
false
;
...
...
test/test-touchpad.c
View file @
d2054c81
...
...
@@ -2682,7 +2682,7 @@ START_TEST(touchpad_dwt)
}
END_TEST
START_TEST
(
touchpad_dwt_
update
_keyboard
)
START_TEST
(
touchpad_dwt_
ext_and_int
_keyboard
)
{
struct
litest_device
*
touchpad
=
litest_current_device
();
struct
litest_device
*
keyboard
,
*
yubikey
;
...
...
@@ -2730,58 +2730,6 @@ START_TEST(touchpad_dwt_update_keyboard)
}
END_TEST
START_TEST
(
touchpad_dwt_update_keyboard_with_state
)
{
struct
litest_device
*
touchpad
=
litest_current_device
();
struct
litest_device
*
keyboard
,
*
yubikey
;
struct
libinput
*
li
=
touchpad
->
libinput
;
if
(
!
has_disable_while_typing
(
touchpad
))
return
;
litest_disable_tap
(
touchpad
->
libinput_device
);
/* Yubikey is initialized first */
yubikey
=
litest_add_device
(
li
,
LITEST_YUBIKEY
);
litest_drain_events
(
li
);
litest_keyboard_key
(
yubikey
,
KEY_A
,
true
);
litest_keyboard_key
(
yubikey
,
KEY_A
,
false
);
litest_keyboard_key
(
yubikey
,
KEY_A
,
true
);
litest_assert_only_typed_events
(
li
,
LIBINPUT_EVENT_KEYBOARD_KEY
);
litest_touch_down
(
touchpad
,
0
,
50
,
50
);
litest_touch_move_to
(
touchpad
,
0
,
50
,
50
,
70
,
50
,
10
,
1
);
litest_touch_up
(
touchpad
,
0
);
litest_assert_empty_queue
(
li
);
litest_keyboard_key
(
yubikey
,
KEY_A
,
false
);
litest_keyboard_key
(
yubikey
,
KEY_A
,
true
);
litest_drain_events
(
li
);
/* yubikey still has A down */
keyboard
=
dwt_init_paired_keyboard
(
li
,
touchpad
);
litest_drain_events
(
li
);
/* expected repairing, dwt should be disabled */
litest_touch_down
(
touchpad
,
0
,
50
,
50
);
litest_touch_move_to
(
touchpad
,
0
,
50
,
50
,
70
,
50
,
10
,
1
);
litest_touch_up
(
touchpad
,
0
);
litest_assert_only_typed_events
(
li
,
LIBINPUT_EVENT_POINTER_MOTION
);
/* release remaining key */
litest_keyboard_key
(
yubikey
,
KEY_A
,
false
);
litest_assert_only_typed_events
(
li
,
LIBINPUT_EVENT_KEYBOARD_KEY
);
litest_touch_down
(
touchpad
,
0
,
50
,
50
);
litest_touch_move_to
(
touchpad
,
0
,
50
,
50
,
70
,
50
,
10
,
1
);
litest_touch_up
(
touchpad
,
0
);
litest_assert_only_typed_events
(
li
,
LIBINPUT_EVENT_POINTER_MOTION
);
litest_delete_device
(
keyboard
);
litest_delete_device
(
yubikey
);
}
END_TEST
START_TEST
(
touchpad_dwt_enable_touch
)
{
struct
litest_device
*
touchpad
=
litest_current_device
();
...
...
@@ -3874,24 +3822,11 @@ END_TEST
START_TEST
(
touchpad_dwt_apple
)
{
struct
litest_device
*
touchpad
=
litest_current_device
();
struct
litest_device
*
keyboard
,
*
apple_keyboard
;
struct
litest_device
*
apple_keyboard
;
struct
libinput
*
li
=
touchpad
->
libinput
;
ck_assert
(
has_disable_while_typing
(
touchpad
));
/* Only the apple keyboard can trigger DWT */
keyboard
=
litest_add_device
(
li
,
LITEST_KEYBOARD
);
litest_drain_events
(
li
);
litest_keyboard_key
(
keyboard
,
KEY_A
,
true
);
litest_keyboard_key
(
keyboard
,
KEY_A
,
false
);
litest_assert_only_typed_events
(
li
,
LIBINPUT_EVENT_KEYBOARD_KEY
);
litest_touch_down
(
touchpad
,
0
,
50
,
50
);
litest_touch_move_to
(
touchpad
,
0
,
50
,
50
,
70
,
50
,
10
,
1
);
litest_touch_up
(
touchpad
,
0
);
litest_assert_only_typed_events
(
li
,
LIBINPUT_EVENT_POINTER_MOTION
);
apple_keyboard
=
litest_add_device
(
li
,
LITEST_APPLE_KEYBOARD
);
litest_drain_events
(
li
);
...
...
@@ -3905,7 +3840,6 @@ START_TEST(touchpad_dwt_apple)
libinput_dispatch
(
li
);
litest_assert_empty_queue
(
li
);
litest_delete_device
(
keyboard
);
litest_delete_device
(
apple_keyboard
);
}
END_TEST
...
...
@@ -5108,8 +5042,7 @@ litest_setup_tests_touchpad(void)
litest_add_ranged
(
"touchpad:state"
,
touchpad_initial_state
,
LITEST_TOUCHPAD
,
LITEST_ANY
,
&
axis_range
);
litest_add
(
"touchpad:dwt"
,
touchpad_dwt
,
LITEST_TOUCHPAD
,
LITEST_ANY
);
litest_add_for_device
(
"touchpad:dwt"
,
touchpad_dwt_update_keyboard
,
LITEST_SYNAPTICS_I2C
);
litest_add_for_device
(
"touchpad:dwt"
,
touchpad_dwt_update_keyboard_with_state
,
LITEST_SYNAPTICS_I2C
);
litest_add_for_device
(
"touchpad:dwt"
,
touchpad_dwt_ext_and_int_keyboard
,
LITEST_SYNAPTICS_I2C
);
litest_add
(
"touchpad:dwt"
,
touchpad_dwt_enable_touch
,
LITEST_TOUCHPAD
,
LITEST_ANY
);
litest_add
(
"touchpad:dwt"
,
touchpad_dwt_touch_hold
,
LITEST_TOUCHPAD
,
LITEST_ANY
);
litest_add
(
"touchpad:dwt"
,
touchpad_dwt_key_hold
,
LITEST_TOUCHPAD
,
LITEST_ANY
);
...
...
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