diff options
6 files changed, 1136 insertions, 1 deletions
diff --git a/gnome-base/gnome-settings-daemon/ChangeLog b/gnome-base/gnome-settings-daemon/ChangeLog index 8ac3bb0705b4..d2b3c360417f 100644 --- a/gnome-base/gnome-settings-daemon/ChangeLog +++ b/gnome-base/gnome-settings-daemon/ChangeLog @@ -1,6 +1,16 @@ # ChangeLog for gnome-base/gnome-settings-daemon # Copyright 1999-2010 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/gnome-base/gnome-settings-daemon/ChangeLog,v 1.47 2010/06/04 20:29:56 maekke Exp $ +# $Header: /var/cvsroot/gentoo-x86/gnome-base/gnome-settings-daemon/ChangeLog,v 1.48 2010/06/14 12:08:28 pacho Exp $ + +*gnome-settings-daemon-2.30.1-r1 (14 Jun 2010) + + 14 Jun 2010; Pacho Ramos <pacho@gentoo.org> + +files/gnome-settings-daemon-2.30.0-gst-vol-control-support.patch, + +gnome-settings-daemon-2.30.1-r1.ebuild, + +files/gnome-settings-daemon-2.30.1-XF86Display.patch, + +files/gnome-settings-daemon-2.30.1-baobob-check.patch, + +files/gnome-settings-daemon-2.30.1-osd-icons.patch: + Add new version for Gnome 2.30. 04 Jun 2010; Markus Meier <maekke@gentoo.org> gnome-settings-daemon-2.28.2.ebuild: diff --git a/gnome-base/gnome-settings-daemon/files/gnome-settings-daemon-2.30.0-gst-vol-control-support.patch b/gnome-base/gnome-settings-daemon/files/gnome-settings-daemon-2.30.0-gst-vol-control-support.patch new file mode 100644 index 000000000000..57bb63393e16 --- /dev/null +++ b/gnome-base/gnome-settings-daemon/files/gnome-settings-daemon-2.30.0-gst-vol-control-support.patch @@ -0,0 +1,856 @@ +From 32a79f1b04c352dc9b9c28c4bdd3d772eeff974d Mon Sep 17 00:00:00 2001 +From: Priit Laes <plaes@plaes.org> +Date: Wed, 31 Mar 2010 20:53:05 +0300 +Subject: [PATCH] GStreamer support in the volume applet; powered by the Gentoo GNOME team. + +https://bugzilla.gnome.org/show_bug.cgi?id=571145 +--- + configure.ac | 43 ++ + plugins/media-keys/Makefile.am | 15 +- + plugins/media-keys/cut-n-paste/Makefile.am | 34 ++- + .../cut-n-paste/gvc-gstreamer-acme-vol.c | 402 ++++++++++++++++++++ + .../cut-n-paste/gvc-gstreamer-acme-vol.h | 56 +++ + plugins/media-keys/gsd-media-keys-manager.c | 64 +++- + 6 files changed, 589 insertions(+), 25 deletions(-) + create mode 100644 plugins/media-keys/cut-n-paste/gvc-gstreamer-acme-vol.c + create mode 100644 plugins/media-keys/cut-n-paste/gvc-gstreamer-acme-vol.h + +diff --git a/configure.ac b/configure.ac +index 92f20c8..723a0cf 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -251,6 +251,48 @@ AM_CONDITIONAL(HAVE_PULSE, test "x$have_pulse" = "xtrue") + AC_SUBST(PULSE_CFLAGS) + AC_SUBST(PULSE_LIBS) + ++dnl ============================================== ++dnl GStreamer section ++dnl ============================================== ++GST_MAJORMINOR=auto ++ ++AC_ARG_ENABLE(gstreamer, ++AC_HELP_STRING([--enable-gstreamer],[use gstreamer if available (and optionally specify a version)]), ++[case "${enableval}" in ++ yes) ENABLE_GSTREAMER=yes ;; ++ 0.10) ENABLE_GSTREAMER=yes && GST_MAJORMINOR=0.10 ;; ++ no) ENABLE_GSTREAMER=no ;; ++ *) AC_MSG_ERROR([ ++ *** Bad value ${enableval} for --enable-gstreamer ++ *** Please use one of the following: ++ *** --enable-gstreamer=0.10 ++ ]) ;; ++esac], ++[ENABLE_GSTREAMER=yes]) dnl Default value ++ ++have_gstreamer=no ++if test "x$ENABLE_GSTREAMER" = "xyes"; then ++ GST_REQS=0.10.1.2 ++ PKGS="gstreamer-0.10 >= $GST_REQS gstreamer-plugins-base-0.10 >= $GST_REQS" ++ ++ PKG_CHECK_MODULES(GST, $PKGS, have_gstreamer=yes, ++ AC_MSG_RESULT([no])) ++ ++ if test "x$have_pulse" = "xtrue"; then ++ AC_MSG_ERROR([*** GStreamer & Pulseaudio both are selected ***]) ++ fi ++ ++ if test "x$have_gstreamer" = "xyes"; then ++ GST_LIBS="$GST_LIBS -lgstinterfaces-0.10 -lgstaudio-0.10" ++ AC_DEFINE(HAVE_GSTREAMER,1,[enable gstreamer]) ++ fi ++else ++ AC_MSG_NOTICE([*** GStreamer support disabled ***]) ++fi ++AM_CONDITIONAL(HAVE_GSTREAMER, test "x$have_gstreamer" = "xyes") ++AC_SUBST(GST_LIBS) ++AC_SUBST(GST_CFLAGS) ++ + # --------------------------------------------------------------------------- + # Enable Profiling + # --------------------------------------------------------------------------- +@@ -389,6 +431,7 @@ echo " + dbus-1 system.d dir: ${DBUS_SYS_DIR} + + Libnotify support: ${have_libnotify} ++ GStreamer support: ${have_gstreamer} + PulseAudio support: ${have_pulse} + Profiling support: ${enable_profiling} + " +diff --git a/plugins/media-keys/Makefile.am b/plugins/media-keys/Makefile.am +index f9a71cd..92b19f4 100644 +--- a/plugins/media-keys/Makefile.am ++++ b/plugins/media-keys/Makefile.am +@@ -3,13 +3,8 @@ context = actions + + NULL = + +-SUBDIRS = +-plugin_LTLIBRARIES = +- +-if HAVE_PULSE +-SUBDIRS += cut-n-paste +-plugin_LTLIBRARIES += libmedia-keys.la +-endif ++SUBDIRS = cut-n-paste ++plugin_LTLIBRARIES = libmedia-keys.la + + BUILT_SOURCES = \ + gsd-media-keys-manager-glue.h \ +@@ -100,7 +95,7 @@ libmedia_keys_la_LDFLAGS = \ + + libmedia_keys_la_LIBADD = \ + $(top_builddir)/plugins/common/libcommon.la \ +- $(top_builddir)/plugins/media-keys/cut-n-paste/libgvc.la \ ++ $(top_builddir)/plugins/media-keys/cut-n-paste/libgvc.la \ + $(SETTINGS_PLUGIN_LIBS) \ + $(XF86MISC_LIBS) \ + -lm +@@ -108,9 +103,7 @@ libmedia_keys_la_LIBADD = \ + plugin_in_files = \ + media-keys.gnome-settings-plugin.in + +-if HAVE_PULSE + plugin_DATA = $(plugin_in_files:.gnome-settings-plugin.in=.gnome-settings-plugin) +-endif + + noinst_PROGRAMS = \ + test-media-keys \ +@@ -176,9 +169,7 @@ test_media_keys_LDADD = \ + $(GST_LIBS) \ + -lm + +-if HAVE_PULSE + test_media_keys_LDADD += $(top_builddir)/plugins/media-keys/cut-n-paste/libgvc.la +-endif + + gtkbuilderdir = $(pkgdatadir) + gtkbuilder_DATA = \ +diff --git a/plugins/media-keys/cut-n-paste/Makefile.am b/plugins/media-keys/cut-n-paste/Makefile.am +index bc59a10..6486ac0 100644 +--- a/plugins/media-keys/cut-n-paste/Makefile.am ++++ b/plugins/media-keys/cut-n-paste/Makefile.am +@@ -4,16 +4,24 @@ noinst_LTLIBRARIES = libgvc.la + + INCLUDES = \ + $(WARN_CFLAGS) \ +- $(VOLUME_CONTROL_CFLAGS) \ +- $(PULSE_CFLAGS) \ + $(NULL) + + libgvc_la_LIBADD = \ +- $(VOLUME_CONTROL_LIBS) \ +- $(PULSE_LIBS) \ + $(NULL) + + libgvc_la_SOURCES = \ ++ $(NULL) ++ ++if HAVE_PULSE ++INCLUDES += \ ++ $(VOLUME_CONTROL_CFLAGS) \ ++ $(PULSE_CFLAGS) ++ ++libgvc_la_LIBADD += \ ++ $(VOLUME_CONTROL_LIBS) \ ++ $(PULSE_LIBS) ++ ++libgvc_la_SOURCES += \ + gvc-mixer-stream.h \ + gvc-mixer-stream.c \ + gvc-channel-map.h \ +@@ -31,8 +39,22 @@ libgvc_la_SOURCES = \ + gvc-mixer-event-role.h \ + gvc-mixer-event-role.c \ + gvc-mixer-control.h \ +- gvc-mixer-control.c \ +- $(NULL) ++ gvc-mixer-control.c ++endif ++ ++if HAVE_GSTREAMER ++INCLUDES += \ ++ $(SETTINGS_PLUGIN_CFLAGS) \ ++ $(AM_CFLAGS) \ ++ $(GST_CFLAGS) ++ ++libgvc_la_LIBADD += \ ++ $(GST_LIBS) ++ ++libgvc_la_SOURCES += \ ++ gvc-gstreamer-acme-vol.c \ ++ gvc-gstreamer-acme-vol.h ++endif + + MAINTAINERCLEANFILES = \ + *~ \ +diff --git a/plugins/media-keys/cut-n-paste/gvc-gstreamer-acme-vol.c b/plugins/media-keys/cut-n-paste/gvc-gstreamer-acme-vol.c +new file mode 100644 +index 0000000..8948480 +--- /dev/null ++++ b/plugins/media-keys/cut-n-paste/gvc-gstreamer-acme-vol.c +@@ -0,0 +1,402 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ ++ ++/* acme-volume.c ++ ++ Copyright (C) 2002, 2003 Bastien Nocera ++ Copyright (C) 2004 Novell, Inc. ++ Copyright (C) 2009 PERIER Romain <mrpouet@tuxfamily.org> ++ ++ The Gnome Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Library General Public License as ++ published by the Free Software Foundation; either version 2 of the ++ License, or (at your option) any later version. ++ ++ The Gnome 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 ++ Library General Public License for more details. ++ ++ You should have received a copy of the GNU Library General Public ++ License along with the Gnome Library; see the file COPYING.LIB. If not, ++ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. ++ ++ Author: Bastien Nocera <hadess@hadess.net> ++ Jon Trowbridge <trow@ximian.com> ++*/ ++ ++#include "config.h" ++#include "gvc-gstreamer-acme-vol.h" ++ ++#include <gst/gst.h> ++#include <gst/audio/mixerutils.h> ++#include <gst/interfaces/mixer.h> ++#include <gst/interfaces/propertyprobe.h> ++ ++#include <gconf/gconf-client.h> ++ ++#include <string.h> ++ ++#define TIMEOUT 4 ++ ++#define DEFAULT_MIXER_DEVICE_KEY "/desktop/gnome/sound/default_mixer_device" ++#define DEFAULT_MIXER_TRACKS_KEY "/desktop/gnome/sound/default_mixer_tracks" ++ ++#define ACME_VOLUME_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ACME_TYPE_VOLUME, AcmeVolumePrivate)) ++ ++struct AcmeVolumePrivate { ++ GstMixer *mixer; ++ GList *mixer_tracks; ++ guint timer_id; ++ gdouble volume; ++ gboolean mute; ++ GConfClient *gconf_client; ++}; ++ ++G_DEFINE_TYPE (AcmeVolume, acme_volume, G_TYPE_OBJECT) ++ ++static gboolean acme_volume_open (AcmeVolume *acme); ++static void acme_volume_close (AcmeVolume *acme); ++static gboolean acme_volume_close_real (AcmeVolume *self); ++ ++static gpointer acme_volume_object = NULL; ++ ++static void ++acme_volume_finalize (GObject *object) ++{ ++ AcmeVolume *self; ++ ++ g_return_if_fail (object != NULL); ++ g_return_if_fail (ACME_IS_VOLUME (object)); ++ ++ self = ACME_VOLUME (object); ++ ++ if (self->_priv->timer_id != 0) ++ g_source_remove (self->_priv->timer_id); ++ acme_volume_close_real (self); ++ ++ if (self->_priv->gconf_client != NULL) { ++ g_object_unref (self->_priv->gconf_client); ++ self->_priv->gconf_client = NULL; ++ } ++ ++ G_OBJECT_CLASS (acme_volume_parent_class)->finalize (object); ++} ++ ++void ++acme_volume_set_mute (AcmeVolume *self, gboolean val) ++{ ++ GList *t; ++ ++ g_return_if_fail(ACME_IS_VOLUME(self)); ++ g_return_if_fail(acme_volume_open(self)); ++ ++ for (t = self->_priv->mixer_tracks; t != NULL; t = t->next) { ++ GstMixerTrack *track = GST_MIXER_TRACK (t->data); ++ gst_mixer_set_mute (self->_priv->mixer, track, val); ++ } ++ self->_priv->mute = val; ++ acme_volume_close (self); ++} ++ ++static void ++update_state (AcmeVolume * self) ++{ ++ gint *volumes, n; ++ gdouble vol = 0; ++ GstMixerTrack *track = GST_MIXER_TRACK (self->_priv->mixer_tracks->data); ++ ++ /* update mixer by getting volume */ ++ volumes = g_new0 (gint, track->num_channels); ++ gst_mixer_get_volume (self->_priv->mixer, track, volumes); ++ for (n = 0; n < track->num_channels; n++) ++ vol += volumes[n]; ++ g_free (volumes); ++ vol /= track->num_channels; ++ vol = 100 * vol / (track->max_volume - track->min_volume); ++ ++ /* update mute flag, and volume if not muted */ ++ if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MUTE)) ++ self->_priv->mute = TRUE; ++ self->_priv->volume = vol; ++} ++ ++gboolean ++acme_volume_get_mute (AcmeVolume *self) ++{ ++ g_return_val_if_fail(acme_volume_open(self), FALSE); ++ ++ update_state (self); ++ acme_volume_close (self); ++ ++ return self->_priv->mute; ++} ++ ++gint ++acme_volume_get_volume (AcmeVolume *self) ++{ ++ ++ g_return_val_if_fail(acme_volume_open(self), 0); ++ ++ update_state (self); ++ ++ acme_volume_close (self); ++ ++ return (gint) (self->_priv->volume + 0.5); ++} ++ ++void ++acme_volume_set_volume (AcmeVolume *self, gint val) ++{ ++ GList *t; ++ ++ g_return_if_fail(acme_volume_open(self)); ++ ++ val = CLAMP (val, 0, 100); ++ ++ for (t = self->_priv->mixer_tracks; t != NULL; t = t->next) { ++ GstMixerTrack *track = GST_MIXER_TRACK (t->data); ++ gint *volumes, n; ++ gdouble scale = (track->max_volume - track->min_volume) / 100.0; ++ gint vol = (gint) (val * scale + track->min_volume + 0.5); ++ ++ volumes = g_new (gint, track->num_channels); ++ for (n = 0; n < track->num_channels; n++) ++ volumes[n] = vol; ++ gst_mixer_set_volume (self->_priv->mixer, track, volumes); ++ g_free (volumes); ++ } ++ ++ /* update state */ ++ self->_priv->volume = val; ++ ++ acme_volume_close (self); ++} ++ ++void ++acme_volume_mute_toggle (AcmeVolume *self) ++{ ++ gboolean muted; ++ ++ g_return_if_fail (self != NULL); ++ g_return_if_fail (ACME_IS_VOLUME(self)); ++ ++ muted = acme_volume_get_mute(self); ++ acme_volume_set_mute(self, !muted); ++} ++ ++gint ++acme_volume_get_threshold (AcmeVolume *self) ++{ ++ GList *t; ++ gint steps = 101; ++ ++ g_return_val_if_fail(acme_volume_open(self), 1); ++ ++ for (t = self->_priv->mixer_tracks; t != NULL; t = t->next) { ++ GstMixerTrack *track = GST_MIXER_TRACK (t->data); ++ gint track_steps = track->max_volume - track->min_volume; ++ if (track_steps > 0 && track_steps < steps) ++ steps = track_steps; ++ } ++ ++ acme_volume_close (self); ++ ++ return 100 / steps + 1; ++} ++ ++static gboolean ++acme_volume_close_real (AcmeVolume *self) ++{ ++ if (self->_priv->mixer != NULL) ++ { ++ gst_element_set_state (GST_ELEMENT (self->_priv->mixer), GST_STATE_NULL); ++ gst_object_unref (GST_OBJECT (self->_priv->mixer)); ++ g_list_foreach (self->_priv->mixer_tracks, (GFunc) g_object_unref, NULL); ++ g_list_free (self->_priv->mixer_tracks); ++ self->_priv->mixer = NULL; ++ self->_priv->mixer_tracks = NULL; ++ } ++ ++ self->_priv->timer_id = 0; ++ return FALSE; ++} ++ ++/* ++ * _acme_set_mixer ++ * @mixer A pointer to mixer element ++ * @data A pointer to user data (AcmeVolume instance to be modified) ++ * @return A gboolean indicating success if Master track was found, failed otherwises. ++ */ ++static gboolean ++_acme_set_mixer(GstMixer *mixer, gpointer user_data) ++{ ++ const GList *tracks; ++ ++ for (tracks = gst_mixer_list_tracks (mixer); tracks != NULL; tracks = tracks->next) { ++ GstMixerTrack *track = GST_MIXER_TRACK (tracks->data); ++ ++ if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MASTER)) { ++ AcmeVolume *self; ++ ++ self = ACME_VOLUME (user_data); ++ ++ self->_priv->mixer = mixer; ++ self->_priv->mixer_tracks = g_list_append (self->_priv->mixer_tracks, g_object_ref (track)); ++ return TRUE; ++ } ++ ++ continue; ++ } ++ ++ return FALSE; ++} ++ ++/* This is a modified version of code from gnome-media's gst-mixer */ ++static gboolean ++acme_volume_open (AcmeVolume *self) ++{ ++ gchar *mixer_device, **factory_and_device = NULL; ++ GList *mixer_list; ++ ++ if (self->_priv->timer_id != 0) { ++ g_source_remove (self->_priv->timer_id); ++ self->_priv->timer_id = 0; ++ return TRUE; ++ } ++ ++ mixer_device = gconf_client_get_string (self->_priv->gconf_client, DEFAULT_MIXER_DEVICE_KEY, NULL); ++ if (mixer_device != NULL) ++ factory_and_device = g_strsplit (mixer_device, ":", 2); ++ ++ if (factory_and_device != NULL && factory_and_device[0] != NULL) { ++ GstElement *element; ++ ++ element = gst_element_factory_make (factory_and_device[0], NULL); ++ ++ if (element != NULL) { ++ if (factory_and_device[1] != NULL && ++ g_object_class_find_property (G_OBJECT_GET_CLASS (element), "device")) ++ g_object_set (G_OBJECT (element), "device", factory_and_device[1], NULL); ++ gst_element_set_state (element, GST_STATE_READY); ++ ++ if (GST_IS_MIXER (element)) ++ self->_priv->mixer = GST_MIXER (element); ++ else { ++ gst_element_set_state (element, GST_STATE_NULL); ++ gst_object_unref (element); ++ } ++ } ++ } ++ ++ g_free (mixer_device); ++ g_strfreev (factory_and_device); ++ ++ if (self->_priv->mixer != NULL) { ++ const GList *m; ++ GSList *tracks, *t; ++ GError *error = NULL; ++ ++ /* Try to use tracks saved in GConf ++ Note: errors need to be treated , for example if the user set a non type list for this key ++ or if the elements type_list are not "matched" */ ++ tracks = gconf_client_get_list (self->_priv->gconf_client, DEFAULT_MIXER_TRACKS_KEY, ++ GCONF_VALUE_STRING, &error); ++ ++ if (error) { ++ g_warning("ERROR: %s\n", error->message); ++ g_error_free(error); ++ } ++ ++ /* We use these tracks ONLY if they are supported on the system with the following mixer */ ++ for (m = gst_mixer_list_tracks (self->_priv->mixer); m != NULL; m = m->next) { ++ GstMixerTrack *track = GST_MIXER_TRACK (m->data); ++ ++ for (t = tracks; t != NULL; t = t->next) ++ if (!strcmp (t->data, track->label)) ++ self->_priv->mixer_tracks = g_list_append (self->_priv->mixer_tracks, g_object_ref (track)); ++ ++ } ++ ++ g_slist_foreach (tracks, (GFunc)g_free, NULL); ++ g_slist_free (tracks); ++ ++ /* If no track stored in GConf is avaiable try to use Master track */ ++ if (self->_priv->mixer_tracks == NULL) { ++ for (m = gst_mixer_list_tracks (self->_priv->mixer); m != NULL; m = m->next) { ++ GstMixerTrack *track = GST_MIXER_TRACK (m->data); ++ ++ if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_MASTER)) { ++ self->_priv->mixer_tracks = g_list_append (self->_priv->mixer_tracks, g_object_ref (track)); ++ break; ++ } ++ } ++ } ++ ++ if (self->_priv->mixer_tracks != NULL) ++ return TRUE; ++ else { ++ gst_element_set_state (GST_ELEMENT (self->_priv->mixer), GST_STATE_NULL); ++ gst_object_unref (self->_priv->mixer); ++ } ++ } ++ ++ /* Go through all elements of a certain class and check whether ++ * they implement a mixer. If so, walk through the tracks and look ++ * for first one named "volume". ++ * ++ * We should probably do something intelligent if we don't find an ++ * appropriate mixer/track. But now we do something stupid... ++ * everything just becomes a no-op. ++ */ ++ mixer_list = gst_audio_default_registry_mixer_filter (_acme_set_mixer, ++ TRUE, ++ self); ++ ++ if (mixer_list == NULL) ++ return FALSE; ++ ++ /* do not unref the mixer as we keep the ref for self->priv->mixer */ ++ g_list_free (mixer_list); ++ ++ return TRUE; ++} ++ ++static void ++acme_volume_close (AcmeVolume *self) ++{ ++ self->_priv->timer_id = g_timeout_add_seconds (TIMEOUT, ++ (GSourceFunc) acme_volume_close_real, self); ++} ++ ++static void ++acme_volume_init (AcmeVolume *self) ++{ ++ self->_priv = ACME_VOLUME_GET_PRIVATE (self); ++ self->_priv->gconf_client = gconf_client_get_default (); ++} ++ ++static void ++acme_volume_class_init (AcmeVolumeClass *klass) ++{ ++ G_OBJECT_CLASS (klass)->finalize = acme_volume_finalize; ++ ++ gst_init (NULL, NULL); ++ ++ g_type_class_add_private (klass, sizeof (AcmeVolumePrivate)); ++} ++ ++/* acme_volume_new ++ * @return A singleton instance of type AcmeVolume ++ */ ++AcmeVolume * ++acme_volume_new (void) ++{ ++ if (acme_volume_object == NULL) { ++ acme_volume_object = g_object_new (ACME_TYPE_VOLUME, NULL); ++ return ACME_VOLUME(acme_volume_object); ++ } ++ g_object_ref(acme_volume_object); ++ return ACME_VOLUME(acme_volume_object); ++} ++ +diff --git a/plugins/media-keys/cut-n-paste/gvc-gstreamer-acme-vol.h b/plugins/media-keys/cut-n-paste/gvc-gstreamer-acme-vol.h +new file mode 100644 +index 0000000..c14ebc8 +--- /dev/null ++++ b/plugins/media-keys/cut-n-paste/gvc-gstreamer-acme-vol.h +@@ -0,0 +1,56 @@ ++/* acme-volume.h ++ ++ Copyright (C) 2002, 2003 Bastien Nocera ++ Copyright (C) 2004 Novell, Inc. ++ Copyright (C) 2009 PERIER Romain <mrpouet@tuxfamily.org> ++ ++ The Gnome Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Library General Public License as ++ published by the Free Software Foundation; either version 2 of the ++ License, or (at your option) any later version. ++ ++ The Gnome 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 ++ Library General Public License for more details. ++ ++ You should have received a copy of the GNU Library General Public ++ License along with the Gnome Library; see the file COPYING.LIB. If not, ++ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. ++ ++ Author: Bastien Nocera <hadess@hadess.net> ++ Jon Trowbridge <trow@ximian.com> ++ */ ++ ++#include <glib-object.h> ++ ++#define ACME_TYPE_VOLUME (acme_volume_get_type ()) ++#define ACME_VOLUME(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ACME_TYPE_VOLUME, AcmeVolume)) ++#define ACME_VOLUME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ACME_TYPE_VOLUME, AcmeVolumeClass)) ++#define ACME_IS_VOLUME(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ACME_TYPE_VOLUME)) ++#define ACME_VOLUME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ACME_TYPE_VOLUME, AcmeVolumeClass)) ++ ++typedef struct AcmeVolume AcmeVolume; ++typedef struct AcmeVolumeClass AcmeVolumeClass; ++typedef struct AcmeVolumePrivate AcmeVolumePrivate; ++ ++struct AcmeVolume { ++ GObject parent; ++ AcmeVolumePrivate *_priv; ++}; ++ ++struct AcmeVolumeClass { ++ GObjectClass parent; ++}; ++ ++GType acme_volume_get_type (void); ++AcmeVolume *acme_volume_new (void); ++void acme_volume_set_mute (AcmeVolume *self, gboolean val); ++void acme_volume_mute_toggle (AcmeVolume *self); ++gboolean acme_volume_get_mute (AcmeVolume *self); ++void acme_volume_set_volume (AcmeVolume *self, gint val); ++gint acme_volume_get_volume (AcmeVolume *self); ++gint acme_volume_get_threshold (AcmeVolume *self); ++ ++ +diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c +index b563f73..64893b5 100644 +--- a/plugins/media-keys/gsd-media-keys-manager.c ++++ b/plugins/media-keys/gsd-media-keys-manager.c +@@ -53,6 +53,8 @@ + #ifdef HAVE_PULSE + #include <canberra-gtk.h> + #include "gvc-mixer-control.h" ++#elif defined(HAVE_GSTREAMER) ++#include "gvc-gstreamer-acme-vol.h" + #endif /* HAVE_PULSE */ + + #define GSD_DBUS_PATH "/org/gnome/SettingsDaemon" +@@ -78,6 +80,8 @@ struct GsdMediaKeysManagerPrivate + /* Volume bits */ + GvcMixerControl *volume; + GvcMixerStream *stream; ++#elif defined(HAVE_GSTREAMER) ++ AcmeVolume *volume; + #endif /* HAVE_PULSE */ + GtkWidget *dialog; + GConfClient *conf_client; +@@ -650,14 +654,16 @@ do_touchpad_action (GsdMediaKeysManager *manager) + gconf_client_set_bool (client, TOUCHPAD_ENABLED_KEY, !state, NULL); + } + +-#ifdef HAVE_PULSE ++#if defined(HAVE_PULSE) || defined(HAVE_GSTREAMER) + static void + update_dialog (GsdMediaKeysManager *manager, + guint vol, + gboolean muted, + gboolean sound_changed) + { ++#ifdef HAVE_PULSE + vol = (int) (100 * (double) vol / PA_VOLUME_NORM); ++#endif + vol = CLAMP (vol, 0, 100); + + dialog_init (manager); +@@ -668,12 +674,14 @@ update_dialog (GsdMediaKeysManager *manager, + GSD_MEDIA_KEYS_WINDOW_ACTION_VOLUME); + dialog_show (manager); + ++#ifdef HAVE_PULSE + 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); ++#endif + } + + static void +@@ -685,7 +693,11 @@ do_sound_action (GsdMediaKeysManager *manager, + int vol_step; + gboolean sound_changed; + ++#ifdef HAVE_PULSE + if (manager->priv->stream == NULL) ++#else ++ if (manager->priv->volume == NULL) ++#endif + return; + + vol_step = gconf_client_get_int (manager->priv->conf_client, +@@ -695,20 +707,35 @@ do_sound_action (GsdMediaKeysManager *manager, + if (vol_step <= 0 || vol_step > 100) + vol_step = VOLUME_STEP; + ++ sound_changed = FALSE; ++#ifdef HAVE_PULSE + norm_vol_step = PA_VOLUME_NORM * vol_step / 100; + + /* FIXME: this is racy */ + vol = gvc_mixer_stream_get_volume (manager->priv->stream); + muted = gvc_mixer_stream_get_is_muted (manager->priv->stream); +- sound_changed = FALSE; +- ++#else ++ if (vol_step > 0) { ++ gint threshold = acme_volume_get_threshold (manager->priv->volume); ++ if (vol_step < threshold) ++ vol_step = threshold; ++ g_debug ("Using volume step of %d", vol_step); ++ } ++ vol = acme_volume_get_volume (manager->priv->volume); ++ muted = acme_volume_get_mute (manager->priv->volume); ++#endif + switch (type) { + case MUTE_KEY: + muted = !muted; +- gvc_mixer_stream_change_is_muted (manager->priv->stream, muted); + sound_changed = TRUE; ++#ifdef HAVE_PULSE ++ gvc_mixer_stream_change_is_muted (manager->priv->stream, muted); ++#else ++ acme_volume_mute_toggle (manager->priv->volume); ++#endif + break; + case VOLUME_DOWN_KEY: ++#ifdef HAVE_PULSE + if (!muted && (vol <= norm_vol_step)) { + muted = !muted; + vol = 0; +@@ -724,11 +751,17 @@ do_sound_action (GsdMediaKeysManager *manager, + sound_changed = TRUE; + } + } ++#else ++ if (!muted && (vol <= vol_step)) ++ acme_volume_mute_toggle (manager->priv->volume); ++ acme_volume_set_volume (manager->priv->volume, vol - vol_step); ++#endif + break; + case VOLUME_UP_KEY: + if (muted) { + muted = !muted; + if (vol == 0) { ++#ifdef HAVE_PULSE + vol = vol + norm_vol_step; + gvc_mixer_stream_change_is_muted (manager->priv->stream, muted); + if (gvc_mixer_stream_set_volume (manager->priv->stream, vol) != FALSE) { +@@ -739,7 +772,15 @@ do_sound_action (GsdMediaKeysManager *manager, + gvc_mixer_stream_change_is_muted (manager->priv->stream, muted); + sound_changed = TRUE; + } ++#else ++ /* We need to unmute otherwise vol is blocked (and muted) */ ++ acme_volume_set_mute (manager->priv->volume, FALSE); ++ } ++ acme_volume_set_volume (manager->priv->volume, vol + vol_step); ++ ++#endif + } else { ++#ifdef HAVE_PULSE + if (vol < MAX_VOLUME) { + if (vol + norm_vol_step >= MAX_VOLUME) { + vol = MAX_VOLUME; +@@ -751,13 +792,18 @@ do_sound_action (GsdMediaKeysManager *manager, + sound_changed = TRUE; + } + } ++#else ++ acme_volume_set_volume (manager->priv->volume, vol + vol_step); ++#endif /* HAVE_PULSE */ + } + break; + } + + update_dialog (manager, vol, muted, sound_changed); + } ++#endif /* defined(HAVE_PULSE) || defined(HAVE_GSTREAMER) */ + ++#ifdef HAVE_PULSE + static void + update_default_sink (GsdMediaKeysManager *manager) + { +@@ -793,7 +839,6 @@ on_control_default_sink_changed (GvcMixerControl *control, + { + update_default_sink (manager); + } +- + #endif /* HAVE_PULSE */ + + static gint +@@ -919,9 +964,9 @@ do_action (GsdMediaKeysManager *manager, + case MUTE_KEY: + case VOLUME_DOWN_KEY: + case VOLUME_UP_KEY: +-#ifdef HAVE_PULSE ++#if defined(HAVE_PULSE) || defined(HAVE_GSTREAMER) + do_sound_action (manager, type); +-#endif /* HAVE_PULSE */ ++#endif /* HAVE_PULSE || HAVE_GSTREAMER */ + break; + case POWER_KEY: + do_exit_action (manager); +@@ -1122,6 +1167,10 @@ gsd_media_keys_manager_start (GsdMediaKeysManager *manager, + gvc_mixer_control_open (manager->priv->volume); + + gnome_settings_profile_end ("gvc_mixer_control_new"); ++#elif defined(HAVE_GSTREAMER) ++ gnome_settings_profile_start ("acme_volume_new"); ++ manager->priv->volume = acme_volume_new (); ++ gnome_settings_profile_end ("acme_volume_new"); + #endif /* HAVE_PULSE */ + g_idle_add ((GSourceFunc) start_media_keys_idle_cb, manager); + +@@ -1199,6 +1248,7 @@ gsd_media_keys_manager_stop (GsdMediaKeysManager *manager) + g_object_unref (priv->stream); + priv->stream = NULL; + } ++#elif defined(HAVE_GSTREAMER) + + if (priv->volume) { + g_object_unref (priv->volume); +-- +1.7.0.3 + diff --git a/gnome-base/gnome-settings-daemon/files/gnome-settings-daemon-2.30.1-XF86Display.patch b/gnome-base/gnome-settings-daemon/files/gnome-settings-daemon-2.30.1-XF86Display.patch new file mode 100644 index 000000000000..d69309871be0 --- /dev/null +++ b/gnome-base/gnome-settings-daemon/files/gnome-settings-daemon-2.30.1-XF86Display.patch @@ -0,0 +1,51 @@ +From d5e0550961e337a8ce08e41534bd26f7daab79be Mon Sep 17 00:00:00 2001 +From: Chase Douglas <chase.douglas@ubuntu.com> +Date: Thu, 06 May 2010 20:51:14 +0000 +Subject: bgo#610482 - Adjust XF86Display timestamps if they are out of order with RANDR timestamps + +Some laptops seem to send XF86Display keypress events when you unsuspend them, +probably as a way to 'make Windows work'. For some reason these events +come with timestamps that are out of order with respect to the +RANDR timestamps. So we'll adjust the keypress timestamps so that +the events can be processed. + +Signed-off-by: Federico Mena Quintero <federico@novell.com> +--- +diff --git a/plugins/xrandr/gsd-xrandr-manager.c b/plugins/xrandr/gsd-xrandr-manager.c +index e78eb6b..bcaa53b 100644 +--- a/plugins/xrandr/gsd-xrandr-manager.c ++++ b/plugins/xrandr/gsd-xrandr-manager.c +@@ -988,6 +988,8 @@ handle_fn_f7 (GsdXrandrManager *mgr, guint32 timestamp) + gnome_rr_config_free (current); + + if (priv->fn_f7_configs) { ++ guint32 server_timestamp; ++ + mgr->priv->current_fn_f7_config++; + + if (priv->fn_f7_configs[mgr->priv->current_fn_f7_config] == NULL) +@@ -999,6 +1001,22 @@ handle_fn_f7 (GsdXrandrManager *mgr, guint32 timestamp) + + g_debug ("applying"); + ++ /* See https://bugzilla.gnome.org/show_bug.cgi?id=610482 ++ * ++ * Sometimes we'll get two rapid XF86Display keypress events, ++ * but their timestamps will be out of order with respect to the ++ * RANDR timestamps. This *may* be due to stupid BIOSes sending ++ * out display-switch keystrokes "to make Windows work". ++ * ++ * The X server will error out if the timestamp provided is ++ * older than a previous change configuration timestamp. We ++ * assume here that we do want this event to go through still, ++ * since kernel timestamps may be skewed wrt the X server. ++ */ ++ gnome_rr_screen_get_timestamps (screen, NULL, &server_timestamp); ++ if (timestamp < server_timestamp) ++ timestamp = server_timestamp; ++ + apply_configuration_and_display_error (mgr, priv->fn_f7_configs[mgr->priv->current_fn_f7_config], timestamp); + } + else { +-- +cgit v0.8.3.1 diff --git a/gnome-base/gnome-settings-daemon/files/gnome-settings-daemon-2.30.1-baobob-check.patch b/gnome-base/gnome-settings-daemon/files/gnome-settings-daemon-2.30.1-baobob-check.patch new file mode 100644 index 000000000000..dbc1d3fbc3f7 --- /dev/null +++ b/gnome-base/gnome-settings-daemon/files/gnome-settings-daemon-2.30.1-baobob-check.patch @@ -0,0 +1,84 @@ +From 0b266339403255b8c23ea31015e3ef40e620b9bb Mon Sep 17 00:00:00 2001 +From: Ross Burton <ross@linux.intel.com> +Date: Mon, 17 May 2010 14:52:18 +0000 +Subject: housekeeping: only check for baobob if we're about to show a dialog (part of BMC#1583) + +--- +diff --git a/plugins/housekeeping/gsd-disk-space.c b/plugins/housekeeping/gsd-disk-space.c +index 82ff7e6..8c4d378 100644 +--- a/plugins/housekeeping/gsd-disk-space.c ++++ b/plugins/housekeeping/gsd-disk-space.c +@@ -172,14 +172,14 @@ ldsm_analyze_path (const gchar *path) + + static gboolean + ldsm_notify_for_mount (LdsmMountInfo *mount, +- gboolean has_disk_analyzer, + gboolean multiple_volumes, + gboolean other_usable_volumes) + { +- gchar *name; ++ gchar *name, *program; + gint64 free_space; + gint response; + gboolean has_trash; ++ gboolean has_disk_analyzer; + gboolean retval = TRUE; + const gchar *path; + +@@ -192,6 +192,10 @@ ldsm_notify_for_mount (LdsmMountInfo *mount, + has_trash = ldsm_mount_has_trash (mount); + path = g_unix_mount_get_mount_path (mount->mount); + ++ program = g_find_program_in_path (DISK_SPACE_ANALYZER); ++ has_disk_analyzer = (program != NULL); ++ g_free (program); ++ + dialog = gsd_ldsm_dialog_new (other_usable_volumes, + multiple_volumes, + has_disk_analyzer, +@@ -359,7 +363,6 @@ ldsm_free_mount_info (gpointer data) + + static void + ldsm_maybe_warn_mounts (GList *mounts, +- gboolean has_disk_analyzer, + gboolean multiple_volumes, + gboolean other_usable_volumes) + { +@@ -418,7 +421,7 @@ ldsm_maybe_warn_mounts (GList *mounts, + } + + if (show_notify) { +- if (ldsm_notify_for_mount (mount_info, has_disk_analyzer, multiple_volumes, other_usable_volumes)) ++ if (ldsm_notify_for_mount (mount_info, multiple_volumes, other_usable_volumes)) + done = TRUE; + } + } +@@ -431,17 +434,11 @@ ldsm_check_all_mounts (gpointer data) + GList *l; + GList *check_mounts = NULL; + GList *full_mounts = NULL; +- char *program; +- gboolean has_disk_analyzer; + guint number_of_mounts; + guint number_of_full_mounts; + gboolean multiple_volumes = FALSE; + gboolean other_usable_volumes = FALSE; + +- program = g_find_program_in_path (DISK_SPACE_ANALYZER); +- has_disk_analyzer = (program != NULL); +- g_free (program); +- + /* We iterate through the static mounts in /etc/fstab first, seeing if + * they're mounted by checking if the GUnixMountPoint has a corresponding GUnixMountEntry. + * Iterating through the static mounts means we automatically ignore dynamically mounted media. +@@ -509,7 +506,7 @@ ldsm_check_all_mounts (gpointer data) + if (number_of_mounts > number_of_full_mounts) + other_usable_volumes = TRUE; + +- ldsm_maybe_warn_mounts (full_mounts, has_disk_analyzer, multiple_volumes, ++ ldsm_maybe_warn_mounts (full_mounts, multiple_volumes, + other_usable_volumes); + + g_list_free (check_mounts); +-- +cgit v0.8.3.1 diff --git a/gnome-base/gnome-settings-daemon/files/gnome-settings-daemon-2.30.1-osd-icons.patch b/gnome-base/gnome-settings-daemon/files/gnome-settings-daemon-2.30.1-osd-icons.patch new file mode 100644 index 000000000000..536bcc5ff896 --- /dev/null +++ b/gnome-base/gnome-settings-daemon/files/gnome-settings-daemon-2.30.1-osd-icons.patch @@ -0,0 +1,41 @@ +From a2c550b445e6fd3d9c944bf889895f61f8f3e68b Mon Sep 17 00:00:00 2001 +From: Bastien Nocera <hadess@hadess.net> +Date: Fri, 07 May 2010 15:32:06 +0000 +Subject: Fix loading OSD icons when there's no SVG version + +In gnome-icon-theme in 2.30.x, there's no SVG icons anymore, +so the OSD popups won't look like the rest of the system, +as "hand-drawn" icons will be used instead. + +https://bugzilla.gnome.org/show_bug.cgi?id=618023 +--- +diff --git a/plugins/media-keys/gsd-media-keys-window.c b/plugins/media-keys/gsd-media-keys-window.c +index 4b736e9..2547068 100644 +--- a/plugins/media-keys/gsd-media-keys-window.c ++++ b/plugins/media-keys/gsd-media-keys-window.c +@@ -208,22 +208,9 @@ load_pixbuf (GsdMediaKeysWindow *window, + pixbuf = gtk_icon_theme_load_icon (theme, + name, + icon_size, +- GTK_ICON_LOOKUP_FORCE_SVG, ++ GTK_ICON_LOOKUP_FORCE_SIZE, + NULL); + +- /* make sure the pixbuf is close to the requested size +- * this is necessary because GTK_ICON_LOOKUP_FORCE_SVG +- * seems to be broken */ +- if (pixbuf != NULL) { +- int width; +- +- width = gdk_pixbuf_get_width (pixbuf); +- if (width < (float)icon_size * 0.75) { +- g_object_unref (pixbuf); +- pixbuf = NULL; +- } +- } +- + return pixbuf; + } + +-- +cgit v0.8.3.1 diff --git a/gnome-base/gnome-settings-daemon/gnome-settings-daemon-2.30.1-r1.ebuild b/gnome-base/gnome-settings-daemon/gnome-settings-daemon-2.30.1-r1.ebuild new file mode 100644 index 000000000000..714cfa9c0a82 --- /dev/null +++ b/gnome-base/gnome-settings-daemon/gnome-settings-daemon-2.30.1-r1.ebuild @@ -0,0 +1,93 @@ +# Copyright 1999-2010 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/gnome-base/gnome-settings-daemon/gnome-settings-daemon-2.30.1-r1.ebuild,v 1.1 2010/06/14 12:08:28 pacho Exp $ + +EAPI="2" + +inherit autotools eutils gnome2 + +DESCRIPTION="Gnome Settings Daemon" +HOMEPAGE="http://www.gnome.org" +SRC_URI="${SRC_URI} +mirror://gentoo/${PN}-2.28.2-gst-vol-control-support.patch.lzma" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~ppc ~ppc64 ~sh ~sparc ~x86 ~x86-fbsd ~x86-freebsd ~amd64-linux ~x86-linux ~x86-solaris" +IUSE="debug libnotify pulseaudio" + +RDEPEND=">=dev-libs/dbus-glib-0.74 + >=dev-libs/glib-2.18.0 + >=x11-libs/gtk+-2.16 + >=gnome-base/gconf-2.6.1 + >=gnome-base/libgnomekbd-2.29.5 + >=gnome-base/gnome-desktop-2.29.92 + + x11-libs/libX11 + x11-libs/libXi + x11-libs/libXrandr + x11-libs/libXext + x11-libs/libXxf86misc + >=x11-libs/libxklavier-5.0 + media-libs/fontconfig + + libnotify? ( >=x11-libs/libnotify-0.4.3 ) + pulseaudio? ( + >=media-sound/pulseaudio-0.9.15 + media-libs/libcanberra[gtk] ) + !pulseaudio? ( + >=media-libs/gstreamer-0.10.1.2 + >=media-libs/gst-plugins-base-0.10.1.2 )" +DEPEND="${RDEPEND} + !<gnome-base/gnome-control-center-2.22 + sys-devel/gettext + >=dev-util/intltool-0.40 + >=dev-util/pkgconfig-0.19 + x11-proto/inputproto + x11-proto/xproto" + +# README is empty +DOCS="AUTHORS NEWS ChangeLog MAINTAINERS" + +pkg_setup() { + G2CONF="${G2CONF} + --disable-static + $(use_enable debug) + $(use_with libnotify) + $(use_enable pulseaudio pulse) + $(use_enable !pulseaudio gstreamer)" + + if use pulseaudio; then + elog "Building volume media keys using Pulseaudio" + else + elog "Building volume media keys using GStreamer" + fi +} + +src_prepare() { + gnome2_src_prepare + + # Restore gstreamer volume control support, upstream bug #571145 + epatch "${FILESDIR}/${PN}-2.30.0-gst-vol-control-support.patch" + + # Adjust XF86Display timestamps if they are out of order with RANDR timestamps, upstream bug 610482 + epatch "${FILESDIR}/${P}-XF86Display.patch" + + # Fix loading OSD icons when there's no SVG version, upstream bug 618023 + epatch "${FILESDIR}/${P}-osd-icons.patch" + + # housekeeping: Only check for baobob if we're about to show a dialog + epatch "${FILESDIR}/${P}-baobob-check.patch" + + intltoolize --force --copy --automake || die "intltoolize failed" + eautoreconf +} + +pkg_postinst() { + gnome2_pkg_postinst + + if ! use pulseaudio; then + elog "GStreamer volume control support is a feature powered by Gentoo GNOME Team" + elog "PLEASE DO NOT report bugs upstream, report on https://bugs.gentoo.org instead" + fi +} |