C Gtk+2 Glade3: как я могу установить SourceBuffer для GtkSourceView, который был загружен из поляны?

Я пытаюсь загрузить файл .c в виджет GtkSourceView.

Использование языка C с Gtk+ 2.22.1 и Glade 3.6.7 и GtkSourceView 2.10.1.

Я заметил, что в пользовательском интерфейсе Glade я могу настроить только SourceView для хранения TextBuffer; Я не нашел компонент SourceBuffer. Итак, я создал SourceView в Glade без буфера по умолчанию. Теперь я хочу установить SourceBuffer в качестве буфера моего компонента SourceView.

gtk_source_view_new_with_buffer() — это единственный способ присоединить SourceBuffer к SourceView. Проблема в том, что эта функция создает SourceView, а я хочу присоединить SourceBuffer к уже созданному SourceView, созданному с помощью Glade. Как я могу это сделать?

Я не вставлял код, потому что его нечего показать. Я только что создал файл Glade с некоторым компонентом пользовательского интерфейса и компонентом SourceView-2 с идентификатором gtk_sourceview.

В файле C я получаю компонент SourceView с помощью

GtkSourceView *sourceview = GTK_WIDGET (gtk_builder_get_object (builder, "gtk_sourceview"));

Чего не хватает, так это того, как создать SourceBuffer и прикрепить его к компоненту SourceView.

Спасибо!

Обновление: я пытался использовать:

GtkSourceBuffer *sourcebuffer = GTK_SOURCE_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(sourceview)));

Но я получил следующую ошибку утверждения:

(tour_de_gtk:13884): Gtk-CRITICAL **: IA__gtk_text_view_get_buffer: assertion `GTK_IS_TEXT_VIEW (text_view)' failed

Что я могу сделать, чтобы решить эту проблему?

Спасибо!


person ufk    schedule 27.02.2011    source источник
comment
вы получаете какие-либо предупреждения о компиляции, с моей точки зрения, вы должны получить хотя бы одно о несовместимом указателе при декальринге и настройке исходного буфера   -  person drahnr    schedule 02.03.2011


Ответы (1)


GtkSourceView уже имеет буфер. Получите его так же, как обычный текстовый буфер:

GtkSourceBuffer *buffer = GTK_SOURCE_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(source_view)));

Это связано с тем, что GtkSourceView является подклассом GtkTextView, поэтому функции текстового представления работают и с ним.

ИЗМЕНИТЬ:

Вот программа и файл Glade, который работает.

Программа:

#include <gtk/gtk.h>
#include <gtksourceview/gtksourceview.h>
#include <gtksourceview/gtksourcebuffer.h>
#include <gtksourceview/gtksourcelanguagemanager.h>

int
main(int argc, char **argv)
{
    gtk_init(&argc, &argv);

    GtkBuilder *builder = gtk_builder_new();
    if(gtk_builder_add_from_file(builder, "sourceview.ui", NULL) == 0)
        g_error("In real code, you would handle an error here");
    gtk_builder_connect_signals(builder, NULL);

    GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
    GtkSourceView *sourceview = GTK_SOURCE_VIEW(gtk_builder_get_object(builder, "gtk_sourceview"));

    /* Get the buffer */
    GtkSourceBuffer *sourcebuffer = GTK_SOURCE_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(sourceview)));

    /* Do stuff to the buffer, to prove we've really got the GtkSourceBuffer */
    gtk_text_buffer_set_text(GTK_TEXT_BUFFER(sourcebuffer),
        "def hello():\n\tprint 'This should be highlighted as Python'\n", -1);
    GtkSourceLanguageManager *manager = gtk_source_language_manager_get_default();
    GtkSourceLanguage *python = gtk_source_language_manager_get_language(manager, "python");
    gtk_source_buffer_set_language(sourcebuffer, python);

    /* Okay, that should prove it, now run the program */
    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}

Файл поляны:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtksourceview 3.0 -->
  <requires lib="gtk+" version="2.20"/>
  <!-- interface-naming-policy project-wide -->
  <object class="GtkSourceBuffer" id="gtksourcebuffer">
    <property name="max_undo_levels">0</property>
  </object>
  <object class="GtkWindow" id="window">
    <property name="default_width">300</property>
    <property name="default_height">300</property>
    <signal name="destroy" handler="gtk_main_quit" swapped="no"/>
    <child>
      <object class="GtkScrolledWindow" id="scrolledwindow">
        <property name="visible">True</property>
        <property name="can_focus">True</property>
        <property name="hscrollbar_policy">automatic</property>
        <property name="vscrollbar_policy">automatic</property>
        <child>
          <object class="GtkSourceView" id="gtk_sourceview">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="left_margin">2</property>
            <property name="right_margin">2</property>
            <property name="buffer">gtksourcebuffer</property>
            <property name="tab_width">4</property>
            <property name="auto_indent">True</property>
            <property name="indent_on_tab">False</property>
          </object>
        </child>
      </object>
    </child>
  </object>
</interface>
person ptomato    schedule 27.02.2011
comment
Я понимаю; это ошибка. В GtkBuilder GtkSourceView создается с буфером GtkTextBuffer, в отличие от того, что произошло бы, если бы вы создали виджет вручную. Я написал программу, которая работает; вам нужно создать GtkSourceBuffer в Glade и добавить его в виджет исходного кода. Смотрите мою правку. - person ptomato; 03.03.2011