mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-11-04 07:12:33 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			330 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			330 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Copyright 2019 niltea
 | 
						|
 *
 | 
						|
 * This program is free software: you can redistribute it and/or modify
 | 
						|
 * it under the terms of the GNU General Public License as published by
 | 
						|
 * the Free Software Foundation, either version 2 of the License, or
 | 
						|
 * (at your option) any later version.
 | 
						|
 *
 | 
						|
 * This program is distributed in the hope that it will be useful,
 | 
						|
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
 * GNU General Public License for more details.
 | 
						|
 *
 | 
						|
 * You should have received a copy of the GNU General Public License
 | 
						|
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
						|
 */
 | 
						|
#include QMK_KEYBOARD_H
 | 
						|
#ifdef OLED_DRIVER_ENABLE
 | 
						|
  #include <string.h>
 | 
						|
  #include "lib/oled_helper.h"
 | 
						|
#endif
 | 
						|
 | 
						|
enum custom_keycode {
 | 
						|
  Mac_CS = SAFE_RANGE,
 | 
						|
  Mac_PS,
 | 
						|
  Win_CS,
 | 
						|
  Win_PS,
 | 
						|
  IOS_CS,
 | 
						|
};
 | 
						|
enum layerID {
 | 
						|
  MAC_CS_1 = 0,
 | 
						|
  MAC_CS_2,
 | 
						|
  MAC_PS_1,
 | 
						|
  MAC_PS_2,
 | 
						|
  WIN_CS_1,
 | 
						|
  WIN_CS_2,
 | 
						|
  WIN_PS_1,
 | 
						|
  WIN_PS_2,
 | 
						|
  IOS_CS_1,
 | 
						|
  IOS_CS_2,
 | 
						|
  SETTING,
 | 
						|
};
 | 
						|
 | 
						|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
						|
    // Mac
 | 
						|
    // Clip Studio
 | 
						|
    [MAC_CS_1] = LAYOUT(
 | 
						|
      KC_TAB,       LGUI(KC_A), KC_E,         KC_P,          LGUI(KC_0),
 | 
						|
      MO(MAC_CS_2), KC_M,       KC_BSPC,      KC_B,          KC_HYPR,
 | 
						|
                    KC_LSFT,    KC_LGUI,      LGUI(KC_Z),    KC_SPC
 | 
						|
    ),
 | 
						|
    [MAC_CS_2] = LAYOUT(
 | 
						|
      MO(SETTING),  KC_ESC,     KC_G,         KC_R,          LGUI(KC_GRV),
 | 
						|
      _______,      LGUI(KC_D), KC_K,         KC_F,          LGUI(KC_S),
 | 
						|
                    KC_LALT,    KC_I,         SGUI(KC_Z),    KC_H
 | 
						|
    ),
 | 
						|
    // Photoshop
 | 
						|
    [MAC_PS_1] = LAYOUT(
 | 
						|
      KC_TAB,       LGUI(KC_A), KC_E,         KC_B,          LGUI(KC_1),
 | 
						|
      MO(MAC_PS_2), KC_L,       LGUI(KC_DEL), LGUI(KC_QUOT), KC_MEH,
 | 
						|
                    KC_LSFT,    KC_LGUI,      LGUI(KC_Z),    KC_SPC
 | 
						|
    ),
 | 
						|
    [MAC_PS_2] = LAYOUT(
 | 
						|
      MO(SETTING),  KC_ESC,     KC_G,         KC_R,          KC_ESC,
 | 
						|
      _______,      LGUI(KC_D), KC_V,         LGUI(KC_T),    LGUI(KC_S),
 | 
						|
                    KC_LALT,    KC_I,         SGUI(KC_Z),    KC_H
 | 
						|
    ),
 | 
						|
 | 
						|
    // Windows
 | 
						|
    // Clip Studio
 | 
						|
    [WIN_CS_1] = LAYOUT(
 | 
						|
      KC_TAB,       LCTL(KC_A), KC_E,         KC_P,          LCTL(KC_0),
 | 
						|
      MO(WIN_CS_2), KC_M,       KC_BSPC,      KC_B,          KC_HYPR,
 | 
						|
                    KC_LSFT,    KC_LCTRL,     LCTL(KC_Z),    KC_SPC
 | 
						|
    ),
 | 
						|
    [WIN_CS_2] = LAYOUT(
 | 
						|
      MO(SETTING),  KC_ESC,     KC_G,         KC_R,          LCTL(KC_GRV),
 | 
						|
      _______,      LCTL(KC_D), KC_K,         KC_F,          LCTL(KC_S),
 | 
						|
                    KC_LALT,    KC_I,         C(S(KC_Z)),    KC_H
 | 
						|
    ),
 | 
						|
    // Photoshop
 | 
						|
    [WIN_PS_1] = LAYOUT(
 | 
						|
      KC_TAB,       LCTL(KC_A), KC_E,         KC_B,          LCTL(KC_1),
 | 
						|
      MO(WIN_PS_2), KC_L,       LCTL(KC_DEL), LCTL(KC_QUOT), KC_MEH,
 | 
						|
                    KC_LSFT,    KC_LCTRL,     LCTL(KC_Z),    KC_SPC
 | 
						|
    ),
 | 
						|
    [WIN_PS_2] = LAYOUT(
 | 
						|
      MO(SETTING),  KC_ESC,     KC_G,         KC_R,          KC_ESC,
 | 
						|
      _______,      LCTL(KC_D), KC_V,         LCTL(KC_T),    LCTL(KC_S),
 | 
						|
                    KC_LALT,    KC_I,         C(S(KC_Z)),    KC_H
 | 
						|
    ),
 | 
						|
    // iOS
 | 
						|
    // Clip Studio
 | 
						|
    [IOS_CS_1] = LAYOUT(
 | 
						|
      KC_TAB,       LGUI(KC_A), KC_E,         KC_P,          LGUI(KC_0),
 | 
						|
      MO(IOS_CS_2), KC_M,       KC_BSPC,      KC_B,          LGUI(KC_LALT),
 | 
						|
                    KC_LSFT,    KC_LGUI,      LGUI(KC_Z),    KC_SPC
 | 
						|
    ),
 | 
						|
    [IOS_CS_2] = LAYOUT(
 | 
						|
      MO(SETTING),  KC_ESC,     KC_G,         KC_R,          LGUI(KC_EQL),
 | 
						|
      _______,      LGUI(KC_D), KC_K,         KC_F,          LGUI(KC_S),
 | 
						|
                    KC_LALT,    KC_I,         SGUI(KC_Z),    KC_H
 | 
						|
    ),
 | 
						|
    [SETTING] = LAYOUT(
 | 
						|
      _______, IOS_CS, Win_CS, Mac_CS, KC_NO,
 | 
						|
      _______, KC_NO,  Win_PS, Mac_PS, KC_NO,
 | 
						|
               KC_NO,  KC_NO,  KC_NO,  KC_NO
 | 
						|
    ),
 | 
						|
};
 | 
						|
 | 
						|
