Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GtkSourceView/GtkSourceBuffer-如何用红色标记一行并显示图标_C_Gtk3_Gtksourceview - Fatal编程技术网

GtkSourceView/GtkSourceBuffer-如何用红色标记一行并显示图标

GtkSourceView/GtkSourceBuffer-如何用红色标记一行并显示图标,c,gtk3,gtksourceview,C,Gtk3,Gtksourceview,我想用红色标记GtkSourceView中的一些文本,并显示一个图标。以下是我目前的尝试,但似乎毫无作用: void plainTextEditor_textView_addLineMarker(int lineNumber, linemarker* marker, context_base* context) { GtkWidget* plainTextEditor_textView = get_plainTextEditor_textView_from_notebook(contex

我想用红色标记GtkSourceView中的一些文本,并显示一个图标。以下是我目前的尝试,但似乎毫无作用:

void plainTextEditor_textView_addLineMarker(int lineNumber, linemarker* marker, context_base* context)
{
    GtkWidget* plainTextEditor_textView = get_plainTextEditor_textView_from_notebook(context->notebook);
    GtkTextIter iter;
    GtkTextBuffer * buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(plainTextEditor_textView) );
    gtk_text_buffer_get_iter_at_line( buffer, &iter, lineNumber );
    printf("extendedEditor_linebox_markError %i\n", lineNumber);
    gtk_source_buffer_create_source_mark( GTK_SOURCE_BUFFER(buffer), marker->message, "dialog-error", &iter );
}
printf打印正确的行号

如果我调用该方法两次,gtk将打印一些gtk临界值:“Mark myMark已存在于缓冲区中”

但是,gtksourceview上没有任何可见的更改


也许我应该使用
gtk\u source\u mark\u属性
来更改特定类别的属性?但是怎么做呢?我找不到任何关于如何使用它的好信息。

好的,我自己弄明白了。这里是一个将背景标记为红色并显示一个小错误对话框项的版本。如果鼠标悬停在项目上,将显示错误消息

//data which is needed in different methods
typedef struct
{
    GtkSourceMarkAttributes* plainTextEditor_lineMarkers_warningAttributes;
    GtkSourceMarkAttributes* plainTextEditor_lineMarkers_errorAttributes;
    ...
} context_base;

// things to do only once
int main(int argc, char *argv[])
{
    ...
    GtkWidget * plainTextEditor_textView = gtk_source_view_new();
    gtk_source_view_set_highlight_current_line (GTK_SOURCE_VIEW(plainTextEditor_textView),TRUE);
    gtk_source_view_set_show_line_numbers (GTK_SOURCE_VIEW(plainTextEditor_textView),TRUE);
    gtk_source_view_set_show_line_marks (GTK_SOURCE_VIEW(plainTextEditor_textView), TRUE);

    context->plainTextEditor_lineMarkers_errorAttributes = gtk_source_mark_attributes_new();
    gtk_source_mark_attributes_set_background(context->plainTextEditor_lineMarkers_errorAttributes, &error_color);
    gtk_source_mark_attributes_set_icon_name(context->plainTextEditor_lineMarkers_errorAttributes,"dialog-error");
    gtk_source_view_set_mark_attributes( GTK_SOURCE_VIEW(plainTextEditor_textView), sourceMarkCategory_error, context->plainTextEditor_lineMarkers_errorAttributes, 10);
    ...
}

// callback to display message when hovering on the linemarker
gchar* on_lineMarkerTooltip_displayed(GtkSourceMarkAttributes *attributes, GtkSourceMark *mark, linemarker* marker)
{
    if( marker->message == NULL)
        return NULL;
    return strdup(marker->message);
}

// method to create new linemark
void plainTextEditor_textView_addLineMarker(int lineNumber, linemarker* marker, context_base* context)
{
    if( context->plainTextEditor_lineMarkers[lineNumber-1]->message != NULL ) // there is a message on this line
    {
        if( strcmp(context->plainTextEditor_lineMarkers[lineNumber-1]->message, marker->message ) == 0 ) // its the same message, nothing to do
        {
            return;
        }
    }
    GtkWidget* plainTextEditor_textView = get_plainTextEditor_textView_from_notebook(context->notebook);
    GtkTextIter iter;
    GtkTextBuffer * buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(plainTextEditor_textView) );
    gtk_text_buffer_get_iter_at_line( buffer, &iter, lineNumber );

    context->plainTextEditor_lineMarkers[lineNumber-1]->message = strdup(marker->message);

    char sourceMarkName[sourceMarkNameMaxDigits];
    snprintf(sourceMarkName, sourceMarkNameMaxDigits, "%i", lineNumber);
    gtk_source_view_set_mark_attributes (GTK_SOURCE_VIEW(plainTextEditor_textView),sourceMarkCategory_error,context->plainTextEditor_lineMarkers_errorAttributes,10);
    gtk_source_buffer_create_source_mark( GTK_SOURCE_BUFFER(buffer), sourceMarkName, sourceMarkCategory_error, &iter );
    g_signal_connect(G_OBJECT(context->plainTextEditor_lineMarkers_errorAttributes), "query-tooltip-text", G_CALLBACK(on_lineMarkerTooltip_displayed), context->plainTextEditor_lineMarkers[lineNumber-1]);
}