aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keyboards/atreus62/keymaps/d4mation/keymap.c196
-rw-r--r--keyboards/atreus62/keymaps/d4mation/readme.md40
-rw-r--r--keyboards/atreus62/keymaps/d4mation/rules.mk2
-rw-r--r--users/d4mation/config.h1
-rw-r--r--users/d4mation/d4mation.c37
-rw-r--r--users/d4mation/d4mation.h17
-rw-r--r--users/d4mation/macros.c160
-rw-r--r--users/d4mation/macros.h23
-rw-r--r--users/d4mation/rules.mk15
-rw-r--r--users/d4mation/tap-dance.c6
-rw-r--r--users/d4mation/tap-dance.h7
-rw-r--r--users/d4mation/tap-hold.c28
-rw-r--r--users/d4mation/tap-hold.h5
-rw-r--r--users/d4mation/zalgo.c21
-rw-r--r--users/d4mation/zalgo.h5
15 files changed, 563 insertions, 0 deletions
diff --git a/keyboards/atreus62/keymaps/d4mation/keymap.c b/keyboards/atreus62/keymaps/d4mation/keymap.c
new file mode 100644
index 000000000..63b9d6142
--- /dev/null
+++ b/keyboards/atreus62/keymaps/d4mation/keymap.c
@@ -0,0 +1,196 @@
1#include QMK_KEYBOARD_H
2#include "d4mation.h"
3
4enum layer_names {
5 _DVR,
6 _QWR,
7 _LOWER,
8 _RAISE,
9 _NUM,
10 _ADJUST
11};
12
13enum keymap_custom_keycodes {
14 LOWER = NEW_SAFE_RANGE,
15 RAISE
16};
17
18const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
19
20 /* Default/Dvorak layer
21 * ,-----------------------------------------. ,-----------------------------------------.
22 * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | / |
23 * |------+------+------+------+------+------| |------+------+------+------+------+------|
24 * | Tab | ' | , | . | P | Y | | F | G | C | R | L | = |
25 * |------+------+------+------+------+------| |------+------+------+------+------+------|
26 * | Ctrl | A | O | E | U | I |,------.,------.| D | H | T | N | S | - |
27 * |------+------+------+------+------+------|| || ||------+------+------+------+------+------|
28 * |Shift | ; | Q | J | K | X ||Super ||Enter || B | M | W | V | Z | \ |
29 * |------+------+------+------+------+------|| || ||------+------+------+------+------+------|
30 * | NUM | Alt | Home | End |Lower | Bksp |`------'`------'|Space |Raise | Left | Down | Up |Right |
31 * `-----------------------------------------' `-----------------------------------------'
32 */
33
34 [_DVR] = LAYOUT(
35 _GRAVE_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_SLSH,
36 KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_EQL,
37 KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS,
38 TD(SHIFT_CAPS), KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_BSLS,
39 TG(_NUM), KC_RALT, KC_HOME, KC_END, LOWER, KC_BSPC, KC_LGUI, KC_ENT, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
40 ),
41
42 /* Qwerty layer, more "standard" for other people who may need to use my keyboard or for games where using Qwerty is just easier
43 * ,-----------------------------------------. ,-----------------------------------------.
44 * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - |
45 * |------+------+------+------+------+------| |------+------+------+------+------+------|
46 * | Tab | Q | W | E | R | T | | Y | U | I | O | P | \ |
47 * |------+------+------+------+------+------| |------+------+------+------+------+------|
48 * | Ctrl | A | S | D | F | G |,------.,------.| H | J | K | L | ; | ' |
49 * |------+------+------+------+------+------|| || ||------+------+------+------+------+------|
50 * |Shift | Z | X | C | V | B ||Super ||Enter || N | M | , | . | / | = |
51 * |------+------+------+------+------+------|| || ||------+------+------+------+------+------|
52 * | NUM | Alt | Home | End |Lower | Bksp |`------'`------'|Space |Raise | Left | Down | Up |Right |
53 * `-----------------------------------------' `-----------------------------------------'
54 */
55
56 [_QWR] = LAYOUT(
57 _GRAVE_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
58 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
59 KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
60 TD(SHIFT_CAPS), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_EQL,
61 TG(_NUM), KC_RALT, KC_HOME, KC_END, LOWER, KC_BSPC, KC_LGUI, KC_ENT, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
62 ),
63
64 /* "Lower" layer
65 * ,-----------------------------------------. ,-----------------------------------------.
66 * | F11 | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F12 |
67 * |------+------+------+------+------+------| |------+------+------+------+------+------|
68 * | | | | |SLEEP | | | | | SCRGB| | | |
69 * |------+------+------+------+------+------| |------+------+------+------+------+------|
70 * | | | | | | |,------.,------.| | | | { | } | |
71 * |------+------+------+------+------+------|| || ||------+------+------+------+------+------|
72 * | | | | | | || || || | Mute | VolD | VolU | | |
73 * |------+------+------+------+------+------|| || ||------+------+------+------+------+------|
74 * | | |PageUp|PgDown| | Del |`------'`------'| Ins | | | | | |
75 * `-----------------------------------------' `-----------------------------------------'
76 */
77
78 [_LOWER] = LAYOUT(
79 KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12,
80 _______, _______, _______, _______, SLEEP, _______, _______, _______, SCRGB, _______, _______, _______,
81 _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LCBR, KC_RCBR, _______,
82 _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______,
83 _______, _______, KC_PGUP, KC_PGDN, _______, KC_DEL, _______, _______, KC_INS, _______, _______, _______, _______, _______
84 ),
85
86 /* "Raise" layer
87 * ,-----------------------------------------. ,-----------------------------------------.
88 * | F11 | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F12 |
89 * |------+------+------+------+------+------| |------+------+------+------+------+------|
90 * | | |<?php>| ?> | | | |ZALGO | | | | | |
91 * |------+------+------+------+------+------| |------+------+------+------+------+------|
92 * | | Shrug|Lenny |Magic |Disfac| |,------.,------.| | | | [ | ] | |
93 * |------+------+------+------+------+------|| || ||------+------+------+------+------+------|
94 * | | Ameno| Tflip| Tput | | || || || | Prev | Play | Next | | |
95 * |------+------+------+------+------+------|| || ||------+------+------+------+------+------|
96 * | | |PageUp|PgDown| | Del |`------'`------'| Ins | | | | | |
97 * `-----------------------------------------' `-----------------------------------------'
98 */
99
100 [_RAISE] = LAYOUT(
101 KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12,
102 _______, _______, PHPOPEN, PHPCLSE, _______, _______, ZALGO, _______, _______, _______, _______, _______,
103 _______, SHRUG, LENNY, MAGIC, DISFACE, _______, _______, _______, _______, KC_LBRC, KC_RBRC,_______,
104 _______, AMENO, TFLIP, TPUT, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______,
105 _______, _______, KC_PGUP, KC_PGDN, _______, KC_DEL, _______, _______, KC_INS, _______, _______, _______, _______, _______
106 ),
107
108 /* "Numpad" layer
109 * ,-----------------------------------------. ,-----------------------------------------.
110 * | | | / | * | - | | | | | / | * | - | |
111 * |------+------+------+------+------+------| |------+------+------+------+------+------|
112 * | | 7 | 8 | 9 | + | | | | 7 | 8 | 9 | + | |
113 * |------+------+------+------+------+------| |------+------+------+------+------+------|
114 * | | 4 | 5 | 6 | + | |,------.,------.| | 4 | 5 | 6 | + | |
115 * |------+------+------+------+------+------|| || ||------+------+------+------+------+------|
116 * | | 1 | 2 | 3 | Enter| || || || | 1 | 2 | 3 | Enter| |
117 * |------+------+------+------+------+------|| || ||------+------+------+------+------+------|
118 * | | 0 | 0 | . | Enter| |`------'`------'| | 0 | 0 | . | Enter| |
119 * `-----------------------------------------' `-----------------------------------------'
120 */
121
122 [_NUM] = LAYOUT(
123 _______, _______, KC_PSLS, KC_PAST, KC_PMNS, _______, _______, _______, KC_PSLS, KC_PAST, KC_PMNS, _______,
124 _______, KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, _______, _______, KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, _______,
125 _______, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, _______, _______, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, _______,
126 _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, _______, _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, _______,
127 _______, KC_KP_0, KC_KP_0, KC_PDOT, KC_PENT, _______, _______, _______, _______, KC_KP_0, KC_KP_0, KC_PDOT, KC_PENT, _______
128 ),
129
130 /* "Adjust" layer, only active if both "Lower" and "Raise" are active at the same time
131 * All unused keys are blanked out for this layer
132 * ,-----------------------------------------. ,-----------------------------------------.
133 * | NO | NO | NO | NO | NO | NO | | NO | NO | NO | NO | NO | NO |
134 * |------+------+------+------+------+------| |------+------+------+------+------+------|
135 * | NO |RESET | NO | NO | NO | NO | | NO | NO | NO | NO | NO | NO |
136 * |------+------+------+------+------+------| |------+------+------+------+------+------|
137 * | NO | NO | NO |UC WIN|UC OSX| NO |,------.,------.| NO |Dvorak|Qwerty| NO | NO | NO |
138 * |------+------+------+------+------+------|| Swap || ||------+------+------+------+------+------|
139 * | NO | NO | NO | NO | NO | NO || to || Swap || NO | NO | NO | NO | NO | NO |
140 * |------+------+------+------+------+------|| Ctrl || Back ||------+------+------+------+------+------|
141 * | NO | NO | NO | NO | | NO |`------'`------'| NO | | NO | NO | NO | NO |
142 * `-----------------------------------------' `-----------------------------------------'
143 */
144
145 [_ADJUST] = LAYOUT(
146 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
147 XXXXXXX, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
148 XXXXXXX, XXXXXXX, XXXXXXX, UC_M_WI, UC_M_OS, XXXXXXX, XXXXXXX, DF(_DVR),DF(_QWR),XXXXXXX, XXXXXXX, XXXXXXX,
149 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
150 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, CG_SWAP, CG_NORM, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
151 ),
152
153};
154
155/* Runs just one time when the keyboard initializes. */
156void eeconfig_init_keymap( void ) {
157 set_unicode_input_mode( UC_OSX );
158};
159
160bool process_record_keymap( uint16_t keycode, keyrecord_t *record ) {
161
162 switch ( keycode ) {
163
164 case LOWER:
165
166 if ( record->event.pressed ) {
167 layer_on( _LOWER );
168 update_tri_layer( _LOWER, _RAISE, _ADJUST );
169 }
170 else {
171 layer_off( _LOWER );
172 update_tri_layer( _LOWER, _RAISE, _ADJUST );
173 }
174
175 return false;
176 break;
177
178 case RAISE :
179
180 if ( record->event.pressed ) {
181 layer_on( _RAISE );
182 update_tri_layer( _LOWER, _RAISE, _ADJUST );
183 }
184 else {
185 layer_off( _RAISE );
186 update_tri_layer( _LOWER, _RAISE, _ADJUST );
187 }
188
189 return false;
190 break;
191
192 }
193
194 return true;
195
196}; \ No newline at end of file
diff --git a/keyboards/atreus62/keymaps/d4mation/readme.md b/keyboards/atreus62/keymaps/d4mation/readme.md
new file mode 100644
index 000000000..5642e8e43
--- /dev/null
+++ b/keyboards/atreus62/keymaps/d4mation/readme.md
@@ -0,0 +1,40 @@
1# d4mation's keymap for the Atreus62
2
3This is a bit of a work in-progress, but for the most part I like what I have done here.
4
5I switched to Dvorak some time ago and software-based support in most OS's for Dvorak isn't very great, so this keymap by default is set to Dvorak.
6
7## Table of Contents
8
9* [Layers](#layers)
10 - [Base layer](#base)
11 - [Num](#num)
12 - [Lower](#lower)
13 - [Raise](#raise)
14 - [Adjust](#adjust)
15
16# Layers
17
18## Base
19
20* By default, this layer is Dvorak. But using the Adjust layer you can switch to Qwerty
21* Double-tapping Shift enables and disables Caps Lock
22* Quickly tapping the Grave accent key will output a Grave Accent, but holding it for 200ms will output the ESC key instead
23
24## Num
25
26This layer gets toggled off and on to place a numpad on both the left and right sides of the keyboard.
27
28## Lower
29
30This layer holds some handy shortcuts that I use often, like the screen grab shortcut and sleep shortcut in OS X.
31
32It also has quick access to {} as they are inaccessible in the base layer
33
34## Raise
35
36Aside from quick access to [] and Play/Pause/Next/Previous, this layer is mostly just goofy things I decided to program into the keyboard because I could. There's a bunch of [kaomoji](https://en.wikipedia.org/wiki/Emoticon#Japanese_style_(kaomoji))/"unicode smileys" and I added a toggle switch to enable a [Zalgo Text](https://zalgo.org/) mode.
37
38## Adjust
39
40This layer is a "here be dragons" layer. It can only be accessed by holding down the keys for Lower and Raise at the same time. I added exclusively keys that drastically transformed the keyboard's layout or function on this layer. The ability to switch to Qwerty is on this layer, a way to switch CTRL and CMD back and forth is on this layer, and a hotkey to enter bootloader mode also exists.
diff --git a/keyboards/atreus62/keymaps/d4mation/rules.mk b/keyboards/atreus62/keymaps/d4mation/rules.mk
new file mode 100644
index 000000000..517f2700e
--- /dev/null
+++ b/keyboards/atreus62/keymaps/d4mation/rules.mk
@@ -0,0 +1,2 @@
1UNICODE_ENABLE = yes
2TAP_DANCE_ENABLE = yes \ No newline at end of file
diff --git a/users/d4mation/config.h b/users/d4mation/config.h
new file mode 100644
index 000000000..3140a036f
--- /dev/null
+++ b/users/d4mation/config.h
@@ -0,0 +1 @@
#define FORCE_NKRO \ No newline at end of file
diff --git a/users/d4mation/d4mation.c b/users/d4mation/d4mation.c
new file mode 100644
index 000000000..5aa58a9f0
--- /dev/null
+++ b/users/d4mation/d4mation.c
@@ -0,0 +1,37 @@
1#include "d4mation.h"
2
3__attribute__ ((weak))
4bool process_record_keymap( uint16_t keycode, keyrecord_t *record ) {
5 /* If you want macros specific to your keymap, you need to define this function in your keymap */
6 return true;
7}
8
9__attribute__ ((weak))
10void matrix_init_keymap() {
11 /* If you want a matrix init specific to your keymap, you need to define this function in your keymap */
12}
13
14__attribute__ ((weak))
15void matrix_scan_keymap() {
16 /* If you want a matrix scan specific to your keymap, you need to define this function in your keymap */
17}
18
19__attribute__((weak))
20void eeconfig_init_keymap( void ) {}
21
22/* process_record_user() is called in macros.c */
23
24void matrix_init_user( void ) {
25 matrix_init_keymap();
26}
27
28void matrix_scan_user( void ) {
29 matrix_scan_keymap();
30}
31
32void eeconfig_init_user( void ) {
33
34 eeconfig_init_keymap();
35 keyboard_init();
36
37} \ No newline at end of file
diff --git a/users/d4mation/d4mation.h b/users/d4mation/d4mation.h
new file mode 100644
index 000000000..94c63526d
--- /dev/null
+++ b/users/d4mation/d4mation.h
@@ -0,0 +1,17 @@
1#pragma once
2
3#include "quantum.h"
4
5#ifdef UNICODE_ENABLE
6#include "macros.h"
7#endif
8
9#ifdef TAP_DANCE_ENABLE
10#include "tap-dance.h"
11#endif
12
13bool process_record_keymap( uint16_t keycode, keyrecord_t *record );
14
15void matrix_init_keymap( void );
16
17void matrix_scan_keymap( void ); \ No newline at end of file
diff --git a/users/d4mation/macros.c b/users/d4mation/macros.c
new file mode 100644
index 000000000..3c115d7ea
--- /dev/null
+++ b/users/d4mation/macros.c
@@ -0,0 +1,160 @@
1#include "d4mation.h"
2#include "tap-hold.h"
3#include "zalgo.h"
4#include "macros.h"
5
6bool zalgo_enabled = false;
7
8bool process_record_user( uint16_t keycode, keyrecord_t *record ) {
9
10 switch ( keycode ) {
11
12 case _GRAVE_ESC:
13
14 /* Send ` on Tap, Esc on Hold */
15 tap_or_hold( record, KC_GRAVE, KC_ESC );
16
17 return false;
18 break;
19
20 case PHPOPEN:
21
22 if ( record->event.pressed ) {
23
24 tap_code16( S( KC_COMMA ) );
25 tap_code16( S( KC_SLASH ) );
26
27 tap_code( KC_P );
28 tap_code( KC_H );
29 tap_code( KC_P );
30
31 }
32
33 return false;
34 break;
35
36 case PHPCLSE:
37
38 if ( record->event.pressed ) {
39 tap_code16( S( KC_SLASH ) );
40 tap_code16( S( KC_DOT ) );
41 }
42
43 return false;
44 break;
45
46 #ifdef UNICODE_ENABLE
47
48 case AMENO: /* ༼ つ ◕_◕ ༽つ */
49
50 if ( record->event.pressed ) {
51
52 send_unicode_hex_string( "0F3C 0020 3064 0020 25D5 005F 25D5 0020 0F3D 3064" );
53
54 }
55
56 return false;
57 break;
58
59 case MAGIC: /* (∩ ͡° ͜ʖ ͡°)⊃━☆゚. * */
60
61 if ( record->event.pressed ) {
62
63 send_unicode_hex_string( "0028 2229 0020 0361 00B0 0020 035C 0296 0020 0361 00B0 0029 2283 2501 2606 FF9F 002E 0020 002A" );
64
65 }
66
67 return false;
68 break;
69
70 case LENNY: /* ( ͡° ͜ʖ ͡°) */
71
72 if ( record->event.pressed ) {
73
74 send_unicode_hex_string( "0028 0020 0361 00B0 0020 035C 0296 0020 0361 00b0 0029" );
75
76 }
77
78 return false;
79 break;
80
81 case DISFACE: /* ಠ_ಠ */
82
83 if ( record->event.pressed ) {
84 send_unicode_hex_string( "0CA0 005F 0CA0" );
85 }
86
87 return false;
88 break;
89
90 case TFLIP: /* (╯°□°)╯ ︵ ┻━┻ */
91
92 if ( record->event.pressed ) {
93
94 send_unicode_hex_string( "0028 256F 00b0 25A1 00B0 0029 256F FE35 253B 2501 253B" );
95
96 }
97
98 return false;
99 break;
100
101 case TPUT: /* ┬──┬ ノ( ゜-゜ノ) */
102
103 if ( record->event.pressed ) {
104
105 send_unicode_hex_string( "252C 2500 2500 252C 0020 30CE 0028 0020 309C 002D 309C 30CE 0029" );
106
107 }
108
109 return false;
110 break;
111
112 case SHRUG: /* ¯\_(ツ)_/¯ */
113
114 if ( record->event.pressed ) {
115
116 send_unicode_hex_string( "00AF 005C 005F 0028 30C4 0029 005F 002F 00AF" );
117
118 }
119
120 return false;
121 break;
122
123 case ZALGO: /* Toggles Zalgo Text mode */
124
125 if ( record->event.pressed ) {
126 zalgo_enabled = ! zalgo_enabled;
127 }
128
129 return false;
130 break;
131
132 #endif
133
134 default:
135
136 #ifdef UNICODE_ENABLE
137
138 if ( zalgo_enabled ) {
139
140 if ( keycode < KC_A || ( keycode > KC_0 && keycode < KC_MINUS ) || keycode > KC_SLASH ) {
141 process_record_keymap( keycode, record );
142 return true;
143 }
144
145 if ( record->event.pressed ) {
146 zalgo_text( keycode );
147 }
148
149 return false;
150 }
151
152 #endif
153
154 break;
155 }
156
157 process_record_keymap( keycode, record );
158 return true;
159
160}; \ No newline at end of file
diff --git a/users/d4mation/macros.h b/users/d4mation/macros.h
new file mode 100644
index 000000000..e69d30dec
--- /dev/null
+++ b/users/d4mation/macros.h
@@ -0,0 +1,23 @@
1#pragma once
2
3#include "quantum.h"
4#include "tap-hold.h"
5#include "zalgo.h"
6
7#define SCRGB LCTL( LSFT( LGUI( KC_4 ) ) ) /* Mac Screen Area Grab shortcut (Puts into Clipboard) */
8#define SLEEP LALT( LGUI( KC_SYSTEM_POWER ) ) /* Instant sleep on Mac, rather than having to hold down the button */
9
10enum custom_keycodes {
11 _GRAVE_ESC = SAFE_RANGE, /* Prefixed with underscore to prevent conflicts */
12 PHPOPEN, /* <?php */
13 PHPCLSE, /* ?> */
14 AMENO,
15 MAGIC,
16 LENNY,
17 DISFACE,
18 TFLIP,
19 TPUT,
20 SHRUG,
21 ZALGO,
22 NEW_SAFE_RANGE
23}; \ No newline at end of file
diff --git a/users/d4mation/rules.mk b/users/d4mation/rules.mk
new file mode 100644
index 000000000..3d65a2242
--- /dev/null
+++ b/users/d4mation/rules.mk
@@ -0,0 +1,15 @@
1SRC += d4mation.c \
2 tap-hold.c \
3 macros.c
4
5BOOTMAGIC_ENABLE = no
6LTO_ENABLE = yes
7MOUSEKEY_ENABLE = no
8
9ifeq ($(strip $(UNICODE_ENABLE)), yes)
10 SRC += zalgo.c
11endif
12
13ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
14 SRC += tap-dance.c
15endif \ No newline at end of file
diff --git a/users/d4mation/tap-dance.c b/users/d4mation/tap-dance.c
new file mode 100644
index 000000000..46f2274f5
--- /dev/null
+++ b/users/d4mation/tap-dance.c
@@ -0,0 +1,6 @@
1#include "tap-dance.h"
2
3qk_tap_dance_action_t tap_dance_actions[] = {
4 /* Tap once/hold for Shift, tap twice for Caps Lock */
5 [SHIFT_CAPS] = ACTION_TAP_DANCE_DOUBLE( KC_LSHIFT, KC_CAPS )
6}; \ No newline at end of file
diff --git a/users/d4mation/tap-dance.h b/users/d4mation/tap-dance.h
new file mode 100644
index 000000000..0087c4a6e
--- /dev/null
+++ b/users/d4mation/tap-dance.h
@@ -0,0 +1,7 @@
1#pragma once
2
3#include "quantum.h"
4
5enum tap_dance {
6 SHIFT_CAPS = 0
7}; \ No newline at end of file
diff --git a/users/d4mation/tap-hold.c b/users/d4mation/tap-hold.c
new file mode 100644
index 000000000..0c5119f99
--- /dev/null
+++ b/users/d4mation/tap-hold.c
@@ -0,0 +1,28 @@
1#include "tap-hold.h"
2
3#ifndef TAP_HOLD_TIME
4#define TAP_HOLD_TIME 200
5#endif
6
7uint16_t tap_hold_timer;
8
9void tap_or_hold( keyrecord_t *record, uint16_t tap, uint16_t hold ) {
10
11 if ( record->event.pressed ) {
12 tap_hold_timer = timer_read();
13 } else {
14
15 if ( tap_hold_timer &&
16 timer_elapsed( tap_hold_timer ) > TAP_HOLD_TIME ) {
17 /* Held down then released */
18 tap_code( hold );
19 } else {
20 /* Quickly Tapped */
21 tap_code( tap );
22 }
23
24 tap_hold_timer = 0;
25
26 }
27
28} \ No newline at end of file
diff --git a/users/d4mation/tap-hold.h b/users/d4mation/tap-hold.h
new file mode 100644
index 000000000..52dc0830f
--- /dev/null
+++ b/users/d4mation/tap-hold.h
@@ -0,0 +1,5 @@
1#pragma once
2
3#include "quantum.h"
4
5void tap_or_hold( keyrecord_t *record, uint16_t tap, uint16_t hold ); \ No newline at end of file
diff --git a/users/d4mation/zalgo.c b/users/d4mation/zalgo.c
new file mode 100644
index 000000000..3a1688e05
--- /dev/null
+++ b/users/d4mation/zalgo.c
@@ -0,0 +1,21 @@
1#include "zalgo.h"
2
3void zalgo_text( uint16_t keycode ) {
4
5 tap_code( keycode );
6
7 int number = ( rand() % ( 8 + 1 - 2 ) ) + 2;
8 unsigned int index;
9
10 unicode_input_start();
11
12 for ( index = 0; index < number; index++ ) {
13
14 uint16_t hex = ( rand() % ( 0x036F + 1 - 0x0300 ) ) + 0x0300;
15 register_hex( hex );
16
17 }
18
19 unicode_input_finish();
20
21} \ No newline at end of file
diff --git a/users/d4mation/zalgo.h b/users/d4mation/zalgo.h
new file mode 100644
index 000000000..f59fc035b
--- /dev/null
+++ b/users/d4mation/zalgo.h
@@ -0,0 +1,5 @@
1#pragma once
2
3#include "quantum.h"
4
5void zalgo_text( uint16_t keycode ); \ No newline at end of file