# HG changeset patch # User Richard Westhaver # Date 1725763244 14400 # Node ID f69061a590da14c58040eb09cfa0b402cd78f8b4 # Parent 978ce75e54affc29538881be39d7e9eb237824a8 moonlander concessions diff -r 978ce75e54af -r f69061a590da .config/kbd/moonlander/50-zsa.rules --- a/.config/kbd/moonlander/50-zsa.rules Fri Aug 30 17:07:30 2024 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -# Keymapp / Wally Flashing rules for the Moonlander and Planck EZ -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE:="0666", SYMLINK+="stm32_dfu" \ No newline at end of file diff -r 978ce75e54af -r f69061a590da .config/kbd/moonlander/config.h --- a/.config/kbd/moonlander/config.h Fri Aug 30 17:07:30 2024 -0400 +++ b/.config/kbd/moonlander/config.h Sat Sep 07 22:40:44 2024 -0400 @@ -2,12 +2,23 @@ Set any config.h overrides for your specific keymap here. See config.h options at https://docs.qmk.fm/#/config_options?id=the-configh-file */ -#pragma once #define ORYX_CONFIGURATOR +#define IGNORE_MOD_TAP_INTERRUPT +#undef TAPPING_TERM +#define TAPPING_TERM 174 + +#undef RGB_DISABLE_TIMEOUT +#define RGB_DISABLE_TIMEOUT 600000 + #define USB_SUSPEND_WAKEUP_DELAY 0 -#define FIRMWARE_VERSION u8"xbJpL/AaEdK" +#undef MOUSEKEY_INTERVAL +#define MOUSEKEY_INTERVAL 12 + +#define AUTO_SHIFT_TIMEOUT 174 +#define CAPS_LOCK_STATUS +#define FIRMWARE_VERSION u8"PDwV9/9yMR3" #define RAW_USAGE_PAGE 0xFF60 #define RAW_USAGE_ID 0x61 #define LAYER_STATE_8BIT + #define RGB_MATRIX_STARTUP_SPD 60 - diff -r 978ce75e54af -r f69061a590da .config/kbd/moonlander/keymap.c --- a/.config/kbd/moonlander/keymap.c Fri Aug 30 17:07:30 2024 -0400 +++ b/.config/kbd/moonlander/keymap.c Sat Sep 07 22:40:44 2024 -0400 @@ -46,21 +46,24 @@ #define SE_SECT_MAC ALGR(KC_6) #define MOON_LED_LEVEL LED_LEVEL -enum layers { - MAIN, +enum custom_keycodes { + RGB_SLD = ML_SAFE_RANGE, }; -enum custom_keycodes { - VRSN = SAFE_RANGE, - HSV_0_245_245, - HSV_74_255_206, - HSV_152_255_255, +enum tap_dance_codes { + DANCE_0, + DANCE_1, + DANCE_2, + DANCE_3, + DANCE_4, + DANCE_5, + DANCE_6, + DANCE_7, + DANCE_8, }; - - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [MAIN] = LAYOUT_moonlander( + [0] = LAYOUT_moonlander( // 1 KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_EQL, KC_GRAVE, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, @@ -74,25 +77,471 @@ KC_LSFT, KC_Z ,KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_BSPC, // 5 - KC_UP, KC_DOWN, KC_LBRC, KC_LPRN, KC_SPC, LCTL, - LALT, KC_SPC, KC_RPRN, KC_RBRC, KC_LEFT, KC_RIGHT, + KC_UP, KC_DOWN, KC_LBRC, KC_LPRN, KC_SPC, KC_LCTL, + KC_LALT, KC_SPC, KC_RPRN, KC_RBRC, KC_LEFT, KC_RIGHT, // 6 A(KC_X), C(KC_C), KC_LGUI, ALT_T(KC_PASTE), RGB_MODE_FORWARD, QK_LOCK ), + [1] = LAYOUT_moonlander( + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_PSCREEN, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, + KC_ESCAPE, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, + KC_LSHIFT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_RSHIFT, + TT(2), TD(DANCE_6), KC_9, KC_0, KC_ENTER, MO(4), LT(4,KC_ENTER), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TT(3), + KC_LALT, KC_SPACE, KC_LCTRL, KC_DELETE, KC_SPACE, KC_BSPACE + ), + [2] = LAYOUT_moonlander( + KC_NUMLOCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_TRANSPARENT, KC_NUMLOCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_NO, KC_SCROLLLOCK, KC_PAUSE, + KC_KP_DOT, KC_KP_ASTERISK, KC_KP_PLUS, KC_KP_7, KC_KP_8, KC_KP_9, KC_F7, KC_TRANSPARENT, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_MINUS, KC_PGUP, KC_PGDOWN, + KC_TRANSPARENT, KC_KP_SLASH, KC_KP_MINUS, KC_KP_4, KC_KP_5, KC_KP_6, KC_F8, KC_TRANSPARENT, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, KC_HOME, KC_END, + TD(DANCE_7), KC_F11, KC_F12, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, KC_TRANSPARENT, TD(DANCE_8), + KC_TRANSPARENT, KC_INSERT, KC_F9, KC_F10, KC_KP_0, KC_KP_ENTER, CAPS_WORD, KC_KP_0, KC_KP_DOT, KC_EQUAL, KC_TRANSPARENT, TO(0), + MT(MOD_LALT, KC_PGUP),KC_SPACE, MT(MOD_LCTL, KC_PGDOWN), KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT + ), + [3] = LAYOUT_moonlander( + KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_AUDIO_MUTE, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, RESET, + KC_TRANSPARENT, KC_MS_BTN5, KC_MS_WH_LEFT, KC_MS_UP, KC_MS_WH_RIGHT, KC_MS_WH_UP, KC_TRANSPARENT, KC_MS_WH_LEFT, KC_TRANSPARENT, KC_AUDIO_VOL_DOWN,KC_AUDIO_VOL_UP,KC_TRANSPARENT, KC_MEDIA_PREV_TRACK,KC_MEDIA_NEXT_TRACK, + KC_TRANSPARENT, KC_MS_BTN4, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_DOWN, KC_TRANSPARENT, KC_MS_WH_RIGHT, LCTL(LSFT(KC_LEFT)),LCTL(KC_LEFT), LCTL(KC_RIGHT), LCTL(LSFT(KC_RIGHT)),KC_MEDIA_STOP, KC_MEDIA_PLAY_PAUSE, + MT(MOD_LSFT, KC_LBRACKET),KC_TRANSPARENT, KC_MS_BTN1, KC_MS_BTN3, KC_MS_BTN2, KC_TRANSPARENT, KC_TRANSPARENT, LCTL(LSFT(KC_T)),LCTL(KC_PGUP), LCTL(KC_PGDOWN),KC_TRANSPARENT, MT(MOD_RSFT, KC_RBRACKET), + TO(0), TO(1), LGUI(LCTL(KC_LEFT)),LGUI(LCTL(KC_RIGHT)),KC_TRANSPARENT, KC_ASTG, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, MT(MOD_RCTL, KC_INSERT),KC_SPACE, KC_TRANSPARENT + ), + [4] = LAYOUT_moonlander( + KC_INSERT, KC_LCBR, KC_RCBR, KC_LBRACKET, KC_RBRACKET, KC_MINUS, KC_EQUAL, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, + KC_DELETE, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_7, + KC_BSPACE, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOTE, KC_ESCAPE, KC_A, KC_S, KC_D, KC_F, KC_G, KC_8, + KC_RSPC, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LSPO, + KC_ENTER, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TO(0), TO(0), KC_LGUI, KC_9, KC_0, KC_HOME, KC_END, + OSM(MOD_LALT), KC_SPACE, OSM(MOD_LCTL), OSM(MOD_LCTL), KC_SPACE, OSM(MOD_LALT) + ), // [MACRO] // [LISP] // [CTL] // [CMD] }; +extern rgb_config_t rgb_matrix_config; + +void keyboard_post_init_user(void) { + rgb_matrix_enable(); +} + + +const uint8_t PROGMEM ledmap[][DRIVER_LED_TOTAL][3] = { + [0] = { {188,255,255}, {188,255,255}, {188,255,255}, {151,255,255}, {25,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {188,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {188,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {25,255,255}, {152,255,255}, {7,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {25,255,255}, {102,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {188,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {188,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {188,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {188,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {188,255,255}, {188,255,255}, {188,255,255}, {152,255,255}, {25,255,255}, {152,255,255}, {7,255,255} }, + + [1] = { {188,255,255}, {188,255,255}, {188,255,255}, {188,255,255}, {0,245,245}, {102,255,255}, {151,255,255}, {25,255,255}, {151,255,255}, {25,255,255}, {102,255,255}, {25,255,255}, {25,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {25,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {25,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {25,255,255}, {151,255,255}, {0,245,245}, {102,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {0,245,245}, {102,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {25,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {25,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {25,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {25,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {188,255,255}, {188,255,255}, {188,255,255}, {151,255,255}, {25,255,255}, {151,255,255}, {25,255,255} }, + + [2] = { {41,255,255}, {102,255,255}, {0,0,0}, {188,255,255}, {151,255,255}, {188,255,255}, {102,255,255}, {102,255,255}, {188,255,255}, {25,255,255}, {188,255,255}, {102,255,255}, {102,255,255}, {188,255,255}, {188,255,255}, {188,255,255}, {151,255,255}, {0,0,255}, {151,255,255}, {188,255,255}, {188,255,255}, {0,0,255}, {151,255,255}, {0,0,255}, {151,255,255}, {188,255,255}, {151,255,255}, {0,0,255}, {151,255,255}, {188,255,255}, {188,255,255}, {188,255,255}, {151,255,255}, {0,0,0}, {151,255,255}, {41,255,255}, {188,255,255}, {25,255,255}, {25,255,255}, {188,255,255}, {151,255,255}, {188,255,255}, {25,255,255}, {25,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {102,255,255}, {102,255,255}, {102,255,255}, {41,255,255}, {102,255,255}, {151,255,255}, {0,0,255}, {151,255,255}, {102,255,255}, {102,255,255}, {0,0,255}, {151,255,255}, {0,0,255}, {151,255,255}, {41,255,255}, {151,255,255}, {0,0,255}, {151,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {41,255,255} }, + + [3] = { {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {151,255,255}, {0,0,0}, {25,255,255}, {25,255,255}, {0,0,0}, {25,255,255}, {0,245,245}, {188,255,255}, {74,255,255}, {25,255,255}, {188,255,255}, {0,245,245}, {74,255,255}, {74,255,255}, {25,255,255}, {188,255,255}, {0,245,245}, {188,255,255}, {74,255,255}, {25,255,255}, {0,0,0}, {0,0,0}, {188,255,255}, {188,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {41,255,255}, {41,255,255}, {0,245,245}, {0,245,245}, {0,0,0}, {152,255,255}, {0,0,0}, {0,245,245}, {255,245,245}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {151,255,255}, {25,255,255}, {0,0,0}, {0,0,0}, {41,255,255}, {74,255,255}, {25,255,255}, {0,0,0}, {41,255,255}, {41,255,255}, {74,255,255}, {25,255,255}, {0,0,0}, {0,0,0}, {0,0,0}, {151,255,255}, {0,0,0}, {0,0,0}, {188,255,255}, {188,255,255}, {0,0,0}, {0,0,0}, {151,255,255}, {0,0,0} }, + + [4] = { {188,255,255}, {188,255,255}, {188,255,255}, {188,255,255}, {25,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {188,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {188,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {188,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {188,255,255}, {151,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {25,255,255}, {151,255,255}, {25,255,255}, {25,255,255}, {151,255,255}, {151,255,255}, {151,255,255}, {188,255,255}, {188,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {188,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {151,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {188,255,255}, {151,255,255}, {102,255,255}, {102,255,255}, {102,255,255}, {188,255,255}, {188,255,255}, {188,255,255}, {25,255,255}, {151,255,255}, {25,255,255}, {25,255,255} }, + +}; + +void set_layer_color(int layer) { + for (int i = 0; i < DRIVER_LED_TOTAL; i++) { + HSV hsv = { + .h = pgm_read_byte(&ledmap[layer][i][0]), + .s = pgm_read_byte(&ledmap[layer][i][1]), + .v = pgm_read_byte(&ledmap[layer][i][2]), + }; + if (!hsv.h && !hsv.s && !hsv.v) { + rgb_matrix_set_color( i, 0, 0, 0 ); + } else { + RGB rgb = hsv_to_rgb( hsv ); + float f = (float)rgb_matrix_config.hsv.v / UINT8_MAX; + rgb_matrix_set_color( i, f * rgb.r, f * rgb.g, f * rgb.b ); + } + } +} + +void rgb_matrix_indicators_user(void) { + if (rawhid_state.rgb_control) { + return; + } + if (keyboard_config.disable_layer_led) { return; } + switch (biton32(layer_state)) { + case 0: + set_layer_color(0); + break; + case 1: + set_layer_color(1); + break; + case 2: + set_layer_color(2); + break; + case 3: + set_layer_color(3); + break; + case 4: + set_layer_color(4); + break; + default: + if (rgb_matrix_get_flags() == LED_FLAG_NONE) + rgb_matrix_set_color_all(0, 0, 0); + break; + } +} + bool process_record_user(uint16_t keycode, keyrecord_t *record) { - if (record->event.pressed) { - switch (keycode) { - case VRSN: - SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + switch (keycode) { + + case RGB_SLD: + if (rawhid_state.rgb_control) { return false; } + if (record->event.pressed) { + rgblight_mode(1); + } + return false; + } + return true; +} + + +typedef struct { + bool is_press_action; + uint8_t step; +} tap; + +enum { + SINGLE_TAP = 1, + SINGLE_HOLD, + DOUBLE_TAP, + DOUBLE_HOLD, + DOUBLE_SINGLE_TAP, + MORE_TAPS +}; + +static tap dance_state[9]; + +uint8_t dance_step(qk_tap_dance_state_t *state); + +uint8_t dance_step(qk_tap_dance_state_t *state) { + if (state->count == 1) { + if (state->interrupted || !state->pressed) return SINGLE_TAP; + else return SINGLE_HOLD; + } else if (state->count == 2) { + if (state->interrupted) return DOUBLE_SINGLE_TAP; + else if (state->pressed) return DOUBLE_HOLD; + else return DOUBLE_TAP; } - return true; + return MORE_TAPS; +} + + +void on_dance_0(qk_tap_dance_state_t *state, void *user_data); +void dance_0_finished(qk_tap_dance_state_t *state, void *user_data); +void dance_0_reset(qk_tap_dance_state_t *state, void *user_data); + +void on_dance_0(qk_tap_dance_state_t *state, void *user_data) { + if(state->count == 3) { + tap_code16(LCTL(KC_GRAVE)); + tap_code16(LCTL(KC_GRAVE)); + tap_code16(LCTL(KC_GRAVE)); + } + if(state->count > 3) { + tap_code16(LCTL(KC_GRAVE)); + } +} + +void dance_0_finished(qk_tap_dance_state_t *state, void *user_data) { + dance_state[0].step = dance_step(state); + switch (dance_state[0].step) { + case SINGLE_TAP: register_code16(LCTL(KC_GRAVE)); break; + case SINGLE_HOLD: register_code16(LCTL(KC_V)); break; + case DOUBLE_TAP: register_code16(LCTL(KC_GRAVE)); register_code16(LCTL(KC_GRAVE)); break; + case DOUBLE_SINGLE_TAP: tap_code16(LCTL(KC_GRAVE)); register_code16(LCTL(KC_GRAVE)); + } +} + +void dance_0_reset(qk_tap_dance_state_t *state, void *user_data) { + wait_ms(10); + switch (dance_state[0].step) { + case SINGLE_TAP: unregister_code16(LCTL(KC_GRAVE)); break; + case SINGLE_HOLD: unregister_code16(LCTL(KC_V)); break; + case DOUBLE_TAP: unregister_code16(LCTL(KC_GRAVE)); break; + case DOUBLE_SINGLE_TAP: unregister_code16(LCTL(KC_GRAVE)); break; + } + dance_state[0].step = 0; +} +void on_dance_1(qk_tap_dance_state_t *state, void *user_data); +void dance_1_finished(qk_tap_dance_state_t *state, void *user_data); +void dance_1_reset(qk_tap_dance_state_t *state, void *user_data); + +void on_dance_1(qk_tap_dance_state_t *state, void *user_data) { + if(state->count == 3) { + tap_code16(KC_9); + tap_code16(KC_9); + tap_code16(KC_9); + } + if(state->count > 3) { + tap_code16(KC_9); + } +} + +void dance_1_finished(qk_tap_dance_state_t *state, void *user_data) { + dance_state[1].step = dance_step(state); + switch (dance_state[1].step) { + case SINGLE_TAP: register_code16(KC_9); break; + case SINGLE_HOLD: register_code16(LCTL(KC_X)); break; + case DOUBLE_TAP: register_code16(KC_9); register_code16(KC_9); break; + case DOUBLE_SINGLE_TAP: tap_code16(KC_9); register_code16(KC_9); + } +} + +void dance_1_reset(qk_tap_dance_state_t *state, void *user_data) { + wait_ms(10); + switch (dance_state[1].step) { + case SINGLE_TAP: unregister_code16(KC_9); break; + case SINGLE_HOLD: unregister_code16(LCTL(KC_X)); break; + case DOUBLE_TAP: unregister_code16(KC_9); break; + case DOUBLE_SINGLE_TAP: unregister_code16(KC_9); break; + } + dance_state[1].step = 0; +} +void on_dance_2(qk_tap_dance_state_t *state, void *user_data); +void dance_2_finished(qk_tap_dance_state_t *state, void *user_data); +void dance_2_reset(qk_tap_dance_state_t *state, void *user_data); + +void on_dance_2(qk_tap_dance_state_t *state, void *user_data) { + if(state->count == 3) { + tap_code16(KC_0); + tap_code16(KC_0); + tap_code16(KC_0); + } + if(state->count > 3) { + tap_code16(KC_0); + } +} + +void dance_2_finished(qk_tap_dance_state_t *state, void *user_data) { + dance_state[2].step = dance_step(state); + switch (dance_state[2].step) { + case SINGLE_TAP: register_code16(KC_0); break; + case SINGLE_HOLD: register_code16(LCTL(KC_C)); break; + case DOUBLE_TAP: register_code16(KC_0); register_code16(KC_0); break; + case DOUBLE_SINGLE_TAP: tap_code16(KC_0); register_code16(KC_0); + } +} + +void dance_2_reset(qk_tap_dance_state_t *state, void *user_data) { + wait_ms(10); + switch (dance_state[2].step) { + case SINGLE_TAP: unregister_code16(KC_0); break; + case SINGLE_HOLD: unregister_code16(LCTL(KC_C)); break; + case DOUBLE_TAP: unregister_code16(KC_0); break; + case DOUBLE_SINGLE_TAP: unregister_code16(KC_0); break; + } + dance_state[2].step = 0; +} +void on_dance_3(qk_tap_dance_state_t *state, void *user_data); +void dance_3_finished(qk_tap_dance_state_t *state, void *user_data); +void dance_3_reset(qk_tap_dance_state_t *state, void *user_data); + +void on_dance_3(qk_tap_dance_state_t *state, void *user_data) { + if(state->count == 3) { + tap_code16(LALT(KC_SPACE)); + tap_code16(LALT(KC_SPACE)); + tap_code16(LALT(KC_SPACE)); + } + if(state->count > 3) { + tap_code16(LALT(KC_SPACE)); + } +} + +void dance_3_finished(qk_tap_dance_state_t *state, void *user_data) { + dance_state[3].step = dance_step(state); + switch (dance_state[3].step) { + case SINGLE_TAP: register_code16(LALT(KC_SPACE)); break; + case SINGLE_HOLD: register_code16(KC_LGUI); break; + case DOUBLE_TAP: register_code16(LALT(KC_SPACE)); register_code16(LALT(KC_SPACE)); break; + case DOUBLE_SINGLE_TAP: tap_code16(LALT(KC_SPACE)); register_code16(LALT(KC_SPACE)); + } +} + +void dance_3_reset(qk_tap_dance_state_t *state, void *user_data) { + wait_ms(10); + switch (dance_state[3].step) { + case SINGLE_TAP: unregister_code16(LALT(KC_SPACE)); break; + case SINGLE_HOLD: unregister_code16(KC_LGUI); break; + case DOUBLE_TAP: unregister_code16(LALT(KC_SPACE)); break; + case DOUBLE_SINGLE_TAP: unregister_code16(LALT(KC_SPACE)); break; + } + dance_state[3].step = 0; +} +void on_dance_4(qk_tap_dance_state_t *state, void *user_data); +void dance_4_finished(qk_tap_dance_state_t *state, void *user_data); +void dance_4_reset(qk_tap_dance_state_t *state, void *user_data); + +void on_dance_4(qk_tap_dance_state_t *state, void *user_data) { + if(state->count == 3) { + tap_code16(LGUI(KC_2)); + tap_code16(LGUI(KC_2)); + tap_code16(LGUI(KC_2)); + } + if(state->count > 3) { + tap_code16(LGUI(KC_2)); + } } + +void dance_4_finished(qk_tap_dance_state_t *state, void *user_data) { + dance_state[4].step = dance_step(state); + switch (dance_state[4].step) { + case SINGLE_TAP: register_code16(LGUI(KC_2)); break; + case SINGLE_HOLD: layer_on(4); break; + case DOUBLE_TAP: register_code16(LGUI(KC_2)); register_code16(LGUI(KC_2)); break; + case DOUBLE_SINGLE_TAP: tap_code16(LGUI(KC_2)); register_code16(LGUI(KC_2)); + } +} + +void dance_4_reset(qk_tap_dance_state_t *state, void *user_data) { + wait_ms(10); + switch (dance_state[4].step) { + case SINGLE_TAP: unregister_code16(LGUI(KC_2)); break; + case SINGLE_HOLD: layer_off(4); break; + case DOUBLE_TAP: unregister_code16(LGUI(KC_2)); break; + case DOUBLE_SINGLE_TAP: unregister_code16(LGUI(KC_2)); break; + } + dance_state[4].step = 0; +} +void on_dance_5(qk_tap_dance_state_t *state, void *user_data); +void dance_5_finished(qk_tap_dance_state_t *state, void *user_data); +void dance_5_reset(qk_tap_dance_state_t *state, void *user_data); + +void on_dance_5(qk_tap_dance_state_t *state, void *user_data) { + if(state->count == 3) { + tap_code16(KC_PSCREEN); + tap_code16(KC_PSCREEN); + tap_code16(KC_PSCREEN); + } + if(state->count > 3) { + tap_code16(KC_PSCREEN); + } +} + +void dance_5_finished(qk_tap_dance_state_t *state, void *user_data) { + dance_state[5].step = dance_step(state); + switch (dance_state[5].step) { + case SINGLE_TAP: register_code16(KC_PSCREEN); break; + case SINGLE_HOLD: register_code16(LGUI(LSFT(KC_S))); break; + case DOUBLE_TAP: register_code16(KC_PSCREEN); register_code16(KC_PSCREEN); break; + case DOUBLE_SINGLE_TAP: tap_code16(KC_PSCREEN); register_code16(KC_PSCREEN); + } +} + +void dance_5_reset(qk_tap_dance_state_t *state, void *user_data) { + wait_ms(10); + switch (dance_state[5].step) { + case SINGLE_TAP: unregister_code16(KC_PSCREEN); break; + case SINGLE_HOLD: unregister_code16(LGUI(LSFT(KC_S))); break; + case DOUBLE_TAP: unregister_code16(KC_PSCREEN); break; + case DOUBLE_SINGLE_TAP: unregister_code16(KC_PSCREEN); break; + } + dance_state[5].step = 0; +} +void dance_6_finished(qk_tap_dance_state_t *state, void *user_data); +void dance_6_reset(qk_tap_dance_state_t *state, void *user_data); + +void dance_6_finished(qk_tap_dance_state_t *state, void *user_data) { + dance_state[6].step = dance_step(state); + switch (dance_state[6].step) { + case SINGLE_TAP: layer_move(0); break; + case SINGLE_HOLD: layer_on(4); break; + case DOUBLE_TAP: layer_move(0); break; + case DOUBLE_SINGLE_TAP: layer_move(0); break; + } +} + +void dance_6_reset(qk_tap_dance_state_t *state, void *user_data) { + wait_ms(10); + switch (dance_state[6].step) { + case SINGLE_HOLD: layer_off(4); break; + } + dance_state[6].step = 0; +} +void on_dance_7(qk_tap_dance_state_t *state, void *user_data); +void dance_7_finished(qk_tap_dance_state_t *state, void *user_data); +void dance_7_reset(qk_tap_dance_state_t *state, void *user_data); + +void on_dance_7(qk_tap_dance_state_t *state, void *user_data) { + if(state->count == 3) { + tap_code16(KC_LCBR); + tap_code16(KC_LCBR); + tap_code16(KC_LCBR); + } + if(state->count > 3) { + tap_code16(KC_LCBR); + } +} + +void dance_7_finished(qk_tap_dance_state_t *state, void *user_data) { + dance_state[7].step = dance_step(state); + switch (dance_state[7].step) { + case SINGLE_TAP: register_code16(KC_LCBR); break; + case SINGLE_HOLD: register_code16(KC_LSHIFT); break; + case DOUBLE_TAP: register_code16(KC_LCBR); register_code16(KC_LCBR); break; + case DOUBLE_SINGLE_TAP: tap_code16(KC_LCBR); register_code16(KC_LCBR); + } +} + +void dance_7_reset(qk_tap_dance_state_t *state, void *user_data) { + wait_ms(10); + switch (dance_state[7].step) { + case SINGLE_TAP: unregister_code16(KC_LCBR); break; + case SINGLE_HOLD: unregister_code16(KC_LSHIFT); break; + case DOUBLE_TAP: unregister_code16(KC_LCBR); break; + case DOUBLE_SINGLE_TAP: unregister_code16(KC_LCBR); break; + } + dance_state[7].step = 0; +} +void on_dance_8(qk_tap_dance_state_t *state, void *user_data); +void dance_8_finished(qk_tap_dance_state_t *state, void *user_data); +void dance_8_reset(qk_tap_dance_state_t *state, void *user_data); + +void on_dance_8(qk_tap_dance_state_t *state, void *user_data) { + if(state->count == 3) { + tap_code16(KC_RCBR); + tap_code16(KC_RCBR); + tap_code16(KC_RCBR); + } + if(state->count > 3) { + tap_code16(KC_RCBR); + } +} + +void dance_8_finished(qk_tap_dance_state_t *state, void *user_data) { + dance_state[8].step = dance_step(state); + switch (dance_state[8].step) { + case SINGLE_TAP: register_code16(KC_RCBR); break; + case SINGLE_HOLD: register_code16(KC_RSHIFT); break; + case DOUBLE_TAP: register_code16(KC_RCBR); register_code16(KC_RCBR); break; + case DOUBLE_SINGLE_TAP: tap_code16(KC_RCBR); register_code16(KC_RCBR); + } +} + +void dance_8_reset(qk_tap_dance_state_t *state, void *user_data) { + wait_ms(10); + switch (dance_state[8].step) { + case SINGLE_TAP: unregister_code16(KC_RCBR); break; + case SINGLE_HOLD: unregister_code16(KC_RSHIFT); break; + case DOUBLE_TAP: unregister_code16(KC_RCBR); break; + case DOUBLE_SINGLE_TAP: unregister_code16(KC_RCBR); break; + } + dance_state[8].step = 0; +} + +qk_tap_dance_action_t tap_dance_actions[] = { + [DANCE_0] = ACTION_TAP_DANCE_FN_ADVANCED(on_dance_0, dance_0_finished, dance_0_reset), + [DANCE_1] = ACTION_TAP_DANCE_FN_ADVANCED(on_dance_1, dance_1_finished, dance_1_reset), + [DANCE_2] = ACTION_TAP_DANCE_FN_ADVANCED(on_dance_2, dance_2_finished, dance_2_reset), + [DANCE_3] = ACTION_TAP_DANCE_FN_ADVANCED(on_dance_3, dance_3_finished, dance_3_reset), + [DANCE_4] = ACTION_TAP_DANCE_FN_ADVANCED(on_dance_4, dance_4_finished, dance_4_reset), + [DANCE_5] = ACTION_TAP_DANCE_FN_ADVANCED(on_dance_5, dance_5_finished, dance_5_reset), + [DANCE_6] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_6_finished, dance_6_reset), + [DANCE_7] = ACTION_TAP_DANCE_FN_ADVANCED(on_dance_7, dance_7_finished, dance_7_reset), + [DANCE_8] = ACTION_TAP_DANCE_FN_ADVANCED(on_dance_8, dance_8_finished, dance_8_reset), +}; diff -r 978ce75e54af -r f69061a590da .config/kbd/moonlander/rules.mk --- a/.config/kbd/moonlander/rules.mk Fri Aug 30 17:07:30 2024 -0400 +++ b/.config/kbd/moonlander/rules.mk Sat Sep 07 22:40:44 2024 -0400 @@ -2,8 +2,9 @@ # See rules at https://docs.qmk.fm/#/config_options?id=the-rulesmk-file CONSOLE_ENABLE = no COMMAND_ENABLE = no +AUTO_SHIFT_ENABLE = yes ORYX_ENABLE = yes -RAW_ENABLE = yes -SPACE_CADET_ENABLE = no +RGB_MATRIX_CUSTOM_KB = yes +TAP_DANCE_ENABLE = yes CAPS_WORD_ENABLE = yes SRC = matrix.c diff -r 978ce75e54af -r f69061a590da .emacs.d/ellis.el --- a/.emacs.d/ellis.el Fri Aug 30 17:07:30 2024 -0400 +++ b/.emacs.d/ellis.el Sat Sep 07 22:40:44 2024 -0400 @@ -112,12 +112,12 @@ notmuch-show-logo nil notmuch-search-oldest-first nil notmuch-hello-hide-tags '("kill") - notmuch-saved-searches '((:name "inbox" :query "tag:inbox" :key "i") - (:name "unread" :query "tag:unread" :key "u") + notmuch-saved-searches '((:name "unread" :query "tag:unread" :key "u") + (:name "inbox" :query "tag:inbox" :key "i") (:name "new" :query "tag:new" :key "n") + (:name "drafts" :query "tag:draft" :key "d") (:name "sent" :query "tag:sent" :key "e") - (:name "drafts" :query "tag:draft" :key "d") - (:name "all mail" :query "*" :key "a") + (:name "all" :query "*" :key "a") (:name "todo" :query "tag:todo" :key "t"))) :config ;;;###autoload @@ -187,8 +187,6 @@ ("http://arxiv.org/rss/econ" econ rnd) ;; John Wiegley ("http://newartisans.com/rss.xml" dev blog) - ;; comp - ;; ("https://lab.rwest.io/comp.atom?feed_token=pHu9qwLkjy4CWJHx9rrJ" comp vc) ("https://www.reddit.com/r/listentothis/.rss" music reddit) ("https://www.ftc.gov/feeds/press-release-consumer-protection.xml" gov ftc) ("https://api2.fcc.gov/edocs/public/api/v1/rss/" gov fcc) @@ -269,10 +267,11 @@ (setq org-timeline-insert-before-text "›" org-timeline-beginning-of-day-hour 8 + org-timeline-default-duration 30 org-timeline-keep-elapsed 2 - org-timeline-start-hour 5 + org-timeline-start-hour 8 org-timeline-show-text-in-blocks t - org-timeline-prepend t)) + org-timeline-prepend nil)) ;;; IRC (setq erc-format-nick-function 'erc-format-@nick) @@ -339,7 +338,7 @@ (while (< (point) end) (cond ;; Ignore comments. - ((or (org-in-commented-line) (org-at-table-p)) + ((or (org-at-comment-p) (org-at-table-p)) nil) ;; Ignore hyperlinks. But if link has a description, count ;; the words within the description. @@ -353,7 +352,7 @@ ((looking-at org-any-link-re) (goto-char (match-end 0))) ;; Ignore source code blocks. - ((org-in-regexps-block-p "^#\\+BEGIN_SRC\\W" "^#\\+END_SRC\\W") + ((org-between-regexps-p "^#\\+BEGIN_SRC\\W" "^#\\+END_SRC\\W") nil) ;; Ignore inline source blocks, counting them as 1 word. ((save-excursion @@ -393,8 +392,8 @@ (t (cl-incf wc)))))) (re-search-forward "\\w+\\W*"))) - (message (format "%d words in %s." wc - (if mark-active "region" "buffer"))))) + (format "%d words in %s." wc + (if mark-active "region" "buffer")))) (defun org-check-misformatted-subtree () "Check misformatted entries in the current buffer." @@ -505,15 +504,15 @@ (require 'mm-url) ; to include mm-url-decode-entities-string -(defun org-insert-link-with-title () - "Insert org link where default description is set to html title." - (interactive) - (let* ((url (read-string "URL: ")) - (title (get-html-title-from-url url))) - (org-insert-link nil url title))) +(cl-defun get-first-url (&optional (match (rx bol "http" (optional "s") "://"))) + "Return URL in clipboard, or first URL in the `kill-ring' matching MATCH." + (cl-loop for item in (cons (current-kill 0) kill-ring) + when (and item (string-match-p match item)) + return item)) (defun get-html-title-from-url (url) "Return content in tag." + (interactive (list (get-first-url))) (let (x1 x2 (download-buffer (url-retrieve-synchronously url))) (save-excursion (set-buffer download-buffer) @@ -523,6 +522,17 @@ (setq x2 (search-backward "<")) (mm-url-decode-entities-string (buffer-substring-no-properties x1 x2))))) +(defun org-insert-link-with-title (url) + "Insert org link where default description is set to html title." + (interactive (list (get-first-url match))) + (let ((title (get-html-title-from-url url))) + (org-insert-link nil url title))) + +(defun org-insert-so-link (url) + (interactive (list (get-first-url (rx bol "https://" (* anychar) "stackoverflow.com")))) + (let ((title (get-html-title-from-url url))) + (org-insert-link nil url title))) + (defun org-remove-empty-propert-drawers () "*Remove all empty property drawers in current file." (interactive) @@ -585,6 +595,8 @@ (defvar org-agenda-extensions '(".org") "List of extensions of agenda files") +(setq org-agenda-default-appointment-duration 30) +(setq org-agenda-span 5) (defun org-set-agenda-files () (interactive) (setq org-agenda-files @@ -597,6 +609,28 @@ (with-eval-after-load 'org (org-set-agenda-files)) +;; org-agenda-auto-update +(defvar org-agenda-update-interval 300) +(defvar org-agenda-update-timer nil) +(defvar org-agenda-update-idle t) + +(defun org-agenda-update () + (org-agenda-redo-all t)) + +(defun org-agenda-auto-update () + (when org-agenda-update-timer + (setq org-agenda-update-timer + (cancel-timer org-agenda-update-timer))) + (setq org-agenda-update-timer + (if org-agenda-update-idle + (run-with-idle-timer org-agenda-update-interval t 'org-agenda-update) + ;; when we refresh the org-agenda buffer, also reset the timer + (add-hook 'org-agenda-finalize-hook 'org-agenda-auto-update) + (run-with-timer org-agenda-update-interval org-agenda-update-interval 'org-agenda-update)))) + +(with-eval-after-load 'org-agenda + (org-agenda-auto-update)) + ;;; Skel Config (use-package skel :requires skel @@ -754,7 +788,15 @@ (skt-register-auto-insert ".*[.]lisp" #'skt-template-lisp-head) (skt-register-auto-insert ".*[.].rs" #'skt-template-rust-head) (auto-insert-mode t) - (keymap-set skel-minor-mode-map "C-<return>" 'company-tempo)) + ;; (keymap-set skel-minor-mode-map "C-<return>" 'company-tempo) + ) + +;;; ical2org +;; go install github.com/rjhorniii/ical2org@latest +(defun ical2org (file) + "Convert ics FILE to an org-mode heading." + (interactive "ffile: ") + (shell-command (format "ical2org %s -a %s" file org-inbox-file))) ;;; glossary ;; (with-eval-after-load 'org-glossary diff -r 978ce75e54af -r f69061a590da .offlineimaprc --- a/.offlineimaprc Fri Aug 30 17:07:30 2024 -0400 +++ b/.offlineimaprc Sat Sep 07 22:40:44 2024 -0400 @@ -1,5 +1,6 @@ [general] -accounts = ellis, demon, postmaster +accounts = ellis, demon +# postmaster pythonfile = ~/.config/offlineimap/get_pass.py [Account ellis] @@ -47,26 +48,26 @@ folderfilter = lambda foldername: foldername in ['[Gmail]/All Mail'] nametrans = lambda foldername: re.sub('^\[Gmail\]/All Mail$', 'all',foldername) -[Account postmaster] -synclabels = yes -localrepository = postmaster -remoterepository = postmaster-imap -postsynchook = ~/.config/offlineimap/postsync.sh +# [Account postmaster] +# synclabels = yes +# localrepository = postmaster +# remoterepository = postmaster-imap +# postsynchook = ~/.config/offlineimap/postsync.sh -[Repository postmaster] -type = Maildir -localfolders = ~/mail/postmaster +# [Repository postmaster] +# type = Maildir +# localfolders = ~/mail/postmaster -[Repository postmaster-imap] -type = IMAP -remotepasseval = get_authinfo_password("mail.compiler.company", "postmaster", 993) -remotehost = mail.compiler.company -remoteuser = postmaster@compiler.company -# Necessary to work around https://github.com/OfflineIMAP/offlineimap/issues/573 (versions 7.0.12, 7.2.1) -# macos only -#sslcacertfile = /opt/local/etc/openssl/cert.pem -#ssl_version = tls1_2 -# linux only -sslcacertfile = /etc/ssl/certs/ca-certificates.crt -#folderfilter = lambda foldername: foldername in ['[Gmail]/All Mail'] -#nametrans = lambda foldername: re.sub('^\[Gmail\]/All Mail$', 'all',foldername) +# [Repository postmaster-imap] +# type = IMAP +# remotepasseval = get_authinfo_password("mail.compiler.company", "postmaster", 993) +# remotehost = mail.compiler.company +# remoteuser = postmaster@compiler.company +# # Necessary to work around https://github.com/OfflineIMAP/offlineimap/issues/573 (versions 7.0.12, 7.2.1) +# # macos only +# #sslcacertfile = /opt/local/etc/openssl/cert.pem +# #ssl_version = tls1_2 +# # linux only +# sslcacertfile = /etc/ssl/certs/ca-certificates.crt +# #folderfilter = lambda foldername: foldername in ['[Gmail]/All Mail'] +# #nametrans = lambda foldername: re.sub('^\[Gmail\]/All Mail$', 'all',foldername) diff -r 978ce75e54af -r f69061a590da .stash/scripts/qmk-flash-moonlander.sh --- a/.stash/scripts/qmk-flash-moonlander.sh Fri Aug 30 17:07:30 2024 -0400 +++ b/.stash/scripts/qmk-flash-moonlander.sh Sat Sep 07 22:40:44 2024 -0400 @@ -1,3 +1,4 @@ #!/bin/sh -cp -rf ~/.config/kbd/moonlander/* ~/qmk_firmware/keyboards/moonlander/keymaps/ellis/ +cd ~/.stash/qmk_firmware +cp -rf ~/.config/kbd/moonlander/* keyboards/moonlander/keymaps/ellis/ qmk flash -kb moonlander -km ellis diff -r 978ce75e54af -r f69061a590da .stash/scripts/rec.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.stash/scripts/rec.sh Sat Sep 07 22:40:44 2024 -0400 @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +slop=$(slop -f "%x %y %w %h %g %i") || exit 1 +read -r X Y W H G ID <<< $slop +ffmpeg -f x11grab -s "$W"x"$H" -i :0.0+$X,$Y ${1:-"${HOME}/$(date +%s).gif"} diff -r 978ce75e54af -r f69061a590da .stash/scripts/sc.sh --- a/.stash/scripts/sc.sh Fri Aug 30 17:07:30 2024 -0400 +++ b/.stash/scripts/sc.sh Sat Sep 07 22:40:44 2024 -0400 @@ -1,4 +1,4 @@ -#!/usr/local/env bash +#!/usr/bin/env bash import png:- >> ${1:-"$(date +%s).png"} # take screenshot of current window on sway # swaymsg -t get_tree | jq -r '.. | select(.focused?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"' | grim -g - ${1:-"$(date +%s).png"} diff -r 978ce75e54af -r f69061a590da .stumpwm.d/init.lisp --- a/.stumpwm.d/init.lisp Fri Aug 30 17:07:30 2024 -0400 +++ b/.stumpwm.d/init.lisp Sat Sep 07 22:40:44 2024 -0400 @@ -5,7 +5,12 @@ (stumpwm:set-prefix-key (kbd "s-SPC")) (ignore-errors - (ql:quickload '(:std :core :prelude :user))) + (ql:quickload '(:std :core :prelude :user :swank))) + +(defcommand quickload (system) + ((:rest "System: ")) + "Load a system with QL:QUICKLOAD" + (ql:quickload system)) (defcommand load-std () () (ql:quickload :std)) @@ -39,7 +44,7 @@ (unless swm-golden-ratio:*golden-ratio-on* (swm-golden-ratio:toggle-golden-ratio)) -;; (load-module "stumptray") +(load-module "screenshot") (load-module "cpu") (load-module "hostname") (load-module "mpd") @@ -51,8 +56,6 @@ (ql:quickload :xml-emitter) (ql:quickload :dbus) -(load-module "notify") -(notify:notify-server-toggle) (set-fg-color "#ffffff") (set-bg-color "#000000") diff -r 978ce75e54af -r f69061a590da .xinitrc --- a/.xinitrc Fri Aug 30 17:07:30 2024 -0400 +++ b/.xinitrc Sat Sep 07 22:40:44 2024 -0400 @@ -2,6 +2,7 @@ xrdb .Xresources & xset r rate 200 40 & xset s off -dpms & +systemctl --user import-environment DISPLAY case $session in sway ) exec sway;; stumpwm ) /usr/local/bin/stumpwm;;