Compare commits

..

2 Commits

Author SHA1 Message Date
e6bf88673f
xP: produce a custom font for IRC formatting
Given that the generated file needs a manual adjustment,
its small size, and the dependencies involved,
it will be checked in to the repository.
2022-09-22 20:18:55 +02:00
4a2740313c
Give up on the X11 frontend for now
There seem to be only a few things it could bring to the table,
compared to xP, making it barely worth the effort:

 - saner keyboard controls,
 - GVIM integration,
 - slightly improved resource usage.
2022-09-21 18:30:25 +02:00
8 changed files with 108 additions and 19 deletions

View File

@ -1,7 +1,7 @@
# Ubuntu 18.04 LTS and OpenBSD 6.4 # Ubuntu 18.04 LTS and OpenBSD 6.4
cmake_minimum_required (VERSION 3.10) cmake_minimum_required (VERSION 3.10)
project (xK VERSION 1.5.0 project (xK VERSION 1.5.0
DESCRIPTION "IRC daemon, bot, TUI client and X11/web frontends" LANGUAGES C) DESCRIPTION "IRC daemon, bot, TUI client and its web frontend" LANGUAGES C)
# Options # Options
option (WANT_READLINE "Use GNU Readline for the UI (better)" ON) option (WANT_READLINE "Use GNU Readline for the UI (better)" ON)

4
NEWS
View File

@ -27,9 +27,7 @@
* xC: added a relay interface, enabled through the general.relay_bind option * xC: added a relay interface, enabled through the general.relay_bind option
* Added an experimental X11 frontend for xC called xF * Added a web frontend for xC called xP
* Added an experimental web frontend for xC called xP
1.5.0 (2021-12-21) "The Show Must Go On" 1.5.0 (2021-12-21) "The Show Must Go On"

View File

@ -2,7 +2,7 @@ xK
== ==
'xK' (chat kit) is an IRC software suite consisting of a daemon, bot, terminal 'xK' (chat kit) is an IRC software suite consisting of a daemon, bot, terminal
client, and X11/web frontends for the client. It's all you're ever going to client, and a web frontend for the client. It's all you're ever going to
need for chatting, so long as you can make do with slightly minimalist software. need for chatting, so long as you can make do with slightly minimalist software.
They're all lean on dependencies, and offer a maximally permissive licence. They're all lean on dependencies, and offer a maximally permissive licence.
@ -26,16 +26,9 @@ As a unique bonus, you can launch a full text editor from within.
xP xP
-- --
The web frontend for 'xC', making use of its networked relay interface. The web frontend for 'xC', making use of its networked relay interface.
Fully usable, despite some rough edges. It intentionally differs in that it It intentionally differs in that it uses a sans-serif font, and it shows
uses a sans-serif font, and shows the list of all buffers in a side panel. the list of all buffers in a side panel. Otherwise it is a near replica,
Otherwise it aims to be a near replica. including keyboard shortcuts.
xF
--
The X11 frontend for 'xC', making use of its networked relay interface.
This subproject has been put on hold, partly because of its massive overlap
with 'xP', and is hidden behind a CMake option.
xD xD
-- --
@ -78,7 +71,6 @@ Build-only dependencies:
Common runtime dependencies: openssl + Common runtime dependencies: openssl +
Additionally for 'xC': curses, libffi, readline >= 6.0 or libedit >= 2013-07-12, Additionally for 'xC': curses, libffi, readline >= 6.0 or libedit >= 2013-07-12,
lua >= 5.3 (optional) + lua >= 5.3 (optional) +
Additionally for 'xF': x11, xft
$ git clone --recursive https://git.janouch.name/p/xK.git $ git clone --recursive https://git.janouch.name/p/xK.git
$ mkdir xK/build $ mkdir xK/build

1
xC.c
View File

