diff --git a/srcpkgs/cinnamon/patches/calendar-applet-upower-support.patch b/srcpkgs/cinnamon/patches/calendar-applet-upower-support.patch new file mode 100644 index 00000000000..fefd9c539b4 --- /dev/null +++ b/srcpkgs/cinnamon/patches/calendar-applet-upower-support.patch @@ -0,0 +1,17 @@ +Index: cinnamon/files/usr/share/cinnamon/applets/calendar@cinnamon.org/applet.js +=================================================================== +--- cinnamon.orig/files/usr/share/cinnamon/applets/calendar@cinnamon.org/applet.js 2014-04-27 11:56:10.582581808 +0200 ++++ cinnamon/files/usr/share/cinnamon/applets/calendar@cinnamon.org/applet.js 2014-07-14 00:44:37.882215797 +0200 +@@ -94,7 +94,11 @@ + + // https://bugzilla.gnome.org/show_bug.cgi?id=655129 + this._upClient = new UPowerGlib.Client(); +- this._upClient.connect('notify-resume', this._updateClockAndDate); ++ try { ++ this._upClient.connect('notify-resume', this._updateClockAndDate); ++ } catch (e) { ++ this._upClient.connect('notify::resume', this._updateClockAndDate); ++ } + + // Start the clock + this.on_settings_changed(); diff --git a/srcpkgs/cinnamon/patches/cinnamon-gstreamer1.patch b/srcpkgs/cinnamon/patches/cinnamon-gstreamer1.patch deleted file mode 100644 index 6c27c1620ab..00000000000 --- a/srcpkgs/cinnamon/patches/cinnamon-gstreamer1.patch +++ /dev/null @@ -1,282 +0,0 @@ -diff -ruN a/configure.ac b/configure.ac ---- a/configure.ac 2013-10-16 15:10:22.237511846 +0000 -+++ b/configure.ac 2013-10-16 15:00:45.501321091 +0000 -@@ -44,15 +44,15 @@ - - # We need at least this, since gst_plugin_register_static() was added - # in 0.10.16, but nothing older than 0.10.21 has been tested. --GSTREAMER_MIN_VERSION=0.10.16 -+GSTREAMER_MIN_VERSION=0.11.92 - - recorder_modules= - build_recorder=false - AC_MSG_CHECKING([for GStreamer (needed for recording functionality)]) --if $PKG_CONFIG --exists gstreamer-0.10 '>=' $GSTREAMER_MIN_VERSION ; then -+if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then - AC_MSG_RESULT(yes) - build_recorder=true -- recorder_modules="gstreamer-0.10 gstreamer-base-0.10 x11" -+ recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11" - PKG_CHECK_MODULES(TEST_CINNAMON_RECORDER, $recorder_modules clutter-1.0 xfixes) - else - AC_MSG_RESULT(no) -diff -ruN a/src/cinnamon-recorder.c b/src/cinnamon-recorder.c ---- a/src/cinnamon-recorder.c 2013-10-16 15:10:22.344177808 +0000 -+++ b/src/cinnamon-recorder.c 2013-10-16 15:26:42.801040167 +0000 -@@ -8,6 +8,7 @@ - #include - #include - -+#define GST_USE_UNSTABLE_API - #include - - #include "cinnamon-recorder-src.h" -@@ -147,7 +148,7 @@ - * (Theora does have some support for frames at non-uniform times, but - * things seem to break down if there are large gaps.) - */ --#define DEFAULT_PIPELINE "videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux" -+#define DEFAULT_PIPELINE "vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux" - - /* The default filename pattern. Example cinnamon-20090311b-2.webm - */ -@@ -446,6 +447,7 @@ - recorder_draw_cursor (CinnamonRecorder *recorder, - GstBuffer *buffer) - { -+ GstMapInfo info; - cairo_surface_t *surface; - cairo_t *cr; - -@@ -464,7 +466,8 @@ - if (!recorder->cursor_image) - return; - -- surface = cairo_image_surface_create_for_data (GST_BUFFER_DATA(buffer), -+ gst_buffer_map (buffer, &info, GST_MAP_WRITE); -+ surface = cairo_image_surface_create_for_data (info.data, - CAIRO_FORMAT_ARGB32, - recorder->stage_width, - recorder->stage_height, -@@ -479,6 +482,7 @@ - - cairo_destroy (cr); - cairo_surface_destroy (surface); -+ gst_buffer_unmap (buffer, &info); - } - - /* Draw an overlay indicating how much of the target memory is used -@@ -541,10 +545,11 @@ - data = g_malloc (size); - - buffer = gst_buffer_new(); -- GST_BUFFER_SIZE(buffer) = size; -- GST_BUFFER_MALLOCDATA(buffer) = GST_BUFFER_DATA(buffer) = data; -+ gst_buffer_insert_memory (buffer, -1, -+ gst_memory_new_wrapped (0, data, size, 0, -+ size, data, g_free)); - -- GST_BUFFER_TIMESTAMP(buffer) = get_wall_time() - recorder->start_time; -+ GST_BUFFER_PTS(buffer) = get_wall_time() - recorder->start_time; - - cogl_read_pixels (0, 0, - recorder->stage_width, recorder->stage_height, -@@ -1042,23 +1047,18 @@ - { - GstCaps *caps; - -- /* The data is always native-endian xRGB; ffmpegcolorspace -+ /* The data is always native-endian xRGB; videoconvert - * doesn't support little-endian xRGB, but does support - * big-endian BGRx. - */ -- caps = gst_caps_new_simple ("video/x-raw-rgb", -- "bpp", G_TYPE_INT, 32, -- "depth", G_TYPE_INT, 24, -+ caps = gst_caps_new_simple ("video/x-raw", - #if G_BYTE_ORDER == G_LITTLE_ENDIAN -- "red_mask", G_TYPE_INT, 0x0000ff00, -- "green_mask", G_TYPE_INT, 0x00ff0000, -- "blue_mask", G_TYPE_INT, 0xff000000, -+ "format", G_TYPE_STRING, "BGRx", - #else -- "red_mask", G_TYPE_INT, 0xff0000, -- "green_mask", G_TYPE_INT, 0x00ff00, -- "blue_mask", G_TYPE_INT, 0x0000ff, -+ "format", G_TYPE_STRING, "xRGB", - #endif -- "endianness", G_TYPE_INT, G_BIG_ENDIAN, -+ "bpp", G_TYPE_INT, 32, -+ "depth", G_TYPE_INT, 24, - "framerate", GST_TYPE_FRACTION, pipeline->recorder->framerate, 1, - "width", G_TYPE_INT, pipeline->recorder->stage_width, - "height", G_TYPE_INT, pipeline->recorder->stage_height, -@@ -1076,7 +1076,7 @@ - { - GstPad *sink_pad = NULL, *src_pad = NULL; - gboolean result = FALSE; -- GstElement *ffmpegcolorspace; -+ GstElement *videoconvert; - - sink_pad = gst_bin_find_unlinked_pad (GST_BIN (pipeline->pipeline), GST_PAD_SINK); - if (sink_pad == NULL) -@@ -1095,19 +1095,19 @@ - - recorder_pipeline_set_caps (pipeline); - -- /* The ffmpegcolorspace element is a generic converter; it will convert -+ /* The videoconvert element is a generic converter; it will convert - * our supplied fixed format data into whatever the encoder wants - */ -- ffmpegcolorspace = gst_element_factory_make ("ffmpegcolorspace", NULL); -- if (!ffmpegcolorspace) -+ videoconvert = gst_element_factory_make ("videoconvert", NULL); -+ if (!videoconvert) - { -- g_warning("Can't create ffmpegcolorspace element"); -+ g_warning("Can't create videoconvert element"); - goto out; - } -- gst_bin_add (GST_BIN (pipeline->pipeline), ffmpegcolorspace); -+ gst_bin_add (GST_BIN (pipeline->pipeline), videoconvert); - -- gst_element_link_many (pipeline->src, ffmpegcolorspace, NULL); -- src_pad = gst_element_get_static_pad (ffmpegcolorspace, "src"); -+ gst_element_link_many (pipeline->src, videoconvert, NULL); -+ src_pad = gst_element_get_static_pad (videoconvert, "src"); - - if (!src_pad) - { -@@ -1637,7 +1637,7 @@ - * might be used to send the output to an icecast server - * via shout2send or similar. - * -- * The default value is 'videorate ! theoraenc ! oggmux' -+ * The default value is 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' - */ - void - cinnamon_recorder_set_pipeline (CinnamonRecorder *recorder, -diff -ruN a/src/cinnamon-recorder-src.c b/src/cinnamon-recorder-src.c ---- a/src/cinnamon-recorder-src.c 2013-10-16 15:10:22.347511119 +0000 -+++ b/src/cinnamon-recorder-src.c 2013-10-16 15:33:41.581609206 +0000 -@@ -2,6 +2,7 @@ - - #include "config.h" - -+#define GST_USE_UNSTABLE_API - #include - - #include "cinnamon-recorder-src.h" -@@ -12,6 +13,9 @@ - - GMutex *mutex; - -+ GstClock *clock; -+ GstClockTime last_frame_time; -+ - GstCaps *caps; - GAsyncQueue *queue; - gboolean closed; -@@ -33,21 +37,21 @@ - /* Special marker value once the source is closed */ - #define RECORDER_QUEUE_END ((GstBuffer *)1) - --GST_BOILERPLATE(CinnamonRecorderSrc, cinnamon_recorder_src, GstPushSrc, GST_TYPE_PUSH_SRC); -+G_DEFINE_TYPE(CinnamonRecorderSrc, cinnamon_recorder_src, GST_TYPE_PUSH_SRC); - - static void --cinnamon_recorder_src_init (CinnamonRecorderSrc *src, -- CinnamonRecorderSrcClass *klass) -+cinnamon_recorder_src_init (CinnamonRecorderSrc *src) - { -+ gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME); -+ gst_base_src_set_live (GST_BASE_SRC (src), TRUE); -+ -+ src->clock = gst_system_clock_obtain (); -+ src->last_frame_time = 0; -+ - src->queue = g_async_queue_new (); - src->mutex = g_mutex_new (); - } - --static void --cinnamon_recorder_src_base_init (gpointer klass) --{ --} -- - static gboolean - cinnamon_recorder_src_memory_used_update_idle (gpointer data) - { -@@ -87,21 +91,28 @@ - GstBuffer *buffer; - - if (src->closed) -- return GST_FLOW_UNEXPECTED; -+ return GST_FLOW_EOS; - - buffer = g_async_queue_pop (src->queue); -+ if (src->last_frame_time == 0) -+ src->last_frame_time = gst_clock_get_time (GST_CLOCK (src->clock)); -+ - if (buffer == RECORDER_QUEUE_END) - { - /* Returning UNEXPECTED here will cause a EOS message to be sent */ - src->closed = TRUE; -- return GST_FLOW_UNEXPECTED; -+ return GST_FLOW_EOS; - } - - cinnamon_recorder_src_update_memory_used (src, -- - (int)(GST_BUFFER_SIZE(buffer) / 1024)); -+ - (int)(gst_buffer_get_size(buffer) / 1024)); - - *buffer_out = buffer; - -+ GST_BUFFER_DURATION(*buffer_out) = GST_CLOCK_DIFF (src->last_frame_time, gst_clock_get_time (GST_CLOCK (src->clock))); -+ -+ src->last_frame_time = gst_clock_get_time (GST_CLOCK (src->clock)); -+ - return GST_FLOW_OK; - } - -@@ -142,7 +153,9 @@ - - g_mutex_free (src->mutex); - -- G_OBJECT_CLASS (parent_class)->finalize (object); -+ gst_object_unref (src->clock); -+ -+ G_OBJECT_CLASS (cinnamon_recorder_src_parent_class)->finalize (object); - } - - static void -@@ -246,9 +259,9 @@ - g_return_if_fail (CINNAMON_IS_RECORDER_SRC (src)); - g_return_if_fail (src->caps != NULL); - -- gst_buffer_set_caps (buffer, src->caps); -+ gst_base_src_set_caps (GST_BASE_SRC (src), src->caps); - cinnamon_recorder_src_update_memory_used (src, -- (int) (GST_BUFFER_SIZE(buffer) / 1024)); -+ (int)(gst_buffer_get_size(buffer) / 1024)); - - g_async_queue_push (src->queue, gst_buffer_ref (buffer)); - } -diff -ruN a/src/test-recorder.c b/src/test-recorder.c ---- a/src/test-recorder.c 2013-10-16 15:10:22.240845159 +0000 -+++ b/src/test-recorder.c 2013-10-16 15:48:03.685915756 +0000 -@@ -1,5 +1,6 @@ - /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ - -+#define GST_USE_UNSTABLE_API - #include "cinnamon-recorder.h" - #include - #include -@@ -29,7 +30,6 @@ - ClutterAnimation *animation; - ClutterColor red, green, blue; - -- g_thread_init (NULL); - gst_init (&argc, &argv); - if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) - return 1; diff --git a/srcpkgs/cinnamon/patches/input_keybindings.patch b/srcpkgs/cinnamon/patches/input_keybindings.patch deleted file mode 100644 index 2e7a4cd667f..00000000000 --- a/srcpkgs/cinnamon/patches/input_keybindings.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/files/usr/lib/cinnamon-settings/modules/cs_keyboard.py -+++ b/files/usr/lib/cinnamon-settings/modules/cs_keyboard.py -@@ -119,6 +119,8 @@ KEYBINDINGS = [ - [_("Log out"), MEDIA_KEYS_SCHEMA, "logout", False, "system"], - [_("Lock screen"), MEDIA_KEYS_SCHEMA, "screensaver", False, "system"], - [_("Toggle recording desktop (must restart Cinnamon)"), MUFFIN_KEYBINDINGS_SCHEMA, "toggle-recording", True, "system"], -+ [_("Switch to next source"), MEDIA_KEYS_SCHEMA, "switch-input-source", False, "system"], -+ [_("Switch to previous source"), MEDIA_KEYS_SCHEMA, "switch-input-source-backward", False, "system"], - - # Launchers - [_("Launch help browser"), MEDIA_KEYS_SCHEMA, "help", False, "launchers"], diff --git a/srcpkgs/cinnamon/patches/keyboard_applet.patch b/srcpkgs/cinnamon/patches/keyboard_applet.patch deleted file mode 100644 index 29ea489ce3c..00000000000 --- a/srcpkgs/cinnamon/patches/keyboard_applet.patch +++ /dev/null @@ -1,133 +0,0 @@ ---- a/files/usr/share/cinnamon/applets/keyboard@cinnamon.org/applet.js -+++ b/files/usr/share/cinnamon/applets/keyboard@cinnamon.org/applet.js -@@ -1,9 +1,10 @@ - const Applet = imports.ui.applet; --const Gkbd = imports.gi.Gkbd; - const Lang = imports.lang; --const Cinnamon = imports.gi.Cinnamon; -+const Gio = imports.gi.Gio; -+const GLib = imports.gi.GLib; - const St = imports.gi.St; - const Gtk = imports.gi.Gtk; -+const CinnamonDesktop = imports.gi.CinnamonDesktop; - const Main = imports.ui.main; - const PopupMenu = imports.ui.popupMenu; - const Util = imports.misc.util; -@@ -16,11 +17,12 @@ function LayoutMenuItem() { - LayoutMenuItem.prototype = { - __proto__: PopupMenu.PopupBaseMenuItem.prototype, - -- _init: function(config, id, indicator, long_name) { -+ _init: function(ipsettings, id, index, indicator, long_name) { - PopupMenu.PopupBaseMenuItem.prototype._init.call(this); - -- this._config = config; -+ this._ipsettings = ipsettings; - this._id = id; -+ this._index = index; - this.label = new St.Label({ text: long_name }); - this.indicator = indicator; - this.addActor(this.label); -@@ -29,7 +31,7 @@ LayoutMenuItem.prototype = { - - activate: function(event) { - PopupMenu.PopupBaseMenuItem.prototype.activate.call(this); -- this._config.lock_group(this._id); -+ this._ipsettings.set_value('current', GLib.Variant.new_uint32(this._index)); - } - }; - -@@ -62,18 +64,18 @@ MyApplet.prototype = { - this._syncConfig, - null); - -- this._config = Gkbd.Configuration.get(); -- this._config.connect('changed', Lang.bind(this, this._syncConfig)); -- this._config.connect('group-changed', Lang.bind(this, this._syncGroup)); -+ this._xkbInfo = new CinnamonDesktop.XkbInfo(); -+ this._ipsettings = new Gio.Settings({ schema: 'org.cinnamon.desktop.input-sources' }); -+ this._ipsettings.connect('changed::sources', Lang.bind(this, this._syncConfig)); -+ this._ipsettings.connect('changed::current', Lang.bind(this, this._syncGroup)); - -- this._config.start_listen(); - - this._syncConfig(); - - this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, function() { - Main.overview.hide(); -- Util.spawn(['gkbd-keyboard-display', '-g', String(this._config.get_current_group() + 1)]); -+ Util.spawn(['gkbd-keyboard-display', '-l', this._selectedLayout._id]); - })); - this.menu.addAction(_("Show Character Table"), Lang.bind(this, function() { - Main.overview.hide(); -@@ -113,8 +115,8 @@ MyApplet.prototype = { - }, - - _syncConfig: function() { -- let groups = this._config.get_group_names(); -- if (groups.length > 1) { -+ let sources = this._ipsettings.get_value('sources'); -+ if (sources.n_children() > 1) { - this.actor.show(); - } else { - this.menu.close(); -@@ -127,25 +129,30 @@ MyApplet.prototype = { - for (let i = 0; i < this._labelActors.length; i++) - this._labelActors[i].destroy(); - -- let short_names = this._adjustGroupNames(this._config.get_short_group_names()); - - this._selectedLayout = null; - this._layoutItems = [ ]; - this._labelActors = [ ]; -- for (let i = 0; i < groups.length; i++) { -- let icon_name = this._config.get_group_name(i); -+ for (let i = 0; i < sources.n_children(); i++) { -+ let [type, id] = sources.get_child_value(i).deep_unpack(); -+ let displayName = id; -+ let shortName = id; -+ let xkbLayout = id; -+ if (type == 'xkb') { -+ [_exists, displayName, shortName, xkbLayout, _xkbVariant] = this._xkbInfo.get_layout_info(id); -+ } // TODO: errorhandling, handle 'ibus' -+ let icon_name = xkbLayout; // FIXME: Really? - let actor; - if (this._showFlags) - actor = new St.Icon({ icon_name: icon_name, icon_type: St.IconType.FULLCOLOR, style_class: 'popup-menu-icon' }); - else -- actor = new St.Label({ text: short_names[i] }); -- let item = new LayoutMenuItem(this._config, i, actor, groups[i]); -- item._short_group_name = short_names[i]; -+ actor = new St.Label({ text: shortName }); -+ let item = new LayoutMenuItem(this._ipsettings, id, i, actor, displayName); - item._icon_name = icon_name; - this._layoutItems.push(item); - this.menu.addMenuItem(item, i); - -- let shortLabel = new St.Label({ text: short_names[i] }); -+ let shortLabel = new St.Label({ text: shortName }); - this._labelActors.push(shortLabel); - } - -@@ -153,17 +160,17 @@ MyApplet.prototype = { - }, - - _syncGroup: function() { -- let selected = this._config.get_current_group(); -+ let current = this._ipsettings.get_uint('current'); - - if (this._selectedLayout) { - this._selectedLayout.setShowDot(false); - this._selectedLayout = null; - } - -- let item = this._layoutItems[selected]; -+ let item = this._layoutItems[current]; - item.setShowDot(true); - -- let selectedLabel = this._labelActors[selected]; -+ let selectedLabel = this._labelActors[current]; - - if (this._showFlags) { - this.set_applet_icon_name(item._icon_name); diff --git a/srcpkgs/cinnamon/patches/set_wheel.patch b/srcpkgs/cinnamon/patches/set_wheel.patch new file mode 100644 index 00000000000..81c6dc4b583 --- /dev/null +++ b/srcpkgs/cinnamon/patches/set_wheel.patch @@ -0,0 +1,53 @@ +--- a/files/usr/lib/cinnamon-settings-users/cinnamon-settings-users.py ++++ b/files/usr/lib/cinnamon-settings-users/cinnamon-settings-users.py +@@ -144,12 +144,11 @@ class EditableEntry (Gtk.Notebook): + + class PasswordDialog(Gtk.Dialog): + +- def __init__ (self, user, password_mask, group_mask): ++ def __init__ (self, user, password_mask): + super(PasswordDialog, self).__init__() + + self.user = user + self.password_mask = password_mask +- self.group_mask = group_mask + + self.set_modal(True) + self.set_skip_taskbar_hint(True) +@@ -215,12 +214,6 @@ class PasswordDialog(Gtk.Dialog): + def change_password(self): + newpass = self.new_password.get_text() + self.user.set_password(newpass, "") +- os.system("gpasswd -d '%s' nopasswdlogin" % self.user.get_user_name()) +- mask = self.group_mask.get_text() +- mask = mask.split(", ") +- mask.remove("nopasswdlogin") +- mask = ", ".join(mask) +- self.group_mask.set_text(mask) + self.password_mask.set_text(u'\u2022\u2022\u2022\u2022\u2022\u2022') + self.destroy() + +@@ -515,7 +508,7 @@ class Module: + model, treeiter = self.users_treeview.get_selection().get_selected() + if treeiter != None: + user = model[treeiter][INDEX_USER_OBJECT] +- dialog = PasswordDialog(user, self.password_mask, self.groups_label) ++ dialog = PasswordDialog(user, self.password_mask) + response = dialog.run() + + def _on_groups_button_clicked(self, widget): +@@ -745,11 +738,11 @@ class Module: + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size("/usr/share/cinnamon/faces/user-generic.png", 48, 48) + description = "%s\n%s" % (fullname, username) + piter = self.users.append(None, [new_user, pixbuf, description]) +- # Add the user to his/her own group and sudo if Administrator was selected ++ # Add the user to his/her own group and wheel if Administrator was selected + if dialog.account_type_combo.get_active() == 1: +- os.system("usermod %s -G %s,sudo,nopasswdlogin" % (username, username)) ++ os.system("usermod %s -G %s,wheel" % (username, username)) + else: +- os.system("usermod %s -G %s,nopasswdlogin" % (username, username)) ++ os.system("usermod %s -G %s" % (username, username)) + self.load_groups() + dialog.destroy() + diff --git a/srcpkgs/cinnamon/template b/srcpkgs/cinnamon/template index d1981839065..ce768982d30 100644 --- a/srcpkgs/cinnamon/template +++ b/srcpkgs/cinnamon/template @@ -4,11 +4,11 @@ _RUNTIMEDEPS=" accountsservice caribou cinnamon-settings-daemon cinnamon-session muffin cinnamon-control-center cinnamon-screensaver cinnamon-translations nemo gnome-icon-theme gnome-themes-standard librsvg network-manager-applet - pygtk dbus-python python-pam python-pexpect python-inotify - python-lxml python-imaging network-manager-applet polkit-gnome" + pygtk python-dbus python-pam python-pexpect python-inotify + python-lxml python-Pillow network-manager-applet polkit-gnome" pkgname=cinnamon -version=2.0.14 +version=2.2.16 revision=1 patch_args="-Np1" short_desc="GNOME3 fork of Linux Mint with GNOME2 aspect" @@ -16,7 +16,7 @@ build_style=gnu-configure configure_args="--disable-static --disable-schemas-compile --enable-compile-warnings=no" hostmakedepends="automake libtool gnome-common pkg-config gobject-introspection gettext-devel intltool which xmlto docbook-xml gtk-doc git" -makedepends="cjs-devel clutter-gtk-devel gnome-menus-devel gstreamer1-devel +makedepends="cjs-devel clutter-gtk-devel cinnamon-menus-devel gstreamer1-devel muffin-devel webkitgtk-devel libgnomekbd-devel polkit-devel libcanberra-devel startup-notification-devel pulseaudio-devel dbus-glib-devel GConf-devel libgnome-keyring-devel NetworkManager-devel libcroco-devel ${_RUNTIMEDEPS}"