summaryrefslogtreecommitdiff
path: root/src/gtkext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2009-09-08 23:38:46 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2009-09-08 23:38:46 (GMT)
commit1d3c3cb7b108c0bbe05b9853ed4640d35ddf9bcb (patch)
tree35995d9b9e28db7eb7721f6f09fa68348d6b2385 /src/gtkext
parent3173b904d5d56a8b5e6bf549c97e3fc49da6c5ba (diff)
Restored the previous/original rendering of disassemblies.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@111 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gtkext')
-rw-r--r--src/gtkext/gtkbinview.c2
-rw-r--r--src/gtkext/gtkblockview.c329
2 files changed, 241 insertions, 90 deletions
diff --git a/src/gtkext/gtkbinview.c b/src/gtkext/gtkbinview.c
index 802a115..f049470 100644
--- a/src/gtkext/gtkbinview.c
+++ b/src/gtkext/gtkbinview.c
@@ -183,7 +183,7 @@ static gboolean gtk_bin_view_expose(GtkBinView *view, GdkEventExpose *event)
gtk_widget_get_size_request(GTK_WIDGET(view), &width, &height);
- gdk_gc_set_foreground(view->gc, &style->black);
+ gdk_gc_set_foreground(view->gc, &style->dark[GTK_WIDGET_STATE(GTK_WIDGET(view))]);
gdk_draw_rectangle(GDK_DRAWABLE(GTK_WIDGET(view)->window), view->gc,
FALSE, 0, 0, width - 1, height - 1);
diff --git a/src/gtkext/gtkblockview.c b/src/gtkext/gtkblockview.c
index 7161762..23f86ce 100644
--- a/src/gtkext/gtkblockview.c
+++ b/src/gtkext/gtkblockview.c
@@ -32,12 +32,13 @@
#include "gtkbinview-int.h"
+#include "support.h"
#include "../analysis/exporter.h"
#include "../common/dllist.h"
-#define MARGIN_SPACE 4
+#define MARGIN_SPACE 4 /* TODO : delete me ! */
@@ -51,10 +52,12 @@ struct _GtkBlockView
bool show_code; /* Affichage du code brut ? */
GtkTextBuffer *buffer; /* Code sous forme de texte */
- GtkTextLayout *_layout; /* Disposition du texte */
+ GtkTextLayout *layout; /* Disposition du texte */
+
+ gint line_height; /* Hauteur maximale des lignes */
+ gint left_margin; /* Marge gauche + espace */
+ gint left_text; /* Début d'impression du code */
- PangoLayout *layout; /* Moteur de rendu du code ASM */
- int line_height; /* Hauteur maximale des lignes */
const exe_format *format; /* Format du contenu bianire */
@@ -64,6 +67,10 @@ struct _GtkBlockViewClass
{
GtkBinViewClass parent; /* A laisser en premier */
+ GdkPixbuf *entry_pix; /* Image du point d'entrée */
+ GdkPixbuf *breakpoint_pix; /* Image de point d'arrêt */
+ GdkPixbuf *stopped_pix; /* Image de point actif */
+
};
@@ -178,6 +185,7 @@ static void gtk_block_view_class_init(GtkBlockViewClass *klass)
GtkWidgetClass *widget_class; /* Classe version Widget */
GtkObjectClass *object_class;
+ gchar *filename; /* Fichier d'image à charger */
widget_class = (GtkWidgetClass *) klass;
object_class = (GtkObjectClass *) klass;
@@ -190,6 +198,38 @@ static void gtk_block_view_class_init(GtkBlockViewClass *klass)
widget_class->expose_event = gtk_block_view_expose;
object_class->destroy = gtk_block_view_destroy;
+
+
+
+ /* Image de la marge gauche */
+
+ filename = find_pixmap_file("entry.png");
+
+ if (filename == NULL) klass->entry_pix = NULL;
+ else
+ {
+ klass->entry_pix = gdk_pixbuf_new_from_file(filename, NULL);
+ g_free(filename);
+ }
+
+ filename = find_pixmap_file("breakpoint.png");
+
+ if (filename == NULL) klass->breakpoint_pix = NULL;
+ else
+ {
+ klass->breakpoint_pix = gdk_pixbuf_new_from_file(filename, NULL);
+ g_free(filename);
+ }
+
+ filename = find_pixmap_file("stopped.png");
+
+ if (filename == NULL) klass->stopped_pix = NULL;
+ else
+ {
+ klass->stopped_pix = gdk_pixbuf_new_from_file(filename, NULL);
+ g_free(filename);
+ }
+
}
@@ -210,10 +250,7 @@ static void gtk_block_view_init(GtkBlockView *view)
GtkBinView *binview; /* Instance parente */
- PangoTabArray *tabs;
- gint current_y;
PangoFontDescription *font_desc;
- GList *child_exposes;
PangoContext *ltr_context, *rtl_context;
GtkTextAttributes *style;
static bool done = false;
@@ -230,8 +267,8 @@ static void gtk_block_view_init(GtkBlockView *view)
- view->_layout = gtk_text_layout_new();
- gtk_text_layout_set_buffer(view->_layout, view->buffer);
+ view->layout = gtk_text_layout_new();
+ gtk_text_layout_set_buffer(view->layout, view->buffer);
@@ -239,9 +276,9 @@ static void gtk_block_view_init(GtkBlockView *view)
{
done = true;
- gtk_text_layout_set_cursor_visible(GTK_BLOCK_VIEW(view)->_layout, FALSE);
+ gtk_text_layout_set_cursor_visible(GTK_BLOCK_VIEW(view)->layout, FALSE);
- gtk_text_layout_set_overwrite_mode(GTK_BLOCK_VIEW(view)->_layout, FALSE);
+ gtk_text_layout_set_overwrite_mode(GTK_BLOCK_VIEW(view)->layout, FALSE);
ltr_context = gtk_widget_create_pango_context(view);
@@ -249,18 +286,10 @@ static void gtk_block_view_init(GtkBlockView *view)
rtl_context = gtk_widget_create_pango_context(view);
pango_context_set_base_dir(rtl_context, PANGO_DIRECTION_RTL);
- gtk_text_layout_set_contexts(GTK_BLOCK_VIEW(view)->_layout, ltr_context, rtl_context);
+ gtk_text_layout_set_contexts(GTK_BLOCK_VIEW(view)->layout, ltr_context, rtl_context);
- tabs = pango_tab_array_new_with_positions(5, TRUE,
- PANGO_TAB_LEFT, 120,
- PANGO_TAB_LEFT, 290,
- PANGO_TAB_LEFT, 50,
- PANGO_TAB_LEFT, 50,
- PANGO_TAB_LEFT, 50);
-
-
style = gtk_text_attributes_new ();
gtk_widget_ensure_style(view);
@@ -279,7 +308,6 @@ static void gtk_block_view_init(GtkBlockView *view)
style->indent = 10;*/
style->left_margin = 10;
style->right_margin = 10;
- style->tabs = tabs;
style->wrap_mode = GTK_WRAP_WORD;
style->justification = GTK_JUSTIFY_LEFT;
@@ -287,22 +315,18 @@ static void gtk_block_view_init(GtkBlockView *view)
style->direction = gtk_widget_get_direction(view);
- gtk_text_layout_set_default_style(GTK_BLOCK_VIEW(view)->_layout, style);
+ gtk_text_layout_set_default_style(GTK_BLOCK_VIEW(view)->layout, style);
gtk_text_attributes_unref(style);
- //gtk_text_layout_get_size (GTK_BLOCK_VIEW(view)->_layout, &width, &height);
+ //gtk_text_layout_get_size (GTK_BLOCK_VIEW(view)->layout, &width, &height);
- gtk_text_layout_set_screen_width (GTK_BLOCK_VIEW(view)->_layout,
+ gtk_text_layout_set_screen_width (GTK_BLOCK_VIEW(view)->layout,
MAX (1, 1000));
}
-
- gtk_text_buffer_set_text(view->buffer, "\t|\t|\t|\t|\t|\n", -1);
-
-
}
@@ -362,8 +386,6 @@ static void gtk_block_view_realize(GtkWidget *widget)
GTK_WIDGET_CLASS(parent_class)->realize(widget);
- GTK_BLOCK_VIEW(widget)->layout = gtk_widget_create_pango_layout(widget, NULL);
-
font_desc = pango_font_description_from_string("mono 10");
gtk_widget_modify_font(widget, font_desc);
pango_font_description_free(font_desc);
@@ -375,25 +397,24 @@ static gboolean gtk_block_view_button_press(GtkWidget *widget, GdkEventButton *e
{
gboolean result; /* Décision à retourner */
GtkBlockView *view; /* Composant GTK réel */
- int y; /* Position à manipuler */
- GRenderingLine *line; /* Ligne de rendu visée */
+ GtkTextIter iter; /* Point d'insertion */
+ GtkTextMark *mark; /* Marquage de ligne associée */
+ GRenderingLine *line; /* Ligne de rendu */
result = FALSE;
view = GTK_BLOCK_VIEW(widget);
- y = event->y;
- line = g_rendering_line_find_by_y(GTK_BIN_VIEW(view)->lines, GTK_BIN_VIEW(view)->last, &y);
+ gtk_text_layout_get_line_at_y(view->layout, &iter, event->y, NULL);
+ mark = gtk_text_iter_get_marks(&iter)->data;
- if (line != NULL)
- {
- /* Clic dans la marge */
- if (event->type == GDK_BUTTON_PRESS && event->x < (2 * MARGIN_SPACE + view->line_height))
- {
- result = TRUE;
- g_rendering_line_toggle_flag(line, RLF_BREAK_POINT);
- }
+ line = g_object_get_data(G_OBJECT(mark), "line");
+ /* Clic dans la marge */
+ if (event->type == GDK_BUTTON_PRESS && event->x < view->left_margin)
+ {
+ result = TRUE;
+ g_rendering_line_toggle_flag(line, RLF_BREAK_POINT);
}
return result;
@@ -447,66 +468,156 @@ void gtk_block_view_update_margin(GRenderingLine *line, GtkBlockView *view)
static gboolean gtk_block_view_expose(GtkWidget *widget, GdkEventExpose *event)
{
- GtkBinView *view; /* Autre version du composant */
- GdkGCValues values; /* Propriétés du contexte */
- GdkColor white; /* Couleur du fond */
- int width; /* Largeur de l'élément */
- int height; /* Hauteur de l'élément */
- int y; /* Ordonnée du haut d'une ligne*/
- GRenderingLine *iter; /* Boucle de parcours */
+ GtkBlockView *view;
+
+
+ //GtkWidget *widget; /* Autre version du composant */
+ GtkBinView *bview; /* Autre version du composant */
+ GtkStyle *style; /* Style associé au composant */
+ GtkBinViewClass *parent_class; /* Version pure du parent */
+ GtkTextIter iter; /* Point d'insertion */
+ GdkRectangle rect; /* Zone d'un point */
+ GtkTextMark *mark; /* Marquage de ligne associée */
+ GRenderingLine *line; /* Ligne de rendu */
+ RenderingLineFlag flags; /* Propriétés de la ligne */
+ GdkPixbuf *pixbuf; /* Données utiles au dessin */
+
+
+ //GdkGCValues values; /* Propriétés du contexte */
+ //GdkColor white; /* Couleur du fond */
+ //int width; /* Largeur de l'élément */
+ //int height; /* Hauteur de l'élément */
+ //int y; /* Ordonnée du haut d'une ligne*/
+ //GRenderingLine *iter; /* Boucle de parcours */
- PangoFontDescription *font_desc;
GList *child_exposes;
- view = GTK_BIN_VIEW(widget);
+ view = GTK_BLOCK_VIEW(widget);
+
+ widget = GTK_WIDGET(view);
+ bview = GTK_BIN_VIEW(widget);
+
+ gdk_window_begin_paint_region(GDK_DRAWABLE(widget->window), event->region);
+
+ gdk_gc_set_clip_region(bview->gc, event->region);
+
+ style = gtk_widget_get_style(GTK_WIDGET(view));
+
+
+ //gtk_widget_get_size_request(widget, &width, &height);
+
+
+ /* Dessin de la marge gauche */
+
+ gdk_gc_set_foreground(bview->gc, &style->mid[GTK_WIDGET_STATE(widget)]);
+
+ gdk_draw_rectangle(GDK_DRAWABLE(widget->window), bview->gc, TRUE,
+ 0, event->area.y, view->left_margin, event->area.y + event->area.height);
+
+ gdk_gc_set_foreground(bview->gc, &style->dark[GTK_WIDGET_STATE(widget)]);
+
+ gdk_draw_line(GDK_DRAWABLE(widget->window), bview->gc,
+ view->left_margin, event->area.y,
+ view->left_margin, event->area.y + event->area.height);
+
+ /* Eventuelle bordure globale */
+
+ parent_class = GTK_BIN_VIEW_CLASS(g_type_class_peek_parent(GTK_BLOCK_VIEW_GET_CLASS(view)));
+
+ GTK_WIDGET_CLASS(parent_class)->expose_event(widget, event);
+
+ /* Informations individuelles des lignes */
+
+ gtk_text_layout_get_line_at_y(view->layout, &iter, event->area.y, NULL);
+ gtk_text_layout_get_iter_location(view->layout, &iter, &rect);
+
+ while (rect.y < (event->area.y + event->area.height))
+ {
+ mark = gtk_text_iter_get_marks(&iter)->data;
+
+ line = g_object_get_data(G_OBJECT(mark), "line");
+ flags = g_rendering_line_get_flags(line);
+
+ if (flags & RLF_RUNNING_BP)
+ pixbuf = GTK_BLOCK_VIEW_GET_CLASS(view)->stopped_pix;
+
+ else if (flags & RLF_BREAK_POINT)
+ pixbuf = GTK_BLOCK_VIEW_GET_CLASS(view)->breakpoint_pix;
+
+ else pixbuf = NULL;
+
+ if (pixbuf != NULL)
+ gdk_draw_pixbuf(GDK_DRAWABLE(widget->window), bview->gc, pixbuf, 0, 0, 10, rect.y,
+ gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf),
+ GDK_RGB_DITHER_NORMAL, 0, 0);
+
+ /* Le point d'entrée prime */
+ if (flags & RLF_ENTRY_POINT)
+ {
+ pixbuf = GTK_BLOCK_VIEW_GET_CLASS(view)->entry_pix;
+
+ gdk_draw_pixbuf(GDK_DRAWABLE(widget->window), bview->gc, pixbuf, 0, 0, 10, rect.y,
+ gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf),
+ GDK_RGB_DITHER_NORMAL, 0, 0);
+
+ }
+
+ if (!gtk_text_layout_move_iter_to_next_line(view->layout, &iter)) break;
+ gtk_text_layout_get_iter_location(view->layout, &iter, &rect);
+
+ }
+
+ /* Impression du désassemblage */
+
+
+
#if 0
gdk_window_begin_paint_region(GDK_DRAWABLE(widget->window), event->region);
- gdk_gc_set_clip_region(view->gc, event->region);
+ gdk_gc_set_clip_region(bview->gc, event->region);
- gdk_gc_get_values(view->gc, &values);
+ gdk_gc_get_values(bview->gc, &values);
gdk_color_white(gtk_widget_get_colormap(widget), &white);
- gdk_gc_set_foreground(view->gc, &white);
+ gdk_gc_set_foreground(bview->gc, &white);
gtk_widget_get_size_request(widget, &width, &height);
- gdk_draw_rectangle(GDK_DRAWABLE(widget->window), view->gc,
+ gdk_draw_rectangle(GDK_DRAWABLE(widget->window), bview->gc,
TRUE, 0, 0, width, height);
- gdk_gc_set_foreground(view->gc, &values.foreground);
+ gdk_gc_set_foreground(bview->gc, &values.foreground);
/*
y = event->area.y;
- iter = g_rendering_line_find_by_y(view->lines, view->last, &y);
+ iter = g_rendering_line_find_by_y(bview->lines, bview->last, &y);
y = event->area.y - y;
for ( ; iter != NULL && y < (event->area.y + event->area.height);
- iter = g_rendering_line_get_next_iter(view->lines, iter, view->last))
+ iter = g_rendering_line_get_next_iter(bview->lines, iter, bview->last))
{
- g_rendering_line_draw(iter, GDK_DRAWABLE(widget->window), view->gc,
- MARGIN_SPACE, 2 * MARGIN_SPACE + GTK_BLOCK_VIEW(view)->line_height,
- y, GTK_BLOCK_VIEW(view)->line_height, GTK_BLOCK_VIEW(view)->rendering);
+ g_rendering_line_draw(iter, GDK_DRAWABLE(widget->window), bview->gc,
+ MARGIN_SPACE, 2 * MARGIN_SPACE + GTK_BLOCK_VIEW(bview)->line_height,
+ y, GTK_BLOCK_VIEW(bview)->line_height, GTK_BLOCK_VIEW(bview)->rendering);
- y += GTK_BLOCK_VIEW(view)->line_height;
+ y += GTK_BLOCK_VIEW(bview)->line_height;
}
*/
gdk_window_end_paint(GDK_DRAWABLE(widget->window));
#endif
- gtk_text_layout_set_screen_width (GTK_BLOCK_VIEW(view)->_layout,
+ gtk_text_layout_set_screen_width (GTK_BLOCK_VIEW(bview)->layout,
MAX (1, 1000));
- //gtk_text_buffer_set_text(GTK_BLOCK_VIEW(view)->buffer, "Hello, this some text\n", -1);
- font_desc = pango_font_description_from_string ("mono 10");
- gtk_widget_modify_font (view, font_desc);
- pango_font_description_free (font_desc);
- gtk_text_layout_draw(GTK_BLOCK_VIEW(view)->_layout, widget, GDK_DRAWABLE(widget->window),
- NULL, 0, 0, 0, 0, 5000, 50000, &child_exposes);
+ gtk_text_layout_draw(GTK_BLOCK_VIEW(bview)->layout, widget, GDK_DRAWABLE(widget->window),
+ NULL, view->left_text, 0, 0, 0, 5000, 50000, &child_exposes);
+
+
+ gdk_window_end_paint(GDK_DRAWABLE(widget->window));
return TRUE;
@@ -619,8 +730,16 @@ void gtk_block_view_set_format(GtkBlockView *view, const exe_format *format)
static void gtk_block_view_set_rendering_lines(GtkBlockView *view, GRenderingLine *lines, GRenderingLine *last)
{
+ size_t lengths[SAR_COUNT]; /* Différentes tailles de zone */
GRenderingLine *iter; /* Boucle de parcours */
GtkTextIter pos; /* Point d'insertion */
+ GtkTextMark *mark; /* Marquage de ligne associée */
+ PangoTabArray *tabs; /* Tailles de tabulation */
+ GdkRectangle rect; /* Zone d'un point */
+
+ lengths[SAR_ADDRESS] = 0;
+ lengths[SAR_CODE] = 0;
+ lengths[SAR_INSTRUCTION] = 0;
for (iter = GTK_BIN_VIEW(view)->lines;
iter != NULL;
@@ -636,12 +755,56 @@ static void gtk_block_view_set_rendering_lines(GtkBlockView *view, GRenderingLin
}
gtk_text_buffer_get_end_iter(view->buffer, &pos);
+
+ mark = gtk_text_buffer_create_mark(view->buffer, NULL, &pos, TRUE);
+ g_object_set_data(G_OBJECT(mark), "line", iter);
+
g_content_exporter_add_to_gtk_buffer(G_CONTENT_EXPORTER(iter), view->rendering,
- view->buffer, &pos);
+ view->buffer, &pos, lengths);
}
- gtk_text_layout_validate(GTK_BLOCK_VIEW(view)->_layout, 100000);
+ gtk_text_layout_move_iter_visually(view->layout, &pos, -1);
+ gtk_text_layout_get_iter_location(view->layout, &pos, &rect);
+
+ /* Taille des tabulations */
+
+ if (lengths[SAR_ADDRESS] > 0 && lengths[SAR_CODE] > 0)
+ tabs = pango_tab_array_new_with_positions(3, TRUE,
+ PANGO_TAB_LEFT, rect.width * (lengths[SAR_ADDRESS] + 3),
+ PANGO_TAB_LEFT, rect.width * (lengths[SAR_ADDRESS] + 3 + lengths[SAR_CODE] + 3),
+ PANGO_TAB_LEFT, rect.width * (lengths[SAR_ADDRESS] + 3 + lengths[SAR_CODE] + 3 + lengths[SAR_INSTRUCTION] + 4));
+
+ else if (lengths[SAR_ADDRESS] > 0 && lengths[SAR_CODE] == 0)
+ tabs = pango_tab_array_new_with_positions(2, TRUE,
+ PANGO_TAB_LEFT, rect.width * (lengths[SAR_ADDRESS] + 3),
+ PANGO_TAB_LEFT, rect.width * (lengths[SAR_ADDRESS] + 3 + lengths[SAR_INSTRUCTION] + 4));
+
+ else if (lengths[SAR_ADDRESS] == 0 && lengths[SAR_CODE] > 0)
+ tabs = pango_tab_array_new_with_positions(2, TRUE,
+ PANGO_TAB_LEFT, rect.width * (lengths[SAR_CODE] + 3),
+ PANGO_TAB_LEFT, rect.width * (lengths[SAR_CODE] + 3 + lengths[SAR_INSTRUCTION] + 4));
+
+ else
+ tabs = pango_tab_array_new_with_positions(1, TRUE,
+ PANGO_TAB_LEFT, rect.width * (lengths[SAR_INSTRUCTION] + 4));
+
+ if (view->layout->default_style->tabs)
+ pango_tab_array_free(view->layout->default_style->tabs);
+
+ view->layout->default_style->tabs = tabs;
+
+ gtk_text_layout_default_style_changed(view->layout);
+
+ /* Taille des marges */
+
+ view->line_height = rect.height;
+ view->left_margin = 2 * rect.height;
+ view->left_text = -2.5 * rect.height;
+
+ /* Validation finale */
+
+ gtk_text_layout_validate(GTK_BLOCK_VIEW(view)->layout, 100000);
gtk_block_view_recompute_size_request(view);
@@ -665,28 +828,16 @@ static void gtk_block_view_set_rendering_lines(GtkBlockView *view, GRenderingLin
void gtk_block_view_recompute_size_request(GtkBlockView *view)
{
- int width; /* Largeur de l'objet actuelle */
- int height; /* Hauteur de l'objet actuelle */
+ gint width; /* Largeur de l'objet actuelle */
+ gint height; /* Hauteur de l'objet actuelle */
- gtk_text_layout_get_size(view->_layout, &width, &height);
+ gtk_text_layout_get_size(view->layout, &width, &height);
- gtk_widget_set_size_request(GTK_WIDGET(view),
- width + 2 * MARGIN_SPACE + 20/*view->line_height*/,
- height);
+ width += -view->left_text + 1;
+ height += 1;
+ gtk_widget_set_size_request(GTK_WIDGET(view), width, height);
- printf("req size :: (%d ; %d)\n", width, height);
-
- /*
- g_rendering_line_get_size(GTK_BIN_VIEW(view)->lines,
- GTK_BIN_VIEW(view)->last,
- view->rendering,
- &width, &height, &view->line_height);
-
- gtk_widget_set_size_request(GTK_WIDGET(view),
- width + 2 * MARGIN_SPACE + view->line_height,
- height);
- */
}