summaryrefslogtreecommitdiff
path: root/community/cinnamon
diff options
context:
space:
mode:
authorMichał Masłowski <mtjm@mtjm.eu>2013-04-26 10:52:42 +0200
committerMichał Masłowski <mtjm@mtjm.eu>2013-04-26 10:52:42 +0200
commit127dc69a077301eaf514a49a1c8f883584396e1c (patch)
treea48e082ea38a50dee109bbfe7d977b5a81c3c4a1 /community/cinnamon
parentb820811488f4e50bbff8e8e84af774adc79375d9 (diff)
parenta247f0004e94d32b5fe69a5123e1c6684d8cf096 (diff)
Merge branch 'master' of ssh://parabolagnulinux.org:1863/home/parabola/abslibre-pre-mips64el
Conflicts: community/apvlv/PKGBUILD community/audit/PKGBUILD community/cinnamon-control-center/PKGBUILD community/dia/PKGBUILD community/gedit-plugins/PKGBUILD community/giggle/PKGBUILD community/gitg/PKGBUILD community/gmic/PKGBUILD community/gnome-applets/PKGBUILD community/gnome-panel/PKGBUILD community/gnome-screensaver/PKGBUILD community/gtranslator/PKGBUILD community/metacity/PKGBUILD community/zeitgeist-datahub/PKGBUILD core/glib2/PKGBUILD core/perl/PKGBUILD extra/anjuta-extras/PKGBUILD extra/anjuta/PKGBUILD extra/atkmm/PKGBUILD extra/brltty/PKGBUILD extra/cheese/PKGBUILD extra/clutter/PKGBUILD extra/cogl/PKGBUILD extra/devhelp/PKGBUILD extra/empathy/PKGBUILD extra/eog/PKGBUILD extra/epiphany/PKGBUILD extra/evince/PKGBUILD extra/evolution/PKGBUILD extra/fontconfig/PKGBUILD extra/gcr/PKGBUILD extra/gdl/PKGBUILD extra/gedit/PKGBUILD extra/gjs/PKGBUILD extra/glade/PKGBUILD extra/glib-networking/PKGBUILD extra/gnome-calculator/PKGBUILD extra/gnome-contacts/PKGBUILD extra/gnome-control-center/PKGBUILD extra/gnome-desktop/PKGBUILD extra/gnome-disk-utility/PKGBUILD extra/gnome-documents/PKGBUILD extra/gnome-font-viewer/PKGBUILD extra/gnome-games/PKGBUILD extra/gnome-power-manager/PKGBUILD extra/gnome-screenshot/PKGBUILD extra/gnome-session/PKGBUILD extra/gnome-terminal/PKGBUILD extra/gobject-introspection/PKGBUILD extra/grilo-plugins/PKGBUILD extra/gssdp/PKGBUILD extra/gthumb/PKGBUILD extra/gtkmm3/PKGBUILD extra/gtksourceview3/PKGBUILD extra/gucharmap/PKGBUILD extra/gupnp-av/PKGBUILD extra/gupnp-dlna/PKGBUILD extra/gupnp-igd/PKGBUILD extra/gupnp/PKGBUILD extra/gvfs/PKGBUILD extra/js/PKGBUILD extra/kdeadmin/PKGBUILD extra/libchamplain/PKGBUILD extra/libgee/PKGBUILD extra/libgweather/PKGBUILD extra/liboauth/PKGBUILD extra/libpeas/PKGBUILD extra/librsvg/PKGBUILD extra/libsocialweb/PKGBUILD extra/libsoup/PKGBUILD extra/mash/PKGBUILD extra/modemmanager/PKGBUILD extra/mutter/PKGBUILD extra/mysql/PKGBUILD extra/nautilus-sendto/PKGBUILD extra/nautilus/PKGBUILD extra/network-manager-applet/PKGBUILD extra/notification-daemon/PKGBUILD extra/p11-kit/PKGBUILD extra/pango/PKGBUILD extra/pangomm/PKGBUILD extra/polkit/PKGBUILD extra/pygobject/PKGBUILD extra/qtwebkit/PKGBUILD extra/rest/PKGBUILD extra/rhythmbox/PKGBUILD extra/rygel/PKGBUILD extra/totem-plparser/PKGBUILD extra/totem/PKGBUILD extra/vala/PKGBUILD extra/vinagre/PKGBUILD extra/vte3/PKGBUILD extra/webkitgtk/PKGBUILD extra/yelp/PKGBUILD extra/zeitgeist/PKGBUILD libre/rp-pppoe-libre/PKGBUILD pcr/python-sfml2/PKGBUILD pcr/python2-sfml2/PKGBUILD
Diffstat (limited to 'community/cinnamon')
-rw-r--r--community/cinnamon/PKGBUILD61
-rw-r--r--community/cinnamon/cinnamon.install18
-rw-r--r--community/cinnamon/fallback-helpers.patch21
-rw-r--r--community/cinnamon/fix-keyboard-settings.patch83
-rw-r--r--community/cinnamon/gnome-3.8.patch3669
-rw-r--r--community/cinnamon/switch-applications.patch55
6 files changed, 3773 insertions, 134 deletions
diff --git a/community/cinnamon/PKGBUILD b/community/cinnamon/PKGBUILD
index dacad0d41..698a40277 100644
--- a/community/cinnamon/PKGBUILD
+++ b/community/cinnamon/PKGBUILD
@@ -1,20 +1,21 @@
-# $Id: PKGBUILD 87446 2013-03-31 19:54:32Z faidoc $
+# $Id: PKGBUILD 88934 2013-04-25 02:04:16Z bgyorgy $
# Maintainer: Alexandre Filgueira <alexfilgueira@cinnarch.com>
# Contributor: M0Rf30
# Contributor: unifiedlinux
# Contributor: CReimer
pkgname=cinnamon
-pkgver=1.7.3
-pkgrel=2
+pkgver=1.7.4
+pkgrel=3
pkgdesc="Linux desktop which provides advanced innovative features and a traditional user experience"
arch=('i686' 'x86_64' 'mips64el')
url="http://cinnamon.linuxmint.com/"
license=('GPL2')
depends=('accountsservice' 'caribou' 'clutter-gtk' 'gjs' 'gnome-bluetooth'
'gnome-icon-theme' 'gnome-menus' 'gnome-settings-daemon' 'gnome-session'
- 'gnome-themes-standard' 'gstreamer0.10' 'networkmanager' 'muffin' 'python2-dbus'
- 'python2-gconf' 'python2-imaging' 'python2-pyinotify' 'python2-lxml' 'webkitgtk3')
+ 'gnome-themes-standard' 'gstreamer0.10' 'libgnome-keyring' 'librsvg'
+ 'networkmanager' 'muffin' 'pygtk' 'python2-dbus' 'python2-imaging'
+ 'python2-pyinotify' 'python2-lxml' 'webkitgtk3' 'gnome-settings-daemon-compat')
makedepends=('gnome-common' 'intltool')
optdepends=('cinnamon-control-center: extended configurations for Cinnamon'
'cinnamon-screensaver: lock screen'
@@ -26,25 +27,40 @@ install=${pkgname}.install
source=("$pkgname-$pkgver.tar.gz::https://github.com/linuxmint/Cinnamon/tarball/$pkgver"
"keyboard_applet.patch"
"fix-control-center-check.patch"
- "fix-keyboard-settings.patch")
-md5sums=('c733e2a2280508aecf3ee010587e6743'
+ "gnome-3.8.patch"
+ "switch-applications.patch"
+ "fallback-helpers.patch")
+md5sums=('95260dc968ca9be32c265b35df2dd49d'
'2b1ece84416c3e4de030be15f1774d82'
'c3f25b06d345d9d36c197cd96e08f496'
- 'c36138eddde544b5c27b66d19451e7a5')
+ 'cf2efbe1a5c48e1be53a0e8e4b7c3181'
+ '16258907bf51cd8c1569263791ffa620'
+ 'f7aa8ace9c9543ba2fd66bd530244fed')
build() {
cd ${srcdir}/linuxmint-Cinnamon*
+ # Python2 fix
+ sed -i 's|#! /usr/bin/python|#! /usr/bin/python2|' \
+ files/usr/bin/$pkgname-menu-editor \
+ files/usr/share/$pkgname/applets/panel-launchers@$pkgname.org/$pkgname-add-panel-launcher.py
+ find -type f | xargs sed -i 's@^#!.*python$@#!/usr/bin/python2@'
+
# Fix Keyboard applet
# https://github.com/linuxmint/Cinnamon/issues/1337
- patch -Np1 -i ${srcdir}/keyboard_applet.patch
+ patch -Np1 -i ../keyboard_applet.patch
# Check for the cc-panel path, not for the unneeded binary
- patch -Np1 -i ${srcdir}/fix-control-center-check.patch
+ patch -Np1 -i ../fix-control-center-check.patch
- # Fix Keyboard settings (https://bugs.archlinux.org/task/34472)
- patch -Np1 -i ${srcdir}/fix-keyboard-settings.patch
+ # https://github.com/linuxmint/Cinnamon/pull/1888
+ patch -Np1 -i ../gnome-3.8.patch
+ # Fix windows switcher keybinding with default settings in GNOME 3.8
+ patch -Np1 -i ../switch-applications.patch
+
+ # Start media keys and mount helpers with the session
+ patch -Np1 -i ../fallback-helpers.patch
./autogen.sh --prefix=/usr \
--sysconfdir=/etc \
@@ -54,31 +70,10 @@ build() {
--disable-schemas-compile \
--enable-compile-warnings=yes \
--with-session-tracking=systemd
-
make
}
package() {
cd ${srcdir}/linuxmint-Cinnamon*
make DESTDIR="${pkgdir}" install
-
- # Install autostart files for gnome-fallback-mount-helper
- install -Dm644 /etc/xdg/autostart/gnome-fallback-mount-helper.desktop \
- "${pkgdir}/etc/xdg/autostart/gnome-fallback-mount-helper-cinnamon.desktop"
- sed -i 's/^AutostartCondition=.*/AutostartCondition=GNOME3 if-session cinnamon/' \
- "${pkgdir}/etc/xdg/autostart/gnome-fallback-mount-helper-cinnamon.desktop"
-
- install -Dm644 /etc/xdg/autostart/gnome-fallback-mount-helper.desktop \
- "${pkgdir}/etc/xdg/autostart/gnome-fallback-mount-helper-cinnamon2d.desktop"
- sed -i 's/^AutostartCondition=.*/AutostartCondition=GNOME3 if-session cinnamon2d/' \
- "${pkgdir}/etc/xdg/autostart/gnome-fallback-mount-helper-cinnamon2d.desktop"
-
- # Python2 fix
- sed -i 's|#! /usr/bin/python|#! /usr/bin/python2|' \
- "${pkgdir}/usr/bin/$pkgname-menu-editor" \
- "${pkgdir}/usr/share/$pkgname/applets/panel-launchers@$pkgname.org/$pkgname-add-panel-launcher.py"
-
- find "${pkgdir}" -type f | xargs sed -i 's@^#!.*python$@#!/usr/bin/python2@'
}
-
-
diff --git a/community/cinnamon/cinnamon.install b/community/cinnamon/cinnamon.install
index 901fd95c9..326aa98a2 100644
--- a/community/cinnamon/cinnamon.install
+++ b/community/cinnamon/cinnamon.install
@@ -2,28 +2,10 @@ post_install() {
glib-compile-schemas usr/share/glib-2.0/schemas
}
-pre_upgrade() {
- if [ -f /usr/share/gconf/schemas/cinnamon.schemas ]; then
- gconfpkg --uninstall cinnamon
- fi
-
- if [ "$(vercmp 1.6.7-6 "$2")" -eq 1 ]; then
- if [[ -h '/usr/lib/libgnome-desktop-3.so.2' ]]; then
- if [[ $(uname -m) == 'i686' ]]; then
- unlink /usr/lib/libgnome-desktop-3.so.2
- fi
- fi
- fi
-}
-
post_upgrade() {
post_install
}
-pre_remove() {
- pre_upgrade
-}
-
post_remove() {
post_install
}
diff --git a/community/cinnamon/fallback-helpers.patch b/community/cinnamon/fallback-helpers.patch
new file mode 100644
index 000000000..6fe318bd9
--- /dev/null
+++ b/community/cinnamon/fallback-helpers.patch
@@ -0,0 +1,21 @@
+diff -Naur linuxmint-Cinnamon-b41bad0.orig/files/usr/share/gnome-session/sessions/cinnamon2d.session linuxmint-Cinnamon-b41bad0/files/usr/share/gnome-session/sessions/cinnamon2d.session
+--- linuxmint-Cinnamon-b41bad0.orig/files/usr/share/gnome-session/sessions/cinnamon2d.session 2013-04-15 15:55:01.000000000 +0200
++++ linuxmint-Cinnamon-b41bad0/files/usr/share/gnome-session/sessions/cinnamon2d.session 2013-04-25 01:30:35.435650613 +0200
+@@ -1,5 +1,5 @@
+ [GNOME Session]
+ Name=Cinnamon 2D
+-RequiredComponents=cinnamon2d;gnome-settings-daemon;
++RequiredComponents=cinnamon2d;gnome-settings-daemon;gnome-fallback-media-keys-helper;gnome-fallback-mount-helper;
+ DesktopName=GNOME
+
+diff -Naur linuxmint-Cinnamon-b41bad0.orig/files/usr/share/gnome-session/sessions/cinnamon.session linuxmint-Cinnamon-b41bad0/files/usr/share/gnome-session/sessions/cinnamon.session
+--- linuxmint-Cinnamon-b41bad0.orig/files/usr/share/gnome-session/sessions/cinnamon.session 2013-04-15 15:55:01.000000000 +0200
++++ linuxmint-Cinnamon-b41bad0/files/usr/share/gnome-session/sessions/cinnamon.session 2013-04-25 01:30:33.645607769 +0200
+@@ -1,6 +1,6 @@
+ [GNOME Session]
+ Name=Cinnamon
+-RequiredComponents=cinnamon;gnome-settings-daemon;
++RequiredComponents=cinnamon;gnome-settings-daemon;gnome-fallback-media-keys-helper;gnome-fallback-mount-helper;
+ IsRunnableHelper=/usr/lib/gnome-session/gnome-session-check-accelerated
+ FallbackSession=cinnamon2d
+ DesktopName=GNOME
diff --git a/community/cinnamon/fix-keyboard-settings.patch b/community/cinnamon/fix-keyboard-settings.patch
deleted file mode 100644
index b606939c9..000000000
--- a/community/cinnamon/fix-keyboard-settings.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-From 034f9c886a4b08e214193576b11fb97ba3d62922 Mon Sep 17 00:00:00 2001
-From: Lusito <core@roughael.net>
-Date: Sun, 10 Mar 2013 21:01:07 +0100
-Subject: [PATCH] fix for broken keyboard settings
-
----
- files/usr/lib/cinnamon-settings/bin/SettingsWidgets.py | 2 +-
- files/usr/lib/cinnamon-settings/modules/cs_keyboard.py | 12 ++++++------
- 2 files changed, 7 insertions(+), 7 deletions(-)
-
-diff --git a/files/usr/lib/cinnamon-settings/bin/SettingsWidgets.py b/files/usr/lib/cinnamon-settings/bin/SettingsWidgets.py
-index b8842fe..cdccf46 100644
---- a/files/usr/lib/cinnamon-settings/bin/SettingsWidgets.py
-+++ b/files/usr/lib/cinnamon-settings/bin/SettingsWidgets.py
-@@ -9,7 +9,7 @@
- import gettext
- from gi.repository import Gio, Gtk, GObject, Gdk
- from gi.repository import GdkPixbuf
--# import gconf
-+ from gi.repository import GConf
- import json
- import dbus
- import time
-diff --git a/files/usr/lib/cinnamon-settings/modules/cs_keyboard.py b/files/usr/lib/cinnamon-settings/modules/cs_keyboard.py
-index 27a75ae..1ea8fd9 100644
---- a/files/usr/lib/cinnamon-settings/modules/cs_keyboard.py
-+++ b/files/usr/lib/cinnamon-settings/modules/cs_keyboard.py
-@@ -8,7 +8,7 @@
- gettext.install("cinnamon", "/usr/share/cinnamon/locale")
-
- # Keybindings page - check if we need to store custom
--# keybindings to gsettings key as well as gconf (In Mint 14 this is changed)
-+# keybindings to gsettings key as well as GConf (In Mint 14 this is changed)
- CUSTOM_KEYS_BASENAME = "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings"
- CUSTOM_KEYS_SCHEMA = "org.gnome.settings-daemon.plugins.media-keys.custom-keybinding"
- CUSTOM_KEYBINDINGS_GSETTINGS = False
-@@ -160,7 +160,7 @@ def __init__(self, content_box):
- first_run_completed = schema.get_boolean("custom-keybindings-to-3-6")
-
- if CUSTOM_KEYBINDINGS_GSETTINGS and not first_run_completed:
-- gclient = gconf.client_get_default()
-+ gclient = GConf.Client.get_default()
- path = "/desktop/gnome/keybindings"
- subdirs = gclient.all_dirs(path)
- for subdir in subdirs:
-@@ -251,7 +251,7 @@ def setBinding(self, index, val):
- self.writeSettings()
-
- def writeSettings(self):
-- gclient = gconf.client_get_default()
-+ gclient = GConf.Client.get_default()
- gclient.set_string(self.path + "/name", self.label)
- gclient.set_string(self.path + "/action", self.action)
- gclient.set_string(self.path + "/binding", self.entries[0])
-@@ -537,7 +537,7 @@ def loadCustoms(self):
- for category in self.main_store:
- if category.int_name is "custom":
- category.clear()
-- gclient = gconf.client_get_default()
-+ gclient = GConf.Client.get_default()
- path = "/desktop/gnome/keybindings"
- subdirs = gclient.all_dirs(path)
- for subdir in subdirs:
-@@ -645,7 +645,7 @@ def onAddCustomButtonClicked(self, button):
- dialog.destroy()
- return
-
-- gclient = gconf.client_get_default()
-+ gclient = GConf.Client.get_default()
- path = "/desktop/gnome/keybindings/custom"
- i = 0
- while gclient.dir_exists(path + str(i)):
-@@ -670,7 +670,7 @@ def onRemoveCustomButtonClicked(self, button):
- keybindings, iter = self.kb_tree.get_selection().get_selected()
- if iter:
- keybinding = keybindings[iter][1]
-- gclient = gconf.client_get_default()
-+ gclient = GConf.Client.get_default()
- if gclient.dir_exists(keybinding.path):
- gclient.unset(keybinding.path + "/name")
- gclient.unset(keybinding.path + "/action")
---
-1.8.1.5
diff --git a/community/cinnamon/gnome-3.8.patch b/community/cinnamon/gnome-3.8.patch
new file mode 100644
index 000000000..61cd9180f
--- /dev/null
+++ b/community/cinnamon/gnome-3.8.patch
@@ -0,0 +1,3669 @@
+From f4020d3960fa96a101bdb1c3ac1e1a452dbbf48c Mon Sep 17 00:00:00 2001
+From: Michael Webster <miketwebster@gmail.com>
+Date: Fri, 19 Apr 2013 13:19:50 -0400
+Subject: [PATCH 01/15] Disable XInput on cinnamon startup (for 3.8 compat)
+ This has no effect on < 1.14 clutter
+
+---
+ src/main.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/main.c b/src/main.c
+index 418fb60..ac90d91 100644
+--- a/src/main.c
++++ b/src/main.c
+@@ -260,6 +260,7 @@
+ meta_plugin_type_register (gnome_cinnamon_plugin_get_type ());
+
+ /* Prevent meta_init() from causing gtk to load gail and at-bridge */
++ g_setenv ("CLUTTER_DISABLE_XINPUT", "1", TRUE);
+ g_setenv ("NO_GAIL", "1", TRUE);
+ g_setenv ("NO_AT_BRIDGE", "1", TRUE);
+ meta_init ();
+--
+1.8.1.6
+
+
+From cc68659ecdd9e43128ec2b4555479f930c0d1ccd Mon Sep 17 00:00:00 2001
+From: Michael Webster <miketwebster@gmail.com>
+Date: Fri, 19 Apr 2013 13:21:40 -0400
+Subject: [PATCH 02/15] Explain change
+
+---
+ src/main.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/src/main.c b/src/main.c
+index ac90d91..9d37975 100644
+--- a/src/main.c
++++ b/src/main.c
+@@ -257,10 +257,12 @@
+
+ g_option_context_free (ctx);
+
++ /* Disable XInput extension - required for 3.8 compatibility */
++ g_setenv ("CLUTTER_DISABLE_XINPUT", "1", TRUE);
++
+ meta_plugin_type_register (gnome_cinnamon_plugin_get_type ());
+
+ /* Prevent meta_init() from causing gtk to load gail and at-bridge */
+- g_setenv ("CLUTTER_DISABLE_XINPUT", "1", TRUE);
+ g_setenv ("NO_GAIL", "1", TRUE);
+ g_setenv ("NO_AT_BRIDGE", "1", TRUE);
+ meta_init ();
+--
+1.8.1.6
+
+
+From f3777b3b2733b965bd348c7175ee67ee268aee06 Mon Sep 17 00:00:00 2001
+From: Michael Webster <miketwebster@gmail.com>
+Date: Tue, 16 Apr 2013 17:01:30 -0400
+Subject: [PATCH 03/15] Add backgroundManager - this is needed for gnome 3.8
+ compatibility, as gnome-settings-daemon no longer handles the desktop
+ background.
+
+---
+ configure.ac | 7 +-
+ data/org.cinnamon.gschema.xml.in | 71 +++-
+ .../cinnamon-settings/modules/cs_backgrounds.py | 31 +-
+ js/ui/main.js | 3 +-
+ src/Makefile.am | 2 +
+ src/cinnamon-background-manager.c | 411 +++++++++++++++++++++
+ src/cinnamon-background-manager.h | 57 +++
+ 7 files changed, 562 insertions(+), 20 deletions(-)
+ create mode 100644 src/cinnamon-background-manager.c
+ create mode 100644 src/cinnamon-background-manager.h
+
+diff --git a/configure.ac b/configure.ac
+index 0aa47c5..a2a9479 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -68,6 +68,7 @@ GTK_MIN_VERSION=3.0.0
+ GIO_MIN_VERSION=2.29.10
+ POLKIT_MIN_VERSION=0.100
+ STARTUP_NOTIFICATION_MIN_VERSION=0.11
++GNOME_DESKTOP_MIN_VERSION=3.0.0
+
+ # Collect more than 20 libraries for a prize!
+ PKG_CHECK_MODULES(CINNAMON, gio-2.0 >= $GIO_MIN_VERSION
+@@ -82,7 +83,8 @@ PKG_CHECK_MODULES(CINNAMON, gio-2.0 >= $GIO_MIN_VERSION
+ gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
+ libcanberra
+ polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
+- libnm-glib libnm-util gnome-keyring-1)
++ libnm-glib libnm-util gnome-keyring-1
++ gnome-desktop-3.0 >= GNOME_DESKTOP_MIN_VERSION)
+
+ PKG_CHECK_MODULES(CINNAMON_PERF_HELPER, gtk+-3.0 gio-2.0)
+
+@@ -106,7 +108,8 @@ AC_CHECK_FUNCS(JS_NewGlobalObject XFixesCreatePointerBarrier)
+ CFLAGS=$saved_CFLAGS
+ LIBS=$saved_LIBS
+
+-PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.2 gnome-desktop-3.0 >= 2.90.0 x11)
++PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.2
++ gnome-desktop-3.0 >= GNOME_DESKTOP_MIN_VERSION x11)
+ PKG_CHECK_MODULES(GDMUSER, dbus-glib-1 gtk+-3.0)
+ PKG_CHECK_MODULES(TRAY, gtk+-3.0)
+ PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0)
+diff --git a/data/org.cinnamon.gschema.xml.in b/data/org.cinnamon.gschema.xml.in
+index ffbad92..6f55477 100644
+--- a/data/org.cinnamon.gschema.xml.in
++++ b/data/org.cinnamon.gschema.xml.in
+@@ -720,6 +720,23 @@
+ </key>
+ </schema>
+
++
++ <enum id="bg_style">
++ <value nick="none" value="0"/>
++ <value nick="wallpaper" value="1"/>
++ <value nick="centered" value="2"/>
++ <value nick="scaled" value="3"/>
++ <value nick="stretched" value="4"/>
++ <value nick="zoom" value="5"/>
++ <value nick="spanned" value="6"/>
++ </enum>
++
++ <enum id="bg_shading">
++ <value nick="solid" value="0"/>
++ <value nick="vertical" value="1"/>
++ <value nick="horizontal" value="2"/>
++ </enum>
++
+ <schema id="org.cinnamon.background" path="/org/cinnamon/background/">
+ <key name="mode" type="s">
+ <default>"wallpaper"</default>
+@@ -750,8 +767,60 @@
+ This key defines the delay for the slideshow.
+ </description>
+ </key>
++ <key name="draw-background" type="b">
++ <default>true</default>
++ <_summary>Draw Desktop Background</_summary>
++ <_description>Have GNOME draw the desktop background.</_description>
++ </key>
++ <key name="picture-options" enum="bg_style">
++ <default>'zoom'</default>
++ <_summary>Picture Options</_summary>
++ <_description>
++ Determines how the image set by wallpaper_filename is rendered.
++ Possible values are "none", "wallpaper", "centered", "scaled",
++ "stretched", "zoom", "spanned".
++ </_description>
++ </key>
++ <key name="picture-uri" type="s">
++ <default>'file://@datadir@/themes/Adwaita/backgrounds/adwaita-timed.xml'</default>
++ <_summary>Picture URI</_summary>
++ <_description>
++ URI to use for the background image. Not that the backend only supports
++ local (file://) URIs.
++ </_description>
++ </key>
++ <key name="picture-opacity" type="i">
++ <range min="0" max="100"/>
++ <default>100</default>
++ <_summary>Picture Opacity</_summary>
++ <_description>
++ Opacity with which to draw the background picture.
++ </_description>
++ </key>
++ <key name="primary-color" type="s">
++ <default>'#023c88'</default>
++ <_summary>Primary Color</_summary>
++ <_description>
++ Left or Top color when drawing gradients, or the solid color.
++ </_description>
++ </key>
++ <key name="secondary-color" type="s">
++ <default>'#5789ca'</default>
++ <_summary>Secondary Color</_summary>
++ <_description>
++ Right or Bottom color when drawing gradients, not used for solid color.
++ </_description>
++ </key>
++ <key name="color-shading-type" enum="bg_shading">
++ <default>'solid'</default>
++ <_summary>Color Shading Type</_summary>
++ <_description>
++ How to shade the background color. Possible values are "horizontal",
++ "vertical", and "solid".
++ </_description>
++ </key>
+ </schema>
+-
++
+ <schema id="org.cinnamon.screensaver" path="/org/cinnamon/screensaver/">
+ <key name="default-message" type="s">
+ <default>""</default>
+diff --git a/files/usr/lib/cinnamon-settings/modules/cs_backgrounds.py b/files/usr/lib/cinnamon-settings/modules/cs_backgrounds.py
+index f964aed..4a38c84 100644
+--- a/files/usr/lib/cinnamon-settings/modules/cs_backgrounds.py
++++ b/files/usr/lib/cinnamon-settings/modules/cs_backgrounds.py
+@@ -232,11 +232,11 @@ def getFirstFileFromBackgroundXml(self, filename):
+
+
+ class BackgroundWallpaperPane (Gtk.VBox):
+- def __init__(self, sidepage, gnome_background_schema):
++ def __init__(self, sidepage, cinnamon_background_schema):
+ Gtk.VBox.__init__(self)
+ self.set_spacing(5)
+
+- self._gnome_background_schema = gnome_background_schema
++ self._cinnamon_background_schema = cinnamon_background_schema
+ self._sidepage = sidepage
+
+ scw = Gtk.ScrolledWindow()
+@@ -263,15 +263,15 @@ def _on_selection_changed(self, iconview):
+ if wallpaper:
+ for key in wallpaper:
+ if key == "filename":
+- self._gnome_background_schema.set_string("picture-uri", "file://" + wallpaper[key])
++ self._cinnamon_background_schema.set_string("picture-uri", "file://" + wallpaper[key])
+ elif key == "pcolor":
+- self._gnome_background_schema.set_string("primary-color", wallpaper[key])
++ self._cinnamon_background_schema.set_string("primary-color", wallpaper[key])
+ elif key == "scolor":
+- self._gnome_background_schema.set_string("secondary-color", wallpaper[key])
++ self._cinnamon_background_schema.set_string("secondary-color", wallpaper[key])
+ elif key == "shade_type":
+- self._gnome_background_schema.set_string("color-shading-type", wallpaper[key])
++ self._cinnamon_background_schema.set_string("color-shading-type", wallpaper[key])
+ elif key == "options":
+- self._gnome_background_schema.set_string("picture-options", wallpaper[key])
++ self._cinnamon_background_schema.set_string("picture-options", wallpaper[key])
+ if (not "metadataFile" in wallpaper) or (wallpaper["metadataFile"] == ""):
+ self._sidepage.remove_wallpaper_button.set_sensitive(True)
+
+@@ -364,7 +364,7 @@ def run(self):
+ return res
+
+ class BackgroundSlideshowPane(Gtk.Table):
+- def __init__(self, sidepage, gnome_background_schema, cinnamon_background_schema):
++ def __init__(self, sidepage, cinnamon_background_schema):
+ Gtk.Table.__init__(self)
+ self.set_col_spacings(5)
+ self.set_row_spacings(5)
+@@ -445,12 +445,11 @@ def _do_update_list(self, folder, recursive, delay, transition_duration = 0):
+ f = open(filename, "w")
+ f.write(xml_data)
+ f.close()
+- Gio.Settings("org.gnome.desktop.background").set_string("picture-uri", "file://" + filename)
++ Gio.Settings("org.cinnamon.background").set_string("picture-uri", "file://" + filename)
+
+ class BackgroundSidePage (SidePage):
+ def __init__(self, name, icon, keywords, advanced, content_box):
+ SidePage.__init__(self, name, icon, keywords, advanced, content_box)
+- self._gnome_background_schema = Gio.Settings("org.gnome.desktop.background")
+ self._cinnamon_background_schema = Gio.Settings("org.cinnamon.background")
+ self._add_wallpapers_dialog = AddWallpapersDialog()
+
+@@ -515,8 +514,8 @@ def build(self, advanced):
+ self.mainbox.set_visible_window(False)
+ self.content_box.pack_start(self.mainbox, True, True, 3)
+
+- self.wallpaper_pane = BackgroundWallpaperPane(self, self._gnome_background_schema)
+- self.slideshow_pane = BackgroundSlideshowPane(self, self._gnome_background_schema, self._cinnamon_background_schema)
++ self.wallpaper_pane = BackgroundWallpaperPane(self, self._cinnamon_background_schema)
++ self.slideshow_pane = BackgroundSlideshowPane(self, self._cinnamon_background_schema)
+ if self._cinnamon_background_schema["mode"] == "slideshow":
+ self.mainbox.add(self.slideshow_pane)
+ else:
+@@ -536,21 +535,21 @@ def build(self, advanced):
+ l = Gtk.Label(_("Picture aspect"))
+ l.set_alignment(0, 0.5)
+ advanced_options_box.pack_start(l, False, False, 0)
+- self.picture_options = GSettingsComboBox("", "org.gnome.desktop.background", "picture-options", None, BACKGROUND_PICTURE_OPTIONS)
++ self.picture_options = GSettingsComboBox("", "org.cinnamon.background", "picture-options", None, BACKGROUND_PICTURE_OPTIONS)
+ advanced_options_box.pack_start(self.picture_options, False, False, 0)
+
+ l = Gtk.Label(_("Gradient"))
+ l.set_alignment(0, 0.5)
+ advanced_options_box.pack_start(l, False, False, 0)
+- self.color_shading_type = GSettingsComboBox("", "org.gnome.desktop.background", "color-shading-type", None, BACKGROUND_COLOR_SHADING_TYPES)
++ self.color_shading_type = GSettingsComboBox("", "org.cinnamon.background", "color-shading-type", None, BACKGROUND_COLOR_SHADING_TYPES)
+ advanced_options_box.pack_start(self.color_shading_type, False, False, 0)
+
+ hbox = Gtk.HBox()
+ l = Gtk.Label(_("Colors"))
+ hbox.pack_start(l, False, False, 2)
+- self.primary_color = GSettingsColorChooser("org.gnome.desktop.background", "primary-color", None)
++ self.primary_color = GSettingsColorChooser("org.cinnamon.background", "primary-color", None)
+ hbox.pack_start(self.primary_color, False, False, 2)
+- self.secondary_color = GSettingsColorChooser("org.gnome.desktop.background", "secondary-color", None)
++ self.secondary_color = GSettingsColorChooser("org.cinnamon.background", "secondary-color", None)
+ hbox.pack_start(self.secondary_color, False, False, 2)
+ advanced_options_box.pack_start(hbox, False, False, 0)
+ self.content_box.show_all()
+diff --git a/js/ui/main.js b/js/ui/main.js
+index 11920a4..5cae372 100644
+--- a/js/ui/main.js
++++ b/js/ui/main.js
+@@ -86,6 +86,7 @@ let _cssStylesheet = null;
+ let dynamicWorkspaces = null;
+ let nWorks = null;
+ let tracker = null;
++let backgroundManager = null;
+ let desktopShown;
+
+ let workspace_names = [];
+@@ -214,7 +215,7 @@ function start() {
+ // be predictable anyways.
+ tracker = Cinnamon.WindowTracker.get_default();
+ Cinnamon.AppUsage.get_default();
+-
++ backgroundManager = Cinnamon.BackgroundManager.get_default();
+ // The stage is always covered so Clutter doesn't need to clear it; however
+ // the color is used as the default contents for the Muffin root background
+ // actor so set it anyways.
+diff --git a/src/Makefile.am b/src/Makefile.am
+index 51413aa..6efce18 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -105,6 +105,7 @@ cinnamon_public_headers_h = \
+ cinnamon-app-system.h \
+ cinnamon-app-usage.h \
+ cinnamon-arrow.h \
++ cinnamon-background-manager.h \
+ cinnamon-doc-system.h \
+ cinnamon-embedded-window.h \
+ cinnamon-generic-container.h \
+@@ -142,6 +143,7 @@ libcinnamon_la_SOURCES = \
+ cinnamon-app-system.c \
+ cinnamon-app-usage.c \
+ cinnamon-arrow.c \
++ cinnamon-background-manager.c \
+ cinnamon-doc-system.c \
+ cinnamon-embedded-window.c \
+ cinnamon-generic-container.c \
+diff --git a/src/cinnamon-background-manager.c b/src/cinnamon-background-manager.c
+new file mode 100644
+index 0000000..9d95250
+--- /dev/null
++++ b/src/cinnamon-background-manager.c
+@@ -0,0 +1,411 @@
++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
++ *
++ * Copyright © 2001 Ximian, Inc.
++ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
++ * Copyright 2007 Red Hat, Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ *
++ */
++
++#include "config.h"
++
++#include <sys/types.h>
++#include <sys/wait.h>
++#include <stdlib.h>
++#include <stdio.h>
++#include <unistd.h>
++#include <string.h>
++#include <errno.h>
++
++#include <locale.h>
++
++#include <glib.h>
++#include <glib/gi18n.h>
++#include <gio/gio.h>
++#include <gdk/gdk.h>
++#include <gdk/gdkx.h>
++
++#define GNOME_DESKTOP_USE_UNSTABLE_API
++#include <libgnome-desktop/gnome-bg.h>
++#include <X11/Xatom.h>
++
++#include "cinnamon-background-manager.h"
++
++#define CINNAMON_BACKGROUND_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CINNAMON_TYPE_BACKGROUND_MANAGER, CinnamonBackgroundManagerPrivate))
++
++struct CinnamonBackgroundManagerPrivate
++{
++ GSettings *settings;
++ GnomeBG *bg;
++
++ GnomeBGCrossfade *fade;
++
++ GDBusProxy *proxy;
++ guint proxy_signal_id;
++};
++
++static void cinnamon_background_manager_class_init (CinnamonBackgroundManagerClass *klass);
++static void cinnamon_background_manager_init (CinnamonBackgroundManager *background_manager);
++static void cinnamon_background_manager_finalize (GObject *object);
++
++static void setup_bg (CinnamonBackgroundManager *manager);
++static void connect_screen_signals (CinnamonBackgroundManager *manager);
++
++G_DEFINE_TYPE (CinnamonBackgroundManager, cinnamon_background_manager, G_TYPE_OBJECT)
++
++static gpointer manager_object = NULL;
++
++static gboolean
++dont_draw_background (CinnamonBackgroundManager *manager)
++{
++ return !g_settings_get_boolean (manager->priv->settings,
++ "draw-background");
++}
++
++static void
++on_crossfade_finished (CinnamonBackgroundManager *manager)
++{
++ g_object_unref (manager->priv->fade);
++ manager->priv->fade = NULL;
++}
++
++static void
++draw_background (CinnamonBackgroundManager *manager,
++ gboolean use_crossfade)
++{
++ GdkDisplay *display;
++ int n_screens;
++ int i;
++
++ display = gdk_display_get_default ();
++ n_screens = gdk_display_get_n_screens (display);
++
++ for (i = 0; i < n_screens; ++i) {
++ GdkScreen *screen;
++ GdkWindow *root_window;
++ cairo_surface_t *surface;
++
++ screen = gdk_display_get_screen (display, i);
++
++ root_window = gdk_screen_get_root_window (screen);
++
++ surface = gnome_bg_create_surface (manager->priv->bg,
++ root_window,
++ gdk_screen_get_width (screen),
++ gdk_screen_get_height (screen),
++ TRUE);
++
++ if (use_crossfade) {
++
++ if (manager->priv->fade != NULL) {
++ g_object_unref (manager->priv->fade);
++ }
++
++ manager->priv->fade = gnome_bg_set_surface_as_root_with_crossfade (screen, surface);
++ g_signal_connect_swapped (manager->priv->fade, "finished",
++ G_CALLBACK (on_crossfade_finished),
++ manager);
++ } else {
++ gnome_bg_set_surface_as_root (screen, surface);
++ }
++
++ cairo_surface_destroy (surface);
++ }
++}
++
++static void
++on_bg_transitioned (GnomeBG *bg,
++ CinnamonBackgroundManager *manager)
++{
++ draw_background (manager, FALSE);
++}
++
++static gboolean
++settings_change_event_cb (GSettings *settings,
++ gpointer keys,
++ gint n_keys,
++ CinnamonBackgroundManager *manager)
++{
++ gnome_bg_load_from_preferences (manager->priv->bg,
++ manager->priv->settings);
++ return FALSE;
++}
++
++static void
++on_screen_size_changed (GdkScreen *screen,
++ CinnamonBackgroundManager *manager)
++{
++ draw_background (manager, FALSE);
++}
++
++static void
++watch_bg_preferences (CinnamonBackgroundManager *manager)
++{
++ g_signal_connect (manager->priv->settings,
++ "change-event",
++ G_CALLBACK (settings_change_event_cb),
++ manager);
++}
++
++static void
++on_bg_changed (GnomeBG *bg,
++ CinnamonBackgroundManager *manager)
++{
++ draw_background (manager, TRUE);
++}
++
++static void
++setup_bg (CinnamonBackgroundManager *manager)
++{
++ g_return_if_fail (manager->priv->bg == NULL);
++
++ manager->priv->bg = gnome_bg_new ();
++
++ g_signal_connect (manager->priv->bg,
++ "changed",
++ G_CALLBACK (on_bg_changed),
++ manager);
++
++ g_signal_connect (manager->priv->bg,
++ "transitioned",
++ G_CALLBACK (on_bg_transitioned),
++ manager);
++
++ connect_screen_signals (manager);
++ watch_bg_preferences (manager);
++ gnome_bg_load_from_preferences (manager->priv->bg,
++ manager->priv->settings);
++}
++
++static void
++setup_bg_and_draw_background (CinnamonBackgroundManager *manager)
++{
++ setup_bg (manager);
++ draw_background (manager, FALSE);
++}
++
++static void
++disconnect_session_manager_listener (CinnamonBackgroundManager *manager)
++{
++ if (manager->priv->proxy && manager->priv->proxy_signal_id) {
++ g_signal_handler_disconnect (manager->priv->proxy,
++ manager->priv->proxy_signal_id);
++ manager->priv->proxy_signal_id = 0;
++ }
++}
++
++static void
++on_session_manager_signal (GDBusProxy *proxy,
++ const gchar *sender_name,
++ const gchar *signal_name,
++ GVariant *parameters,
++ gpointer user_data)
++{
++ CinnamonBackgroundManager *manager = CINNAMON_BACKGROUND_MANAGER (user_data);
++
++ if (g_strcmp0 (signal_name, "SessionRunning") == 0) {
++ setup_bg_and_draw_background (manager);
++ disconnect_session_manager_listener (manager);
++ }
++}
++
++static void
++draw_background_after_session_loads (CinnamonBackgroundManager *manager)
++{
++ GError *error = NULL;
++ GDBusProxyFlags flags;
++
++ flags = G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
++ G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START;
++ manager->priv->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
++ flags,
++ NULL, /* GDBusInterfaceInfo */
++ "org.gnome.SessionManager",
++ "/org/gnome/SessionManager",
++ "org.gnome.SessionManager",
++ NULL, /* GCancellable */
++ &error);
++ if (manager->priv->proxy == NULL) {
++ g_warning ("Could not listen to session manager: %s",
++ error->message);
++ g_error_free (error);
++ return;
++ }
++
++ manager->priv->proxy_signal_id = g_signal_connect (manager->priv->proxy,
++ "g-signal",
++ G_CALLBACK (on_session_manager_signal),
++ manager);
++}
++
++
++static void
++disconnect_screen_signals (CinnamonBackgroundManager *manager)
++{
++ GdkDisplay *display;
++ int i;
++ int n_screens;
++
++ display = gdk_display_get_default ();
++ n_screens = gdk_display_get_n_screens (display);
++
++ for (i = 0; i < n_screens; ++i) {
++ GdkScreen *screen;
++ screen = gdk_display_get_screen (display, i);
++ g_signal_handlers_disconnect_by_func (screen,
++ G_CALLBACK (on_screen_size_changed),
++ manager);
++ }
++}
++
++static void
++connect_screen_signals (CinnamonBackgroundManager *manager)
++{
++ GdkDisplay *display;
++ int i;
++ int n_screens;
++
++ display = gdk_display_get_default ();
++ n_screens = gdk_display_get_n_screens (display);
++
++ for (i = 0; i < n_screens; ++i) {
++ GdkScreen *screen;
++ screen = gdk_display_get_screen (display, i);
++ g_signal_connect (screen,
++ "monitors-changed",
++ G_CALLBACK (on_screen_size_changed),
++ manager);
++ g_signal_connect (screen,
++ "size-changed",
++ G_CALLBACK (on_screen_size_changed),
++ manager);
++ }
++}
++
++static void
++draw_background_changed (GSettings *settings,
++ const char *key,
++ CinnamonBackgroundManager *manager)
++{
++ if (dont_draw_background (manager) == FALSE)
++ setup_bg_and_draw_background (manager);
++}
++
++gboolean
++cinnamon_background_manager_start (CinnamonBackgroundManager *manager)
++{
++ manager->priv->settings = g_settings_new ("org.cinnamon.background");
++ g_signal_connect (manager->priv->settings, "changed::draw-background",
++ G_CALLBACK (draw_background_changed), manager);
++
++ setup_bg_and_draw_background (manager);
++ //draw_background_after_session_loads (manager);
++
++
++ return TRUE;
++}
++
++void
++cinnamon_background_manager_stop (CinnamonBackgroundManager *manager)
++{
++ CinnamonBackgroundManagerPrivate *p = manager->priv;
++
++ g_debug ("Stopping background manager");
++
++ disconnect_screen_signals (manager);
++
++ if (manager->priv->proxy) {
++ disconnect_session_manager_listener (manager);
++ g_object_unref (manager->priv->proxy);
++ }
++
++ g_signal_handlers_disconnect_by_func (manager->priv->settings,
++ settings_change_event_cb,
++ manager);
++
++ if (p->settings != NULL) {
++ g_object_unref (p->settings);
++ p->settings = NULL;
++ }
++
++ if (p->bg != NULL) {
++ g_object_unref (p->bg);
++ p->bg = NULL;
++ }
++}
++
++/**
++ * cinnamon_background_manager_get_default:
++ *
++ * Return Value: (transfer none): The global #CinnamonBackgroundManager singleton
++ */
++CinnamonBackgroundManager *
++cinnamon_background_manager_get_default ()
++{
++ static CinnamonBackgroundManager *instance = NULL;
++
++ if (instance == NULL)
++ instance = g_object_new (CINNAMON_TYPE_BACKGROUND_MANAGER, NULL);
++
++ return instance;
++}
++
++static GObject *
++cinnamon_background_manager_constructor (GType type,
++ guint n_construct_properties,
++ GObjectConstructParam *construct_properties)
++{
++ CinnamonBackgroundManager *background_manager;
++
++ background_manager = CINNAMON_BACKGROUND_MANAGER (G_OBJECT_CLASS (cinnamon_background_manager_parent_class)->constructor (type,
++ n_construct_properties,
++ construct_properties));
++
++ return G_OBJECT (background_manager);
++}
++
++static void
++cinnamon_background_manager_class_init (CinnamonBackgroundManagerClass *klass)
++{
++ GObjectClass *object_class = G_OBJECT_CLASS (klass);
++
++ object_class->constructor = cinnamon_background_manager_constructor;
++ object_class->finalize = cinnamon_background_manager_finalize;
++
++ g_type_class_add_private (klass, sizeof (CinnamonBackgroundManagerPrivate));
++}
++
++static void
++cinnamon_background_manager_init (CinnamonBackgroundManager *manager)
++{
++ manager->priv = CINNAMON_BACKGROUND_MANAGER_GET_PRIVATE (manager);
++ cinnamon_background_manager_start (manager);
++}
++
++static void
++cinnamon_background_manager_finalize (GObject *object)
++{
++ CinnamonBackgroundManager *background_manager;
++
++ g_return_if_fail (object != NULL);
++ g_return_if_fail (CINNAMON_IS_BACKGROUND_MANAGER (object));
++
++ background_manager = CINNAMON_BACKGROUND_MANAGER (object);
++
++ g_return_if_fail (background_manager->priv != NULL);
++
++ G_OBJECT_CLASS (cinnamon_background_manager_parent_class)->finalize (object);
++}
+diff --git a/src/cinnamon-background-manager.h b/src/cinnamon-background-manager.h
+new file mode 100644
+index 0000000..9a56e32
+--- /dev/null
++++ b/src/cinnamon-background-manager.h
+@@ -0,0 +1,57 @@
++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
++ *
++ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ *
++ */
++
++#ifndef __CINNAMON_BACKGROUND_MANAGER_H
++#define __CINNAMON_BACKGROUND_MANAGER_H
++
++#include <glib-object.h>
++
++G_BEGIN_DECLS
++
++#define CINNAMON_TYPE_BACKGROUND_MANAGER (cinnamon_background_manager_get_type ())
++#define CINNAMON_BACKGROUND_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), CINNAMON_TYPE_BACKGROUND_MANAGER, CinnamonBackgroundManager))
++#define CINNAMON_BACKGROUND_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), CINNAMON_TYPE_BACKGROUND_MANAGER, CinnamonBackgroundManagerClass))
++#define CINNAMON_IS_BACKGROUND_MANAGER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), CINNAMON_TYPE_BACKGROUND_MANAGER))
++#define CINNAMON_IS_BACKGROUND_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), CINNAMON_TYPE_BACKGROUND_MANAGER))
++#define CINNAMON_BACKGROUND_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), CINNAMON_TYPE_BACKGROUND_MANAGER, CinnamonBackgroundManagerClass))
++
++typedef struct CinnamonBackgroundManagerPrivate CinnamonBackgroundManagerPrivate;
++
++typedef struct
++{
++ GObject parent;
++ CinnamonBackgroundManagerPrivate *priv;
++} CinnamonBackgroundManager;
++
++typedef struct
++{
++ GObjectClass parent_class;
++} CinnamonBackgroundManagerClass;
++
++GType cinnamon_background_manager_get_type (void);
++
++CinnamonBackgroundManager *cinnamon_background_manager_get_default (void);
++
++gboolean cinnamon_background_manager_start (CinnamonBackgroundManager *manager);
++void cinnamon_background_manager_stop (CinnamonBackgroundManager *manager);
++
++G_END_DECLS
++
++#endif /* __CINNAMON_BACKGROUND_MANAGER_H */
+--
+1.8.1.6
+
+
+From 590a48961f2c7a1b18fb914a1d7212ffcdf03017 Mon Sep 17 00:00:00 2001
+From: Michael Webster <miketwebster@gmail.com>
+Date: Tue, 16 Apr 2013 18:28:16 -0400
+Subject: [PATCH 04/15] Change default background
+
+---
+ data/org.cinnamon.gschema.xml.in | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/data/org.cinnamon.gschema.xml.in b/data/org.cinnamon.gschema.xml.in
+index 6f55477..35b0972 100644
+--- a/data/org.cinnamon.gschema.xml.in
++++ b/data/org.cinnamon.gschema.xml.in
+@@ -782,7 +782,7 @@
+ </_description>
+ </key>
+ <key name="picture-uri" type="s">
+- <default>'file://@datadir@/themes/Adwaita/backgrounds/adwaita-timed.xml'</default>
++ <default>'file:///usr/share/backgrounds/linuxmint/default_background.jpg'</default>
+ <_summary>Picture URI</_summary>
+ <_description>
+ URI to use for the background image. Not that the backend only supports
+--
+1.8.1.6
+
+
+From ac8b0954c7506ae88059e488539f88d55329f070 Mon Sep 17 00:00:00 2001
+From: Michael Webster <miketwebster@gmail.com>
+Date: Tue, 16 Apr 2013 18:41:16 -0400
+Subject: [PATCH 05/15] Use distro-agnostic background..
+
+---
+ data/org.cinnamon.gschema.xml.in | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/data/org.cinnamon.gschema.xml.in b/data/org.cinnamon.gschema.xml.in
+index 35b0972..0d01089 100644
+--- a/data/org.cinnamon.gschema.xml.in
++++ b/data/org.cinnamon.gschema.xml.in
+@@ -782,7 +782,7 @@
+ </_description>
+ </key>
+ <key name="picture-uri" type="s">
+- <default>'file:///usr/share/backgrounds/linuxmint/default_background.jpg'</default>
++ <default>'file:///usr/share/themes/Adwaita/backgrounds/adwaita-timed.xml'</default>
+ <_summary>Picture URI</_summary>
+ <_description>
+ URI to use for the background image. Not that the backend only supports
+--
+1.8.1.6
+
+
+From 81dbccb60231744999463a5b84c7c36358570929 Mon Sep 17 00:00:00 2001
+From: dalcde <dalcde@yahoo.com.hk>
+Date: Mon, 15 Apr 2013 18:34:48 +0800
+Subject: [PATCH 06/15] [GDbus] Port DBus to GDBus (AltLinux patch)
+
+---
+ .../applets/brightness@cinnamon.org/applet.js | 39 ++--
+ .../cinnamon/applets/power@cinnamon.org/applet.js | 102 +++++----
+ .../cinnamon/applets/sound@cinnamon.org/applet.js | 244 +++++----------------
+ .../cinnamon/applets/xrandr@cinnamon.org/applet.js | 19 +-
+ js/misc/gnomeSession.js | 147 ++++---------
+ js/misc/modemManager.js | 79 ++++---
+ js/misc/screenSaver.js | 89 ++++----
+ js/ui/appletManager.js | 1 -
+ js/ui/automountManager.js | 106 +++++----
+ js/ui/autorunManager.js | 27 +--
+ js/ui/calendar.js | 71 +++---
+ js/ui/cinnamonDBus.js | 96 ++++----
+ js/ui/endSessionDialog.js | 79 ++++---
+ js/ui/keyboard.js | 48 ++--
+ js/ui/layout.js | 14 +-
+ js/ui/magnifierDBus.js | 134 +++++++----
+ js/ui/main.js | 6 -
+ js/ui/messageTray.js | 13 +-
+ js/ui/notificationDaemon.js | 193 ++++++++--------
+ js/ui/scripting.js | 34 ++-
+ 20 files changed, 688 insertions(+), 853 deletions(-)
+
+diff --git a/files/usr/share/cinnamon/applets/brightness@cinnamon.org/applet.js b/files/usr/share/cinnamon/applets/brightness@cinnamon.org/applet.js
+index 9cbda80..9087b25 100644
+--- a/files/usr/share/cinnamon/applets/brightness@cinnamon.org/applet.js
++++ b/files/usr/share/cinnamon/applets/brightness@cinnamon.org/applet.js
+@@ -5,7 +5,6 @@ const St = imports.gi.St;
+ const PopupMenu = imports.ui.popupMenu;
+ const GLib = imports.gi.GLib;
+ const Gio = imports.gi.Gio;
+-const DBus = imports.dbus;
+
+ /* constants */
+ const DimSettingsSchema = "org.gnome.settings-daemon.plugins.power";
+@@ -14,24 +13,25 @@ const DimSettingsBattery = "idle-dim-battery";
+ const PowerBusName = 'org.gnome.SettingsDaemon';
+ const PowerObjectPath = '/org/gnome/SettingsDaemon/Power';
+
+-/* DBus interface */
+-const PowerManagerInterface = {
+- name: 'org.gnome.SettingsDaemon.Power.Screen',
+- methods:
+- [
+- { name: 'GetPercentage', inSignature: '', outSignature: 'u' },
+- { name: 'SetPercentage', inSignature: 'u', outSignature: 'u' },
+- { name: 'StepUp', inSignature: '', outSignature: 'u' },
+- { name: 'StepDown', inSignature: '', outSignature: 'u' },
+- ],
+- signals:
+- [
+- { name: 'Changed', inSignature: '', outSignature: '' },
+- ]
+-};
++const PowerManagerInterface = <interface name="org.gnome.SettingsDaemon.Power.Screen">
++<method name="GetPercentage">
++ <arg type="u" direction="out"/>
++</method>
++<method name="SetPercentage">
++ <arg type="u" direction="in"/>
++ <arg type="u" direction="out"/>
++</method>
++<method name="StepUp">
++ <arg type="u" direction="out"/>
++</method>
++<method name="StepDown">
++ <arg type="u" direction="out"/>
++</method>
++<signal name="Changed" />
++</interface>;
+
+ /* DBus magic */
+-let PowerManagerProxy = DBus.makeProxyClass(PowerManagerInterface);
++const PowerManagerProxy = Gio.DBusProxy.makeProxyWrapper(PowerManagerInterface);
+
+ /* TextImageMenuItem taken from sound@cinnamon.org applet */
+ let icon_path = "/usr/share/cinnamon/theme/";
+@@ -100,7 +100,7 @@ MyApplet.prototype = {
+ Applet.IconApplet.prototype._init.call(this, orientation, panel_height);
+
+ try {
+- this._proxy = new PowerManagerProxy(DBus.session, PowerBusName, PowerObjectPath);
++ this._proxy = new PowerManagerProxy(Gio.DBus.session, PowerBusName, PowerObjectPath);
+
+ this.menuManager = new PopupMenu.PopupMenuManager(this);
+ this.menu = new Applet.AppletPopupMenu(this, orientation);
+@@ -137,7 +137,8 @@ MyApplet.prototype = {
+ this.menu.addMenuItem(this._settingsMenu);
+
+ //get notified
+- this._proxy.connect('Changed', Lang.bind(this, this._getBrightness));
++ this._proxy.connectSignal('Changed', Lang.bind(this, this._getBrightness));
++
+ this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
+ } else {
+ this.set_applet_tooltip(_("Brightness"));
+diff --git a/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js b/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js
+index c342fe7..b6b2bcd 100644
+--- a/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js
++++ b/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js
+@@ -1,6 +1,5 @@
+ const Applet = imports.ui.applet;
+ const Gio = imports.gi.Gio;
+-const DBus = imports.dbus;
+ const Lang = imports.lang;
+ const St = imports.gi.St;
+ const PopupMenu = imports.ui.popupMenu;
+@@ -42,34 +41,46 @@ const LabelDisplay = {
+ TIME: 'time'
+ };
+
+-const PowerManagerInterface = {
+- name: 'org.gnome.SettingsDaemon.Power',
+- methods: [
+- { name: 'GetDevices', inSignature: '', outSignature: 'a(susdut)' },
+- { name: 'GetPrimaryDevice', inSignature: '', outSignature: '(susdut)' },
+- ],
+- signals: [
+- { name: 'PropertiesChanged', inSignature: 's,a{sv},a[s]' },
+- ],
+- properties: [
+- { name: 'Icon', signature: 's', access: 'read' },
+- ]
+-};
+-let PowerManagerProxy = DBus.makeProxyClass(PowerManagerInterface);
+-
+-const SettingsManagerInterface = {
+- name: 'org.freedesktop.DBus.Properties',
+- methods: [
+- { name: 'Get', inSignature: 's,s', outSignature: 'v' },
+- { name: 'GetAll', inSignature: 's', outSignature: 'a{sv}' },
+- { name: 'Set', inSignature: 's,s,v', outSignature: '' }
+- ],
+- signals: [
+- {name: 'PropertiesChanged', inSignature:'s,a{sv},a[s]', outSignature:''}
+- ]
+-};
+-
+-let SettingsManagerProxy = DBus.makeProxyClass(SettingsManagerInterface);
++const PowerManagerInterface = <interface name="org.gnome.SettingsDaemon.Power">
++<method name="GetDevices">
++ <arg type="a(susdut)" direction="out"/>
++</method>
++<method name="GetPrimaryDevice">
++ <arg type="(susdut)" direction="out"/>
++</method>
++<signal name="PropertiesChanged">
++ <arg type="s"/>
++ <arg type="a{sv}"/>
++ <arg type="a[s]"/>
++</signal>
++<property name="Icon" type="s" access="read" />
++</interface>;
++
++const PowerManagerProxy = Gio.DBusProxy.makeProxyWrapper(PowerManagerInterface);
++
++const SettingsManagerInterface = <interface name="org.freedesktop.DBus.Properties">
++<method name="Get">
++ <arg type="s" direction="in"/>
++ <arg type="s" direction="in"/>
++ <arg type="v" direction="out"/>
++</method>
++<method name="GetAll">
++ <arg type="s" direction="in"/>
++ <arg type="a{sv}" direction="out"/>
++</method>
++<method name="Set">
++ <arg type="s" direction="in"/>
++ <arg type="s" direction="in"/>
++ <arg type="v" direction="in"/>
++</method>
++<signal name="PropertiesChanged">
++ <arg type="s"/>
++ <arg type="a{sv}"/>
++ <arg type="a[s]"/>
++</signal>
++</interface>;
++
++const SettingsManagerProxy = Gio.DBusProxy.makeProxyWrapper(SettingsManagerInterface);
+
+ function DeviceItem() {
+ this._init.apply(this, arguments);
+@@ -143,11 +154,11 @@ MyApplet.prototype = {
+ this.menuManager = new PopupMenu.PopupMenuManager(this);
+ this.menu = new Applet.AppletPopupMenu(this, orientation);
+ this.menuManager.addMenu(this.menu);
+-
+- this.set_applet_icon_symbolic_name('battery-missing');
+- this._proxy = new PowerManagerProxy(DBus.session, BUS_NAME, OBJECT_PATH);
+- this._smProxy = new SettingsManagerProxy(DBus.session, BUS_NAME, OBJECT_PATH);
+-
++
++ //this.set_applet_icon_symbolic_name('battery-missing');
++ this._proxy = new PowerManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH);
++ this._smProxy = new SettingsManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH);
++
+ let icon = this.actor.get_children()[0];
+ this.actor.remove_actor(icon);
+ let box = new St.BoxLayout({ name: 'batteryBox' });
+@@ -306,18 +317,19 @@ MyApplet.prototype = {
+ this._devicesChanged();
+ },
+
+- _devicesChanged: function() {
+- this.set_applet_icon_symbolic_name('battery-missing');
+- this._proxy.GetRemote('Icon', Lang.bind(this, function(icon, error) {
+- if (icon) {
+- let gicon = Gio.icon_new_for_string(icon);
+- this._applet_icon.gicon = gicon;
+- this.actor.show();
+- } else {
+- this.menu.close();
+- this.actor.hide();
+- }
+- }));
++
++ _devicesChanged: function() {
++ this.set_applet_icon_symbolic_name('battery-missing');
++ let icon = this._proxy.Icon;
++ if (icon) {
++ let gicon = Gio.icon_new_for_string(icon);
++ this.setGIcon(gicon);
++ this.actor.show();
++ } else {
++ this.menu.close();
++ this.actor.hide();
++ }
++
+ this._readPrimaryDevice();
+ this._readOtherDevices();
+ this._updateLabel();
+diff --git a/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js b/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js
+index 1113b1e..5bfaf26 100644
+--- a/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js
++++ b/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js
+@@ -1,7 +1,6 @@
+ const Applet = imports.ui.applet;
+ const Mainloop = imports.mainloop;
+ const Gio = imports.gi.Gio;
+-const DBus = imports.dbus;
+ const Lang = imports.lang;
+ const Cinnamon = imports.gi.Cinnamon;
+ const Clutter = imports.gi.Clutter;
+@@ -12,90 +11,45 @@ const Gvc = imports.gi.Gvc;
+ const Pango = imports.gi.Pango;
+ const Tooltips = imports.ui.tooltips;
+
+-const PropIFace = {
+- name: 'org.freedesktop.DBus.Properties',
+- signals: [{ name: 'PropertiesChanged',
+- inSignature: 'a{sv}'}]
+-};
+-
+-const MediaServer2IFace = {
+- name: 'org.mpris.MediaPlayer2',
+- methods: [{ name: 'Raise',
+- inSignature: '',
+- outSignature: '' },
+- { name: 'Quit',
+- inSignature: '',
+- outSignature: '' }],
+- properties: [{ name: 'CanRaise',
+- signature: 'b',
+- access: 'read'},
+- { name: 'CanQuit',
+- signature: 'b',
+- access: 'read'}],
+-};
+-
+-const MediaServer2PlayerIFace = {
+- name: 'org.mpris.MediaPlayer2.Player',
+- methods: [{ name: 'PlayPause',
+- inSignature: '',
+- outSignature: '' },
+- { name: 'Pause',
+- inSignature: '',
+- outSignature: '' },
+- { name: 'Play',
+- inSignature: '',
+- outSignature: '' },
+- { name: 'Stop',
+- inSignature: '',
+- outSignature: '' },
+- { name: 'Next',
+- inSignature: '',
+- outSignature: '' },
+- { name: 'Previous',
+- inSignature: '',
+- outSignature: '' },
+- { name: 'SetPosition',
+- inSignature: 'a{ov}',
+- outSignature: '' }],
+- properties: [{ name: 'Metadata',
+- signature: 'a{sv}',
+- access: 'read'},
+- { name: 'Shuffle',
+- signature: 'b',
+- access: 'readwrite'},
+- { name: 'Rate',
+- signature: 'd',
+- access: 'readwrite'},
+- { name: 'LoopStatus',
+- signature: 'b',
+- access: 'readwrite'},
+- { name: 'Volume',
+- signature: 'd',
+- access: 'readwrite'},
+- { name: 'PlaybackStatus',
+- signature: 's',
+- access: 'read'},
+- { name: 'Position',
+- signature: 'x',
+- access: 'read'},
+- { name: 'CanGoNext',
+- signature: 'b',
+- access: 'read'},
+- { name: 'CanGoPrevious',
+- signature: 'b',
+- access: 'read'},
+- { name: 'CanPlay',
+- signature: 'b',
+- access: 'read'},
+- { name: 'CanPause',
+- signature: 'b',
+- access: 'read'},
+- { name: 'CanSeek',
+- signature: 'b',
+- access: 'read'}],
+- signals: [{ name: 'Seeked',
+- inSignature: 'x' }]
+-};
++const PropIFace = <interface name="org.freedesktop.DBus.Properties">
++<signal name="PropertiesChanged">
++ <arg type="a{sv}"/>
++</signal>
++</interface>;
++
++const MediaServer2IFace = <interface name="org.mpris.MediaPlayer2">
++<method name="Raise" />
++<method name="Quit" />
++<property name="CanRaise" type="b" access="read" />
++<property name="CanQuit" type="b" access="read" />
++</interface>;
++
++const MediaServer2PlayerIFace = <interface name="org.mpris.MediaPlayer2.Player">
++<method name="PlayPause" />
++<method name="Pause" />
++<method name="Play" />
++<method name="Stop" />
++<method name="Next" />
++<method name="Previous" />
++<method name="SetPosition">
++ <arg type="a{ov}" direction="in"/>
++</method>
++<property name='Metadata' access='read' type='a{sv}' />
++<property name='Shuffle' access='readwrite' type='b' />
++<property name='Rate' access='readwrite' type='d' />
++<property name='LoopStatus' access='readwrite' type='b' />
++<property name='Volume' access='readwrite' type='d' />
++<property name='PlaybackStatus' access='read' type='s' />
++<property name='Position' access='read' type='x' />
++<property name="CanGoNext" type="b" access="read" />
++<property name="CanGoPrevious" type="b" access="read" />
++<property name="CanPlay" type="b" access="read" />
++<property name="CanPause" type="b" access="read" />
++<property name="CanSeek" type="b" access="read" />
++<signal name="Seeked">
++ <arg type="x"/>
++</signal>
++</interface>;
+
+ /* global values */
+ let icon_path = "/usr/share/cinnamon/theme/";
+@@ -112,120 +66,20 @@ const VOLUME_ADJUSTMENT_STEP = 0.05; /* Volume adjustment step in % */
+ const ICON_SIZE = 28;
+
+
+-function Prop() {
+- this._init.apply(this, arguments);
++var PropProxy = Gio.DBusProxy.makeProxyWrapper(PropIFace);
++function Prop(owner, initCallback, cancellable) {
++ return new PropProxy(Gio.DBus.session, owner, '/org/mpris/MediaPlayer2', initCallback, cancellable);
+ }
+
+-Prop.prototype = {
+- _init: function(owner) {
+- DBus.session.proxifyObject(this, owner, '/org/mpris/MediaPlayer2', this);
+- }
++var MediaServer2Proxy = Gio.DBusProxy.makeProxyWrapper(MediaServer2IFace);
++function MediaServer2(owner, initCallback, cancellable) {
++ return new MediaServer2Proxy(Gio.DBus.session, owner, '/org/mpris/MediaPlayer2', initCallback, cancellable);
+ }
+-DBus.proxifyPrototype(Prop.prototype, PropIFace)
+
+-function MediaServer2() {
+- this._init.apply(this, arguments);
+-}
+-
+-MediaServer2.prototype = {
+- _init: function(owner) {
+- DBus.session.proxifyObject(this, owner, '/org/mpris/MediaPlayer2', this);
+- },
+- getRaise: function(callback) {
+- this.GetRemote('CanRaise', Lang.bind(this,
+- function(raise, ex) {
+- if (!ex)
+- callback(this, raise);
+- }));
+- },
+- getQuit: function(callback) {
+- this.GetRemote('CanQuit', Lang.bind(this,
+- function(quit, ex) {
+- if (!ex)
+- callback(this, quit);
+- }));
+- }
+-}
+-DBus.proxifyPrototype(MediaServer2.prototype, MediaServer2IFace)
+-
+-function MediaServer2Player() {
+- this._init.apply(this, arguments);
+-}
+-
+-MediaServer2Player.prototype = {
+- _init: function(owner) {
+- this._owner = owner;
+- DBus.session.proxifyObject(this, owner, '/org/mpris/MediaPlayer2', this);
+- },
+- getMetadata: function(callback) {
+- this.GetRemote('Metadata', Lang.bind(this,
+- function(metadata, ex) {
+- if (!ex)
+- callback(this, metadata);
+- }));
+- },
+- getPlaybackStatus: function(callback) {
+- this.GetRemote('PlaybackStatus', Lang.bind(this,
+- function(status, ex) {
+- if (!ex)
+- callback(this, status);
+- }));
+- },
+- getRate: function(callback) {
+- this.GetRemote('Rate', Lang.bind(this,
+- function(rate, ex) {
+- if (!ex)
+- callback(this, rate);
+- }));
+- },
+- getPosition: function(callback) {
+- this.GetRemote('Position', Lang.bind(this,
+- function(position, ex) {
+- if (!ex)
+- callback(this, position);
+- }));
+- },
+- getShuffle: function(callback) {
+- this.GetRemote('Shuffle', Lang.bind(this,
+- function(shuffle, ex) {
+- if (!ex)
+- callback(this, shuffle);
+- }));
+- },
+- setShuffle: function(value) {
+- this.SetRemote('Shuffle', value);
+- },
+- getVolume: function(callback) {
+- this.GetRemote('Volume', Lang.bind(this,
+- function(volume, ex) {
+- if (!ex)
+- callback(this, volume);
+- }));
+- },
+- setVolume: function(value) {
+- this.SetRemote('Volume', parseFloat(value));
+- },
+- getRepeat: function(callback) {
+- this.GetRemote('LoopStatus', Lang.bind(this,
+- function(repeat, ex) {
+- if (!ex) {
+- if (repeat == "None")
+- repeat = false
+- else
+- repeat = true
+- callback(this, repeat);
+- }
+- }));
+- },
+- setRepeat: function(value) {
+- if (value)
+- value = "Playlist"
+- else
+- value = "None"
+- this.SetRemote('LoopStatus', value);
+- }
++var MediaServer2PlayerProxy = Gio.DBusProxy.makeProxyWrapper(MediaServer2PlayerIFace);
++function MediaServer2Player(owner, initCallback, cancellable) {
++ return new MediaServer2PlayerProxy(Gio.DBus.session, owner, '/org/mpris/MediaPlayer2', initCallback, cancellable);
+ }
+-DBus.proxifyPrototype(MediaServer2Player.prototype, MediaServer2PlayerIFace)
+
+ function TrackInfo() {
+ this._init.apply(this, arguments);
+@@ -715,7 +569,7 @@ MyApplet.prototype = {
+ this._players = {};
+ // watch players
+ for (var p=0; p<compatible_players.length; p++) {
+- DBus.session.watch_name('org.mpris.MediaPlayer2.'+compatible_players[p], false,
++ Gio.DBus.session.watch_name('org.mpris.MediaPlayer2.'+compatible_players[p], false,
+ Lang.bind(this, this._addPlayer),
+ Lang.bind(this, this._removePlayer)
+ );
+diff --git a/files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js b/files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js
+index 0dcf74d..c2d152a 100644
+--- a/files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js
++++ b/files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js
+@@ -1,6 +1,6 @@
+ /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
+
+-const DBus = imports.dbus;
++const Gio = imports.gi.Gio;
+ const Gdk = imports.gi.Gdk;
+ const GLib = imports.gi.GLib;
+ const GnomeDesktop = imports.gi.GnomeDesktop;
+@@ -22,13 +22,14 @@ let rotations = [ [ GnomeDesktop.RRRotation.ROTATION_0, N_("Normal") ],
+ [ GnomeDesktop.RRRotation.ROTATION_180, N_("Upside-down") ]
+ ];
+
+-const XRandr2Iface = {
+- name: 'org.gnome.SettingsDaemon.XRANDR_2',
+- methods: [
+- { name: 'ApplyConfiguration', inSignature: 'xx', outSignature: '' },
+- ]
+-};
+-let XRandr2 = DBus.makeProxyClass(XRandr2Iface);
++const XRandr2Iface = <interface name="org.gnome.SettingsDaemon.XRANDR_2">
++<method name="ApplyConfiguration">
++ <arg type="x" direction="in"/>
++ <arg type="x" direction="in"/>
++</method>
++</interface>;
++
++const XRandr2 = Gio.DBusProxy.makeProxyWrapper(XRandr2Iface);
+
+ function MyApplet(orientation, panel_height) {
+ this._init(orientation, panel_height);
+@@ -48,7 +49,7 @@ MyApplet.prototype = {
+ this.menu = new Applet.AppletPopupMenu(this, orientation);
+ this.menuManager.addMenu(this.menu);
+
+- this._proxy = new XRandr2(DBus.session, 'org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/XRANDR');
++ this._proxy = new XRandr2(Gio.DBus.session, 'org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/XRANDR');
+
+ try {
+ this._screen = new GnomeDesktop.RRScreen({ gdk_screen: Gdk.Screen.get_default() });
+diff --git a/js/misc/gnomeSession.js b/js/misc/gnomeSession.js
+index a2b61fd..e21d3a8 100644
+--- a/js/misc/gnomeSession.js
++++ b/js/misc/gnomeSession.js
+@@ -1,20 +1,18 @@
+ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+-const DBus = imports.dbus;
++const Gio = imports.gi.Gio;
+ const Lang = imports.lang;
+ const Signals = imports.signals;
+
+-const PresenceIface = {
+- name: 'org.gnome.SessionManager.Presence',
+- methods: [{ name: 'SetStatus',
+- inSignature: 'u',
+- outSignature: '' }],
+- properties: [{ name: 'status',
+- signature: 'u',
+- access: 'readwrite' }],
+- signals: [{ name: 'StatusChanged',
+- inSignature: 'u' }]
+-};
++const PresenceIface = <interface name="org.gnome.SessionManager.Presence">
++<method name="SetStatus">
++ <arg type="u" direction="in"/>
++</method>
++<property name="status" type="u" access="readwrite"/>
++<signal name="StatusChanged">
++ <arg type="u" direction="out"/>
++</signal>
++</interface>;
+
+ const PresenceStatus = {
+ AVAILABLE: 0,
+@@ -23,104 +21,37 @@ const PresenceStatus = {
+ IDLE: 3
+ };
+
+-function Presence() {
+- this._init();
++var PresenceProxy = Gio.DBusProxy.makeProxyWrapper(PresenceIface);
++function Presence(initCallback, cancellable) {
++ return new PresenceProxy(Gio.DBus.session, 'org.gnome.SessionManager',
++ '/org/gnome/SessionManager/Presence', initCallback, cancellable);
+ }
+
+-Presence.prototype = {
+- _init: function() {
+- DBus.session.proxifyObject(this, 'org.gnome.SessionManager', '/org/gnome/SessionManager/Presence', this);
+- },
+-
+- getStatus: function(callback) {
+- this.GetRemote('status', Lang.bind(this,
+- function(status, ex) {
+- if (!ex)
+- callback(this, status);
+- }));
+- },
+-
+- setStatus: function(status) {
+- this.SetStatusRemote(status);
+- }
+-};
+-DBus.proxifyPrototype(Presence.prototype, PresenceIface);
+-
+-// Note inhibitors are immutable objects, so they don't
+-// change at runtime (changes always come in the form
+-// of new inhibitors)
+-const InhibitorIface = {
+- name: 'org.gnome.SessionManager.Inhibitor',
+- properties: [{ name: 'app_id',
+- signature: 's',
+- access: 'readonly' },
+- { name: 'client_id',
+- signature: 's',
+- access: 'readonly' },
+- { name: 'reason',
+- signature: 's',
+- access: 'readonly' },
+- { name: 'flags',
+- signature: 'u',
+- access: 'readonly' },
+- { name: 'toplevel_xid',
+- signature: 'u',
+- access: 'readonly' },
+- { name: 'cookie',
+- signature: 'u',
+- access: 'readonly' }],
+-};
+-
+-function Inhibitor(objectPath) {
+- this._init(objectPath);
++const InhibitorIface = <interface name="org.gnome.SessionManager.Inhibitor">
++<property name="app_id" type="s" access="read" />
++<property name="client_id" type="s" access="read" />
++<property name="reason" type="s" access="read" />
++<property name="flags" type="u" access="read" />
++<property name="toplevel_xid" type="u" access="read" />
++<property name="cookie" type="u" access="read" />
++</interface>;
++
++var InhibitorProxy = Gio.DBusProxy.makeProxyWrapper(InhibitorIface);
++function Inhibitor(objectPath, initCallback, cancellable) {
++ return new InhibitorProxy(Gio.DBus.session, 'org.gnome.SessionManager', objectPath, initCallback, cancellable);
+ }
+
+-Inhibitor.prototype = {
+- _init: function(objectPath) {
+- DBus.session.proxifyObject(this,
+- 'org.gnome.SessionManager',
+- objectPath);
+- this.isLoaded = false;
+- this._loadingPropertiesCount = InhibitorIface.properties.length;
+- for (let i = 0; i < InhibitorIface.properties.length; i++) {
+- let propertyName = InhibitorIface.properties[i].name;
+- this.GetRemote(propertyName, Lang.bind(this,
+- function(value, exception) {
+- if (exception)
+- return;
+-
+- this[propertyName] = value;
+- this._loadingPropertiesCount--;
+-
+- if (this._loadingPropertiesCount == 0) {
+- this.isLoaded = true;
+- this.emit('is-loaded');
+- }
+- }));
+- }
+- },
+-};
+-DBus.proxifyPrototype(Inhibitor.prototype, InhibitorIface);
+-Signals.addSignalMethods(Inhibitor.prototype);
+-
+-
+-// Not the full interface, only the methods we use
+-const SessionManagerIface = {
+- name: 'org.gnome.SessionManager',
+- methods: [
+- { name: 'Logout', inSignature: 'u', outSignature: '' },
+- { name: 'Shutdown', inSignature: '', outSignature: '' },
+- { name: 'CanShutdown', inSignature: '', outSignature: 'b' }
+- ]
+-};
+-
+-function SessionManager() {
+- this._init();
++const SessionManagerIface = <interface name="org.gnome.SessionManager">
++<method name="Logout">
++ <arg type="u" direction="in" />
++</method>
++<method name="Shutdown" />
++<method name="CanShutdown">
++ <arg type="b" direction="out" />
++</method>
++</interface>;
++
++var SessionManagerProxy = Gio.DBusProxy.makeProxyWrapper(SessionManagerIface);
++function SessionManager(initCallback, cancellable) {
++ return new SessionManagerProxy(Gio.DBus.session, 'org.gnome.SessionManager', '/org/gnome/SessionManager', initCallback, cancellable);
+ }
+-
+-SessionManager.prototype = {
+- _init: function() {
+- DBus.session.proxifyObject(this, 'org.gnome.SessionManager', '/org/gnome/SessionManager');
+- }
+-};
+-DBus.proxifyPrototype(SessionManager.prototype, SessionManagerIface);
+\ No newline at end of file
+diff --git a/js/misc/modemManager.js b/js/misc/modemManager.js
+index befd142..f35f925 100644
+--- a/js/misc/modemManager.js
++++ b/js/misc/modemManager.js
+@@ -1,6 +1,6 @@
+ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+-const DBus = imports.dbus;
++const Gio = imports.gi.Gio;
+ const Lang = imports.lang;
+ const Cinnamon = imports.gi.Cinnamon;
+ const Signals = imports.signals;
+@@ -8,33 +8,43 @@ const Signals = imports.signals;
+ // The following are not the complete interfaces, just the methods we need
+ // (or may need in the future)
+
+-const ModemGsmNetworkInterface = {
+- name: 'org.freedesktop.ModemManager.Modem.Gsm.Network',
+- methods: [
+- { name: 'GetRegistrationInfo', inSignature: '', outSignature: 'uss' },
+- { name: 'GetSignalQuality', inSignature: '', outSignature: 'u' }
+- ],
+- properties: [
+- { name: 'AccessTechnology', signature: 'u', access: 'read' }
+- ],
+- signals: [
+- { name: 'SignalQuality', inSignature: 'u' },
+- { name: 'RegistrationInfo', inSignature: 'uss' }
+- ]
+-};
+-const ModemGsmNetworkProxy = DBus.makeProxyClass(ModemGsmNetworkInterface);
+-
+-const ModemCdmaInterface = {
+- name: 'org.freedesktop.ModemManager.Modem.Cdma',
+- methods: [
+- { name: 'GetSignalQuality', inSignature: '', outSignature: 'u' },
+- { name: 'GetServingSystem', inSignature: '', outSignature: 'usu' }
+- ],
+- signals: [
+- { name: 'SignalQuality', inSignature: 'u' }
+- ]
+-};
+-const ModemCdmaProxy = DBus.makeProxyClass(ModemCdmaInterface);
++const ModemGsmNetworkInterface = <interface name="org.freedesktop.ModemManager.Modem.Gsm.Network">
++<method name="GetRegistrationInfo">
++ <arg type="u" direction="out" />
++ <arg type="s" direction="out" />
++ <arg type="s" direction="out" />
++</method>
++<method name="GetSignalQuality">
++ <arg type="u" direction="out" />
++</method>
++<property name="AccessTechnology" type="u" access="read" />
++<signal name="SignalQuality">
++ <arg type="u" direction="out" />
++</signal>
++<signal name="RegistrationInfo">
++ <arg type="u" direction="out" />
++ <arg type="s" direction="out" />
++ <arg type="s" direction="out" />
++</signal>
++</interface>;
++
++const ModemGsmNetworkProxy = Gio.DBusProxy.makeProxyWrapper(ModemGsmNetworkInterface);
++
++const ModemCdmaInterface = <interface name="org.freedesktop.ModemManager.Modem.Cdma">
++<method name="GetSignalQuality">
++ <arg type="u" direction="out" />
++</method>
++<method name="GetServingSystem">
++ <arg type="u" direction="out" />
++ <arg type="s" direction="out" />
++ <arg type="u" direction="out" />
++</method>
++<signal name="SignalQuality">
++ <arg type="u" direction="out" />
++</signal>
++</interface>;
++
++const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface);
+
+ let _providersTable;
+ function _getProvidersTable() {
+@@ -50,17 +60,17 @@ function ModemGsm() {
+
+ ModemGsm.prototype = {
+ _init: function(path) {
+- this._proxy = new ModemGsmNetworkProxy(DBus.system, 'org.freedesktop.ModemManager', path);
++ this._proxy = new ModemGsmNetworkProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path);
+
+ this.signal_quality = 0;
+ this.operator_name = null;
+
+ // Code is duplicated because the function have different signatures
+- this._proxy.connect('SignalQuality', Lang.bind(this, function(proxy, quality) {
++ this._proxy.connectSignal('SignalQuality', Lang.bind(this, function(proxy, sender, [quality]) {
+ this.signal_quality = quality;
+ this.emit('notify::signal-quality');
+ }));
+- this._proxy.connect('RegistrationInfo', Lang.bind(this, function(proxy, status, code, name) {
++ this._proxy.connectSignal('RegistrationInfo', Lang.bind(this, function(proxy, sender, [status, code, name]) {
+ this.operator_name = this._findOperatorName(name, code);
+ this.emit('notify::operator-name');
+ }));
+@@ -154,12 +164,13 @@ function ModemCdma() {
+ }
+
+ ModemCdma.prototype = {
+- _init: function(path) {
+- this._proxy = new ModemCdmaProxy(DBus.system, 'org.freedesktop.ModemManager', path);
++ _init: function(path) {
++ this._proxy = new ModemCdmaProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path);
+
+ this.signal_quality = 0;
+ this.operator_name = null;
+- this._proxy.connect('SignalQuality', Lang.bind(this, function(proxy, quality) {
++ this._proxy.connect('SignalQuality', Lang.bind(this, function(proxy, sender, params) {
++ this.signal_quality = params[0];
+ this.signal_quality = quality;
+ this.emit('notify::signal-quality');
+
+diff --git a/js/misc/screenSaver.js b/js/misc/screenSaver.js
+index c471856..aec883f 100644
+--- a/js/misc/screenSaver.js
++++ b/js/misc/screenSaver.js
+@@ -1,53 +1,48 @@
+ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+-const DBus = imports.dbus;
+ const Lang = imports.lang;
+-
+-const ScreenSaverIface = {
+- name: 'org.gnome.ScreenSaver',
+- methods: [{ name: 'GetActive',
+- inSignature: '',
+- outSignature: 'b' },
+- { name: 'Lock',
+- inSignature: '' },
+- { name: 'SetActive',
+- inSignature: 'b' }],
+- signals: [{ name: 'ActiveChanged',
+- inSignature: 'b' }]
+-};
++const Gio = imports.gi.Gio;
++
++const ScreenSaverIface = <interface name="org.gnome.ScreenSaver">
++<method name="GetActive">
++ <arg type="b" direction="out" />
++</method>
++<method name="Lock" />
++<method name="SetActive">
++ <arg type="b" direction="in" />
++</method>
++<signal name="ActiveChanged">
++ <arg type="b" direction="out" />
++</signal>
++</interface>;
++
++const ScreenSaverInfo = Gio.DBusInterfaceInfo.new_for_xml(ScreenSaverIface);
+
+ function ScreenSaverProxy() {
+- this._init();
++ var self = new Gio.DBusProxy({ g_connection: Gio.DBus.session,
++ g_interface_name: ScreenSaverInfo.name,
++ g_interface_info: ScreenSaverInfo,
++ g_name: 'org.gnome.ScreenSaver',
++ g_object_path: '/org/gnome/ScreenSaver',
++ g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START |
++ Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
++ self.init(null);
++ self.screenSaverActive = false;
++
++ self.connectSignal('ActiveChanged', function(proxy, senderName, [isActive]) {
++ self.screenSaverActive = isActive;
++ });
++ self.connect('notify::g-name-owner', function() {
++ if (self.g_name_owner) {
++ self.GetActiveRemote(function(result, excp) {
++ if (result) {
++ let [isActive] = result;
++ self.screenSaverActive = isActive;
++ }
++ });
++ } else
++ self.screenSaverActive = false;
++ });
++
++ return self;
+ }
+-
+-ScreenSaverProxy.prototype = {
+- _init: function() {
+- DBus.session.proxifyObject(this,
+- 'org.gnome.ScreenSaver',
+- '/org/gnome/ScreenSaver');
+-
+- DBus.session.watch_name('org.gnome.ScreenSaver',
+- false, // do not launch a name-owner if none exists
+- Lang.bind(this, this._onSSAppeared),
+- Lang.bind(this, this._onSSVanished));
+-
+- this.screenSaverActive = false;
+- this.connect('ActiveChanged',
+- Lang.bind(this, this._onActiveChanged));
+- },
+-
+- _onSSAppeared: function(owner) {
+- this.GetActiveRemote(Lang.bind(this, function(isActive) {
+- this.screenSaverActive = isActive;
+- }))
+- },
+-
+- _onSSVanished: function(oldOwner) {
+- this.screenSaverActive = false;
+- },
+-
+- _onActiveChanged: function(object, isActive) {
+- this.screenSaverActive = isActive;
+- }
+-};
+-DBus.proxifyPrototype(ScreenSaverProxy.prototype, ScreenSaverIface);
+diff --git a/js/ui/appletManager.js b/js/ui/appletManager.js
+index abf8136..830d80d 100644
+--- a/js/ui/appletManager.js
++++ b/js/ui/appletManager.js
+@@ -7,7 +7,6 @@ const Cinnamon = imports.gi.Cinnamon;
+ const Main = imports.ui.main;
+ const Applet = imports.ui.applet;
+ const Extension = imports.ui.extension;
+-const DBus = imports.dbus;
+
+ // Maps uuid -> metadata object
+ var appletMeta;
+diff --git a/js/ui/automountManager.js b/js/ui/automountManager.js
+index fa73bfe..f29f9f3 100644
+--- a/js/ui/automountManager.js
++++ b/js/ui/automountManager.js
+@@ -1,7 +1,6 @@
+ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+ const Lang = imports.lang;
+-const DBus = imports.dbus;
+ const Mainloop = imports.mainloop;
+ const Gio = imports.gi.Gio;
+ const Params = imports.misc.params;
+@@ -15,63 +14,57 @@ const SETTING_ENABLE_AUTOMOUNT = 'automount';
+
+ const AUTORUN_EXPIRE_TIMEOUT_SECS = 10;
+
+-const ConsoleKitSessionIface = {
+- name: 'org.freedesktop.ConsoleKit.Session',
+- methods: [{ name: 'IsActive',
+- inSignature: '',
+- outSignature: 'b' }],
+- signals: [{ name: 'ActiveChanged',
+- inSignature: 'b' }]
+-};
++const ConsoleKitSessionIface = <interface name="org.freedesktop.ConsoleKit.Session">
++<method name="isActive">
++ <arg type="b" direction="out" />
++</method>
++<method name="ActiveChanged">
++ <arg type="b" direction="in" />
++</method>
++</interface>;
+
+-const ConsoleKitSessionProxy = DBus.makeProxyClass(ConsoleKitSessionIface);
++const ConsoleKitSessionProxy = Gio.DBusProxy.makeProxyWrapper(ConsoleKitSessionIface);
+
+-const ConsoleKitManagerIface = {
+- name: 'org.freedesktop.ConsoleKit.Manager',
+- methods: [{ name: 'GetCurrentSession',
+- inSignature: '',
+- outSignature: 'o' }]
+-};
++const ConsoleKitManagerIface = <interface name="org.freedesktop.ConsoleKit.Manager">
++<method name="GetCurrentSession">
++ <arg type="o" direction="out" />
++</method>
++</interface>;
+
+-function ConsoleKitManager() {
+- this._init();
+-};
+-
+-ConsoleKitManager.prototype = {
+- _init: function() {
+- this.sessionActive = true;
+-
+- DBus.system.proxifyObject(this,
+- 'org.freedesktop.ConsoleKit',
+- '/org/freedesktop/ConsoleKit/Manager');
++const ConsoleKitManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(ConsoleKitManagerIface);
+
+- DBus.system.watch_name('org.freedesktop.ConsoleKit',
+- false, // do not launch a name-owner if none exists
+- Lang.bind(this, this._onManagerAppeared),
+- Lang.bind(this, this._onManagerVanished));
+- },
+-
+- _onManagerAppeared: function(owner) {
+- this.GetCurrentSessionRemote(Lang.bind(this, this._onCurrentSession));
+- },
+-
+- _onManagerVanished: function(oldOwner) {
+- this.sessionActive = true;
+- },
+-
+- _onCurrentSession: function(session) {
+- this._ckSession = new ConsoleKitSessionProxy(DBus.system, 'org.freedesktop.ConsoleKit', session);
+-
+- this._ckSession.connect
+- ('ActiveChanged', Lang.bind(this, function(object, isActive) {
+- this.sessionActive = isActive;
+- }));
+- this._ckSession.IsActiveRemote(Lang.bind(this, function(isActive) {
+- this.sessionActive = isActive;
+- }));
++function ConsoleKitManager() {
++ var self = new Gio.DBusProxy({ g_connection: Gio.DBus.system,
++ g_interface_name: ConsoleKitManagerInfo.name,
++ g_interface_info: ConsoleKitManagerInfo,
++ g_name: 'org.freedesktop.ConsoleKit',
++ g_object_path: '/org/freedesktop/ConsoleKit/Manager',
++ g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START |
++ Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
++
++ self._updateSessionActive = function() {
++ if (self.g_name_owner) {
++ self.GetCurrentSessionRemote(function([session]) {
++ self._ckSession = new ConsoleKitSessionProxy(Gio.DBus.system, 'org.freedesktop.ConsoleKit', session);
++
++ self._ckSession.connectSignal('ActiveChanged', function(object, senderName, [isActive]) {
++ self.sessionActive = isActive;
++ });
++ self._ckSession.IsActiveRemote(function([isActive]) {
++ self.sessionActive = isActive;
++ });
++ });
++ } else {
++ self.sessionActive = true;
++ }
+ }
+-};
+-DBus.proxifyPrototype(ConsoleKitManager.prototype, ConsoleKitManagerIface);
++ self.connect('notify::g-name-owner',
++ Lang.bind(self, self._updateSessionActive));
++
++ self._updateSessionActive();
++ self.init(null);
++ return self;
++}
+
+ function AutomountManager() {
+ this._init();
+@@ -85,9 +78,8 @@ AutomountManager.prototype = {
+ this.ckListener = new ConsoleKitManager();
+
+ this._ssProxy = new ScreenSaver.ScreenSaverProxy();
+- this._ssProxy.connect('ActiveChanged',
+- Lang.bind(this,
+- this._screenSaverActiveChanged));
++ this._ssProxy.connectSignal('ActiveChanged',
++ Lang.bind(this, this._screenSaverActiveChanged));
+
+ this._volumeMonitor = Gio.VolumeMonitor.get();
+
+@@ -110,7 +102,7 @@ AutomountManager.prototype = {
+ Mainloop.idle_add(Lang.bind(this, this._startupMountAll));
+ },
+
+- _screenSaverActiveChanged: function(object, isActive) {
++ _screenSaverActiveChanged: function(object, senderName, [isActive]) {
+ if (!isActive) {
+ this._volumeQueue.forEach(Lang.bind(this, function(volume) {
+ this._checkAndMountVolume(volume);
+diff --git a/js/ui/autorunManager.js b/js/ui/autorunManager.js
+index 02cd4da..99b6fbe 100644
+--- a/js/ui/autorunManager.js
++++ b/js/ui/autorunManager.js
+@@ -1,7 +1,6 @@
+ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+ const Lang = imports.lang;
+-const DBus = imports.dbus;
+ const Gio = imports.gi.Gio;
+ const St = imports.gi.St;
+
+@@ -61,25 +60,19 @@ function startAppForMount(app, mount) {
+
+ /******************************************/
+
+-const HotplugSnifferIface = {
+- name: 'org.Cinnamon.HotplugSniffer',
+- methods: [{ name: 'SniffURI',
+- inSignature: 's',
+- outSignature: 'as' }]
+-};
+-
+-const HotplugSniffer = function() {
+- this._init();
+-};
++const HotplugSnifferIface = <interface name="org.Cinnamon.HotplugSniffer">
++<method name="SniffURI">
++ <arg type="s" direction="in" />
++ <arg type="as" direction="out" />
++</method>
++</interface>;
+
+-HotplugSniffer.prototype = {
+- _init: function() {
+- DBus.session.proxifyObject(this,
++const HotplugSnifferProxy = Gio.DBusProxy.makeProxyWrapper(HotplugSnifferIface);
++function HotplugSniffer() {
++ return new HotplugSnifferProxy(Gio.DBus.session,
+ 'org.Cinnamon.HotplugSniffer',
+ '/org/Cinnamon/HotplugSniffer');
+- },
+-};
+-DBus.proxifyPrototype(HotplugSniffer.prototype, HotplugSnifferIface);
++}
+
+ function ContentTypeDiscoverer(callback) {
+ this._init(callback);
+diff --git a/js/ui/calendar.js b/js/ui/calendar.js
+index ff4777a..a97e2a9 100644
+--- a/js/ui/calendar.js
++++ b/js/ui/calendar.js
+@@ -1,6 +1,5 @@
+ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+-const DBus = imports.dbus;
+ const Clutter = imports.gi.Clutter;
+ const Gio = imports.gi.Gio;
+ const Lang = imports.lang;
+@@ -194,30 +193,34 @@ EmptyEventSource.prototype = {
+ };
+ Signals.addSignalMethods(EmptyEventSource.prototype);
+
+-const CalendarServerIface = {
+- name: 'org.Cinnamon.CalendarServer',
+- methods: [{ name: 'GetEvents',
+- inSignature: 'xxb',
+- outSignature: 'a(sssbxxa{sv})' }],
+- signals: [{ name: 'Changed',
+- inSignature: '' }]
+-};
+-
+-const CalendarServer = function () {
+- this._init();
+-};
+-
+-CalendarServer.prototype = {
+- _init: function() {
+- DBus.session.proxifyObject(this, 'org.Cinnamon.CalendarServer', '/org/Cinnamon/CalendarServer');
+- }
+-};
+-
+-DBus.proxifyPrototype(CalendarServer.prototype, CalendarServerIface);
++const CalendarServerIface = <interface name="org.Cinnamon.CalendarServer">
++<method name="GetEvents">
++ <arg type="x" direction="in" />
++ <arg type="x" direction="in" />
++ <arg type="b" direction="in" />
++ <arg type="a(sssbxxa{sv})" direction="out" />
++</method>
++<signal name="Changed" />
++</interface>;
++
++const CalendarServerInfo = Gio.DBusInterfaceInfo.new_for_xml(CalendarServerIface);
++
++function CalendarServer() {
++ var self = new Gio.DBusProxy({ g_connection: Gio.DBus.session,
++ g_interface_name: CalendarServerInfo.name,
++ g_interface_info: CalendarServerInfo,
++ g_name: 'org.Cinnamon.CalendarServer',
++ g_object_path: '/org/Cinnamon/CalendarServer',
++ g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START |
++ Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
++
++ self.init(null);
++ return self;
++}
+
+ // an implementation that reads data from a session bus service
+-function DBusEventSource(owner) {
+- this._init(owner);
++function DBusEventSource() {
++ this._init();
+ }
+
+ function _datesEqual(a, b) {
+@@ -240,16 +243,18 @@ function _dateIntervalsOverlap(a0, a1, b0, b1)
+
+
+ DBusEventSource.prototype = {
+- _init: function(owner) {
++ _init: function() {
+ this._resetCache();
+
+- this._dbusProxy = new CalendarServer(owner);
+- this._dbusProxy.connect('Changed', Lang.bind(this, this._onChanged));
++ this._dbusProxy = new CalendarServer();
++ this._dbusProxy.connectSignal('Changed', Lang.bind(this, this._onChanged));
+
+- DBus.session.watch_name('org.Cinnamon.CalendarServer',
+- false, // do not launch a name-owner if none exists
+- Lang.bind(this, this._onNameAppeared),
+- Lang.bind(this, this._onNameVanished));
++ this._dbusProxy.connect('notify::g-name-owner', Lang.bind(this, function() {
++ if (this._dbusProxy.g_name_owner)
++ this._onNameAppeared();
++ else
++ this._onNameVanished();
++ }));
+ },
+
+ _resetCache: function() {
+@@ -272,7 +277,7 @@ DBusEventSource.prototype = {
+ this._loadEvents(false);
+ },
+
+- _onEventsReceived: function(appointments) {
++ _onEventsReceived: function([appointments]) {
+ let newEvents = [];
+ if (appointments != null) {
+ for (let n = 0; n < appointments.length; n++) {
+@@ -295,9 +300,9 @@ DBusEventSource.prototype = {
+
+ _loadEvents: function(forceReload) {
+ if (this._curRequestBegin && this._curRequestEnd){
+- let callFlags = 0;
++ let callFlags = Gio.DBusCallFlags.NO_AUTO_START;
+ if (forceReload)
+- callFlags |= DBus.CALL_FLAG_START;
++ callFlags = Gio.DBusCallFlags.NONE;
+ this._dbusProxy.GetEventsRemote(this._curRequestBegin.getTime() / 1000,
+ this._curRequestEnd.getTime() / 1000,
+ forceReload,
+diff --git a/js/ui/cinnamonDBus.js b/js/ui/cinnamonDBus.js
+index 600e92f..5d4eb1c 100644
+--- a/js/ui/cinnamonDBus.js
++++ b/js/ui/cinnamonDBus.js
+@@ -1,7 +1,7 @@
+ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+-const DBus = imports.dbus;
+ const Lang = imports.lang;
++const Gio = imports.gi.Gio;
+
+ const Config = imports.misc.config;
+ const Flashspot = imports.ui.flashspot;
+@@ -9,48 +9,53 @@ const Main = imports.ui.main;
+ const AppletManager = imports.ui.appletManager;
+ const DeskletManager = imports.ui.deskletManager;
+
+-const CinnamonIface = {
+- name: 'org.Cinnamon',
+- methods: [{ name: 'Eval',
+- inSignature: 's',
+- outSignature: 'bs'
+- },
+- { name: 'ScreenshotArea',
+- inSignature: 'biiiibs',
+- outSignature: ''
+- },
+- { name: 'ScreenshotWindow',
+- inSignature: 'bbbs',
+- outSignature: ''
+- },
+- { name: 'Screenshot',
+- inSignature: 'bbs',
+- outSignature: ''
+- },
+- {
+- name: 'FlashArea',
+- inSignature: 'iiii',
+- outSignature: ''
+- },
+- {
+- name: 'highlightApplet',
+- inSignature: 'sb',
+- outSignature: ''
+- },
+- {
+- name: 'activateCallback',
+- inSignature: 'ssb',
+- outSignature: ''
+- }
+- ],
+- signals: [],
+- properties: [{ name: 'OverviewActive',
+- signature: 'b',
+- access: 'readwrite' },
+- { name: 'CinnamonVersion',
+- signature: 's',
+- access: 'read' }]
+-};
++
++const CinnamonIface = <interface name="org.Cinnamon">
++<method name="Eval">
++ <arg type="s" direction="in" name="script" />
++ <arg type="b" direction="out" name="success" />
++ <arg type="s" direction="out" name="result" />
++</method>
++<method name="ScreenshotArea">
++include_cursor
++ <arg type="b" direction="in" name="include_cursor"/>
++ <arg type="i" direction="in" name="x"/>
++ <arg type="i" direction="in" name="y"/>
++ <arg type="i" direction="in" name="width"/>
++ <arg type="i" direction="in" name="height"/>
++ <arg type="b" direction="in" name="flash"/>
++ <arg type="s" direction="in" name="filename"/>
++</method>
++<method name="ScreenshotWindow">
++ <arg type="b" direction="in" name="include_frame"/>
++ <arg type="b" direction="in" name="include_cursor"/>
++ <arg type="b" direction="in" name="flash"/>
++ <arg type="s" direction="in" name="filename"/>
++</method>
++<method name="Screenshot">
++ <arg type="b" direction="in" name="include_frame"/>
++ <arg type="b" direction="in" name="flash"/>
++ <arg type="s" direction="in" name="filename"/>
++</method>
++<method name="FlashArea">
++include_cursor
++ <arg type="i" direction="in" name="x"/>
++ <arg type="i" direction="in" name="y"/>
++ <arg type="i" direction="in" name="width"/>
++ <arg type="i" direction="in" name="height"/>
++</method>
++<method name="highlightApplet">
++ <arg type="s" direction="in" />
++ <arg type="b" direction="in" />
++</method>
++<method name="activateCallback">
++ <arg type="s" direction="in" />
++ <arg type="s" direction="in" />
++ <arg type="b" direction="in" />
++</method>
++<property name="OverviewActive" type="b" access="readwrite" />
++<property name="CinnamonVersion" type="s" access="read" />
++</interface>;
+
+ function Cinnamon() {
+ this._init();
+@@ -58,7 +63,8 @@ function Cinnamon() {
+
+ Cinnamon.prototype = {
+ _init: function() {
+- DBus.session.exportObject('/org/Cinnamon', this);
++ this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(CinnamonIface, this);
++ this._dbusImpl.export(Gio.DBus.session, '/org/Cinnamon');
+ },
+
+ /**
+@@ -215,5 +221,3 @@ Cinnamon.prototype = {
+ CinnamonVersion: Config.PACKAGE_VERSION
+ };
+
+-DBus.conformExport(Cinnamon.prototype, CinnamonIface);
+-
+diff --git a/js/ui/endSessionDialog.js b/js/ui/endSessionDialog.js
+index e909f5f..4f1f7d0 100644
+--- a/js/ui/endSessionDialog.js
++++ b/js/ui/endSessionDialog.js
+@@ -18,19 +18,19 @@
+ * 02110-1335, USA.
+ */
+
+-const DBus = imports.dbus;
+ const Lang = imports.lang;
+ const Signals = imports.signals;
+
+ const AccountsService = imports.gi.AccountsService;
+ const Clutter = imports.gi.Clutter;
++const Gio = imports.gi.Gio;
+ const GLib = imports.gi.GLib;
+ const Gtk = imports.gi.Gtk;
+ const Pango = imports.gi.Pango;
+ const St = imports.gi.St;
+ const Cinnamon = imports.gi.Cinnamon;
+
+-const GnomeSession = imports.misc.gnomeSession
++const GnomeSession = imports.misc.gnomeSession;
+ const ModalDialog = imports.ui.modalDialog;
+ const Tweener = imports.ui.tweener;
+
+@@ -40,20 +40,20 @@ const _ITEM_ICON_SIZE = 48;
+ const _DIALOG_ICON_SIZE = 32;
+
+ const GSM_SESSION_MANAGER_LOGOUT_FORCE = 2;
+-
+-const EndSessionDialogIface = {
+- name: 'org.gnome.SessionManager.EndSessionDialog',
+- methods: [{ name: 'Open',
+- inSignature: 'uuuao',
+- outSignature: ''
+- }
+- ],
+- signals: [{ name: 'Canceled',
+- inSignature: '',
+- }],
+- properties: []
+-};
+-
++const EndSessionDialogIface = <interface name="org.gnome.SessionManager.EndSessionDialog">
++<method name="Open">
++ <arg type="u" direction="in" />
++ <arg type="u" direction="in" />
++ <arg type="u" direction="in" />
++ <arg type="ao" direction="in" />
++</method>
++<signal name="ConfirmedLogout" />
++<signal name="ConfirmedReboot" />
++<signal name="ConfirmedShutdown" />
++<signal name="Canceled" />
++<signal name="Closed" />
++</interface>;
++
+ const logoutDialogContent = {
+ subjectWithUser: _("Log Out %s"),
+ subject: _("Log Out"),
+@@ -230,8 +230,6 @@ function _setLabelText(label, text) {
+ function EndSessionDialog() {
+ if (_endSessionDialog == null) {
+ this._init();
+- DBus.session.exportObject('/org/gnome/SessionManager/EndSessionDialog',
+- this);
+ _endSessionDialog = this;
+ }
+
+@@ -328,6 +326,9 @@ EndSessionDialog.prototype = {
+ if (this._applicationList.get_children().length == 0)
+ scrollView.hide();
+ }));
++
++ this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this);
++ this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
+ },
+
+ _onDestroy: function() {
+@@ -442,25 +443,19 @@ EndSessionDialog.prototype = {
+
+ close: function() {
+ ModalDialog.ModalDialog.prototype.close.call(this);
+- DBus.session.emit_signal('/org/gnome/SessionManager/EndSessionDialog',
+- 'org.gnome.SessionManager.EndSessionDialog',
+- 'Closed', '', []);
++ this._dbusImpl.emit_signal('Closed', null);
+ },
+
+ cancel: function() {
+ this._stopTimer();
+- DBus.session.emit_signal('/org/gnome/SessionManager/EndSessionDialog',
+- 'org.gnome.SessionManager.EndSessionDialog',
+- 'Canceled', '', []);
++ this._dbusImpl.emit_signal('Canceled', null);
+ this.close(global.get_current_time());
+ },
+
+ _confirm: function(signal) {
+ this._fadeOutDialog();
+ this._stopTimer();
+- DBus.session.emit_signal('/org/gnome/SessionManager/EndSessionDialog',
+- 'org.gnome.SessionManager.EndSessionDialog',
+- signal, '', []);
++ this._dbusImpl.emit_signal(signal, null);
+ },
+
+ _onOpened: function() {
+@@ -512,39 +507,41 @@ EndSessionDialog.prototype = {
+ this._updateContent();
+ },
+
+- OpenAsync: function(type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths, callback) {
++ OpenAsync: function(parameters, invocation) {
++ let [type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths] = parameters;
+ this._totalSecondsToStayOpen = totalSecondsToStayOpen;
+ this._inhibitors = [];
+ this._applicationList.destroy_children();
+ this._type = type;
+
+- if (!(this._type in DialogContent))
+- throw new DBus.DBusError('org.Cinnamon.ModalDialog.TypeError',
+- "Unknown dialog type requested");
++ if (!(this._type in DialogContent)) {
++ invocation.report_dbus_error('org.Cinnamon.ModalDialog.TypeError',
++ "Unknown dialog type requested");
++ return;
++ }
+
+ for (let i = 0; i < inhibitorObjectPaths.length; i++) {
+- let inhibitor = new GnomeSession.Inhibitor(inhibitorObjectPaths[i]);
++ let inhibitor = new GnomeSession.Inhibitor(inhibitorObjectPaths[i], Lang.bind(this, function(proxy, error) {
++ this._onInhibitorLoaded(proxy);
++ }));
+
+- inhibitor.connect('is-loaded',
+- Lang.bind(this, function() {
+- this._onInhibitorLoaded(inhibitor);
+- }));
+ this._inhibitors.push(inhibitor);
+ }
+
+ this._updateButtons();
+
+- if (!this.open(timestamp))
+- throw new DBus.DBusError('org.Cinnamon.ModalDialog.GrabError',
+- "Cannot grab pointer and keyboard");
++ if (!this.open(timestamp)) {
++ invocation.report_dbus_error('org.Cinnamon.ModalDialog.GrabError',
++ "Cannot grab pointer and keyboard");
++ return;
++ }
+
+ this._updateContent();
+
+ let signalId = this.connect('opened',
+ Lang.bind(this, function() {
+- callback();
++ invocation.return_value(null);
+ this.disconnect(signalId);
+ }));
+ }
+ };
+-DBus.conformExport(EndSessionDialog.prototype, EndSessionDialogIface);
+diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js
+index f55cf93..69edb51 100644
+--- a/js/ui/keyboard.js
++++ b/js/ui/keyboard.js
+@@ -2,7 +2,6 @@
+
+ const Caribou = imports.gi.Caribou;
+ const Clutter = imports.gi.Clutter;
+-const DBus = imports.dbus;
+ const Gdk = imports.gi.Gdk;
+ const Gio = imports.gi.Gio;
+ const GLib = imports.gi.GLib;
+@@ -38,28 +37,27 @@ const PRETTY_KEYS = {
+ 'Alt_L': 'Alt'
+ };
+
+-const CaribouKeyboardIface = {
+- name: 'org.gnome.Caribou.Keyboard',
+- methods: [ { name: 'Show',
+- inSignature: 'u',
+- outSignature: ''
+- },
+- { name: 'Hide',
+- inSignature: 'u',
+- outSignature: ''
+- },
+- { name: 'SetCursorLocation',
+- inSignature: 'iiii',
+- outSignature: ''
+- },
+- { name: 'SetEntryLocation',
+- inSignature: 'iiii',
+- outSignature: ''
+- } ],
+- properties: [ { name: 'Name',
+- signature: 's',
+- access: 'read' } ]
+-};
++const CaribouKeyboardIface = <interface name='org.gnome.Caribou.Keyboard'>
++<method name='Show'>
++ <arg type='u' direction='in' />
++</method>
++<method name='Hide'>
++ <arg type='u' direction='in' />
++</method>
++<method name='SetCursorLocation'>
++ <arg type='i' direction='in' />
++ <arg type='i' direction='in' />
++ <arg type='i' direction='in' />
++ <arg type='i' direction='in' />
++</method>
++<method name='SetEntryLocation'>
++ <arg type='i' direction='in' />
++ <arg type='i' direction='in' />
++ <arg type='i' direction='in' />
++ <arg type='i' direction='in' />
++</method>
++<property name='Name' access='read' type='s' />
++</interface>;
+
+ function Key() {
+ this._init.apply(this, arguments);
+@@ -199,7 +197,8 @@ function Keyboard() {
+
+ Keyboard.prototype = {
+ _init: function () {
+- DBus.session.exportObject('/org/gnome/Caribou/Keyboard', this);
++ this._impl = Gio.DBusExportedObject.wrapJSObject(CaribouKeyboardIface, this);
++ this._impl.export(Gio.DBus.session, '/org/gnome/Caribou/Keyboard');
+
+ this.actor = null;
+
+@@ -541,7 +540,6 @@ Keyboard.prototype = {
+ return 'cinnamon';
+ }
+ };
+-DBus.conformExport(Keyboard.prototype, CaribouKeyboardIface);
+
+ function KeyboardSource() {
+ this._init.apply(this, arguments);
+diff --git a/js/ui/layout.js b/js/ui/layout.js
+index 76303b9..b97459e 100644
+--- a/js/ui/layout.js
++++ b/js/ui/layout.js
+@@ -488,12 +488,14 @@ Chrome.prototype = {
+
+ this._screenSaverActive = false;
+ this._screenSaverProxy = new ScreenSaver.ScreenSaverProxy();
+- this._screenSaverProxy.connect('ActiveChanged', Lang.bind(this, this._onScreenSaverActiveChanged));
+- this._screenSaverProxy.GetActiveRemote(Lang.bind(this,
+- function(result, err) {
+- if (!err)
+- this._onScreenSaverActiveChanged(this._screenSaverProxy, result);
+- }));
++ this._screenSaverProxy.connectSignal('ActiveChanged', Lang.bind(this, function(proxy, senderName, [isActive]) {
++ this._onScreenSaverActiveChanged(isActive);
++ }));
++ this._screenSaverProxy.GetActiveRemote(Lang.bind(this, function(result, err) {
++ if (!err)
++ this._onScreenSaverActiveChanged(result[0]);
++ }));
++
+
+ this._relayout();
+ },
+diff --git a/js/ui/magnifierDBus.js b/js/ui/magnifierDBus.js
+index 72bba26..4d21797 100644
+--- a/js/ui/magnifierDBus.js
++++ b/js/ui/magnifierDBus.js
+@@ -1,6 +1,6 @@
+ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+-const DBus = imports.dbus;
++const Gio = imports.gi.Gio;
+ const Main = imports.ui.main;
+
+ const MAG_SERVICE_NAME = 'org.gnome.Magnifier';
+@@ -10,47 +10,85 @@ const ZOOM_SERVICE_PATH = '/org/gnome/Magnifier/ZoomRegion';
+
+ // Subset of gnome-mag's Magnifier dbus interface -- to be expanded. See:
+ // http://git.gnome.org/browse/gnome-mag/tree/xml/...Magnifier.xml
+-const MagnifierIface = {
+- name: MAG_SERVICE_NAME,
+- methods: [
+- { name: 'setActive', inSignature: 'b', outSignature: '' },
+- { name: 'isActive', inSignature: '', outSignature: 'b' },
+- { name: 'showCursor', inSignature: '', outSignature: '' },
+- { name: 'hideCursor', inSignature: '', outSignature: '' },
+- { name: 'createZoomRegion', inSignature: 'ddaiai', outSignature: 'o' },
+- { name: 'addZoomRegion', inSignature: 'o', outSignature: 'b' },
+- { name: 'getZoomRegions', inSignature: '', outSignature: 'ao' },
+- { name: 'clearAllZoomRegions', inSignature: '', outSignature: '' },
+- { name: 'fullScreenCapable', inSignature: '', outSignature: 'b' },
+-
+- { name: 'setCrosswireSize', inSignature: 'i', outSignature: '' },
+- { name: 'getCrosswireSize', inSignature: '', outSignature: 'i' },
+- { name: 'setCrosswireLength', inSignature: 'i', outSignature: '' },
+- { name: 'getCrosswireLength', inSignature: '', outSignature: 'i' },
+- { name: 'setCrosswireClip', inSignature: 'b', outSignature: '' },
+- { name: 'getCrosswireClip', inSignature: '', outSignature: 'b' },
+- { name: 'setCrosswireColor', inSignature: 'u', outSignature: '' },
+- { name: 'getCrosswireColor', inSignature: '', outSignature: 'u' }
+- ],
+- signals: [],
+- properties: []
+-};
++const MagnifierIface = <interface name={MAG_SERVICE_NAME}>
++<method name="setActive">
++ <arg type="b" direction="in" />
++</method>
++<method name="isActive">
++ <arg type="b" direction="out" />
++</method>
++<method name="showCursor" />
++<method name="hideCursor" />
++<method name="createZoomRegion">
++ <arg type="d" direction="in" />
++ <arg type="d" direction="in" />
++ <arg type="ai" direction="in" />
++ <arg type="ai" direction="in" />
++ <arg type="o" direction="out" />
++</method>
++<method name="addZoomRegion">
++ <arg type="o" direction="in" />
++ <arg type="b" direction="out" />
++</method>
++<method name="getZoomRegions">
++ <arg type="ao" direction="out" />
++</method>
++<method name="clearAllZoomRegions" />
++<method name="fullScreenCapable">
++ <arg type="b" direction="out" />
++</method>
++<method name="setCrosswireSize">
++ <arg type="i" direction="in" />
++</method>
++<method name="getCrosswireSize">
++ <arg type="i" direction="out" />
++</method>
++<method name="setCrosswireLength">
++ <arg type="i" direction="in" />
++</method>
++<method name="getCrosswireLength">
++ <arg type="i" direction="out" />
++</method>
++<method name="setCrosswireClip">
++ <arg type="b" direction="in" />
++</method>
++<method name="getCrosswireClip">
++ <arg type="b" direction="out" />
++</method>
++<method name="setCrosswireColor">
++ <arg type="u" direction="in" />
++</method>
++<method name="getCrosswireColor">
++ <arg type="u" direction="out" />
++</method>
++</interface>;
+
+ // Subset of gnome-mag's ZoomRegion dbus interface -- to be expanded. See:
+ // http://git.gnome.org/browse/gnome-mag/tree/xml/...ZoomRegion.xml
+-const ZoomRegionIface = {
+- name: ZOOM_SERVICE_NAME,
+- methods: [
+- { name: 'setMagFactor', inSignature: 'dd', outSignature: ''},
+- { name: 'getMagFactor', inSignature: '', outSignature: 'dd' },
+- { name: 'setRoi', inSignature: 'ai', outSignature: '' },
+- { name: 'getRoi', inSignature: '', outSignature: 'ai' },
+- { name: 'shiftContentsTo', inSignature: 'ii', outSignature: 'b' },
+- { name: 'moveResize', inSignature: 'ai', outSignature: '' }
+- ],
+- signals: [],
+- properties: []
+-};
++const ZoomRegionIface = <interface name={ZOOM_SERVICE_NAME}>
++<method name="setMagFactor">
++ <arg type="d" direction="in" />
++ <arg type="d" direction="in" />
++</method>
++<method name="getMagFactor">
++ <arg type="d" direction="out" />
++ <arg type="d" direction="out" />
++</method>
++<method name="setRoi">
++ <arg type="ai" direction="in" />
++</method>
++<method name="getRoi">
++ <arg type="ai" direction="out" />
++</method>
++<method name="shiftContentsTo">
++ <arg type="i" direction="in" />
++ <arg type="i" direction="in" />
++ <arg type="b" direction="out" />
++</method>
++<method name="moveResize">
++ <arg type="ai" direction="in" />
++</method>
++</interface>;
+
+ // For making unique ZoomRegion DBus proxy object paths of the form:
+ // '/org/gnome/Magnifier/ZoomRegion/zoomer0',
+@@ -64,7 +102,9 @@ function CinnamonMagnifier() {
+ CinnamonMagnifier.prototype = {
+ _init: function() {
+ this._zoomers = {};
+- DBus.session.exportObject(MAG_SERVICE_PATH, this);
++
++ this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(MagnifierIface, this);
++ this._dbusImpl.export(Gio.DBus.session, MAG_SERVICE_PATH);
+ },
+
+ /**
+@@ -195,10 +235,10 @@ CinnamonMagnifier.prototype = {
+ Main.magnifier.clearAllZoomRegions();
+ for (let objectPath in this._zoomers) {
+ let proxyAndZoomer = this._zoomers[objectPath];
++ proxyAndZoomer.proxy.destroy();
+ proxyAndZoomer.proxy = null;
+ proxyAndZoomer.zoomRegion = null;
+ delete this._zoomers[objectPath];
+- DBus.session.unexportObject(proxyAndZoomer);
+ }
+ this._zoomers = {};
+ },
+@@ -300,8 +340,9 @@ function CinnamonMagnifierZoomRegion(zoomerObjectPath, zoomRegion) {
+ CinnamonMagnifierZoomRegion.prototype = {
+ _init: function(zoomerObjectPath, zoomRegion) {
+ this._zoomRegion = zoomRegion;
+- DBus.session.proxifyObject(this, ZOOM_SERVICE_NAME, zoomerObjectPath);
+- DBus.session.exportObject(zoomerObjectPath, this);
++
++ this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ZoomRegionIface, this);
++ this._dbusImpl.export(Gio.DBus.session, zoomerObjectPath);
+ },
+
+ /**
+@@ -376,8 +417,9 @@ CinnamonMagnifierZoomRegion.prototype = {
+ moveResize: function(viewPort) {
+ let viewRect = { x: viewPort[0], y: viewPort[1], width: viewPort[2] - viewPort[0], height: viewPort[3] - viewPort[1] };
+ this._zoomRegion.setViewPort(viewRect);
++ },
++
++ destroy: function() {
++ this._dbusImpl.unexport();
+ }
+ };
+-
+-DBus.conformExport(CinnamonMagnifier.prototype, MagnifierIface);
+-DBus.conformExport(CinnamonMagnifierZoomRegion.prototype, ZoomRegionIface);
+diff --git a/js/ui/main.js b/js/ui/main.js
+index 5cae372..180db5c 100644
+--- a/js/ui/main.js
++++ b/js/ui/main.js
+@@ -1,7 +1,6 @@
+ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+ const Clutter = imports.gi.Clutter;
+-const DBus = imports.dbus;
+ const Gio = imports.gi.Gio;
+ const GLib = imports.gi.GLib;
+ const Gtk = imports.gi.Gtk;
+@@ -199,11 +198,6 @@ function start() {
+
+ cinnamonDBusService = new CinnamonDBus.Cinnamon();
+ lookingGlassDBusService = new LookingGlassDBus.CinnamonLookingGlass();
+- // Force a connection now; dbus.js will do this internally
+- // if we use its name acquisition stuff but we aren't right
+- // now; to do so we'd need to convert from its async calls
+- // back into sync ones.
+- DBus.session.flush();
+
+ // Ensure CinnamonWindowTracker and CinnamonAppUsage are initialized; this will
+ // also initialize CinnamonAppSystem first. CinnamonAppSystem
+diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js
+index 18d6615..8bed028 100644
+--- a/js/ui/messageTray.js
++++ b/js/ui/messageTray.js
+@@ -1388,12 +1388,17 @@ function MessageTray() {
+
+ MessageTray.prototype = {
+ _init: function() {
+- this._presence = new GnomeSession.Presence();
++ this._presence = new GnomeSession.Presence(Lang.bind(this, function(proxy, error) {
++ this._onStatusChanged(proxy.status);
++ }));
++
+ this._userStatus = GnomeSession.PresenceStatus.AVAILABLE;
+ this._busy = false;
+ this._backFromAway = false;
+- this._presence.connect('StatusChanged', Lang.bind(this, this._onStatusChanged));
+- this._presence.getStatus(Lang.bind(this, this._onStatusChanged));
++ this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) {
++ this._onStatusChanged(status);
++ }));
++
+
+ this._notificationBin = new St.Bin();
+ this._notificationBin.hide();
+@@ -1548,7 +1553,7 @@ MessageTray.prototype = {
+ this._updateState();
+ },
+
+- _onStatusChanged: function(presence, status) {
++ _onStatusChanged: function(status) {
+ this._backFromAway = (this._userStatus == GnomeSession.PresenceStatus.IDLE && this._userStatus != status);
+ this._userStatus = status;
+
+diff --git a/js/ui/notificationDaemon.js b/js/ui/notificationDaemon.js
+index bee8ffd..b037e07 100644
+--- a/js/ui/notificationDaemon.js
++++ b/js/ui/notificationDaemon.js
+@@ -1,7 +1,7 @@
+ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+ const Clutter = imports.gi.Clutter;
+-const DBus = imports.dbus;
++const Gio = imports.gi.Gio;
+ const GLib = imports.gi.GLib;
+ const Lang = imports.lang;
+ const Cinnamon = imports.gi.Cinnamon;
+@@ -14,49 +14,52 @@ const Params = imports.misc.params;
+
+ let nextNotificationId = 1;
+
+-// Should really be defined in dbus.js
+-const BusIface = {
+- name: 'org.freedesktop.DBus',
+- methods: [{ name: 'GetConnectionUnixProcessID',
+- inSignature: 's',
+- outSignature: 'i' }]
+-};
+-
+-const Bus = function () {
+- this._init();
+-};
+-
+-Bus.prototype = {
+- _init: function() {
+- DBus.session.proxifyObject(this, 'org.freedesktop.DBus', '/org/freedesktop/DBus');
+- }
+-};
++// Should really be defined in Gio.js
++const BusIface = <interface name="org.freedesktop.DBus">
++<method name="GetConnectionUnixProcessID">
++ <arg type="s" direction="in" />
++ <arg type="u" direction="out" />
++</method>
++</interface>;
++
++var BusProxy = Gio.DBusProxy.makeProxyWrapper(BusIface);
++function Bus() {
++ return new BusProxy(Gio.DBus.session, 'org.freedesktop.DBus', '/org/freedesktop/DBus');
++}
+
+-DBus.proxifyPrototype(Bus.prototype, BusIface);
+-
+-const NotificationDaemonIface = {
+- name: 'org.freedesktop.Notifications',
+- methods: [{ name: 'Notify',
+- inSignature: 'susssasa{sv}i',
+- outSignature: 'u'
+- },
+- { name: 'CloseNotification',
+- inSignature: 'u',
+- outSignature: ''
+- },
+- { name: 'GetCapabilities',
+- inSignature: '',
+- outSignature: 'as'
+- },
+- { name: 'GetServerInformation',
+- inSignature: '',
+- outSignature: 'ssss'
+- }],
+- signals: [{ name: 'NotificationClosed',
+- inSignature: 'uu' },
+- { name: 'ActionInvoked',
+- inSignature: 'us' }]
+-};
++const NotificationDaemonIface = <interface name="org.freedesktop.Notifications">
++<method name="Notify">
++ <arg type="s" direction="in"/>
++ <arg type="u" direction="in"/>
++ <arg type="s" direction="in"/>
++ <arg type="s" direction="in"/>
++ <arg type="s" direction="in"/>
++ <arg type="as" direction="in"/>
++ <arg type="a{sv}" direction="in"/>
++ <arg type="i" direction="in"/>
++ <arg type="u" direction="out"/>
++</method>
++<method name="CloseNotification">
++ <arg type="u" direction="in"/>
++</method>
++<method name="GetCapabilities">
++ <arg type="as" direction="out"/>
++</method>
++<method name="GetServerInformation">
++ <arg type="s" direction="out"/>
++ <arg type="s" direction="out"/>
++ <arg type="s" direction="out"/>
++ <arg type="s" direction="out"/>
++</method>
++<signal name="NotificationClosed">
++ <arg type="u"/>
++ <arg type="u"/>
++</signal>
++<signal name="ActionInvoked">
++ <arg type="u"/>
++ <arg type="s"/>
++</signal>
++</interface>;
+
+ const NotificationClosedReason = {
+ EXPIRED: 1,
+@@ -88,7 +91,8 @@ function NotificationDaemon() {
+
+ NotificationDaemon.prototype = {
+ _init: function() {
+- DBus.session.exportObject('/org/freedesktop/Notifications', this);
++ this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(NotificationDaemonIface, this);
++ this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/Notifications');
+
+ this._sources = [];
+ this._senderToPid = {};
+@@ -213,8 +217,8 @@ NotificationDaemon.prototype = {
+ return source;
+ },
+
+- Notify: function(appName, replacesId, icon, summary, body,
+- actions, hints, timeout) {
++ NotifyAsync: function(params, invocation) {
++ let [appName, replacesId, icon, summary, body, actions, hints, timeout] = params;
+ let id;
+
+ let rewrites = rewriteRules[appName];
+@@ -257,51 +261,55 @@ NotificationDaemon.prototype = {
+ }
+ this._notifications[id] = ndata;
+
+- let sender = DBus.getCurrentMessageContext().sender;
++ let sender = invocation.get_sender();
+ let pid = this._senderToPid[sender];
+
+ let source = this._getSource(appName, pid, ndata, sender, null);
+
+ if (source) {
+ this._notifyForSource(source, ndata);
+- return id;
++ return invocation.return_value(GLib.Variant.new('(u)', [id]));
+ }
+
+ if (replacesId) {
+ // There's already a pending call to GetConnectionUnixProcessID,
+ // which will see the new notification data when it finishes,
+ // so we don't have to do anything.
+- return id;
++ return invocation.return_value(GLib.Variant.new('(u)', [id]));
+ }
+
+- this._busProxy.GetConnectionUnixProcessIDRemote(sender, Lang.bind(this,
+- function (pid, ex) {
+- // The app may have updated or removed the notification
+- ndata = this._notifications[id];
+- if (!ndata)
+- return;
+-
+- source = this._getSource(appName, pid, ndata, sender, null);
+-
+- // We only store sender-pid entries for persistent sources.
+- // Removing the entries once the source is destroyed
+- // would result in the entries associated with transient
+- // sources removed once the notification is shown anyway.
+- // However, keeping these pairs would mean that we would
+- // possibly remove an entry associated with a persistent
+- // source when a transient source for the same sender is
+- // distroyed.
+- if (!source.isTransient) {
+- this._senderToPid[sender] = pid;
+- source.connect('destroy', Lang.bind(this,
+- function() {
+- delete this._senderToPid[sender];
+- }));
+- }
+- this._notifyForSource(source, ndata);
+- }));
++ this._busProxy.GetConnectionUnixProcessIDRemote(sender, Lang.bind(this, function (result, excp) {
++ // The app may have updated or removed the notification
++ ndata = this._notifications[id];
++ if (!ndata)
++ return;
+
+- return id;
++ if (excp) {
++ logError(excp, 'Call to GetConnectionUnixProcessID failed');
++ return;
++ }
++
++ let [pid] = result;
++ source = this._getSource(appName, pid, ndata, sender);
++
++ // We only store sender-pid entries for persistent sources.
++ // Removing the entries once the source is destroyed
++ // would result in the entries associated with transient
++ // sources removed once the notification is shown anyway.
++ // However, keeping these pairs would mean that we would
++ // possibly remove an entry associated with a persistent
++ // source when a transient source for the same sender is
++ // distroyed.
++ if (!source.isTransient) {
++ this._senderToPid[sender] = pid;
++ source.connect('destroy', Lang.bind(this, function() {
++ delete this._senderToPid[sender];
++ }));
++ }
++ this._notifyForSource(source, ndata);
++ }));
++
++ return invocation.return_value(GLib.Variant.new('(u)', [id]));
+ },
+
+ _notifyForSource: function(source, ndata) {
+@@ -441,17 +449,13 @@ NotificationDaemon.prototype = {
+ },
+
+ _emitNotificationClosed: function(id, reason) {
+- DBus.session.emit_signal('/org/freedesktop/Notifications',
+- 'org.freedesktop.Notifications',
+- 'NotificationClosed', 'uu',
+- [id, reason]);
++ this._dbusImpl.emit_signal('NotificationClosed',
++ GLib.Variant.new('(uu)', [id, reason]));
+ },
+
+ _emitActionInvoked: function(id, action) {
+- DBus.session.emit_signal('/org/freedesktop/Notifications',
+- 'org.freedesktop.Notifications',
+- 'ActionInvoked', 'us',
+- [id, action]);
++ this._dbusImpl.emit_signal('ActionInvoked',
++ GLib.Variant.new('(us)', [id, action]));
+ },
+
+ _onTrayIconAdded: function(o, icon) {
+@@ -465,8 +469,6 @@ NotificationDaemon.prototype = {
+ }
+ };
+
+-DBus.conformExport(NotificationDaemon.prototype, NotificationDaemonIface);
+-
+ function Source(title, pid, sender, trayIcon) {
+ this._init(title, pid, sender, trayIcon);
+ }
+@@ -481,15 +483,12 @@ Source.prototype = {
+
+ this.pid = pid;
+ if (sender)
+- // TODO: dbus-glib implementation of watch_name() doesn’t return an id to be used for
+- // unwatch_name() or implement unwatch_name(), however when we move to using GDBus implementation,
+- // we should save the id here and call unwatch_name() with it in destroy().
+- // Moving to GDBus is the work in progress: https://bugzilla.gnome.org/show_bug.cgi?id=648651
+- // and https://bugzilla.gnome.org/show_bug.cgi?id=622921 .
+- DBus.session.watch_name(sender,
+- false,
+- null,
+- Lang.bind(this, this._onNameVanished));
++ this._nameWatcherId = Gio.DBus.session.watch_name(sender,
++ Gio.BusNameWatcherFlags.NONE,
++ null,
++ Lang.bind(this, this._onNameVanished));
++ else
++ this._nameWatcherId = 0;
+
+ this._setApp();
+ if (this.app)
+@@ -596,6 +595,10 @@ Source.prototype = {
+ },
+
+ destroy: function() {
++ if (this._nameWatcherId) {
++ Gio.DBus.session.unwatch_name(this._nameWatcherId);
++ this._nameWatcherId = 0;
++ }
+ MessageTray.Source.prototype.destroy.call(this);
+ }
+ };
+diff --git a/js/ui/scripting.js b/js/ui/scripting.js
+index 42c4f6d..9163d29 100644
+--- a/js/ui/scripting.js
++++ b/js/ui/scripting.js
+@@ -1,6 +1,5 @@
+ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+-const DBus = imports.dbus;
+ const Gio = imports.gi.Gio;
+ const Mainloop = imports.mainloop;
+ const Meta = imports.gi.Meta;
+@@ -70,24 +69,21 @@ function waitLeisure() {
+ };
+ }
+
+-const PerfHelperIface = {
+- name: 'org.Cinnamon.PerfHelper',
+- methods: [{ name: 'CreateWindow', inSignature: 'iibb', outSignature: '' },
+- { name: 'WaitWindows', inSignature: '', outSignature: '' },
+- { name: 'DestroyWindows', inSignature: '', outSignature: ''}]
+-};
+-
+-const PerfHelper = function () {
+- this._init();
+-};
+-
+-PerfHelper.prototype = {
+- _init: function() {
+- DBus.session.proxifyObject(this, 'org.Cinnamon.PerfHelper', '/org/Cinnamon/PerfHelper');
+- }
+-};
+-
+-DBus.proxifyPrototype(PerfHelper.prototype, PerfHelperIface);
++const PerfHelperIface = <interface name="org.gnome.Shell.PerfHelper">
++<method name="CreateWindow">
++ <arg type="i" direction="in" />
++ <arg type="i" direction="in" />
++ <arg type="b" direction="in" />
++ <arg type="b" direction="in" />
++</method>
++<method name="WaitWindows" />
++<method name="DestroyWindows" />
++</interface>;
++
++var PerfHelperProxy = Gio.DBusProxy.makeProxyWrapper(PerfHelperIface);
++function PerfHelper() {
++ return new PerfHelperProxy(Gio.DBus.session, 'org.gnome.Shell.PerfHelper', '/org/gnome/Shell/PerfHelper');
++}
+
+ let _perfHelper = null;
+ function _getPerfHelper() {
+--
+1.8.1.6
+
+
+From d85e078c0ed09a8b9f8d3ea2ebec1043b6d150c1 Mon Sep 17 00:00:00 2001
+From: dalcde <dalcde@yahoo.com.hk>
+Date: Tue, 16 Apr 2013 16:58:30 +0800
+Subject: [PATCH 07/15] [GDBus][Sound/Power Applet] Fix dbus port issues
+
+---
+ .../cinnamon/applets/power@cinnamon.org/applet.js | 2 +-
+ .../cinnamon/applets/sound@cinnamon.org/applet.js | 83 ++++++++++------------
+ 2 files changed, 37 insertions(+), 48 deletions(-)
+
+diff --git a/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js b/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js
+index b6b2bcd..fad39ab 100644
+--- a/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js
++++ b/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js
+@@ -212,7 +212,7 @@ MyApplet.prototype = {
+ this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
+ this.menu.addSettingsAction(_("Power Settings"), 'power');
+
+- this._smProxy.connect('PropertiesChanged', Lang.bind(this, this._devicesChanged));
++ this._smProxy.connectSignal('PropertiesChanged', Lang.bind(this, this._devicesChanged));
+ this._devicesChanged();
+ }
+ catch (e) {
+diff --git a/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js b/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js
+index 5bfaf26..52b8cde 100644
+--- a/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js
++++ b/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js
+@@ -37,7 +37,7 @@ const MediaServer2PlayerIFace = <interface name="org.mpris.MediaPlayer2.Player">
+ <property name='Metadata' access='read' type='a{sv}' />
+ <property name='Shuffle' access='readwrite' type='b' />
+ <property name='Rate' access='readwrite' type='d' />
+-<property name='LoopStatus' access='readwrite' type='b' />
++<property name='LoopStatus' access='readwrite' type='s' />
+ <property name='Volume' access='readwrite' type='d' />
+ <property name='PlaybackStatus' access='read' type='s' />
+ <property name='Position' access='read' type='x' />
+@@ -256,23 +256,20 @@ Player.prototype = {
+ this._trackControls.set_child(this.controls);
+ this.addActor(this._trackControls);
+
+- this._mediaServer.getRaise(Lang.bind(this, function(sender, raise) {
+- if (raise) {
+- this._raiseButton = new ControlButton('go-up',
+- Lang.bind(this, function () { this._mediaServer.RaiseRemote(); this._system_status_button.menu.actor.hide(); }));
+- this._raiseButtonTooltip = new Tooltips.Tooltip(this._raiseButton.button, _("Open Player"));
+- this.controls.add_actor(this._raiseButton.getActor());
+- }
+- }));
+-
+- this._mediaServer.getQuit(Lang.bind(this, function(sender, quit) {
+- if (quit) {
+- this._quitButton = new ControlButton('window-close',
+- Lang.bind(this, function () { this._mediaServer.QuitRemote(); }));
+- this.controls.add_actor(this._quitButton.getActor());
+- this._quitButtonTooltip = new Tooltips.Tooltip(this._quitButton.button, _("Quit Player"));
+- }
+- }));
++ let CanRaise = this._mediaServer.CanRaise;
++ let CanQuit = this._mediaServer.CanQuit;
++ if (CanRaise) {
++ this._raiseButton = new ControlButton('go-up',
++ Lang.bind(this, function () { this._mediaServer.RaiseRemote(); this._system_status_button.menu.actor.hide(); }));
++ this._raiseButtonTooltip = new Tooltips.Tooltip(this._raiseButton.button, _("Open Player"));
++ this.controls.add_actor(this._raiseButton.getActor());
++ }
++ if (CanQuit) {
++ this._quitButton = new ControlButton('window-close',
++ Lang.bind(this, function () { this._mediaServer.QuitRemote(); }));
++ this.controls.add_actor(this._quitButton.getActor());
++ this._quitButtonTooltip = new Tooltips.Tooltip(this._quitButton.button, _("Quit Player"));
++ }
+
+ /* this players don't support seek */
+ if (support_seek.indexOf(this._name) == -1)
+@@ -283,14 +280,14 @@ Player.prototype = {
+ this._currentTime = 0;
+ this._getPosition();
+
+- this._prop.connect('PropertiesChanged', Lang.bind(this, function(sender, iface, value) {
++ this._prop.connectSignal('PropertiesChanged', Lang.bind(this, function(sender, iface, value) {
+ if (value["PlaybackStatus"])
+- this._setStatus(iface, value["PlaybackStatus"]);
++ this._setStatus(value["PlaybackStatus"]);
+ if (value["Metadata"])
+- this._setMetadata(iface, value["Metadata"]);
++ this._setMetadata(value["Metadata"]);
+ }));
+
+- this._mediaServerPlayer.connect('Seeked', Lang.bind(this, function(sender, value) {
++ this._mediaServerPlayer.connectSignal('Seeked', Lang.bind(this, function(sender, iface, [value]) {
+ this._setPosition(sender, value);
+ }));
+
+@@ -315,19 +312,17 @@ Player.prototype = {
+ },
+
+ _getPosition: function() {
+- this._mediaServerPlayer.getPosition(Lang.bind(this,
+- this._setPosition
+- ));
++ this._setPosition(this._mediaServerPlayer.Position);
+ Mainloop.timeout_add(1000, Lang.bind(this, this._getPosition));
+ },
+
+- _setMetadata: function(sender, metadata) {
++ _setMetadata: function(metadata) {
+ if (metadata["mpris:length"]) {
+ // song length in secs
+- this._songLength = metadata["mpris:length"] / 1000000;
++ this._songLength = metadata["mpris:length"].unpack() / 1000000;
+ // FIXME upstream
+ if (this._name == "quodlibet")
+- this._songLength = metadata["mpris:length"] / 1000;
++ this._songLength = metadata["mpris:length"].unpack() / 1000;
+ // reset timer
+ this._stopTimer();
+ if (this._playerStatus == "Playing")
+@@ -338,15 +333,15 @@ Player.prototype = {
+ this._stopTimer();
+ }
+ if (metadata["xesam:artist"])
+- this._artist.setLabel(metadata["xesam:artist"].toString());
++ this._artist.setLabel(metadata["xesam:artist"].unpack());
+ else
+ this._artist.setLabel(_("Unknown Artist"));
+ if (metadata["xesam:album"])
+- this._album.setLabel(metadata["xesam:album"].toString());
++ this._album.setLabel(metadata["xesam:album"].unpack());
+ else
+ this._album.setLabel(_("Unknown Album"));
+ if (metadata["xesam:title"])
+- this._title.setLabel(metadata["xesam:title"].toString());
++ this._title.setLabel(metadata["xesam:title"].unpack());
+ else
+ this._title.setLabel(_("Unknown Title"));
+ /*if (metadata["mpris:trackid"]) {
+@@ -359,8 +354,8 @@ Player.prototype = {
+
+ let change = false;
+ if (metadata["mpris:artUrl"]) {
+- if (this._trackCoverFile != metadata["mpris:artUrl"].toString()) {
+- this._trackCoverFile = metadata["mpris:artUrl"].toString();
++ if (this._trackCoverFile != metadata["mpris:artUrl"].unpack()) {
++ this._trackCoverFile = metadata["mpris:artUrl"].unpack();
+ change = true;
+ }
+ }
+@@ -392,12 +387,10 @@ Player.prototype = {
+ },
+
+ _getMetadata: function() {
+- this._mediaServerPlayer.getMetadata(Lang.bind(this,
+- this._setMetadata
+- ));
++ this._setMetadata(this._mediaServerPlayer.Metadata);
+ },
+
+- _setStatus: function(sender, status) {
++ _setStatus: function(status) {
+ this._playerStatus = status;
+ if (status == "Playing") {
+ this._playButton.setIcon("media-playback-pause");
+@@ -416,15 +409,11 @@ Player.prototype = {
+ },
+
+ _getStatus: function() {
+- this._mediaServerPlayer.getPlaybackStatus(Lang.bind(this,
+- this._setStatus
+- ));
++ this._setStatus(this._mediaServerPlayer.PlaybackStatus);
+ },
+
+ _updateRate: function() {
+- this._mediaServerPlayer.getRate(Lang.bind(this, function(sender, rate) {
+- this._rate = rate;
+- }));
++ this._rate = this._mediaServerPlayer.Rate;
+ },
+
+ _updateTimer: function() {
+@@ -569,7 +558,7 @@ MyApplet.prototype = {
+ this._players = {};
+ // watch players
+ for (var p=0; p<compatible_players.length; p++) {
+- Gio.DBus.session.watch_name('org.mpris.MediaPlayer2.'+compatible_players[p], false,
++ Gio.DBus.session.watch_name('org.mpris.MediaPlayer2.'+compatible_players[p], Gio.BusNameWatcherFlags.NONE,
+ Lang.bind(this, this._addPlayer),
+ Lang.bind(this, this._removePlayer)
+ );
+@@ -700,7 +689,7 @@ MyApplet.prototype = {
+ return Object.keys(this._players).length;
+ },
+
+- _addPlayer: function(owner) {
++ _addPlayer: function(connection, owner) {
+ // ensure menu is empty
+ this._cleanup();
+ this._volumeControlShown = false;
+@@ -715,12 +704,12 @@ MyApplet.prototype = {
+ this._readOutput();
+ },
+
+- _removePlayer: function(owner) {
++ _removePlayer: function(connection, owner) {
+ delete this._players[owner];
+ this._cleanup();
+ this._volumeControlShown = false;
+ for (owner in this._players) {
+- this._addPlayer(owner);
++ this._addPlayer(connection, owner);
+ }
+ this.menu.emit('players-loaded', true);
+
+--
+1.8.1.6
+
+
+From 02da490ff9d33b050e7a10171b5795aee67d1645 Mon Sep 17 00:00:00 2001
+From: Michael Webster <miketwebster@gmail.com>
+Date: Fri, 19 Apr 2013 19:09:18 -0400
+Subject: [PATCH 08/15] Fix gicon error - power applet
+
+---
+ files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js b/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js
+index fad39ab..3a13eab 100644
+--- a/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js
++++ b/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js
+@@ -323,7 +323,7 @@ MyApplet.prototype = {
+ let icon = this._proxy.Icon;
+ if (icon) {
+ let gicon = Gio.icon_new_for_string(icon);
+- this.setGIcon(gicon);
++ this._applet_icon.gicon = gicon
+ this.actor.show();
+ } else {
+ this.menu.close();
+--
+1.8.1.6
+
+
+From 3d78b5c929e7e3b0ee24d4b537492740e7bebf2f Mon Sep 17 00:00:00 2001
+From: Michael Webster <miketwebster@gmail.com>
+Date: Fri, 19 Apr 2013 19:44:33 -0400
+Subject: [PATCH 09/15] Remove unused
+
+---
+ src/cinnamon-background-manager.c | 34 ----------------------------------
+ 1 file changed, 34 deletions(-)
+
+diff --git a/src/cinnamon-background-manager.c b/src/cinnamon-background-manager.c
+index 9d95250..67427ed 100644
+--- a/src/cinnamon-background-manager.c
++++ b/src/cinnamon-background-manager.c
+@@ -66,8 +66,6 @@ struct CinnamonBackgroundManagerPrivate
+
+ G_DEFINE_TYPE (CinnamonBackgroundManager, cinnamon_background_manager, G_TYPE_OBJECT)
+
+-static gpointer manager_object = NULL;
+-
+ static gboolean
+ dont_draw_background (CinnamonBackgroundManager *manager)
+ {
+@@ -223,36 +221,6 @@ struct CinnamonBackgroundManagerPrivate
+ }
+
+ static void
+-draw_background_after_session_loads (CinnamonBackgroundManager *manager)
+-{
+- GError *error = NULL;
+- GDBusProxyFlags flags;
+-
+- flags = G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
+- G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START;
+- manager->priv->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+- flags,
+- NULL, /* GDBusInterfaceInfo */
+- "org.gnome.SessionManager",
+- "/org/gnome/SessionManager",
+- "org.gnome.SessionManager",
+- NULL, /* GCancellable */
+- &error);
+- if (manager->priv->proxy == NULL) {
+- g_warning ("Could not listen to session manager: %s",
+- error->message);
+- g_error_free (error);
+- return;
+- }
+-
+- manager->priv->proxy_signal_id = g_signal_connect (manager->priv->proxy,
+- "g-signal",
+- G_CALLBACK (on_session_manager_signal),
+- manager);
+-}
+-
+-
+-static void
+ disconnect_screen_signals (CinnamonBackgroundManager *manager)
+ {
+ GdkDisplay *display;
+@@ -312,8 +280,6 @@ struct CinnamonBackgroundManagerPrivate
+ G_CALLBACK (draw_background_changed), manager);
+
+ setup_bg_and_draw_background (manager);
+- //draw_background_after_session_loads (manager);
+-
+
+ return TRUE;
+ }
+--
+1.8.1.6
+
+
+From d08b882470b135591fb99bd9ff7c63619fcaea82 Mon Sep 17 00:00:00 2001
+From: dalcde <dalcde@yahoo.com.hk>
+Date: Sat, 20 Apr 2013 15:42:13 +0800
+Subject: [PATCH 10/15] [GDBus][Power applet] Some fixes and cleanup
+
+---
+ .../cinnamon/applets/power@cinnamon.org/applet.js | 52 ++++++----------------
+ 1 file changed, 14 insertions(+), 38 deletions(-)
+
+diff --git a/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js b/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js
+index 3a13eab..5f81d91 100644
+--- a/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js
++++ b/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js
+@@ -48,40 +48,11 @@ const PowerManagerInterface = <interface name="org.gnome.SettingsDaemon.Power">
+ <method name="GetPrimaryDevice">
+ <arg type="(susdut)" direction="out"/>
+ </method>
+-<signal name="PropertiesChanged">
+- <arg type="s"/>
+- <arg type="a{sv}"/>
+- <arg type="a[s]"/>
+-</signal>
+ <property name="Icon" type="s" access="read" />
+ </interface>;
+
+ const PowerManagerProxy = Gio.DBusProxy.makeProxyWrapper(PowerManagerInterface);
+
+-const SettingsManagerInterface = <interface name="org.freedesktop.DBus.Properties">
+-<method name="Get">
+- <arg type="s" direction="in"/>
+- <arg type="s" direction="in"/>
+- <arg type="v" direction="out"/>
+-</method>
+-<method name="GetAll">
+- <arg type="s" direction="in"/>
+- <arg type="a{sv}" direction="out"/>
+-</method>
+-<method name="Set">
+- <arg type="s" direction="in"/>
+- <arg type="s" direction="in"/>
+- <arg type="v" direction="in"/>
+-</method>
+-<signal name="PropertiesChanged">
+- <arg type="s"/>
+- <arg type="a{sv}"/>
+- <arg type="a[s]"/>
+-</signal>
+-</interface>;
+-
+-const SettingsManagerProxy = Gio.DBusProxy.makeProxyWrapper(SettingsManagerInterface);
+-
+ function DeviceItem() {
+ this._init.apply(this, arguments);
+ }
+@@ -156,8 +127,16 @@ MyApplet.prototype = {
+ this.menuManager.addMenu(this.menu);
+
+ //this.set_applet_icon_symbolic_name('battery-missing');
+- this._proxy = new PowerManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH);
+- this._smProxy = new SettingsManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH);
++ this._proxy = new PowerManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
++ Lang.bind(this, function(proxy, error) {
++ if (error) {
++ global.log(error.message);
++
++ return;
++ }
++ this._proxy.connect('g-properties-changed', Lang.bind(this, this._devicesChanged));
++ this._devicesChanged();
++ }));
+
+ let icon = this.actor.get_children()[0];
+ this.actor.remove_actor(icon);
+@@ -211,9 +190,6 @@ MyApplet.prototype = {
+
+ this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
+ this.menu.addSettingsAction(_("Power Settings"), 'power');
+-
+- this._smProxy.connectSignal('PropertiesChanged', Lang.bind(this, this._devicesChanged));
+- this._devicesChanged();
+ }
+ catch (e) {
+ global.logError(e);
+@@ -245,14 +221,14 @@ MyApplet.prototype = {
+ },
+
+ _readPrimaryDevice: function() {
+- this._proxy.GetPrimaryDeviceRemote(Lang.bind(this, function(device, error) {
++ this._proxy.GetPrimaryDeviceRemote(Lang.bind(this, function(result, error) {
+ if (error) {
+ this._hasPrimary = false;
+ this._primaryDeviceId = null;
+ this._batteryItem.actor.hide();
+ return;
+ }
+- let [device_id, device_type, icon, percentage, state, seconds] = device;
++ let [[device_id, device_type, icon, percentage, state, seconds]] = result;
+ if (device_type == UPDeviceType.BATTERY) {
+ this._hasPrimary = true;
+ let time = Math.round(seconds / 60);
+@@ -290,7 +266,7 @@ MyApplet.prototype = {
+ },
+
+ _readOtherDevices: function() {
+- this._proxy.GetDevicesRemote(Lang.bind(this, function(devices, error) {
++ this._proxy.GetDevicesRemote(Lang.bind(this, function([devices], error) {
+ this._deviceItems.forEach(function(i) { i.destroy(); });
+ this._deviceItems = [];
+
+@@ -336,7 +312,7 @@ MyApplet.prototype = {
+ },
+
+ _updateLabel: function() {
+- this._proxy.GetDevicesRemote(Lang.bind(this, function(devices, error) {
++ this._proxy.GetDevicesRemote(Lang.bind(this, function([devices], error) {
+ if (error) {
+ this._mainLabel.set_text("");
+ return;
+--
+1.8.1.6
+
+
+From c93e9746b321ad6d0aa38ec28c15fe7b3f18f8f7 Mon Sep 17 00:00:00 2001
+From: Michael Webster <miketwebster@gmail.com>
+Date: Sat, 20 Apr 2013 10:59:54 -0400
+Subject: [PATCH 11/15] Move CLUTTER_DISABLE_XINPUT to session startup file
+
+---
+ files/usr/bin/gnome-session-cinnamon | 2 +-
+ src/main.c | 3 ---
+ 2 files changed, 1 insertion(+), 4 deletions(-)
+
+diff --git a/files/usr/bin/gnome-session-cinnamon b/files/usr/bin/gnome-session-cinnamon
+index 315f135..56c37f5 100755
+--- a/files/usr/bin/gnome-session-cinnamon
++++ b/files/usr/bin/gnome-session-cinnamon
+@@ -1,3 +1,3 @@
+ #! /bin/sh
+-exec gnome-session --session cinnamon "$@"
++exec CLUTTER_DISABLE_XINPUT=1 gnome-session --session cinnamon "$@"
+
+diff --git a/src/main.c b/src/main.c
+index 9d37975..418fb60 100644
+--- a/src/main.c
++++ b/src/main.c
+@@ -257,9 +257,6 @@
+
+ g_option_context_free (ctx);
+
+- /* Disable XInput extension - required for 3.8 compatibility */
+- g_setenv ("CLUTTER_DISABLE_XINPUT", "1", TRUE);
+-
+ meta_plugin_type_register (gnome_cinnamon_plugin_get_type ());
+
+ /* Prevent meta_init() from causing gtk to load gail and at-bridge */
+--
+1.8.1.6
+
+
+From de1719e63518884cad6c9d63d508f737eab35d49 Mon Sep 17 00:00:00 2001
+From: Michael Webster <miketwebster@gmail.com>
+Date: Sat, 20 Apr 2013 12:23:29 -0400
+Subject: [PATCH 12/15] Add Xinput disable to cinnamon2d
+
+---
+ files/usr/bin/cinnamon2d | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/files/usr/bin/cinnamon2d b/files/usr/bin/cinnamon2d
+index 1eced99..7f42517 100755
+--- a/files/usr/bin/cinnamon2d
++++ b/files/usr/bin/cinnamon2d
+@@ -1,2 +1,2 @@
+ #!/bin/bash
+-CLUTTER_PAINT=disable-clipped-redraws:disable-culling LIBGL_ALWAYS_SOFTWARE=1 CINNAMON_SOFTWARE_RENDERING=1 CINNAMON_SLOWDOWN_FACTOR=0.0001 MUFFIN_NO_SHADOWS=1 CLUTTER_DEFAULT_FPS=15 cinnamon $@
++CLUTTER_DISABLE_XINPUT=1 CLUTTER_PAINT=disable-clipped-redraws:disable-culling LIBGL_ALWAYS_SOFTWARE=1 CINNAMON_SOFTWARE_RENDERING=1 CINNAMON_SLOWDOWN_FACTOR=0.0001 MUFFIN_NO_SHADOWS=1 CLUTTER_DEFAULT_FPS=15 cinnamon $@
+--
+1.8.1.6
+
+
+From 15d57d1c15f34d44b23f74b21929d996d4465afb Mon Sep 17 00:00:00 2001
+From: Michael Webster <miketwebster@gmail.com>
+Date: Sat, 20 Apr 2013 12:29:43 -0400
+Subject: [PATCH 13/15] Fix session file
+
+---
+ files/usr/bin/gnome-session-cinnamon | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/files/usr/bin/gnome-session-cinnamon b/files/usr/bin/gnome-session-cinnamon
+index 56c37f5..31c9eff 100755
+--- a/files/usr/bin/gnome-session-cinnamon
++++ b/files/usr/bin/gnome-session-cinnamon
+@@ -1,3 +1,3 @@
+ #! /bin/sh
+-exec CLUTTER_DISABLE_XINPUT=1 gnome-session --session cinnamon "$@"
++CLUTTER_DISABLE_XINPUT=1 exec gnome-session --session cinnamon "$@"
+
+--
+1.8.1.6
+
+
+From 03436393c322fd97d8216c3481d28cd34833c656 Mon Sep 17 00:00:00 2001
+From: Michael Webster <miketwebster@gmail.com>
+Date: Sat, 20 Apr 2013 12:36:45 -0400
+Subject: [PATCH 14/15] Add cinnamon3d command
+
+---
+ files/usr/bin/cinnamon3d | 2 ++
+ 1 file changed, 2 insertions(+)
+ create mode 100644 files/usr/bin/cinnamon3d
+
+diff --git a/files/usr/bin/cinnamon3d b/files/usr/bin/cinnamon3d
+new file mode 100644
+index 0000000..4891783
+--- /dev/null
++++ b/files/usr/bin/cinnamon3d
+@@ -0,0 +1,2 @@
++#!/bin/bash
++CLUTTER_DISABLE_XINPUT=1 cinnamon $@
+--
+1.8.1.6
+
+
+From 850da270967622b95be9e0c5edd8e230eb4be5a1 Mon Sep 17 00:00:00 2001
+From: Michael Webster <miketwebster@gmail.com>
+Date: Sat, 20 Apr 2013 12:37:26 -0400
+Subject: [PATCH 15/15] Fix perms
+
+---
+ files/usr/bin/cinnamon3d | 0
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+ mode change 100644 => 100755 files/usr/bin/cinnamon3d
+
+diff --git a/files/usr/bin/cinnamon3d b/files/usr/bin/cinnamon3d
+old mode 100644
+new mode 100755
+--
+1.8.1.6
+
diff --git a/community/cinnamon/switch-applications.patch b/community/cinnamon/switch-applications.patch
new file mode 100644
index 000000000..ce2e31825
--- /dev/null
+++ b/community/cinnamon/switch-applications.patch
@@ -0,0 +1,55 @@
+diff -Naur linuxmint-Cinnamon-b41bad0.orig/files/usr/lib/cinnamon-settings/modules/cs_keyboard.py linuxmint-Cinnamon-b41bad0/files/usr/lib/cinnamon-settings/modules/cs_keyboard.py
+--- linuxmint-Cinnamon-b41bad0.orig/files/usr/lib/cinnamon-settings/modules/cs_keyboard.py 2013-04-15 15:55:01.000000000 +0200
++++ linuxmint-Cinnamon-b41bad0/files/usr/lib/cinnamon-settings/modules/cs_keyboard.py 2013-04-24 21:19:49.262020614 +0200
+@@ -43,8 +43,8 @@
+ # Cinnamon stuff
+ [_("Toggle Scale"), "org.gnome.desktop.wm.keybindings", "switch-to-workspace-down", True, "cinnamon"],
+ [_("Toggle Expo"), "org.gnome.desktop.wm.keybindings", "switch-to-workspace-up", True, "cinnamon"],
+- [_("Cycle through open windows"), "org.gnome.desktop.wm.keybindings", "switch-windows", True, "cinnamon"],
+- [_("Cycle backwards though open windows"), "org.gnome.desktop.wm.keybindings", "switch-windows-backward", True, "cinnamon"],
++ [_("Cycle through open windows"), "org.gnome.desktop.wm.keybindings", "switch-applications", True, "cinnamon"],
++ [_("Cycle backwards though open windows"), "org.gnome.desktop.wm.keybindings", "switch-applications-backward", True, "cinnamon"],
+ [_("Run dialog (must restart Cinnamon)"), "org.gnome.desktop.wm.keybindings", "panel-run-dialog", True, "cinnamon"],
+ [_("Menu button (must restart Cinnamon)"), "org.cinnamon.muffin", "overlay-key", False, "cinnamon"],
+
+diff -Naur linuxmint-Cinnamon-b41bad0.orig/js/ui/altTab.js linuxmint-Cinnamon-b41bad0/js/ui/altTab.js
+--- linuxmint-Cinnamon-b41bad0.orig/js/ui/altTab.js 2013-04-15 15:55:01.000000000 +0200
++++ linuxmint-Cinnamon-b41bad0/js/ui/altTab.js 2013-04-24 21:22:38.309568355 +0200
+@@ -203,9 +203,9 @@
+ }
+ } else if (binding == 'switch-group-backward') {
+ this._select(0, this._appIcons[0].cachedWindows.length - 1);
+- } else if (binding == 'switch-windows-backward') {
++ } else if (binding == 'switch-applications-backward') {
+ this._select(this._appIcons.length - 1);
+- } else if (binding == 'no-switch-windows') {
++ } else if (binding == 'no-switch-applications') {
+ this._select(0);
+ } else if (this._appIcons.length == 1) {
+ this._select(0);
+@@ -296,7 +296,7 @@
+ return false;
+ }
+ Main.wm.showWorkspaceOSD();
+- that.refresh('no-switch-windows');
++ that.refresh('no-switch-applications');
+ return true;
+ };
+ let keysym = event.get_key_symbol();
+diff -Naur linuxmint-Cinnamon-b41bad0.orig/js/ui/windowManager.js linuxmint-Cinnamon-b41bad0/js/ui/windowManager.js
+--- linuxmint-Cinnamon-b41bad0.orig/js/ui/windowManager.js 2013-04-15 15:55:01.000000000 +0200
++++ linuxmint-Cinnamon-b41bad0/js/ui/windowManager.js 2013-04-24 21:21:22.447677094 +0200
+@@ -131,11 +131,11 @@
+ Lang.bind(this, this._showWorkspaceSwitcher));
+ Meta.keybindings_set_custom_handler('switch-to-workspace-down',
+ Lang.bind(this, this._showWorkspaceSwitcher));
+- Meta.keybindings_set_custom_handler('switch-windows',
++ Meta.keybindings_set_custom_handler('switch-applications',
+ Lang.bind(this, this._startAppSwitcher));
+ Meta.keybindings_set_custom_handler('switch-group',
+ Lang.bind(this, this._startAppSwitcher));
+- Meta.keybindings_set_custom_handler('switch-windows-backward',
++ Meta.keybindings_set_custom_handler('switch-applications-backward',
+ Lang.bind(this, this._startAppSwitcher));
+ Meta.keybindings_set_custom_handler('switch-group-backward',
+ Lang.bind(this, this._startAppSwitcher));