od 20020627 ekg jest przygotowane do obsługi różnych interfejsów użytkownika.
przeprowadzono całkiem sporą reorganizację kodu, dzięki czemu nie trzeba
będzie psuć zbyt dużo, żeby dodać jakikolwiek inny frontend.

jeśli ktoś chce napisać własny interfejs (chociażby w gtk+, chociaż nie
wiadomo po co, skoro jest GNU Gadu -- http://gadu.gnu.pl/), musi napisać
ui-costam.c, zawierający poniżej podane funkcje i dopisać parę linijek
do ekg.c.

ui_costam_init()
	inicjalizacja interfejsu użytkownika. dla ui-readline będzie to
	ustawienie wszystkich zmiennych. dla ui-ncurses pewnie jakieś
	initscr(), przygotowanie okienek itd. należy przypisać zmiennym
	ui_post_init, ui_deinit, ui_print, ui_event, ui_loop, ui_beep
	adresy funkcji danego interfejsu. nawet jeśli funkcja nic nie robi,
	musi być zdefiniowana. zmiennym tym NIE WOLNO przypisać wartości
	NULL. należy też utrzymywać w zmiennych ui_screen_width oraz
	ui_screen_height aktualny rozmiar ekranu.

ui_post_init()
	funkcja wywoływana po wczytaniu konfiguracji.

ui_deinit()
	pozamykanie wszystkiego.

ui_print(const char *target, int separate, const char *line)
	wyświetlenie tekstu ,,line'' w oknie ,,target''. przewidziano
	trzy specjalne okna -- ,,__status'' dla pierwszego okna statusowego,
	,,__current'' dla aktualnego oraz ,,__debug'' dla okna z komunikatami
	dla developerów. parametr ,,separate'' mówi, czy wyświetlany tekst
	jest na	tyle ważny, żeby otwierać nowe okno -- np. wiadomość. do
	pierwszego powinny być wysyłane	informacje dotyczące stanu
	połączenia itd, itd, do aktualnego wszystko to, co jest związane
	z komendami wywoływanymi przez użytkownika.

ui_beep()
	dźwięk. niestety to, jak go wytworzyć zależy od interfejsu. przy
	użyciu ncurses zwykłe putchar('\a') nie zadziała.

ui_event(const char *event, ...)
	interfejs użytkownika może obsługiwać pewne zdarzenia:
	- "command" (char *cmd, ...) użytkownik wykonał komendę, aktualnie
	  obsługiwana to "query".
	- "my_status" (char *status, char *reason) użytkownik zmienił
	  stan na "away", "back", "invisible", "private_on", "private_off".
	- "my_status_raw" (int status, char *reason) użytkownik zmienił
	  stan, podawany w liczbach rozumianych przez protokół.
	- "connecting" () klient próbuje się łączyć.
	- "connected" () klient połączył się.
	- "disconnected" () klient rozłączył się lub został rozłączony.

ui_loop()
	główna pętla interfejsu, wywoływana zaraz po włączeniu klienta.
	powinna wywołać ekg_wait_for_key() przed wywołaniem funkcji
	czytającej z klawiatury, by w przerwach móc obsługiwać połączenia
	sieciowe. gdy użytkownik wyda jakąś komendę, powinna wywołać
	command_exec().

$Id: ui.txt 1932 2003-04-12 12:13:09Z szalik $
