<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - gerald3d</title>
		<link>https://www.developpez.net/forums/blogs/219706-gerald3d/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Sat, 11 Apr 2026 05:51:25 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - gerald3d</title>
			<link>https://www.developpez.net/forums/blogs/219706-gerald3d/</link>
		</image>
		<item>
			<title>Utilisation de Gtk+ avec Code::Blocks sous Window 10</title>
			<link>https://www.developpez.net/forums/blogs/219706-gerald3d/b10168/utilisation-gtkp-code-blocks-sous-window-10/</link>
			<pubDate>Wed, 25 Aug 2021 14:56:07 GMT</pubDate>
			<description>---Citation (Envoyé par...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				<div class="bbcode_postedby">
					<img src="https://forum.developpez.be/images/misc/quote_icon.png" alt="Citation" /> Envoyé par <strong>gerald3d</strong>
					<a href="showthread.php?p=11756502#post11756502" rel="nofollow"><img class="inlineimg" src="https://forum.developpez.be/images/buttons/viewpost-right.png" alt="Voir le message" /></a>
				</div>
				<div class="message">Bonjour.<br />
<br />
A force de voir des étudiants sous Windows utiliser Gtk+2 parce qu'ils ne trouvent/comprennent pas comment utiliser Gtk+3 voir Gtk+4 je me lance ici dans un petit tuto. Je vous avoue faire un effort. Windows 10 n'est pas mon système d'exploitation préféré :D.<br />
<br />
En préambule je précise qu'aucune installation d'un système de compilation n'a été faite.<br />
<br />
Pour commencer l'équipe de Gtk+ met à notre disposition une page dédiée à l'installation sous Windows : <a href="https://www.gtk.org/docs/installations/windows/" target="_blank">https://www.gtk.org/docs/installations/windows/</a>. Autant s'en servir.<br />
<br />
<b><u><font size="5">Installation de <a href="https://www.msys2.org/" target="_blank">MSYS2</a>:</font></u></b><br />
<br />
J'ai téléchargé MSYS2 (msys2-x86_64-20210725.exe) puis installé en laissant tous les champs tels qu'ils étaient présentés. L'installation c'est donc effectuée dans c:\msys64.<br />
Après l'installation le lancement du shell n'a posé aucun problème. J'ai tout de suite mis à jour comme précisé sur la page officielle de MSYS2 avec la commande &quot;<i><b>pacman -Syu</b></i>&quot;.<br />
<br />
Une fois l'installation des mises à jour effectuée je suis passé à la phase 2. J'ai lancé la commande &quot;<b><i>pacman -S --needed base-devel mingw-w64-x86_64-toolchain</i></b>&quot; comme toujours indiqué par le site officiel. Cette commande me propose de choisir entre différents outils de compilation. N'étant pas avare d'outils je décide de les installer tous. :D (~200Mo à télécharger).<br />
<br />
<b><u><font size="5">Installation des bibliothèques Gtk+</font></u></b><br />
<br />
Maintenant que MSYS2 intègre tous les outils nécessaires à une compilation, je reviens sur la page de Gtk+ qui m'indique comment les installer en tapant la commande &quot;<b><i>pacman -S mingw-w64-x86_64-gtk3</i></b>&quot; puis &quot;<b><i>pacman -S mingw-w64-x86_64-glade</i></b>&quot; pour celles et ceux qui désirent construire leur interface façon &quot;wysiwyg&quot;. D'autres installations sont proposées pour Python.<br />
<br />
<b><u><font size="5">Code::Blocks</font></u></b><br />
<br />
Maintenant il ne me reste plus qu'à installer la dernière mouture de <a href="https://www.codeblocks.org/downloads/" target="_blank">Code::Blocks</a> v20.03. Je l'installe et le lance illico.<br />
<br />
Les ennuis commencent ici. Une première fenêtre apparaît pour me signifier qu'aucun compilateur n'a été trouvé ! C'est un comble, MSYS2 s'en est justement occupé. Passons cette fenêtre pour arriver sur l'interface principale. On va aller fouiller dans les menus de configuration pour voir comment spécifier un compilateur.<br />
<br />
<b><u><font size="5">Spécifier le compilateur :</font></u></b><br />
<br />
Il faut ouvrir la fenêtre depuis le menu &quot;<b><i>Settings-&gt;Compiler</i></b>&quot;. Dans cette fenêtre il y a différents onglets dont &quot;<b><i>Toolchain executables</i></b>&quot;. Cliquez dessus.<br />
Il faut spécifier le répertoire où se trouve les outils de compilation dans &quot;<b><i>Compiler's installation directory</i></b>&quot;. Pour ma part, comme je n'ai rien changé lors de l'installation je spécifie &quot;<b><i>C:\msys64\mingw64\bin</i></b>&quot;. Ce répertoire est important pour l'utilisation de Gtk+ aussi.<br />
Ensuite en dessous choisissez de nouveau le même répertoire pour la ligne correspondante à gcc. Vous pouvez répétez l'opération pour les autres outils de compilation si vous deviez les utiliser.<br />
<br />
Maintenant Code::Blocks peut compiler. C'est déjà çà ;).<br />
<br />
<b><u><font size="5">Compiler une application Gtk+ :</font></u></b><br />
<br />
Passons maintenant à l'étape finale. Compiler une application Gtk+.<br />
<br />
Histoire de voir ce que ca donne je crée un nouveau projet Gtk+ puisque Code::Blocks me le propose.<br />
Une première fenêtre me demande le nom du projet puis une seconde me demande où est situé Gtk+. Cette fenêtre nous aide à choisir en nous disant que c'est le répertoire qui contient le répertoire &quot;include&quot; et le répertoire &quot;lib&quot; dans lesquels il y a Gtk+. Chez moi c'est ici &quot;<b><i>C:\msys64\mingw64</i></b>&quot;. Je sélectionne donc ce chemin. Mais malheureusement il n'en veut pas. :oops:<br />
<br />
Tant pis, on va faire autrement. On va configurer Code::Blocks de manière à ce qu'il intègre directement les bibliothèques Gtk+.<br />
<br />
<b><u><font size="5">Configurer Code::Blocks pour utiliser Gtk+ :</font></u></b><br />
<br />
On ouvre à nouveau la fenêtre &quot;<b><i>compiler settings</i></b>&quot;. L'onglet &quot;<b><i>compiler flags</i></b>&quot; sélectionné en dessous il y a une rangée d'onglets. Sélectionnez l'onglet &quot;<b><i>Other compiler options</i></b>&quot;. Dans la <b><u>partie gauche</u></b> copiez la ligne suivante :<br />
<br />
`pkg-config gtk+-3.0 --cflags`<br />
<br />
:alerte:ATTENTION :alerte: : les apostrophes n'en sont pas. C'est la combinaison ALT + 7. Ils sont nécessaires.<br />
<br />
Dans l'onglet &quot;Linker settings&quot; copiez la ligne suivante dans la <b><u>partie droite</u></b>.<br />
<br />
`pkg-config gtk+-3.0 --libs`<br />
<br />
:alerte:ATTENTION :alerte: : les apostrophes n'en sont pas. C'est la combinaison ALT + 7. Ils sont nécessaires.<br />
<br />
Validez en fermant la fenêtre.<br />
<br />
Premiers tests :<br />
<br />
Créez un projet en console. Choisissez le langage C. Dans le fichier source main.c remplacez le code source par celui-ci et tentez une compilation :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td valign="top"><pre style="margin: 0">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &quot;gtk/gtk.h&quot;

int main(gint argc, gchar **argv)
{
    gtk_init (&amp;argc, &amp;argv);

    GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    g_signal_connect (G_OBJECT (window), &quot;destroy&quot;, G_CALLBACK (gtk_main_quit), NULL);

    gtk_widget_show_all (window);

    gtk_main ();

    return 0;
}</pre></td></tr></table></pre>
</div>La compilation et l'exécution devrait fonctionner.</div>
			
		</div>
	</div>
</div></blockquote>

]]></content:encoded>
			<dc:creator>gerald3d</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/219706-gerald3d/b10168/utilisation-gtkp-code-blocks-sous-window-10/</guid>
		</item>
		<item>
			<title><![CDATA[[Gtk+] Accéder à un pointeur d'un widget en tout point d'un programme]]></title>
			<link>https://www.developpez.net/forums/blogs/219706-gerald3d/b4527/gtkp-acceder-pointeur-d-widget-point-d-programme/</link>
			<pubDate>Fri, 12 Jan 2018 11:00:05 GMT</pubDate>
			<description>Je profite de la brèche...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Je profite de la brèche ouverte par <b>liberforce</b> au sujet de Glade. Je me suis dit qu'il serait possible à moindre coût de trouver une solution intermédiaire  pour celles et ceux qui désirent construire leur interface par le code source et accéder à tous les widgets en tout point de leur programme sans variables déclarées en global. Cette dernière phrase est un peu longue, j'en conviens :). Je vais la disséquer.<br />
