Impostare un certo font nella X11
Ciao... io vorrei impostare un font scelto da me. Uso la X11 in C per la grafica. ci è stato fornito questa funzione:
void SetFont(int ic)
{
switch (ic)
{
case 0: font=XLoadFont(dpy,"-adobe-times-bold-r-normal--10*");
break;
case 1: font=XLoadFont(dpy,"-adobe-times-bold-r-normal--12*");
break;
case 2: font=XLoadFont(dpy,"-adobe-times-bold-r-normal--14*");
break;
case 3: font=XLoadFont(dpy,"-adobe-times-bold-r-normal--18*");
break;
case 4: font=XLoadFont(dpy,"-adobe-times-bold-r-normal--24*");
break;
case 5: font=XLoadFont(dpy,"-adobe-times-bold-r-normal--34*");
break;
}
XSetFont(dpy,gc,font);
XFlush(dpy);
}
Immagino dovrei cambiare "-adobe-times-bold-r-normal--34*" ma non conosco il significato di questa scrittura. Come imposto la cosa?
Grazie e scusate se vi tormento sempre per questo benedetto C, ma spesso guardando nelle librerie che trovo in internet non riesco a capire bene come muovermi!!
Paola
void SetFont(int ic)
{
switch (ic)
{
case 0: font=XLoadFont(dpy,"-adobe-times-bold-r-normal--10*");
break;
case 1: font=XLoadFont(dpy,"-adobe-times-bold-r-normal--12*");
break;
case 2: font=XLoadFont(dpy,"-adobe-times-bold-r-normal--14*");
break;
case 3: font=XLoadFont(dpy,"-adobe-times-bold-r-normal--18*");
break;
case 4: font=XLoadFont(dpy,"-adobe-times-bold-r-normal--24*");
break;
case 5: font=XLoadFont(dpy,"-adobe-times-bold-r-normal--34*");
break;
}
XSetFont(dpy,gc,font);
XFlush(dpy);
}
Immagino dovrei cambiare "-adobe-times-bold-r-normal--34*" ma non conosco il significato di questa scrittura. Come imposto la cosa?
Grazie e scusate se vi tormento sempre per questo benedetto C, ma spesso guardando nelle librerie che trovo in internet non riesco a capire bene come muovermi!!
Paola
Risposte
Ciao
spero che questo link di possa essere utile:
http://home.att.ne.jp/omega/kikuchi/067.html (almeno come spunto)
In linea di massima sono le impostazioni del font, quindi il nome, la dimensione, le proprietà (grassetto, sottolineato...)
Ciao!

