@@ -14,13 +14,17 @@ import io.github.sds100.keymapper.base.trigger.RecordTriggerController
1414import io.github.sds100.keymapper.base.trigger.RecordTriggerState
1515import io.github.sds100.keymapper.common.models.EvdevDeviceInfo
1616import io.github.sds100.keymapper.common.models.GrabTargetKeyCode
17+ import io.github.sds100.keymapper.data.Keys
18+ import io.github.sds100.keymapper.data.PreferenceDefaults
19+ import io.github.sds100.keymapper.data.repositories.PreferenceRepository
1720import io.github.sds100.keymapper.system.inputevents.KMEvdevEvent
1821import io.github.sds100.keymapper.system.inputevents.KMInputEvent
1922import kotlinx.coroutines.CoroutineScope
2023import kotlinx.coroutines.flow.SharingStarted
2124import kotlinx.coroutines.flow.StateFlow
2225import kotlinx.coroutines.flow.combine
2326import kotlinx.coroutines.flow.launchIn
27+ import kotlinx.coroutines.flow.map
2428import kotlinx.coroutines.flow.stateIn
2529import kotlinx.coroutines.launch
2630import timber.log.Timber
@@ -33,11 +37,15 @@ class KeyMapDetectionController(
3337 private val inputEventHub : InputEventHub ,
3438 private val pauseKeyMapsUseCase : PauseKeyMapsUseCase ,
3539 private val recordTriggerController : RecordTriggerController ,
40+ private val preferences : PreferenceRepository ,
3641) : InputEventHubCallback {
3742 companion object {
3843 private const val INPUT_EVENT_HUB_ID = " key_map_controller"
3944
40- fun getEvdevGrabRequests (algorithm : KeyMapAlgorithm ): List <GrabTargetKeyCode > {
45+ fun getEvdevGrabRequests (
46+ algorithm : KeyMapAlgorithm ,
47+ injectKeyEventActionsWithSystemBridge : Boolean = true,
48+ ): List <GrabTargetKeyCode > {
4149 val deviceKeyEventMap = mutableMapOf<EvdevDeviceInfo , MutableSet <Int >>()
4250
4351 for ((index, trigger) in algorithm.triggers.withIndex()) {
@@ -54,12 +62,16 @@ class KeyMapDetectionController(
5462 .map { actionIndex -> algorithm.actionMap[actionIndex]?.data }
5563 .filterNotNull()
5664
57- val extraKeyCodes = actions
58- .filterIsInstance<ActionData .InputKeyEvent >()
59- .map { it.keyCode }
65+ val extraKeyCodes = if (injectKeyEventActionsWithSystemBridge) {
66+ actions
67+ .filterIsInstance<ActionData .InputKeyEvent >()
68+ .map { it.keyCode }
69+ } else {
70+ emptyList()
71+ }
6072
6173 for (device in evdevDevices) {
62- deviceKeyEventMap.getOrPut(device, { mutableSetOf () }) .addAll(extraKeyCodes)
74+ deviceKeyEventMap.getOrPut(device) { mutableSetOf () }.addAll(extraKeyCodes)
6375 }
6476 }
6577
@@ -75,6 +87,11 @@ class KeyMapDetectionController(
7587 }
7688 }
7789
90+ private val injectKeyEventsWithSystemBridge: StateFlow <Boolean > =
91+ preferences.get(Keys .keyEventActionsUseSystemBridge)
92+ .map { it ? : PreferenceDefaults .KEY_EVENT_ACTIONS_USE_SYSTEM_BRIDGE }
93+ .stateIn(coroutineScope, SharingStarted .Eagerly , false )
94+
7895 private val algorithm: KeyMapAlgorithm =
7996 KeyMapAlgorithm (coroutineScope, detectUseCase, performActionsUseCase, detectConstraints)
8097
@@ -103,7 +120,8 @@ class KeyMapDetectionController(
103120 algorithm.loadKeyMaps(keyMapList)
104121 // Determine which evdev devices need to be grabbed depending on the state
105122 // of the algorithm.
106- val grabRequests = getEvdevGrabRequests(algorithm)
123+ val grabRequests =
124+ getEvdevGrabRequests(algorithm, injectKeyEventsWithSystemBridge.value)
107125
108126 Timber .i(
109127 " Grab evdev devices for key map detection: ${grabRequests.joinToString()} " ,
0 commit comments