void encoder_update_user(uint8_t index, bool clockwise) {
 | 
						|
  uint8_t currentDefault = get_highest_layer(default_layer_state);
 | 
						|
  uint8_t currentLayer = get_highest_layer(layer_state);
 | 
						|
  if (index == 0) { /* the upper encoder */
 | 
						|
    switch (currentDefault) {
 | 
						|
      case MAC_CS_1:
 | 
						|
        if (currentLayer % 2 == 0) {
 | 
						|
          // default layer
 | 
						|
          // Zoom
 | 
						|
          tap_code16(!clockwise ? G(KC_MINS) : G(KC_EQL));
 | 
						|
        } else {
 | 
						|
          // Fn Layer
 | 
						|
          // rotate canvas
 | 
						|
          tap_code(!clockwise ? KC_MINS : KC_QUOT);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
      case MAC_PS_1:
 | 
						|
        if (currentLayer % 2 == 0) {
 | 
						|
          // default layer
 | 
						|
          // Zoom
 | 
						|
          tap_code16(!clockwise ? G(KC_MINS) : G(KC_EQL));
 | 
						|
        } else {
 | 
						|
          // Fn Layer
 | 
						|
          // undo / redo
 | 
						|
          tap_code16(!clockwise ? G(KC_Z) : S(G(KC_Z)));
 | 
						|
        }
 | 
						|
        break;
 | 
						|
      case WIN_CS_1:
 | 
						|
        if (currentLayer % 2 == 0) {
 | 
						|
          // default layer
 | 
						|
          // Zoom
 | 
						|
          tap_code16(!clockwise ? C(KC_MINS) : C(KC_EQL));
 | 
						|
        } else {
 | 
						|
          // Fn Layer
 | 
						|
          // rotate canvas
 | 
						|
          tap_code(!clockwise ? KC_MINS : KC_QUOT);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
      case WIN_PS_1:
 | 
						|
        if (currentLayer % 2 == 0) {
 | 
						|
          // default layer
 | 
						|
          // Zoom
 | 
						|
          tap_code16(!clockwise ? C(KC_MINS) : C(KC_SCLN));
 | 
						|
        } else {
 | 
						|
          // Fn Layer
 | 
						|
          // undo / redo
 | 
						|
          tap_code16(!clockwise ? C(KC_Z) : C(S(KC_Z)));
 | 
						|
        }
 | 
						|
        break;
 | 
						|
      case IOS_CS_1:
 | 
						|
        if (currentLayer % 2 == 0) {
 | 
						|
          // default layer
 | 
						|
          // Zoom 
 | 
						|
          tap_code16(!clockwise ? G(KC_MINS) : G(KC_SCLN));
 | 
						|
        } else {
 | 
						|
          // Fn Layer
 | 
						|
          // rotate canvas
 | 
						|
          tap_code(!clockwise ? KC_MINS : KC_EQL);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
      default:
 | 
						|
        break;
 | 
						|
    }
 | 
						|
  } else if (index == 1) { /* the lower encoder */ 
 | 
						|
    switch (currentDefault) {
 | 
						|
      case MAC_CS_1:
 | 
						|
        if (currentLayer % 2 == 0) {
 | 
						|
          // default layer
 | 
						|
          // size of brush
 | 
						|
          tap_code(!clockwise ? KC_LBRC : KC_RBRC);
 | 
						|
        } else {
 | 
						|
          // Fn Layer
 | 
						|
          // opacity of brush
 | 
						|
          tap_code16(!clockwise ? G(KC_LBRC) : G(KC_RBRC));
 | 
						|
        }
 | 
						|
        break;
 | 
						|
      case MAC_PS_1:
 | 
						|
        if (currentLayer % 2 == 0) {
 | 
						|
          // default layer
 | 
						|
          // size of brush
 | 
						|
          tap_code(!clockwise ? KC_LBRC : KC_RBRC);
 | 
						|
        } else {
 | 
						|
          // Fn Layer
 | 
						|
          // opacity of brush
 | 
						|
          tap_code16(!clockwise ? KC_LCBR : KC_RCBR);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
      case WIN_CS_1:
 | 
						|
        if (currentLayer % 2 == 0) {
 | 
						|
          // default layer
 | 
						|
          // rotate canvas
 | 
						|
          tap_code(!clockwise ? KC_LBRC : KC_RBRC);
 | 
						|
        } else {
 | 
						|
          // Fn Layer
 | 
						|
          // opacity of brush
 | 
						|
          tap_code16(!clockwise ? C(KC_LBRC) : C(KC_RBRC));
 | 
						|
        }
 | 
						|
        break;
 | 
						|
      case WIN_PS_1:
 | 
						|
        if (currentLayer % 2 == 0) {
 | 
						|
          // default layer
 | 
						|
          // rotate canvas
 | 
						|
          tap_code(!clockwise ? KC_LBRC : KC_RBRC);
 | 
						|
        } else {
 | 
						|
          // Fn Layer
 | 
						|
          // opacity of brush
 | 
						|
          tap_code16(!clockwise ? KC_LCBR : KC_RCBR);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
      case IOS_CS_1:
 | 
						|
        if (currentLayer % 2 == 0) {
 | 
						|
          // default layer
 | 
						|
          // size of brush
 | 
						|
          tap_code(!clockwise ? KC_RBRC : KC_BSLS);
 | 
						|
        } else {
 | 
						|
          // Fn Layer
 | 
						|
          // opacity of brush
 | 
						|
          tap_code16(!clockwise ? G(KC_RBRC) : G(KC_BSLS));
 | 
						|
        }
 | 
						|
        break;
 | 
						|
      default:
 | 
						|
        break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// custom keycode
 | 
						|
// switch default layer
 | 
						|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
						|
  switch (keycode) {
 | 
						|
    case Mac_CS:
 | 
						|
      if (record->event.pressed) {
 | 
						|
        set_single_persistent_default_layer(MAC_CS_1);
 | 
						|
      }
 | 
						|
      return false;
 | 
						|
      break;
 | 
						|
    case Mac_PS:
 | 
						|
      if (record->event.pressed) {
 | 
						|
        set_single_persistent_default_layer(MAC_PS_1);
 | 
						|
      }
 | 
						|
      return false;
 | 
						|
      break;
 | 
						|
    case Win_CS:
 | 
						|
      if (record->event.pressed) {
 | 
						|
        set_single_persistent_default_layer(WIN_CS_1);
 | 
						|
      }
 | 
						|
      return false;
 | 
						|
      break;
 | 
						|
    case Win_PS:
 | 
						|
      if (record->event.pressed) {
 | 
						|
        set_single_persistent_default_layer(WIN_PS_1);
 | 
						|
      }
 | 
						|
      return false;
 | 
						|
      break;
 | 
						|
    case IOS_CS:
 | 
						|
      if (record->event.pressed) {
 | 
						|
        set_single_persistent_default_layer(IOS_CS_1);
 | 
						|
      }
 | 
						|
      return false;
 | 
						|
      break;
 | 
						|
  }
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
// OLED Display
 | 
						|
#ifdef OLED_DRIVER_ENABLE
 | 
						|
void oled_task_user(void) {
 | 
						|
  // get layer Number
 | 
						|
  uint8_t currentDefault = get_highest_layer(default_layer_state);
 | 
						|
  uint8_t currentLayer = get_highest_layer(layer_state);
 | 
						|
  // write OS mode / 1st line of the logo
 | 
						|
  switch (currentDefault) {
 | 
						|
    case MAC_CS_1:
 | 
						|
    case MAC_PS_1:
 | 
						|
      render_row(0, "Mac ");
 | 
						|
      break;
 | 
						|
    case WIN_CS_1:
 | 
						|
    case WIN_PS_1:
 | 
						|
      render_row(0, "Win ");
 | 
						|
      break;
 | 
						|
    case IOS_CS_1:
 | 
						|
      render_row(0, "iOS ");
 | 
						|
      break;
 | 
						|
    default:
 | 
						|
      render_row(0, "    ");
 | 
						|
  }
 | 
						|
 | 
						|
  // write Application mode / 2nd line of the logo
 | 
						|
  switch (currentDefault) {
 | 
						|
    case MAC_CS_1:
 | 
						|
    case WIN_CS_1:
 | 
						|
    case IOS_CS_1:
 | 
						|
      render_row(1, "A:CS");
 | 
						|
      break;
 | 
						|
    case MAC_PS_1:
 | 
						|
    case WIN_PS_1:
 | 
						|
      render_row(1, "A:Ps");
 | 
						|
      break;
 | 
						|
    default:
 | 
						|
      render_row(1, "    ");
 | 
						|
  }
 | 
						|
 | 
						|
  if (currentLayer == SETTING) {
 | 
						|
    // 3rd & 4th line of the logo
 | 
						|
    render_row(2, "****");
 | 
						|
    render_row(3, "LSEL");
 | 
						|
  } else {
 | 
						|
    // Layer Status / 3rd line of the logo
 | 
						|
    if (currentLayer % 2 == 0) {
 | 
						|
      // default layer
 | 
						|
      render_row(2, "L:DF");
 | 
						|
    } else {
 | 
						|
      // Fn Layer
 | 
						|
      render_row(2, "L:Fn");
 | 
						|
    }
 | 
						|
    // pressed key / 4th line of the logo
 | 
						|
    render_row(3, "    ");
 | 
						|
  }
 | 
						|
}
 | 
						|
#endif // #ifdef OLED_DRIVER_ENABLE
 |