<br />
Je reprends ici une partie du code de <b><i>vergifac</i></b> pour la création de la fenêtre principale. Tout d'abord quelques pointeurs sont déclarés en <b>static</b> et en dehors de toute fonction (déclaration en global).<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">static</span> GtkWidget *boutsfac;
<span style="color: #0000ff;">static</span> GtkWidget *boutsfcli;
<span style="color: #0000ff;">static</span> GtkWidget *boutsprod;
<span style="color: #0000ff;">static</span> GtkWidget *boutliprod;
<span style="color: #0000ff;">static</span> GtkWidget *boutopen;
<span style="color: #0000ff;">static</span> GtkWidget *boutlicli;
<span style="color: #0000ff;">static</span> GtkWidget *labdb;</pre></td></tr></table></pre>
</div><br />
Ces pointeurs sont utilisés pour pouvoir dans deux fonctions rendre sensible ou insensible à la souris les widgets associées.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">void</span> deactiv_bmenu<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#123;</span>
 gtk_widget_set_sensitive<span style="color: black;">&#40;</span>boutsfac,<span style="color: #0080ff;">FALSE</span><span style="color: black;">&#41;</span>;
 gtk_widget_set_sensitive<span style="color: black;">&#40;</span>boutlicli,<span style="color: #0080ff;">FALSE</span><span style="color: black;">&#41;</span>;
 gtk_widget_set_sensitive<span style="color: black;">&#40;</span>boutsfcli,<span style="color: #0080ff;">FALSE</span><span style="color: black;">&#41;</span>;
 gtk_widget_set_sensitive<span style="color: black;">&#40;</span>boutsprod,<span style="color: #0080ff;">FALSE</span><span style="color: black;">&#41;</span>;
 gtk_widget_set_sensitive<span style="color: black;">&#40;</span>boutliprod,<span style="color: #0080ff;">FALSE</span><span style="color: black;">&#41;</span>;
 gtk_widget_set_sensitive<span style="color: black;">&#40;</span>cbparam,<span style="color: #0080ff;">FALSE</span><span style="color: black;">&#41;</span>;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> activ_bmenu<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#123;</span>
 gtk_widget_set_sensitive<span style="color: black;">&#40;</span>boutsfac,<span style="color: #0080ff;">TRUE</span><span style="color: black;">&#41;</span>;
 gtk_widget_set_sensitive<span style="color: black;">&#40;</span>boutlicli,<span style="color: #0080ff;">TRUE</span><span style="color: black;">&#41;</span>;
 gtk_widget_set_sensitive<span style="color: black;">&#40;</span>boutsfcli,<span style="color: #0080ff;">TRUE</span><span style="color: black;">&#41;</span>;
 gtk_widget_set_sensitive<span style="color: black;">&#40;</span>boutsprod,<span style="color: #0080ff;">TRUE</span><span style="color: black;">&#41;</span>;
 gtk_widget_set_sensitive<span style="color: black;">&#40;</span>boutliprod,<span style="color: #0080ff;">TRUE</span><span style="color: black;">&#41;</span>;
 gtk_widget_set_sensitive<span style="color: black;">&#40;</span>cbparam,<span style="color: #0080ff;">TRUE</span><span style="color: black;">&#41;</span>;
<span style="color: black;">&#125;</span></pre></td></tr></table></pre>
</div><br />
Est aussi déclarer en global le pointeur du widget principal : <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">GtkWidget *winp;</span>.<br />
<br />
Pour le code exemple que je vais détaillé ci-après je vais conserver le pointeur principal <b>winp</b> en global. Il est bien entendu possible et même conseillé de ne pas agir ainsi. Mais je ne voudrais pas trop embrouiller le lecteur ;).<br />
<br />
L'idée générale serait de se passer tant que faire ce peut des déclarations en global. Comment faire ? Deux solutions sont possibles :<br />
<br />
<ol class="decimal"><li style="">créér une structure dans laquelle on déclare toutes les variables nécessaires. On déclare ensuite une variable de ce type. On initialise tout ce petit monde et on la propage à toutes les fonctions qui en aurait besoin,</li><li style="">le pointeur de la fenêtre principale pointe sur un container. il ne faut pas oublier qu'une IHM est construite sur le principe des poupées russes. Nous pouvons donc récupérer tous les pointeurs de tous les widgets de l'interface depuis le pointeur principal.</li></ol><br />
La première solution est très intéressante. Elle permet aux applications de se passer de toute (ou presque) déclaration en global. Il ne faut donc pas l'écarter. Elle devrait être utilisée ne serait-ce que pour déclarer le pointeur principal <b>winp</b> en local.<br />
<br />
La deuxième solution est celle que je vais détailler. La méthode employée ici est une méthode intermédiaire. Je m'explique. Si vous utilisez Glade pour construire vos interfaces, vous passez par un <b>GtkBuilder</b>. Il vous permet d'accéder à tout pointeur de l'interface via le nom que vous lui avez donné. Si maintenant vous avez construit l'interface avec le code source il est aussi possible de faire la même chose mais sans passer par un <b>GtkBuilder</b>, inutilisable en l'état dans cette configuration. Il est nécessaire d'écrire quelques lignes de code que je vais vous livrer ici.<br />
<br />
<b><font size="3">Accéder à tout widget d'une interface.</font></b><br />
<br />
La première chose à savoir est que la plupart des widgets hérite avant tout d'un <b>GtkContainer</b> qui lui-même hérite d'un <b>GtkWidget</b>. Nous pouvons donc les caster en <b>GtkContainer</b>. Pour les autres (GtkButton, GtkLabel etc) ils ne contiennent rien à l'intérieur. Ils seront traités par les fonctions liées au <b>GtkContainer</b>. Cette première notion est fondamentale.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0">GtkWidget
     GtkContainer
          GtkBin
          GtkBox
          GtkCList
          GtkFixed
          ...</pre></td></tr></table></pre>
</div>La deuxième chose à savoir est que tout <b>GtkWidget</b> a un nom. Quand j'écris un nom, je parle bien d'un texte <b>gchar*</b> qui le décrit. Lorsque vous créez un <b>GtkLabel</b> par exemple son nom par défaut est &quot;GtkLabel&quot;. Bon OK ca n'apporte pas grand chose pour l'instant :aie:. Ce qui est intéressant c'est qu'on peut modifier ce nom et bien entendu aussi le récupérer via ces deux fonctions :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">void</span>
gtk_widget_set_name <span style="color: black;">&#40;</span>GtkWidget *widget,
                     <span style="color: #0000ff;">const</span> gchar *name<span style="color: black;">&#41;</span>;</pre></td></tr></table></pre>
