[gnome-builder/editor-layout] track last focus frame
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/editor-layout] track last focus frame
- Date: Sun, 30 Nov 2014 08:28:38 +0000 (UTC)
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]