diff --git a/include/fsm.h b/include/fsm.h index 4a4f76e..acbdd26 100644 --- a/include/fsm.h +++ b/include/fsm.h @@ -28,31 +28,24 @@ #include #include -/******************************************************************************/ -/* S T A T E M A C H I N E */ -/******************************************************************************/ -// called by widgets through signal functions - -enum fsm_select_EXEC_EDIT { EXEC, EDIT }; -enum fsm_select_STATE_RULES_DATA { SYNTH, STATE, RULES, DATA }; -enum fsm_select_STORE_RESTORE_RESET { STORE, RESTORE, RESET }; - -enum fsm_measure_type {DATE_RULE_EXEC, RULE_EXEC_NB, OBJECT_NB, ELAPSED_TIME }; - -#define n_rules 128 // arbitrary -#define n_objects 32 // arbitrary too, -#define n_situations 128 // and so on... - -typedef struct tool_list {int value; struct tool_list *suiv;} tool_list ; -typedef struct data_list {int value; struct data_list *suiv;} data_list ; -typedef struct disp_list {int value; struct disp_list *suiv;} disp_list ; - /******************************************************************************/ /* J O U R N A L */ /******************************************************************************/ /* * * * * - J O U R N A L M E T A R U L E S - * * * * * +* ref: sudo cat /var/log/messages +* +* structure d'un log: +* - date +* - rang (n° d'ordre) +* - fichier +* - fonction +* - valeur, paramètre, descriptif, contexte,... +* (tout ce qui peut contribuer à améliorer la compréhension du journal) +* +* - - - - - - - - - - - - - - - - - - - - - - - - - - +* * Un seul fsm_journal_event() par fonction * ? sauf si cette fonction génère plusieurs autres fonctions d'intérêt ? * @@ -62,15 +55,15 @@ typedef struct disp_list {int value; struct disp_list *suiv;} disp_list ; * * * * * - J O U R N A L M E T A R U L E S - * * * */ -enum severity {CRITICAL, ERROR, WARNING, INFO, MESSAGE, DEBUG, SPEW}; +enum fsm_enum_journal_severity {CRITICAL, ERROR, WARNING, INFO, MESSAGE, DEBUG, SPEW}; -enum source { +enum fsm_enum_journal_source { SOURCE, TARGET, JOURNAL, FSM, PREFER, MAIN, APP, WIDGETS, SIGNAL, MAIN_WINDOW, DIALOG_WINDOW, MODAL_WINDOW, TEXT_WINDOW, AUTO_NOTIFICATION, TOPBAR, TOPBAR_LEFT, TOPBAR_RIGHT, TOPBAR_CENTER, SYNTH_PAGE, STATE_PAGE, RULES_PAGE, MEASURES_PAGE, RESULTS_PAGE, - SYNTH_GLAREA, SYNTH_ALL_RESULTS, + SenumYNTH_GLAREA, SYNTH_ALL_RESULTS, SYNTH_TIME_DEP_RESULTS, SYNTH_TIME_INDEP_RESULTS, STATE_TOP, STATE_BOTTOM, STATE_GLAREA, STATE_CAMERA, RULE_GEOMETRY, RULE_GLAREA, RULE_CAMERA, @@ -86,41 +79,49 @@ enum source { #define JOURNAL_LOG_MAX_LENGTH 255 -typedef struct unit {long yy_dd_mm; - long usec; - const char *file_source; - const char *function_source; - const char *string_value; - struct unit *prev; - struct unit *next;} unit; // journal unit structure +typedef struct fsm_struct_journal_unit + { + long yy_dd_mm; + long usec; + const char *file_source; + const char *function_source; + const char *string_value; + struct fsm_struct_journal_unit *prev; + struct fsm_struct_journal_unit *next; + } + fsm_struct_journal_unit; // journal unit structure -typedef struct {unit *first; unit *last;} journal; // journal unit access structure +typedef struct { + fsm_struct_journal_unit *first; + fsm_struct_journal_unit *last; + } + fsm_struct_journal; // journal unit access -void fsm_journal_init (journal *jj); // init from main -void fsm_journal_push_front (journal *jj, // add an évènement at the journal front +void fsm_journal_init (fsm_struct_journal *jj); // init from main +void fsm_journal_push_front (fsm_struct_journal *jj, // add an évènement at the journal front const char *file_source, // def: fsm/dispatch const char *function_source, // call: any call that does not have const char *string_value); // the log address -void fsm_journal_clear (journal *jj, +void fsm_journal_clear (fsm_struct_journal *jj, const char *file_source, const char *function_source, const char *string_value); // empty the journal -long fsm_journal_pop_back (journal *jj, // removes an évènement - const char *file_source, // at the journal end +long fsm_journal_pop_back (fsm_struct_journal *jj, // remove an evenement + const char *file_source, // at the journal end const char *function_source, const char *string_value); -int fsm_journal_length (journal jj); // journal length -void fsm_journal_seek (journal jj, // seek for an évènement - long usec, // in the journal +int fsm_journal_length (fsm_struct_journal jj); // journal length +void fsm_journal_seek (fsm_struct_journal jj, // seek for an evenement + long usec, // in the journal const char *file_source, const char *function_source, const char *string_value); -void fsm_journal_publish (journal jj); // display the journal +void fsm_journal_publish (fsm_struct_journal jj); // display the journal // ----------------------------------------------------------------------------- -// ref: sudo cat /var/log/messages -// journal fsm_get_journal(); // def: fsm/dispatch call: fsm/prefer/fsm_store_restore_reset() +// + void fsm_journal_publication_request(); // def: fsm/dispatch call: main; void fsm_journal_event (int severity, int source, @@ -131,13 +132,32 @@ void fsm_journal_event (int severity, // ----------------------------------------------------------------------------- +/******************************************************************************/ +/* S T A T E M A C H I N E */ +/******************************************************************************/ +// called by widgets through signal functions + +enum fsm_enum_exec_edit { EXEC, EDIT }; +enum fsm_enum_state_rules_data { SYNTH, STATE, RULES, DATA }; +enum fsm_enum_store_restore_reset { STORE, RESTORE, RESET }; + +enum fsm_enum_measure_type {DATE_RULE_EXEC, RULE_EXEC_NB, OBJECT_NB, ELAPSED_TIME }; + +#define n_rules 128 // arbitrary +#define n_objects 32 // arbitrary too, +#define n_situations 128 // and so on... + +typedef struct fsm_struct_list_tool {int value; struct fsm_struct_list_tool *suiv;} fsm_struct_list_tool ; +typedef struct fsm_struct_list_data {int value; struct fsm_struct_list_data *suiv;} fsm_struct_list_data ; +typedef struct fsm_struct_list_disp {int value; struct fsm_struct_list_disp *suiv;} fsm_struct_list_disp ; + + void fsm_init (char *message); // def: fsm/dispatch; call: main; -void fsm_engine_init(); // def: fsm/engine/engine; call main -void fsm_preferences_list_init(); // def: fsm/prefer; call: fsm/dispatch; -void fsm_measures_list_init(); // def: fsm/measure/manage.c; call: fsm/dispatch; -void fsm_results_list_init(); // def: fsm/results; call: fsm/dispatch; -void fsm_displayables_list_init(); // def: fsm/prefer; call: fsm/dispatch; +void fsm_init_list_preferences(); // def: fsm/prefer; call: fsm/dispatch; +void fsm_init_list_measures(); // def: fsm/measure/manage.c; call: fsm/dispatch; +void fsm_init_list_results(); // def: fsm/results; call: fsm/dispatch; +void fsm_init_list_displayables(); // def: fsm/prefer; call: fsm/dispatch; int fsm_get_exec_edit(); // def: fsm/dispatch; call: signal; // widget/state/dispatch; @@ -147,7 +167,7 @@ int fsm_get_state_rules_data(); // def: fsm/dispatch; call: signal; void fsm_set_exec_edit (int value);// def: fsm/dispatch; call: signal; void fsm_set_state_rules_data (int value); // def: fsm/dispatch; call: signal; -void fsm_store_restore_reset (int choice, int value);// def: prefer; call: signal; +void fsm_set_store_restore_reset (int choice, int value);// def: prefer; call: signal; bool fsm_get_preferences_state(); // def: fsm/dispatch; call: - - - void fsm_set_preferences_modified (bool value); // def: fsm/dispatch; @@ -163,11 +183,11 @@ void fsm_reset_all_situations_transparencies_at_value (int value); // provisoire // --------------------------------------------------------------- WIP ------ // def: measure/tool_list call: measure/tool_list (about the following functions...) -void fsm_tools_list_insert (tool_list **tl, int value); -int fsm_tools_list_pop (tool_list **tl); -int fsm_tools_list_length (tool_list *tl); -void fsm_tools_list_clear (tool_list **tl); -void fsm_tools_list_view (tool_list *tl); +void fsm_tools_list_insert (fsm_struct_list_tool **tl, int value); +int fsm_tools_list_pop (fsm_struct_list_tool **tl); +int fsm_tools_list_length (fsm_struct_list_tool *tl); +void fsm_tools_list_clear (fsm_struct_list_tool **tl); +void fsm_tools_list_view (fsm_struct_list_tool *tl); void fsm_tools_list_test(); // def: measure/manage; call: measure/manage; // def: fsm/measure/manage/; call: rule exec @@ -175,13 +195,13 @@ void fsm_rule_trig_measure (int rule_id, int object_id, int measure_id); // --------------------------------------------------------------- WIP ------ -void fsm_add_data (data_list d, int *p_data, int *p_target); -int fsm_get_data (data_list d, int from, int to); -void fsm_remove_data (data_list d, int *p_data); +void fsm_add_data (fsm_struct_list_data d, int *p_data, int *p_target); +int fsm_get_data (fsm_struct_list_data d, int from, int to); +void fsm_remove_data (fsm_struct_list_data d, int *p_data); // --------------------------------------------------------------- WIP ------ -void fsm_disp_add_chart (disp_list d, int *p_chart); -int fsm_disp_get_chart (disp_list d, int from, int to); -void fsm_disp_remove_chart (disp_list d, int *p_chart); +void fsm_disp_add_chart (fsm_struct_list_disp d, int *p_chart); +int fsm_disp_get_chart (fsm_struct_list_disp d, int from, int to); +void fsm_disp_remove_chart (fsm_struct_list_disp d, int *p_chart); diff --git a/include/names_index.all b/include/names_index.all new file mode 100644 index 0000000..fe018f9 --- /dev/null +++ b/include/names_index.all @@ -0,0 +1,76 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* Gem-graph client * +* Finite state machine header * +* * +* Copyright © 2021 Libre en Communs * +* Copyright © 2024 Jean Sirmai * +* * +* 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 . * +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +fsm_enum_exec_edit +fsm_enum_state_rules_data +fsm_enum_store_restore_reset +fsm_enum_measure_type +fsm_enum_journal_severity +fsm_enum_journal_source + +fsm_struct_list_tool +fsm_struct_list_data +fsm_struct_list_disp +fsm_struct_journal_unit +fsm_struct_journal + +fsm_journal_init +fsm_journal_push_front +fsm_journal_clear +fsm_journal_pop_back +fsm_journal_length +fsm_journal_seek +fsm_journal_publish +fsm_journal_publication_request +fsm_journal_event + +fsm_init +fsm_init_list_preferences +fsm_init_list_measures +fsm_init_list_results +fsm_init_list_displayables +fsm_get_exec_edit +fsm_get_state_rules_data +fsm_get_preferences_state +fsm_set_exec_edit +fsm_set_state_rules_data +fsm_set_store_restore_reset +fsm_set_preferences_modified +fsm_add_measure +fsm_add_result +fsm_add_displayable +fsm_reset_all_situations_transparencies_at_value +fsm_tools_list_insert +fsm_tools_list_pop +fsm_tools_list_length +fsm_tools_list_clear +fsm_tools_list_view +fsm_tools_list_test +fsm_rule_trig_measure +fsm_add_data +fsm_get_data +fsm_remove_data +fsm_disp_add_chart +fsm_disp_get_chart +fsm_disp_remove_chart + diff --git a/src/fsm/dispatch.c b/src/fsm/dispatch.c index e79ba76..f38926b 100644 --- a/src/fsm/dispatch.c +++ b/src/fsm/dispatch.c @@ -56,7 +56,7 @@ /******************************************************************************/ /* J O U R N A L */ /******************************************************************************/ -static journal gg_logs; +static fsm_struct_journal gg_logs; void fsm_journal_publication_request() {fsm_journal_publish (gg_logs);} @@ -92,22 +92,22 @@ void fsm_init (char *initial_message_from_main) fsm_journal_event (MESSAGE, FSM, "fsm/dispatch", "measures list init()", "measurement processes"); - fsm_measures_list_init(); + fsm_init_list_measures(); fsm_journal_event (MESSAGE, FSM, "fsm/dispatch", "results list init()", "measurement results (gross)"); - fsm_results_list_init(); + fsm_init_list_results(); fsm_journal_event (MESSAGE, FSM, "fsm/dispatch", "displayables list init()", "displayable results"); - fsm_displayables_list_init(); + fsm_init_list_displayables(); fsm_journal_event (MESSAGE, FSM, "fsm/dispatch", "preferences list init()", "preferences"); - fsm_preferences_list_init(); + fsm_init_list_preferences(); fsm_journal_event (MESSAGE, FSM, "fsm/dispatch", "fsm initialisation", diff --git a/src/fsm/measures/data_list.c b/src/fsm/measures/data_list.c index fccb11a..71cf425 100644 --- a/src/fsm/measures/data_list.c +++ b/src/fsm/measures/data_list.c @@ -39,9 +39,9 @@ /* ex : filter, concat, inverse, scale, correlate, etc. */ /******************************************************************************/ -void fsm_add_data (data_list d, int *p_data, int *p_target) {} -int fsm_get_data (data_list d, int from, int to) {return 0;} -void fsm_remove_data (data_list d, int *p_data) {} +void fsm_add_data (fsm_struct_list_data d, int *p_data, int *p_target) {} +int fsm_get_data (fsm_struct_list_data d, int from, int to) {return 0;} +void fsm_remove_data (fsm_struct_list_data d, int *p_data) {} // http://www.gnuplot.info/ // https://fr.wikipedia.org/wiki/Gnuplot diff --git a/src/fsm/measures/disp_list.c b/src/fsm/measures/disp_list.c index c7f837a..25bfd54 100644 --- a/src/fsm/measures/disp_list.c +++ b/src/fsm/measures/disp_list.c @@ -39,7 +39,7 @@ // "graph", "chart", "plot" and "diagram" are ambiguous terms, used interchangeably. -void fsm_disp_add_chart (disp_list d, int *p_chart) {} -int fsm_disp_get_chart (disp_list d, int from, int to) {return 0;} -void fsm_disp_remove_chart (disp_list d, int *p_chart) {} +void fsm_disp_add_chart (fsm_struct_list_disp d, int *p_chart) {} +int fsm_disp_get_chart (fsm_struct_list_disp d, int from, int to) {return 0;} +void fsm_disp_remove_chart (fsm_struct_list_disp d, int *p_chart) {} diff --git a/src/fsm/measures/manager.c b/src/fsm/measures/manager.c index cc4d1b1..0cdb5fe 100644 --- a/src/fsm/measures/manager.c +++ b/src/fsm/measures/manager.c @@ -96,7 +96,7 @@ void fsm_add_measure (char *measure_name) measure_name); } -void fsm_measures_list_init() +void fsm_init_list_measures() { if (0) fsm_tools_list_test(); diff --git a/src/fsm/measures/tool_list.c b/src/fsm/measures/tool_list.c index 219ce32..511f69d 100644 --- a/src/fsm/measures/tool_list.c +++ b/src/fsm/measures/tool_list.c @@ -69,11 +69,11 @@ //------------------------------------------------------------------------------ -void fsm_tools_list_insert (tool_list **ml, int value) +void fsm_tools_list_insert (fsm_struct_list_tool **ml, int value) { - tool_list *tmp = NULL; - tool_list *cml = *ml; - tool_list *elem = malloc (sizeof (tool_list)); + fsm_struct_list_tool *tmp = NULL; + fsm_struct_list_tool *cml = *ml; + fsm_struct_list_tool *elem = malloc (sizeof (fsm_struct_list_tool)); if (!elem) exit (EXIT_FAILURE); elem->value = value; while (cml && cml->value < value) @@ -86,10 +86,10 @@ void fsm_tools_list_insert (tool_list **ml, int value) else *ml = elem; } -int fsm_tools_list_pop (tool_list **ml) +int fsm_tools_list_pop (fsm_struct_list_tool **ml) { int value; - tool_list *tmp; + fsm_struct_list_tool *tmp; if (! *ml) return -1; tmp = (*ml)->suiv; value = (*ml)->value; @@ -98,7 +98,7 @@ int fsm_tools_list_pop (tool_list **ml) return value; } -int fsm_tools_list_length (tool_list *ml) +int fsm_tools_list_length (fsm_struct_list_tool *ml) { int n = 0; while (ml) @@ -109,9 +109,9 @@ int fsm_tools_list_length (tool_list *ml) return n; } -void fsm_tools_list_clear (tool_list **ml) +void fsm_tools_list_clear (fsm_struct_list_tool **ml) { - tool_list *tmp; + fsm_struct_list_tool *tmp; while (*ml) { tmp = (*ml)->suiv; @@ -120,7 +120,7 @@ void fsm_tools_list_clear (tool_list **ml) } } -void fsm_tools_list_view (tool_list *ml) +void fsm_tools_list_view (fsm_struct_list_tool *ml) { printf ("-------- view measures list (n = %d)\n", fsm_tools_list_length (ml)); @@ -138,7 +138,7 @@ void fsm_tools_list_view (tool_list *ml) void fsm_tools_list_test() { - tool_list *ex_tool = NULL; + fsm_struct_list_tool *ex_tool = NULL; fsm_journal_event (DEBUG, MEASURES_TOOLS, "fsm/measure/", "fsm_tools_list_test()", "création d'une liste de 6 elements:"); diff --git a/src/fsm/preferences/manager.c b/src/fsm/preferences/manager.c index 11d078b..6ee6df3 100644 --- a/src/fsm/preferences/manager.c +++ b/src/fsm/preferences/manager.c @@ -35,7 +35,7 @@ // 2) dans signal.c on_updating_objects_transparencies() // où ils servent à identifier le bouton source (activé) // Cette identification va déterminer le choix du switch -// de la fonction : fsm_store_restore_reset() +// de la fonction : fsm_set_store_restore_reset() // ! WARNING ! Cette méthode d'identification est dangereuse: // Si un utilisateur modifie l'apparence d'un bouton (parce que préférence...) @@ -69,7 +69,7 @@ struct preferences *pref_jean = NULL; // TODO (voir graphics_init(...)) // en attendant: static int p[n_objects] = {}; -void fsm_store_restore_reset (int choice, int value) +void fsm_set_store_restore_reset (int choice, int value) { switch (choice) { case (STORE) : @@ -129,14 +129,14 @@ void fsm_add_displayable (char *displayable_name) /******************************************************************************/ /* P R E F E R E N C E S */ /******************************************************************************/ -void fsm_preferences_list_init () +void fsm_init_list_preferences() { fsm_journal_event (MESSAGE, PREFER, "fsm/preferences/manager", "fsm preferences list is ready to use", "(double chained)"); } -void fsm_displayables_list_init () +void fsm_init_list_displayables() { fsm_journal_event (MESSAGE, PREFER, "fsm/preferences/manager", "fsm displayables list is ready to use", diff --git a/src/fsm/results/manager.c b/src/fsm/results/manager.c index efa01ec..0052814 100644 --- a/src/fsm/results/manager.c +++ b/src/fsm/results/manager.c @@ -68,7 +68,7 @@ void fsm_add_result (char *result_name) printf("fsm_add_result %p <<< %s (see fsm.c)\n", list_results, result_name); } -void fsm_results_list_init () +void fsm_init_list_results () { fsm_journal_event (DEBUG, RESULTS, diff --git a/src/journal.c b/src/journal.c index 2747a57..c0c78a9 100644 --- a/src/journal.c +++ b/src/journal.c @@ -55,19 +55,19 @@ printf(" Current time: %s", ctime(¤t_time)); */ -void fsm_journal_init (journal *jj) +void fsm_journal_init (fsm_struct_journal *jj) { jj->first = NULL; jj->last = NULL; } -void fsm_journal_clear (journal *jj, +void fsm_journal_clear (fsm_struct_journal *jj, const char *file_source, const char *function_source, const char *string_value) { - unit *tmp; - unit *a_unit = jj->first; + fsm_struct_journal_unit *tmp; + fsm_struct_journal_unit *a_unit = jj->first; while(a_unit) { tmp = a_unit; @@ -78,14 +78,14 @@ void fsm_journal_clear (journal *jj, jj->last = NULL; } -void fsm_journal_push_front (journal *jj, +void fsm_journal_push_front (fsm_struct_journal *jj, const char *file_source, const char *function_source, const char *string_value) { struct timeval tv; gettimeofday (&tv, NULL); - unit *new_unit = malloc (sizeof(unit)); + fsm_struct_journal_unit *new_unit = malloc (sizeof(fsm_struct_journal_unit)); if (! new_unit) exit (EXIT_FAILURE); new_unit->yy_dd_mm = tv.tv_sec; @@ -101,13 +101,13 @@ void fsm_journal_push_front (journal *jj, jj->first = new_unit; } -long fsm_journal_pop_back (journal *jj, +long fsm_journal_pop_back (fsm_struct_journal *jj, const char *file_source, const char *function_source, const char *string_value) { long usec; - unit *tmp = jj->last; + fsm_struct_journal_unit *tmp = jj->last; if (! tmp) return -1; usec = tmp->usec; jj->last = tmp->prev; @@ -117,9 +117,9 @@ long fsm_journal_pop_back (journal *jj, return usec; // retourne l'évènement retiré du journal. } -int fsm_journal_length (journal jj) +int fsm_journal_length (fsm_struct_journal jj) { - unit *a_unit = jj.first; + fsm_struct_journal_unit *a_unit = jj.first; int nb = 0; while (a_unit) { @@ -130,12 +130,12 @@ int fsm_journal_length (journal jj) return nb; } -void fsm_journal_seek (journal jj, long usec, +void fsm_journal_seek (fsm_struct_journal jj, long usec, const char *file_source, const char *function_source, const char *string_value) { - unit *a_unit = jj.first; + fsm_struct_journal_unit *a_unit = jj.first; int nb = 0; while (a_unit) { @@ -157,9 +157,9 @@ void fsm_journal_seek (journal jj, long usec, // https://mefics.org/fr/allocation-dynamique-de-m%C3%A9moire-en-c-fonctions-malloc-calloc/ //------------------------------------------------------------------------------ -void fsm_journal_publish (journal jj) +void fsm_journal_publish (fsm_struct_journal jj) { - unit *a_unit = jj.last; + fsm_struct_journal_unit *a_unit = jj.last; char buf [JOURNAL_LOG_MAX_LENGTH]; int nb = 0; while (a_unit) diff --git a/src/signal.c b/src/signal.c index 47b8629..303dd08 100644 --- a/src/signal.c +++ b/src/signal.c @@ -394,9 +394,9 @@ void on_updating_objects_transparencies (GtkWidget *btt_source, GtkScrollbar *sc printf(string_value); fsm_journal_event (DEBUG, BUTTON, "signal", "updating objects transparencies()", string_value); // TODO TODO (je suis fatigué) - if ( ! strcmp (btt_name, "document-revert-rtl-symbolic")) fsm_store_restore_reset (STORE, value); - if ( ! strcmp (btt_name, "edit-undo-symbolic")) fsm_store_restore_reset (RESTORE, value); - if ( ! strcmp (btt_name, "view-refresh-symbolic")) fsm_store_restore_reset (RESET, value); + if ( ! strcmp (btt_name, "document-revert-rtl-symbolic")) fsm_set_store_restore_reset (STORE, value); + if ( ! strcmp (btt_name, "edit-undo-symbolic")) fsm_set_store_restore_reset (RESTORE, value); + if ( ! strcmp (btt_name, "view-refresh-symbolic")) fsm_set_store_restore_reset (RESET, value); fsm_set_preferences_modified (TRUE); // << à détailler TODO }