]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Adding my xd60 layout. (#2078)
authorJean Olivier Simoneau <jean.olivier.simoneau@usherbrooke.ca>
Thu, 14 Dec 2017 05:21:48 +0000 (00:21 -0500)
committerJack Humbert <jack.humb@gmail.com>
Thu, 14 Dec 2017 05:21:48 +0000 (00:21 -0500)
* Added xd60:Jos keymap

* Corrected Layout image for xd60:Jos layout

* Update README for xd60:Jos layout

* Created rules.mk for xd60:Jos layout

* Fixed an edge case for xd60:Jos layout

* Now using a specific  for xd60:Jos layout instead of modifying the main one

* Better physical layout image for xd60:Jos layout

keyboards/xd60/keymaps/Jos/README.md [new file with mode: 0644]
keyboards/xd60/keymaps/Jos/config.h [new file with mode: 0644]
keyboards/xd60/keymaps/Jos/keymap.c [new file with mode: 0644]
keyboards/xd60/keymaps/Jos/rules.mk [new file with mode: 0644]
keyboards/xd60/rules.mk

diff --git a/keyboards/xd60/keymaps/Jos/README.md b/keyboards/xd60/keymaps/Jos/README.md
new file mode 100644 (file)
index 0000000..b4382ac
--- /dev/null
@@ -0,0 +1,22 @@
+# Jos's Layout
+
+Custom layout with various options. Designed to be used with the Canadian Multilingual software layout.
+
+## Layout
+This is the physical layout of my xd60, for reference. See the keymap file for actual software layout.
+![Keyboard Layout (Physical appearence)](https://i.imgur.com/qzOmqyq.png "Physical Layout")
+
+## Features
+**Caps Lock** is **Escape** and the **Window key** is a **Function** key that still acts like the **Window** key in conjuction with `w`, `s`, `d`, `l`, `t`, `e`, `h`, and `SPACE`.
+
+There are a few `#define` lines at the beginning of the keymap file that enable the following options if not commented:
+- `ISOLIKE_ALT_ENTER`: `RALT` + `ENT` is the same as `RALT`+`BSLS`. For logical placement of `{` and `}` (the former being `RALT`+`BSLS`) with ANSI enter on a ISO-based layout.
+- `TWO_SFT_CAPS`: Both shifts together → Caps Lock.
+- `APP_IS_RALT_RCTRL`: Menu would be between `RCTRL` and `RALT`, so now `RALT` + `RCTRL` → `APP`.
+- `HELD_ESC_IS_SHIFT`: Holding `ESC` → `SHIFT`. It always register shift when pressing `ESC`. Useful for VIM.
+- `BSPC_BLOCKS_DEL`: If `BSPC` is held, we disable `DEL`. To avoid acidental presses of `DEL` with split backspace key. 
+- `ALT_MINSEQL_IS_ALT_78`: Pressing `ALT+MINS/EQL` will act like `ALT+7/8`. Will yield `{}` instead of `½¬` in Canadian Multilingual Layout. Diminished finger stretching. 
+
+
+# Build
+To build, simply run `make xd60:Jos`
diff --git a/keyboards/xd60/keymaps/Jos/config.h b/keyboards/xd60/keymaps/Jos/config.h
new file mode 100644 (file)
index 0000000..a3b0cd1
--- /dev/null
@@ -0,0 +1,2 @@
+/* Delay for tap/hold for tap dance commands */
+#define TAPPING_TERM 150
diff --git a/keyboards/xd60/keymaps/Jos/keymap.c b/keyboards/xd60/keymaps/Jos/keymap.c
new file mode 100644 (file)
index 0000000..1c530ed
--- /dev/null
@@ -0,0 +1,229 @@
+#include "xd60.h"
+#include "action_layer.h"
+
+// TODO: THOSE ARE IDEAS:
+// TODO:
+// TODO: - Proper support for "GUI+TAB" application switching, with the GUI holding and shift, etc.
+// TODO:     - Maybe implement a process_record instead of a tap-dance, or complex tap dance?
+// TODO: - Media keys on Fn1 layer, *hjklm,.* or arrow cluster?
+// TODO: - What more than NumPad + RGB on the Fn3 toggled layer?
+// TODO: - Add an in-keymap way to toggle LGUI/F(0) key, HELD_ESC_IS_SHIFT and BSPC_BLOCKS_DEL.
+// TODO:
+// TODO: THOSE ARE BUGS TO FIX:
+// TODO: - None (found so far)
+
+// Adjusting process_record_user functionnalities, comment to disable.
+#define ISOLIKE_ALT_ENTER
+#define TWO_SFT_CAPS
+#define APP_IS_RALT_RCTRL
+#define HELD_ESC_IS_SHIFT
+#define BSPC_BLOCKS_DEL
+#define ALT_MINSEQL_IS_ALT_78
+
+// Cases where the GUI key will actually do what the GUI key normally does.
+#define AC_G_W    LGUI(KC_W)   // Ubuntu: Shows windows on current desktop
+#define AC_G_S    LGUI(KC_S)   // Ubuntu: Overview of all desktops
+#define AC_G_D    LGUI(KC_D)   // Windows: Show/Toggle desktop
+#define AC_G_L    LGUI(KC_L)   // Ubuntu/Windows: Lock session
+#define AC_G_T    LGUI(KC_T)   // Ubuntu: Shows Trash // elementary: Opens terminal
+#define AC_G_E    LGUI(KC_E)   // Windows: Opens file explorer
+#define AC_G_H    LGUI(KC_H)   // Windows: Show/Hide hidden files
+#define AC_G_SPC  LGUI(KC_SPC) // elementary: Shows application launcher
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+  // 0: Base Layer
+  KEYMAP(
+      KC_GRAVE, KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,     KC_0,     KC_MINS,   KC_EQL,   KC_BSPC,   KC_DEL,    \
+      KC_TAB,   KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,     KC_P,     KC_LBRC,   KC_RBRC,             KC_BSLS,   \
+      KC_ESC,   KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,     KC_SCLN,  KC_QUOT,   KC_NO,               KC_ENT,    \
+      KC_LSFT,  KC_LGUI, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM,  KC_DOT,   KC_SLSH,   KC_RSFT,  KC_UP,     F(0),      \
+      KC_LCTL,  TD(0),   KC_LALT,                            KC_SPC ,                             KC_RALT,  KC_RCTRL,  KC_LEFT,  KC_DOWN,   KC_RIGHT),
+                                                                                                                                           
+  // 1: Function 1 Layers                                                                                                                  
+  KEYMAP(                                                                                                                                  
+      RESET,   KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,    KC_F10,   KC_F11,    KC_F12,   KC_PAUS,   KC_PSCR,    \
+      KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_TRNS,             KC_TRNS,    \
+      KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MPRV, KC_MNXT,  KC_MSTP,  KC_TRNS,   KC_NO,               KC_TRNS,    \
+      KC_TRNS, F(2),    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD,  KC_VOLU,  KC_TRNS,   KC_TRNS,  KC_PGUP,   KC_TRNS,    \
+      KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                             KC_TRNS,  KC_TRNS,   KC_HOME,  KC_PGDOWN, KC_END),
+                                                                                                                                           
+  // 2: GUI/Function 2 Layer                                                                                                                   
+  KEYMAP(                                                                                                                                  
+      KC_ESC,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,    KC_F10,   KC_F11,    KC_F12,   KC_PAUS,    KC_PSCR,   \
+      KC_TRNS, KC_TRNS, AC_G_W,  AC_G_E,  KC_TRNS, AC_G_T,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_TRNS,              KC_TRNS,   \
+      KC_TRNS, KC_TRNS, AC_G_S,  AC_G_D,  KC_TRNS, KC_TRNS, AC_G_H,  KC_TRNS, KC_TRNS, AC_G_L,   KC_TRNS,  KC_TRNS,   KC_NO,                KC_TRNS,   \
+      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_TRNS,  KC_PGUP,    KC_TRNS,   \
+      KC_TRNS, KC_TRNS, KC_TRNS,                            AC_G_SPC,                            KC_TRNS,  KC_TRNS,   KC_HOME,  KC_PGDOWN,  KC_END),
+                                                                                                                                           
+  // 3: NumPad/Function 3 Toggle Layer                                                                                                                   
+  KEYMAP(                                                                                                                                  
+      KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_7,    KC_8,    KC_9,     KC_PSLS,  KC_PMNS,   KC_PPLS,  KC_TRNS,    KC_TRNS,   \
+      KC_TRNS, KC_NO,   KC_NO,   RGB_HUI, RGB_SAI, RGB_VAI, KC_NO,   KC_4,    KC_5,    KC_6,     KC_PAST,  KC_NO,     KC_NO,                KC_NO,     \
+      KC_TRNS, KC_NO,   KC_NO,   RGB_HUD, RGB_SAD, RGB_VAD, KC_NO,   KC_1,    KC_2,    KC_3,     KC_PMNS,  KC_PENT,   KC_NO,                KC_TRNS,   \
+      KC_NO,   KC_TRNS, KC_NO,   KC_NO,   RGB_TOG, RGB_MOD, KC_NO,   KC_NO,   KC_0,    KC_COMM,  KC_DOT,   KC_PPLS,   KC_NO,    KC_TRNS,    KC_TRNS,   \
+      KC_NO,   KC_TRNS, KC_NO,                              KC_TRNS,                             KC_PENT,  KC_PENT,   KC_TRNS,  KC_TRNS,    KC_TRNS)  ,
+
+// TRaNSparent layer for reference
+/*  KEYMAP(                                                                                                                                  
+      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_TRNS,  KC_TRNS,    KC_TRNS,   \
+      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_TRNS,              KC_TRNS,   \
+      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_NO,                KC_TRNS,   \
+      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_TRNS,  KC_TRNS,    KC_TRNS,   \
+/      KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                             KC_TRNS,  KC_TRNS,   KC_TRNS,  KC_TRNS,    KC_TRNS), */
+};
+
+// Custom Actions
+const uint16_t PROGMEM fn_actions[] = {
+    [0] = ACTION_LAYER_MOMENTARY(1),  // to Fn1 layer
+    [1] = ACTION_LAYER_MOMENTARY(2),  // to GUI/Fn2 layer
+    [2] = ACTION_LAYER_TOGGLE(3),     // to Fn3/Num toggle layer
+};
+
+// Macros
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
+
+  // MACRODOWN only works in this function
+  switch(id) {
+    case 0:
+      if (record->event.pressed) { register_code(KC_RSFT); }
+      else { unregister_code(KC_RSFT); }
+      break;
+  }
+
+  return MACRO_NONE;
+};
+
+
+// Loop
+void matrix_scan_user(void) {
+  // Empty
+};
+
+// LGUI acts as F(1) if held or as a tapped LGUI if tapped. Adapted from https://goo.gl/WnqGNS
+// Commented lines are for the "sticky" layer on two presses. Left it here for reference.
+static const int GUILAY = 2; // GUI Layer is layer #2
+
+typedef struct {
+  bool layer_toggle;
+  bool sticky;
+} td_ta_state_t;
+
+static void ang_tap_dance_ta_finished (qk_tap_dance_state_t *state, void *user_data) {
+  td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
+
+//  if (td_ta->sticky) {
+//    td_ta->sticky = false;
+//    td_ta->layer_toggle = false;
+//    layer_off (GUILAY);
+//    return;
+//  }
+//
+  if (state->count == 1 && !state->pressed) {
+    register_code (KC_LGUI);
+//    td_ta->sticky = false;
+    td_ta->layer_toggle = false;
+  } else {
+    td_ta->layer_toggle = true;
+    layer_on(GUILAY);
+//    td_ta->sticky = (state->count == 2);
+  }
+}
+
+// Added this one to make it more reactive on keyup
+static void ang_tap_dance_ta_each (qk_tap_dance_state_t *state, void *user_data) {
+  td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
+
+  if (!td_ta->layer_toggle) {   // Braces added for clarity
+    unregister_code (KC_LGUI);
+  }
+}
+
+
+static void ang_tap_dance_ta_reset (qk_tap_dance_state_t *state, void *user_data) {
+  td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
+
+  if (!td_ta->layer_toggle) {   // Braces added for clarity
+    unregister_code (KC_LGUI);
+  }
+//  if (!td_ta->sticky)
+    layer_off (GUILAY); // We don't verify it was swithed on, switching off regardless
+}
+
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+   [0]  = {
+     .fn = { ang_tap_dance_ta_each, ang_tap_dance_ta_finished, ang_tap_dance_ta_reset },
+     .user_data = (void *)&((td_ta_state_t) { false, false })
+   }
+};
+
+#if defined ISOLIKE_ALT_ENTER  || defined TWO_SFT_CAPS  || defined APP_IS_RALT_RCTRL || defined ALT_MINSEQL_IS_ALT_78
+// Function for the special modifiers actions below, makes it cleaner and yields smaller firmware.
+static bool special_mods(uint16_t keycode, keyrecord_t *record, uint16_t modifier) {
+  if (record->event.pressed && (keyboard_report->mods & MOD_BIT(modifier))) {
+    register_code(keycode);
+    return false;
+  } else {
+    unregister_code(keycode);
+    return true;
+  }
+}
+#endif
+
+#ifdef BSPC_BLOCKS_DEL
+static bool del_blocked = false; // Static as to not be defined elsewhere
+#endif
+
+// This function is processed before the key events on each key press/release.
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+  switch (keycode){
+    #ifdef ISOLIKE_ALT_ENTER
+    // RALT + ENT is the same as RALT+BSLS. 
+    // For logical placement of *{* and *}* (the former being RALT+BSLS) with ANSI enter on 
+    // ISO-based Canadian Multilingual layout (or any other ISO layout on ANSI keyboards).
+    case KC_ENT:    return special_mods(KC_BSLS, record, KC_RALT);  // RALT + ENT -> RALT + BSLS            // See comment above
+    #endif
+    #ifdef TWO_SFT_CAPS
+    case KC_LSFT:   return special_mods(KC_CAPS, record, KC_RSFT);  // Both shifts together -> Caps Lock    // RSFT  pressed first case
+    case KC_RSFT:   return special_mods(KC_CAPS, record, KC_LSFT);  // Both shifts together -> Caps Lock    // LSFT  pressed first case
+    #endif
+    #ifdef APP_IS_RALT_RCTRL
+    case KC_RCTRL:  return special_mods(KC_APP,  record, KC_RALT);  // RALT + RCTRL -> APP                  // RCTRL pressed first case
+    case KC_RALT:   return special_mods(KC_APP,  record, KC_RCTRL); // RALT + RCTRL -> APP                  // RALT  pressed first case
+    #endif
+    #ifdef ALT_MINSEQL_IS_ALT_78
+    case KC_MINS:  return special_mods(KC_7,  record, KC_RALT); // RALT + MINS -> RALT+7                  // {} in CAN Mult. softawre layout
+    case KC_EQL:   return special_mods(KC_8,  record, KC_RALT); // RALT + EQL  -> RALT+8                  // ½¬ normally... Less finger stretch.
+    #endif
+    #ifdef HELD_ESC_IS_SHIFT
+    case KC_ESC:    // Physically *ESC* is *CAPS*                   // Holding ESC -> SHIFT  (0 delay)      // Less awkward *<ESC>:wq* in vim
+      if (record->event.pressed) {
+        register_code(KC_ESC);      // Tapping ESC
+        unregister_code(KC_ESC);
+        register_code(KC_LSFT);     // Holding LSFT
+        return false;
+      } else {
+        unregister_code(KC_LSFT);   // Releasing LSFT
+        return false;
+      }
+    #endif
+    #ifdef BSPC_BLOCKS_DEL
+    // If BSPC is held, we flag DEL as disabled. To avoids acidental presses of DEL with split backspace key.
+    case KC_BSPC:
+      del_blocked = record->event.pressed;
+      return true;
+    // We don't handle DEL if it is pressed and flagged as disabled
+    case KC_DEL:
+      if (del_blocked && record->event.pressed) {
+        return false;
+      } else {
+        return true;
+      }
+    #endif
+    default: return true;   // Let QMK handle the rest as usual
+  }
+}
+
+
diff --git a/keyboards/xd60/keymaps/Jos/rules.mk b/keyboards/xd60/keymaps/Jos/rules.mk
new file mode 100644 (file)
index 0000000..7af3f44
--- /dev/null
@@ -0,0 +1 @@
+TAP_DANCE_ENABLE = yes         # Enables Tap Dance
index 174c3ec848044ffd2596c1255968fc8e19b31b0c..759347214b7deabe0d557e0889ce3746f5c0d917 100644 (file)
@@ -61,5 +61,5 @@ MIDI_ENABLE = no            # MIDI controls
 AUDIO_ENABLE = no           # Audio output on port C6
 UNICODE_ENABLE = no         # Unicode
 BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
-RGBLIGHT_ENABLE = yes        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+RGBLIGHT_ENABLE = yes       # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
 SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend