[gnome-builder] grid: try a little harder to track the last focus stack.
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] grid: try a little harder to track the last focus stack.
- Date: Fri, 6 Feb 2015 18:35:44 +0000 (UTC)
commit 5eebae6247156e5be71524d02db6ed5df143015d
Author: Christian Hergert <christian hergert me>
Date: Fri Feb 6 10:26:16 2015 -0800
grid: try a little harder to track the last focus stack.
src/documents/gb-document-grid.c | 78 ++++++++++++++++++++++++++++++++++++++
1 files changed, 78 insertions(+), 0 deletions(-)
---
diff --git a/src/documents/gb-document-grid.c b/src/documents/gb-document-grid.c
index 2bfdc8f..a54bd8d 100644
--- a/src/documents/gb-document-grid.c
+++ b/src/documents/gb-document-grid.c
@@ -27,6 +27,7 @@
struct _GbDocumentGridPrivate
{
GbDocumentManager *document_manager;
+ GbDocumentStack *last_focus;
};
G_DEFINE_TYPE_WITH_PRIVATE (GbDocumentGrid, gb_document_grid, GTK_TYPE_BIN)
@@ -763,6 +764,12 @@ gb_document_grid_grab_focus (GtkWidget *widget)
g_return_if_fail (GB_IS_DOCUMENT_GRID (grid));
+ if (grid->priv->last_focus)
+ {
+ gtk_widget_grab_focus (GTK_WIDGET (grid->priv->last_focus));
+ return;
+ }
+
stacks = gb_document_grid_get_stacks (grid);
if (stacks)
gtk_widget_grab_focus (stacks->data);
@@ -770,6 +777,69 @@ gb_document_grid_grab_focus (GtkWidget *widget)
}
static void
+gb_document_grid_toplevel_set_focus (GtkWidget *toplevel,
+ GtkWidget *focus,
+ GbDocumentGrid *self)
+{
+ GbDocumentGridPrivate *priv;
+
+ g_return_if_fail (GB_IS_DOCUMENT_GRID (self));
+
+ priv = self->priv;
+
+ if (focus && gtk_widget_is_ancestor (focus, GTK_WIDGET (self)))
+ {
+ GtkWidget *parent = focus;
+
+ while (parent && !GB_IS_DOCUMENT_STACK (parent))
+ parent = gtk_widget_get_parent (parent);
+
+ if (GB_IS_DOCUMENT_STACK (parent))
+ {
+ if (priv->last_focus)
+ {
+ g_object_remove_weak_pointer (G_OBJECT (priv->last_focus),
+ (gpointer *)&priv->last_focus);
+ priv->last_focus = NULL;
+ }
+
+ priv->last_focus = GB_DOCUMENT_STACK (focus);
+ g_object_add_weak_pointer (G_OBJECT (priv->last_focus),
+ (gpointer *)&priv->last_focus);
+ }
+ }
+}
+
+static void
+gb_document_grid_parent_set (GtkWidget *widget,
+ GtkWidget *previous_parent)
+{
+ GbDocumentGrid *self = (GbDocumentGrid *)widget;
+ GtkWidget *toplevel;
+
+ g_return_if_fail (GB_IS_DOCUMENT_GRID (self));
+
+ if (previous_parent)
+ {
+ toplevel = gtk_widget_get_toplevel (previous_parent);
+ if (toplevel)
+ g_signal_handlers_disconnect_by_func (previous_parent,
+ G_CALLBACK (gb_document_grid_toplevel_set_focus),
+ toplevel);
+ }
+
+ toplevel = gtk_widget_get_toplevel (widget);
+
+ if (GTK_IS_WINDOW (toplevel))
+ {
+ g_signal_connect (toplevel,
+ "set-focus",
+ G_CALLBACK (gb_document_grid_toplevel_set_focus),
+ widget);
+ }
+}
+
+static void
gb_document_grid_get_property (GObject *object,
guint prop_id,
GValue *value,
@@ -812,6 +882,13 @@ gb_document_grid_finalize (GObject *object)
{
GbDocumentGridPrivate *priv = GB_DOCUMENT_GRID (object)->priv;
+ if (priv->last_focus)
+ {
+ g_object_remove_weak_pointer (G_OBJECT (priv->last_focus),
+ (gpointer *)&priv->last_focus);
+ priv->last_focus = NULL;
+ }
+
g_clear_object (&priv->document_manager);
G_OBJECT_CLASS (gb_document_grid_parent_class)->finalize (object);
@@ -828,6 +905,7 @@ gb_document_grid_class_init (GbDocumentGridClass *klass)
object_class->set_property = gb_document_grid_set_property;
widget_class->grab_focus = gb_document_grid_grab_focus;
+ widget_class->parent_set = gb_document_grid_parent_set;
/**
* GbDocumentGrid:document-manager:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]