spero che questo link di possa essere utile:
http://home.att.ne.jp/omega/kikuchi/067.html (almeno come spunto)
In linea di massima sono le impostazioni del font, quindi il nome, la dimensione, le proprietà (grassetto, sottolineato...)
Ciao!
Ti ringrazio... solo che io ho un Font scaricato da me e devo usarlo con la X11.. non so dove iinstallarlo...!!
Paola
Paola
"prime_number":
ho un Font scaricato da me e devo usarlo con la X11.. non so dove iinstallarlo...!!
Se il tuo sistema usa fontconfig (cioè hai i comandi fc-cache, ecc.), dovrebbe essere sufficiente installarlo nella directory ~/.fonts e poi dare il comando fc-cache. Altrimenti, se non ricordo male, dovrebbe essere sufficiente aggiungere run-time il path con il comando xset fp+
Controlla poi con xlsfonts o xfd, fc-list se viene visto dal server X.
dunque... ho seguito il primo procedimento ( usando fc-cache) ma poi il mio font non compare nella xlsfonts.
Il procedimento alternativo non l'ho capito, nella shell dovrei dare il comando xset fp ./fonts/bonzai.ttf ? O è diverso?
Ti ringrazio!!
Paola
Il procedimento alternativo non l'ho capito, nella shell dovrei dare il comando xset fp ./fonts/bonzai.ttf ? O è diverso?
Ti ringrazio!!
Paola
Altrimenti secondo te potrei usare XSetFontPath(dpy, "~/.fonts", 0); ? Solo che mi dice che l'argomento 2 è tipo puntatore incompatibile... Non so bene come metterlo... :S
Paola
Paola
Non conosco questa funzione e questa libreria che stai utilizzando, pero' ho visto su internet la sintassi di XSetFontPath.
Il secondo parametro e' di tipo (char **), quindi non puoi passargli quella costante ma l'indirizzo del puntatore della costante.
Esempio pratico:
char *stringa;
...
...
stringa = "~/.fonts";
XSetFontPath(dpy, &stringa, 0);
cosi' funziona sintatticamente, nel senso che il compilatore non ti rileva errori, pero' non so dirti se e' quello il valore che si aspetta la funzione. (Dovrei studiarmi un po' la libreria).
Eugenio
Il secondo parametro e' di tipo (char **), quindi non puoi passargli quella costante ma l'indirizzo del puntatore della costante.
Esempio pratico:
char *stringa;
...
...
stringa = "~/.fonts";
XSetFontPath(dpy, &stringa, 0);
cosi' funziona sintatticamente, nel senso che il compilatore non ti rileva errori, pero' non so dirti se e' quello il valore che si aspetta la funzione. (Dovrei studiarmi un po' la libreria).
Eugenio
Eh facendo come dici tu, compila ma durante l'esecuzione mi dà quest'errore:
X Error of failed request: BadName (named color or font does not exist)
Major opcode of failed request: 45 (X_OpenFont)
Serial number of failed request: 8
Current serial number in output stream: 16
Questa è la funzione per intero: i nomi he ho dato tra le virgolette in XLoadFont() non so cosa significhino in realtà
. Sono andata nella cartella dove è stato installato il font (che è appunto /.font) e in una file di teto c'era scriitta quella riga di testo. mi pareva compatibile con quella data dal professore. Devo forse cambiare qualcosa al suo interno? Oppure l'errore che mi dà non dipende da questo? Boooh!
Grazie
Paola
void SetFont(int ic)
{
char *stringa;
stringa="~/.fonts";
XSetFontPath(dpy,&stringa , 0);
switch (ic)
{
case 0: font=XLoadFont(dpy,"-Altsys-Bonzai-Medium-r-Normal--0-0-0-0-p-0-iso10646-10*");
break;
case 1: font=XLoadFont(dpy,"-Altsys-Bonzai-Medium-r-Normal--0-0-0-0-p-0-iso10646-12*");
break;
case 2: font=XLoadFont(dpy,"-Altsys-Bonzai-Medium-r-Normal--0-0-0-0-p-0-iso10646-14*");
break;
case 3: font=XLoadFont(dpy,"-Altsys-Bonzai-Medium-r-Normal--0-0-0-0-p-0-iso10646-18*");
break;
case 4: font=XLoadFont(dpy,"-Altsys-Bonzai-Medium-r-Normal--0-0-0-0-p-0-iso10646-24*");
break;
case 5: font=XLoadFont(dpy,"-Altsys-Bonzai-Medium-r-Normal--0-0-0-0-p-0-iso10646-34*");
break;
}
XSetFont(dpy,gc,font);
XFlush(dpy);
}
X Error of failed request: BadName (named color or font does not exist)
Major opcode of failed request: 45 (X_OpenFont)
Serial number of failed request: 8
Current serial number in output stream: 16
Questa è la funzione per intero: i nomi he ho dato tra le virgolette in XLoadFont() non so cosa significhino in realtà

