#include #include #include #include #include #include #include "gst_display.h" #include "moteur_simulateur.h" #include "gst_fs.h" #define FLECHE_DROITE 1 #define FLECHE_GAUCHE 2 #define FLECHE_HAUT 4 #define FLECHE_BAS 8 #define COIN_HAUT_DROITE 1 #define COIN_HAUT_GAUCHE 2 #define COIN_BAS_DROITE 4 #define COIN_BAS_GAUCHE 8 #define ECART 8 static char *nom_fichier_mp = NULL; static char *nom_fichier_deci = NULL; static char *nom_fichier_mm = NULL; /* Alloue dest et y recopie src */ static void alloc_nom_fichier (char *src, char **dest); static void recharge_reset (GtkWidget *widget, gpointer data); void destroy (GtkWidget *widget, gpointer data) { mtr_libere (); gtk_main_quit (); } void close_application (GtkWidget *widget, gpointer data) { destroy (widget, data); } void selection_fichier_mp (GtkWidget *w, GtkFileSelection *fs) { alloc_nom_fichier (gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs)), &nom_fichier_mp); file_close (w, fs); recharge_reset (NULL, NULL); } void selection_fichier_mm (GtkWidget *w, GtkFileSelection *fs) { alloc_nom_fichier (gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs)), &nom_fichier_mm); file_close (w, fs); recharge_reset (NULL, NULL); } void selection_fichier_deci (GtkWidget *w, GtkFileSelection *fs) { alloc_nom_fichier (gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs)), &nom_fichier_deci); file_close (w, fs); recharge_reset (NULL, NULL); } void menu_ouvre_fichier (GtkWidget *w, gpointer data) { fs_open (w, data); } gboolean dessine (GtkWidget *zone_dessin, GdkEventExpose *ev) { dis_expose_handler (); return TRUE; } void cycle_precedant (GtkWidget *widget, gpointer data) { mtr_cycle_precedant (); dessine (NULL, NULL); } void cycle_suivant (GtkWidget *widget, gpointer data) { mtr_cycle_suivant (); dessine (NULL, NULL); } void recharge_reset (GtkWidget *widget, gpointer data) { mtr_reset_et_charge_memoires (nom_fichier_mp, nom_fichier_deci, nom_fichier_mm); dessine (NULL, NULL); } void creation_menu (GtkWidget *boite) { GtkWidget *barre_menu; GtkWidget *menuItem; GtkWidget *menu_fichier; barre_menu = gtk_menu_bar_new (); menuItem = gtk_menu_item_new_with_label (" Fichier "); gtk_menu_bar_append (GTK_MENU_BAR (barre_menu), menuItem); menu_fichier = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuItem), menu_fichier); /* Les entrées */ menuItem = gtk_menu_item_new (); gtk_menu_append (GTK_MENU (menu_fichier), menuItem); menuItem = gtk_menu_item_new_with_label ("Ouvrir un fichier mémoire principale"); gtk_menu_append (GTK_MENU (menu_fichier), menuItem); gtk_signal_connect (GTK_OBJECT (menuItem), "activate", GTK_SIGNAL_FUNC(menu_ouvre_fichier), selection_fichier_mp); menuItem = gtk_menu_item_new_with_label ("Ouvrir un fichier micro-mémoire"); gtk_menu_append (GTK_MENU (menu_fichier), menuItem); gtk_signal_connect (GTK_OBJECT (menuItem), "activate", GTK_SIGNAL_FUNC(menu_ouvre_fichier), selection_fichier_mm); menuItem = gtk_menu_item_new_with_label ("Ouvrir un fichier décodeur d'instruction"); gtk_menu_append (GTK_MENU (menu_fichier), menuItem); gtk_signal_connect (GTK_OBJECT (menuItem), "activate", GTK_SIGNAL_FUNC(menu_ouvre_fichier), selection_fichier_deci); menuItem = gtk_menu_item_new (); gtk_menu_append (GTK_MENU (menu_fichier), menuItem); menuItem = gtk_menu_item_new_with_label ("Quitter"); gtk_menu_append (GTK_MENU (menu_fichier), menuItem); gtk_signal_connect (GTK_OBJECT (menuItem), "activate", GTK_SIGNAL_FUNC(close_application), NULL); gtk_box_pack_start (GTK_BOX (boite), barre_menu, FALSE, FALSE, 2); } void creation_bouton (GtkWidget *boite) { GtkWidget *boite_boutons; GtkWidget *bouton_cycle, *bouton_cycle_precedant; GtkWidget *bouton_recharge; boite_boutons = gtk_hbox_new (FALSE, 10); bouton_cycle = gtk_button_new_with_label ("Prochain cycle"); gtk_signal_connect (GTK_OBJECT (bouton_cycle), "clicked", GTK_SIGNAL_FUNC(cycle_suivant), NULL); bouton_cycle_precedant = gtk_button_new_with_label ("Cycle précédant"); gtk_signal_connect (GTK_OBJECT (bouton_cycle_precedant), "clicked", GTK_SIGNAL_FUNC(cycle_precedant), NULL); bouton_recharge = gtk_button_new_with_label ("Réinitialise"); gtk_signal_connect (GTK_OBJECT (bouton_recharge), "clicked", GTK_SIGNAL_FUNC(recharge_reset), NULL); gtk_box_pack_start (GTK_BOX (boite_boutons), bouton_cycle, TRUE, TRUE, 3); gtk_box_pack_end (GTK_BOX (boite_boutons), bouton_cycle_precedant, TRUE, TRUE, 3); gtk_box_pack_end (GTK_BOX (boite_boutons), bouton_recharge, TRUE, TRUE, 3); gtk_box_pack_end (GTK_BOX (boite), boite_boutons, TRUE, TRUE, 0); } GtkWidget * creation_dessin (GtkWidget *boite) { GtkWidget *fenetre_dessin; GtkWidget *zone_dessin; zone_dessin = gtk_drawing_area_new (); gtk_drawing_area_size (GTK_DRAWING_AREA (zone_dessin), 875, 775); fenetre_dessin = gtk_viewport_new (NULL, NULL); gtk_container_add (GTK_CONTAINER (fenetre_dessin), zone_dessin); gtk_box_pack_start (GTK_BOX (boite), fenetre_dessin, TRUE, TRUE, 0); return zone_dessin; } void creation_separateur (GtkWidget *boite) { GtkWidget *separator; separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (boite), separator, TRUE, TRUE, 0); } void alloc_nom_fichier (char *src, char **dest) { if (*dest != NULL) free (*dest); *dest = (char *) malloc (sizeof (char) * (strlen (src) + 1)); assert (*dest != NULL); strcpy (*dest, src); } void init_nom_fichiers (void) { alloc_nom_fichier (FICHIER_MM, &nom_fichier_mm); alloc_nom_fichier (FICHIER_MP, &nom_fichier_mp); alloc_nom_fichier (FICHIER_DECI, &nom_fichier_deci); } int main(int argc, char *argv[]) { GtkWidget *fenetre; GtkWidget *boite1; GtkWidget *boite_principale; GtkWidget *zone_dessin; mtr_infos infos_a_afficher; gtk_init (&argc, &argv); mtr_init (&infos_a_afficher); init_nom_fichiers (); mtr_reset_et_charge_memoires (nom_fichier_mp, nom_fichier_deci, nom_fichier_mm); fenetre = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_usize (fenetre, 900, 900); /* Redimensionnement */ gtk_window_set_policy (GTK_WINDOW(fenetre), TRUE, TRUE, FALSE); /* Fonction appelée par la fermeture sur la barre */ gtk_signal_connect (GTK_OBJECT (fenetre), "destroy", GTK_SIGNAL_FUNC(close_application), NULL); gtk_window_set_title (GTK_WINDOW (fenetre), "Gsimulateur - BLEC"); /* Contient le menu et la boite1 */ boite_principale = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (fenetre), boite_principale); /* Contient la zone_dessin et les boutons */ boite1 = gtk_vbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (boite1), 10); creation_menu (boite_principale); zone_dessin = creation_dessin (boite1); creation_separateur (boite1); creation_bouton (boite1); gtk_box_pack_end (GTK_BOX (boite_principale), boite1, TRUE, TRUE, 3); gtk_signal_connect (GTK_OBJECT (zone_dessin), "expose_event", (GtkSignalFunc) dessine, NULL); gtk_widget_show_all (fenetre); dis_init (zone_dessin->window, &infos_a_afficher); dessine (zone_dessin, NULL); gtk_main (); exit (EXIT_SUCCESS); }