</div><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">const gchar *
gtk_widget_get_name (GtkWidget *widget);</pre></td></tr></table></pre>
</div>Nous avons maintenant la possibilité de trouver un pointeur depuis un texte. Il nous faut aussi avoir la possibilité d'extraire tous les pointeurs de l'interface pour nous permettre de comparer les noms. C'est ici que les fonctions liées aux <b>GtkContainer</b> vont nous sauver :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">void</span>
gtk_container_foreach <span style="color: black;">&#40;</span>GtkContainer *container,
                       GtkCallback callback,
                       gpointer callback_data<span style="color: black;">&#41;</span>;</pre></td></tr></table></pre>
</div>Cette fonction permet d'envoyer à une fonction callback tous les widgets qui sont inclus dans le container transmis. On peut aussi envoyer à cette même fonction une donnée personnelle que nous utiliserons ici.<br />
Il est important de comprendre que le callback sera appelé une seule fois si le premier widget de l'interface est un <b>GtkBox</b> par exemple. En effet cette fonction s'arrête à la première &quot;poupée russe&quot; rencontrée. Il faudra créer une boucle pour entrer dans le <b>GtkBox</b> et à nouveau lancer <b>gtk_container_foreach();</b>.<br />
<br />
<b><font size="3">En résumé.</font></b><br />
<br />
<ul><li style="">On peut nommer les <b>GtkWidget</b> et ainsi les retrouver grâce aux fonctions <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">gtk_widget_set_name ()</span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">gtk_widget_get_name ()</span>,</li><li style="">on peut extraire tous les widgets d'une interface grâce à la fonction <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">gtk_container_foreach ()</span>.</li></ul><br />
<br />
Je vous livre tout d'abord la fonction callback ainsi que la fonction à appeler pour extraire un pointeur. La fonction <b><i>callback_find_widget ()</i></b> est déclarée en <b>static</b> puisque exclusivement utiliser par la fonction de recherche <b><i>get_widget_from_window ()</i></b>.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span>
callback_find_widget <span style="color: black;">&#40;</span>GtkWidget *widget, gpointer data<span style="color: black;">&#41;</span>
<span style="color: black;">&#123;</span>
  <span style="color: #808080;">/* Cr&eacute;ation d'une structure interne pour pouvoir r&eacute;cup&eacute;rer les diff&eacute;rents</span>
<span style="color: #808080;">&nbsp;  * widgets de l'interface mais aussi le r&eacute;sultat de la comparaison des noms.</span>
<span style="color: #808080;">&nbsp;  */</span>
  <span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">struct</span>
  <span style="color: black;">&#123;</span>
    GtkWidget *widget;
    <span style="color: #0000ff;">const</span> gchar *name;
    gboolean resultcomp;
    GtkWidget *ptrfind;
  <span style="color: black;">&#125;</span> Sresult;
&nbsp;
  Sresult *result = <span style="color: black;">&#40;</span>Sresult*<span style="color: black;">&#41;</span>data;
&nbsp;
  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>g_strcmp0 <span style="color: black;">&#40;</span>gtk_widget_get_name <span style="color: black;">&#40;</span>widget<span style="color: black;">&#41;</span>, result-&gt;name<span style="color: black;">&#41;</span>==<span style="color: #cc66cc;">0</span><span style="color: black;">&#41;</span>
  <span style="color: black;">&#123;</span>
    result-&gt;resultcomp = <span style="color: #0080ff;">TRUE</span>;
    result-&gt;ptrfind = widget;
  <span style="color: black;">&#125;</span>
&nbsp;
  result-&gt;widget = widget;
<span style="color: black;">&#125;</span>
&nbsp;
GtkWidget *
get_widget_from_window <span style="color: black;">&#40;</span>GtkWidget *winp, <span style="color: #0000ff;">const</span> gchar *name<span style="color: black;">&#41;</span>
<span style="color: black;">&#123;</span>
  <span style="color: #808080;">/* Retourne NULL si le widget n'est pas valide */</span>
  g_return_val_if_fail <span style="color: black;">&#40;</span>GTK_IS_WIDGET <span style="color: black;">&#40;</span>winp<span style="color: black;">&#41;</span>, <span style="color: #0080ff;">NULL</span><span style="color: black;">&#41;</span>;
  <span style="color: #808080;">/* Retourne NULL si name = NULL */</span>
  g_return_val_if_fail <span style="color: black;">&#40;</span>name!=<span style="color: #0080ff;">NULL</span>, <span style="color: #0080ff;">NULL</span><span style="color: black;">&#41;</span>;
&nbsp;
  <span style="color: #808080;">/* Cr&eacute;ation d'uns structure interne pour pouvoir r&eacute;cup&eacute;rer les diff&eacute;rents</span>
<span style="color: #808080;">&nbsp;  * widgets de l'interface mais aussi le r&eacute;sultat de la comparaison des noms.</span>
<span style="color: #808080;">&nbsp;  */</span>
  <span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">struct</span>
  <span style="color: black;">&#123;</span>
    GtkWidget *widget;
    <span style="color: #0000ff;">const</span> gchar *name;
    gboolean resultcomp;
    GtkWidget *ptrfind;
  <span style="color: black;">&#125;</span> Sresult;
&nbsp;
  Sresult result;
  GtkWidget *widget = <span style="color: #0080ff;">NULL</span>;
&nbsp;
  <span style="color: #808080;">/* Initialisation de result */</span>
  result.widget = winp;
  result.name = name;
  result.resultcomp = <span style="color: #0080ff;">FALSE</span>;
  widget = winp;
  <span style="color: #0000ff;">while</span> <span style="color: black;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: black;">&#41;</span>
    <span style="color: black;">&#123;</span>
       <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>GTK_IS_CONTAINER <span style="color: black;">&#40;</span>widget<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
	gtk_container_foreach <span style="color: black;">&#40;</span>GTK_CONTAINER <span style="color: black;">&#40;</span>widget<span style="color: black;">&#41;</span>,<span style="color: black;">&#40;</span>GtkCallback<span style="color: black;">&#41;</span>callback_find_widget, &amp;result<span style="color: black;">&#41;</span>;
&nbsp;
      <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>result.resultcomp == <span style="color: #0080ff;">TRUE</span><span style="color: black;">&#41;</span>
	<span style="color: #0000ff;">return</span> result.ptrfind;
      <span style="color: #0000ff;">else</span>
	<span style="color: black;">&#123;</span>
	  <span style="color: #808080;">/* Permet de sortir de la boucle lorsque tous les widgets ont &eacute;t&eacute; parcourus */</span>
	  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>widget==result.widget<span style="color: black;">&#41;</span>
	    <span style="color: #0000ff;">break</span>;
	  <span style="color: #0000ff;">else</span>
	    widget = result.widget;
	<span style="color: black;">&#125;</span>
    <span style="color: black;">&#125;</span>
&nbsp;
  <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">NULL</span>;
<span style="color: black;">&#125;</span></pre></td></tr></table></pre>
</div><br />
La fonction <b><i>get_widget_from_window (GtkWidget *winp, const gchar *name);</i></b> permet donc, depuis le <b>GtkWidget *winp</b> transmis d'extraire le pointeur d'un widget portant le nom <b>name</b>. Cette fonction vous renvoie soit un pointeur valide si la recherche est fructueuse, soit <b>NULL</b> dans le cas contraire ou si <b>winp</b> n'est pas valide ou name est <b>NULL</b>.<br />
<br />
Pour pouvoir l'utiliser il ne reste plus qu'à nommer nos widgets. En reprenant le code exemple, lors de la création on peut écrire :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">...
boutsfac = gtk_button_new_with_label(&quot;Saisie Facture&quot;);
gtk_widget_set_size_request(boutsfac, 120, 25);
gtk_fixed_put(GTK_FIXED(frawp), boutsfac,20,py);
<b>gtk_widget_set_name (boutsfac, &quot;boutsfac&quot;);</b>
...</pre></td></tr></table></pre>
</div>Pour pouvoir retrouver le pointeur de ce widget il suffira d'écrire :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>get_widget_from_window <span style="color: black;">&#40;</span>winp, <span style="color: #FF0000;">&quot;boutsfac&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    g_printerr <span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;widget trouv&eacute;<span style="color: #800000;">\n</span>&quot;</span><span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">else</span>
    g_printerr <span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;widget non trouv&eacute; !!!<span style="color: #800000;">\n</span>&quot;</span><span style="color: black;">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
