Cursor

Windows Mauszeiger unter Linux/X11

Mein Kind findet auf Youtube ein Video über einen animierten Mauszeiger und wie man den ändert. Den Mauszeiger gibt es hier: Electric Lightning =ิ ω =ิ.ani. Ist natürlich für Windows. Aber das kann man doch bestimmt irgendwie unter Linux auch benutzen.

So sieht der Mauszeiger aus:

Format

Hmm. Was ist das für ein Format?

$ file Electric\ Lightning\ \=ิ\ ω\ \=ิ.ani
Electric Lightning =ิ ω =ิ.ani: RIFF (little-endian) data, animated cursor "lightning arrow busy"

RIFF ist wohl ein Containerformat für alles mögliche. Mal schauen, was es da so an Tools gibt.

Es gibt rifftree aus libgig. Das sagt:

$ rifftree Electric\ Lightning\ \=ิ\ ω\ \=ิ.ani
RIFF(ACON)->
            LIST(INFO)->
                        INAM;
                        IART;
            anih;
            rate;
            LIST(fram)->
                        icon;
                        icon;
                        icon;
                        icon;
            ;

Ok, also es scheinen vier Icons drin zu sein. Aber auspacken der Icons klappt damit nicht. Es ist wohl ein Tool für Musik.

Nächster Versuch mit irgendeinem riff-Extraktor von github klappt auch nicht so richtig. Aber win2xcur klingt gut: `“win2xcur is a tool that converts cursors from Windows format (*.cur, *.ani) to Xcursor format. This allows Windows cursor themes to be used on Linux, for example.”

Konvertieren

Ja genau das brauche ich: Ich hab eine ani-Datei und brauche ein Format, das ich unter Linux verwenden kann. Leider gibt es win2xcur nicht als Paket, weder unter Debian noch unter Arch.

Aber kein Problem: Python-Pakete installiert man mit pip:

$ pip install win2xcur
Defaulting to user installation because normal site-packages is not writeable
Collecting win2xcur
  Downloading win2xcur-0.1.1-py3-none-any.whl (13 kB)
Requirement already satisfied: numpy in /usr/lib/python3.10/site-packages (from win2xcur) (1.23.3)
Collecting Wand
  Downloading Wand-0.6.10-py2.py3-none-any.whl (142 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 142.8/142.8 kB 4.4 MB/s eta 0:00:00
Installing collected packages: Wand, win2xcur
Successfully installed Wand-0.6.10 win2xcur-0.1.1

Klappt. Und nun konvertieren:

$ win2xcur Electric\ Lightning\ \=ิ\ ω\ \=ิ.ani

Jetzt hab ich eine neue Datei ohne Endung:

$ file Electric\ Lightning\ \=ิ\ ω\ \=ิ
Electric Lightning =ิ ω =ิ: X11 cursor

Und jetzt? Wie lade oder installiere ich diese Cursor-Datei?

Hier gibt es eine Erklärung von KDE. Ich brauche eine bestimmte Verzeichnisstruktur mit einer index.theme-Datei und der Cursor-Datei (oder mehrere) und das alles im Homeverzeichnis nach ~/.icons/.

Also gut, dann los, Verzeichnisse anlegen:

$ mkdir -p ~/.icons/electric/cursors

(Mit “-p” legt mkdir auch die fehlenden Verzeichnisse dazwischen an)

Index Datei ~/.icons/electric/index.theme mit diesem Inhalt anlegen:

[Icon Theme]
Name=Electric
Comment=My very own cursor theme
Inherits=Oxygen_Blue

In /usr/share/icons/ gibt es bereits einige Mauszeiger-themes, z.B. Oxygen_Blue (da ich KDE installiert habe) und dort gibt es auch eine index.theme und ein cursors-Unterverzeichnis mit Unmengen an Dateien.

Offenbar gibt es Regeln, wie diese Dateien zu heißen haben und für ein vollständiges Theme braucht man wohl einige Mauszeiger. Deswegen klingt Inherits (vererben) praktisch: Ich ersetze nur einen Mauszeiger und der Rest kommt von Oxygen_Blue.

Nach etwas experimentieren nenne ich meinen neuen Cursor “default” und “left_ptr” (mittels Symbolischem Link):

$ cp Electric\ Lightning\ \=ิ\ ω\ \=ิ ~/.icons/electric/cursors/default
$ cd ~/.icons/electric/cursors
$ ln -s default left_ptr

Im Arch Wiki gibt es auch noch ein paar Informationen dazu, Stichwort: Cursor Themes.

In KDE in SystemeinstellungenErscheinungsbildZeiger taucht Electric auf und kann ausgewählt werden. Schick.

Größe

Normalerweise benutze ich einen etwas größeren Mauszeiger (48 statt 24), aber der Electric ist mit 32x32 eher für 24 geeignet und bei 48 zu klein. Bisher hab ich einfach mit win2xcur die ani-Datei nach X11-Cursor konvertiert. Aber eigentlich sind das nur vier Bildchen, die mit einem bestimmten Timing durchrotiert werden.

Vielleicht kann man die Icons in Bilder extrahieren, die vergrößern und dann wieder in einen X11-Cursor einpacken?

Es gibt ein Program xcur2png (In Arch, nicht in Debian), das klingt vielversprechend für den ersten Schritt. Mal installieren. Und ausprobieren:

$ xcur2png -c config Electric\ Lightning\ \=ิ\ ω\ \=ิ

Das gibt vier png-Dateien: Electric Lightning =ิ ω =ิ_000.png bis ...003.png und config. In der config steht dies:

#size   xhot    yhot    Path to PNG image       delay
32      8       4       Electric Lightning =ิ ω =ิ_000.png        116
32      8       4       Electric Lightning =ิ ω =ิ_001.png        116
32      8       4       Electric Lightning =ิ ω =ิ_002.png        116
32      8       4       Electric Lightning =ิ ω =ิ_003.png        116

xcursorgen ist das Tool für die Rückrichtung (das gibts als Paket). Das braucht aber eine Steuerdatei, die ihm sagt, wo der Mauszeiger seinen “heißen” Punkt hat, also wo er hinzeigt bzw. hinklickt. Der Mauszeiger muss ja kein Pfeil sein, sondern darf ja irgendwie ausschauen, z.B. ein Fadenkreuz oder sowas. Das sind die Spalten xhot und yhot. Die erste Spalte ist die Größe und es lohnt sich (wie immer) die Man-Page zu lesen:

$ man xcursorgen

Wenn man die gleiche Größe verwendet, dann wird es eine Animation und der letzte Wert ist das Timing. Man kann auch mehrere Größen verwenden, dann hat man mehrere Cursor (ggf mit Animation). Nur hab ich Zweifel, dass das Tool mit Leerzeichen im Dateinamen klarkommt. Kurz probiert: ja klar, geht schief.

Also dann benennen wir das doch mal besser um:

$ mv Electric\ Lightning\ \=ิ\ ω\ \=ิ electric32
$ xcur2png -c electric electric32
Converting cursor...
##################################################
Conversion successfully done!(4 images were output.)

Besser. Jetzt fehlen noch die doppelt so großen Mauszeiger. Man könnte das natürlich in einem Malprogramm, z.B. gimp aufmachen, die Größe verdoppeln und unter einem neuen Namen speichern. Und das vier mal. Aber das ist mir zu viel Arbeit. Für sowas gibt es convert von ImageMagick und ein bisschen shell code:

$ for i in {0..3}; do convert electric32_00${i}.png -resize 64x64 electric64_00${i}.png; done

Eine Schleife zählt von 0 bis 3 und ruft 4x convert auf. Das ${i} wird durch 0 bis 3 jeweils ersetzt.

Die config Datei noch anpassen, also size, xhot und yhot verdoppeln:

#size   xhot    yhot    Path to PNG image       delay
32      8       4       electric32_000.png      116
32      8       4       electric32_001.png      116
32      8       4       electric32_002.png      116
32      8       4       electric32_003.png      116
#
64      16      8       electric64_000.png      116
64      16      8       electric64_001.png      116
64      16      8       electric64_002.png      116
64      16      8       electric64_003.png      116

Und den cursor bauen und umkopieren:

$ xcursorgen electric default
$ cp default ~/.icons/electric/cursors

Ganz passt es nicht, da Electric 32 bzw 64 Pixel gross ist, aber Oxygen 24, 48 und 72 verwendet. Aber es tut gut genug.

Viewer

Zur Kontrolle wäre ein Mauszeiger Viewer praktisch. Es gibt xcursor-viewer, allerdings weder in Arch noch in Debian als Paket verfügbar. Also auschecken und selber bauen:

$ git clone https://github.com/drizt/xcursor-viewer.git
$ cd xcursor-viewer
$ mkdir build
$ cd build
$ cmake ..
$ make
$ cp xcursor-viewer ~/.local/bin

(Bei mir ist ~/.local/bin in $PATH). Dann kann man xcursor-viewer starten und Cursor-Dateien öffnen und anschauen.