[gnome-builder] view: keep selection if window stays focused
- From: Sébastien Lafargue <slafargue src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] view: keep selection if window stays focused
- Date: Fri, 15 Jan 2016 23:08:50 +0000 (UTC)
commit 114b01ecddd440ee6e93b88bdfc7375f2288036e
Author: Sebastien Lafargue <slafargue gnome org>
Date: Wed Jan 13 21:50:16 2016 +0100
view: keep selection if window stays focused
libide/ide-source-view.c | 32 ++++++++++++++++++++++++++++++--
libide/ide-workbench-private.h | 11 ++++++++---
libide/ide-workbench.c | 18 ++++++++++++++++++
3 files changed, 56 insertions(+), 5 deletions(-)
---
diff --git a/libide/ide-source-view.c b/libide/ide-source-view.c
index cfe83a9..30514a7 100644
--- a/libide/ide-source-view.c
+++ b/libide/ide-source-view.c
@@ -67,6 +67,7 @@
#include "ide-source-view-movements.h"
#include "ide-symbol.h"
#include "ide-text-util.h"
+#include "ide-workbench-private.h"
#define DEFAULT_FONT_DESC "Monospace 11"
#define ANIMATION_X_GROW 50
@@ -1252,6 +1253,22 @@ ide_source_view__buffer_mark_set_cb (IdeSourceView *self,
}
static void
+ide_source_view__buffer_notify_has_selection_cb (IdeSourceView *self,
+ GParamSpec *pspec,
+ IdeBuffer *buffer)
+{
+ IdeWorkbench *workbench = ide_widget_get_workbench (GTK_WIDGET (self));
+
+ if (workbench == NULL)
+ return;
+
+ if (gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (buffer)))
+ ide_workbench_set_selection_owner (workbench, G_OBJECT (self));
+ else if (ide_workbench_get_selection_owner (workbench) == G_OBJECT (self))
+ ide_workbench_set_selection_owner (workbench, NULL);
+}
+
+static void
ide_source_view__buffer_notify_highlight_diagnostics_cb (IdeSourceView *self,
GParamSpec *pspec,
IdeBuffer *buffer)
@@ -4288,6 +4305,7 @@ ide_source_view_focus_in_event (GtkWidget *widget,
IdeSourceView *self = (IdeSourceView *)widget;
IdeSourceViewPrivate *priv = ide_source_view_get_instance_private (self);
GtkSourceCompletion *completion;
+ IdeWorkbench *workbench;
gboolean ret;
g_assert (IDE_IS_SOURCE_VIEW (self));
@@ -4303,8 +4321,13 @@ ide_source_view_focus_in_event (GtkWidget *widget,
* will stay looking selected, as the other frame could be a view into our
* own buffer).
*/
- priv->saved_selection_line = priv->saved_line;
- priv->saved_selection_line_offset = priv->saved_line_offset;
+ workbench = ide_widget_get_workbench (GTK_WIDGET (widget));
+ if (!workbench || ide_workbench_get_selection_owner (workbench) != G_OBJECT (self))
+ {
+ priv->saved_selection_line = priv->saved_line;
+ priv->saved_selection_line_offset = priv->saved_line_offset;
+ }
+
ide_source_view_real_restore_insert_mark_full (self, FALSE);
/* restore line highlight if enabled */
@@ -6266,6 +6289,11 @@ ide_source_view_init (IdeSourceView *self)
G_CALLBACK (ide_source_view__buffer_loaded_cb),
self,
G_CONNECT_SWAPPED);
+ egg_signal_group_connect_object (priv->buffer_signals,
+ "notify::has-selection",
+ G_CALLBACK (ide_source_view__buffer_notify_has_selection_cb),
+ self,
+ G_CONNECT_SWAPPED);
g_signal_connect_object (priv->buffer_signals,
"bind",
G_CALLBACK (ide_source_view_bind_buffer),
diff --git a/libide/ide-workbench-private.h b/libide/ide-workbench-private.h
index 0f1f98e..382be20 100644
--- a/libide/ide-workbench-private.h
+++ b/libide/ide-workbench-private.h
@@ -45,11 +45,16 @@ struct _IdeWorkbench
GtkPopover *perspectives_popover;
GtkSizeGroup *header_size_group;
+
+ GObject *selection_owner;
};
-void ide_workbench_set_context (IdeWorkbench *workbench,
- IdeContext *context);
-void ide_workbench_actions_init (IdeWorkbench *self);
+void ide_workbench_set_context (IdeWorkbench *workbench,
+ IdeContext *context);
+void ide_workbench_actions_init (IdeWorkbench *self);
+void ide_workbench_set_selection_owner (IdeWorkbench *self,
+ GObject *object);
+GObject *ide_workbench_get_selection_owner (IdeWorkbench *self);
G_END_DECLS
diff --git a/libide/ide-workbench.c b/libide/ide-workbench.c
index 59c2efd..9be73df 100644
--- a/libide/ide-workbench.c
+++ b/libide/ide-workbench.c
@@ -159,6 +159,24 @@ ide_workbench_agree_to_shutdown (IdeWorkbench *self)
return ret;
}
+void
+ide_workbench_set_selection_owner (IdeWorkbench *self,
+ GObject *object)
+{
+ g_assert (IDE_IS_WORKBENCH (self));
+ g_assert (G_IS_OBJECT (object) || object == NULL);
+
+ self->selection_owner = object;
+}
+
+GObject *
+ide_workbench_get_selection_owner (IdeWorkbench *self)
+{
+ g_assert (IDE_IS_WORKBENCH (self));
+
+ return self->selection_owner;
+}
+
static gboolean
ide_workbench_delete_event (GtkWidget *widget,
GdkEventAny *event)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]