我个人不能简单地同意创建自定义对象很容易的说法。这并不容易,对每个人都不是。
主要是因为这个问题被标记c
了,不了解面向对象编程的人可能不熟悉它的概念。
这是阅读和练习的问题。
因此,如果您不知道如何创建自己的小部件,请不要惊慌。
我能想到的最简单的解决方案,不涉及创建自己的渲染器,而是告诉渲染器如何查询渲染数据。
只需将GtkSourceGutterRenderer 上的查询数据信号连接到如下所示的信号处理程序:
G_MODULE_EXPORT void gutter_renderer_query_data (GtkSourceGutterRenderer *renderer, GtkTextIter *start, GtkTextIter *end, GtkSourceGutterRendererState state)
{
GtkSourceView* view = NULL;
GtkSourceBuffer* buffer = NULL;
GSList* marks = NULL;
GdkPixbuf* pixbuf = NULL;
view = GTK_SOURCE_VIEW(gtk_source_gutter_renderer_get_view(renderer));
buffer = GTK_SOURCE_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)));
marks = gtk_source_buffer_get_source_marks_at_iter(buffer, start, NULL);
if(marks != NULL)
{
char *category = gtk_source_mark_get_category(marks->data);
if(!g_strcmp0(category, "CERTAIN_CATEGORY")) /* See note 1) */
pixbuf = gtk_image_get_pixbuf(gtk_image_new_from_file("icon_file_here")); /* See note 2) */
g_slist_free(marks);
}
g_object_set(G_OBJECT(renderer), "pixbuf", pixbuf, "yalign", 0.5, NULL);
}
备注:
GtkSourceMark 共享 GtkSourceGutterRenderer 接口,因此您可能希望通过指定应用于特定行的源标记的类别来过滤其他源标记。否则,您的自定义渲染器 pixbuf 也将被渲染到您的其他源标记。
您应该指定要在内部渲染的确切 pixbuf。这样做,您将不必调用gtk_source_gutter_renderer_pixbuf_set_pixbuf()
. 您让 API 进行资源处理。