[gnome-builder] view: keep selection if window stays focused



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]