summaryrefslogtreecommitdiff
path: root/keyboards/spleeb/spleeb.h
blob: 67d01cdf35573e97f20f706d931caa6a820416a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
// 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