2024-10-14 11:15:13 +02:00
|
|
|
/*******************************************************************************
|
2024-07-09 05:00:44 +02:00
|
|
|
*
|
2024-10-14 11:15:13 +02:00
|
|
|
* Gem-graph client
|
|
|
|
* Main functions
|
2024-07-09 10:45:26 +02:00
|
|
|
*
|
2024-10-14 11:15:13 +02:00
|
|
|
* Copyright © 2021 Libre en Communs <contact@a-lec.org>
|
|
|
|
* Copyright © 2021 Arthur Menges <arthur.menges@a-lec.org>
|
|
|
|
* Copyright © 2021-2024 Adrien Bourmault <neox@a-lec.org>
|
|
|
|
* Copyright © 2021-2024 Jean Sirmai <jean@a-lec.org>
|
2024-07-09 05:00:44 +02:00
|
|
|
*
|
2024-10-14 11:15:13 +02:00
|
|
|
* 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.
|
2024-07-29 05:46:10 +02:00
|
|
|
*
|
2024-10-14 11:15:13 +02:00
|
|
|
* 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.
|
2024-07-09 05:00:44 +02:00
|
|
|
*
|
2024-10-14 11:15:13 +02:00
|
|
|
* 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/>.
|
2024-07-09 05:00:44 +02:00
|
|
|
*
|
2024-10-14 11:15:13 +02:00
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @file
|
|
|
|
* @brief gem-graph-client main file
|
2024-07-07 07:25:08 +02:00
|
|
|
*
|
2024-10-14 11:15:13 +02:00
|
|
|
* @details
|
|
|
|
*
|
|
|
|
* Sur quel modèle se guider pour structurer le client gem-graph ?
|
|
|
|
*
|
|
|
|
* https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel
|
|
|
|
* https://en.wikipedia.org/wiki/Multitier_architecture
|
2024-10-03 09:10:37 +02:00
|
|
|
*
|
|
|
|
*
|
|
|
|
* ORGANISATION ACTUELLE (Octobre 2024)
|
2024-07-07 07:25:08 +02:00
|
|
|
*
|
2024-10-14 11:15:13 +02:00
|
|
|
* 1) Les structures hierarchiques.
|
2024-07-08 22:05:15 +02:00
|
|
|
* --------------------------------
|
2024-07-07 07:25:08 +02:00
|
|
|
*
|
2024-07-19 10:54:32 +02:00
|
|
|
* La description du 'design' des fenêtres se trouve dans le dossier 'widget'
|
2024-07-29 05:46:10 +02:00
|
|
|
* et s'organise naturellement en arborescence,
|
|
|
|
* en se calquant sur l'arborescence des widgets eux-mêmes.
|
2024-07-19 10:54:32 +02:00
|
|
|
*
|
|
|
|
* Il sera donc facile de répartir cette description en dossiers et fichiers
|
|
|
|
* au fur à mesure de son développement.
|
2024-07-06 23:09:47 +02:00
|
|
|
*
|
2024-07-07 07:25:08 +02:00
|
|
|
* Actuellement, par exemple, la fenêtre principale comporte :
|
2024-07-19 10:54:32 +02:00
|
|
|
* > une barre de titre (décrite dans 'topbar') et
|
2024-07-07 07:25:08 +02:00
|
|
|
* > un widget 'child' (la partie sous la barre de titre)
|
|
|
|
* qui peut prendre au moins trois apparences différentes :
|
2024-07-29 05:46:10 +02:00
|
|
|
* - state (montre l'état de l'espace et les commandes associées)
|
|
|
|
* - rules (les règles et les commandes associées)
|
|
|
|
* - stock (les données provenant des mesures, les outils d'analyse, etc.)
|
|
|
|
* (nom provisoire : mal défini à ce stade; fonctions à répartir...)
|
2024-07-07 07:25:08 +02:00
|
|
|
*
|
|
|
|
* La fenêtre principale s'ouvre sur la vue de l'état ('state.c') en mode 'EXEC'.
|
2024-07-06 23:09:47 +02:00
|
|
|
* Cette vue comporte trois panneaux (widgets) principaux:
|
|
|
|
* sup, moyen, inf ou encore: CONTRAST, CAMERA, CONTROL ou EDIT
|
|
|
|
* si on veut les nommer d'après leur fonction.
|
|
|
|
*
|
|
|
|
* Lorsque la description de chaque widget s'affinera
|
2024-07-07 07:25:08 +02:00
|
|
|
* et demandera plus de place, ces trois widgets principaux
|
2024-07-06 23:09:47 +02:00
|
|
|
* deviendront des dossiers et les widgets qu'ils contiennent
|
|
|
|
* des fichiers (ou des dossiers si besoin) et ainsi de suite...
|
|
|
|
*
|
2024-07-08 22:05:15 +02:00
|
|
|
*
|
|
|
|
* 2) Les structures transversales.
|
|
|
|
* --------------------------------
|
2024-07-07 07:25:08 +02:00
|
|
|
*
|
2024-08-19 22:53:47 +02:00
|
|
|
* Les fonctions 'transversales' comme celles de 'graphics', 'parse', 'fsm', 'prefer',
|
|
|
|
* et peut-être des structures communes à tous les arbres, listes, etc.
|
2024-07-08 22:05:15 +02:00
|
|
|
* doivent pouvoir être accédées directement
|
|
|
|
* sans avoir à passer par la hiérarchie des widgets et/ou callbacks.
|
|
|
|
* Elles restent à la racine: 'src/
|
2024-07-07 07:25:08 +02:00
|
|
|
*
|
|
|
|
*
|
2024-07-19 10:54:32 +02:00
|
|
|
* 'finite state machine' ('fsm') va centraliser l'identification
|
2024-07-07 07:25:08 +02:00
|
|
|
* des états (apparences) de la fenêtre et des transitions entre ces apparences;
|
2024-07-08 22:05:15 +02:00
|
|
|
* Elle sera probablement décomposée en de nombreux 'sous-automates'
|
|
|
|
* tels que chaque état de la fenêtre soit une combinaison unique
|
2024-07-07 07:25:08 +02:00
|
|
|
* des états de ces sous-automates.
|
|
|
|
*
|
2024-07-09 23:03:11 +02:00
|
|
|
* Exemple, muni des deux 'sous-automates' :
|
|
|
|
* > { EXEC, EDIT }; // xor
|
|
|
|
* > { STATE, RULES, DATA }; // xor
|
2024-07-19 12:00:46 +02:00
|
|
|
* la 'finite state machine' peut se trouver dans 2 x 3 = 6 états.
|
|
|
|
* (voir fsm.h lignes 40-41)
|
2024-07-09 23:03:11 +02:00
|
|
|
*
|
|
|
|
*
|
2024-07-07 07:25:08 +02:00
|
|
|
* Les grandes fonctions du client seront lancées par cette state machine :
|
|
|
|
* - édition automatique (optimisation) de l'arbre des conditions
|
|
|
|
* - tests sur un mini-serveur local
|
2024-07-08 22:05:15 +02:00
|
|
|
* - analyses de données...
|
2024-07-06 23:09:47 +02:00
|
|
|
*
|
2024-07-08 22:05:15 +02:00
|
|
|
*
|
2024-07-29 05:46:10 +02:00
|
|
|
* Leur recueil et la mémorisation des préférences des utilisateurs
|
|
|
|
* sont des fonctions centrales
|
|
|
|
* mais leur mise en oeuvre suivra probalement des voies hiérarchiques.
|
2024-07-07 07:25:08 +02:00
|
|
|
*
|
|
|
|
* On peut prévoir des préférences concernant l'apparence des widgets,
|
|
|
|
* les traductions, les 'disabilities'; etc.
|
|
|
|
* mais aussi concernant les méthodes de travail, l'usage des outils d'analyse, etc.
|
|
|
|
* >> des 'scripts' pour des 'méta-fonctions' (des 'macros') ?
|
2024-07-08 07:52:27 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
2024-07-20 19:04:08 +02:00
|
|
|
#include "../include/widget.h"
|
|
|
|
#include "../include/signal.h"
|
2024-08-19 22:53:47 +02:00
|
|
|
#include "../include/fsm.h"
|
2024-07-20 19:04:08 +02:00
|
|
|
|
2024-10-14 11:15:13 +02:00
|
|
|
/** phantom documentation used to test the functioning of doxygen */
|
|
|
|
|
2024-06-29 17:05:13 +02:00
|
|
|
int main (int argc, char **argv)
|
|
|
|
{
|
2024-09-16 16:23:45 +02:00
|
|
|
// def: src/fsm/dispatch fsm = finite state machine
|
2024-09-22 22:47:52 +02:00
|
|
|
fsm_init ("first instruction / first log");
|
2024-09-24 11:58:48 +02:00
|
|
|
fsm_journal_event (INFO, MAIN, "main", "*app = gtk_application_new()",
|
2024-09-24 17:15:39 +02:00
|
|
|
"| 👉️ app initialization requested");
|
2024-09-11 10:23:07 +02:00
|
|
|
GtkApplication *app = gtk_application_new ("org.gem-graph",
|
|
|
|
G_APPLICATION_DEFAULT_FLAGS);
|
2024-09-16 16:23:45 +02:00
|
|
|
|
2024-09-22 22:47:52 +02:00
|
|
|
fsm_journal_event (INFO, MAIN, "main",
|
2024-09-24 11:58:48 +02:00
|
|
|
"g signal connect (activate)",
|
|
|
|
"| 👉️ windows creation requested");
|
2024-09-06 11:02:03 +02:00
|
|
|
// ! WARNING ! 'on_windows_activation()'
|
|
|
|
// and 'on_windows_startup()' are in: src/widget/dispatch.c
|
|
|
|
// NOT in: src/signal.c
|
2024-09-17 12:56:59 +02:00
|
|
|
g_signal_connect (app, "startup", G_CALLBACK (on_windows_startup), NULL);
|
|
|
|
g_signal_connect (app, "activate", G_CALLBACK (on_windows_activation), NULL);
|
2024-09-03 17:32:42 +02:00
|
|
|
|
2024-09-06 11:02:03 +02:00
|
|
|
int status = g_application_run (G_APPLICATION (app), argc, argv);
|
2024-09-24 11:58:48 +02:00
|
|
|
fsm_journal_event (INFO, MAIN, "main", "g_object unref (app)", "bye bye app !");
|
2024-07-20 16:38:31 +02:00
|
|
|
g_object_unref (app);
|
|
|
|
|
2024-09-24 17:15:39 +02:00
|
|
|
fsm_journal_event (INFO, MAIN, "main", "That'all folks !", "👋️😄️");
|
2024-09-16 08:06:08 +02:00
|
|
|
fsm_journal_publication_request();
|
|
|
|
|
2024-09-26 10:27:45 +02:00
|
|
|
|
|
|
|
|
2024-09-30 09:10:42 +02:00
|
|
|
/*
|
2024-09-26 10:27:45 +02:00
|
|
|
printf("voir à la fin de 'main: étude des limites de la fonction 'snprintf()'\n");
|
|
|
|
|
|
|
|
long num = 1234567891234567891;
|
|
|
|
char str[20];
|
|
|
|
|
|
|
|
sprintf(str, "%ld", num); // integer to string
|
|
|
|
printf("sprintf %ld > str %s\n", num, str);
|
|
|
|
|
|
|
|
snprintf(str, sizeof(str), "%ld", num);
|
|
|
|
printf("snprintf %ld > str %s\n", num, str);
|
|
|
|
|
|
|
|
strtol(str, NULL, 0); // The strtol() function takes a char pointer as its first argument, followed by two ints.
|
|
|
|
// The first int specifies the base of the number,
|
|
|
|
// and the second int specifies the maximum number of characters to be converted.
|
|
|
|
printf("strtol %ld > str %s\n", num, str);
|
2024-09-30 09:10:42 +02:00
|
|
|
*/
|
2024-09-26 10:27:45 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
2024-07-20 16:38:31 +02:00
|
|
|
return status;
|
2024-06-29 17:05:13 +02:00
|
|
|
}
|
2024-07-04 08:04:58 +02:00
|
|
|
|
2024-07-08 07:52:27 +02:00
|
|
|
|
2024-09-06 11:02:03 +02:00
|
|
|
|
|
|
|
|
2024-07-08 07:52:27 +02:00
|
|
|
// GTK itself does not support event sounds, << A GREAT WAY TO DEBUG ! TODO
|
|
|
|
// you have to use a loadable module like the one that comes with libcanberra.
|
|
|
|
|
2024-07-28 16:50:39 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Property GtkSettings:gtk-error-bell
|
|
|
|
|
|
|
|
// property gtk-error-bell: gboolean [ read, write ]
|
|
|
|
// When TRUE, keyboard navigation and other input-related errors will cause a beep.
|
|
|
|
|
2024-10-14 11:15:13 +02:00
|
|
|
|
2024-08-31 16:07:19 +02:00
|
|
|
/*
|
|
|
|
2024-08-31 Un point sur l'état d'avancement du client:
|
|
|
|
|
|
|
|
TODO (bottlenecks)
|
|
|
|
- images (++)
|
|
|
|
- arbres (et listes) (++)
|
|
|
|
- logging (ref : /var/log/messages)
|
|
|
|
- menus (pas indispensables à ce stade))
|
|
|
|
|
|
|
|
À redéfinir: répartition des tâches (mesures) client/serveur.
|
|
|
|
Comment traiter le cas extrême où *toutes* les règles
|
|
|
|
sont des règles d'intérêt ?
|
|
|
|
(cas d'une erreur rare, non systématique où il faut "remonter le temps",
|
|
|
|
pas à pas, à partir du premier état qui met l'erreur en évidence)
|
|
|
|
|
|
|
|
Pour effectuer cette "remontée", il faut une liste complète
|
|
|
|
de toutes les règles appliquées.
|
|
|
|
Cette liste doit comporter, pour chaque item (= chaque exécution d'une règle):
|
|
|
|
- identité de la règle
|
|
|
|
- lieu d'exécution (dans l'espace global)
|
|
|
|
- date d'exécution
|
|
|
|
NB Il ne peut y avoir d'ambiguité ou d'erreur due au parallélisme
|
|
|
|
car, si les espaces locaux de deux exécutions de règles se recouvrent,
|
|
|
|
elles ne peuvent avoir été exécutées simultanément.
|
|
|
|
|
|
|
|
À mon avis, le serveur ne peut effectuer cette tâche car
|
|
|
|
la "remontée dans le temps" nécessite l'inspection 'de visu' de chaque état.
|
|
|
|
|
|
|
|
Inspection veut dire ici: reconnaissance de formes
|
|
|
|
et ce travail (visuel) ne peut être pré-programmé
|
|
|
|
(bien qu'il doive être systématique), car le concepteur du modèle
|
|
|
|
ne sait pas quelle est l'erreur et ne peut prévoir ce qu'il va découvrir.
|
|
|
|
|
|
|
|
Ceci n'exclut pas qu'il puisse - qu'il doive - effectuer plusieurs essais
|
|
|
|
(de "remontée dans le temps") en sélectionnant, par exemple,
|
|
|
|
différentes règles d'intérêt à chaque fois
|
|
|
|
ni qu'il puisse se programmer des outils d'aide
|
|
|
|
(mais tout ceci ne semble pas avoir sa place dans le serveur).
|
|
|
|
|
|
|
|
NB À ce stade de la conception d'un modèle, les erreurs sont encore fréquentes
|
|
|
|
et les 'runs' sont nécessairement de brève durée.
|
|
|
|
Des 'runs' de longue durée n'ont de sens qu'une fois ce débuggage effectué.
|
|
|
|
Il y a donc peu de problèmes à craindre du fait de la limite de la bande passante.
|
|
|
|
*/
|
2024-09-18 10:25:55 +02:00
|
|
|
|
2024-09-19 07:14:05 +02:00
|
|
|
|
2024-10-14 11:15:13 +02:00
|
|
|
|