Ainsi en reprenant le code exemple du départ avec nos deux fonctions qui désactivent/activent des widgets on peut écrire ceci et se passer des déclarations en global de tous les pointeurs associés :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br /></div></td><td valign="top"><pre style="margin: 0">/* <s>static GtkWidget *boutsfac;</s> */
static GtkWidget *boutsfcli;
static GtkWidget *boutsprod;
static GtkWidget *boutliprod;
static GtkWidget *boutopen;
static GtkWidget *boutlicli;
static GtkWidget *labdb;

void deactiv_bmenu()
{
  <b>gtk_widget_set_sensitive(get_widget_from_window (winp, &quot;boutsfac&quot;), FALSE);</b>
  gtk_widget_set_sensitive(boutlicli,FALSE);
  gtk_widget_set_sensitive(boutsfcli,FALSE);
  gtk_widget_set_sensitive(boutsprod,FALSE);
  gtk_widget_set_sensitive(boutliprod,FALSE);
  gtk_widget_set_sensitive(cbparam,FALSE);
}

void activ_bmenu()
{
  <b>gtk_widget_set_sensitive(get_widget_from_window (winp, &quot;boutsfac&quot;), TRUE);</b>
  gtk_widget_set_sensitive(boutlicli,TRUE);
  gtk_widget_set_sensitive(boutsfcli,TRUE);
  gtk_widget_set_sensitive(boutsprod,TRUE);
  gtk_widget_set_sensitive(boutliprod,TRUE);
  gtk_widget_set_sensitive(cbparam,TRUE);
}</pre></td></tr></table></pre>
</div><br />
À vos claviers...et vos commentaires. :mrgreen:</blockquote>

]]></content:encoded>
			<dc:creator>gerald3d</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/219706-gerald3d/b4527/gtkp-acceder-pointeur-d-widget-point-d-programme/</guid>
		</item>
		<item>
			<title><![CDATA[[Cairo] Remplissage de polygones (perspective cavalière)]]></title>
			<link>https://www.developpez.net/forums/blogs/219706-gerald3d/b2553/cairo-remplissage-polygones-perspective-cavaliere/</link>
			<pubDate>Sun, 12 Mar 2017 10:12:08 GMT</pubDate>
			<description>---Citation (Envoyé par...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				<div class="bbcode_postedby">
					<img src="https://forum.developpez.be/images/misc/quote_icon.png" alt="Citation" /> Envoyé par <strong>gerald3d</strong>
					<a href="showthread.php?p=9080114#post9080114" rel="nofollow"><img class="inlineimg" src="https://forum.developpez.be/images/buttons/viewpost-right.png" alt="Voir le message" /></a>
				</div>
				<div class="message">Je vous livre en pâture la fonction qui permet de mapper un parallélogramme. Elle a quelques contraintes mais elle répond exactement à mes besoins.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">/* Fonction de mapping d'un parall&eacute;logramme.</span>
<span style="color: #808080;">&nbsp;*</span>
<span style="color: #808080;">&nbsp;* Les points A, B, C, D doivent &ecirc;tre dispos&eacute;s de la sorte :</span>
<span style="color: #808080;">&nbsp;*</span>
<span style="color: #808080;">&nbsp;*                                 B                    A        </span>
<span style="color: #808080;">&nbsp;*                   A                                                B</span>
<span style="color: #808080;">&nbsp;*                                            ou</span>
<span style="color: #808080;">&nbsp;*                                 C                    D</span>
<span style="color: #808080;">&nbsp;*                   D                                                C</span>
<span style="color: #808080;">&nbsp;*</span>
<span style="color: #808080;">&nbsp;* Vous pouvez aussi utiliser cette fonction pour mapper un</span>
<span style="color: #808080;">&nbsp;* rectangle.</span>
<span style="color: #808080;">&nbsp;*</span>
<span style="color: #808080;">&nbsp;* Cette fonction renvoie NULL si src est NULL, si le parall&eacute;logramme</span>
<span style="color: #808080;">&nbsp;* repr&eacute;sente une simple ligne verticale ou si les points AD</span>
<span style="color: #808080;">&nbsp;* ou les points BC ne sont pas align&eacute;s verticalement.</span>
<span style="color: #808080;">&nbsp;*</span>
<span style="color: #808080;">&nbsp;* src : GdkPixbuf original utilis&eacute; comme texture &agrave; mapper</span>
<span style="color: #808080;">&nbsp;* A, B, C, D : sommets du parallelogramme</span>
<span style="color: #808080;">&nbsp;*</span>
<span style="color: #808080;">&nbsp;* Renvoie un GdkPixbuf nouvellement cr&eacute;&eacute;.</span>
<span style="color: #808080;">&nbsp;*/</span>
GdkPixbuf*
gdk_pixbuf_perspective_new <span style="color: black;">&#40;</span><span style="color: #0000ff;">const</span> GdkPixbuf *src, GdkPoint A, GdkPoint B, GdkPoint C, GdkPoint D<span style="color: black;">&#41;</span>
<span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>!src<span style="color: black;">&#41;</span>
    <span style="color: black;">&#123;</span>
      g_printerr <span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;Error in gdk_pixbuf_perspective_new (); !<span style="color: #800000;">\n</span> src must be not NULL !<span style="color: #800000;">\n</span>&quot;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">NULL</span>;
    <span style="color: black;">&#125;</span>
&nbsp;
  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>A.x-B.x==<span style="color: #cc66cc;">0</span><span style="color: black;">&#41;</span>
    <span style="color: black;">&#123;</span>
      g_printerr <span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;Error in gdk_pixbuf_perspective_new (); !<span style="color: #800000;">\n</span> A and B points are vertical aligned !<span style="color: #800000;">\n</span>&quot;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">NULL</span>;
    <span style="color: black;">&#125;</span>
&nbsp;
  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>A.x!=D.x || B.x!=C.x<span style="color: black;">&#41;</span>
    <span style="color: black;">&#123;</span>
      g_printerr <span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;Error in gdk_pixbuf_perspective_new (); !<span style="color: #800000;">\n</span> A and D or B and C points are not vertical aligned !<span style="color: #800000;">\n</span>&quot;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">NULL</span>;
    <span style="color: black;">&#125;</span>
&nbsp;
  <span style="color: #808080;">// Les points AB et CD sont invers&eacute;s</span>
  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>A.x&gt;B.x<span style="color: black;">&#41;</span>
    <span style="color: black;">&#123;</span>
      GdkPoint tmp;
&nbsp;
      tmp.x = A.x; tmp.y = A.y;
      A.x = B.x; A.y = B.y;
      B.x = tmp.x; B.y = tmp.y;
&nbsp;
      tmp.x = C.x; tmp.y = C.y;
      C.x = D.x; C.y = D.y;
      D.x = tmp.x; D.y = tmp.y;
    <span style="color: black;">&#125;</span>
&nbsp;
  guchar *pixels = gdk_pixbuf_get_pixels <span style="color: black;">&#40;</span>src<span style="color: black;">&#41;</span>;
  gint rowstride = gdk_pixbuf_get_rowstride <span style="color: black;">&#40;</span>src<span style="color: black;">&#41;</span>;
  guchar channels = gdk_pixbuf_get_n_channels <span style="color: black;">&#40;</span>src<span style="color: black;">&#41;</span>;
  gint width = gdk_pixbuf_get_width <span style="color: black;">&#40;</span>src<span style="color: black;">&#41;</span>;
  gint height = gdk_pixbuf_get_height <span style="color: black;">&#40;</span>src<span style="color: black;">&#41;</span>;
  gdouble scalex, scaley;
  gint x, y;
  gint targety;
  GdkPoint Orig; <span style="color: #808080;">// Coordonn&eacute;es dans l'image originale</span>
  GdkPixbuf *TargetPixbuf;
  gint xmax, ymax;  <span style="color: #808080;">// Limites du boundingbox 2D</span>
  gdouble a, b; <span style="color: #808080;">// coefficient de droite entre les points A et B</span>
&nbsp;
  <span style="color: #808080;">// Calcul des coefficients</span>
  a = <span style="color: black;">&#40;</span>A.y - B.y<span style="color: black;">&#41;</span> / <span style="color: black;">&#40;</span>gdouble<span style="color: black;">&#41;</span><span style="color: black;">&#40;</span>A.x - B.x<span style="color: black;">&#41;</span>;
  b = <span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>B.y*A.x<span style="color: black;">&#41;</span> - <span style="color: black;">&#40;</span>B.x*A.y<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> / <span style="color: black;">&#40;</span>gdouble<span style="color: black;">&#41;</span><span style="color: black;">&#40;</span>A.x - B.x<span style="color: black;">&#41;</span>;
&nbsp;
  <span style="color: #808080;">// Calcul du boundingbox</span>
  xmax = A.x;
  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>B.x&gt;xmax<span style="color: black;">&#41;</span> xmax = B.x;
  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>C.x&gt;xmax<span style="color: black;">&#41;</span> xmax = C.x;
  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>D.x&gt;xmax<span style="color: black;">&#41;</span> xmax = D.x;
&nbsp;
  ymax = A.y;
  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>B.y&gt;ymax<span style="color: black;">&#41;</span> ymax = B.y;
  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>C.y&gt;ymax<span style="color: black;">&#41;</span> ymax = C.y;
  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>D.y&gt;ymax<span style="color: black;">&#41;</span> ymax = D.y;
&nbsp;
  TargetPixbuf = gdk_pixbuf_new <span style="color: black;">&#40;</span>GDK_COLORSPACE_RGB, <span style="color: #0080ff;">TRUE</span>, <span style="color: #cc66cc;">8</span>, xmax, ymax<span style="color: black;">&#41;</span>;
  guchar *TargetPixels = gdk_pixbuf_get_pixels <span style="color: black;">&#40;</span>TargetPixbuf<span style="color: black;">&#41;</span>;
  gint TargetRowstride = gdk_pixbuf_get_rowstride <span style="color: black;">&#40;</span>TargetPixbuf<span style="color: black;">&#41;</span>;
  gint TargetChannels = gdk_pixbuf_get_n_channels <span style="color: black;">&#40;</span>TargetPixbuf<span style="color: black;">&#41;</span>;
&nbsp;
  <span style="color: #808080;">// Effacement complet du nouveau pixbuf cr&eacute;&eacute;</span>
  memset<span style="color: black;">&#40;</span>TargetPixels, <span style="color: #cc66cc;">0</span>, TargetRowstride * <span style="color: black;">&#40;</span>D.y - A.y<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>;
&nbsp;
  Orig.x = <span style="color: #cc66cc;">0</span>; Orig.y = <span style="color: #cc66cc;">0</span>; <span style="color: #808080;">// Coordonn&eacute;es dans l'image originale</span>
  scalex = <span style="color: black;">&#40;</span>B.x-A.x<span style="color: black;">&#41;</span> / <span style="color: black;">&#40;</span>gdouble<span style="color: black;">&#41;</span>width; <span style="color: #808080;">// Rapport d'&eacute;chelle sur l'axe des x entre l'image source et l'image cible</span>
  scaley = <span style="color: black;">&#40;</span>D.y - A.y<span style="color: black;">&#41;</span> / <span style="color: black;">&#40;</span>gdouble<span style="color: black;">&#41;</span>height; <span style="color: #808080;">// Rapport d'&eacute;chelle sur l'axe des y entre l'image source et l'image cible</span>
&nbsp;
  <span style="color: #808080;">// Cr&eacute;ation du pixbuf cible</span>
  <span style="color: #0000ff;">for</span> <span style="color: black;">&#40;</span>y=<span style="color: #cc66cc;">0</span>; y&lt;<span style="color: black;">&#40;</span>D.y-A.y<span style="color: black;">&#41;</span>; y++<span style="color: black;">&#41;</span>
    <span style="color: black;">&#123;</span>
      Orig.y = <span style="color: black;">&#40;</span>gint<span style="color: black;">&#41;</span><span style="color: black;">&#40;</span>y / scaley<span style="color: black;">&#41;</span>;
&nbsp;
      <span style="color: #0000ff;">for</span> <span style="color: black;">&#40;</span>x=<span style="color: #cc66cc;">0</span>; x&lt;<span style="color: black;">&#40;</span>B.x-A.x<span style="color: black;">&#41;</span>; x++<span style="color: black;">&#41;</span>
	<span style="color: black;">&#123;</span>
	  Orig.x = <span style="color: black;">&#40;</span>gint<span style="color: black;">&#41;</span><span style="color: black;">&#40;</span>x / scalex<span style="color: black;">&#41;</span>;
	  targety = y + a*x + b;
&nbsp;
	  TargetPixels<span style="color: black;">&#91;</span><span style="color: black;">&#40;</span>x * TargetChannels<span style="color: black;">&#41;</span> + <span style="color: black;">&#40;</span>targety * TargetRowstride<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> = pixels <span style="color: black;">&#91;</span><span style="color: black;">&#40;</span>Orig.x * channels<span style="color: black;">&#41;</span> + <span style="color: black;">&#40;</span>Orig.y * rowstride<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>;
	  TargetPixels<span style="color: black;">&#91;</span><span style="color: black;">&#40;</span>x * TargetChannels<span style="color: black;">&#41;</span> + <span style="color: black;">&#40;</span>targety * TargetRowstride<span style="color: black;">&#41;</span> + <span style="color: #cc66cc;">1</span><span style="color: black;">&#93;</span> = pixels <span style="color: black;">&#91;</span><span style="color: black;">&#40;</span>Orig.x * channels<span style="color: black;">&#41;</span> + <span style="color: black;">&#40;</span>Orig.y * rowstride<span style="color: black;">&#41;</span> + <span style="color: #cc66cc;">1</span><span style="color: black;">&#93;</span>;
	  TargetPixels<span style="color: black;">&#91;</span><span style="color: black;">&#40;</span>x * TargetChannels<span style="color: black;">&#41;</span> + <span style="color: black;">&#40;</span>targety * TargetRowstride<span style="color: black;">&#41;</span> + <span style="color: #cc66cc;">2</span><span style="color: black;">&#93;</span> = pixels <span style="color: black;">&#91;</span><span style="color: black;">&#40;</span>Orig.x * channels<span style="color: black;">&#41;</span> + <span style="color: black;">&#40;</span>Orig.y * rowstride<span style="color: black;">&#41;</span> + <span style="color: #cc66cc;">2</span><span style="color: black;">&#93;</span>;
	  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>gdk_pixbuf_get_has_alpha <span style="color: black;">&#40;</span>src<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
	    TargetPixels<span style="color: black;">&#91;</span><span style="color: black;">&#40;</span>x * TargetChannels<span style="color: black;">&#41;</span> + <span style="color: black;">&#40;</span>targety * TargetRowstride<span style="color: black;">&#41;</span> + <span style="color: #cc66cc;">3</span><span style="color: black;">&#93;</span> = pixels <span style="color: black;">&#91;</span><span style="color: black;">&#40;</span>Orig.x * channels<span style="color: black;">&#41;</span> + <span style="color: black;">&#40;</span>Orig.y * rowstride<span style="color: black;">&#41;</span> + <span style="color: #cc66cc;">3</span><span style="color: black;">&#93;</span>;
	  <span style="color: #0000ff;">else</span>
	    TargetPixels<span style="color: black;">&#91;</span><span style="color: black;">&#40;</span>x * TargetChannels<span style="color: black;">&#41;</span> + <span style="color: black;">&#40;</span>targety * TargetRowstride<span style="color: black;">&#41;</span> + <span style="color: #cc66cc;">3</span><span style="color: black;">&#93;</span> = <span style="color: #cc66cc;">255</span>;
	<span style="color: black;">&#125;</span>
    <span style="color: black;">&#125;</span>
&nbsp;
  <span style="color: #0000ff;">return</span> TargetPixbuf;
<span style="color: black;">&#125;</span></pre></td></tr></table></pre>
</div></div>
			
		</div>
	</div>
</div></blockquote>

]]></content:encoded>
			<dc:creator>gerald3d</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/219706-gerald3d/b2553/cairo-remplissage-polygones-perspective-cavaliere/</guid>
		</item>
		<item>
			<title><![CDATA[[GTK+ v3.0] Comment avoir un GtkGrid ressemblant à un tableur ?]]></title>
			<link>https://www.developpez.net/forums/blogs/219706-gerald3d/b368/gtkp-v3-0-gtkgrid-ressemblant-tableur/</link>
			<pubDate>Sun, 22 Mar 2015 21:05:53 GMT</pubDate>
			<description>Bonjour à toutes et à tous. 
