static void dma_sparse_view_synchronize_iter (DmaSparseView *view, DmaSparseIter *iter) { gdouble dist; gdouble pos; /* Need to change iterator according to adjustment */ pos = gtk_adjustment_get_value (view->priv->vadjustment); dist = pos - (gdouble)dma_sparse_iter_get_address (iter); if (dist != 0) { gdouble page_size = gtk_adjustment_get_page_size (view->priv->vadjustment); if ((dist < 4.0 * page_size) && (dist > -4.0 * page_size)) { gint count = (gint) (dist / gtk_adjustment_get_step_increment (view->priv->vadjustment)); dma_sparse_iter_forward_lines (iter, count); } else { dma_sparse_iter_move_at (iter, pos); dma_sparse_iter_round (iter, FALSE); } gtk_adjustment_set_value (view->priv->vadjustment, (gdouble)dma_sparse_iter_get_address (iter)); } }
static void dma_sparse_view_move_cursor (GtkTextView *text_view, GtkMovementStep step, gint count, gboolean extend_selection) { DmaSparseView *view = DMA_SPARSE_VIEW (text_view); switch (step) { case GTK_MOVEMENT_LOGICAL_POSITIONS: case GTK_MOVEMENT_VISUAL_POSITIONS: case GTK_MOVEMENT_WORDS: case GTK_MOVEMENT_DISPLAY_LINE_ENDS: case GTK_MOVEMENT_HORIZONTAL_PAGES: break; case GTK_MOVEMENT_DISPLAY_LINES: case GTK_MOVEMENT_PARAGRAPHS: case GTK_MOVEMENT_PARAGRAPH_ENDS: dma_sparse_iter_forward_lines (&view->priv->start, count); gtk_adjustment_set_value (view->priv->vadjustment, (gdouble)dma_sparse_iter_get_address (&view->priv->start)); return; case GTK_MOVEMENT_PAGES: dma_sparse_iter_forward_lines (&view->priv->start, count * (view->priv->line_by_page > 1 ? view->priv->line_by_page - 1 : view->priv->line_by_page)); gtk_adjustment_set_value (view->priv->vadjustment, (gdouble)dma_sparse_iter_get_address (&view->priv->start)); return; case GTK_MOVEMENT_BUFFER_ENDS: break; default: break; } GTK_TEXT_VIEW_CLASS (parent_class)->move_cursor (text_view, step, count, extend_selection); }
guint dma_sparse_view_get_location (DmaSparseView *view) { GtkTextMark *mark; GtkTextBuffer *buffer; GtkTextIter iter; DmaSparseIter buf_iter; gint line; buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(view)); mark = gtk_text_buffer_get_insert (buffer); gtk_text_buffer_get_iter_at_mark (buffer, &iter, mark); line = gtk_text_iter_get_line (&iter); dma_sparse_iter_copy (&buf_iter, &view->priv->start); dma_sparse_iter_forward_lines (&buf_iter, line); return dma_sparse_iter_get_address (&buf_iter); }
static void dma_sparse_view_paint_margin (DmaSparseView *view, GdkEventExpose *event) { GtkTextView *text_view; GdkWindow *win; PangoLayout *layout; gint y1, y2; gint y, height; gchar str [16]; gint margin_width; gint margin_length; gint text_width; DmaSparseIter buf_iter; GtkTextIter text_iter; guint prev_address = G_MAXUINT; text_view = GTK_TEXT_VIEW (view); if (!view->priv->show_line_numbers && !view->priv->show_line_markers) { gtk_text_view_set_border_window_size (text_view, GTK_TEXT_WINDOW_LEFT, 0); return; } win = gtk_text_view_get_window (text_view, GTK_TEXT_WINDOW_LEFT); y1 = event->area.y; y2 = y1 + event->area.height; /* get the extents of the line printing */ gtk_text_view_window_to_buffer_coords (text_view, GTK_TEXT_WINDOW_LEFT, 0, y1, NULL, &y1); gtk_text_view_window_to_buffer_coords (text_view, GTK_TEXT_WINDOW_LEFT, 0, y2, NULL, &y2); /* set size. */ g_snprintf (str, sizeof (str), "0x%X", G_MAXUINT); margin_length = strlen(str) - 2; layout = gtk_widget_create_pango_layout (GTK_WIDGET (view), str); pango_layout_get_pixel_size (layout, &text_width, NULL); pango_layout_set_width (layout, text_width); pango_layout_set_alignment (layout, PANGO_ALIGN_RIGHT); /* determine the width of the left margin. */ if (view->priv->show_line_numbers) margin_width = text_width + 4; else margin_width = 0; if (view->priv->show_line_markers) margin_width += GUTTER_PIXMAP; g_return_if_fail (margin_width != 0); gtk_text_view_set_border_window_size (GTK_TEXT_VIEW (text_view), GTK_TEXT_WINDOW_LEFT, margin_width); /* Display all addresses */ dma_sparse_iter_copy (&buf_iter, &view->priv->start); gtk_text_buffer_get_start_iter (gtk_text_view_get_buffer (text_view), &text_iter); /* Skip line while position doesn't need to be repaint */ gtk_text_view_get_line_yrange (text_view, &text_iter, &y, &height); if (y < y1) { do { if (!dma_sparse_iter_forward_lines (&buf_iter, 1)) return; if (!gtk_text_iter_forward_line (&text_iter)) return; gtk_text_view_get_line_yrange (text_view, &text_iter, &y, &height); } while (y < y1); } /* Display address */ do { gint pos; guint address; gtk_text_view_buffer_to_window_coords (text_view, GTK_TEXT_WINDOW_LEFT, 0, y, NULL, &pos); address = dma_sparse_iter_get_address (&buf_iter); if (view->priv->show_line_numbers) { g_snprintf (str, sizeof (str),"0x%0*lX", margin_length, (long unsigned int)address); pango_layout_set_markup (layout, str, -1); gtk_paint_layout (gtk_widget_get_style (GTK_WIDGET (view)), win, gtk_widget_get_state (GTK_WIDGET (view)), FALSE, NULL, GTK_WIDGET (view), NULL, text_width + 2, pos, layout); } /* Display marker */ if ((prev_address != address) && (view->priv->show_line_markers)) { gint current_marker = dma_sparse_buffer_get_marks (view->priv->buffer, address); if (current_marker) { gint x; if (view->priv->show_line_numbers) x = text_width + 4; else x = 0; draw_line_markers (view, current_marker, x, pos); prev_address = address; } } if (!dma_sparse_iter_forward_lines (&buf_iter, 1)) return; if (!gtk_text_iter_forward_line (&text_iter)) return; gtk_text_view_get_line_yrange (text_view, &text_iter, &y, &height); } while (y < y2); g_object_unref (G_OBJECT (layout)); }
static void dma_disassembly_buffer_insert_line (DmaSparseIter *iter, GtkTextIter *dst) { DmaDisassemblyBuffer * dis = (DmaDisassemblyBuffer *)iter->buffer; GtkTextBuffer *buffer = gtk_text_iter_get_buffer (dst); if (dis->debugger != NULL) { dma_sparse_iter_refresh (iter); if (iter->line < DMA_DISASSEMBLY_VALID_ADDRESS) { if (iter->buffer->pending == NULL) { DmaSparseIter end; DmaSparseBufferTransport *trans; gint i, j; gulong start_adr; gulong end_adr; gint margin; /* If following line is define, get a block stopping here */ dma_sparse_iter_copy (&end, iter); margin = 0; for (j = 0; j < DMA_DISASSEMBLY_BUFFER_BLOCK_SIZE / DMA_DISASSEMBLY_DEFAULT_LINE_LENGTH; j++) { if (!dma_disassembly_iter_forward_line (&end)) { end.offset = 0; end.base = dma_sparse_buffer_get_upper (end.buffer); break; } if (margin > DMA_DISASSEMBLY_SKIP_BEGINNING_LINE) break; if ((margin != 0) || (end.line >= DMA_DISASSEMBLY_VALID_ADDRESS)) margin++; } i = j; if (iter->line == DMA_DISASSEMBLY_UNKNOWN_ADDRESS) { for (i = j; i < DMA_DISASSEMBLY_BUFFER_BLOCK_SIZE / DMA_DISASSEMBLY_DEFAULT_LINE_LENGTH; i++) { if (!dma_disassembly_iter_backward_line (iter)) break; if (iter->line >= DMA_DISASSEMBLY_VALID_ADDRESS) break; } } start_adr = dma_sparse_iter_get_address (iter); end_adr = dma_sparse_iter_get_address (&end); trans = dma_sparse_buffer_alloc_transport (DMA_SPARSE_BUFFER (dis), i, 0); trans->tag = i != j ? DMA_DISASSEMBLY_SKIP_BEGINNING : DMA_DISASSEMBLY_KEEP_ALL; trans->start = start_adr; trans->length = end_adr - start_adr; if (end_adr == dma_sparse_buffer_get_upper (DMA_SPARSE_BUFFER (dis))) { trans->length++; } DEBUG_PRINT("get disassemble %lx %lx %ld trans %p buffer %p", start_adr, end_adr, trans->length, trans, trans->buffer); dma_queue_disassemble (dis->debugger, start_adr, end_adr + 1 - start_adr, (IAnjutaDebuggerCallback)on_disassemble, trans); } } else { /* Fill with known data */ gtk_text_buffer_insert (buffer, dst, ((DmaDisassemblyBufferNode *)(iter->node))->data[iter->line].text, -1); return; } } /* Fill with unknow data */ gtk_text_buffer_insert (buffer, dst, "??", 2); }