[gnome-builder/wip/gtk4-port] plugins/c-pack: port c-pack plugin
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/gtk4-port] plugins/c-pack: port c-pack plugin
- Date: Sat, 16 Apr 2022 17:46:18 +0000 (UTC)
commit 6d584aae29feed06e366d4e0d5b6a22f3e224012
Author: Christian Hergert <chergert redhat com>
Date: Sat Apr 16 10:46:13 2022 -0700
plugins/c-pack: port c-pack plugin
This still needs work for the indenter, but that needs to go upstream in
GtkSourceView anyway.
src/plugins/c-pack/c-pack-plugin.c | 9 +-
src/plugins/c-pack/cpack-completion-item.c | 42 ++++++++-
src/plugins/c-pack/cpack-completion-item.h | 5 +-
src/plugins/c-pack/cpack-completion-provider.c | 114 +++++++++++++++----------
src/plugins/c-pack/cpack-completion-results.c | 2 +-
src/plugins/c-pack/meson.build | 4 +-
src/plugins/ctags/gbp-ctags-workbench-addin.c | 3 +-
src/plugins/meson.build | 2 +-
8 files changed, 125 insertions(+), 56 deletions(-)
---
diff --git a/src/plugins/c-pack/c-pack-plugin.c b/src/plugins/c-pack/c-pack-plugin.c
index 82bd8b2d2..a0e03e4b2 100644
--- a/src/plugins/c-pack/c-pack-plugin.c
+++ b/src/plugins/c-pack/c-pack-plugin.c
@@ -20,24 +20,29 @@
#define G_LOG_DOMAIN "c-pack-plugin"
+#include <libpeas/peas.h>
+
#include <libide-editor.h>
#include <libide-sourceview.h>
-#include <libpeas/peas.h>
+#if 0
#include "ide-c-indenter.h"
+#endif
#include "cpack-completion-provider.h"
#include "cpack-editor-page-addin.h"
_IDE_EXTERN void
_ide_c_pack_register_types (PeasObjectModule *module)
{
+#if 0
peas_object_module_register_extension_type (module,
IDE_TYPE_INDENTER,
IDE_TYPE_C_INDENTER);
+#endif
peas_object_module_register_extension_type (module,
IDE_TYPE_EDITOR_PAGE_ADDIN,
CPACK_TYPE_EDITOR_PAGE_ADDIN);
peas_object_module_register_extension_type (module,
- IDE_TYPE_COMPLETION_PROVIDER,
+ GTK_SOURCE_TYPE_COMPLETION_PROVIDER,
CPACK_TYPE_COMPLETION_PROVIDER);
}
diff --git a/src/plugins/c-pack/cpack-completion-item.c b/src/plugins/c-pack/cpack-completion-item.c
index 177050110..f354b3b0b 100644
--- a/src/plugins/c-pack/cpack-completion-item.c
+++ b/src/plugins/c-pack/cpack-completion-item.c
@@ -27,7 +27,7 @@
#include "cpack-completion-item.h"
G_DEFINE_FINAL_TYPE_WITH_CODE (CpackCompletionItem, cpack_completion_item, G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (IDE_TYPE_COMPLETION_PROPOSAL, NULL))
+ G_IMPLEMENT_INTERFACE (GTK_SOURCE_TYPE_COMPLETION_PROPOSAL, NULL))
static void
cpack_completion_item_finalize (GObject *object)
@@ -62,3 +62,43 @@ cpack_completion_item_new (const gchar *word)
return self;
}
+
+void
+cpack_completion_item_display (CpackCompletionItem *self,
+ GtkSourceCompletionCell *cell,
+ const char *typed_text)
+{
+ GtkSourceCompletionColumn column;
+
+ g_return_if_fail (CPACK_IS_COMPLETION_ITEM (self));
+ g_return_if_fail (GTK_SOURCE_IS_COMPLETION_CELL (cell));
+
+ column = gtk_source_completion_cell_get_column (cell);
+
+ switch (column)
+ {
+ case GTK_SOURCE_COMPLETION_COLUMN_ICON:
+ gtk_source_completion_cell_set_icon_name (cell, "lang-include-symbolic");
+ break;
+
+ case GTK_SOURCE_COMPLETION_COLUMN_TYPED_TEXT:
+ {
+ PangoAttrList *attrs;
+
+ attrs = gtk_source_completion_fuzzy_highlight (self->name, typed_text);
+ gtk_source_completion_cell_set_text_with_attributes (cell, self->name, attrs);
+ pango_attr_list_unref (attrs);
+
+ break;
+ }
+
+ case GTK_SOURCE_COMPLETION_COLUMN_COMMENT:
+ case GTK_SOURCE_COMPLETION_COLUMN_DETAILS:
+ case GTK_SOURCE_COMPLETION_COLUMN_BEFORE:
+ case GTK_SOURCE_COMPLETION_COLUMN_AFTER:
+ default:
+ gtk_source_completion_cell_set_text (cell, NULL);
+ break;
+ }
+
+}
diff --git a/src/plugins/c-pack/cpack-completion-item.h b/src/plugins/c-pack/cpack-completion-item.h
index 6252b9558..bd649f696 100644
--- a/src/plugins/c-pack/cpack-completion-item.h
+++ b/src/plugins/c-pack/cpack-completion-item.h
@@ -34,6 +34,9 @@ struct _CpackCompletionItem
gchar *name;
};
-CpackCompletionItem *cpack_completion_item_new (const gchar *word);
+CpackCompletionItem *cpack_completion_item_new (const gchar *word);
+void cpack_completion_item_display (CpackCompletionItem *self,
+ GtkSourceCompletionCell *cell,
+ const char *typed_text);
G_END_DECLS
diff --git a/src/plugins/c-pack/cpack-completion-provider.c b/src/plugins/c-pack/cpack-completion-provider.c
index d0d29adb3..e53f1238b 100644
--- a/src/plugins/c-pack/cpack-completion-provider.c
+++ b/src/plugins/c-pack/cpack-completion-provider.c
@@ -32,16 +32,32 @@
struct _CpackCompletionProvider
{
IdeObject parent_instance;
+ char *word;
+ char *refilter_word;
};
-static void provider_iface_init (IdeCompletionProviderInterface *iface);
+static void provider_iface_init (GtkSourceCompletionProviderInterface *iface);
G_DEFINE_FINAL_TYPE_WITH_CODE (CpackCompletionProvider, cpack_completion_provider, IDE_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (IDE_TYPE_COMPLETION_PROVIDER, provider_iface_init))
+ G_IMPLEMENT_INTERFACE (GTK_SOURCE_TYPE_COMPLETION_PROVIDER,
provider_iface_init))
+
+static void
+cpack_completion_provider_dispose (GObject *object)
+{
+ CpackCompletionProvider *self = (CpackCompletionProvider *)object;
+
+ g_clear_pointer (&self->word, g_free);
+ g_clear_pointer (&self->refilter_word, g_free);
+
+ G_OBJECT_CLASS (cpack_completion_provider_parent_class)->dispose (object);
+}
static void
cpack_completion_provider_class_init (CpackCompletionProviderClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->dispose = cpack_completion_provider_dispose;
}
static void
@@ -108,12 +124,13 @@ cpack_completion_provider_get_build_flags_cb (GObject *object,
}
static void
-cpack_completion_provider_populate_async (IdeCompletionProvider *provider,
- IdeCompletionContext *context,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
+cpack_completion_provider_populate_async (GtkSourceCompletionProvider *provider,
+ GtkSourceCompletionContext *context,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
+ CpackCompletionProvider *self = (CpackCompletionProvider *)provider;
g_autoptr(IdeTask) task = NULL;
g_autofree gchar *prefix = NULL;
GtkTextIter begin, end;
@@ -123,15 +140,17 @@ cpack_completion_provider_populate_async (IdeCompletionProvider *provider,
GFile *file = NULL;
g_assert (CPACK_IS_COMPLETION_PROVIDER (provider));
- g_assert (IDE_IS_COMPLETION_CONTEXT (context));
+ g_assert (GTK_SOURCE_IS_COMPLETION_CONTEXT (context));
g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
task = ide_task_new (provider, cancellable, callback, user_data);
ide_task_set_source_tag (task, cpack_completion_provider_populate_async);
- ide_completion_context_get_bounds (context, &begin, &end);
+ g_clear_pointer (&self->word, g_free);
- buffer = ide_completion_context_get_buffer (context);
+ gtk_source_completion_context_get_bounds (context, &begin, &end);
+
+ buffer = GTK_TEXT_BUFFER (gtk_source_completion_context_get_buffer (context));
if (gtk_source_buffer_iter_has_context_class (GTK_SOURCE_BUFFER (buffer), &begin, "path"))
{
@@ -163,6 +182,8 @@ query_filesystem:
g_assert (IDE_IS_BUFFER (buffer));
+ self->word = g_strdup (prefix);
+
/*
* First step is to get our list of include paths from the CFLAGS for the
* file. After that, we can start looking for matches on the file-system
@@ -182,7 +203,7 @@ query_filesystem:
}
static GListModel *
-cpack_completion_provider_populate_finish (IdeCompletionProvider *self,
+cpack_completion_provider_populate_finish (GtkSourceCompletionProvider *self,
GAsyncResult *result,
GError **error)
{
@@ -193,32 +214,31 @@ cpack_completion_provider_populate_finish (IdeCompletionProvider *self,
}
static void
-cpack_completion_provider_display_proposal (IdeCompletionProvider *provider,
- IdeCompletionListBoxRow *row,
- IdeCompletionContext *context,
- const gchar *typed_text,
- IdeCompletionProposal *proposal)
+cpack_completion_provider_display (GtkSourceCompletionProvider *provider,
+ GtkSourceCompletionContext *context,
+ GtkSourceCompletionProposal *proposal,
+ GtkSourceCompletionCell *cell)
{
- g_autofree gchar *markup = NULL;
+ CpackCompletionProvider *self = (CpackCompletionProvider *)provider;
+ const char *typed_text;
- g_assert (CPACK_IS_COMPLETION_PROVIDER (provider));
- g_assert (IDE_IS_COMPLETION_LIST_BOX_ROW (row));
- g_assert (IDE_IS_COMPLETION_CONTEXT (context));
+ g_assert (CPACK_IS_COMPLETION_PROVIDER (self));
+ g_assert (GTK_SOURCE_IS_COMPLETION_CONTEXT (context));
g_assert (CPACK_IS_COMPLETION_ITEM (proposal));
+ g_assert (GTK_SOURCE_IS_COMPLETION_CELL (cell));
- markup = ide_completion_fuzzy_highlight (CPACK_COMPLETION_ITEM (proposal)->name, typed_text);
+ if (self->refilter_word)
+ typed_text = self->refilter_word;
+ else
+ typed_text = self->word;
- ide_completion_list_box_row_set_icon_name (row, "lang-include-symbolic");
- ide_completion_list_box_row_set_left (row, NULL);
- ide_completion_list_box_row_set_center_markup (row, markup);
- ide_completion_list_box_row_set_right (row, NULL);
+ cpack_completion_item_display (CPACK_COMPLETION_ITEM (proposal), cell, typed_text);
}
static void
-cpack_completion_provider_activate_proposal (IdeCompletionProvider *provider,
- IdeCompletionContext *context,
- IdeCompletionProposal *proposal,
- const GdkEventKey *key)
+cpack_completion_provider_activate (GtkSourceCompletionProvider *provider,
+ GtkSourceCompletionContext *context,
+ GtkSourceCompletionProposal *proposal)
{
CpackCompletionItem *item = (CpackCompletionItem *)proposal;
GtkTextBuffer *buffer;
@@ -226,16 +246,16 @@ cpack_completion_provider_activate_proposal (IdeCompletionProvider *provider,
gsize len;
g_assert (CPACK_IS_COMPLETION_PROVIDER (provider));
- g_assert (IDE_IS_COMPLETION_CONTEXT (context));
+ g_assert (GTK_SOURCE_IS_COMPLETION_CONTEXT (context));
g_assert (CPACK_IS_COMPLETION_ITEM (item));
- buffer = ide_completion_context_get_buffer (context);
+ buffer = GTK_TEXT_BUFFER (gtk_source_completion_context_get_buffer (context));
len = strlen (item->name);
gtk_text_buffer_begin_user_action (buffer);
- if (ide_completion_context_get_bounds (context, &begin, &end))
+ if (gtk_source_completion_context_get_bounds (context, &begin, &end))
gtk_text_buffer_delete (buffer, &begin, &end);
/* don't insert trailing / so user does that to trigger next popup */
@@ -247,33 +267,33 @@ cpack_completion_provider_activate_proposal (IdeCompletionProvider *provider,
gtk_text_buffer_end_user_action (buffer);
}
-static gboolean
-cpack_completion_provider_refilter (IdeCompletionProvider *provider,
- IdeCompletionContext *context,
- GListModel *model)
+static void
+cpack_completion_provider_refilter (GtkSourceCompletionProvider *provider,
+ GtkSourceCompletionContext *context,
+ GListModel *model)
{
- g_autofree gchar *word = NULL;
+ CpackCompletionProvider *self = (CpackCompletionProvider *)provider;
g_assert (CPACK_IS_COMPLETION_PROVIDER (provider));
- g_assert (IDE_IS_COMPLETION_CONTEXT (context));
+ g_assert (GTK_SOURCE_IS_COMPLETION_CONTEXT (context));
g_assert (CPACK_IS_COMPLETION_RESULTS (model));
- word = ide_completion_context_get_word (context);
- cpack_completion_results_refilter (CPACK_COMPLETION_RESULTS (model), word);
+ g_clear_pointer (&self->refilter_word, g_free);
+ self->refilter_word = gtk_source_completion_context_get_word (context);
- return TRUE;
+ cpack_completion_results_refilter (CPACK_COMPLETION_RESULTS (model), self->refilter_word);
}
static gint
-cpack_completion_provider_get_priority (IdeCompletionProvider *provider,
- IdeCompletionContext *context)
+cpack_completion_provider_get_priority (GtkSourceCompletionProvider *provider,
+ GtkSourceCompletionContext *context)
{
/* we only activate when applicable, so high priority */
return -100;
}
static gboolean
-cpack_completion_provider_is_trigger (IdeCompletionProvider *provider,
+cpack_completion_provider_is_trigger (GtkSourceCompletionProvider *provider,
const GtkTextIter *iter,
gunichar ch)
{
@@ -289,13 +309,13 @@ cpack_completion_provider_is_trigger (IdeCompletionProvider *provider,
}
static void
-provider_iface_init (IdeCompletionProviderInterface *iface)
+provider_iface_init (GtkSourceCompletionProviderInterface *iface)
{
iface->populate_async = cpack_completion_provider_populate_async;
iface->populate_finish = cpack_completion_provider_populate_finish;
iface->refilter = cpack_completion_provider_refilter;
- iface->display_proposal = cpack_completion_provider_display_proposal;
- iface->activate_proposal = cpack_completion_provider_activate_proposal;
+ iface->display = cpack_completion_provider_display;
+ iface->activate = cpack_completion_provider_activate;
iface->get_priority = cpack_completion_provider_get_priority;
iface->is_trigger = cpack_completion_provider_is_trigger;
}
diff --git a/src/plugins/c-pack/cpack-completion-results.c b/src/plugins/c-pack/cpack-completion-results.c
index b4c06d872..50cdd5e8d 100644
--- a/src/plugins/c-pack/cpack-completion-results.c
+++ b/src/plugins/c-pack/cpack-completion-results.c
@@ -176,7 +176,7 @@ cpack_completion_results_refilter (CpackCompletionResults *self,
const gchar *ele = g_ptr_array_index (self->unfiltered, i);
guint priority;
- if (ide_completion_fuzzy_match (ele, casefold, &priority))
+ if (gtk_source_completion_fuzzy_match (ele, casefold, &priority))
{
Item item = { .word = ele, .priority = priority };
diff --git a/src/plugins/c-pack/meson.build b/src/plugins/c-pack/meson.build
index 0fffd5f9f..676dd1e98 100644
--- a/src/plugins/c-pack/meson.build
+++ b/src/plugins/c-pack/meson.build
@@ -8,9 +8,11 @@ plugins_sources += files([
'cpack-completion-results.c',
'cpack-editor-page-addin.c',
'hdr-format.c',
- 'ide-c-indenter.c',
])
+# needs to be ported to GtkSourceView 5 and moved there
+# 'ide-c-indenter.c',
+
plugin_c_pack_resources = gnome.compile_resources(
'c-pack-resources',
'c-pack.gresource.xml',
diff --git a/src/plugins/ctags/gbp-ctags-workbench-addin.c b/src/plugins/ctags/gbp-ctags-workbench-addin.c
index aa3ea4fb4..0db41808f 100644
--- a/src/plugins/ctags/gbp-ctags-workbench-addin.c
+++ b/src/plugins/ctags/gbp-ctags-workbench-addin.c
@@ -167,8 +167,7 @@ workbench_addin_iface_init (IdeWorkbenchAddinInterface *iface)
}
G_DEFINE_FINAL_TYPE_WITH_CODE (GbpCtagsWorkbenchAddin, gbp_ctags_workbench_addin, G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (IDE_TYPE_WORKBENCH_ADDIN,
- workbench_addin_iface_init))
+ G_IMPLEMENT_INTERFACE (IDE_TYPE_WORKBENCH_ADDIN, workbench_addin_iface_init))
static void
gbp_ctags_workbench_addin_class_init (GbpCtagsWorkbenchAddinClass *klass)
diff --git a/src/plugins/meson.build b/src/plugins/meson.build
index 4032819db..f68ec0e9a 100644
--- a/src/plugins/meson.build
+++ b/src/plugins/meson.build
@@ -55,7 +55,7 @@ subdir('codespell')
#subdir('command-bar')
subdir('comment-code')
subdir('copyright')
-#subdir('c-pack')
+subdir('c-pack')
#subdir('create-project')
#subdir('ctags')
#subdir('debuggerui')
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]