Take them to the better terminal instead of asking permission to
Installers / windows-x64 (push) Canceled after 0s
Installers / macos-x64 (push) Canceled after 0s
Installers / macos-arm64 (push) Canceled after 0s
Installers / linux-x64 (push) Canceled after 0s
Installers / linux-arm64 (push) Canceled after 0s
GitHub release / build (push) Canceled after 0s
GitHub release / create the release (push) Canceled after 0s

The classic Windows console cannot draw a single MeshTerm icon whatever font
it is given, so "reopen in Windows Terminal?" had exactly one sensible answer
-- and was being put to someone who had not seen the app yet and so had nothing
to weigh it against, at the one moment nothing had been drawn.

So it moves. It still says what it is doing and still names the way to stop it,
because a program that opens a window you did not ask for should say so.

Installing a font keeps its consent, and the split is deliberate: moving window
costs nothing and undoes itself by closing, while a font is a file written to
someone's machine that Windows will not let go of until their next logon.

The console_setup preference reads auto/off now rather than ask/off, and its
help says what it does. An older stored "ask" is not "off", so it keeps working
and simply means auto.

JP's call, and it is the right one -- the reference experience should be what
an end user gets, not what they think to ask for.

Release 0.2.7.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jean-Pierre MartineauandClaude Opus 5 committed 2026-09-07 19:42:46 -04:00
1 parent 564e051d1a
commit 690807370b
5 files changed
+65 -45

No files matched your search

