static gboolean gutter_renderer_query_tooltip (GtkSourceGutterRenderer *renderer, GtkTextIter *iter, GdkRectangle *area, gint x, gint y, GtkTooltip *tooltip) { GSList *marks; GtkSourceView *view; GtkSourceBuffer *buffer; view = GTK_SOURCE_VIEW (gtk_source_gutter_renderer_get_view (renderer)); buffer = GTK_SOURCE_BUFFER (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); marks = gtk_source_buffer_get_source_marks_at_iter (buffer, iter, NULL); if (marks != NULL) { marks = g_slist_sort_with_data (marks, sort_marks_by_priority, view); marks = g_slist_reverse (marks); return set_tooltip_widget_from_marks (view, tooltip, marks); } return FALSE; }
static GtkSourceMark * get_bookmark_and_iter (GtkSourceBuffer *buffer, GtkTextIter *iter, GtkTextIter *start) { GSList *marks; GtkSourceMark *ret = NULL; if (!iter) { gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (buffer), start, gtk_text_buffer_get_insert (GTK_TEXT_BUFFER (buffer))); } else { *start = *iter; } gtk_text_iter_set_line_offset (start, 0); marks = gtk_source_buffer_get_source_marks_at_iter (buffer, start, BOOKMARK_CATEGORY); if (marks != NULL) { ret = GTK_SOURCE_MARK (marks->data); } g_slist_free (marks); return ret; }
static void gutter_renderer_query_data (GtkSourceGutterRenderer *renderer, GtkTextIter *start, GtkTextIter *end, GtkSourceGutterRendererState state) { GSList *marks; GdkPixbuf *pixbuf = NULL; gint size = 0; GtkSourceView *view; GtkSourceBuffer *buffer; view = GTK_SOURCE_VIEW (gtk_source_gutter_renderer_get_view (renderer)); buffer = GTK_SOURCE_BUFFER (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); marks = gtk_source_buffer_get_source_marks_at_iter (buffer, start, NULL); if (marks != NULL) { size = measure_line_height (view); pixbuf = composite_marks (view, marks, size); g_slist_free (marks); } g_object_set (G_OBJECT (renderer), "pixbuf", pixbuf, "xpad", 2, "yalign", 0.5, "xalign", 0.5, "alignment-mode", GTK_SOURCE_GUTTER_RENDERER_ALIGNMENT_MODE_FIRST, NULL); }
static void on_delete_range (GtkTextBuffer *buffer, GtkTextIter *start, GtkTextIter *end, gpointer user_data) { GtkTextIter iter; GSList *marks; GSList *item; iter = *start; /* move to start of line */ gtk_text_iter_set_line_offset (&iter, 0); /* remove any bookmarks that are collapsed on each other due to this */ marks = gtk_source_buffer_get_source_marks_at_iter (GTK_SOURCE_BUFFER (buffer), &iter, BOOKMARK_CATEGORY); if (marks == NULL) return; /* remove all but the first mark */ for (item = marks->next; item; item = item->next) gtk_text_buffer_delete_mark (buffer, GTK_TEXT_MARK (item->data)); g_slist_free (marks); }
gboolean gui_editor_is_marked (GUIEditor * self, gint ln) { GtkTextIter line_start, line_end; GSList *list_iter; /* get line bounds */ gtk_text_buffer_get_iter_at_line (GTK_TEXT_BUFFER (self->buffer), &line_start, ln); line_end = line_start; gtk_text_iter_forward_to_line_end (&line_end); /* get the markers already in the line */ list_iter = gtk_source_buffer_get_source_marks_at_iter (self->buffer, &line_start, NULL); /* search for the breakpoint marker */ while (list_iter != NULL) { GtkSourceMark *tmp = list_iter->data; const gchar *tmp_type = gtk_source_mark_get_category (tmp); if (tmp_type && !strcmp (tmp_type, MARKER_BREAKPOINT)) { return TRUE; } list_iter = g_slist_next (list_iter); } return FALSE; }
static void load_bookmarks (PlumaView *view, gchar **bookmarks) { GtkSourceBuffer *buf; GtkTextIter iter; gint tot_lines; gint i; buf = GTK_SOURCE_BUFFER (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view))); gtk_text_buffer_get_end_iter (GTK_TEXT_BUFFER (buf), &iter); tot_lines = gtk_text_iter_get_line (&iter); for (i = 0; bookmarks != NULL && bookmarks[i] != NULL; i++) { gint line; line = atoi (bookmarks[i]); if (line >= 0 && line < tot_lines) { GSList *marks; gtk_text_buffer_get_iter_at_line (GTK_TEXT_BUFFER (buf), &iter, line); marks = gtk_source_buffer_get_source_marks_at_iter (buf, &iter, BOOKMARK_CATEGORY); if (marks == NULL) { /* Add new bookmark */ gtk_source_buffer_create_source_mark (buf, NULL, BOOKMARK_CATEGORY, &iter); } else { g_slist_free (marks); } } } }
static void on_insert_text_before (GtkTextBuffer *buffer, GtkTextIter *location, gchar *text, gint len, InsertData *data) { if (gtk_text_iter_starts_line (location)) { GSList *marks; marks = gtk_source_buffer_get_source_marks_at_iter (GTK_SOURCE_BUFFER (buffer), location, BOOKMARK_CATEGORY); if (marks != NULL) { add_tracker (buffer, location, marks->data, data); g_slist_free (marks); } } }
static void goto_bookmark (PlumaWindow *window, GtkSourceView *view, GtkTextIter *iter, IterSearchFunc func, CycleFunc cycle_func) { GtkTextBuffer *buffer; GtkTextIter at; GtkTextMark *insert; GtkTextIter end; if (view == NULL) { view = GTK_SOURCE_VIEW (pluma_window_get_active_view (window)); } if (view == NULL) { return; } buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); if (iter == NULL) { gtk_text_buffer_get_iter_at_mark (buffer, &at, gtk_text_buffer_get_insert (buffer)); } else { at = *iter; } /* Move the iter to the beginning of the line, where the bookmarks are */ gtk_text_iter_set_line_offset (&at, 0); /* Try to find the next bookmark */ if (!func (GTK_SOURCE_BUFFER (buffer), &at, BOOKMARK_CATEGORY)) { GSList *marks; /* cycle through */ cycle_func (buffer, &at); gtk_text_iter_set_line_offset (&at, 0); marks = gtk_source_buffer_get_source_marks_at_iter (GTK_SOURCE_BUFFER (buffer), &at, BOOKMARK_CATEGORY); if (!marks && !func (GTK_SOURCE_BUFFER (buffer), &at, BOOKMARK_CATEGORY)) { return; } g_slist_free (marks); } end = at; if (!gtk_text_iter_forward_visible_line (&end)) { gtk_text_buffer_get_end_iter (buffer, &end); } else { gtk_text_iter_backward_char (&end); } gtk_text_buffer_select_range (buffer, &at, &end); gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (view), &at, 0.3, FALSE, 0, 0); }