Récupérer couleur console [Résolu]

cs_christophedlr 257 Messages postés samedi 3 janvier 2004Date d'inscription 30 mai 2016 Dernière intervention - 8 janv. 2010 à 22:50 - Dernière réponse : cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscription 18 avril 2018 Dernière intervention
- 9 janv. 2010 à 11:52
Bonsoir,

Alors je commence par expliquer mon projet.
Je suis entrain de programmer un bot pour le jeu OpenTTD.
Le bot est fait en deux parties :
- La première, c'est qu'il y a pas d'interface graphique, ont commande via la console.
- La seconde, une fois que le bot à rejoins la partie, avec un mot de passe définis afin que des personnes malintentionnés ne s'amusent pas avec lui, il sera capable d'obéir à certaines commandes.

J'en viens à se qui me préoccupe à savoir la partie console.
Le bot est développé sous Linux mais fonctionnera sous Linux et Windows (pour Mac, ne l'ayant pas sous la main, je ne pourrais pas voir si des choses sont à changé pour que ca fonctionne dessus).

Il est possible de personnaliser les messages affiché au sein de la console afin de rendre plus attrayant les informations.
Pour cela, je dois changer la couleur de la console, ça il y a aucun soucis.

Je voudrais savoir si il est possible sous Windows et sous Linux, de récupérer la couleur de texte et couleur de fond.
Ça permettrait, si la console est sur fond rouge pas exemple, que ca reste en rouge (sauf info contraire bien sur ;)), ainsi ont garde l'homogénéité.


Merci d'avance pour votre aide.

P.S. : Pour Linux, j'utilise : cout << "\033[" << "couleur" << "le texte" << "m" ce qui fonctionne parfaitement que se soit la couleur ou le fond.
Afficher la suite 

8 réponses

