Renommage dossiers/fichiers après audit

This commit is contained in:
Jean Sirmai 2024-07-18 22:06:24 +02:00
parent 0e1aeb293c
commit 7213efb714
Signed by: jean
GPG Key ID: FB3115C340E057E3
25 changed files with 1025 additions and 380 deletions

804
2024-07 audit proto-gg.html Normal file
View File

@ -0,0 +1,804 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="" lang=""><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta name="generator" content="pandoc">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title>-</title>
<style>
html {
line-height: 1.5;
font-family: Georgia, serif;
font-size: 20px;
color: #1a1a1a;
background-color: #fdfdfd;
}
body {
margin: 0 auto;
max-width: 36em;
padding-left: 50px;
padding-right: 50px;
padding-top: 50px;
padding-bottom: 50px;
hyphens: auto;
overflow-wrap: break-word;
text-rendering: optimizeLegibility;
font-kerning: normal;
}
@media (max-width: 600px) {
body {
font-size: 0.9em;
padding: 1em;
}
h1 {
font-size: 1.8em;
}
}
@media print {
body {
background-color: transparent;
color: black;
font-size: 12pt;
}
p, h2, h3 {
orphans: 3;
widows: 3;
}
h2, h3, h4 {
page-break-after: avoid;
}
}
p {
margin: 1em 0;
}
a {
color: #1a1a1a;
}
a:visited {
color: #1a1a1a;
}
img {
max-width: 100%;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 1.4em;
}
h5, h6 {
font-size: 1em;
font-style: italic;
}
h6 {
font-weight: normal;
}
ol, ul {
padding-left: 1.7em;
margin-top: 1em;
}
li > ol, li > ul {
margin-top: 0;
}
blockquote {
margin: 1em 0 1em 1.7em;
padding-left: 1em;
border-left: 2px solid #e6e6e6;
color: #606060;
}
code {
font-family: Menlo, Monaco, 'Lucida Console', Consolas, monospace;
font-size: 85%;
margin: 0;
}
pre {
margin: 1em 0;
overflow: auto;
}
pre code {
padding: 0;
overflow: visible;
overflow-wrap: normal;
}
.sourceCode {
background-color: transparent;
overflow: visible;
}
hr {
background-color: #1a1a1a;
border: none;
height: 1px;
margin: 1em 0;
}
table {
margin: 1em 0;
border-collapse: collapse;
width: 100%;
overflow-x: auto;
display: block;
font-variant-numeric: lining-nums tabular-nums;
}
table caption {
margin-bottom: 0.75em;
}
tbody {
margin-top: 0.5em;
border-top: 1px solid #1a1a1a;
border-bottom: 1px solid #1a1a1a;
}
th {
border-top: 1px solid #1a1a1a;
padding: 0.25em 0.5em 0.25em 0.5em;
}
td {
padding: 0.125em 0.5em 0.25em 0.5em;
}
header {
margin-bottom: 4em;
text-align: center;
}
#TOC li {
list-style: none;
}
#TOC ul {
padding-left: 1.3em;
}
#TOC > ul {
padding-left: 0;
}
#TOC a:not(:hover) {
text-decoration: none;
}
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
ul.task-list li input[type="checkbox"] {
width: 0.8em;
margin: 0 0.8em 0.2em -1.6em;
vertical-align: middle;
}
</style>
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
<![endif]-->
</head>
<body>
<h1 id="gem-graph-client">Gem-graph client</h1>
<p>version <code>0.0</code> commit
<code>8ce7191df3652ddd6284c4ac6d8d42c3cf32d2d5</code></p>
<h2 id="audit-de-code-source-et-structure-de-projet">Audit de code
source et structure de projet</h2>
<h3 id="arborescence-des-sources">Arborescence des sources</h3>
<p>Voici larborescence de la version actuelle du projet.</p>
<pre><code>├── data
│ ├── dimers random walk.xml
│ ├── image
│ │ ├── [...]
│ └── text
│ ├── [...]
├── include
│ ├── automat.h
│ ├── base.h
│ ├── calls.h
│ ├── graph.h
│ ├── parse.h
│ └── widgets.h
├── Makefile
├── manifest.scm
├── [...]
└── src
├── automat.c
├── calls.c
├── graph.c
│ ├── area.c
│ ├── draw.c
│ ├── grid.c
│ ├── init.c
│ ├── shader.frag
│ ├── shader.vert
│ └── stack.c
├── main.c
├── parse.c
└── widget.c
├── heads.c
├── labo.c
├── rules.c
├── state.c
├── stock.c
└── tree.c
8 dossiers, 46 fichiers</code></pre>
<p>Un certain nombre délements doivent être respectés :</p>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled" checked="checked">séparation
code/headers</li>
<li><input type="checkbox" disabled="disabled" checked="checked">séparation
data/code</li>
<li><input type="checkbox" disabled="disabled" checked="checked">prise en compte de
la structure dans le Makefile</li>
<li><input type="checkbox" disabled="disabled" checked="checked">1 header = 1
sous-dossier ou fichier de <code>src</code>, excepté
<code>base.h</code></li>
<li><input type="checkbox" disabled="disabled" checked="checked">chaque sous-dossier
de <code>src</code> constitue un module clairement défini</li>
</ul>
<p>Erreurs critiques :</p>
<ul>
<li>les sous-dossiers de <code>src</code> sont nommés comme des fichiers
(<code>*.c</code>)</li>
<li>le module <code>widget</code> est mal nommé car il est pointé par le
header <code>widgets.h</code></li>
</ul>
<h3 id="analyse-formelle-des-sources">Analyse formelle des sources</h3>
<p>Généralités :</p>
<ul>
<li>le style du code manque de systématisme
<ul>
<li>la longueur des tabulations varie entre les fichiers</li>
</ul></li>
<li>beaucoup de problèmes critiques (voir ci-après)</li>
</ul>
<h4 id="analyse-des-headers">Analyse des headers</h4>
<p>Problèmes critiques relevés :</p>
<ul>
<li>3 headers sont mal nommés</li>
<li>6 headers contiennent un en-tête de licence valide selon la norme
SPDX</li>
<li>4 headers ne contiennent une directive <code>pragma once</code></li>
<li>0 headers incluent <code>base.h</code> indûment</li>
<li>1 headers nont pas un style de commentaire minimal et
systématique</li>
<li>5 headers nont pas un style de code/déclaration du projet
respecté</li>
<li>1 headers ne présentent pas des commentaires clairs et utiles</li>
<li>5 headers ont au moins une fonction non documentée</li>
<li>3 headers nomment mal les fonctions du module</li>
</ul>
<h5 id="baseh-critique-à-retravailler">base.h <code>[critique]</code>
<code>[à retravailler]</code></h5>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled" checked="checked">le nom est clair et
correspond à une fonctionnalité</li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled" checked="checked">contient une
directive <code>pragma once</code></li>
<li><input type="checkbox" disabled="disabled">ninclut pas
<code>base.h</code></li>
<li><input type="checkbox" disabled="disabled">style de commentaire minimal et
systématique<ul>
<li>commentaires au style non systématiques</li>
<li>symboles inutiles (&lt;)</li>
<li>espacement incorrect</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>enum et struct invalides</li>
</ul></li>
<li><input type="checkbox" disabled="disabled" checked="checked">clarté et utilité
des commentaires</li>
<li><input type="checkbox" disabled="disabled" checked="checked">chaque fonction est
documentée</li>
<li><input type="checkbox" disabled="disabled" checked="checked">chaque fonction est
nommée selon le module (non applicable)</li>
</ul>
<h5 id="automath-critique-à-retravailler">automat.h
<code>[critique]</code> <code>[à retravailler]</code></h5>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled">le nom est clair et correspond
à une fonctionnalité<ul>
<li>automate est un terme français non traduisible pour ce contexte</li>
<li>le terme habituel en informatique est Finite State Machine</li>
<li>fsm.h ? (serait compris par le plus grand nombre)</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled">contient une directive
<code>pragma once</code></li>
<li><input type="checkbox" disabled="disabled" checked="checked">ninclut pas
<code>base.h</code></li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>enum invalides</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">clarté et utilité des
commentaires<ul>
<li><code>xor</code> est totalement incompréhensible et inutile</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">chaque fonction est
documentée</li>
<li><input type="checkbox" disabled="disabled">chaque fonction est nommée
selon le module<ul>
<li>les fonctions ne portent pas le préfixe <code>automat_</code></li>
</ul></li>
</ul>
<h5 id="callsh-critique-à-retravailler">calls.h <code>[critique]</code>
<code>[à retravailler]</code></h5>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled">le nom est clair et correspond
à une fonctionnalité<ul>
<li>calls != callbacks, titre trompeur</li>
<li>calls =&gt; syscalls… or ça na rien à voir !!!</li>
<li>GTK appelle callbacks ce que la théorie nomme évènements (voir
“programmation évenementielle”)</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled">contient une directive
<code>pragma once</code></li>
<li><input type="checkbox" disabled="disabled" checked="checked">ninclut pas
<code>base.h</code></li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>dépassement de la limite de 80 caractères par ligne</li>
</ul></li>
<li><input type="checkbox" disabled="disabled" checked="checked">clarté et utilité
des commentaires</li>
<li><input type="checkbox" disabled="disabled">chaque fonction est
documentée</li>
<li><input type="checkbox" disabled="disabled" checked="checked">chaque fonction est
nommée selon le module<ul>
<li>les fonctions portent le préfixe <code>on_</code>, courant pour un
module dévènements</li>
</ul></li>
</ul>
<h5 id="graphh-critique-à-retravailler">graph.h <code>[critique]</code>
<code>[à retravailler]</code></h5>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled">le nom est clair et correspond
à une fonctionnalité<ul>
<li>graph != graphics, titre trompeur</li>
<li>en anglais, graph est un mot complet et pas labbréviation de
graphics</li>
<li>confusion avec le graph de gem-graph…</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled" checked="checked">contient une
directive <code>pragma once</code></li>
<li><input type="checkbox" disabled="disabled" checked="checked">inclut
<code>base.h</code> (ok car types utilisés)</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>dépassement de la limite de 80 caractères par ligne</li>
</ul></li>
<li><input type="checkbox" disabled="disabled" checked="checked">clarté et utilité
des commentaires</li>
<li><input type="checkbox" disabled="disabled">chaque fonction est
documentée</li>
<li><input type="checkbox" disabled="disabled" checked="checked">chaque fonction est
nommée selon le module<ul>
<li>les fonctions portent le préfixe <code>graph_</code></li>
</ul></li>
</ul>
<h5 id="parseh-critique-à-retravailler">parse.h <code>[critique]</code>
<code>[à retravailler]</code></h5>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled" checked="checked">le nom est clair et
correspond à une fonctionnalité</li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled">contient une directive
<code>pragma once</code></li>
<li><input type="checkbox" disabled="disabled" checked="checked">ninclut pas
<code>base.h</code></li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de
code/déclaration du projet respecté</li>
<li><input type="checkbox" disabled="disabled" checked="checked">clarté et utilité
des commentaires</li>
<li><input type="checkbox" disabled="disabled">chaque fonction est
documentée</li>
<li><input type="checkbox" disabled="disabled">chaque fonction est nommée
selon le module<ul>
<li>les fonctions ne portent pas le préfixe <code>parse_</code></li>
</ul></li>
</ul>
<h5 id="widgetsh-critique-à-retravailler">widgets.h
<code>[critique]</code> <code>[à retravailler]</code></h5>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled" checked="checked">le nom est clair et
correspond à une fonctionnalité</li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled">contient une directive
<code>pragma once</code></li>
<li><input type="checkbox" disabled="disabled" checked="checked">ninclut pas
<code>base.h</code></li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>dépassement de la limite des 80 caractères</li>
</ul></li>
<li><input type="checkbox" disabled="disabled" checked="checked">clarté et utilité
des commentaires</li>
<li><input type="checkbox" disabled="disabled">chaque fonction est
documentée</li>
<li><input type="checkbox" disabled="disabled">chaque fonction est nommée
selon le module<ul>
<li>les fonctions ne portent pas toutes le préfixe
<code>widget_</code></li>
</ul></li>
</ul>
<h4 id="analyse-du-code">Analyse du code</h4>
<p>Problèmes critiques relevés :</p>
<ul>
<li>9 fichiers de code ou module sont mal nommés</li>
<li>15 fichiers de code contiennent un en-tête de licence valide selon
la norme SPDX</li>
<li>3 fichiers de code nont pas un style de commentaire minimal et
systématique</li>
<li>12 fichiers de code nont pas un style de code/déclaration du projet
respecté</li>
<li>13 fichiers de code ne présentent pas des commentaires clairs et
utiles</li>
</ul>
<h5 id="mainc-critique-à-retravailler">main.c <code>[critique]</code>
<code>[à retravailler]</code></h5>
<ul>
<li><p><input type="checkbox" disabled="disabled" checked="checked">le nom est clair
et correspond à une fonctionnalité</p></li>
<li><p><input type="checkbox" disabled="disabled">contient un en-tête de
licence valide selon la norme SPDX</p></li>
<li><p><input type="checkbox" disabled="disabled" checked="checked">style de
commentaire minimal et systématique</p></li>
<li><p><input type="checkbox" disabled="disabled" checked="checked">style de
code/déclaration du projet respecté</p></li>
<li><p><input type="checkbox" disabled="disabled" checked="checked">clarté et utilité
des commentaires</p></li>
<li><p><code>@:340</code> lid de lapplication est incohérent</p></li>
</ul>
<h5 id="automatc-critique-à-retravailler">automat.c
<code>[critique]</code> <code>[à retravailler]</code></h5>
<ul>
<li><input type="checkbox" disabled="disabled">le nom est clair et correspond
à une fonctionnalité</li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>dépassement de la limite de 80 caractères</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">clarté et utilité des
commentaires<ul>
<li>commentaires inline complètement incompréhensibles/cryptiques</li>
<li>documentation des fonctions statiques absente</li>
</ul></li>
<li>le formattage de variables en mi-minuscule mi-majuscule est
illisible</li>
<li>lutilisation du terme “prescribed” est inhabituel et
incompréhensible</li>
<li><code>@:101:get_str_STATE_RULES_DATA()</code> très sous-optimal
<ul>
<li>on ne devrait jamais retourner des chaînes de caractères.</li>
<li>un tableau de hashage ferait mieux laffaire quune fonction avec un
switch</li>
</ul></li>
</ul>
<h5 id="callsc-critique-à-retravailler">calls.c <code>[critique]</code>
<code>[à retravailler]</code></h5>
<ul>
<li><input type="checkbox" disabled="disabled">le nom est clair et correspond
à une fonctionnalité</li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>dépassement de la limite de 80 caractères</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">clarté et utilité des
commentaires<ul>
<li>documentation des fonctions statiques absente</li>
<li>certains commentaires perfectibles</li>
</ul></li>
<li>le formattage de fonction en mi-minuscule mi-majuscule est
illisible</li>
<li>de manière générale, le nommage des évènements est peu clair
<ul>
<li>il faut séparer loutil de ce quil représente (bouton vs
états)</li>
</ul></li>
<li><code>@:249:switch_STATE_RULES_DATA()</code>
<ul>
<li>le switch pourrait être remplacé par une table de hashage de
pointeurs sur fonction (beaucoup plus optimal)</li>
<li>le nommage de cette fonction est trompeur (ça ne switch pas
létat)</li>
</ul></li>
</ul>
<h5 id="parsec-critique-à-retravailler">parse.c <code>[critique]</code>
<code>[à retravailler]</code></h5>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled" checked="checked">le nom est clair et
correspond à une fonctionnalité</li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>dépassement de la limite de 80 caractères</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">clarté et utilité des
commentaires<ul>
<li>documentation des fonctions statiques absente</li>
</ul></li>
</ul>
<h5 id="module-graphc-critique-à-retravailler">module graph.c
<code>[critique]</code> <code>[à retravailler]</code></h5>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled">le nom est clair et correspond
à une fonctionnalité</li>
</ul>
<h6 id="areac-critique-à-retravailler">area.c <code>[critique]</code>
<code>[à retravailler]</code></h6>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled">le nom est clair et correspond
à une fonctionnalité<ul>
<li>ne gère pas une “area” mais gère une pile darea et leurs
environnements</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>dépassement de la limite de 80 caractères</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">clarté et utilité des
commentaires<ul>
<li>manque pas mal de commentaires, des fonctions sont documentés au
mauvais endroit</li>
</ul></li>
</ul>
<h6 id="drawc-critique-à-retravailler">draw.c <code>[critique]</code>
<code>[à retravailler]</code></h6>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled">le nom est clair et correspond
à une fonctionnalité<ul>
<li>ne gère pas une “area” mais gère une pile darea et leurs
environnements</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>dépassement de la limite de 80 caractères</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">clarté et utilité des
commentaires<ul>
<li>manque pas mal de commentaires, des fonctions sont documentés au
mauvais endroit</li>
</ul></li>
</ul>
<h6 id="gridc-critique-à-retravailler">grid.c <code>[critique]</code>
<code>[à retravailler]</code></h6>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled" checked="checked">le nom est clair et
correspond à une fonctionnalité</li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled">style de commentaire minimal et
systématique<ul>
<li>les commentaires inline sont mal formatés</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>dépassement de la limite de 80 caractères</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">clarté et utilité des
commentaires<ul>
<li>QUASI RIEN !</li>
</ul></li>
</ul>
<h6 id="initc-critique-à-retravailler">init.c <code>[critique]</code>
<code>[à retravailler]</code></h6>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled" checked="checked">le nom est clair et
correspond à une fonctionnalité</li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>dépassement de la limite de 80 caractères</li>
</ul></li>
<li><input type="checkbox" disabled="disabled" checked="checked">clarté et utilité
des commentaires<ul>
<li>peut toujours mieux faire mais ok</li>
</ul></li>
</ul>
<h6 id="shaderfrag-critique-à-retravailler">shader.frag
<code>[critique]</code> <code>[à retravailler]</code></h6>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled" checked="checked">le nom est clair et
correspond à une fonctionnalité</li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de
code/déclaration du projet respecté</li>
<li><input type="checkbox" disabled="disabled">clarté et utilité des
commentaires<ul>
<li>à commenter</li>
</ul></li>
</ul>
<h6 id="shadervert-critique-à-retravailler">shader.vert
<code>[critique]</code> <code>[à retravailler]</code></h6>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled" checked="checked">le nom est clair et
correspond à une fonctionnalité</li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de
code/déclaration du projet respecté</li>
<li><input type="checkbox" disabled="disabled">clarté et utilité des
commentaires<ul>
<li>à commenter</li>
</ul></li>
</ul>
<h6 id="stackc-critique-à-retravailler">stack.c <code>[critique]</code>
<code>[à retravailler]</code></h6>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled" checked="checked">le nom est clair et
correspond à une fonctionnalité</li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de
code/déclaration du projet respecté</li>
<li><input type="checkbox" disabled="disabled">clarté et utilité des
commentaires<ul>
<li>il faut commenter davantage, cest trop peu</li>
</ul></li>
</ul>
<h5 id="module-widgetc-critique-à-retravailler">module widget.c
<code>[critique]</code> <code>[à retravailler]</code></h5>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled" checked="checked">le nom est clair et
correspond à une fonctionnalité</li>
</ul>
<h6 id="headsc-critique-à-retravailler">heads.c <code>[critique]</code>
<code>[à retravailler]</code></h6>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled">le nom est clair et correspond
à une fonctionnalité<ul>
<li>heads != headers…</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>dépassement limite 80 caractères</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">clarté et utilité des
commentaires<ul>
<li>il faut commenter, quasi rien de fait</li>
</ul></li>
</ul>
<h6 id="laboc-critique-à-retravailler">labo.c <code>[critique]</code>
<code>[à retravailler]</code></h6>
<p><em>You who enter here, leave all hope of an understandable
code</em></p>
<p>Ok, je saute.</p>
<h6 id="rulesc-critique-à-retravailler">rules.c <code>[critique]</code>
<code>[à retravailler]</code></h6>
<ul>
<li><input type="checkbox" disabled="disabled">le nom est clair et correspond
à une fonctionnalité<ul>
<li>confusion entre loutil (les arbres, les treeview, etc) et la
structure de données affichée (règles).</li>
<li>à nommer différemment, selon la fonction réelle</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>dépassement limite 80 caractères</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">clarté et utilité des
commentaires<ul>
<li>il faut commenter, quasi rien de fait</li>
</ul></li>
<li><code>@:32</code> En GTK4, il ne faut jamais utiliser la taille de
fenêtre comme comme référence ou aide au layout. Ce nest pas dans
lesprit de lAPI. On utilisera plutôt les méthodes de layout (GtkGrid
par exemple).</li>
<li>de manière générale : les fonctions commençant par <code>get</code>
devraient être des des getters. Cest à dire renvoyer des valeurs et non
pas des widgets ! Cest un nommage trompeur et problématique.</li>
</ul>
<h6 id="statec-critique-à-retravailler">state.c <code>[critique]</code>
<code>[à retravailler]</code></h6>
<ul>
<li><input type="checkbox" disabled="disabled">le nom est clair et correspond
à une fonctionnalité<ul>
<li>nom trop commun et pas assez clair</li>
<li>state machine (cest ce que cest) mais en terme de widget ?</li>
<li>séparer la logique des widgets est nécessaire</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled">style de commentaire minimal et
systématique</li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>dépassement limite 80 caractères</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">clarté et utilité des
commentaires<ul>
<li>il faut commenter, quasi rien de fait</li>
</ul></li>
<li><code>@:34</code> En GTK4, il ne faut jamais utiliser la taille de
fenêtre comme comme référence ou aide au layout. Ce nest pas dans
lesprit de lAPI. On utilisera plutôt les méthodes de layout (GtkGrid
par exemple).</li>
<li>de manière générale : les fonctions commençant par <code>get</code>
devraient être des des getters. Cest à dire renvoyer des valeurs et non
pas des widgets ! Cest un nommage trompeur et problématique.</li>
</ul>
<h6 id="stockc-critique-à-retravailler">stock.c <code>[critique]</code>
<code>[à retravailler]</code></h6>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled">le nom est clair et correspond
à une fonctionnalité<ul>
<li>???</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled" checked="checked">style de commentaire
minimal et systématique</li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>dépassement limite 80 caractères</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">clarté et utilité des
commentaires<ul>
<li>pas du tout commenté</li>
</ul></li>
</ul>
<h6 id="treec-critique-à-retravailler">tree.c <code>[critique]</code>
<code>[à retravailler]</code></h6>
<ul class="task-list">
<li><input type="checkbox" disabled="disabled" checked="checked">le nom est clair et
correspond à une fonctionnalité</li>
<li><input type="checkbox" disabled="disabled">contient un en-tête de licence
valide selon la norme SPDX</li>
<li><input type="checkbox" disabled="disabled">style de commentaire minimal et
systématique</li>
<li><input type="checkbox" disabled="disabled">style de code/déclaration du
projet respecté<ul>
<li>dépassement limite 80 caractères</li>
</ul></li>
<li><input type="checkbox" disabled="disabled">clarté et utilité des
commentaires<ul>
<li>pas assez commenté</li>
</ul></li>
</ul>
</body></html>

