[C] Affichage "plein ecran" en mode console

Salut,
Je voudrai savoir le nom du principe qui permet en C d’avoir une appli qui prenne toute la fenetre, comme par exemple emacs en mode pas X. ya plein d’applis qui fonctionent comme ca :
lynx, emacs, more, man, vi, mc…

Et j’aimerai savoir si c’est possible de diviser differante zone de l’appli, et faire un petit client interface IRC.
Il y aurai 3 parties : prompt /affichage des message /liste client.
J’aimerai savoir si on peux diviser ça en 3 thread. et que chaques tread puisse modifier ou lire une zone de cette ecran.

Merci

Tu veux dire faire une IHM en mode texte avec ncurses ?

juste pour ajouter un ptit grain de sel,
je plussoie ncurses, utilisée pour wget, bitchx et d’autres trucs assez nuls comme mutt :stuck_out_tongue:
bref ça poutre.
quelques liens à suivre de cette page.
bon perso j’ai essayé un jour de compiler le hello world a la ncurses et ça n’a jamais marché malgré l’installation a prioris fructueuse de la lib … :stuck_out_tongue:

ncurses ??? IHM ???
wget ca fait pas du tout le truc que je demande ? (c’est normal ?)

ncurses est la librairie utilisée pour faire des applications commes celles que tu cite.
parmis les logiciels développés a l’aide de cette lib, on cite : mutt, wget etc …
ça a pour particularité de pouvoir “raffraichir” l’'écean (cf les ptites fleches dans wget, ou le texte dans bitchx, le défilement et l’ouverture des mails dans mutt)
</grain de sel>

j’ai été plus clair ?

ncurses c’est la lib qui permet de faire ce que tu demandes, et ça marche avec le C.

Interface Homme Machine : nom générique donné aux interfaces des softs.

Oui, c’est un exemple d’utilisation de ncurses. Comme Mutt un lecteur de mail, fser a cité quelques exemples.

Edit: mon quote

wget utilise ncurses pour pouvoir raffraichir la progression des téléchargements sans faire défiler tout l’écran.
Pour faire une appli console en fullscreen, il faut utiliser les variables COLUMNS et LINES du shell.
ncurses te facilite le travail en te fournissant un pseudo graphique, et une gestion un peu plus pratique des couleurs, du clavier et de tout ca…
L’utilisation la plus flagrante de ncurses, c’est les vieux gestionnaires d’install (ceux en bleu et jaune).
pour ce qui est du multithread, normalement, y a pas de soucis

Ok merci pour tout,
J’ai plus qu’a me mettre a coder

hf

Encore merci, c’est vraiment bien foutu mais j’ai quelque probleme.

[s]Le prompt en bas doit toujours garder le curseur sur lui quoi qu’il arrive et ma fonction affichage_message appelée par un thread prend le curseur pour lui (normal).

Y a t’il un moyen d’avoir 2 curseurs ? pour quand je tape un message en bas je ne sois pas coupé par l’autre thread.[/s]

Je poste si ca peut interesser quelqu’un.

[code]#include <ncurses.h> /* ncurses.h includes stdio.h */
#include <string.h>
#include <stdlib.h>
#include <pthread.h>

/* gcc -lncurses -lpthread ncurses.c */

//row l
//col h
void disp_prompt();
void disp_line();
void ajouter_message(char* mess);
void init_tab_message(int r,int c);
void * afficher_message(void *arg);

int nb_message = 0;
char **tab_message;
int col;
int row;

int main(){
/-------------------- INIT ---------------------------/
char prompt[]="?: "; /* message du prompt /
char str[80];
int temp_row,temp_col,i;
initscr(); /
demarre curses mode */
getmaxyx(stdscr,temp_row,temp_col);
row=temp_row;
col=temp_col;

init_tab_message(row-2,col-16);	
/*-------------------- MESSAGE ---------------------------*/

int n;
pthread_t tid;
if(( n = pthread_create(&tid, NULL, afficher_message, NULL))!=0){
perror ("pthread_create");
exit(1);
}

/*---------------------INTERFACE-----------------------------*/

disp_line(row,col);

/*---------------------PROMPT-----------------------------*/
while(1){	
	disp_prompt(row,col);
	getstr(str);
	ajouter_message(str);
}

/*---------------------LISTE UTILISATEUR---------------------*/

//getch();
//endwin();

return 0;
}

void disp_prompt(){
char prompt[]="?: "; /* message devant le prompt /
move(row-1,0);
clrtoeol();
printw("%s",prompt); /
affiche prompt */
}

void disp_line(){
move(row -2 ,0);
hline(ACS_HLINE,col);
move(0,col-16);
vline(ACS_VLINE,row-2);
}

void ajouter_message(char* mess){
mvprintw(0, col - 15, “mess:%d row:%d”,nb_message,row);
if(nb_message<row-3){
strcpy(tab_message[nb_message],mess);
nb_message++;
}else{
/* on decale tout /
int i;
for(i=0;i<nb_message-1;i++){
strcpy(tab_message[i],tab_message[i+1]);
}
strcpy(tab_message[nb_message-1],mess);
}
}
void init_tab_message(int r,int c){
int i;
tab_message = malloc(r
sizeof(char*));
for(i=0;i<=r;i++){
tab_message[i] = malloc(c*sizeof(char));
}
}

void * afficher_message(void *arg){
int i;
WINDOW *messwin;
messwin = newwin(row-2, col-16 , 0, 0);
char clear[] = " ";
while(1){
wrefresh(messwin);
for(i=0;i<nb_message;i++){
mvwprintw(messwin,i, 0,clear);
mvwprintw(messwin,i, 0,tab_message[i]);
}

}

}[/code]