#include <gtk/gtk.h> typedef struct _App { GtkWidget *text_view; GtkWidget *search_entry; } App; void find (GtkTextView *text_view, const gchar *text, GtkTextIter *iter) { GtkTextIter mstart, mend; gboolean found; GtkTextBuffer *buffer; GtkTextMark *last_pos; buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)); found = gtk_text_iter_forward_search (iter, text, 0, &mstart, &mend, NULL); if (found) { gtk_text_buffer_select_range (buffer, &mstart, &mend); last_pos = gtk_text_buffer_create_mark (buffer, "last_pos", &mend, FALSE); gtk_text_view_scroll_mark_onscreen (text_view, last_pos); } } void win_destroy (void) { gtk_main_quit(); } void next_button_clicked (GtkWidget *next_button, App *app) { const gchar *text; GtkTextBuffer *buffer; GtkTextMark *last_pos; GtkTextIter iter; text = gtk_entry_get_text (GTK_ENTRY (app->search_entry)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (app->text_view)); last_pos = gtk_text_buffer_get_mark (buffer, "last_pos"); if (last_pos == NULL) return; gtk_text_buffer_get_iter_at_mark (buffer, &iter, last_pos); find (GTK_TEXT_VIEW (app->text_view), text, &iter); } void search_button_clicked (GtkWidget *search_button, App *app) { const gchar *text; GtkTextBuffer *buffer; GtkTextIter iter; text = gtk_entry_get_text (GTK_ENTRY (app->search_entry)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (app->text_view)); gtk_text_buffer_get_start_iter (buffer, &iter); find (GTK_TEXT_VIEW (app->text_view), text, &iter); } int main (int argc, char *argv[]) { GtkWidget *win; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *search_button; GtkWidget *next_button; GtkWidget *swindow; PangoFontDescription *font_desc; GdkColor color; App app; gtk_init (&argc, &argv); win = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (win), "destroy", win_destroy, NULL); vbox = gtk_vbox_new (FALSE, 2); gtk_container_add (GTK_CONTAINER (win), vbox); hbox = gtk_hbox_new (FALSE, 2); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); app.search_entry = gtk_entry_new (); gtk_box_pack_start (GTK_BOX (hbox), app.search_entry, TRUE, TRUE, 0); search_button = gtk_button_new_with_label ("Search"); gtk_box_pack_start (GTK_BOX (hbox), search_button, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (search_button), "clicked", G_CALLBACK (search_button_clicked), &app); next_button = gtk_button_new_with_label ("Next"); gtk_box_pack_start (GTK_BOX (hbox), next_button, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (next_button), "clicked", G_CALLBACK (next_button_clicked), &app); swindow = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start (GTK_BOX (vbox), swindow, TRUE, TRUE, 0); app.text_view = gtk_text_view_new (); // Définit font pour le widget font_desc = pango_font_description_from_string ("Mono 8"); gtk_widget_modify_font (app.text_view, font_desc); pango_font_description_free (font_desc); // Marge gauche gtk_text_view_set_left_margin (GTK_TEXT_VIEW (app.text_view), 30); // Couleur du fond gdk_color_parse ("#C99FEB", &color); gtk_widget_modify_base (app.text_view, GTK_STATE_NORMAL, &color); // couleur du texte gdk_color_parse ("#FFBF00", &color); gtk_widget_modify_text (app.text_view, GTK_STATE_NORMAL, &color); gtk_container_add (GTK_CONTAINER (swindow), app.text_view); gtk_widget_show_all (win); gtk_main(); return 0; }