View File

@ -7,4 +7,13 @@
// https://forge.a-lec.org/gem-graph/gem-graph-client/src/branch/devel/include/ui.h
// https://forge.a-lec.org/gem-graph/gem-graph-client/src/branch/devel/src/ui/events.c
// https://forge.a-lec.org/gem-graph/gem-graph-client/src/branch/devel/src/ui/application.c
//
// https://en.wikipedia.org/wiki/GIO_(software)
#include <unistd.h>
#include <gtk-4.0/gtk/gtk.h>
void on_preferences_action(GSimpleAction *action,
GVariant *parameter,
gpointer user_data);

View File

@ -40,6 +40,25 @@
} */
//
// https://forge.a-lec.org/gem-graph/gem-graph-client/src/branch/devel/src/ui/application.c
#include <unistd.h>
#include <gtk-4.0/gtk/gtk.h>
#define GEM_GRAPH_CLIENT_TYPE_WINDOW (gem_graph_client_window_get_type())
void on_preferences_action(GSimpleAction *action, // nom de type « GSimpleAction » inconnu
GVariant *parameter, // nom de type « GVariant » inconnu
gpointer user_data) // nom de type « gpointer » inconnu
{
// GemGraphClientApplication *self = user_data;
// g_assert(GEM_GRAPH_CLIENT_IS_APPLICATION(self));
// ui_send_internal_notification("Not implemented !");
}
/* void ui_enable_action(const char *name) {
g_simple_action_set_enabled(
(GSimpleAction *)g_action_map_lookup_action(

View File

@ -28,7 +28,7 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "../include/automat.h"
#include "../include/fsm.h"
/******************************************************************************/

