和 gtksourceview-2.0 用 C 编写自己的文本编辑器。 当我遇到困难时,我一直在使用 gedit 源代码,但他们显然不使用此功能,我在网上找不到使用它的示例。当我打开文本文件并将其内容放入文本缓冲区时,这被注册为可撤消的操作。 我希望这个过程不是不可撤销的,所以我放置了:
gtk_source_undo_manager_begin_not_undoable_action(嗯(;
在我的open_activated函数开始时(如下所述(,并且:
gtk_source_undo_manager_end_not_undoable_action(嗯(;
在同一函数的末尾。 根据 devHelp 中提供的帮助,它说这两行之间的所有内容都不应该是可撤消的,但它确实是可撤销的。 我错过了什么? 有没有更好的方法来实现相同的功能?
GtkSourceUndoManager *um; (defined globally)
void open_activated(GtkWidget *widget, GtkWindow *parent)
{
GtkSourceLanguage *lang;
GtkSourceLanguageManager *lm;
GtkWidget *dialog;
int pages = 0;
GtkWidget *tablabel;
gtk_source_undo_manager_begin_not_undoable_action(um);
/* create new tab */
tablabel = gtk_label_new("New File");
pages = gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook));
gtk_container_add(GTK_CONTAINER(scrollwin[pages]),txtinput[pages]);
gtk_widget_show_all (scrollwin[pages]);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),scrollwin[pages],tablabel);
//gtk_source_view_set_show_line_numbers (GTK_SOURCE_VIEW (txtinput[pages]), TRUE);
gtk_notebook_set_current_page (GTK_NOTEBOOK(notebook), pages);
//gtk_text_buffer_set_modified (gtk_text_view_get_buffer((GTK_TEXT_VIEW(txtinput[pages]))), TRUE);
dialog = gtk_file_chooser_dialog_new("Open File", parent, GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_OPEN,GTK_RESPONSE_ACCEPT,NULL);
GtkTextBuffer *buffer;
//buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txtinput[gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))]));
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txtinput[pages]));
if(gtk_dialog_run(GTK_DIALOG(dialog))== GTK_RESPONSE_ACCEPT)
{
char *path,*string;
const gchar *filename;
char temp[40];
gsize length = -1;
path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
paths[pages] = path;
filename = filenameFromPath(path);
//printf("%sn",out);
strcpy(temp,filename);
tablabel = gtk_label_new(temp);
g_file_get_contents(path,&string,&length,NULL);
gtk_text_buffer_set_text(buffer,string,-1);
/* syntax highlighting */
lm = gtk_source_language_manager_new();
lang = gtk_source_language_manager_guess_language (lm, path, NULL);
gtk_source_buffer_set_language (GTK_SOURCE_BUFFER(buffer), lang);
/* change tab label */
gtk_notebook_set_tab_label (GTK_NOTEBOOK(notebook), scrollwin[pages], tablabel);
/* set some sourceview options */
gtk_source_view_set_show_line_numbers (GTK_SOURCE_VIEW (txtinput[pages]), TRUE);
gtk_source_view_set_tab_width (GTK_SOURCE_VIEW (txtinput[pages]), 2);
/* Set the editor's font. */
PangoFontDescription *font_desc = pango_font_description_new();
pango_font_description_set_family (font_desc, "monospace");
gtk_widget_modify_font (txtinput[pages], font_desc);
g_free(path);
g_free(string);
}
gtk_widget_destroy(dialog);
gtk_text_buffer_set_modified (gtk_text_view_get_buffer((GTK_TEXT_VIEW(txtinput[pages]))), FALSE);
changeLabelColor("black");
gtk_source_undo_manager_end_not_undoable_action(um);
}
不幸的是,没有任何gtk_source_undo_manager_new((或gtk_source_undo_manager_get_default((像语言管理器那样。 GtkSourceUndoManager 的文档是:
描述
可以实现 GtkSourceUndoManager 接口,以便为 GtkSourceBuffer 提供自定义撤消管理。使用 gtk_source_buffer_set_undo_manager 为特定源缓冲区安装自定义撤消管理器。
当撤消堆栈的撤消状态或重做状态分别发生更改时,请使用 gtk_source_undo_manager_can_undo_changed 和gtk_source_undo_manager_can_redo_changed。
详
GtkSourceUndoManager
typedef struct _GtkSourceUndoManager GtkSourceUndoManager;
GtkSourceUndoManagerIface
typedef struct {
GTypeInterface parent;
/* Interface functions */
gboolean (*can_undo) (GtkSourceUndoManager *manager);
gboolean (*can_redo) (GtkSourceUndoManager *manager);
void (*undo) (GtkSourceUndoManager *manager);
void (*redo) (GtkSourceUndoManager *manager);
void (*begin_not_undoable_action) (GtkSourceUndoManager *manager);
void (*end_not_undoable_action) (GtkSourceUndoManager *manager);
/* Signals */
void (*can_undo_changed) (GtkSourceUndoManager *manager);
void (*can_redo_changed) (GtkSourceUndoManager *manager);
} GtkSourceUndoManagerIface;
如果您没有实现自定义撤消管理器,则只需改用gtk_source_buffer_begin_not_undoable_action()
即可。