add tkl_(ansi|iso)_wkl* community layouts
Description
Adding tenkeyless (tkl) windows keyless (wkl) community layouts. This layout is technically a tsangan (bottom row) layout with both GUI keys removed, however mechanical keyboard community does not refer to this layout as "tsangan wkl".
keyboards where these community layouts apply will be added in a later PR, post merge of this PR and #21796.
Uniform(ed) spacing between alphanumeric cluster and navigation cluster for tkl_f13_* layouts in layouts/default/readme.md
Types of Changes
- [ ] Core
- [ ] Bugfix
- [ ] New feature
- [x] Enhancement/optimization
- [ ] Keyboard (addition or update)
- [x] Keymap/layout/userspace (addition or update)
- [ ] Documentation
Issues Fixed or Closed by This PR
- n/a
Checklist
- [x] My code follows the code style of this project: C, Python
- [x] I have read the PR Checklist document and have made the appropriate changes.
- [ ] My change requires a change to the documentation.
- [ ] I have updated the documentation accordingly.
- [x] I have read the CONTRIBUTING document.
- [ ] I have added tests to cover my changes.
- [x] I have tested the changes and verified that they work and don't break anything (as well as I can manage).
I was asked by @dunk2k to comment on this PR.
Having looked through the layouts in this PR and the ones that already exists in layouts/defaults, it looks like there is some confusion about what a Tsangan layout actually is.
Maybe this PR isn't the correct place to discuss this but here we go anyway.
As far as I'm aware, Tsangan refers to an entire layout. A layout where the distinguishing feature is that is has the following
- A bottom row that is 1.5, 1, 1.5, 7, 1.5, 1, 1.5
- Split backspace
- 1.75 right shift with a 1u key to the right of it
When referring to a layout that is "normal" in all other ways besides that it has a bottom row of 1.5, 1, 1.5, 7, 1.5, 1, 1.5 I was under the impression that 7U was used. Something like TKL ANSI 7U
History
A quick history lesson for any younglings. Back in the dark ages, when all we had was DCS keycaps from Signature Plastics, there existed a Korean Geekhack user named Tsangan. Tsangan came to group buys asking that a set of "weird" keys be added to the group buy. These keys where needed for the set to be compatible with a few esoteric layouts that was popular in the Korean keyboard community.
Tsangans requests became so frequent that group buy organizers started including a "Tsangan kit" in their group buys. Among the keys included in the "Tsangan kit" was a 7u spacebar and a 1.75u shift. The complete "Tsangan kit" can be seen in the Deskthority wiki here.
Somewhere along the line Tsangan became synonymous with a layout that utilizes a few of the keys from the "Tsangan kit". Producing the layout I mentioned above. A Google image search for "tsangan layout" will confirm this.
So if we are to stay true to the history tsangan should not just refer to the bottom row.
Layout definitions
Bellow are my thoughts regarding how layouts works. Which appears to be in conflict with this PR and how some of the already defined layouts in QMK works.
Lets assume that there exists a few fundamental base layouts. Some examples of such base layouts would be TKL, 60%, Ergodox and so on. We'll call this base.
Lets also assume that the base layouts has a few general variations, like ANSI, ISO, JIS. We'll call this variant.
Lets also assume that on top of this each layout can have multiple modifications. There exists a few modifications that appears to be quite well established in the community. I'm mainly thinking about WK and WKL, with WK being the default so it is seldom explicitly mentioned. Example of modifications could be WKL and split BS. Lets refer to this as modifier.
The simplest layout specification would be base + variant.
An example of this would be
base: TKL
variant: ANSI
This should really also have modifier: WK, but as mentioned above WK appears to be the implicit default.
LAYOUT_tkl_ansi
┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
└───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘
│ │ │ │ │ │ │ │ │ │ │ │ │ │
├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐
│ │ │ │ │ │ │ │ │ │ │ │ │
└────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘
A more complex layout specification would be base + variant + modifier
An example of this would be
base: TKL
variant: ANSI
modifier: WKL
LAYOUT_tkl_ansi_wkl
┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
└───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘
│ │ │ │ │ │ │ │ │ │ │ │ │ │
├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─────┤ ┌───┼───┼───┐
│ │ │ │ │ │ │ │ │ │ │ │
└─────┘ └─────┴───────────────────────────┴─────┘ └─────┘ └───┴───┴───┘
So a layout with the bottom row 1.5, 1, 1.5, 7, 1.5, 1, 1.5 would use modifier: 7U
Example
base: TKL
variant: ANSI
modifier: 7U
Should probably also have modifier: WK, but again the WK is implicit.
LAYOUT_tkl_ansi_7u
┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
└───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘
│ │ │ │ │ │ │ │ │ │ │ │ │ │
├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─────┤ ┌───┼───┼───┐
│ │ │ │ │ │ │ │ │ │ │ │
└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ └───┴───┴───┘
Other examples of layout definitions with modifiers could be
base: TKL
variant: ANSI
modifier: split BS
LAYOUT_tkl_ansi_split_bs
┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
└───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘
│ │ │ │ │ │ │ │ │ │ │ │ │ │
├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐
│ │ │ │ │ │ │ │ │ │ │ │ │
└────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘
base: TKL
variant: ANSI
modifier: split RShift
LAYOUT_tkl_ansi_split_rshift
┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
└───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘
│ │ │ │ │ │ │ │ │ │ │ │ │ │
├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ ┌───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬┴───┤ ┌───┼───┼───┐
│ │ │ │ │ │ │ │ │ │ │ │ │
└────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘
So going by the above, modifier: Tsangan would just be an alias for modifier: 7U + modifier: split BS + modifier: split RShift
Example
base: TKL
variant: ANSI
modifier: Tsangan
or
base: TKL
variant: ANSI
modifier: 7U
modifier: split BS
modifier: split RShift
LAYOUT_tkl_ansi_tsangan or LAYOUT_tkl_ansi_7u_split_bs_split_rshift
┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
└───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┼───┼───┤
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘
│ │ │ │ │ │ │ │ │ │ │ │ │ │
├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ ┌───┐
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ ┌───┼───┼───┐
│ │ │ │ │ │ │ │ │ │ │ │
└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ └───┴───┴───┘
@Wraul Thank you kindly for this insight and history lesson ☺️
@Wraul,
Well researched and explained.
While I don't disagree with anything you've said factually as to the history of the Tsangan layout - that's pretty much how I remember it as well - the usage of the term tsangan in QMK has never really aligned to the historical "it's a full layout descriptor" usage.
The original Tsangan community layouts in QMK were the 60_ansi_tsangan and 60_iso_tsangan, which were added as part of support for the GSKT-00 in #3911 (and bugfixed in #3987). This support was implemented for 7u spacebar + 1.5u Ctrl and Alt keys + 1u GUI keys, with the standard 2u Backspace and 2.75u RShift. This implementation became something of a de-facto standard within QMK, and propagated to other keymaps and layouts.
The way I've long thought of the community layout names has been:
LAYOUT_+- form factor (
60,65,tkl...) - variant (
f13,nofrow...) - region (
ansi,iso,jis) - bottom row type (
tsangan,wkl,blocker...) - key splits (
split_bs(_rshift)?)
There are a few layouts that don't conform to this pattern, be that due to lack of official guidelines or de-facto standards, or a desire to be concise - LAYOUT_64_(ansi|iso) falls into that last group; it's a 60% variant in my mind. 60_ansi_arrow_split_bs_7u_spc also doesn't, and if I were implementing that layout, I'd have probably named it 60_ansi_arrow_tsangan_split_bs, even though it's not a Tsangan layout.
When naming layouts with standardization in mind, I always aim for something that's descriptive, and then concise if possible. Some of the 65% and TKL layout names are very wordy, partly because there's so many ways to lay them out, so many descriptors are needed. 65_ansi_blocker_tsangan_wkl_split_bs is a legitimate possibility in this space, and there are a few boards with this layout already designated and implemented at keyboard-level.
In short, wherever possible I try to stick to what's already established within QMK while also not adding confusion. I suspect @dunk2k has read quite a bit of code that I have authored, because it appears he's copying my code style in this PR (and I have absolutely no problem with this, for the record - it lends itself to a self-consistent codebase). I myself have emulated and copied that which came before me, implementing changes where I saw fit.
60_ansi_arrow_split_bs_7u_spc also doesn't, and if I were implementing that layout, I'd have probably named it 60_ansi_arrow_tsangan_split_bs
65_ansi_blocker_tsangan_wkl_split_bsis a legitimate possibility in this space
Just what i was thinking here 😳
Thank you for your contribution!
This pull request has been automatically marked as stale because it has not had activity in the last 45 days. It will be closed in 30 days if no further activity occurs. Please feel free to give a status update now, or re-open when it's ready.
For maintainers: Please label with bug, awaiting review, breaking_change, in progress, or on hold to prevent the issue from being re-flagged.
Currently pending review from qmk/collaborators
Thanks!