gboolean gedit_document_goto_line_offset (GeditDocument *doc, gint line, gint line_offset) { gboolean ret; GtkTextIter iter; g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), FALSE); g_return_val_if_fail (line >= -1, FALSE); g_return_val_if_fail (line_offset >= -1, FALSE); ret = gedit_document_goto_line (doc, line); if (ret) { guint offset_count; gtk_text_buffer_get_iter_at_line (GTK_TEXT_BUFFER (doc), &iter, line); offset_count = gtk_text_iter_get_chars_in_line (&iter); if (line_offset > offset_count) { ret = FALSE; } else { gtk_text_iter_set_line_offset (&iter, line_offset); gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER (doc), &iter); } } return ret; }
static void search_init (GtkWidget *entry, GeditViewFrame *frame) { const gchar *entry_text; /* renew the flush timeout */ if (frame->priv->typeselect_flush_timeout != 0) { g_source_remove (frame->priv->typeselect_flush_timeout); frame->priv->typeselect_flush_timeout = g_timeout_add (GEDIT_VIEW_FRAME_SEARCH_DIALOG_TIMEOUT, (GSourceFunc)search_entry_flush_timeout, frame); } entry_text = gtk_entry_get_text (GTK_ENTRY (entry)); if (frame->priv->search_mode == SEARCH) { update_search (frame); run_search (frame, entry_text, FALSE, frame->priv->wrap_around, TRUE); } else { if (*entry_text != '\0') { gboolean moved, moved_offset; gint line; gint offset_line = 0; gint line_offset = 0; gchar **split_text = NULL; const gchar *text; GtkTextIter iter; GeditDocument *doc; doc = gedit_view_frame_get_document (frame); gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (doc), &iter, frame->priv->start_mark); split_text = g_strsplit (entry_text, ":", -1); if (g_strv_length (split_text) > 1) { text = split_text[0]; } else { text = entry_text; } if (*text == '-') { gint cur_line = gtk_text_iter_get_line (&iter); if (*(text + 1) != '\0') offset_line = MAX (atoi (text + 1), 0); line = MAX (cur_line - offset_line, 0); } else if (*entry_text == '+') { gint cur_line = gtk_text_iter_get_line (&iter); if (*(text + 1) != '\0') offset_line = MAX (atoi (text + 1), 0); line = cur_line + offset_line; } else { line = MAX (atoi (text) - 1, 0); } if (split_text[1] != NULL) { line_offset = atoi (split_text[1]); } g_strfreev (split_text); moved = gedit_document_goto_line (doc, line); moved_offset = gedit_document_goto_line_offset (doc, line, line_offset); gedit_view_scroll_to_cursor (GEDIT_VIEW (frame->priv->view)); if (!moved || !moved_offset) { set_entry_background (frame, frame->priv->search_entry, GEDIT_SEARCH_ENTRY_NOT_FOUND); } else { set_entry_background (frame, frame->priv->search_entry, GEDIT_SEARCH_ENTRY_NORMAL); } } } }