Répondre au sujet
cs_christophedlr 257 Messages postés samedi 3 janvier 2004Date d'inscription 30 mai 2016 Dernière intervention - 9 janv. 2010 à 11:47
+3
Utile
Je me permet de reposter un message.
J'ai trouvé la solution au problème, en fait il suffit de mettre \033[m pour ne rien touché.
Si je veux mettre un fond et pas toucher à la couleur du texte, je met : \033[41m pour du rouge par exemple, et inversement pour le texte : \033[31m toujours pour du rouge .

Moi je faisais cela : \033[31;0m pour mettre du rouge pour le texte et pas de fond modifié, ça ne fonctionnait pas ca je modifiais explicitement les deux composantes.

Maintenant c'est bon, plus de soucis sur cela, j'ai testé avec gnome-terminal, Konsole et directement en console tty, ça marche parfaitement (mais comme shell j'ai bash, pas tenter avec sh, emacs shell et d'autres shell, mais déjà pour bash ça fonctionne et c'est ce que je voulais ).

J'ai même trouver les valeurs pour mettre en gras, souligné ou encore en clignotant
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_christophedlr
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscription 18 avril 2018 Dernière intervention - 8 janv. 2010 à 23:17
0
Utile
cout

Utilise plutôt std::cout, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace

"\033["

Attention c'est un échappement de terminal qui active une couleur, ce n'est pas du C++. Ca veut dire que ça ne fonctionnera pas partout. En fonction du terminal, ça peut donner un résultat inattendu. Je doute de son efficacité sous le terminal fournit avec Windows ou avec certains terminaux Unix...

Je voudrais savoir si il est possible sous Windows et sous Linux, de récupérer la couleur de texte et couleur de fond.

Quel type de terminal ? Ca implique aussi de détecter le type de terminal. Je ne suis pas sur que ce soit possible de faire tout ce que demandes. C'est en tout cas très compliqué pour ce que tu vas y gagner :)

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Commenter la réponse de cptpingu
cs_christophedlr 257 Messages postés samedi 3 janvier 2004Date d'inscription 30 mai 2016 Dernière intervention - 8 janv. 2010 à 23:31
0
Utile
Bonsoir,

Merci d'abord de prendre le temps de répondre.
Alors commençons avec ton lien pour le using namespace std; que tu es le seul à me dire qu'il faut pas l'utiliser.
Par rapport à cela, je connais les danger et je n'utilise aucun nom de fonction ou de librairie pouvant actuellement entrer en conflit avec la std, donc de ce coté là pour le moment le using namespace std; ne pose pas de soucis, bien évidemment si j'utilise une librairie ensuite, je passerais au std:: et le using namespace de la lib en question (pour plus de clarté).

Ensuite, pour l'échappement, ca fonctionne que sous Linux (Mac je sais pas, l'article sur siteduzero.com ne parle que de Linux).
Ensuite, ca fonctionne pour tous les terminaux Linux (en tous cas j'ai tenté Konsole, Terminal et même directement en console sans en ouvrir une dans KDE/Gnome).
Donc à priori pas de blem de ce coté-ci.

Pour Windows, il n'y à qu'un seul et unique terminal, donc pas de problème pour lui.
En revanche pour Linux, ca à l'air de fonctionner pareil les uns et les autres (ne fournissant finalement qu'une interface au bash en fait qui est basé sur sh si j'ai bien compris), donc je suppose que la même façon de faire fonctionnerait dans tous les sens.

Je me doute que se sera très compliqué, mais je souhaite faire un truc qui soit joie esthétiquement.

Après, il est prévus pour interface GUI pour plus tard (en QT), mais actuellement je table sur la console (car pas l'habitude de faire du mode console, je fais surtout du GUI, donc là je veux apprendre des trucs sur la console ).

Pour le terminal, j'ai tenté Konsole (KDE) et Terminal (Gnome), si tu as une piste pour au moins un des deux, histoires de voir un peu comment faire et vers quoi chercher.


Merci en tous cas de chercher à m'aider.
Commenter la réponse de cs_christophedlr
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscription 18 avril 2018 Dernière intervention - 9 janv. 2010 à 00:03
0
Utile
Alors commençons avec ton lien pour le using namespace std; que tu es le seul à me dire qu'il faut pas l'utiliser.

C'est pourtant très connu:
http://www.parashift.com/c++-faq-lite/coding-standards.html#faq-27.5


Par rapport à cela, je connais les danger et je n'utilise aucun nom de fonction ou de librairie pouvant actuellement entrer en conflit avec la std,

Bibliothèque, pas librairie (libraire étant un grossière erreur de traduction du mot library).
Tu n'as jamais appelé une fonction count ? Parce que std::count existe !
Tu peux prévoir à l'avance ce qui va être ajouté dans std:: pour le prochain standard ? Utilise au moins des using simples... Je ne réexpliquerais pas mes arguments, j'ai écrit cet article pour éviter de me répéter.

Ensuite, ca fonctionne pour tous les terminaux Linux

Tous shell qui n'est pas conforme ANSI ne le fera pas.
Le premier exemple qui me vient en tête est le emacs shell:

emacs /tmp
M-x shell
Welcome to the Emacs shell

/tmp $ ./pouet.sh 
 pouet 
/tmp $ 


Pour le terminal, j'ai tenté Konsole (KDE) et Terminal (Gnome), si tu as une piste pour au moins un des deux, histoires de voir un peu comment faire et vers quoi chercher.

D'une part, je ne sais pas si c'est possible, d'autre part, tu risques d'avoir à gérer plein de terminaux différents. Ca te coûtera moins cher en terme de temps et d'investissement de passer directement via une appli graphique (Qt via QtCreator, ça devrait pas être si long que ça :p).

Sinon, peut être essayer de récupérer une variable d'environnement, mais il est pas dit qu'il y en ait une. En tout cas je n'en vois aucune en rapport chez moi via la commande "export".

Si tu trouves quelque chose, n'hésite pas à le poster :).

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Commenter la réponse de cptpingu
cs_christophedlr 257 Messages postés samedi 3 janvier 2004Date d'inscription 30 mai 2016 Dernière intervention - 9 janv. 2010 à 01:03
0
Utile
Le problème du GUI c'est que les serveurs sont souvent sans Xorg, donc ça coince.
Là tu m'as pris l'exemple du Emacs Shell, mais qui sur son serveur va manuellement lancer Emacs Shell ?

Je veux dire, il est plus courant de retrouver le bash comme shell que emacs, efin c'est en tous cas mes constations.

Pour les terminaux, Konsole et Terminal (pour citer deux bien connus et seuls que je connais mdr), se sont des interfaces graphiques seulement.
Si tu regardes le fichier de conf de ton compte ($HOME/.bashrc il me semble), souvent c'est le shell bash qui est utilisé et rétro-compatible avec sh il me semble (sur lequel il est basé).
Donc c'est une histoire de shell à gérer, pas de terminaux.

Hors le plus courant des shell est bash, donc si je trouve pour sh ou bash ça va très bien.
Commenter la réponse de cs_christophedlr
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscription 18 avril 2018 Dernière intervention - 9 janv. 2010 à 01:20
0
Utile
Je veux dire, il est plus courant de retrouver le bash comme shell que emacs, efin c'est en tous cas mes constations.

Je ne dis pas que ça ne fonctionnera pas, je te dis que ça ne fonctionnera pas dans tous les cas. Si exclure une minorité d'utilisateur ne te gène pas, il n'y a pas de problème (ce n'est pas un reproche, il n'existe pas de solution réellement portable de toute façon).

Je veux dire, il est plus courant de retrouver le bash comme shell que emacs, efin c'est en tous cas mes constations.

Le plus courant est sh (notamment sur des serveurs).
Bash est utilisé parce que mis par défaut de beaucoup de distribution.
zsh est sans doute le plus avancé et est très utilisé (de loin le meilleur shell existant).

Donc c'est une histoire de shell à gérer, pas de terminaux.

Il faut que le terminal gère la couleur ainsi que le shell. Donc c'est en fonction des deux. Evidemment, un terminal qui ne gère pas la couleur n'est plus utilisé. Les trois shells les plus utilisés ont la couleur.
Si tu comptes rechercher dans les fichiers de conf, bonne chance, parce que tu ne peux absolument pas savoir ou l'utilisateur à positionné les couleurs de fonds (on peut morceler les fichiers de conf en plusieurs fichiers).

Pour gnome-terminal, on peut choisir la couleur via le menu.
Donc tu peux surement choisir la couleur et la récupérer via l'outil gconf de gnome.

#Mettre en noir
gconftool-2 --set "/apps/gnome-terminal/profiles/Default/background_color" --type string "#000000"


#Récupérer couleur
gconftool-2 --get "/apps/gnome-terminal/profiles/Default/background_color"


Pas super portable, certe, mais ça devrait fonctionner (pour Gnome).

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Commenter la réponse de cptpingu
cs_christophedlr 257 Messages postés samedi 3 janvier 2004Date d'inscription 30 mai 2016 Dernière intervention - 9 janv. 2010 à 10:53
0
Utile
Merci de cette information pour gnome-terminal, ça fait déjà une chose que je peux éventuellement gérer directement.

Pour ce qui est de l'exclusion d'utilisateurs, actuellement le bot ne serais utilisé que par moi même et éventuellement les deux administrateurs des deux serveurs officielles de notre communauté (communauté francophone officielle en plus ).
Pour la première version cela n'est absolument pas gênant, pour les versions suivantes, oui il faudrait éventuellement que je gère tous les shells et terminaux graphiques (bien que si je gère le shell utilisé par le terminal, plus besoin de voir pour celui-ci vu que c'est une commande de toute façon qu'il envoi au shell normalement).

Mais bon, déjà pour gnome-terminal c'est super, merci beaucoup.

Pour les fichiers de conf, je disais pas d'aller farfouiller dedans, mais je disais que en fait ce sont pas Konsole et gnome-terminal (par exemple) qui font la console, mais qu'ils sont juste une interface au shell mis par défaut dans $HOME/.bashrc
Commenter la réponse de cs_christophedlr
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscription 18 avril 2018 Dernière intervention - 9 janv. 2010 à 11:52
0
Utile
Effectivement, je n'avais pas fait attention à cela !

Une solution à laquelle j'ai pensé qui peut satisfaire tous le monde: mets des couleurs par défauts, mais laisse une option pour que l'utilisateur puisse les désactiver. Tu es sur que tous les cas seront gérés !

C'est bien d'avoir mis à jour ton problème, ça pourra servir pour d'autre. Si tout va bien, pense à valider la réponse :)

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Commenter la réponse de cptpingu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.