func draw_selections(viewp, bufferp, crp unsafe.Pointer, mark_pairs []unsafe.Pointer) { view := (*C.GtkTextView)(viewp) buffer := (*C.GtkTextBuffer)(bufferp) cr := (*C.cairo_t)(crp) var alloc C.GtkAllocation C.gtk_widget_get_allocation((*C.GtkWidget)(viewp), &alloc) n := len(mark_pairs) var start_mark, stop_mark *C.GtkTextMark var location C.GdkRectangle var iter C.GtkTextIter var x, y C.gint var dx, dy C.double for i := 0; i < n; i += 2 { start_mark = (*C.GtkTextMark)(mark_pairs[i]) C.gtk_text_buffer_get_iter_at_mark(buffer, &iter, start_mark) C.gtk_text_view_get_iter_location(view, &iter, &location) C.gtk_text_view_buffer_to_window_coords(view, C.GTK_TEXT_WINDOW_WIDGET, C.gint(location.x), C.gint(location.y), &x, &y) if C.int(x) > alloc.width || C.int(y) > alloc.height || x < 0 || y < 0 { continue } dx = C.double(x) dy = C.double(y) C.cairo_set_source_rgb(cr, 1, 0, 0) C.cairo_move_to(cr, dx, dy) C.cairo_set_line_width(cr, 2) C.cairo_line_to(cr, dx+6, dy) C.cairo_stroke(cr) C.cairo_move_to(cr, dx, dy) C.cairo_set_line_width(cr, 1) C.cairo_line_to(cr, dx, dy+C.double(location.height)) C.cairo_stroke(cr) stop_mark = (*C.GtkTextMark)(mark_pairs[i+1]) C.gtk_text_buffer_get_iter_at_mark(buffer, &iter, stop_mark) C.gtk_text_view_get_iter_location(view, &iter, &location) C.gtk_text_view_buffer_to_window_coords(view, C.GTK_TEXT_WINDOW_WIDGET, C.gint(location.x), C.gint(location.y), &x, &y) if C.int(x) > alloc.width || C.int(y) > alloc.height || x < 0 || y < 0 { continue } dx = C.double(x) dy = C.double(y) C.cairo_set_source_rgb(cr, 0, 1, 0) C.cairo_move_to(cr, dx, dy) C.cairo_set_line_width(cr, 1) C.cairo_line_to(cr, dx, dy+C.double(location.height)) C.cairo_stroke(cr) C.cairo_move_to(cr, dx, dy+C.double(location.height)) C.cairo_set_line_width(cr, 2) C.cairo_line_to(cr, dx-6, dy+C.double(location.height)) C.cairo_stroke(cr) } }
func set_relative_indicators(bufp unsafe.Pointer, viewp unsafe.Pointer, offsets []int, indicators []unsafe.Pointer) { buf := (*C.GtkTextBuffer)(bufp) view := (*C.GtkTextView)(viewp) var it C.GtkTextIter C.gtk_text_buffer_get_start_iter(buf, &it) var location C.GdkRectangle var left, top C.gint var indicator *C.GtkWidget for i, offset := range offsets { C.gtk_text_iter_set_offset(&it, C.gint(offset)) C.gtk_text_view_get_iter_location(view, &it, &location) C.gtk_text_view_buffer_to_window_coords(view, C.GTK_TEXT_WINDOW_WIDGET, C.gint(location.x), C.gint(location.y), &left, &top) indicator = (*C.GtkWidget)(indicators[i]) top += 8 if left >= C.gint(0) && top >= C.gint(0) { C.gtk_widget_set_margin_start(indicator, left) C.gtk_widget_set_margin_top(indicator, top) C.gtk_widget_show(indicator) } } }
// BufferToWindowCoords is a wrapper around gtk_text_view_buffer_to_window_coords(). func (v *TextView) BufferToWindowCoords(win TextWindowType, buffer_x, buffer_y int) (window_x, window_y int) { var wx, wy C.gint C.gtk_text_view_buffer_to_window_coords(v.native(), C.GtkTextWindowType(win), C.gint(buffer_x), C.gint(buffer_y), &wx, &wy) return int(wx), int(wy) }