XLib programmering?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6889
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

XLib programmering?

Inlägg av Marta »

Har problem med att initiera ett program. XLib används direkt. Helt fritt från Qt, GTK och allt vad det nu heter.

Laddar en font med XLoadQueryFont. Vid första uppstart efter att datorn har varit avstängd så visas ingen text, men den kommer upp så snart något görs som får fönstret att ritas om. Därefter fungerar det följande gånger programmet startas. Verkar som jag borde göra något mer för att säkerställa så fonten är klar innan texten läggs ut, men vad?
Senast redigerad av Marta 10 januari 2017, 20:23:34, redigerad totalt 1 gång.
SvenW
Inlägg: 1116
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: Ladda font i XLib?

Inlägg av SvenW »

Vad kul att någon använder Xlib direkt!
Själv älskar jag att skriva i Xlib trots alla som påstår att man skall använda Qt, GTK+ eller
wxWidgets.

Men om man är relativt ny på Xlib, vilket du kanske inte är(?),
så kan det vara lite knepigt att exakt förstå vad som händer.
Problemen beskrivs här:
https://tronche.com/gui/x/xlib-tutorial/

Har du gjort XFlush, XMapWindow, satt StructureNotifyMask ?
Vilken händese (Event) får det hela att ske?

Är du med på allt detta?
Det tar lite tid att komma in X-lib, och innan vi diskuterar vidare så
är det bra om vi får veta var mer om var du står på X-trappan.
Med högaktning! SvenW
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6889
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Ladda font i XLib?

Inlägg av Marta »

Är väl egentligen ganska grön när det gäller X, men känner till allt det där med initiering av window.

Har inga explicit XFlush, det får XNextEvent hantera. Har en fullständig redraw på Expose och antog (farligt, farligt...) att X skickade detta event först när det var möjligt att verkställa. Lade till MapNotify för samma åtgärd och nu idag funkade första start helt OK. Löst eller inte svårt att säga.

Kanske fult och bättre vänta på MapNotify? Kan där vara pekare som "flyter" innan MapNotify har anlänt och risk för segfaults om programmet försöker skriva med XDrawImageString innan?

Är för övrigt XDrawImageString rätt val för att få ut text med solid bakgrund? Kanske hade varit rättare att använda XDrawString och rensa på annat sätt om nu X väntar med att skriva ut till grafikminnet tills allt är färdigt? Det skall givetvis vara flimmerfritt. Nu är det helt stabilt förutom då fönsterstorleken ändras, då flimrar det. Fult men helt ovidkommande för normal användning.
SvenW
Inlägg: 1116
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: Ladda font i XLib?

Inlägg av SvenW »

Börjar med att påminna om, även om du redan vet, att X-servern är ett separat program som tar meddelanden från Xlib och hanterar dem asynkront. Man kan missta sig på i vilken ordning saker sker.
Det är också många gånger svårt att läsa ut detta ur manualen.
Att ladda en font kan ta lite tid. Man kan laborera med XFlush, XSync() ...;

En font knyts till GC med t.ex. funktionerna XCreateGC() XLoadQueryFont() XSetFont()...

Använder man GC innan detta är klart kan jag tänka mig att det blir blankt utan att man får felmeddelande. Men det är inte den enda tänkbara förklaringen.

Exakt vad som krävs för att X-servern skall kunna generera Expose eller MapNotify är inte
helt lätt att veta. Men det kostar inte så mycket att knyta en callback till flera händelser.

En god idé är att filtrerat skriva ut alla events för att få se under vilka betingelse de kommer.
Finns också fristående program som xev eller xfontsel.

Observera också att ett event behöver släppas fram med:

XSelectInput (dpy, window, KeyPressMask |
ButtonPressMask | ButtonReleaseMask | PointerMotionMask |
ExposureMask | EnterWindowMask | StructureNotifyMask);

efter att fönstret skapats. create_simple_window (dpy, x, y, w, h);
---
För att få det flimmerfritt skriver man på en (eller ibland två) pixmappar som man sedan
lägger ut mha XCopyArea () i en callback vid lämpligt event.
Man skriver nästan aldrig på skärmen direkt!
Ett problem här är att om man gör det vid motion_event så blir det resurskrävande.
Men hur gör man annars figurer som följer musen?

Qt och Gtk+ är resursgrisar och de löser nog inte heller detta på ett särskilt effektivt sätt(?)
XDrawString() är nog rätt funktion för att skriva text.
---
Vet inte om denna diskussion är till hjälp, men i alla fall ett försök.
Det finns också en del tutorialer med exempel som man kan starta ifrån.
En rätt bra sådan är denna:
https://web.archive.org/web/20060923165 ... mming.html
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6889
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Ladda font i XLib?

Inlägg av Marta »

Tack för tipsen så här långt. Visst är de till hjälp, stor hjälp faktiskt. Har väldigt svårt att googla och få vettiga svar. Blir mest ovikdommande blaj som hittas...

Efter att ha lagt till MapNotify för att generera en redraw parallellt med Expose så försvann problemet med text som vägrade visa sig i vissa lägen.
XDrawImageString ser ut att vara det bästa alternativet i detta fall. Det visade sig vara tyngre att ha ett extra fönster som inte visas att kopiera från. Det finns inget synbart flimmer med nämnda funktion direkt på det synliga fönstret.

Nu till nästa stötesten... Copy/Paste till/från Clipboard. Det fungerar, men något saknas. Ihop med vissa program märks inget fel alls, men en paste i t.ex. Firefox på Googles homepage tar tid. Mitt program får ta emot ett antal SelectionRequest där TARGETS efterfrågas innan den vill ha ett eget Mozilla-format och först därefter UTF8_STRING som besvaras. Texten kommer upp i Firefox precis som den skall, men det har gått mycket märkbart lång tid. Allt utöver UTF8_STRING bara droppas utan åtgärd som det är nu.

Antar att TARGETS skall besvaras med en struktur som anger vad som är tillgängligt, men behöver detaljerna kring detta eller vad det nu är som förväntas ske i detta läge?
SvenW
Inlägg: 1116
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: XLib programmering?

Inlägg av SvenW »

Tyvärr måste jag nog passa här. Det känns lite som atomfysik.
Involverar mer än bara xlib.

En hel del finns nog här, om än inte så lättillgängligt:
https://www.x.org/docs/ICCCM/icccm.pdf
https://www.x.org/releases/X11R7.7/doc/ ... icccm.html

Det finns ett program xsel som du kan prova:
http://www.vergenet.net/~conrad/software/xsel/
Källkoden kan man också ladda ner och titta i.
Skriv svar