在gtksourceview中插入注释/撤消失败

在gtksourceview中插入注释/撤消失败,gtk,gtksourceview,Gtk,Gtksourceview,我刚刚偶然发现我的插入注释和撤消功能有一个微妙的问题。复制步骤: 开放式编辑器 在sourcebuffer中的某处插入注释 按ctrl+z键可撤消 插入另一条注释,注释插入正常,但标准输出中显示以下错误: GtkSourceView临界**:已修改\u已更改\u处理程序:断言'action!=“NULL”失败 插入另一条注释,这同样有效 按ctrl+z尝试撤消,撤消不起作用,标准输出中将显示以下错误: GtkSourceView CRITICAL**:gtk_source_undo_manage

我刚刚偶然发现我的插入注释和撤消功能有一个微妙的问题。复制步骤:

  • 开放式编辑器
  • 在sourcebuffer中的某处插入注释
  • 按ctrl+z键可撤消
  • 插入另一条注释,注释插入正常,但标准输出中显示以下错误:

    GtkSourceView临界**:已修改\u已更改\u处理程序:断言'action!=“NULL”失败

  • 插入另一条注释,这同样有效

  • 按ctrl+z尝试撤消,撤消不起作用,标准输出中将显示以下错误:

    GtkSourceView CRITICAL**:gtk_source_undo_manager_undo_impl:assertion`undo_action!=“NULL”失败

  • 从现在开始,撤消不起作用

    这是我的插入注释()

    以及我的撤消按键定义:

        case GDK_KEY_z:
            if (event -> state & GDK_CONTROL_MASK)
            {
    
                GtkSourceBuffer *sbuffer;
    
                sbuffer = GTK_SOURCE_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(txtinput[current_tab])));
    
                if (gtk_source_buffer_can_undo(sbuffer))
                {
                    gtk_source_buffer_undo(sbuffer);
                }
    
                return TRUE;
            }
    
            break;
    
    我看到另一个人也有同样的问题,但没有提出解决办法。还有其他人有这个问题吗

    作为故障排除步骤,我尝试对“修改的更改”信号连接进行注释,但问题仍然存在


    你知道我可能做错了什么吗?谢谢。

    您是否尝试过在缓冲区修改周围放置“开始用户”操作、“结束用户”操作(gtkTextBuffer方法)?@ergosys,我有点怀疑,但我尝试了一下,您知道问题消失了。再次感谢。事实上我很惊讶,我不知道是否真的需要。我认为视图对象必须在细粒度用户修改方面做同样的事情,但您必须检查源代码才能确定。希望在任何情况下都能更好地记录这些内容。所提出的解决方案似乎适用于在GTK预期方法之外修改缓冲区的许多(所有?)情况。它也为我解决了类似的问题。这应该作为答案发布。当使用非常规修改时,GTK的堆栈视图似乎与实际的撤销堆栈不同步。
        case GDK_KEY_z:
            if (event -> state & GDK_CONTROL_MASK)
            {
    
                GtkSourceBuffer *sbuffer;
    
                sbuffer = GTK_SOURCE_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(txtinput[current_tab])));
    
                if (gtk_source_buffer_can_undo(sbuffer))
                {
                    gtk_source_buffer_undo(sbuffer);
                }
    
                return TRUE;
            }
    
            break;