[gnome-shell] Create ShellGlobal later to avoid connecting to X during build
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] Create ShellGlobal later to avoid connecting to X during build
- Date: Mon, 17 May 2010 17:04:49 +0000 (UTC)
commit 84716bccd489f24f8cbd651880eda63580853987
Author: Colin Walters <walters verbum org>
Date: Tue May 11 10:35:27 2010 -0400
Create ShellGlobal later to avoid connecting to X during build
The ShellGlobal initialization performs several actions like connecting
to the X server, ensuring directories exist, etc., that are problematic
because we were creating the object even when running the binary for
introspection scanning. During compilation we may not even have X11
available in e.g. autobuilder type environments, and it's just a
bad idea to connect even if we do.
Avoid this by deferring creation of the ShellGlobal object
until the plugin is actually started.
Now that we're initializing things later, remove the connection to
screen changes, and initialize cached ShellGlobal state at the point
when the plugin is set. The root pixmap actor is now sized initially
on creation too. Instead of relying on screen-size-changed being
emitted on startup, explicitly invoke _relayout().
https://bugzilla.gnome.org/show_bug.cgi?id=618371
js/ui/main.js | 3 ++
src/gnome-shell-plugin.c | 9 ++++--
src/shell-global.c | 67 +++++++++++++++++++++++----------------------
3 files changed, 43 insertions(+), 36 deletions(-)
---
diff --git a/js/ui/main.js b/js/ui/main.js
index 879020e..2d0746a 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -167,6 +167,9 @@ function start() {
// Install magnifier.
magnifier = new Magnifier.Magnifier();
+ // Perform initial relayout here
+ _relayout();
+
_log('info', 'loaded at ' + _startDate);
log('GNOME Shell started at ' + _startDate);
diff --git a/src/gnome-shell-plugin.c b/src/gnome-shell-plugin.c
index 23d016e..83942be 100644
--- a/src/gnome-shell-plugin.c
+++ b/src/gnome-shell-plugin.c
@@ -140,8 +140,6 @@ gnome_shell_plugin_class_init (GnomeShellPluginClass *klass)
static void
gnome_shell_plugin_init (GnomeShellPlugin *shell_plugin)
{
- _shell_global_set_plugin (shell_global_get(), MUTTER_PLUGIN(shell_plugin));
-
meta_prefs_override_preference_location ("/apps/metacity/general/button_layout",
"/desktop/gnome/shell/windows/button_layout");
}
@@ -245,6 +243,7 @@ gnome_shell_plugin_start (MutterPlugin *plugin)
int status;
const char *shell_js;
char **search_path;
+ ShellGlobal *global;
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
@@ -275,7 +274,11 @@ gnome_shell_plugin_start (MutterPlugin *plugin)
shell_plugin->gjs_context = gjs_context_new_with_search_path(search_path);
g_strfreev(search_path);
- _shell_global_set_gjs_context (shell_global_get (), shell_plugin->gjs_context);
+ /* Initialize the global object here. */
+ global = shell_global_get ();
+
+ _shell_global_set_plugin (global, MUTTER_PLUGIN(shell_plugin));
+ _shell_global_set_gjs_context (global, shell_plugin->gjs_context);
if (!gjs_context_eval (shell_plugin->gjs_context,
"const Main = imports.ui.main; Main.start();",
diff --git a/src/shell-global.c b/src/shell-global.c
index 59db203..758af54 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -436,24 +436,33 @@ shell_global_get_windows (ShellGlobal *global)
}
static gboolean
-on_screen_size_changed_cb (gpointer data)
+update_screen_size (ShellGlobal *global)
{
- ShellGlobal *global = SHELL_GLOBAL (data);
-
int width, height;
mutter_plugin_query_screen_size (global->plugin, &width, &height);
- if (global->last_change_screen_width != width || global->last_change_screen_height != height)
- {
- g_signal_emit (G_OBJECT (global), shell_global_signals[SCREEN_SIZE_CHANGED], 0);
- global->last_change_screen_width = width;
- global->last_change_screen_height = height;
+ if (global->last_change_screen_width == width && global->last_change_screen_height == height)
+ return FALSE;
- /* update size of background actor to fix tiled backgrounds */
- clutter_actor_set_size (CLUTTER_ACTOR (global->root_pixmap),
- width, height);
- }
+ global->last_change_screen_width = width;
+ global->last_change_screen_height = height;
+
+ /* update size of background actor to fix tiled backgrounds */
+ if (global->root_pixmap)
+ clutter_actor_set_size (CLUTTER_ACTOR (global->root_pixmap),
+ width, height);
+
+ return TRUE;
+}
+
+static gboolean
+on_screen_size_changed_cb (gpointer data)
+{
+ ShellGlobal *global = SHELL_GLOBAL (data);
+
+ if (update_screen_size (global))
+ g_signal_emit (G_OBJECT (global), shell_global_signals[SCREEN_SIZE_CHANGED], 0);
return FALSE;
}
@@ -488,37 +497,25 @@ global_stage_notify_height (GObject *gobject,
NULL);
}
-static void
-global_plugin_notify_screen (GObject *gobject,
- GParamSpec *pspec,
- gpointer data)
-{
- ShellGlobal *global = SHELL_GLOBAL (data);
- ClutterActor *stage = mutter_plugin_get_stage (MUTTER_PLUGIN (gobject));
-
- g_signal_connect (stage, "notify::width",
- G_CALLBACK (global_stage_notify_width), global);
- g_signal_connect (stage, "notify::height",
- G_CALLBACK (global_stage_notify_height), global);
-}
-
void
_shell_global_set_plugin (ShellGlobal *global,
MutterPlugin *plugin)
{
+ ClutterActor *stage;
+
g_return_if_fail (SHELL_IS_GLOBAL (global));
g_return_if_fail (global->plugin == NULL);
global->plugin = plugin;
global->wm = shell_wm_new (plugin);
- /* At this point screen is NULL, so we can't yet do signal connections
- * to the width and height; we wait until the screen property is set
- * to do that. Note that this is a one time thing - screen will never
- * change once first set.
- */
- g_signal_connect (plugin, "notify::screen",
- G_CALLBACK (global_plugin_notify_screen), global);
+ stage = mutter_plugin_get_stage (plugin);
+
+ g_signal_connect (stage, "notify::width",
+ G_CALLBACK (global_stage_notify_width), global);
+ g_signal_connect (stage, "notify::height",
+ G_CALLBACK (global_stage_notify_height), global);
+ update_screen_size (global);
}
void
@@ -1023,6 +1020,10 @@ shell_global_create_root_pixmap_actor (ShellGlobal *global)
{
global->root_pixmap = clutter_glx_texture_pixmap_new ();
+ clutter_actor_set_size (CLUTTER_ACTOR (global->root_pixmap),
+ global->last_change_screen_width,
+ global->last_change_screen_height);
+
clutter_texture_set_repeat (CLUTTER_TEXTURE (global->root_pixmap),
TRUE, TRUE);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]