[gnome-shell] Handle resolution changes
- From: Maxim Ermilov <mermilov src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-shell] Handle resolution changes
- Date: Tue, 19 Jan 2010 18:30:23 +0000 (UTC)
commit d9008054cf0a1a8823b4d5f73d1b5b0d5d52c4db
Author: Maxim Ermilov <zaspire rambler ru>
Date: Tue Jan 19 20:59:29 2010 +0300
Handle resolution changes
Added signal 'screen-size-changed' to ShellGlobal.
Connect to this signal in main.js and run the _relayout() method.
If Overview or calendar are visible when this signal emit, they will be hiding.
https://bugzilla.gnome.org/show_bug.cgi?id=584526
js/ui/main.js | 8 ++++
js/ui/overview.js | 2 +
js/ui/panel.js | 8 ++++
src/shell-global.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++-
src/shell-global.h | 1 +
5 files changed, 114 insertions(+), 1 deletions(-)
---
diff --git a/js/ui/main.js b/js/ui/main.js
index f8c95b3..81ab672 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -135,6 +135,7 @@ function start() {
});
_relayout();
+ global.connect('screen-size-changed', _relayout);
ExtensionSystem.init();
ExtensionSystem.loadExtensions();
@@ -199,6 +200,13 @@ function _relayout() {
panel.actor.set_position(primary.x, primary.y);
panel.actor.set_size(primary.width, Panel.PANEL_HEIGHT);
overview.relayout();
+
+ // To avoid updating the position and size of the workspaces
+ // in the overview, we just hide the overview. The positions
+ // will be updated when it is next shown. We do the same for
+ // the calendar popdown.
+ overview.hide();
+ panel.hideCalendar();
}
// metacity-clutter currently uses the same prefs as plain metacity,
diff --git a/js/ui/overview.js b/js/ui/overview.js
index 6281dbf..2d41a43 100644
--- a/js/ui/overview.js
+++ b/js/ui/overview.js
@@ -158,6 +158,8 @@ Overview.prototype = {
relayout: function () {
let primary = global.get_primary_monitor();
+ this._recalculateGridSizes();
+
this._group.set_position(primary.x, primary.y);
let contentY = Panel.PANEL_HEIGHT;
diff --git a/js/ui/panel.js b/js/ui/panel.js
index 510a328..24e9704 100644
--- a/js/ui/panel.js
+++ b/js/ui/panel.js
@@ -398,6 +398,7 @@ Panel.prototype = {
this._clock = new St.Label();
clockButton.set_child(this._clock);
+ this._clockButton = clockButton;
this._calendarPopup = null;
@@ -485,6 +486,13 @@ Panel.prototype = {
this._updateClock();
},
+ hideCalendar: function() {
+ if (this._calendarPopup != null) {
+ this._clockButton.checked = false;
+ this._calendarPopup.actor.hide();
+ }
+ },
+
startupAnimation: function() {
this.actor.y = -this.actor.height;
Tweener.addTween(this.actor,
diff --git a/src/shell-global.c b/src/shell-global.c
index 680e746..71600ad 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -6,6 +6,7 @@
#include "shell-wm.h"
#include "display.h"
+#include "util.h"
#include <clutter/glx/clutter-glx.h>
#include <clutter/x11/clutter-x11.h>
#include <gdk/gdkx.h>
@@ -17,7 +18,6 @@
#include <unistd.h>
#include <dbus/dbus-glib.h>
#include <gio/gio.h>
-#include <glib/gi18n-lib.h>
#include <math.h>
#include <X11/extensions/Xfixes.h>
#include <gjs/gjs.h>
@@ -53,6 +53,8 @@ struct _ShellGlobal {
/* Displays the root window; see shell_global_create_root_pixmap_actor() */
ClutterActor *root_pixmap;
+
+ gint last_change_screen_width, last_change_screen_height;
};
enum {
@@ -75,6 +77,7 @@ enum
{
PANEL_RUN_DIALOG,
PANEL_MAIN_MENU,
+ SCREEN_SIZE_CHANGED,
LAST_SIGNAL
};
@@ -189,6 +192,9 @@ shell_global_init (ShellGlobal *global)
global->root_pixmap = NULL;
global->input_mode = SHELL_STAGE_INPUT_MODE_NORMAL;
+
+ global->last_change_screen_width = 0;
+ global->last_change_screen_height = 0;
}
static void
@@ -217,6 +223,15 @@ shell_global_class_init (ShellGlobalClass *klass)
g_cclosure_marshal_VOID__INT,
G_TYPE_NONE, 1, G_TYPE_INT);
+ shell_global_signals[SCREEN_SIZE_CHANGED] =
+ g_signal_new ("screen-size-changed",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (ShellGlobalClass, screen_size_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
g_object_class_install_property (gobject_class,
PROP_OVERLAY_GROUP,
g_param_spec_object ("overlay-group",
@@ -441,6 +456,77 @@ shell_global_get_windows (ShellGlobal *global)
return mutter_plugin_get_windows (global->plugin);
}
+static gboolean
+emit_screen_size_changed_cb (gpointer data)
+{
+ 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;
+ }
+
+ return FALSE;
+}
+
+static void
+global_stage_notify_width (GObject *gobject,
+ GParamSpec *pspec,
+ gpointer data)
+{
+ ShellGlobal *global = SHELL_GLOBAL (data);
+ ClutterActor *stage = CLUTTER_ACTOR (gobject);
+
+ if (global->root_pixmap)
+ clutter_actor_set_width (CLUTTER_ACTOR (global->root_pixmap),
+ clutter_actor_get_width (stage));
+ g_object_notify (G_OBJECT (global), "screen-width");
+
+ meta_later_add (META_LATER_BEFORE_REDRAW,
+ emit_screen_size_changed_cb,
+ global,
+ NULL);
+}
+
+static void
+global_stage_notify_height (GObject *gobject,
+ GParamSpec *pspec,
+ gpointer data)
+{
+ ShellGlobal *global = SHELL_GLOBAL (data);
+ ClutterActor *stage = CLUTTER_ACTOR (gobject);
+
+ if (global->root_pixmap)
+ clutter_actor_set_height (CLUTTER_ACTOR (global->root_pixmap),
+ clutter_actor_get_height (stage));
+ g_object_notify (G_OBJECT (global), "screen-height");
+
+ meta_later_add (META_LATER_BEFORE_REDRAW,
+ emit_screen_size_changed_cb,
+ global,
+ 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)
@@ -450,6 +536,14 @@ _shell_global_set_plugin (ShellGlobal *global,
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);
}
void
diff --git a/src/shell-global.h b/src/shell-global.h
index 12ebf50..e59de70 100644
--- a/src/shell-global.h
+++ b/src/shell-global.h
@@ -30,6 +30,7 @@ struct _ShellGlobalClass
int timestamp);
void (*panel_main_menu) (ShellGlobal *global,
int timestamp);
+ void (*screen_size_changed) (ShellGlobal *global);
};
GType shell_global_get_type (void) G_GNUC_CONST;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]