about summary refs log tree commit diff
path: root/pkgs
diff options
context:
space:
mode:
authoraszlig <aszlig@redmoonstudios.org>2014-07-14 14:46:18 +0200
committeraszlig <aszlig@redmoonstudios.org>2014-07-14 15:20:23 +0200
commitd7b4a0e115bb46309706285e6005a64eae122568 (patch)
tree7d13afd3b0893ea12ccf3b47d43f07ec18d29ad3 /pkgs
parent0aad7f1b85b854feea09308d32c046f68eb45e6b (diff)
Move new packages from overrides/ into pkgs/.
Those packages aren't actually overrides and thus it doesn't make sense
to categorize them into "overrides".

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Diffstat (limited to 'pkgs')
-rw-r--r--pkgs/axbo/default.nix77
-rw-r--r--pkgs/blop/default.nix16
-rw-r--r--pkgs/default.nix25
-rw-r--r--pkgs/fish/default.nix43
-rw-r--r--pkgs/gajim/0.16-pre.nix89
-rw-r--r--pkgs/gajim/config.patch80
-rw-r--r--pkgs/kpatches/bfqsched.nix46
-rw-r--r--pkgs/kpatches/bfqsched.patch13
-rw-r--r--pkgs/libcmt/default.nix25
-rw-r--r--pkgs/librxtx-java/default.nix29
-rw-r--r--pkgs/lockdev/default.nix23
-rw-r--r--pkgs/nbxmpp/default.nix17
-rw-r--r--pkgs/pvolctrl/default.nix35
-rw-r--r--pkgs/tkabber-urgent-plugin/default.nix26
14 files changed, 544 insertions, 0 deletions
diff --git a/pkgs/axbo/default.nix b/pkgs/axbo/default.nix
new file mode 100644
index 00000000..d83e891d
--- /dev/null
+++ b/pkgs/axbo/default.nix
@@ -0,0 +1,77 @@
+{ stdenv, fetchurl, oraclejre, librxtx_java, makeFontsConf, dejavu_fonts }:
+
+stdenv.mkDerivation rec {
+  name = "axbo-research-${version}";
+  version = "2.0.18";
+
+  src = fetchurl {
+    url = let
+      urlversion = stdenv.lib.replaceChars ["."] ["_"] version;
+    in "https://www.dropbox.com/s/shy0yqcyivonobi/aXbo_unix_${urlversion}.sh";
+    sha256 = "1zc3bpqfa5pdpl7masigvv98mi5phl04p80fyd2ink33xbmik70z";
+  };
+
+  buildInputs = [ oraclejre librxtx_java ];
+
+  unpackCmd = let
+    fontconfigFile = makeFontsConf {
+      fontDirectories = stdenv.lib.singleton dejavu_fonts;
+    };
+  in ''
+    datalen="$(sed -n 's/^.*totalDataLength=\([0-9]\+\).*$/\1/p' "$src")"
+    installer_offset="$(sed -n 's/^ *tail *-c *\([0-9]\+\).*$/\1/p' "$src")"
+
+    installer_dir="$(mktemp -d)"
+    mkdir -p "$installer_dir"
+    tail -c "$installer_offset" "$src" | tar xz -C "$installer_dir"
+
+    cat > "$installer_dir/responses" <<EOF
+    executeLauncherAction$Boolean=false
+    sys.programGroup.linkDir=/dev/null
+    sys.component.73$Boolean=true
+    sys.languageId=en
+    sys.installationDir=$(pwd)/${name}
+    sys.programGroup.enabled$Boolean=false
+    sys.programGroup.allUsers$Boolean=true
+    sys.programGroup.name=aXbo
+    EOF
+
+    cd "$installer_dir"
+    export FONTCONFIG_FILE="${fontconfigFile}"
+    java -client -Dinstall4j.jvmDir="${oraclejre}" \
+                 -Dexe4j.moduleName="$src" \
+                 -Dexe4j.totalDataLength="$datalen" \
+                 -Dinstall4j.cwd="$installer_dir" \
+                 -Djava.ext.dirs="${oraclejre}/lib/ext" \
+                 -Dsun.java2d.noddraw=true \
+                 -classpath i4jruntime.jar:user.jar \
+                 com.install4j.runtime.Launcher launch \
+                 com.install4j.runtime.installer.Installer \
+                 false false "" "" false true false "" true true \
+                 0 0 "" 20 20 Arial 0,0,0 8 500 'version 2.0.18' \
+                 20 40 Arial 0,0,0 8 500 \
+                 -1 -q -varfile "$installer_dir/responses"
+    cd -
+    rm -rf "$installer_dir"
+  '';
+
+  installPhase = ''
+    mkdir -p "$out/libexec/lib" "$out/bin"
+    for jarfile in lib/*; do
+      case "''${jarfile##*/}" in
+        axbo.jar) cp -vt "$out/libexec" "$jarfile";;
+        RXTXcomm.jar) ln -s "${librxtx_java}/lib/java/RXTXcomm.jar" \
+                            "$out/libexec/lib";;
+        *.jar) cp -vt "$out/libexec/lib" "$jarfile";;
+      esac
+    done
+
+    cat > "$out/bin/axbo-research" <<WRAPPER
+    #!${stdenv.shell}
+    ${oraclejre}/bin/java -Djava.library.path="${librxtx_java}/lib" \
+      -classpath "${librxtx_java}/lib/java/RXTXcomm.jar" \
+      -jar "$out/libexec/axbo.jar"
+    WRAPPER
+    chmod +x "$out/bin/axbo-research"
+  '';
+}
diff --git a/pkgs/blop/default.nix b/pkgs/blop/default.nix
new file mode 100644
index 00000000..6f1f49c5
--- /dev/null
+++ b/pkgs/blop/default.nix
@@ -0,0 +1,16 @@
+{ stdenv, fetchurl, ladspaH }:
+
+stdenv.mkDerivation rec {
+  name = "blop-${version}";
+  version = "0.2.8";
+
+  configureFlags = [
+    "--with-ladspa-prefix=${ladspaH}"
+    "--with-ladspa-plugin-dir=$(out)/lib/ladspa"
+  ];
+
+  src = fetchurl {
+    url = "mirror://sourceforge/blop/${name}.tar.gz";
+    sha256 = "02iymw84dml8glyqgx1mxq4fz2fifgi1jca28hx2r3a2mi7i71vy";
+  };
+}
diff --git a/pkgs/default.nix b/pkgs/default.nix
new file mode 100644
index 00000000..21eb04d2
--- /dev/null
+++ b/pkgs/default.nix
@@ -0,0 +1,25 @@
+{ pkgs ? import <nixpkgs> {}
+}:
+
+let
+  callPackage = pkgs.lib.callPackageWith (pkgs // self);
+
+  self = {
+    axbo = callPackage ./axbo { };
+    blop = callPackage ./blop { };
+    fish = callPackage ./fish { };
+    gajim = callPackage ./gajim/0.16-pre.nix {
+      inherit (pkgs.xlibs) libX11;
+    };
+    libCMT = callPackage ./libcmt { };
+    librxtx_java = callPackage ./librxtx-java { };
+    lockdev = callPackage ./lockdev { };
+    nbxmpp = callPackage ./nbxmpp { };
+    pvolctrl = callPackage ./pvolctrl { };
+    tkabber_urgent_plugin = callPackage ./tkabber-urgent-plugin { };
+
+    aszligKernelPatches = {
+      bfqsched = callPackage ./kpatches/bfqsched.nix { };
+    };
+  };
+in { aszlig = self; }
diff --git a/pkgs/fish/default.nix b/pkgs/fish/default.nix
new file mode 100644
index 00000000..bc37837b
--- /dev/null
+++ b/pkgs/fish/default.nix
@@ -0,0 +1,43 @@
+{ stdenv, fetchurl, autoconf, ncurses, groff, pythonPackages }:
+
+stdenv.mkDerivation rec {
+  name = "fish-${version}";
+  version = "2.0.0";
+
+  buildInputs = [ autoconf ncurses pythonPackages.python ];
+
+  pythonPath = [ pythonPackages.curses ];
+
+  enableParallelBuilding = true;
+
+  preConfigure = ''
+    autoconf
+    sed -i 's/\<which\>/type -P/g' configure
+  '';
+
+  postFixup = ''
+    gen_inserts() {
+      for i in $pythonPath; do
+        echo -n "; sys.path.insert(0, '$(toPythonPath "$i")')"
+      done
+    }
+
+    find "$out/share/fish/tools" -type f -perm +0100 -name '*.py' |
+    xargs sed -i -r \
+      -e '1 { /^#!/c #!${pythonPackages.python}/bin/python
+            }' \
+      -e '0,/^(from|import)/{/^(from|import)/a import sys'"$(gen_inserts)"'
+                            }'
+
+    sed -i -e "/Popen/s/'manpath'/'man', '-w'/p" \
+      "$out/share/fish/tools/create_manpage_completions.py"
+
+    sed -i -e 's|nroff|${groff}/bin/nroff|g' \
+      "$out/share/fish/functions/__fish_print_help.fish"
+  '';
+
+  src = fetchurl {
+    url = "http://fishshell.com/files/${version}/fish.tar.gz";
+    sha1 = "2d28553e2ff975f8e5fed6b266f7a940493b6636";
+  };
+}
diff --git a/pkgs/gajim/0.16-pre.nix b/pkgs/gajim/0.16-pre.nix
new file mode 100644
index 00000000..c11e0284
--- /dev/null
+++ b/pkgs/gajim/0.16-pre.nix
@@ -0,0 +1,89 @@
+{ stdenv, fetchurl, fetchhg, python, intltool, pkgconfig, libX11, gtk
+, host, pyopenssl, pythonDBus, pythonPackages, nbxmpp
+
+, enableJingle ? true, farstream ? null, gst_plugins_bad ? null
+,                      libnice ? null
+, enableE2E ? true
+, enableRST ? true
+, enableSpelling ? true, gtkspell ? null
+, enableNotifications ? false
+, enableLaTeX ? false, texLive ? null
+
+# FIXME: Remove after final release.
+, autoconf, automake, libtool
+}:
+
+assert enableJingle -> farstream != null && gst_plugins_bad != null
+                    && libnice != null;
+assert enableE2E -> pythonPackages.pycrypto != null;
+assert enableRST -> pythonPackages.docutils != null;
+assert enableSpelling -> gtkspell != null;
+assert enableNotifications -> pythonPackages.notify != null;
+assert enableLaTeX -> texLive != null;
+
+with stdenv.lib;
+
+stdenv.mkDerivation rec {
+  name = "gajim-${version}";
+  version = "0.16";
+
+  src = fetchhg {
+    url = "http://hg.gajim.org/gajim";
+    rev = "f38e5fd4f8e3";
+    sha256 = "17wmy355znfkv4fbwa4hzicr17k8if75mh3b14yphszfw3bh3mfw";
+  };
+
+  preConfigure = ''
+    sed -e 's/\<which\>/type -P/' autogen.sh | sh
+  '';
+
+  postPatch = ''
+    sed -i -e '0,/^[^#]/ {
+      /^[^#]/i export \\\
+        PYTHONPATH="'"$PYTHONPATH\''${PYTHONPATH:+:}\$PYTHONPATH"'" \\\
+        GST_PLUGIN_PATH="'"\$GST_PLUGIN_PATH''${GST_PLUGIN_PATH:+:}${""
+        }$GST_PLUGIN_PATH"'"
+    }' scripts/gajim.in
+
+    sed -i -e 's/return helpers.is_in_path('"'"'nslookup.*/return True/' \
+      src/features_window.py
+    sed -i -e '/is_in_path\|return \[.host/'"s|'host'|'${host}/bin/host'|" \
+      src/common/resolver.py
+  '' + optionalString enableSpelling ''
+    sed -i -e 's|=.*find_lib.*|= "${gtkspell}/lib/libgtkspell.so"|'   \
+      src/gtkspell.py
+  '' + optionalString enableLaTeX ''
+    sed -i -e "s|try_run(.'dvipng'|try_run(['${texLive}/bin/dvipng'|" \
+           -e "s|try_run(.'latex'|try_run(['${texLive}/bin/latex'|"   \
+           -e 's/tmpfd.close()/os.close(tmpfd)/'                      \
+           src/common/latex.py
+  '';
+
+  buildInputs = [
+    python intltool pkgconfig libX11
+    pythonPackages.pygobject pythonPackages.pyGtkGlade
+    pythonPackages.sqlite3 pythonPackages.pyasn1
+    pythonPackages.pyxdg nbxmpp
+    pyopenssl pythonDBus
+    # FIXME: Remove after final release.
+    autoconf automake libtool
+  ] ++ optionals enableJingle [ farstream gst_plugins_bad libnice ]
+    ++ optional enableE2E pythonPackages.pycrypto
+    ++ optional enableRST pythonPackages.docutils
+    ++ optional enableNotifications pythonPackages.notify
+    ++ optional enableLaTeX texLive;
+
+  postInstall = ''
+    install -m 644 -t "$out/share/gajim/icons/hicolor" \
+                      "icons/hicolor/index.theme"
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = {
+    homepage = "http://gajim.org/";
+    description = "Jabber client written in PyGTK";
+    license = licenses.gpl3Plus;
+    maintainers = [ maintainers.raskin maintainers.aszlig ];
+  };
+}
diff --git a/pkgs/gajim/config.patch b/pkgs/gajim/config.patch
new file mode 100644
index 00000000..ef40284f
--- /dev/null
+++ b/pkgs/gajim/config.patch
@@ -0,0 +1,80 @@
+diff --git a/src/common/optparser.py b/src/common/optparser.py
+index f84b18a..0078317 100644
+--- a/src/common/optparser.py
++++ b/src/common/optparser.py
+@@ -30,6 +30,7 @@ import os
+ import sys
+ import locale
+ import re
++from itertools import chain
+ from time import time
+ from common import gajim
+ from common import helpers
+@@ -46,19 +47,25 @@ class OptionsParser:
+ 
+     def read(self):
+         try:
+-            fd = open(self.__filename)
++            cfg = nixfd = open("@nix_config@", 'r')
+         except Exception:
+             if os.path.exists(self.__filename):
+                 #we talk about a file
+                 print _('Error: cannot open %s for reading') % self.__filename
+             return False
+ 
++        try:
++            fd = open(self.__filename)
++            cfg = chain(cfg, fd)
++        except Exception:
++            fd = None
++
+         new_version = gajim.config.get('version')
+         new_version = new_version.split('-', 1)[0]
+         seen = set()
+         regex = re.compile(r"(?P<optname>[^.]+)(?:(?:\.(?P<key>.+))?\.(?P<subname>[^.]+))?\s=\s(?P<value>.*)")
+ 
+-        for line in fd:
++        for line in cfg:
+             try:
+                 line = line.decode('utf-8')
+             except UnicodeDecodeError:
+@@ -79,10 +86,13 @@ class OptionsParser:
+         self.update_config(old_version, new_version)
+         self.old_values = {} # clean mem
+ 
+-        fd.close()
++        if fd is not None:
++            fd.close()
++
++        nixfd.close()
+         return True
+ 
+-    def write_line(self, fd, opt, parents, value):
++    def write_line(self, (fd, nixcfg), opt, parents, value):
+         if value is None:
+             return
+         value = value[1]
+@@ -102,17 +112,21 @@ class OptionsParser:
+                     p = p.encode('utf-8')
+                 s += p + '.'
+         s += opt
+-        fd.write(s + ' = ' + value + '\n')
++        line = s + ' = ' + value + '\n'
++        if not nixcfg.startswith(line) and not ('\n' + line) in nixcfg:
++            fd.write(line)
+ 
+     def write(self):
+         (base_dir, filename) = os.path.split(self.__filename)
+         self.__tempfile = os.path.join(base_dir, '.' + filename)
++
+         try:
++            nixcfg = open("@nix_config@", 'r').read()
+             f = open(self.__tempfile, 'w')
+         except IOError, e:
+             return str(e)
+         try:
+-            gajim.config.foreach(self.write_line, f)
++            gajim.config.foreach(self.write_line, (f, nixcfg))
+         except IOError, e:
+             return str(e)
+         f.flush()
diff --git a/pkgs/kpatches/bfqsched.nix b/pkgs/kpatches/bfqsched.nix
new file mode 100644
index 00000000..3ba7310f
--- /dev/null
+++ b/pkgs/kpatches/bfqsched.nix
@@ -0,0 +1,46 @@
+{ stdenv, fetchurl }:
+
+let
+  bfqVersion = "v7r5";
+  kernelVersion = "3.15";
+  version = "${kernelVersion}.0-${bfqVersion}";
+
+  baseURL = "http://algo.ing.unimo.it/people/paolo/disk_sched/patches";
+
+  fetchPatch = { name, sha256 }: fetchurl {
+    url = "${baseURL}/${version}/${name}.patch";
+    inherit sha256;
+  };
+
+  allPatches = [
+    (fetchPatch {
+      name = "0001-block-cgroups-kconfig-build-bits-for-BFQ-"
+           + "${bfqVersion}-${kernelVersion}";
+      sha256 = "16vrdg9ky7q89sb7gp8as7qslqg1zy1n28cnyshm91qnf49wfh7g";
+    })
+    (fetchPatch {
+      name = "0002-block-introduce-the-BFQ-"
+           + "${bfqVersion}-I-O-sched-for-${kernelVersion}";
+      sha256 = "1gf4y5i9prhg9ls2g8apaiygm538khhpp35dahgv59hr3sfwsghs";
+    })
+    (fetchPatch {
+      name = "0003-block-bfq-add-Early-Queue-Merge-EQM-to-BFQ-"
+           + "${bfqVersion}-for-${kernelVersion}.0";
+      sha256 = "1q3fn6gl3lhvbqfhaarpv399id9sa32zx6ygqx4x98zmixwrsn9z";
+    })
+    ./bfqsched.patch
+  ];
+
+  patch = stdenv.mkDerivation {
+    name = "bfqsched-${version}.patch";
+    inherit allPatches;
+    buildCommand = ''
+      sed -e 's/IS_SUBSYS_ENABLED/IS_ENABLED/' \
+          -e '/SUBSYS/s/perf/&_event/' $allPatches > "$out"
+    '';
+  };
+
+in {
+  name = "bfqsched-${version}";
+  inherit version patch;
+}
diff --git a/pkgs/kpatches/bfqsched.patch b/pkgs/kpatches/bfqsched.patch
new file mode 100644
index 00000000..ae400155
--- /dev/null
+++ b/pkgs/kpatches/bfqsched.patch
@@ -0,0 +1,13 @@
+diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
+index 4579c6dd..d1d8e67 100644
+--- a/block/bfq-iosched.c
++++ b/block/bfq-iosched.c
+@@ -199,7 +199,7 @@ static inline void bfq_schedule_dispatch(struct bfq_data *bfqd)
+ {
+ 	if (bfqd->queued != 0) {
+ 		bfq_log(bfqd, "schedule dispatch");
+-		kblockd_schedule_work(bfqd->queue, &bfqd->unplug_work);
++		kblockd_schedule_work(&bfqd->unplug_work);
+ 	}
+ }
+ 
diff --git a/pkgs/libcmt/default.nix b/pkgs/libcmt/default.nix
new file mode 100644
index 00000000..e255ef25
--- /dev/null
+++ b/pkgs/libcmt/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, fetchurl, ladspaH }:
+
+stdenv.mkDerivation rec {
+  name = "libcmt-${version}";
+  version = "1.16";
+
+  buildInputs = [ ladspaH ];
+
+  setSourceRoot = ''
+    sourceRoot=cmt/src
+  '';
+
+  makeFlags = [
+    "INSTALL_PLUGINS_DIR=$(out)/lib/ladspa"
+  ];
+
+  preInstall = ''
+    mkdir -p "$out/lib/ladspa"
+  '';
+
+  src = fetchurl {
+    url = "http://www.ladspa.org/download/cmt_src_${version}.tgz";
+    sha256 = "0dan83pvljij3972bv214balc26p9fgw40i2d5y0x7lbd5z1saji";
+  };
+}
diff --git a/pkgs/librxtx-java/default.nix b/pkgs/librxtx-java/default.nix
new file mode 100644
index 00000000..861dc43b
--- /dev/null
+++ b/pkgs/librxtx-java/default.nix
@@ -0,0 +1,29 @@
+{ stdenv, fetchurl, unzip, jdk, lockdev }:
+
+stdenv.mkDerivation rec {
+  name = "rxtx-${version}";
+  version = "2.2pre2";
+
+  src = fetchurl {
+    urls = [
+      "http://rxtx.qbang.org/pub/rxtx/${name}.zip"
+      "ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/${name}.zip"
+    ];
+    sha256 = "00sv9604hkq81mshih0fhqfzn4mf01d6rish6vplsi0gfqz3fc1w";
+  };
+
+  buildInputs = [ unzip jdk lockdev ];
+
+  NIX_CFLAGS_COMPILE = "-DUTS_RELEASE=\"3.8.0\"";
+
+  configureFlags = [ "--enable-liblock" ];
+
+  makeFlags = [
+    "JHOME=$(out)/lib/java"
+    "RXTX_PATH=$(out)/lib"
+  ];
+
+  preInstall = ''
+    mkdir -p "$out/lib/java"
+  '';
+}
diff --git a/pkgs/lockdev/default.nix b/pkgs/lockdev/default.nix
new file mode 100644
index 00000000..52e78eb5
--- /dev/null
+++ b/pkgs/lockdev/default.nix
@@ -0,0 +1,23 @@
+{ stdenv, fetchurl, perl }:
+
+let
+  baseurl = "ftp://ftp.debian.org/debian/pool/main/l/lockdev/";
+in stdenv.mkDerivation rec {
+  name = "lockdev-${version}";
+  version = "1.0.3";
+
+  buildInputs = [ perl ];
+
+  patches = stdenv.lib.singleton (fetchurl {
+    url = baseurl + "lockdev_1.0.3-1.5.diff.gz";
+    sha256 = "1l3pq1nfb5qx3i91cjaiz3c53368gw6m28a5mv9391n5gmsdmi3r";
+  });
+
+  NIX_CFLAGS_COMPILE = "-fPIC -D_PATH_LOCK=\"/tmp\"";
+  installFlags = [ "basedir=$(out)" ];
+
+  src = fetchurl {
+    url = baseurl + "lockdev_${version}.orig.tar.gz";
+    sha256 = "10lzhq6r2dn8y3ki7wlqsa8s3ndkf842bszcjw4dbzf3g9fn7bnc";
+  };
+}
diff --git a/pkgs/nbxmpp/default.nix b/pkgs/nbxmpp/default.nix
new file mode 100644
index 00000000..fa306432
--- /dev/null
+++ b/pkgs/nbxmpp/default.nix
@@ -0,0 +1,17 @@
+{ stdenv, fetchurl, buildPythonPackage }:
+
+buildPythonPackage rec {
+  name = "nbxmpp-0.4";
+
+  src = fetchurl {
+    name = "${name}.tar.gz";
+    url = "https://python-nbxmpp.gajim.org/downloads/4";
+    sha256 = "073qhz6vgsym4rkgwj801girl8xqhlbr37xn5lg0za9c61vmwayh";
+  };
+
+  meta = {
+    homepage = "https://python-nbxmpp.gajim.org/";
+    description = "Non-blocking Jabber/XMPP module";
+    license = stdenv.lib.licenses.gpl3;
+  };
+}
diff --git a/pkgs/pvolctrl/default.nix b/pkgs/pvolctrl/default.nix
new file mode 100644
index 00000000..25edb27f
--- /dev/null
+++ b/pkgs/pvolctrl/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, fetchurl, pkgconfig, pulseaudio }:
+
+stdenv.mkDerivation rec {
+  name = "pvolctrl-0.23";
+
+  unpackPhase = let
+    baseurl = "https://sites.google.com/site/guenterbartsch/blog/"
+            + "volumecontrolutilityforpulseaudio/";
+    makefile = fetchurl {
+      url = baseurl + "Makefile";
+      sha256 = "0l2ffvb617csk6h29y64v6ywhpcp7la6vvcip1w4nq0yry6jhrqz";
+    };
+    source = fetchurl {
+      url = baseurl + "pvolctrl.c";
+      sha256 = "0vcd5dlw9l47jpabwmmzdvlkn67fz55dr3sryyh56sl263mibjda";
+    };
+  in ''
+    mkdir -p "${name}"
+    sed -e 's|/usr/bin/||' "${makefile}" > "${name}/Makefile"
+    sed -e 's/PA_VOLUME_MAX/PA_VOLUME_NORM/
+    /avg_vol += (avg_vol \* vol_mod) \/ 100;/ {
+      s/(avg_vol/((int)PA_VOLUME_NORM/
+    }
+    /if (vol_mod)/i \
+      if (info->name == NULL || strncmp(info->name, "combined", 8) != 0) \
+        return;' "${source}" > "${name}/pvolctrl.c"
+    sourceRoot="${name}"
+  '';
+
+  installPhase = ''
+    install -D -T pvolctrl "$out/bin/pvolctrl"
+  '';
+
+  buildInputs = [ pkgconfig pulseaudio ];
+}
diff --git a/pkgs/tkabber-urgent-plugin/default.nix b/pkgs/tkabber-urgent-plugin/default.nix
new file mode 100644
index 00000000..b39e5ea8
--- /dev/null
+++ b/pkgs/tkabber-urgent-plugin/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchsvn, xlibs }:
+
+stdenv.mkDerivation {
+  name = "tkabber-urgent-plugin";
+
+  src = fetchsvn {
+    url = "http://svn.xmpp.ru/repos/tkabber-3rd-party/trunk/plugins/urgent";
+    rev = 528;
+    sha256 = "1qr7i0559ad5y1l5h2gp8aix4nsfgm0bx7jqb030hgbxaw1xnbp5";
+  };
+
+  buildInputs = [ xlibs.libX11 ];
+
+  patchPhase = ''
+    sed -i -e 's|exec xwininfo|exec ${xlibs.xwininfo}/bin/xwininfo|' urgent.tcl
+  '';
+
+  buildPhase = ''
+    gcc -lX11 -o urgent urgent.c
+  '';
+
+  installPhase = ''
+    install -vd "$out/share/tkabber-plugins/urgent"
+    cp -vpt "$out/share/tkabber-plugins/urgent" urgent urgent.tcl
+  '';
+}