[gnome-builder/editor-layout] track last focus frame



commit e10e40503a367279e5ef2a63bf7d7da92b6adc16
Author: Christian Hergert <christian hergert me>
Date:   Sun Nov 30 00:28:31 2014 -0800

    track last focus frame

 src/editor/gb-editor-frame.c     |   19 +++++++++++++++
 src/editor/gb-editor-tab.c       |   46 +++++++++++++++++++++++++++++++++++++-
 src/editor/gb-editor-workspace.c |    1 +
 3 files changed, 65 insertions(+), 1 deletions(-)
---
diff --git a/src/editor/gb-editor-frame.c b/src/editor/gb-editor-frame.c
index 0bba0ef..feb47aa 100644
--- a/src/editor/gb-editor-frame.c
+++ b/src/editor/gb-editor-frame.c
@@ -63,7 +63,13 @@ enum {
   LAST_PROP
 };
 
+enum {
+  FOCUSED,
+  LAST_SIGNAL
+};
+
 static GParamSpec *gParamSpecs [LAST_PROP];
+static guint       gSignals [FOCUSED];
 
 GtkWidget *
 gb_editor_frame_new (void)
@@ -404,6 +410,8 @@ gb_editor_frame_on_focus_in_event (GbEditorFrame *frame,
   gtk_revealer_set_reveal_child (frame->priv->search_revealer, FALSE);
   gtk_source_search_context_set_highlight (frame->priv->search_context, FALSE);
 
+  g_signal_emit (frame, gSignals [FOCUSED], 0);
+
   return GDK_EVENT_PROPAGATE;
 }
 
@@ -817,6 +825,17 @@ gb_editor_frame_class_init (GbEditorFrameClass *klass)
   g_object_class_install_property (object_class, PROP_DOCUMENT,
                                    gParamSpecs [PROP_DOCUMENT]);
 
+  gSignals [FOCUSED] =
+    g_signal_new ("focused",
+                  GB_TYPE_EDITOR_FRAME,
+                  G_SIGNAL_RUN_LAST,
+                  0,
+                  NULL,
+                  NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE,
+                  0);
+
   gtk_widget_class_set_template_from_resource (widget_class,
                                                "/org/gnome/builder/ui/gb-editor-frame.ui");
   gtk_widget_class_bind_template_child_private (widget_class, GbEditorFrame, busy_spinner);
diff --git a/src/editor/gb-editor-tab.c b/src/editor/gb-editor-tab.c
index 47f5796..f9fabf4 100644
--- a/src/editor/gb-editor-tab.c
+++ b/src/editor/gb-editor-tab.c
@@ -24,10 +24,15 @@
 
 struct _GbEditorTabPrivate
 {
+  /* Widgets owned by GtkBuilder */
   GbEditorFrame    *frame;
   GtkPaned         *paned;
   GtkToggleButton  *split_button;
 
+  /* Weak references */
+  GbEditorFrame    *last_frame;
+
+  /* Objects owned by GbEditorTab */
   GbEditorDocument *document;
 };
 
@@ -42,6 +47,32 @@ G_DEFINE_TYPE_WITH_PRIVATE (GbEditorTab, gb_editor_tab, GB_TYPE_TAB)
 static GParamSpec *gParamSpecs [LAST_PROP];
 
 static void
+gb_editor_tab_on_frame_focused (GbEditorTab   *tab,
+                                GbEditorFrame *frame)
+{
+  GbEditorTabPrivate *priv;
+
+  g_return_if_fail (GB_IS_EDITOR_TAB (tab));
+  g_return_if_fail (GB_IS_EDITOR_FRAME (frame));
+
+  priv = tab->priv;
+
+  if (priv->last_frame)
+    {
+      g_object_remove_weak_pointer (G_OBJECT (priv->last_frame),
+                                    (gpointer *)&priv->last_frame);
+      priv->last_frame = NULL;
+    }
+
+  if (frame)
+    {
+      priv->last_frame = frame;
+      g_object_add_weak_pointer (G_OBJECT (priv->last_frame),
+                                  (gpointer *)&priv->last_frame);
+    }
+}
+
+static void
 gb_editor_tab_on_split_toggled (GbEditorTab     *tab,
                                 GtkToggleButton *button)
 {
@@ -69,6 +100,12 @@ gb_editor_tab_on_split_toggled (GbEditorTab     *tab,
                                "resize", TRUE,
                                "shrink", FALSE,
                                NULL);
+      g_signal_connect_object (child2,
+                               "focused",
+                               G_CALLBACK (gb_editor_tab_on_frame_focused),
+                               tab,
+                               G_CONNECT_SWAPPED);
+      gtk_widget_grab_focus (child2);
     }
 }
 
@@ -77,7 +114,8 @@ gb_editor_tab_get_last_frame (GbEditorTab *tab)
 {
   g_return_val_if_fail (GB_IS_EDITOR_TAB (tab), NULL);
 
-  /* TODO: track the frame */
+  if (tab->priv->last_frame)
+    return tab->priv->last_frame;
 
   return tab->priv->frame;
 }
@@ -110,6 +148,12 @@ gb_editor_tab_constructed (GObject *object)
                                  NULL);
   gb_editor_frame_set_document (priv->frame, priv->document);
 
+  g_signal_connect_object (priv->frame,
+                           "focused",
+                           G_CALLBACK (gb_editor_tab_on_frame_focused),
+                           tab,
+                           G_CONNECT_SWAPPED);
+
   g_signal_connect_object (priv->split_button,
                            "toggled",
                            G_CALLBACK (gb_editor_tab_on_split_toggled),
diff --git a/src/editor/gb-editor-workspace.c b/src/editor/gb-editor-workspace.c
index 3b00bb0..604bd5e 100644
--- a/src/editor/gb-editor-workspace.c
+++ b/src/editor/gb-editor-workspace.c
@@ -64,6 +64,7 @@ new_tab (GSimpleAction *action,
                       NULL);
   gtk_container_add (GTK_CONTAINER (workspace->priv->tab_grid),
                      GTK_WIDGET (tab));
+  gtk_widget_grab_focus (GTK_WIDGET (tab));
 }
 
 static GActionGroup *


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]