Grazie
Paola
void SetFont(int ic)
{
char *stringa;
stringa="~/.fonts";
XSetFontPath(dpy,&stringa , 0);
switch (ic)
{
case 0: font=XLoadFont(dpy,"-Altsys-Bonzai-Medium-r-Normal--0-0-0-0-p-0-iso10646-10*");
break;
case 1: font=XLoadFont(dpy,"-Altsys-Bonzai-Medium-r-Normal--0-0-0-0-p-0-iso10646-12*");
break;
case 2: font=XLoadFont(dpy,"-Altsys-Bonzai-Medium-r-Normal--0-0-0-0-p-0-iso10646-14*");
break;
case 3: font=XLoadFont(dpy,"-Altsys-Bonzai-Medium-r-Normal--0-0-0-0-p-0-iso10646-18*");
break;
case 4: font=XLoadFont(dpy,"-Altsys-Bonzai-Medium-r-Normal--0-0-0-0-p-0-iso10646-24*");
break;
case 5: font=XLoadFont(dpy,"-Altsys-Bonzai-Medium-r-Normal--0-0-0-0-p-0-iso10646-34*");
break;
}
XSetFont(dpy,gc,font);
XFlush(dpy);
}
"prime_number":
nella shell dovrei dare il comando xset fp ./fonts/bonzai.ttf ?
E' questo però devi specificare il percorso assoluto. Inoltre (importante) deve esserci nella stessa directory un file di nome fonts.dir, altrimenti lo devi creare tu con il comando ttmkfdir -c -f Bonzai > fonts.dir (dato internamente alla directory con il font).
Poi dai i comandi detti prima (xset fp+
Se è tutto ok puoi anche aggiungere il percorso al file di configurazione del server X.
Se il font è questo http://cooltext.com/Download/Font/bonzai.zip, la procedura sopra funziona sul mio sistema.
Sigh, font.dir c'è. La sintassi dovrebbe essere giusta... Mi sa che è un problema di permessi, sono in un laboratorio!! :S
Con quel comando che aevo trovato, XFontPath, secondo te posso "depitstare" la ricerca della X11 di font? La sintassi di eugenio era corretta a riguardo? conoci il comando?
Thanks! siete i miei babysitter ormai voi 2
Paola
Con quel comando che aevo trovato, XFontPath, secondo te posso "depitstare" la ricerca della X11 di font? La sintassi di eugenio era corretta a riguardo? conoci il comando?
Thanks! siete i miei babysitter ormai voi 2

Paola
"prime_number":
Sigh, font.dir c'è. La sintassi dovrebbe essere giusta... Mi sa che è un problema di permessi
Mi pare strano però, se la directory dove lo installi è ~/.fonts...

Ma xlsfonts | grep -i Bonzai non ha proprio output?
Con quel comando che aevo trovato, XFontPath, secondo te posso "depitstare" la ricerca della X11 di font? La sintassi di eugenio era corretta a riguardo? conoci il comando?
Sì, penso lo si possa usare, solo che passando una sola directory credo che elimini tutte quelle di default. Forse sarebbe meglio aggiungerla usando prima XGetFontPath (comando man XGetFontPath per i dettagli). In ogni caso credo che come terzo parametro non dovresti usare 0 bensì 1, perché tale argomento indica il numero di directory nel path specificato.
Eventualmente potresti sbirciare i sorgenti del comando xset, per vedere un esempio di utilizzo di queste funzioni (cerca la parola directoryList).

Così per curiosità: cosa c'è nel tuo file fonts.dir?
Mi dispiace non poterti aiutare troppo sulle librerie X11, fortunatamente c'e' stan molto piu' preparato.
Per imparare queste librerie penso che mi occorrono alcuni giorni di studio.
Cmq ho trovato su questo sito
http://213.92.21.88/meo/white/programmazione/ditelo.htm
il seguente listato:
credo che utilizzi una font standard 9x15.
A limite questo programma potrebbe essere un punto di partenza. (Non l'ho compilato)
Ora vi chiedo (stan e prime_number) se esistono delle font di default, senza aggiungerne altre ? (Per.es. 9x15)
E' necessario per te (prime_number), se esistono gia' font di default, aggiungerne altre ?
Se si, e se si riesce a compilare questo programma, si puo' provare ad aggiungere una font non standard.
In questo modo puoi anche prelevare le info da qui' e copiarle nel tuo programma e sono disponibile nel darti un aiuto a farlo.
Eugenio
Per imparare queste librerie penso che mi occorrono alcuni giorni di studio.
Cmq ho trovato su questo sito
http://213.92.21.88/meo/white/programmazione/ditelo.htm
il seguente listato:
/* * iLoveYouX.c * */ #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xos.h> #include <X11/Xatom.h> #include Display *display; int screen_num; void main(argc, argv) int argc; char **argv; { Window win; unsigned int width = 300, height = 300; int x =0, y =0; unsigned int border_width = 4; unsigned int display_width, display_height; char *window_name = "I Love You X Window Program"; int count; XEvent report; GC gc; XFontStruct *font_info; char *display_name = NULL; unsigned long valuemask = 0; XGCValues values; char *fontname = "9x15"; if ( (display=XOpenDisplay(display_name)) == NULL ) { (void) fprintf( stderr, "Cannot connect to X server %s\n", XDisplayName(display_name)); exit( -1 ); } screen_num = DefaultScreen(display); display_width = DisplayWidth(display, screen_num); display_height = DisplayHeight(display, screen_num); win = XCreateSimpleWindow(display, RootWindow(display,screen_num), x, y, width, height, border_width, BlackPixel(display, screen_num), WhitePixel(display,screen_num)); XSelectInput(display, win, ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask); if ((*font_info = XLoadQueryFont(display,fontname)) == NULL) { (void) fprintf( stderr, "Cannot open 9x15 font\n"); exit( -1 ); } gc = XCreateGC(display, win, valuemask, &values); XSetFont(display, gc, font_info->fid); XMapWindow(display, win); while (1) { XNextEvent(display, &report); switch (report.type) { case Expose: if (report.xexpose.count != 0) break; for (i=0;i<3;i++) XDrawString(display, win, gc, (i+1)*10, (i+2)*10, "I love You!", strlen("I love You!"); break; case ConfigureNotify: width = report.xconfigure.width; height = report.xconfigure.height; break; case ButtonPress: case KeyPress: XUnloadFont(display, font_info->fid); XFreeGC(display, gc); XCloseDisplay(display); exit(1); default: break; } } }
credo che utilizzi una font standard 9x15.
A limite questo programma potrebbe essere un punto di partenza. (Non l'ho compilato)
Ora vi chiedo (stan e prime_number) se esistono delle font di default, senza aggiungerne altre ? (Per.es. 9x15)
E' necessario per te (prime_number), se esistono gia' font di default, aggiungerne altre ?
Se si, e se si riesce a compilare questo programma, si puo' provare ad aggiungere una font non standard.
In questo modo puoi anche prelevare le info da qui' e copiarle nel tuo programma e sono disponibile nel darti un aiuto a farlo.
Eugenio
"eugenio.amitrano":
vi chiedo (stan e prime_number) se esistono delle font di default, senza aggiungerne altre ? (Per.es. 9x15)
Che io sappia, ci sono alcune font preinstallate sul server, ma quale font usare dipende poi dal client (o dall'utente tramite i file di risorse). Teoricamente uno potrebbe anche collegarsi ad altri font-server su altre macchine, ovviamente aggiungendo il search path appropriato.
se si riesce a compilare questo programma, si puo' provare ad aggiungere una font non standard.
Compila (con qualche piccola modifica) e funziona anche utilizzando i caratteri Bonzai.


Ok! Grazie mille Stan,
vogliamo provare a passare a prime_number il tuo listato modificato ?
vogliamo provare a passare a prime_number il tuo listato modificato ?
Certo, ecco il sorgente:
#include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xos.h> #include <X11/Xatom.h> #include <stdio.h> #define FONTNAME "-altsys-bonzai-medium-r-normal--0-270-0-0-p-0-ascii-0" Display *display; int screen_num; int main(argc, argv) int argc; char **argv; { Window win; unsigned int width = 300, height = 300; int x =0, y =0; unsigned int border_width = 4; unsigned int display_width, display_height; char *window_name = "I Love You X Window Program"; int count; XEvent report; GC gc; XFontStruct *font_info; char *display_name = NULL; unsigned long valuemask = 0; XGCValues values; char *fontname = FONTNAME; if ( (display=XOpenDisplay(display_name)) == NULL ) { (void) fprintf( stderr, "Cannot connect to X server %s\n", XDisplayName(display_name)); exit( -1 ); } screen_num = DefaultScreen(display); display_width = DisplayWidth(display, screen_num); display_height = DisplayHeight(display, screen_num); win = XCreateSimpleWindow(display, RootWindow(display,screen_num), x, y, width, height, border_width, BlackPixel(display, screen_num), WhitePixel(display,screen_num)); XSelectInput(display, win, ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask); if ((font_info = XLoadQueryFont(display,fontname)) == NULL) { (void) fprintf( stderr, "Cannot open %s font\n", FONTNAME); exit( -1 ); } gc = XCreateGC(display, win, valuemask, &values); XSetFont(display, gc, font_info->fid); XMapWindow(display, win); while (1) { int i; XNextEvent(display, &report); switch (report.type) { case Expose: if (report.xexpose.count != 0) break; for (i=0;i<3;i++) XDrawString(display, win, gc, (i+1)*20, (i+2)*20, "I love You!", strlen("I love You!")); break; case ConfigureNotify: width = report.xconfigure.width; height = report.xconfigure.height; break; case ButtonPress: case KeyPress: XUnloadFont(display, font_info->fid); XFreeGC(display, gc); XCloseDisplay(display); exit(1); default: break; } } return 0; }
Ragazzi mi dispiace di dovermi fare impazzire :s Ho copiato e incollato il codice, compilato e tutto, ma quando vado per eseguirlo mi dice che non può aprire il font.
Vi metto il codice del mio MakeFile, nel caso fosse un errore di linking
LIBX11DIR=/usr/X11R6/lib
OPTM = -O2 -fno-strength-reduce
CC = gcc
CDEB= -DDEBUG=0
SYS_LIBS = -lm -L$(LIBX11DIR) -lX11
LOCAL_LIBS = #
DBG =# -g
LDFLAGS = $(SYS_LIBS) $(LOCAL_LIBS)
all: love2.out
love2.out: love2.o
$(CC) -o love2.out love2.o $(LDFLAGS)
love2.o: love2.c
$(CC) -c love2.c
clean::
rm -f *.out *.o *.*~ *~ core
Dovrò rassegnarmi all'arial... NUUUUUUUUU :S
Altrimentii il mio sospetto è, come dicevo prima, che sia un problema di permessi, nel senso che ssendo in un laboratorio non posso modificare le impostazioni della X11 che è comune..
Paola
Vi metto il codice del mio MakeFile, nel caso fosse un errore di linking
LIBX11DIR=/usr/X11R6/lib
OPTM = -O2 -fno-strength-reduce
CC = gcc
CDEB= -DDEBUG=0
SYS_LIBS = -lm -L$(LIBX11DIR) -lX11
LOCAL_LIBS = #
DBG =# -g
LDFLAGS = $(SYS_LIBS) $(LOCAL_LIBS)
all: love2.out
love2.out: love2.o
$(CC) -o love2.out love2.o $(LDFLAGS)
love2.o: love2.c
$(CC) -c love2.c
clean::
rm -f *.out *.o *.*~ *~ core
Dovrò rassegnarmi all'arial... NUUUUUUUUU :S
Altrimentii il mio sospetto è, come dicevo prima, che sia un problema di permessi, nel senso che ssendo in un laboratorio non posso modificare le impostazioni della X11 che è comune..
Paola
Almeno e' assodato che non e' un problema causato dal tuo sorgente.
Hai provato con la font 9x15 ?
Hai provato con la font 9x15 ?
Penso che con 9x15 dovrebbe funzionare perché è un font di sistema (è un alias a un fixed).
Probabilmente le dà errore proprio perché non trova il font specificato.
Comunque non ci dovrebbero essere problemi ad "installarlo" eseguendo questi comandi all'interno della directory del font bonzai.
(attenzione agli accenti).
Se viene visualizzato il carattere basta allora sostituire nel programma il corrispondente nome o un suo alias e ricompilare.
Probabilmente le dà errore proprio perché non trova il font specificato.
Comunque non ci dovrebbero essere problemi ad "installarlo" eseguendo questi comandi all'interno della directory del font bonzai.
xset fp default && xset fp rehash xset fp+ \`pwd\` && xset fp rehash xfd \`grep -i -m 1 bonzai fonts.dir | cut -f 2 -d ' '\`
(attenzione agli accenti).
Se viene visualizzato il carattere basta allora sostituire nel programma il corrispondente nome o un suo alias e ricompilare.
Speriamo bene....
Ok ragazzi, dopo ci provo, grazie mille!! Poi vi so dire.. al momento sono impigliata nel backtracking!!! 
Paola

Paola