如何检测何时在GtkTextBuffer中替换文本而不是删除后插入?

时间:2016-11-23 15:04:59

标签: c gtk3

我在Objective-C中为macOS / iOS工作了很多文本系统(例如NSTextView,NSTextStorage等)我正在尝试使用GTK3来查看我能在Linux上翻译我的项目的能力,等

我是使用GTK的新手,但经过几天的谷歌时间和实验,我有一个工作的文本编辑器原型,插入了我的自定义代码。

问题在于 - 我需要能够检测用户何时突出显示文本部分,然后将其替换为其他文本(例如击键)。这与突出显示文本部分,点击删除键,然后键入新文本不同。一个特定的用法示例是突出显示一个单词,然后键入双引号字符以便将单词用引号括起来(例如foo变为"foo")。

在Cocoa中,人们会收到replaceCharactersInRange:,表示最初选择的范围,以及要替换它的新字符串。然后,我可以根据收到的信息检测用户的假定意图。

在GTK中,似乎我们收到一个delete-range信号,然后是一个单独的insert-text信号。由于这种分离,“插入”部分中的代码无法知道用户是否打算替换文本,而不是插入新文本。

我使用以下方法接收上述信号:

g_signal_connect(buffer, "insert-text", G_CALLBACK(insert_text_cb), NULL);
g_signal_connect(buffer, "delete-range", G_CALLBACK(delete_range_cb), NULL);

我是否还有其他事情可以判断是否存在删除,后跟插入是同一用户操作的一部分?

感谢您提供的任何指示!

2 个答案:

答案 0 :(得分:1)

我建议不要尝试关联删除和插入事件,而是建议为所需操作创建GAction(例如,在所选文本周围切换引号)并将其快捷键设置为使用gtk_application_set_accels_for_action()

有关详细信息,请查看此HowDoI Wiki页面。

答案 1 :(得分:1)

上个月没有答案,所以我一直在集思广益,四处寻找。我终于想出了这个,但是并不像我希望的那样优雅。

  1. 像以前一样处理delete-range信号,但要跟踪删除的文字以供日后使用(例如在char * deletedText中)。

  2. 像以前一样处理insert-text信号,但如果我们在deletedText中有一个字符串,则更改行为以执行替换而不是插入。在我的情况下,这实际上意味着重新插入已删除的文本,然后执行替换。

  3. end-user-action信号添加回调,表示与特定操作关联的所有删除/插入都已完成。在此回调中,从上方免费deletedText并设置为NULL(表示已处理完所有内容)。

  4. 再次 - 这是有效的,但感觉有点不雅。根据删除/插入例程的复杂程度,可能会略微降低性能,因为必须重复某些步骤。更好的解决方案是在delete-range回调期间检测到有待处理的insert-text回调并立即处理这两个步骤。到目前为止,我还没能做到这一点。