mirror of
https://github.com/Keychron/qmk_firmware.git
synced 2024-11-22 00:16:41 +06:00
96b0baa230
Co-authored-by: jack <0x6a73@protonmail.com>
150 lines
4.5 KiB
C
150 lines
4.5 KiB
C
// Copyright 2022 Chris Hoage (@chrishoage)
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include "quantum.h"
|
|
|
|
#if defined(SPLEEB_ENCODER_MODE_MAP_ENABLE) && !defined(ENCODER_ENABLE)
|
|
# error "Encoder must be enabled to use encoder mode map"
|
|
#endif
|
|
|
|
#if defined(SPLEEB_ENCODER_MODE_MAP_ENABLE) && defined(ENCODER_MAP_ENABLE)
|
|
# error "Encoder mode map can not be used with encoder map"
|
|
#endif
|
|
|
|
enum spleeb_keycodes {
|
|
POINTER_DEFAULT_DPI_FORWARD = QK_KB,
|
|
POINTER_DEFAULT_DPI_REVERSE,
|
|
POINTER_SNIPING_DPI_FORWARD,
|
|
POINTER_SNIPING_DPI_REVERSE,
|
|
SNIPING_MODE,
|
|
SNIPING_MODE_TOGGLE,
|
|
DRAGSCROLL_MODE,
|
|
DRAGSCROLL_MODE_TOGGLE,
|
|
ENC_MODE_STEP_LEFT,
|
|
ENC_MODE_STEP_RIGHT,
|
|
};
|
|
|
|
#define DF_MOD POINTER_DEFAULT_DPI_FORWARD
|
|
#define DF_RMOD POINTER_DEFAULT_DPI_REVERSE
|
|
#define SP_MOD POINTER_SNIPING_DPI_FORWARD
|
|
#define SP_RMOD POINTER_SNIPING_DPI_REVERSE
|
|
#define SNIPING SNIPING_MODE
|
|
#define SNP_TOG SNIPING_MODE_TOGGLE
|
|
#define DRGSCRL DRAGSCROLL_MODE
|
|
#define DRG_TOG DRAGSCROLL_MODE_TOGGLE
|
|
#define ENC_STL ENC_MODE_STEP_LEFT
|
|
#define ENC_STR ENC_MODE_STEP_RIGHT
|
|
|
|
#ifdef POINTING_DEVICE_ENABLE
|
|
# ifndef SPLEEB_MINIMUM_DEFAULT_DPI
|
|
# define SPLEEB_MINIMUM_DEFAULT_DPI 300
|
|
# endif // SPLEEB_MINIMUM_DEFAULT_DPI
|
|
|
|
# ifndef SPLEEB_DEFAULT_DPI_CONFIG_STEP
|
|
# define SPLEEB_DEFAULT_DPI_CONFIG_STEP 100
|
|
# endif // SPLEEB_DEFAULT_DPI_CONFIG_STEP
|
|
|
|
# ifndef SPLEEB_MINIMUM_SNIPING_DPI
|
|
# define SPLEEB_MINIMUM_SNIPING_DPI 100
|
|
# endif // SPLEEB_MINIMUM_SNIPING_DPI
|
|
|
|
# ifndef SPLEEB_SNIPING_DPI_CONFIG_STEP
|
|
# define SPLEEB_SNIPING_DPI_CONFIG_STEP 100
|
|
# endif // SPLEEB_SNIPING_DPI_CONFIG_STEP
|
|
|
|
# ifndef SPLEEB_DRAGSCROLL_DIVISOR
|
|
# define SPLEEB_DRAGSCROLL_DIVISOR 64
|
|
# endif // !SPLEEB_DRAGSCROLL_DIVISOR
|
|
#endif // POINTING_DEVICE_ENABLE
|
|
|
|
#ifdef SPLEEB_ENCODER_MODE_MAP_ENABLE
|
|
# ifndef SPLEEB_ENCODER_MODE_COUNT
|
|
# define SPLEEB_ENCODER_MODE_COUNT 4
|
|
# endif
|
|
|
|
typedef struct {
|
|
uint8_t mode;
|
|
// Discriminate between array members which are (un)initialized
|
|
bool initalized;
|
|
} const spleeb_enc_mode_t;
|
|
|
|
const spleeb_enc_mode_t spleeb_encoder_mode_map[NUM_ENCODERS][SPLEEB_ENCODER_MODE_COUNT];
|
|
|
|
// SPLEEB_ENC_MODE initializes the spleeb_enc_mode_t struct such that
|
|
// uninitialized mode_map members can be discriminated against when looking up
|
|
// mapped encoder modes.
|
|
# define SPLEEB_ENC_MODE(mode) \
|
|
{ mode, true }
|
|
#endif // SPLEEB_ENCODER_MODE_MAP_ENABLE
|
|
|
|
#ifdef POINTING_DEVICE_ENABLE
|
|
|
|
/** \brief Return the current DPI value for the pointer's default mode. */
|
|
uint16_t spleeb_get_pointer_default_dpi(void);
|
|
|
|
/**
|
|
* \brief Update the pointer's default DPI to the next or previous step.
|
|
*
|
|
* Increases the DPI value if `forward` is `true`, decreases it otherwise.
|
|
* The increment/decrement steps are equal to SPLEEB_DEFAULT_DPI_CONFIG_STEP.
|
|
*
|
|
* The new value is persisted in EEPROM.
|
|
*/
|
|
void spleeb_cycle_pointer_default_dpi(bool forward);
|
|
|
|
/**
|
|
* \brief Same as `spleeb_cycle_pointer_default_dpi`, but do not write to
|
|
* EEPROM.
|
|
*
|
|
* This means that reseting the board will revert the value to the last
|
|
* persisted one.
|
|
*/
|
|
void spleeb_cycle_pointer_default_dpi_noeeprom(bool forward);
|
|
|
|
/** \brief Return the current DPI value for the pointer's sniper-mode. */
|
|
uint16_t spleeb_get_pointer_sniping_dpi(void);
|
|
|
|
/**
|
|
* \brief Update the pointer's sniper-mode DPI to the next or previous step.
|
|
*
|
|
* Increases the DPI value if `forward` is `true`, decreases it otherwise.
|
|
* The increment/decrement steps are equal to SPLEEB_SNIPING_DPI_CONFIG_STEP.
|
|
*
|
|
* The new value is persisted in EEPROM.
|
|
*/
|
|
void spleeb_cycle_pointer_sniping_dpi(bool forward);
|
|
|
|
/**
|
|
* \brief Same as `spleeb_cycle_pointer_sniping_dpi`, but do not write to
|
|
* EEPROM.
|
|
*
|
|
* This means that reseting the board will revert the value to the last
|
|
* persisted one.
|
|
*/
|
|
void spleeb_cycle_pointer_sniping_dpi_noeeprom(bool forward);
|
|
|
|
/** \brief Whether sniper-mode is enabled. */
|
|
bool spleeb_get_pointer_sniping_enabled(void);
|
|
|
|
/**
|
|
* \brief Enable/disable sniper mode.
|
|
*
|
|
* When sniper mode is enabled the dpi is reduced to slow down the pointer for
|
|
* more accurate movements.
|
|
*/
|
|
void spleeb_set_pointer_sniping_enabled(bool enable);
|
|
|
|
/** \brief Whether drag-scroll is enabled. */
|
|
bool spleeb_get_pointer_dragscroll_enabled(void);
|
|
|
|
/**
|
|
* \brief Enable/disable drag-scroll mode.
|
|
*
|
|
* When drag-scroll mode is enabled, horizontal and vertical pointer movements
|
|
* are translated into horizontal and vertical scroll movements.
|
|
*/
|
|
void spleeb_set_pointer_dragscroll_enabled(bool enable);
|
|
#endif // POINTING_DEVICE_ENABLE
|