コード例 #1
0
ファイル: sparse_view.c プロジェクト: abderrahim/anjuta
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));
	}
}
コード例 #2
0
ファイル: sparse_view.c プロジェクト: abderrahim/anjuta
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);
}
コード例 #3
0
ファイル: sparse_view.c プロジェクト: abderrahim/anjuta
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);
}
コード例 #4
0
ファイル: sparse_view.c プロジェクト: abderrahim/anjuta
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));	
}
コード例 #5
0
ファイル: disassemble.c プロジェクト: rosedu/anjuta
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);
}