...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour à toutes et à tous.<br />
<br />
Bon nombre d'entre-vous désirent obtenir une grille façon tableur. Je vous propose ici une solution à cet épineux problème :P.<br />
<br />
La solution proposée s'appuie sur Gtk+v3.0.<br />
<br />
Ce qu'il faut comprendre aujourd'hui avec Gtk+v3.0 c'est que tout widget utilise cairo pour &quot;se dessiner&quot;. Nous allons utiliser simplement cette propriété pour ajouter notre petite touche personnelle.<br />
<br />
Pour l'exemple j'ai donc créé une fenêtre principale dans laquelle j'insère un GtkGrid. Jusqu'ici rien de bien nouveau. Ensuite à l'aide de deux boucles imbriquées j'insère dans le GtkGrid neuf GtkLabel initialisés avec les coordonnées de chacun d'eux histoire d'avoir un affichage clair. Tout le monde arrive à faire ce genre de chose sans trop de problème. Mais comment maintenant ajouter un cadre autour de chaque case ?<br />
<br />
La solution est finalement simple. Puisqu'un widget utilise cairo il déclenche donc le signal &quot;draw&quot;. Certains d'entre-vous utilise ce signal de manière courante avec les GtkDrawingArea pour pouvoir dessiner. Nous allons en faire de même pour chaque GtkLabel.<br />
J'assigne un callback pour chaque widget enfant inséré dans le GtkGrid attaché au signal &quot;draw&quot;. Dans ce callback je récupère naturellement le contexte graphique (cairo_t) avec lequel je peux dessiner directement sur le widget.<br />
<br />
Dans le code exemple çi-dessous j'ai volontairement agrémenté un peu le code. Chaque case est entourée par un trait discontinue de couleur différente histoire que chacun puisse voir comment on peut modifier à son gré l'apparence finale du widget.<br />
<br />
J'arrête là le charabia et vous livre le code en pâture. À vos commentaires...<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*-  */</span>
<span style="color: #808080;">/*</span>
<span style="color: #808080;">&nbsp;* main.c</span>
<span style="color: #808080;">&nbsp;* Copyright (C) 2013 Gerald Dumas &lt;gerald.dumas@laposte.net&gt;</span>
<span style="color: #808080;">&nbsp;*</span>
<span style="color: #808080;">&nbsp;* tableur is free software: you can redistribute it and/or modify it</span>
<span style="color: #808080;">&nbsp;* under the terms of the GNU General Public License as published by the</span>
<span style="color: #808080;">&nbsp;* Free Software Foundation, either version 3 of the License, or</span>
<span style="color: #808080;">&nbsp;* (at your option) any later version.</span>
<span style="color: #808080;">&nbsp;* </span>
<span style="color: #808080;">&nbsp;* tableur is distributed in the hope that it will be useful, but</span>
<span style="color: #808080;">&nbsp;* WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span style="color: #808080;">&nbsp;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</span>
<span style="color: #808080;">&nbsp;* See the GNU General Public License for more details.</span>
<span style="color: #808080;">&nbsp;* </span>
<span style="color: #808080;">&nbsp;* You should have received a copy of the GNU General Public License along</span>
<span style="color: #808080;">&nbsp;* with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</span>
<span style="color: #808080;">&nbsp;*/</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;config.h&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;gtk/gtk.h&gt;</span>
&nbsp;
gboolean draw_child_widget <span style="color: black;">&#40;</span>GtkWidget *ChildWidget, cairo_t *cr, GdkRGBA *color<span style="color: black;">&#41;</span>
<span style="color: black;">&#123;</span>
	<span style="color: #808080;">/* Dans cette fonction nous acc&eacute;dons au context cairo de chaque widget enfant ins&eacute;r&eacute; dans le GtkGrid.</span>
<span style="color: #808080;">	 * Il nous suffit maintenant de dessiner ce que l'on veut dessus.</span>
<span style="color: #808080;">	 * La couleur de chaque encadrement est r&eacute;cup&eacute;r&eacute;e dans le pointeur utilisateur.</span>
<span style="color: #808080;">	 */</span>
	gdouble dash<span style="color: black;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: black;">&#93;</span>;
	gint width = gtk_widget_get_allocated_width <span style="color: black;">&#40;</span>ChildWidget<span style="color: black;">&#41;</span>;
	gint height = gtk_widget_get_allocated_height <span style="color: black;">&#40;</span>ChildWidget<span style="color: black;">&#41;</span>;
