[gnome-builder/wip/gtk4-port: 832/1774] libide/sourceview: override highlight-current-line
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/gtk4-port: 832/1774] libide/sourceview: override highlight-current-line
- Date: Mon, 11 Jul 2022 22:31:25 +0000 (UTC)
commit b22104a636b0ea05c3e9fdf7317ba5d216edbf52
Author: Christian Hergert <chergert redhat com>
Date: Mon May 2 13:09:55 2022 -0700
libide/sourceview: override highlight-current-line
This brings back our override we had before which allows us to not show
highlights when we have the document open in multiple places to avoid
confusion on where focus is.
src/libide/sourceview/ide-source-view-private.h | 3 +
src/libide/sourceview/ide-source-view.c | 87 ++++++++++++++++++++++++-
src/libide/sourceview/ide-source-view.h | 5 ++
3 files changed, 94 insertions(+), 1 deletion(-)
---
diff --git a/src/libide/sourceview/ide-source-view-private.h b/src/libide/sourceview/ide-source-view-private.h
index f88ea6974..affcf07b7 100644
--- a/src/libide/sourceview/ide-source-view-private.h
+++ b/src/libide/sourceview/ide-source-view-private.h
@@ -61,6 +61,9 @@ struct _IdeSourceView
*/
IdeExtensionSetAdapter *completion_providers;
IdeExtensionSetAdapter *hover_providers;
+
+ /* Bitfield values go here */
+ guint highlight_current_line : 1;
};
diff --git a/src/libide/sourceview/ide-source-view.c b/src/libide/sourceview/ide-source-view.c
index 3f0ea1932..29b5e12b9 100644
--- a/src/libide/sourceview/ide-source-view.c
+++ b/src/libide/sourceview/ide-source-view.c
@@ -35,7 +35,10 @@ enum {
PROP_FONT_SCALE,
PROP_LINE_HEIGHT,
PROP_ZOOM_LEVEL,
- N_PROPS
+ N_PROPS,
+
+ /* Property Overrides */
+ PROP_HIGHLIGHT_CURRENT_LINE,
};
enum {
@@ -433,6 +436,35 @@ ide_source_view_menu_popup_action (GtkWidget *widget,
IDE_EXIT;
}
+static void
+ide_source_view_focus_enter_cb (IdeSourceView *self,
+ GtkEventControllerFocus *focus)
+{
+ IDE_ENTRY;
+
+ g_assert (IDE_IS_SOURCE_VIEW (self));
+ g_assert (GTK_IS_EVENT_CONTROLLER_FOCUS (focus));
+
+ if (self->highlight_current_line)
+ gtk_source_view_set_highlight_current_line (GTK_SOURCE_VIEW (self), TRUE);
+
+ IDE_EXIT;
+}
+
+static void
+ide_source_view_focus_leave_cb (IdeSourceView *self,
+ GtkEventControllerFocus *focus)
+{
+ IDE_ENTRY;
+
+ g_assert (IDE_IS_SOURCE_VIEW (self));
+ g_assert (GTK_IS_EVENT_CONTROLLER_FOCUS (focus));
+
+ gtk_source_view_set_highlight_current_line (GTK_SOURCE_VIEW (self), FALSE);
+
+ IDE_EXIT;
+}
+
static void
ide_source_view_size_allocate (GtkWidget *widget,
int width,
@@ -499,6 +531,10 @@ ide_source_view_get_property (GObject *object,
g_value_set_int (value, self->font_scale);
break;
+ case PROP_HIGHLIGHT_CURRENT_LINE:
+ g_value_set_boolean (value, ide_source_view_get_highlight_current_line (self));
+ break;
+
case PROP_LINE_HEIGHT:
g_value_set_double (value, self->line_height);
break;
@@ -531,6 +567,10 @@ ide_source_view_set_property (GObject *object,
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ZOOM_LEVEL]);
break;
+ case PROP_HIGHLIGHT_CURRENT_LINE:
+ ide_source_view_set_highlight_current_line (self, g_value_get_boolean (value));
+ break;
+
case PROP_LINE_HEIGHT:
if (self->line_height != g_value_get_double (value))
{
@@ -559,6 +599,10 @@ ide_source_view_class_init (IdeSourceViewClass *klass)
widget_class->root = ide_source_view_root;
widget_class->size_allocate = ide_source_view_size_allocate;
+ g_object_class_override_property (object_class,
+ PROP_HIGHLIGHT_CURRENT_LINE,
+ "highlight-current-line");
+
properties [PROP_LINE_HEIGHT] =
g_param_spec_double ("line-height",
"Line height",
@@ -616,6 +660,7 @@ ide_source_view_init (IdeSourceView *self)
{
GtkStyleContext *style_context;
GtkEventController *click;
+ GtkEventController *focus;
g_signal_connect (self,
"notify::buffer",
@@ -640,6 +685,18 @@ ide_source_view_init (IdeSourceView *self)
self);
gtk_widget_add_controller (GTK_WIDGET (self), click);
+ /* Setup focus tracking */
+ focus = gtk_event_controller_focus_new ();
+ g_signal_connect_swapped (focus,
+ "enter",
+ G_CALLBACK (ide_source_view_focus_enter_cb),
+ self);
+ g_signal_connect_swapped (focus,
+ "leave",
+ G_CALLBACK (ide_source_view_focus_leave_cb),
+ self);
+ gtk_widget_add_controller (GTK_WIDGET (self), focus);
+
/* This is sort of a layer vioaltion, but it's helpful for us to
* get the system font name and manage it invisibly.
*/
@@ -931,3 +988,31 @@ ide_source_view_jump_to_iter (IdeSourceView *self,
gtk_adjustment_set_value (hadj, xvalue);
gtk_adjustment_set_value (vadj, yvalue + top_margin);
}
+
+gboolean
+ide_source_view_get_highlight_current_line (IdeSourceView *self)
+{
+ g_return_val_if_fail (IDE_IS_SOURCE_VIEW (self), FALSE);
+
+ return self->highlight_current_line;
+}
+
+void
+ide_source_view_set_highlight_current_line (IdeSourceView *self,
+ gboolean highlight_current_line)
+{
+ g_return_if_fail (IDE_IS_SOURCE_VIEW (self));
+
+ highlight_current_line = !!highlight_current_line;
+
+ if (highlight_current_line != self->highlight_current_line)
+ {
+ self->highlight_current_line = highlight_current_line;
+
+ if (gtk_widget_has_focus (GTK_WIDGET (self)))
+ gtk_source_view_set_highlight_current_line (GTK_SOURCE_VIEW (self),
+ highlight_current_line);
+ else
+ g_object_notify (G_OBJECT (self), "highlight-current-line");
+ }
+}
diff --git a/src/libide/sourceview/ide-source-view.h b/src/libide/sourceview/ide-source-view.h
index a540cb8c3..e243614d4 100644
--- a/src/libide/sourceview/ide-source-view.h
+++ b/src/libide/sourceview/ide-source-view.h
@@ -46,6 +46,11 @@ void ide_source_view_get_visual_position (IdeSourceView
guint *line,
guint *line_column);
IDE_AVAILABLE_IN_ALL
+gboolean ide_source_view_get_highlight_current_line (IdeSourceView *self);
+IDE_AVAILABLE_IN_ALL
+void ide_source_view_set_highlight_current_line (IdeSourceView *self,
+ gboolean highlight_current_line);
+IDE_AVAILABLE_IN_ALL
double ide_source_view_get_zoom_level (IdeSourceView *self);
IDE_AVAILABLE_IN_ALL
void ide_source_view_set_font_desc (IdeSourceView *self,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]