summaryrefslogtreecommitdiff
path: root/staging
diff options
context:
space:
mode:
authorNicolás Reynolds <fauno@kiwwwi.com.ar>2012-10-17 10:20:19 -0300
committerNicolás Reynolds <fauno@kiwwwi.com.ar>2012-10-17 10:20:19 -0300
commit66e4c91d4531eef5adcd9dbe4a71e63c9b72cd7e (patch)
tree19e3e26a15f15fc8405ba2016fe9d4cc19919833 /staging
parentc646bdd97c63b2d81bc27060203fabfebabda716 (diff)
parentc84b2cd310f86dc50c4f52a5907cb17652e8c87c (diff)
Merged upstream, mesa needs revision
Merge branch 'master' of ssh://vparabola/home/parabola/abslibre-pre-mips64el Conflicts: community-staging/gigi/PKGBUILD community-staging/lxdm/PKGBUILD community-staging/lxdm/lxdm-pam community-staging/lxdm/lxdm.install community-staging/lxdm/service community-testing/gigi/PKGBUILD community/calf/PKGBUILD community/freedroidrpg/PKGBUILD community/gmic/PKGBUILD community/gnash/PKGBUILD community/prboom/PKGBUILD community/scorched3d/PKGBUILD community/tmux/PKGBUILD community/torcs/PKGBUILD core/curl/PKGBUILD core/systemd/PKGBUILD core/sysvinit/PKGBUILD extra/akonadi/PKGBUILD extra/bzflag/PKGBUILD extra/dhcp/PKGBUILD extra/ftgl/PKGBUILD extra/gcin/PKGBUILD extra/imagemagick/PKGBUILD extra/mesa/PKGBUILD extra/python-telepathy/PKGBUILD extra/qtiplot/PKGBUILD extra/ruby/PKGBUILD extra/wireshark/PKGBUILD extra/xfce4-xkb-plugin/PKGBUILD extra/xine-lib/PKGBUILD extra/xorg-server/PKGBUILD gnome-unstable/at-spi2-atk/PKGBUILD gnome-unstable/at-spi2-core/PKGBUILD gnome-unstable/baobab/PKGBUILD gnome-unstable/epiphany/PKGBUILD gnome-unstable/gdm/PKGBUILD gnome-unstable/glib2/PKGBUILD gnome-unstable/gnome-games/PKGBUILD gnome-unstable/gnome-screensaver/PKGBUILD gnome-unstable/gnome-session/PKGBUILD gnome-unstable/gtk3/PKGBUILD gnome-unstable/libpeas/PKGBUILD gnome-unstable/libsoup/PKGBUILD gnome-unstable/mutter/PKGBUILD gnome-unstable/networkmanager/PKGBUILD multilib/lib32-glew/PKGBUILD multilib/lib32-gnutls/PKGBUILD multilib/lib32-mesa/PKGBUILD multilib/lib32-sqlite/PKGBUILD multilib/wine/PKGBUILD multilib/wine_gecko/PKGBUILD staging/calligra/PKGBUILD staging/inkscape/PKGBUILD staging/kdebase-workspace/PKGBUILD staging/kdebase-workspace/kde-np.pam staging/kdebase-workspace/kde.pam staging/kdebase-workspace/kdm.service staging/libreoffice/PKGBUILD staging/libreoffice/libreoffice-common.csh staging/libreoffice/libreoffice-common.sh staging/poppler/PKGBUILD testing/dbus-python/PKGBUILD testing/e2fsprogs/PKGBUILD testing/iproute2/PKGBUILD testing/iptables/PKGBUILD testing/kdebase-workspace/PKGBUILD testing/kdebase-workspace/kde-np.pam testing/kdebase-workspace/kde.pam testing/kdebindings-python/PKGBUILD testing/lvm2/PKGBUILD testing/lvm2/lvm-on-crypt.service testing/lvm2/lvm.service testing/miro/PKGBUILD testing/postgresql/PKGBUILD testing/postgresql/postgresql.install testing/postgresql/postgresql.service testing/ppp/PKGBUILD testing/ppp/ip-down testing/pyqt/PKGBUILD testing/qscintilla/PKGBUILD testing/sip/PKGBUILD testing/systemd/PKGBUILD testing/systemd/systemd.install testing/util-linux/PKGBUILD testing/wpa_supplicant/PKGBUILD testing/wpa_supplicant/config testing/xf86-video-intel/PKGBUILD
Diffstat (limited to 'staging')
-rw-r--r--staging/bzr/PKGBUILD33
-rw-r--r--staging/dbus-python/PKGBUILD66
-rw-r--r--staging/gnome-python-desktop/PKGBUILD107
-rw-r--r--staging/gnome-python-desktop/gnome-python-desktop-2.32.0-metacity-build.patch42
-rw-r--r--staging/kdebase-workspace/kdm.logrotate6
-rw-r--r--staging/kdebase-workspace/logind-support.patch66
-rw-r--r--staging/konversation/PKGBUILD11
-rw-r--r--staging/libreoffice/make-pyuno-work-with-system-wide-module-install.diff44
-rw-r--r--staging/miro/PKGBUILD49
-rw-r--r--staging/miro/ffmpeg.patch63
-rw-r--r--staging/miro/miro.install17
-rw-r--r--staging/pycrypto/PKGBUILD52
-rw-r--r--staging/pygobject/PKGBUILD58
-rw-r--r--staging/pygobject2/PKGBUILD86
-rw-r--r--staging/pygobject2/python2-fix-type.patch50
-rw-r--r--staging/pygobject2/python3-fix-build.patch34
-rw-r--r--staging/pygobject2/python3-fix-maketrans.patch36
-rw-r--r--staging/pyopenssl/PKGBUILD46
-rw-r--r--staging/pyqt/PKGBUILD10
-rw-r--r--staging/python-egenix-mx-base/PKGBUILD31
-rw-r--r--staging/python-iwscan/PKGBUILD26
-rw-r--r--staging/python-markupsafe/PKGBUILD41
-rw-r--r--staging/python-notify/PKGBUILD43
-rw-r--r--staging/python-notify/libnotify07.patch36
-rw-r--r--staging/python-notify/notify-python-0.1.1-fix-GTK-symbols.patch25
-rw-r--r--staging/python-pyspi/PKGBUILD32
-rw-r--r--staging/python-pyspi/pyspi-build.patch1693
-rw-r--r--staging/python-pysqlite/PKGBUILD38
-rw-r--r--staging/python-pysqlite/setup.cfg5
-rw-r--r--staging/python-wpactrl/PKGBUILD26
-rw-r--r--staging/slim/PKGBUILD63
-rw-r--r--staging/slim/fix-glibc-segfault-1.3.4.patch13
-rw-r--r--staging/slim/libpng-1.4+-support.patch14
-rw-r--r--staging/slim/logrotate9
-rw-r--r--staging/slim/pam.d10
-rwxr-xr-xstaging/slim/rc.d36
-rw-r--r--staging/slim/session-name.patch21
-rw-r--r--staging/slim/slim.service9
-rw-r--r--staging/slim/tty-slowness.patch30
-rw-r--r--staging/sonata/PKGBUILD30
-rw-r--r--staging/sonata/info.py.patch15
-rw-r--r--staging/twisted/PKGBUILD37
-rw-r--r--staging/twisted/twisted.install11
-rw-r--r--staging/vde2/PKGBUILD50
-rw-r--r--staging/vde2/dhcpd.conf.sample12
-rw-r--r--staging/vde2/iptables.rules.sample5
-rw-r--r--staging/vde2/vde-config.sample35
-rw-r--r--staging/vde2/vde-connection.sample6
-rw-r--r--staging/vde2/vde.conf11
-rwxr-xr-xstaging/vde2/vde.rc113
-rw-r--r--staging/vde2/vde2.install10
-rw-r--r--staging/xfce4-session/PKGBUILD51
-rw-r--r--staging/xfce4-session/xfce4-session-4.10.0-add-systemd-support.patch388
-rw-r--r--staging/xfce4-session/xfce4-session.install13
-rw-r--r--staging/xorg-xdm/PKGBUILD60
-rw-r--r--staging/xorg-xdm/Xsession-loginshell.patch15
-rw-r--r--staging/xorg-xdm/Xsession-xsm.patch22
-rw-r--r--staging/xorg-xdm/git_fixes.diff673
-rw-r--r--staging/xorg-xdm/xdm-1.0.5-sessreg-utmp-fix-bug177890.patch8
-rw-r--r--staging/xorg-xdm/xdm.pam10
60 files changed, 4641 insertions, 11 deletions
diff --git a/staging/bzr/PKGBUILD b/staging/bzr/PKGBUILD
new file mode 100644
index 000000000..22244baf0
--- /dev/null
+++ b/staging/bzr/PKGBUILD
@@ -0,0 +1,33 @@
+# $Id: PKGBUILD 168772 2012-10-15 21:04:59Z eric $
+# Maintainer :
+# Contributor: Hugo Doria <hugo@archlinux.org>
+
+pkgname=bzr
+pkgver=2.5.1
+pkgrel=2
+pkgdesc="A decentralized revision control system (bazaar)"
+arch=('i686' 'x86_64')
+url="http://bazaar.canonical.com/en/"
+license=('GPL')
+depends=('python2')
+optdepends=('python2-paramiko: for sftp support')
+source=("http://launchpad.net/${pkgname}/${pkgver%.*}/${pkgver}/+download/${pkgname}-${pkgver}.tar.gz"{,.sig})
+md5sums=('ac5079858364a046071000d5cdccb67b'
+ 'c83dd08dd2c3e27edbab873500d7d6eb')
+
+build() {
+ cd "${srcdir}/${pkgname}-${pkgver}"
+ sed -i 's|man/man1|share/man/man1|' setup.py
+ sed -i 's|/usr/bin/env python|/usr/bin/env python2|' \
+ bzrlib/{plugins/bash_completion/bashcomp.py,tests/ssl_certs/create_ssls.py,patiencediff.py,_patiencediff_py.py}
+ python2 setup.py build
+}
+
+package() {
+ cd "${srcdir}/${pkgname}-${pkgver}"
+ python2 setup.py install --prefix=/usr --root="${pkgdir}" --optimize=1
+
+ # bash-completion
+ install -D -m644 contrib/bash/bzr \
+ "${pkgdir}/usr/share/bash-completion/completions/bzr"
+}
diff --git a/staging/dbus-python/PKGBUILD b/staging/dbus-python/PKGBUILD
new file mode 100644
index 000000000..b6b1bc24f
--- /dev/null
+++ b/staging/dbus-python/PKGBUILD
@@ -0,0 +1,66 @@
+# $Id: PKGBUILD 168669 2012-10-13 22:15:37Z eric $
+# Maintainer: Jan de Groot <jgc@archlinux.org>
+
+pkgbase=dbus-python
+pkgname=('python-dbus' 'python2-dbus' 'python-dbus-common')
+pkgver=1.1.1
+pkgrel=2
+pkgdesc="Python bindings for DBUS"
+arch=('i686' 'x86_64')
+license=('GPL' 'LGPL')
+url="http://www.freedesktop.org/wiki/Software/DBusBindings"
+makedepends=('docutils' 'dbus-glib' 'python' 'python2')
+options=('!libtool')
+source=(http://dbus.freedesktop.org/releases/${pkgbase}/${pkgbase}-${pkgver}.tar.gz)
+md5sums=('742c7432ad0f7c3f98291d58fa2e35dc')
+
+build() {
+ cd "${srcdir}"
+ mkdir build-python2 build-python3
+ cd "${srcdir}/build-python2"
+ PYTHON=python2 ../${pkgbase}-${pkgver}/configure --prefix=/usr
+ make
+
+
+ cd "${srcdir}/build-python3"
+ ../${pkgbase}-${pkgver}/configure --prefix=/usr
+ make
+}
+
+package_python-dbus-common() {
+ pkgdesc="Common dbus-python files shared between python-dbus and python2-dbus"
+ conflicts=('dbus-python<1.1.0')
+
+ cd "${srcdir}/build-python3"
+ make DESTDIR="${pkgdir}" install-data
+ rm -rf "${pkgdir}"/usr/lib/python*
+}
+
+package_python-dbus() {
+ depends=('python-dbus-common' 'python' 'dbus-core')
+ optdepends=('dbus-glib: glib mainloop support')
+ pkgdesc="Python 3.3 bindings for DBUS"
+
+ cd "${srcdir}/build-python3"
+ make DESTDIR="${pkgdir}" install
+
+ rm -rf "${pkgdir}/usr/share"
+ rm -rf "${pkgdir}/usr/include"
+ rm -rf "${pkgdir}/usr/lib/pkgconfig"
+}
+
+package_python2-dbus() {
+ depends=('python-dbus-common' 'python2' 'dbus-core')
+ optdepends=('dbus-glib: glib mainloop support')
+ pkgdesc="Python 2.7 bindings for DBUS"
+ replaces=('dbus-python')
+ conflicts=('dbus-python')
+ provides=("dbus-python=$pkgver")
+
+ cd "${srcdir}/build-python2"
+ make DESTDIR="${pkgdir}" install
+
+ rm -rf "${pkgdir}/usr/share"
+ rm -rf "${pkgdir}/usr/include"
+ rm -rf "${pkgdir}/usr/lib/pkgconfig"
+}
diff --git a/staging/gnome-python-desktop/PKGBUILD b/staging/gnome-python-desktop/PKGBUILD
new file mode 100644
index 000000000..4788632d1
--- /dev/null
+++ b/staging/gnome-python-desktop/PKGBUILD
@@ -0,0 +1,107 @@
+# $Id: PKGBUILD 168784 2012-10-16 00:01:27Z allan $
+# Maintainer: Jan de Groot <jgc@archlinux.org>
+# Contributor: Arjan Timmerman <arjan@soulfly.nl>
+# Contributor: Wael Nasreddine <gandalf@siemens-mobiles.org>
+
+pkgbase=gnome-python-desktop
+pkgname=('gnome-python-desktop' 'python2-gnomedesktop' 'python2-gnomekeyring' 'python2-gtop' 'python2-metacity' 'python2-rsvg' 'python2-totem-plparser' 'python2-wnck')
+pkgver=2.32.0
+pkgrel=11
+arch=(i686 x86_64)
+license=('GPL' 'LGPL')
+options=('!libtool')
+makedepends=('intltool' 'pkg-config' 'gnome-python' 'libgtop' 'totem-plparser' 'gnome-desktop2' 'metacity' 'librsvg' 'libwnck')
+url="http://www.gnome.org"
+source=(http://ftp.gnome.org/pub/gnome/sources/${pkgbase}/2.32/${pkgbase}-${pkgver}.tar.bz2
+ gnome-python-desktop-2.32.0-metacity-build.patch)
+sha256sums=('09dbd580bf3b0ef60f91b090eafe6d08ddcc50a609e2b425a7f8eca46d4e0ee9'
+ 'f012f9bd2f9baa527f07ad2f6e312c875bb6f2d3204270a1b053278a3a0c86b3')
+
+build() {
+ cd "${srcdir}/${pkgbase}-${pkgver}"
+ patch -p1 -i ../gnome-python-desktop-2.32.0-metacity-build.patch
+ PYTHON=/usr/bin/python2 ./configure --prefix=/usr --enable-metacity
+ make
+}
+
+package_gnome-python-desktop() {
+ depends=('python2-gnomedesktop' 'python2-gnomekeyring' 'python2-gtop' 'python2-metacity' 'python2-rsvg' 'python2-totem-plparser' 'python2-wnck' 'gnome2-python')
+ pkgdesc="Python bindings for the GNOME desktop environment"
+
+ cd "${srcdir}/${pkgbase}-${pkgver}"
+ make install-pkgconfigDATA DESTDIR="${pkgdir}"
+}
+
+package_python2-gnomedesktop() {
+ depends=('pygtk' 'gnome-desktop2' 'python2-gnomevfs')
+ pkgdesc="Python bindings for gnome-desktop 2.x"
+ conflicts=('python-gnomedesktop<=2.32.0-10')
+ replaces=('python-gnomedesktop<=2.32.0-10')
+
+ cd "${srcdir}/${pkgbase}-${pkgver}"
+ make -C gnomedesktop install DESTDIR="${pkgdir}"
+}
+
+package_python2-gnomekeyring() {
+ depends=('pygtk' 'libgnome-keyring')
+ pkgdesc="Python bindings for libgnome-keyring"
+ conflicts=('python-gnomekeyring<=2.32.0-10')
+ replaces=('python-gnomekeyring<=2.32.0-10')
+
+ cd "${srcdir}/${pkgbase}-${pkgver}"
+ make -C gnomekeyring install DESTDIR="${pkgdir}"
+}
+
+package_python2-gtop() {
+ depends=('pygtk' 'libgtop')
+ pkgdesc="Python bindings for libgtop"
+ conflicts=('python-gtop<=2.32.0-10')
+ replaces=('python-gtop<=2.32.0-10')
+
+ cd "${srcdir}/${pkgbase}-${pkgver}"
+ make -C gtop install DESTDIR="${pkgdir}"
+}
+
+package_python2-metacity() {
+ depends=('pygtk' 'metacity')
+ pkgdesc="Python bindings for metacity"
+ conflicts=('python-metacity<=2.32.0-10')
+ replaces=('python-metacity<=2.32.0-10')
+
+ cd "${srcdir}/${pkgbase}-${pkgver}"
+ make -C metacity install DESTDIR="${pkgdir}"
+}
+
+package_python2-rsvg() {
+ depends=('pygtk' 'librsvg')
+ pkgdesc="Python bindings for librsvg"
+ conflicts=('python-rsvg<=2.32.0-10')
+ replaces=('python-rsvg<=2.32.0-10')
+
+ cd "${srcdir}/${pkgbase}-${pkgver}"
+ make -C rsvg install DESTDIR="${pkgdir}"
+ install -m755 -d "${pkgdir}/usr/share/pygtk/2.0/defs"
+ install -m644 rsvg/rsvg.defs "${pkgdir}/usr/share/pygtk/2.0/defs/"
+}
+
+package_python2-totem-plparser() {
+ depends=('pygtk' 'totem-plparser' 'python2-gnomevfs')
+ pkgdesc="Python bindings for totem-plparser"
+ conflicts=('python-totem-plparser<=2.32.0-10')
+ replaces=('python-totem-plparser<=2.32.0-10')
+
+ cd "${srcdir}/${pkgbase}-${pkgver}"
+ make -C totem install DESTDIR="${pkgdir}"
+ install -m755 -d "${pkgdir}/usr/share/pygtk/2.0/defs"
+ install -m644 totem/plparser.defs "${pkgdir}/usr/share/pygtk/2.0/defs/"
+}
+
+package_python2-wnck() {
+ depends=('pygtk' 'libwnck')
+ pkgdesc="Python bindings for libwnck"
+ conflicts=('python-wnck<=2.32.0-10')
+ replaces=('python-wnck<=2.32.0-10')
+
+ cd "${srcdir}/${pkgbase}-${pkgver}"
+ make -C wnck install DESTDIR="${pkgdir}"
+}
diff --git a/staging/gnome-python-desktop/gnome-python-desktop-2.32.0-metacity-build.patch b/staging/gnome-python-desktop/gnome-python-desktop-2.32.0-metacity-build.patch
new file mode 100644
index 000000000..5054dd2bd
--- /dev/null
+++ b/staging/gnome-python-desktop/gnome-python-desktop-2.32.0-metacity-build.patch
@@ -0,0 +1,42 @@
+From: Daniel Drake <dsd@laptop.org>
+
+Fix build against metacity-2.34.2. The port to GSettings
+removed these constants from the codebase.
+
+Index: gnome-python-desktop-2.32.0/metacity/metacity.defs
+===================================================================
+--- gnome-python-desktop-2.32.0.orig/metacity/metacity.defs
++++ gnome-python-desktop-2.32.0/metacity/metacity.defs
+@@ -120,32 +120,6 @@
+ )
+ )
+
+-(define-enum FocusMode
+- (in-module "Meta")
+- (c-name "MetaFocusMode")
+-; (gtype-id "META_TYPE_FOCUS_MODE")
+- (values
+- '("click" "META_FOCUS_MODE_CLICK")
+- '("sloppy" "META_FOCUS_MODE_SLOPPY")
+- '("mouse" "META_FOCUS_MODE_MOUSE")
+- )
+-)
+-
+-(define-enum ActionTitlebar
+- (in-module "Meta")
+- (c-name "MetaActionTitlebar")
+-; (gtype-id "META_TYPE_ACTION_TITLEBAR")
+- (values
+- '("toggle-shade" "META_ACTION_TITLEBAR_TOGGLE_SHADE")
+- '("toggle-maximize" "META_ACTION_TITLEBAR_TOGGLE_MAXIMIZE")
+- '("minimize" "META_ACTION_TITLEBAR_MINIMIZE")
+- '("none" "META_ACTION_TITLEBAR_NONE")
+- '("lower" "META_ACTION_TITLEBAR_LOWER")
+- '("menu" "META_ACTION_TITLEBAR_MENU")
+- '("last" "META_ACTION_TITLEBAR_LAST")
+- )
+-)
+-
+ (define-enum FrameType
+ (in-module "Meta")
+ (c-name "MetaFrameType")
diff --git a/staging/kdebase-workspace/kdm.logrotate b/staging/kdebase-workspace/kdm.logrotate
new file mode 100644
index 000000000..34331feae
--- /dev/null
+++ b/staging/kdebase-workspace/kdm.logrotate
@@ -0,0 +1,6 @@
+/var/log/kdm.log {
+ maxage 365
+ size=+1024k
+ notifempty
+ missingok
+}
diff --git a/staging/kdebase-workspace/logind-support.patch b/staging/kdebase-workspace/logind-support.patch
new file mode 100644
index 000000000..9de205400
--- /dev/null
+++ b/staging/kdebase-workspace/logind-support.patch
@@ -0,0 +1,66 @@
+From: Lukas Tinkl <lukas@kde.org>
+Date: Fri, 05 Oct 2012 09:57:13 +0000
+Subject: store the filedescriptor in a member variable
+X-Git-Url: http://quickgit.kde.org/?p=kde-workspace.git&amp;a=commitdiff&amp;h=a18b78d7da8cb8d627ad2e85f666bfcf1a2721e1
+---
+store the filedescriptor in a member variable
+
+make systemd-inhibit work as intended, PowerDevil now handles
+power/sleep/lid buttons as intended
+
+BUG: 307412
+---
+
+
+--- a/powerdevil/daemon/powerdevilpolicyagent.cpp
++++ b/powerdevil/daemon/powerdevilpolicyagent.cpp
+@@ -29,7 +29,6 @@
+ #include <QtDBus/QDBusPendingReply>
+ #include <QtDBus/QDBusConnectionInterface>
+ #include <QtDBus/QDBusServiceWatcher>
+-#include <QtDBus/QDBusUnixFileDescriptor>
+
+ #include <KGlobal>
+ #include <KDebug>
+@@ -225,6 +224,9 @@
+ onActiveSessionChanged(m_activeSessionPath);
+
+ // inhibit systemd handling of power/sleep/lid buttons
++ // http://www.freedesktop.org/wiki/Software/systemd/inhibit
++ kDebug() << "fd passing available:" << bool(managerIface.connection().connectionCapabilities() & QDBusConnection::UnixFileDescriptorPassing);
++
+ QVariantList args;
+ args << "handle-power-key:handle-suspend-key:handle-hibernate-key:handle-lid-switch"; // what
+ args << "PowerDevil"; // who
+@@ -232,8 +234,9 @@
+ args << "block"; // mode
+ QDBusPendingReply<QDBusUnixFileDescriptor> desc = managerIface.asyncCallWithArgumentList("Inhibit", args);
+ desc.waitForFinished();
+- if (desc.isValid() && desc.value().isValid()) {
+- kDebug() << "systemd powersave events handling inhibited";
++ if (desc.isValid()) {
++ m_systemdInhibitFd = desc.value();
++ kDebug() << "systemd powersave events handling inhibited, descriptor:" << m_systemdInhibitFd.fileDescriptor();
+ }
+ else
+ kWarning() << "failed to inhibit systemd powersave handling";
+
+--- a/powerdevil/daemon/powerdevilpolicyagent.h
++++ b/powerdevil/daemon/powerdevilpolicyagent.h
+@@ -27,6 +27,7 @@
+ #include <QtCore/QWeakPointer>
+
+ #include <QtDBus/QDBusContext>
++#include <QtDBus/QDBusUnixFileDescriptor>
+
+ #include <kdemacros.h>
+
+@@ -108,6 +109,7 @@
+ QString m_activeSessionPath;
+ QWeakPointer< QDBusInterface > m_sdSessionInterface;
+ QWeakPointer< QDBusInterface > m_sdSeatInterface;
++ QDBusUnixFileDescriptor m_systemdInhibitFd;
+
+ // ConsoleKit support
+ bool m_ckAvailable;
+
diff --git a/staging/konversation/PKGBUILD b/staging/konversation/PKGBUILD
index e491f6801..ee8a55574 100644
--- a/staging/konversation/PKGBUILD
+++ b/staging/konversation/PKGBUILD
@@ -1,4 +1,4 @@
-# $Id: PKGBUILD 167386 2012-10-01 19:44:28Z stephane $
+# $Id: PKGBUILD 168681 2012-10-14 00:39:34Z stephane $
# Maintainer: Stéphane Gaudreault <stephane@archlinux.org>
# Contributor: Andrea Scarpino <andrea@archlinux.org>
# Contributor: James Rayner <iphitus@gmail.com>
@@ -6,12 +6,13 @@
pkgname=konversation
pkgver=1.4
-pkgrel=2
+pkgrel=3
pkgdesc="A user friendly IRC client for KDE"
arch=('i686' 'x86_64')
url="http://konversation.kde.org"
-depends=('kdebase-runtime' 'kdepimlibs' 'python')
+depends=('kdebase-runtime' 'kdepimlibs')
makedepends=('automoc4' 'cmake' 'pkgconfig' 'docbook-xml')
+optdepends=('python: python scripting support')
license=('GPL2' 'FDL')
install=${pkgname}.install
options=('!makeflags')
@@ -34,7 +35,7 @@ package() {
make DESTDIR="${pkgdir}" install
# Remove a bunch of symlinks pointing to non-existant files
- for lang in pt_BR uk sv et de en nl; do
- rm "${pkgdir}"/usr/share/doc/kde/html/${lang}/konversation/common
+ for _lang in pt_BR uk sv et de en nl; do
+ rm "${pkgdir}"/usr/share/doc/kde/html/${_lang}/konversation/common
done
}
diff --git a/staging/libreoffice/make-pyuno-work-with-system-wide-module-install.diff b/staging/libreoffice/make-pyuno-work-with-system-wide-module-install.diff
new file mode 100644
index 000000000..e86548136
--- /dev/null
+++ b/staging/libreoffice/make-pyuno-work-with-system-wide-module-install.diff
@@ -0,0 +1,44 @@
+diff --git a/desktop/scripts/soffice.sh b/desktop/scripts/soffice.sh
+index defd7b2..ea2a809 100755
+--- a/desktop/scripts/soffice.sh
++++ b/desktop/scripts/soffice.sh
+@@ -128,6 +128,9 @@ if echo "$checks" | grep -q "cc" ; then
+ exit 1;
+ fi
+
++PYTHONPATH=$sd_prog${PYTHONPATH+:$PYTHONPATH}
++export PYTHONPATH
++
+ case "`uname -s`" in
+ NetBSD|OpenBSD|FreeBSD|DragonFly)
+ # this is a temporary hack until we can live with the default search paths
+diff --git a/pyuno/source/module/uno.py b/pyuno/source/module/uno.py
+index f93ac5e..92a2891 100644
+--- a/pyuno/source/module/uno.py
++++ b/pyuno/source/module/uno.py
+@@ -26,8 +26,12 @@
+ # for a copy of the LGPLv3 License.
+ #
+ #*************************************************************************
++import os
+ import sys
+
++sys.path.append('/usr/lib/libreoffice/program')
++if getattr(os.environ, 'URE_BOOTSTRAP', None) is None:
++ os.environ['URE_BOOTSTRAP'] = "vnd.sun.star.pathname:/usr/lib/libreoffice/program/fundamentalrc"
+ import pyuno
+
+ try:
+diff --git a/scripting/source/pyprov/officehelper.py b/scripting/source/pyprov/officehelper.py
+index 610ac5f..df243d0 100755
+--- a/scripting/source/pyprov/officehelper.py
++++ b/scripting/source/pyprov/officehelper.py
+@@ -53,7 +53,7 @@ def bootstrap():
+ if "UNO_PATH" in os.environ:
+ sOffice = os.environ["UNO_PATH"]
+ else:
+- sOffice = "" # lets hope for the best
++ sOffice = "/usr/lib/libreoffice/program"
+ sOffice = os.path.join(sOffice, "soffice")
+ if platform.startswith("win"):
+ sOffice += ".exe"
diff --git a/staging/miro/PKGBUILD b/staging/miro/PKGBUILD
new file mode 100644
index 000000000..1b4c5711a
--- /dev/null
+++ b/staging/miro/PKGBUILD
@@ -0,0 +1,49 @@
+# $Id: PKGBUILD 168800 2012-10-16 01:40:22Z eric $
+# Maintainer: Ronald van Haren <ronald.archlinux.org>
+
+pkgname=miro
+pkgver=5.0.4
+pkgrel=2
+pkgdesc="The free and open source internet TV platform"
+arch=('i686' 'x86_64')
+url="http://www.getmiro.com"
+license=('GPL2')
+depends=('python2-dbus' 'pyrex' 'pygtk' 'gstreamer0.10' 'python2-gconf'
+ 'python2-pysqlite' 'pywebkitgtk' 'shared-mime-info'
+ 'desktop-file-utils' 'gstreamer0.10' 'hicolor-icon-theme'
+ 'gstreamer0.10-python' 'python2-notify' 'libtorrent-rasterbar'
+ 'gstreamer0.10-base-plugins' 'gstreamer0.10-good-plugins' 'python2-pycurl'
+ 'gstreamer0.10-ffmpeg' 'ffmpeg' 'mutagen' 'xdg-utils')
+makedepends=('pkg-config' 'boost')
+install=miro.install
+source=("http://ftp.osuosl.org/pub/pculture.org/${pkgname}/src/${pkgname}-${pkgver}.tar.gz"
+ 'ffmpeg.patch')
+sha1sums=('1144f98149ff07208b994a7cedb45a4beaaa451f'
+ 'ce0f42be2a0a3ac99f07b5abfabf0975928c841c')
+
+build() {
+ cd "${srcdir}/${pkgname}-${pkgver}"
+
+ cd linux
+ patch -p2 -i "${srcdir}"/ffmpeg.patch
+
+ python2 setup.py install --root="${pkgdir}"
+
+ # fix miro startup script so --debug works with python2
+ sed -i "s|which python|which python2|" "${pkgdir}/usr/bin/miro"
+ sed -i "s|./miro.real|/usr/bin/miro.real|" "${pkgdir}/usr/bin/miro"
+
+ # fix python scripts for python2
+ sed -i "s|/usr/bin/env python|/usr/bin/env python2|" "${pkgdir}"/usr/share/miro/resources/searchengines/update-icons.py
+ for i in usr/share/miro/resources/testdata/echonest-replies/generate.py usr/share/miro/resources/searchengines/update-icons.py \
+ usr/share/miro/resources/testdata/7digital-replies/generate.py; do
+ sed -i "s|/usr/bin/python|/usr/bin/python2|" "${pkgdir}"/${i}
+ done
+
+ # Fakeroot segfaults on these; remove
+ if [ ${CARCH} == "i686" ]; then
+ rm -f "${pkgdir}"/usr/bin/codegen.Linux-x86_64 || true
+ else
+ rm -f "${pkgdir}"/usr/bin/codegen.Linux-i686 || true
+ fi
+}
diff --git a/staging/miro/ffmpeg.patch b/staging/miro/ffmpeg.patch
new file mode 100644
index 000000000..99c14107d
--- /dev/null
+++ b/staging/miro/ffmpeg.patch
@@ -0,0 +1,63 @@
+--- miro-5.0.1/linux/miro-segmenter.c~ 2012-07-06 14:33:24.618082171 +0000
++++ miro-5.0.1/linux/miro-segmenter.c 2012-07-06 15:10:19.564146117 +0000
+@@ -156,7 +156,7 @@
+ exit(1);
+ }
+
+- ret = av_open_input_file(&ic, input, ifmt, 0, NULL);
++ ret = avformat_open_input(&ic, input, ifmt, 0);
+ if (ret != 0) {
+ fprintf(stderr, "Could not open input file, make sure it is an mpegts file: %d\n", ret);
+ exit(1);
+@@ -215,12 +215,7 @@
+ }
+ }
+
+- if (av_set_parameters(oc, NULL) < 0) {
+- fprintf(stderr, "Invalid output format parameters\n");
+- exit(1);
+- }
+-
+- dump_format(oc, 0, input, 1);
++ av_dump_format(oc, 0, input, 1);
+
+ if (video_st) {
+ codec = avcodec_find_decoder(video_st->codec->codec_id);
+@@ -233,12 +228,12 @@
+ }
+ }
+
+- if (url_fopen(&oc->pb, output_filename, URL_WRONLY) < 0) {
++ if (avio_open(&oc->pb, output_filename, AVIO_FLAG_WRITE) < 0) {
+ fprintf(stderr, "Could not open '%s'\n", output_filename);
+ exit(1);
+ }
+
+- if (av_write_header(oc)) {
++ if (avformat_write_header(oc, NULL)) {
+ fprintf(stderr, "Could not write mpegts header to first output file\n");
+
+ exit(1);
+@@ -274,10 +269,10 @@
+ }
+
+ if (segment_time - prev_segment_time >= segment_duration) {
+- put_flush_packet(oc->pb);
+- url_fclose(oc->pb);
++ avio_flush(oc->pb);
++ avio_close(oc->pb);
+
+- if (url_fopen(&oc->pb, output_filename, URL_WRONLY) < 0) {
++ if (avio_open(&oc->pb, output_filename, AVIO_FLAG_WRITE) < 0) {
+ fprintf(stderr, "Could not open '%s'\n", output_filename);
+ break;
+ }
+@@ -307,7 +302,7 @@
+ av_freep(&oc->streams[i]);
+ }
+
+- url_fclose(oc->pb);
++ avio_close(oc->pb);
+ av_free(oc);
+
+ /* End-of-transcode marker. */
diff --git a/staging/miro/miro.install b/staging/miro/miro.install
new file mode 100644
index 000000000..a5ee228aa
--- /dev/null
+++ b/staging/miro/miro.install
@@ -0,0 +1,17 @@
+post_install() {
+ update-desktop-database -q
+ xdg-icon-resource forceupdate --theme hicolor
+ update-mime-database usr/share/mime > /dev/null
+}
+
+post_upgrade() {
+ post_install $1
+}
+
+post_remove() {
+ update-desktop-database -q
+ xdg-icon-resource forceupdate --theme hicolor
+ update-mime-database usr/share/mime > /dev/null
+}
+
+
diff --git a/staging/pycrypto/PKGBUILD b/staging/pycrypto/PKGBUILD
new file mode 100644
index 000000000..d4987b4b3
--- /dev/null
+++ b/staging/pycrypto/PKGBUILD
@@ -0,0 +1,52 @@
+# $Id: PKGBUILD 168667 2012-10-13 21:58:25Z eric $
+# Maintainer: Jan de Groot <jgc@archlinux.org>
+# Contributor: Kritoke <kritoke@gamebox.net>
+
+pkgbase=pycrypto
+pkgname=('python2-crypto' 'python-crypto')
+pkgver=2.6
+pkgrel=3
+arch=('i686' 'x86_64')
+makedepends=('python2' 'python')
+url="http://www.dlitz.net/software/pycrypto/"
+license=('custom')
+source=("http://ftp.dlitz.net/pub/dlitz/crypto/${pkgbase}/${pkgbase}-${pkgver}.tar.gz")
+sha256sums=('7293c9d7e8af2e44a82f86eb9c3b058880f4bcc884bf3ad6c8a34b64986edde8')
+
+build() {
+ cd "${srcdir}"
+ find ${pkgbase}-${pkgver}/LEGAL -type f -exec chmod 644 {} \;
+ find ${pkgbase}-${pkgver}/LEGAL -type d -exec chmod 755 {} \;
+
+ cp -r ${pkgbase}-${pkgver} ${pkgbase}-${pkgver}-py3
+ cd "${srcdir}/${pkgbase}-${pkgver}"
+ python2 setup.py build
+
+ cd "${srcdir}/${pkgbase}-${pkgver}-py3"
+ python setup.py build
+}
+
+package_python2-crypto() {
+ pkgdesc="Collection of cryptographic algorithms and protocols, implemented for use from Python 2."
+ depends=('python2')
+ replaces=('pycrypto')
+ conflicts=('pycrypto')
+ provides=("pycrypto=${pkgver}")
+
+ cd "${srcdir}/${pkgbase}-${pkgver}"
+ python2 setup.py install --root="${pkgdir}" --optimize=1
+ install -m755 -d "${pkgdir}/usr/share/licenses/${pkgname}"
+ install -m644 COPYRIGHT "${pkgdir}/usr/share/licenses/${pkgname}/"
+ cp -r LEGAL "${pkgdir}/usr/share/licenses/${pkgname}/"
+}
+
+package_python-crypto() {
+ pkgdesc="Collection of cryptographic algorithms and protocols, implemented for use from Python 3."
+ depends=('python')
+
+ cd "${srcdir}/${pkgbase}-${pkgver}-py3"
+ python setup.py install --root="${pkgdir}" --optimize=1
+ install -m755 -d "${pkgdir}/usr/share/licenses/${pkgname}"
+ install -m644 COPYRIGHT "${pkgdir}/usr/share/licenses/${pkgname}/"
+ cp -r LEGAL "${pkgdir}/usr/share/licenses/${pkgname}/"
+}
diff --git a/staging/pygobject/PKGBUILD b/staging/pygobject/PKGBUILD
new file mode 100644
index 000000000..c5b861096
--- /dev/null
+++ b/staging/pygobject/PKGBUILD
@@ -0,0 +1,58 @@
+# $Id: PKGBUILD 168794 2012-10-16 00:45:16Z allan $
+# Maintainer: Ionut Biru <ibiru@archlinux.org>
+
+pkgbase=pygobject
+pkgname=(python-gobject python2-gobject pygobject-devel)
+pkgver=3.2.2
+pkgrel=2
+arch=('i686' 'x86_64')
+url="https://live.gnome.org/PyGObject"
+license=('LGPL')
+makedepends=('python' 'python2' 'python-cairo' 'python2-cairo' 'gobject-introspection')
+source=(http://ftp.gnome.org/pub/gnome/sources/$pkgbase/${pkgver%.*}/$pkgbase-$pkgver.tar.xz)
+options=('!libtool')
+sha256sums=('4653790baaff0176fd814b88cfb5378c45906a120b25d01be2554f423b726eb0')
+
+build() {
+ cp -a "$pkgbase-$pkgver" python2-build
+ mkdir devel
+
+ (
+ cd python2-build
+ export PYTHON=/usr/bin/python2
+ ./configure --prefix=/usr
+ make
+ )
+
+ (
+ cd "$pkgbase-$pkgver"
+ ./configure --prefix=/usr
+ make
+ )
+}
+
+package_python-gobject() {
+ pkgdesc="Python 3 bindings for GObject"
+ depends=('gobject-introspection' 'python-cairo' "pygobject-devel=$pkgver")
+
+ cd "$pkgbase-$pkgver"
+ make DESTDIR="$pkgdir" install
+ rm -r "$pkgdir"/usr/{include,lib/pkgconfig}
+}
+
+package_python2-gobject() {
+ pkgdesc="Python 2 bindings for GObject"
+ depends=('gobject-introspection' 'python2-cairo' "pygobject-devel=$pkgver")
+
+ cd "python2-build"
+ make DESTDIR="$pkgdir" install
+ mv "$pkgdir"/usr/{include,lib/pkgconfig} "$srcdir/devel"
+}
+
+package_pygobject-devel() {
+ pkgdesc="Development files for the pygobject bindings"
+ cd "devel"
+ mkdir -p "$pkgdir"/usr/{include,lib}
+ mv include "$pkgdir/usr/"
+ mv pkgconfig "$pkgdir/usr/lib/"
+}
diff --git a/staging/pygobject2/PKGBUILD b/staging/pygobject2/PKGBUILD
new file mode 100644
index 000000000..4ba2bfa2a
--- /dev/null
+++ b/staging/pygobject2/PKGBUILD
@@ -0,0 +1,86 @@
+# $Id: PKGBUILD 168792 2012-10-16 00:40:21Z allan $
+# Maintainer: Jan de Groot <jgc@archlinux.org>
+
+pkgbase=pygobject2
+pkgname=(python-gobject2 python2-gobject2 pygobject2-devel)
+pkgver=2.28.6
+pkgrel=7
+arch=('i686' 'x86_64')
+url="http://www.pygtk.org/"
+license=('LGPL')
+makedepends=('python' 'python2')
+source=(http://ftp.gnome.org/pub/gnome/sources/pygobject/${pkgver%.*}/pygobject-${pkgver}.tar.xz
+ python2-fix-type.patch
+ python3-fix-build.patch
+ python3-fix-maketrans.patch)
+options=('!libtool')
+sha256sums=('fb8a1d4f665130a125011659bd347c7339c944232163dbb9a34fd0686577adb8'
+ 'b7b415499ffc0817cf551edf76a3fe47938db2c9f6240046eae681e6ef9b37ea'
+ 'feafd4664f8455edf0bf8407ac45e219bb550df806ce0d601baae951e8c188ca'
+ '4bff9adcea13a824c45d14ec501c927df47d23c22507a2456d8b5ec885924c0a')
+
+build() {
+ cd "${srcdir}"
+ cp -a "pygobject-${pkgver}" python2-build
+ mkdir devel
+
+ (
+ cd python2-build
+ export PYTHON=/usr/bin/python2
+ ./configure --prefix=/usr --disable-introspection
+ make
+ )
+
+ (
+ cd "pygobject-${pkgver}"
+ #patches available in 2.28 branch but unreleased.
+ patch -Np1 -i "${srcdir}/python2-fix-type.patch"
+ patch -Np1 -i "${srcdir}/python3-fix-build.patch"
+ patch -Np1 -i "${srcdir}/python3-fix-maketrans.patch"
+
+ ./configure --prefix=/usr --disable-introspection
+ make
+ )
+}
+
+package_python-gobject2() {
+ pkgdesc="Python 3 bindings for GObject2"
+ depends=('glib2' 'pygobject2-devel' 'python')
+ replaces=('py3gobject')
+ provides=("py3gobject=$pkgver")
+
+ cd "${srcdir}/pygobject-${pkgver}"
+ make DESTDIR="${pkgdir}" install
+
+ # Delete devel stuff
+ rm -r "$pkgdir"/usr/{bin,include,lib/pkgconfig,share/{gtk-doc,pygobject/{2.0/codegen,xsl}}}
+}
+
+package_python2-gobject2() {
+ pkgdesc="Python 2 bindings for GObject2"
+ depends=('glib2' 'pygobject2-devel' 'python2')
+ replaces=('pygobject')
+ provides=("pygobject=$pkgver")
+
+ cd "${srcdir}/python2-build"
+ make DESTDIR="${pkgdir}" install
+
+ find "$pkgdir"/usr/share/pygobject -name '*.py' | \
+ xargs sed -i "s|#![ ]*/usr/bin/env python$|#!/usr/bin/env python2|"
+
+ # Split devel stuff
+ mv "$pkgdir"/usr/{include,lib/pkgconfig,share/{gtk-doc,pygobject/xsl}} \
+ "$srcdir/devel/"
+}
+
+package_pygobject2-devel() {
+ pkgdesc="Development files for the pygobject bindings"
+
+ cd "${srcdir}/devel"
+ mkdir -p "$pkgdir"/usr/{include,lib,share/pygobject}
+
+ mv include "$pkgdir/usr/"
+ mv pkgconfig "$pkgdir/usr/lib/"
+ mv gtk-doc "$pkgdir/usr/share/"
+ mv xsl "$pkgdir/usr/share/pygobject/"
+}
diff --git a/staging/pygobject2/python2-fix-type.patch b/staging/pygobject2/python2-fix-type.patch
new file mode 100644
index 000000000..78e7ddfd5
--- /dev/null
+++ b/staging/pygobject2/python2-fix-type.patch
@@ -0,0 +1,50 @@
+From 42d01f060c5d764baa881d13c103d68897163a49 Mon Sep 17 00:00:00 2001
+From: Ryan Lortie <desrt@desrt.ca>
+Date: Mon, 12 Mar 2012 16:44:14 -0400
+Subject: gio-types.defs: change some enums to flags
+
+These flags types were originally incorrectly handled in glib as being
+enums. That bug was fixed, but they're still enums here, leading to
+warnings about the mismatch.
+
+Change them to flags.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=668522
+---
+ gio/gio-types.defs | 6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/gio/gio-types.defs b/gio/gio-types.defs
+index 331e0bc..7eee5c8 100644
+--- a/gio/gio-types.defs
++++ b/gio/gio-types.defs
+@@ -526,7 +526,7 @@
+ )
+ )
+
+-(define-enum MountMountFlags
++(define-flags MountMountFlags
+ (in-module "gio")
+ (c-name "GMountMountFlags")
+ (gtype-id "G_TYPE_MOUNT_MOUNT_FLAGS")
+@@ -545,7 +545,7 @@
+ )
+ )
+
+-(define-enum DriveStartFlags
++(define-flags DriveStartFlags
+ (in-module "gio")
+ (c-name "GDriveStartFlags")
+ (gtype-id "G_TYPE_DRIVE_START_FLAGS")
+@@ -770,7 +770,7 @@
+ )
+ )
+
+-(define-enum SocketMsgFlags
++(define-flags SocketMsgFlags
+ (in-module "gio")
+ (c-name "GSocketMsgFlags")
+ (gtype-id "G_TYPE_SOCKET_MSG_FLAGS")
+--
+1.7.9.1
+
diff --git a/staging/pygobject2/python3-fix-build.patch b/staging/pygobject2/python3-fix-build.patch
new file mode 100644
index 000000000..4cb8cfe57
--- /dev/null
+++ b/staging/pygobject2/python3-fix-build.patch
@@ -0,0 +1,34 @@
+From e2dc4ac346a16b6976b92e84819c7203629beb4a Mon Sep 17 00:00:00 2001
+From: Ignacio Casal Quinteiro <icq@gnome.org>
+Date: Thu, 21 Apr 2011 14:52:20 +0000
+Subject: [python3] fix build. PYcairo_IMPORT doesn't exists anymore
+
+---
+diff --git a/gi/pygi-foreign-cairo.c b/gi/pygi-foreign-cairo.c
+index 81b9865..edf52d7 100644
+--- a/gi/pygi-foreign-cairo.c
++++ b/gi/pygi-foreign-cairo.c
+@@ -30,7 +30,7 @@
+ #include <pycairo/py3cairo.h>
+ #endif
+
+-Pycairo_CAPI_t *Pycairo_CAPI;
++static Pycairo_CAPI_t *Pycairo_CAPI;
+
+ #include "pygi-foreign.h"
+
+@@ -117,7 +117,12 @@ cairo_surface_release (GIBaseInfo *base_info,
+ static PyMethodDef _gi_cairo_functions[] = {0,};
+ PYGLIB_MODULE_START(_gi_cairo, "_gi_cairo")
+ {
++#if PY_VERSION_HEX < 0x03000000
+ Pycairo_IMPORT;
++#else
++ Pycairo_CAPI = (Pycairo_CAPI_t*) PyCObject_Import("cairo", "CAPI");
++#endif
++
+ if (Pycairo_CAPI == NULL)
+ return PYGLIB_MODULE_ERROR_RETURN;
+
+--
+cgit v0.9
diff --git a/staging/pygobject2/python3-fix-maketrans.patch b/staging/pygobject2/python3-fix-maketrans.patch
new file mode 100644
index 000000000..f5bc0e77c
--- /dev/null
+++ b/staging/pygobject2/python3-fix-maketrans.patch
@@ -0,0 +1,36 @@
+From 667bec76ccbc85cc1d54a0e68977dbda241c028c Mon Sep 17 00:00:00 2001
+From: Martin Pitt <martin.pitt@ubuntu.com>
+Date: Wed, 13 Jul 2011 06:42:22 +0000
+Subject: [python3] Fix maketrans import
+
+Python3 moved the maketrans() function from the string module to a str method.
+This unbreaks gi/module.py for Python 3 again.
+---
+diff --git a/gi/module.py b/gi/module.py
+index 70df76c..d56bdaf 100644
+--- a/gi/module.py
++++ b/gi/module.py
+@@ -24,7 +24,11 @@ from __future__ import absolute_import
+
+ import os
+ import gobject
+-import string
++try:
++ maketrans = ''.maketrans
++except AttributeError:
++ # fallback for Python 2
++ from string import maketrans
+
+ import gi
+ from .overrides import registry
+@@ -124,7 +128,7 @@ class IntrospectionModule(object):
+ # Don't use upper() here to avoid locale specific
+ # identifier conversion (e. g. in Turkish 'i'.upper() == 'i')
+ # see https://bugzilla.gnome.org/show_bug.cgi?id=649165
+- ascii_upper_trans = string.maketrans(
++ ascii_upper_trans = maketrans(
+ 'abcdefgjhijklmnopqrstuvwxyz',
+ 'ABCDEFGJHIJKLMNOPQRSTUVWXYZ')
+ for value_info in info.get_values():
+--
+cgit v0.9
diff --git a/staging/pyopenssl/PKGBUILD b/staging/pyopenssl/PKGBUILD
new file mode 100644
index 000000000..12bf75be8
--- /dev/null
+++ b/staging/pyopenssl/PKGBUILD
@@ -0,0 +1,46 @@
+# $Id: PKGBUILD 168651 2012-10-13 20:29:33Z eric $
+# Maintainer : Ionut Biru<ibiru@archlinux.org>
+# Contributor: Sergej Pupykin <pupykin.s+arch@gmail.com>
+
+pkgbase=pyopenssl
+pkgname=('python-pyopenssl' 'python2-pyopenssl')
+pkgver=0.13
+pkgrel=2
+arch=('i686' 'x86_64')
+url="http://pypi.python.org/pypi/pyOpenSSL"
+license=('LGPL2.1')
+makedepends=('python' 'python2' 'openssl')
+source=(http://pypi.python.org/packages/source/p/pyOpenSSL/pyOpenSSL-${pkgver}.tar.gz)
+md5sums=('767bca18a71178ca353dff9e10941929')
+
+build() {
+ cd "${srcdir}"
+ cp -a "pyOpenSSL-${pkgver}"{,-python2}
+
+ #build python 3 module
+ cd "pyOpenSSL-${pkgver}"
+ python setup.py build
+
+ #build python 2 module
+ cd ../"pyOpenSSL-${pkgver}-python2"
+ python2 setup.py build
+}
+
+package_python-pyopenssl(){
+ pkgdesc="Python3 wrapper module around the OpenSSL library"
+ depends=('python>=3.3' 'openssl')
+ replaces=('pyopenssl')
+ provides=('pyopenssl')
+ conflicts=('pyopenssl')
+
+ cd "${srcdir}/pyOpenSSL-${pkgver}"
+ python setup.py install --root "${pkgdir}" --optimize=1
+}
+
+package_python2-pyopenssl(){
+ pkgdesc="Python2 wrapper module around the OpenSSL library"
+ depends=('python2>=2.7' 'openssl')
+
+ cd "${srcdir}/pyOpenSSL-${pkgver}-python2"
+ python2 setup.py install --root "${pkgdir}" --optimize=1
+}
diff --git a/staging/pyqt/PKGBUILD b/staging/pyqt/PKGBUILD
index 8fba65343..6f3b1a230 100644
--- a/staging/pyqt/PKGBUILD
+++ b/staging/pyqt/PKGBUILD
@@ -1,4 +1,4 @@
-# $Id: PKGBUILD 167324 2012-10-01 06:53:33Z andrea $
+# $Id: PKGBUILD 168744 2012-10-15 09:20:47Z andrea $
# Maintainer: Andrea Scarpino <andrea@archlinux.org>
# Contributor: Douglas Soares de Andrade <douglas@archlinux.org>
# Contributor: riai <riai@bigfoot.com> Ben <ben@benmazer.net>
@@ -6,13 +6,13 @@
pkgbase=pyqt
pkgname=('pyqt-common' 'pyqt' 'python2-pyqt')
pkgver=4.9.5
-pkgrel=1
+pkgrel=2
arch=('i686' 'x86_64')
url="http://riverbankcomputing.co.uk/software/pyqt/intro"
license=('GPL')
makedepends=('qt' 'python-sip' 'python-dbus' 'python2-sip' 'phonon'
'python2-opengl' 'qt-assistant-compat' 'qtwebkit' 'python2-dbus')
- source=("http://downloads.sourceforge.net/${pkgbase}/PyQt-x11-gpl-${pkgver}.tar.gz")
+source=("http://downloads.sourceforge.net/${pkgbase}/PyQt-x11-gpl-${pkgver}.tar.gz")
md5sums=('e4cdd6619c63655f7510efb4df8462fb')
build() {
@@ -47,7 +47,6 @@ package_pyqt-common(){
cd PyQt-x11-gpl-${pkgver}
make -C pyrcc DESTDIR="${pkgdir}" install
make -C pylupdate DESTDIR="${pkgdir}" install
- make -C designer INSTALL_ROOT="${pkgdir}" install
install -Dm644 PyQt4.api "${pkgdir}"/usr/share/qt/qsci/api/python/PyQt4.api
}
@@ -65,7 +64,6 @@ package_pyqt(){
# Provided by pyqt-common
rm "${pkgdir}"/usr/bin/{pylupdate4,pyrcc4}
- rm "${pkgdir}"/usr/lib/qt/plugins/designer/libpythonplugin.so
rm "${pkgdir}"/usr/share/qt/qsci/api/python/PyQt4.api
}
@@ -85,7 +83,7 @@ package_python2-pyqt(){
# Fix conflicts with pyqt
mv "${pkgdir}"/usr/bin/{,python2-}pyuic4
- # Provided by pyqt-common
+ # Provided by pyqt
rm "${pkgdir}"/usr/bin/{pylupdate4,pyrcc4}
rm "${pkgdir}"/usr/lib/qt/plugins/designer/libpythonplugin.so
rm "${pkgdir}"/usr/share/qt/qsci/api/python/PyQt4.api
diff --git a/staging/python-egenix-mx-base/PKGBUILD b/staging/python-egenix-mx-base/PKGBUILD
new file mode 100644
index 000000000..f48fd8fb8
--- /dev/null
+++ b/staging/python-egenix-mx-base/PKGBUILD
@@ -0,0 +1,31 @@
+# $Id: PKGBUILD 168671 2012-10-13 23:05:54Z stephane $
+# Maintainer: Stéphane Gaudreault <stephane@archlinux.org>
+# Contributor: Douglas Soares de Andrade <douglas@archlinux.org>
+
+pkgbase=python-egenix-mx-base
+pkgname=('python2-egenix-mx-base')
+_origname=egenix-mx-base
+pkgver=3.2.4
+pkgrel=2
+pkgdesc="A collection of Python tools"
+arch=('i686' 'x86_64')
+license=('custom')
+url="http://www.egenix.com/products/python/mxBase/"
+makedepends=('python2')
+source=("http://downloads.egenix.com/python/${_origname}-${pkgver}.tar.gz")
+sha1sums=('22d7fcbd582177f9a43245eadc3644f3b48cc9a7')
+
+build() {
+ cd "${srcdir}/${_origname}-${pkgver}"
+
+ find . -name \*.py -exec sed -i -e "s|^#!.*python|#!/usr/bin/python2|" {} \;
+
+ python2 setup.py build
+}
+
+package_python2-egenix-mx-base() {
+ depends=('python2>=2.7')
+ cd "${srcdir}/${_origname}-${pkgver}"
+ python2 setup.py install --root="${pkgdir}" --skip-build --optimize=1
+ install -D -m644 COPYRIGHT "${pkgdir}"/usr/share/licenses/${pkgname}/LICENSE
+}
diff --git a/staging/python-iwscan/PKGBUILD b/staging/python-iwscan/PKGBUILD
new file mode 100644
index 000000000..3abb6747e
--- /dev/null
+++ b/staging/python-iwscan/PKGBUILD
@@ -0,0 +1,26 @@
+# $Id: PKGBUILD 168715 2012-10-14 20:19:42Z eric $
+# Maintainer: Daniel Isenmann <daniel@archlinux.org>
+
+pkgbase=python-iwscan
+pkgname=python2-iwscan
+pkgver=20090609
+pkgrel=4
+pkgdesc="A Python interface to iwlist, using the iwlib library"
+arch=('i686' 'x86_64')
+url="http://projects.otaku42.de/browser/python-iwscan"
+license=('LGPL')
+depends=('python2' 'wireless_tools')
+conflicts=('python-iwscan<=20090609-3')
+replaces=('python-iwscan<=20090609-3')
+source=(ftp://ftp.archlinux.org/other/${pkgbase}/${pkgbase}-20090609.tar.gz)
+md5sums=('30fbe8ad3b07e67c1c35db2de16077d8')
+
+build() {
+ cd "${srcdir}/${pkgbase}"
+ python2 setup.py build
+}
+
+package_python2-iwscan() {
+ cd "${srcdir}/${pkgbase}"
+ python2 setup.py install --root="${pkgdir}"
+}
diff --git a/staging/python-markupsafe/PKGBUILD b/staging/python-markupsafe/PKGBUILD
new file mode 100644
index 000000000..0ead0adad
--- /dev/null
+++ b/staging/python-markupsafe/PKGBUILD
@@ -0,0 +1,41 @@
+# $Id: PKGBUILD 168655 2012-10-13 20:45:16Z eric $
+# Maintainer : Ionut Biru <ibiru@archlinux.org>
+# Contributor: Alex Anthony <alex.anthony28991@gmail.com>
+
+pkgname=('python-markupsafe' 'python2-markupsafe')
+pkgver=0.15
+pkgrel=2
+pkgdesc="Implements a XML/HTML/XHTML Markup safe string for Python"
+arch=('i686' 'x86_64')
+url="http://pypi.python.org/pypi/MarkupSafe"
+license=('custom')
+makedepends=('python-distribute' 'python2-distribute')
+source=("http://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-${pkgver}.tar.gz")
+md5sums=('4e7c4d965fe5e033fa2d7bb7746bb186')
+
+build() {
+ cp -r MarkupSafe-${pkgver} python2-MarkupSafe-${pkgver}
+ cd "${srcdir}/MarkupSafe-${pkgver}"
+ python setup.py build
+
+ cd "${srcdir}/python2-MarkupSafe-${pkgver}"
+ python2 setup.py build
+}
+
+package_python-markupsafe() {
+ depends=('python')
+
+ cd "${srcdir}/MarkupSafe-${pkgver}"
+ python setup.py install --root="${pkgdir}" --optimize=1
+
+ install -D -m644 LICENSE "${pkgdir}/usr/share/licenses/python-markupsafe/LICENSE"
+}
+
+package_python2-markupsafe() {
+ depends=('python2')
+
+ cd "${srcdir}/python2-MarkupSafe-${pkgver}"
+ python2 setup.py install --root="${pkgdir}" --optimize=1
+
+ install -D -m644 LICENSE "${pkgdir}/usr/share/licenses/python2-markupsafe/LICENSE"
+}
diff --git a/staging/python-notify/PKGBUILD b/staging/python-notify/PKGBUILD
new file mode 100644
index 000000000..6cf46c8dc
--- /dev/null
+++ b/staging/python-notify/PKGBUILD
@@ -0,0 +1,43 @@
+# $Id: PKGBUILD 168721 2012-10-14 20:45:08Z eric $
+# Maintainer: Angel Velasquez <angvp@archlinux.org>
+
+pkgbase=python-notify
+pkgname=python2-notify
+pkgver=0.1.1
+pkgrel=12
+pkgdesc="Python bindings for libnotify"
+arch=('i686' 'x86_64')
+url="http://www.galago-project.org/"
+license=('GPL')
+depends=('pygtk>=2.22.0' 'libnotify>=0.7.1')
+makedepends=('python2')
+conflicts=('python-notify<=0.1.1-11')
+replaces=('python-notify<=0.1.1-11')
+options=(!libtool)
+source=(http://www.galago-project.org/files/releases/source/notify-python/notify-python-${pkgver}.tar.gz
+ libnotify07.patch
+ notify-python-0.1.1-fix-GTK-symbols.patch)
+md5sums=('8f0ef0939cc8edd2efd896ce5ba80cf4'
+ 'b40c4542575d5aef559908fe60a21634'
+ 'c6922028da5951e69a6a0167bdb4461c')
+
+build() {
+ cd "${srcdir}/notify-python-${pkgver}"
+
+ patch -Np1 -i "${srcdir}/libnotify07.patch"
+ patch -Np1 -i "${srcdir}/notify-python-0.1.1-fix-GTK-symbols.patch"
+
+ ./configure --prefix=/usr
+
+ # WARNING - we touch src/pynotify.override in build because upstream did not rebuild pynotify.c
+ # from the input definitions, this forces pynotify.c to be regenerated, at some point this can be removed
+ touch src/pynotify.override
+
+ make clean
+ make
+}
+
+package_python2-notify() {
+ cd "${srcdir}/notify-python-${pkgver}"
+ make DESTDIR="${pkgdir}" install
+}
diff --git a/staging/python-notify/libnotify07.patch b/staging/python-notify/libnotify07.patch
new file mode 100644
index 000000000..289573d50
--- /dev/null
+++ b/staging/python-notify/libnotify07.patch
@@ -0,0 +1,36 @@
+diff -up notify-python-0.1.1/src/pynotify.defs.notify070 notify-python-0.1.1/src/pynotify.defs
+--- notify-python-0.1.1/src/pynotify.defs.notify070 2010-11-02 17:11:14.928179237 -0400
++++ notify-python-0.1.1/src/pynotify.defs 2010-11-02 17:11:51.153180231 -0400
+@@ -38,7 +38,6 @@
+ '("const-gchar*" "summary")
+ '("const-gchar*" "message" (null-ok) (default "NULL"))
+ '("const-gchar*" "icon" (null-ok) (default "NULL"))
+- '("GtkWidget*" "attach" (null-ok) (default "NULL"))
+ )
+ )
+
+@@ -53,24 +52,6 @@
+ )
+ )
+
+-(define-method attach_to_widget
+- (of-object "NotifyNotification")
+- (c-name "notify_notification_attach_to_widget")
+- (return-type "none")
+- (parameters
+- '("GtkWidget*" "attach")
+- )
+-)
+-
+-(define-method attach_to_status_icon
+- (of-object "NotifyNotification")
+- (c-name "notify_notification_attach_to_status_icon")
+- (return-type "none")
+- (parameters
+- '("GtkStatusIcon*" "attach")
+- )
+-)
+-
+ (define-method show
+ (of-object "NotifyNotification")
+ (c-name "notify_notification_show")
diff --git a/staging/python-notify/notify-python-0.1.1-fix-GTK-symbols.patch b/staging/python-notify/notify-python-0.1.1-fix-GTK-symbols.patch
new file mode 100644
index 000000000..f985c0136
--- /dev/null
+++ b/staging/python-notify/notify-python-0.1.1-fix-GTK-symbols.patch
@@ -0,0 +1,25 @@
+diff -up notify-python-0.1.1/src/__init__.py.BAD notify-python-0.1.1/src/__init__.py
+--- notify-python-0.1.1/src/__init__.py.BAD 2010-08-31 09:04:45.353844005 -0400
++++ notify-python-0.1.1/src/__init__.py 2010-08-31 09:04:49.281844300 -0400
+@@ -1 +1,21 @@
++"""
++Fedora's libnotify.so is not linked against GTK2 or GTK3. The idea
++was to support being linked against different parallel-installable
++GTK stacks.
++
++Unfortunately, python needs to jump through some special hoops in order
++to share symbols with extension modules, specifically, pygtk, which does
++link against GTK2.
++
++Without using sys.setdlopenflags(sys.getdlopenflags() | ctypes.RTLD_GLOBAL),
++the result is:
++libnotify-WARNING **: Missing symbol 'gdk_screen_make_display_name'
++
++Thanks to David Malcolm for figuring out the workaround.
++"""
++import ctypes
++import sys
++sys.setdlopenflags(sys.getdlopenflags() | ctypes.RTLD_GLOBAL)
++import gtk
++
+ from _pynotify import *
diff --git a/staging/python-pyspi/PKGBUILD b/staging/python-pyspi/PKGBUILD
new file mode 100644
index 000000000..e230fd562
--- /dev/null
+++ b/staging/python-pyspi/PKGBUILD
@@ -0,0 +1,32 @@
+# $Id: PKGBUILD 168788 2012-10-16 00:26:49Z allan $
+# Maintainer: Jan de Groot <jgc@archlinux.org>
+# Contributor: William Rea <sillywilly@gmail.com>
+
+pkgbase=python-pyspi
+pkgname=python2-pyspi
+pkgver=0.6.1
+pkgrel=1
+pkgdesc="Python AT-SPI bindings"
+arch=('i686' 'x86_64')
+url="http://people.redhat.com/zcerza/dogtail"
+license=('LGPL')
+depends=('python2' 'at-spi')
+makedepends=('pyrex')
+conflicts=('python-pyspi<=0.6.1-5')
+conflicts=('python-pyspi<=0.6.1-5')
+source=("http://dlc.sun.com/osol/jds/downloads/sources/pyspi-${pkgver}.tar.gz"
+ 'pyspi-build.patch')
+md5sums=('def336bd566ea688a06ec03db7ccf1f4'
+ '721f74cbae653a258c00b83acf7dd1da')
+
+build() {
+ cd ${srcdir}/pyspi-${pkgver}
+ patch -Np1 -i ${srcdir}/pyspi-build.patch
+ # Pyrex tells us to use __cinit__ instead of __new__
+ sed -i 's/__new__/__cinit__/' pyspi.pyx
+}
+
+package_python2-pyspi() {
+ cd ${srcdir}/pyspi-${pkgver}
+ python2 setup.py install --root=${pkgdir}
+}
diff --git a/staging/python-pyspi/pyspi-build.patch b/staging/python-pyspi/pyspi-build.patch
new file mode 100644
index 000000000..3d12c5ed5
--- /dev/null
+++ b/staging/python-pyspi/pyspi-build.patch
@@ -0,0 +1,1693 @@
+diff -Naur pyspi-0.6.1-old/cspi.pxd pyspi-0.6.1/cspi.pxd
+--- pyspi-0.6.1-old/cspi.pxd 2006-08-04 06:27:10.000000000 +1000
++++ pyspi-0.6.1/cspi.pxd 2009-05-09 15:24:31.000000000 +1000
+@@ -14,9 +14,7 @@
+
+ ctypedef struct AccessibleTextRange
+ ctypedef struct AccessibleKeySet
+- ctypedef enum SPIBoolean:
+- FALSE = 0,
+- TRUE
++ ctypedef unsigned int SPIBoolean
+
+ ctypedef struct AccessibleEvent:
+ char *type
+diff -Naur pyspi-0.6.1-old/pyspi.pyx pyspi-0.6.1/pyspi.pyx
+--- pyspi-0.6.1-old/pyspi.pyx 2006-10-03 02:46:41.000000000 +1000
++++ pyspi-0.6.1/pyspi.pyx 2009-05-09 15:24:31.000000000 +1000
+@@ -25,9 +25,15 @@
+ cdef class Event (EventBase)
+ cdef class DeviceEvent
+
+-ctypedef enum bool:
++ctypedef unsigned int bool
++
++import __builtin__
++try:
++ False = __builtin__.False
++ True = __builtin__.True
++except AttributeError:
+ False = 0
+- True
++ True = 1
+
+ # SPIExceptionCode values:
+ (SPI_EXCEPTION_UNSPECIFIED, SPI_EXCEPTION_DISCONNECT, SPI_EXCEPTION_NO_IMPL, SPI_EXCEPTION_IO, SPI_EXCEPTION_BAD_DATA)=range(5)
+@@ -731,7 +737,7 @@
+ Wrapper around the low-level cspi.AccessibleComponent_ functions,
+ giving an OO-style API.
+ """
+- def getExtents (self, type=0):
++ def getExtents (self, key_type=0):
+ """
+ Wraps cspi.AccessibleComponent_getExtents, returning an
+ (x,y,w,h) tuple.
+@@ -741,7 +747,7 @@
+ cspi.AccessibleComponent_getExtents (self.__item, &x, &y, &w, &h, type)
+ return (x, y, w, h)
+
+- def getPosition (self, type = 0):
++ def getPosition (self, key_type = 0):
+ """
+ Wraps cspi.AccessibleComponent_getPosition, returning an
+ (x,y) tuple.
+@@ -991,11 +997,11 @@
+ Wraps cspi.AccessibleHyperlink_getObject
+ """
+ self.__checkSelf ()
+- cdef Accessible object
+- object = Accessible ()
+- object.__setItem (cspi.AccessibleHyperlink_getObject (self.__item, i))
+- object.__checkSelf ()
+- return object
++ cdef Accessible obj
++ obj = Accessible ()
++ obj.__setItem (cspi.AccessibleHyperlink_getObject (self.__item, i))
++ obj.__checkSelf ()
++ return obj
+
+ def getURI (self, i):
+ """
+@@ -1032,7 +1038,7 @@
+ cspi.AccessibleImage_getImageSize(self.__item, &w, &h);
+ return [w, h]
+
+- def getImagePosition (self, type=0):
++ def getImagePosition (self, key_type=0):
+ """
+ Wraps cspi.AccessibleImage_getImagePosition, returning a (x,y)
+ pair
+@@ -1042,7 +1048,7 @@
+ cspi.AccessibleImage_getImagePosition(self.__item, &x, &y, type)
+ return [x, y]
+
+- def getImageExtents (self, type=0):
++ def getImageExtents (self, key_type=0):
+ """
+ Wraps cspi.AccessibleImage_getImageExtents, returning a
+ (x,y,w,h) tuple
+@@ -1551,7 +1557,7 @@
+ cdef cspi.AccessibleDeviceListener *__item
+ cdef public object modMasks
+
+- def __init__ (self, callback, eventMask = cspi.SPI_KEY_PRESSED | cspi.SPI_KEY_RELEASED):
++ def __init__ (self, callback, eventMask = <int> cspi.SPI_KEY_PRESSED | <int> cspi.SPI_KEY_RELEASED):
+ """
+ Registers a python callback function to be called.
+
+diff -Naur pyspi-0.6.1-old/pyspi.pyx.orig pyspi-0.6.1/pyspi.pyx.orig
+--- pyspi-0.6.1-old/pyspi.pyx.orig 1970-01-01 10:00:00.000000000 +1000
++++ pyspi-0.6.1/pyspi.pyx.orig 2006-10-03 02:46:41.000000000 +1000
+@@ -0,0 +1,1592 @@
++# Authors:
++# Zack Cerza <zcerza@redhat.com>
++# Chris Lee <clee@redhat.com>
++# Lawrence Lim <llim@redhat.com>
++# David Malcolm <dmalcolm@redhat.com>
++
++cdef class Registry
++
++cdef class Base
++cdef class EventBase
++cdef class StateSet
++cdef class Accessible (Base)
++cdef class Desktop (Accessible)
++cdef class Application (Accessible)
++cdef class Component (Accessible)
++cdef class Action (Base)
++cdef class Text (Base)
++cdef class EditableText (Text)
++cdef class Hypertext (Text)
++cdef class Hyperlink (Base)
++cdef class Image (Base)
++cdef class Value (Base)
++cdef class Selection (Base)
++cdef class Table (Base)
++cdef class Event (EventBase)
++cdef class DeviceEvent
++
++ctypedef enum bool:
++ False = 0
++ True
++
++# SPIExceptionCode values:
++(SPI_EXCEPTION_UNSPECIFIED, SPI_EXCEPTION_DISCONNECT, SPI_EXCEPTION_NO_IMPL, SPI_EXCEPTION_IO, SPI_EXCEPTION_BAD_DATA)=range(5)
++
++# SPIExceptionType values:
++(SPI_EXCEPTION_SOURCE_UNSPECIFIED, SPI_EXCEPTION_SOURCE_ACCESSIBLE, SPI_EXCEPTION_SOURCE_REGISTRY, SPI_EXCEPTION_SOURCE_DEVICE)=range(4)
++
++# Accessible roles
++(SPI_ROLE_INVALID, SPI_ROLE_ACCEL_LABEL, SPI_ROLE_ALERT, SPI_ROLE_ANIMATION, SPI_ROLE_ARROW, SPI_ROLE_CALENDAR, SPI_ROLE_CANVAS, SPI_ROLE_CHECK_BOX, SPI_ROLE_CHECK_MENU_ITEM, SPI_ROLE_COLOR_CHOOSER, SPI_ROLE_COLUMN_HEADER, SPI_ROLE_COMBO_BOX, SPI_ROLE_DATE_EDITOR, SPI_ROLE_DESKTOP_ICON, SPI_ROLE_DESKTOP_FRAME, SPI_ROLE_DIAL, SPI_ROLE_DIALOG, SPI_ROLE_DIRECTORY_PANE, SPI_ROLE_DRAWING_AREA, SPI_ROLE_FILE_CHOOSER, SPI_ROLE_FILLER, SPI_ROLE_FONT_CHOOSER, SPI_ROLE_FRAME, SPI_ROLE_GLASS_PANE, SPI_ROLE_HTML_CONTAINER, SPI_ROLE_ICON, SPI_ROLE_IMAGE, SPI_ROLE_INTERNAL_FRAME, SPI_ROLE_LABEL, SPI_ROLE_LAYERED_PANE, SPI_ROLE_LIST, SPI_ROLE_LIST_ITEM, SPI_ROLE_MENU, SPI_ROLE_MENU_BAR, SPI_ROLE_MENU_ITEM, SPI_ROLE_OPTION_PANE, SPI_ROLE_PAGE_TAB, SPI_ROLE_PAGE_TAB_LIST, SPI_ROLE_PANEL, SPI_ROLE_PASSWORD_TEXT, SPI_ROLE_POPUP_MENU, SPI_ROLE_PROGRESS_BAR, SPI_ROLE_PUSH_BUTTON, SPI_ROLE_RADIO_BUTTON, SPI_ROLE_RADIO_MENU_ITEM, SPI_ROLE_ROOT_PANE, SPI_ROLE_ROW_HEADER, SPI_ROLE_SCROLL_BAR, SPI_ROLE_SCROLL_PANE, SPI_ROLE_SEPARATOR, SPI_ROLE_SLIDER, SPI_ROLE_SPIN_BUTTON, SPI_ROLE_SPLIT_PANE, SPI_ROLE_STATUS_BAR, SPI_ROLE_TABLE, SPI_ROLE_TABLE_CELL, SPI_ROLE_TABLE_COLUMN_HEADER, SPI_ROLE_TABLE_ROW_HEADER, SPI_ROLE_TEAROFF_MENU_ITEM, SPI_ROLE_TERMINAL, SPI_ROLE_TEXT, SPI_ROLE_TOGGLE_BUTTON, SPI_ROLE_TOOL_BAR, SPI_ROLE_TOOL_TIP, SPI_ROLE_TREE, SPI_ROLE_TREE_TABLE, SPI_ROLE_UNKNOWN, SPI_ROLE_VIEWPORT, SPI_ROLE_WINDOW, SPI_ROLE_EXTENDED, SPI_ROLE_HEADER, SPI_ROLE_FOOTER, SPI_ROLE_PARAGRAPH, SPI_ROLE_RULER, SPI_ROLE_APPLICATION, SPI_ROLE_AUTOCOMPLETE, SPI_ROLE_EDITBAR, SPI_ROLE_EMBEDDED, SPI_ROLE_LAST_DEFINED)=range(79)
++
++# Accessible states
++(SPI_STATE_INVALID, SPI_STATE_ACTIVE, SPI_STATE_ARMED, SPI_STATE_BUSY, SPI_STATE_CHECKED, SPI_STATE_COLLAPSED, SPI_STATE_DEFUNCT, SPI_STATE_EDITABLE, SPI_STATE_ENABLED, SPI_STATE_EXPANDABLE, SPI_STATE_EXPANDED, SPI_STATE_FOCUSABLE, SPI_STATE_FOCUSED, SPI_STATE_HORIZONTAL, SPI_STATE_ICONIFIED, SPI_STATE_MODAL, SPI_STATE_MULTI_LINE, SPI_STATE_MULTISELECTABLE, SPI_STATE_OPAQUE, SPI_STATE_PRESSED, SPI_STATE_RESIZABLE, SPI_STATE_SELECTABLE, SPI_STATE_SELECTED, SPI_STATE_SENSITIVE, SPI_STATE_SHOWING, SPI_STATE_SINGLE_LINE, SPI_STATE_STALE, SPI_STATE_TRANSIENT, SPI_STATE_VERTICAL, SPI_STATE_VISIBLE, SPI_STATE_MANAGES_DESCENDANTS, SPI_STATE_INDETERMINATE) = range(32);
++
++# Accessible relation types
++(SPI_RELATION_NULL, SPI_RELATION_LABEL_FOR, SPI_RELATION_LABELED_BY, SPI_RELATION_CONTROLLER_FOR, SPI_RELATION_CONTROLLED_BY, SPI_RELATION_MEMBER_OF, SPI_RELATION_NODE_CHILD_OF, SPI_RELATION_EXTENDED, SPI_RELATION_FLOWS_TO, SPI_RELATION_FLOWS_FROM, SPI_RELATION_SUBWINDOW_OF, SPI_RELATION_EMBEDS, SPI_RELATION_EMBEDDED_BY, SPI_RELATION_POPUP_FOR, SPI_RELATION_LAST_DEFINED) = range (15);
++
++# AccessibleComponent layers
++(SPI_LAYER_INVALID, SPI_LAYER_BACKGROUND, SPI_LAYER_CANVAS, SPI_LAYER_WIDGET, SPI_LAYER_MDI, SPI_LAYER_POPUP, SPI_LAYER_OVERLAY, SPI_LAYER_WINDOW, SPI_LAYER_LAST_DEFINED) = range(9)
++
++#AccessibleKeySynthType
++(SPI_KEY_PRESS, SPI_KEY_RELEASE, SPI_KEY_PRESSRELEASE, SPI_KEY_SYM, SPI_KEY_STRING) = range(5)
++
++# AccessibleKeyListenerSyncType
++(SPI_KEYLISTENER_NOSYNC, SPI_KEYLISTENER_SYNCHRONOUS, SPI_KEYLISTENER_CANCONSUME, SPI_KEYLISTENER_ALL_WINDOWS) = range(4)
++
++# AccessibleDeviceEventType
++SPI_KEY_PRESSED = 1<<0
++SPI_KEY_RELEASED = 1<<1
++SPI_BUTTON_PRESSED = 1<<2
++SPI_BUTTON_RELEASED = 1<<3
++
++cdef cspi.AccessibleKeySet *SPI_KEYSET_ALL_KEYS
++SPI_KEYSET_ALL_KEYS = NULL
++
++Accessibility_MODIFIER_SHIFT = 1 << 0
++Accessibility_MODIFIER_SHIFTLOCK = 1 << 1
++Accessibility_MODIFIER_CONTROL = 1 << 2
++Accessibility_MODIFIER_ALT = 1 << 3
++Accessibility_MODIFIER_META = 1 << 4
++Accessibility_MODIFIER_META2 = 1 << 5
++Accessibility_MODIFIER_META3 = 1 << 6
++Accessibility_MODIFIER_NUMLOCK = 1 << 7
++
++
++cdef object string(char * string):
++ cdef object pyString
++ pyString = string
++ cspi.SPI_freeString(string)
++ return pyString
++
++import os
++class X11Exception(Exception):
++ def __init__(self, display = os.environ.get('DISPLAY', None)):
++ self.display = display
++ def __str__(self):
++ msg = "Cannot open display"
++ if self.display: return msg + ': ' + self.display
++ else: return msg
++
++class AtspiException(Exception):
++ """
++ Exceptions raised when calls to the AT-SPI C bindings return FALSE to
++ indicate failure.
++ """
++ def __init__(self, message):
++ self.message = message
++
++ def __str__(self):
++ return "AtspiException: %s"%self.message
++
++class SpiException(Exception):
++ """
++ Exceptions to be raised in response to an installed
++ SPIExceptionHandler, corresponding to a SPIException. These appear to
++ be short-lived structs, so we gather all applicable data immediately
++ """
++ def __init__(self, is_fatal, sourceType, exceptionCode, description):
++ # print "got to __init__"
++ self.fatal = is_fatal
++ self.sourceType = sourceType
++ self.exceptionCode = exceptionCode
++ self.description = description
++
++ # print "leaving __init__"
++ # print self.fatal
++ # print self.sourceType
++ # print self.exceptionCode
++ # print self.description
++
++ def __str__(self):
++ if self.fatal:
++ fatalStr = "Fatal"
++ else:
++ fatalStr = "Non-fatal"
++ result = '%s SPIException: type:%s source:%s "%s"'%(fatalStr, self.sourceType, self.exceptionCode, self.description)
++ return result
++
++cdef make_exception(cspi.SPIException *err, cspi.SPIBoolean is_fatal):
++ # Don't attempt to use SPIAccessibleException_getSource; this is error
++ # handling code, we don't want to introduce further complications
++ return SpiException(is_fatal,
++ cspi.SPIException_getSourceType (err),
++ cspi.SPIException_getExceptionCode (err),
++ cspi.SPIException_getDescription (err))
++
++
++def event_main():
++ cspi.SPI_event_main()
++
++def event_quit():
++ cspi.SPI_event_quit()
++
++cdef cspi.SPIBoolean exception_handler (cspi.SPIException *err, cspi.SPIBoolean is_fatal) except *:
++ # print "got exception!!!"
++ e = make_exception(err, is_fatal)
++ raise e
++
++# at-spi-<version>/cpsi.h contains:
++# typedef SPIBoolean (*SPIExceptionHandler) (SPIException *err, SPIBoolean is_fatal);
++# and
++# SPIBoolean SPI_exceptionHandlerPush (SPIExceptionHandler *handler);
++# There's thus an extra unnecessary level of indirection.
++# We have to jump through the following hoops to get pyrex to deal with this:
++cdef cspi.SPIExceptionHandler exception_handler_as_type
++cdef cspi.SPIExceptionHandler* exception_handler_ptr
++exception_handler_as_type = exception_handler
++exception_handler_ptr = &exception_handler_as_type
++
++global_exception = None
++
++cdef class Registry:
++ def __init__ (self):
++ cdef Xlib.Display *display
++ display = Xlib.XOpenDisplay(NULL)
++ if display == NULL:
++ raise X11Exception
++ else:
++ Xlib.XCloseDisplay(display)
++
++ result = cspi.SPI_init ()
++ #if result!=0:
++ # raise AtspiException("SPI_init: exit code %s" % str(result))
++
++ result = cspi.SPI_exceptionHandlerPush (exception_handler_ptr)
++ if not result:
++ raise AtspiException("Unable to install SPI exception handler")
++
++ def __dealloc (self):
++ result = cspi.SPI_exit ()
++ if result!=0:
++ raise AtspiException("SPI_init: exit code %s" % str(result))
++
++ def getDesktopCount (self):
++ return cspi.SPI_getDesktopCount()
++
++ def getDesktop (self, index = 0):
++ cdef Desktop desktop
++ desktop = Desktop ()
++ if not desktop.__setItem (cspi.SPI_getDesktop (index)):
++ return False
++ return desktop
++
++ def getDesktopList (self):
++ # Using the bonobo.activation bindings, getDesktopList() returns a
++ # Python list of Desktop objects. The C bindings seem to do it differently,
++ # and Pyrex doesn't like that method. So we're re-implementing the function
++ # using getDesktopCount() and getDesktop() to work around that.
++ # Yay for Zack!
++ #
++ # -Zack
++ cdef Desktop desktop
++ desktops = []
++ desktop = Desktop ()
++ for i in xrange (cspi.SPI_getDesktopCount ()):
++ desktop.__setItem (cspi.SPI_getDesktop (i))
++ desktops = desktops + [desktop]
++ return desktops
++
++registry = Registry()
++
++cdef class Base:
++ """
++ Wrapper around a cspi.Accessible
++ """
++
++ cdef cspi.Accessible *__item
++
++ def __new__ (self):
++ self.__item = NULL
++
++ def __dealloc__ (self):
++ if self.__item != NULL:
++ cspi.Accessible_unref (self.__item)
++
++ cdef bool __setItem (self, cspi.Accessible *obj):
++ if self.__item != NULL:
++ cspi.Accessible_unref (self.__item)
++ if obj != NULL:
++ self.__item = obj
++ cspi.Accessible_ref (self.__item)
++ return True
++ else:
++ return False
++
++ def __checkSelf (self):
++ assert self.__item != NULL
++
++# WHY OH WHY won't this work? :(
++# I need to be able to find out of two Accessible classes contain
++# the same cspi.Accessible objects.
++#
++# def isSameAs (self, base):
++# cdef bool foo
++# foo = self.__item == base.__item
++# return foo
++
++cdef class EventBase:
++ """
++ Wrapper around a cspi.AccessibleEvent
++ """
++ cdef cspi.AccessibleEvent *__item
++
++ def __new__ (self):
++ self.__item = NULL
++
++ def __dealloc__ (self):
++ if self.__item != NULL:
++ cspi.AccessibleEvent_unref (self.__item)
++
++ cdef bool __setItem (self, cspi.AccessibleEvent *obj):
++ if self.__item != NULL:
++ cspi.AccessibleEvent_unref (self.__item)
++ if obj != NULL:
++ self.__item = obj
++ cspi.AccessibleEvent_ref (self.__item)
++ return True
++ else:
++ return False
++
++ def __checkSelf (self):
++ if self.__item == NULL:
++ raise AttributeError, "__item must not be NULL"
++
++ def __getattr__ (self, attrName):
++ cdef cspi.Accessible* acc
++ cdef Accessible result
++ if attrName == "source":
++ acc = self.__item.source
++ if acc!=NULL:
++ result = Accessible ()
++ result.__setItem (acc)
++ return result
++ elif attrName == "detail1":
++ detail1 = self.__item.detail1
++ return detail1
++ elif attrName == "detail2":
++ detail1 = self.__item.detail2
++ return detail1
++ elif attrName == "type":
++ return self.__item.type
++
++cdef class StateSet:
++ """
++ Wrapper around a cspi.AccessibleStateSet
++ """
++ cdef cspi.AccessibleStateSet *__item
++
++ def __new__ (self):
++ self.__item = NULL
++
++ def __dealloc__ (self):
++ if self.__item != NULL:
++ cspi.AccessibleStateSet_unref (self.__item)
++
++ def __checkSelf (self):
++ if self.__item == NULL:
++ raise AttributeError, "__item must not be NULL"
++
++ cdef bool __setItem (self, cspi.AccessibleStateSet *obj):
++ if self.__item != NULL:
++ cspi.AccessibleStateSet_unref (self.__item)
++ if obj != NULL:
++ self.__item = obj
++ cspi.AccessibleStateSet_ref (self.__item)
++ return True
++ else:
++ return False
++
++ cdef bool __contains (self, cspi.AccessibleState s):
++ self.__checkSelf ()
++ return cspi.AccessibleStateSet_contains (self.__item, s)
++
++ def contains (self, state):
++ self.__checkSelf ()
++ return self.__contains(state)
++
++ cdef void __add (self, cspi.AccessibleState s):
++ self.__checkSelf ()
++ cspi.AccessibleStateSet_add(self.__item, s)
++
++ def add (self, state):
++ self.__checkSelf ()
++ self.__add (state)
++
++ cdef void __remove (self, cspi.AccessibleState s):
++ self.__checkSelf ()
++ cspi.AccessibleStateSet_remove (self.__item, s)
++
++ def remove (self, state):
++ self.__checkSelf ()
++ self.__remove (state)
++
++ def __str__ (self):
++ self.__checkSelf ()
++ return str(self.states)
++
++ def __getattr__(self, name):
++ if name == "states":
++ result = []
++ for state in range(SPI_STATE_INVALID, SPI_STATE_INDETERMINATE):
++ if self.contains(state):
++ result.append(state)
++ return result
++ else:
++ raise AttributeError, name
++
++cdef class Relation:
++ """
++ Wrapper around a cspi.AccessibleRelation
++ """
++ cdef cspi.AccessibleRelation *__item
++
++ def __new__ (self):
++ self.__item = NULL
++
++ def __dealloc__ (self):
++ if self.__item != NULL:
++ cspi.AccessibleRelation_unref (self.__item)
++
++ def __checkSelf (self):
++ if self.__item == NULL:
++ raise AttributeError, "__item must not be NULL"
++
++ def __str__ (self):
++ self.__checkSelf ()
++ return "relation %s -> %s"%(self.getRelationType (), self.getTargets())
++
++ def __repr__ (self):
++ self.__checkSelf ()
++ return "relation %s -> %s"%(self.getRelationType (), self.getTargets())
++
++ cdef bool __setItem (self, cspi.AccessibleRelation *obj):
++ if self.__item != NULL:
++ cspi.AccessibleRelation_unref (self.__item)
++ if obj != NULL:
++ self.__item = obj
++ cspi.AccessibleRelation_ref (self.__item)
++ return True
++ else:
++ return False
++
++ def getNTargets (self):
++ """
++ Wrapper around cspi.AccessibleRelation_getNTargets
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleRelation_getNTargets (self.__item)
++
++ def getTarget (self, i):
++ """
++ Wrapper around cspi.AccessibleRelation_getTarget
++ """
++ self.__checkSelf ()
++ cdef Accessible target
++ target = Accessible ()
++ target.__setItem (cspi.AccessibleRelation_getTarget (self.__item, i))
++ target.__checkSelf ()
++ return target
++
++ def getTargets (self):
++ """
++ Gets the targets of this AccessibleRelation as a list of atspi.Accessible
++ """
++ self.__checkSelf ()
++ result = []
++ count = self.getNTargets()
++ for i in range(count):
++ result.append(self.getTarget(i))
++ return result
++
++ def getRelationType (self):
++ """
++ Wrapper around cspi.AccessibleRelation_getRelationType
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleRelation_getRelationType (self.__item)
++
++cdef class Accessible (Base):
++ """
++ Wrapper around cspi.Accessible
++ """
++ def __getattr__ (self, name):
++ if name == "name":
++ return self.getName ()
++ elif name == "role":
++ return self.getRole ()
++ elif name == "roleName":
++ return self.getRoleName ()
++ elif name == "description":
++ return self.getDescription ()
++ elif name == "parent":
++ return self.getParent ()
++ elif name == "childCount":
++ return self.getChildCount ()
++ elif name == "indexInParent":
++ return self.getIndexInParent ()
++ elif name == "stateSet":
++ return self.getStateSet ()
++ else:
++ raise AttributeError, name
++
++ def getName (self):
++ """
++ Wrapper around cspi.Accessible_getName
++ """
++ self.__checkSelf()
++ return string(cspi.Accessible_getName(self.__item))
++
++ def getDescription (self):
++ """
++ Wrapper around cspi.Accessible_getDescription
++ """
++ self.__checkSelf()
++ return string(cspi.Accessible_getDescription(self.__item))
++
++ def getParent (self):
++ """
++ Wrapper around cspi.Accessible_getParent, returning an
++ atspi.Accessible or None
++ """
++ self.__checkSelf()
++ cdef Accessible parent
++ cdef cspi.Accessible* spiParent
++
++ spiParent = cspi.Accessible_getParent (self.__item)
++ if spiParent!=NULL:
++ parent = Accessible ()
++ parent.__setItem (spiParent)
++ parent.__checkSelf ()
++ return parent
++ else:
++ return None
++
++ def getChildAtIndex (self, index):
++ """
++ Wrapper around cspi.Accessible_getChildAtIndex, returning an
++ atspi.Accessible, atspi.Application, or None
++ """
++ self.__checkSelf()
++ cdef int i
++ i = index
++
++ # This hairiness is due to the fact that Pyrex doesn't allow cdefs
++ # inside if blocks.
++
++ cdef cspi.Accessible* spiChild
++ spiChild = cspi.Accessible_getChildAtIndex (self.__item, i)
++ # Workaround for GNOME bug #321273
++ # http://bugzilla.gnome.org/show_bug.cgi?id=321273
++ if spiChild == NULL: return None
++
++ cdef object child
++ cdef Application app
++ cdef Accessible acc
++ cdef Text text
++
++ if cspi.Accessible_isApplication (spiChild):
++ app = Application ()
++ app.__setItem (spiChild)
++ child = app
++ else:
++ acc = Accessible ()
++ acc.__setItem (spiChild)
++ child = acc
++
++ return child
++
++ def getIndexInParent (self):
++ """
++ Wrapper around cspi.Accessible_getIndexInParent
++ """
++ self.__checkSelf()
++ return cspi.Accessible_getIndexInParent (self.__item)
++
++ def getRole (self):
++ """
++ Wrapper around cspi.Accessible_getRole
++ """
++ self.__checkSelf()
++ return cspi.Accessible_getRole (self.__item)
++
++ def getRoleName (self):
++ """
++ Wrapper around cspi.Accessible_getRoleName
++ """
++ self.__checkSelf()
++ return string(cspi.Accessible_getRoleName (self.__item))
++
++ def getChildCount (self):
++ """
++ Wrapper around cspi.Accessible_getChildCount
++ """
++ self.__checkSelf()
++ return cspi.Accessible_getChildCount (self.__item)
++
++ def getStateSet (self):
++ """
++ Wrapper around cspi.Accessible_getStateSet, returning an
++ atspi.StateSet
++ """
++ self.__checkSelf()
++ cdef StateSet set
++ set = StateSet()
++ set.__setItem (cspi.Accessible_getStateSet (self.__item))
++ return set
++
++ def getInterface (self, interface):
++ """
++ This is NOT part of cspi, it is just for compatibility with
++ the bonobo bindings and will probably go away soon.
++ """
++ self.__checkSelf()
++ return getattr(self, "get%s" % interface) ()
++
++ def getAction (self):
++ """
++ Wrapper around cspi.Accessible_getAction, returning
++ an atspi.Action or None
++ """
++ self.__checkSelf()
++ cdef Action action
++ action = Action ()
++ action.__setItem (cspi.Accessible_getAction (self.__item))
++ if action.__item != NULL:
++ return action
++
++ def getText (self):
++ """
++ Wrapper around cspi.Accessible_getText, returning an atspi.Text
++ or None
++ """
++ self.__checkSelf ()
++ cdef Text text
++ text = Text ()
++ text.__setItem (cspi.Accessible_getText (self.__item))
++ if text.__item != NULL:
++ return text
++
++ def getEditableText (self):
++ """
++ Wrapper around cspi.Accessible_getText, returning an
++ atspi.EditableText or None
++ """
++ self.__checkSelf ()
++ cdef EditableText etext
++ etext = EditableText ()
++ etext.__setItem (cspi.Accessible_getEditableText (self.__item))
++ if etext.__item != NULL:
++ return etext
++
++ def getHypertext (self):
++ """
++ Wrapper around cspi.Accessible_getHypertext, returning an
++ atspi.Hypertext or None
++ """
++ self.__checkSelf ()
++ cdef Hypertext hypertext
++ hypertext = Hypertext ()
++ hypertext.__setItem (cspi.Accessible_getHypertext (self.__item))
++ if hypertext.__item != NULL:
++ return hypertext
++
++ def getImage (self):
++ """
++ Wrapper around cspi.Accessible_getImage, returning an
++ atspi.Image or None
++ """
++ self.__checkSelf ()
++ cdef Image image
++ image = Image ()
++ image.__setItem (cspi.Accessible_getImage (self.__item))
++ if image.__item != NULL:
++ return image
++
++ def getValue (self):
++ """
++ Wrapper around cspi.Accessible_getValue, returning an
++ atspi.Value or None
++ """
++ self.__checkSelf ()
++ cdef Value value
++ value = Value ()
++ value.__setItem (cspi.Accessible_getValue (self.__item))
++ if value.__item != NULL:
++ return value
++
++ def getSelection (self):
++ """
++ Wrapper around cspi.Accessible_getSelection, returning an
++ atspi.Selection or None
++ """
++ self.__checkSelf ()
++ cdef Selection selection
++ selection = Selection ()
++ selection.__setItem (cspi.Accessible_getSelection (self.__item))
++ if selection.__item != NULL:
++ return selection
++
++ def getComponent (self):
++ """
++ Wrapper around cspi.Accessible_getComponent, returning an
++ atspi.Component or None
++ """
++ self.__checkSelf ()
++ cdef Component component
++ component = Component ()
++ component.__setItem (cspi.Accessible_getComponent (self.__item))
++ if component.__item != NULL:
++ return component
++
++ def getRelationSet (self):
++ """
++ Wraps Accessible_getRelationSet, returning a list
++ of atspi.Relation
++ """
++ # looking at at-poke, result from C API appears to be a NULL-terminated list of pointers, and that we should free the buffer
++ self.__checkSelf ()
++ cdef Relation relation
++
++ relations = []
++ cdef cspi.AccessibleRelation **relationSet
++ relationSet = cspi.Accessible_getRelationSet (self.__item)
++
++ i=0
++ while relationSet[i]:
++ relation = Relation ()
++ relation.__setItem (relationSet[i])
++ relations.append(relation)
++ i=i+1
++ cspi.free (relationSet)
++
++ return relations
++
++
++cdef class Desktop (Accessible):
++ pass
++
++
++cdef class Application (Accessible):
++ """
++ Wrapper around the low-level cspi.AccessibleApplication_ functions,
++ giving an OO-style API.
++ """
++ def getToolkit (self):
++ """
++ Wraps AccessibleApplication_getToolkitName, returning a string
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleApplication_getToolkitName (self.__item)
++
++ def getVersion (self):
++ """
++ Wraps AccessibleApplication_getVersion, returning a string
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleApplication_getVersion(self.__item)
++
++ def getID (self):
++ """
++ Wraps AccessibleApplication_getID, returning a string
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleApplication_getID (self.__item)
++
++ def pause (self):
++ """
++ Wraps AccessibleApplication_pause
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleApplication_pause (self.__item)
++
++ def resume (self):
++ """
++ Wraps AccessibleApplication_resume
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleApplication_resume (self.__item)
++
++cdef class Component (Accessible):
++ """
++ Wrapper around the low-level cspi.AccessibleComponent_ functions,
++ giving an OO-style API.
++ """
++ def getExtents (self, type=0):
++ """
++ Wraps cspi.AccessibleComponent_getExtents, returning an
++ (x,y,w,h) tuple.
++ """
++ self.__checkSelf ()
++ cdef long x, y, w, h
++ cspi.AccessibleComponent_getExtents (self.__item, &x, &y, &w, &h, type)
++ return (x, y, w, h)
++
++ def getPosition (self, type = 0):
++ """
++ Wraps cspi.AccessibleComponent_getPosition, returning an
++ (x,y) tuple.
++ """
++ self.__checkSelf ()
++ cdef long x, y
++ cspi.AccessibleComponent_getPosition (self.__item, &x, &y, type)
++ return (x, y)
++
++ def getSize (self):
++ """
++ Wraps cspi.AccessibleComponent_getSize, returning a
++ (w,h) tuple.
++ """
++ self.__checkSelf ()
++ cdef long w, h
++ cspi.AccessibleComponent_getSize (self.__item, &w, &h)
++ return (w, h)
++
++ def getLayer (self):
++ """
++ Wraps cspi.AccessibleComponent_getLayer, returning an
++ AccessibleComponentLayer.
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleComponent_getLayer (self.__item)
++
++ def grabFocus (self):
++ """
++ Wraps cspi.AccessibleComponent_grabFocus, raising AtspiException
++ if it fails
++ """
++ self.__checkSelf ()
++ if not cspi.AccessibleComponent_grabFocus (self.__item):
++ raise AtspiException("AccessibleComponent_grabFocus")
++
++ def getMDIZOrder (self):
++ """
++ Wraps cspi.AccessibleComponent_getMDIZOrder, returning an integer.
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleComponent_getMDIZOrder(self.__item)
++
++cdef class Action (Base):
++ """
++ Wrapper around the low-level cspi.AccessibleAction_ functions,
++ giving an OO-style API.
++ """
++ def __getattr__ (self, name):
++ if name == "nActions":
++ return self.getNActions ()
++ else:
++ raise AttributeError, name
++
++ def getNActions (self):
++ """
++ Wraps cspi.AccessibleAction_getNActions
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleAction_getNActions (self.__item)
++
++ def doAction (self, index):
++ """
++ Wraps cspi.AccessibleAction_doAction
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleAction_doAction (self.__item, index)
++
++ def getKeyBinding (self, index):
++ """
++ Wraps cspi.AccessibleAction_getKeyBinding
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleAction_getKeyBinding (self.__item, index)
++
++ def getName (self, index):
++ """
++ Wraps cspi.AccessibleAction_getName
++ """
++ self.__checkSelf ()
++ return string(cspi.AccessibleAction_getName (self.__item, index))
++
++ def getDescription (self, index):
++ """
++ Wraps cspi.AccessibleAction_getDescription
++ """
++ self.__checkSelf ()
++ return string(cspi.AccessibleAction_getDescription (self.__item, index))
++
++
++cdef class Text (Base):
++ """
++ Wrapper around the low-level cspi.AccessibleText_ functions,
++ giving an OO-style API.
++ """
++ def addSelection (self, startOffset, endOffset):
++ """
++ Wraps cspi.AccessibleText_addSelection
++ """
++ self.__checkSelf ()
++ if not cspi.AccessibleText_addSelection (self.__item, startOffset, endOffset):
++ raise AtspiException("AccessibleText_addSelection")
++
++
++ #def getAttributes (self, offset, startOffset, endOffset):
++ # self.__checkSelf ()
++ # return cspi.AccessibleText_getAttributes (self.__item, offset, startOffset, endOffset)
++ def getCaretOffset (self):
++ """
++ Wraps cspi.AccessibleText_getCaretOffset
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleText_getCaretOffset (self.__item)
++
++ def getCharacterCount (self):
++ """
++ Wraps cspi.AccessibleText_getCharacterCount
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleText_getCharacterCount (self.__item)
++
++ def getNSelections (self):
++ """
++ Wraps cspi.AccessibleText_getNSelections
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleText_getNSelections (self.__item)
++
++ #def getSelection (self, selectionNum, startOffset, endOffset):
++ # self.__checkSelf ()
++ # return cspi.AccessibleText_getSelection (self.__item, selectionNum, startOffset, endOffset)
++
++ def getText (self, startOffset, endOffset):
++ """
++ Wraps cspi.AccessibleText_getText
++ """
++ self.__checkSelf ()
++ return string(cspi.AccessibleText_getText (self.__item, startOffset, endOffset))
++
++ def removeSelection (self, selectionNum):
++ """
++ Wraps cspi.AccessibleText_removeSelection, raising AtspiException if it fails
++ """
++ self.__checkSelf ()
++ if not cspi.AccessibleText_removeSelection (self.__item, selectionNum):
++ raise AtspiException("AccessibleText_removeSelection")
++
++ def setSelection (self, selectionNum, startOffset, endOffset):
++ """
++ Wraps cspi.AccessibleText_setSelection, raising AtspiException if it fails
++ """
++ self.__checkSelf ()
++ if not cspi.AccessibleText_setSelection (self.__item, selectionNum, startOffset, endOffset):
++ raise AtspiException("AccessibleText_setSelection")
++
++ def setCaretOffset (self, position):
++ """
++ Wraps cspi.AccessibleText_setCaretOffset, raising AtspiException if it fails
++ """
++ self.__checkSelf ()
++ if not cspi.AccessibleText_setCaretOffset (self.__item, position):
++ raise AtspiException("AccessibleText_setCaretOffset")
++
++cdef class EditableText (Text):
++ """
++ Wrapper around the low-level cspi.AccessibleEditableText_ functions,
++ giving an OO-style API.
++ """
++ def setTextContents (self, newContents):
++ """
++ Wraps cspi.AccessibleEditableText_setTextContents, raising AtspiException if it fails
++ """
++ self.__checkSelf ()
++ if not cspi.AccessibleEditableText_setTextContents (self.__item, newContents):
++ raise AtspiException("AccessibleEditableText_setTextContents")
++
++ def setAttributes (self, attributes, startOffset, endOffset):
++ """
++ Wraps cspi.AccessibleEditableText_setAttributes, raising AtspiException if it fails
++ """
++ self.__checkSelf ()
++ if not cspi.AccessibleEditableText_setAttributes (self.__item, attributes, startOffset, endOffset):
++ raise AtspiException("AccessibleEditableText_setAttributes")
++
++ def insertText (self, position, text):
++ """
++ Wraps cspi.AccessibleEditableText_insertText, raising AtspiException if it fails
++ """
++ self.__checkSelf ()
++ if not cspi.AccessibleEditableText_insertText (self.__item, position, text, cspi.strlen(text)):
++ raise AtspiException("AccessibleEditableText_insertText")
++
++cdef class Hypertext (Text):
++ """
++ Wrapper around the low-level cspi.AccessibleHypertext_ functions,
++ giving an OO-style API.
++ """
++ def getNLinks (self):
++ """
++ Wraps cspi.AccessibleHypertext_getNLinks, raising AtspiException if it fails
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleHypertext_getNLinks (self.__item)
++
++ def getLink (self, linkIndex):
++ """
++ Wraps cspi.AccessibleHypertext_getLink, raising AtspiException if it fails
++ """
++ self.__checkSelf ()
++ cdef Hyperlink hyperlink
++ hyperlink = Hyperlink ()
++ hyperlink.__setItem (cspi.AccessibleHypertext_getLink (self.__item, linkIndex))
++ if hyperlink.__item != NULL:
++ return hyperlink
++
++ def getLinkIndex (self, characterOffset):
++ """
++ Wraps cspi.AccessibleHypertext_getLinkIndex, raising AtspiException if it fails
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleHypertext_getLinkIndex (self.__item, characterOffset)
++
++cdef class Hyperlink (Base):
++ """
++ Wrapper around the low-level cspi.AccessibleHyperlink_ functions,
++ giving an OO-style API.
++ """
++ def getNAnchors (self):
++ """
++ Wraps cspi.AccessibleHyperlink_getNAnchors, raising AtspiException if it fails
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleHyperlink_getNAnchors (self.__item)
++
++ def getIndexRange (self):
++ """
++ Wraps cspi.AccessibleHyperlink_getIndexRange, returning [startIndex, endIndex] pair
++ """
++ self.__checkSelf ()
++ cdef long startIndex, endIndex
++ cspi.AccessibleHyperlink_getIndexRange(self.__item, &startIndex, &endIndex)
++ return [startIndex, endIndex]
++
++
++ def getObject (self, i):
++ """
++ Wraps cspi.AccessibleHyperlink_getObject
++ """
++ self.__checkSelf ()
++ cdef Accessible object
++ object = Accessible ()
++ object.__setItem (cspi.AccessibleHyperlink_getObject (self.__item, i))
++ object.__checkSelf ()
++ return object
++
++ def getURI (self, i):
++ """
++ Wraps cspi.AccessibleHyperlink_getURI, raising AtspiException if it fails
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleHyperlink_getURI (self.__item, i)
++
++ def isValid (self):
++ """
++ Wraps cspi.AccessibleHyperlink_isValid, raising AtspiException if it fails
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleHyperlink_isValid (self.__item)
++
++cdef class Image (Base):
++ """
++ Wrapper around the low-level cspi.AccessibleImage_ functions,
++ giving an OO-style API.
++ """
++ def getImageDescription (self):
++ """
++ Wraps cspi.AccessibleImage_getImageDescription
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleImage_getImageDescription (self.__item)
++
++ def getImageSize (self):
++ """
++ Wraps cspi.AccessibleImage_getImageSize, returning a (w,h) pair
++ """
++ self.__checkSelf ()
++ cdef long w, h
++ cspi.AccessibleImage_getImageSize(self.__item, &w, &h);
++ return [w, h]
++
++ def getImagePosition (self, type=0):
++ """
++ Wraps cspi.AccessibleImage_getImagePosition, returning a (x,y)
++ pair
++ """
++ self.__checkSelf ()
++ cdef long x, y
++ cspi.AccessibleImage_getImagePosition(self.__item, &x, &y, type)
++ return [x, y]
++
++ def getImageExtents (self, type=0):
++ """
++ Wraps cspi.AccessibleImage_getImageExtents, returning a
++ (x,y,w,h) tuple
++ """
++ self.__checkSelf ()
++ cdef long x, y, w, h
++ cspi.AccessibleImage_getImageExtents(self.__item, &x, &y, &w, &h, type)
++ return [x, y, w, h]
++
++cdef class Value (Base):
++ """
++ Wrapper around the low-level cspi.AccessibleValue_ functions,
++ giving an OO-style API.
++ """
++ def getMinimumValue (self):
++ """
++ Wraps cspi.AccessibleValue_getMinimumValue
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleValue_getMinimumValue(self.__item)
++
++ def getCurrentValue (self):
++ """
++ Wraps cspi.AccessibleValue_getMinimumValue
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleValue_getCurrentValue(self.__item)
++
++ def getMaximumValue (self):
++ """
++ Wraps cspi.AccessibleValue_getMinimumValue
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleValue_getMaximumValue(self.__item)
++
++ def setCurrentValue (self, newValue):
++ """
++ Wraps cspi.AccessibleValue_setCurrentValue
++ """
++ self.__checkSelf ()
++ if not cspi.AccessibleValue_setCurrentValue (self.__item, newValue):
++ raise AtspiException("AccessibleValue_setCurrentValue")
++
++cdef class Selection (Base):
++ """
++ Wrapper around the low-level cspi.AccessibleSelection_ functions,
++ giving an OO-style API.
++ """
++
++ def getNSelectedChildren (self):
++ """
++ Wraps cspi.AccessibleSelection_getNSelectedChildren
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleSelection_getNSelectedChildren (self.__item)
++
++ def getSelectedChild (self, index):
++ """
++ Wraps cspi.AccessibleSelection_getSelectedChild
++ """
++ self.__checkSelf ()
++
++ cdef cspi.Accessible* spiChild
++ spiChild = cspi.AccessibleSelection_getSelectedChild (self.__item, index)
++
++ assert spiChild != NULL
++
++ cdef object child
++ cdef Application app
++ cdef Accessible acc
++ cdef Text text
++
++ if cspi.Accessible_isApplication (spiChild):
++ app = Application ()
++ app.__setItem (spiChild)
++ child = app
++ else:
++ acc = Accessible ()
++ acc.__setItem (spiChild)
++ child = acc
++
++ return child
++
++ def selectChild (self, index):
++ """
++ Wraps cspi.AccessibleSelection_selectChild
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleSelection_selectChild (self.__item, index)
++
++ def deselectSelectedChild (self, index):
++ """
++ Wraps cspi.AccessibleSelection_deselectSelectedChild
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleSelection_deselectSelectedChild (self.__item, index)
++
++ def isChildSelected (self, index):
++ """
++ Wraps cspi.AccessibleSelection_isChildSelected
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleSelection_isChildSelected (self.__item, index)
++
++ def selectAll (self):
++ """
++ Wraps cspi.AccessibleSelection_selectAll
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleSelection_selectAll( self.__item)
++
++ def clearSelection (self):
++ """
++ Wraps cspi.AccessibleSelection_clearSelection
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleSelection_clearSelection (self.__item)
++
++cdef class Table (Base):
++ """
++ Wrapper around the low-level cspi.AccessibleTable_ functions,
++ giving an OO-style API.
++ """
++
++ # def getTableAccessibleAt (self, row, column):
++ # def getTableCaption (self):
++
++ def getTableColumnAtIndex (self, index):
++ """
++ Wraps cspi.AccessibleTable_getColumnAtIndex
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleTable_getColumnAtIndex(self.__item, index)
++
++ def getTableColumnDescription (self, column):
++ """
++ Wraps cspi.AccessibleTable_getColumnDescription
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleTable_getColumnDescription(self.__item, column)
++
++ def getTableColumnExtentAt (self, row, column):
++ """
++ Wraps cspi.AccessibleTable_getColumnExtentAt
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleTable_getColumnExtentAt(self.__item, row, column)
++
++ # def getTableColumnHeader (self, column):
++
++ def getTableIndexAt (self, row, column):
++ """
++ Wraps cspi.AccessibleTable_getIndexAt
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleTable_getIndexAt(self.__item, row, column)
++
++ def getTableNColumns (self):
++ """
++ Wraps cspi.AccessibleTable_getNColumns
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleTable_getNColumns(self.__item)
++
++ def getTableNRows (self):
++ """
++ Wraps cspi.AccessibleTable_getNRows
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleTable_getNRows(self.__item)
++
++ def getTableNSelectedColumns (self):
++ """
++ Wraps cspi.AccessibleTable_getNSelectedColumns
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleTable_getNSelectedColumns(self.__item)
++
++ def getTableNSelectedRows (self):
++ """
++x Wraps cspi.AccessibleTable_getNSelectedRows
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleTable_getNSelectedRows(self.__item)
++
++ def getTableRowAtIndex (self, index):
++ """
++ Wraps cspi.AccessibleTable_getRowAtIndex
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleTable_getRowAtIndex(self.__item, index)
++
++ def getTableRowDescription (self, row):
++ """
++ Wraps cspi.AccessibleTable_getRowDescription
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleTable_getRowDescription(self.__item, row)
++
++ def getTableRowExtentAt (self, row, column):
++ """
++ Wraps cspi.AccessibleTable_getRowExtentAt
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleTable_getRowExtentAt(self.__item, row, column)
++
++ # def getTableRowHeader (self, row):
++ # def getTableSelectedRows (self, **selectedRows): - Not sure if the variable which is a pointer to a pointer is acceptable
++ # def getTableSelectedColumns (self, **selectedColumns): - Same issue as above
++ # def getTableSummary (self):
++
++ def isTableColumnSelected (self, column):
++ """
++ Wraps cspi.AccessibleTable_isColumnSelected
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleTable_isColumnSelected(self.__item, column)
++
++ def isTableRowSelected (self, row):
++ """
++ Wraps cspi.AccessibleTable_isRowSelected
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleTable_isRowSelected(self.__item, row)
++
++ def isTableSelected (self, row, column):
++ """
++ Wraps cspi.AccessibleTable_isSelected
++ """
++ self.__checkSelf ()
++ return cspi.AccessibleTable_isSelected(self.__item, row, column)
++
++
++cdef class Event (EventBase):
++ #def AccessibleEventListener* SPI_createAccessibleEventListener (AccessibleEventListenerCB callback, void *user_data)
++ #void AccessibleEventListener_unref (AccessibleEventListener *listener)
++ #SPIBoolean AccessibleEventListener_addCallback (AccessibleEventListener *listener, AccessibleEventListenerCB callback, void *user_data)
++ #SPIBoolean AccessibleEventListener_removeCallback (AccessibleEventListener *listener, AccessibleEventListenerCB callback)
++
++ #Accessible* AccessibleActiveDescendantChangedEvent_getActiveDescendant (AccessibleEvent *event)
++ #Accessible* AccessibleChildChangedEvent_getChildAccessible (AccessibleEvent *event)
++
++ def getDescriptionChangedEventDescriptionString (self):
++ self.__checkSelf()
++ return string(cspi.AccessibleDescriptionChangedEvent_getDescriptionString(self.__item))
++
++ def getNameChangedEventNameString (self):
++ self.__checkSelf()
++ return string(cspi.AccessibleNameChangedEvent_getNameString(self.__item))
++
++ # Accessible* AccessibleParentChangedEvent_getParentAccessible (AccessibleEvent *event)
++
++ def getTableCaptionChangedEventCaptionString(self):
++ self.__checkSelf()
++ return string(cspi.AccessibleTableCaptionChangedEvent_getCaptionString(self.__item))
++
++ def getTableColumnDescriptionChangedEventDescriptionString(self):
++ self.__checkSelf ()
++ return string(cspi.AccessibleTableColumnDescriptionChangedEvent_getDescriptionString(self.__item))
++
++ # Accessible* AccessibleTableHeaderChangedEvent_getHeaderAccessible (AccessibleEvent *event)
++
++ def getTableRowDescriptionChangedEventDescriptionString(self):
++ self.__checkSelf ()
++ return string(cspi.AccessibleTableRowDescriptionChangedEvent_getDescriptionString(self.__item))
++
++ #Accessible* AccessibleTableSummaryChangedEvent_getSummaryAccessible (AccessibleEvent *event)
++
++ def getTextChangedEventChangeString (self):
++ self.__checkSelf ()
++ return string(cspi.AccessibleTextChangedEvent_getChangeString(self.__item))
++
++ def getTextSelectionChangedEventSelectionString (self):
++ self.__checkSelf ()
++ return string(cspi.AccessibleTextSelectionChangedEvent_getSelectionString(self.__item))
++
++ def getWindowEventTitleString (self):
++ self.__checkSelf ()
++ return string(cspi.AccessibleWindowEvent_getTitleString(self.__item))
++
++class EventGenerator:
++ """
++ Wrapper layer around SPI_generateKeyboardEvent and
++ SPI_generateMouseEvent, used for generating input events.
++
++ Use AccessibleAction in preference to this.
++ """
++ def injectKeyboardString (self, string):
++ """
++ Inject a string as if it had been typed using an input method.
++ """
++ # Seems to only work if you do it one character at a time...
++ for char in string:
++ self.__generateKeystringEvent (str(char), cspi.SPI_KEY_STRING)
++
++ def __keyStringToKeyCode(self, keyString):
++ cdef Xlib.Display *display
++ display = Xlib.XOpenDisplay(NULL)
++
++ cdef Xlib.KeySym sym
++ sym = Xlib.XStringToKeysym(keyString)
++ cdef Xlib.KeyCode code
++ code = Xlib.XKeysymToKeycode(display, sym)
++
++ #print str(keyString), str(int(sym)), code
++
++ Xlib.XCloseDisplay(display)
++ return int(code)
++
++ def generateKeyCombo (self, keyStrings):
++ modifiers = keyStrings[:-1]
++ finalKey = keyStrings[-1]
++
++ for modifier in modifiers:
++ code = self.__keyStringToKeyCode(modifier)
++ self.generateKeyboardEvent(code, '', cspi.SPI_KEY_PRESS)
++
++ code = self.__keyStringToKeyCode(finalKey)
++ self.generateKeyboardEvent(code, '', cspi.SPI_KEY_PRESSRELEASE)
++
++ for modifier in modifiers:
++ code = self.__keyStringToKeyCode(modifier)
++ self.generateKeyboardEvent(code, '', cspi.SPI_KEY_RELEASE)
++
++
++ def __generateKeyvalEvent (self, keyval, synthType):
++ self.generateKeyboardEvent (keyval, None, synthType)
++
++ def __generateKeystringEvent (self, keystring, synthType):
++ self.generateKeyboardEvent (0, keystring, synthType)
++
++ def generateKeyboardEvent (self, keyval, keystring, synthType):
++ if not cspi.SPI_generateKeyboardEvent (keyval, keystring, synthType):
++ raise AtspiException("SPI_generateKeyboardEvent")
++
++ def click (self, x, y, button):
++ """
++ Synthesize a mouse button click at (x,y)
++ """
++ self.__generateButtonEvent (x, y, button, "c")
++
++ def doubleClick (self, x, y, button):
++ """
++ Synthesize a mouse button double-click at (x,y)
++ """
++ self.__generateButtonEvent (x, y, button, "d")
++
++ def press (self, x, y, button):
++ """
++ Synthesize a mouse button press at (x,y)
++ """
++ self.__generateButtonEvent (x, y, button, "p")
++
++ def release (self, x, y, button):
++ """
++ Synthesize a mouse button release at (x,y)
++ """
++ self.__generateButtonEvent (x, y, button, "r")
++
++ def absoluteMotion (self, x, y):
++ """
++ Synthesize mouse absolute motion to (x,y)
++ """
++ self.__generateEvent (x, y, "abs")
++
++ def relativeMotion (self, x, y):
++ """
++ Synthesize mouse relative motion of (x,y)
++ """
++ self.__generateEvent (x, y, "rel")
++
++ def drag (self, fromXY, toXY, button):
++ """
++ Synthesize a drag (press, move and release) from (x,y) to (x,y).
++
++ These are absolute screen coordinates
++ """
++ (x,y) = fromXY
++ self.press (x, y, button)
++
++ (x,y) = toXY
++ self.absoluteMotion(x,y)
++
++ self.release (x, y, button)
++
++ def __generateEvent (self, x, y, name):
++ """
++ Thin wrapper around SPI_generateMouseEvent.
++
++ Event names: b1p = button 1 press; b2r = button 2 release;
++ b3c = button 3 click; b2d = button 2 double-click;
++ abs = absolute motion; rel = relative motion.
++ """
++ if not cspi.SPI_generateMouseEvent (x, y, name):
++ raise AtspiException("Error generating mouse event")
++
++ def __generateButtonEvent (self, x, y, button, suffix):
++ self.__generateEvent (x, y, self.__generateButtonName(button)+suffix)
++
++ def __generateButtonName(self, button):
++ if button==1:
++ return "b1"
++ elif button==2:
++ return "b2"
++ elif button==3:
++ return "b3"
++ else: raise ValueError, "Unknown button"
++
++# We use this C function to marshal a call to a python function. The Python callback
++# function is installed as the userdata of this C callback function. See the
++# "cheesefinder" demo in the Pyrex sources.
++# We ignore the "const"ness of the AccessibleEvent
++cdef void marshalAccessibleEventCallback (cspi.AccessibleEvent *event, void *python_fn) except *:
++ e = Event()
++ EventBase.__setItem(e, event)
++ (<object>python_fn) (e)
++
++cdef class EventListener:
++ """
++ Wrapper around the low-level cspi.AccessibleEventListener_ functions,
++ giving an OO-style API.
++ """
++ cdef cspi.AccessibleEventListener *__item
++ cdef public object eventTypes
++
++ def __init__ (self, callback, eventTypes):
++ """
++ Registers a python callback function to be called.
++ The callback is expected to have one input, of type atspi.Event, and no return value.
++ See documentation of SPI_registerGlobalEventListener for the event names
++ """
++ self.eventTypes = eventTypes
++ self.__item = cspi.SPI_createAccessibleEventListener (marshalAccessibleEventCallback, <void*>callback)
++ for eventType in self.eventTypes:
++ #char *e
++ e = eventType
++ if not cspi.SPI_registerGlobalEventListener (self.__item, e):
++ raise AtspiException("Unable to register event listener")
++
++ def deregister(self):
++ for eventType in self.eventTypes:
++ cspi.SPI_deregisterGlobalEventListener(self.__item, eventType)
++
++ def __dealloc__ (self):
++ if self.__item != NULL:
++ self.deregister()
++ cspi.AccessibleEventListener_unref (self.__item)
++
++ def __checkSelf (self):
++ if self.__item == NULL:
++ raise AttributeError, "__item must not be NULL"
++
++cdef class DeviceEvent:
++ """
++ Wrapper around a cspi.AccessibleDeviceEvent
++ """
++ cdef cspi.AccessibleDeviceEvent *__item
++ cdef public object keyID
++ cdef public object keyCode
++ cdef public object keyString
++ cdef public object timeStamp
++ cdef public object type
++ cdef public object modifiers
++ cdef public object isText
++
++ def __new__ (self):
++ self.__item = NULL
++
++ cdef bool __setItem (self, cspi.AccessibleDeviceEvent *obj):
++ if obj != NULL:
++ self.__item = obj
++ self.keyID = self.__item.keyID
++ self.keyCode = self.__item.keycode
++ self.keyString = self.__item.keystring
++ self.timeStamp = self.__item.timestamp
++ self.type = self.__item.type
++ self.modifiers = self.__item.modifiers
++ if self.__item.is_text: self.isText = True
++ else: self.isText = False
++ return True
++ else:
++ return False
++
++ def __checkSelf (self):
++ if self.__item == NULL:
++ raise AttributeError, "__item must not be NULL"
++
++# def __dealloc__ (self):
++# if self.__item != NULL:
++# cspi.AccessibleDeviceEvent_unref (self.__item)
++
++
++cdef cspi.SPIBoolean marshalAccessibleDeviceEventCallback (cspi.AccessibleDeviceEvent *event, void *python_fn) except 1:
++ k = DeviceEvent()
++ #k.__setItem(event)
++ DeviceEvent.__setItem(k, event)
++ k.__checkSelf()
++ (<object>python_fn) (k)
++ return False
++
++cdef class DeviceListener:
++ """
++ Wrapper around the low-level cspi.AccessibleDeviceListener_ functions,
++ giving an OO-style API.
++ """
++ cdef cspi.AccessibleDeviceListener *__item
++ cdef public object modMasks
++
++ def __init__ (self, callback, eventMask = cspi.SPI_KEY_PRESSED | cspi.SPI_KEY_RELEASED):
++ """
++ Registers a python callback function to be called.
++
++ eventMask may be one of the following:
++ key pressed: 1
++ key released: 2
++ key pressed or released (default): 3
++ """
++ self.__item = cspi.SPI_createAccessibleDeviceListener (marshalAccessibleDeviceEventCallback, <void*>callback)
++ cdef cspi.AccessibleKeySet *keySet
++ keySet = SPI_KEYSET_ALL_KEYS
++ self.modMasks = []
++ cdef short int modMask
++ syncType = SPI_KEYLISTENER_SYNCHRONOUS | SPI_KEYLISTENER_CANCONSUME
++ #syncType = SPI_KEYLISTENER_NOSYNC
++ for modMask from 0 <= modMask < (1 << 8):
++ self.modMasks.append(modMask)
++ desc = "keySet "+str(<int> keySet)+" modMask "+str(modMask)+" eventMask "+str(eventMask)+" syncType "+str(syncType)
++ desc = str(desc)
++ if not cspi.SPI_registerAccessibleKeystrokeListener (self.__item, keySet, modMask, eventMask, syncType):
++ raise AtspiException("Unable to register keystroke listener", desc)
++
++ def deregister(self):
++ if self.__item != NULL:
++ for modMask in self.modMasks:
++ cspi.SPI_deregisterAccessibleKeystrokeListener(self.__item, modMask)
++
++ def __dealloc__ (self):
++ if self.__item != NULL:
++ self.deregister()
++ cspi.AccessibleDeviceListener_unref (self.__item)
++
++ def __checkSelf (self):
++ if self.__item == NULL:
++ raise AttributeError, "__item must not be NULL"
++
++
++# vim: sw=4 ts=4 sts=4 noet ai
diff --git a/staging/python-pysqlite/PKGBUILD b/staging/python-pysqlite/PKGBUILD
new file mode 100644
index 000000000..f5985ebca
--- /dev/null
+++ b/staging/python-pysqlite/PKGBUILD
@@ -0,0 +1,38 @@
+# $Id: PKGBUILD 168723 2012-10-14 21:14:34Z eric $
+# Maintainer: Angel Velasquez <angvp@archlinux.org>
+# Contributor: Aaron Griffin <aaron@archlinux.org>
+# Contributor: Daniel J Griffiths <ghost1227@archlinux.us>
+
+pkgbase=python-pysqlite
+pkgname=python2-pysqlite
+pkgver=2.6.3
+pkgrel=3
+pkgdesc="A Python DB-API 2.0 interface for the SQLite embedded relational database engine"
+license=('custom')
+arch=('i686' 'x86_64')
+url="http://code.google.com/p/pysqlite/"
+depends=('python2' 'sqlite')
+conflicts=('python-pysqlite<=2.6.3-2')
+replaces=('python-pysqlite<=2.6.3-2')
+source=(http://pysqlite.googlecode.com/files/pysqlite-${pkgver}.tar.gz \
+ setup.cfg)
+md5sums=('711afa1062a1d2c4a67acdf02a33d86e'
+ '86dd356c65afd14a22f2f8f64a26441e')
+
+check() {
+ cd "${srcdir}"/pysqlite-${pkgver}/build/lib.*/
+ python2 -c "from pysqlite2 import test; test.test()"
+}
+
+build() {
+ cd "${srcdir}/pysqlite-${pkgver}"
+ cp "${srcdir}/setup.cfg" .
+ python2 setup.py build
+}
+
+package_python2-pysqlite() {
+ cd "${srcdir}/pysqlite-${pkgver}"
+ python2 setup.py install --root="${pkgdir}"
+ install -Dm644 LICENSE "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
+ rm -r "${pkgdir}/usr/pysqlite2-doc"
+}
diff --git a/staging/python-pysqlite/setup.cfg b/staging/python-pysqlite/setup.cfg
new file mode 100644
index 000000000..ba6c77075
--- /dev/null
+++ b/staging/python-pysqlite/setup.cfg
@@ -0,0 +1,5 @@
+[build_ext]
+define=
+include_dirs=/usr/include
+library_dirs=/usr/lib
+libraries=sqlite3
diff --git a/staging/python-wpactrl/PKGBUILD b/staging/python-wpactrl/PKGBUILD
new file mode 100644
index 000000000..692b3e8c3
--- /dev/null
+++ b/staging/python-wpactrl/PKGBUILD
@@ -0,0 +1,26 @@
+# $Id: PKGBUILD 168717 2012-10-14 20:27:32Z eric $
+# Maintainer: Daniel Isenmann <daniel@archlinux.org>
+
+pkgbase=python-wpactrl
+pkgname=python2-wpactrl
+pkgver=20090609
+pkgrel=4
+pkgdesc="A Python extension for wpa_supplicant/hostapd control interface access"
+arch=('i686' 'x86_64')
+url="http://projects.otaku42.de/wiki/PythonWpaCtrl"
+license=('GPL2')
+depends=('python2')
+conflicts=('python-wpactrl<=20090609-3')
+replaces=('python-wpactrl<=20090609-3')
+source=(ftp://ftp.archlinux.org/other/${pkgbase}/python-wpactrl-20090609.tar.gz)
+md5sums=('8d45739aa9bfa1110a4570bb5ceda768')
+
+build() {
+ cd "${srcdir}/${pkgbase}-${pkgver}"
+ python2 setup.py build
+}
+
+package_python2-wpactrl() {
+ cd "${srcdir}/${pkgbase}-${pkgver}"
+ python2 setup.py install --root="${pkgdir}"
+}
diff --git a/staging/slim/PKGBUILD b/staging/slim/PKGBUILD
new file mode 100644
index 000000000..a4580b756
--- /dev/null
+++ b/staging/slim/PKGBUILD
@@ -0,0 +1,63 @@
+# $Id: PKGBUILD 168702 2012-10-14 15:17:29Z tomegun $
+# Maintainer: Gaetan Bisson <bisson@archlinux.org>
+# Contributor: Thayer Williams <thayer@archlinux.org>
+# Contributor: Alexander Fehr <pizzapunk gmail com>
+# Contributor: Hugo Ideler <hugoideler@dse.nl>
+
+pkgname=slim
+pkgver=1.3.4
+pkgrel=4
+pkgdesc='Desktop-independent graphical login manager for X11'
+arch=('i686' 'x86_64')
+url='http://slim.berlios.de/'
+license=('GPL2')
+depends=('pam' 'libxmu' 'libpng' 'libjpeg' 'libxft')
+makedepends=('cmake' 'freeglut')
+backup=('etc/slim.conf' 'etc/logrotate.d/slim' 'etc/pam.d/slim')
+source=("http://download.berlios.de/${pkgname}/${pkgname}-${pkgver}.tar.gz"
+ 'rc.d'
+ 'pam.d'
+ 'logrotate'
+ 'slim.service'
+ 'session-name.patch'
+ 'libpng-1.4+-support.patch'
+ 'fix-glibc-segfault-1.3.4.patch')
+
+build() {
+ cd "${srcdir}/${pkgname}-${pkgver}"
+ patch -p1 -i ../session-name.patch # FS#26693: fix default session name
+ patch -Np1 -i ../libpng-1.4+-support.patch # taken from gentoo to build
+ patch -Np0 -i ../fix-glibc-segfault-1.3.4.patch # FS#30864
+ cd ${srcdir}
+ mkdir build
+ cd build
+ cmake ../${pkgbase}-${pkgver} \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_SKIP_RPATH=ON \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DUSE_PAM=yes -DUSE_CONSOLEKIT=no
+ make
+}
+
+package() {
+ cd ${srcdir}/build/
+ make DESTDIR="${pkgdir}" install
+
+ install -D -m755 ../rc.d "${pkgdir}"/etc/rc.d/slim
+ install -D -m644 ../pam.d "${pkgdir}"/etc/pam.d/slim
+ install -D -m644 ../logrotate "${pkgdir}"/etc/logrotate.d/slim
+
+ # Provide sane defaults
+ sed -i 's|#xserver_arguments.*|xserver_arguments -nolisten tcp vt07|' "${pkgdir}"/etc/slim.conf
+ sed -i 's|/var/run/slim.lock|/var/lock/slim.lock|' "${pkgdir}"/etc/slim.conf
+ # install systemd files
+ install -D -m644 ${srcdir}/slim.service ${pkgdir}/usr/lib/systemd/system/slim.service
+}
+md5sums=('51543533e492b41007811f7d880720fa'
+ 'd8ea9c4dee2811524b67f4f666311a1f'
+ '37ef35079139544d04b8316c7f66f754'
+ '43da096480bf72c3ccec8ad8400f34f0'
+ 'a5d6bde9e63899df7d2081e1585bbe54'
+ 'ebcb6829028615686de7b64ceeaaf8ed'
+ '6d19bd7a91592ed2bb902b22b9594565'
+ '9efc4e0d82d354f0c578be7723870769')
diff --git a/staging/slim/fix-glibc-segfault-1.3.4.patch b/staging/slim/fix-glibc-segfault-1.3.4.patch
new file mode 100644
index 000000000..b035f8a78
--- /dev/null
+++ b/staging/slim/fix-glibc-segfault-1.3.4.patch
@@ -0,0 +1,13 @@
+Index: app.cpp
+===================================================================
+--- app.cpp (revision 223)
++++ app.cpp (working copy)
+@@ -593,7 +593,7 @@
+
+ n++;
+
+- child_env = static_cast<char**>(malloc(sizeof(char*)*n));
++ child_env = static_cast<char**>(malloc(sizeof(char*)*(n+1)));
+ memcpy(child_env, old_env, sizeof(char*)*n);
+ child_env[n - 1] = StrConcat("XDG_SESSION_COOKIE=", ck.get_xdg_session_cookie());
+ child_env[n] = NULL;
diff --git a/staging/slim/libpng-1.4+-support.patch b/staging/slim/libpng-1.4+-support.patch
new file mode 100644
index 000000000..57b39272b
--- /dev/null
+++ b/staging/slim/libpng-1.4+-support.patch
@@ -0,0 +1,14 @@
+--- a/image.cpp 2012-06-26 04:20:14.000000000 -0400
++++ b/image.cpp 2012-06-27 11:41:34.000000000 -0400
+@@ -781,7 +781,11 @@
+ (png_infopp) NULL);
+ }
+
++#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4
++ if (setjmp(png_jmpbuf((png_ptr)))) {
++#else
+ if (setjmp(png_ptr->jmpbuf)) {
++#endif
+ goto png_destroy;
+ }
+
diff --git a/staging/slim/logrotate b/staging/slim/logrotate
new file mode 100644
index 000000000..26ec3b0f4
--- /dev/null
+++ b/staging/slim/logrotate
@@ -0,0 +1,9 @@
+/var/log/slim.log {
+ compress
+ rotate 1
+ size 1024k
+ notifempty
+ missingok
+ copytruncate
+ noolddir
+}
diff --git a/staging/slim/pam.d b/staging/slim/pam.d
new file mode 100644
index 000000000..59db5a8c5
--- /dev/null
+++ b/staging/slim/pam.d
@@ -0,0 +1,10 @@
+#%PAM-1.0
+auth requisite pam_nologin.so
+auth required pam_env.so
+auth required pam_unix.so
+account required pam_unix.so
+password required pam_unix.so
+session required pam_limits.so
+session required pam_unix.so
+session optional pam_loginuid.so
+-session optional pam_systemd.so
diff --git a/staging/slim/rc.d b/staging/slim/rc.d
new file mode 100755
index 000000000..b0be7ffc5
--- /dev/null
+++ b/staging/slim/rc.d
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+. /etc/rc.conf
+. /etc/rc.d/functions
+
+PID=`pidof -o %PPID /usr/bin/slim`
+case "$1" in
+ start)
+ stat_busy "Starting Simple Login Manager"
+ [ -z "$PID" ] && /usr/bin/slim -d &> /dev/null
+ if [ $? -gt 0 ]; then
+ stat_fail
+ else
+ add_daemon slim
+ stat_done
+ fi
+ ;;
+ stop)
+ stat_busy "Stopping Simple Login Manager"
+ [ ! -z "$PID" ] && kill $PID &> /dev/null
+ if [ $? -gt 0 ]; then
+ stat_fail
+ else
+ rm_daemon slim
+ stat_done
+ fi
+ ;;
+ restart)
+ $0 stop
+ sleep 3
+ $0 start
+ ;;
+ *)
+ echo "usage: $0 {start|stop|restart}"
+esac
+exit 0
diff --git a/staging/slim/session-name.patch b/staging/slim/session-name.patch
new file mode 100644
index 000000000..8211c4f72
--- /dev/null
+++ b/staging/slim/session-name.patch
@@ -0,0 +1,21 @@
+diff -Naur slim-1.3.2.old/panel.cpp slim-1.3.2.new/panel.cpp
+--- slim-1.3.2.old/panel.cpp 2010-10-24 06:01:15.117000019 +0000
++++ slim-1.3.2.new/panel.cpp 2010-10-24 17:26:30.987999967 +0000
+@@ -23,7 +23,7 @@
+ Root = root;
+ cfg = config;
+
+- session = "";
++ session = cfg->nextSession(session);
+
+ // Init GC
+ XGCValues gcv;
+@@ -188,7 +188,7 @@
+ }
+
+ void Panel::ClearPanel() {
+- session = "";
++ session = cfg->nextSession(session);
+ Reset();
+ XClearWindow(Dpy, Root);
+ XClearWindow(Dpy, Win);
diff --git a/staging/slim/slim.service b/staging/slim/slim.service
new file mode 100644
index 000000000..b894085a0
--- /dev/null
+++ b/staging/slim/slim.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=SLiM Simple Login Manager
+After=systemd-user-sessions.service
+
+[Service]
+ExecStart=/usr/bin/slim -nodaemon
+
+[Install]
+Alias=display-manager.service
diff --git a/staging/slim/tty-slowness.patch b/staging/slim/tty-slowness.patch
new file mode 100644
index 000000000..c590fbed8
--- /dev/null
+++ b/staging/slim/tty-slowness.patch
@@ -0,0 +1,30 @@
+diff -aur slim-1.3.2.a/app.cpp slim-1.3.2.b/app.cpp
+--- slim-1.3.2.a/app.cpp 2010-08-21 15:10:13.702755711 +0200
++++ slim-1.3.2.b/app.cpp 2010-08-21 15:10:48.579631179 +0200
+@@ -280,21 +280,22 @@
+ signal(SIGALRM, AlarmSignal);
+
+ #ifndef XNEST_DEBUG
+- OpenLog();
+-
+ if (!force_nodaemon && cfg->getOption("daemon") == "yes") {
+ daemonmode = true;
+ }
+
+ // Daemonize
+ if (daemonmode) {
+- if (daemon(0, 1) == -1) {
++ if (daemon(0, 0) == -1) {
+ cerr << APPNAME << ": " << strerror(errno) << endl;
+ exit(ERR_EXIT);
+ }
+- UpdatePid();
+ }
+
++ OpenLog();
++
++ if (daemonmode) UpdatePid();
++
+ CreateServerAuth();
+ StartServer();
+ alarm(2);
diff --git a/staging/sonata/PKGBUILD b/staging/sonata/PKGBUILD
new file mode 100644
index 000000000..d2a3d8d71
--- /dev/null
+++ b/staging/sonata/PKGBUILD
@@ -0,0 +1,30 @@
+# $Id: PKGBUILD 168713 2012-10-14 19:47:10Z eric $
+# Maintainer: Angel Velasquez <angvp@archlinux.org>
+# Contributor: William Rea <sillywilly@gmail.com>
+
+pkgname=sonata
+pkgver=1.6.2.1
+pkgrel=8
+pkgdesc="Elegant GTK+ music client for MPD"
+arch=('i686' 'x86_64')
+url="http://sonata.berlios.de/"
+license=('GPL3')
+depends=('pygtk' 'python2-mpd')
+optdepends=('gnome-python-extras: Enhanced system tray support'
+ 'tagpy: Metadata editing support'
+ 'python2-dbus: Various extra functionality (e.g. multimedia keys support)')
+source=(http://download.berlios.de/${pkgname}/${pkgname}-$pkgver.tar.gz
+ info.py.patch)
+md5sums=('0b912325e7175abad3bf6c0edc071e05'
+ '595fcf7615035829b264afecb5a1beeb')
+
+build() {
+ cd "$srcdir/${pkgname}-$pkgver"
+ patch -Np0 -i "$srcdir/info.py.patch"
+ sed -i 's|/usr/bin/env python|/usr/bin/env python2|' sonata/breadcrumbs.py
+}
+
+package() {
+ cd "$srcdir/${pkgname}-$pkgver"
+ python2 setup.py install --prefix=/usr --optimize 1 --root="$pkgdir"
+}
diff --git a/staging/sonata/info.py.patch b/staging/sonata/info.py.patch
new file mode 100644
index 000000000..e95cc3a08
--- /dev/null
+++ b/staging/sonata/info.py.patch
@@ -0,0 +1,15 @@
+--- sonata/info.py 2011-07-05 22:32:08.452556016 -0500
++++ sonata/info.py 2011-07-05 22:45:50.849311466 -0500
+@@ -393,9 +393,9 @@
+ if content.startswith("#REDIRECT [["):
+ addr = "http://lyricwiki.org/index.php?title=%s&action=edit" % urllib.quote(content.split("[[")[1].split("]]")[0])
+ content = urllib.urlopen(addr).read()
+- lyrics = content.split("&lt;lyrics&gt;")[1].split("&lt;/lyrics&gt;")[0]
+- if lyrics.strip() != "&lt;!-- PUT LYRICS HERE (and delete this entire line) --&gt;":
+- lyrics = misc.unescape_html(lyrics)
++ content = misc.unescape_html(content)
++ lyrics = content.split("<lyrics>")[1].split("</lyrics>")[0].strip()
++ if lyrics.strip() != "<!-- PUT LYRICS HERE (and delete this entire line) -->":
+ lyrics = misc.wiki_to_html(lyrics)
+ lyrics = lyrics.decode("utf-8")
+ # Save lyrics to file:
diff --git a/staging/twisted/PKGBUILD b/staging/twisted/PKGBUILD
new file mode 100644
index 000000000..35bf73958
--- /dev/null
+++ b/staging/twisted/PKGBUILD
@@ -0,0 +1,37 @@
+# $Id: PKGBUILD 168774 2012-10-15 21:19:51Z eric $
+# Maintainer : Ionut Biru <ibiru@archlinux.org>
+# Contributor: Juergen Hoetzel <juergen@archlinux.org>
+# Contributor: Douglas Soares de Andrade <douglas@archlinux.org>
+
+pkgname=twisted
+pkgver=12.2.0
+pkgrel=2
+pkgdesc="Asynchronous networking framework written in Python."
+arch=('i686' 'x86_64')
+url="http://twistedmatrix.com/"
+license=('MIT')
+depends=('python2-crypto' 'python2-zope-interface')
+optdepends=('python2-pyopenssl'
+ 'python2-soappy: for twisted.web.soap'
+ 'python2-pyasn1: for using conch'
+ 'pygtk: for using manhole'
+ 'tk: for using tkconch')
+install=twisted.install
+source=(http://twistedmatrix.com/Releases/Twisted/${pkgver%.*}/Twisted-$pkgver.tar.bz2)
+sha1sums=('c51834c1270e7a4bb0de9190056e4317413920f9')
+
+build() {
+ cd "$srcdir/Twisted-$pkgver"
+ python2 setup.py build
+}
+
+package() {
+ cd "$srcdir/Twisted-$pkgver"
+ python2 setup.py install --prefix=/usr --root="$pkgdir" --optimize=1
+ install -D -m644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
+
+ sed -i 's:^#!.*bin.*python:#!/usr/bin/python2:' \
+ "$pkgdir"/usr/lib/python2.7/site-packages/twisted/trial/test/scripttest.py \
+ "$pkgdir"/usr/lib/python2.7/site-packages/twisted/mail/test/pop3testserver.py \
+ "$pkgdir"/usr/lib/python2.7/site-packages/twisted/python/test/pullpipe.py
+}
diff --git a/staging/twisted/twisted.install b/staging/twisted/twisted.install
new file mode 100644
index 000000000..8e93ffd3c
--- /dev/null
+++ b/staging/twisted/twisted.install
@@ -0,0 +1,11 @@
+post_install() {
+ python2 -c 'from twisted.plugin import IPlugin, getPlugins; list(getPlugins(IPlugin))' >/dev/null 2>&1 || return 1
+}
+
+post_upgrade() {
+ post_install
+}
+
+post_remove() {
+ find /usr/lib/python2.7/site-packages/twisted/plugins -name dropin.cache | xargs -r rm -f
+}
diff --git a/staging/vde2/PKGBUILD b/staging/vde2/PKGBUILD
new file mode 100644
index 000000000..b4646d06e
--- /dev/null
+++ b/staging/vde2/PKGBUILD
@@ -0,0 +1,50 @@
+# $Id: PKGBUILD 168790 2012-10-16 00:34:59Z allan $
+# Contributor: Sergej Pupykin
+# Maintainer: Tobias Powalowski <tpowa@archlinux.org>
+pkgname=vde2
+pkgver=2.3.2
+pkgrel=2
+pkgdesc="Virtual Distributed Ethernet for emulators like qemu"
+url="http://sourceforge.net/projects/vde/"
+license=("GPL" "LGPL" "CUSTOM")
+arch=('i686' 'x86_64')
+depends=('bash' 'libpcap' 'openssl')
+makedepends=('python')
+backup=(etc/conf.d/vde)
+source=(http://downloads.sourceforge.net/vde/$pkgname-$pkgver.tar.bz2
+ dhcpd.conf.sample
+ iptables.rules.sample
+ vde-config.sample
+ vde-connection.sample
+ vde.conf
+ vde.rc)
+install=vde2.install
+options=(!libtool !makeflags)
+
+build() {
+ cd $srcdir/$pkgname-$pkgver
+ ./configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib/vde2 \
+ --enable-experimental
+ make
+}
+
+package() {
+ cd $srcdir/$pkgname-$pkgver
+ make prefix=$pkgdir/usr sysconfdir=$pkgdir/etc libexecdir=$pkgdir/usr/lib/vde2 install
+ install -D -m 755 ../vde.rc $pkgdir/etc/rc.d/vde
+ install -D -m 644 ../vde.conf $pkgdir/etc/conf.d/vde
+ install -D -m 644 ../vde-config.sample $pkgdir/etc/vde/vde-config.sample
+ install -D -m 644 ../vde-connection.sample $pkgdir/etc/vde/vde-connection.sample
+ install -D -m 644 ../dhcpd.conf.sample $pkgdir/usr/share/vde2/dhcpd.conf.sample
+ install -D -m 644 ../iptables.rules.sample $pkgdir/usr/share/vde2/iptables.rules.sample
+ # install slirp license
+ install -D -m 644 COPYING.slirpvde $pkgdir/usr/share/licenses/vde2/COPYING.slirpvde
+}
+
+md5sums=('46fbc5f97f03dc517aa3b2c9d9ea6628'
+ '7d9bc56d2e561d849e915000d1c0f269'
+ 'a920123fc620bcedbccb703a8d1bdc55'
+ 'cb8ace28e8efd4dad128be4be71b3b07'
+ '63033c33565e2030541c5e05e9d9b063'
+ 'a22730f051f4840da4a3162a88ff8156'
+ '6c7dc01bc2f039f0ff1682ee70d3d1da')
diff --git a/staging/vde2/dhcpd.conf.sample b/staging/vde2/dhcpd.conf.sample
new file mode 100644
index 000000000..565a78b27
--- /dev/null
+++ b/staging/vde2/dhcpd.conf.sample
@@ -0,0 +1,12 @@
+ddns-update-style none;
+
+subnet 192.168.254.0 netmask 255.255.255.0 {
+ range 192.168.254.1 192.168.254.253;
+ option routers 192.168.254.254;
+ option domain-name "virtual.example.com";
+ # find your DNS servers from /etc/resolv.conf
+ # otherwise only pure IP addresses will work
+ option domain-name-servers 192.168.254.254;
+ option broadcast-address 192.168.254.255;
+ default-lease-time 86400;
+}
diff --git a/staging/vde2/iptables.rules.sample b/staging/vde2/iptables.rules.sample
new file mode 100644
index 000000000..ac712ee21
--- /dev/null
+++ b/staging/vde2/iptables.rules.sample
@@ -0,0 +1,5 @@
+*filter
+-A INPUT -i tun -j ACCEPT
+-A FORWARD -s 192.168.254.0/255.255.255.0 -j ACCEPT
+*nat
+-A POSTROUTING -s 192.168.254.0/24 -j MASQUERADE
diff --git a/staging/vde2/vde-config.sample b/staging/vde2/vde-config.sample
new file mode 100644
index 000000000..c5a5b7d88
--- /dev/null
+++ b/staging/vde2/vde-config.sample
@@ -0,0 +1,35 @@
+# Set options vde_switch program
+# To activate this vde profile add it to /etc/conf.d/vde
+
+# Global options
+VDE_NUMPORTS="32" # Number of ports (default 32)
+VDE_HUB="no" # [yes|no] Make the switch act as a hub
+VDE_FSTP="no" # [yes|no] Activate the fast spanning tree protocol
+VDE_MAC="" # Set the Switch MAC address
+VDE_PRIOTIRY="" # Set the priority for FST (MAC extension)
+VDE_HASHSIZE="" # Hash table size
+
+# Options from datasock module
+VDE_SOCK="/var/run/vde/sample.sock" # control directory pathname
+VDE_SOCK_MODE="660" # Standard access mode for comm sockets (octal)
+VDE_SOCK_GROUP="root" # Group owner for comm sockets
+
+# Options from consmgmt module
+VDE_MANAGEMENT_SOCK="/var/run/vde/sample.mgmt" # path of the management UNIX socket
+VDE_MANAGEMENT_SOCK_MODE="660" # management UNIX socket access mode (octal)
+
+# Other options to parse to vde_switch
+VDE_OPTIONS=""
+
+# VDE with internet support
+# You can use either tuntap method or slirpvde method.
+
+# Options from tuntap module
+VDE_TAP="" # Enable routing through TAP tap interface (comma separated array eg.:"tap0,tap1").
+
+# slirpvde daemon support
+SLIRP="no" # [yes|no] enable/disable SLIRP daemon support
+SLIRP_DHCP="no" # [yes|no] turn on the DHCP server for the network autoconfiguration of all the units connected to the VDE
+SLIRP_NETWORK="" # specify the network address (default 10.0.2.0)
+# other options to parse to slirpvde
+SLIRP_OPTIONS="" \ No newline at end of file
diff --git a/staging/vde2/vde-connection.sample b/staging/vde2/vde-connection.sample
new file mode 100644
index 000000000..4a75e1f52
--- /dev/null
+++ b/staging/vde2/vde-connection.sample
@@ -0,0 +1,6 @@
+# You can add vde switch connections below
+# just without the # at the beginning:
+# vde_plug /var/run/vde/sample.sock = vde_plug /var/run/vde/sample2.sock
+# or if hosts are different use this syntax:
+# vde_plug /var/run/vde/sample.sock = ssh host2 vde_plug /var/run/vde/sample.sock
+
diff --git a/staging/vde2/vde.conf b/staging/vde2/vde.conf
new file mode 100644
index 000000000..bc61dceda
--- /dev/null
+++ b/staging/vde2/vde.conf
@@ -0,0 +1,11 @@
+# Set options for a vde daemon script
+#
+# Array for your vde config files, eg.: "internal-net external-net"
+# You need a config file in /etc/vde/ with the same name.
+# Sample config file provided: /etc/vde/vde-config.sample
+VDE_CONFIG=""
+
+# Array for your dpipe connections, eg.: "connect-switches"
+# You need a config file in /etc/vde/ with the same name.
+# Sample config file provided: /etc/vde/vde-connection.sample
+VDE_CONNECTION="" \ No newline at end of file
diff --git a/staging/vde2/vde.rc b/staging/vde2/vde.rc
new file mode 100755
index 000000000..b368f9955
--- /dev/null
+++ b/staging/vde2/vde.rc
@@ -0,0 +1,113 @@
+#!/bin/bash
+
+. /etc/rc.conf
+. /etc/rc.d/functions
+. /etc/conf.d/vde
+
+case "$1" in
+ start)
+ # bring up all defined profiles
+ for i in $VDE_CONFIG; do
+ [ -e /etc/vde/$i ] && . /etc/vde/$i
+ stat_busy "Starting vde_switch $i"
+ # get options from profile
+ [ -n "$VDE_NUMPORTS" ] && OPTIONS="-n $VDE_NUMPORTS"
+ [ "$VDE_HUB" = "yes" ] && OPTIONS="$OPTIONS -x"
+ [ "$VDE_FSTP" = "yes" ] && OPTIONS="$OPTIONS -F"
+ [ -n "$VDE_MAC" ] && OPTIONS="$OPTIONS --macaddr $VDE_MAC"
+ [ -n "$VDE_PRIORITY" ] && OPTIONS="$OPTIONS --priority $VDE_PRIORITY"
+ [ -n "$VDE_HASH" ] && OPTIONS="$OPTIONS --hashsize $VDE_HASH"
+ [ -n "$VDE_SOCK" ] && OPTIONS="$OPTIONS -s $VDE_SOCK"
+ [ -n "$VDE_SOCK_MODE" ] && OPTIONS="$OPTIONS -m $VDE_SOCK_MODE"
+ [ -n "$VDE_SOCK_GROUP" ] && OPTIONS="$OPTIONS -g $VDE_SOCK_GROUP"
+ [ -n "$VDE_MANAGEMENT_SOCK" ] && OPTIONS="$OPTIONS -M $VDE_MANAGEMENT_SOCK"
+ [ -n "$VDE_MANAGEMENT_SOCK_MODE" ] && OPTIONS="$OPTIONS --mgmtmode $VDE_MANAGEMENT_SOCK_MODE"
+ [ -n "$VDE_TAP" ] && OPTIONS="$OPTIONS -t $VDE_TAP"
+ [ -n "$VDE_OPTIONS" ] && OPTIONS="$OPTIONS $VDE_OPTIONS"
+ vde_switch $OPTIONS -p /var/run/vde-$i.pid -daemon &>/dev/null
+ [ -n "$VDE_SOCK" -a -n "$VDE_SOCK_GROUP" ] && chgrp "$VDE_SOCK_GROUP" "$VDE_SOCK"
+ if [ $? -gt 0 ]; then
+ stat_fail
+ else
+ stat_done
+ fi
+ if [ "$SLIRP" = "yes" ]; then
+ stat_busy "Starting slirpvde for $i"
+ [ "$SLIRP_DHCP" = "yes" ] && SP_OPTIONS="-D"
+ [ -n "$SLIRP_NETWORK" ] && SP_OPTIONS="$SP_OPTIONS -n $SLIRP_NETWORK"
+ [ -n "$SLIRP_OPTIONS" ] && SP_OPTIONS="$SP_OPTIONS $SLIRP_OPTIONS"
+ [ -n "$VDE_SOCK" ] && SP_OPTIONS="$SP_OPTIONS -s $VDE_SOCK"
+ [ -n "$VDE_SOCK_MODE" ] && SP_OPTIONS="$SP_OPTIONS -m $VDE_SOCK_MODE"
+ [ -n "$VDE_SOCK_GROUP" ] && SP_OPTIONS="$SP_OPTIONS -g $VDE_SOCK_GROUP"
+ slirpvde $SP_OPTIONS -p /var/run/slirpvde-$i.pid -daemon &>/dev/null
+ if [ $? -gt 0 ]; then
+ stat_fail
+ else
+ stat_done
+ fi
+ unset OPTIONS
+ unset SP_OPTIONS
+ fi
+ done
+ for i in $VDE_CONNECTION; do
+ # connect specified vde_switches
+ if [ "$(grep ^vde_plug /etc/vde/$i)" ]; then
+ stat_busy "Connecting VDE switches $i together..."
+ while read j; do
+ switch="$(echo $j | grep ^vde_plug)"
+ [ -n "$switch" ] && (dpipe $switch &)
+ done </etc/vde/$i
+ if [ $? -gt 0 ]; then
+ stat_fail
+ else
+ stat_done
+ fi
+ fi
+ done
+ add_daemon vde
+ ;;
+ stop)
+ # kill vde_plug if switches are connected
+ [ -n "$VDE_CONNECTION" ] && killall vde_plug >/dev/null 2>&1
+ for i in $VDE_CONFIG; do
+ [ -e /etc/vde/$i ] && . /etc/vde/$i
+ if [ "$SLIRP" = "yes" ]; then
+ stat_busy "Stopping slirpvde for $i"
+ kill $(cat /var/run/slirpvde-$i.pid) &> /dev/null
+ if [ $? -gt 0 ]; then
+ stat_fail
+ else
+ stat_done
+ fi
+ rm /var/run/slirpvde-$i.pid &> /dev/null
+ fi
+ stat_busy "Stopping vde_switch $i"
+ kill $(cat /var/run/vde-$i.pid) &> /dev/null
+ if [ $? -gt 0 ]; then
+ stat_fail
+ else
+ stat_done
+ fi
+ rm /var/run/vde-$i.pid &> /dev/null
+ stat_busy "Removing $i vde sockets"
+ rm -rf $VDE_SOCK $VDE_MANAGEMENT_SOCK
+ if [ $? -gt 0 ]; then
+ stat_fail
+ else
+ stat_done
+ fi
+ done
+ unset OPTIONS
+ unset SP_OPTIONS
+ [ -e /var/run/vde/gmon.out ] && rm /var/run/vde/gmon.out
+ rm_daemon vde
+ ;;
+ restart)
+ $0 stop
+ sleep 3
+ $0 start
+ ;;
+ *)
+ echo "usage: $0 {start|stop|restart}"
+esac
+exit 0
diff --git a/staging/vde2/vde2.install b/staging/vde2/vde2.install
new file mode 100644
index 000000000..74e1710ff
--- /dev/null
+++ b/staging/vde2/vde2.install
@@ -0,0 +1,10 @@
+post_install() {
+ echo "Change /etc/conf.d/vde to your needs."
+ echo "vde config files should be placed in /etc/vde, sample files are provided."
+ echo "iptables and dhcpd sample files have been installed to '/usr/share/vde2'."
+ echo "Merge those examples, if needed to the according config files."
+}
+
+post_upgrade() {
+ post_install $1
+}
diff --git a/staging/xfce4-session/PKGBUILD b/staging/xfce4-session/PKGBUILD
new file mode 100644
index 000000000..1a320ff4a
--- /dev/null
+++ b/staging/xfce4-session/PKGBUILD
@@ -0,0 +1,51 @@
+# $Id: PKGBUILD 168748 2012-10-15 13:21:21Z foutrelis $
+# Maintainer: Evangelos Foutras <evangelos@foutrelis.com>
+# Contributor: tobias <tobias funnychar archlinux.org>
+
+pkgname=xfce4-session
+pkgver=4.10.0
+pkgrel=6
+pkgdesc="A session manager for Xfce"
+arch=('i686' 'x86_64')
+url="http://www.xfce.org/"
+license=('GPL2')
+groups=('xfce4')
+depends=('libxfce4ui' 'libwnck' 'libsm' 'xorg-iceauth' 'upower' 'xorg-xinit'
+ 'hicolor-icon-theme')
+makedepends=('intltool' 'xfce4-dev-tools')
+optdepends=('gnome-keyring: for keyring support when GNOME compatibility is enabled'
+ 'xscreensaver: for locking screen with xflock4'
+ 'gnome-screensaver: for locking screen with xflock4'
+ 'xlockmore: for locking screen with xflock4')
+replaces=('xfce-utils')
+options=('!libtool')
+install=$pkgname.install
+source=(http://archive.xfce.org/src/xfce/$pkgname/4.10/$pkgname-$pkgver.tar.bz2
+ xfce4-session-4.10.0-add-systemd-support.patch)
+sha256sums=('bb8aa9a74c3d382840596fb4875144d66c7f3f47c8e9ee81d31e3428a72c46ce'
+ 'ffae61c48a4bd0cb51d422cb93f2de9567abaf29085370c455ef349b6a10234b')
+
+build() {
+ cd "$srcdir/$pkgname-$pkgver"
+
+ # https://bugzilla.xfce.org/show_bug.cgi?id=8729
+ patch -Np1 -i "$srcdir/xfce4-session-4.10.0-add-systemd-support.patch"
+
+ xdt-autogen
+
+ ./configure \
+ --prefix=/usr \
+ --sysconfdir=/etc \
+ --libexecdir=/usr/lib/xfce4 \
+ --localstatedir=/var \
+ --disable-static \
+ --disable-debug
+ make
+}
+
+package() {
+ cd "$srcdir/$pkgname-$pkgver"
+ make DESTDIR="$pkgdir" install
+}
+
+# vim:set ts=2 sw=2 et:
diff --git a/staging/xfce4-session/xfce4-session-4.10.0-add-systemd-support.patch b/staging/xfce4-session/xfce4-session-4.10.0-add-systemd-support.patch
new file mode 100644
index 000000000..7ab637b26
--- /dev/null
+++ b/staging/xfce4-session/xfce4-session-4.10.0-add-systemd-support.patch
@@ -0,0 +1,388 @@
+diff --git a/xfce4-session/xfsm-systemd.c b/xfce4-session/xfsm-systemd.c
+index 4076586..90e7873 100644
+--- /dev/null
++++ b/xfce4-session/xfsm-systemd.c
+@@ -0,0 +1,123 @@
++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
++ *
++ * Copyright (C) 2012 Christian Hesse
++ *
++ * Licensed under the GNU General Public License Version 2
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++ */
++
++#include <config.h>
++
++#include <gio/gio.h>
++#include <polkit/polkit.h>
++
++#include "xfsm-systemd.h"
++
++#define SYSTEMD_DBUS_NAME "org.freedesktop.login1"
++#define SYSTEMD_DBUS_PATH "/org/freedesktop/login1"
++#define SYSTEMD_DBUS_INTERFACE "org.freedesktop.login1.Manager"
++#define SYSTEMD_REBOOT_ACTION "org.freedesktop.login1.reboot"
++#define SYSTEMD_SHUTDOWN_ACTION "org.freedesktop.login1.power-off"
++
++struct _SystemdProxy {
++ PolkitAuthority *authority;
++ PolkitSubject *subject;
++};
++
++SystemdProxy *
++systemd_proxy_new (void)
++{
++ SystemdProxy *proxy;
++
++ proxy = g_new0 (SystemdProxy, 1);
++
++ proxy->authority = polkit_authority_get_sync (NULL, NULL);
++ proxy->subject = polkit_unix_process_new (getpid());
++
++ return proxy;
++}
++
++void
++systemd_proxy_free (SystemdProxy *proxy)
++{
++ g_object_unref (proxy->authority);
++ g_object_unref (proxy->subject);
++
++ g_free (proxy);
++}
++
++gboolean systemd_proxy_can_method (SystemdProxy *proxy, gboolean *can_method, const gchar *method, GError **error)
++{
++ PolkitAuthorizationResult *res;
++ GError *local_error = NULL;
++
++ *can_method = FALSE;
++ res = polkit_authority_check_authorization_sync (proxy->authority,
++ proxy->subject,
++ method,
++ NULL,
++ POLKIT_CHECK_AUTHORIZATION_FLAGS_NONE,
++ NULL,
++ &local_error);
++ if (res == NULL) {
++ g_propagate_error (error, local_error);
++ return FALSE;
++ }
++
++ *can_method = polkit_authorization_result_get_is_authorized (res) ||
++ polkit_authorization_result_get_is_challenge (res);
++
++ g_object_unref (res);
++
++ return TRUE;
++}
++
++gboolean systemd_proxy_can_restart (SystemdProxy *proxy, gboolean *can_restart, GError **error)
++{
++ return systemd_proxy_can_method(proxy, can_restart, SYSTEMD_REBOOT_ACTION, error);
++}
++
++gboolean systemd_proxy_can_shutdown (SystemdProxy *proxy, gboolean *can_shutdown, GError **error)
++{
++ return systemd_proxy_can_method(proxy, can_shutdown, SYSTEMD_SHUTDOWN_ACTION, error);
++}
++
++gboolean systemd_proxy_method (SystemdProxy *proxy, const gchar *method, GError **error)
++{
++ GDBusConnection *bus;
++
++ bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL);
++ g_dbus_connection_call_sync (bus,
++ SYSTEMD_DBUS_NAME,
++ SYSTEMD_DBUS_PATH,
++ SYSTEMD_DBUS_INTERFACE,
++ method,
++ g_variant_new ("(b)", TRUE),
++ NULL, 0, G_MAXINT, NULL, NULL);
++ g_object_unref (bus);
++
++ return TRUE;
++}
++
++gboolean systemd_proxy_restart (SystemdProxy *proxy, GError **error)
++{
++ return systemd_proxy_method(proxy, "Reboot", error);
++}
++
++gboolean systemd_proxy_shutdown (SystemdProxy *proxy, GError **error)
++{
++ return systemd_proxy_method(proxy, "PowerOff", error);
++}
+diff --git a/xfce4-session/xfsm-systemd.h b/xfce4-session/xfsm-systemd.h
+index 3fa8317..2c4d868 100644
+--- /dev/null
++++ b/xfce4-session/xfsm-systemd.h
+@@ -0,0 +1,42 @@
++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
++ *
++ * Copyright (C) 2012 Christian Hesse
++ *
++ * Licensed under the GNU General Public License Version 2
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++ */
++
++#ifndef __SYSTEMD_PROXY_H__
++#define __SYSTEMD_PROXY_H__
++
++#include <glib.h>
++
++G_BEGIN_DECLS
++
++typedef struct _SystemdProxy SystemdProxy;
++
++SystemdProxy *systemd_proxy_new (void);
++void systemd_proxy_free (SystemdProxy *proxy);
++gboolean systemd_proxy_can_method (SystemdProxy *proxy, gboolean *can_method, const char *method, GError **error);
++gboolean systemd_proxy_can_restart (SystemdProxy *proxy, gboolean *can_restart, GError **error);
++gboolean systemd_proxy_can_shutdown (SystemdProxy *proxy, gboolean *can_shutdown, GError **error);
++gboolean systemd_proxy_method (SystemdProxy *proxy, const char *method, GError **error);
++gboolean systemd_proxy_restart (SystemdProxy *proxy, GError **error);
++gboolean systemd_proxy_shutdown (SystemdProxy *proxy, GError **error);
++
++G_END_DECLS
++
++#endif /* __SYSTEMD_PROXY_H__ */
+
+commit 518a28c23f110617aad36e64c02cdab6a36adf37
+Author: Christian Hesse <eworm@leda.eworm.de>
+Date: Fri Jul 27 14:21:14 2012 +0200
+
+ ...
+
+diff --git a/configure.in.in b/configure.in.in
+index 9aa4f8f..aa0b8bb 100644
+--- a/configure.in
++++ b/configure.in
+@@ -96,6 +96,33 @@ XDT_CHECK_PACKAGE([DBUS], [dbus-1], [1.1.0])
+ XDT_CHECK_PACKAGE([DBUS_GLIB], [dbus-glib-1], [0.84])
+ XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [4.9.0])
+
++dnl systemd integration
++AC_ARG_ENABLE([systemd],
++ AS_HELP_STRING([--enable-systemd], [Use systemd]),
++ [with_systemd=$enableval],
++ [with_systemd=auto])
++PKG_CHECK_MODULES(SYSTEMD,
++ [libsystemd-login polkit-gobject-1],
++ [have_systemd=yes], [have_systemd=no])
++AC_MSG_CHECKING([whether to use systemd])
++if test x$with_systemd = xauto ; then
++ if test x$have_systemd = xno ; then
++ with_systemd=no
++ else
++ with_systemd=yes
++ fi
++fi
++AC_MSG_RESULT($with_systemd)
++if test x$with_systemd = xyes; then
++ if test x$have_systemd = xno; then
++ AC_MSG_ERROR([Systemd support explicitly required, but systemd not found])
++ fi
++ AC_DEFINE(HAVE_SYSTEMD, 1, [Define if systemd is used for session tracking])
++fi
++AC_SUBST(SYSTEMD_CFLAGS)
++AC_SUBST(SYSTEMD_LIBS)
++AM_CONDITIONAL(WITH_SYSTEMD, [test "$with_systemd" = "yes"], [Using systemd])
++
+ dnl Check for debugging support
+ XDT_FEATURE_DEBUG([xfsm_debug_default])
+
+
+commit f1279eba9452f027a2037be77388767437161d51
+Author: Christian Hesse <eworm@leda.eworm.de>
+Date: Fri Jul 27 14:18:16 2012 +0200
+
+ ...
+
+diff --git a/xfce4-session/xfsm-shutdown.c b/xfce4-session/xfsm-shutdown.c
+index 1429abd..077cdf3 100644
+--- a/xfce4-session/xfsm-shutdown.c
++++ b/xfce4-session/xfsm-shutdown.c
+@@ -96,7 +96,11 @@ struct _XfsmShutdown
+ {
+ GObject __parent__;
+
++#ifdef HAVE_SYSTEMD
++ SystemdProxy *systemd_proxy;
++#else
+ XfsmConsolekit *consolekit;
++#endif
+ XfsmUPower *upower;
+
+ /* kiosk settings */
+@@ -134,7 +138,11 @@ xfsm_shutdown_init (XfsmShutdown *shutdown)
+ {
+ XfceKiosk *kiosk;
+
++#ifdef HAVE_SYSTEMD
++ shutdown->systemd_proxy = systemd_proxy_new ();
++#else
+ shutdown->consolekit = xfsm_consolekit_get ();
++#endif
+ shutdown->upower = xfsm_upower_get ();
+ shutdown->helper_state = SUDO_NOT_INITIAZED;
+ shutdown->helper_require_password = FALSE;
+@@ -153,7 +161,11 @@ xfsm_shutdown_finalize (GObject *object)
+ {
+ XfsmShutdown *shutdown = XFSM_SHUTDOWN (object);
+
++#ifdef HAVE_SYSTEMD
++ systemd_proxy_free (shutdown->systemd_proxy);
++#else
+ g_object_unref (G_OBJECT (shutdown->consolekit));
++#endif
+ g_object_unref (G_OBJECT (shutdown->upower));
+
+ /* close down helper */
+@@ -644,7 +656,11 @@ xfsm_shutdown_try_restart (XfsmShutdown *shutdown,
+ if (shutdown->helper_state == SUDO_AVAILABLE)
+ return xfsm_shutdown_sudo_try_action (shutdown, XFSM_SHUTDOWN_RESTART, error);
+ else
++#ifdef HAVE_SYSTEMD
++ return systemd_proxy_restart (shutdown->systemd_proxy, error);
++#else
+ return xfsm_consolekit_try_restart (shutdown->consolekit, error);
++#endif
+ }
+
+
+@@ -661,7 +677,11 @@ xfsm_shutdown_try_shutdown (XfsmShutdown *shutdown,
+ if (shutdown->helper_state == SUDO_AVAILABLE)
+ return xfsm_shutdown_sudo_try_action (shutdown, XFSM_SHUTDOWN_SHUTDOWN, error);
+ else
++#ifdef HAVE_SYSTEMD
++ return systemd_proxy_shutdown (shutdown->systemd_proxy, error);
++#else
+ return xfsm_consolekit_try_shutdown (shutdown->consolekit, error);
++#endif
+ }
+
+
+@@ -701,7 +721,11 @@ xfsm_shutdown_can_restart (XfsmShutdown *shutdown,
+ return TRUE;
+ }
+
++#ifdef HAVE_SYSTEMD
++ if (systemd_proxy_can_restart (shutdown->systemd_proxy, can_restart, error))
++#else
+ if (xfsm_consolekit_can_restart (shutdown->consolekit, can_restart, error))
++#endif
+ return TRUE;
+
+ if (xfsm_shutdown_sudo_init (shutdown, error))
+@@ -728,7 +752,11 @@ xfsm_shutdown_can_shutdown (XfsmShutdown *shutdown,
+ return TRUE;
+ }
+
++#ifdef HAVE_SYSTEMD
++ if (systemd_proxy_can_shutdown (shutdown->systemd_proxy, can_shutdown, error))
++#else
+ if (xfsm_consolekit_can_shutdown (shutdown->consolekit, can_shutdown, error))
++#endif
+ return TRUE;
+
+ if (xfsm_shutdown_sudo_init (shutdown, error))
+
+commit 5aea3fb853683246a537a67423cf5b32076b8dfb
+Author: Christian Hesse <eworm@leda.eworm.de>
+Date: Fri Jul 27 14:03:27 2012 +0200
+
+ ...
+
+diff --git a/xfce4-session/Makefile.am b/xfce4-session/Makefile.am
+index c015154..7e3b311 100644
+--- a/xfce4-session/Makefile.am
++++ b/xfce4-session/Makefile.am
+@@ -38,8 +38,6 @@ xfce4_session_SOURCES = \
+ xfsm-compat-gnome.h \
+ xfsm-compat-kde.c \
+ xfsm-compat-kde.h \
+- xfsm-consolekit.c \
+- xfsm-consolekit.h \
+ xfsm-dns.c \
+ xfsm-dns.h \
+ xfsm-error.c \
+@@ -65,6 +63,16 @@ xfce4_session_SOURCES = \
+ xfsm-upower.c \
+ xfsm-upower.h
+
++if WITH_SYSTEMD
++xfce4_session_SOURCES += \
++ xfsm-systemd.c \
++ xfsm-systemd.h
++else
++xfce4_session_SOURCES += \
++ xfsm-consolekit.c \
++ xfsm-consolekit.h
++endif
++
+ xfce4_session_CFLAGS = \
+ $(LIBSM_CFLAGS) \
+ $(LIBX11_CFLAGS) \
+@@ -72,6 +80,7 @@ xfce4_session_CFLAGS = \
+ $(DBUS_CFLAGS) \
+ $(DBUS_GLIB_CFLAGS) \
+ $(LIBWNCK_CFLAGS) \
++ $(SYSTEMD_CFLAGS) \
+ $(XFCONF_CFLAGS) \
+ $(GMODULE_CFLAGS) \
+ $(PLATFORM_CFLAGS)
+@@ -91,6 +100,7 @@ xfce4_session_LDADD = \
+ $(DBUS_LIBS) \
+ $(DBUS_GLIB_LIBS) \
+ $(LIBWNCK_LIBS) \
++ $(SYSTEMD_LIBS) \
+ $(XFCONF_LIBS) \
+ -lm
+
+diff --git a/xfce4-session/xfsm-shutdown.c b/xfce4-session/xfsm-shutdown.c
+index d8757a8..1429abd 100644
+--- a/xfce4-session/xfsm-shutdown.c
++++ b/xfce4-session/xfsm-shutdown.c
+@@ -66,10 +66,13 @@
+ #include <xfce4-session/xfsm-fadeout.h>
+ #include <xfce4-session/xfsm-global.h>
+ #include <xfce4-session/xfsm-legacy.h>
+-#include <xfce4-session/xfsm-consolekit.h>
+ #include <xfce4-session/xfsm-upower.h>
+
+-
++#ifdef HAVE_SYSTEMD
++#include <xfce4-session/xfsm-systemd.h>
++#else
++#include <xfce4-session/xfsm-consolekit.h>
++#endif
+
+ static void xfsm_shutdown_finalize (GObject *object);
+ static void xfsm_shutdown_sudo_free (XfsmShutdown *shutdown);
diff --git a/staging/xfce4-session/xfce4-session.install b/staging/xfce4-session/xfce4-session.install
new file mode 100644
index 000000000..e4f8fd06c
--- /dev/null
+++ b/staging/xfce4-session/xfce4-session.install
@@ -0,0 +1,13 @@
+post_install() {
+ gtk-update-icon-cache -q -t -f usr/share/icons/hicolor
+}
+
+post_upgrade() {
+ post_install
+}
+
+post_remove() {
+ post_install
+}
+
+# vim:set ts=2 sw=2 et:
diff --git a/staging/xorg-xdm/PKGBUILD b/staging/xorg-xdm/PKGBUILD
new file mode 100644
index 000000000..6da8b604c
--- /dev/null
+++ b/staging/xorg-xdm/PKGBUILD
@@ -0,0 +1,60 @@
+# $Id: PKGBUILD 168625 2012-10-13 15:55:26Z andyrtr $
+# Maintainer: Alexander Baldeck <alexander@archlinux.org>
+# Contributor: Jan de Groot <jgc@archlinux.org>
+pkgname=xorg-xdm
+pkgver=1.1.11
+pkgrel=4
+pkgdesc="X Display Manager"
+arch=(i686 x86_64)
+url="http://xorg.freedesktop.org/"
+license=('custom')
+depends=('pam' 'libxaw' 'libxinerama' 'xorg-xrdb' 'xorg-sessreg' 'libxft' 'systemd')
+makedepends=('pkgconfig' 'xorg-util-macros' 'xtrans')
+backup=(etc/X11/xdm/Xaccess etc/X11/xdm/Xresources etc/X11/xdm/Xservers etc/X11/xdm/xdm-config etc/pam.d/xdm etc/X11/xdm/Xsetup_0 etc/X11/xdm/Xsession)
+options=('!libtool')
+source=(${url}/releases/individual/app/xdm-${pkgver}.tar.bz2
+ Xsession-loginshell.patch
+ Xsession-xsm.patch
+ xdm-1.0.5-sessreg-utmp-fix-bug177890.patch
+ xdm.pam
+ git_fixes.diff)
+sha256sums=('d4da426ddea0124279a3f2e00a26db61944690628ee818a64df9d27352081c47'
+ 'fd3e7c20837b42a8ab111369fd6dc9612f9edb91c1f6904cca1d6a1fa3cfa0ff'
+ '77a1ce9bdf363591b72798db08b4df3589bd4e64737fd32cf9028f9245450edb'
+ '5f380a2d6f77feb910d77f7f6843fce9b00ff7610c159fc029ee44cc6c23a48a'
+ '7d6818a1c1a44e9bd38774c035e03b0b831f6646681bc2bf556761aec7baf418'
+ '781b5577bb070220d018a11832d0d4a65fd16e130730ba26fb055c3aa68156b2')
+
+build() {
+ cd "${srcdir}/xdm-${pkgver}"
+ # upstream commits - Add some missing malloc failure checks 2012-01-07
+ patch -Np1 -i "${srcdir}/git_fixes.diff"
+
+ patch -Np0 -i "${srcdir}/Xsession-loginshell.patch"
+ patch -Np1 -i "${srcdir}/Xsession-xsm.patch"
+ patch -Np0 -i "${srcdir}/xdm-1.0.5-sessreg-utmp-fix-bug177890.patch"
+
+ autoreconf -fi
+ ./configure --prefix=/usr \
+ --disable-xdm-auth \
+ --disable-static \
+ --with-xdmconfigdir=/etc/X11/xdm \
+ --with-xdmscriptdir=/etc/X11/xdm \
+ --with-pixmapdir=/usr/share/xdm/pixmaps
+ make
+}
+
+package() {
+ cd "${srcdir}/xdm-${pkgver}"
+ make DESTDIR="${pkgdir}" install
+ install -m755 -d "${pkgdir}/var/lib/xdm"
+ install -m755 -d "${pkgdir}/etc/pam.d"
+ install -m644 "${srcdir}/xdm.pam" "${pkgdir}/etc/pam.d/xdm"
+ install -m755 -d "${pkgdir}/usr/share/licenses/${pkgname}"
+ install -m644 COPYING "${pkgdir}/usr/share/licenses/${pkgname}/"
+
+ sed -i -e 's/\/X11R6//g' "${pkgdir}"/etc/X11/xdm/*
+
+ sed -i 's|^Alias=.*|Alias=display-manager.service|' \
+ "$pkgdir/usr/lib/systemd/system/xdm.service"
+}
diff --git a/staging/xorg-xdm/Xsession-loginshell.patch b/staging/xorg-xdm/Xsession-loginshell.patch
new file mode 100644
index 000000000..3710752ef
--- /dev/null
+++ b/staging/xorg-xdm/Xsession-loginshell.patch
@@ -0,0 +1,15 @@
+--- config/Xsession.cpp.orig 2008-06-21 13:57:36.000000000 +0000
++++ config/Xsession.cpp 2008-06-21 14:01:25.000000000 +0000
+@@ -56,11 +56,7 @@
+ resources=$HOME/.Xresources
+
+ if [ -s "$startup" ]; then
+- if [ -x "$startup" ]; then
+- exec "$startup"
+- else
+- exec /bin/sh "$startup"
+- fi
++ exec /bin/sh -ls -c "$startup"
+ else
+ if [ -r "$resources" ]; then
+ BINDIR/xrdb -load "$resources"
diff --git a/staging/xorg-xdm/Xsession-xsm.patch b/staging/xorg-xdm/Xsession-xsm.patch
new file mode 100644
index 000000000..a2d4d6cc6
--- /dev/null
+++ b/staging/xorg-xdm/Xsession-xsm.patch
@@ -0,0 +1,22 @@
+diff -Naur xdm-1.1.8-orig/config/Xsession.cpp xdm-1.1.8/config/Xsession.cpp
+--- xdm-1.1.8-orig/config/Xsession.cpp 2008-05-21 14:08:45.000000000 -0400
++++ xdm-1.1.8/config/Xsession.cpp 2009-04-28 02:56:11.000000000 -0400
+@@ -54,6 +54,7 @@
+
+ startup=$HOME/.xsession
+ resources=$HOME/.Xresources
++xinitrc=$HOME/.xinitrc
+
+ if [ -s "$startup" ]; then
+ if [ -x "$startup" ]; then
+@@ -83,5 +84,9 @@
+ exec `eval $XDESKTOP`
+ }
+ #endif
+- exec BINDIR/xsm
++ if [ -r "$xinitrc" ]; then
++ exec /bin/sh -ls -c "$xinitrc"
++ else
++ exec /bin/sh -l /etc/X11/xinit/xinitrc
++ fi
+ fi
diff --git a/staging/xorg-xdm/git_fixes.diff b/staging/xorg-xdm/git_fixes.diff
new file mode 100644
index 000000000..69836d488
--- /dev/null
+++ b/staging/xorg-xdm/git_fixes.diff
@@ -0,0 +1,673 @@
+From 011a2710a69cd345a8ee3a6b2f15407b4c3b355a Mon Sep 17 00:00:00 2001
+From: Jeremy Huddleston <jeremyhu@apple.com>
+Date: Sun, 25 Sep 2011 07:56:15 +0000
+Subject: Require xt >= 1.0 for appdefaultdir
+
+https://bugs.freedesktop.org/show_bug.cgi?id=7237
+
+Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+---
+diff --git a/configure.ac b/configure.ac
+index b488f0c..a4222f1 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -383,7 +383,7 @@ PKG_CHECK_MODULES(AUTH, xau)
+ # Greeter
+ #
+
+-PKG_CHECK_MODULES(XDMGREET, xt x11 xext)
++PKG_CHECK_MODULES(XDMGREET, xt >= 1.0 x11 xext)
+
+ GREETERLIB="${XDMLIBDIR}/libXdmGreet.so"
+ AX_DEFINE_DIR(DEF_GREETER_LIB, GREETERLIB, [Location of Xdm Greeter library])
+--
+cgit v0.9.0.2-2-gbebe
+From 618039261b0c7f14eb3b32c8f636464369724407 Mon Sep 17 00:00:00 2001
+From: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date: Wed, 21 Sep 2011 02:11:20 +0000
+Subject: Mark some chars as const to fix gcc -Wwrite-strings warnings
+
+Can't fix all the warnings, due to the Xt API, but can fix a bunch.
+
+Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+---
+diff --git a/greeter/greet.c b/greeter/greet.c
+index 539ce17..82e2c21 100644
+--- a/greeter/greet.c
++++ b/greeter/greet.c
+@@ -110,9 +110,9 @@ void (*__xdm_SessionExit)(struct display *d, int status, int removeAuth) = NU
+ void (*__xdm_DeleteXloginResources)(struct display *d, Display *dpy) = NULL;
+ int (*__xdm_source)(char **environ, char *file) = NULL;
+ char **(*__xdm_defaultEnv)(void) = NULL;
+-char **(*__xdm_setEnv)(char **e, char *name, char *value) = NULL;
++char **(*__xdm_setEnv)(char **e, const char *name, const char *value) = NULL;
+ char **(*__xdm_putEnv)(const char *string, char **env) = NULL;
+-char **(*__xdm_parseArgs)(char **argv, char *string) = NULL;
++char **(*__xdm_parseArgs)(char **argv, const char *string) = NULL;
+ void (*__xdm_printEnv)(char **e) = NULL;
+ char **(*__xdm_systemEnv)(struct display *d, char *user, char *home) = NULL;
+ void (*__xdm_LogOutOfMem)(const char * fmt, ...) = NULL;
+diff --git a/greeter/verify.c b/greeter/verify.c
+index ea62cd2..5d2ad17 100644
+--- a/greeter/verify.c
++++ b/greeter/verify.c
+@@ -61,7 +61,7 @@ from The Open Group.
+ extern char *crypt(const char *, const char *);
+ #endif
+
+-static char *envvars[] = {
++static const char *envvars[] = {
+ "TZ", /* SYSV and SVR4, but never hurts */
+ #if defined(sony) && !defined(SYSTYPE_SYSV) && !defined(_SYSTYPE_SYSV)
+ "bootdev",
+@@ -94,8 +94,8 @@ static char **
+ userEnv (struct display *d, int useSystemPath, char *user, char *home, char *shell)
+ {
+ char **env;
+- char **envvar;
+- char *str;
++ const char **envvar;
++ const char *str;
+
+ env = defaultEnv ();
+ env = setEnv (env, "DISPLAY", d->name);
+diff --git a/include/dm.h b/include/dm.h
+index 316dd46..4085cae 100644
+--- a/include/dm.h
++++ b/include/dm.h
+@@ -443,7 +443,7 @@ extern void UnsecureDisplay (struct display *d, Display *dpy);
+ extern void execute(char **argv, char **environ);
+
+ /* server.c */
+-extern char *_SysErrorMsg (int n);
++extern const char *_SysErrorMsg (int n);
+ extern int StartServer (struct display *d);
+ extern int WaitForServer (struct display *d);
+ extern void ResetServer (struct display *d);
+@@ -462,10 +462,10 @@ extern int Asprintf(char ** ret, const char *restrict format, ...)
+ _X_ATTRIBUTE_PRINTF(2,3);
+ # endif
+ extern char *localHostname (void);
+-extern char **parseArgs (char **argv, char *string);
+-extern char **setEnv (char **e, char *name, char *value);
++extern char **parseArgs (char **argv, const char *string);
++extern char **setEnv (char **e, const char *name, const char *value);
+ extern char **putEnv(const char *string, char **env);
+-extern char *getEnv (char **e, char *name);
++extern char *getEnv (char **e, const char *name);
+ extern void CleanUpChild (void);
+ extern void freeArgs (char **argv);
+ extern void freeEnv (char **env);
+@@ -478,7 +478,7 @@ extern int Verify (struct display *d, struct greet_info *greet, struct verify_in
+ extern char *NetworkAddressToHostname (CARD16 connectionType, ARRAY8Ptr connectionAddress);
+ extern int AnyWellKnownSockets (void);
+ extern void DestroyWellKnownSockets (void);
+-extern void SendFailed (struct display *d, char *reason);
++extern void SendFailed (struct display *d, const char *reason);
+ extern void StopDisplay (struct display *d);
+ extern void WaitForChild (void);
+ extern void WaitForSomething (void);
+diff --git a/include/greet.h b/include/greet.h
+index 6b6689e..0d607ba 100644
+--- a/include/greet.h
++++ b/include/greet.h
+@@ -65,9 +65,9 @@ struct dlfuncs {
+ void (*_DeleteXloginResources)(struct display *d, Display *dpy);
+ int (*_source)(char **environ, char *file);
+ char **(*_defaultEnv)(void);
+- char **(*_setEnv)(char **e, char *name, char *value);
++ char **(*_setEnv)(char **e, const char *name, const char *value);
+ char **(*_putEnv)(const char *string, char **env);
+- char **(*_parseArgs)(char **argv, char *string);
++ char **(*_parseArgs)(char **argv, const char *string);
+ void (*_printEnv)(char **e);
+ char **(*_systemEnv)(struct display *d, char *user, char *home);
+ void (*_LogOutOfMem)(const char * fmt, ...);
+@@ -149,9 +149,9 @@ extern void (*__xdm_SessionExit)(struct display *d, int status, int removeAut
+ extern void (*__xdm_DeleteXloginResources)(struct display *d, Display *dpy);
+ extern int (*__xdm_source)(char **environ, char *file);
+ extern char **(*__xdm_defaultEnv)(void);
+-extern char **(*__xdm_setEnv)(char **e, char *name, char *value);
++extern char **(*__xdm_setEnv)(char **e, const char *name, const char *value);
+ extern char **(*__xdm_putEnv)(const char *string, char **env);
+-extern char **(*__xdm_parseArgs)(char **argv, char *string);
++extern char **(*__xdm_parseArgs)(char **argv, const char *string);
+ extern void (*__xdm_printEnv)(char **e);
+ extern char **(*__xdm_systemEnv)(struct display *d, char *user, char *home);
+ extern void (*__xdm_LogOutOfMem)(const char * fmt, ...);
+diff --git a/xdm/access.c b/xdm/access.c
+index d0850ad..7035375 100644
+--- a/xdm/access.c
++++ b/xdm/access.c
+@@ -667,7 +667,7 @@ scanHostlist (
+ /* Returns non-0 iff string is matched by pattern. Does case folding.
+ */
+ static int
+-patternMatch (char *string, char *pattern)
++patternMatch (const char *string, char *pattern)
+ {
+ int p, s;
+
+diff --git a/xdm/auth.c b/xdm/auth.c
+index bbca167..9e5cba2 100644
+--- a/xdm/auth.c
++++ b/xdm/auth.c
+@@ -116,7 +116,7 @@ int chown(int a,int b,int c) {}
+
+ struct AuthProtocol {
+ unsigned short name_length;
+- char *name;
++ const char *name;
+ void (*InitAuth)(unsigned short len, char *name);
+ Xauth *(*GetAuth)(unsigned short len, char *name);
+ void (*GetXdmcpAuth)(
+diff --git a/xdm/file.c b/xdm/file.c
+index 6e929b8..7b7f3d3 100644
+--- a/xdm/file.c
++++ b/xdm/file.c
+@@ -225,7 +225,7 @@ ParseDisplay (char *source, DisplayType *acceptableTypes, int numAcceptable)
+ }
+
+ static struct displayMatch {
+- char *name;
++ const char *name;
+ DisplayType type;
+ } displayTypes[] = {
+ { "local", { Local, Permanent, FromFile } },
+diff --git a/xdm/resource.c b/xdm/resource.c
+index ece4de3..83901a2 100644
+--- a/xdm/resource.c
++++ b/xdm/resource.c
+@@ -145,10 +145,10 @@ int choiceTimeout; /* chooser choice timeout */
+ #define DEF_UDP_PORT "177" /* registered XDMCP port, dont change */
+
+ struct dmResources {
+- char *name, *class;
+- int type;
+- char **dm_value;
+- char *default_value;
++ const char *name, *class;
++ int type;
++ char **dm_value;
++ const char *default_value;
+ } DmResources[] = {
+ { "servers", "Servers", DM_STRING, &servers,
+ DEF_SERVER_LINE} ,
+@@ -203,10 +203,10 @@ struct dmResources {
+ #define boffset(f) XtOffsetOf(struct display, f)
+
+ struct displayResource {
+- char *name, *class;
+- int type;
+- int offset;
+- char *default_value;
++ const char *name, *class;
++ int type;
++ int offset;
++ const char *default_value;
+ };
+
+ /* resources for managing the server */
+@@ -289,15 +289,16 @@ XrmDatabase DmResourceDB;
+
+ static void
+ GetResource (
+- char *name,
+- char *class,
+- int valueType,
+- char **valuep,
+- char *default_value)
++ const char *name,
++ const char *class,
++ int valueType,
++ char **valuep,
++ const char *default_value)
+ {
+ char *type;
+ XrmValue value;
+- char *string, *new_string;
++ const char *string;
++ char *new_string;
+ char str_buf[50];
+ int len;
+
+diff --git a/xdm/server.c b/xdm/server.c
+index 7fe55e6..1bb8873 100644
+--- a/xdm/server.c
++++ b/xdm/server.c
+@@ -62,9 +62,9 @@ CatchUsr1 (int n)
+ errno = olderrno;
+ }
+
+-char *_SysErrorMsg (int n)
++const char *_SysErrorMsg (int n)
+ {
+- char *s = strerror(n);
++ const char *s = strerror(n);
+ return (s ? s : "unknown error");
+ }
+
+diff --git a/xdm/util.c b/xdm/util.c
+index 033633a..60aab21 100644
+--- a/xdm/util.c
++++ b/xdm/util.c
+@@ -97,7 +97,7 @@ printEnv (char **e)
+ }
+
+ static char *
+-makeEnv (char *name, char *value)
++makeEnv (const char *name, const char *value)
+ {
+ char *result;
+
+@@ -111,7 +111,7 @@ makeEnv (char *name, char *value)
+ }
+
+ char *
+-getEnv (char **e, char *name)
++getEnv (char **e, const char *name)
+ {
+ int l = strlen (name);
+
+@@ -127,7 +127,7 @@ getEnv (char **e, char *name)
+ }
+
+ char **
+-setEnv (char **e, char *name, char *value)
++setEnv (char **e, const char *name, const char *value)
+ {
+ char **new, **old;
+ char *newe;
+@@ -207,9 +207,9 @@ freeEnv (char **env)
+ #define isblank(c) ((c) == ' ' || c == '\t')
+
+ char **
+-parseArgs (char **argv, char *string)
++parseArgs (char **argv, const char *string)
+ {
+- char *word;
++ const char *word;
+ char *save;
+ char **newargv;
+ int i;
+diff --git a/xdm/xdmauth.c b/xdm/xdmauth.c
+index 4b945cf..66804a4 100644
+--- a/xdm/xdmauth.c
++++ b/xdm/xdmauth.c
+@@ -44,7 +44,7 @@ static char auth_name[256];
+ static int auth_name_len;
+
+ static void
+-XdmPrintDataHex (char *s, char *a, int l)
++XdmPrintDataHex (const char *s, const char *a, int l)
+ {
+ int i;
+
+@@ -56,7 +56,7 @@ XdmPrintDataHex (char *s, char *a, int l)
+
+ # ifdef XDMCP
+ static void
+-XdmPrintArray8Hex (char *s, ARRAY8Ptr a)
++XdmPrintArray8Hex (const char *s, ARRAY8Ptr a)
+ {
+ XdmPrintDataHex (s, (char *) a->data, a->length);
+ }
+diff --git a/xdm/xdmcp.c b/xdm/xdmcp.c
+index 5bc4716..1c34e7c 100644
+--- a/xdm/xdmcp.c
++++ b/xdm/xdmcp.c
+@@ -74,7 +74,7 @@ static void request_respond (struct sockaddr *from, int fromlen, int length, int
+ static void send_accept (struct sockaddr *to, int tolen, CARD32 sessionID, ARRAY8Ptr authenticationName, ARRAY8Ptr authenticationData, ARRAY8Ptr authorizationName, ARRAY8Ptr authorizationData, int fd);
+ static void send_alive (struct sockaddr *from, int fromlen, int length, int fd);
+ static void send_decline (struct sockaddr *to, int tolen, ARRAY8Ptr authenticationName, ARRAY8Ptr authenticationData, ARRAY8Ptr status, int fd);
+-static void send_failed (struct sockaddr *from, int fromlen, char *name, CARD32 sessionID, char *reason, int fd);
++static void send_failed (struct sockaddr *from, int fromlen, const char *name, CARD32 sessionID, const char *reason, int fd);
+ static void send_refuse (struct sockaddr *from, int fromlen, CARD32 sessionID, int fd);
+ static void send_unwilling (struct sockaddr *from, int fromlen, ARRAY8Ptr authenticationName, ARRAY8Ptr status, int fd);
+ static void send_willing (struct sockaddr *from, int fromlen, ARRAY8Ptr authenticationName, ARRAY8Ptr status, int fd);
+@@ -1300,7 +1300,7 @@ abort:
+ void
+ SendFailed (
+ struct display *d,
+- char *reason)
++ const char *reason)
+ {
+ Debug ("Display start failed, sending Failed\n");
+ send_failed ((struct sockaddr *)(d->from), d->fromlen, d->name,
+@@ -1311,9 +1311,9 @@ static void
+ send_failed (
+ struct sockaddr *from,
+ int fromlen,
+- char *name,
++ const char *name,
+ CARD32 sessionID,
+- char *reason,
++ const char *reason,
+ int fd)
+ {
+ static char buf[256];
+@@ -1416,7 +1416,7 @@ NetworkAddressToHostname (
+ # else
+ char dotted[20];
+ # endif
+- char *local_name = "";
++ const char *local_name = "";
+ int af_type;
+
+ # if defined(IPv6) && defined(AF_INET6)
+--
+cgit v0.9.0.2-2-gbebe
+From c43eb799774743bc50233eff6643c51a5fbe6899 Mon Sep 17 00:00:00 2001
+From: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date: Wed, 21 Sep 2011 02:22:48 +0000
+Subject: Fix warnings about printing longs with int type format strings
+
+Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+---
+diff --git a/xdm/dm.c b/xdm/dm.c
+index cd0ee25..7bc2605 100644
+--- a/xdm/dm.c
++++ b/xdm/dm.c
+@@ -536,7 +536,7 @@ WaitForChild (void)
+ time(&now);
+ crash = d->lastReserv &&
+ ((now - d->lastReserv) < XDM_BROKEN_INTERVAL);
+- Debug("time %i %i try %i of %i%s\n", now, d->lastReserv,
++ Debug("time %li %li try %i of %i%s\n", now, d->lastReserv,
+ d->reservTries, d->reservAttempts,
+ crash ? " crash" : "");
+
+diff --git a/xdm/xdmauth.c b/xdm/xdmauth.c
+index 66804a4..b3c1c16 100644
+--- a/xdm/xdmauth.c
++++ b/xdm/xdmauth.c
+@@ -234,7 +234,7 @@ XdmGetKey(struct protoDisplay *pdpy, ARRAY8Ptr displayID)
+ if (line[0] == '#' || sscanf (line, "%s %s", id, key) != 2)
+ continue;
+ bzero(line, sizeof(line));
+- Debug ("Key entry for \"%s\" %d bytes\n", id, strlen(key));
++ Debug ("Key entry for \"%s\" %ld bytes\n", id, strlen(key));
+ if (strlen (id) == displayID->length &&
+ !strncmp (id, (char *)displayID->data, displayID->length))
+ {
+--
+cgit v0.9.0.2-2-gbebe
+From 8eee942be0db913511b4c53f94829e1201dfdf00 Mon Sep 17 00:00:00 2001
+From: Michał Górny <mgorny@gentoo.org>
+Date: Wed, 28 Sep 2011 19:25:17 +0000
+Subject: Support systemd startup notification.
+
+If libsystemd-daemon support is enabled, xdm uses it to announce its
+startup as soon as the session is established. This gives the user
+opportunity to delay I/O-intensive operations until the X server is
+started so that they would not interfere with its loading while keeping
+the machine busy when user types in his/her login.
+
+Reviewed-by: Jamey Sharp <jamey@minilop.net>
+Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
+Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+---
+diff --git a/Makefile.am b/Makefile.am
+index e5f9f5c..bb6b51c 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -43,8 +43,13 @@ endif LINT
+ if HAVE_SYSTEMD
+ systemdsystemunit_DATA = xdm.service
+
+-xdm.service: xdm.service.in
+- $(AM_V_GEN)$(SED) -e 's|BINDIR|$(bindir)|g' < $< > $@
++xdm.service: xdm.service.in Makefile
++if USE_SYSTEMD_DAEMON
++ $(AM_V_GEN)$(SED) -e 's|BINDIR|$(bindir)|g' < xdm.service.in > $@
++else !USE_SYSTEMD_DAEMON
++ $(AM_V_GEN)$(SED) -e 's|BINDIR|$(bindir)|g' -e '/[Nn]otify/d' < xdm.service.in > $@
++endif !USE_SYSTEMD_DAEMON
++
+ endif HAVE_SYSTEMD
+ CLEANFILES = xdm.service
+ EXTRA_DIST = xdm.service.in
+diff --git a/configure.ac b/configure.ac
+index a4222f1..fcb37f8 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -146,6 +146,7 @@ if test "x$USE_SELINUX" != "xno" ; then
+ fi
+
+ # Check whether to install systemd unit files, as suggested in daemon(7).
++# When a full path is specified, this does not require systemd installed.
+ AC_ARG_WITH([systemdsystemunitdir], AS_HELP_STRING([--with-systemdsystemunitdir=DIR],
+ [Directory for systemd service files (default from the System and Service Manager)]),,
+ [with_systemdsystemunitdir=auto])
+@@ -166,6 +167,21 @@ AS_IF([test "x$with_systemdsystemunitdir" != "xno"], [
+ ])
+ AM_CONDITIONAL(HAVE_SYSTEMD, [test "x$with_systemdsystemunitdir" != "xno"])
+
++# Check whether to enable systemd startup notification.
++# This requires libsystemd-daemon.
++AC_ARG_WITH([systemd-daemon], AS_HELP_STRING([--with-systemd-daemon],
++ [Add support for systemd startup notification (default is autodetected)]),
++ [USE_SYSTEMD_DAEMON=$withval], [USE_SYSTEMD_DAEMON=auto])
++AS_IF([test "x$USE_SYSTEMD_DAEMON" != "xno"], [
++ PKG_CHECK_MODULES([SYSTEMD_DAEMON], [libsystemd-daemon],
++ [AC_DEFINE(USE_SYSTEMD_DAEMON,1,[Use systemd startup notification])],
++ [AS_IF([test "x$USE_SYSTEMD_DAEMON" = "xyes"],
++ [AC_MSG_ERROR([systemd startup notification support requested, but libsystemd-daemon not found.])]
++ )]
++ )
++])
++AM_CONDITIONAL(USE_SYSTEMD_DAEMON, [test "x$USE_SYSTEMD_DAEMON" != "xno"])
++
+ # FIXME: Find better test for which OS'es use su -m - for now, just try to
+ # mirror the Imakefile setting of:
+ # if defined(OpenBSDArchitecture) || defined(NetBSDArchitecture) || defined(FreeBSDArchitecture) || defined(DarwinArchitecture)
+diff --git a/xdm.service.in b/xdm.service.in
+index d15e072..e782dd9 100644
+--- a/xdm.service.in
++++ b/xdm.service.in
+@@ -4,6 +4,8 @@ After=systemd-user-sessions.service
+
+ [Service]
+ ExecStart=BINDIR/xdm -nodaemon
++Type=notify
++NotifyAccess=all
+
+ [Install]
+ Alias=graphical.target.wants/xdm.service
+diff --git a/xdm/Makefile.am b/xdm/Makefile.am
+index aa9765c..797b5c5 100644
+--- a/xdm/Makefile.am
++++ b/xdm/Makefile.am
+@@ -22,11 +22,11 @@
+ bin_PROGRAMS = xdm
+
+ AM_CPPFLAGS = -I$(top_srcdir)/include
+-AM_CFLAGS = $(CWARNFLAGS) $(XDM_CFLAGS)
++AM_CFLAGS = $(CWARNFLAGS) $(XDM_CFLAGS) $(SYSTEMD_DAEMON_CFLAGS)
+
+ # The xdm binary needs to export symbols so that they can be used from
+ # libXdmGreet.so loaded through a dlopen call from session.c
+-AM_LDFLAGS = $(XDM_LIBS) -export-dynamic
++AM_LDFLAGS = $(XDM_LIBS) $(SYSTEMD_DAEMON_LIBS) -export-dynamic
+
+ xdm_SOURCES = \
+ access.c \
+diff --git a/xdm/session.c b/xdm/session.c
+index 5fd47f0..573747d 100644
+--- a/xdm/session.c
++++ b/xdm/session.c
+@@ -81,6 +81,10 @@ extern int key_setnet(struct key_netstarg *arg);
+ # define RTLD_NOW 1
+ # endif
+
++#ifdef USE_SYSTEMD_DAEMON
++#include <systemd/sd-daemon.h>
++#endif
++
+ #ifdef USE_SELINUX
+ /* This should be run just before we exec the user session. */
+ static int
+@@ -349,6 +353,12 @@ ManageSession (struct display *d)
+ exit(UNMANAGE_DISPLAY);
+ }
+
++#ifdef USE_SYSTEMD_DAEMON
++ /* Subsequent notifications will be ignored by systemd
++ * and calling this function will clean up the env */
++ sd_notify(1, "READY=1");
++#endif
++
+ /* tell the possibly dynamically loaded greeter function
+ * what data structure formats to expect.
+ * These version numbers are registered with The Open Group. */
+--
+cgit v0.9.0.2-2-gbebe
+From 284532c0884893728b75ca37f5d2a9a33f7bc8db Mon Sep 17 00:00:00 2001
+From: Julien Cristau <jcristau@debian.org>
+Date: Sat, 22 Oct 2011 15:14:46 +0000
+Subject: greeter: link against -lXrender if xft is enabled
+
+XmuCvtStringToXftColor uses XRenderParseColor, so require xrender for
+the xft option, and link against it.
+
+Signed-off-by: Julien Cristau <jcristau@debian.org>
+Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+---
+diff --git a/configure.ac b/configure.ac
+index fcb37f8..d20ae28 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -345,10 +345,10 @@ AC_ARG_WITH(xft,
+ AS_HELP_STRING([--with-xft],
+ [Use Xft to draw text (default is YES if installed)]),
+ [USE_XFT="$withval"],
+- PKG_CHECK_EXISTS(xft, [USE_XFT="yes"], [USE_XFT="no"]))
++ PKG_CHECK_EXISTS(xft xrender, [USE_XFT="yes"], [USE_XFT="no"]))
+
+ if test "x$USE_XFT" = "xyes" ; then
+- PKG_CHECK_MODULES(XFT, xft)
++ PKG_CHECK_MODULES(XFT, xft xrender)
+ GREETER_CFLAGS="$GREETER_CFLAGS $XFT_CFLAGS"
+ GREETER_LIBS="$GREETER_LIBS $XFT_LIBS"
+ AC_DEFINE([USE_XFT], 1,
+diff --git a/greeter/Login.c b/greeter/Login.c
+index 99a3932..d899376 100644
+--- a/greeter/Login.c
++++ b/greeter/Login.c
+@@ -86,6 +86,10 @@ from The Open Group.
+ # include <X11/extensions/Xinerama.h>
+ #endif
+
++#ifdef USE_XFT
++# include <X11/extensions/Xrender.h>
++#endif
++
+ #ifndef DEBUG
+ # define XDM_ASSERT(a) /* do nothing */
+ #else
+--
+cgit v0.9.0.2-2-gbebe
+From a02edebf21aae37f8564d7b9fad01d5d2942ad8d Mon Sep 17 00:00:00 2001
+From: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date: Mon, 07 Nov 2011 16:01:44 +0000
+Subject: Fix build outside of source dir. Fixes distcheck too.
+
+Signed-off-by: Matthieu Herrb <matthieu.herrb@laas.fr>
+Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+---
+diff --git a/Makefile.am b/Makefile.am
+index bb6b51c..e9da40f 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -45,9 +45,9 @@ systemdsystemunit_DATA = xdm.service
+
+ xdm.service: xdm.service.in Makefile
+ if USE_SYSTEMD_DAEMON
+- $(AM_V_GEN)$(SED) -e 's|BINDIR|$(bindir)|g' < xdm.service.in > $@
++ $(AM_V_GEN)$(SED) -e 's|BINDIR|$(bindir)|g' < ${srcdir}/xdm.service.in > $@
+ else !USE_SYSTEMD_DAEMON
+- $(AM_V_GEN)$(SED) -e 's|BINDIR|$(bindir)|g' -e '/[Nn]otify/d' < xdm.service.in > $@
++ $(AM_V_GEN)$(SED) -e 's|BINDIR|$(bindir)|g' -e '/[Nn]otify/d' < ${srcdir}/xdm.service.in > $@
+ endif !USE_SYSTEMD_DAEMON
+
+ endif HAVE_SYSTEMD
+--
+cgit v0.9.0.2-2-gbebe
+From ad7a54288f62c0266540279dac775ebee68f092e Mon Sep 17 00:00:00 2001
+From: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date: Thu, 15 Dec 2011 21:14:23 +0000
+Subject: replace <varargs.h> by <stdarg.h>. Spotted my Marco Peereboom with clang.
+
+Reviewed-by: Mark Kettenis <kettenis@openbsd.org>
+Signed-off-by: Matthieu Herrb <matthieu.herrb@laas.fr>
+---
+diff --git a/greeter/verify.c b/greeter/verify.c
+index 5d2ad17..1221874 100644
+--- a/greeter/verify.c
++++ b/greeter/verify.c
+@@ -48,7 +48,7 @@ from The Open Group.
+ # include <errno.h>
+ #elif defined(USE_BSDAUTH)
+ # include <login_cap.h>
+-# include <varargs.h>
++# include <stdarg.h>
+ # include <bsd_auth.h>
+ #elif defined(USESECUREWARE)
+ # include <sys/types.h>
+--
+cgit v0.9.0.2-2-gbebe
+From 78403f6a7420798bf24798811c8c6b936c9ccb34 Mon Sep 17 00:00:00 2001
+From: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date: Sat, 07 Jan 2012 03:34:30 +0000
+Subject: Add some missing malloc failure checks
+
+Flagged by Solaris Studio 12.3 code analyzer
+
+Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+---
+diff --git a/xdm/access.c b/xdm/access.c
+index 7035375..b16a066 100644
+--- a/xdm/access.c
++++ b/xdm/access.c
+@@ -304,6 +304,11 @@ tryagain:
+ if (!hostOrAlias)
+ return NULL;
+ h = malloc (sizeof (DisplayEntry));
++ if (!h)
++ {
++ LogOutOfMem ("ReadHostEntry: DisplayEntry\n");
++ return NULL;
++ }
+ h->hopCount = 1;
+ if (*hostOrAlias == ALIAS_CHARACTER)
+ {
+@@ -423,6 +428,11 @@ tryagain:
+ if (!displayOrAlias)
+ return NULL;
+ d = malloc (sizeof (DisplayEntry));
++ if (!d)
++ {
++ LogOutOfMem ("ReadDisplayEntry: DisplayEntry\n");
++ return NULL;
++ }
+ d->notAllowed = 0;
+ d->notBroadcast = 0;
+ d->chooser = 0;
+diff --git a/xdm/choose.c b/xdm/choose.c
+index 6f077eb..e5e003d 100644
+--- a/xdm/choose.c
++++ b/xdm/choose.c
+@@ -128,6 +128,11 @@ RememberIndirectClient (
+ connectionType == i->connectionType)
+ return 1;
+ i = malloc (sizeof (IndirectUsersRec));
++ if (!i)
++ {
++ LogOutOfMem ("RememberIndirectClient\n");
++ return 0;
++ }
+ if (!XdmcpCopyARRAY8 (clientAddress, &i->client))
+ {
+ free (i);
+--
+cgit v0.9.0.2-2-gbebe
diff --git a/staging/xorg-xdm/xdm-1.0.5-sessreg-utmp-fix-bug177890.patch b/staging/xorg-xdm/xdm-1.0.5-sessreg-utmp-fix-bug177890.patch
new file mode 100644
index 000000000..195858883
--- /dev/null
+++ b/staging/xorg-xdm/xdm-1.0.5-sessreg-utmp-fix-bug177890.patch
@@ -0,0 +1,8 @@
+--- config/GiveConsole.sessreg-utmp-fix-bug177890 2006-07-24 04:20:10.000000000 -0400
++++ config/GiveConsole 2006-07-24 04:21:16.000000000 -0400
+@@ -8,3 +8,5 @@
+ # causing serious grief.
+ #
+ chown $USER /dev/console
++exec /usr/bin/sessreg -a -w "/var/log/wtmp" -u "/run/utmp" \
++ -x "/etc/X11/xdm/Xservers" -l $DISPLAY -h "" $USER
diff --git a/staging/xorg-xdm/xdm.pam b/staging/xorg-xdm/xdm.pam
new file mode 100644
index 000000000..a0b601db6
--- /dev/null
+++ b/staging/xorg-xdm/xdm.pam
@@ -0,0 +1,10 @@
+#%PAM-1.0
+auth required pam_unix.so
+auth required pam_nologin.so
+auth required pam_env.so
+account required pam_unix.so
+password required pam_unix.so
+session required pam_unix.so
+session required pam_limits.so
+session required pam_loginuid.so
+-session optional pam_systemd.so