&nbsp;
	dash<span style="color: black;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: black;">&#93;</span>=<span style="color: #cc66cc;">5</span>;
	dash<span style="color: black;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: black;">&#93;</span>=<span style="color: #cc66cc;">10</span>;
	cairo_set_dash <span style="color: black;">&#40;</span>cr, dash, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">0</span><span style="color: black;">&#41;</span>; <span style="color: #808080;">// Affectation du trait discontinue d&eacute;clar&eacute; dans le tableau dash</span>
	cairo_set_line_width <span style="color: black;">&#40;</span>cr, <span style="color: #cc66cc;">1</span><span style="color: black;">&#41;</span>; <span style="color: #808080;">// Epaisseur du trait</span>
	cairo_set_source_rgb <span style="color: black;">&#40;</span>cr, color-&gt;red, color-&gt;green, color-&gt;blue<span style="color: black;">&#41;</span>; <span style="color: #808080;">// Affectation de la couleur r&eacute;cup&eacute;r&eacute;e en tant que donn&eacute;e utilisateur</span>
&nbsp;
	<span style="color: #808080;">/*Dessin d'un trait autour du widget*/</span>
	cairo_move_to <span style="color: black;">&#40;</span>cr, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span><span style="color: black;">&#41;</span>;
	cairo_line_to <span style="color: black;">&#40;</span>cr, width, <span style="color: #cc66cc;">0</span><span style="color: black;">&#41;</span>;
	cairo_line_to <span style="color: black;">&#40;</span>cr, width, height<span style="color: black;">&#41;</span>;
	cairo_line_to <span style="color: black;">&#40;</span>cr, <span style="color: #cc66cc;">0</span>, height<span style="color: black;">&#41;</span>;
	cairo_line_to <span style="color: black;">&#40;</span>cr, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span><span style="color: black;">&#41;</span>;
	cairo_stroke <span style="color: black;">&#40;</span>cr<span style="color: black;">&#41;</span>;
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #0080ff;">FALSE</span>;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span>
main <span style="color: black;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span> *argv<span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#123;</span>
	GtkWidget *MainWindow=<span style="color: #0080ff;">NULL</span>;
	GtkWidget *Grid = <span style="color: #0080ff;">NULL</span>;
	GtkWidget *ChildWidget = <span style="color: #0080ff;">NULL</span>;
	<span style="color: #0000ff;">int</span> i, j, k=<span style="color: #cc66cc;">0</span>;
	gchar *CaseNumber = <span style="color: #0080ff;">NULL</span>;
