[C] Linux, Ncurses, Xterm resize probleem.

Pagina: 1
Acties:

  • Defspace
  • Registratie: Mei 2000
  • Laatst online: 27-08 11:17

Defspace

Administrator

Topicstarter
Ik zit een beetje met het volgende.
En vroeg me af of er enkele van jullie ervaring hadden met applicaties schijven onder Linux in C(++) gebruik makend van de Ncurses library.

Ik ben dus bezig met een applicatie welke dynamisch resized in een Xterminal. (xterm, maar ook putty for windows etc.).
Ik maak gebruik van een SIGWINCH signal handler om in de gaten te houden of de terminal van grote veranderd en vraag dan via ioctl de nieuwe Lines en columns waarden op.

Nu is het geval dat je een programma welke gebruikt maakt van Ncurses initialiseerd door de aanroep:

initscr();

En in de handleiding staat ongeveer het volgende (kan het ff niet vinden)
"A well written program that uses ncurses only calls initscr(); once."

Maar nu is het zo dat Initscr(); de waardes van de lines en cols vastlegt voor de overige functies om daar gebruik van te maken. Dus wanneer ik een Window creer die buiten de lines en columns liggen van de oorspronkelijke Initscr waardes, dit niet goed gaat.
Dus stel ik heb mijn Xterm op 100 cols en 50 lines staan ik start het programma op en ik maximize mijn xterm naar zeg 150 cols en 80 lines de creatie van het window "out of range" ligt.

Ik heb dit voorlopig even opgelost door de oorspronkelijke waardes van de xterm op te slaan en een window niet groter te maken dan de oorspronkelijke waardes. Maar ik zou eigenlijk wel gewoon gebruik willen maken van de volledige beschikbare ruimte ook wanneer je je xterm maximized. (zeker wanneer je het programma dus maar opstart met 30 cols en 10 lines ofzo.)

Nu is mijn vraag of iemand functies kent waardoor ik dit toch mogelijk kan maken.
Of dat jullie zeggen dat ik gewoon iedere resize een endwin call moet doen en een nieuwe initscr();

Thx.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Klinkt alsof je idd iedere keer bij een resize die InitScr moet aanroepen... klinkt ook niet al te onlogisch overigens.

Is er geen 'UpdateScreenSize' functie oid?

Professionele website nodig?


Verwijderd

Gewoon nieuwe initscr(), ik zie het probleem d'r niet van in. Immers, als je dat niet doet kun je niet volledig gebruik maken van de mogelijkheden van je omgeving, door een design bug in ncurses, en dus heb je weinig keuze.

(of je kunt eens kijken hoe andere programma's dit doen).

Verwijderd

man resizeterm ;)

  • Defspace
  • Registratie: Mei 2000
  • Laatst online: 27-08 11:17

Defspace

Administrator

Topicstarter
Hehe.. Thnx..
Daar heb ik toch gewoon al 10 keer overheen gelezen :o
Kan het nu niet proberen zit op me werk.
Maar ik neem aan dat ik daarmee wel verder kom.

  • Defspace
  • Registratie: Mei 2000
  • Laatst online: 27-08 11:17

Defspace

Administrator

Topicstarter
Mietje bedankt!
Dat was hem :)

Verwijderd

Nog een tip: volg de manual en guard je calls naar malloc()/realloc() cq. new als je resizeterm() vanuit de signal handler aanroept; maw. zorg dat SIGWINCH geblocked is tijdens het alloceren van geheugen. Het staat niet al te duidelijk in de manual, dus ik zeg maar even hoe :)

  • Defspace
  • Registratie: Mei 2000
  • Laatst online: 27-08 11:17

Defspace

Administrator

Topicstarter
Ja ik had zoiets gelezen in de man page.
Ik krijg anders zeker die mooie melding: Segmentation fault.

Daar zit ik wel een beetje mee. Het is een multi-threaded app waar ik mee bezig ben en je weet nooit wanneer een gebruiker gaat resizen. Dus ik denk dat ik maar een variabele ga zetten tijdens mijn mallocs/reallocs en eentje die bijhoud of sigwinch is aangeroepen maar er geen resize heeft plaatsgevonden ?
Om hem zo na mijn mallocs/reallocs alsnog te resizen ?

Dan moet het wel goed gaan toch ?

Verwijderd

Je hebt twee opties:
1) Je haalt je resizeterm uit de signal handler. Je moet dan alleen een globaal leesbare vlag true zetten in de handler, en in je hoofdroutine doe je de resize. Nadeel: als de hoofdroutine de vlag niet regelmatig genoeg checked komt de resize "hakkelig" op de gebruiker over.
2) Je blockt het SIGWINCH signaal met sigprocmask() voordat je een geheugenallocatie doet, en meteen na de allocatie unblock je het weer. Je moet er dan wel op letten dat je ook blockt wanneer je een library-functie gebruikt die geheugen alloceert.

Ik zou zeggen, ga voor optie 2) ;)
Pagina: 1