You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			166 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
			
		
		
	
	
			166 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
| /*! \file
 | |
|  *  \brief \ref Key, an abstraction for handling pressed keys and their
 | |
|  * modifiers
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| #include "../types.h"
 | |
| 
 | |
| /*! \brief Class that abstracts a key, made up of the scan code and the modifier
 | |
|  * bits.
 | |
|  */
 | |
| struct Key {
 | |
|   /*! \brief The keys' scan codes (code 1)
 | |
|    */
 | |
|   enum Scancode : uint8_t {
 | |
|     // Invalid scan code
 | |
|     KEY_INVALID = 0,
 | |
| 
 | |
|     // "real" valid scan codes
 | |
|     KEY_ESCAPE,
 | |
|     KEY_1,
 | |
|     KEY_2,
 | |
|     KEY_3,
 | |
|     KEY_4,
 | |
|     KEY_5,
 | |
|     KEY_6,
 | |
|     KEY_7,
 | |
|     KEY_8,
 | |
|     KEY_9,
 | |
|     KEY_0,
 | |
|     KEY_DASH,
 | |
|     KEY_EQUAL,
 | |
|     KEY_BACKSPACE,
 | |
|     KEY_TAB,
 | |
|     KEY_Q,
 | |
|     KEY_W,
 | |
|     KEY_E,
 | |
|     KEY_R,
 | |
|     KEY_T,
 | |
|     KEY_Y,
 | |
|     KEY_U,
 | |
|     KEY_I,
 | |
|     KEY_O,
 | |
|     KEY_P,
 | |
|     KEY_OPEN_BRACKET,
 | |
|     KEY_CLOSE_BRACKET,
 | |
|     KEY_ENTER,
 | |
|     KEY_LEFT_CTRL,
 | |
|     KEY_A,
 | |
|     KEY_S,
 | |
|     KEY_D,
 | |
|     KEY_F,
 | |
|     KEY_G,
 | |
|     KEY_H,
 | |
|     KEY_J,
 | |
|     KEY_K,
 | |
|     KEY_L,
 | |
|     KEY_SEMICOLON,
 | |
|     KEY_APOSTROPH,
 | |
|     KEY_GRAVE_ACCENT,
 | |
|     KEY_LEFT_SHIFT,
 | |
|     KEY_BACKSLASH,
 | |
|     KEY_Z,
 | |
|     KEY_X,
 | |
|     KEY_C,
 | |
|     KEY_V,
 | |
|     KEY_B,
 | |
|     KEY_N,
 | |
|     KEY_M,
 | |
|     KEY_COMMA,
 | |
|     KEY_PERIOD,
 | |
|     KEY_SLASH,
 | |
|     KEY_RIGHT_SHIFT,
 | |
|     KEY_KP_STAR,
 | |
|     KEY_LEFT_ALT,
 | |
|     KEY_SPACEBAR,
 | |
|     KEY_CAPS_LOCK,
 | |
|     KEY_F1,
 | |
|     KEY_F2,
 | |
|     KEY_F3,
 | |
|     KEY_F4,
 | |
|     KEY_F5,
 | |
|     KEY_F6,
 | |
|     KEY_F7,
 | |
|     KEY_F8,
 | |
|     KEY_F9,
 | |
|     KEY_F10,
 | |
|     KEY_NUM_LOCK,
 | |
|     KEY_SCROLL_LOCK,
 | |
|     KEY_KP_7,
 | |
|     KEY_KP_8,
 | |
|     KEY_KP_9,
 | |
|     KEY_KP_DASH,
 | |
|     KEY_KP_4,
 | |
|     KEY_KP_5,
 | |
|     KEY_KP_6,
 | |
|     KEY_KP_PLUS,
 | |
|     KEY_KP_1,
 | |
|     KEY_KP_2,
 | |
|     KEY_KP_3,
 | |
|     KEY_KP_0,
 | |
|     KEY_KP_PERIOD,
 | |
|     KEY_SYSREQ,
 | |
|     KEY_EUROPE_2,
 | |
|     KEY_F11,
 | |
|     KEY_F12,
 | |
|     KEY_KP_EQUAL,
 | |
| 
 | |
|     // Number of keys (excluding aliases below)
 | |
|     KEYS,
 | |
| 
 | |
|     // aliases
 | |
|     KEY_DIV = KEY_7,
 | |
|     KEY_DEL = KEY_KP_PERIOD,
 | |
|     KEY_UP = KEY_KP_8,
 | |
|     KEY_DOWN = KEY_KP_2,
 | |
|     KEY_LEFT = KEY_KP_4,
 | |
|     KEY_RIGHT = KEY_KP_6,
 | |
|   };
 | |
| 
 | |
|   Scancode scancode;
 | |
| 
 | |
|   // bit masks for the modifier keys
 | |
|   bool shift : 1, alt_left : 1, alt_right : 1, ctrl_left : 1, ctrl_right : 1,
 | |
|       caps_lock : 1, num_lock : 1, scroll_lock : 1;
 | |
| 
 | |
|   /*! \brief Default constructor: Instantiates an invalid key by setting ASCII,
 | |
|    * scan code, and modifier bits to 0
 | |
|    */
 | |
|   Key()
 | |
|       : scancode(KEY_INVALID),
 | |
|         shift(false),
 | |
|         alt_left(false),
 | |
|         alt_right(false),
 | |
|         ctrl_left(false),
 | |
|         ctrl_right(false),
 | |
|         caps_lock(false),
 | |
|         num_lock(false),
 | |
|         scroll_lock(false) {}
 | |
| 
 | |
|   /*! \brief Invalid keys have a scancode = 0
 | |
|    *  \return Checks whether a key is valid.
 | |
|    */
 | |
|   bool valid() const { return scancode != KEY_INVALID && scancode < KEYS; }
 | |
| 
 | |
|   /*! \brief Marks the key as invalid by setting the scan code to 0.
 | |
|    *
 | |
|    */
 | |
|   void invalidate() { scancode = KEY_INVALID; }
 | |
| 
 | |
|   /*! \brief Get the key's ASCII value
 | |
|    *  \return the key's ASCII value
 | |
|    */
 | |
|   unsigned char ascii() const;
 | |
| 
 | |
|   /*! \brief Indicates whether the ALT modifier is set
 | |
|    *  \return `true` if ALT key was pressed during key press
 | |
|    */
 | |
|   bool alt() const { return alt_left || alt_right; }
 | |
| 
 | |
|   /*! \brief Indicates whether the CTRL modifier is set
 | |
|    *  \return `true` if CTRL key was pressed during key press
 | |
|    */
 | |
|   bool ctrl() const { return ctrl_left || ctrl_right; }
 | |
| };
 |