Commit 77aa1b76 authored by Christian Hergert's avatar Christian Hergert

prefs: move preferences to an external window

This moves the preferences to an external window instead of
using a perspective within the parent window. This useful for
couple of reasons:

 * It allows us to use the preferences outside of the workbench
   such as during the greeter phase.
 * It allows us to destroy widgets when they aren't visible.
   There are lots created in preferences, so this is a sort of
   nice thing from a memory usage standpoint.
 * Reduce the time it takes to open a project since it would
   add the preferences as part of that phase.
parent ca72147c
......@@ -31,9 +31,10 @@
#include "application/ide-application-actions.h"
#include "application/ide-application-credits.h"
#include "application/ide-application-private.h"
#include "greeter/ide-greeter-perspective.h"
#include "keybindings/ide-shortcuts-window.h"
#include "preferences/ide-preferences-perspective.h"
#include "workbench/ide-workbench.h"
#include "greeter/ide-greeter-perspective.h"
#include "util/ide-flatpak.h"
static void
......@@ -42,35 +43,55 @@ ide_application_actions_preferences (GSimpleAction *action,
gpointer user_data)
IdeApplication *self = user_data;
IdePreferencesPerspective *perspective;
GList *windows;
GtkWindow *toplevel = NULL;
GtkWindow *window;
g_assert (G_IS_SIMPLE_ACTION (action));
g_assert (IDE_IS_APPLICATION (self));
* TODO: Make this work at the greeter screen too.
/* Locate a toplevel for a transient-for property, or a previous
* preferences window to display.
windows = gtk_application_get_windows (GTK_APPLICATION (self));
for (; windows; windows = windows->next)
for (; windows != NULL; windows = windows->next)
GtkWindow *window = windows->data;
const gchar *name;
GtkWindow *ele = windows->data;
if (!IDE_IS_WORKBENCH (window))
name = ide_workbench_get_visible_perspective_name (IDE_WORKBENCH (window));
if (!ide_str_equal0 (name, "greeter") && !ide_str_equal0 (name, "genesis"))
if (g_object_get_data (G_OBJECT (ele), "PREFERENCES"))
ide_workbench_set_visible_perspective_name (IDE_WORKBENCH (window), "preferences");
gtk_window_present (ele);
if (toplevel == NULL && IDE_IS_WORKBENCH (ele))
toplevel = ele;
/* Create a new window for preferences, with enough space for
* 2 columns of preferences. The window manager will automatically
* maximize the window if necessary.
window = g_object_new (GTK_TYPE_WINDOW,
"transient-for", toplevel,
"title", _("Preferences"),
"default-width", 1300,
"default-height", 800,
"window-position", GTK_WIN_POS_CENTER_ON_PARENT,
g_object_set_data (G_OBJECT (window), "PREFERENCES", "1");
gtk_application_add_window (GTK_APPLICATION (self), window);
perspective = g_object_new (IDE_TYPE_PREFERENCES_PERSPECTIVE,
"visible", TRUE,
gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (perspective));
gtk_window_present (GTK_WINDOW (window));
......@@ -425,31 +446,7 @@ ide_application_actions_init (IdeApplication *self)
ide_application_actions_update (IdeApplication *self)
GList *windows;
GAction *action;
gboolean enabled;
g_assert (IDE_IS_APPLICATION (self));
* We only enable the preferences action if we have a workbench open
* that is past the greeter.
action = g_action_map_lookup_action (G_ACTION_MAP (self), "preferences");
enabled = FALSE;
for (windows = gtk_application_get_windows (GTK_APPLICATION (self));
windows != NULL;
windows = windows->next)
GtkWindow *window = windows->data;
if (IDE_IS_WORKBENCH (window) &&
!ide_str_equal0 ("greeter",
ide_workbench_get_visible_perspective_name (IDE_WORKBENCH (window))))
enabled = TRUE;
g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled);
/* Nothing to do currently */
......@@ -46,6 +46,14 @@ _ide_application_init_shortcuts (IdeApplication *self)
dzl_shortcut_theme_set_accel_for_action (theme, "", "F1", DZL_SHORTCUT_PHASE_DISPATCH);
dzl_shortcut_manager_add_action (manager,
NC_("shortcut window", "Workbench shortcuts"),
NC_("shortcut window", "Preferences"),
NC_("shortcut window", "Show the preferences window"),
dzl_shortcut_theme_set_accel_for_action (theme, "app.preferences", "<Primary>comma", DZL_SHORTCUT_PHASE_DISPATCH);
dzl_shortcut_manager_add_action (manager,
NC_("shortcut window", "Workbench shortcuts"),
......@@ -53,15 +53,6 @@
<attribute name="target">buildperspective</attribute>
<attribute name="verb-icon-name">builder-build-configure-symbolic</attribute>
<attribute name="accel">&lt;primary&gt;comma</attribute>
<attribute name="action">win.perspective</attribute>
<attribute name="id">perspective-menu-prefs</attribute>
<attribute name="label" translatable="yes">Preferences</attribute>
<attribute name="role">normal</attribute>
<attribute name="target">preferences</attribute>
<attribute name="verb-icon-name">preferences-system-symbolic</attribute>
<menu id="gear-menu">
......@@ -675,14 +675,6 @@ ide_workbench_set_context (IdeWorkbench *self,
peas_extension_set_foreach (self->addins, ide_workbench_addin_added, self);
/* We wait to add the preferences perspective until we have a valid
* IdeContext for them to potentially use.
ide_workbench_add_perspective (self,
"visible", TRUE,
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_CONTEXT]);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment