Keymap: Update for Drashna code - Proton C Prep Edition (#4708)
* Make CRKBD keylogger output actually show tap keys * check MT/LT for twinkling * Add ortho 5x12 support for fractal keyboard * Use newer interface for setting pins/ports * Remove custom unicode methods * Reomve unicode input info * Odd rules issue * Redefine REST note to be more pleasing * Properly disable PM LEDs with GPIO commands * Update gitlab CI yaml file * Remove extra mod tap check * Remove initial state on ergodox glow * Rev6 Cleanup * Fix KC_MAKE macro * Update GitLab CI yaml file * More GitLab CI changes * One final GitLab CI change * Remove unneeded unicode support * Optimize KC_MAKE
This commit is contained in:
		
							parent
							
								
									7f0def77a2
								
							
						
					
					
						commit
						40383089d0
					
				
					 19 changed files with 339 additions and 193 deletions
				
			
		| 
						 | 
				
			
			@ -88,16 +88,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
void matrix_init_keymap(void) {
 | 
			
		||||
    //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
 | 
			
		||||
    #ifdef SSD1306OLED
 | 
			
		||||
        iota_gfx_init(!has_usb());   // turns on the display
 | 
			
		||||
    #endif
 | 
			
		||||
  //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
 | 
			
		||||
  #ifdef SSD1306OLED
 | 
			
		||||
    iota_gfx_init(!has_usb());   // turns on the display
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  DDRD &= ~(1<<5);
 | 
			
		||||
  PORTD &= ~(1<<5);
 | 
			
		||||
  #ifndef CONVERT_TO_PROTON_C
 | 
			
		||||
    setPinOutput(D5);
 | 
			
		||||
    writePinHigh(D5);
 | 
			
		||||
 | 
			
		||||
  DDRB &= ~(1<<0);
 | 
			
		||||
  PORTB &= ~(1<<0);
 | 
			
		||||
    setPinOutput(B0);
 | 
			
		||||
    writePinHigh(B0);
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
 | 
			
		||||
| 
						 | 
				
			
			@ -126,10 +128,10 @@ const char code_to_name[60] = {
 | 
			
		|||
 | 
			
		||||
void set_keylog(uint16_t keycode, keyrecord_t *record) {
 | 
			
		||||
  char name = ' ';
 | 
			
		||||
  if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { keycode = keycode & 0xFF; }
 | 
			
		||||
  if (keycode < 60) {
 | 
			
		||||
    name = code_to_name[keycode];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // update keylog
 | 
			
		||||
  snprintf(keylog_str, sizeof(keylog_str), "%dx%d, k%2d : %c",
 | 
			
		||||
           record->event.key.row, record->event.key.col,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -89,9 +89,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
void matrix_init_keymap(void) {
 | 
			
		||||
  DDRD &= ~(1<<5);
 | 
			
		||||
  PORTD &= ~(1<<5);
 | 
			
		||||
  #ifndef CONVERT_TO_PROTON_C
 | 
			
		||||
    setPinOutput(D5);
 | 
			
		||||
    writePinHigh(D5);
 | 
			
		||||
 | 
			
		||||
  DDRB &= ~(1<<0);
 | 
			
		||||
  PORTB &= ~(1<<0);
 | 
			
		||||
    setPinOutput(B0);
 | 
			
		||||
    writePinHigh(B0);
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -97,9 +97,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
void matrix_init_keymap(void) {
 | 
			
		||||
  DDRD &= ~(1<<5);
 | 
			
		||||
  PORTD &= ~(1<<5);
 | 
			
		||||
  #ifndef CONVERT_TO_PROTON_C
 | 
			
		||||
    setPinOutput(D5);
 | 
			
		||||
    writePinHigh(D5);
 | 
			
		||||
 | 
			
		||||
  DDRB &= ~(1<<0);
 | 
			
		||||
  PORTB &= ~(1<<0);
 | 
			
		||||
    setPinOutput(B0);
 | 
			
		||||
    writePinHigh(B0);
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -87,10 +87,13 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void matrix_init_keymap(void) {
 | 
			
		||||
  DDRD &= ~(1<<5);
 | 
			
		||||
  PORTD &= ~(1<<5);
 | 
			
		||||
 | 
			
		||||
  DDRB &= ~(1<<0);
 | 
			
		||||
  PORTB &= ~(1<<0);
 | 
			
		||||
void matrix_init_keymap(void) {
 | 
			
		||||
  #ifndef CONVERT_TO_PROTON_C
 | 
			
		||||
    setPinOutput(D5);
 | 
			
		||||
    writePinHigh(D5);
 | 
			
		||||
 | 
			
		||||
    setPinOutput(B0);
 | 
			
		||||
    writePinHigh(B0);
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		|||
#ifdef UNICODEMAP_ENABLE
 | 
			
		||||
#include "drashna_unicode.h"
 | 
			
		||||
#endif // UNICODEMAP_ENABLE
 | 
			
		||||
extern uint8_t input_mode;
 | 
			
		||||
 | 
			
		||||
#ifdef RGB_MATRIX_ENABLE
 | 
			
		||||
extern bool g_suspend_state;
 | 
			
		||||
| 
						 | 
				
			
			@ -425,17 +424,12 @@ void rgb_matrix_indicators_user(void) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void matrix_init_keymap(void) {
 | 
			
		||||
#if 0
 | 
			
		||||
  #ifdef RGB_MATRIX_KEYPRESSES
 | 
			
		||||
    rgblight_mode(RGB_MATRIX_MULTISPLASH);
 | 
			
		||||
  #else
 | 
			
		||||
    rgblight_mode(RGB_MATRIX_RAINBOW_MOVING_CHEVRON);
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  input_mode = 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
void matrix_init_keymap(void) {
 | 
			
		||||
  input_mode = 2;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
#endif //RGB_MATRIX_INIT
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
TAP_DANCE_ENABLE  = yes
 | 
			
		||||
SLEEP_LED_ENABLE  = no  # Breathing sleep LED during USB suspend
 | 
			
		||||
COMMAND_ENABLE    = yes  # Commands for debug and configuration
 | 
			
		||||
COMMAND_ENABLE    = no  # Commands for debug and configuration
 | 
			
		||||
ifneq (,$(findstring ergodox_ez,$(KEYBOARD)))
 | 
			
		||||
  RGBLIGHT_ENABLE = yes
 | 
			
		||||
  RGB_MATRIX_ENABLE = no
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,3 +7,5 @@ ifneq (,$(findstring ergodox_ez,$(KEYBOARD)))
 | 
			
		|||
  RGBLIGHT_ENABLE = no
 | 
			
		||||
  RGB_MATRIX_ENABLE = yes
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
COMMAND_ENABLE = no
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,4 @@
 | 
			
		|||
#ifndef CONFIG_USER_H
 | 
			
		||||
#define CONFIG_USER_H
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if defined(RGBLIGHT_ENABLE) && !defined(RGBLED_NUM)
 | 
			
		||||
| 
						 | 
				
			
			@ -61,5 +60,3 @@
 | 
			
		|||
 | 
			
		||||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
 | 
			
		||||
//#define MIDI_TONE_KEYCODE_OCTAVES 2
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -94,7 +94,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
  KC_MAKE, _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, KC_RST,
 | 
			
		||||
  VRSN,    _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, EEP_RST,
 | 
			
		||||
  _______, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, TG_MODS,
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_NUKE
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -219,4 +219,15 @@ void rgb_matrix_indicators_user(void) {
 | 
			
		|||
void matrix_init_keymap(void) {
 | 
			
		||||
  rgblight_mode(RGB_MATRIX_MULTISPLASH);
 | 
			
		||||
}
 | 
			
		||||
#else //RGB_MATRIX_INIT
 | 
			
		||||
 | 
			
		||||
void matrix_init_keymap(void) {
 | 
			
		||||
  #ifndef CONVERT_TO_PROTON_C
 | 
			
		||||
    setPinOutput(D5);
 | 
			
		||||
    writePinHigh(D5);
 | 
			
		||||
 | 
			
		||||
    setPinOutput(B0);
 | 
			
		||||
    writePinHigh(B0);
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
#endif //RGB_MATRIX_INIT
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										16
									
								
								layouts/community/ortho_5x12/drashna/config.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								layouts/community/ortho_5x12/drashna/config.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
#pragma once
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ws2812 RGB LED */
 | 
			
		||||
#if defined(KEYBOARD_fractal)
 | 
			
		||||
  #define RGB_DI_PIN D2
 | 
			
		||||
  #undef RGBLED_NUM
 | 
			
		||||
  #define RGBLIGHT_ANIMATIONS
 | 
			
		||||
  #define RGBLED_NUM 29     // Number of LEDs
 | 
			
		||||
  #undef RGBLIGHT_HUE_STEP
 | 
			
		||||
  #define RGBLIGHT_HUE_STEP 8
 | 
			
		||||
  #undef RGBLIGHT_SAT_STEP
 | 
			
		||||
  #define RGBLIGHT_SAT_STEP 8
 | 
			
		||||
  #undef RGBLIGHT_VAL_STEP
 | 
			
		||||
  #define RGBLIGHT_VAL_STEP 8
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										156
									
								
								layouts/community/ortho_5x12/drashna/keymap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								layouts/community/ortho_5x12/drashna/keymap.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,156 @@
 | 
			
		|||
/* Copyright 2015-2017 Jack Humbert
 | 
			
		||||
 * Modified by KeyPCB for the Fractal keyboard
 | 
			
		||||
 * Backlight isn't on the Fractal, so I've removed the keycode from the keymaps
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include QMK_KEYBOARD_H
 | 
			
		||||
#include "drashna.h"
 | 
			
		||||
 | 
			
		||||
#define LAYOUT_ortho_5x12_base( \
 | 
			
		||||
    K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
 | 
			
		||||
    K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
 | 
			
		||||
    K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A,  \
 | 
			
		||||
    K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A  \
 | 
			
		||||
  ) \
 | 
			
		||||
  LAYOUT_ortho_5x12_wrapper( \
 | 
			
		||||
    KC_GRV,  K01,    K02,     K03,      K04,     K05,     K06,     K07,     K08,     K09,     K0A,     KC_BSPC, \
 | 
			
		||||
    KC_TAB,  K11,    K12,     K13,      K14,     K15,     K16,     K17,     K18,     K19,     K1A,     KC_BSPC, \
 | 
			
		||||
    KC_ESC,  K21,    K22,     K23,      K24,     K25,     K26,     K27,     K28,     K29,     K2A,     KC_QUOT, \
 | 
			
		||||
    KC_MLSF, CTL_T(K31), K32, K33,      K34,     K35,     K36,     K37,     K38,     K39,  CTL_T(K3A), KC_ENT,  \
 | 
			
		||||
    KC_NO,   OS_LCTL, OS_LALT, OS_LGUI, SP_LWER, BK_LWER, DL_RAIS, ET_RAIS, KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT  \
 | 
			
		||||
  )
 | 
			
		||||
#define LAYOUT_ortho_5x12_base_wrapper(...)       LAYOUT_ortho_5x12_base(__VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		||||
 | 
			
		||||
[_QWERTY] = LAYOUT_ortho_5x12_base_wrapper(
 | 
			
		||||
  ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________,
 | 
			
		||||
  _________________QWERTY_L1_________________, _________________QWERTY_R1_________________,
 | 
			
		||||
  _________________QWERTY_L2_________________, _________________QWERTY_R2_________________,
 | 
			
		||||
  _________________QWERTY_L3_________________, _________________QWERTY_R3_________________
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
[_COLEMAK] = LAYOUT_ortho_5x12_base_wrapper(
 | 
			
		||||
  ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________,
 | 
			
		||||
  _________________COLEMAK_L1________________, _________________COLEMAK_R1________________,
 | 
			
		||||
  _________________COLEMAK_L2________________, _________________COLEMAK_R2________________,
 | 
			
		||||
  _________________COLEMAK_L3________________, _________________COLEMAK_R3________________
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
[_DVORAK] = LAYOUT_ortho_5x12_base_wrapper(
 | 
			
		||||
  ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________,
 | 
			
		||||
  _________________DVORAK_L1_________________, _________________DVORAK_R1_________________,
 | 
			
		||||
  _________________DVORAK_L2_________________, _________________DVORAK_R2_________________,
 | 
			
		||||
  _________________DVORAK_L3_________________, _________________DVORAK_R3_________________
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
[_WORKMAN] = LAYOUT_ortho_5x12_base_wrapper(
 | 
			
		||||
  ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________,
 | 
			
		||||
  _________________WORKMAN_L1________________, _________________WORKMAN_R1________________,
 | 
			
		||||
  _________________WORKMAN_L2________________, _________________WORKMAN_R2________________,
 | 
			
		||||
  _________________WORKMAN_L3________________, _________________WORKMAN_R3________________
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
[_MODS] = LAYOUT_ortho_5x12_wrapper(
 | 
			
		||||
  _______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
 | 
			
		||||
  _______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
 | 
			
		||||
  _______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
 | 
			
		||||
  KC_LSFT, ___________________BLANK___________________, ___________________BLANK___________________, _______,
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
/* Lower
 | 
			
		||||
 * ,-----------------------------------------------------------------------------------.
 | 
			
		||||
 * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
 | 
			
		||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
			
		||||
 * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Del  |
 | 
			
		||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
			
		||||
 * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   |
 | 
			
		||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
			
		||||
 * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO ~ |ISO | |      |      |      |
 | 
			
		||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
			
		||||
 * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
 | 
			
		||||
 * `-----------------------------------------------------------------------------------'
 | 
			
		||||
 */
 | 
			
		||||
[_LOWER] = LAYOUT_ortho_5x12_wrapper( \
 | 
			
		||||
  _______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
 | 
			
		||||
  KC_TILD, _________________LOWER_L1__________________, _________________LOWER_R1__________________, KC_PIPE,
 | 
			
		||||
  KC_DEL,  _________________LOWER_L2__________________, _________________LOWER_R2__________________, _______,
 | 
			
		||||
  _______, _________________LOWER_L3__________________, _________________LOWER_R3__________________, _______,
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
/* Raise
 | 
			
		||||
 * ,-----------------------------------------------------------------------------------.
 | 
			
		||||
 * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
 | 
			
		||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
			
		||||
 * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Del  |
 | 
			
		||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
			
		||||
 * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
 | 
			
		||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
			
		||||
 * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO # |ISO / |      |      |      |
 | 
			
		||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
			
		||||
 * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
 | 
			
		||||
 * `-----------------------------------------------------------------------------------'
 | 
			
		||||
 */
 | 
			
		||||
[_RAISE] = LAYOUT_ortho_5x12_wrapper( \
 | 
			
		||||
  KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC, \
 | 
			
		||||
  KC_GRV,  _________________RAISE_L1__________________, _________________RAISE_R1__________________, _______,
 | 
			
		||||
  KC_DEL,  _________________RAISE_L2__________________, _________________RAISE_R2__________________, KC_BSLS,
 | 
			
		||||
  _______, _________________RAISE_L3__________________, _________________RAISE_R3__________________, _______,
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _________________RAISE_R3__________________
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
/* Adjust (Lower + Raise)
 | 
			
		||||
 * ,-----------------------------------------------------------------------------------.
 | 
			
		||||
 * |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |
 | 
			
		||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
			
		||||
 * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
 | 
			
		||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
			
		||||
 * |      |      |      |Aud on|AudOff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|      |      |
 | 
			
		||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
			
		||||
 * |      |Voice-|Voice+|Mus on|MusOff|MidiOn|MidOff|      |      |      |      |      |
 | 
			
		||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
			
		||||
 * |      |      |      |      |      |             |      |      |      |      |      |
 | 
			
		||||
 * `-----------------------------------------------------------------------------------'
 | 
			
		||||
 */
 | 
			
		||||
[_ADJUST] = LAYOUT_ortho_5x12_wrapper( \
 | 
			
		||||
  KC_MAKE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RST,
 | 
			
		||||
  VRSN,    _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, EEP_RST,
 | 
			
		||||
  _______, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, _______,
 | 
			
		||||
  _______, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, TG_MODS,
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
 | 
			
		||||
  switch (keycode) {
 | 
			
		||||
  }
 | 
			
		||||
  return true;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void matrix_init_keymap(void) {
 | 
			
		||||
#ifdef KEYBOARD_fractal
 | 
			
		||||
    setPinOutput(D5);
 | 
			
		||||
    writePinHigh(D5);
 | 
			
		||||
 | 
			
		||||
    setPinOutput(B0);
 | 
			
		||||
    writePinHigh(B0);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								layouts/community/ortho_5x12/drashna/rules.mk
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								layouts/community/ortho_5x12/drashna/rules.mk
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
BOOTMAGIC_ENABLE  = no       # Virtual DIP switch configuration(+1000)
 | 
			
		||||
MOUSEKEY_ENABLE   = no       # Mouse keys(+4700)
 | 
			
		||||
EXTRAKEY_ENABLE   = yes       # Audio control and System control(+450)
 | 
			
		||||
CONSOLE_ENABLE    = no         # Console for debug(+400)
 | 
			
		||||
COMMAND_ENABLE    = no        # Commands for debug and configuration
 | 
			
		||||
TAP_DANCE_ENABLE  = no
 | 
			
		||||
AUDIO_ENABLE      = yes
 | 
			
		||||
ifneq (,$(findstring fractal,$(KEYBOARD))) # Make sure it IS the Planck Light
 | 
			
		||||
  RGB_MATRIX_ENABLE   = no
 | 
			
		||||
  AUDIO_ENABLE        = no
 | 
			
		||||
  RGBLIGHT_ENABLE     = yes
 | 
			
		||||
  RGBLIGHT_TWINKLE    = yes
 | 
			
		||||
  BOOTLOADER          = qmk-dfu
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(strip $(PROTOCOL)), VUSB)
 | 
			
		||||
NKRO_ENABLE       = no
 | 
			
		||||
else
 | 
			
		||||
NKRO_ENABLE       = yes
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
MACROS_ENABLED    = no
 | 
			
		||||
| 
						 | 
				
			
			@ -1,26 +1,78 @@
 | 
			
		|||
stages:
 | 
			
		||||
  - test
 | 
			
		||||
  - build
 | 
			
		||||
  - deploy
 | 
			
		||||
 | 
			
		||||
qmk_firmware:
 | 
			
		||||
Tests:
 | 
			
		||||
  stage: test
 | 
			
		||||
  variables:
 | 
			
		||||
    GIT_SUBMODULE_STRATEGY: recursive
 | 
			
		||||
  tags:
 | 
			
		||||
    - linux
 | 
			
		||||
  image: ubuntu:18.10
 | 
			
		||||
  before_script:
 | 
			
		||||
    - apt-get update -qy
 | 
			
		||||
    - apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip
 | 
			
		||||
    - avr-gcc --version
 | 
			
		||||
    - uname -a
 | 
			
		||||
  script:
 | 
			
		||||
    - make test:all
 | 
			
		||||
    - make planck/rev6:default
 | 
			
		||||
 | 
			
		||||
QMK Firmware Defaults:
 | 
			
		||||
  stage: deploy
 | 
			
		||||
  variables:
 | 
			
		||||
    GIT_SUBMODULE_STRATEGY: recursive
 | 
			
		||||
  tags:
 | 
			
		||||
    - linux
 | 
			
		||||
  image: ubuntu:18.10
 | 
			
		||||
  before_script:
 | 
			
		||||
    - apt-get update -qy
 | 
			
		||||
    - apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip
 | 
			
		||||
    - avr-gcc --version
 | 
			
		||||
    - uname -a
 | 
			
		||||
  script:
 | 
			
		||||
    - make test:all
 | 
			
		||||
    - make all:default -j16
 | 
			
		||||
 | 
			
		||||
Drashna Firmware:
 | 
			
		||||
  stage: build
 | 
			
		||||
  variables:
 | 
			
		||||
    GIT_SUBMODULE_STRATEGY: recursive
 | 
			
		||||
  tags:
 | 
			
		||||
    - linux
 | 
			
		||||
  image: ubuntu
 | 
			
		||||
  image: ubuntu:18.10
 | 
			
		||||
  before_script:
 | 
			
		||||
    - apt-get update -qy
 | 
			
		||||
    - apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util diffutils gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip
 | 
			
		||||
    - apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip
 | 
			
		||||
    - avr-gcc --version
 | 
			
		||||
  script:
 | 
			
		||||
    - make iris/rev2:drashna:production iris/rev2:drashna_old:production ergodox_ez:drashna ergodox_ez:drashna_glow viterbi/rev1:drashna:production orthodox/rev1:drashna:production orthodox/rev3:drashna:production crkbd:drashna:production planck/light:drashna:production
 | 
			
		||||
    - make iris/rev2:drashna iris/rev2:drashna_old ergodox_ez:drashna ergodox_ez:drashna_glow viterbi/rev1:drashna orthodox/rev1:drashna orthodox/rev3:drashna crkbd:drashna planck/light:drashna planck/rev6:drashna fractal:drashna
 | 
			
		||||
  artifacts:
 | 
			
		||||
    name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
 | 
			
		||||
    paths:
 | 
			
		||||
      - ./*.hex
 | 
			
		||||
      - ./*.bin
 | 
			
		||||
  only:
 | 
			
		||||
    - master
 | 
			
		||||
    - drashna_keymaps
 | 
			
		||||
    - merge-requests
 | 
			
		||||
    - branches
 | 
			
		||||
    expire_in: 1 month
 | 
			
		||||
 | 
			
		||||
Firmware Deploy:
 | 
			
		||||
  stage: deploy
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - Drashna Firmware
 | 
			
		||||
  variables:
 | 
			
		||||
    GIT_SUBMODULE_STRATEGY: recursive
 | 
			
		||||
  tags:
 | 
			
		||||
    - linux
 | 
			
		||||
  image: ubuntu:18.10
 | 
			
		||||
  before_script:
 | 
			
		||||
    - apt-get update -qy
 | 
			
		||||
    - apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip
 | 
			
		||||
    - avr-gcc --version
 | 
			
		||||
  script:
 | 
			
		||||
    - make iris/rev2:drashna:production iris/rev2:drashna_old:production ergodox_ez:drashna ergodox_ez:drashna_glow viterbi/rev1:drashna:production orthodox/rev1:drashna:production orthodox/rev3:drashna:production crkbd:drashna:production planck/light:drashna planck/rev6:drashna fractal:drashna:production
 | 
			
		||||
  artifacts:
 | 
			
		||||
    name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
 | 
			
		||||
    paths:
 | 
			
		||||
      - ./*.hex
 | 
			
		||||
      - ./*.bin
 | 
			
		||||
    expire_in: 1 month
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,8 +14,12 @@
 | 
			
		|||
#define AUDIO_CLICKY_FREQ_RANDOMNESS 1.5f
 | 
			
		||||
// #ifdef RGBLIGHT_ENABLE
 | 
			
		||||
// #define NO_MUSIC_MODE
 | 
			
		||||
// #endif //RGBLIGHT_ENABLE
 | 
			
		||||
#endif
 | 
			
		||||
// #endif //RGBLIGHT_ENABLE/
 | 
			
		||||
#ifndef __arm__
 | 
			
		||||
#undef  NOTE_REST
 | 
			
		||||
#define NOTE_REST         1.00f
 | 
			
		||||
#endif // !__arm__
 | 
			
		||||
#endif // !AUDIO_ENABLE
 | 
			
		||||
 | 
			
		||||
#ifdef RGBLIGHT_ENABLE
 | 
			
		||||
#define RGBLIGHT_SLEEP
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,27 +51,30 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
			
		|||
 | 
			
		||||
  case KC_MAKE:  // Compiles the firmware, and adds the flash command based on keyboard bootloader
 | 
			
		||||
    if (!record->event.pressed) {
 | 
			
		||||
      uint8_t temp_mod = get_mods();
 | 
			
		||||
      uint8_t temp_osm = get_oneshot_mods();
 | 
			
		||||
      clear_mods(); clear_oneshot_mods();
 | 
			
		||||
      send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), 10);
 | 
			
		||||
      if (temp_mod & MODS_SHIFT_MASK || temp_osm & MODS_SHIFT_MASK) {
 | 
			
		||||
        #if defined(__ARM__)
 | 
			
		||||
          send_string_with_delay_P(PSTR(":dfu-util"), 10);
 | 
			
		||||
        #elif defined(BOOTLOADER_DFU)
 | 
			
		||||
          send_string_with_delay_P(PSTR(":dfu"), 10);
 | 
			
		||||
        #elif defined(BOOTLOADER_HALFKAY)
 | 
			
		||||
          send_string_with_delay_P(PSTR(":teensy"), 10);
 | 
			
		||||
        #elif defined(BOOTLOADER_CATERINA)
 | 
			
		||||
          send_string_with_delay_P(PSTR(":avrdude"), 10);
 | 
			
		||||
        #endif // bootloader options
 | 
			
		||||
      }
 | 
			
		||||
      #if defined(KEYBOARD_viterbi)
 | 
			
		||||
        send_string_with_delay_P(PSTR(":dfu"), 10);
 | 
			
		||||
      #if !defined(KEYBOARD_viterbi)
 | 
			
		||||
        uint8_t temp_mod = get_mods();
 | 
			
		||||
        uint8_t temp_osm = get_oneshot_mods();
 | 
			
		||||
        clear_mods(); clear_oneshot_mods();
 | 
			
		||||
      #endif
 | 
			
		||||
      send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), MACRO_TIMER);
 | 
			
		||||
      #if defined(KEYBOARD_viterbi)
 | 
			
		||||
        send_string_with_delay_P(PSTR(":dfu" SS_TAP(X_ENTER)), MACRO_TIMER);
 | 
			
		||||
      #else
 | 
			
		||||
        if (temp_mod & MODS_SHIFT_MASK || temp_osm & MODS_SHIFT_MASK) {
 | 
			
		||||
          #if defined(__arm__)
 | 
			
		||||
            send_string_with_delay_P(PSTR(":dfu-util"), MACRO_TIMER);
 | 
			
		||||
          #elif defined(BOOTLOADER_DFU)
 | 
			
		||||
            send_string_with_delay_P(PSTR(":dfu"), MACRO_TIMER);
 | 
			
		||||
          #elif defined(BOOTLOADER_HALFKAY)
 | 
			
		||||
            send_string_with_delay_P(PSTR(":teensy"), MACRO_TIMER);
 | 
			
		||||
          #elif defined(BOOTLOADER_CATERINA)
 | 
			
		||||
            send_string_with_delay_P(PSTR(":avrdude"), MACRO_TIMER);
 | 
			
		||||
          #endif // bootloader options
 | 
			
		||||
        }
 | 
			
		||||
        if (temp_mod & MODS_CTRL_MASK || temp_osm & MODS_CTRL_MASK) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), MACRO_TIMER); }
 | 
			
		||||
        send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), MACRO_TIMER);
 | 
			
		||||
        set_mods(temp_mod);
 | 
			
		||||
      #endif
 | 
			
		||||
      if (temp_mod & MODS_CTRL_MASK || temp_osm & MODS_CTRL_MASK) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10); }
 | 
			
		||||
      send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10);
 | 
			
		||||
      set_mods(temp_mod);
 | 
			
		||||
    }
 | 
			
		||||
    break;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -200,7 +200,10 @@ void start_rgb_light(void) {
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
 | 
			
		||||
    switch (keycode) {
 | 
			
		||||
  if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) {
 | 
			
		||||
    keycode = keycode & 0xFF;
 | 
			
		||||
  }
 | 
			
		||||
  switch (keycode) {
 | 
			
		||||
#ifdef RGBLIGHT_TWINKLE
 | 
			
		||||
    case KC_A ... KC_SLASH:
 | 
			
		||||
    case KC_F1 ... KC_F12:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,16 +42,3 @@ ifdef CONSOLE_ENABLE
 | 
			
		|||
    OPT_DEFS += -DKEYLOGGER_ENABLE
 | 
			
		||||
  endif
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ifeq ($(strip $(UCIS_ENABLE)), yes)
 | 
			
		||||
  SRC += send_unicode.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
 | 
			
		||||
  SRC += send_unicode.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(strip $(UNICODE_ENABLE)), yes)
 | 
			
		||||
  SRC += send_unicode.c
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,112 +0,0 @@
 | 
			
		|||
// Written by konstantin: vomindoraan
 | 
			
		||||
#include "send_unicode.h"
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
__attribute__((weak))
 | 
			
		||||
void send_unicode_hex_string(const char* str) {
 | 
			
		||||
  if (!str) { return; } // Safety net
 | 
			
		||||
 | 
			
		||||
  while (*str) {
 | 
			
		||||
    // Find the next code point (token) in the string
 | 
			
		||||
    for (; *str == ' '; str++);
 | 
			
		||||
    size_t n = strcspn(str, " "); // Length of the current token
 | 
			
		||||
    char code_point[n+1];
 | 
			
		||||
    strncpy(code_point, str, n);
 | 
			
		||||
    code_point[n] = '\0'; // Make sure it's null-terminated
 | 
			
		||||
 | 
			
		||||
    // Normalize the code point: make all hex digits lowercase
 | 
			
		||||
    for (char *p = code_point; *p; p++) {
 | 
			
		||||
      *p = tolower((unsigned char)*p);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Send the code point as a Unicode input string
 | 
			
		||||
    unicode_input_start();
 | 
			
		||||
    send_string(code_point);
 | 
			
		||||
    unicode_input_finish();
 | 
			
		||||
 | 
			
		||||
    str += n; // Move to the first ' ' (or '\0') after the current token
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// (ノಠ痊ಠ)ノ彡┻━┻
 | 
			
		||||
//   send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
 | 
			
		||||
 | 
			
		||||
//Old code
 | 
			
		||||
// (╯°□°)╯ ︵ ┻━┻
 | 
			
		||||
      #if 0
 | 
			
		||||
      register_code(KC_RSFT);
 | 
			
		||||
      tap(KC_9);
 | 
			
		||||
      unregister_code(KC_RSFT);
 | 
			
		||||
      process_unicode((0x256F | QK_UNICODE), record); // Arm
 | 
			
		||||
      process_unicode((0x00B0 | QK_UNICODE), record); // Eye
 | 
			
		||||
      process_unicode((0x25A1 | QK_UNICODE), record); // Mouth
 | 
			
		||||
      process_unicode((0x00B0 | QK_UNICODE), record); // Eye
 | 
			
		||||
      register_code(KC_RSFT);
 | 
			
		||||
      tap(KC_0);
 | 
			
		||||
      unregister_code(KC_RSFT);
 | 
			
		||||
      process_unicode((0x256F | QK_UNICODE), record); // Arm
 | 
			
		||||
      tap(KC_SPC);
 | 
			
		||||
      process_unicode((0x0361 | QK_UNICODE), record); // Flippy
 | 
			
		||||
      tap(KC_SPC);
 | 
			
		||||
      process_unicode((0x253B | QK_UNICODE), record); // Table
 | 
			
		||||
      process_unicode((0x2501 | QK_UNICODE), record); // Table
 | 
			
		||||
      process_unicode((0x253B | QK_UNICODE), record); // Table
 | 
			
		||||
      #endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// If you need a good converter: https://r12a.github.io/app-conversion/
 | 
			
		||||
uint8_t saved_mods;
 | 
			
		||||
 | 
			
		||||
void unicode_input_start (void) {
 | 
			
		||||
  // save current mods
 | 
			
		||||
  saved_mods = get_mods(); // Save current mods
 | 
			
		||||
  clear_mods(); // Unregister mods to start from a clean state
 | 
			
		||||
 | 
			
		||||
  switch(get_unicode_input_mode()) {
 | 
			
		||||
  case UC_OSX:
 | 
			
		||||
    register_code(KC_LALT);
 | 
			
		||||
    break;
 | 
			
		||||
  case UC_OSX_RALT:
 | 
			
		||||
    register_code(KC_RALT);
 | 
			
		||||
    break;
 | 
			
		||||
  case UC_LNX:
 | 
			
		||||
    register_code(KC_LCTL);
 | 
			
		||||
    register_code(KC_LSFT);
 | 
			
		||||
    register_code(KC_U);
 | 
			
		||||
    unregister_code(KC_U);
 | 
			
		||||
    unregister_code(KC_LSFT);
 | 
			
		||||
    unregister_code(KC_LCTL);
 | 
			
		||||
    break;
 | 
			
		||||
  case UC_WIN:
 | 
			
		||||
    register_code(KC_LALT);
 | 
			
		||||
    register_code(KC_PPLS);
 | 
			
		||||
    unregister_code(KC_PPLS);
 | 
			
		||||
    break;
 | 
			
		||||
  case UC_WINC:
 | 
			
		||||
    register_code(KC_RALT);
 | 
			
		||||
    unregister_code(KC_RALT);
 | 
			
		||||
    register_code(KC_U);
 | 
			
		||||
    unregister_code(KC_U);
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  wait_ms(UNICODE_TYPE_DELAY);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void unicode_input_finish (void) {
 | 
			
		||||
  switch(get_unicode_input_mode()) {
 | 
			
		||||
    case UC_OSX:
 | 
			
		||||
    case UC_WIN:
 | 
			
		||||
      unregister_code(KC_LALT);
 | 
			
		||||
      break;
 | 
			
		||||
    case UC_OSX_RALT:
 | 
			
		||||
      unregister_code(KC_RALT);
 | 
			
		||||
      break;
 | 
			
		||||
    case UC_LNX:
 | 
			
		||||
      register_code(KC_SPC);
 | 
			
		||||
      unregister_code(KC_SPC);
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  set_mods(saved_mods); // Reregister previously set mods
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -14,6 +14,7 @@ expanded before being used as arguments to the LAYOUT_xxx macro.
 | 
			
		|||
#define KEYMAP_wrapper(...)                  LAYOUT(__VA_ARGS__)
 | 
			
		||||
#define LAYOUT_wrapper(...)                  LAYOUT(__VA_ARGS__)
 | 
			
		||||
#define LAYOUT_ortho_4x12_wrapper(...)       LAYOUT_ortho_4x12(__VA_ARGS__)
 | 
			
		||||
#define LAYOUT_ortho_5x12_wrapper(...)       LAYOUT_ortho_5x12(__VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Blocks for each of the four major keyboard layouts
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue