diff --git a/.gitignore b/.gitignore index 9f451a2..90f0dd1 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ /cinnamon-1.9.1.tar.gz /gnome-settings-daemon-compat-3.6.4.tar.xz /gnome-settings-daemon-compat-3.6.4-1.tar.xz +/cinnamon-1.9.2.gitc321232.tar.gz diff --git a/autostart_nemo.patch b/autostart_nemo.patch index 071a7c2..f98eda6 100644 --- a/autostart_nemo.patch +++ b/autostart_nemo.patch @@ -1,18 +1,18 @@ ---- a/files/usr/share/gnome-session/sessions/cinnamon.session -+++ b/files/usr/share/gnome-session/sessions/cinnamon.session +--- a/files/usr/share/cinnamon-session/sessions/cinnamon.session ++++ b/files/usr/share/cinnamon-session/sessions/cinnamon.session @@ -1,5 +1,5 @@ - [GNOME Session] + [Cinnamon Session] Name=Cinnamon --RequiredComponents=cinnamon;gnome-settings-daemon; -+RequiredComponents=cinnamon;gnome-settings-daemon;nemo-autostart;cinnamon-screensaver;gnome-fallback-media-keys-helper;gnome-fallback-mount-helper; +-RequiredComponents=cinnamon;cinnamon-settings-daemon; ++RequiredComponents=cinnamon;cinnamon-settings-daemon;nemo-autostart; DesktopName=GNOME ---- a/files/usr/share/gnome-session/sessions/cinnamon2d.session -+++ b/files/usr/share/gnome-session/sessions/cinnamon2d.session +--- a/files/usr/share/cinnamon-session/sessions/cinnamon2d.session ++++ b/files/usr/share/cinnamon-session/sessions/cinnamon2d.session @@ -1,5 +1,5 @@ - [GNOME Session] + [Cinnamon Session] Name=Cinnamon (Software Rendering) --RequiredComponents=cinnamon2d;gnome-settings-daemon; -+RequiredComponents=cinnamon2d;gnome-settings-daemon;nemo-autostart;cinnamon2d-screensaver;gnome-fallback-media-keys-helper;gnome-fallback-mount-helper; +-RequiredComponents=cinnamon2d;cinnamon-settings-daemon; ++RequiredComponents=cinnamon2d;cinnamon-settings-daemon;nemo-autostart; DesktopName=GNOME diff --git a/cinnamon-screensaver.desktop b/cinnamon-screensaver.desktop deleted file mode 100644 index ddc9686..0000000 --- a/cinnamon-screensaver.desktop +++ /dev/null @@ -1,15 +0,0 @@ -[Desktop Entry] -Type=Application -Name=Cinnamon Screensaver -Comment=Launch screensaver and locker program -Icon=preferences-desktop-screensaver -Exec=gnome-screensaver -OnlyShowIn=GNOME; -AutostartCondition=GNOME3 if-session cinnamon -NoDisplay=true -X-GNOME-Autostart-Phase=Application -X-GNOME-Autostart-Notify=true -X-GNOME-Bugzilla-Bugzilla=GNOME -X-GNOME-Bugzilla-Product=gnome-screensaver -X-GNOME-Bugzilla-Component=general -X-GNOME-Bugzilla-Version=3.6.0 diff --git a/cinnamon.spec b/cinnamon.spec index 898a7aa..4111281 100644 --- a/cinnamon.spec +++ b/cinnamon.spec @@ -1,39 +1,37 @@ +%global _internal_version c321232 + Name: cinnamon -Version: 1.9.1 -Release: 19%{?dist} +Version: 1.9.2 +Release: 0.1.git%{_internal_version}%{?dist} Summary: Window management and application launching for GNOME License: GPLv2+ and LGPLv2+ URL: http://cinnamon.linuxmint.com #Because linuxmint upstream refuses to host pristine upstream tarballs -Source0: http://leigh123linux.fedorapeople.org/pub/%{name}/source/%{name}-%{version}.tar.gz -#wget https://github.com/linuxmint/Cinnamon/archive/%{version}.tar.gz -O %{name}-%{version}.tar.gz - +# To generate tarball +# wget https://github.com/linuxmint/Cinnamon/archive/%%{version}.tar.gz -O cinnamon-%%{version}.tar.gz +# for git +# wget https://github.com/linuxmint/Cinnamon/tarball/%%{_internal_version} -O cinnamon-%%{version}.git%%{_internal_version}.tar.gz +Source0: http://leigh123linux.fedorapeople.org/pub/%{name}/source/%{name}-%{version}.git%{_internal_version}.tar.gz Source1: cinnamon-fedora.gschema.override -Source2: cinnamon-screensaver.desktop -Source3: cinnamon2d-screensaver.desktop -Source4: http://leigh123linux.fedorapeople.org/pub/gnome-settings-daemon-compat/source/gnome-settings-daemon-compat-3.6.4-1.tar.xz -Source5: input-source-switcher.desktop -Patch0: gnome-3.8-compat.patch + +Patch0: disable_xinput.patch Patch1: background.patch -Patch2: idle-dim.patch -Patch3: keyboard_applet.patch -Patch4: gjs.patch -Patch5: screensaver.patch -Patch6: bluetooth_obex_transfer.patch -Patch7: autostart_nemo.patch -Patch8: remove_GC.patch -Patch9: menu_editor.patch +Patch2: bluetooth_obex_transfer.patch +Patch3: autostart_nemo.patch +Patch4: menu_editor.patch +Patch5: keyboard_applet.patch +Patch6: idle-dim.patch %global clutter_version 1.12.2 %global gobject_introspection_version 1.34.2 -%global muffin_version 1.8.2 +%global muffin_version 1.8.3 %global json_glib_version 0.13.2 BuildRequires: clutter-devel >= %{clutter_version} BuildRequires: dbus-glib-devel BuildRequires: desktop-file-utils -BuildRequires: gjs-devel >= 1.32.0 +BuildRequires: cjs-devel >= 1.32.0 BuildRequires: glib2-devel BuildRequires: GConf2-devel BuildRequires: gnome-menus-devel @@ -88,7 +86,7 @@ Requires: json-glib%{?_isa} >= %{json_glib_version} Requires: upower%{?_isa} Requires: polkit%{?_isa} >= 0.100 # needed for session files -Requires: gnome-session +Requires: cinnamon-session # needed for schemas Requires: at-spi2-atk%{?_isa} # needed for on-screen keyboard @@ -105,7 +103,7 @@ Requires: python-pillow # nemo is a RequiredComponents in the session files Requires: nemo # gnome-screensaver is a RequiredComponents in the session files -Requires: gnome-screensaver +Requires: cinnamon-screensaver Obsoletes: cinnamon-2d Obsoletes: cinnamon-settings @@ -123,18 +121,14 @@ The emphasis is put on making users feel at home and providing them with an easy to use and comfortable desktop experience. %prep -%setup -q -T -b4 -n gnome-settings-daemon-compat-3.6.4-1 -%setup -q -n Cinnamon-%{version} +%setup -q -n linuxmint-Cinnamon-%{_internal_version} %patch0 -p1 %patch1 -p1 %patch2 -p1 %patch3 -p1 %patch4 -p1 -%patch5 -p1 -%patch6 -p1 -%patch7 -p1 -%patch8 -p1 -%patch9 -p1 +#patch5 -p1 +#patch6 -p1 NOCONFIGURE=1 ./autogen.sh %build @@ -147,54 +141,22 @@ NOCONFIGURE=1 ./autogen.sh make %{?_smp_mflags} V=1 -# media-keys-helper -cd ../gnome-settings-daemon-compat-3.6.4-1 -autoreconf -fi -%configure --libexecdir=%{_libexecdir}/%{name} --disable-static --disable-ibus \ - --disable-cups --disable-smartcard-support --disable-packagekit -make %{?_smp_mflags} V=1 -C plugins/common -make %{?_smp_mflags} V=1 -C plugins/media-keys -make %{?_smp_mflags} V=1 -C plugins/keyboard -make %{?_smp_mflags} V=1 -C plugins/automount - %install %{make_install} INSTALL='install -p' -pushd ../gnome-settings-daemon-compat-3.6.4-1 -%{make_install} -C plugins/media-keys INSTALL='install -p' -%{make_install} -C plugins/keyboard INSTALL='install -p' -%{make_install} -C plugins/automount INSTALL='install -p' -popd - # Remove .la file rm -rf $RPM_BUILD_ROOT/%{_libdir}/cinnamon/libcinnamon.la -# Remove the unwanted keyboard bits -rm -rf $RPM_BUILD_ROOT/%{_libdir}/gnome-settings-daemon-3.0/ -rm -rf $RPM_BUILD_ROOT/%{_datadir}/gnome-settings-daemon/ - install -D -m 0644 %{SOURCE1} $RPM_BUILD_ROOT/%{_datadir}/glib-2.0/schemas/cinnamon-fedora.gschema.override -# Add autostart files for gnome-screensaver -install -pm 0644 %{SOURCE2} %{SOURCE3} $RPM_BUILD_ROOT/%{_datadir}/applications/ - -# Add autostart files for input-source-switcher -install -m 0755 -d $RPM_BUILD_ROOT/%{_sysconfdir}/xdg/autostart/ -install -pm 0644 %{SOURCE5} $RPM_BUILD_ROOT/%{_sysconfdir}/xdg/autostart/ - # Fix permission chmod +x $RPM_BUILD_ROOT/%{_bindir}/cinnamon-launcher-creator -chmod +x $RPM_BUILD_ROOT/%{_bindir}/cinnamon3d -desktop-file-validate $RPM_BUILD_ROOT/%{_sysconfdir}/xdg/autostart/input-source-switcher.desktop + desktop-file-validate $RPM_BUILD_ROOT/%{_datadir}/applications/cinnamon.desktop desktop-file-validate $RPM_BUILD_ROOT/%{_datadir}/applications/cinnamon2d.desktop desktop-file-validate $RPM_BUILD_ROOT/%{_datadir}/applications/cinnamon-add-panel-launcher.desktop desktop-file-validate $RPM_BUILD_ROOT/%{_datadir}/applications/cinnamon-menu-editor.desktop -desktop-file-validate $RPM_BUILD_ROOT/%{_datadir}/applications/cinnamon-screensaver.desktop -desktop-file-validate $RPM_BUILD_ROOT/%{_datadir}/applications/cinnamon2d-screensaver.desktop -desktop-file-validate $RPM_BUILD_ROOT/%{_datadir}/applications/gnome-fallback-media-keys-helper.desktop -desktop-file-validate $RPM_BUILD_ROOT/%{_datadir}/applications/gnome-fallback-mount-helper.desktop desktop-file-install \ --add-category="Utility" \ @@ -219,13 +181,12 @@ fi %doc COPYING README %{_bindir}/* %{_sysconfdir}/xdg/menus/* -%{_sysconfdir}/xdg/autostart/* %{_datadir}/applications/* %{_datadir}/dbus-1/services/org.Cinnamon.HotplugSniffer.service %{_datadir}/desktop-directories/* %{_datadir}/glib-2.0/schemas/org.cinnamon.gschema.xml %{_datadir}/glib-2.0/schemas/cinnamon-fedora.gschema.override -%{_datadir}/gnome-session/sessions/* +%{_datadir}/cinnamon-session/sessions/* %{_datadir}/xsessions/* %{_datadir}/cinnamon/ %{_libdir}/cinnamon/ @@ -235,6 +196,9 @@ fi %{_mandir}/man1/* %changelog +* Tue Jul 23 2013 Leigh Scott - 1.9.2-0.1.gitc321232 +- rebase for cinnamon next + * Tue Jul 23 2013 Leigh Scott - 1.9.1-19 - fix permissions on cinnamon3d diff --git a/cinnamon2d-screensaver.desktop b/cinnamon2d-screensaver.desktop deleted file mode 100644 index aed9557..0000000 --- a/cinnamon2d-screensaver.desktop +++ /dev/null @@ -1,15 +0,0 @@ -[Desktop Entry] -Type=Application -Name=Cinnamon2d Screensaver -Comment=Launch screensaver and locker program -Icon=preferences-desktop-screensaver -Exec=gnome-screensaver -OnlyShowIn=GNOME; -AutostartCondition=GNOME3 if-session cinnamon2d -NoDisplay=true -X-GNOME-Autostart-Phase=Application -X-GNOME-Autostart-Notify=true -X-GNOME-Bugzilla-Bugzilla=GNOME -X-GNOME-Bugzilla-Product=gnome-screensaver -X-GNOME-Bugzilla-Component=general -X-GNOME-Bugzilla-Version=3.6.0 diff --git a/disable_xinput.patch b/disable_xinput.patch new file mode 100644 index 0000000..c1796ec --- /dev/null +++ b/disable_xinput.patch @@ -0,0 +1,15 @@ +diff -uNr a/files/usr/bin/cinnamon2d b/files/usr/bin/cinnamon2d +--- a/files/usr/bin/cinnamon2d 2013-05-22 17:35:08.000000000 +0100 ++++ b/files/usr/bin/cinnamon2d 2013-05-22 21:36:04.000000000 +0100 +@@ -1,2 +1,2 @@ + #!/bin/bash +-CLUTTER_PAINT=disable-clipped-redraws:disable-culling LIBGL_ALWAYS_SOFTWARE=1 CINNAMON_SOFTWARE_RENDERING=1 CINNAMON_2D=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_2D=1 CINNAMON_SLOWDOWN_FACTOR=0.0001 MUFFIN_NO_SHADOWS=1 CLUTTER_DEFAULT_FPS=15 cinnamon $@ +diff -uNr a/files/usr/bin/gnome-session-cinnamon b/files/usr/bin/gnome-session-cinnamon +--- a/files/usr/bin/cinnamon-session-cinnamon 2013-05-22 17:35:08.000000000 +0100 ++++ b/files/usr/bin/cinnamon-session-cinnamon 2013-05-22 21:36:04.000000000 +0100 +@@ -1,3 +1,3 @@ + #! /bin/sh +-exec cinnamon-session --session cinnamon "$@" ++CLUTTER_DISABLE_XINPUT=1 exec cinnamon-session --session cinnamon "$@" + diff --git a/gjs.patch b/gjs.patch deleted file mode 100644 index 1f79b04..0000000 --- a/gjs.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- a/src/cinnamon-global.c -+++ b/src/cinnamon-global.c -@@ -1237,14 +1237,11 @@ cinnamon_global_add_extension_importer ( - 0, - &target_object)) - { -- char *message; -- gjs_log_exception(context, -- &message); -+ gjs_log_exception(context); - g_set_error(error, - G_IO_ERROR, - G_IO_ERROR_FAILED, -- "%s", message ? message : "(unknown)"); -- g_free(message); -+ "Unable to import %s", target_object_script); - goto out_error; - } - diff --git a/gnome-3.8-compat.patch b/gnome-3.8-compat.patch deleted file mode 100644 index 0c30cd9..0000000 --- a/gnome-3.8-compat.patch +++ /dev/null @@ -1,3573 +0,0 @@ -diff -uNr a/configure.ac b/configure.ac ---- a/configure.ac 2013-05-22 17:35:08.000000000 +0100 -+++ b/configure.ac 2013-05-22 21:36:04.000000000 +0100 -@@ -68,6 +68,7 @@ - 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 @@ - 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 @@ - 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 -uNr a/data/org.cinnamon.gschema.xml.in b/data/org.cinnamon.gschema.xml.in ---- a/data/org.cinnamon.gschema.xml.in 2013-05-22 17:35:08.000000000 +0100 -+++ b/data/org.cinnamon.gschema.xml.in 2013-05-22 21:36:04.000000000 +0100 -@@ -754,6 +754,23 @@ - - - -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - - - "wallpaper" -@@ -784,8 +801,60 @@ - This key defines the delay for the slideshow. - - -+ -+ true -+ <_summary>Draw Desktop Background -+ <_description>Have GNOME draw the desktop background. -+ -+ -+ 'zoom' -+ <_summary>Picture Options -+ <_description> -+ Determines how the image set by wallpaper_filename is rendered. -+ Possible values are "none", "wallpaper", "centered", "scaled", -+ "stretched", "zoom", "spanned". -+ -+ -+ -+ 'file:///usr/share/themes/Adwaita/backgrounds/adwaita-timed.xml' -+ <_summary>Picture URI -+ <_description> -+ URI to use for the background image. Not that the backend only supports -+ local (file://) URIs. -+ -+ -+ -+ -+ 100 -+ <_summary>Picture Opacity -+ <_description> -+ Opacity with which to draw the background picture. -+ -+ -+ -+ '#023c88' -+ <_summary>Primary Color -+ <_description> -+ Left or Top color when drawing gradients, or the solid color. -+ -+ -+ -+ '#5789ca' -+ <_summary>Secondary Color -+ <_description> -+ Right or Bottom color when drawing gradients, not used for solid color. -+ -+ -+ -+ 'solid' -+ <_summary>Color Shading Type -+ <_description> -+ How to shade the background color. Possible values are "horizontal", -+ "vertical", and "solid". -+ -+ - -- -+ - - - "" -diff -uNr a/files/usr/bin/cinnamon2d b/files/usr/bin/cinnamon2d ---- a/files/usr/bin/cinnamon2d 2013-05-22 17:35:08.000000000 +0100 -+++ b/files/usr/bin/cinnamon2d 2013-05-22 21:36:04.000000000 +0100 -@@ -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 $@ -diff -uNr a/files/usr/bin/cinnamon3d b/files/usr/bin/cinnamon3d ---- a/files/usr/bin/cinnamon3d 1970-01-01 01:00:00.000000000 +0100 -+++ b/files/usr/bin/cinnamon3d 2013-05-22 21:36:04.000000000 +0100 -@@ -0,0 +1,2 @@ -+#!/bin/bash -+CLUTTER_DISABLE_XINPUT=1 cinnamon $@ -diff -uNr a/files/usr/bin/gnome-session-cinnamon b/files/usr/bin/gnome-session-cinnamon ---- a/files/usr/bin/gnome-session-cinnamon 2013-05-22 17:35:08.000000000 +0100 -+++ b/files/usr/bin/gnome-session-cinnamon 2013-05-22 21:36:04.000000000 +0100 -@@ -1,3 +1,3 @@ - #! /bin/sh --exec gnome-session --session cinnamon "$@" -+CLUTTER_DISABLE_XINPUT=1 exec gnome-session --session cinnamon "$@" - -diff -uNr a/files/usr/lib/cinnamon-settings/modules/cs_backgrounds.py b/files/usr/lib/cinnamon-settings/modules/cs_backgrounds.py ---- a/files/usr/lib/cinnamon-settings/modules/cs_backgrounds.py 2013-05-22 17:35:08.000000000 +0100 -+++ b/files/usr/lib/cinnamon-settings/modules/cs_backgrounds.py 2013-05-22 21:36:04.000000000 +0100 -@@ -232,11 +232,11 @@ - - - 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 @@ - 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) - -@@ -365,7 +365,7 @@ - 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) -@@ -446,12 +446,11 @@ - 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, -1) -- self._gnome_background_schema = Gio.Settings("org.gnome.desktop.background") - self._cinnamon_background_schema = Gio.Settings("org.cinnamon.background") - self._add_wallpapers_dialog = AddWallpapersDialog() - -@@ -516,8 +515,8 @@ - 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: -@@ -537,21 +536,21 @@ - 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 -uNr a/files/usr/lib/cinnamon-settings/modules/cs_keyboard.py b/files/usr/lib/cinnamon-settings/modules/cs_keyboard.py ---- a/files/usr/lib/cinnamon-settings/modules/cs_keyboard.py 2013-05-22 17:35:08.000000000 +0100 -+++ b/files/usr/lib/cinnamon-settings/modules/cs_keyboard.py 2013-05-22 21:36:04.000000000 +0100 -@@ -42,8 +42,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 -uNr a/files/usr/share/cinnamon/applets/brightness@cinnamon.org/applet.js b/files/usr/share/cinnamon/applets/brightness@cinnamon.org/applet.js ---- a/files/usr/share/cinnamon/applets/brightness@cinnamon.org/applet.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/files/usr/share/cinnamon/applets/brightness@cinnamon.org/applet.js 2013-05-22 21:36:04.000000000 +0100 -@@ -5,7 +5,6 @@ - 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 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 = -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+; - - /* 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 @@ - 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 @@ - 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 -uNr a/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js b/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js ---- a/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js 2013-05-22 21:36:04.000000000 +0100 -@@ -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,17 @@ - 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:''} -- ] --}; -+const PowerManagerInterface = -+ -+ -+ -+ -+ -+ -+ -+; - --let SettingsManagerProxy = DBus.makeProxyClass(SettingsManagerInterface); -+const PowerManagerProxy = Gio.DBusProxy.makeProxyWrapper(PowerManagerInterface); - - function DeviceItem() { - this._init.apply(this, arguments); -@@ -143,11 +125,19 @@ - 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._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); - let box = new St.BoxLayout({ name: 'batteryBox' }); -@@ -200,9 +190,6 @@ - - this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - this.menu.addSettingsAction(_("Power Settings"), 'power'); -- -- this._smProxy.connect('PropertiesChanged', Lang.bind(this, this._devicesChanged)); -- this._devicesChanged(); - } - catch (e) { - global.logError(e); -@@ -234,14 +221,14 @@ - }, - - _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); -@@ -279,7 +266,7 @@ - }, - - _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 = []; - -@@ -306,25 +293,26 @@ - this._devicesChanged(); - }, - -- _devicesChanged: function() { -- this._proxy.GetRemote('Icon', Lang.bind(this, function(icon, error) { -- if (icon) { -- this.set_applet_icon_symbolic_name('battery-missing'); -- 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._applet_icon.gicon = gicon -+ this.actor.show(); -+ } else { -+ this.menu.close(); -+ this.actor.hide(); -+ } -+ - this._readPrimaryDevice(); - this._readOtherDevices(); - this._updateLabel(); - }, - - _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; -diff -uNr a/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js b/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js ---- a/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js 2013-05-22 21:36:04.000000000 +0100 -@@ -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,94 +11,49 @@ - 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: 'ox', -- 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 = -+ -+ -+ -+; -+ -+const MediaServer2IFace = -+ -+ -+ -+ -+; -+ -+const MediaServer2PlayerIFace = -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+; - - /* global values */ - let icon_path = "/usr/share/cinnamon/theme/"; --let compatible_players = [ "clementine", "mpd", "exaile", "banshee", "rhythmbox", "rhythmbox3", "pragha", "quodlibet", "guayadeque", "amarok", "googlemusicframe", "xbmc", "noise", "xnoise", "gmusicbrowser", "spotify", "audacious", "vlc", "beatbox", "songbird", "pithos", "gnome-mplayer", "nuvolaplayer", "qmmp" ]; -+let compatible_players = [ "clementine", "mpd", "exaile", "banshee", "rhythmbox", "rhythmbox3", "pragha", "quodlibet", "guayadeque", "amarok", "googlemusicframe", "xbmc", "noise", "xnoise", "gmusicbrowser", "spotify", "audacious", "vlc", "beatbox", "songbird", "pithos", "gnome-mplayer", "nuvolaplayer", "qmmp"]; - let support_seek = [ "clementine", "banshee", "rhythmbox", "rhythmbox3", "pragha", "quodlibet", "amarok", "noise", "xnoise", "gmusicbrowser", "spotify", "vlc", "beatbox", "gnome-mplayer", "qmmp" ]; - /* dummy vars for translation */ - let x = _("Playing"); -@@ -112,131 +66,20 @@ - 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); -- })); -- }, -- setPosition: function(value) { -- this.SetRemote('Position', value); -- }, -- 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); -- }, -- getCanSeek: function(callback) { -- this.GetRemote('CanSeek', Lang.bind(this, -- function(canSeek, err) { -- if (!err) { -- callback(this, canSeek); -- } -- })); -- } -+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); -@@ -355,7 +198,6 @@ - _init: function(system_status_button, owner) { - PopupMenu.PopupMenuSection.prototype._init.call(this); - -- this.showPosition = true; // @todo: Get from settings - this._owner = owner; - this._system_status_button = system_status_button; - this._name = this._owner.split('.')[3]; -@@ -389,7 +231,7 @@ - this.infos_top.add_actor(this._artist.getActor()); - this.infos_bottom.add_actor(this._album.getActor()); - this.infos_top.add_actor(this._title.getActor()); -- -+ this.infos_bottom.add_actor(this._time.getActor()); - this._trackInfosTop.set_child(this.infos_top); - this._trackInfosBottom.set_child(this.infos_bottom); - -@@ -414,45 +256,20 @@ - this._trackControls.set_child(this.controls); - this.addActor(this._trackControls); - -- this._seekControls = new St.Bin({style_class: 'sound-seek', x_align: St.Align.START}); -- this.seekControls = new St.BoxLayout({style_class: 'sound-seek-box'}); -- this.seekControls.add_actor(this._time.getActor()); -- -- this._positionSlider = new PopupMenu.PopupSliderMenuItem(0); -- this._positionSlider.connect('value-changed', Lang.bind(this, function(item) { -- let time = item._value * this._songLength; -- this._time.setLabel(this._formatTime(time) + " / " + this._formatTime(this._songLength)); -- })); -- this._positionSlider.connect('drag-end', Lang.bind(this, function(item) { -- let time = item._value * this._songLength; -- this._time.setLabel(this._formatTime(time) + " / " + this._formatTime(this._songLength)); -- this._wantedSeekValue = Math.round(time * 1000000); -- this._mediaServerPlayer.SetPositionRemote(this._trackObj, time * 1000000); -- })); -- -- this.sliderBin = new St.Bin({style_class: 'sound-seek-slider'}); -- this.sliderBin.set_child(this._positionSlider.actor); -- this.seekControls.add_actor(this.sliderBin); -- this._seekControls.set_child(this.seekControls); -- this.addActor(this._seekControls); -- -- 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) { -@@ -460,44 +277,29 @@ - this.showPosition = false; - this._positionSlider.actor.hide(); - } -+ - this._getStatus(); - this._trackId = {}; - this._getMetadata(); - this._currentTime = 0; - this._getPosition(); -- this._wantedSeekValue = 0; -- this._updatePositionSlider(); - -- 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"]); -- //qmmp -- if(sender._dbusBusName == 'org.mpris.MediaPlayer2.qmmp') { -+ this._setMetadata(value["Metadata"]); -+ // qmmp -+ if (sender._dbusBusName == 'org.mpris.MediaPlayer2.qmmp') { - if (value["playbackStatus"]) -- this._setStatus(iface, value["playbackStatus"]); -+ this._setStatus(value["playbackStatus"]); - if (value["metadata"]) -- this._setMetadata(sender, value["metadata"]); -- } -- })); -- -- this._mediaServerPlayer.connect('Seeked', Lang.bind(this, function(sender, value) { -- if (value > 0) { -- this._setPosition(value); -- } -- // Seek initiated by the position slider -- else if (this._wantedSeekValue > 0) { -- // Some broken gstreamer players (Banshee) reports always 0 -- // when the track is seeked so we set the position at the -- // value we set on the slider -- this._setPosition(this._wantedSeekValue); -+ this._setMetadata(value["metadata"]); - } -- // Seek value send by the player -- else -- this._setPosition(value); -+ })); - -- this._wantedSeekValue = 0; -+ this._mediaServerPlayer.connectSignal('Seeked', Lang.bind(this, function(sender, iface, [value]) { -+ this._setPosition(sender, value); - })); - - Mainloop.timeout_add(1000, Lang.bind(this, this._getPosition)); -@@ -528,29 +330,26 @@ - })); - }, - -- _setPosition: function(value) { -- if (value == null && this._playerStatus != 'Stopped') { -- this._updatePositionSlider(false); -- } -- else { -- this._currentTime = value / 1000000; -- this._updateTimer(); -- } -+ _setPosition: function(sender, value) { -+ this._stopTimer(); -+ this._currentTime = value / 1000000; -+ this._updateTimer(); -+ if (this._playerStatus == "Playing") -+ this._runTimer(); - }, - - _getPosition: function() { -- this._mediaServerPlayer.getPosition(Lang.bind(this, function(sender, value) { -- this._setPosition(value); -- })); -+ 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") -@@ -561,26 +360,29 @@ - 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"]) { -- this._trackObj = metadata["mpris:trackid"]; -- } -+ /*if (metadata["mpris:trackid"]) { -+ this._trackId = { -+ _init: function() { -+ DBus.session.proxifyObject(this, this._owner, metadata["mpris:trackid"]); -+ } -+ } -+ }*/ - - 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; - } - } -@@ -613,13 +415,10 @@ - }, - - _getMetadata: function() { -- this._mediaServerPlayer.getMetadata(Lang.bind(this, -- this._setMetadata -- )); -+ this._setMetadata(this._mediaServerPlayer.Metadata); - }, - -- _setStatus: function(sender, status) { -- this._updatePositionSlider(); -+ _setStatus: function(status) { - this._playerStatus = status; - if (status == "Playing") { - this._playButton.setIcon("media-playback-pause"); -@@ -633,53 +432,39 @@ - this._playButton.setIcon("media-playback-start"); - this._stopTimer(); - } -- - this._playerInfo.setImage("player-" + status.toLowerCase()); - this._setName(status); - }, - - _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() { -- if (this.showPosition && this._canSeek) { -- if (!isNaN(this._currentTime) && !isNaN(this._songLength) && this._currentTime > 0) -- this._positionSlider.setValue(this._currentTime / this._songLength); -- else -- this._positionSlider.setValue(0); -- } - this._time.setLabel(this._formatTime(this._currentTime) + " / " + this._formatTime(this._songLength)); - }, - - _runTimer: function() { -- if (this._playerStatus == 'Playing') { -- this._timeoutId = Mainloop.timeout_add_seconds(1, Lang.bind(this, this._runTimer)); -- this._currentTime += 1; -- this._updateTimer(); -- } -+ /*if (!Tweener.resumeTweens(this)) { -+ Tweener.addTween(this, -+ { time: this._songLength - this._currentTime, -+ transition: 'linear', -+ onUpdate: Lang.bind(this, this._updateTimer) }); -+ }*/ - }, - - _pauseTimer: function() { -- if (this._timeoutId != 0) { -- Mainloop.source_remove(this._timeoutId); -- this._timeoutId = 0; -- } -- this._updateTimer(); -+ //Tweener.pauseTweens(this); - }, - - _stopTimer: function() { -+ /*Tweener.removeTweens(this); - this._currentTime = 0; -- this._pauseTimer(); -- this._updateTimer(); -+ this._updateTimer();*/ - }, - - _formatTime: function(s) { -@@ -773,7 +558,7 @@ - }, - - activate: function (event) { -- this._menu.actor.hide(); -+ this._menu.actor.hide(); - this._app.activate_full(-1, event.get_time()); - return true; - } -@@ -801,7 +586,7 @@ - this._players = {}; - // watch players - for (var p=0; p 0){ -@@ -1139,19 +924,19 @@ - this._mutedChanged (null, null, '_output'); - this._volumeChanged (null, null, '_output'); - let sinks = this._control.get_sinks(); -- this._selectDeviceItem.menu.removeAll(); -- for (let i = 0; i < sinks.length; i++) { -- let sink = sinks[i]; -- let menuItem = new PopupMenu.PopupMenuItem(sink.get_description()); -- if (sinks[i].get_id() == this._output.get_id()) { -- menuItem.setShowDot(true); -- } -- menuItem.connect('activate', Lang.bind(this, function() { -- log('Changing default sink to ' + sink.get_description()); -- this._control.set_default_sink(sink); -- })); -- this._selectDeviceItem.menu.addMenuItem(menuItem); -- } -+ this._selectDeviceItem.menu.removeAll(); -+ for (let i = 0; i < sinks.length; i++) { -+ let sink = sinks[i]; -+ let menuItem = new PopupMenu.PopupMenuItem(sink.get_description()); -+ if (sinks[i].get_id() == this._output.get_id()) { -+ menuItem.setShowDot(true); -+ } -+ menuItem.connect('activate', Lang.bind(this, function() { -+ log('Changing default sink to ' + sink.get_description()); -+ this._control.set_default_sink(sink); -+ })); -+ this._selectDeviceItem.menu.addMenuItem(menuItem); -+ } - } else { - this._outputSlider.setValue(0); - this.setIconName('audio-volume-muted-symbolic'); -diff -uNr a/files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js b/files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js ---- a/files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js 2013-05-22 21:36:04.000000000 +0100 -@@ -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 @@ - [ 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 = -+ -+ -+ -+ -+; -+ -+const XRandr2 = Gio.DBusProxy.makeProxyWrapper(XRandr2Iface); - - function MyApplet(orientation, panel_height) { - this._init(orientation, panel_height); -@@ -48,7 +49,7 @@ - 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 -uNr a/js/misc/gnomeSession.js b/js/misc/gnomeSession.js ---- a/js/misc/gnomeSession.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/misc/gnomeSession.js 2013-05-22 21:36:04.000000000 +0100 -@@ -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 = -+ -+ -+ -+ -+ -+ -+ -+; - - const PresenceStatus = { - AVAILABLE: 0, -@@ -23,104 +21,37 @@ - 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 = -+ -+ -+ -+ -+ -+ -+; -+ -+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 = -+ -+ -+ -+ -+ -+ -+ -+; -+ -+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 -uNr a/js/misc/modemManager.js b/js/misc/modemManager.js ---- a/js/misc/modemManager.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/misc/modemManager.js 2013-05-22 21:36:04.000000000 +0100 -@@ -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 @@ - // 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 = -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+; -+ -+const ModemGsmNetworkProxy = Gio.DBusProxy.makeProxyWrapper(ModemGsmNetworkInterface); -+ -+const ModemCdmaInterface = -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+; -+ -+const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface); - - let _providersTable; - function _getProvidersTable() { -@@ -50,17 +60,17 @@ - - 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 @@ - } - - 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 -uNr a/js/misc/screenSaver.js b/js/misc/screenSaver.js ---- a/js/misc/screenSaver.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/misc/screenSaver.js 2013-05-22 21:36:04.000000000 +0100 -@@ -1,53 +1,48 @@ - // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - --const DBus = imports.dbus; - const Lang = imports.lang; -+const Gio = imports.gi.Gio; - --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 ScreenSaverIface = -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+; -+ -+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; -+ }); - --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); -+ return self; -+} -diff -uNr a/js/ui/appletManager.js b/js/ui/appletManager.js ---- a/js/ui/appletManager.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/ui/appletManager.js 2013-05-22 21:36:04.000000000 +0100 -@@ -7,7 +7,6 @@ - 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 -uNr a/js/ui/automountManager.js b/js/ui/automountManager.js ---- a/js/ui/automountManager.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/ui/automountManager.js 2013-05-22 21:36:04.000000000 +0100 -@@ -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 AUTORUN_EXPIRE_TIMEOUT_SECS = 10; - --const ConsoleKitSessionIface = { -- name: 'org.freedesktop.ConsoleKit.Session', -- methods: [{ name: 'IsActive', -- inSignature: '', -- outSignature: 'b' }], -- signals: [{ name: 'ActiveChanged', -- inSignature: 'b' }] --}; -- --const ConsoleKitSessionProxy = DBus.makeProxyClass(ConsoleKitSessionIface); -- --const ConsoleKitManagerIface = { -- name: 'org.freedesktop.ConsoleKit.Manager', -- methods: [{ name: 'GetCurrentSession', -- inSignature: '', -- outSignature: 'o' }] --}; -+const ConsoleKitSessionIface = -+ -+ -+ -+ -+ -+ -+; -+ -+const ConsoleKitSessionProxy = Gio.DBusProxy.makeProxyWrapper(ConsoleKitSessionIface); -+ -+const ConsoleKitManagerIface = -+ -+ -+ -+; - --function ConsoleKitManager() { -- this._init(); --}; -- --ConsoleKitManager.prototype = { -- _init: function() { -- this.sessionActive = true; -+const ConsoleKitManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(ConsoleKitManagerIface); - -- DBus.system.proxifyObject(this, -- 'org.freedesktop.ConsoleKit', -- '/org/freedesktop/ConsoleKit/Manager'); -- -- 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 @@ - 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 @@ - 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 -uNr a/js/ui/autorunManager.js b/js/ui/autorunManager.js ---- a/js/ui/autorunManager.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/ui/autorunManager.js 2013-05-22 21:36:04.000000000 +0100 -@@ -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 @@ - - /******************************************/ - --const HotplugSnifferIface = { -- name: 'org.Cinnamon.HotplugSniffer', -- methods: [{ name: 'SniffURI', -- inSignature: 's', -- outSignature: 'as' }] --}; -- --const HotplugSniffer = function() { -- this._init(); --}; -- --HotplugSniffer.prototype = { -- _init: function() { -- DBus.session.proxifyObject(this, -+const HotplugSnifferIface = -+ -+ -+ -+ -+; -+ -+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 -uNr a/js/ui/calendar.js b/js/ui/calendar.js ---- a/js/ui/calendar.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/ui/calendar.js 2013-05-22 21:36:04.000000000 +0100 -@@ -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 @@ - }; - Signals.addSignalMethods(EmptyEventSource.prototype); - --const CalendarServerIface = { -- name: 'org.Cinnamon.CalendarServer', -- methods: [{ name: 'GetEvents', -- inSignature: 'xxb', -- outSignature: 'a(sssbxxa{sv})' }], -- signals: [{ name: 'Changed', -- inSignature: '' }] --}; -+const CalendarServerIface = -+ -+ -+ -+ -+ -+ -+ -+; -+ -+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) }); - --const CalendarServer = function () { -- this._init(); --}; -- --CalendarServer.prototype = { -- _init: function() { -- DBus.session.proxifyObject(this, 'org.Cinnamon.CalendarServer', '/org/Cinnamon/CalendarServer'); -- } --}; -- --DBus.proxifyPrototype(CalendarServer.prototype, CalendarServerIface); -+ 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 @@ - - - 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 @@ - 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 @@ - - _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 -uNr a/js/ui/cinnamonDBus.js b/js/ui/cinnamonDBus.js ---- a/js/ui/cinnamonDBus.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/ui/cinnamonDBus.js 2013-05-22 21:36:04.000000000 +0100 -@@ -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 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 = -+ -+ -+ -+ -+ -+ -+include_cursor -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+include_cursor -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+; - - function Cinnamon() { - this._init(); -@@ -58,7 +63,8 @@ - - 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 @@ - CinnamonVersion: Config.PACKAGE_VERSION - }; - --DBus.conformExport(Cinnamon.prototype, CinnamonIface); -- -diff -uNr a/js/ui/endSessionDialog.js b/js/ui/endSessionDialog.js ---- a/js/ui/endSessionDialog.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/ui/endSessionDialog.js 2013-05-22 21:36:04.000000000 +0100 -@@ -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 _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 = -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+; -+ - const logoutDialogContent = { - subjectWithUser: _("Log Out %s"), - subject: _("Log Out"), -@@ -230,8 +230,6 @@ - function EndSessionDialog() { - if (_endSessionDialog == null) { - this._init(); -- DBus.session.exportObject('/org/gnome/SessionManager/EndSessionDialog', -- this); - _endSessionDialog = this; - } - -@@ -328,6 +326,9 @@ - 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 @@ - - 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 @@ - 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 -uNr a/js/ui/keyboard.js b/js/ui/keyboard.js ---- a/js/ui/keyboard.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/ui/keyboard.js 2013-05-22 21:36:04.000000000 +0100 -@@ -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 @@ - '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 = -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+; - - function Key() { - this._init.apply(this, arguments); -@@ -199,7 +197,8 @@ - - 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 @@ - return 'cinnamon'; - } - }; --DBus.conformExport(Keyboard.prototype, CaribouKeyboardIface); - - function KeyboardSource() { - this._init.apply(this, arguments); -diff -uNr a/js/ui/layout.js b/js/ui/layout.js ---- a/js/ui/layout.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/ui/layout.js 2013-05-22 21:36:04.000000000 +0100 -@@ -492,12 +492,14 @@ - - 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 -uNr a/js/ui/magnifierDBus.js b/js/ui/magnifierDBus.js ---- a/js/ui/magnifierDBus.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/ui/magnifierDBus.js 2013-05-22 21:36:04.000000000 +0100 -@@ -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 @@ - - // 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 = -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+; - - // 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 = -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+; - - // For making unique ZoomRegion DBus proxy object paths of the form: - // '/org/gnome/Magnifier/ZoomRegion/zoomer0', -@@ -64,7 +102,9 @@ - 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 @@ - 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 @@ - 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 @@ - 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 -uNr a/js/ui/main.js b/js/ui/main.js ---- a/js/ui/main.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/ui/main.js 2013-05-22 21:36:04.000000000 +0100 -@@ -44,7 +44,7 @@ - */ - - const Clutter = imports.gi.Clutter; --const DBus= imports.dbus; -+ - const Gio = imports.gi.Gio; - const GLib = imports.gi.GLib; - const Gtk = imports.gi.Gtk; -@@ -129,6 +129,7 @@ - let dynamicWorkspaces = null; - let nWorks = null; - let tracker = null; -+let backgroundManager = null; - let desktopShown; - - let workspace_names = []; -@@ -246,11 +247,6 @@ - - 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 -@@ -262,7 +258,7 @@ - // 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 -uNr a/js/ui/messageTray.js b/js/ui/messageTray.js ---- a/js/ui/messageTray.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/ui/messageTray.js 2013-05-22 21:36:04.000000000 +0100 -@@ -1388,12 +1388,17 @@ - - 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 @@ - this._updateState(); - }, - -- _onStatusChanged: function(presence, status) { -+ _onStatusChanged: function(status) { - this._backFromAway = (this._userStatus == GnomeSession.PresenceStatus.IDLE && this._userStatus != status); - this._userStatus = status; - -diff -uNr a/js/ui/notificationDaemon.js b/js/ui/notificationDaemon.js ---- a/js/ui/notificationDaemon.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/ui/notificationDaemon.js 2013-05-22 21:36:04.000000000 +0100 -@@ -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 @@ - - 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'); -- } --}; -- --DBus.proxifyPrototype(Bus.prototype, BusIface); -+// Should really be defined in Gio.js -+const BusIface = -+ -+ -+ -+ -+; -+ -+var BusProxy = Gio.DBusProxy.makeProxyWrapper(BusIface); -+function Bus() { -+ return new BusProxy(Gio.DBus.session, 'org.freedesktop.DBus', '/org/freedesktop/DBus'); -+} - --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 = -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+; - - const NotificationClosedReason = { - EXPIRED: 1, -@@ -88,7 +91,8 @@ - - 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,10 +217,15 @@ - 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; -- -+ -+ for (let hint in hints) { -+ // unpack the variants -+ hints[hint] = hints[hint].deep_unpack(); -+ } -+ - let rewrites = rewriteRules[appName]; - if (rewrites) { - for (let i = 0; i < rewrites.length; i++) { -@@ -257,51 +266,55 @@ - } - 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 +454,13 @@ - }, - - _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 +474,6 @@ - } - }; - --DBus.conformExport(NotificationDaemon.prototype, NotificationDaemonIface); -- - function Source(title, pid, sender, trayIcon) { - this._init(title, pid, sender, trayIcon); - } -@@ -481,15 +488,12 @@ - - 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 +600,10 @@ - }, - - destroy: function() { -+ if (this._nameWatcherId) { -+ Gio.DBus.session.unwatch_name(this._nameWatcherId); -+ this._nameWatcherId = 0; -+ } - MessageTray.Source.prototype.destroy.call(this); - } - }; -diff -uNr a/js/ui/scripting.js b/js/ui/scripting.js ---- a/js/ui/scripting.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/ui/scripting.js 2013-05-22 21:36:04.000000000 +0100 -@@ -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 @@ - }; - } - --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 = -+ -+ -+ -+ -+ -+ -+ -+ -+; -+ -+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() { -diff -uNr a/js/ui/windowManager.js b/js/ui/windowManager.js ---- a/js/ui/windowManager.js 2013-05-22 17:35:08.000000000 +0100 -+++ b/js/ui/windowManager.js 2013-05-22 21:36:04.000000000 +0100 -@@ -134,11 +134,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)); -diff -uNr a/src/cinnamon-background-manager.c b/src/cinnamon-background-manager.c ---- a/src/cinnamon-background-manager.c 1970-01-01 01:00:00.000000000 +0100 -+++ b/src/cinnamon-background-manager.c 2013-05-22 21:36:04.000000000 +0100 -@@ -0,0 +1,377 @@ -+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- -+ * -+ * Copyright © 2001 Ximian, Inc. -+ * Copyright (C) 2007 William Jon McCann -+ * 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 -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include -+#include -+#include -+#include -+#include -+ -+#define GNOME_DESKTOP_USE_UNSTABLE_API -+#include -+#include -+ -+#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 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 -+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); -+ -+ 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 -uNr a/src/cinnamon-background-manager.h b/src/cinnamon-background-manager.h ---- a/src/cinnamon-background-manager.h 1970-01-01 01:00:00.000000000 +0100 -+++ b/src/cinnamon-background-manager.h 2013-05-22 21:36:04.000000000 +0100 -@@ -0,0 +1,57 @@ -+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- -+ * -+ * Copyright (C) 2007 William Jon McCann -+ * -+ * 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 -+ -+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 */ -diff -uNr a/src/main.c b/src/main.c ---- a/src/main.c 2013-05-22 17:35:08.000000000 +0100 -+++ b/src/main.c 2013-05-22 21:36:04.000000000 +0100 -@@ -34,99 +34,122 @@ - #define OVERRIDES_SCHEMA "org.cinnamon.overrides" - - static void -+cinnamon_dbus_acquire_name (GDBusProxy *bus, -+ guint32 request_name_flags, -+ guint32 *request_name_result, -+ gchar *name, -+ gboolean fatal) -+{ -+ GError *error = NULL; -+ GVariant *request_name_variant; -+ -+ if (!(request_name_variant = g_dbus_proxy_call_sync (bus, -+ "RequestName", -+ g_variant_new ("(su)", name, request_name_flags), -+ 0, /* call flags */ -+ -1, /* timeout */ -+ NULL, /* cancellable */ -+ &error))) -+ { -+ g_printerr ("failed to acquire %s: %s\n", name, error->message); -+ if (!fatal) -+ return; -+ exit (1); -+ } -+ g_variant_get (request_name_variant, "(u)", request_name_result); -+} -+ -+static void -+cinnamon_dbus_acquire_names (GDBusProxy *bus, -+ guint32 request_name_flags, -+ gchar *name, -+ gboolean fatal, ...) G_GNUC_NULL_TERMINATED; -+ -+static void -+cinnamon_dbus_acquire_names (GDBusProxy *bus, -+ guint32 request_name_flags, -+ gchar *name, -+ gboolean fatal, ...) -+{ -+ va_list al; -+ guint32 request_name_result; -+ va_start (al, fatal); -+ for (;;) -+ { -+ cinnamon_dbus_acquire_name (bus, -+ request_name_flags, -+ &request_name_result, -+ name, fatal); -+ name = va_arg (al, gchar *); -+ if (!name) -+ break; -+ fatal = va_arg (al, gboolean); -+ } -+ va_end (al); -+} -+ -+static void - cinnamon_dbus_init (gboolean replace) - { -+ GDBusConnection *session; -+ GDBusProxy *bus; - GError *error = NULL; -- DBusGConnection *session; -- DBusGProxy *bus; - guint32 request_name_flags; - guint32 request_name_result; - -- /** TODO: -- * In the future we should use GDBus for this. However, in -- * order to do that, we need to port all of the JavaScript -- * code. Otherwise, the name will be claimed on the wrong -- * connection. -- */ -- session = dbus_g_bus_get (DBUS_BUS_SESSION, NULL); -+ session = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); - -- bus = dbus_g_proxy_new_for_name (session, -- DBUS_SERVICE_DBUS, -- DBUS_PATH_DBUS, -- DBUS_INTERFACE_DBUS); -+ if (error) { -+ g_printerr ("Failed to connect to session bus: %s", error->message); -+ exit (1); -+ } -+ -+ bus = g_dbus_proxy_new_sync (session, -+ G_DBUS_PROXY_FLAGS_NONE, -+ NULL, /* interface info */ -+ "org.freedesktop.DBus", -+ "/org/freedesktop/DBus", -+ "org.freedesktop.DBus", -+ NULL, /* cancellable */ -+ &error); - -- request_name_flags = DBUS_NAME_FLAG_DO_NOT_QUEUE | DBUS_NAME_FLAG_ALLOW_REPLACEMENT; -+ request_name_flags = G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT; - if (replace) - request_name_flags |= DBUS_NAME_FLAG_REPLACE_EXISTING; -- if (!dbus_g_proxy_call (bus, "RequestName", &error, -- G_TYPE_STRING, CINNAMON_DBUS_SERVICE, -- G_TYPE_UINT, request_name_flags, -- G_TYPE_INVALID, -- G_TYPE_UINT, &request_name_result, -- G_TYPE_INVALID)) -- { -- g_printerr ("failed to acquire org.Cinnamon: %s\n", error->message); -- exit (1); -- } -+ -+ cinnamon_dbus_acquire_name (bus, -+ request_name_flags, -+ &request_name_result, -+ CINNAMON_DBUS_SERVICE, TRUE); - if (!(request_name_result == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER - || request_name_result == DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER)) - { -- g_printerr ("%s already exists on bus and --replace not specified\n", -- CINNAMON_DBUS_SERVICE); -+ g_printerr (CINNAMON_DBUS_SERVICE " already exists on bus and --replace not specified\n"); - exit (1); - } - -- /* Also grab org.gnome.Panel to replace any existing panel process */ -- if (!dbus_g_proxy_call (bus, "RequestName", &error, G_TYPE_STRING, -- "org.gnome.Panel", G_TYPE_UINT, -- DBUS_NAME_FLAG_REPLACE_EXISTING | request_name_flags, -- G_TYPE_INVALID, G_TYPE_UINT, -- &request_name_result, G_TYPE_INVALID)) -- { -- g_print ("failed to acquire org.gnome.Panel: %s\n", error->message); -- exit (1); -- } -- -- /* ...and the org.gnome.Magnifier service. -+ /* -+ * We always specify REPLACE_EXISTING to ensure we kill off -+ * the existing service if it was running. - */ -- if (!dbus_g_proxy_call (bus, "RequestName", &error, -- G_TYPE_STRING, MAGNIFIER_DBUS_SERVICE, -- G_TYPE_UINT, DBUS_NAME_FLAG_REPLACE_EXISTING | request_name_flags, -- G_TYPE_INVALID, -- G_TYPE_UINT, &request_name_result, -- G_TYPE_INVALID)) -- { -- g_print ("failed to acquire %s: %s\n", MAGNIFIER_DBUS_SERVICE, error->message); -- /* Failing to acquire the magnifer service is not fatal. Log the error, -- * but keep going. */ -- } -- -- /* ...and the org.freedesktop.Notifications service; we always -- * specify REPLACE_EXISTING to ensure we kill off -- * notification-daemon if it was running. -- */ -- if (!dbus_g_proxy_call (bus, "RequestName", &error, -- G_TYPE_STRING, "org.freedesktop.Notifications", -- G_TYPE_UINT, DBUS_NAME_FLAG_REPLACE_EXISTING | request_name_flags, -- G_TYPE_INVALID, -- G_TYPE_UINT, &request_name_result, -- G_TYPE_INVALID)) -- { -- g_print ("failed to acquire org.freedesktop.Notifications: %s\n", error->message); -- } -+ request_name_flags |= G_BUS_NAME_OWNER_FLAGS_REPLACE; - -+ cinnamon_dbus_acquire_names (bus, -+ request_name_flags, -+ /* Also grab org.gnome.Panel to replace any existing panel process */ -+ "org.gnome.Panel", TRUE, -+ /* ...and the org.gnome.Magnifier service. */ -+ MAGNIFIER_DBUS_SERVICE, FALSE, -+ /* ...and the org.freedesktop.Notifications service. */ -+ "org.freedesktop.Notifications", FALSE, -+ NULL); - /* ...and the on-screen keyboard service */ -- if (!dbus_g_proxy_call (bus, "RequestName", &error, -- G_TYPE_STRING, "org.gnome.Caribou.Keyboard", -- G_TYPE_UINT, DBUS_NAME_FLAG_REPLACE_EXISTING, -- G_TYPE_INVALID, -- G_TYPE_UINT, &request_name_result, -- G_TYPE_INVALID)) -- { -- g_print ("failed to acquire org.gnome.Caribou.Keyboard: %s\n", error->message); -- } -- -+ cinnamon_dbus_acquire_name (bus, -+ DBUS_NAME_FLAG_REPLACE_EXISTING, -+ &request_name_result, -+ "org.gnome.Caribou.Keyboard", FALSE); - g_object_unref (bus); -+ g_object_unref (session); - } - - static void -diff -uNr a/src/Makefile.am b/src/Makefile.am ---- a/src/Makefile.am 2013-05-22 17:35:08.000000000 +0100 -+++ b/src/Makefile.am 2013-05-22 21:36:04.000000000 +0100 -@@ -105,6 +105,7 @@ - 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 @@ - 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/input-source-switcher.desktop b/input-source-switcher.desktop deleted file mode 100644 index a574582..0000000 --- a/input-source-switcher.desktop +++ /dev/null @@ -1,6 +0,0 @@ -[Desktop Entry] -Type=Application -Name=input sources switcher -Comment=Launch input sources switcher for Cinnamon -Exec=/usr/libexec/cinnamon/gsd-input-sources-switcher -OnlyShowIn=GNOME; diff --git a/remove_GC.patch b/remove_GC.patch deleted file mode 100644 index 7bd8e45..0000000 --- a/remove_GC.patch +++ /dev/null @@ -1,124 +0,0 @@ ---- a/src/cinnamon-global.c -+++ b/src/cinnamon-global.c -@@ -1399,35 +1399,6 @@ cinnamon_global_reexec_self (CinnamonGlo - g_ptr_array_free (arr, TRUE); - } - --/** -- * cinnamon_global_gc: -- * @global: A #CinnamonGlobal -- * -- * Start a garbage collection process. For more information, see -- * https://developer.mozilla.org/En/JS_GC -- */ --void --cinnamon_global_gc (CinnamonGlobal *global) --{ -- JSContext *context = gjs_context_get_native_context (global->js_context); -- -- JS_GC (context); --} -- --/** -- * cinnamon_global_maybe_gc: -- * @global: A #CinnamonGlobal -- * -- * Start a garbage collection process when it would free up enough memory -- * to be worth the amount of time it would take -- * https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JS_MaybeGC -- */ --void --cinnamon_global_maybe_gc (CinnamonGlobal *global) --{ -- gjs_context_maybe_gc (global->js_context); --} -- - static void - cinnamon_global_on_gc (GjsContext *context, - CinnamonGlobal *global) -@@ -1768,13 +1768,6 @@ run_leisure_functions (gpointer data) - if (global->work_count > 0) - return FALSE; - -- /* Previously we called gjs_maybe_gc(). However, it simply doesn't -- * trigger often enough. Garbage collection is very fast here, so -- * let's just aggressively GC. This will help avoid both heap -- * fragmentation, and the GC kicking in when we don't want it to. -- */ -- gjs_context_gc (global->js_context); -- - /* No leisure closures, so we are done */ - if (global->leisure_closures == NULL) - return FALSE; ---- a/src/cinnamon-global.h -+++ b/src/cinnamon-global.h -@@ -88,10 +88,6 @@ void cinnamon_global_set_pointer - int y); - - --/* JavaScript utilities */ --void cinnamon_global_gc (CinnamonGlobal *global); --void cinnamon_global_maybe_gc (CinnamonGlobal *global); -- - typedef struct { - guint glibc_uordblks; - - - ---- a/js/perf/core.js -+++ b/js/perf/core.js -@@ -1,5 +1,7 @@ - // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -+const System = imports.system; -+ - const Main = imports.ui.main; - const Scripting = imports.ui.scripting; - -@@ -99,7 +101,7 @@ function run() { - Main.overview.hide(); - yield Scripting.waitLeisure(); - -- global.gc(); -+ System.gc(); - yield Scripting.sleep(1000); - Scripting.collectStatistics(); - Scripting.scriptEvent('afterShowHide'); ---- a/js/ui/lookingGlass.js -+++ b/js/ui/lookingGlass.js -@@ -11,6 +11,7 @@ const St = imports.gi.St; - const Cinnamon = imports.gi.Cinnamon; - const Signals = imports.signals; - const Lang = imports.lang; -+const System = imports.system; - - const History = imports.misc.history; - const Extension = imports.ui.extension; -@@ -680,7 +681,7 @@ Memory.prototype = { - - this._gcbutton = new St.Button({ label: 'Full GC', - style_class: 'lg-obj-inspector-button' }); -- this._gcbutton.connect('clicked', Lang.bind(this, function () { global.gc(); this._renderText(); })); -+ this._gcbutton.connect('clicked', Lang.bind(this, function () { System.gc(); this._renderText(); })); - this.actor.add(this._gcbutton, { x_align: St.Align.START, - x_fill: false }); - ---- a/js/ui/lookingGlassDBus.js -+++ b/js/ui/lookingGlassDBus.js -@@ -1,5 +1,7 @@ - // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -+const System = imports.system; -+ - const Gio = imports.gi.Gio; - const Main = imports.ui.main; - const Extension = imports.ui.extension; -@@ -99,7 +101,7 @@ CinnamonLookingGlass.prototype = { - }, - - FullGc: function() { -- global.gc(); -+ System.gc(); - }, - - Inspect: function(path) { diff --git a/sources b/sources index bf01b9f..bd97d6a 100644 --- a/sources +++ b/sources @@ -1,2 +1 @@ -9e9b19adaaf1fb4fa3595a422bf69eee cinnamon-1.9.1.tar.gz -139412a4247c323699c22b3c72992307 gnome-settings-daemon-compat-3.6.4-1.tar.xz +355ca8a3f87306b6f56718f2a3206f73 cinnamon-1.9.2.gitc321232.tar.gz