qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

unicode.h (3557B)


      1 /* Copyright 2022
      2  *
      3  * This program is free software: you can redistribute it and/or modify
      4  * it under the terms of the GNU General Public License as published by
      5  * the Free Software Foundation, either version 2 of the License, or
      6  * (at your option) any later version.
      7  *
      8  * This program is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11  * GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     15  */
     16 
     17 #pragma once
     18 
     19 #include <stdint.h>
     20 
     21 #include "compiler_support.h"
     22 #include "unicode_keycodes.h"
     23 
     24 /**
     25  * \file
     26  *
     27  * \defgroup unicode Unicode
     28  * \{
     29  */
     30 
     31 typedef union unicode_config_t {
     32     uint8_t raw;
     33     struct {
     34         uint8_t input_mode : 8;
     35     };
     36 } unicode_config_t;
     37 
     38 STATIC_ASSERT(sizeof(unicode_config_t) == sizeof(uint8_t), "Unicode EECONFIG out of spec.");
     39 
     40 extern unicode_config_t unicode_config;
     41 
     42 enum unicode_input_modes {
     43     UNICODE_MODE_MACOS,      // macOS using Unicode Hex Input
     44     UNICODE_MODE_LINUX,      // Linux using IBus
     45     UNICODE_MODE_WINDOWS,    // Windows using EnableHexNumpad
     46     UNICODE_MODE_BSD,        // BSD (not implemented)
     47     UNICODE_MODE_WINCOMPOSE, // Windows using WinCompose (https://github.com/samhocevar/wincompose)
     48     UNICODE_MODE_EMACS,      // Emacs is an operating system in search of a good text editor
     49 
     50     UNICODE_MODE_COUNT // Number of available input modes (always leave at the end)
     51 };
     52 
     53 void unicode_input_mode_init(void);
     54 
     55 /**
     56  * \brief Get the current Unicode input mode.
     57  *
     58  * \return The currently active Unicode input mode.
     59  */
     60 uint8_t get_unicode_input_mode(void);
     61 
     62 /**
     63  * \brief Set the Unicode input mode.
     64  *
     65  * \param mode The input mode to set.
     66  */
     67 void set_unicode_input_mode(uint8_t mode);
     68 
     69 /**
     70  * \brief Change to the next Unicode input mode.
     71  */
     72 void unicode_input_mode_step(void);
     73 
     74 /**
     75  * \brief Change to the previous Unicode input mode.
     76  */
     77 void unicode_input_mode_step_reverse(void);
     78 
     79 /**
     80  * \brief User-level callback, invoked when the input mode is changed.
     81  *
     82  * \param input_mode The new input mode.
     83  */
     84 void unicode_input_mode_set_user(uint8_t input_mode);
     85 
     86 /**
     87  * \brief Keyboard-level callback, invoked when the input mode is changed.
     88  *
     89  * \param input_mode The new input mode.
     90  */
     91 void unicode_input_mode_set_kb(uint8_t input_mode);
     92 
     93 /**
     94  * \brief Begin the Unicode input sequence. The exact behavior depends on the currently selected input mode.
     95  */
     96 void unicode_input_start(void);
     97 
     98 /**
     99  * \brief Complete the Unicode input sequence. The exact behavior depends on the currently selected input mode.
    100  */
    101 void unicode_input_finish(void);
    102 
    103 /**
    104  * \brief Cancel the Unicode input sequence. The exact behavior depends on the currently selected input mode.
    105  */
    106 void unicode_input_cancel(void);
    107 
    108 /**
    109  * \brief Send a 16-bit hex number.
    110  *
    111  * \param hex The number to send.
    112  */
    113 void register_hex(uint16_t hex);
    114 
    115 /**
    116  * \brief Send a 32-bit hex number.
    117  *
    118  * \param hex The number to send.
    119  */
    120 void register_hex32(uint32_t hex);
    121 
    122 /**
    123  * \brief Input a single Unicode character. A surrogate pair will be sent if required by the input mode.
    124  *
    125  * \param code_point The code point of the character to send.
    126  */
    127 void register_unicode(uint32_t code_point);
    128 
    129 /**
    130  * \brief Send a string containing Unicode characters.
    131  *
    132  * \param str The string to send.
    133  */
    134 void send_unicode_string(const char *str);
    135 
    136 /** \} */