summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRadiohotline <radiohotline@disroot.org>2026-05-26 12:30:17 +0000
committerRadiohotline <radiohotline@disroot.org>2026-05-26 12:30:17 +0000
commitb39758cf6c6d4b1b8de99e51cbff8120cff63a78 (patch)
treeb7ae796ed41696e3470434912e231dcae943a497
parentbb37417a6d50688e6090d4bd16a7e6c6ee8fbb89 (diff)
css
-rw-r--r--_werc/pub/VGAMedium.ttfbin0 -> 273612 bytes
-rw-r--r--_werc/pub/style.css47
-rw-r--r--_werc/pub/test.css (renamed from _werc/pub/style/style.css)4
-rw-r--r--blog/huion.md123
-rw-r--r--blog/index.md2
-rw-r--r--hardware/e-reader.md3
-rw-r--r--hardware/index.md2
-rw-r--r--index.md2
-rw-r--r--sitemap.gzbin0 -> 261 bytes
-rw-r--r--sitemap.txt12
-rw-r--r--software/_header.md2
-rw-r--r--software/binary-choice-ranker.md5
-rw-r--r--software/coreutils.md16
-rw-r--r--software/troysort.md2
14 files changed, 161 insertions, 59 deletions
diff --git a/_werc/pub/VGAMedium.ttf b/_werc/pub/VGAMedium.ttf
new file mode 100644
index 0000000..20ef825
--- /dev/null
+++ b/_werc/pub/VGAMedium.ttf
Binary files differ
diff --git a/_werc/pub/style.css b/_werc/pub/style.css
new file mode 100644
index 0000000..99ac649
--- /dev/null
+++ b/_werc/pub/style.css
@@ -0,0 +1,47 @@
+body { display: flex; flex-wrap: wrap; font-family: sans; }
+header { flex-basis: 100%; flex-shrink: 0; }
+article { flex-basis: 60%; padding-left: 1em; }
+footer { flex-basis: 100%; flex-shrink: 0; }
+header nav { display: flex; justify-content: space-between; }
+nav a, header a { text-decoration: none ; color: inherit; }
+header h1 span { margin-left: 1em; font-size: 50%; font-style: italic; }
+body > nav { flex-basis: content; padding-right: 1vw; min-width: 16em; }
+nav ul { display: flex; flex-direction: column; list-style-type: none; list-style-position: outside; padding-left: 0; }
+nav li ul { padding-left: 0.6em }
+footer { display: flex; justify-content: space-between; }
+
+/* cut here to leave vanity behind */
+
+body { margin:0; padding: 0; font-family: Helvetica, Verdana, Arial, 'Liberation Sans', FreeSans, sans-serif; background-color: #ffffea; }
+a { text-decoration: none; color: }
+a:hover { text-decoration: underline; }
+.thisPage { color: black; }
+
+/* header and top bar */
+header nav { background-color: #888844; color: black; padding: 0.3em; border-bottom: 2px solid black; font-size: 91%; }
+header h1 { background-color: #cccc88; color: black; margin: 0; border-bottom: 2px solid black; font-weight: normal; padding: 0.25ex; font-size: 233%; }
+header a:hover { text-decoration: none; }
+
+/* sidebar */
+body > nav { padding: 0; }
+body > nav > div a { display: block; text-transform: capitalize; font-weight: bold; padding: 0.25em 1ex 0.25em 2mm; font-size: 110%}
+body > nav > div a:hover { color: white; background-color: #448888; border-left: black solid 0.2em; text-decoration: none; }
+body > nav > div p { font-weight: bold; margin: 0 0 0.5em 2mm; padding: 1em 0 0 0; }
+
+/* main copy */
+article { padding: 0 0 5vh 1vw; }
+article h1, article h2 { font-weight: bold; margin: 2em 0 0 0; border-bottom: 2px solid black; }
+article h3, article h4, article h5 { font-weight: bold; margin: 2em 0 0 0; }
+article h6, article h7, article h8 { font-weight: bold; margin: 2em 0 0 0; }
+article a { color: black; }
+article a:hover { color: #448888; }
+article pre { font-size: 1.2em; }
+
+/* footer */
+footer a { color: inherit; }
+footer div { padding: 1em; }
+
+/* tables */
+table { border: 1px solid rgba(128,128,128,0.5); padding: 0; }
+th { color: white; background-color: rgb(100,135,220); }
+tr:nth-child(odd) { background-color: rgba(128,128,128,0.1) }
diff --git a/_werc/pub/style/style.css b/_werc/pub/test.css
index 252cb2a..07278b3 100644
--- a/_werc/pub/style/style.css
+++ b/_werc/pub/test.css
@@ -1,4 +1,5 @@
-body { display: flex; flex-wrap: wrap; font-family: sans; }
+@font-face { font-family: 'vga'; src: url('/_werc/pub/VGAMedium.ttf') format('truetype'); font-display: swap; }
+body { display: flex; flex-wrap: wrap; font-family: sans-serif; background-color: #ffffea; }
header { flex-basis: 100%; flex-shrink: 0; }
article { flex-basis: 60%; padding-left: 1em; }
footer { flex-basis: 100%; flex-shrink: 0; }
@@ -9,4 +10,3 @@ body > nav { flex-basis: content; padding-right: 1vw; min-width: 16em; }
nav ul { display: flex; flex-direction: column; list-style-type: none; list-style-position: outside; padding-left: 0; }
nav li ul { padding-left: 0.6em }
footer { display: flex; justify-content: space-between; }
-* { cursor: url(http://softmachine.dev/img/cursor.png), auto; }
diff --git a/blog/huion.md b/blog/huion.md
index b5198c2..69acda6 100644
--- a/blog/huion.md
+++ b/blog/huion.md
@@ -3,11 +3,15 @@
First published: 2026/03/13
## Prerequisites:
-**Tablet:** Huion Kamvas 13 2.5k QHD
-**Laptop:** Dell Inspiron 15-3567
-**OS:** Artix Linux running i3 (Xorg)
+
+__Tablet:__ Huion Kamvas 13 2.5k QHD
+
+__Laptop:__ Dell Inspiron 15-3567
+
+__OS:__ Artix Linux running i3 (Xorg)
## The Problem:
+
Xorg's wacom drivers (`xf86-input-wacom`) don't work out of the box.
I will detail here the methods I tried to get my tablet up and running. While I highly suggest consulting the [Arch Linux Wiki](https://wiki.archlinux.org/title/Graphics_tablet), the information here may be useful to those troubleshooting the Kamvas 13 if the docs don't help.
@@ -198,20 +202,30 @@ For example, if I press and release the topmost button, I get:
and I note this down as "Button 1: 1", in the format of "Button [physical location]: [xinput output]" (you note the number following "press" or "release" as the ID).
My tests culminated into the following (buttons are counted from top to bottom):
->Button 1: 1
->Button 2: 2
->Button 3: 3
->Button 4: 8
->Button 5: 9
->Button 6: 10
->Button 7: 11
+
+> Button 1: 1
+
+> Button 2: 2
+
+> Button 3: 3
+
+> Button 4: 8
+
+> Button 5: 9
+
+> Button 6: 10
+
+> Button 7: 11
This is the expected output. The skipped numbers are reserved, as mentioned by the DIGImend README:
->Note that buttons are numbered 1, 2, 3, 8, 9, 10, and so on, i.e. buttons 4, 5, 6, and 7 are not used. They're reserved for vertical and horizontal scrolling events by the X server.
+
+> Note that buttons are numbered 1, 2, 3, 8, 9, 10, and so on, i.e. buttons 4, 5, 6, and 7 are not used. They're reserved for vertical and horizontal scrolling events by the X server.
Additionally, I tested the stylus buttons again via `xinput test 18` and got the following in the mess of motion detection. I pressed each button multiple times to ensure I can catch it easily after ending the test process:
->Top button: 1
->Bottom button: 3
+
+> Top button: 1
+
+> Bottom button: 3
Now, this overlap in numbers may seem problematic, but it is handled well in `xsetwacom`, as we can map them to different input keys.
@@ -225,65 +239,74 @@ To set the last button (button 11) to Ctrl+Z, run:
A quick test in Krita works. `showkeys -a` output is `^Z 26 0032 0x1a`. Repeat the process for every button on your tablet. To see all supported key modifiers, run `xsetwacom list modifiers`.
My configuration, which is intended for Krita, is laid out as such:
->Button 1: Save (Ctrl+S)
->Button 2: Mirror canvas (M)
->Button 3: Zoom in (Ctrl+=)
->Button 4: Pan (Space)
->Button 5: Zoom out (Ctrl+-)
->Button 6: Resize brush (by dragging) (Shift)
->Button 7: Undo (Ctrl+Z)
+
+> Button 1: Save (Ctrl+S)
+
+> Button 2: Mirror canvas (M)
+
+> Button 3: Zoom in (Ctrl+=)
+
+> Button 4: Pan (Space)
+
+> Button 5: Zoom out (Ctrl+-)
+
+> Button 6: Resize brush (by dragging) (Shift)
+
+> Button 7: Undo (Ctrl+Z)
My stylus buttons:
->Button 1: Eraser (E)
->Button 2: Eyedropper (hold) (Ctrl)
-And the final config script:
+> Button 1: Eraser (E)
- #!/bin/sh
+> Button 2: Eyedropper (hold) (Ctrl)
- # Detect device IDs
+And the final config script:
+ #!/bin/sh
+
+ # Detect device IDs
+
for i in $(seq 10); do
- list=$(xsetwacom list devices)
+ list=$(xsetwacom list devices)
- if echo "$list" | grep -q Huion; then
- break
- fi
+ if echo "$list" | grep -q Huion; then
+ break
+ fi
sleep 1 # waiting through startup time
done
-
+
list=$(xsetwacom list devices)
pad=$(echo "${list}" | awk '/Pad pad/{print $6; exit}')
stylus=$(echo "${list}" | awk '/Pen stylus/{print $6; exit}')
-
+
if [ -z "${pad}" ]; then
- exit 0
+ exit 0
fi
-
+
if [ -z "${stylus}" ]; then
- exit 0
+ exit 0
fi
-
+
# Tablet display + stylus
-
+
#xrandr | grep -q "HDMI1 connected" || exit 0 # this is commented out because it's handled in the final i3 script
-
+
xrandr --output eDP1 --mode 1366x768 --scale 1.874x2.083 --output HDMI1 --mode 2560x1600 --same-as eDP1
-
+
xrandr --output eDP1 --off
-
+
sleep 1
-
+
xsetwacom set "$stylus" MapToOutput HDMI1
-
+
# Functions
-
+
setpad() { xsetwacom set "$pad" button "$1" "$2"; }
setstylus() { xsetwacom set "$stylus" button "$1" "$2"; }
-
+
# Tablet buttons
-
+
setpad 1 "key +ctrl s -ctrl"
setpad 2 "key m"
setpad 3 "key +ctrl = -ctrl"
@@ -291,9 +314,9 @@ And the final config script:
setpad 9 "key +ctrl - -ctrl"
setpad 10 "key +shift"
setpad 11 "key +ctrl z -ctrl"
-
+
# Stylus buttons
-
+
setstylus 2 "key e"
setstylus 3 "key +ctrl"
@@ -310,19 +333,19 @@ Unplugging the tablet will not automatically restore display settings, so add an
The display script:
#!/bin/sh
-
+
export DISPLAY=:0
export XAUTHORIY=/home/troy/.Xauthority
-
+
xrandr --output HDMI1 --off --output eDP1 --auto --scale 1x1 --primary
In the end, I made the script run with i3, such that I can refresh my i3 session when I plug in the tablet:
#!/bin/sh
-
+
export DISPLAY=:0
export XAUTHORITY=/home/troy/.Xauthority
-
+
if xrandr | grep -q "HDMI1 connected"; then
/home/troy/wacom-config.sh
else
diff --git a/blog/index.md b/blog/index.md
index f28feba..2dddec3 100644
--- a/blog/index.md
+++ b/blog/index.md
@@ -2,4 +2,4 @@
## Changelog:
-2026/03/13 - [Setting up my Huion Kamvas 13 on Arch Linux](/blog/huion/)
+2026/03/13 - [Setting up my Huion Kamvas 13 on Arch Linux](/blog/huion)
diff --git a/hardware/e-reader.md b/hardware/e-reader.md
new file mode 100644
index 0000000..6a6734f
--- /dev/null
+++ b/hardware/e-reader.md
@@ -0,0 +1,3 @@
+# E-Reader
+
+An ESP32-S3-based e-book reader. Currently in the design stage. Some preliminary firmware worked on when I can.
diff --git a/hardware/index.md b/hardware/index.md
index 0617fc8..700b0ba 100644
--- a/hardware/index.md
+++ b/hardware/index.md
@@ -1,3 +1,5 @@
# Hardware
There are currently no hardware project logs here.
+
+But there are many ideas and designs.
diff --git a/index.md b/index.md
index c460331..d42d457 100644
--- a/index.md
+++ b/index.md
@@ -6,6 +6,8 @@ This site is subdivided into a few hubs for my various projects.
Amateur comes from Latin *amātor* (lover) -- computers have been a life-long passion of mine, though they did not return the love very often. Over the years, I realized that it was hardware, and not programming, that appealed to me most. Regardless, I strive to become a better programmer, and I will share here microprograms that are born out of my successful attempts.
+I am a former CS and CE student. I did not continue my studies, but the love that brought me to those departments remains, and I value lifelong learning, even if it is self-taught.
+
## Human-machine interfacing
I am passionate about open-source hardware and software. Technology should not hide its workings from you and should serve as a helpful extension. While unmanned automation can be very useful, the user should still be able to control, study, repair, and modify various parts of the system, whether its a program or a microwave.
diff --git a/sitemap.gz b/sitemap.gz
new file mode 100644
index 0000000..8e5f140
--- /dev/null
+++ b/sitemap.gz
Binary files differ
diff --git a/sitemap.txt b/sitemap.txt
new file mode 100644
index 0000000..db9e112
--- /dev/null
+++ b/sitemap.txt
@@ -0,0 +1,12 @@
+http://tech.softmachine.dev:443/blog/
+http://tech.softmachine.dev:443/blog/huion
+http://tech.softmachine.dev:443/games/
+http://tech.softmachine.dev:443/games/pico8/
+http://tech.softmachine.dev:443/games/pico8/alice
+http://tech.softmachine.dev:443/hardware/
+http://tech.softmachine.dev:443/software/
+http://tech.softmachine.dev:443/software/conway
+http://tech.softmachine.dev:443/software/coreutils
+http://tech.softmachine.dev:443/software/kilo
+http://tech.softmachine.dev:443/software/loveletter
+http://tech.softmachine.dev:443/software/troysort
diff --git a/software/_header.md b/software/_header.md
index 8d3f802..1f6bd66 100644
--- a/software/_header.md
+++ b/software/_header.md
@@ -1 +1 @@
-Found here are my poor attempts at manipulating the metallic flesh of the machine. Unfortunately hosted on [GitHub](https://github.com/radiohotline/).
+Found here are my poor attempts at manipulating the metallic flesh of the machine. Unfortunately hosted on [GitHub](https://github.com/radiohotline/). A self-hosted version control system will be set up.
diff --git a/software/binary-choice-ranker.md b/software/binary-choice-ranker.md
new file mode 100644
index 0000000..e1c8629
--- /dev/null
+++ b/software/binary-choice-ranker.md
@@ -0,0 +1,5 @@
+# Binary choice ranker
+
+I needed a ranker that accepts a plaintext list instead of individually entered items, so I made one.
+
+It can be found at [https://softmachine.dev/sort](https://softmachine.dev/sort).
diff --git a/software/coreutils.md b/software/coreutils.md
index 4c3c88c..fcce125 100644
--- a/software/coreutils.md
+++ b/software/coreutils.md
@@ -3,13 +3,21 @@
Minimalist coreutils implementation in C. It contains only the functions that I actually use in each program, for better or for worse. In a way, it is inspired by Plan 9's implementations, which are much simpler than Gnu's.
To-Do:
-- [x] echo
+
+- [x] echo
+
- [x] cat
-- [x] tac
-- [x] head
-- [x] tail
+
+- [x] tac
+
+- [x] head
+
+- [x] tail
+
- [x] touch
+
- [x] cp
+
- [ ] dd
- [ ] df
- [ ] dir
diff --git a/software/troysort.md b/software/troysort.md
index 03516dc..4792fd9 100644
--- a/software/troysort.md
+++ b/software/troysort.md
@@ -1,3 +1,3 @@
# Troysort
-Until I fix my laptop, this is lost. Essentially, it was a "sorting algorithm" that did not sort your list.
+Essentially, it was a "sorting" "algorithm" that did not sort your list.