Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock

Please allow the upload of a new gnome-shell version. This will be the 
last upstream on the 3.14 branch, and it includes only bugfixes and 
translations, including a workaround for the very annoying bug with the 
proprietary nVidia driver.

As with mutter, I can upload a targeted fix for the nVidia problem if 
it’s too much.

3.14.4
======
* Fix erroneous week numbers in calendar [Florian; #736722]
* Make slider scrolling smoother [Adel; #742648]
* Fix current day highlight on day change [Sebastian; #742492]
* Do not wake up the screen for disabled notifications [Florian; #744114]
* gdm: Fix user list accessibility [Florian; #729603]
* Work around background corruption with NVIDIA driver [Rui; #739178]
* Misc. bug fixes [Florian, Rui, Michele; #744575, #743993, #745245, #745570,
  #737502]

Contributors:
  Michele, Adel Gadllah, Sebastian Keller, Rui Matos, Florian Müllner

Translations:
  Matej Urbančič [sl], Samir Ribic [bs]

3.14.3
======
* Properly remove network connections from list [Ryan; #740227]
* Fix handling of cancel button on login screen [Ray; #740141]
* Fix build when using dash as default shell [Alexander; #739241]
* Make event list in calendar scrollable [Stalin; #705115]
* Fix calendar-server crash on DBus timeout [Giovanni; #735308]
* Fix gestures triggering erroneously [Florian; #740237]

Contributors:
  Giovanni Campagna, Ryan Lortie, Florian Müllner, Stalin Pereira, Ray Strode,
  Alexander Tsoy

gnome-shell (3.14.4-1) unstable; urgency=medium

  * New upstream translation and bugfix release.
    + Includes workaround for #768896 which is very annoying for users 
      of the proprietary nvidia driver.
  * 01_network_list.patch, 02_auth_prompt.patch, 
    50-compute-weeknumber-with-gdatetime.patch: dropped, merged 
    upstream.
  * Bump (build-)dependencies on mutter as usual.

unblock gnome-shell/3.14.4-1

Thanks for considering.
-- 
 .''`.        Josselin Mouette
: :' :
`. `'
  `-
diff --git a/NEWS b/NEWS
index 3aa03e6..25bcda3 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,33 @@
+3.14.4
+======
+* Fix erroneous week numbers in calendar [Florian; #736722]
+* Make slider scrolling smoother [Adel; #742648]
+* Fix current day highlight on day change [Sebastian; #742492]
+* Do not wake up the screen for disabled notifications [Florian; #744114]
+* gdm: Fix user list accessibility [Florian; #729603]
+* Work around background corruption with NVIDIA driver [Rui; #739178]
+* Misc. bug fixes [Florian, Rui, Michele; #744575, #743993, #745245, #745570,
+  #737502]
+
+Contributors:
+  Michele, Adel Gadllah, Sebastian Keller, Rui Matos, Florian Müllner
+
+Translations:
+  Matej Urbančič [sl], Samir Ribic [bs]
+
+3.14.3
+======
+* Properly remove network connections from list [Ryan; #740227]
+* Fix handling of cancel button on login screen [Ray; #740141]
+* Fix build when using dash as default shell [Alexander; #739241]
+* Make event list in calendar scrollable [Stalin; #705115]
+* Fix calendar-server crash on DBus timeout [Giovanni; #735308]
+* Fix gestures triggering erroneously [Florian; #740237]
+
+Contributors:
+  Giovanni Campagna, Ryan Lortie, Florian Müllner, Stalin Pereira, Ray Strode,
+  Alexander Tsoy
+
 3.14.2
 ======
 * Do not hard-depend on latest NetworkManager [Florian; #738485]
diff --git a/configure.ac b/configure.ac
index 790b7b2..2a779e8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,5 +1,5 @@
 AC_PREREQ(2.63)
-AC_INIT([gnome-shell],[3.14.2],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
+AC_INIT([gnome-shell],[3.14.4],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
 
 AC_CONFIG_HEADERS([config.h])
 AC_CONFIG_SRCDIR([src/shell-global.c])
@@ -76,7 +76,7 @@ AC_MSG_RESULT($enable_systemd)
 CLUTTER_MIN_VERSION=1.15.90
 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
 GJS_MIN_VERSION=1.39.0
-MUTTER_MIN_VERSION=3.14.2
+MUTTER_MIN_VERSION=3.14.4
 GTK_MIN_VERSION=3.13.2
 GIO_MIN_VERSION=2.37.0
 LIBECAL_MIN_VERSION=3.5.3
@@ -232,7 +232,9 @@ esac
 AM_CFLAGS="$AM_CFLAGS $WARN_CFLAGS"
 AC_SUBST(AM_CFLAGS)
 
-BROWSER_PLUGIN_DIR="${BROWSER_PLUGIN_DIR:-"\${libdir}/mozilla/plugins"}"
+if test -z "${BROWSER_PLUGIN_DIR}"; then
+  BROWSER_PLUGIN_DIR="\${libdir}/mozilla/plugins"
+fi
 AC_ARG_VAR([BROWSER_PLUGIN_DIR],[Where to install the plugin to])
 
 AC_CONFIG_FILES([
diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
index ca4db89..a4d69d9 100644
--- a/js/gdm/authPrompt.js
+++ b/js/gdm/authPrompt.js
@@ -260,6 +260,7 @@ const AuthPrompt = new Lang.Class({
 
     _onVerificationComplete: function() {
         this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
+	this.cancelButton.reactive = false;
     },
 
     _onReset: function() {
@@ -431,6 +432,7 @@ const AuthPrompt = new Lang.Class({
     reset: function() {
         let oldStatus = this.verificationStatus;
         this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
+        this.cancelButton.reactive = true;
 
         if (oldStatus == AuthPromptStatus.VERIFYING)
             this._userVerifier.cancel();
@@ -499,6 +501,9 @@ const AuthPrompt = new Lang.Class({
     },
 
     cancel: function() {
+        if (this.verificationStatus == AuthPromptStatus.NOT_VERIFYING || this.verificationStatus == AuthPromptStatus.VERIFICATION_SUCCEEDED) {
+            return;
+        }
         this.reset();
         this.emit('cancelled');
     }
diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js
index 6a8ae0a..7fbeb3e 100644
--- a/js/gdm/loginDialog.js
+++ b/js/gdm/loginDialog.js
@@ -22,6 +22,7 @@ const Clutter = imports.gi.Clutter;
 const Gdm = imports.gi.Gdm;
 const Gio = imports.gi.Gio;
 const GLib = imports.gi.GLib;
+const GObject = imports.gi.GObject;
 const Gtk = imports.gi.Gtk;
 const Lang = imports.lang;
 const Mainloop = imports.mainloop;
@@ -70,6 +71,9 @@ const UserListItem = new Lang.Class({
         this._userWidget = new UserWidget.UserWidget(this.user);
         layout.add(this._userWidget.actor);
 
+        this._userWidget.actor.bind_property('label-actor', this.actor, 'label-actor',
+                                             GObject.BindingFlags.SYNC_CREATE);
+
         this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator',
                                                  scale_x: 0 });
         layout.add(this._timedLoginIndicator);
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index 4a12698..ae40f3e 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -1658,7 +1658,10 @@ const AppIcon = new Lang.Class({
                 if (!isPoppedUp)
                     this._onMenuPoppedDown();
             }));
-            Main.overview.connect('hiding', Lang.bind(this, function () { this._menu.close(); }));
+            let id = Main.overview.connect('hiding', Lang.bind(this, function () { this._menu.close(); }));
+            this.actor.connect('destroy', function() {
+                Main.overview.disconnect(id);
+            });
 
             this._menuManager.addMenu(this._menu);
         }
diff --git a/js/ui/calendar.js b/js/ui/calendar.js
index e0e6a9e..52f6cb5 100644
--- a/js/ui/calendar.js
+++ b/js/ui/calendar.js
@@ -2,6 +2,7 @@
 
 const Clutter = imports.gi.Clutter;
 const Gio = imports.gi.Gio;
+const Gtk = imports.gi.Gtk;
 const GLib = imports.gi.GLib;
 const Lang = imports.lang;
 const St = imports.gi.St;
@@ -234,11 +235,24 @@ const DBusEventSource = new Lang.Class({
         this._initialized = false;
         this._dbusProxy = new CalendarServer();
         this._dbusProxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(object, result) {
+            let loaded = false;
+
             try {
                 this._dbusProxy.init_finish(result);
+                loaded = true;
             } catch(e) {
-                log('Error loading calendars: ' + e.message);
-                return;
+                if (e.matches(Gio.DBusError, Gio.DBusError.TIMED_OUT)) {
+                    // Ignore timeouts and install signals as normal, because with high
+                    // probability the service will appear later on, and we will get a
+                    // NameOwnerChanged which will finish loading
+                    //
+                    // (But still _initialized to false, because the proxy does not know
+                    // about the HasCalendars property and would cause an exception trying
+                    // to read it)
+                } else {
+                    log('Error loading calendars: ' + e.message);
+                    return;
+                }
             }
 
             this._dbusProxy.connectSignal('Changed', Lang.bind(this, this._onChanged));
@@ -254,9 +268,11 @@ const DBusEventSource = new Lang.Class({
                 this.emit('notify::has-calendars');
             }));
 
-            this._initialized = true;
-            this.emit('notify::has-calendars');
-            this._onNameAppeared();
+            this._initialized = loaded;
+            if (loaded) {
+                this.emit('notify::has-calendars');
+                this._onNameAppeared();
+            }
         }));
     },
 
@@ -278,6 +294,7 @@ const DBusEventSource = new Lang.Class({
     },
 
     _onNameAppeared: function(owner) {
+        this._initialized = true;
         this._resetCache();
         this._loadEvents(true);
     },
@@ -586,6 +603,7 @@ const Calendar = new Lang.Class({
         beginDate.setHours(12);
 
         this._calendarBegin = new Date(beginDate);
+        this._markedAsToday = now;
 
         let year = beginDate.getYear();
 
@@ -677,7 +695,7 @@ const Calendar = new Lang.Class({
         else
             this._monthLabel.text = this._selectedDate.toLocaleFormat(this._headerFormat);
 
-        if (!this._calendarBegin || !_sameMonth(this._selectedDate, this._calendarBegin))
+        if (!this._calendarBegin || !_sameMonth(this._selectedDate, this._calendarBegin) || !_sameDay(now, this._markedAsToday))
             this._rebuildCalendar();
 
         this._buttons.forEach(Lang.bind(this, function(button) {
@@ -714,6 +732,8 @@ const EventsList = new Lang.Class({
     },
 
     _addEvent: function(event, index, includeDayName, periodBegin, periodEnd) {
+        let eventBox = new St.BoxLayout();
+        eventBox.set_vertical(false);
         let dayString;
         if (includeDayName) {
             if (event.date >= periodBegin)
@@ -734,7 +754,7 @@ const EventsList = new Lang.Class({
         let rtl = this.actor.get_text_direction() == Clutter.TextDirection.RTL;
 
         let layout = this.actor.layout_manager;
-        layout.attach(dayLabel, rtl ? 2 : 0, index, 1, 1);
+        eventBox.add_actor(dayLabel);
         let clockFormat = this._desktopSettings.get_string(CLOCK_FORMAT_KEY);
         let timeString = _formatEventTime(event, clockFormat, periodBegin, periodEnd);
         let timeLabel = new St.Label({ style_class: 'events-day-time',
@@ -754,11 +774,12 @@ const EventsList = new Lang.Class({
         if (event.allDay || event.end <= periodEnd)
             postEllipsisLabel.opacity = 0;
 
-        let timeLabelBoxLayout = new St.BoxLayout();
+        let timeLabelBoxLayout = new St.BoxLayout({ x_align: Clutter.ActorAlign.START });
         timeLabelBoxLayout.add(preEllipsisLabel);
         timeLabelBoxLayout.add(timeLabel);
         timeLabelBoxLayout.add(postEllipsisLabel);
-        layout.attach(timeLabelBoxLayout, 1, index, 1, 1);
+        timeLabelBoxLayout.set_size(50, 1);
+        eventBox.add_actor(timeLabelBoxLayout);
 
         let titleLabel = new St.Label({ style_class: 'events-day-task',
                                         text: event.summary,
@@ -766,7 +787,8 @@ const EventsList = new Lang.Class({
         titleLabel.clutter_text.line_wrap = true;
         titleLabel.clutter_text.ellipsize = false;
 
-        layout.attach(titleLabel, rtl ? 0 : 2, index, 1, 1);
+        eventBox.add_actor(titleLabel);
+        this._eventListBox.add_actor(eventBox);
     },
 
     _addPeriod: function(header, index, periodBegin, periodEnd, includeDayName, showNothingScheduled) {
@@ -776,8 +798,7 @@ const EventsList = new Lang.Class({
             return index;
 
         let label = new St.Label({ style_class: 'events-day-header', text: header });
-        let layout = this.actor.layout_manager;
-        layout.attach(label, 0, index, 3, 1);
+        this._eventListBox.add_actor(label);
         index++;
 
         for (let n = 0; n < events.length; n++) {
@@ -796,8 +817,6 @@ const EventsList = new Lang.Class({
     },
 
     _showOtherDay: function(day) {
-        this.actor.destroy_all_children();
-
         let dayBegin = _getBeginningOfDay(day);
         let dayEnd = _getEndOfDay(day);
 
@@ -813,7 +832,6 @@ const EventsList = new Lang.Class({
     },
 
     _showToday: function() {
-        this.actor.destroy_all_children();
         let index = 0;
 
         let now = new Date();
@@ -858,6 +876,24 @@ const EventsList = new Lang.Class({
         if (this._eventSource.isLoading)
             return;
 
+        this.actor.destroy_all_children();
+
+        let layout = this.actor.layout_manager;
+
+        this._eventListContainer = new St.BoxLayout({ x_expand: true, y_expand: true });
+        this._eventListContainer.set_vertical(true);
+
+        this._eventListBox = new St.BoxLayout();
+        this._eventListBox.set_vertical(true);
+
+        let eventScrollView = new St.ScrollView({style_class: 'vfade',
+                                                hscrollbar_policy: Gtk.PolicyType.NEVER,
+                                                vscrollbar_policy: Gtk.PolicyType.AUTOMATIC});
+        eventScrollView.add_actor(this._eventListBox);
+        this._eventListContainer.add_actor(eventScrollView);
+
+        layout.attach(this._eventListContainer, 0, 0, 1, 1);
+
         let today = new Date();
         if (_sameDay (this._date, today)) {
             this._showToday();
diff --git a/js/ui/dash.js b/js/ui/dash.js
index 99635cd..01727e3 100644
--- a/js/ui/dash.js
+++ b/js/ui/dash.js
@@ -513,10 +513,13 @@ const Dash = new Lang.Class({
             this._syncLabel(item, appIcon);
         }));
 
-        Main.overview.connect('hiding', Lang.bind(this, function() {
+        let id = Main.overview.connect('hiding', Lang.bind(this, function() {
             this._labelShowing = false;
             item.hideLabel();
         }));
+        item.child.connect('destroy', function() {
+            Main.overview.disconnect(id);
+        });
 
         if (appIcon) {
             appIcon.connect('sync-tooltip', Lang.bind(this, function() {
diff --git a/js/ui/dateMenu.js b/js/ui/dateMenu.js
index 8b0213c..37c8cb1 100644
--- a/js/ui/dateMenu.js
+++ b/js/ui/dateMenu.js
@@ -59,7 +59,7 @@ const DateMenuButton = new Lang.Class({
 
         // Fill up the first column
 
-        vbox = new St.BoxLayout({vertical: true});
+        vbox = new St.BoxLayout({vertical: true, x_expand: true, y_expand: true });
         hbox.add(vbox);
 
         // Date
@@ -96,11 +96,11 @@ const DateMenuButton = new Lang.Class({
 
         this._openCalendarItem = new PopupMenu.PopupMenuItem(_("Open Calendar"));
         this._openCalendarItem.connect('activate', Lang.bind(this, this._onOpenCalendarActivate));
-        vbox.add(this._openCalendarItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
+        vbox.add(this._openCalendarItem.actor, {y_align: St.Align.END, expand: false, y_fill: false});
 
         this._openClocksItem = new PopupMenu.PopupMenuItem(_("Open Clocks"));
         this._openClocksItem.connect('activate', Lang.bind(this, this._onOpenClocksActivate));
-        vbox.add(this._openClocksItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
+        vbox.add(this._openClocksItem.actor, {y_align: St.Align.END, expand: false, y_fill: false});
 
         Shell.AppSystem.get_default().connect('installed-changed',
                                               Lang.bind(this, this._appInstalledChanged));
diff --git a/js/ui/edgeDragAction.js b/js/ui/edgeDragAction.js
index 692da41..46e96d7 100644
--- a/js/ui/edgeDragAction.js
+++ b/js/ui/edgeDragAction.js
@@ -6,6 +6,8 @@ const Meta = imports.gi.Meta;
 const Clutter = imports.gi.Clutter;
 const St = imports.gi.St;
 
+const Main = imports.ui.main;
+
 const EDGE_THRESHOLD = 20;
 const DRAG_DISTANCE = 80;
 
@@ -13,9 +15,10 @@ const EdgeDragAction = new Lang.Class({
     Name: 'EdgeDragAction',
     Extends: Clutter.GestureAction,
 
-    _init : function(side) {
+    _init : function(side, allowedModes) {
         this.parent();
         this._side = side;
+        this._allowedModes = allowedModes;
         this.set_n_touch_points(1);
 
         global.display.connect('grab-op-begin', Lang.bind(this, function() {
@@ -34,6 +37,9 @@ const EdgeDragAction = new Lang.Class({
         if (this.get_n_current_points() == 0)
             return false;
 
+        if (!(this._allowedModes & Main.keybindingMode))
+            return false;
+
         let [x, y] = this.get_press_coords(0);
         let monitorRect = this._getMonitorRect(x, y);
 
diff --git a/js/ui/layout.js b/js/ui/layout.js
index 9228bd1..e9aab13 100644
--- a/js/ui/layout.js
+++ b/js/ui/layout.js
@@ -11,6 +11,7 @@ const St = imports.gi.St;
 
 const Background = imports.ui.background;
 const BackgroundMenu = imports.ui.backgroundMenu;
+const LoginManager = imports.misc.loginManager;
 
 const DND = imports.ui.dnd;
 const Main = imports.ui.main;
@@ -248,6 +249,18 @@ const LayoutManager = new Lang.Class({
         global.screen.connect('in-fullscreen-changed',
                               Lang.bind(this, this._updateFullscreen));
         this._monitorsChanged();
+
+        // NVIDIA drivers don't preserve FBO contents across
+        // suspend/resume, see
+        // https://bugzilla.gnome.org/show_bug.cgi?id=739178
+        if (Shell.util_need_background_refresh()) {
+            LoginManager.getLoginManager().connect('prepare-for-sleep',
+                                                   function(lm, suspending) {
+                                                       if (suspending)
+                                                           return;
+                                                       Meta.Background.refresh_all();
+                                                   });
+        }
     },
 
     // This is called by Main after everything else is constructed
diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js
index ad7c5c8..a034fc3 100644
--- a/js/ui/messageTray.js
+++ b/js/ui/messageTray.js
@@ -1951,7 +1951,9 @@ const MessageTray = new Lang.Class({
         this._messageTrayMenuButton.actor.connect('key-press-event',
                                                   Lang.bind(this, this._onTrayButtonKeyPress));
 
-        let gesture = new EdgeDragAction.EdgeDragAction(St.Side.BOTTOM);
+        let gesture = new EdgeDragAction.EdgeDragAction(St.Side.BOTTOM,
+                                                        Shell.KeyBindingMode.NORMAL |
+                                                        Shell.KeyBindingMode.OVERVIEW);
         gesture.connect('activated', Lang.bind(this, this.toggle));
         global.stage.add_action(gesture);
     },
diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js
index 32ef1ca..3a84468 100644
--- a/js/ui/screenShield.js
+++ b/js/ui/screenShield.js
@@ -301,7 +301,8 @@ const NotificationsBox = new Lang.Class({
                              });
 
             this._updateVisibility();
-            this.emit('wake-up-screen');
+            if (obj.sourceBox.visible)
+                this.emit('wake-up-screen');
         }
     },
 
diff --git a/js/ui/slider.js b/js/ui/slider.js
index 383dca4..8844d9a 100644
--- a/js/ui/slider.js
+++ b/js/ui/slider.js
@@ -197,7 +197,7 @@ const Slider = new Lang.Class({
             let [dx, dy] = event.get_scroll_delta();
             // Even though the slider is horizontal, use dy to match
             // the UP/DOWN above.
-            delta = -dy / 10;
+            delta = -dy * SLIDER_SCROLL_STEP;
         }
 
         this._value = Math.min(Math.max(0, this._value + delta), 1);
diff --git a/js/ui/status/system.js b/js/ui/status/system.js
index a2ad289..b053694 100644
--- a/js/ui/status/system.js
+++ b/js/ui/status/system.js
@@ -285,7 +285,7 @@ const Indicator = new Lang.Class({
         let disabled = Main.sessionMode.isLocked ||
                        (Main.sessionMode.isGreeter &&
                         this._loginScreenSettings.get_boolean(DISABLE_RESTART_KEY));
-        this._suspendAction.visible = this._haveShutdown && !disabled;
+        this._suspendAction.visible = this._haveSuspend && !disabled;
         this._updateActionsVisibility();
     },
 
diff --git a/js/ui/userWidget.js b/js/ui/userWidget.js
index 314aae0..5286ad1 100644
--- a/js/ui/userWidget.js
+++ b/js/ui/userWidget.js
@@ -6,6 +6,7 @@ const Clutter = imports.gi.Clutter;
 const AccountsService = imports.gi.AccountsService;
 const GLib = imports.gi.GLib;
 const Gio = imports.gi.Gio;
+const GObject = imports.gi.GObject;
 const Lang = imports.lang;
 const St = imports.gi.St;
 
@@ -117,6 +118,7 @@ const UserWidgetLabel = new Lang.Class({
             this._currentLabel = this._realNameLabel;
         else
             this._currentLabel = this._userNameLabel;
+        this.label_actor = this._currentLabel;
 
         let childBox = new Clutter.ActorBox();
         childBox.x1 = 0;
@@ -158,6 +160,9 @@ const UserWidget = new Lang.Class({
         this._label = new UserWidgetLabel(user);
         this.actor.add_child(this._label);
 
+        this._label.bind_property('label-actor', this.actor, 'label-actor',
+                                  GObject.BindingFlags.SYNC_CREATE);
+
         this._userLoadedId = this._user.connect('notify::is-loaded', Lang.bind(this, this._updateUser));
         this._userChangedId = this._user.connect('changed', Lang.bind(this, this._updateUser));
         this._updateUser();
diff --git a/js/ui/viewSelector.js b/js/ui/viewSelector.js
index d0e8140..c2ef9e5 100644
--- a/js/ui/viewSelector.js
+++ b/js/ui/viewSelector.js
@@ -65,7 +65,8 @@ const ShowOverviewAction = new Lang.Class({
     },
 
     vfunc_gesture_prepare : function(action, actor) {
-        return this.get_n_current_points() == this.get_n_touch_points();
+        return Main.keybindingMode == Shell.KeyBindingMode.NORMAL &&
+               this.get_n_current_points() == this.get_n_touch_points();
     },
 
     _getBoundingRect : function(motion) {
@@ -213,9 +214,13 @@ const ViewSelector = new Lang.Class({
                               Shell.KeyBindingMode.OVERVIEW,
                               Lang.bind(Main.overview, Main.overview.toggle));
 
-        let gesture;
-
-        gesture = new EdgeDragAction.EdgeDragAction(St.Side.LEFT);
+        let side;
+        if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
+            side = St.Side.RIGHT;
+        else
+            side = St.Side.LEFT;
+        let gesture = new EdgeDragAction.EdgeDragAction(side,
+                                                        Shell.KeyBindingMode.NORMAL);
         gesture.connect('activated', Lang.bind(this, function() {
             if (Main.overview.visible)
                 Main.overview.hide();
diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js
index 60ab30f..e332552 100644
--- a/js/ui/windowManager.js
+++ b/js/ui/windowManager.js
@@ -478,7 +478,9 @@ const WorkspaceSwitchAction = new Lang.Class({
     },
 
     vfunc_gesture_prepare : function(action, actor) {
-        return this.get_n_current_points() == this.get_n_touch_points();
+        let allowedModes = Shell.KeyBindingMode.NORMAL | Shell.KeyBindingMode.OVERVIEW;
+        return this.get_n_current_points() == this.get_n_touch_points() &&
+               (allowedModes & Main.keybindingMode);
     },
 
     vfunc_gesture_end : function(action, actor) {
@@ -526,7 +528,7 @@ const AppSwitchAction = new Lang.Class({
     },
 
     vfunc_gesture_prepare : function(action, actor) {
-        if (Main.overview.visible) {
+        if (Main.keybindingMode != Shell.KeyBindingMode.NORMAL) {
             this.cancel();
             return false;
         }
diff --git a/js/ui/workspace.js b/js/ui/workspace.js
index e9ab167..e6cf41d 100644
--- a/js/ui/workspace.js
+++ b/js/ui/workspace.js
@@ -156,7 +156,6 @@ const WindowClone = new Lang.Class({
         this.actor.add_action(clickAction);
         this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
         this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPress));
-        this.actor.connect('enter-event', Lang.bind(this, this._onEnter));
 
         this._draggable = DND.makeDraggable(this.actor,
                                             { restoreOnSuccess: true,
@@ -353,10 +352,6 @@ const WindowClone = new Lang.Class({
         return false;
     },
 
-    _onEnter: function() {
-        this.actor.grab_key_focus();
-    },
-
     _onClicked: function(action, actor) {
         this._activate();
     },
diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js
index ba3a120..e7a3a8c 100644
--- a/js/ui/workspacesView.js
+++ b/js/ui/workspacesView.js
@@ -538,6 +538,7 @@ const WorkspacesDisplay = new Lang.Class({
         for (let i = 0; i < this._workspacesViews.length; i++)
             this._workspacesViews[i].destroy();
 
+        this._primaryIndex = Main.layoutManager.primaryIndex;
         this._workspacesViews = [];
         let monitors = Main.layoutManager.monitors;
         for (let i = 0; i < monitors.length; i++) {
diff --git a/po/LINGUAS b/po/LINGUAS
index 3bd161a..fac81e5 100644
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -7,6 +7,7 @@ be
 bg
 bn
 bn_IN
+bs
 ca
 ca@valencia
 cs
diff --git a/po/POTFILES.skip b/po/POTFILES.skip
index c3a821c..31998fe 100644
--- a/po/POTFILES.skip
+++ b/po/POTFILES.skip
@@ -1,2 +1,4 @@
 data/org.gnome.shell.evolution.calendar.gschema.xml.in
 src/calendar-server/evolution-calendar.desktop.in
+# Meh, autofools :-(
+sub/src/calendar-server/evolution-calendar.desktop.in
diff --git a/po/bs.po b/po/bs.po
new file mode 100644
index 0000000..2b0d9b3
diff --git a/po/sl.po b/po/sl.po
index 2cfa7e5..b867c68 100644
diff --git a/src/calendar-server/calendar-sources.c b/src/calendar-server/calendar-sources.c
index 219fc45..804fb9c 100644
--- a/src/calendar-server/calendar-sources.c
+++ b/src/calendar-server/calendar-sources.c
@@ -176,18 +176,54 @@ static void
 calendar_sources_init (CalendarSources *sources)
 {
   GError *error = NULL;
+  GDBusConnection *session_bus;
+  GVariant *result;
 
   sources->priv = CALENDAR_SOURCES_GET_PRIVATE (sources);
 
-  /* XXX Not sure what to do if this fails.
-   *     Should this class implement GInitable or pass the
-   *     registry in as a G_PARAM_CONSTRUCT_ONLY property? */
-  sources->priv->registry = e_source_registry_new_sync (NULL, &error);
+  /* WORKAROUND: the hardcoded timeout for e_source_registry_new_sync()
+     (and other library calls that eventually call g_dbus_proxy_new[_sync]())
+     is 25 seconds. This has been shown to be too small for
+     evolution-source-registry in certain cases (slow disk, concurrent IO,
+     many configured sources), so we first ensure that the service
+     starts with a manual call and a higher timeout.
+
+     HACK: every time the DBus API is bumped in e-d-s we need
+     to update this!
+  */
+  session_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
+  if (session_bus == NULL)
+    {
+      g_error ("Failed to connect to the session bus: %s", error->message);
+    }
+
+  result = g_dbus_connection_call_sync (session_bus, "org.freedesktop.DBus",
+                                        "/", "org.freedesktop.DBus",
+                                        "StartServiceByName",
+                                        g_variant_new ("(su)",
+                                                       "org.gnome.evolution.dataserver.Sources3",
+                                                       0),
+                                        NULL,
+                                        G_DBUS_CALL_FLAGS_NONE,
+                                        60 * 1000,
+                                        NULL, &error);
+  if (result != NULL)
+    {
+      g_variant_unref (result);
+      sources->priv->registry = e_source_registry_new_sync (NULL, &error);
+    }
+
   if (error != NULL)
     {
-      g_error ("%s: %s", G_STRFUNC, error->message);
+      /* Any error is fatal, but we don't want to crash gnome-shell-calendar-server
+         because of e-d-s problems. So just exit here.
+      */
+      g_warning ("Failed to start evolution-source-registry: %s", error->message);
+      exit(EXIT_FAILURE);
     }
 
+  g_object_unref (session_bus);
+
   sources->priv->source_added_id   = g_signal_connect (sources->priv->registry,
                                                        "source-added",
                                                        G_CALLBACK (calendar_sources_registry_source_changed_cb),
diff --git a/src/shell-util.c b/src/shell-util.c
index 5ae4fdb..8792403 100644
--- a/src/shell-util.c
+++ b/src/shell-util.c
@@ -5,6 +5,9 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 
+#include <GL/gl.h>
+#include <cogl/cogl.h>
+
 #include "shell-util.h"
 #include <glib/gi18n-lib.h>
 #include <gtk/gtk.h>
@@ -330,3 +333,33 @@ shell_util_cursor_tracker_to_clutter (MetaCursorTracker *tracker,
       clutter_actor_hide (CLUTTER_ACTOR (texture));
     }
 }
+
+typedef const gchar *(*ShellGLGetString) (GLenum);
+
+static const gchar *
+get_gl_vendor (void)
+{
+  static const gchar *vendor = NULL;
+
+  if (!vendor)
+    {
+      ShellGLGetString gl_get_string;
+      gl_get_string = (ShellGLGetString) cogl_get_proc_address ("glGetString");
+      if (gl_get_string)
+        vendor = gl_get_string (GL_VENDOR);
+    }
+
+  return vendor;
+}
+
+gboolean
+shell_util_need_background_refresh (void)
+{
+  if (!clutter_check_windowing_backend (CLUTTER_WINDOWING_X11))
+    return FALSE;
+
+  if (g_strcmp0 (get_gl_vendor (), "NVIDIA Corporation") == 0)
+    return TRUE;
+
+  return FALSE;
+}
diff --git a/src/shell-util.h b/src/shell-util.h
index d7ab4fd..be20083 100644
--- a/src/shell-util.h
+++ b/src/shell-util.h
@@ -44,6 +44,8 @@ GdkPixbuf *shell_util_create_pixbuf_from_data (const guchar      *data,
 void    shell_util_cursor_tracker_to_clutter (MetaCursorTracker *tracker,
                                               ClutterTexture    *texture);
 
+gboolean shell_util_need_background_refresh (void);
+
 G_END_DECLS
 
 #endif /* __SHELL_UTIL_H__ */
Index: debian/control
===================================================================
--- debian/control	(révision 44183)
+++ debian/control	(révision 44184)
@@ -36,7 +36,7 @@
                libgstreamer1.0-dev (>= 0.11.92),
                libgtk-3-dev (>= 3.13.2),
                libibus-1.0-dev,
-               libmutter-dev (>= 3.14.2),
+               libmutter-dev (>= 3.14.4),
                libnm-glib-dev (>= 0.9.8) [linux-any],
                libnm-glib-vpn-dev (>= 0.9.8) [linux-any],
                libnm-gtk-dev (>= 0.9.8) [linux-any],
@@ -79,7 +79,7 @@
          gir1.2-gnomedesktop-3.0 (>= 3.12.0),
          gir1.2-gtk-3.0 (>= 3.8),
          gir1.2-ibus-1.0 (>= 1.5.2),
-         gir1.2-mutter-3.0 (>= 3.14.2),
+         gir1.2-mutter-3.0 (>= 3.14.4),
          gir1.2-networkmanager-1.0 [linux-any],
          gir1.2-nmgtk-1.0 (>= 0.9.8) [linux-any],
          gir1.2-pango-1.0,
@@ -95,7 +95,7 @@
          gnome-themes-standard,
          gnome-backgrounds (>= 3.13.90),
          gsettings-desktop-schemas (>= 3.11),
-         mutter (>= 3.14.2),
+         mutter (>= 3.14.4),
          python (>= 2.6),
          telepathy-mission-control-5,
 Recommends: gkbd-capplet,
Index: debian/control.in
===================================================================
--- debian/control.in	(révision 44183)
+++ debian/control.in	(révision 44184)
@@ -32,7 +32,7 @@
                libgstreamer1.0-dev (>= 0.11.92),
                libgtk-3-dev (>= 3.13.2),
                libibus-1.0-dev,
-               libmutter-dev (>= 3.14.2),
+               libmutter-dev (>= 3.14.4),
                libnm-glib-dev (>= 0.9.8) [linux-any],
                libnm-glib-vpn-dev (>= 0.9.8) [linux-any],
                libnm-gtk-dev (>= 0.9.8) [linux-any],
@@ -75,7 +75,7 @@
          gir1.2-gnomedesktop-3.0 (>= 3.12.0),
          gir1.2-gtk-3.0 (>= 3.8),
          gir1.2-ibus-1.0 (>= 1.5.2),
-         gir1.2-mutter-3.0 (>= 3.14.2),
+         gir1.2-mutter-3.0 (>= 3.14.4),
          gir1.2-networkmanager-1.0 [linux-any],
          gir1.2-nmgtk-1.0 (>= 0.9.8) [linux-any],
          gir1.2-pango-1.0,
@@ -91,7 +91,7 @@
          gnome-themes-standard,
          gnome-backgrounds (>= 3.13.90),
          gsettings-desktop-schemas (>= 3.11),
-         mutter (>= 3.14.2),
+         mutter (>= 3.14.4),
          python (>= 2.6),
          telepathy-mission-control-5,
 Recommends: gkbd-capplet,
Index: debian/changelog
===================================================================
--- debian/changelog	(révision 44183)
+++ debian/changelog	(révision 44184)
@@ -1,3 +1,15 @@
+gnome-shell (3.14.4-1) unstable; urgency=medium
+
+  * New upstream translation and bugfix release.
+    + Includes workaround for #768896 which is very annoying for users 
+      of the proprietary nvidia driver.
+  * 01_network_list.patch, 02_auth_prompt.patch, 
+    50-compute-weeknumber-with-gdatetime.patch: dropped, merged 
+    upstream.
+  * Bump (build-)dependencies on mutter as usual.
+
+ -- Josselin Mouette <j...@debian.org>  Thu, 26 Mar 2015 21:44:04 +0100
+
 gnome-shell (3.14.2-3) unstable; urgency=medium
 
   * Add missing dependency on mutter. Closes: #764715.
Index: debian/patches/02_auth_prompt.patch
===================================================================
Index: debian/patches/01_network_list.patch
===================================================================
Index: debian/patches/50-compute-weeknumber-with-gdatetime.patch
===================================================================
Index: debian/patches/series
===================================================================
--- debian/patches/series	(révision 44183)
+++ debian/patches/series	(révision 44184)
@@ -1,9 +1,6 @@
-01_network_list.patch
-02_auth_prompt.patch
 #10-make-NetworkManager-optional.patch
 10_background_race.patch
 27-nm-libexec-path.patch
 #30-remoteMenu-Prevent-the-shell-from-becoming-unrespons.patch
 41-handle-logind-fail.patch
-50-compute-weeknumber-with-gdatetime.patch
 51-Delay-caribou-daemon-invocation.patch

Reply via email to