Blog

Localization in FreeBSD

While testing XFCE, I noticed, that the date and time format in some desktop applications, such as Thunderbird, no longer was ISO 8601. It had become more like US or metric. I want English with Danish format and UTF-8 encoding.

Configuring language in FreeBSD login class.

According to the FreeBSD handbook, the recommended method for configuring language, format and encoding is in the login class definition. This is, however, not correct. I have not been able to test this to work. I recommend, that the language format in the login class is set to the following POSIX standard and the rest is configured in FreeBSD enviroment variables.

# nano /etc/login.conf
:charset=UTF-8:\
:lang=C.UTF-8:\
:setenv=PATH_LOCALE=/usr/local/share/locale:
# cap_mkdb /etc/login.conf

Configuring language in FreeBSD environment variables.

Configure environment variables. In this example, I will be using the Bourne shells.

# nano /etc/profile
LANG=en_DK.UTF-8

I have tested this to work for system shell as well as XFCE desktop environment and Thunderbird.

Issue: Configuring language in login class not working.

According to the FreeBSD handbook, the recommended method for configuring language, format and encoding is in the login class definition. This requires, that the correct language definition is available. This is known as a locale and is formulated in the following format.

en_DK.UTF-8

The current list of available locales can be listed.

# locale -a | grep en_DK.UTF-8

In this example, mine was not available, but was available as a package to be installed or a port to be built.

# pkg install locale-en_DK
Message from locale-en_DK-0.1.1:
In order to set the en_DK.UTF-8 locale for the login shell of an single
user add the following configuration to ~/.login_conf:
me:\
:charset=UTF-8:\
:lang=en_DK.UTF-8:\
:setenv=PATH_LOCALE=/usr/local/share/locale:
More information about the process of configuring login class methods in
available in the handbook.
More information about the PATH_LOCALE environment variable is available in the
locale(1) manual page.

The default login class can now be configured. However, this did not work. The special Danish characters did not work.

References.

How to disable XFCE power manager on FreeBSD

Blank screen and muted audio in XFCE.

The first issue, I noticed, when switching from GNOME to XFCE, was, how the HDMI output was cut-off after a few minutes in which there has been no user input, such as attending a video conference. Pressing a key would turn-on the screen, but the audio would never return again. The audio could not even be re-enabled with Pulse Audio controls.

Disabling power management from XFCE interface.

Using the settings dialog, I disabled any kind of power management. This includes any screen blank and suspend option. Despite of this, the video and audio is getting cut-off. I could not find any kind of screensaver, that should be causing this.

# ps aux | grep power
/usr/local/libexec/upowerd
xfce4-power-manager
# ps aux | grep saver
# ps aux | grep screen

Removing power manager from XFCE?

I assume, that this is related to power management, because a screen saver would probably not be so aggressive. Knowing, that I will not need power management, a simple approuch would be to remove it from the installation. However, XFCE went for a forced depedency on this one. What a piece of shit programming from XFCE. Power management should be optional – and not a plague!

Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 2 packages (of 0 packages in the universe):
Installed packages to be REMOVED:
xfce: 4.20
xfce4-power-manager: 4.20.0
Number of packages to be removed: 2
The operation will free 2 MiB.
Proceed with deinstalling packages? [y/N]: N

How does power managment in XFCE work?

A search for occurances indicates, that it could be started automatically as an unwanted service. It could even be started, if it was running in an earlier user session.

# find / -type f -name '*xfce4-power*'
/home/lightman/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-power-manager.xml
/usr/local/share/metainfo/xfce4-power-manager.appdata.xml
/usr/local/share/man/man1/xfce4-power-manager-settings.1.gz
/usr/local/share/man/man1/xfce4-power-manager.1.gz
/usr/local/share/applications/xfce4-power-manager-settings.desktop
/usr/local/etc/xdg/autostart/xfce4-power-manager.desktop
/usr/local/bin/xfce4-power-manager-settings
/usr/local/bin/xfce4-power-manager

Stopping power manager in XFCE.

To my surprice, XFCE did actually write a built-in help, which kindly lists a quit option. It also seemed to actually quit the unwanted service. However, this is probably just a shortlived pleasure. It might restart. Especially after a new session or a reboot.

$ xfce4-power-manager --help
Usage:
xfce4-power-manager [OPTION?]
Help Options:
-h, --help Show help options
--help-all Show all help options
--help-sm-client Show session management options
Application Options:
--daemon Daemonize
--debug Enable debugging
--dump Dump all information
--restart Restart the running instance of Xfce power manager
-c, --customize Show the configuration dialog
-q, --quit Quit any running xfce power manager
-V, --version Version information
$ xfce4-power-manager -q

Killing the XFCE power manager from cron as a work-around.

As it remains unclear, how the unwanted service is started, a work-around is to repeat killing it from cron, until I learn, how this service can be permanently disabled. This cron job kills it every minute, if running. I have tested this be working.

# pkg info -r xfce4-power-manager
xfce4-power-manager-4.20.0:
xfce-4.20
# pkg info -r upower
upower-1.90.7:
xfce4-settings-4.20.1
xfce4-power-manager-4.20.0
gnome-power-manager-3.32.0_3
gnome-control-center-43.2_4
mutter-42.4_3
gnome-settings-daemon-42.2_8
# nano /etc/crontab
* * * * * root pkill xfce4-power-manager
* * * * * root pkill upowerd
# service cron restart

Tips appreciated!

I appreciate any tips about this issue.

Managing PulseAudio on FreeBSD

Configuring PulseAudio on FreeBSD.

In this example, the PulseAudio is configured to output to HDMI by default. If USB headphones are attached, then audio output is automatically switched to these. I tested this to be working.

