gboolean undo_redo_real(GtkTextBuffer *buffer) { GtkTextIter start_iter, end_iter; UndoInfo *ri; if (g_list_length(redo_list)) { // undo_block_signal(buffer); ri = g_list_last(redo_list)->data; gtk_text_buffer_get_iter_at_offset(buffer, &start_iter, ri->start); switch (ri->command) { case INS: gtk_text_buffer_insert(buffer, &start_iter, ri->str, -1); break; default: gtk_text_buffer_get_iter_at_offset(buffer, &end_iter, ri->end); gtk_text_buffer_delete(buffer, &start_iter, &end_iter); } undo_list = g_list_append(undo_list, ri); redo_list = g_list_delete_link(redo_list, g_list_last(redo_list)); DV(g_print("cb_edit_redo: undo left = %d, redo left = %d\n", g_list_length(undo_list), g_list_length(redo_list))); // undo_unblock_signal(buffer); if (ri->seq) { undo_set_sequency(TRUE); return TRUE; } if (!g_list_length(redo_list)) gtk_widget_set_sensitive(redo_w, FALSE); gtk_widget_set_sensitive(undo_w, TRUE); gtk_text_buffer_place_cursor(buffer, &start_iter); scroll_to_cursor(buffer, 0.05); } undo_check_modified_step(buffer); return FALSE; }
void run_dialog_jump_to(GtkWidget *textview) { GtkWidget *dialog; GtkWidget *button; GtkWidget *table; GtkWidget *label; GtkWidget *spinner; GtkAdjustment *spinner_adj; GtkTextIter iter; gint num, max_num; GtkTextBuffer *textbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); gtk_text_buffer_get_iter_at_mark(textbuffer, &iter, gtk_text_buffer_get_insert(textbuffer)); num = gtk_text_iter_get_line(&iter) + 1; gtk_text_buffer_get_end_iter(textbuffer, &iter); max_num = gtk_text_iter_get_line(&iter) + 1; dialog = gtk_dialog_new_with_buttons(_("Jump To"), GTK_WINDOW(gtk_widget_get_toplevel(textview)), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE); button = create_button_with_stock_image(_("_Jump"), GTK_STOCK_JUMP_TO); GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button, GTK_RESPONSE_OK); table = gtk_table_new(1, 2, FALSE); gtk_table_set_col_spacings(GTK_TABLE(table), 8); gtk_container_set_border_width (GTK_CONTAINER(table), 8); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table, FALSE, FALSE, 0); label = gtk_label_new_with_mnemonic(_("_Line number:")); spinner_adj = (GtkAdjustment *) gtk_adjustment_new(num, 1, max_num, 1, 1, 0); spinner = gtk_spin_button_new(spinner_adj, 1, 0); gtk_entry_set_width_chars(GTK_ENTRY(spinner), 8); gtk_label_set_mnemonic_widget(GTK_LABEL(label), spinner); gtk_entry_set_activates_default(GTK_ENTRY(spinner), TRUE); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); gtk_table_attach_defaults(GTK_TABLE(table), spinner, 1, 2, 0, 1); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); gtk_widget_show_all(dialog); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { gtk_text_buffer_get_iter_at_line(textbuffer, &iter, gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spinner)) - 1); gtk_text_buffer_place_cursor(textbuffer, &iter); // gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(textview), &iter, 0.1, FALSE, 0.5, 0.5); scroll_to_cursor(textbuffer, 0.25); } gtk_widget_destroy (dialog); }
gboolean undo_undo_real(GtkTextBuffer *buffer) { GtkTextIter start_iter, end_iter; UndoInfo *ui; undo_flush_temporal_buffer(buffer); if (g_list_length(undo_list)) { // undo_block_signal(buffer); ui = g_list_last(undo_list)->data; gtk_text_buffer_get_iter_at_offset(buffer, &start_iter, ui->start); switch (ui->command) { case INS: gtk_text_buffer_get_iter_at_offset(buffer, &end_iter, ui->end); gtk_text_buffer_delete(buffer, &start_iter, &end_iter); break; default: gtk_text_buffer_insert(buffer, &start_iter, ui->str, -1); } redo_list = g_list_append(redo_list, ui); undo_list = g_list_delete_link(undo_list, g_list_last(undo_list)); DV(g_print("cb_edit_undo: undo left = %d, redo left = %d\n", g_list_length(undo_list), g_list_length(redo_list))); // undo_unblock_signal(buffer); if (g_list_length(undo_list)) { if (((UndoInfo *)g_list_last(undo_list)->data)->seq) return TRUE; } else gtk_widget_set_sensitive(undo_w, FALSE); gtk_widget_set_sensitive(redo_w, TRUE); if (ui->command == DEL) gtk_text_buffer_get_iter_at_offset(buffer, &start_iter, ui->start); gtk_text_buffer_place_cursor(buffer, &start_iter); scroll_to_cursor(buffer, 0.05); } undo_check_modified_step(buffer); return FALSE; }
gint main(gint argc, gchar **argv) { Conf *conf; GtkItemFactory *ifactory; gchar *stdin_data = NULL; bindtextdomain(PACKAGE, LOCALEDIR); //bindtextdomain ?? bind_textdomain_codeset(PACKAGE, "UTF-8"); // ?? textdomain(PACKAGE); // ?? pub = g_malloc(sizeof(PublicData)); pub->fi = g_malloc(sizeof(FileInfo)); pub->fi->filename = NULL; pub->fi->charset = NULL; pub->fi->charset_flag = FALSE; pub->fi->lineend = LF; parse_args(argc, argv, pub->fi); gtk_init(&argc, &argv); //call before using any gtk fuction g_set_application_name(PACKAGE_NAME); g_print("%s\n", PACKAGE_NAME); #if !GTK_CHECK_VERSION(2, 6, 0) add_about_stock(); #endif pub->mw = create_main_window(); //Find create_main_window conf = g_malloc(sizeof(Conf)); //sends default vlues to load and overwrites in the function conf->width = 600; conf->height = 400; conf->fontname = g_strdup("Monospace 12"); conf->wordwrap = FALSE; conf->linenumbers = FALSE; conf->autoindent = FALSE; load_config_file(conf); //gtk options for GUI gtk_window_set_default_size( GTK_WINDOW(pub->mw->window), conf->width, conf->height); set_text_font_by_name(pub->mw->view, conf->fontname); ifactory = gtk_item_factory_from_widget(pub->mw->menubar); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM( gtk_item_factory_get_widget(ifactory, "/Options/Word Wrap")), conf->wordwrap); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM( gtk_item_factory_get_widget(ifactory, "/Options/Line Numbers")), conf->linenumbers); indent_refresh_tab_width(pub->mw->view); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM( gtk_item_factory_get_widget(ifactory, "/Options/Auto Indent")), conf->autoindent); gtk_widget_show_all(pub->mw->window); g_free(conf->fontname); g_free(conf); #ifdef ENABLE_EMACS check_emacs_key_theme(GTK_WINDOW(pub->mw->window), ifactory); #endif hlight_init(pub->mw->buffer); undo_init(pub->mw->view, gtk_item_factory_get_widget(ifactory, "/Edit/Undo"), gtk_item_factory_get_widget(ifactory, "/Edit/Redo")); // hlight_init(pub->mw->buffer); dnd_init(pub->mw->view); if (pub->fi->filename) file_open_real(pub->mw->view, pub->fi); #ifdef G_OS_UNIX else stdin_data = gedit_utils_get_stdin(); #endif if (stdin_data) { gchar *str; GtkTextIter iter; str = g_convert(stdin_data, -1, "UTF-8", get_default_charset(), NULL, NULL, NULL); g_free(stdin_data); // gtk_text_buffer_set_text(buffer, "", 0); gtk_text_buffer_get_start_iter(pub->mw->buffer, &iter); gtk_text_buffer_insert(pub->mw->buffer, &iter, str, strlen(str)); gtk_text_buffer_get_start_iter(pub->mw->buffer, &iter); gtk_text_buffer_place_cursor(pub->mw->buffer, &iter); gtk_text_buffer_set_modified(pub->mw->buffer, FALSE); gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(pub->mw->view), &iter, 0, FALSE, 0, 0); g_free(str); } if (jump_linenum) { GtkTextIter iter; gtk_text_buffer_get_iter_at_line(pub->mw->buffer, &iter, jump_linenum - 1); gtk_text_buffer_place_cursor(pub->mw->buffer, &iter); // gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(textview), &iter, 0.1, FALSE, 0.5, 0.5); scroll_to_cursor(pub->mw->buffer, 0.25); } set_main_window_title(); // hlight_apply_all(pub->mw->buffer); gtk_main(); return 0; }
gboolean document_search_real(GtkWidget *textview, gint direction) { GtkTextIter iter, match_start, match_end; gboolean res; GtkSourceSearchFlags search_flags = GTK_SOURCE_SEARCH_VISIBLE_ONLY | GTK_SOURCE_SEARCH_TEXT_ONLY; GtkTextBuffer *textbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); if (!string_find) return FALSE; if (!match_case) search_flags = search_flags | GTK_SOURCE_SEARCH_CASE_INSENSITIVE; // if (direction == 0 || !hlight_check_searched()) if (direction == 0 || (direction != 2 && !hlight_check_searched())) hlight_searched_strings(GTK_TEXT_VIEW(textview)->buffer, string_find); gtk_text_mark_set_visible( gtk_text_buffer_get_selection_bound( GTK_TEXT_VIEW(textview)->buffer), FALSE); gtk_text_buffer_get_iter_at_mark(textbuffer, &iter, gtk_text_buffer_get_insert(textbuffer)); if (direction < 0) { res = gtk_source_iter_backward_search( &iter, string_find, search_flags, &match_start, &match_end, NULL); if (gtk_text_iter_equal(&iter, &match_end)) { res = gtk_source_iter_backward_search( &match_start, string_find, search_flags, &match_start, &match_end, NULL); } } else { res = gtk_source_iter_forward_search( &iter, string_find, search_flags, &match_start, &match_end, NULL); } /* TODO: both gtk_(text/source)_iter_backward_search works not fine for multi-byte */ /* wrap */ /* TODO: define limit NULL -> proper value */ if (!res) { if (direction < 0) { gtk_text_buffer_get_end_iter(textbuffer, &iter); res = gtk_source_iter_backward_search( &iter, string_find, search_flags, &match_start, &match_end, NULL); } else { gtk_text_buffer_get_start_iter(textbuffer, &iter); res = gtk_source_iter_forward_search( &iter, string_find, search_flags, &match_start, &match_end, NULL); } } if (res) { gtk_text_buffer_place_cursor(textbuffer, &match_start); gtk_text_buffer_move_mark_by_name(textbuffer, "insert", &match_end); // gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(textview), &match_start, 0.1, FALSE, 0.5, 0.5); scroll_to_cursor(textbuffer, 0.05); } else if (direction == 0) run_dialog_message(gtk_widget_get_toplevel(textview), GTK_MESSAGE_WARNING, _("Search string not found")); return res; }
gint main(gint argc, gchar **argv) { Conf *conf; gchar *stdin_data = NULL; bindtextdomain(PACKAGE, LOCALEDIR); bind_textdomain_codeset(PACKAGE, "UTF-8"); textdomain(PACKAGE); pub = g_malloc(sizeof(PublicData)); pub->fi = g_malloc(sizeof(FileInfo)); pub->fi->filename = NULL; pub->fi->charset = NULL; pub->fi->charset_flag = FALSE; pub->fi->lineend = LF; parse_args(argc, argv, pub->fi); #if !ENABLE_XINPUT2 gdk_disable_multidevice(); #endif gtk_init(&argc, &argv); g_set_application_name(PACKAGE_NAME); selection_primary = gtk_clipboard_get(GDK_SELECTION_PRIMARY); pub->mw = create_main_window(); conf = g_malloc(sizeof(Conf)); conf->width = 600; conf->height = 400; conf->fontname = g_strdup("Monospace 12"); conf->wordwrap = FALSE; conf->linenumbers = FALSE; conf->autoindent = FALSE; load_config_file(conf); gtk_window_set_default_size( GTK_WINDOW(pub->mw->window), conf->width, conf->height); set_text_font_by_name(pub->mw->view, conf->fontname); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM( gtk_item_factory_get_widget(pub->mw->menubar, "/M/Options/WordWrap")), conf->wordwrap); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM( gtk_item_factory_get_widget(pub->mw->menubar, "/M/Options/LineNumbers")), conf->linenumbers); indent_refresh_tab_width(pub->mw->view); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM( gtk_item_factory_get_widget(pub->mw->menubar, "/M/Options/AutoIndent")), conf->autoindent); gtk_widget_show_all(pub->mw->window); g_free(conf->fontname); g_free(conf); #if ENABLE_EMACS check_emacs_key_theme(GTK_WINDOW(pub->mw->window), pub->mw->menubar); #endif hlight_init(pub->mw->buffer); undo_init(pub->mw->view, gtk_item_factory_get_widget(pub->mw->menubar, "/M/Edit/Undo"), gtk_item_factory_get_widget(pub->mw->menubar, "/M/Edit/Redo")); // hlight_init(pub->mw->buffer); dnd_init(pub->mw->view); if (pub->fi->filename) file_open_real(pub->mw->view, pub->fi); #ifdef G_OS_UNIX else stdin_data = gedit_utils_get_stdin(); #endif if (stdin_data) { gchar *str; GtkTextIter iter; str = g_convert(stdin_data, -1, "UTF-8", get_default_charset(), NULL, NULL, NULL); g_free(stdin_data); // gtk_text_buffer_set_text(buffer, "", 0); gtk_text_buffer_get_start_iter(pub->mw->buffer, &iter); gtk_text_buffer_insert(pub->mw->buffer, &iter, str, strlen(str)); gtk_text_buffer_get_start_iter(pub->mw->buffer, &iter); gtk_text_buffer_place_cursor(pub->mw->buffer, &iter); gtk_text_buffer_set_modified(pub->mw->buffer, FALSE); gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(pub->mw->view), &iter, 0, FALSE, 0, 0); g_free(str); } if (jump_linenum) { GtkTextIter iter; gtk_text_buffer_get_iter_at_line(pub->mw->buffer, &iter, jump_linenum - 1); gtk_text_buffer_place_cursor(pub->mw->buffer, &iter); // gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(textview), &iter, 0.1, FALSE, 0.5, 0.5); scroll_to_cursor(pub->mw->buffer, 0.25); } set_main_window_title(); indent_refresh_tab_width(pub->mw->view); // hlight_apply_all(pub->mw->buffer); gtk_main(); return 0; }