Forum: PC-Programmierung Linux: setfont aus C-Programm aufrufen


von Ralph S. (jjflash)


Lesenswert?

Ich suche mir jetzt schon eine Wolf und bin knapp davor aufzugeben.

Ich werkel ja immer wieder an meiner "eigenwilligen" eigenen 
Linuxversion und da immer auch zweigleisig: Eine "normale " mit Desktop 
(XFCE) und eine reine Textmode Konsolenvariante ohne Desktop und ohne 
"X".

Hier ist jetzt auch mein Problem: Ich würde gerne auf der 
Textmodekonsole den Zeichensatz ändern und als ewig gestriger möchte ich 
dort kein UTF-8 verwenden, sondern (wie vor 35 Jahren) einen erweiterten 
deutschen Ascii-Zeichensatz.

Auf der Konsole kann ich "unicode_stop   unicode_start  setfont 
fontdatei" eingeben und das funktioniert auch. Damit das ganze auch für 
den User funktioniert habe ich die 3 Programme nun in das Verzeichnis 
meines Projektes gelegt, umbenannt und mit User-Rechten versehen. Auch 
mit umbenannten Namen funktioniert das ganze, wenn ich die Programme von 
Hand in der Konsole aufrufe. Versuch ich in C nun die Programme zu 
starten, funktioniert nur ein "system("unicode_start"); 
system("unicode_stop)" aber ein "errcode= system("setfont Dateiname");" 
funktioniert nicht, es bringt mir nur den Fehlercode 32512 !

Woran liegt das und gibt es einen - einfachen - Weg, aus einem 
C-Programm den Zeichensatz zu ändern ?

von Ein T. (ein_typ)


Lesenswert?

Ralph S. schrieb:
> system("unicode_stop)" aber ein "errcode= system("setfont Dateiname");"
> funktioniert nicht, es bringt mir nur den Fehlercode 32512 !

Das funktioniert anscheinend schon, aber es liefert einen Fehler zurück. 
Vielleicht mal in errno und die Manpage system(3) schauen?

> Woran liegt das und gibt es einen - einfachen - Weg, aus einem
> C-Programm den Zeichensatz zu ändern ?

Das, was system(3) auch macht, also fork(2), execl(3) und waitpid(2), 
das steht in der Manpage und ausformuliert natürlich im Code. Linux ist 
Open Source, die GLibc auch. Was hindert Dich, in die Sourcen zu 
schauen?

von Εrnst B. (ernst)


Lesenswert?

Ralph S. schrieb:
> "errcode= system("setfont Dateiname");"
> funktioniert nicht, es bringt mir nur den Fehlercode 32512 !
Tipp: Den Returncode vom Aufruf kriegst du per WEXITSTATUS(errcode);
in deinem Fall ist das 127

"system()" benutzt "/bin/sh", dort findet sich:
Value 127 is returned by /bin/sh when the given command is not found 
within your PATH system variable and it is not a built-in shell command.

Also: PATH-Variable prüfen, oder direkt "/usr/bin/setfont" aufrufen.

von Ralph S. (jjflash)


Lesenswert?

Ein T. schrieb:
> Das, was system(3) auch macht, also fork(2), execl(3) und waitpid(2),
> das steht in der Manpage und ausformuliert natürlich im Code. Linux ist
> Open Source, die GLibc auch. Was hindert Dich, in die Sourcen zu
> schauen?

... das werde ich wohl tun, ist aber genau das, was ich vermeiden wollte 
!

Εrnst B. schrieb:
> Also: PATH-Variable prüfen, oder direkt "/usr/bin/setfont" aufrufen.

Das habe ich natürlich direkt getan, auch setfont ins aktuelle 
Verzeichnis kopiert und umbenannt. Das setfont-Programm wird garantiert 
gefunden !

von Rolf M. (rmagnus)


Lesenswert?

Ralph S. schrieb:
> Ein T. schrieb:
>> Das, was system(3) auch macht, also fork(2), execl(3) und waitpid(2),
>> das steht in der Manpage und ausformuliert natürlich im Code. Linux ist
>> Open Source, die GLibc auch. Was hindert Dich, in die Sourcen zu
>> schauen?
>
> ... das werde ich wohl tun, ist aber genau das, was ich vermeiden wollte

Warum?

> !

Bitte nicht plenken, damit sowas nicht passiert.

> Εrnst B. schrieb:
>> Also: PATH-Variable prüfen, oder direkt "/usr/bin/setfont" aufrufen.
>
> Das habe ich natürlich direkt getan, auch setfont ins aktuelle
> Verzeichnis kopiert und umbenannt.

Hast du dabei bedacht, dass das aktuelle Verzeichnis normalerweise nicht 
im PATH ist und daher dort nicht gesucht wird?

von Harald K. (kirnbichler)


Lesenswert?

Schon mal ausprobiert?
1
errcode = system("./setfont Dateiname");

von Xanthippos (xanthippos)


Lesenswert?

Macht /bin/sh Probleme? Vielleicht ist setfont ein Alias?

Setfont mit exec() statt system() aufrufen.

von Ralph S. (jjflash)


Lesenswert?

Rolf M. schrieb:
> Bitte nicht plenken, damit sowas nicht passiert.

Sorry, passiert mir leider immer wieder einmal! (hier dann ungeplenkt, 
:-))

Rolf M. schrieb:
> Hast du dabei bedacht, dass das aktuelle Verzeichnis normalerweise nicht
> im PATH ist und daher dort nicht gesucht wird?

Hab ich natürlich bedacht und wie oben geschrieben dass Programm setfont 
aus /usr/bin in das Projektverzeichnis kopiert, umbenannt und umbenannt 
aufgerufen. Dasselbe habe ich gemacht mit den Schriftarten, die ich 
gerne gesetzt haben möchte (aus Verzeichnis /usr/share/kbd/consolefonts)

Harald K. schrieb:
> errcode = system("./setfont Dateiname");

Hab ich natürlich schon probiert

von Ralph S. (jjflash)


Lesenswert?

Xanthippos schrieb:
> Setfont mit exec() statt system() aufrufen.

na ja, exec kehrt ja nicht zum aufrufenden Programm zurück...

von Le X. (lex_91)


Lesenswert?

Rolf M. schrieb:
> Ralph S. schrieb:
>> Ein T. schrieb:
>>> Das, was system(3) auch macht, also fork(2), execl(3) und waitpid(2),
>>> das steht in der Manpage und ausformuliert natürlich im Code. Linux ist
>>> Open Source, die GLibc auch. Was hindert Dich, in die Sourcen zu
>>> schauen?
>>
>> ... das werde ich wohl tun, ist aber genau das, was ich vermeiden wollte
>
> Warum?

In den Code schauen zu müssen ist ein Zeichen dass die Doku versagt hat.
Für mich wäre Sourcecode von Systemprogrammen auch nicht die erste 
Anlaufstelle wenn ich Fragen zur API hätte.

von Εrnst B. (ernst)


Lesenswert?

Der 127er Rückgabe-Code muss ja nicht aus der sh kommen, könnte auch 
sein, dass "setfont" das zurückgibt, wenn der Font nicht gefunden wird.

Wobei es bei mir dann einen 66er-Code zurückgibt...
# setfont xyz ; echo $?

Ansonsten, statt dem gemurkse über system() und co:

https://sources.debian.org/src/kbd/2.5.1-1/src/libkfont/

enthält die Funktionen, die setfont verwendet. Ist leider im default 
statisch gelinkt und wird nicht mitinstalliert?
==> configure mit --enable-libkfont

Dann kannst du das dazulinken und direkt kfont_init & kfont_load_fonts 
aufrufen.

von Ralph S. (jjflash)


Lesenswert?

Εrnst B. schrieb:
> Ansonsten, statt dem gemurkse über system() und co:
>
> https://sources.debian.org/src/kbd/2.5.1-1/src/libkfont/
>
> enthält die Funktionen, die setfont verwendet. Ist leider im default
> statisch gelinkt und wird nicht mitinstalliert?
> ==> configure mit --enable-libkfont
>
> Dann kannst du das dazulinken und direkt kfont_init & kfont_load_fonts
> aufrufen.

uuuui, das werde ich mal ausprobieren

von Rolf M. (rmagnus)


Lesenswert?

Ralph S. schrieb:
> Xanthippos schrieb:
>> Setfont mit exec() statt system() aufrufen.
>
> na ja, exec kehrt ja nicht zum aufrufenden Programm zurück...

Deshalb vorher ein fork().

Le X. schrieb:
> In den Code schauen zu müssen ist ein Zeichen dass die Doku versagt hat.

Wie in Beitrag "Re: Linux: setfont aus C-Programm aufrufen" schon 
geschrieben wurde, steht es in der Doku sehr wohl auch drin. Da ist 
sogar der genaue Aufruf von execl() enthalten. Dass man zusätzlich auch 
noch in den Quellcode schauen kann, ist ein Vorteil, kein Nachteil.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.