The window manager activates another window when the entry window
minimizes, and raising the windows then restored the entry window.
Raising is now skipped while the entry window is minimized and for a
second after its state changes. Restoring the entry window puts focus
in the callsign box.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Each key press in an entry box ran Refresh, which redraws the entry window
and every open tool window between two key presses. The refresh is now
posted at background priority, so the key presses already queued are
handled first and a burst of letters costs one refresh.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Each insert, delete and rescore update was its own commit to disk, so a
resync of about a thousand QSOs froze the window thread. LogStore has a
new Batch() scope that commits its writes together. ContestSession uses
it in AddRangeFromNetwork, ClearFromNetwork and Rescore.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Both are checkboxes in Manage Skins, Colors and Fonts and default to on.
The entry window minimizes and restores the other windows with itself.
Activating any window raises the others that are not minimized.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
An owned window is transient-for its owner on X11, so the window manager
kept every tool window above the entry window. The windows now have no
owner. The entry window closes them when it closes, and minimizes or
restores them when its own state changes.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Station Number, Port and Version to claim are now on the Options tab of
Network Status and save when a box loses focus. The other settings
(station name, listen port, peers, link on/off) are in a Stations
Configuration window opened from a button on the same tab. The explanation
texts and the Config menu item are removed.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A QSO logged in Run mode is no longer added to the bandmap as a local
spot, including when recent contacts are re-spotted at startup.
Releasing Alt moves focus to the menu bar. Alt+W now sets a flag, and
the Alt key-up handler puts focus back on the callsign box.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Favourites show the callsign in bold, the address and the sysop's note,
and each keeps its own password, commands, logon call and note. Clicking
one fills the boxes for editing. Autoconnect marks the favourite to
connect to at start and replaces the old reconnect-to-last-node setting.
A new published list refreshes the notes of the favourites in it. The
published list now spans the window, and the Spot comment tab becomes
Login & Spots with the logon call and keep-alive.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The spot timeouts, the QSY spot and CQ frequency distances and the
recent contact minutes leave the telnet Filters tab for a window under
Config. Each is a numeric box with a range.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
CW and digital spots time out after 10 minutes and phone spots after 30
by default, both settings on the telnet Filters tab. The mode comes from
the band plan; a frequency it has no boundaries for counts as phone.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A contest opening and contacts arriving from the other stations, a
resync included, spot the contacts logged in the last few minutes (a
setting on the telnet Filters tab, 0 for none). A station the bandmap
already holds on that band keeps its spot. Nothing is sent out. Spots
that come from the log are drawn in italics.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
For sh/wwv, only the first record under the header is used, since the
table lists the newest first. The date, time, forecast and logger are
dropped, and the status bar reads "SFI 140 A 5 K 2". The line the node
sent is the tool tip. Announcement lines give the same three values.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The reader follows N1MM's rules for WWV and WCY lines and the sh/wwv
table. The bar is hidden until the cluster has sent some.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Starting Run stores the frequency in the position. The bandmap draws a
purple, bold "CQ Frequency" pseudospot there, which is not added to the
shared bandmap, and a click on it tunes back and sets Run. A move of more
than 3 kHz (a setting on the telnet Filters tab) while running switches
to search and pounce.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The zoom list gains 60 kHz and a "mode" level that shows the CW, digital
or phone part of the band the receiver is in, before "band". For views
from 40 to 200 kHz wide, the scale picks the smallest round step that
keeps three lines of text between ticks. The font size buttons are
removed; Ctrl with the wheel or plus and minus still change the size.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A spot an operator put on a bandmap, here or on another computer, is
drawn in bold. Its hover text names the computer instead of the
spotter's callsign. A spot from another computer carries the name from
the ADDSPOT message.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The tool tip has no show delay and the theme's fade is removed. The
carrier tick reaches 30 px further to the right.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The first line reads "14025.0 by K1TTT, 41m ago". The comment follows
on a second line and is left out when it is only LSB, USB or SSB.
Control characters are removed from the comment: cluster lines end in
bell and carriage-return characters, which the tooltip drew as boxes.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The radio reports the frequency in small steps as the knob turns, and
each step was compared with the one before, so no step passed the
threshold. The move is now measured from the frequency the radio had
when the call appeared in the entry window. The threshold is a box on
the Filters tab of the telnet window.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Ctrl+wheel and Ctrl+plus / Ctrl+minus change the text size of the
window in front, and Ctrl+0 puts it back. Each size is kept in the
settings file.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- Turn off scroll bar auto-hide for ScrollViewer and DataGrid.
- Make the splitter between the two log grids 5 px, in the grid line color.
- Remove the log window status bar. The stats are in the entry window.
- Show a refused log edit in an alert dialog.
- Keep the log grid's rows in an ObservableCollection, so a new contact
does not rebuild the list and move the view.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
With a call in the entry window, a move of more than 2 kHz on the same
band puts the call on the bandmap where it was heard and wipes the boxes,
as N1MM does. The spot goes to the other stations as ADDSPOT and to the
Spots broadcast, never to the cluster. ADDSPOT from other stations is
added to the bandmap.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The # blocks in wl_cty.dat list CQ and ITU zones by call area and the
first letter after the digit, written with the main prefix letters. A call
now takes them whatever its own prefix letters are, so RA9Y and RM9I get
what UA9Y gets, as in N1MM. A call whose own prefix rule gives a zone, and
a whole-call entry, are left as they are.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Without a call history file, the CQ zone box stayed empty after the
callsign. It now takes the zone from the call history file, else from the
last logged contact with the call, else from the country file, as N1MM
does. A box that already holds text is left alone.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Listen for Radio broadcast data from another Nonemm or N1MM computer and
record its frequency, mode and split as this computer's own radio. No
radio is controlled. The settings are in the Configure Radios dialog.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Setting Foreground to null is a local value of no brush, so the Record
button, connected devices in the list and the status line had no text
colour. Clear the value instead. The bitrate step is now 4 kbps.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Remove the status bar and the band name, add the 75 and 150 kHz spans,
add buttons for the callsign size (saved in the settings), draw the scale
in the form's text colour so it shows in the dark theme, mark the carrier
on the VFO bar and place a sideband bar on its side of the carrier, and
show who spotted a station, when, and the comment when the pointer is on it.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The entry window sizes its height to its content, and Place skipped the
saved size for any window that sizes itself on either side.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The generic name only resolves through fontconfig, so on Windows the
windows fell back to the proportional default.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The wheel steps along the span list and keeps the frequency under the
pointer in place. With Centre on VFO off, the slice stays put until the
receiver nears an edge. The span and the toggle are saved in the settings.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Lines were as tall as a list item, with padding of more than the text. A
line is now as tall as its text, the view always follows the newest line
instead of pausing under the pointer, and a burst of lines is scrolled
once. The scrollback is a thousand lines.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
QsoRecord followed MultiOpManager.QSOString, a helper N1MM does not use
for the network. The messages use Contact.QSOString: 43 fields, the
continent before the contact type, and flags as numbers. N1MM converts
the multiplier flags with ToShort and threw on 'True', so every contact
logged here raised an error at the other computer.
The id now goes out as a GUID and is kept on arrival, which is what the
other station's checksum of a resync block is made over.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The window picked a brush on the socket thread, and Avalonia crashed the
program the next time it painted that line. A line that arrives is now
posted to the window thread first. Spots no longer show the bell
character as a box, and an unexpected error in the cluster loop is
shown instead of ending it silently.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
ApplyNetworkSettings disposed the station link without clearing it, so
ApplyStationLinkSettings disposed it a second time and threw. Only the
second function touches the link now, and StationLink.Dispose can be
called twice.
Contacts from the network are queued and applied together on the window
thread. Each one used to rescore the whole log and redraw the log window,
which kept the window thread busy for minutes during a resync.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
publish.sh takes a runtime id and publishes both programs into
dist/nonemm-<rid>, which holds the runtime and the Avalonia files once.
The archive is a zip for Windows and a tar.gz for the rest.
publish-windows.sh and publish-linux.sh call it with their default id.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
nonemm-recorder is a separate program (src/Nonemm.Recorder.App) over a
library (src/Nonemm.Recorder). Each row in its list is one channel of one
device, and each row becomes one channel in an Ogg Opus file: 60 ms frames,
complexity 9, 32 kbps per channel by default.
- A device that is not connected keeps its row, in red, and writes silence.
It is recorded from the moment it returns, also during a recording.
- Output devices are recorded as loopback: WASAPI on Windows, the
"Monitor of" sources on PulseAudio and PipeWire.
- A headphone button plays one channel, in mono, on the default device.
- The rows, bitrate and folder are saved when the window closes.
SoundFlow 1.4.2 numbers its backend enum one higher than the miniaudio it
ships, so asking for PulseAudio gave ALSA and Wasapi gave DirectSound.
SoundFlowBackend lowers the value by one and checks which backend started.
Output devices and live capture are not tested on real hardware. The
tests use a fake sound system and decode the written file.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The bridge launched its helper only through Wine. It now starts any
process, so on Windows it runs the helper directly. WineBridgeChannel is
renamed ProcessBridgeChannel.
WindowsControlSetup sets up the control side on Windows. The digital
dialog, AppSession, README and docs/digital-bridge.md describe the
Windows setup. publish-windows.sh builds a Windows release.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
CQ WW lists LOCATION as required, and the export never wrote it. It now
carries the ARRL section, state or province, or DX.
CQ WW M/2 has no stay on a band: it may make eight band changes in a clock
hour. It was getting the ten-minute stay that M/S has.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>