View File

@ -29,10 +29,10 @@
#include "../include/automat.h"
#include "../include/calls.h"
#include "../include/widgets.h"
#include "../include/graph.h"
#include "../include/fsm.h"
#include "../include/signal.h"
#include "../include/widget.h"
#include "../include/graphics.h"
static void on_auto_notification (const char *message)

View File

@ -1,191 +0,0 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Gem-graph client *
* *
* Init OpenGL graphism *
* *
* Copyright © 2021 Libre en Communs <contact@a-lec.org> *
* Copyright © 2023 Adrien Bourmault <neox@a-lec.org> *
* Copyright © 2023 Arthur Menges <arthur.menges@a-lec.org> *
* *
* This file is part of Gem-graph. *
* *
* This program is free software: you can redistribute it and/or modify it *
* under the terms of the GNU Affero General Public License *
* as publishedby the Free Software Foundation, *
* either version 3 of the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU Affero General Public License for more details. *
* *
* You should have received a copy of the GNU Affero General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * */
/* -------------------------------------------------------------------------- */
#include "../../include/graph.h"
/* Initializes the buffer of a gl_area
* Calls according to the user preferences
* @param gl_area, ptr to the gl_area widget
* @return void
*/
void graph_init_buffers(const int stack_id)
{
struct graph_stack_t *graph_stack = NULL; // *graph_stack = &graph_stack[stack_id]; TODO
//XXX
graph_model_setup(stack_id);
GLuint vao, vertex_buffer, color_buffer;
glGenBuffers(1, &vertex_buffer);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glBufferData(GL_ARRAY_BUFFER,
graph_stack->buffer_vertex_size *
sizeof(graph_stack->buffer_vertex_origin[0]),
graph_stack->buffer_vertex_origin,
GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// colors
glGenBuffers(1, &color_buffer);
glBindBuffer(GL_ARRAY_BUFFER, color_buffer);
glBufferData(GL_ARRAY_BUFFER, graph_stack->buffer_colors_size *
sizeof(graph_stack->buffer_colors_origin[0]),
graph_stack->buffer_colors_origin,
GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// We only use one VAO, so we always keep it bound
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
graph_stack->vao = vao;
graph_stack->position_buffer = vertex_buffer;
graph_stack->color_buffer = color_buffer;
}
/*
* Initializes the shaders of a gl_area and link them to a program
*
* @param gl_area, ptr to the gl_area widget
*
* @return true if initialized
*/
bool graph_init_shaders(const int stack_id)
{
struct graph_stack_t *graph_stack = NULL; // *graph_stack = &graph_stack[stack_id]; TODO
char *vertex_shader;
char *fragment_shader;
int status;
GLuint vertex = 0, fragment; // 2024-06-05 j'initialise vertex à 0 (au pif !)
GLuint program = 0;
GLuint m = 0;
GLuint v = 0;
GLuint p = 0;
// Load vertex shader file
vertex_shader = read_file(VERTEX_SHADER_FILE);
if (vertex_shader == NULL)
return false;
vertex = graph_create_shader(stack_id, GL_VERTEX_SHADER, vertex_shader);
if(vertex == 0) {
graph_stack->program = 0;
g_free(vertex_shader);
return false;
}
// Load fragment shader file
fragment_shader = read_file(FRAG_SHADER_FILE);
if (fragment_shader == NULL)
return false;
fragment = graph_create_shader(stack_id, GL_FRAGMENT_SHADER, fragment_shader);
if(fragment == 0) {
glDeleteShader(vertex);
graph_stack->program = 0;
g_free(vertex_shader);
g_free(fragment_shader);
return false;
}
// Link shaders to program
program = glCreateProgram();
printf("\n------------------------------------------------------------------------------------------\n");
printf("[debug] graph_init_shaders() : program = %d, vertex = %d, fragment = %d\n\
exec > ** (myprogram:-----): WARNING ** : --:--:--:---: Linking failure: (address)\n",
program, vertex, fragment);
/* (myprogram:11732): WARNING **: 10:37:34.233: v plusieurs 'run' successifs
* (myprogram:11883): WARNING **: 10:38:22.979: glLinkProgram(program); < commenté
* (myprogram:11953): WARNING **: 10:38:46.170:
* (myprogram:12034): WARNING **: 10:39:14.709:
* (myprogram:12182): WARNING **: 10:40:49.788:
* > probablement la même adresse dans la librairie 'mesa' d'OpenGL (?) */
glAttachShader(program, vertex);
glAttachShader(program, fragment);
printf("Failed to link the graphic stack to widgets ! <> see init.c graph_init_shaders()\n");
printf("the error in not : vertex shader lacks `main' but : failed to link... (comment line 140)\n");
// https://registry.khronos.org/OpenGL-Refpages/gl4/html/glLinkProgram.xhtml
// glLinkProgram(program); // Linking failure: (address)
printf("------------------------------------------------------------------------------------------\n");
glGetProgramiv(program, GL_LINK_STATUS, &status); // Linking failure: (address)
if(status == GL_FALSE) {
int log_len;
char *buffer;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &log_len);
buffer = g_malloc(log_len + 1);
assert(buffer);
glGetProgramInfoLog(program, log_len, NULL, buffer);
g_warning("Linking failure:\n%s", buffer);
g_free(buffer);
glDeleteProgram(program);
program = 0;
glDeleteShader(vertex);
glDeleteShader(fragment);
g_free(vertex_shader);
g_free(fragment_shader);
return false;
}
/* Get the location of the "mvp" uniform */
m = glGetUniformLocation(program, "model_matrix");
v = glGetUniformLocation(program, "view_matrix");
p = glGetUniformLocation(program, "projection_matrix");
glDetachShader(program, vertex);
glDetachShader(program, fragment);
glDeleteShader(vertex);
glDeleteShader(fragment);
graph_stack->program = program;
graph_stack->m = m;
graph_stack->v = v;
graph_stack->p = p;
g_free(vertex_shader);
g_free(fragment_shader);
return true;
}

View File

@ -29,7 +29,7 @@
#include <cglm/cglm.h>
#include "../../include/base.h"
#include "../../include/graph.h"
#include "../../include/graphics.h"
/*
* Writes values to describe a vertex at (x,y,z) intoq the vertex buffer

View File

@ -26,7 +26,7 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "../../include/graph.h"
#include "../../include/graphics.h"
int graph_draw_space_ridges_vertex (const int stack_id,
long offset_vertex,

View File

@ -26,7 +26,7 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "../../include/graph.h"
#include "../../include/graphics.h"
#include "../../include/parse.h"
#define TEST 0
@ -227,12 +227,8 @@ bool graph_shutdown(const int id, void *error_buffer)
*/
void graph_model_setup (const int stack_id)
{
/*------------------------------------------------------------------------*/
/* I N I T I A L D A T A S P E C I F I C A T I O N */
/*------------------------------------------------------------------------*/
struct graph_stack_t *graph_stack = NULL; // *graph_stack = &graph_stack[stack_id]; TODO
char dimension;
long space_X;
@ -279,12 +275,8 @@ void graph_model_setup (const int stack_id)
multiplicity = model_get_multiplicity();
g_print("[GRAPH DEBUG] site_multiplicity = %d, density_max = %d\n", multiplicity, density_max);
/*------------------------------------------------------------------------*/
/* S P A C E D R A W I N G */
/*------------------------------------------------------------------------*/
graph_draw_space_ridges_vertex (stack_id, graph_stack->buffer_vertex_size, space_X, space_Y, space_Z);
graph_draw_space_ridges_lines (stack_id);
graph_draw_grids_on_space_faces_vertex (stack_id, space_X, space_Y, space_Z);
@ -294,12 +286,8 @@ void graph_model_setup (const int stack_id)
graph_stack->buffer_colors_0_arrow = graph_stack->buffer_colors_size;
graph_stack->buffer_lines_0_arrow = graph_stack->buffer_lines_size;
/*------------------------------------------------------------------------*/
/* A R R O W S D R A W I N G */
/*------------------------------------------------------------------------*/
char state_id[30] = {0};
struct arrow_t arrow = {0};
@ -329,3 +317,163 @@ void graph_model_setup (const int stack_id)
g_printerr("ARGH : not all arrows have been parsed !\n");
}
/* Initializes the buffer of a gl_area
* Calls according to the user preferences
* @param gl_area, ptr to the gl_area widget
* @return void
*/
void graph_init_buffers(const int stack_id)
{
struct graph_stack_t *graph_stack = NULL; // *graph_stack = &graph_stack[stack_id]; TODO
//XXX
graph_model_setup(stack_id);
GLuint vao, vertex_buffer, color_buffer;
glGenBuffers(1, &vertex_buffer);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glBufferData(GL_ARRAY_BUFFER,
graph_stack->buffer_vertex_size *
sizeof(graph_stack->buffer_vertex_origin[0]),
graph_stack->buffer_vertex_origin,
GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// colors
glGenBuffers(1, &color_buffer);
glBindBuffer(GL_ARRAY_BUFFER, color_buffer);
glBufferData(GL_ARRAY_BUFFER, graph_stack->buffer_colors_size *
sizeof(graph_stack->buffer_colors_origin[0]),
graph_stack->buffer_colors_origin,
GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// We only use one VAO, so we always keep it bound
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
graph_stack->vao = vao;
graph_stack->position_buffer = vertex_buffer;
graph_stack->color_buffer = color_buffer;
}
/*
* Initializes the shaders of a gl_area and link them to a program
*
* @param gl_area, ptr to the gl_area widget
*
* @return true if initialized
*/
bool graph_init_shaders(const int stack_id)
{
struct graph_stack_t *graph_stack = NULL; // *graph_stack = &graph_stack[stack_id]; TODO
char *vertex_shader;
char *fragment_shader;
int status;
GLuint vertex = 0, fragment; // 2024-06-05 j'initialise vertex à 0 (au pif !)
GLuint program = 0;
GLuint m = 0;
GLuint v = 0;
GLuint p = 0;
// Load vertex shader file
vertex_shader = read_file(VERTEX_SHADER_FILE);
if (vertex_shader == NULL)
return false;
vertex = graph_create_shader(stack_id, GL_VERTEX_SHADER, vertex_shader);
if(vertex == 0) {
graph_stack->program = 0;
g_free(vertex_shader);
return false;
}
// Load fragment shader file
fragment_shader = read_file(FRAG_SHADER_FILE);
if (fragment_shader == NULL)
return false;
fragment = graph_create_shader(stack_id, GL_FRAGMENT_SHADER, fragment_shader);
if(fragment == 0) {
glDeleteShader(vertex);
graph_stack->program = 0;
g_free(vertex_shader);
g_free(fragment_shader);
return false;
}
// Link shaders to program
program = glCreateProgram();
printf("\n------------------------------------------------------------------------------------------\n");
printf("[debug] graph_init_shaders() : program = %d, vertex = %d, fragment = %d\n\
exec > ** (myprogram:-----): WARNING ** : --:--:--:---: Linking failure: (address)\n",
program, vertex, fragment);
/* (myprogram:11732): WARNING **: 10:37:34.233: v plusieurs 'run' successifs
* (myprogram:11883): WARNING **: 10:38:22.979: glLinkProgram(program); < commenté
* (myprogram:11953): WARNING **: 10:38:46.170:
* (myprogram:12034): WARNING **: 10:39:14.709:
* (myprogram:12182): WARNING **: 10:40:49.788:
* > probablement la même adresse dans la librairie 'mesa' d'OpenGL (?) */
glAttachShader(program, vertex);
glAttachShader(program, fragment);
printf("Failed to link the graphic stack to widgets ! <> see init.c graph_init_shaders()\n");
printf("the error in not : vertex shader lacks `main' but : failed to link... (comment line 140)\n");
// https://registry.khronos.org/OpenGL-Refpages/gl4/html/glLinkProgram.xhtml
// glLinkProgram(program); // Linking failure: (address)
printf("------------------------------------------------------------------------------------------\n");
glGetProgramiv(program, GL_LINK_STATUS, &status); // Linking failure: (address)
if(status == GL_FALSE) {
int log_len;
char *buffer;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &log_len);
buffer = g_malloc(log_len + 1);
assert(buffer);
glGetProgramInfoLog(program, log_len, NULL, buffer);
g_warning("Linking failure:\n%s", buffer);
g_free(buffer);
glDeleteProgram(program);
program = 0;
glDeleteShader(vertex);
glDeleteShader(fragment);
g_free(vertex_shader);
g_free(fragment_shader);
return false;
}
/* Get the location of the "mvp" uniform */
m = glGetUniformLocation(program, "model_matrix");
v = glGetUniformLocation(program, "view_matrix");
p = glGetUniformLocation(program, "projection_matrix");
glDetachShader(program, vertex);
glDetachShader(program, fragment);
glDeleteShader(vertex);
glDeleteShader(fragment);
graph_stack->program = program;
graph_stack->m = m;
graph_stack->v = v;
graph_stack->p = p;
g_free(vertex_shader);
g_free(fragment_shader);
return true;
}

View File

@ -25,8 +25,8 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "../../include/graph.h"
#include "../../include/calls.h"
#include "../../include/graphics.h"
#include "../../include/signal.h"
struct stack_index_t {
long stack_id;

View File

@ -30,7 +30,7 @@
#include "../include/calls.h"
#include "../include/signal.h"
/* Comment renommer les fonctions ?
* Cette question dépend de plusieurs choix
@ -337,7 +337,7 @@ int main (int argc, char **argv)
GtkApplication *app;
int status;
app = gtk_application_new ("org.jean.gg_hack", G_APPLICATION_DEFAULT_FLAGS);
app = gtk_application_new ("org.gem-graph", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect (app, "activate", G_CALLBACK (on_windows_activation), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);

View File

@ -1,132 +0,0 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Gem-graph client *
* *
* Tree *
* *
* Copyright © 2021 Libre en Communs <contact@a-lec.org> *
* Copyright © 2021 Adrien Bourmault <neox@a-lec.org> *
* Copyright © 2021 Jean Sirmai <jean@a-lec.org> *
* *
* This file is part of Gem-graph. *
* *
* This program is free software: you can redistribute it and/or modify it *
* under the terms of the GNU Affero General Public License *
* as published by the Free Software Foundation, *
* either version 3 of the License, *
* or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; *
* without even the implied warranty of MERCHANTABILITY *
* or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU Affero General Public License for more details. *
* *
* You should have received a copy of the GNU Affero General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "../../include/calls.h"
#include "../../include/widgets.h"
// GTK_ORIENTATION_VERTICAL GTK_ORIENTATION_HORIZONTAL
static void add_menu_item (struct MenuNode_t *parent, struct MenuNode_t *child){
if (parent->child) {
struct MenuNode_t *cur = parent->child;
while (cur && cur->next) {cur = cur->next;}
cur->next = child;
} else parent->child = child;
}
struct MenuNode_t *create_user_menu_node (const gchar* text){
struct MenuNode_t *node = g_malloc0 (sizeof(struct MenuNode_t));
node->text = g_strdup (text);
node->child = NULL; // if (0) printf("create_user_menu_node %s\n", text);
return node;
}
static GListModel* get_user_menu_model_child (struct MenuNode_t *parent){
GtkStringList *list = NULL;
if (parent) {
if (0) printf("[get_user_menu_model_child] here is %s content : ", parent->text);
struct MenuNode_t *child = parent->child;
if (child) {list = gtk_string_list_new(NULL);}
while(child) {
gtk_string_list_append(list, child->text);
if (0) printf("%s ", child->text);
child = child->next;
}
} // else printf("hot.c GListModel* get_user_menu_model_child (struct MenuNode_t *parent) child = %d \n", parent);
if (0) printf("\n");
return G_LIST_MODEL(list);
}
static GListModel* get_user_menu_model (GObject *item, gpointer root){
struct MenuNode_t *cur = (struct MenuNode_t *)root;
struct MenuNode_t *parent = root;
const gchar *string = gtk_string_object_get_string (GTK_STRING_OBJECT (item));
while (cur) {
if (strcmp(string, cur->text) == 0) break;
cur = cur->next;
if (cur == NULL) {cur = parent->child; parent = cur;}
}
if (0) printf("[get_user_user_menu_model] looked for %s in %s item\n", cur->text, string);
// ! WARNING ! TODO CUR EST L'ENFANT, MAINTENANT DONC, SI CUR EST UNE FEUILLE, JE N'ATTEINDRAI PAS SON ENFANT
return get_user_menu_model_child (cur);
}
GtkWidget *get_menu_anchor()
{
// https://docs.gtk.org/gio/class.MenuModel.html
// https://www.geany.org/manual/gtk/gobject/index.html
// https://developer.gnome.org/hig/patterns/controls/menus.html
if (0) labo_create_a_simple_gtk_string_list ();
struct MenuNode_t *menu_root = create_user_menu_node("menu");
struct MenuNode_t *item_a = create_user_menu_node("item_a");add_menu_item (menu_root, item_a);
struct MenuNode_t *item_b = create_user_menu_node("item_b");add_menu_item (menu_root, item_b);
struct MenuNode_t *item_c = create_user_menu_node("item_c");add_menu_item (menu_root, item_c);
// GtkWidget* list_box = gtk_list_box_new();
GtkStringList *model = gtk_string_list_new (NULL);
gtk_string_list_append (model, menu_root->text);
GtkSignalListItemFactory *factory = GTK_SIGNAL_LIST_ITEM_FACTORY (gtk_signal_list_item_factory_new());
g_signal_connect (factory, "setup", G_CALLBACK(on_setup_user_menu_factory), NULL);
g_signal_connect (factory, "bind", G_CALLBACK(on_bind_user_menu_factory), NULL);
GtkTreeListModel *menu_model = gtk_tree_list_model_new (
G_LIST_MODEL (model),
FALSE, // Passthrough - False in actual usage with dynamic children retrieval
FALSE, // TRUE, // FALSE, // autoexpand
(GtkTreeListModelCreateModelFunc) &get_user_menu_model,
menu_root,
NULL // (GDestroyNotify) free_user_menu_node
);
GtkSingleSelection *selection_model = gtk_single_selection_new (G_LIST_MODEL (menu_model));
gtk_single_selection_set_autoselect (selection_model, FALSE);
gtk_single_selection_set_can_unselect (selection_model, TRUE);
GtkWidget *list_view = gtk_list_view_new (GTK_SELECTION_MODEL (selection_model),
GTK_LIST_ITEM_FACTORY (factory));
return list_view;
}
/*
GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (gtk_scrolled_window_new());
// Allocation height too small. Tried to allocate 1922x1030, but GtkNotebook 0x25cd4c0 needs at least 1922x1064.
// even if I remove (comment) the next line :
gtk_scrolled_window_set_child (scrolled_window, list_view);
gtk_scrolled_window_set_policy (scrolled_window, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_widget_set_vexpand (GTK_WIDGET (scrolled_window), TRUE);
gtk_widget_set_visible (GTK_WIDGET (scrolled_window), TRUE);
gtk_widget_set_visible (GTK_WIDGET (list_view), TRUE);
return scrolled_window;
}
*/

View File

@ -27,7 +27,7 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "../../include/widgets.h"
#include "../../include/widget.h"
// (NB à terme, labo.c disparaitra, bien sûr !)

View File

@ -27,7 +27,7 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "../../include/widgets.h"
#include "../../include/widget.h"
#define W 1920 // TODO 2024-06-30
#define H 960 // Ad hoc (pour mon écran)

View File

@ -27,9 +27,9 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "../../include/automat.h"
#include "../../include/widgets.h"
#include "../../include/calls.h"
#include "../../include/fsm.h"
#include "../../include/widget.h"
#include "../../include/signal.h"
#define W 1920 // TODO 2024-06-30 (Ad hoc pour mon écran)
#define H 960

View File

@ -28,8 +28,8 @@
#include "../../include/base.h"
#include "../../include/calls.h"
#include "../../include/widgets.h"
#include "../../include/signal.h"
#include "../../include/widget.h"
GtkWidget *get_STOCK_page () {
GtkBox *data_box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 32));

View File

@ -29,8 +29,8 @@
#include "../../include/base.h"
#include "../../include/calls.h"
#include "../../include/widgets.h"
#include "../../include/signal.h"
#include "../../include/widget.h"
#define W_TEXT_WINDOW 700
#define H_TEXT_WINDOW 1000
@ -122,7 +122,7 @@ void widget_head_DIALOG_WINDOW_design (GtkWindow *main_window, GtkWindow *dialog
/******************************************************************************/
/* M A I N W I N D O W C E N T E R */
/* M A I N W I N D O W H E A D C E N T E R */
/******************************************************************************/
static GtkWidget *window_header_bar (GtkWindow *window);
@ -150,7 +150,7 @@ static GtkWidget *window_header_bar (GtkWindow *window)
/******************************************************************************/
/* M A I N W I N D O W L E F T */
/* M A I N W I N D O W H E A D L E F T */
/******************************************************************************/
static void window_header_bar_left (GtkWidget *header_bar)
@ -189,7 +189,7 @@ static void window_header_bar_left (GtkWidget *header_bar)
/******************************************************************************/
/* M A I N W I N D O W R I G H T */
/* M A I N W I N D O W H E A D R I G H T */
/******************************************************************************/
static void connect(GApplication *app, gpointer *data) { puts("Connect menu item clicked.\n"); }
@ -214,12 +214,10 @@ static void window_header_bar_right (GtkWidget *header_bar)
GtkWidget* list_box = gtk_list_box_new();
GtkWidget *menu_item_A;
if (0) menu_item_A = GTK_WIDGET (g_menu_item_new ("A", "activate"));
else menu_item_A = GTK_WIDGET (gtk_label_new("A")); gtk_list_box_append (GTK_LIST_BOX (list_box), menu_item_A);
GtkWidget *menu_item_B = GTK_WIDGET (gtk_label_new("B")); gtk_list_box_append (GTK_LIST_BOX (list_box), menu_item_B);
GtkWidget *menu_item_C = GTK_WIDGET (gtk_label_new("C")); gtk_list_box_append (GTK_LIST_BOX (list_box), menu_item_C);
// gtk_menu_item_activate (menu_item_C);
GtkWidget *label_A = GTK_WIDGET (gtk_label_new("A")); gtk_list_box_append (GTK_LIST_BOX (list_box), label_A);
GtkWidget *label_B = GTK_WIDGET (gtk_label_new("B")); gtk_list_box_append (GTK_LIST_BOX (list_box), label_B);
GtkWidget *label_C = GTK_WIDGET (gtk_label_new("C")); gtk_list_box_append (GTK_LIST_BOX (list_box), label_C);
// gtk_menu_item_activate (label_C);
// https://discourse.gnome.org/t/when-do-we-really-have-to-use-gtk-popover-present-to-show-a-popover-at-a-given-widget/17566/5
GtkWidget *pop = gtk_popover_new ();
@ -240,23 +238,13 @@ static void window_header_bar_right (GtkWidget *header_bar)
GSimpleAction *act_connect = g_simple_action_new("connect", NULL);
// g_action_map_add_action(G_ACTION_MAP(app), G_ACTION(act_connect));
g_signal_connect(act_connect, "activate", G_CALLBACK(connect), NULL);
// GMenuItem *menu_item_E = g_menu_item_new("connect", "app.connect");
// gtk_list_box_append (GTK_LIST_BOX (list_box), GTK_WIDGET (menu_item_E));
// GMenuItem *label_E = g_menu_item_new("connect", "app.connect");
// gtk_list_box_append (GTK_LIST_BOX (list_box), GTK_WIDGET (label_E));
g_signal_connect (open_menu, "activate", G_CALLBACK (on_clicked_menu_experiment), list_box);
// signal 'clicked' is invalid for instance '0xbcb2900' of type 'GtkMenuButton'
// signal 'clicked' is invalid for instance '0x2c992b9' of type 'GtkPopover'
// signal 'clicked' is invalid for instance '0x2812f80' of type 'GtkListBox'
// signal 'clicked' is invalid for instance '0x2a15120' of type 'GtkLabel'
//
// signal 'activate' is invalid for instance '0x3c3de7a' of type 'GtkPopover'
// signal 'activate' is invalid for instance '0x3d62f80' of type 'GtkListBox'
// signal 'activate' is invalid for instance '0x17fb93d' of type 'GtkLabel'
@ -292,7 +280,7 @@ static void window_header_bar_right (GtkWidget *header_bar)
printf("selected_row = %s\n",
gtk_button_get_label (GTK_BUTTON (gtk_list_box_row_get_child (selected_row))));
// g_signal_connect (menu_item_C, "clicked", G_CALLBACK (on_clicked_HOME), no_local_data);
// g_signal_connect (label_C, "clicked", G_CALLBACK (on_clicked_HOME), no_local_data);
}

View File

@ -28,8 +28,8 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "../../include/calls.h"
#include "../../include/widgets.h"
#include "../../include/signal.h"
#include "../../include/widget.h"
// GTK_ORIENTATION_VERTICAL GTK_ORIENTATION_HORIZONTAL