about summary refs log tree commit diff
path: root/pkgs/desktops
diff options
context:
space:
mode:
authorVladimír Čunát <vcunat@gmail.com>2013-04-29 11:44:58 +0200
committerVladimír Čunát <vcunat@gmail.com>2013-04-29 11:45:37 +0200
commita8ab0e53a4eba58cd2d7f05cf4a886278cd4d780 (patch)
treee1ffd88e3a917ef6588aeca93c90484c3103e788 /pkgs/desktops
parentfe8c1c411867f546d0069563a08606c4ff7ed465 (diff)
downloadnixlib-a8ab0e53a4eba58cd2d7f05cf4a886278cd4d780.tar
nixlib-a8ab0e53a4eba58cd2d7f05cf4a886278cd4d780.tar.gz
nixlib-a8ab0e53a4eba58cd2d7f05cf4a886278cd4d780.tar.bz2
nixlib-a8ab0e53a4eba58cd2d7f05cf4a886278cd4d780.tar.lz
nixlib-a8ab0e53a4eba58cd2d7f05cf4a886278cd4d780.tar.xz
nixlib-a8ab0e53a4eba58cd2d7f05cf4a886278cd4d780.tar.zst
nixlib-a8ab0e53a4eba58cd2d7f05cf4a886278cd4d780.zip
xfce4session: make it systemd-aware
This should solve many issuses, including:
 - show mountable volumes and mount-on-click (in Thunar)
 - fix shutdown actions (and don't ask for password anymore)

It doesn't explicitly depend on anything in x-updates,
but AFAIK noone has tested it against master (yet).
Connected to #441.
Diffstat (limited to 'pkgs/desktops')
-rw-r--r--pkgs/desktops/xfce/core/xfce4-dev-tools.nix24
-rw-r--r--pkgs/desktops/xfce/core/xfce4-session-systemd.patch470
-rw-r--r--pkgs/desktops/xfce/core/xfce4-session.nix9
-rw-r--r--pkgs/desktops/xfce/default.nix2
4 files changed, 502 insertions, 3 deletions
diff --git a/pkgs/desktops/xfce/core/xfce4-dev-tools.nix b/pkgs/desktops/xfce/core/xfce4-dev-tools.nix
new file mode 100644
index 000000000000..e56eb3f0a713
--- /dev/null
+++ b/pkgs/desktops/xfce/core/xfce4-dev-tools.nix
@@ -0,0 +1,24 @@
+{ stdenv, fetchurl, pkgconfig, glib, autoconf, automake, libtool, intltool }:
+
+stdenv.mkDerivation rec {
+  p_name  = "xfce4-dev-tools";
+  ver_maj = "4.10";
+  ver_min = "0";
+
+  src = fetchurl {
+    url = "mirror://xfce/src/xfce/${p_name}/${ver_maj}/${name}.tar.bz2";
+    sha256 = "1y1byfjciqhxqfxbjfp22bn5lxk3a01ng7zfjha8h5mzzfxlk5pp";
+  };
+  name = "${p_name}-${ver_maj}.${ver_min}";
+
+  buildInputs = [ pkgconfig glib ];
+
+  # not needed to build it but to use it
+  propagatedBuildInputs = [ autoconf automake libtool intltool ];
+
+  meta = {
+    homepage = http://foo-projects.org/~benny/projects/xfce4-dev-tools/;
+    description = "Tools and M4 macros for Xfce4 developers";
+    license = "GPLv2+";
+  };
+}
diff --git a/pkgs/desktops/xfce/core/xfce4-session-systemd.patch b/pkgs/desktops/xfce/core/xfce4-session-systemd.patch
new file mode 100644
index 000000000000..7780491a8eda
--- /dev/null
+++ b/pkgs/desktops/xfce/core/xfce4-session-systemd.patch
@@ -0,0 +1,470 @@
+From ae28aef315a7a6b90f1649ce6d1f30b842791cbf Mon Sep 17 00:00:00 2001
+From: Nick Schermer <nick@xfce.org>
+Date: Sun, 04 Nov 2012 20:23:36 +0000
+Subject: Add shutdown/reboot functionality for systemd (bug #8729).
+
+Based on patch by Christian Hesse and Evangelos Foutras.
+---
+diff --git a/configure.in.in b/configure.in.in
+index 9aa4f8f..134d0f7 100644
+--- a/configure.in
++++ b/configure.in
+@@ -96,6 +96,10 @@ 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 Check for polkit / systemd integration
++XDT_CHECK_OPTIONAL_PACKAGE([SYSTEMD], [polkit-gobject-1], [0.100],
++                           [systemd], [Systemd support (through polit)])
++
+ dnl Check for debugging support
+ XDT_FEATURE_DEBUG([xfsm_debug_default])
+ 
+diff --git a/xfce4-session/Makefile.am b/xfce4-session/Makefile.am
+index c015154..f748b2b 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 HAVE_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..4c483a7 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);
+@@ -93,7 +96,11 @@ struct _XfsmShutdown
+ {
+   GObject __parent__;
+ 
++#ifdef HAVE_SYSTEMD
++  XfsmSystemd    *systemd;
++#else
+   XfsmConsolekit *consolekit;
++#endif
+   XfsmUPower     *upower;
+ 
+   /* kiosk settings */
+@@ -131,7 +138,11 @@ xfsm_shutdown_init (XfsmShutdown *shutdown)
+ {
+   XfceKiosk *kiosk;
+ 
++#ifdef HAVE_SYSTEMD
++  shutdown->systemd = xfsm_systemd_get ();
++#else
+   shutdown->consolekit = xfsm_consolekit_get ();
++#endif
+   shutdown->upower = xfsm_upower_get ();
+   shutdown->helper_state = SUDO_NOT_INITIAZED;
+   shutdown->helper_require_password = FALSE;
+@@ -150,7 +161,11 @@ xfsm_shutdown_finalize (GObject *object)
+ {
+   XfsmShutdown *shutdown = XFSM_SHUTDOWN (object);
+ 
++#ifdef HAVE_SYSTEMD
++  g_object_unref (G_OBJECT (shutdown->systemd));
++#else
+   g_object_unref (G_OBJECT (shutdown->consolekit));
++#endif
+   g_object_unref (G_OBJECT (shutdown->upower));
+ 
+   /* close down helper */
+@@ -641,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 xfsm_systemd_try_restart (shutdown->systemd, error);
++#else
+     return xfsm_consolekit_try_restart (shutdown->consolekit, error);
++#endif
+ }
+ 
+ 
+@@ -658,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 xfsm_systemd_try_shutdown (shutdown->systemd, error);
++#else
+     return xfsm_consolekit_try_shutdown (shutdown->consolekit, error);
++#endif
+ }
+ 
+ 
+@@ -698,7 +721,11 @@ xfsm_shutdown_can_restart (XfsmShutdown  *shutdown,
+       return TRUE;
+     }
+ 
++#ifdef HAVE_SYSTEMD
++  if (xfsm_systemd_can_restart (shutdown->systemd, can_restart, error))
++#else
+   if (xfsm_consolekit_can_restart (shutdown->consolekit, can_restart, error))
++#endif
+     return TRUE;
+ 
+   if (xfsm_shutdown_sudo_init (shutdown, error))
+@@ -725,7 +752,11 @@ xfsm_shutdown_can_shutdown (XfsmShutdown  *shutdown,
+       return TRUE;
+     }
+ 
++#ifdef HAVE_SYSTEMD
++  if (xfsm_systemd_can_shutdown (shutdown->systemd, can_shutdown, error))
++#else
+   if (xfsm_consolekit_can_shutdown (shutdown->consolekit, can_shutdown, error))
++#endif
+     return TRUE;
+ 
+   if (xfsm_shutdown_sudo_init (shutdown, error))
+diff --git a/xfce4-session/xfsm-systemd.c b/xfce4-session/xfsm-systemd.c
+new file mode 100644
+index 0000000..7bdd39d
+--- /dev/null
++++ b/xfce4-session/xfsm-systemd.c
+@@ -0,0 +1,229 @@
++/*-
++ * Copyright (C) 2012 Christian Hesse
++ *
++ * 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, 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 <dbus/dbus-glib.h>
++#include <dbus/dbus-glib-lowlevel.h>
++
++#include <xfce4-session/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           "Reboot"
++#define SYSTEMD_POWEROFF_ACTION         "PowerOff"
++#define SYSTEMD_REBOOT_TEST             "org.freedesktop.login1.reboot"
++#define SYSTEMD_POWEROFF_TEST           "org.freedesktop.login1.power-off"
++
++
++
++static void     xfsm_systemd_finalize     (GObject         *object);
++
++
++
++struct _XfsmSystemdClass
++{
++  GObjectClass __parent__;
++};
++
++struct _XfsmSystemd
++{
++  GObject __parent__;
++
++  PolkitAuthority *authority;
++  PolkitSubject   *subject;
++};
++
++
++
++G_DEFINE_TYPE (XfsmSystemd, xfsm_systemd, G_TYPE_OBJECT)
++
++
++
++static void
++xfsm_systemd_class_init (XfsmSystemdClass *klass)
++{
++  GObjectClass *gobject_class;
++
++  gobject_class = G_OBJECT_CLASS (klass);
++  gobject_class->finalize = xfsm_systemd_finalize;
++}
++
++
++
++static void
++xfsm_systemd_init (XfsmSystemd *systemd)
++{
++  systemd->authority = polkit_authority_get_sync (NULL, NULL);
++  systemd->subject = polkit_unix_process_new (getpid());
++}
++
++
++
++static void
++xfsm_systemd_finalize (GObject *object)
++{
++  XfsmSystemd *systemd = XFSM_SYSTEMD (object);
++
++  g_object_unref (G_OBJECT (systemd->authority));
++  g_object_unref (G_OBJECT (systemd->subject));
++
++  (*G_OBJECT_CLASS (xfsm_systemd_parent_class)->finalize) (object);
++}
++
++
++static gboolean
++xfsm_systemd_can_method (XfsmSystemd  *systemd,
++                         gboolean     *can_method,
++                         const gchar  *method,
++                         GError      **error)
++{
++  PolkitAuthorizationResult *res;
++  GError                    *local_error = NULL;
++
++  *can_method = FALSE;
++
++  res = polkit_authority_check_authorization_sync (systemd->authority,
++                                                   systemd->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 (G_OBJECT (res));
++
++  return TRUE;
++}
++
++
++
++static gboolean
++xfsm_systemd_try_method (XfsmSystemd  *systemd,
++                         const gchar  *method,
++                         GError      **error)
++{
++  GDBusConnection *bus;
++  GError          *local_error = NULL;
++
++  bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, error);
++  if (G_UNLIKELY (bus == NULL))
++    return FALSE;
++
++  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,
++                               &local_error);
++
++  g_object_unref (G_OBJECT (bus));
++
++  if (local_error != NULL)
++    {
++      g_propagate_error (error, local_error);
++      return FALSE;
++    }
++
++  return TRUE;
++}
++
++
++
++XfsmSystemd *
++xfsm_systemd_get (void)
++{
++  static XfsmSystemd *object = NULL;
++
++  if (G_LIKELY (object != NULL))
++    {
++      g_object_ref (G_OBJECT (object));
++    }
++  else
++    {
++      object = g_object_new (XFSM_TYPE_SYSTEMD, NULL);
++      g_object_add_weak_pointer (G_OBJECT (object), (gpointer) &object);
++    }
++
++  return object;
++}
++
++
++
++gboolean
++xfsm_systemd_try_restart (XfsmSystemd  *systemd,
++                          GError      **error)
++{
++  return xfsm_systemd_try_method (systemd,
++                                  SYSTEMD_REBOOT_ACTION,
++                                  error);
++}
++
++
++
++gboolean
++xfsm_systemd_try_shutdown (XfsmSystemd  *systemd,
++                           GError      **error)
++{
++  return xfsm_systemd_try_method (systemd,
++                                  SYSTEMD_POWEROFF_ACTION,
++                                  error);
++}
++
++
++
++gboolean
++xfsm_systemd_can_restart (XfsmSystemd  *systemd,
++                          gboolean     *can_restart,
++                          GError      **error)
++{
++  return xfsm_systemd_can_method (systemd,
++                                  can_restart,
++                                  SYSTEMD_REBOOT_TEST,
++                                  error);
++}
++
++
++
++gboolean
++xfsm_systemd_can_shutdown (XfsmSystemd  *systemd,
++                           gboolean     *can_shutdown,
++                           GError      **error)
++{
++  return xfsm_systemd_can_method (systemd,
++                                  can_shutdown,
++                                  SYSTEMD_POWEROFF_TEST,
++                                  error);
++}
+diff --git a/xfce4-session/xfsm-systemd.h b/xfce4-session/xfsm-systemd.h
+new file mode 100644
+index 0000000..8223622
+--- /dev/null
++++ b/xfce4-session/xfsm-systemd.h
+@@ -0,0 +1,55 @@
++/* -*- 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 __XFSM_SYSTEMD_H__
++#define __XFSM_SYSTEMD_H__
++
++typedef struct _XfsmSystemdClass XfsmSystemdClass;
++typedef struct _XfsmSystemd      XfsmSystemd;
++
++#define XFSM_TYPE_SYSTEMD            (xfsm_systemd_get_type ())
++#define XFSM_SYSTEMD(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), XFSM_TYPE_SYSTEMD, XfsmSystemd))
++#define XFSM_SYSTEMD_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), XFSM_TYPE_SYSTEMD, XfsmSystemdClass))
++#define XFSM_IS_SYSTEMD(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XFSM_TYPE_SYSTEMD))
++#define XFSM_IS_SYSTEMD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XFSM_TYPE_SYSTEMD))
++#define XFSM_SYSTEMD_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), XFSM_TYPE_SYSTEMD, XfsmSystemdClass))
++
++GType           xfsm_systemd_get_type     (void) G_GNUC_CONST;
++
++XfsmSystemd *xfsm_systemd_get          (void);
++
++gboolean     xfsm_systemd_try_restart  (XfsmSystemd  *systemd,
++                                        GError      **error);
++
++gboolean     xfsm_systemd_try_shutdown (XfsmSystemd  *systemd,
++                                        GError      **error);
++
++gboolean     xfsm_systemd_can_restart  (XfsmSystemd  *systemd,
++                                        gboolean     *can_restart,
++                                        GError      **error);
++
++gboolean     xfsm_systemd_can_shutdown (XfsmSystemd  *systemd,
++                                        gboolean     *can_shutdown,
++                                        GError      **error);
++
++G_END_DECLS
++
++#endif  /* __XFSM_SYSTEMD_H__ */
+--
+cgit v0.9.1
diff --git a/pkgs/desktops/xfce/core/xfce4-session.nix b/pkgs/desktops/xfce/core/xfce4-session.nix
index a8e7e66c7051..a8da711ad0be 100644
--- a/pkgs/desktops/xfce/core/xfce4-session.nix
+++ b/pkgs/desktops/xfce/core/xfce4-session.nix
@@ -1,5 +1,6 @@
 { stdenv, fetchurl, pkgconfig, intltool, gtk, libxfce4util, libxfce4ui, xfce4panel
-, libwnck, dbus_glib, xfconf, libglade, xorg }:
+, libwnck, dbus_glib, xfconf, libglade, xorg
+, polkit, xfce4_dev_tools }:
 
 #TODO: gnome stuff: gconf (assistive?), keyring
 
@@ -14,12 +15,16 @@ stdenv.mkDerivation rec {
   };
   name = "${p_name}-${ver_maj}.${ver_min}";
 
+  patches = [ ./xfce4-session-systemd.patch ];
+
   buildInputs =
     [ pkgconfig intltool gtk libxfce4util libxfce4ui libwnck dbus_glib
       xfconf xfce4panel libglade xorg.iceauth
+      polkit xfce4_dev_tools
     ];
 
-  configureFlags = [ "--with-xsession-prefix=$$out" ];
+  preConfigure = "xdt-autogen";
+  configureFlags = [ "--with-xsession-prefix=$(out)" ];
 
   preFixup = "rm $out/share/icons/hicolor/icon-theme.cache";
 
diff --git a/pkgs/desktops/xfce/default.nix b/pkgs/desktops/xfce/default.nix
index 808266ec82bc..69a725ca1cc0 100644
--- a/pkgs/desktops/xfce/default.nix
+++ b/pkgs/desktops/xfce/default.nix
@@ -35,7 +35,7 @@ xfce_self = rec { # the lines are very long but it seems better than the even-od
   xfwm4           = callPackage ./core/xfwm4.nix { };
 
   xfce4_appfinder = callPackage ./core/xfce4-appfinder.nix { };
-
+  xfce4_dev_tools = callPackage ./core/xfce4-dev-tools.nix { }; # only if autotools are needed
 
   #### APPLICATIONS         from "mirror://xfce/src/apps/${p_name}/${ver_maj}/${name}.tar.bz2"