&nbsp;
	<span style="color: #808080;">/* D&eacute;claration de trois couleurs primaires pour exemple. */</span>
	GdkRGBA color <span style="color: black;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: black;">&#93;</span>;
	color<span style="color: black;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: black;">&#93;</span>.red=<span style="color: #cc66cc;">1</span>; color<span style="color: black;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: black;">&#93;</span>.green=<span style="color: #cc66cc;">0</span>; color<span style="color: black;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: black;">&#93;</span>.blue=<span style="color: #cc66cc;">0</span>;
	color<span style="color: black;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: black;">&#93;</span>.red=<span style="color: #cc66cc;">0</span>; color<span style="color: black;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: black;">&#93;</span>.green=<span style="color: #cc66cc;">1</span>; color<span style="color: black;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: black;">&#93;</span>.blue=<span style="color: #cc66cc;">0</span>;
	color<span style="color: black;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: black;">&#93;</span>.red=<span style="color: #cc66cc;">0</span>; color<span style="color: black;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: black;">&#93;</span>.green=<span style="color: #cc66cc;">0</span>; color<span style="color: black;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: black;">&#93;</span>.blue=<span style="color: #cc66cc;">1</span>;
&nbsp;
	gtk_init <span style="color: black;">&#40;</span>&amp;argc, &amp;argv<span style="color: black;">&#41;</span>;
&nbsp;
	<span style="color: #808080;">/*Cr&eacute;ation d'une fen&ecirc;tre principale*/</span>
	MainWindow = gtk_window_new <span style="color: black;">&#40;</span>GTK_WINDOW_TOPLEVEL<span style="color: black;">&#41;</span>;
&nbsp;
	<span style="color: #808080;">/*Cr&eacute;ation d'une grille dont les cases sont homog&egrave;nes*/</span>
	Grid = gtk_grid_new <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
	gtk_grid_set_row_homogeneous <span style="color: black;">&#40;</span>GTK_GRID<span style="color: black;">&#40;</span>Grid<span style="color: black;">&#41;</span>, <span style="color: #0080ff;">TRUE</span><span style="color: black;">&#41;</span>;
	gtk_grid_set_column_homogeneous <span style="color: black;">&#40;</span>GTK_GRID<span style="color: black;">&#40;</span>Grid<span style="color: black;">&#41;</span>, <span style="color: #0080ff;">TRUE</span><span style="color: black;">&#41;</span>;
	gtk_container_add <span style="color: black;">&#40;</span>GTK_CONTAINER<span style="color: black;">&#40;</span>MainWindow<span style="color: black;">&#41;</span>, Grid<span style="color: black;">&#41;</span>;
&nbsp;
	<span style="color: #0000ff;">for</span> <span style="color: black;">&#40;</span>j=<span style="color: #cc66cc;">0</span>; j&lt;<span style="color: #cc66cc;">3</span>; j++<span style="color: black;">&#41;</span>
		<span style="color: #0000ff;">for</span> <span style="color: black;">&#40;</span>i=<span style="color: #cc66cc;">0</span>; i&lt;<span style="color: #cc66cc;">3</span>; i++<span style="color: black;">&#41;</span>
		<span style="color: black;">&#123;</span>
			<span style="color: #808080;">/*Initialisation d'un GtkLabel comme widget enfant*/</span>
			CaseNumber = g_strdup_printf <span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;(%d,%d)&quot;</span>, i,j<span style="color: black;">&#41;</span>;
			ChildWidget = gtk_label_new <span style="color: black;">&#40;</span>CaseNumber<span style="color: black;">&#41;</span>;
			g_free <span style="color: black;">&#40;</span>CaseNumber<span style="color: black;">&#41;</span>;
&nbsp;
			<span style="color: #808080;">/*On affecte une fonction callback pour chaque widget enfant accroch&eacute;e au signal &quot;draw&quot;*/</span>
			g_signal_connect <span style="color: black;">&#40;</span>G_OBJECT <span style="color: black;">&#40;</span>ChildWidget<span style="color: black;">&#41;</span>, <span style="color: #FF0000;">&quot;draw&quot;</span>, <span style="color: black;">&#40;</span>GCallback<span style="color: black;">&#41;</span>draw_child_widget, &amp;color<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>;
&nbsp;
			<span style="color: #808080;">/*Finalement on ins&egrave;re le widget enfant dans la grille*/</span>
			gtk_grid_attach <span style="color: black;">&#40;</span>GTK_GRID<span style="color: black;">&#40;</span>Grid<span style="color: black;">&#41;</span>, ChildWidget, i, j, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span><span style="color: black;">&#41;</span>;
&nbsp;
			<span style="color: #808080;">// Pour que la couleur affect&eacute;e soit cyclique</span>
			<span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>k&lt;<span style="color: #cc66cc;">2</span><span style="color: black;">&#41;</span> k++; <span style="color: #0000ff;">else</span> k=<span style="color: #cc66cc;">0</span>;
		<span style="color: black;">&#125;</span>
&nbsp;
	g_signal_connect <span style="color: black;">&#40;</span>G_OBJECT <span style="color: black;">&#40;</span>MainWindow<span style="color: black;">&#41;</span>, <span style="color: #FF0000;">&quot;destroy&quot;</span>, <span style="color: black;">&#40;</span>GCallback<span style="color: black;">&#41;</span>gtk_main_quit, <span style="color: #0080ff;">NULL</span><span style="color: black;">&#41;</span>;
	g_signal_connect <span style="color: black;">&#40;</span>G_OBJECT <span style="color: black;">&#40;</span>MainWindow<span style="color: black;">&#41;</span>, <span style="color: #FF0000;">&quot;delete-event&quot;</span>, <span style="color: black;">&#40;</span>GCallback<span style="color: black;">&#41;</span>gtk_main_quit, <span style="color: #0080ff;">NULL</span><span style="color: black;">&#41;</span>;
&nbsp;
	gtk_widget_show_all <span style="color: black;">&#40;</span>MainWindow<span style="color: black;">&#41;</span>;
