]> git.friedersdorff.com Git - max/tmk_keyboard.git/blob - keyboard/hhkb/unimap_hasu.c
ibmpc_usb: Fix Disable/Enable keyboard
[max/tmk_keyboard.git] / keyboard / hhkb / unimap_hasu.c
1 /*
2 Copyright 2016 Jun Wako <wakojun@gmail.com>
3
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 2 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17 #include "unimap_trans.h"
18
19
20 /* id for user defined functions */
21 enum function_id {
22     LSHIFT_LPAREN,
23 };
24
25 enum macro_id {
26     HELLO,
27     VOLUP,
28     ALT_TAB,
29 };
30
31 #define AC_L1      ACTION_LAYER_MOMENTARY(1)
32 #define AC_SLS2    ACTION_LAYER_TAP_KEY(2, KC_SLSH)
33 #define AC_SCL3    ACTION_LAYER_TAP_KEY(3, KC_SCLN)
34 #define AC_SPC4    ACTION_LAYER_TAP_KEY(4, KC_SPC)
35 #define AC_APSW    ACTION_MACRO(ALT_TAB)
36 #define AC_BACK    ACTION_MODS_KEY(MOD_LALT, KC_LEFT)
37 #define AC_FRWD    ACTION_MODS_KEY(MOD_LALT, KC_RIGHT)
38 #define AC_ENT_    ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT)
39
40 // Function: LShift with tap '('
41 #define AC_LPRN     ACTION_FUNCTION_TAP(LSHIFT_LPAREN)
42 // Macro: say hello
43 #define AC_HELO     ACTION_MACRO(HELLO)
44
45
46 #ifdef KEYMAP_SECTION_ENABLE
47 const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = {
48 #else
49 const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = {
50 #endif
51     [0] = UNIMAP_HHKB(
52     ESC, 1,   2,   3,   4,   5,   6,   7,   8,   9,   0,   MINS,EQL, BSLS,GRV ,
53     TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,     BSPC,
54     LCTL,A,   S,   D,   F,   G,   H,   J,   K,   L,   SCLN,QUOT,          ENT_,
55     LSFT,     Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, SLS2,     RSFT,L1,
56          LGUI,LALT,               SPC4,                    RALT,RGUI),
57
58     [1] = UNIMAP_HHKB(
59     PWR, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, INS, DEL,
60     CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP,  TRNS,     TRNS,
61     TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT,          PENT,
62     TRNS,     TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN,     TRNS,TRNS,
63          TRNS,TRNS,               TRNS,                    TRNS,TRNS),
64
65     [2] = UNIMAP_HHKB(
66     GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, INS, DEL,
67     TAB, HOME,PGDN,UP,  PGUP,END, HOME,PGDN,PGUP,END, NO,  NO,  NO,       BSPC,
68     LCTL,NO,  LEFT,DOWN,RGHT,NO,  LEFT,DOWN,UP,  RGHT,NO,  NO,            ENT,
69     LSFT,     NO,  NO,  NO,  NO,  NO,  HOME,PGDN,PGUP,END, TRNS,     RSFT,TRNS,
70          LGUI,LALT,               SPC,                     RALT,RGUI),
71
72     [3] = UNIMAP_HHKB(
73     GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, INS, DEL,
74     TAB, NO,  NO,  NO,  NO,  NO,  WH_L,WH_D,MS_U,WH_U,WH_R,BACK,FRWD,     TAB,
75     LCTL,ACL0,ACL1,ACL2,ACL2,NO,  NO,  MS_L,MS_D,MS_R,TRNS,NO,            ENT,
76     LSFT,     NO,  NO,  NO,  NO,  BTN3,BTN2,BTN1,BACK,FRWD,NO,       RSFT,TRNS,
77          LGUI,LALT,               BTN1,                    TRNS,TRNS),
78
79     [4] = UNIMAP_HHKB(
80     GRV, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, INS, DEL,
81     TAB, NO,  NO,  NO,  NO,  NO,  WH_L,WH_D,MS_U,WH_U,WH_R,BTN4,BTN5,     TAB,
82     LCTL,VOLD,VOLU,MUTE,NO,  NO,  NO,  MS_L,MS_D,MS_R,BTN1,NO,            ENT,
83     LSFT,     NO,  NO,  NO,  NO,  BTN3,BTN2,BTN1,BACK,FRWD,NO,       RSFT,TRNS,
84          TRNS,TRNS,               TRNS,                    TRNS,TRNS),
85 };
86
87
88
89 /*
90  * Macro definition
91  */
92 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
93 {
94     switch (id) {
95         case HELLO:
96             return (record->event.pressed ?
97                     MACRO( I(0), T(H), T(E), T(L), T(L), W(255), T(O), END ) :
98                     MACRO_NONE );
99         case VOLUP:
100             return (record->event.pressed ?
101                     MACRO( D(VOLU), U(VOLU), END ) :
102                     MACRO_NONE );
103         case ALT_TAB:
104             // XXX: doesn't work after stuck key fix
105             return (record->event.pressed ?
106                     MACRO( D(LALT), D(TAB), END ) :
107                     MACRO( U(TAB), END ));
108     }
109     return MACRO_NONE;
110 }
111
112
113
114 /*
115  * user defined action function
116  */
117 void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
118 {
119     if (record->event.pressed) dprint("P"); else dprint("R");
120     dprintf("%d", record->tap.count);
121     if (record->tap.interrupted) dprint("i");
122     dprint("\n");
123
124     switch (id) {
125         case LSHIFT_LPAREN:
126             // XXX: doesn't work with other tap key. iffy at least
127             // Shift parentheses example: LShft + tap '('
128             // http://stevelosh.com/blog/2012/10/a-modern-space-cadet/#shift-parentheses
129             // http://geekhack.org/index.php?topic=41989.msg1304899#msg1304899
130             if (record->event.pressed) {
131                 if (record->tap.count > 0 && !record->tap.interrupted) {
132                     if (record->tap.interrupted) {
133                         dprint("tap interrupted\n");
134                         register_mods(MOD_BIT(KC_LSHIFT));
135                     }
136                 } else {
137                     register_mods(MOD_BIT(KC_LSHIFT));
138                 }
139             } else {
140                 if (record->tap.count > 0 && !(record->tap.interrupted)) {
141                     add_weak_mods(MOD_BIT(KC_LSHIFT));
142                     send_keyboard_report();
143                     register_code(KC_9);
144                     unregister_code(KC_9);
145                     del_weak_mods(MOD_BIT(KC_LSHIFT));
146                     send_keyboard_report();
147                     record->tap.count = 0;  // ad hoc: cancel tap
148                 } else {
149                     unregister_mods(MOD_BIT(KC_LSHIFT));
150                 }
151             }
152             break;
153     }
154 }