$ pactl list sinks
Sink #3
State: RUNNING
Name: oss_output.dsp3
Description: 3 - Intel (0x2818) (HDMI/DP 8ch)
Mute: no
# nano /usr/local/etc/pulse/default.pa
set-default-sink oss_output.dsp3
load-module module-switch-on-connect

Switching audio output with pactl on FreeBSD.

pactl is a control interface for a running PulseAudio sound server. In this example, the audio output is switched to a pair of USB headphones. The listings indicate, that the headphones are associated with sink 4 and name oss_output.dsp5. The output is switched to to this and it is un-muted. Warning: The volume is optionally set to 100%. The volume setting is the same as the one, that is set on the headphones themselves.

$ pactl list sinks
Sink #4
State: RUNNING
Name: oss_output.dsp5
Description: 5 - Corsair CORSAIR HS80 RGB Wireless Gaming Receiver
muted: yes
Sample Specification: s16le 2ch 44100Hz
$ pactl list sinks short
4 oss_output.dsp5 module-oss.c s16le 2ch 44100Hz RUNNING
$ pactl set-default-sink oss_output.dsp5
$ pactl set-sink-mute oss_output.dsp5 0
$ pactl set-sink-volume oss_output.dsp5 100%

References.

Poudriere build failure: net-im/signal-desktop

I noticed, that my Poudriere build machine failed to compile net-im/signal-desktop for FreeBSD 14 with latest ports branch, because it require devel/esbuild 0.25.0, while build environment has 0.24.0. Tested 2025-03-07 and 2025-03-10.

✘ [ERROR] Cannot start service: Host version "0.24.0" does not match binary version "0.25.0"
1 error
Error: The service was stopped: write EPIPE
at /wrkdirs/usr/ports/net-im/signal-desktop/work/Signal-Desktop-7.44.0/node_modules/esbuild/lib/main.js:968:34
at responseCallbacks.<computed> (/wrkdirs/usr/ports/net-im/signal-desktop/work/Signal-Desktop-7.44.0/node_modules/esbuild/lib/main.js:622:9)
at afterClose (/wrkdirs/usr/ports/net-im/signal-desktop/work/Signal-Desktop-7.44.0/node_modules/esbuild/lib/main.js:613:28)
at /wrkdirs/usr/ports/net-im/signal-desktop/work/Signal-Desktop-7.44.0/node_modules/esbuild/lib/main.js:1988:18
at onwriteError (node:internal/streams/writable:605:3)
at process.processTicksAndRejections (node:internal/process/task_queues:84:21)
ERROR: "build:esbuild" exited with 1.
*** Error code 1
Stop.
make: stopped in /usr/ports/net-im/signal-desktop
=>> Cleaning up wrkdir
===> Cleaning for signal-desktop-7.44.0_1
build of net-im/signal-desktop | signal-desktop-7.44.0_1 ended at Mon Mar 10 05:13:34 CET 2025
build time: 00:00:47
!!! build failure encountered !!!

I notified the FreeBSD maintainer. He kindly replied, that he has notified devel/esbuild and the issue will be fixed.

Earlier this year, I noticed, that a similar issue happened. The required version was 0.21, while build environment had 0.24. I notified the maintainer. It was fixed.

Prevent Signal from being removed during update.

As a consequence of the failed build, I locked Signal. This prevents it from being deinstalled, while it fails to build.

# pkg lock signal-desktop
signal-desktop-7.42.0: lock this package? [y/N]:

It can later be unlocked.

# pkg unlock signal-desktop

Work-around for “Shared object “libFLAC.so.12″ not found”.

The update, while Signal being locked, resulted in a problem with a link to a FLAC library.

$ signal-desktop &
$ ld-elf.so.1: Shared object "libFLAC.so.12" not found, required by "signal-desktop"

I fixed this with a temporary link to the correct FLAC library. This should automatically be fixed, when Signal is fixed upstream.

# pkg info -l flac | grep libFLAC
/usr/local/lib/libFLAC++.a
/usr/local/lib/libFLAC++.so
/usr/local/lib/libFLAC++.so.11
/usr/local/lib/libFLAC++.so.11.0.0
/usr/local/lib/libFLAC.a
/usr/local/lib/libFLAC.so
/usr/local/lib/libFLAC.so.14
/usr/local/lib/libFLAC.so.14.0.0
/usr/local/share/aclocal/libFLAC++.m4
/usr/local/share/aclocal/libFLAC.m4
# pkg which /usr/local/lib/libFLAC.so.12
/usr/local/lib/libFLAC.so.12 was not found in the database
# ln -s /usr/local/lib/libFLAC.so.14 /usr/local/lib/libFLAC.so.12
# ldconfig -R
$ signal-desktop &

It can later be removed.

# rm /usr/local/lib/libFLAC.so.12
# ldconfig -R

Fixed.

The port compiled again 2025-03-21 and the package could be unlocked and the symbolic link removed.

References.

Poudriere build failure: graphics/cmake

My Poudriere build machine suddently stopped at the following error, that seems to be caused by a problem with CMake or run-time dependency, which should be built automatically.

build started at Fri Mar  7 16:46:57 CET 2025
port directory: /usr/ports/graphics/evince
package name: evince-46.3.1
...
Poudriere version: poudriere-git-3.4.2
Host OSVERSION: 1402000
Jail OSVERSION: 1402000
...
Did not find CMake 'cmake'
Found CMake: NO
Run-time dependency gnome-desktop-3.0 found: NO (tried pkgconfig)
meson.build:237:20: ERROR: Dependency "gnome-desktop-3.0" not found, tried pkgconfig

Any tips for solutions are greatly appreciated.

References.