summary refs log tree commit diff
path: root/quantum
diff options
context:
space:
mode:
authorDamien <Dbroqua@users.noreply.github.com>2016-10-26 07:43:58 +0200
committerGitHub <noreply@github.com>2016-10-26 07:43:58 +0200
commit41d7460f538a3b561aa4475c80dbcb602f476b94 (patch)
treeb4c25c89007acab684ae61fc97dd64ee51c058b9 /quantum
parent911b52a49414a12d95b3f20c378f4c3fbafa3886 (diff)
parentf44ead146214381aa78344f1d4fe3e1b24010c95 (diff)
Merge pull request #10 from jackhumbert/master
Merge from jackhumbert/qmk_firmware
Diffstat (limited to 'quantum')
-rw-r--r--quantum/keymap.h7
-rw-r--r--quantum/keymap_extras/keymap_dvp.h82
-rw-r--r--quantum/process_keycode/process_unicode.c51
-rw-r--r--quantum/process_keycode/process_unicode.h13
-rw-r--r--quantum/quantum.c3
5 files changed, 152 insertions, 4 deletions
diff --git a/quantum/keymap.h b/quantum/keymap.h
index 85c090972d..a01bbfbd14 100644
--- a/quantum/keymap.h
+++ b/quantum/keymap.h
@@ -84,6 +84,10 @@ enum quantum_keycodes {
     QK_MOD_TAP_MAX        = 0x6FFF,
     QK_TAP_DANCE          = 0x7100,
     QK_TAP_DANCE_MAX      = 0x71FF,
+#ifdef UNICODEMAP_ENABLE
+    QK_UNICODE_MAP        = 0x7800,
+    QK_UNICODE_MAP_MAX    = 0x7FFF,
+#endif
 #ifdef UNICODE_ENABLE
     QK_UNICODE            = 0x8000,
     QK_UNICODE_MAX        = 0xFFFF,
@@ -339,5 +343,8 @@ enum quantum_keycodes {
     #define UC(n) UNICODE(n)
 #endif
 
+#ifdef UNICODEMAP_ENABLE
+    #define X(n) (n | QK_UNICODE_MAP)
+#endif
 
 #endif
diff --git a/quantum/keymap_extras/keymap_dvp.h b/quantum/keymap_extras/keymap_dvp.h
new file mode 100644
index 0000000000..83f49a52b5
--- /dev/null
+++ b/quantum/keymap_extras/keymap_dvp.h
@@ -0,0 +1,82 @@
+#ifndef KEYMAP_DVP_H
+#define KEYMAP_DVP_H
+
+#include "keymap.h"
+
+// Normal characters
+#define DP_DLR	KC_GRV
+#define DP_AMPR	KC_1
+#define DP_LBRC	KC_2
+#define DP_LCBR	KC_3
+#define DP_RCBR	KC_4
+#define DP_LPRN	KC_5
+#define DP_EQL	KC_6
+#define DP_ASTR	KC_7
+#define DP_RPRN	KC_8
+#define DP_PLUS	KC_9
+#define DP_RBRC	KC_0
+#define DP_EXLM	KC_MINS
+#define DP_HASH	KC_EQL
+
+#define DP_SCLN	KC_Q
+#define DP_COMM	KC_W
+#define DP_DOT	KC_E
+#define DP_P	KC_R
+#define DP_Y	KC_T
+#define DP_F	KC_Y
+#define DP_G	KC_U
+#define DP_C	KC_I
+#define DP_R	KC_O
+#define DP_L	KC_P
+#define DP_SLSH	KC_LBRC
+#define DP_AT	KC_RBRC
+#define DP_BSLS	KC_BSLS
+
+#define DP_A	KC_A
+#define DP_O	KC_S
+#define DP_E	KC_D
+#define DP_U	KC_F
+#define DP_I	KC_G
+#define DP_D	KC_H
+#define DP_H	KC_J
+#define DP_T	KC_K
+#define DP_N	KC_L
+#define DP_S	KC_SCLN
+#define DP_MINS	KC_QUOT
+
+#define DP_QUOT	KC_Z
+#define DP_Q	KC_X
+#define DP_J	KC_C
+#define DP_K	KC_V
+#define DP_X	KC_B
+#define DP_B	KC_N
+#define DP_M	KC_M
+#define DP_W	KC_COMM
+#define DP_V	KC_DOT
+#define DP_Z	KC_SLSH
+
+// Shifted characters
+#define DP_TILD	LSFT(DP_DLR)
+#define DP_PERC	LSFT(DP_AMPR)
+#define DP_7	LSFT(DP_LBRC)
+#define DP_5	LSFT(DP_LCBR)
+#define DP_3	LSFT(DP_RCBR)
+#define DP_1	LSFT(DP_LPRN)
+#define DP_9	LSFT(DP_EQL)
+#define DP_0	LSFT(DP_ASTR)
+#define DP_2	LSFT(DP_RPRN)
+#define DP_4	LSFT(DP_PLUS)
+#define DP_6	LSFT(DP_RBRC)
+#define DP_8	LSFT(DP_EXLM)
+#define DP_GRV	LSFT(DP_HASH)
+
+#define DP_COLN	LSFT(DP_SCLN)
+#define DP_LABK	LSFT(DP_COMM)
+#define DP_RABK	LSFT(DP_DOT)
+#define DP_QUES	LSFT(DP_SLSH)
+#define DP_CIRC	LSFT(DP_AT)
+#define DP_PIPE	LSFT(DP_BSLS)
+#define DP_UNDS	LSFT(DP_MINS)
+#define DP_DQUO	LSFT(DP_QUOT)
+
+#endif
diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c
index 6a30afe293..cd3a610b4d 100644
--- a/quantum/process_keycode/process_unicode.c
+++ b/quantum/process_keycode/process_unicode.c
@@ -42,6 +42,11 @@ void unicode_input_start (void) {
     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);
   }
   wait_ms(UNICODE_TYPE_DELAY);
 }
