mirror of
https://github.com/acidanthera/OpenCorePkg.git
synced 2025-12-08 19:25:01 +00:00
200 lines
7.4 KiB
C
200 lines
7.4 KiB
C
/** @file
|
|
Copyright (C) 2019, Download-Fritz. All rights reserved.<BR>
|
|
Copyright (C) 2021, Mike Beaton. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-3-Clause
|
|
**/
|
|
|
|
#ifndef OC_APPLE_KEY_MAP_LIB_H
|
|
#define OC_APPLE_KEY_MAP_LIB_H
|
|
|
|
#include <Protocol/AppleKeyMapDatabase.h>
|
|
#include <Protocol/AppleKeyMapAggregator.h>
|
|
#include <Library/DebugLib.h>
|
|
|
|
#if !defined (OC_TRACE_UPDOWNKEYS)
|
|
#define OC_TRACE_UPDOWNKEYS DEBUG_VERBOSE
|
|
#endif
|
|
|
|
/**
|
|
Default buffer size for key map.
|
|
**/
|
|
#define OC_KEY_MAP_DEFAULT_SIZE 8
|
|
|
|
/**
|
|
Default buffer size for held keys in downkeys support.
|
|
**/
|
|
#define OC_HELD_KEYS_DEFAULT_SIZE 8
|
|
|
|
/**
|
|
Default initial and subsequent key repeat delays in milliseconds.
|
|
**/
|
|
#define OC_DOWNKEYS_DEFAULT_INITIAL_DELAY 350
|
|
#define OC_DOWNKEYS_DEFAULT_SUBSEQUENT_DELAY 80
|
|
|
|
/**
|
|
Repeat key context.
|
|
**/
|
|
typedef struct {
|
|
UINT64 InitialDelay;
|
|
UINT64 SubsequentDelay;
|
|
UINT64 PreviousTime;
|
|
APPLE_KEY_MAP_AGGREGATOR_PROTOCOL *KeyMap;
|
|
APPLE_KEY_CODE *KeysHeld;
|
|
INT64 *KeyHeldTimes;
|
|
UINTN NumKeysHeld;
|
|
UINTN MaxKeysHeld;
|
|
} OC_KEY_REPEAT_CONTEXT;
|
|
|
|
/** Free key repeat context.
|
|
|
|
@param[in] Context Key repeat context to free.
|
|
**/
|
|
VOID
|
|
OcFreeKeyRepeatContext (
|
|
OC_KEY_REPEAT_CONTEXT **Context
|
|
);
|
|
|
|
/** Initialise key repeat context.
|
|
|
|
@param[out] Context Allocated key repeat context structure is returned here.
|
|
@param[in] KeyMap The key map aggregator protocol instance to use.
|
|
@param[in] MaxKeysHeld Number of entries to allocate in held keys buffer.
|
|
@param[in] InitialDelay Key repeat initial delay.
|
|
Same time units as CurrentTime passed to subsequent
|
|
calls of OcGetUpDownKeys.
|
|
@param[in] SubsequentDelay Key repeat subsequent delay.
|
|
Same time units as CurrentTime passed to subsequent
|
|
calls of OcGetUpDownKeys.
|
|
@param[in] PreventInitialRepeat If true, set up buffer so that keys held at init do not
|
|
repeat until released and then pressed again.
|
|
|
|
@retval EFI_SUCCESS The repeat context has been initialised.
|
|
@retval other An error returned by a sub-operation.
|
|
**/
|
|
EFI_STATUS
|
|
OcInitKeyRepeatContext (
|
|
OUT OC_KEY_REPEAT_CONTEXT **Context,
|
|
IN APPLE_KEY_MAP_AGGREGATOR_PROTOCOL *KeyMap,
|
|
IN UINTN MaxKeysHeld,
|
|
IN UINT64 InitialDelay,
|
|
IN UINT64 SubsequentDelay,
|
|
IN BOOLEAN PreventInitialRepeat
|
|
);
|
|
|
|
/** Returns all key transitions and key modifiers into the appropiate buffers.
|
|
|
|
@param[in,out] RepeatContext On input the previous (or newly initialised) repeat context.
|
|
On output the newly updated key repeat context; values of
|
|
interest to the caller are not intended to be read from the
|
|
context, but from the other parameters above.
|
|
@param[out] Modifiers The key modifiers currently applicable.
|
|
@param[in,out] NumKeysUp On input the number of keys allocated for KeysUp. Ignored
|
|
if KeysUp is null.
|
|
On output the number of up keys detected, with their keycodes
|
|
returned into KeysUp if present.
|
|
@param[out] KeysUp A Pointer to a optional caller-allocated buffer in which new
|
|
up keycodes get returned.
|
|
@param[in,out] NumKeysDown On input with KeysDown non-null, the number of keys
|
|
allocated for KeysDown and the total number of keys to check.
|
|
On input and with KeysDown null, this parameter still
|
|
represents the total number of keys to check.
|
|
On output the number of down keys detected, with their
|
|
keycodes returned into KeysDown if present.
|
|
@param[out] KeysDown A Pointer to an optional caller-allocated buffer in which new
|
|
down keycodes get returned.
|
|
@param[in] CurrentTime Current time (arbitrary units with sufficient resolution).
|
|
Need not be valid on initial call only.
|
|
|
|
@retval EFI_SUCCESS The requested key transitions and states have been returned
|
|
or updated as requested in the various out parameters.
|
|
@retval EFI_UNSUPPORTED Unsupported buffer/size combination.
|
|
@retval other An error returned by a sub-operation.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
OcGetUpDownKeys (
|
|
IN OUT OC_KEY_REPEAT_CONTEXT *RepeatContext,
|
|
OUT APPLE_MODIFIER_MAP *Modifiers,
|
|
IN OUT UINTN *NumKeysUp,
|
|
OUT APPLE_KEY_CODE *KeysUp OPTIONAL,
|
|
IN OUT UINTN *NumKeysDown,
|
|
OUT APPLE_KEY_CODE *KeysDown OPTIONAL,
|
|
IN UINT64 CurrentTime
|
|
);
|
|
|
|
/**
|
|
Returns the previously install Apple Key Map Database protocol.
|
|
|
|
@retval installed or located protocol or NULL
|
|
**/
|
|
APPLE_KEY_MAP_DATABASE_PROTOCOL *
|
|
OcAppleKeyMapGetDatabase (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Install and initialise Apple Key Map protocols.
|
|
|
|
@param[in] Reinstall Overwrite installed protocols.
|
|
|
|
@retval installed or located protocol or NULL
|
|
**/
|
|
APPLE_KEY_MAP_AGGREGATOR_PROTOCOL *
|
|
OcAppleKeyMapInstallProtocols (
|
|
IN BOOLEAN Reinstall
|
|
);
|
|
|
|
/**
|
|
Checks whether or not a list of keys is contained within another.
|
|
|
|
@param[in] Keys The reference keys.
|
|
@param[in] NumKeys The number of keys in Keys.
|
|
@param[in] CheckKeys The keys to locate in Keys.
|
|
@param[in] NumCheckKeys The number of keys in CheckKeys.
|
|
@param[in] ExactMatch Specifies whether matches must be exact.
|
|
|
|
@returns Whether the reference keys contain the checked keys.
|
|
|
|
**/
|
|
BOOLEAN
|
|
OcKeyMapHasKeys (
|
|
IN CONST APPLE_KEY_CODE *Keys,
|
|
IN UINTN NumKeys,
|
|
IN CONST APPLE_KEY_CODE *CheckKeys,
|
|
IN UINTN NumCheckKeys,
|
|
IN BOOLEAN ExactMatch
|
|
);
|
|
|
|
/**
|
|
Checks whether or not a KeyCode is contained within Keys.
|
|
|
|
@param[in] Keys The reference keys.
|
|
@param[in] NumKeys The number of keys in Keys.
|
|
@param[in] KeyCode The key to locate in Keys.
|
|
|
|
@returns Whether the reference keys contain the checked key.
|
|
|
|
**/
|
|
BOOLEAN
|
|
OcKeyMapHasKey (
|
|
IN CONST APPLE_KEY_CODE *Keys,
|
|
IN UINTN NumKeys,
|
|
IN CONST APPLE_KEY_CODE KeyCode
|
|
);
|
|
|
|
/**
|
|
Performs keyboard input flush.
|
|
|
|
@param[in] KeyMap Apple Key Map Aggregator protocol.
|
|
@param[in] Key Key to wait for removal or 0.
|
|
@param[in] FlushConsole Also flush console input.
|
|
**/
|
|
VOID
|
|
OcKeyMapFlush (
|
|
IN APPLE_KEY_MAP_AGGREGATOR_PROTOCOL *KeyMap,
|
|
IN APPLE_KEY_CODE Key,
|
|
IN BOOLEAN FlushConsole
|
|
);
|
|
|
|
#endif // OC_APPLE_KEY_MAP_LIB_H
|