Все,
У меня есть редактор, который хранит открытые файлы в древовидной / древовидной модели слева от главного окна и отображает буфер, связанный с выделенной записью древовидного представления в окне с фокусированным текстовым обзором (исходным видом)справа.
Каждый показанный GtkSourceView
содержится в структуре экземпляра редактора, которая также содержит указатель на GtkSourceCompletionWords
'provider' (prov_words
).Завершение слова прекрасно работает для первого буфера, показанного в окне, но когда я изменяю файлы и отображаю другой буфер в окне исходного кода, конкуренция слов не активна для этого буфера, даже если я отменить регистрацию первый буфер от prov_words
провайдера и регистра текущего буфера для провайдера слов, чтобы использовать в качестве его источника.
По сути, я создаю объект начального завершения как:
GtkSourceCompletion *completion;
GtkSourceCompletionWords *prov_words;
completion = gtk_source_view_get_completion (view);
prov_words = gtk_source_completion_words_new (NULL, NULL);
gtk_source_completion_words_register (prov_words,
gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)));
gtk_source_completion_add_provider (completion,
GTK_SOURCE_COMPLETION_PROVIDER (prov_words), NULL);
/* store a pointer to the completions words provider as part of
* the editor instance.
*/
einst->prov_words = prov_words;
При отображении нового буфера в текстовом представлении я использую сигнал древовидной структуры "changed"
, чтобы отобразить новый буфер, обновить заголовок окна и т. Д., А также отменить регистрацию текущего буфера в поставщике prov_words и затем зарегистрировать новый буферв качестве источника слова с:
GtkSourceCompletionWords *prov_words = einst->prov_words;
/* unregister current buffer from words completion provider */
gtk_source_completion_words_unregister (prov_words,
GTK_TEXT_BUFFER(oldbuf));
/* register new buffer with words completion provider */
gtk_source_completion_words_register (prov_words,
GTK_TEXT_BUFFER(newbuf));
Это приводит к тому, что в новом буфере вообще не функционирует завершение, но при переключении обратно на первый буфер завершение продолжает работать просто отлично.Так что, похоже, я концептуально упускаю часть головоломки о том, что требуется для переключения буферов, связанных с окном исходного кода (где объект завершения и поставщик остаются неизменными), и имею работу завершения с новым буфером в том же окне исходного кода.
Поскольку объект завершения является частью исходного представления, часть поставщика объекта завершения и слова, предложенные поставщиком, получены из буфера, например,
-- GtkSourceView
|
-- GtkSourceCompletion
| |
| -- GtkSourceCompletionWords
|
-- GtkSourceBuffer
, кажется, единственное требованиеотменить регистрацию слов в первом буфере у провайдера, а затем зарегистрировать слова в новом буфере у провайдера - но, похоже, это не так.В документации ничего не сказано о том, что требуется в этом случае (или оно ускользает от меня), Gtk SourceView Completion API
Итак, как включить завершение для виджета исходного кода, а затем изменить отображаемый буфери завершение продолжает работать, используя слова в новом буфере?