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
This commit is contained in:
parent
b10d9c9ad7
commit
d9008054cf
@ -135,6 +135,7 @@ function start() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
_relayout();
|
_relayout();
|
||||||
|
global.connect('screen-size-changed', _relayout);
|
||||||
|
|
||||||
ExtensionSystem.init();
|
ExtensionSystem.init();
|
||||||
ExtensionSystem.loadExtensions();
|
ExtensionSystem.loadExtensions();
|
||||||
@ -199,6 +200,13 @@ function _relayout() {
|
|||||||
panel.actor.set_position(primary.x, primary.y);
|
panel.actor.set_position(primary.x, primary.y);
|
||||||
panel.actor.set_size(primary.width, Panel.PANEL_HEIGHT);
|
panel.actor.set_size(primary.width, Panel.PANEL_HEIGHT);
|
||||||
overview.relayout();
|
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,
|
// metacity-clutter currently uses the same prefs as plain metacity,
|
||||||
|
@ -158,6 +158,8 @@ Overview.prototype = {
|
|||||||
relayout: function () {
|
relayout: function () {
|
||||||
let primary = global.get_primary_monitor();
|
let primary = global.get_primary_monitor();
|
||||||
|
|
||||||
|
this._recalculateGridSizes();
|
||||||
|
|
||||||
this._group.set_position(primary.x, primary.y);
|
this._group.set_position(primary.x, primary.y);
|
||||||
|
|
||||||
let contentY = Panel.PANEL_HEIGHT;
|
let contentY = Panel.PANEL_HEIGHT;
|
||||||
|
@ -398,6 +398,7 @@ Panel.prototype = {
|
|||||||
|
|
||||||
this._clock = new St.Label();
|
this._clock = new St.Label();
|
||||||
clockButton.set_child(this._clock);
|
clockButton.set_child(this._clock);
|
||||||
|
this._clockButton = clockButton;
|
||||||
|
|
||||||
this._calendarPopup = null;
|
this._calendarPopup = null;
|
||||||
|
|
||||||
@ -485,6 +486,13 @@ Panel.prototype = {
|
|||||||
this._updateClock();
|
this._updateClock();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
hideCalendar: function() {
|
||||||
|
if (this._calendarPopup != null) {
|
||||||
|
this._clockButton.checked = false;
|
||||||
|
this._calendarPopup.actor.hide();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
startupAnimation: function() {
|
startupAnimation: function() {
|
||||||
this.actor.y = -this.actor.height;
|
this.actor.y = -this.actor.height;
|
||||||
Tweener.addTween(this.actor,
|
Tweener.addTween(this.actor,
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "shell-wm.h"
|
#include "shell-wm.h"
|
||||||
|
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
|
#include "util.h"
|
||||||
#include <clutter/glx/clutter-glx.h>
|
#include <clutter/glx/clutter-glx.h>
|
||||||
#include <clutter/x11/clutter-x11.h>
|
#include <clutter/x11/clutter-x11.h>
|
||||||
#include <gdk/gdkx.h>
|
#include <gdk/gdkx.h>
|
||||||
@ -17,7 +18,6 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <dbus/dbus-glib.h>
|
#include <dbus/dbus-glib.h>
|
||||||
#include <gio/gio.h>
|
#include <gio/gio.h>
|
||||||
#include <glib/gi18n-lib.h>
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <X11/extensions/Xfixes.h>
|
#include <X11/extensions/Xfixes.h>
|
||||||
#include <gjs/gjs.h>
|
#include <gjs/gjs.h>
|
||||||
@ -53,6 +53,8 @@ struct _ShellGlobal {
|
|||||||
|
|
||||||
/* Displays the root window; see shell_global_create_root_pixmap_actor() */
|
/* Displays the root window; see shell_global_create_root_pixmap_actor() */
|
||||||
ClutterActor *root_pixmap;
|
ClutterActor *root_pixmap;
|
||||||
|
|
||||||
|
gint last_change_screen_width, last_change_screen_height;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -75,6 +77,7 @@ enum
|
|||||||
{
|
{
|
||||||
PANEL_RUN_DIALOG,
|
PANEL_RUN_DIALOG,
|
||||||
PANEL_MAIN_MENU,
|
PANEL_MAIN_MENU,
|
||||||
|
SCREEN_SIZE_CHANGED,
|
||||||
LAST_SIGNAL
|
LAST_SIGNAL
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -189,6 +192,9 @@ shell_global_init (ShellGlobal *global)
|
|||||||
global->root_pixmap = NULL;
|
global->root_pixmap = NULL;
|
||||||
|
|
||||||
global->input_mode = SHELL_STAGE_INPUT_MODE_NORMAL;
|
global->input_mode = SHELL_STAGE_INPUT_MODE_NORMAL;
|
||||||
|
|
||||||
|
global->last_change_screen_width = 0;
|
||||||
|
global->last_change_screen_height = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -217,6 +223,15 @@ shell_global_class_init (ShellGlobalClass *klass)
|
|||||||
g_cclosure_marshal_VOID__INT,
|
g_cclosure_marshal_VOID__INT,
|
||||||
G_TYPE_NONE, 1, G_TYPE_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,
|
g_object_class_install_property (gobject_class,
|
||||||
PROP_OVERLAY_GROUP,
|
PROP_OVERLAY_GROUP,
|
||||||
g_param_spec_object ("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);
|
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
|
void
|
||||||
_shell_global_set_plugin (ShellGlobal *global,
|
_shell_global_set_plugin (ShellGlobal *global,
|
||||||
MutterPlugin *plugin)
|
MutterPlugin *plugin)
|
||||||
@ -450,6 +536,14 @@ _shell_global_set_plugin (ShellGlobal *global,
|
|||||||
|
|
||||||
global->plugin = plugin;
|
global->plugin = plugin;
|
||||||
global->wm = shell_wm_new (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
|
void
|
||||||
|
@ -30,6 +30,7 @@ struct _ShellGlobalClass
|
|||||||
int timestamp);
|
int timestamp);
|
||||||
void (*panel_main_menu) (ShellGlobal *global,
|
void (*panel_main_menu) (ShellGlobal *global,
|
||||||
int timestamp);
|
int timestamp);
|
||||||
|
void (*screen_size_changed) (ShellGlobal *global);
|
||||||
};
|
};
|
||||||
|
|
||||||
GType shell_global_get_type (void) G_GNUC_CONST;
|
GType shell_global_get_type (void) G_GNUC_CONST;
|
||||||
|
Loading…
Reference in New Issue
Block a user