@ -15025,6 +15025,7 @@ process_formatting_escape (const struct pollfd *fd, struct app_context *ctx)
case 'u': case 'u':
case '_': CALL_ (ctx->input, insert, "\x1f"); break; case '_': CALL_ (ctx->input, insert, "\x1f"); break;
case 'v': CALL_ (ctx->input, insert, "\x16"); break; case 'v': CALL_ (ctx->input, insert, "\x16"); break;
case 'r':
case 'o': CALL_ (ctx->input, insert, "\x0f"); break; case 'o': CALL_ (ctx->input, insert, "\x0f"); break;
default: default:

View File

@ -2,7 +2,7 @@
.SUFFIXES: .SUFFIXES:
outputs = xP proto.go public/proto.js public/mithril.js outputs = xP proto.go public/proto.js public/mithril.js
all: $(outputs) all: $(outputs) public/ircfmt.woff2
xP: xP.go proto.go xP: xP.go proto.go
go build -o $@ go build -o $@
@ -10,6 +10,8 @@ proto.go: ../xC-gen-proto.awk ../xC-gen-proto-go.awk ../xC-proto
awk -f ../xC-gen-proto.awk -f ../xC-gen-proto-go.awk ../xC-proto > $@ awk -f ../xC-gen-proto.awk -f ../xC-gen-proto-go.awk ../xC-proto > $@
public/proto.js: ../xC-gen-proto.awk ../xC-gen-proto-js.awk ../xC-proto public/proto.js: ../xC-gen-proto.awk ../xC-gen-proto-js.awk ../xC-proto
awk -f ../xC-gen-proto.awk -f ../xC-gen-proto-js.awk ../xC-proto > $@ awk -f ../xC-gen-proto.awk -f ../xC-gen-proto-js.awk ../xC-proto > $@
public/ircfmt.woff2: gen-ircfmt.awk
awk -v Output=$@ -f gen-ircfmt.awk
public/mithril.js: public/mithril.js:
curl -Lo $@ https://unpkg.com/mithril/mithril.js curl -Lo $@ https://unpkg.com/mithril/mithril.js
clean: clean:

89
xP/gen-ircfmt.awk Normal file
View File

