Skip to content

Commit

Permalink
Move layout definitions into srcs/layouts
Browse files Browse the repository at this point in the history
This separates the layout definitions from the special layouts
(bottom_row, greekmath) and other unrelated files (method, settings).

This is also a more intuitive location for layouts and make the resource
directory easier to navigate.

Under the hood, layouts are copied back into
build/generated-resources/xml.
  • Loading branch information
Julow committed Jan 21, 2024
1 parent bef29da commit ad7314a
Show file tree
Hide file tree
Showing 49 changed files with 26 additions and 27 deletions.
5 changes: 3 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,14 +88,15 @@ Github secret named `DEBUG_KEYSTORE`.

### Adding a layout

Layouts are defined in XML, see `res/xml/latn_qwerty_us.xml`.
Layouts are defined in XML, see `srcs/layouts/latn_qwerty_us.xml`.
An online tool for editing layout files written by @Lixquid is available
[here](https://unexpected-keyboard-layout-editor.lixquid.com/).

Makes sure to specify the `name` attribute like in `latn_qwerty_us.xml`,
otherwise the layout won't be added to the app.

The layout file must be placed in the `res/xml/` directory and named according to:
The layout file must be placed in the `srcs/layouts` directory and named
according to:
- script (`latn` for latin, etc..)
- layout name (eg. the name of a standard)
- country code (or language code if more adequate)
Expand Down
27 changes: 16 additions & 11 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -115,17 +115,13 @@ tasks.register('genLayoutsList') {

tasks.register('checkKeyboardLayouts') {
println "\nChecking layouts"
new ByteArrayOutputStream().withStream { bos ->
exec {
def layouts = new File(projectDir, "res/xml").listFiles().findAll {
it.isFile() && it.name.endsWith(".xml")
}
workingDir = projectDir
commandLine("python", "check_layout.py", *layouts)
standardOutput = bos
exec {
def layouts = new File(projectDir, "srcs/layouts").listFiles().findAll {
it.name.endsWith(".xml")
}

new File(projectDir, "check_layout.output").write(bos.toString())
workingDir = projectDir
commandLine("python", "check_layout.py", *layouts)
standardOutput = new FileOutputStream("${projectDir}/check_layout.output")
}
}

Expand All @@ -140,6 +136,7 @@ tasks.register('syncTranslations') {
tasks.named("preBuild") {
dependsOn += "initDebugKeystore"
dependsOn += "copyRawQwertyUS"
dependsOn += "copyLayoutDefinitions"
}

tasks.register('initDebugKeystore') {
Expand All @@ -156,7 +153,15 @@ tasks.register('initDebugKeystore') {
tasks.register('copyRawQwertyUS')
{
copy {
from "res/xml/latn_qwerty_us.xml"
from "srcs/layouts/latn_qwerty_us.xml"
into "build/generated-resources/raw"
}
}

tasks.register('copyLayoutDefinitions')
{
copy {
from "srcs/layouts"
into "build/generated-resources/xml"
}
}
13 changes: 3 additions & 10 deletions gen_layouts.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env python

# Generates the list of layouts in res/values/layouts.xml from the layout files
# in res/xml. Every layouts must have a 'name' attribute to be listed.
# in srcs/layouts. Every layouts must have a 'name' attribute to be listed.

import itertools as it
import sys, os, glob
Expand All @@ -11,11 +11,6 @@
# are sorted alphabetically.
FIRST_LAYOUTS = [ "latn_qwerty_us", "latn_colemak", "latn_dvorak" ]

# File names that are known not to be layouts. Avoid warning about them.
KNOWN_NOT_LAYOUT = set([
"number_row", "numpad", "pin", "bottom_row", "settings", "method",
"greekmath", "numeric" ])

# Read a layout from a file. Returns [None] if [fname] is not a layout.
def read_layout(fname):
root = XML.parse(fname).getroot()
Expand All @@ -28,9 +23,7 @@ def read_layouts(files):
for layout_file in files:
layout_id, _ = os.path.splitext(os.path.basename(layout_file))
layout = read_layout(layout_file)
if layout_id in KNOWN_NOT_LAYOUT:
continue
elif layout == None:
if layout == None:
print("Not a layout file: %s" % layout_file)
elif layout["name"] == None:
print("Layout doesn't have a name: %s" % layout_id)
Expand Down Expand Up @@ -66,6 +59,6 @@ def mk_array(tag, name, strings_items):
XML.indent(root)
XML.ElementTree(element=root).write(out, encoding="unicode", xml_declaration=True)

layouts = sort_layouts(read_layouts(glob.glob("res/xml/*.xml")))
layouts = sort_layouts(read_layouts(glob.glob("srcs/layouts/*.xml")))
with open("res/values/layouts.xml", "w") as out:
generate_arrays(out, layouts)
6 changes: 3 additions & 3 deletions srcs/juloo.keyboard2/KeyValue.java
Original file line number Diff line number Diff line change
Expand Up @@ -317,9 +317,9 @@ public static KeyValue getKeyByName(String name)
{
switch (name)
{
/* These symbols have special meaning when in `res/xml` and are escaped in
standard layouts. The backslash is not stripped when parsed from the
custom layout option. */
/* These symbols have special meaning when in `srcs/layouts` and are
escaped in standard layouts. The backslash is not stripped when parsed
from the custom layout option. */
case "\\?": return makeStringKey("?");
case "\\#": return makeStringKey("#");
case "\\@": return makeStringKey("@");
Expand Down
2 changes: 1 addition & 1 deletion srcs/juloo.keyboard2/prefs/LayoutsPreference.java
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ public static final class SystemLayout implements Layout
public SystemLayout() {}
}

/** The name of a layout defined in [res/xml]. */
/** The name of a layout defined in [srcs/layouts]. */
public static final class NamedLayout implements Layout
{
public final String name;
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 comments on commit ad7314a

Please sign in to comment.