c - gtk_source_undo_manager_begin_not_undoable_action/gtk_source_undo_manager_end_not_undoable_action 不工作

标签 c gtk gtksourceview

我正在尝试使用 gtk+-2.0 和 gtksourceview-2.0 在 C 中编写我自己的文本编辑器。当我遇到困难时,我一直在使用 gedit 源代码,但他们显然不使用此功能,而且我无法在网上找到它的使用示例。当我打开一个文本文件并将其内容放入文本缓冲区时,这被注册为一个可撤销的操作。我希望这个过程不可撤销,所以我放置了:

gtk_source_undo_manager_begin_not_undoable_action(um);

在我的 open_activated 函数(下面提供)的开头,以及:

gtk_source_undo_manager_end_not_undoable_action(um);

在同一函数的末尾。根据 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("%s\n",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 接口(interface)来为 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() 即可。

关于c - gtk_source_undo_manager_begin_not_undoable_action/gtk_source_undo_manager_end_not_undoable_action 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10438214/

相关文章:

c++ - Python:更改变量的数据类型

c++ - 将 GtkTreeView 中的 Cell 设置为以编程方式编辑模式

c - pthread_cond_timedwait() 如何工作?

c - setpgid 使交互式程序(vim,emacs ... ncurses?)无限循环

c - setjmp/longjmp 和局部变量

c - 我需要一些帮助来获取 gtk 编程的标准。对此我能做什么呢?

c++ - GTK3 OpenGL 视频渲染大部分为绿色 (YUV420P)

c - 如何(以编程方式)滚动到 gtktextview/gtksourceview 中的特定行

c++ - gtksourceview 在代码块中编译

c - 如何从 gtktextview/gtksourceview 解析 C 中的文本