+13
View File
@@ -17,6 +17,19 @@ allowed to change behaviour, not just add to it.
## [Unreleased]
## [0.2.7] — 2026-09-07
### Changed
- **MeshTerm moves to Windows Terminal rather than asking to.** It still says so, and
still tells you how to stop it, but it doesn't put the question. The classic console
can't draw a single icon whatever font it's given, so there was only one sensible
answer — and it was being asked of someone who hadn't seen the app yet and had nothing
to judge it by.
Installing a **font** still asks, because that writes a file to your machine. Moving
window doesn't. Preferences → Display → Console setup stops both.
## [0.2.6] — 2026-09-07
### Fixed
+13 -14
View File
@@ -68,14 +68,14 @@ if anything goes wrong at startup the window closes before you can read why.
**Windows** — open Windows Terminal or PowerShell, `cd` to your downloads, then:
```powershell
.\meshterm-0.2.6-windows-x64.exe
.\meshterm-0.2.7-windows-x64.exe
```
**macOS and Linux** — open Terminal, `cd` to your downloads, then:
```bash
chmod +x meshterm-0.2.6-*
./meshterm-0.2.6-*
chmod +x meshterm-0.2.7-*
./meshterm-0.2.7-*
```
### A word about terminals, on Windows
@@ -91,20 +91,19 @@ doesn't borrow. It draws what its one font holds and empty boxes for everything
no font fixes the icons there: the only two fonts on a Windows machine with emoji in them
are proportional, and a console won't take a proportional font.
So when MeshTerm lands in that console it offers to move: **reopen in Windows Terminal**,
one keypress, nothing installed and nothing changed. That's the whole app, exactly as the
screenshots show it. Windows Terminal is already on every Windows 11 machine and is a free
install on Windows 10.
So when MeshTerm lands in that console it just **moves to Windows Terminal** — it says
so, and opens there. Nothing is installed and nothing is changed; it's one window instead
of another, and it's the whole app exactly as the screenshots show it. Windows Terminal is
already on every Windows 11 machine and is a free install on Windows 10.
Stay in the classic console and MeshTerm offers the next best thing instead — the charts
and marks, without the icons. It ships
Where there's no Windows Terminal to move to, MeshTerm offers the next best thing instead
— the charts and marks, without the icons. It ships
[Cascadia Mono PL](https://github.com/microsoft/cascadia-code), Microsoft's own console
font and one of the very few monospace faces that carries braille at all, and will install
it just for you: no administrator rights, nothing downloaded. If you already have Cascadia
it simply switches to it.
You can decline both and MeshTerm still runs. Preferences → Display → Console setup is
where you change your mind.
Preferences → Display → Console setup turns all of this off if you'd rather stay put.
Rename it to something you don't mind typing and put it somewhere on your `PATH`, and it
becomes just `meshterm` from anywhere.
@@ -114,7 +113,7 @@ becomes just `meshterm` from anywhere.
> project.
>
> - **macOS**: *"cannot be opened because the developer cannot be verified"*. Clear it with
> `xattr -d com.apple.quarantine meshterm-0.2.6-*` and run it again.
> `xattr -d com.apple.quarantine meshterm-0.2.7-*` and run it again.
> - **Windows**: *"Windows protected your PC"*. Click **More info → Run anyway**.
>
> Every release ships a `SHA256SUMS` file if you'd rather check the download first.
@@ -124,10 +123,10 @@ becomes just `meshterm` from anywhere.
> MeshTerm uses that same folder. Set `MESHTERM_HOME` to try one in isolation:
>
> ```bash
> MESHTERM_HOME=~/meshterm-test ./meshterm-0.2.6-* # macOS, Linux
> MESHTERM_HOME=~/meshterm-test ./meshterm-0.2.7-* # macOS, Linux
> ```
> ```powershell
> $env:MESHTERM_HOME = "$HOME\meshterm-test"; .\meshterm-0.2.6-windows-x64.exe
> $env:MESHTERM_HOME = "$HOME\meshterm-test"; .\meshterm-0.2.7-windows-x64.exe
> ```
>
> Same variable if you run two radios and want them kept apart.
+1 -1
View File
@@ -5,7 +5,7 @@ Supports USB, Bluetooth and TCP companion connection. For Windows, macOS and Lin
from datetime import datetime
__version__ = "0.2.6"
__version__ = "0.2.7"
__author__ = "Jean-Pierre Martineau"
#: The year MeshTerm was first published; the copyright span starts here.
+30 -24
View File
@@ -222,16 +222,21 @@ def main_callback(
def _offer_a_console_that_can_draw_meshterm(console: Console, prefs: Preferences) -> bool:
"""On the classic Windows console, offer the reader something better than it.
"""On the classic Windows console, get the reader somewhere better than it.
Two offers, in the order of how much they buy. **Windows Terminal** first, because it
is the only one that gets the whole app: emoji icons included, which no font can put
on the classic console — the only Windows fonts carrying emoji are proportional, and
a console will not take one. Then, for a reader who stays, **a font** that can at
least draw the charts and the marks.
Two remedies, and they are not asked the same way.
**Windows Terminal** first, and simply done. It is the only thing that gets the whole
app — emoji icons included, which no font can put on that console, the only Windows
fonts carrying any being proportional and a console taking none of them. Moving there
installs nothing and changes nothing, so there is one sensible answer to a question
that would be put to someone who has not seen the app yet and cannot judge it.
**A font** second, only where the move was not possible, and that one *is* asked —
it writes a file onto someone's machine, which is theirs to agree to.
Args:
console: The console to ask on.
console: The console to report and ask on.
prefs: The preference set, read for a previous refusal and written on a new one.
Returns:
@@ -241,24 +246,30 @@ def _offer_a_console_that_can_draw_meshterm(console: Console, prefs: Preferences
if not classic_console() or prefs.get("console_setup") == "off":
return False
if _offer_windows_terminal(console):
if _move_to_windows_terminal(console):
return True
_offer_a_font_this_console_can_draw(console, prefs)
return False
def _offer_windows_terminal(console: Console) -> bool:
"""Offer to reopen the session in Windows Terminal, where the app looks like itself.
def _move_to_windows_terminal(console: Console) -> bool:
"""Reopen the session in Windows Terminal, where the app can draw all of itself.
Asked with yes as the default, which is not how the font offer is asked: this one
changes nothing on the machine — no install, no setting, one new window — and it is
the only answer that gets the reader the app as it was drawn.
Done rather than offered. The classic console cannot show a single icon whatever it is
given, so "reopen there?" is a question with one sensible answer, asked of someone who
has not seen the app yet and so cannot judge it — and asked at the worst moment, before
anything has been drawn. Moving costs nothing and changes nothing: no install, no
setting, one window instead of another.
It is announced rather than silent, and the announcement names the way to stop it,
because a program that opens a window you did not ask for should at least say so.
``console_setup`` set to ``off`` keeps the session here for good.
Args:
console: The console to ask on.
console: The console to report on.
Returns:
Whether Windows Terminal was started and this session should stand down.
Whether Windows Terminal took over and this session should stand down.
"""
from .core import winterminal
@@ -266,17 +277,12 @@ def _offer_windows_terminal(console: Console) -> bool:
return False
console.print()
console.print("[accent]•[/accent] This is the classic Windows console, and it can only")
console.print(" draw part of MeshTerm — no icons, and no charts.")
console.print("[accent]•[/accent] Opening in [accent]Windows Terminal[/accent] — this console")
console.print(" can't draw MeshTerm's icons or charts.")
console.print("[muted] Preferences → Display → Console setup keeps it here instead.[/muted]")
console.print()
console.print(" [accent]Windows Terminal[/accent] draws all of it, and you have it.")
console.print(" MeshTerm can reopen itself there now. Nothing is installed")
console.print(" and nothing is changed; it is just a better window.")
console.print()
if not _asks_yes(console, " Reopen in Windows Terminal? [Y/n] ", default=True):
return False
if winterminal.reopen():
console.print("[ok]✓[/ok] Reopening in Windows Terminal.")
get_logger().info("reopened the session in Windows Terminal")
return True
console.print("[warn]⚠[/warn] Windows Terminal would not start. Staying here.")
+8 -6
View File
@@ -131,7 +131,7 @@ _WIDTH_CHOICES: dict[str, str] = {"auto": "auto", "yes": "yes", "no": "no"}
#: What MeshTerm may offer when it lands in a console that cannot draw it. Only ever
#: consulted on the classic Windows console, the one host with no font fallback of its own.
_CONSOLE_SETUP_CHOICES: dict[str, str] = {
"ask": "Ask",
"auto": "Automatic",
"off": "Leave it alone",
}
@@ -305,13 +305,15 @@ PREFERENCES: tuple[PrefSpec, ...] = (
PrefSpec(
key="console_setup",
label="Console setup",
help="Offer a better terminal or font when this console can't draw MeshTerm",
help="Move to a better terminal when this console can't draw MeshTerm",
group="Display",
value_type="enum",
# "ask", not "always": changing the font of a window someone else opened is not
# ours to do unasked. Declining twice writes "off" here, which is how the offer
# stops being made rather than being made every launch.
default="ask",
# Reopening in Windows Terminal is done, not asked: the classic console cannot
# draw a single icon whatever font it is given, so there is only one sensible
# answer and the reader has not seen the app yet to judge it. Installing a *font*
# still asks, because that writes to their machine. Declining that twice writes
# "off" here, which turns both off for good.
default="auto",
choices=_CONSOLE_SETUP_CHOICES,
),
# --- Diagnostics ---------------------------------------------------------------