@ -0,0 +1,89 @@
# gen-ircfmt.awk: generate a supplementary font for IRC formatting characters
#
# Copyright (c) 2022, Přemysl Eric Janouch <p@janouch.name>
# SPDX-License-Identifier: 0BSD
#
# Usage: awk -v Output=static/ircfmt.woff2 -f gen-ircfmt.awk
# Clean up SVG byproducts yourself.
BEGIN {
if (!Output) {
print "Error: you must specify the output filename"
exit 1
}
}
function glyph(name, code, path, filename, actions, cmd) {
filename = Output "." name ".svg"
# Inkscape still does a terrible job at the stroke-to-path conversion.
actions = \
"select-by-id:group;" \
"selection-ungroup;" \
"select-clear;" \
"select-by-id:path;" \
"object-stroke-to-path;" \
"select-by-id:clip;" \
"path-intersection;" \
"select-all;" \
"path-combine;" \
"export-overwrite;" \
"export-filename:" filename ";" \
"export-do"
# These dimensions fit FontForge defaults, and happen to work well.
cmd = "inkscape --pipe --actions='" actions "'"
print "<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n" \
"<svg version='1.1' xmlns='http://www.w3.org/2000/svg'\n" \
" width='1000' height='1000' viewBox='0 0 1000 1000'>\n" \
" <rect x='0' y='0' width='1000' height='1000' />\n" \
" <g id='group' transform='translate(200 200) scale(60, 60)'>\n" \
" <rect id='clip' x='0' y='0' width='10' height='10' />\n" \
" <path id='path' stroke-width='2' fill='none' stroke='#fff'\n" \
" d='" path "' />\n" \
" </g>\n" \
"</svg>\n" | cmd
close(cmd)
print "Select(0u" code ")\n" \
"Import('" filename "')" | FontForge
}
BEGIN {
FontForge = "fontforge -lang=ff -"
print "New()" | FontForge
# Designed a 10x10 raster, going for maximum simplicity.
glyph("B", "02", "m 6,5 c 0,0 2,0 2,2 0,2 -2,2 -2,2 h -3 v -8 h 2.5 c 0,0 2,0 2,2 0,2 -2,2 -2,2 h -2 Z")
glyph("C", "03", "m 7.6,7 A 3,4 0 0 1 4.25,8.875 3,4 0 0 1 2,5 3,4 0 0 1 4.25,1.125 3,4 0 0 1 7.6,3")
glyph("I", "1D", "m 3,9 h 4 m 0,-8 h -4 m 2,-1 v 10")
glyph("M", "11", "m 2,10 v -10 l 3,6 3,-6 v 10")
glyph("O", "0F", "m 1,9 l 8,-8 M 2,5 a 3,3 0 1 0 6,0 3,3 0 1 0 -6,0 z")
#glyph("R", "0F", "m 3,10 v -9 h 2 c 0,0 2.5,0 2.5,2.5 0,2.5 -2.5,2.5 -2.5,2.5 h -2 2.5 l 2.5,4.5")
glyph("S", "1E", "m 7.5,3 c 0,-1 -1,-2 -2.5,-2 -1.5,0 -2.5,1 -2.5,2 0,3 5,1 5,4 0,1 -1,2 -2.5,2 -1.5,0 -2.5,-1 -2.5,-2")
glyph("U", "1F", "m 2.5,0 v 6.5 c 0,1.5 1,2.5 2.5,2.5 1.5,0 2.5,-1 2.5,-2.5 v -6.5")
glyph("V", "16", "m 2,-1 3,11 3,-11")
# In practice, your typical browser font will overshoot its em box,
# so to make the display more cohesive, we need to do the same.
# Sadly, sf->use_typo_metrics can't be unset from FontForge script--
# this is necessary to prevent the caret from jumping upon the first
# inserted non-formatting character in xP's textarea.
# https://iamvdo.me/en/blog/css-font-metrics-line-height-and-vertical-align
print "SelectAll()\n" \
"Scale(115, 115, 0, 0)\n" \
"SetOS2Value('WinAscentIsOffset', 1)\n" \
"SetOS2Value('WinDescentIsOffset', 1)\n" \
"SetOS2Value('HHeadAscentIsOffset', 1)\n" \
"SetOS2Value('HHeadDescentIsOffset', 1)\n" \
"CorrectDirection()\n" \
"AutoWidth(100)\n" \
"AutoHint()\n" \
"AddExtrema()\n" \
"RoundToInt()\n" \
"SetFontNames('IRCFormatting-Regular'," \
" 'IRC Formatting', 'IRC Formatting Regular', 'Regular'," \
" 'Copyright (c) 2022, Premysl Eric Janouch')\n" \
"Generate('" Output "')\n" | FontForge
close(FontForge)
}

BIN
xP/public/ircfmt.woff2 Normal file

Binary file not shown.

View File

@ -1,7 +1,14 @@
@font-face {
src: url('ircfmt.woff2') format('woff2');
font-family: 'IRC Formatting';
font-weight: normal;
font-style: normal;
}
body { body {
margin: 0; margin: 0;
padding: 0; padding: 0;
font-family: sans-serif; /* Firefox only renders C0 within the textarea, why? */
font-family: 'IRC Formatting', sans-serif;
font-size: clamp(0.5rem, 2vw, 1rem); font-size: clamp(0.5rem, 2vw, 1rem);
} }
.xP { .xP {
@ -133,7 +140,7 @@ button:hover:active {
font-family: monospace; font-family: monospace;
overflow-y: auto; overflow-y: auto;
} }
.log, .content { .log, .content, .completions {
/* Note: https://bugs.chromium.org/p/chromium/issues/detail?id=1261435 */ /* Note: https://bugs.chromium.org/p/chromium/issues/detail?id=1261435 */
white-space: break-spaces; white-space: break-spaces;
overflow-wrap: break-word; overflow-wrap: break-word;