@@ -78,6 +83,52 @@ bool process_unicode(uint16_t keycode, keyrecord_t *record) {
   return true;
 }
 
+#ifdef UNICODEMAP_ENABLE
+__attribute__((weak))
+const uint32_t PROGMEM unicode_map[] = {
+};
+
+void register_hex32(uint32_t hex) {
+  uint8_t onzerostart = 1;
+  for(int i = 7; i >= 0; i--) {
+    if (i <= 3) {
+      onzerostart = 0;
+    }
+    uint8_t digit = ((hex >> (i*4)) & 0xF);
+    if (digit == 0) {
+      if (onzerostart == 0) {
+        register_code(hex_to_keycode(digit));
+        unregister_code(hex_to_keycode(digit));
+      }
+    } else {
+      register_code(hex_to_keycode(digit));
+      unregister_code(hex_to_keycode(digit));
+      onzerostart = 0;
+    }
+  }
+}
+
+__attribute__((weak))
+void unicode_map_input_error() {}
+
+bool process_unicode_map(uint16_t keycode, keyrecord_t *record) {
+  if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) {
+    const uint32_t* map = unicode_map;
+    uint16_t index = keycode & 0x7FF;
+    uint32_t code = pgm_read_dword_far(&map[index]);
+    if ((code > 0xFFFF && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) {
+      // when character is out of range supported by the OS
+      unicode_map_input_error();
+    } else {
+      unicode_input_start();
+      register_hex32(code);
+      unicode_input_finish();
+    }
+  }
+  return true;
+}
+#endif
+
 #ifdef UCIS_ENABLE
 qk_ucis_state_t qk_ucis_state;
 
diff --git a/quantum/process_keycode/process_unicode.h b/quantum/process_keycode/process_unicode.h
index 27f8072ee6..065eeb5f6a 100644
--- a/quantum/process_keycode/process_unicode.h
+++ b/quantum/process_keycode/process_unicode.h
@@ -3,10 +3,11 @@
 
 #include "quantum.h"
 
-#define UC_OSX 0
-#define UC_LNX 1
-#define UC_WIN 2
-#define UC_BSD 3
+#define UC_OSX 0  // Mac OS X
+#define UC_LNX 1  // Linux
+#define UC_WIN 2  // Windows 'HexNumpad'
+#define UC_BSD 3  // BSD (not implemented)
+#define UC_WINC 4 // WinCompose https://github.com/samhocevar/wincompose
 
 #ifndef UNICODE_TYPE_DELAY
 #define UNICODE_TYPE_DELAY 10
@@ -20,6 +21,10 @@ void register_hex(uint16_t hex);
 
 bool process_unicode(uint16_t keycode, keyrecord_t *record);
 
+#ifdef UNICODEMAP_ENABLE
+bool process_unicode_map(uint16_t keycode, keyrecord_t *record);
+#endif
+
 #ifdef UCIS_ENABLE
 #ifndef UCIS_MAX_SYMBOL_LENGTH
 #define UCIS_MAX_SYMBOL_LENGTH 32
diff --git a/quantum/quantum.c b/quantum/quantum.c
index a16bd5443c..098312e6ef 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -129,6 +129,9 @@ bool process_record_quantum(keyrecord_t *record) {
   #ifdef UCIS_ENABLE
     process_ucis(keycode, record) &&
   #endif
+  #ifdef UNICODEMAP_ENABLE
+    process_unicode_map(keycode, record) &&
+  #endif
       true)) {
     return false;
   }