--- gnome-settings-daemon-2.32.1.orig/debian/gnome-settings-daemon.install
+++ gnome-settings-daemon-2.32.1/debian/gnome-settings-daemon.install
@@ -0,0 +1,11 @@
+debian/tmp/etc
+debian/tmp/usr/lib/gnome-settings-daemon*
+debian/tmp/usr/share/icons
+debian/tmp/usr/share/locale
+debian/tmp/usr/share/gnome-settings-daemon/icons
+debian/tmp/usr/share/gnome-settings-daemon/*.ui
+debian/tmp/usr/share/gnome-settings-daemon/xrdb/* /etc/gnome/config
+debian/tmp/usr/share/gnome-control-center
+debian/tmp/usr/share/dbus-1
+debian/tmp/usr/share/polkit-1
+
--- gnome-settings-daemon-2.32.1.orig/debian/gnome-settings-daemon-dev.debhelper.log
+++ gnome-settings-daemon-2.32.1/debian/gnome-settings-daemon-dev.debhelper.log
@@ -0,0 +1 @@
+dh_autoreconf_clean
--- gnome-settings-daemon-2.32.1.orig/debian/gnome-update-wallpaper-cache.c
+++ gnome-settings-daemon-2.32.1/debian/gnome-update-wallpaper-cache.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2010 Canonical, Ltd.
+ *
+ * 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 3 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 version 3.0 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ * Authored by Didier Roche
+ *
+ * Bug: https://bugs.launchpad.net/bugs/530024
+ */
+
+#include
+#include
+#include
+#define GNOME_DESKTOP_USE_UNSTABLE_API
+#include
+
+static GOptionEntry entries[] =
+{
+ { NULL }
+};
+
+main (int argc, char *argv[])
+{
+ GOptionContext *context = NULL;
+ GError *error = NULL;
+
+ GdkScreen *screen;
+ GdkRectangle rect;
+ GnomeBG *bg;
+ GConfClient *client;
+ GdkPixbuf *pixbuf;
+
+ gdk_init (&argc, &argv);
+
+ context = g_option_context_new ("- refresh wallpaper cache");
+ g_option_context_add_main_entries (context, entries, NULL);
+ if (!g_option_context_parse (context, &argc, &argv, &error)) {
+ g_printerr ("option parsing failed: %s\n", error->message);
+ g_option_context_free(context);
+ g_error_free (error);
+ return (1);
+ }
+ if (context)
+ g_option_context_free (context);
+
+ /* cache only the first monitor */
+ screen = gdk_screen_get_default ();
+ gdk_screen_get_monitor_geometry (screen, 0, &rect);
+
+ bg = gnome_bg_new ();
+ client = gconf_client_get_default ();
+ gnome_bg_load_from_preferences (bg, client);
+
+ pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, rect.width, rect.height);
+ gnome_bg_draw (bg, pixbuf, screen, FALSE);
+
+ return (0);
+}
--- gnome-settings-daemon-2.32.1.orig/debian/gnome-settings-daemon.manpages
+++ gnome-settings-daemon-2.32.1/debian/gnome-settings-daemon.manpages
@@ -0,0 +1 @@
+debian/gnome-settings-daemon.1
--- gnome-settings-daemon-2.32.1.orig/debian/gnome-settings-daemon.links
+++ gnome-settings-daemon-2.32.1/debian/gnome-settings-daemon.links
@@ -0,0 +1 @@
+usr/lib/gnome-settings-daemon/gnome-settings-daemon usr/bin/gnome-settings-daemon
--- gnome-settings-daemon-2.32.1.orig/debian/gnome-settings-daemon.debhelper.log
+++ gnome-settings-daemon-2.32.1/debian/gnome-settings-daemon.debhelper.log
@@ -0,0 +1 @@
+dh_autoreconf_clean
--- gnome-settings-daemon-2.32.1.orig/debian/control.in
+++ gnome-settings-daemon-2.32.1/debian/control.in
@@ -0,0 +1,79 @@
+Source: gnome-settings-daemon
+Section: gnome
+Priority: optional
+Maintainer: Ubuntu Desktop Team
+XSBC-Original-Maintainer: Debian GNOME Maintainers
+Uploaders: @GNOME_TEAM@
+Build-Depends: cdbs,
+ quilt,
+ dh-autoreconf,
+ debhelper (>= 5),
+ dpkg-dev (>= 1.13.19),
+ gnome-common,
+ autotools-dev,
+ intltool (>= 0.37.1),
+ libdbus-glib-1-dev (>= 0.74),
+ libglib2.0-dev (>= 2.17.3),
+ libgtk2.0-dev (>= 2.16.0),
+ libgconf2-dev (>= 2.6.1),
+ libgnome-desktop-dev (>= 2.29.92),
+ libnotify-dev (>= 0.4.3),
+ libxt-dev,
+ libxi-dev,
+ libfontconfig1-dev,
+ libxext-dev,
+ libx11-dev,
+ libgnomekbd-dev (>= 2.29.5),
+ libxklavier-dev (>= 5.0),
+ libgstreamer0.10-dev (>= 0.10.1.2),
+ libgstreamer-plugins-base0.10-dev (>= 0.10.1.2),
+ gnome-pkg-tools,
+ libpulse-dev (>= 0.9.15),
+ libcanberra-gtk-dev,
+ libappindicator-dev (>= 0.2.4)
+Standards-Version: 3.9.1
+Vcs-Bzr: https://code.launchpad.net/~ubuntu-desktop/gnome-settings-daemon/ubuntu
+
+Package: gnome-settings-daemon
+Architecture: any
+Depends: ${shlibs:Depends},
+ ${misc:Depends},
+ libgnome2-common
+Recommends: pulseaudio
+Replaces: capplets-data (<< 1:2.21.5),
+ gnome-control-center (<< 1:2.21.5)
+Conflicts: rhythmbox (<< 0.11.5),
+ banshee (<< 0.13.2+dfsg-7),
+ totem (<< 2.22.0),
+ gnome-control-center (<< 1:2.21.5)
+Breaks: gnome-session (<< 2.24),
+ gnome-screensaver (<< 2.28.0)
+Suggests: x11-xserver-utils,
+ gnome-screensaver,
+ metacity | x-window-manager
+Description: daemon handling the GNOME session settings
+ This package contains the daemon which is responsible for setting the
+ various parameters of a GNOME session and the applications that run
+ under it. It handles the following kinds of settings:
+ .
+ * Keyboard: layout, accessibility options, shortcuts, media keys
+ * Clipboard management
+ * Theming: background, icons, GTK+ applications
+ * Cleanup of unused files
+ * Mouse: cursors, speed, accessibility options
+ * Startup of other daemons: screensaver, sound daemon
+ * Typing break
+ .
+ It also sets various application settings through X resources and
+ freedesktop.org XSETTINGS.
+
+Package: gnome-settings-daemon-dev
+Architecture: any
+Depends: ${shlibs:Depends},
+ ${misc:Depends},
+ libdbus-glib-1-dev (>= 0.74),
+ libglib2.0-dev (>= 2.17.3)
+Replaces: libgnome-settings-daemon-dev
+Description: Headers for building applications communicating with gnome-settings-daemon
+ This package contains header files required to build applications that
+ communicate with the GNOME settings daemon over D-Bus.
--- gnome-settings-daemon-2.32.1.orig/debian/watch
+++ gnome-settings-daemon-2.32.1/debian/watch
@@ -0,0 +1,3 @@
+version=2
+http://ftp.gnome.org/pub/GNOME/sources/gnome-settings-daemon/([\d\.]+)\d/ \
+gnome-settings-daemon-([\d\.]+)\.tar\.gz
--- gnome-settings-daemon-2.32.1.orig/debian/gnome-settings-daemon.gconf-defaults
+++ gnome-settings-daemon-2.32.1/debian/gnome-settings-daemon.gconf-defaults
@@ -0,0 +1,5 @@
+/desktop/gnome/font_rendering/antialiasing rgba
+/desktop/gnome/font_rendering/hinting slight
+/desktop/gnome/peripherals/touchpad/config_migration_needed true
+/desktop/gnome/peripherals/touchpad/disable_while_typing true
+/desktop/gnome/peripherals/touchpad/tap_to_click true
--- gnome-settings-daemon-2.32.1.orig/debian/rules
+++ gnome-settings-daemon-2.32.1/debian/rules
@@ -0,0 +1,26 @@
+#!/usr/bin/make -f
+
+include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/rules/patchsys-quilt.mk
+include /usr/share/cdbs/1/rules/utils.mk
+include /usr/share/cdbs/1/rules/autoreconf.mk
+include /usr/share/cdbs/1/class/gnome.mk
+include /usr/share/gnome-pkg-tools/1/rules/uploaders.mk
+-include /usr/share/gnome-pkg-tools/1/rules/gnome-get-source.mk
+
+LDFLAGS += -Wl,-O1 -Wl,-z,defs -Wl,--warn-unresolved-symbols -Wl,--as-needed
+
+DEB_DH_MAKESHLIBS_ARGS_ALL += --no-act
+
+build/gnome-settings-daemon::
+ gcc-4.4 -o gnome-settings-daemon/gnome-update-wallpaper-cache `pkg-config --cflags --libs glib-2.0 gdk-2.0 gconf-2.0 gnome-desktop-2.0` debian/gnome-update-wallpaper-cache.c
+
+install/gnome-settings-daemon::
+ /usr/bin/install -c gnome-settings-daemon/gnome-update-wallpaper-cache 'debian/tmp/usr/lib/gnome-settings-daemon'
+
+binary-install/gnome-settings-daemon::
+ find debian -name '*.a' -delete
+ find debian -name '*.la' -delete
+
+clean::
+ rm -f gnome-settings-daemon/gnome-update-wallpaper-cache
--- gnome-settings-daemon-2.32.1.orig/debian/gnome-settings-daemon-dev.install
+++ gnome-settings-daemon-2.32.1/debian/gnome-settings-daemon-dev.install
@@ -0,0 +1,2 @@
+debian/tmp/usr/include
+debian/tmp/usr/lib/pkgconfig
--- gnome-settings-daemon-2.32.1.orig/debian/control
+++ gnome-settings-daemon-2.32.1/debian/control
@@ -0,0 +1,84 @@
+# This file is autogenerated. DO NOT EDIT!
+#
+# Modifications should be made to debian/control.in instead.
+# This file is regenerated automatically in the clean target.
+
+Source: gnome-settings-daemon
+Section: gnome
+Priority: optional
+Maintainer: Ubuntu Desktop Team
+XSBC-Original-Maintainer: Debian GNOME Maintainers
+Uploaders: Debian GNOME Maintainers
+Build-Depends: cdbs,
+ quilt,
+ dh-autoreconf,
+ debhelper (>= 5),
+ dpkg-dev (>= 1.13.19),
+ gnome-common,
+ autotools-dev,
+ intltool (>= 0.37.1),
+ libdbus-glib-1-dev (>= 0.74),
+ libglib2.0-dev (>= 2.17.3),
+ libgtk2.0-dev (>= 2.16.0),
+ libgconf2-dev (>= 2.6.1),
+ libgnome-desktop-dev (>= 2.29.92),
+ libnotify-dev (>= 0.4.3),
+ libxt-dev,
+ libxi-dev,
+ libfontconfig1-dev,
+ libxext-dev,
+ libx11-dev,
+ libgnomekbd-dev (>= 2.29.5),
+ libxklavier-dev (>= 5.0),
+ libgstreamer0.10-dev (>= 0.10.1.2),
+ libgstreamer-plugins-base0.10-dev (>= 0.10.1.2),
+ gnome-pkg-tools,
+ libpulse-dev (>= 0.9.15),
+ libcanberra-gtk-dev,
+ libappindicator-dev (>= 0.2.4)
+Standards-Version: 3.9.1
+Vcs-Bzr: https://code.launchpad.net/~ubuntu-desktop/gnome-settings-daemon/ubuntu
+
+Package: gnome-settings-daemon
+Architecture: any
+Depends: ${shlibs:Depends},
+ ${misc:Depends},
+ libgnome2-common
+Recommends: pulseaudio
+Replaces: capplets-data (<< 1:2.21.5),
+ gnome-control-center (<< 1:2.21.5)
+Conflicts: rhythmbox (<< 0.11.5),
+ banshee (<< 0.13.2+dfsg-7),
+ totem (<< 2.22.0),
+ gnome-control-center (<< 1:2.21.5)
+Breaks: gnome-session (<< 2.24),
+ gnome-screensaver (<< 2.28.0)
+Suggests: x11-xserver-utils,
+ gnome-screensaver,
+ metacity | x-window-manager
+Description: daemon handling the GNOME session settings
+ This package contains the daemon which is responsible for setting the
+ various parameters of a GNOME session and the applications that run
+ under it. It handles the following kinds of settings:
+ .
+ * Keyboard: layout, accessibility options, shortcuts, media keys
+ * Clipboard management
+ * Theming: background, icons, GTK+ applications
+ * Cleanup of unused files
+ * Mouse: cursors, speed, accessibility options
+ * Startup of other daemons: screensaver, sound daemon
+ * Typing break
+ .
+ It also sets various application settings through X resources and
+ freedesktop.org XSETTINGS.
+
+Package: gnome-settings-daemon-dev
+Architecture: any
+Depends: ${shlibs:Depends},
+ ${misc:Depends},
+ libdbus-glib-1-dev (>= 0.74),
+ libglib2.0-dev (>= 2.17.3)
+Replaces: libgnome-settings-daemon-dev
+Description: Headers for building applications communicating with gnome-settings-daemon
+ This package contains header files required to build applications that
+ communicate with the GNOME settings daemon over D-Bus.
--- gnome-settings-daemon-2.32.1.orig/debian/changelog
+++ gnome-settings-daemon-2.32.1/debian/changelog
@@ -0,0 +1,443 @@
+gnome-settings-daemon (2.32.1-0ubuntu2) natty; urgency=low
+
+ * debian/rules:
+ - use gcc-4.4 to build the wallpaper cache app. doko investigates to get it
+ fixed with 4.5.
+
+ -- Didier Roche Tue, 16 Nov 2010 16:46:08 +0100
+
+gnome-settings-daemon (2.32.1-0ubuntu1) natty; urgency=low
+
+ * New upstream version:
+ - Revert calling g-c-c 3.0's display configuration tool
+ - Use the fallback configurations if the stored
+ configuration fails at startup
+ - Don't access free'd memory if a volume is unmounted whilst the dialog is
+ displayed
+ - Add gconf key for disabling boot time configuration
+ - Use Xorg monitor settings by default
+ * debian/patches/08_xrandr_command.patch:
+ - dropped, the fix is in the new version
+ * debian/patches/09_gconfify_default_xrandr.patch:
+ - dropped, the fix is in the new version
+ * debian/patches/71_fix_ldsm_notification_crash.patch
+ - dropped, the fix is in the new version
+ * debian/gnome-settings-daemon.gconf-defaults:
+ - don't set xrandr keys since upstream default to using the xorg config
+
+ -- Sebastien Bacher Mon, 15 Nov 2010 18:08:08 +0100
+
+gnome-settings-daemon (2.32.0-0ubuntu4) natty; urgency=low
+
+ * debian/gnome-settings-daemon.install:
+ - install the icons and polkit files which were not in the binaries
+ * debian/patches/70_migrate_touchpad_config.patch:
+ - dropped, it was just required for migration until lucid
+ * debian/patches/99_ltmain_as-needed.patch:
+ - dropped, it's not required with as-needed being default in natty
+
+ -- Sebastien Bacher Fri, 05 Nov 2010 10:25:40 +0100
+
+gnome-settings-daemon (2.32.0-0ubuntu3) maverick-proposed; urgency=low
+
+ * Fix LP: #625793 - Multiple Keyboard Layouts unusable: continuously
+ changes layout + 100% CPU usage. Don't call xkl_engine_lock_group in
+ response to XKB events, as XkbLockGroup generates another event
+ - update debian/patches/06_use_application_indicator.patch
+ * Fix LP: #658777 - In popup_menu_set_group() - after adding new entries to
+ the hash table, don't free the keys else we end up with a hash table full
+ of keys pointing to invalid memory. Instead, create the hash table with
+ g_hash_table_new_full, and have the keys freed when the hash table is
+ destroyed
+ - update debian/patches/06_use_application_indicator.patch
+
+ -- Chris Coulson Tue, 12 Oct 2010 11:03:40 +0100
+
+gnome-settings-daemon (2.32.0-0ubuntu2) maverick; urgency=low
+
+ * Add 09_gconfify_default_xrandr.patch: In a lot of situations it is
+ undesirable to have g-s-d change the XRandR settings, because it overrides
+ X.org customizations, leads to unnecessary mode switches, or increases
+ boot time. Add a gconf key "use_xorg_monitor_settings" to disable
+ apply_default_boot_configuration(), in which case the XRandR configuration
+ will not be touched unless there is a global or per-user configuration
+ file.
+ * debian/gnome-settings-daemon.gconf-defaults: Set use_xorg_monitor_settings
+ to true. This disables g-s-d's rather new default XRandR configuration and
+ reverts back to what we had up to Maverick beta. This avoids a lot of
+ monitor misconfigurations. (LP: #640807)
+
+ -- Martin Pitt Tue, 05 Oct 2010 12:02:35 +0200
+
+gnome-settings-daemon (2.32.0-0ubuntu1) maverick; urgency=low
+
+ * New upstream release.
+
+ -- Michael Terry Mon, 27 Sep 2010 10:15:53 -0400
+
+gnome-settings-daemon (2.31.92-0ubuntu1) maverick; urgency=low
+
+ * New upstream release:
+ - Don't use the Stored/custom configuration type in the XF86Display cycle
+ (Federico Mena Quintero)
+ - Basic infrastructure for RANDR logging (Federico Mena Quintero)
+ - Log when handling RANDR events (Gabriel Burt)
+ - Updated translations
+
+ -- Didier Roche Tue, 14 Sep 2010 13:01:50 +0200
+
+gnome-settings-daemon (2.31.91-0ubuntu3) maverick; urgency=low
+
+ * debian/gnome-settings-daemon.gconf-defaults:
+ - turn on external screens by default
+
+ -- Sebastien Bacher Fri, 10 Sep 2010 22:24:49 +0200
+
+gnome-settings-daemon (2.31.91-0ubuntu2) maverick; urgency=low
+
+ * debian/patches/08_xrandr_command.patch:
+ - still call gnome-display-properties to configure the display, the
+ control center changes didn't land this cycle (lp: #631761)
+ * 06_use_application_indicator.patch: updated version by Karl Lattimer
+ - don't start using cpu when switching layout (lp: #624477)
+ - respect the option to display flag icons (lp: #623435)
+
+ -- Sebastien Bacher Mon, 06 Sep 2010 19:38:10 +0200
+
+gnome-settings-daemon (2.31.91-0ubuntu1) maverick; urgency=low
+
+ * New upstream release
+ * debian/patches/91_bugzilla_update_touchpad_icons.patch:
+ - Applied upstream
+
+ -- Robert Ancell Wed, 01 Sep 2010 18:52:24 +1000
+
+gnome-settings-daemon (2.30.2-0ubuntu5) maverick; urgency=low
+
+ * debian/patches/06_use_application_indicator.patch:
+ - updated version by Karl Lattimer to improve the space computing
+
+ -- Sebastien Bacher Tue, 24 Aug 2010 21:51:21 +0200
+
+gnome-settings-daemon (2.30.2-0ubuntu4) maverick; urgency=low
+
+ * 06_use_application_indicator.patch: update by Karl Lattimer to fix those
+ - keyboard indicator does not react to layout changes (lp: #531290)
+ - indicator variants in a same layout displayed the same way (lp: #620334)
+ - move keyboard layouts out of the submenu (lp: #620571)
+
+ -- Sebastien Bacher Fri, 20 Aug 2010 11:12:10 +0200
+
+gnome-settings-daemon (2.30.2-0ubuntu3) maverick; urgency=low
+
+ * debian/control.in:
+ - requires libindicator-application 0.2.4 for label support
+ * debian/patches/06_use_application_indicator.patch:
+ - updated version by Karl Lattimer porting the keyboard layout to indicators
+ now that indicator-application supports labels (lp: #599844)
+ * debian/control.in, debian/rules:
+ - use dh-autoreconf
+
+ -- Sebastien Bacher Tue, 17 Aug 2010 19:21:57 +0200
+
+gnome-settings-daemon (2.30.2-0ubuntu2) maverick; urgency=low
+
+ * debian/patches/10_fn-F7.patch:
+ - dropped, the change is in the new version
+
+ -- Sebastien Bacher Wed, 23 Jun 2010 23:06:13 +0200
+
+gnome-settings-daemon (2.30.2-0ubuntu1) maverick; urgency=low
+
+ * New upstream release
+ * debian/patches/30_pkgconfig-path.patch:
+ - Fixed for latest upstream
+
+ -- Rodrigo Moya Tue, 22 Jun 2010 12:08:23 +0200
+
+gnome-settings-daemon (2.30.1-1ubuntu2) maverick; urgency=low
+
+ * debian/control.in:
+ - Build-depend on gnome-common for autotools
+
+ -- Robert Ancell Thu, 10 Jun 2010 13:26:51 +1000
+
+gnome-settings-daemon (2.30.1-1ubuntu1) maverick; urgency=low
+
+ * Merge with Debian unstable, remaining Ubuntu changes:
+ * debian/control.in:
+ - Drop libxrandr-dev and libxrender-dev build-deps
+ - Build-depend on libpulse and libcanberra
+ - Build-depend on libappindicator-dev
+ - Add Vcs-Bzr link
+ - Recommend pulseaudio
+ * debian/rules:
+ - Run autotools on build
+ - Don't disable the pulseaudio use
+ - Build and install gnome-update-wallpaper-cache
+ * debian/gnome-settings-daemon.gconf-defaults:
+ - Enable tap_on_click and disable_while_typing on by default,
+ it's the less confusing behaviour for user and was the consensus
+ during the discussion on the lists
+ - Ensure that touchpad settings are migrated to the new
+ config where appropriate
+ - Use subpixel rendering and slight hinting as the default
+ * debian/gnome-settings-daemon.install:
+ - Don't move the autostart to a non standard directory as debian
+ - Install dbus service
+ debian/gnome-settings-daemon.postinst:
+ - Don't move the autostart to a non standard directory as debian
+ * debian/gnome-update-cache-wallpaper.c:
+ - enable creating a cached wallpaper even when g-s-d or nautilus isn't
+ running. Used in ubiquity in install mode
+ * debian/patches/02_fix_randr.patch:
+ - Correctly apply the xrandr settings.
+ * debian/patches/05_disable_corner_tapping.patch:
+ - Disable corner tapping when disabling tap to click
+ * debian/patches/06_use_application_indicator.patch:
+ - Use the new application indicator system
+ * debian/patches/07_dont_display_autostart.patch:
+ - Don't show the gnome-settings-daemon autostart in the session capplet,
+ the description is confusing and it's a required component
+ * debian/patches/10_fn-F7.patch:
+ - Fix handling of fn-F7 (xrandr) when xev timestamp is later than server
+ timestamp
+ * debian/patches/16_use_synchronous_notifications.patch:
+ - Use synchronous notifications when they are supported
+ * debian/patches/20_gstreamer.patch:
+ - Don't use this debian change but rather the upstream code version
+ * debian/patches/40_xres_lcddefault.patch:
+ - OpenOffice.org subpixel font rendering broken with new cairo
+ * debian/patches/70_migrate_touchpad_config.patch:
+ - Ensure that touchpad settings are migrated to the new
+ config where appropriate
+ * debian/patches/70_relibtoolize.patch:
+ - Not required, now run autotools on build
+ * debian/patches/71_fix_ldsm_notification_crash.patch:
+ - Don't access free'd memory if a volume is unmounted whilst the
+ dialog is displayed
+ * debian/patches/91_bugzilla_update_touchpad_icons.patch:
+ - Use correct touchpad svg icons
+ * debian/patches/91_update_gvc_source.patch:
+ - Update gvc copy using the current gnome-media version to fix a leak issue
+ * debian/watch:
+ - Watch unstable series
+
+ -- Robert Ancell Thu, 10 Jun 2010 12:49:47 +1000
+
+gnome-settings-daemon (2.30.1-1) unstable; urgency=low
+
+ * New upstream release.
+ * Bump build-dependencies.
+ * 11_sleepkey.patch, 40_xklavier_5.0.patch: dropped, obsolete.
+ * 20_gstreamer.patch, 30_pkgconfig-path.patch, 70_relibtoolize.patch:
+ updated for the new version.
+
+ -- Josselin Mouette Tue, 27 Apr 2010 20:00:27 +0200
+
+gnome-settings-daemon (2.28.1-3) unstable; urgency=low
+
+ * Depend on libgnome2-common for the GConf schemas.
+ * 40_xklavier_5.0.patch: new patch. Get 2.28 version to work with
+ libxklavier 5.0.
+ * Require said version to build.
+
+ -- Josselin Mouette Fri, 09 Apr 2010 00:17:00 +0200
+
+gnome-settings-daemon (2.28.1-2) unstable; urgency=low
+
+ * Drop libxxf86misc-dev build-dependency. This extension is only used
+ as a fallback to XKB. Closes: #559690.
+ * 12_monitor_network_fs.patch: new patch. Don’t monitor remote
+ filesystems for their free size. Closes: #563592.
+
+ -- Josselin Mouette Sat, 09 Jan 2010 10:59:14 +0100
+
+gnome-settings-daemon (2.28.1-1) unstable; urgency=low
+
+ * New upstream release.
+ - debian/patches/70_relibtoolize.patch:
+ + Updated.
+ * debian/rules: remove check-dist.mk to upload to unstable.
+
+ -- Emilio Pozuelo Monfort Thu, 22 Oct 2009 06:08:36 +0200
+
+gnome-settings-daemon (2.28.0-1) experimental; urgency=low
+
+ * Add a watch file.
+ * Add a manpage for gnome-settings-daemon, thanks Joshua Cummings!
+ Closes: #494370.
+ * debian/control.in: remove trailing whitespaces.
+ * Standards-Version is 3.8.2, no changes needed.
+ * New upstream release.
+ - debian/control.in:
+ + Bump libgtk2.0-dev and libgnome-desktop-dev build dependencies.
+ + Remove libglade2-dev build dependency, no longer needed.
+ + Build depend on libxklavier-dev >= 4.0 instead of libxklavier12-dev.
+ + Break gnome-screensaver << 2.28 since g-s-d doesn't start it anymore,
+ relaying on the autostart file in g-s 2.28.
+ - debian/patches/20_gstreamer.patch,
+ debian/patches/70_relibtoolize.patch:
+ + Updated to apply again.
+ - debian/gnome-settings-daemon.install:
+ + Install *.ui rather than *.glade.
+ + Don't install *.png, the icon is not shipped anymore.
+ * Standards-Version is 3.8.3, no changes needed.
+ * debian/rules:
+ - Don't touch every file anymore, it was done because of a broken tarball.
+ - Include check-dist.mk to avoid uploads to unstable.
+
+ -- Emilio Pozuelo Monfort Fri, 09 Oct 2009 17:26:43 +0200
+
+gnome-settings-daemon (2.26.1-2) unstable; urgency=low
+
+ * 03_maintainer_mode.patch: new patch, add AM_MAINTAINER_MODE. Fixes
+ FTBFS.
+ * Regenerate 70_relibtoolize.patch.
+
+ -- Josselin Mouette Fri, 29 May 2009 16:19:52 +0200
+
+gnome-settings-daemon (2.26.1-1) unstable; urgency=low
+
+ * New upstream release.
+ + 20_gstreamer.patch: install the plugin although pulse is disabled.
+ + Refresh 70_relibtoolize.patch.
+ * Move the autostart file to /usr/share/gnome/autostart.
+ * gnome-settings-daemon.postinst:
+ + Remove the old autostart file if needed.
+ + Only remove the xrdb stuff upon upgrades from pre-2.24.1.
+
+ -- Josselin Mouette Fri, 29 May 2009 11:25:35 +0200
+
+gnome-settings-daemon (2.26.0-2) experimental; urgency=low
+
+ * 20_gstreamer.patch: Initialize Gerror * variables to NULL before
+ usage. Fixes a crasher when using media keys (Closes: #524165)
+
+ -- Sjoerd Simons Sat, 18 Apr 2009 11:00:25 +0100
+
+gnome-settings-daemon (2.26.0-1) experimental; urgency=low
+
+ * New upstream release.
+ * Update build-dependencies.
+ * Install the autostart file and the keybindings XML file.
+ + Break gnome-session < 2.24 which would attempt to start it twice
+ with the autostart file.
+ * 11_sleepkey.patch: updated for the new version.
+ * 20_gstreamer.patch: new patch from Romain Périer, adds back support
+ for GStreamer with a selection at compile time.
+ * 70_relibtoolize.patch: regenerated.
+ * Refresh other patches.
+ * Pass --disable-pulse to configure, to use the GStreamer code
+ instead.
+
+ -- Josselin Mouette Sat, 11 Apr 2009 11:31:52 +0200
+
+gnome-settings-daemon (2.24.1-2) unstable; urgency=low
+
+ [ Josselin Mouette ]
+ * Improve package descriptions. Mention XSETTINGS. Closes: #511905.
+ * Upload to unstable.
+
+ [ Loic Minier ]
+ * Suggest x11-xserver-utils as gnome-settings-daemon attempts to run xrdb by
+ default and logs a warning when that fails.
+ * Suggest gnome-screensaver as gnome-settings-daemon attempts to start it by
+ default and logs a warning when that fails.
+ * Suggest metacity | x-window-manager as gnome-settings-daemon attemts to
+ start a window manager and logs a warning when that fails.
+
+ -- Josselin Mouette Tue, 07 Apr 2009 08:48:36 +0200
+
+gnome-settings-daemon (2.24.1-1) experimental; urgency=low
+
+ * New upstream release.
+ + Cleans up thumbnail cache automatically. Closes: #235067.
+ * Update build-dependencies and -dev dependencies.
+ * Standards version is 3.8.0.
+ * Switch to quilt for patch management; build-depend on quilt.
+ * 02_missing_libs.patch: explicitly add X11 libraries to
+ SETTINGS_PLUGINS since plugins are actually relying on them being
+ available.
+ * 70_relibtoolize.patch: new patch, relibtoolize the source.
+ * 99_ltmain_as-needed.patch: new patch, make --as-needed work.
+ * Pass -O1 -z defs --as-needed to the linker.
+ + Only warn on undefined symbols as plugins need a symbol from the
+ daemon.
+ * Add some comments in the patches.
+ * Pass --no-act to dh_makeshlibs.
+ * gnome-settings-daemon.postinst: remove /etc/gnome/config/xrdb.
+ * Install .ad files in /etc/gnome/config to replace the ones from
+ capplets-data which are still used.
+ * Do not install the autostart file since we still use gnome-session
+ 2.22 which will start g-s-d by hand.
+
+ -- Josselin Mouette Sat, 27 Dec 2008 11:29:41 +0100
+
+gnome-settings-daemon (2.22.2.1-2) unstable; urgency=low
+
+ * 08_extra_touchpad_options.patch: removed broken patch from Ubuntu.
+ Closes: #481191.
+ * 11_sleepkey.patch: use gnome-power-cmd to suspend the computer
+ instead of the nonexistent gdm-signal.
+
+ -- Josselin Mouette Tue, 11 Nov 2008 16:08:08 +0100
+
+gnome-settings-daemon (2.22.2.1-1) unstable; urgency=low
+
+ [ Josselin Mouette ]
+ * Fix priority.
+
+ [ Sebastian Dröge ]
+ * New upstream bugfix release:
+ + debian/rules:
+ - Run touch on every file to fix up timestamps.
+
+ -- Sebastian Dröge Thu, 29 May 2008 10:31:39 +0200
+
+gnome-settings-daemon (2.22.1-2) unstable; urgency=high
+
+ * Conflict against gnome-control-center < 2.21.5. Closes: #476802.
+
+ -- Josselin Mouette Sat, 19 Apr 2008 22:17:49 +0200
+
+gnome-settings-daemon (2.22.1-1) unstable; urgency=low
+
+ * New upstream bugfix release:
+ + debian/patches/09_locate_pointer.patch:
+ - Dropped, fixed upstream.
+
+ -- Sebastian Dröge Mon, 07 Apr 2008 14:44:12 +0200
+
+gnome-settings-daemon (2.22.0-4) unstable; urgency=low
+
+ * debian/control.in:
+ + Also conflict with totem (<< 2.22.0) for the same reason.
+ * debian/gnome-settings-daemon.install:
+ + Install xrdb files into /etc/gnome/config again.
+
+ -- Sebastian Dröge Sat, 22 Mar 2008 14:56:12 +0100
+
+gnome-settings-daemon (2.22.0-3) unstable; urgency=low
+
+ * Upload to unstable.
+ * debian/control.in:
+ + Add conflicts with rhythmbox (<< 0.11.5) and banshee (<< 0.13.2+dfsg-7)
+ as the multimedia keys DBus interface changed.
+
+ -- Sebastian Dröge Wed, 19 Mar 2008 01:47:15 +0100
+
+gnome-settings-daemon (2.22.0-2) experimental; urgency=low
+
+ * debian/rules:
+ + Don't install the dbus service file. This is not meant to be autostarted
+ but should be started by gnome-session.
+
+ -- Sebastian Dröge Sun, 16 Mar 2008 17:39:52 +0100
+
+gnome-settings-daemon (2.22.0-1) experimental; urgency=low
+
+ * New package, based on the Ubuntu packaging.
+
+ -- Sebastian Dröge Wed, 12 Mar 2008 15:17:19 +0100
+
--- gnome-settings-daemon-2.32.1.orig/debian/copyright
+++ gnome-settings-daemon-2.32.1/debian/copyright
@@ -0,0 +1,72 @@
+This package was debianized by Sebastien Bacher on
+Wed, 16 Jan 2008 11:12:19 +0100.
+
+It was downloaded from http://ftp.acc.umu.se/pub/GNOME/sources/gnome-settings-daemon
+
+Upstream Authors:
+
+ Jonathan Blandford
+ William Jon McCann
+
+Copyright:
+
+ Copyright © 2001 Ximian, Inc.
+ Copyright (C) 2007 William Jon McCann
+ Copyright (C) 2000 Helix Code, Inc
+ Copyright © 2007 Matthias Clasen
+ Copyright (C) 2007 Rodrigo Moya
+ Copyright (C) 2007 Anders Carlsson
+ Copyright © 2004 Red Hat, Inc.
+ Copyright 2002 Sun Microsystems, Inc.
+ Copyright © 2005,2006 Novell, Inc.
+ Copyright © 2007 The GNOME Foundation
+ Copyright (C) 2002-2005 - Paolo Maggi
+ Copyright (C) 2002 Red Hat, Inc.
+ Copyright 1998, 2001 Tim Janik
+ Copyright � 2001 Udaltsoft
+ Copyright (C) 2001, 2002, 2003 Bastien Nocera
+ Copyright (C) 2003 Ross Burton
+ Copyright © 2001 Jonathan Blandford
+
+License:
+
+ This package 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 package 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 package; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.
+
+eggaccelerators.h, eggaccelerators.c
+
+License:
+
+ This package is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This package 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this package; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+On Debian systems, the complete text of the GNU Lesser General
+Public License can be found in `/usr/share/common-licenses/LGPL'.
+
+The Debian packaging is (C) 2008, Sebastien Bacher and
+is licensed under the GPL, see above.
--- gnome-settings-daemon-2.32.1.orig/debian/compat
+++ gnome-settings-daemon-2.32.1/debian/compat
@@ -0,0 +1 @@
+5
--- gnome-settings-daemon-2.32.1.orig/debian/gnome-settings-daemon.1
+++ gnome-settings-daemon-2.32.1/debian/gnome-settings-daemon.1
@@ -0,0 +1,39 @@
+.\"
+.\" gnome₋settings-daemon manual page
+.\" Copyright (c) 2009 Joshua Cummings
+.\"
+.TH GNOME-SETTINGS-DAEMON 1 "June 25 2009" ""
+.SH NAME
+gnome-settings-daemon \- Handles the GNOME session settings
+.SH SYNOPSIS
+\fBgnome-settings-daemon\fR [\fB\-\-debug\fR] [\fB\-\-no-daemon\fR]
+[\fB\-\-gconf-prefix\fR] [\fB\-\-display\fR=\fIDISPLAY\fR]
+.SH DESCRIPTION
+\fIgnome-settings-daemon\fR is responsible for setting the various preference
+parameters of a GNOME session and the applications that run under it.
+.SH OPTIONS
+.PP
+Help options
+.TP
+\-?, \fB\-\-help\fR
+Show this help message
+.PP
+Application options
+.TP
+\fB\-\^\-debug\fR
+Enable debugging code
+.TP
+\fB\-\^\-no-daemon\fR
+Do not detach the daemon process from its controlling terminal
+.TP
+\fB\-\^\-gconf-prefix\fR
+Specify a custom GConf settings prefix for settings manager plugins
+.TP
+\fB\-\^\-display\fR=\fIDISPLAY\fR
+X display to use
+.PP
+.SH AUTHOR
+\fBgnome-settings-daemon\fR was written by Jonathan Blandford
+and William Jon McCann .
+.PP
+This manual page was originally written by Joshua Cummings .
--- gnome-settings-daemon-2.32.1.orig/debian/gnome-settings-daemon.postinst
+++ gnome-settings-daemon-2.32.1/debian/gnome-settings-daemon.postinst
@@ -0,0 +1,13 @@
+#! /bin/sh
+set -e
+
+# Remove obsolete conffiles
+
+case "$1" in
+configure)
+ if dpkg --compare-versions "$2" lt-nl "2.24.1"; then
+ rm -rf /etc/gnome/config/xrdb
+ fi
+esac
+
+#DEBHELPER#
--- gnome-settings-daemon-2.32.1.orig/debian/patches/03_maintainer_mode.patch
+++ gnome-settings-daemon-2.32.1/debian/patches/03_maintainer_mode.patch
@@ -0,0 +1,12 @@
+Index: gnome-settings-daemon-2.26.1/configure.ac
+===================================================================
+--- gnome-settings-daemon-2.26.1.orig/configure.ac 2009-05-29 16:19:04.081105324 +0200
++++ gnome-settings-daemon-2.26.1/configure.ac 2009-05-29 16:19:32.437481894 +0200
+@@ -11,6 +11,7 @@ AC_INIT([gnome-settings-daemon],
+ AC_CONFIG_SRCDIR([gnome-settings-daemon/gnome-settings-manager.c])
+
+ AM_INIT_AUTOMAKE([1.9 no-dist-gzip dist-bzip2 tar-ustar])
++AM_MAINTAINER_MODE
+
+ AC_STDC_HEADERS
+ AC_PROG_CXX
--- gnome-settings-daemon-2.32.1.orig/debian/patches/01_xrdb.patch
+++ gnome-settings-daemon-2.32.1/debian/patches/01_xrdb.patch
@@ -0,0 +1,15 @@
+Change the directory for xrdb data.
+
+Index: gnome-settings-daemon-2.26.0/plugins/xrdb/gsd-xrdb-manager.c
+===================================================================
+--- gnome-settings-daemon-2.26.0.orig/plugins/xrdb/gsd-xrdb-manager.c 2009-01-05 17:26:26.000000000 +0100
++++ gnome-settings-daemon-2.26.0/plugins/xrdb/gsd-xrdb-manager.c 2009-04-11 13:36:54.898047572 +0200
+@@ -42,7 +42,7 @@
+
+ #define GSD_XRDB_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_XRDB_MANAGER, GsdXrdbManagerPrivate))
+
+-#define SYSTEM_AD_DIR DATADIR "/xrdb"
++#define SYSTEM_AD_DIR "/etc/gnome/config"
+ #define GENERAL_AD SYSTEM_AD_DIR "/General.ad"
+ #define USER_AD_DIR ".gnome2/xrdb"
+ #define USER_X_RESOURCES ".Xresources"
--- gnome-settings-daemon-2.32.1.orig/debian/patches/91_update_gvc_source.patch
+++ gnome-settings-daemon-2.32.1/debian/patches/91_update_gvc_source.patch
@@ -0,0 +1,16 @@
+Descrption: Update gvc copy using the current gnome-media version to fix a leak issue
+Bug: https://bugs.launchpad.net/bugs/485923
+
+diff -Nur gnome-settings-daemon-2.29.92/plugins/media-keys/cut-n-paste/gvc-mixer-stream.c gnome-settings-daemon-2.29.92.ubuntu/plugins/media-keys/cut-n-paste/gvc-mixer-stream.c
+--- gnome-settings-daemon-2.29.92/plugins/media-keys/cut-n-paste/gvc-mixer-stream.c 2009-08-24 12:20:18.000000000 +0200
++++ gnome-settings-daemon-2.29.92.ubuntu/plugins/media-keys/cut-n-paste/gvc-mixer-stream.c 2010-03-09 10:20:33.000000000 +0100
+@@ -844,6 +844,9 @@
+
+ g_return_if_fail (mixer_stream->priv != NULL);
+
++ g_object_unref (mixer_stream->priv->channel_map);
++ mixer_stream->priv->channel_map = NULL;
++
+ g_free (mixer_stream->priv->name);
+ mixer_stream->priv->name = NULL;
+
--- gnome-settings-daemon-2.32.1.orig/debian/patches/05_disable_corner_tapping.patch
+++ gnome-settings-daemon-2.32.1/debian/patches/05_disable_corner_tapping.patch
@@ -0,0 +1,18 @@
+Description: Disable corner tapping when disabling tap to click
+Bug: https://bugzilla.gnome.org/show_bug.cgi?id=607474
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/509724
+
+Index: gnome-settings-daemon-2.30.1/plugins/mouse/gsd-mouse-manager.c
+===================================================================
+--- gnome-settings-daemon-2.30.1.orig/plugins/mouse/gsd-mouse-manager.c 2010-03-10 22:59:38.000000000 +1100
++++ gnome-settings-daemon-2.30.1/plugins/mouse/gsd-mouse-manager.c 2010-06-10 12:53:34.823995974 +1000
+@@ -614,6 +614,9 @@
+
+ if (rc == Success && type == XA_INTEGER && format == 8 && nitems >= 7)
+ {
++ /* Set MR mapping for corner tapping on the right side*/
++ data[0] = (state) ? 2 : 0;
++ data[1] = (state) ? 3 : 0;
+ /* Set RLM mapping for 1/2/3 fingers*/
+ data[4] = (state) ? ((left_handed) ? 3 : 1) : 0;
+ data[5] = (state) ? ((left_handed) ? 1 : 3) : 0;
--- gnome-settings-daemon-2.32.1.orig/debian/patches/02_fix_randr.patch
+++ gnome-settings-daemon-2.32.1/debian/patches/02_fix_randr.patch
@@ -0,0 +1,24 @@
+Description: Fix application of ~/.config/monitors.xml
+Bug: http://bugzilla.gnome.org/show_bug.cgi?id=572876
+Bug-Ubuntu: https://launchpad.net/bugs/329410
+
+Index: gnome-settings-daemon-2.31.91/plugins/xrandr/gsd-xrandr-manager.c
+===================================================================
+--- gnome-settings-daemon-2.31.91.orig/plugins/xrandr/gsd-xrandr-manager.c 2010-08-31 20:37:05.000000000 +1000
++++ gnome-settings-daemon-2.31.91/plugins/xrandr/gsd-xrandr-manager.c 2010-09-01 18:56:07.312617001 +1000
+@@ -2096,7 +2096,6 @@
+ */
+
+ unlink (backup_filename);
+- goto out;
+ }
+
+ /* 2. There was no backup configuration! This means we are
+@@ -2104,6 +2103,7 @@
+ */
+
+ success = apply_intended_configuration (manager, intended_filename, timestamp);
++ goto out;
+
+ out:
+
--- gnome-settings-daemon-2.32.1.orig/debian/patches/07_dont_display_autostart.patch
+++ gnome-settings-daemon-2.32.1/debian/patches/07_dont_display_autostart.patch
@@ -0,0 +1,14 @@
+Description: Don't show the gnome-settings-daemon autostart in the session capplet, the description is confusing and it's a required component
+Bug: https://launchpad.net/bugs/146918
+
+diff -Nur gnome-settings-daemon-2.29.92/data/gnome-settings-daemon.desktop.in.in gnome-settings-daemon-2.29.92.ubuntu/data/gnome-settings-daemon.desktop.in.in
+--- gnome-settings-daemon-2.29.92/data/gnome-settings-daemon.desktop.in.in 2009-05-03 20:15:30.000000000 +0200
++++ gnome-settings-daemon-2.29.92.ubuntu/data/gnome-settings-daemon.desktop.in.in 2010-03-10 00:28:52.000000000 +0100
+@@ -3,6 +3,7 @@
+ _Name=GNOME Settings Daemon
+ Exec=@LIBEXECDIR@/gnome-settings-daemon
+ OnlyShowIn=GNOME;
++NoDisplay=true
+ X-GNOME-Autostart-Phase=Initialization
+ X-GNOME-Autostart-Notify=true
+ X-GNOME-AutoRestart=true
--- gnome-settings-daemon-2.32.1.orig/debian/patches/40_xres_lcddefault.patch
+++ gnome-settings-daemon-2.32.1/debian/patches/40_xres_lcddefault.patch
@@ -0,0 +1,66 @@
+Description: OpenOffice.org subpixel font rendering broken with new cairo
+Bug: https://bugs.launchpad.net/bugs/271283
+
+Index: gnome-settings-daemon-2.29.5/plugins/xsettings/gsd-xsettings-manager.c
+===================================================================
+--- gnome-settings-daemon-2.29.5.orig/plugins/xsettings/gsd-xsettings-manager.c 2010-01-21 23:54:11.000000000 +0100
++++ gnome-settings-daemon-2.29.5/plugins/xsettings/gsd-xsettings-manager.c 2010-01-21 23:54:50.000000000 +0100
+@@ -295,6 +295,9 @@
+ int dpi;
+ const char *rgba;
+ const char *hintstyle;
++
++ /* priv helper for OOO lcdfilter */
++ gboolean use_rgba;
+ } GnomeXftSettings;
+
+ static const char *rgba_types[] = { "rgb", "bgr", "vbgr", "vrgb" };
+@@ -321,6 +324,7 @@
+ settings->hintstyle = "hintfull";
+ settings->dpi = dpi * 1024; /* Xft wants 1/1024ths of an inch */
+ settings->rgba = "rgb";
++ settings->use_rgba = FALSE;
+
+ if (rgba_order) {
+ int i;
+@@ -359,7 +363,6 @@
+ }
+
+ if (antialiasing) {
+- gboolean use_rgba = FALSE;
+
+ if (strcmp (antialiasing, "none") == 0) {
+ settings->antialias = 0;
+@@ -367,13 +370,13 @@
+ settings->antialias = 1;
+ } else if (strcmp (antialiasing, "rgba") == 0) {
+ settings->antialias = 1;
+- use_rgba = TRUE;
++ settings->use_rgba = TRUE;
+ } else {
+ g_warning ("Invalid value for " FONT_ANTIALIASING_KEY " : '%s'",
+ antialiasing);
+ }
+
+- if (!use_rgba) {
++ if (!settings->use_rgba) {
+ settings->rgba = "none";
+ }
+ }
+@@ -397,6 +400,7 @@
+ xsettings_manager_set_string (manager->priv->managers [i], "Xft/HintStyle", settings->hintstyle);
+ xsettings_manager_set_int (manager->priv->managers [i], "Xft/DPI", settings->dpi);
+ xsettings_manager_set_string (manager->priv->managers [i], "Xft/RGBA", settings->rgba);
++ xsettings_manager_set_string (manager->priv->managers [i], "Xft/lcdfilter", settings->use_rgba ? "lcddefault" : "none");
+ }
+ gnome_settings_profile_end (NULL);
+ }
+@@ -456,6 +460,8 @@
+ settings->hintstyle);
+ update_property (add_string, "Xft.rgba",
+ settings->rgba);
++ update_property (add_string, "Xft.lcdfilter",
++ settings->use_rgba ? "lcddefault" : "none");
+
+ g_debug("xft_settings_set_xresources: new res '%s'", add_string->str);
+
--- gnome-settings-daemon-2.32.1.orig/debian/patches/06_use_application_indicator.patch
+++ gnome-settings-daemon-2.32.1/debian/patches/06_use_application_indicator.patch
@@ -0,0 +1,1326 @@
+--- a/configure.ac
++++ b/configure.ac
+@@ -52,6 +52,7 @@ GCONF_REQUIRED_VERSION=2.6.1
+ GIO_REQUIRED_VERSION=2.17.3
+ GNOME_DESKTOP_REQUIRED_VERSION=2.29.92
+ LIBNOTIFY_REQUIRED_VERSION=0.4.3
++APPINDICATOR_REQUIRED_VERSION=0.2.4
+
+ EXTRA_COMPILE_WARNINGS(yes)
+
+@@ -108,6 +109,32 @@ fi
+ AC_SUBST(LIBNOTIFY_CFLAGS)
+ AC_SUBST(LIBNOTIFY_LIBS)
+
++dnl ---------------------------------
++dnl - Application indicator
++dnl ---------------------------------
++
++AC_ARG_ENABLE([appindicator],
++ AS_HELP_STRING([--enable-appindicator[=@<:@no/auto/yes@:>@]],[Build support for application indicators]),
++ [enable_appindicator="yes"],
++ [enable_appindicator="auto"])
++
++
++if test x$enable_appindicator = xauto ; then
++ PKG_CHECK_EXISTS(appindicator-0.1 >= $APPINDICATOR_REQUIRED_VERSION,
++ [enable_appindicator="yes"],
++ [enable_appindicator="no"])
++fi
++
++if test x$enable_appindicator = xyes ; then
++ PKG_CHECK_MODULES(APPINDICATOR,
++ [appindicator-0.1 >= $APPINDICATOR_REQUIRED_VERSION],
++ [AC_DEFINE(HAVE_APPINDICATOR, 1, [Have AppIndicator])])
++fi
++
++AM_CONDITIONAL(HAVE_APPINDICATOR, test x$enable_appindicator = xyes)
++AC_SUBST(APPINDICATOR_CFLAGS)
++AC_SUBST(APPINDICATOR_LIBS)
++
+ dnl ---------------------------------------------------------------------------
+ dnl - Check for D-Bus
+ dnl ---------------------------------------------------------------------------
+@@ -481,6 +508,7 @@ echo "
+ PolicyKit support: ${HAVE_POLKIT}
+
+ Libnotify support: ${have_libnotify}
++ App indicatpr support: ${enable_appindicator}
+ PulseAudio support: ${have_pulse}
+ Smartcard support: ${have_smartcard_support}
+ ${NSS_DATABASE:+\
+--- a/plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c
++++ b/plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c
+@@ -50,6 +50,10 @@
+ #include
+ #endif /* HAVE_LIBNOTIFY */
+
++#ifdef HAVE_APPINDICATOR
++#include
++#endif
++
+ #include "gnome-settings-profile.h"
+ #include "gsd-a11y-keyboard-manager.h"
+ #include "gsd-a11y-preferences-dialog.h"
+@@ -67,7 +71,11 @@ struct GsdA11yKeyboardManagerPrivate
+ GtkWidget *stickykeys_alert;
+ GtkWidget *slowkeys_alert;
+ GtkWidget *preferences_dialog;
++#ifdef HAVE_APPINDICATOR
++ AppIndicator *app_indicator;
++#else
+ GtkStatusIcon *status_icon;
++#endif
+ XkbDescRec *original_xkb_desc;
+
+ guint gconf_notify;
+@@ -507,11 +515,24 @@ maybe_show_status_icon (GsdA11yKeyboardM
+ show = gconf_client_get_bool (client, CONFIG_ROOT "/enable", NULL);
+ g_object_unref (client);
+
++#ifdef HAVE_APPINDICATOR
++ if (!show && manager->priv->app_indicator == NULL)
++ return;
++
++ gsd_a11y_keyboard_manager_ensure_status_icon (manager);
++ if (show)
++ app_indicator_set_status (manager->priv->app_indicator,
++ APP_INDICATOR_STATUS_ACTIVE);
++ else
++ app_indicator_set_status (manager->priv->app_indicator,
++ APP_INDICATOR_STATUS_PASSIVE);
++#else
+ if (!show && manager->priv->status_icon == NULL)
+ return;
+
+ gsd_a11y_keyboard_manager_ensure_status_icon (manager);
+ gtk_status_icon_set_visible (manager->priv->status_icon, show);
++#endif
+ }
+
+ #ifdef HAVE_LIBNOTIFY
+@@ -593,9 +614,11 @@ ax_slowkeys_warning_post_bubble (GsdA11y
+ message = _("You just held down the Shift key for 8 seconds. This is the shortcut "
+ "for the Slow Keys feature, which affects the way your keyboard works.");
+
++#ifndef HAVE_APPINDICATOR
+ if (manager->priv->status_icon == NULL || ! gtk_status_icon_is_embedded (manager->priv->status_icon)) {
+ return FALSE;
+ }
++#endif
+
+ if (manager->priv->slowkeys_alert != NULL) {
+ gtk_widget_destroy (manager->priv->slowkeys_alert);
+@@ -610,7 +633,9 @@ ax_slowkeys_warning_post_bubble (GsdA11y
+ message,
+ "preferences-desktop-accessibility",
+ NULL);
++#ifndef HAVE_APPINDICATOR
+ notify_notification_attach_to_status_icon (manager->priv->notification, manager->priv->status_icon);
++#endif
+ notify_notification_set_timeout (manager->priv->notification, NOTIFICATION_TIMEOUT * 1000);
+
+ notify_notification_add_action (manager->priv->notification,
+@@ -732,9 +757,11 @@ ax_stickykeys_warning_post_bubble (GsdA1
+ _("You just pressed two keys at once, or pressed the Shift key 5 times in a row. "
+ "This turns off the Sticky Keys feature, which affects the way your keyboard works.");
+
++#ifndef HAVE_APPINDICATOR
+ if (manager->priv->status_icon == NULL || ! gtk_status_icon_is_embedded (manager->priv->status_icon)) {
+ return FALSE;
+ }
++#endif
+
+ if (manager->priv->slowkeys_alert != NULL) {
+ gtk_widget_destroy (manager->priv->slowkeys_alert);
+@@ -749,7 +776,9 @@ ax_stickykeys_warning_post_bubble (GsdA1
+ message,
+ "preferences-desktop-accessibility",
+ NULL);
++#ifndef HAVE_APPINDICATOR
+ notify_notification_attach_to_status_icon (manager->priv->notification, manager->priv->status_icon);
++#endif
+ notify_notification_set_timeout (manager->priv->notification, NOTIFICATION_TIMEOUT * 1000);
+
+ notify_notification_add_action (manager->priv->notification,
+@@ -1152,8 +1181,14 @@ gsd_a11y_keyboard_manager_stop (GsdA11yK
+ gdk_window_remove_filter (NULL, devicepresence_filter, manager);
+ #endif
+
++#ifdef HAVE_APPINDICATOR
++ if (p->app_indicator)
++ app_indicator_set_status (p->app_indicator,
++ APP_INDICATOR_STATUS_PASSIVE);
++#else
+ if (p->status_icon)
+ gtk_status_icon_set_visible (p->status_icon, FALSE);
++#endif
+
+ if (p->gconf_notify != 0) {
+ GConfClient *client = gconf_client_get_default ();
+@@ -1270,8 +1305,13 @@ on_preferences_dialog_response (GtkDialo
+ }
+
+ static void
++#ifdef HAVE_APPINDICATOR
++on_status_icon_activate (GtkMenuItem *item,
++ GsdA11yKeyboardManager *manager)
++#else
+ on_status_icon_activate (GtkStatusIcon *status_icon,
+ GsdA11yKeyboardManager *manager)
++#endif
+ {
+ if (manager->priv->preferences_dialog == NULL) {
+ manager->priv->preferences_dialog = gsd_a11y_preferences_dialog_new ();
+@@ -1295,6 +1335,26 @@ gsd_a11y_keyboard_manager_ensure_status_
+ {
+ gnome_settings_profile_start (NULL);
+
++#ifdef HAVE_APPINDICATOR
++ if (!manager->priv->app_indicator) {
++ GtkWidget *menu = gtk_menu_new ();
++ GtkWidget *item = gtk_menu_item_new_with_label (_("Universal Access Preferences"));
++
++ g_signal_connect (item,
++ "activate",
++ G_CALLBACK (on_status_icon_activate),
++ manager);
++
++ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
++ gtk_widget_show_all (menu);
++
++ manager->priv->app_indicator = app_indicator_new ("gsd-a11y-keyboard",
++ "preferences-desktop-accessibility",
++ APP_INDICATOR_CATEGORY_OTHER);
++ app_indicator_set_menu (manager->priv->app_indicator,
++ GTK_MENU (menu));
++ }
++#else
+ if (!manager->priv->status_icon) {
+
+ manager->priv->status_icon = gtk_status_icon_new_from_icon_name ("preferences-desktop-accessibility");
+@@ -1303,6 +1363,7 @@ gsd_a11y_keyboard_manager_ensure_status_
+ G_CALLBACK (on_status_icon_activate),
+ manager);
+ }
++#endif
+
+ gnome_settings_profile_end (NULL);
+ }
+--- a/plugins/a11y-keyboard/Makefile.am
++++ b/plugins/a11y-keyboard/Makefile.am
+@@ -53,6 +53,7 @@ liba11y_keyboard_la_CPPFLAGS = \
+ liba11y_keyboard_la_CFLAGS = \
+ $(SETTINGS_PLUGIN_CFLAGS) \
+ $(LIBNOTIFY_CFLAGS) \
++ $(APPINDICATOR_CFLAGS) \
+ $(AM_CFLAGS)
+
+ liba11y_keyboard_la_LDFLAGS = \
+@@ -63,6 +64,7 @@ liba11y_keyboard_la_LIBADD = \
+ $(SETTINGS_PLUGIN_LIBS) \
+ $(XF86MISC_LIBS) \
+ $(LIBNOTIFY_LIBS) \
++ $(APPINDICATOR_LIBS) \
+ $(NULL)
+
+ plugin_in_files = \
+--- /dev/null
++++ b/plugins/keyboard/gkbd-configuration.c
+@@ -0,0 +1,359 @@
++/*
++ * Copyright (C) 2010 Canonical Ltd.
++ *
++ * Authors: Jan Arne Petersen
++ *
++ * Based on gkbd-status.c by Sergey V. Udaltsov
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include
++
++#include
++#include
++#include
++
++#include
++#include
++
++#include "gkbd-configuration.h"
++
++struct _GkbdConfigurationPrivate {
++ XklEngine *engine;
++ XklConfigRegistry *registry;
++
++ GkbdDesktopConfig cfg;
++ GkbdIndicatorConfig ind_cfg;
++ GkbdKeyboardConfig kbd_cfg;
++
++ gchar **full_group_names;
++ gchar **short_group_names;
++
++ gulong state_changed_handler;
++ gulong config_changed_handler;
++};
++
++enum {
++ SIGNAL_CHANGED,
++ SIGNAL_GROUP_CHANGED,
++ LAST_SIGNAL
++};
++
++static guint signals[LAST_SIGNAL] = { 0, };
++
++#define GKBD_CONFIGURATION_GET_PRIVATE(o) \
++ (G_TYPE_INSTANCE_GET_PRIVATE ((o), GKBD_TYPE_CONFIGURATION, GkbdConfigurationPrivate))
++
++G_DEFINE_TYPE (GkbdConfiguration, gkbd_configuration, G_TYPE_OBJECT)
++
++/* Should be called once for all widgets */
++static void
++gkbd_configuration_cfg_changed (GConfClient * client,
++ guint cnxn_id, GConfEntry * entry,
++ GkbdConfiguration * configuration)
++{
++ GkbdConfigurationPrivate *priv = configuration->priv;
++
++ xkl_debug (100,
++ "General configuration changed in GConf - reiniting...\n");
++ gkbd_desktop_config_load_from_gconf (&priv->cfg);
++ gkbd_desktop_config_activate (&priv->cfg);
++
++ g_signal_emit (configuration,
++ signals[SIGNAL_CHANGED], 0);
++}
++
++/* Should be called once for all widgets */
++static void
++gkbd_configuration_ind_cfg_changed (GConfClient * client,
++ guint cnxn_id, GConfEntry * entry,
++ GkbdConfiguration * configuration)
++{
++ GkbdConfigurationPrivate *priv = configuration->priv;
++ xkl_debug (100,
++ "Applet configuration changed in GConf - reiniting...\n");
++ gkbd_indicator_config_load_from_gconf (&priv->ind_cfg);
++
++ gkbd_indicator_config_free_image_filenames (&priv->ind_cfg);
++ gkbd_indicator_config_load_image_filenames (&priv->ind_cfg,
++ &priv->kbd_cfg);
++
++ gkbd_indicator_config_activate (&priv->ind_cfg);
++
++ g_signal_emit (configuration,
++ signals[SIGNAL_CHANGED], 0);
++}
++
++static void
++gkbd_configuration_load_group_names (GkbdConfiguration * configuration,
++ XklConfigRec * xklrec)
++{
++ GkbdConfigurationPrivate *priv = configuration->priv;
++
++ if (!gkbd_desktop_config_load_group_descriptions (&priv->cfg,
++ priv->registry,
++ (const char **) xklrec->layouts,
++ (const char **) xklrec->variants,
++ &priv->short_group_names,
++ &priv->full_group_names)) {
++ /* We just populate no short names (remain NULL) -
++ * full names are going to be used anyway */
++ gint i, total_groups =
++ xkl_engine_get_num_groups (priv->engine);
++ xkl_debug (150, "group descriptions loaded: %d!\n",
++ total_groups);
++ priv->full_group_names =
++ g_new0 (char *, total_groups + 1);
++
++ if (xkl_engine_get_features (priv->engine) &
++ XKLF_MULTIPLE_LAYOUTS_SUPPORTED) {
++ GSList *lst = priv->kbd_cfg.layouts_variants;
++ for (i = 0; lst; lst = lst->next, i++) {
++ priv->full_group_names[i] =
++ g_strdup ((char *) lst->data);
++ }
++ } else {
++ for (i = total_groups; --i >= 0;) {
++ priv->full_group_names[i] =
++ g_strdup_printf ("Group %d", i);
++ }
++ }
++ }
++}
++
++/* Should be called once for all widgets */
++static void
++gkbd_configuration_kbd_cfg_callback (XklEngine *engine,
++ GkbdConfiguration *configuration)
++{
++ GkbdConfigurationPrivate *priv = configuration->priv;
++ XklConfigRec *xklrec = xkl_config_rec_new ();
++ xkl_debug (100,
++ "XKB configuration changed on X Server - reiniting...\n");
++
++ gkbd_keyboard_config_load_from_x_current (&priv->kbd_cfg,
++ xklrec);
++
++ gkbd_indicator_config_free_image_filenames (&priv->ind_cfg);
++ gkbd_indicator_config_load_image_filenames (&priv->ind_cfg,
++ &priv->kbd_cfg);
++
++ g_strfreev (priv->full_group_names);
++ priv->full_group_names = NULL;
++
++ g_strfreev (priv->short_group_names);
++ priv->short_group_names = NULL;
++
++ gkbd_configuration_load_group_names (configuration,
++ xklrec);
++
++ g_signal_emit (configuration,
++ signals[SIGNAL_CHANGED],
++ 0);
++
++ g_object_unref (G_OBJECT (xklrec));
++}
++
++/* Should be called once for all applets */
++static void
++gkbd_configuration_state_callback (XklEngine * engine,
++ XklEngineStateChange changeType,
++ gint group, gboolean restore,
++ GkbdConfiguration * configuration)
++{
++ xkl_debug (150, "group is now %d, restore: %d\n", group, restore);
++
++ if (changeType == GROUP_CHANGED) {
++ g_signal_emit (configuration,
++ signals[SIGNAL_GROUP_CHANGED], 0,
++ group);
++ }
++}
++
++static void
++gkbd_configuration_init (GkbdConfiguration *configuration)
++{
++ GkbdConfigurationPrivate *priv;
++ GConfClient *gconf_client;
++ XklConfigRec *xklrec = xkl_config_rec_new ();
++
++ priv = GKBD_CONFIGURATION_GET_PRIVATE (configuration);
++ configuration->priv = priv;
++
++ priv->engine = xkl_engine_get_instance (GDK_DISPLAY ());
++ if (priv->engine == NULL) {
++ xkl_debug (0, "Libxklavier initialization error");
++ return;
++ }
++
++ gconf_client = gconf_client_get_default ();
++
++ priv->state_changed_handler =
++ g_signal_connect (priv->engine, "X-state-changed",
++ G_CALLBACK (gkbd_configuration_state_callback),
++ configuration);
++ priv->config_changed_handler =
++ g_signal_connect (priv->engine, "X-config-changed",
++ G_CALLBACK (gkbd_configuration_kbd_cfg_callback),
++ configuration);
++
++ gkbd_desktop_config_init (&priv->cfg, gconf_client,
++ priv->engine);
++ gkbd_keyboard_config_init (&priv->kbd_cfg, gconf_client,
++ priv->engine);
++ gkbd_indicator_config_init (&priv->ind_cfg, gconf_client,
++ priv->engine);
++
++ g_object_unref (gconf_client);
++
++ gkbd_desktop_config_load_from_gconf (&priv->cfg);
++ gkbd_desktop_config_activate (&priv->cfg);
++
++ priv->registry = xkl_config_registry_get_instance (priv->engine);
++ xkl_config_registry_load (priv->registry,
++ priv->cfg.load_extra_items);
++
++ gkbd_keyboard_config_load_from_x_current (&priv->kbd_cfg,
++ xklrec);
++
++ gkbd_indicator_config_load_from_gconf (&priv->ind_cfg);
++
++ gkbd_indicator_config_load_image_filenames (&priv->ind_cfg,
++ &priv->kbd_cfg);
++
++ gkbd_indicator_config_activate (&priv->ind_cfg);
++
++ gkbd_configuration_load_group_names (configuration,
++ xklrec);
++ g_object_unref (G_OBJECT (xklrec));
++
++ gkbd_desktop_config_start_listen (&priv->cfg,
++ (GConfClientNotifyFunc) gkbd_configuration_cfg_changed,
++ configuration);
++ gkbd_indicator_config_start_listen (&priv->ind_cfg,
++ (GConfClientNotifyFunc) gkbd_configuration_ind_cfg_changed,
++ configuration);
++ xkl_engine_start_listen (priv->engine,
++ XKLL_TRACK_KEYBOARD_STATE);
++
++ xkl_debug (100, "Initiating the widget startup process for %p\n",
++ configuration);
++}
++
++static void
++gkbd_configuration_finalize (GObject * obj)
++{
++ GkbdConfiguration *configuration = GKBD_CONFIGURATION (obj);
++ GkbdConfigurationPrivate *priv = configuration->priv;
++
++ xkl_debug (100,
++ "Starting the gnome-kbd-configuration widget shutdown process for %p\n",
++ configuration);
++
++ xkl_engine_stop_listen (priv->engine,
++ XKLL_TRACK_KEYBOARD_STATE);
++
++ gkbd_desktop_config_stop_listen (&priv->cfg);
++ gkbd_indicator_config_stop_listen (&priv->ind_cfg);
++
++ gkbd_indicator_config_term (&priv->ind_cfg);
++ gkbd_keyboard_config_term (&priv->kbd_cfg);
++ gkbd_desktop_config_term (&priv->cfg);
++
++ if (g_signal_handler_is_connected (priv->engine,
++ priv->state_changed_handler)) {
++ g_signal_handler_disconnect (priv->engine,
++ priv->state_changed_handler);
++ priv->state_changed_handler = 0;
++ }
++ if (g_signal_handler_is_connected (priv->engine,
++ priv->config_changed_handler)) {
++ g_signal_handler_disconnect (priv->engine,
++ priv->config_changed_handler);
++ priv->config_changed_handler = 0;
++ }
++
++ g_object_unref (priv->registry);
++ priv->registry = NULL;
++ g_object_unref (priv->engine);
++ priv->engine = NULL;
++
++ G_OBJECT_CLASS (gkbd_configuration_parent_class)->finalize (obj);
++}
++
++static void
++gkbd_configuration_class_init (GkbdConfigurationClass * klass)
++{
++ GObjectClass *object_class = G_OBJECT_CLASS (klass);
++
++ /* Initing vtable */
++ object_class->finalize = gkbd_configuration_finalize;
++
++ /* Signals */
++ signals[SIGNAL_CHANGED] = g_signal_new ("changed",
++ GKBD_TYPE_CONFIGURATION,
++ G_SIGNAL_RUN_LAST,
++ 0,
++ NULL, NULL,
++ g_cclosure_marshal_VOID__VOID,
++ G_TYPE_NONE,
++ 0);
++ signals[SIGNAL_GROUP_CHANGED] = g_signal_new ("group-changed",
++ GKBD_TYPE_CONFIGURATION,
++ G_SIGNAL_RUN_LAST,
++ 0,
++ NULL, NULL,
++ g_cclosure_marshal_VOID__INT,
++ G_TYPE_NONE,
++ 1,
++ G_TYPE_INT);
++
++ g_type_class_add_private (klass, sizeof (GkbdConfigurationPrivate));
++}
++
++GkbdConfiguration *
++gkbd_configuration_get (void)
++{
++ static gpointer instance = NULL;
++
++ if (!instance) {
++ instance = g_object_new (GKBD_TYPE_CONFIGURATION, NULL);
++ g_object_add_weak_pointer (instance, &instance);
++ } else {
++ g_object_ref (instance);
++ }
++
++ return instance;
++}
++
++XklEngine *
++gkbd_configuration_get_xkl_engine (GkbdConfiguration *configuration)
++{
++ return configuration->priv->engine;
++}
++
++const char * const *
++gkbd_configuration_get_group_names (GkbdConfiguration *configuration)
++{
++ return configuration->priv->full_group_names;
++}
++
++const char * const *
++gkbd_configuration_get_short_group_names (GkbdConfiguration *configuration)
++{
++ return configuration->priv->short_group_names;
++}
+--- /dev/null
++++ b/plugins/keyboard/gkbd-configuration.h
+@@ -0,0 +1,65 @@
++/*
++ * Copyright (C) 2010 Canonical Ltd.
++ *
++ * Authors: Jan Arne Petersen
++ *
++ * Based on gkbd-status.h by Sergey V. Udaltsov
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#ifndef __GKBD_CONFIGURATION_H__
++#define __GKBD_CONFIGURATION_H__
++
++#include
++
++#include
++
++G_BEGIN_DECLS
++
++typedef struct _GkbdConfiguration GkbdConfiguration;
++typedef struct _GkbdConfigurationPrivate GkbdConfigurationPrivate;
++typedef struct _GkbdConfigurationClass GkbdConfigurationClass;
++
++#define GKBD_TYPE_CONFIGURATION (gkbd_configuration_get_type ())
++#define GKBD_CONFIGURATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GKBD_TYPE_CONFIGURATION, GkbdConfiguration))
++#define GKBD_INDCATOR_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GKBD_TYPE_CONFIGURATION, GkbdConfigurationClass))
++#define GKBD_IS_CONFIGURATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GKBD_TYPE_CONFIGURATION))
++#define GKBD_IS_CONFIGURATION_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), GKBD_TYPE_CONFIGURATION))
++#define GKBD_CONFIGURATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GKBD_TYPE_CONFIGURATION, GkbdConfigurationClass))
++
++struct _GkbdConfiguration {
++ GObject parent;
++
++ GkbdConfigurationPrivate *priv;
++};
++
++struct _GkbdConfigurationClass {
++ GObjectClass parent_class;
++};
++
++extern GType gkbd_configuration_get_type (void);
++
++extern GkbdConfiguration *gkbd_configuration_get (void);
++
++extern XklEngine *gkbd_configuration_get_xkl_engine (GkbdConfiguration *configuration);
++
++extern const char * const *gkbd_configuration_get_group_names (GkbdConfiguration *configuration);
++extern const char * const *gkbd_configuration_get_short_group_names (GkbdConfiguration *configuration);
++
++G_END_DECLS
++
++#endif
+--- a/plugins/keyboard/gsd-keyboard-xkb.c
++++ b/plugins/keyboard/gsd-keyboard-xkb.c
+@@ -31,12 +31,20 @@
+ #include
+ #include
+
++#ifndef HAVE_APPINDICATOR
+ #include
++#endif
+ #include
+ #include
++#include
+ #include
+ #include
+
++#ifdef HAVE_APPINDICATOR
++#include
++#include "gkbd-configuration.h"
++#endif
++
+ #include "gsd-xmodmap.h"
+ #include "gsd-keyboard-xkb.h"
+ #include "delayed-dialog.h"
+@@ -74,7 +82,14 @@ static const char DUPLICATE_LEDS_KEY[] =
+
+ static const char *gdm_keyboard_layout = NULL;
+
++#ifdef HAVE_APPINDICATOR
++static AppIndicator *app_indicator = NULL;
++static GkbdConfiguration *gkbd_configuration = NULL;
++static GkbdIndicatorConfig current_ind_config;
++GSList *groups_items_group = NULL;
++#else
+ static GtkStatusIcon *icon = NULL;
++#endif
+
+ static GHashTable *preview_dialogs = NULL;
+
+@@ -214,10 +229,14 @@ popup_menu_show_layout ()
+ GtkWidget *dialog;
+ XklEngine *engine = xkl_engine_get_instance (GDK_DISPLAY ());
+ XklState *xkl_state = xkl_engine_get_current_state (engine);
++#ifdef HAVE_APPINDICATOR
++ gchar **group_names = gkbd_configuration_get_group_names (gkbd_configuration);
++#else
++ gchar **group_names = gkbd_status_get_group_names ();
++#endif
+ gpointer p = g_hash_table_lookup (preview_dialogs,
+ GINT_TO_POINTER
+ (xkl_state->group));
+- gchar **group_names = gkbd_status_get_group_names ();
+
+ if (xkl_state->group < 0
+ || xkl_state->group >= g_strv_length (group_names)) {
+@@ -245,35 +264,166 @@ static void
+ popup_menu_set_group (GtkMenuItem * item, gpointer param)
+ {
+ gint group_number = GPOINTER_TO_INT (param);
++#ifdef HAVE_APPINDICATOR
++ XklEngine *engine = gkbd_configuration_get_xkl_engine (gkbd_configuration);
++ if ((item) != NULL && (!gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (item))))
++ return;
++#else
+ XklEngine *engine = gkbd_status_get_xkl_engine ();
+- XklState st;
++#endif
++ XklState *st = xkl_engine_get_current_state(engine);
+ Window cur;
+-
+- st.group = group_number;
++ st->group = group_number;
+ xkl_engine_allow_one_switch_to_secondary_group (engine);
+ cur = xkl_engine_get_current_window (engine);
+ if (cur != (Window) NULL) {
+ xkl_debug (150, "Enforcing the state %d for window %lx\n",
+- st.group, cur);
++ st->group, cur);
++#ifdef HAVE_APPINDICATOR
++ // Setting the state may trigger state_callback to be called, which will then
++ // cause popup_menu_set_group to be called again. As state_callback calls us
++ // without an item, we check that and only set the state if an item was sent
++ // in the callback, and therefore was a menu item click which did it.
++ if (item != NULL) {
++ xkl_engine_save_state (engine,
++ xkl_engine_get_current_window
++ (engine), st);
++ }
++#else
+ xkl_engine_save_state (engine,
+ xkl_engine_get_current_window
+- (engine), &st);
++ (engine), st);
++#endif
+ /* XSetInputFocus( GDK_DISPLAY(), cur, RevertToNone, CurrentTime );*/
+ } else {
+ xkl_debug (150,
+ "??? Enforcing the state %d for unknown window\n",
+- st.group);
++ st->group);
+ /* strange situation - bad things can happen */
+ }
+- xkl_engine_lock_group (engine, st.group);
++ if (item != NULL)
++ xkl_engine_lock_group (engine, st->group);
++#ifdef HAVE_APPINDICATOR
++ XklConfigRec * xklrec = xkl_config_rec_new();
++ xkl_config_rec_get_from_server (xklrec, engine);
++ XklConfigRegistry *registry = xkl_config_registry_get_instance(engine);
++
++ gkbd_keyboard_config_load_from_x_current (¤t_kbd_config, xklrec);
++ xkl_config_registry_load (registry, current_config.load_extra_items);
++
++ int g;
++
++ if (current_ind_config.show_flags) {
++ gchar *image_file = gkbd_indicator_config_get_images_file (¤t_ind_config,
++ ¤t_kbd_config,
++ st->group);
++
++
++ app_indicator_set_icon(app_indicator, image_file);
++ app_indicator_set_label(app_indicator, NULL, NULL);
++ g_free(image_file);
++ } else {
++ gchar * guide = "XXX";
++ gchar ** shortnames;
++ gchar ** longnames;
++ gchar * layout_name;
++ gchar * lname = NULL;
++ GHashTable *ln2cnt_map = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, NULL);
++
++ gkbd_desktop_config_load_group_descriptions(¤t_config, registry,
++ (const gchar **) xklrec->layouts,
++ (const gchar **) xklrec->variants,
++ &shortnames,
++ &longnames);
++
++ for (g = 0; g < g_strv_length (shortnames);g++) {
++ gpointer pcounter = NULL;
++ gchar *prev_layout_name = NULL;
++ int counter = 0;
++
++ if (g < g_strv_length (shortnames)) {
++ if (xkl_engine_get_features (engine) &
++ XKLF_MULTIPLE_LAYOUTS_SUPPORTED) {
++ gchar *longname = (gchar *) g_slist_nth_data (current_kbd_config.layouts_variants, g);
++ gchar *variant_name;
++ if (!gkbd_keyboard_config_split_items (longname, &lname, &variant_name))
++ /* just in case */
++ lname = longname;
++
++ if (shortnames != NULL) {
++ gchar *shortname = shortnames[g];
++ if (shortname != NULL && *shortname != '\0') {
++ lname = shortname;
++ }
++ }
++ } else {
++ lname = longnames[g];
++ }
++ }
++ if (lname == NULL)
++ lname = "";
++
++ /* Process layouts with repeating description */
++ if (g_hash_table_lookup_extended (ln2cnt_map, lname, (gpointer *) & prev_layout_name, &pcounter)) {
++ /* "next" same description */
++ counter = GPOINTER_TO_INT (pcounter);
++ guide = "XXX1";
++ }
++ g_hash_table_insert (ln2cnt_map, g_strdup (lname), GINT_TO_POINTER (counter+1));
++
++ if (st->group == g) {
++ if (counter > 0) {
++ gchar appendix[10] = "";
++ gint utf8length;
++ gunichar cidx;
++ /* Unicode subscript 2, 3, 4 */
++ cidx = 0x2081 + counter;
++ utf8length = g_unichar_to_utf8 (cidx, appendix);
++ appendix[utf8length] = '\0';
++ layout_name = g_strconcat (lname, appendix, NULL);
++ } else {
++ layout_name = g_strdup(lname);
++ }
++ }
++ }
++
++ // Guide of 3 wide-ish and one thin
++ app_indicator_set_label(app_indicator, layout_name, guide);
++ g_hash_table_destroy(ln2cnt_map);
++ g_free(layout_name);
++ g_strfreev(longnames);
++ g_strfreev(shortnames);
++ }
++
++ g_object_unref (G_OBJECT (xklrec));
++ g_object_unref (G_OBJECT (registry));
++#endif
+ }
+
++#ifdef HAVE_APPINDICATOR
+ static void
+-status_icon_popup_menu_cb (GtkStatusIcon * icon, guint button, guint time)
++state_callback (XklEngine * engine,
++ XklEngineStateChange changeType,
++ gint group, gboolean restore)
++{
++ if (changeType == GROUP_CHANGED)
++ popup_menu_set_group(NULL, GINT_TO_POINTER(group));
++}
++#endif
++
++static GtkMenu *
++create_status_menu (void)
+ {
+ GtkMenu *popup_menu = GTK_MENU (gtk_menu_new ());
+- GtkMenu *groups_menu = GTK_MENU (gtk_menu_new ());
+ int i = 0;
++#ifdef HAVE_APPINDICATOR
++ const char * const *current_name = gkbd_configuration_get_group_names (gkbd_configuration);
++ groups_items_group = NULL;
++ GtkWidget *item;
++ XklEngine *engine = gkbd_configuration_get_xkl_engine (gkbd_configuration);
++ int group = xkl_engine_get_current_window_group (engine);
++#else
++ GtkMenu *groups_menu = GTK_MENU (gtk_menu_new ());
+ gchar **current_name = gkbd_status_get_group_names ();
+
+ GtkWidget *item = gtk_menu_item_new_with_mnemonic (_("_Layouts"));
+@@ -293,8 +443,22 @@ status_icon_popup_menu_cb (GtkStatusIcon
+ gtk_widget_show (item);
+ g_signal_connect (item, "activate", popup_menu_show_layout, NULL);
+ gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), item);
++#endif
++
++ for (i = 0; current_name && *current_name; i++, current_name++) {
++#ifdef HAVE_APPINDICATOR
++ item = gtk_radio_menu_item_new_with_label (groups_items_group, *current_name);
++ groups_items_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (item));
+
+- for (i = 0; *current_name; i++, current_name++) {
++ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
++ i == group);
++
++ gtk_widget_show (item);
++ gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), item);
++ g_signal_connect (item, "activate",
++ G_CALLBACK (popup_menu_set_group),
++ GINT_TO_POINTER (i));
++#else
+ gchar *image_file = gkbd_status_get_image_filename (i);
+
+ if (image_file == NULL) {
+@@ -322,17 +486,66 @@ status_icon_popup_menu_cb (GtkStatusIcon
+ g_signal_connect (item, "activate",
+ G_CALLBACK (popup_menu_set_group),
+ GINT_TO_POINTER (i));
++#endif
+ }
+
++#ifdef HAVE_APPINDICATOR
++ item = gtk_separator_menu_item_new();
++ gtk_widget_show(item);
++ gtk_menu_shell_append(GTK_MENU_SHELL (popup_menu), item);
++
++ item =
++ gtk_menu_item_new_with_mnemonic (_("Keyboard _Preferences"));
++ gtk_widget_show (item);
++ g_signal_connect (item, "activate", popup_menu_launch_capplet,
++ NULL);
++ gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), item);
++
++ item = gtk_menu_item_new_with_mnemonic (_("Show Current _Layout"));
++ gtk_widget_show (item);
++ g_signal_connect (item, "activate", popup_menu_show_layout, NULL);
++ gtk_menu_shell_append (GTK_MENU_SHELL (popup_menu), item);
++#endif
++
++ return popup_menu;
++}
++
++#ifndef HAVE_APPINDICATOR
++static void
++status_icon_popup_menu_cb (GtkStatusIcon * icon, guint button, guint time)
++{
++ GtkMenu *popup_menu = create_status_menu ();
++
+ gtk_menu_popup (popup_menu, NULL, NULL,
+ gtk_status_icon_position_menu,
+ (gpointer) icon, button, time);
+ }
++#endif
+
+ static void
+ show_hide_icon ()
+ {
+ if (g_slist_length (current_kbd_config.layouts_variants) > 1) {
++#ifdef HAVE_APPINDICATOR
++ if (app_indicator == NULL) {
++ GtkMenu *popup_menu = create_status_menu ();
++
++ app_indicator = app_indicator_new ("gst-keyboard-xkb",
++ "keyboard",
++ APP_INDICATOR_CATEGORY_HARDWARE);
++ XklEngine *engine = gkbd_configuration_get_xkl_engine (gkbd_configuration);
++ int group = xkl_engine_get_current_window_group (engine);
++ popup_menu_set_group(NULL, GINT_TO_POINTER(group));
++ app_indicator_set_status (app_indicator,
++ APP_INDICATOR_STATUS_ACTIVE);
++ app_indicator_set_menu (app_indicator,
++ popup_menu);
++ } else {
++ XklEngine *engine = gkbd_configuration_get_xkl_engine (gkbd_configuration);
++ XklState *st = xkl_engine_get_current_state(engine);
++ popup_menu_set_group(NULL, GINT_TO_POINTER(st->group));
++ }
++#else
+ if (icon == NULL) {
+ GConfClient *conf_client =
+ gconf_client_get_default ();
+@@ -352,12 +565,20 @@ show_hide_icon ()
+ NULL);
+
+ }
++#endif
+ } else {
++#ifdef HAVE_APPINDICATOR
++ if (app_indicator != NULL) {
++ g_object_unref (app_indicator);
++ app_indicator = NULL;
++ }
++#else
+ if (icon != NULL) {
+ xkl_debug (150, "Destroying icon\n");
+ g_object_unref (icon);
+ icon = NULL;
+ }
++#endif
+ }
+ }
+
+@@ -561,6 +782,14 @@ apply_xkb_settings (void)
+ gkbd_keyboard_config_load_from_x_current (¤t_sys_kbd_config,
+ NULL);
+
++ gkbd_indicator_config_init (¤t_ind_config, conf_client,
++ xkl_engine);
++ gkbd_indicator_config_load_from_gconf (¤t_ind_config);
++
++ gkbd_indicator_config_load_image_filenames (¤t_ind_config,
++ ¤t_kbd_config);
++ gkbd_indicator_config_activate (¤t_ind_config);
++
+ if (!try_activating_xkb_config_if_new (¤t_sys_kbd_config)) {
+ if (filter_xkb_config ()) {
+ if (!try_activating_xkb_config_if_new
+@@ -698,6 +927,22 @@ gsd_keyboard_xkb_chk_lcl_xmm (void)
+ gsd_load_modmap_files ();
+ }
+
++#ifdef HAVE_APPINDICATOR
++/* When the configuration changed update the indicator */
++static void
++gsd_keyboard_configuration_changed (GkbdConfiguration *configuration)
++{
++ GtkMenu *popup_menu;
++
++ if (!app_indicator)
++ return;
++
++ popup_menu = create_status_menu ();
++ app_indicator_set_menu (app_indicator,
++ popup_menu);
++}
++#endif
++
+ void
+ gsd_keyboard_xkb_set_post_activation_callback (PostActivationCallback fun,
+ void *user_data)
+@@ -805,6 +1050,13 @@ gsd_keyboard_xkb_init (GConfClient * cli
+ logfile = fopen ("/tmp/gsdkx.log", "a");
+ xkl_set_log_appender (gsd_keyboard_log_appender);
+ #endif
++#ifdef HAVE_APPINDICATOR
++ gkbd_configuration = gkbd_configuration_get ();
++ g_signal_connect (gkbd_configuration, "changed",
++ G_CALLBACK (gsd_keyboard_configuration_changed), NULL);
++ g_signal_connect (gkbd_configuration, "group-changed",
++ G_CALLBACK (gsd_keyboard_configuration_changed), NULL);
++#endif
+ manager = kbd_manager;
+ gnome_settings_profile_start ("xkl_engine_get_instance");
+ xkl_engine = xkl_engine_get_instance (display);
+@@ -838,6 +1090,9 @@ gsd_keyboard_xkb_init (GConfClient * cli
+ (GConfClientNotifyFunc)
+ apply_xkb_settings);
+
++#ifdef HAVE_APPINDICATOR
++ g_signal_connect (xkl_engine, "X-state-changed", G_CALLBACK (state_callback), NULL);
++#endif
+ gdk_window_add_filter (NULL, (GdkFilterFunc)
+ gsd_keyboard_xkb_evt_filter, NULL);
+
+@@ -920,5 +1175,13 @@ gsd_keyboard_xkb_shutdown (void)
+ g_object_unref (xkl_engine);
+
+ xkl_engine = NULL;
++
++#ifdef HAVE_APPINDICATOR
++ if (gkbd_configuration) {
++ g_object_unref (gkbd_configuration);
++ gkbd_configuration = NULL;
++ }
++#endif
++
+ inited_ok = FALSE;
+ }
+--- a/plugins/keyboard/Makefile.am
++++ b/plugins/keyboard/Makefile.am
+@@ -27,6 +27,8 @@ libkeyboard_la_SOURCES = \
+ gsd-xmodmap.c \
+ delayed-dialog.h \
+ delayed-dialog.c \
++ gkbd-configuration.c \
++ gkbd-configuration.h \
+ $(NULL)
+
+ libkeyboard_la_CPPFLAGS = \
+@@ -38,6 +40,7 @@ libkeyboard_la_CPPFLAGS = \
+ libkeyboard_la_CFLAGS = \
+ $(SETTINGS_PLUGIN_CFLAGS) \
+ $(LIBGNOMEKBDUI_CFLAGS) \
++ $(APPINDICATOR_CFLAGS) \
+ $(AM_CFLAGS)
+
+ libkeyboard_la_LDFLAGS = \
+@@ -48,6 +51,7 @@ libkeyboard_la_LIBADD = \
+ $(SETTINGS_PLUGIN_LIBS) \
+ $(XF86MISC_LIBS) \
+ $(LIBGNOMEKBDUI_LIBS) \
++ $(APPINDICATOR_LIBS) \
+ $(NULL)
+
+ plugin_in_files = \
+--- a/plugins/xrandr/gsd-xrandr-manager.c
++++ b/plugins/xrandr/gsd-xrandr-manager.c
+@@ -50,6 +50,10 @@
+ #include
+ #endif
+
++#ifdef HAVE_APPINDICATOR
++#include
++#endif
++
+ #include "gnome-settings-profile.h"
+ #include "gsd-xrandr-manager.h"
+
+@@ -97,7 +101,11 @@ struct GsdXrandrManagerPrivate
+ GnomeRRScreen *rw_screen;
+ gboolean running;
+
++#ifdef HAVE_APPINDICATOR
++ AppIndicator *app_indicator;
++#else
+ GtkStatusIcon *status_icon;
++#endif
+ GtkWidget *popup_menu;
+ GnomeRRConfig *configuration;
+ GnomeRRLabeler *labeler;
+@@ -1080,17 +1088,21 @@ static void
+ error_message (GsdXrandrManager *mgr, const char *primary_text, GError *error_to_display, const char *secondary_text)
+ {
+ #ifdef HAVE_LIBNOTIFY
++#ifndef HAVE_APPINDICATOR
+ GsdXrandrManagerPrivate *priv = mgr->priv;
++#endif
+ NotifyNotification *notification;
+
+ g_assert (error_to_display == NULL || secondary_text == NULL);
+
++#ifndef HAVE_APPINDICATOR
+ if (priv->status_icon)
+ notification = notify_notification_new_with_status_icon (primary_text,
+ error_to_display ? error_to_display->message : secondary_text,
+ GSD_XRANDR_ICON_NAME,
+ priv->status_icon);
+ else
++#endif
+ notification = notify_notification_new (primary_text,
+ error_to_display ? error_to_display->message : secondary_text,
+ GSD_XRANDR_ICON_NAME,
+@@ -1358,6 +1370,11 @@ refresh_tray_icon_menu_if_active (GsdXra
+ gtk_menu_shell_cancel (GTK_MENU_SHELL (priv->popup_menu)); /* status_icon_popup_menu_selection_done_cb() will free everything */
+ status_icon_popup_menu (manager, 0, timestamp);
+ }
++#if 0
++ else {
++ status_icon_popup_menu (manager, 0, GDK_CURRENT_TIME);
++ }
++#endif
+ }
+
+ static void
+@@ -1659,6 +1676,8 @@ status_icon_popup_menu_selection_done_cb
+ priv->configuration = NULL;
+ }
+
++#ifndef HAVE_APPINDICATOR
++
+ #define OUTPUT_TITLE_ITEM_BORDER 2
+ #define OUTPUT_TITLE_ITEM_PADDING 4
+
+@@ -1736,6 +1755,8 @@ output_title_label_after_expose_event_cb
+ return FALSE;
+ }
+
++#endif
++
+ static void
+ title_item_size_allocate_cb (GtkWidget *widget, GtkAllocation *allocation, gpointer data)
+ {
+@@ -1793,6 +1814,7 @@ make_menu_item_for_output_title (GsdXran
+ gtk_label_set_markup (GTK_LABEL (label), str);
+ g_free (str);
+
++#ifndef HAVE_APPINDICATOR
+ /* Make the label explicitly black. We don't want it to follow the
+ * theme's colors, since the label is always shown against a light
+ * pastel background. See bgo#556050
+@@ -1804,6 +1826,7 @@ make_menu_item_for_output_title (GsdXran
+ gtk_misc_set_padding (GTK_MISC (label),
+ OUTPUT_TITLE_ITEM_BORDER + OUTPUT_TITLE_ITEM_PADDING,
+ OUTPUT_TITLE_ITEM_BORDER + OUTPUT_TITLE_ITEM_PADDING);
++#endif
+
+ gtk_container_add (GTK_CONTAINER (item), label);
+
+@@ -1811,10 +1834,12 @@ make_menu_item_for_output_title (GsdXran
+ * to its expose-event signal. See the comment in *** to see why need to connect
+ * to the label both 'before' and 'after'.
+ */
++#ifndef HAVE_APPINDICATOR
+ g_signal_connect (label, "expose-event",
+ G_CALLBACK (output_title_label_expose_event_cb), manager);
+ g_signal_connect_after (label, "expose-event",
+ G_CALLBACK (output_title_label_after_expose_event_cb), manager);
++#endif
+
+ g_object_set_data (G_OBJECT (label), "output", output);
+
+@@ -2056,6 +2081,13 @@ status_icon_popup_menu (GsdXrandrManager
+ struct GsdXrandrManagerPrivate *priv = manager->priv;
+ GtkWidget *item;
+
++#ifdef HAVE_APPINDICATOR
++ if (!priv->configuration)
++ priv->configuration = gnome_rr_config_new_current (priv->rw_screen);
++
++ if (priv->popup_menu)
++ gtk_widget_destroy (priv->popup_menu);
++#else
+ g_assert (priv->configuration == NULL);
+ priv->configuration = gnome_rr_config_new_current (priv->rw_screen);
+
+@@ -2063,6 +2095,7 @@ status_icon_popup_menu (GsdXrandrManager
+ priv->labeler = gnome_rr_labeler_new (priv->configuration);
+
+ g_assert (priv->popup_menu == NULL);
++#endif
+ priv->popup_menu = gtk_menu_new ();
+
+ add_menu_items_for_outputs (manager);
+@@ -2077,14 +2110,20 @@ status_icon_popup_menu (GsdXrandrManager
+ gtk_widget_show (item);
+ gtk_menu_shell_append (GTK_MENU_SHELL (priv->popup_menu), item);
+
++#ifdef HAVE_APPINDICATOR
++ app_indicator_set_menu (priv->app_indicator,
++ GTK_MENU (priv->popup_menu));
++#else
+ g_signal_connect (priv->popup_menu, "selection-done",
+ G_CALLBACK (status_icon_popup_menu_selection_done_cb), manager);
+
+ gtk_menu_popup (GTK_MENU (priv->popup_menu), NULL, NULL,
+ gtk_status_icon_position_menu,
+ priv->status_icon, button, timestamp);
++#endif
+ }
+
++#ifndef HAVE_APPINDICATOR
+ static void
+ status_icon_activate_cb (GtkStatusIcon *status_icon, gpointer data)
+ {
+@@ -2101,12 +2140,23 @@ status_icon_popup_menu_cb (GtkStatusIcon
+
+ status_icon_popup_menu (manager, button, timestamp);
+ }
++#endif
+
+ static void
+ status_icon_start (GsdXrandrManager *manager)
+ {
+ struct GsdXrandrManagerPrivate *priv = manager->priv;
+
++#ifdef HAVE_APPINDICATOR
++ if (!priv->app_indicator) {
++ priv->app_indicator = app_indicator_new ("gsd-xrandr",
++ GSD_XRANDR_ICON_NAME,
++ APP_INDICATOR_CATEGORY_HARDWARE);
++ app_indicator_set_status (priv->app_indicator,
++ APP_INDICATOR_STATUS_ACTIVE);
++ status_icon_popup_menu (manager, 0, 0);
++ }
++#else
+ /* Ideally, we should detect if we are on a tablet and only display
+ * the icon in that case.
+ */
+@@ -2119,6 +2169,7 @@ status_icon_start (GsdXrandrManager *man
+ g_signal_connect (priv->status_icon, "popup-menu",
+ G_CALLBACK (status_icon_popup_menu_cb), manager);
+ }
++#endif
+ }
+
+ static void
+@@ -2126,6 +2177,14 @@ status_icon_stop (GsdXrandrManager *mana
+ {
+ struct GsdXrandrManagerPrivate *priv = manager->priv;
+
++#ifdef HAVE_APPINDICATOR
++ if (priv->app_indicator) {
++ app_indicator_set_status (priv->app_indicator,
++ APP_INDICATOR_STATUS_PASSIVE);
++ g_object_unref (priv->app_indicator);
++ priv->app_indicator = NULL;
++ }
++#else
+ if (priv->status_icon) {
+ g_signal_handlers_disconnect_by_func (
+ priv->status_icon, G_CALLBACK (status_icon_activate_cb), manager);
+@@ -2138,6 +2197,7 @@ status_icon_stop (GsdXrandrManager *mana
+ g_object_unref (priv->status_icon);
+ priv->status_icon = NULL;
+ }
++#endif
+ }
+
+ static void
+--- a/plugins/xrandr/Makefile.am
++++ b/plugins/xrandr/Makefile.am
+@@ -55,6 +55,7 @@ libxrandr_la_CPPFLAGS = \
+ libxrandr_la_CFLAGS = \
+ $(SETTINGS_PLUGIN_CFLAGS) \
+ $(LIBNOTIFY_CFLAGS) \
++ $(APPINDICATOR_CFLAGS) \
+ $(AM_CFLAGS)
+
+ libxrandr_la_LDFLAGS = \
+@@ -62,7 +63,8 @@ libxrandr_la_LDFLAGS = \
+
+ libxrandr_la_LIBADD = \
+ $(SETTINGS_PLUGIN_LIBS) \
+- $(LIBNOTIFY_LIBS)
++ $(LIBNOTIFY_LIBS) \
++ $(APPINDICATOR_LIBS)
+
+ plugin_in_files = \
+ xrandr.gnome-settings-plugin.in
--- gnome-settings-daemon-2.32.1.orig/debian/patches/16_use_synchronous_notifications.patch
+++ gnome-settings-daemon-2.32.1/debian/patches/16_use_synchronous_notifications.patch
@@ -0,0 +1,632 @@
+Description: Use synchronous notifications when they are supported
+Author: ?
+
+Index: gnome-settings-daemon-2.30.0/plugins/common/gsd-osd-notification.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ gnome-settings-daemon-2.30.0/plugins/common/gsd-osd-notification.c 2010-04-23 17:05:08.862133020 +0100
+@@ -0,0 +1,296 @@
++/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8; tab-width: 8 -*- */
++/*
++ * gsd-osd-notification.c
++ * Copyright (C) 2010 Chris Coulson
++ * Copyright (C) 2009 Canonical Ltd
++ *
++ * gsd-osd-notification.c 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 3 of the License, or
++ * (at your option) any later version.
++ *
++ * gsd-osd-notification.c 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, see .
++ */
++
++#include
++#include "gsd-osd-notification.h"
++
++struct _GsdOsdNotificationPrivate
++{
++ NotifyNotification *notification;
++ char **icon_names;
++ char *hint;
++ guint icon_array_size;
++};
++
++#define GSD_OSD_NOTIFICATION_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_OSD_NOTIFICATION, GsdOsdNotificationPrivate))
++
++enum
++{
++ PROP_0,
++ PROP_ICON_NAMES,
++ PROP_HINT
++};
++
++static NotifyNotification *icon_only_notification = NULL;
++static gulong handler_id;
++
++#define NOTIFY_CAP_PRIVATE_SYNCHRONOUS "x-canonical-private-synchronous"
++#define NOTIFY_CAP_PRIVATE_ICON_ONLY "x-canonical-private-icon-only"
++#define NOTIFY_HINT_TRUE "true"
++
++G_DEFINE_TYPE (GsdOsdNotification, gsd_osd_notification, G_TYPE_OBJECT);
++
++static const char*
++_calculate_icon (GsdOsdNotification *notifier, guint value, gboolean muted)
++{
++ guint s;
++
++ s = (notifier->priv->icon_array_size -1) * value / 100 + 1;
++ s = MAX (s, 1);
++ s = MIN (s, notifier->priv->icon_array_size -1);
++ if (value <= 0)
++ s = 0;
++
++ return muted ? notifier->priv->icon_names[0] : notifier->priv->icon_names[s];
++}
++
++void
++gsd_osd_notification_set_icon_array (GsdOsdNotification *notifier, const char **icon_names)
++{
++ g_return_if_fail (GSD_IS_OSD_NOTIFICATION (notifier));
++
++ g_strfreev (notifier->priv->icon_names);
++ notifier->priv->icon_names = g_strdupv ((gchar **) icon_names);
++
++ notifier->priv->icon_array_size = g_strv_length ((gchar **) icon_names);
++}
++
++void
++gsd_osd_notification_set_hint (GsdOsdNotification *notifier, const char *hint)
++{
++ g_return_if_fail (GSD_IS_OSD_NOTIFICATION (notifier));
++
++ g_free (notifier->priv->hint);
++ notifier->priv->hint = g_strdup (hint);
++}
++
++gboolean
++gsd_osd_notification_is_supported (void)
++{
++ GList *caps;
++ gboolean has_cap;
++
++ caps = notify_get_server_caps ();
++ has_cap = (g_list_find_custom (caps, NOTIFY_CAP_PRIVATE_SYNCHRONOUS, (GCompareFunc) g_strcmp0) != NULL);
++ g_list_foreach (caps, (GFunc) g_free, NULL);
++ g_list_free (caps);
++
++ return has_cap;
++}
++
++static void
++notification_closed_cb (NotifyNotification *notification,
++ gpointer data)
++{
++ g_signal_handler_disconnect (icon_only_notification, handler_id);
++ g_object_unref (icon_only_notification);
++ icon_only_notification = NULL;
++}
++
++gboolean
++gsd_osd_notification_show_icon_only (const char *icon, const char *hint)
++{
++ g_return_val_if_fail (icon != NULL, FALSE);
++ g_return_val_if_fail (hint != NULL, FALSE);
++
++ if (!gsd_osd_notification_is_supported ())
++ return FALSE;
++
++ if (icon_only_notification == NULL) {
++ icon_only_notification = notify_notification_new (" ", "", icon, NULL);
++ notify_notification_set_hint_string (icon_only_notification, NOTIFY_CAP_PRIVATE_SYNCHRONOUS, hint);
++ notify_notification_set_hint_string (icon_only_notification, NOTIFY_CAP_PRIVATE_ICON_ONLY, NOTIFY_HINT_TRUE);
++ handler_id = g_signal_connect (icon_only_notification, "closed", G_CALLBACK (notification_closed_cb), NULL);
++ } else {
++ notify_notification_set_hint_string (icon_only_notification, NOTIFY_CAP_PRIVATE_SYNCHRONOUS, hint);
++ notify_notification_update (icon_only_notification, " ", "", icon);
++ }
++
++ if (!notify_notification_show (icon_only_notification, NULL)) {
++ g_signal_handler_disconnect (icon_only_notification, handler_id);
++ g_object_unref (icon_only_notification);
++ icon_only_notification = NULL;
++ return FALSE;
++ }
++
++ return TRUE;
++}
++
++gboolean
++gsd_osd_notification_show_value (GsdOsdNotification *notifier, gint value, gboolean muted)
++{
++ const char *icon;
++
++ g_return_val_if_fail (GSD_IS_OSD_NOTIFICATION (notifier), FALSE);
++ g_return_val_if_fail (notifier->priv->icon_names != NULL, FALSE);
++ g_return_val_if_fail (notifier->priv->hint != NULL, FALSE);
++
++ if (!gsd_osd_notification_is_supported ())
++ return FALSE;
++
++ if (notifier->priv->notification == NULL) {
++ notifier->priv->notification = notify_notification_new (" ", "", NULL, NULL);
++ notify_notification_set_hint_string (notifier->priv->notification, NOTIFY_CAP_PRIVATE_SYNCHRONOUS, notifier->priv->hint);
++}
++ if (notifier->priv->notification != NULL) {
++ value = MIN (value, 101);
++ value = MAX (value, -1);
++ icon = _calculate_icon (notifier, value, muted);
++ notify_notification_set_hint_int32(notifier->priv->notification, "value", (muted && value > 0) ? 0 : value);
++ notify_notification_update (notifier->priv->notification, " ", "", icon);
++ } else {
++ return FALSE;
++ }
++
++ if (!notify_notification_show (notifier->priv->notification, NULL))
++ return FALSE;
++
++ return TRUE;
++}
++
++gboolean
++gsd_osd_notification_show_overshoot (GsdOsdNotification *notifier, GsdOsdNotifierOvershootType type)
++{
++ gint value;
++ gboolean muted;
++
++ g_return_val_if_fail (type == GSD_OSD_NOTIFICATION_UNDERSHOOT || type == GSD_OSD_NOTIFICATION_OVERSHOOT, FALSE);
++
++ switch (type)
++ {
++ case GSD_OSD_NOTIFICATION_UNDERSHOOT:
++ value = -1;
++ muted = TRUE;
++ break;
++ case GSD_OSD_NOTIFICATION_OVERSHOOT:
++ value = 101;
++ muted = FALSE;
++ break;
++ default:
++ g_assert_not_reached ();
++ break;
++ }
++
++ return gsd_osd_notification_show_value (notifier, value, muted);
++}
++
++GsdOsdNotification*
++gsd_osd_notification_new (const char **icon_names, const char *hint)
++{
++ return (GsdOsdNotification *) g_object_new (GSD_TYPE_OSD_NOTIFICATION,
++ "icon-names", icon_names,
++ "hint", hint,
++ NULL);
++}
++
++static void
++gsd_osd_notification_init (GsdOsdNotification *object)
++{
++ object->priv = GSD_OSD_NOTIFICATION_PRIVATE (object);
++
++ if (!notify_is_initted ())
++ notify_init (g_get_application_name ());
++
++ object->priv->hint = NULL;
++ object->priv->icon_names = NULL;
++ object->priv->notification = NULL;
++}
++
++static void
++gsd_osd_notification_finalize (GObject *object)
++{
++ GsdOsdNotification *notifier = GSD_OSD_NOTIFICATION (object);
++
++ g_strfreev (notifier->priv->icon_names);
++ g_free (notifier->priv->hint);
++
++ if (notifier->priv->notification)
++ g_object_unref (notifier->priv->notification);
++
++ G_OBJECT_CLASS (gsd_osd_notification_parent_class)->finalize (object);
++}
++
++static void
++gsd_osd_notification_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
++{
++ g_return_if_fail (GSD_IS_OSD_NOTIFICATION (object));
++ GsdOsdNotification *notifier = GSD_OSD_NOTIFICATION (object);
++
++ switch (prop_id)
++ {
++ case PROP_ICON_NAMES:
++ gsd_osd_notification_set_icon_array (notifier, (const char**) g_value_get_boxed (value));
++ break;
++ case PROP_HINT:
++ gsd_osd_notification_set_hint (notifier, g_value_get_string (value));
++ break;
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
++ break;
++ }
++}
++
++static void
++gsd_osd_notification_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
++{
++ g_return_if_fail (GSD_IS_OSD_NOTIFICATION (object));
++ GsdOsdNotification *notifier = GSD_OSD_NOTIFICATION (object);
++
++ switch (prop_id)
++ {
++ case PROP_ICON_NAMES:
++ g_value_set_boxed (value, notifier->priv->icon_names);
++ break;
++ case PROP_HINT:
++ g_value_set_string (value, notifier->priv->hint);
++ break;
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
++ break;
++ }
++}
++
++static void
++gsd_osd_notification_class_init (GsdOsdNotificationClass *klass)
++{
++ GObjectClass* object_class = G_OBJECT_CLASS (klass);
++
++ object_class->finalize = gsd_osd_notification_finalize;
++ object_class->set_property = gsd_osd_notification_set_property;
++ object_class->get_property = gsd_osd_notification_get_property;
++
++ g_object_class_install_property (object_class,
++ PROP_ICON_NAMES,
++ g_param_spec_boxed ("icon-names",
++ "Icon name array",
++ "An array of icon names for the notification",
++ G_TYPE_STRV,
++ G_PARAM_WRITABLE | G_PARAM_CONSTRUCT));
++
++ g_object_class_install_property (object_class,
++ PROP_HINT,
++ g_param_spec_string ("hint",
++ "Notification hint",
++ "Hint for the notification",
++ NULL,
++ G_PARAM_WRITABLE | G_PARAM_CONSTRUCT));
++
++ g_type_class_add_private (klass, sizeof (GsdOsdNotificationPrivate));
++}
+Index: gnome-settings-daemon-2.30.0/plugins/common/gsd-osd-notification.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ gnome-settings-daemon-2.30.0/plugins/common/gsd-osd-notification.h 2010-04-23 17:05:08.862133020 +0100
+@@ -0,0 +1,75 @@
++/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8; tab-width: 8 -*- */
++/*
++ * gsd-osd-notification.c
++ * Copyright (C) 2010 Chris Coulson
++ * Copyright (C) 2009 Canonical Ltd
++ *
++ * gsd-osd-notification.c 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 3 of the License, or
++ * (at your option) any later version.
++ *
++ * gsd-osd-notification.c 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, see .
++ */
++
++#ifndef _GSD_OSD_NOTIFICATION_H_
++#define _GSD_OSD_NOTIFICATION_H_
++
++#include
++
++G_BEGIN_DECLS
++
++#define GSD_TYPE_OSD_NOTIFICATION (gsd_osd_notification_get_type ())
++#define GSD_OSD_NOTIFICATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSD_TYPE_OSD_NOTIFICATION, GsdOsdNotification))
++#define GSD_OSD_NOTIFICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GSD_TYPE_OSD_NOTIFICATION, GsdOsdNotificationClass))
++#define GSD_IS_OSD_NOTIFICATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSD_TYPE_OSD_NOTIFICATION))
++#define GSD_IS_OSD_NOTIFICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSD_TYPE_OSD_NOTIFICATION))
++#define GSD_OSD_NOTIFICATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GSD_TYPE_OSD_NOTIFICATION, GsdOsdNotificationClass))
++
++typedef struct _GsdOsdNotificationClass GsdOsdNotificationClass;
++typedef struct _GsdOsdNotification GsdOsdNotification;
++typedef struct _GsdOsdNotificationPrivate GsdOsdNotificationPrivate;
++
++struct _GsdOsdNotificationClass
++{
++ GObjectClass parent_class;
++};
++
++struct _GsdOsdNotification
++{
++ GObject parent_instance;
++
++ GsdOsdNotificationPrivate *priv;
++};
++
++typedef enum {
++ GSD_OSD_NOTIFICATION_NO_OVERSHOOT = 0,
++ GSD_OSD_NOTIFICATION_UNDERSHOOT,
++ GSD_OSD_NOTIFICATION_OVERSHOOT,
++} GsdOsdNotifierOvershootType;
++
++GType gsd_osd_notification_get_type (void) G_GNUC_CONST;
++GsdOsdNotification* gsd_osd_notification_new (const char **icon_names,
++ const char *hint);
++void gsd_osd_notification_set_icon_array (GsdOsdNotification *notifier,
++ const char **icon_names);
++void gsd_osd_notification_set_hint (GsdOsdNotification *notifier,
++ const char *hint);
++gboolean gsd_osd_notification_is_supported (void);
++gboolean gsd_osd_notification_show_value (GsdOsdNotification *notifier,
++ gint value,
++ gboolean muted);
++gboolean gsd_osd_notification_show_overshoot (GsdOsdNotification *notifier,
++ GsdOsdNotifierOvershootType type);
++gboolean gsd_osd_notification_show_icon_only (const char *icon,
++ const char *hint);
++
++G_END_DECLS
++
++#endif /* _GSD_OSD_NOTIFICATION_H_ */
+Index: gnome-settings-daemon-2.30.0/plugins/media-keys/gsd-media-keys-manager.c
+===================================================================
+--- gnome-settings-daemon-2.30.0.orig/plugins/media-keys/gsd-media-keys-manager.c 2010-03-29 09:15:04.000000000 +0100
++++ gnome-settings-daemon-2.30.0/plugins/media-keys/gsd-media-keys-manager.c 2010-04-23 17:05:08.862133020 +0100
+@@ -49,6 +49,7 @@
+ #include "eggaccelerators.h"
+ #include "acme.h"
+ #include "gsd-media-keys-window.h"
++#include "gsd-osd-notification.h"
+
+ #ifdef HAVE_PULSE
+ #include
+@@ -82,6 +83,7 @@
+ GtkWidget *dialog;
+ GConfClient *conf_client;
+ GVolumeMonitor *volume_monitor;
++ GsdOsdNotification *notifier;
+
+ /* Multihead stuff */
+ GdkScreen *current_screen;
+@@ -108,6 +110,13 @@
+
+ static gpointer manager_object = NULL;
+
++static const char *volume_icons[] = {
++ "notification-audio-volume-muted",
++ "notification-audio-volume-low",
++ "notification-audio-volume-medium",
++ "notification-audio-volume-high",
++ NULL
++};
+
+ static void
+ init_screens (GsdMediaKeysManager *manager)
+@@ -612,11 +621,13 @@
+ }
+
+ /* Show the dialogue */
+- dialog_init (manager);
+- gsd_media_keys_window_set_action_custom (GSD_MEDIA_KEYS_WINDOW (manager->priv->dialog),
+- "media-eject",
+- FALSE);
+- dialog_show (manager);
++ if (!gsd_osd_notification_show_icon_only ("notification-device-eject", "Eject")) {
++ dialog_init (manager);
++ gsd_media_keys_window_set_action_custom (GSD_MEDIA_KEYS_WINDOW (manager->priv->dialog),
++ "media-eject",
++ FALSE);
++ dialog_show (manager);
++ }
+
+ /* Clean up the drive selection and exit if no suitable
+ * drives are found */
+@@ -641,23 +652,44 @@
+ GConfClient *client = manager->priv->conf_client;
+ gboolean state = gconf_client_get_bool (client, TOUCHPAD_ENABLED_KEY, NULL);
+
+- dialog_init (manager);
+- gsd_media_keys_window_set_action_custom (GSD_MEDIA_KEYS_WINDOW (manager->priv->dialog),
+- (!state) ? "touchpad-enabled" : "touchpad-disabled",
+- FALSE);
+- dialog_show (manager);
++ if (!gsd_osd_notification_show_icon_only ((!state) ? "touchpad-enabled" : "touchpad-disabled", "Touchpad")) {
++ dialog_init (manager);
++ gsd_media_keys_window_set_action_custom (GSD_MEDIA_KEYS_WINDOW (manager->priv->dialog),
++ (!state) ? "touchpad-enabled" : "touchpad-disabled",
++ FALSE);
++ dialog_show (manager);
++ }
+
+ gconf_client_set_bool (client, TOUCHPAD_ENABLED_KEY, !state, NULL);
+ }
+
+ #ifdef HAVE_PULSE
++play_volume_event_sound (GtkWidget *widget)
++{
++ ca_gtk_play_for_widget (widget, 0,
++ CA_PROP_EVENT_ID, "audio-volume-change",
++ CA_PROP_EVENT_DESCRIPTION, "volume changed hrough key press",
++ CA_PROP_APPLICATION_ID, "org.gnome.VolumeControl",
++ NULL);
++}
++
+ static void
+ update_dialog (GsdMediaKeysManager *manager,
+ guint vol,
+ gboolean muted,
+- gboolean sound_changed)
++ gboolean sound_changed,
++ GsdOsdNotifierOvershootType overshoot)
+ {
++ GtkWidget *window;
++
+ vol = (int) (100 * (double) vol / PA_VOLUME_NORM);
++ if (overshoot != GSD_OSD_NOTIFICATION_NO_OVERSHOOT) {
++ if (gsd_osd_notification_show_overshoot (manager->priv->notifier, overshoot))
++ goto done;
++ } else {
++ if (gsd_osd_notification_show_value (manager->priv->notifier, vol, muted))
++ goto done;
++ }
+ vol = CLAMP (vol, 0, 100);
+
+ dialog_init (manager);
+@@ -668,12 +700,18 @@
+ GSD_MEDIA_KEYS_WINDOW_ACTION_VOLUME);
+ dialog_show (manager);
+
+- if (sound_changed != FALSE && muted == FALSE)
+- ca_gtk_play_for_widget (manager->priv->dialog, 0,
+- CA_PROP_EVENT_ID, "audio-volume-change",
+- CA_PROP_EVENT_DESCRIPTION, "volume changed through key press",
+- CA_PROP_APPLICATION_ID, "org.gnome.VolumeControl",
+- NULL);
++done:
++ if (sound_changed != FALSE && muted == FALSE) {
++ if (manager->priv->dialog == NULL) {
++ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
++ gtk_window_set_screen (GTK_WINDOW (window), manager->priv->current_screen);
++ gtk_widget_realize (window);
++ play_volume_event_sound (window);
++ gtk_widget_destroy (window);
++ } else {
++ play_volume_event_sound (manager->priv->dialog);
++ }
++ }
+ }
+
+ static void
+@@ -683,6 +721,7 @@
+ gboolean muted;
+ guint vol, norm_vol_step;
+ int vol_step;
++ GsdOsdNotifierOvershootType overshoot = GSD_OSD_NOTIFICATION_NO_OVERSHOOT;
+ gboolean sound_changed;
+
+ if (manager->priv->stream == NULL)
+@@ -722,7 +761,10 @@
+ if (gvc_mixer_stream_set_volume (manager->priv->stream, vol) != FALSE) {
+ gvc_mixer_stream_push_volume (manager->priv->stream);
+ sound_changed = TRUE;
++ gvc_mixer_stream_push_volume (manager->priv->stream);
+ }
++ } else {
++ overshoot = GSD_OSD_NOTIFICATION_UNDERSHOOT;
+ }
+ break;
+ case VOLUME_UP_KEY:
+@@ -750,12 +792,14 @@
+ gvc_mixer_stream_push_volume (manager->priv->stream);
+ sound_changed = TRUE;
+ }
++ } else {
++ overshoot = GSD_OSD_NOTIFICATION_OVERSHOOT;
+ }
+ }
+ break;
+ }
+
+- update_dialog (manager, vol, muted, sound_changed);
++ update_dialog (manager, vol, muted, sound_changed, overshoot);
+ }
+
+ static void
+@@ -900,8 +944,11 @@
+
+ static gboolean
+ do_multimedia_player_action (GsdMediaKeysManager *manager,
++ const char *icon,
+ const char *key)
+ {
++ if (icon != NULL)
++ gsd_osd_notification_show_icon_only (icon, key);
+ return gsd_media_player_key_pressed (manager, key);
+ }
+
+@@ -972,19 +1019,19 @@
+ execute (manager, "gcalctool", FALSE, FALSE);
+ break;
+ case PLAY_KEY:
+- return do_multimedia_player_action (manager, "Play");
++ return do_multimedia_player_action (manager, NULL, "Play");
+ break;
+ case PAUSE_KEY:
+- return do_multimedia_player_action (manager, "Pause");
++ return do_multimedia_player_action (manager, NULL, "Pause");
+ break;
+ case STOP_KEY:
+- return do_multimedia_player_action (manager, "Stop");
++ return do_multimedia_player_action (manager, NULL, "Stop");
+ break;
+ case PREVIOUS_KEY:
+- return do_multimedia_player_action (manager, "Previous");
++ return do_multimedia_player_action (manager, NULL, "Previous");
+ break;
+ case NEXT_KEY:
+- return do_multimedia_player_action (manager, "Next");
++ return do_multimedia_player_action (manager, NULL, "Next");
+ break;
+ default:
+ g_assert_not_reached ();
+@@ -1121,6 +1168,8 @@
+
+ gvc_mixer_control_open (manager->priv->volume);
+
++ manager->priv->notifier = gsd_osd_notification_new (volume_icons, "volume");
++
+ gnome_settings_profile_end ("gvc_mixer_control_new");
+ #endif /* HAVE_PULSE */
+ g_idle_add ((GSourceFunc) start_media_keys_idle_cb, manager);
+@@ -1218,6 +1267,9 @@
+ }
+ g_list_free (priv->media_players);
+ priv->media_players = NULL;
++
++ if (manager->priv->notifier != NULL)
++ g_object_unref (manager->priv->notifier);
+ }
+
+ static void
+Index: gnome-settings-daemon-2.30.0/plugins/common/Makefile.am
+===================================================================
+--- gnome-settings-daemon-2.30.0.orig/plugins/common/Makefile.am 2010-03-10 11:59:38.000000000 +0000
++++ gnome-settings-daemon-2.30.0/plugins/common/Makefile.am 2010-04-23 17:10:43.209632216 +0100
+@@ -7,17 +7,21 @@
+ gsd-keygrab.c \
+ gsd-keygrab.h \
+ gsd-osd-window.c \
+- gsd-osd-window.h
++ gsd-osd-window.h \
++ gsd-osd-notification.c \
++ gsd-osd-notification.h
+
+ libcommon_la_CPPFLAGS = \
+ $(AM_CPPFLAGS)
+
+ libcommon_la_CFLAGS = \
+ $(SETTINGS_PLUGIN_CFLAGS) \
++ $(LIBNOTIFY_CFLAGS) \
+ $(AM_CFLAGS)
+
+ libcommon_la_LDFLAGS = \
+ $(GSD_PLUGIN_LDFLAGS) $(X11_LIBS)
+
+ libcommon_la_LIBADD = \
+- $(SETTINGS_PLUGIN_LIBS)
++ $(SETTINGS_PLUGIN_LIBS) \
++ $(LIBNOTIFY_LIBS)
--- gnome-settings-daemon-2.32.1.orig/debian/patches/series
+++ gnome-settings-daemon-2.32.1/debian/patches/series
@@ -0,0 +1,13 @@
+01_xrdb.patch
+02_fix_randr.patch
+02_missing_libs.patch
+03_maintainer_mode.patch
+05_disable_corner_tapping.patch
+06_use_application_indicator.patch
+07_dont_display_autostart.patch
+12_monitor_network_fs.patch
+16_use_synchronous_notifications.patch
+30_pkgconfig-path.patch
+40_xres_lcddefault.patch
+91_update_gvc_source.patch
+
--- gnome-settings-daemon-2.32.1.orig/debian/patches/02_missing_libs.patch
+++ gnome-settings-daemon-2.32.1/debian/patches/02_missing_libs.patch
@@ -0,0 +1,13 @@
+Index: gnome-settings-daemon-2.30.1/configure.ac
+===================================================================
+--- gnome-settings-daemon-2.30.1.orig/configure.ac 2010-04-26 14:19:03.000000000 +0200
++++ gnome-settings-daemon-2.30.1/configure.ac 2010-04-27 19:30:51.998031911 +0200
+@@ -69,6 +69,8 @@ PKG_CHECK_MODULES(SETTINGS_PLUGIN,
+ gnome-desktop-2.0 >= $GNOME_DESKTOP_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
+ dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
++ xext
++ x11
+ )
+
+ GSD_PLUGIN_LDFLAGS="-export_dynamic -module -avoid-version -no-undefined"
--- gnome-settings-daemon-2.32.1.orig/debian/patches/30_pkgconfig-path.patch
+++ gnome-settings-daemon-2.32.1/debian/patches/30_pkgconfig-path.patch
@@ -0,0 +1,12 @@
+Index: gnome-settings-daemon-2.31.91/data/gnome-settings-daemon.pc.in
+===================================================================
+--- gnome-settings-daemon-2.31.91.orig/data/gnome-settings-daemon.pc.in 2010-09-01 19:01:44.722616999 +1000
++++ gnome-settings-daemon-2.31.91/data/gnome-settings-daemon.pc.in 2010-09-01 19:01:48.902617000 +1000
+@@ -4,6 +4,7 @@
+ includedir=@includedir@
+ libexecdir=@libexecdir@
+ plugindir=${libdir}/gnome-settings-daemon-2.0
++binary=${libexecdir}/gnome-settings-daemon
+
+ Name: gnome-settings-daemon
+ Description: Utility library for accessing gnome-settings-daemon over DBUS
--- gnome-settings-daemon-2.32.1.orig/debian/patches/12_monitor_network_fs.patch
+++ gnome-settings-daemon-2.32.1/debian/patches/12_monitor_network_fs.patch
@@ -0,0 +1,42 @@
+Debian #563592
+GNOME #606421
+
+Index: gnome-settings-daemon-2.31.91/plugins/housekeeping/gsd-disk-space.c
+===================================================================
+--- gnome-settings-daemon-2.31.91.orig/plugins/housekeeping/gsd-disk-space.c 2010-06-22 18:47:55.000000000 +1000
++++ gnome-settings-daemon-2.31.91/plugins/housekeeping/gsd-disk-space.c 2010-09-01 19:01:09.452617000 +1000
+@@ -306,10 +306,13 @@
+ * expose this in a way that allows it to be used for this
+ * purpose
+ */
++
++ /* We also ignore network filesystems. */
+
+ const gchar *ignore_fs[] = {
+ "auto",
+ "autofs",
++ "autofs4",
+ "devfs",
+ "devpts",
+ "ecryptfs",
+@@ -326,6 +329,20 @@
+ "nfsd",
+ "rpc_pipefs",
+ "zfs",
++
++ "adfs",
++ "afs",
++ "cifs",
++ "cxfs",
++ "gfs",
++ "gfs2",
++ "lustre",
++ "lustre_lite",
++ "ncpfs",
++ "nfs",
++ "nfs4",
++ "ocfs2",
++ "smbfs",
+ NULL
+ };
+ const gchar *ignore_devices[] = {