&nbsp;
	gtk_main <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: black;">&#125;</span></pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>gerald3d</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/219706-gerald3d/b368/gtkp-v3-0-gtkgrid-ressemblant-tableur/</guid>
		</item>
		<item>
			<title><![CDATA[[GTK+ v3.0] Récupérer les coordonnées de la souris sur l'écran]]></title>
			<link>https://www.developpez.net/forums/blogs/219706-gerald3d/b367/gtkp-v3-0-recuperer-coordonnees-souris-l-ecran/</link>
			<pubDate>Sun, 22 Mar 2015 20:55:07 GMT</pubDate>
			<description>Bonjour à toutes et à tous. 
...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour à toutes et à tous.<br />
<br />
Je me lance dans ce nouvel outil qu'est le blog. J'ai décidé de l'utiliser pour concentrer ici quelques codes sources que j'écris pour répondre à certaines questions plus ou moins particulières.<br />
<br />
Donc, pour ce premier billet vous trouverez ci-après le code exemple pour récupérer les coordonnées en temps réel de la souris sur l'écran. Ce n'est peut être pas la solution idéale, mais elle a le mérite d'exister ;) :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;gtk/gtk.h&gt;</span>
&nbsp;
<span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">struct</span>
<span style="color: black;">&#123;</span>
  GtkWidget *coordx, *coordy;
<span style="color: black;">&#125;</span> SCoord;
&nbsp;
gboolean
g_callback_draw <span style="color: black;">&#40;</span>GtkWidget    *widget, cairo_t *cr, SCoord *coord<span style="color: black;">&#41;</span>
<span style="color: black;">&#123;</span>
  GdkWindow *root = <span style="color: #0080ff;">NULL</span>;
  gint x, y;
&nbsp;
  <span style="color: #808080;">// R&eacute;cup&eacute;ration de la fen&ecirc;tre root</span>
  root = gdk_get_default_root_window <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>root==<span style="color: #0080ff;">NULL</span><span style="color: black;">&#41;</span> g_printerr <span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;root = NULL !!!&quot;</span><span style="color: black;">&#41;</span>;
&nbsp;
  <span style="color: #808080;">// R&eacute;cup&eacute;ration du pointeur de la souris</span>
  GdkDevice *pointer = gdk_device_manager_get_client_pointer <span style="color: black;">&#40;</span>gdk_display_get_device_manager <span style="color: black;">&#40;</span>gdk_window_get_display <span style="color: black;">&#40;</span>root<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>;
&nbsp;
  <span style="color: #808080;">// R&eacute;cup&eacute;ration des coordonn&eacute;es de la souris</span>
  gdk_window_get_device_position <span style="color: black;">&#40;</span>root, pointer, &amp;x, &amp;y, <span style="color: #0080ff;">NULL</span><span style="color: black;">&#41;</span>;
&nbsp;
  <span style="color: #808080;">// Mise &agrave; jour des GtkLabel pour afficher les coordonn&eacute;es.</span>
  gchar *text_x = g_strdup_printf<span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>, x<span style="color: black;">&#41;</span>;
  gchar *text_y = g_strdup_printf<span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>, y<span style="color: black;">&#41;</span>;
  gtk_label_set_text <span style="color: black;">&#40;</span>GTK_LABEL <span style="color: black;">&#40;</span>coord-&gt;coordx<span style="color: black;">&#41;</span>, text_x<span style="color: black;">&#41;</span>;
  gtk_label_set_text <span style="color: black;">&#40;</span>GTK_LABEL <span style="color: black;">&#40;</span>coord-&gt;coordy<span style="color: black;">&#41;</span>, text_y<span style="color: black;">&#41;</span>;
  g_free<span style="color: black;">&#40;</span>text_x<span style="color: black;">&#41;</span>;
  g_free<span style="color: black;">&#40;</span>text_y<span style="color: black;">&#41;</span>;
&nbsp;
  <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">FALSE</span>;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span>
main<span style="color: black;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span>** argv<span style="color: black;">&#41;</span>
<span style="color: black;">&#123;</span>
  GtkWidget *window = <span style="color: #0080ff;">NULL</span>;
  GtkWidget *grid = <span style="color: #0080ff;">NULL</span>;
  GtkWidget *label = <span style="color: #0080ff;">NULL</span>;
  SCoord coord;
&nbsp;
  <span style="color: #808080;">// Initialisation gtk</span>
  gtk_init<span style="color: black;">&#40;</span>&amp;argc, &amp;argv<span style="color: black;">&#41;</span>;
&nbsp;
  <span style="color: #808080;">// Creation fenetre</span>
  window = gtk_window_new<span style="color: black;">&#40;</span>GTK_WINDOW_TOPLEVEL<span style="color: black;">&#41;</span>;
  gtk_window_set_title<span style="color: black;">&#40;</span>GTK_WINDOW<span style="color: black;">&#40;</span>window<span style="color: black;">&#41;</span>, <span style="color: #FF0000;">&quot;Test capture &eacute;v&egrave;nements souris&quot;</span><span style="color: black;">&#41;</span>;
  gtk_window_set_default_size<span style="color: black;">&#40;</span>GTK_WINDOW<span style="color: black;">&#40;</span>window<span style="color: black;">&#41;</span>, <span style="color: #cc66cc;">400</span>, <span style="color: #cc66cc;">200</span><span style="color: black;">&#41;</span>;
  gtk_window_set_position<span style="color: black;">&#40;</span>GTK_WINDOW<span style="color: black;">&#40;</span>window<span style="color: black;">&#41;</span>, GTK_WIN_POS_CENTER_ALWAYS<span style="color: black;">&#41;</span>;
&nbsp;
  <span style="color: #808080;">// Connexion du signal &quot;destroy&quot; pour fermer l'application</span>
  g_signal_connect<span style="color: black;">&#40;</span>G_OBJECT<span style="color: black;">&#40;</span>window<span style="color: black;">&#41;</span>, <span style="color: #FF0000;">&quot;destroy&quot;</span>, G_CALLBACK<span style="color: black;">&#40;</span>gtk_main_quit<span style="color: black;">&#41;</span>, <span style="color: #0080ff;">NULL</span><span style="color: black;">&#41;</span>;
&nbsp;
  <span style="color: #808080;">// Cr&eacute;ation d'une grille pour afficher les coordonn&eacute;es de la souris en temps r&eacute;el.</span>
  grid = gtk_grid_new <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
  gtk_container_add <span style="color: black;">&#40;</span>GTK_CONTAINER<span style="color: black;">&#40;</span>window<span style="color: black;">&#41;</span>, grid<span style="color: black;">&#41;</span>;
&nbsp;
  label = gtk_label_new <span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;coordonn&eacute;es souris :&quot;</span><span style="color: black;">&#41;</span>;
  gtk_grid_attach <span style="color: black;">&#40;</span>GTK_GRID<span style="color: black;">&#40;</span>grid<span style="color: black;">&#41;</span>, label, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">1</span><span style="color: black;">&#41;</span>;
  label = gtk_label_new <span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;,&quot;</span><span style="color: black;">&#41;</span>;
  gtk_grid_attach <span style="color: black;">&#40;</span>GTK_GRID<span style="color: black;">&#40;</span>grid<span style="color: black;">&#41;</span>, label, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span><span style="color: black;">&#41;</span>;
&nbsp;
  coord.coordx = gtk_label_new <span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;0&quot;</span><span style="color: black;">&#41;</span>;
  gtk_grid_attach <span style="color: black;">&#40;</span>GTK_GRID<span style="color: black;">&#40;</span>grid<span style="color: black;">&#41;</span>, coord.coordx, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span><span style="color: black;">&#41;</span>;
&nbsp;
  coord.coordy = gtk_label_new <span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;0&quot;</span><span style="color: black;">&#41;</span>;
  gtk_grid_attach <span style="color: black;">&#40;</span>GTK_GRID<span style="color: black;">&#40;</span>grid<span style="color: black;">&#41;</span>, coord.coordy, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span><span style="color: black;">&#41;</span>;
&nbsp;
  <span style="color: #808080;">// Connexion du signal &quot;draw&quot;. Dans ce callback on va pouvoir acc&eacute;der &agrave; la fen&ecirc;tre root</span>
  g_signal_connect<span style="color: black;">&#40;</span>G_OBJECT<span style="color: black;">&#40;</span>window<span style="color: black;">&#41;</span>, <span style="color: #FF0000;">&quot;draw&quot;</span>, G_CALLBACK<span style="color: black;">&#40;</span>g_callback_draw<span style="color: black;">&#41;</span>, &amp;coord<span style="color: black;">&#41;</span>;
&nbsp;
  <span style="color: #808080;">// Affichage de tout</span>
  gtk_widget_show_all<span style="color: black;">&#40;</span>window<span style="color: black;">&#41;</span>;
&nbsp;
  gtk_main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
&nbsp;
  <span style="color: #0000ff;">return</span> <span style="color: #0080ff;">EXIT_SUCCESS</span>;
<span style="color: black;">&#125;</span></pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>gerald3d</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/219706-gerald3d/b367/gtkp-v3-0-recuperer-coordonnees-souris-l-ecran/</guid>
		</item>
	</channel>
</rss>
