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 \