2017-02-22 1 views
1

GtkSourceView의 일부 텍스트를 빨간색으로 표시하고 아이콘을 표시하고 싶습니다. 여기에 전혀 아무것도하지 않는 것 같습니다 :GtkSourceView/GtkSourceBuffer - 빨간색으로 선을 표시하고 아이콘을 표시하는 방법

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-critical : "myMark가 이미 버퍼에 있음"으로 표시합니다.

그러나 gtksourceview에는 전혀 눈에 띄는 변화가 없습니다.

아마도 특정 카테고리의 속성을 변경하려면 gtk_source_mark_attributes으로해야합니까? 그러나 어떻게? 나는 그것을 사용하는 방법에 대한 좋은 정보를 찾을 수 없습니다.

답변

1

좋아, 나 자신을 알아 냈어. 빨간색으로 표시하고 작은 오류 대화 상자 항목을 표시하는 버전입니다. 마우스를 항목 위로 가져 가면 오류 메시지가 표시됩니다.

//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]); 
} 
관련 문제