[gnome-builder/wip/greeter] greeter: enable new-project action with improved window stacking



commit 2ecf80093b43b77106ad1d20b048aabf80649491
Author: Christian Hergert <christian hergert me>
Date:   Sun May 10 17:04:21 2015 -0700

    greeter: enable new-project action with improved window stacking

 data/ui/gb-greeter-window.ui     |    1 +
 src/app/gb-application-actions.c |   26 +++++++++++++++++++++++++-
 src/app/gb-application-private.h |    1 +
 src/app/gb-application.c         |    3 +++
 4 files changed, 30 insertions(+), 1 deletions(-)
---
diff --git a/data/ui/gb-greeter-window.ui b/data/ui/gb-greeter-window.ui
index 3a0e000..d0651d0 100644
--- a/data/ui/gb-greeter-window.ui
+++ b/data/ui/gb-greeter-window.ui
@@ -11,6 +11,7 @@
         <property name="visible">true</property>
         <child>
           <object class="GtkButton">
+            <property name="action-name">app.new-project</property>
             <property name="visible">true</property>
             <property name="label" translatable="yes">_New</property>
             <property name="use-underline">true</property>
diff --git a/src/app/gb-application-actions.c b/src/app/gb-application-actions.c
index 9aa5749..e180921 100644
--- a/src/app/gb-application-actions.c
+++ b/src/app/gb-application-actions.c
@@ -27,6 +27,7 @@
 #include "gb-application-actions.h"
 #include "gb-application-credits.h"
 #include "gb-application-private.h"
+#include "gb-greeter-window.h"
 #include "gb-new-project-dialog.h"
 #include "gb-support.h"
 #include "gb-workbench.h"
@@ -225,13 +226,32 @@ gb_application_actions_new_project (GSimpleAction *action,
                                     gpointer       user_data)
 {
   GbApplication *self = user_data;
+  GtkWindow *transient_for = NULL;
   GtkWindow *window;
+  GList *windows;
 
   g_assert (GB_IS_APPLICATION (self));
 
+  for (windows = gtk_window_group_list_windows (self->greeter_group);
+       windows;
+       windows = windows->next)
+    {
+      if (GB_IS_NEW_PROJECT_DIALOG (windows->data))
+        {
+          gtk_window_present (windows->data);
+          goto cleanup;
+        }
+      else if (GB_IS_GREETER_WINDOW (windows->data))
+        {
+          transient_for = windows->data;
+        }
+    }
+
   window = g_object_new (GB_TYPE_NEW_PROJECT_DIALOG,
                          "type-hint", GDK_WINDOW_TYPE_HINT_DIALOG,
-                         "window-position", GTK_WIN_POS_CENTER,
+                         "transient-for", transient_for,
+                         "window-position", transient_for ? GTK_WIN_POS_CENTER_ON_PARENT
+                                                          : GTK_WIN_POS_CENTER,
                          NULL);
 
   g_signal_connect_object (window,
@@ -240,7 +260,11 @@ gb_application_actions_new_project (GSimpleAction *action,
                            self,
                            G_CONNECT_SWAPPED);
 
+  gtk_window_group_add_window (self->greeter_group, GTK_WINDOW (window));
   gtk_window_present (window);
+
+cleanup:
+  g_list_free (windows);
 }
 
 static const GActionEntry GbApplicationActions[] = {
diff --git a/src/app/gb-application-private.h b/src/app/gb-application-private.h
index c4b9e0d..9ee7865 100644
--- a/src/app/gb-application-private.h
+++ b/src/app/gb-application-private.h
@@ -36,6 +36,7 @@ struct _GbApplication
   GbKeybindings       *keybindings;
   GbPreferencesWindow *preferences_window;
   IdeRecentProjects   *recent_projects;
+  GtkWindowGroup      *greeter_group;
 };
 
 
diff --git a/src/app/gb-application.c b/src/app/gb-application.c
index a0a74fc..388d62e 100644
--- a/src/app/gb-application.c
+++ b/src/app/gb-application.c
@@ -456,6 +456,7 @@ gb_application_show_projects_window (GbApplication *self)
                          "application", self,
                          "recent-projects", self->recent_projects,
                          NULL);
+  gtk_window_group_add_window (self->greeter_group, GTK_WINDOW (window));
   gtk_window_present (GTK_WINDOW (window));
 }
 
@@ -479,6 +480,7 @@ gb_application_startup (GApplication *app)
   g_assert (GB_IS_APPLICATION (self));
 
   self->started_at = g_date_time_new_now_utc ();
+  self->greeter_group = gtk_window_group_new ();
 
   g_resources_register (gb_get_resource ());
   g_application_set_resource_base_path (app, "/org/gnome/builder");
@@ -532,6 +534,7 @@ gb_application_finalize (GObject *object)
   g_clear_pointer (&self->started_at, g_date_time_unref);
   g_clear_object (&self->keybindings);
   g_clear_object (&self->recent_projects);
+  g_clear_object (&self->greeter_group);
 
   G_OBJECT_CLASS (gb_application_parent_class)->finalize (object);
 


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