[gnome-builder] libide-code: port highlighter to GTK 4
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] libide-code: port highlighter to GTK 4
- Date: Tue, 12 Jul 2022 06:39:07 +0000 (UTC)
commit 650c6341b7a7bc8798c7e1e1e9f080bf0c0b21f8
Author: Christian Hergert <chergert redhat com>
Date: Mon Jul 11 16:15:15 2022 -0700
libide-code: port highlighter to GTK 4
* Use newer GtkSourceView features
* Change private prefix on style schemes
* Update to new availability macros
src/libide/code/ide-highlight-engine.c | 86 +++++++++++++---------------------
src/libide/code/ide-highlight-engine.h | 22 ++++-----
src/libide/code/ide-highlight-index.c | 5 --
src/libide/code/ide-highlight-index.h | 18 +++----
src/libide/code/ide-highlighter.c | 2 -
src/libide/code/ide-highlighter.h | 8 ++--
6 files changed, 56 insertions(+), 85 deletions(-)
---
diff --git a/src/libide/code/ide-highlight-engine.c b/src/libide/code/ide-highlight-engine.c
index 352ca21d3..5f7cb0df0 100644
--- a/src/libide/code/ide-highlight-engine.c
+++ b/src/libide/code/ide-highlight-engine.c
@@ -22,7 +22,6 @@
#include "config.h"
-#include <dazzle.h>
#include <glib/gi18n.h>
#include <gtksourceview/gtksource.h>
#include <libide-plugins.h>
@@ -34,8 +33,7 @@
#include "ide-highlight-index.h"
#include "ide-highlighter.h"
-#define HIGHLIGHT_QUANTA_USEC 5000
-#define PRIVATE_TAG_PREFIX "gb-private-tag"
+#define PRIVATE_TAG_PREFIX "Builder"
struct _IdeHighlightEngine
{
@@ -43,7 +41,7 @@ struct _IdeHighlightEngine
GWeakRef buffer_wref;
- DzlSignalGroup *signal_group;
+ IdeSignalGroup *signal_group;
IdeHighlighter *highlighter;
GSettings *settings;
@@ -57,7 +55,7 @@ struct _IdeHighlightEngine
gint64 quanta_expiration;
- guint work_timeout;
+ gsize work_scheduled;
guint enabled : 1;
};
@@ -174,9 +172,8 @@ sync_tag_style (GtkSourceStyleScheme *style_scheme,
style_name = tag_name;
/*
- * Check if this is a private tag.A tag is private if it starts with
- * PRIVATE_TAG_PREFIX "gb-private-tag".
- * ex: gb-private-tag:c:boolean
+ * Check if this is a private tag. A tag is private if it starts with
+ * PRIVATE_TAG_PREFIX "Builder" such as "Builder:c:boolean".
* If the tag is private extract the original style name by moving the string
* strlen (PRIVATE_TAG_PREFIX) + 1 (the colon) characters.
*/
@@ -195,6 +192,9 @@ sync_tag_style (GtkSourceStyleScheme *style_scheme,
}
}
+ if (style == NULL)
+ return;
+
g_object_get (style,
"background", &background,
"background-set", &background_set,
@@ -270,7 +270,7 @@ get_tag_from_style (IdeHighlightEngine *self,
return NULL;
/*
- * If is private tag prepend the PRIVATE_TAG_PREFIX (gb-private-tag)
+ * If is private tag prepend the PRIVATE_TAG_PREFIX (Builder)
* to the string.This is used because tag name is the key used
* for saving tags in GtkTextTagTable and we dont want conflicts between
* public and private tags.
@@ -318,7 +318,8 @@ ide_highlight_engine_apply_style (const GtkTextIter *begin,
}
static gboolean
-ide_highlight_engine_tick (IdeHighlightEngine *self)
+ide_highlight_engine_tick (IdeHighlightEngine *self,
+ gint64 deadline)
{
g_autoptr(GtkTextBuffer) buffer = NULL;
GtkTextIter iter;
@@ -337,7 +338,7 @@ ide_highlight_engine_tick (IdeHighlightEngine *self)
if (buffer == NULL)
return G_SOURCE_REMOVE;
- self->quanta_expiration = g_get_monotonic_time () + HIGHLIGHT_QUANTA_USEC;
+ self->quanta_expiration = deadline;
gtk_text_buffer_get_iter_at_mark (buffer, &invalid_begin, self->invalid_begin);
gtk_text_buffer_get_iter_at_mark (buffer, &invalid_end, self->invalid_end);
@@ -384,19 +385,20 @@ up_to_date:
}
static gboolean
-ide_highlight_engine_work_timeout_handler (gpointer data)
+ide_highlight_engine_worker (gint64 deadline,
+ gpointer user_data)
{
- IdeHighlightEngine *self = data;
+ IdeHighlightEngine *self = user_data;
g_assert (IDE_IS_HIGHLIGHT_ENGINE (self));
if (self->enabled)
{
- if (ide_highlight_engine_tick (self))
+ if (ide_highlight_engine_tick (self, deadline))
return G_SOURCE_CONTINUE;
}
- self->work_timeout = 0;
+ self->work_scheduled = 0;
return G_SOURCE_REMOVE;
}
@@ -409,22 +411,10 @@ ide_highlight_engine_queue_work (IdeHighlightEngine *self)
g_assert (IDE_IS_HIGHLIGHT_ENGINE (self));
buffer = g_weak_ref_get (&self->buffer_wref);
- if (self->highlighter == NULL || buffer == NULL || self->work_timeout != 0)
+ if (self->highlighter == NULL || buffer == NULL || self->work_scheduled != 0)
return;
- /*
- * NOTE: It would be really nice if we could use the GdkFrameClock here to
- * drive the next update instead of a timeout. It's possible that our
- * callback could get scheduled right before the frame processing would
- * begin. However, since that gets driven by something like a Wayland
- * callback, it won't yet be scheduled. So instead our function gets
- * called and we potentially cause a frame to drop.
- */
-
- self->work_timeout = gdk_threads_add_idle_full (G_PRIORITY_LOW + 1,
- ide_highlight_engine_work_timeout_handler,
- self,
- NULL);
+ self->work_scheduled = gtk_source_scheduler_add (ide_highlight_engine_worker, self);
}
/**
@@ -436,8 +426,6 @@ ide_highlight_engine_queue_work (IdeHighlightEngine *self)
*
* If they return from their update function without advancing, nothing will
* happen until they call this method to proceed.
- *
- * Since: 3.32
*/
void
ide_highlight_engine_advance (IdeHighlightEngine *self)
@@ -504,7 +492,7 @@ ide_highlight_engine_reload (IdeHighlightEngine *self)
g_assert (IDE_IS_HIGHLIGHT_ENGINE (self));
- dzl_clear_source (&self->work_timeout);
+ gtk_source_scheduler_clear (&self->work_scheduled);
buffer = g_weak_ref_get (&self->buffer_wref);
if (buffer == NULL)
@@ -689,7 +677,7 @@ ide_highlight_engine_clear (IdeHighlightEngine *self)
static void
ide_highlight_engine__bind_buffer_cb (IdeHighlightEngine *self,
IdeBuffer *buffer,
- DzlSignalGroup *group)
+ IdeSignalGroup *group)
{
GtkTextBuffer *text_buffer = (GtkTextBuffer *)buffer;
GtkTextIter begin;
@@ -699,7 +687,7 @@ ide_highlight_engine__bind_buffer_cb (IdeHighlightEngine *self,
g_assert (IDE_IS_HIGHLIGHT_ENGINE (self));
g_assert (IDE_IS_BUFFER (buffer));
- g_assert (DZL_IS_SIGNAL_GROUP (group));
+ g_assert (IDE_IS_SIGNAL_GROUP (group));
g_assert (self->invalid_begin == NULL);
g_assert (self->invalid_end == NULL);
@@ -727,18 +715,18 @@ ide_highlight_engine__bind_buffer_cb (IdeHighlightEngine *self,
static void
ide_highlight_engine__unbind_buffer_cb (IdeHighlightEngine *self,
- DzlSignalGroup *group)
+ IdeSignalGroup *group)
{
g_autoptr(GtkTextBuffer) text_buffer = NULL;
IDE_ENTRY;
g_assert (IDE_IS_HIGHLIGHT_ENGINE (self));
- g_assert (DZL_IS_SIGNAL_GROUP (group));
+ g_assert (IDE_IS_SIGNAL_GROUP (group));
text_buffer = g_weak_ref_get (&self->buffer_wref);
- dzl_clear_source (&self->work_timeout);
+ gtk_source_scheduler_clear (&self->work_scheduled);
if (text_buffer != NULL)
{
@@ -790,7 +778,7 @@ ide_highlight_engine_set_buffer (IdeHighlightEngine *self,
/* We can get GtkSourceBuffer intermittently here. */
if (!buffer || IDE_IS_BUFFER (buffer))
{
- dzl_signal_group_set_target (self->signal_group, buffer);
+ ide_signal_group_set_target (self->signal_group, buffer);
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_BUFFER]);
}
}
@@ -961,27 +949,27 @@ ide_highlight_engine_init (IdeHighlightEngine *self)
self->settings = g_settings_new ("org.gnome.builder.code-insight");
self->enabled = g_settings_get_boolean (self->settings, "semantic-highlighting");
- self->signal_group = dzl_signal_group_new (IDE_TYPE_BUFFER);
+ self->signal_group = ide_signal_group_new (IDE_TYPE_BUFFER);
- dzl_signal_group_connect_object (self->signal_group,
+ ide_signal_group_connect_object (self->signal_group,
"insert-text",
G_CALLBACK (ide_highlight_engine__buffer_insert_text_cb),
self,
G_CONNECT_SWAPPED | G_CONNECT_AFTER);
- dzl_signal_group_connect_object (self->signal_group,
+ ide_signal_group_connect_object (self->signal_group,
"delete-range",
G_CALLBACK (ide_highlight_engine__buffer_delete_range_cb),
self,
G_CONNECT_SWAPPED | G_CONNECT_AFTER);
- dzl_signal_group_connect_object (self->signal_group,
+ ide_signal_group_connect_object (self->signal_group,
"notify::language",
G_CALLBACK (ide_highlight_engine__notify_language_cb),
self,
G_CONNECT_SWAPPED);
- dzl_signal_group_connect_object (self->signal_group,
+ ide_signal_group_connect_object (self->signal_group,
"notify::style-scheme",
G_CALLBACK (ide_highlight_engine__notify_style_scheme_cb),
self,
@@ -1031,8 +1019,6 @@ ide_highlight_engine_new (IdeBuffer *buffer)
* Gets the IdeHighlightEngine:highlighter property.
*
* Returns: (transfer none): An #IdeHighlighter.
- *
- * Since: 3.32
*/
IdeHighlighter *
ide_highlight_engine_get_highlighter (IdeHighlightEngine *self)
@@ -1049,8 +1035,6 @@ ide_highlight_engine_get_highlighter (IdeHighlightEngine *self)
* Gets the IdeHighlightEngine:buffer property.
*
* Returns: (transfer none): An #IdeBuffer.
- *
- * Since: 3.32
*/
IdeBuffer *
ide_highlight_engine_get_buffer (IdeHighlightEngine *self)
@@ -1108,8 +1092,6 @@ ide_highlight_engine_rebuild (IdeHighlightEngine *self)
* Updating the invalidated region of the buffer may take some time, as it is
* important that the highlighter does not block for more than 1-2 milliseconds
* to avoid dropping frames.
- *
- * Since: 3.32
*/
void
ide_highlight_engine_invalidate (IdeHighlightEngine *self,
@@ -1157,8 +1139,6 @@ ide_highlight_engine_invalidate (IdeHighlightEngine *self,
* A #GtkTextTag for @style_name.
*
* Returns: (transfer none): a #GtkTextTag.
- *
- * Since: 3.32
*/
GtkTextTag *
ide_highlight_engine_get_style (IdeHighlightEngine *self,
@@ -1172,7 +1152,7 @@ ide_highlight_engine_pause (IdeHighlightEngine *self)
{
g_return_if_fail (IDE_IS_HIGHLIGHT_ENGINE (self));
- dzl_signal_group_block (self->signal_group);
+ ide_signal_group_block (self->signal_group);
}
void
@@ -1183,7 +1163,7 @@ ide_highlight_engine_unpause (IdeHighlightEngine *self)
g_return_if_fail (IDE_IS_HIGHLIGHT_ENGINE (self));
g_return_if_fail (self->signal_group != NULL);
- dzl_signal_group_unblock (self->signal_group);
+ ide_signal_group_unblock (self->signal_group);
buffer = g_weak_ref_get (&self->buffer_wref);
diff --git a/src/libide/code/ide-highlight-engine.h b/src/libide/code/ide-highlight-engine.h
index eb4012278..ad9c90d1c 100644
--- a/src/libide/code/ide-highlight-engine.h
+++ b/src/libide/code/ide-highlight-engine.h
@@ -32,31 +32,31 @@ G_BEGIN_DECLS
#define IDE_TYPE_HIGHLIGHT_ENGINE (ide_highlight_engine_get_type())
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
G_DECLARE_FINAL_TYPE (IdeHighlightEngine, ide_highlight_engine, IDE, HIGHLIGHT_ENGINE, IdeObject)
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
IdeHighlightEngine *ide_highlight_engine_new (IdeBuffer *buffer);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
IdeBuffer *ide_highlight_engine_get_buffer (IdeHighlightEngine *self);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
IdeHighlighter *ide_highlight_engine_get_highlighter (IdeHighlightEngine *self);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
void ide_highlight_engine_rebuild (IdeHighlightEngine *self);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
void ide_highlight_engine_clear (IdeHighlightEngine *self);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
void ide_highlight_engine_invalidate (IdeHighlightEngine *self,
const GtkTextIter *begin,
const GtkTextIter *end);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
GtkTextTag *ide_highlight_engine_get_style (IdeHighlightEngine *self,
const gchar *style_name);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
void ide_highlight_engine_pause (IdeHighlightEngine *self);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
void ide_highlight_engine_unpause (IdeHighlightEngine *self);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
void ide_highlight_engine_advance (IdeHighlightEngine *self);
G_END_DECLS
diff --git a/src/libide/code/ide-highlight-index.c b/src/libide/code/ide-highlight-index.c
index 4cf83e3f4..816898f11 100644
--- a/src/libide/code/ide-highlight-index.c
+++ b/src/libide/code/ide-highlight-index.c
@@ -22,7 +22,6 @@
#include "config.h"
-#include <dazzle.h>
#include <string.h>
#include "ide-highlight-index.h"
@@ -140,8 +139,6 @@ ide_highlight_index_insert (IdeHighlightIndex *self,
* internal structures or strings they know about to optimize later work.
*
* Returns: (transfer none) (nullable): Highlighter specific tag.
- *
- * Since: 3.32
*/
gpointer
ide_highlight_index_lookup (IdeHighlightIndex *self,
@@ -200,8 +197,6 @@ ide_highlight_index_dump (IdeHighlightIndex *self)
* Creates a variant to represent the index. Useful to transport across IPC boundaries.
*
* Returns: (transfer full): a #GVariant
- *
- * Since: 3.32
*/
GVariant *
ide_highlight_index_to_variant (IdeHighlightIndex *self)
diff --git a/src/libide/code/ide-highlight-index.h b/src/libide/code/ide-highlight-index.h
index b5649cbbb..f93e12fd0 100644
--- a/src/libide/code/ide-highlight-index.h
+++ b/src/libide/code/ide-highlight-index.h
@@ -34,26 +34,26 @@ G_BEGIN_DECLS
typedef struct _IdeHighlightIndex IdeHighlightIndex;
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
GType ide_highlight_index_get_type (void);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
IdeHighlightIndex *ide_highlight_index_new (void);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
IdeHighlightIndex *ide_highlight_index_new_from_variant (GVariant *variant);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
IdeHighlightIndex *ide_highlight_index_ref (IdeHighlightIndex *self);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
void ide_highlight_index_unref (IdeHighlightIndex *self);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
void ide_highlight_index_insert (IdeHighlightIndex *self,
const gchar *word,
gpointer tag);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
gpointer ide_highlight_index_lookup (IdeHighlightIndex *self,
const gchar *word);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
void ide_highlight_index_dump (IdeHighlightIndex *self);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
GVariant *ide_highlight_index_to_variant (IdeHighlightIndex *self);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (IdeHighlightIndex, ide_highlight_index_unref)
diff --git a/src/libide/code/ide-highlighter.c b/src/libide/code/ide-highlighter.c
index d156dc4da..8a1438b0f 100644
--- a/src/libide/code/ide-highlighter.c
+++ b/src/libide/code/ide-highlighter.c
@@ -64,8 +64,6 @@ ide_highlighter_default_init (IdeHighlighterInterface *iface)
*
* If processing the entire range was successful, then @location should be set
* to @range_end.
- *
- * Since: 3.32
*/
void
ide_highlighter_update (IdeHighlighter *self,
diff --git a/src/libide/code/ide-highlighter.h b/src/libide/code/ide-highlighter.h
index 1bd59a93c..e5c6a972c 100644
--- a/src/libide/code/ide-highlighter.h
+++ b/src/libide/code/ide-highlighter.h
@@ -33,7 +33,7 @@ G_BEGIN_DECLS
#define IDE_TYPE_HIGHLIGHTER (ide_highlighter_get_type())
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
G_DECLARE_INTERFACE (IdeHighlighter, ide_highlighter, IDE, HIGHLIGHTER, IdeObject)
typedef enum
@@ -62,8 +62,6 @@ struct _IdeHighlighterInterface
*
* @location should be set to the position that the highlighter got to
* before yielding back to the engine.
- *
- * Since: 3.32
*/
void (*update) (IdeHighlighter *self,
IdeHighlightCallback callback,
@@ -77,9 +75,9 @@ struct _IdeHighlighterInterface
void (*load) (IdeHighlighter *self);
};
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
void ide_highlighter_load (IdeHighlighter *self);
-IDE_AVAILABLE_IN_3_32
+IDE_AVAILABLE_IN_ALL
void ide_highlighter_update (IdeHighlighter *self,
IdeHighlightCallback callback,
const GtkTextIter *range_begin,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]