/* OpenIDA - Outil d'analyse de fichiers binaires * gtkbinview.c - affichage d'un ou de plusieurs morceaux de code * * Copyright (C) 2008 Cyrille Bagard * * This file is part of OpenIDA. * * OpenIDA is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * OpenIDA 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Foobar. If not, see . */ #include "gtkbinview.h" #include "gtkbinview-int.h" /* Encadre la construction graphique initiale de la visualisation. */ static void gtk_bin_view_realize(GtkWidget *); /* Met à jour l'affichage de la visualisation de code binaire. */ static gboolean gtk_bin_view_expose(GtkBinView *, GdkEventExpose *); /* Détermine le type du composant d'affichage des morceaux. */ G_DEFINE_TYPE(GtkBinView, gtk_binview, GTK_TYPE_FIXED) /****************************************************************************** * * * Paramètres : class = classe GTK à initialiser. * * * * Description : Procède à l'initialisation de l'afficheur de morceaux. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void gtk_binview_class_init(GtkBinViewClass *class) { GtkWidgetClass *widget_class; /* Classe de haut niveau */ widget_class = GTK_WIDGET_CLASS(class); widget_class->realize = gtk_bin_view_realize; widget_class->expose_event = gtk_bin_view_expose; } /****************************************************************************** * * * Paramètres : view = composant GTK à initialiser. * * * * Description : Procède à l'initialisation de l'afficheur de morceaux. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void gtk_binview_init(GtkBinView *view) { gtk_fixed_set_has_window(GTK_FIXED(view), TRUE); } /****************************************************************************** * * * Paramètres : - * * * * Description : Crée un nouveau composant pour l'affichage de morceaux. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ GtkWidget* gtk_binview_new(void) { return g_object_new(GTK_TYPE_BIN_VIEW, NULL); } /****************************************************************************** * * * Paramètres : widget = composant GTK à redessiner. * * * * Description : Encadre la construction graphique initiale de la visualisat°.* * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void gtk_bin_view_realize(GtkWidget *widget) { GdkWindowAttr attributes; /* Propriétés du composant */ guint attributes_mask; /* Masque de prise en compte */ GdkColor white; /* Couleur de fond normale */ GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.event_mask = gtk_widget_get_events(widget) | GDK_BUTTON_PRESS_MASK | GDK_EXPOSURE_MASK; attributes_mask = GDK_WA_X | GDK_WA_Y; widget->window = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, attributes_mask); gdk_window_set_user_data(widget->window, widget); widget->style = gtk_style_attach(widget->style, widget->window); gdk_color_white(gtk_widget_get_colormap(widget), &white); gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, &white); GTK_BIN_VIEW(widget)->gc = gdk_gc_new(GDK_DRAWABLE(widget->window)); } /****************************************************************************** * * * Paramètres : view = composant GTK à redessiner. * * event = informations liées à l'événement. * * * * Description : Met à jour l'affichage de la visualisation de code binaire. * * * * Retour : FALSE pour poursuivre la propagation de l'événement. * * * * Remarques : - * * * ******************************************************************************/ static gboolean gtk_bin_view_expose(GtkBinView *view, GdkEventExpose *event) { GdkGCValues values; /* Propriétés du contexte */ GtkStyle *style; /* Style associé au composant */ int width; /* Largeur de l'élément */ int height; /* Hauteur de l'élément */ if (view->show_border) { gdk_gc_get_values(view->gc, &values); style = gtk_widget_get_style(GTK_WIDGET(view)); gtk_widget_get_size_request(GTK_WIDGET(view), &width, &height); gdk_gc_set_foreground(view->gc, &style->black); gdk_draw_rectangle(GDK_DRAWABLE(GTK_WIDGET(view)->window), view->gc, FALSE, 0, 0, width - 1, height - 1); gdk_gc_set_foreground(view->gc, &values.foreground); } return FALSE; } /****************************************************************************** * * * Paramètres : view = composant GTK à mettre à jour. * * show = état de l'affichage auquel parvenir. * * * * Description : Définit si une bordure est à afficher. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void gtk_bin_view_show_border(GtkBinView *view, bool show) { view->show_border = show; } /****************************************************************************** * * * Paramètres : view = composant GTK à mettre à jour. * * binary = contenu binaire dont les lignes sont issues. * * lines = informations à intégrer. * * last = dernière ligne à intégrer ou NULL pour toutes. * * * * Description : Définit les lignes à associer à la représentation. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void gtk_bin_view_set_rendering_lines(GtkBinView *view, openida_binary *binary, GRenderingLine *lines, GRenderingLine *last) { view->binary = binary; view->lines = lines; view->last = last; view->set_lines(view, lines, last); } /****************************************************************************** * * * Paramètres : view = composant GTK à consulter. * * * * Description : Fournit la liste des lignes associées à la représentation. * * * * Retour : Ligne de représentation. * * * * Remarques : - * * * ******************************************************************************/ GRenderingLine *gtk_bin_view_get_lines(const GtkBinView *view) { return view->lines; } /****************************************************************************** * * * Paramètres : view = composant GTK à consulter. * * * * Description : Fournit la dernière ligne associée à la représentation. * * * * Retour : Ligne de représentation. * * * * Remarques : - * * * ******************************************************************************/ GRenderingLine *gtk_bin_view_get_last_line(const GtkBinView *view) { return view->last; /* FIXME last == NULL */ } /****************************************************************************** * * * Paramètres : binview = composant GTK à manipuler. * * show = état de l'affichage auquel parvenir. * * * * Description : Choisit d'afficher les adresses virtuelles ou non. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void gtk_binview_show_vaddress(GtkBinView *binview, gboolean show) { GList *list; /* Ensemble des enfants */ GList *iter; /* Boucle de parcours */ list = gtk_container_get_children(GTK_CONTAINER(binview)); for (iter = g_list_first(list); iter != NULL; iter = g_list_next(iter)) /*gtk_snippet_show_vaddress(GTK_SNIPPET(iter->data), show)*/; g_list_free(list); } /****************************************************************************** * * * Paramètres : binview = composant GTK à manipuler. * * show = état de l'affichage auquel parvenir. * * * * Description : Choisit d'afficher le code brut ou non. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void gtk_binview_show_code(GtkBinView *binview, gboolean show) { GList *list; /* Ensemble des enfants */ GList *iter; /* Boucle de parcours */ list = gtk_container_get_children(GTK_CONTAINER(binview)); for (iter = g_list_first(list); iter != NULL; iter = g_list_next(iter)) /*gtk_snippet_show_code(GTK_SNIPPET(iter->data), show)*/; g_list_free(list); } /****************************************************************************** * * * Paramètres : view = composant GTK à manipuler. * * addr = adresse à rechercher. * * * * Description : Indique si la vue contient une addrese donnée. * * * * Retour : true si l'adresse est présente, false sinon. * * * * Remarques : - * * * ******************************************************************************/ bool gtk_bin_view_contain_address(const GtkBinView *view, vmpa_t addr) { gint dummy_x; /* Abscisse pour l'appel */ gint dummy_y; /* Ordonnée pour l'appel */ return view->get_coordinates(view, addr, &dummy_x, &dummy_y); } /****************************************************************************** * * * Paramètres : view = composant GTK à manipuler. * * addr = adresse à présenter à l'écran. * * * * Description : S'assure qu'une adresse donnée est visible à l'écran. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void gtk_bin_view_scroll_to_address(GtkBinView *view, vmpa_t addr) { gint x; /* Abscisse à garantir */ gint y; /* Ordonnée à garantir */ GtkViewport *support; /* Support avec défilements */ GtkAdjustment *adj; /* Défilement à mettre à jour */ if (view->define_address != NULL) view->define_address(view, addr); if (view->get_coordinates(view, addr, &x, &y)) { support = GTK_VIEWPORT(gtk_widget_get_parent(GTK_WIDGET(view))); adj = gtk_viewport_get_hadjustment(support); if (x > (adj->upper - adj->page_size)) x = adj->upper - adj->page_size; gtk_adjustment_set_value(adj, x); adj = gtk_viewport_get_vadjustment(support); if (y > (adj->upper - adj->page_size)) y = adj->upper - adj->page_size; gtk_adjustment_set_value(adj, y); } }