Convert DeviceKit/Power support to UPower support and remove conditional compilation
authorMarty Jack <martyj@linux.local>
Thu, 8 Apr 2010 14:06:06 +0000 (10:06 -0400)
committerMarty Jack <martyj@linux.local>
Thu, 8 Apr 2010 14:06:06 +0000 (10:06 -0400)
Remove main.c, replaced by the revised lxsession-logout.c some time ago

lxsession-logout/dbus-interface.c
lxsession-logout/dbus-interface.h
lxsession-logout/lxsession-logout.c
lxsession-logout/main.c [deleted file]

index f05b752..940035b 100644 (file)
@@ -54,7 +54,7 @@ static DBusConnection * dbus_connect(void)
 }
 
 /* Send a message. */
-static DBusMessage * dbus_send_message(DBusMessage * message)
+static DBusMessage * dbus_send_message(DBusMessage * message, char * * error_text)
 {
     /* Get a connection handle. */
     DBusConnection * connection = dbus_connect();
@@ -68,36 +68,25 @@ static DBusMessage * dbus_send_message(DBusMessage * message)
     dbus_message_unref(message);
     if (reply == NULL)
     {
-        g_warning(G_STRLOC ": DBUS: %s", error.message);
+        if ((error.name == NULL) || (strcmp(error.name, DBUS_ERROR_NO_REPLY) != 0))
+        {
+            if (error_text != NULL)
+                *error_text = g_strdup(error.message);
+            g_warning(G_STRLOC ": DBUS: %s", error.message);
+        }
         dbus_error_free(&error);
     }
     return reply;
 }
 
-/* Send a message with no reply expected. */
-static gboolean dbus_send_message_without_reply(DBusMessage * message)
-{
-    /* Get a connection handle. */
-    DBusConnection * connection = dbus_connect();
-    if (connection == NULL)
-        return FALSE;
-
-    /* Send the message in the blind. */
-    dbus_bool_t status = dbus_connection_send(connection, message, NULL);
-    dbus_message_unref(message);
-    if ( ! status)
-       g_warning(G_STRLOC ": DBUS: dbus_connection_send failed\n");
-    return status;
-}
-       
 /* Read a result for a method that returns void. */
-static gboolean dbus_read_result_void(DBusMessage * reply)
+static char * dbus_read_result_void(DBusMessage * reply)
 {
     if (reply != NULL)
         dbus_message_unref(reply);
 
     /* No result.  Assume success. */
-    return TRUE;
+    return NULL;
 }
 
 /* Read a result for a method that returns boolean. */
@@ -144,19 +133,21 @@ static DBusMessage * dbus_ConsoleKit_formulate_message(const char * const query)
 static gboolean dbus_ConsoleKit_query(const char * const query)
 {
 #ifdef HAVE_DBUS
-    return dbus_read_result_boolean(dbus_send_message(dbus_ConsoleKit_formulate_message(query)));
+    return dbus_read_result_boolean(dbus_send_message(dbus_ConsoleKit_formulate_message(query), NULL));
 #else
     return FALSE;
 #endif
 }
 
 /* Send a specified message to the ConsoleKit interface and process a void result. */
-static gboolean dbus_ConsoleKit_command(const char * const command)
+static char * dbus_ConsoleKit_command(const char * const command)
 {
 #ifdef HAVE_DBUS
-    return dbus_read_result_void(dbus_send_message(dbus_ConsoleKit_formulate_message(command)));
+    char * error = NULL;
+    dbus_read_result_void(dbus_send_message(dbus_ConsoleKit_formulate_message(command), &error));
+    return error;
 #else
-    return FALSE;
+    return NULL;
 #endif
 }
 
@@ -173,49 +164,49 @@ gboolean dbus_ConsoleKit_CanRestart(void)
 }
 
 /* Invoke the Stop method on ConsoleKit. */
-gboolean dbus_ConsoleKit_Stop(void)
+char * dbus_ConsoleKit_Stop(void)
 {
     return dbus_ConsoleKit_command("Stop");
 }
 
 /* Invoke the Restart method on ConsoleKit. */
-gboolean dbus_ConsoleKit_Restart(void)
+char * dbus_ConsoleKit_Restart(void)
 {
     return dbus_ConsoleKit_command("Restart");
 }
 
-/*** DeviceKit Power mechanism ***/
+/*** UPower mechanism ***/
 
 #ifdef HAVE_DBUS
-/* Formulate a message to the DeviceKit Power interface. */
-static DBusMessage * dbus_DeviceKit_formulate_command(const char * const command)
+/* Formulate a message to the UPower interface. */
+static DBusMessage * dbus_UPower_formulate_command(const char * const command)
 {
     return dbus_message_new_method_call(
-        "org.freedesktop.DeviceKit.Power",
-       "/org/freedesktop/DeviceKit/Power",
-       "org.freedesktop.DeviceKit.Power",
+        "org.freedesktop.UPower",
+       "/org/freedesktop/UPower",
+       "org.freedesktop.UPower",
         command);
 }
 #endif
 
-/* Send a specified message to the DeviceKit interface and process a boolean result. */
-static gboolean dbus_DeviceKit_query(const char * const query)
+/* Send a specified message to the UPower interface and process a boolean result. */
+static gboolean dbus_UPower_query(const char * const query)
 {
 #ifdef HAVE_DBUS
     /* Formulate a message to the Properties interface. */
     DBusMessage * message = dbus_message_new_method_call(
-        "org.freedesktop.DeviceKit.Power",
-       "/org/freedesktop/DeviceKit/Power",
+        "org.freedesktop.UPower",
+       "/org/freedesktop/UPower",
        "org.freedesktop.DBus.Properties",
         "Get");
-    const char * const interface_name = "org.freedesktop.DeviceKit.Power";
+    const char * const interface_name = "org.freedesktop.UPower";
     dbus_message_append_args(message,
         DBUS_TYPE_STRING, &interface_name,
         DBUS_TYPE_STRING, &query,
         DBUS_TYPE_INVALID);
 
     /* Send the message. */
-    DBusMessage * reply = dbus_send_message(message);
+    DBusMessage * reply = dbus_send_message(message, NULL);
     if (reply == NULL)
        return FALSE;
 
@@ -237,39 +228,40 @@ static gboolean dbus_DeviceKit_query(const char * const query)
 #endif
 }
 
-/* Send a specified message to the DeviceKit interface and process a void result. */
-static gboolean dbus_DeviceKit_command(const char * const command)
+/* Send a specified message to the UPower interface and process a void result. */
+static char * dbus_UPower_command(const char * const command)
 {
 #ifdef HAVE_DBUS
-    return dbus_read_result_void(dbus_send_message(dbus_DeviceKit_formulate_command(command)));
-//    return dbus_send_message_without_reply(dbus_DeviceKit_formulate_command(command));       It seems they don't send a reply; to be checked out
+    char * error = NULL;
+    dbus_read_result_void(dbus_send_message(dbus_UPower_formulate_command(command), &error));
+    return error;
 #else
-    return FALSE;
+    return NULL;
 #endif
 }
 
-/* Read the can-suspend property of DeviceKit/Power. */
-gboolean dbus_DeviceKit_CanSuspend(void)
+/* Read the can-suspend property of UPower. */
+gboolean dbus_UPower_CanSuspend(void)
 {
-    return dbus_DeviceKit_query("CanSuspend");
+    return dbus_UPower_query("CanSuspend");
 }
 
-/* Read the can-hibernate property of DeviceKit/Power. */
-gboolean dbus_DeviceKit_CanHibernate(void)
+/* Read the can-hibernate property of UPower. */
+gboolean dbus_UPower_CanHibernate(void)
 {
-    return dbus_DeviceKit_query("CanHibernate");
+    return dbus_UPower_query("CanHibernate");
 }
 
-/* Invoke the Suspend method on DeviceKit/Power. */
-gboolean dbus_DeviceKit_Suspend(void)
+/* Invoke the Suspend method on UPower. */
+char * dbus_UPower_Suspend(void)
 {
-    return dbus_DeviceKit_command("Suspend");
+    return dbus_UPower_command("Suspend");
 }
 
-/* Invoke the Hibernate method on DeviceKit/Power. */
-gboolean dbus_DeviceKit_Hibernate(void)
+/* Invoke the Hibernate method on UPower. */
+char * dbus_UPower_Hibernate(void)
 {
-    return dbus_DeviceKit_command("Hibernate");
+    return dbus_UPower_command("Hibernate");
 }
 
 /*** HAL mechanism ***/
@@ -318,7 +310,7 @@ static gboolean dbus_HAL_string_exists_query(const char * const property)
     DBusMessage * message = dbus_HAL_formulate_string_property_query(property);
     if (message == NULL)
         return FALSE;
-    DBusMessage * reply = dbus_send_message(message);
+    DBusMessage * reply = dbus_send_message(message, NULL);
     if (reply == NULL)
        return FALSE;
     dbus_message_unref(reply);
@@ -332,20 +324,20 @@ static gboolean dbus_HAL_string_exists_query(const char * const property)
 static gboolean dbus_HAL_boolean_query(const char * const property)
 {
 #ifdef HAVE_DBUS
-    return dbus_read_result_boolean(dbus_send_message(dbus_HAL_formulate_boolean_property_query(property)));
+    return dbus_read_result_boolean(dbus_send_message(dbus_HAL_formulate_boolean_property_query(property), NULL));
 #else
     return FALSE;
 #endif
 }
 
 /* Send a specified message to the HAL interface and process a void result. */
-static gboolean dbus_HAL_command(const char * const command)
+static char * dbus_HAL_command(const char * const command)
 {
 #ifdef HAVE_DBUS
     /* Formulate the message. */
     DBusMessage * message = dbus_HAL_formulate_message(command);
     if (message == NULL)
-       return FALSE;
+        return NULL;
 
     /* Suspend has an argument. */
     if (strcmp(command, "Suspend") == 0)
@@ -355,9 +347,11 @@ static gboolean dbus_HAL_command(const char * const command)
     }
 
     /* Send the message and wait for a reply. */
-    return dbus_read_result_void(dbus_send_message(message));
+    char * error = NULL;
+    dbus_read_result_void(dbus_send_message(message, &error));
+    return error;
 #else
-    return FALSE;
+    return NULL;
 #endif
 }
 
@@ -386,25 +380,25 @@ gboolean dbus_HAL_CanHibernate(void)
 }
 
 /* Invoke the Shutdown method on HAL. */
-gboolean dbus_HAL_Shutdown(void)
+char * dbus_HAL_Shutdown(void)
 {
     return dbus_HAL_command("Shutdown");
 }
 
 /* Invoke the Reboot method on HAL. */
-gboolean dbus_HAL_Reboot(void)
+char * dbus_HAL_Reboot(void)
 {
     return dbus_HAL_command("Reboot");
 }
 
 /* Invoke the Suspend method on HAL. */
-gboolean dbus_HAL_Suspend(void)
+char * dbus_HAL_Suspend(void)
 {
     return dbus_HAL_command("Suspend");
 }
 
 /* Invoke the Hibernate method on HAL. */
-gboolean dbus_HAL_Hibernate(void)
+char * dbus_HAL_Hibernate(void)
 {
     return dbus_HAL_command("Hibernate");
 }
index 465d15a..4ea2d5b 100644 (file)
 /* Interface to ConsoleKit for shutdown and reboot. */
 extern gboolean dbus_ConsoleKit_CanStop(void);
 extern gboolean dbus_ConsoleKit_CanRestart(void);
-extern gboolean dbus_ConsoleKit_Stop(void);
-extern gboolean dbus_ConsoleKit_Restart(void);
+extern char * dbus_ConsoleKit_Stop(void);
+extern char * dbus_ConsoleKit_Restart(void);
 
-/* Interface to DeviceKit/Power for suspend and hibernate. */
-extern gboolean dbus_DeviceKit_CanSuspend(void);
-extern gboolean dbus_DeviceKit_CanHibernate(void);
-extern gboolean dbus_DeviceKit_Suspend(void);
-extern gboolean dbus_DeviceKit_Hibernate(void);
+/* Interface to UPower for suspend and hibernate. */
+extern gboolean dbus_UPower_CanSuspend(void);
+extern gboolean dbus_UPower_CanHibernate(void);
+extern char * dbus_UPower_Suspend(void);
+extern char * dbus_UPower_Hibernate(void);
 
 /* Interface to HAL for shutdown, reboot, suspend, and hibernate.
  * HAL is being replaced by the above two mechanisms; this support is legacy. */
@@ -39,9 +39,9 @@ extern gboolean dbus_HAL_CanShutdown(void);
 extern gboolean dbus_HAL_CanReboot(void);
 extern gboolean dbus_HAL_CanSuspend(void);
 extern gboolean dbus_HAL_CanHibernate(void);
-gboolean dbus_HAL_Shutdown(void);
-gboolean dbus_HAL_Reboot(void);
-gboolean dbus_HAL_Suspend(void);
-gboolean dbus_HAL_Hibernate(void);
+extern char * dbus_HAL_Shutdown(void);
+extern char * dbus_HAL_Reboot(void);
+extern char * dbus_HAL_Suspend(void);
+extern char * dbus_HAL_Hibernate(void);
 
 #endif
index a4183fc..435216c 100644 (file)
@@ -52,6 +52,7 @@ static GOptionEntry opt_entries[] =
 
 typedef struct {
     GPid lxsession_pid;                        /* Process ID of lxsession */
+    GtkWidget * error_label;           /* Text of an error, if we get one */
 
     int shutdown_available : 1;                /* Shutdown is available */
     int reboot_available : 1;          /* Reboot is available */
@@ -61,19 +62,20 @@ typedef struct {
 
     int shutdown_ConsoleKit : 1;       /* Shutdown is available via ConsoleKit */
     int reboot_ConsoleKit : 1;         /* Reboot is available via ConsoleKit */
-    int suspend_DeviceKit : 1;         /* Suspend is available via DeviceKit */
-    int hibernate_DeviceKit : 1;       /* Hibernate is available via DeviceKit */
+    int suspend_UPower : 1;            /* Suspend is available via UPower */
+    int hibernate_UPower : 1;          /* Hibernate is available via UPower */
     int shutdown_HAL : 1;              /* Shutdown is available via HAL */
     int reboot_HAL : 1;                        /* Reboot is available via HAL */
     int suspend_HAL : 1;               /* Suspend is available via HAL */
     int hibernate_HAL : 1;             /* Hibernate is available via HAL */
     int switch_user_GDM : 1;           /* Switch User is available via GDM */
     int switch_user_KDM : 1;           /* Switch User is available via KDM */
-    int ltsp : 1; /* under LTSP environment */
+    int ltsp : 1;                      /* Shutdown and reboot is accomplished via LTSP */
 } HandlerContext;
 
 static gboolean verify_running(char * display_manager, char * executable);
 static void logout_clicked(GtkButton * button, HandlerContext * handler_context);
+static void change_root_property(GtkWidget* w, const char* prop_name, const char* value);
 static void shutdown_clicked(GtkButton * button, HandlerContext * handler_context);
 static void reboot_clicked(GtkButton * button, HandlerContext * handler_context);
 static void suspend_clicked(GtkButton * button, HandlerContext * handler_context);
@@ -145,6 +147,7 @@ static void logout_clicked(GtkButton * button, HandlerContext * handler_context)
     gtk_main_quit();
 }
 
+/* Replace a property on the root window. */
 static void change_root_property(GtkWidget* w, const char* prop_name, const char* value)
 {
     GdkDisplay* dpy = gtk_widget_get_display(w);
@@ -157,56 +160,82 @@ static void change_root_property(GtkWidget* w, const char* prop_name, const char
 /* Handler for "clicked" signal on Shutdown button. */
 static void shutdown_clicked(GtkButton * button, HandlerContext * handler_context)
 {
-    if (G_UNLIKELY(handler_context->ltsp))
+    char * error_result = NULL;
+    gtk_label_set_text(GTK_LABEL(handler_context->error_label), NULL);
+
+    if (handler_context->ltsp)
     {
         change_root_property(GTK_WIDGET(button), "LTSP_LOGOUT_ACTION", "HALT");
         kill(handler_context->lxsession_pid, SIGTERM);
     }
     else if (handler_context->shutdown_ConsoleKit)
-        dbus_ConsoleKit_Stop();
+        error_result = dbus_ConsoleKit_Stop();
     else if (handler_context->shutdown_HAL)
-        dbus_HAL_Shutdown();
-    gtk_main_quit();
+        error_result = dbus_HAL_Shutdown();
+
+    if (error_result != NULL)
+        gtk_label_set_text(GTK_LABEL(handler_context->error_label), error_result);
+        else gtk_main_quit();
 }
 
 /* Handler for "clicked" signal on Reboot button. */
 static void reboot_clicked(GtkButton * button, HandlerContext * handler_context)
 {
-    if (G_UNLIKELY(handler_context->ltsp))
+    char * error_result = NULL;
+    gtk_label_set_text(GTK_LABEL(handler_context->error_label), NULL);
+
+    if (handler_context->ltsp)
     {
         change_root_property(GTK_WIDGET(button), "LTSP_LOGOUT_ACTION", "REBOOT");
         kill(handler_context->lxsession_pid, SIGTERM);
     }
     else if (handler_context->reboot_ConsoleKit)
-        dbus_ConsoleKit_Restart();
+        error_result = dbus_ConsoleKit_Restart();
     else if (handler_context->reboot_HAL)
-        dbus_HAL_Reboot();
-    gtk_main_quit();
+        error_result = dbus_HAL_Reboot();
+
+    if (error_result != NULL)
+        gtk_label_set_text(GTK_LABEL(handler_context->error_label), error_result);
+        else gtk_main_quit();
 }
 
 /* Handler for "clicked" signal on Suspend button. */
 static void suspend_clicked(GtkButton * button, HandlerContext * handler_context)
 {
-    if (handler_context->suspend_DeviceKit)
-        dbus_DeviceKit_Suspend();
+    char * error_result = NULL;
+    gtk_label_set_text(GTK_LABEL(handler_context->error_label), NULL);
+
+    if (handler_context->suspend_UPower)
+        error_result = dbus_UPower_Suspend();
     else if (handler_context->suspend_HAL)
-        dbus_HAL_Suspend();
-    gtk_main_quit();
+        error_result = dbus_HAL_Suspend();
+
+    if (error_result != NULL)
+        gtk_label_set_text(GTK_LABEL(handler_context->error_label), error_result);
+        else gtk_main_quit();
 }
 
 /* Handler for "clicked" signal on Hibernate button. */
 static void hibernate_clicked(GtkButton * button, HandlerContext * handler_context)
 {
-    if (handler_context->hibernate_DeviceKit)
-        dbus_DeviceKit_Hibernate();
+    char * error_result = NULL;
+    gtk_label_set_text(GTK_LABEL(handler_context->error_label), NULL);
+
+    if (handler_context->hibernate_UPower)
+        error_result = dbus_UPower_Hibernate();
     else if (handler_context->hibernate_HAL)
-        dbus_HAL_Hibernate();
-    gtk_main_quit();
+        error_result = dbus_HAL_Hibernate();
+
+    if (error_result != NULL)
+        gtk_label_set_text(GTK_LABEL(handler_context->error_label), error_result);
+        else gtk_main_quit();
 }
 
 /* Handler for "clicked" signal on Switch User button. */
 static void switch_user_clicked(GtkButton * button, HandlerContext * handler_context)
 {
+    gtk_label_set_text(GTK_LABEL(handler_context->error_label), NULL);
+
     if (handler_context->switch_user_GDM)
         g_spawn_command_line_sync("gdmflexiserver --startnew", NULL, NULL, NULL, NULL);
     else if (handler_context->switch_user_KDM)
@@ -341,19 +370,17 @@ int main(int argc, char * argv[])
         handler_context.reboot_ConsoleKit = TRUE;
     }
 
-#ifdef LATENT_DEVICEKIT_SUPPORT
-    /* Initialize capabilities of the DeviceKit mechanism. */
-    if (dbus_DeviceKit_CanSuspend())
+    /* Initialize capabilities of the UPower mechanism. */
+    if (dbus_UPower_CanSuspend())
     {
         handler_context.suspend_available = TRUE;
-        handler_context.suspend_DeviceKit = TRUE;
+        handler_context.suspend_UPower = TRUE;
     }
-    if (dbus_DeviceKit_CanHibernate())
+    if (dbus_UPower_CanHibernate())
     {
         handler_context.hibernate_available = TRUE;
-        handler_context.hibernate_DeviceKit = TRUE;
+        handler_context.hibernate_UPower = TRUE;
     }
-#endif
 
     /* Initialize capabilities of the HAL mechanism. */
     if (!handler_context.shutdown_available && dbus_HAL_CanShutdown())
@@ -552,6 +579,11 @@ int main(int argc, char * argv[])
     g_signal_connect(G_OBJECT(cancel_button), "clicked", G_CALLBACK(cancel_clicked), NULL);
     gtk_box_pack_start(GTK_BOX(controls), cancel_button, FALSE, FALSE, 4);
 
+    /* Create the error text. */
+    handler_context.error_label = gtk_label_new("");
+    gtk_label_set_justify(GTK_LABEL(handler_context.error_label), GTK_JUSTIFY_CENTER);
+    gtk_box_pack_start(GTK_BOX(controls), handler_context.error_label, FALSE, FALSE, 4);
+
     /* Show everything. */
     gtk_widget_show_all(window);
 
diff --git a/lxsession-logout/main.c b/lxsession-logout/main.c
deleted file mode 100644 (file)
index 4f052ac..0000000
+++ /dev/null
@@ -1,531 +0,0 @@
-/*
- *      main.c -lxsession-logout for LXSession
- *
- *      Copyright 2008 PCMan <pcman.tw@gmail.com>
- *      Copyright (c) 2003-2006 Benedikt Meurer <benny@xfce.org>
- *
- *      HAL-related parts are taken from xfsm-shutdown-helper.c of
- *      xfce4-session originally written by Benedikt Meurer, with some
- *      modification to be used in this project.
- *
- *      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 <gtk/gtk.h>
-#include <glib/gi18n.h>
-#include <signal.h>
-#include <gdk/gdk.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <locale.h>
-
-#include "gdm-logout-action.h"
-
-#ifdef HAVE_HAL
-#include <dbus/dbus.h>
-#endif
-
-typedef enum {
-        LOGOUT_ACTION_NONE     = GDM_LOGOUT_ACTION_NONE,
-        LOGOUT_ACTION_SHUTDOWN = GDM_LOGOUT_ACTION_SHUTDOWN,
-        LOGOUT_ACTION_REBOOT   = GDM_LOGOUT_ACTION_REBOOT,
-        LOGOUT_ACTION_SUSPEND  = GDM_LOGOUT_ACTION_SUSPEND,
-        LOGOUT_ACTION_HIBERNATE = GDM_LOGOUT_ACTION_SUSPEND << 1,    /* HAL only */
-        LOGOUT_ACTION_SWITCH_USER = GDM_LOGOUT_ACTION_SUSPEND << 2   /* not supported */
-}LogoutAction;
-
-static gboolean use_hal = FALSE;
-static LogoutAction available_actions = GDM_LOGOUT_ACTION_NONE;
-
-static char* prompt = NULL;
-static char* side = NULL;
-static char* banner = NULL;
-
-static GOptionEntry opt_entries[] =
-{
-    { "prompt", 'p', 0, G_OPTION_ARG_STRING, &prompt, N_("Custom message to show on the dialog"), N_("message") },
-    { "banner", 'b', 0, G_OPTION_ARG_STRING, &banner, N_("Banner to show on the dialog"), N_("image file") },
-    { "side", 's', 0, G_OPTION_ARG_STRING, &side, N_("Position of the banner"), "top|left|right|botom" },
-/*    {G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &files, NULL, N_("[FILE1, FILE2,...]")}, */
-    { NULL }
-};
-
-static gboolean on_expose( GtkWidget* w, GdkEventExpose* evt, GdkPixbuf* shot )
-{
-    if( GTK_WIDGET_REALIZED(w) && GDK_IS_DRAWABLE(w->window) )
-    {
-        gdk_draw_pixbuf( w->window, w->style->black_gc, shot,
-                                    evt->area.x, evt->area.y,
-                                    evt->area.x, evt->area.y,
-                                    evt->area.width, evt->area.height,
-                                    GDK_RGB_DITHER_NORMAL, 0, 0 );
-    }
-    return TRUE;
-}
-
-static GtkWidget* create_background()
-{
-    GtkWidget *back = NULL, *img;
-    GdkPixbuf *tmp, *shot;
-    GdkScreen *screen;
-
-    guchar *pixels, *p;
-    int x, y, width, height, rowstride;
-    gboolean has_alpha;
-
-    screen = gdk_screen_get_default();
-
-    shot = gdk_pixbuf_get_from_drawable( NULL,
-                                         gdk_get_default_root_window(),
-                                         NULL,
-                                         0, 0, 0, 0,
-                                         gdk_screen_get_width(screen),
-                                         gdk_screen_get_height(screen) );
-
-    /* make the background darker */
-    pixels = gdk_pixbuf_get_pixels(shot);
-    width = gdk_pixbuf_get_width(shot);
-    height = gdk_pixbuf_get_height(shot);
-    has_alpha = gdk_pixbuf_get_has_alpha(shot);
-    rowstride = gdk_pixbuf_get_rowstride(shot);
-    
-    for (y = 0; y < height; y++)
-    {
-        p = pixels;
-        for (x = 0; x < width; x++)
-        {
-            p[0] = p[0] / 2;
-            p[1] = p[1] / 2;
-            p[2] = p[2] / 2;
-            if( has_alpha )
-                p += 4;
-            else
-                p += 3;
-        }
-        pixels += rowstride;
-    }
-     
-    back = gtk_window_new( GTK_WINDOW_TOPLEVEL );
-    gtk_widget_set_app_paintable( back, TRUE );
-    gtk_widget_set_double_buffered( back, FALSE );
-    g_signal_connect( back, "expose-event", G_CALLBACK(on_expose), shot );
-    g_object_weak_ref( (GObject *) back, (GWeakNotify)g_object_unref,  shot );
-
-    gtk_window_fullscreen( GTK_WINDOW(back) );
-    gtk_window_set_decorated( GTK_WINDOW(back), FALSE );
-    gtk_window_set_keep_above( GTK_WINDOW(back), TRUE );
-    gtk_widget_show_all( GTK_WIDGET(back) );
-
-    return back;
-}
-
-static void btn_clicked( GtkWidget* btn, gpointer id )
-{
-    GtkWidget* dlg = gtk_widget_get_toplevel( btn );
-    gtk_dialog_response( GTK_DIALOG(dlg), GPOINTER_TO_INT(id) );
-}
-
-static GtkWidget* create_dlg_btn(const char* label, const char* icon, int response )
-{
-    GtkWidget* btn = gtk_button_new_with_mnemonic( label );
-    gtk_button_set_alignment( GTK_BUTTON(btn), 0.0, 0.5 );
-    g_signal_connect( btn, "clicked", G_CALLBACK(btn_clicked), GINT_TO_POINTER(response) );
-    if( icon )
-    {
-        GtkWidget* img = gtk_image_new_from_icon_name( icon, GTK_ICON_SIZE_BUTTON );
-        gtk_button_set_image( GTK_BUTTON(btn), img );
-    }
-    return btn;
-}
-
-GtkPositionType get_banner_position()
-{
-    if( side )
-    {
-        if( 0 == strcmp( side, "right" ) )
-            return GTK_POS_RIGHT;
-        if( 0 == strcmp( side, "top" ) )
-            return GTK_POS_TOP;
-        if( 0 == strcmp( side, "bottom" ) )
-            return GTK_POS_BOTTOM;
-    }
-    return GTK_POS_LEFT;
-}
-
-/*
- *  These functions with the prefix "xfsm_" are taken from
- *  xfsm-shutdown-helper.c of xfce4-session with some modification.
- *  Copyright (c) 2003-2006 Benedikt Meurer <benny@xfce.org>
- */
-static gboolean xfsm_shutdown_helper_hal_check ()
-{
-#ifdef HAVE_HAL
-    DBusConnection *connection;
-    DBusMessage        *message;
-    DBusMessage        *result;
-    DBusError             error;
-
-    /* initialize the error */
-    dbus_error_init (&error);
-
-    /* connect to the system message bus */
-    connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
-    if (G_UNLIKELY (connection == NULL))
-    {
-        g_warning (G_STRLOC ": Failed to connect to the system message bus: %s", error.message);
-        dbus_error_free (&error);
-        return FALSE;
-    }
-
-    /* this is a simple trick to check whether we are allowed to
-     * use the org.freedesktop.Hal.Device.SystemPowerManagement
-     * interface without shutting down/rebooting now.
-     */
-    message = dbus_message_new_method_call ("org.freedesktop.Hal",
-                                            "/org/freedesktop/Hal/devices/computer",
-                                            "org.freedesktop.Hal.Device.SystemPowerManagement",
-                                            "ThisMethodMustNotExistInHal");
-    result = dbus_connection_send_with_reply_and_block (connection, message, 2000, &error);
-    dbus_message_unref (message);
-
-    /* translate error results appropriately */
-    if (result != NULL && dbus_set_error_from_message (&error, result))
-    {
-        /* release and reset the result */
-        dbus_message_unref (result);
-        result = NULL;
-    }
-    else if (G_UNLIKELY (result != NULL))
-    {
-        /* we received a valid message return?! HAL must be on crack! */
-        dbus_message_unref (result);
-        return FALSE;
-    }
-
-    /* if we receive org.freedesktop.DBus.Error.UnknownMethod, then
-     * we are allowed to shutdown/reboot the computer via HAL.
-     */
-    if (strcmp (error.name, "org.freedesktop.DBus.Error.UnknownMethod") == 0)
-    {
-        dbus_error_free (&error);
-        return TRUE;
-    }
-
-    /* otherwise, we failed for some reason */
-    g_warning (G_STRLOC ": Failed to contact HAL: %s", error.message);
-    dbus_error_free (&error);
-#endif
-
-    return FALSE;
-}
-
-/*
- *  These functions with the prefix "xfsm_" are taken from
- *  xfsm-shutdown-helper.c of xfce4-session with some modification.
- *  Copyright (c) 2003-2006 Benedikt Meurer <benny@xfce.org>
- */
-static gboolean
-xfsm_shutdown_helper_hal_send ( LogoutAction action )
-{
-#ifdef HAVE_HAL
-    DBusConnection *connection;
-    DBusMessage        *message;
-    DBusMessage        *result;
-    DBusError             error;
-    const char* method;
-    dbus_int32_t suspend_arg = 0;
-
-    /* The spec:
-     http://people.freedesktop.org/~david/hal-spec/hal-spec.html#interface-device-systempower */
-    switch( action )
-    {
-    case LOGOUT_ACTION_SHUTDOWN:
-        method = "Shutdown";
-        break;
-    case LOGOUT_ACTION_REBOOT:
-        method = "Reboot";
-        break;
-    case LOGOUT_ACTION_SUSPEND:
-        method = "Suspend";
-        break;
-    case LOGOUT_ACTION_HIBERNATE:
-        method = "Hibernate";
-        break;
-    default:
-        return FALSE;    /* It's impossible to reach here, or it's a bug. */
-    }
-
-    /* initialize the error */
-    dbus_error_init (&error);
-
-    /* connect to the system message bus */
-    connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
-    if (G_UNLIKELY (connection == NULL))
-    {
-        g_warning (G_STRLOC ": Failed to connect to the system message bus: %s", error.message);
-        dbus_error_free (&error);
-        return FALSE;
-    }
-
-    /* send the appropriate message to HAL, telling it to shutdown or reboot the system */
-    message = dbus_message_new_method_call ("org.freedesktop.Hal",
-                                                                                    "/org/freedesktop/Hal/devices/computer",
-                                                                                    "org.freedesktop.Hal.Device.SystemPowerManagement",
-                                                                                    method );
-    if( action == LOGOUT_ACTION_SUSPEND )
-        dbus_message_append_args( message, DBUS_TYPE_INT32, &suspend_arg, DBUS_TYPE_INVALID );
-
-    result = dbus_connection_send_with_reply_and_block (connection, message, 2000, &error);
-    dbus_message_unref (message);
-
-    /* check if we received a result */
-    if (G_UNLIKELY (result == NULL))
-    {
-        g_warning (G_STRLOC ": Failed to contact HAL: %s", error.message);
-        dbus_error_free (&error);
-        return FALSE;
-    }
-
-    /* pretend that we succeed */
-    dbus_message_unref (result);
-    return TRUE;
-#else
-    return FALSE;
-#endif
-}
-
-static void check_available_actions()
-{
-    /* check if we can use HAL to shutdown the computer */
-    use_hal = xfsm_shutdown_helper_hal_check ();
-    if( use_hal )   /* check if hal is available */
-    {
-        available_actions = LOGOUT_ACTION_SHUTDOWN | LOGOUT_ACTION_REBOOT | LOGOUT_ACTION_SUSPEND | LOGOUT_ACTION_HIBERNATE;
-    }
-    else /* check if gdm is available */
-    {
-        if( gdm_supports_logout_action(GDM_LOGOUT_ACTION_SHUTDOWN) )
-            available_actions |= GDM_LOGOUT_ACTION_SHUTDOWN;
-        if( gdm_supports_logout_action(GDM_LOGOUT_ACTION_REBOOT) )
-            available_actions |= GDM_LOGOUT_ACTION_REBOOT;
-        if( gdm_supports_logout_action(GDM_LOGOUT_ACTION_SUSPEND) )
-            available_actions |= GDM_LOGOUT_ACTION_SUSPEND;
-    }
-}
-
-int main( int argc, char** argv )
-{
-    GtkWidget *back = NULL, *dlg, *check, *btn, *label, *box = NULL, *vbox;
-    GtkPositionType banner_pos;
-    int res;
-    const char* p;
-    char* file;
-    GPid pid;
-    GOptionContext *context;
-    GError* err = NULL;
-    gboolean composited;
-
-#ifdef ENABLE_NLS
-    setlocale(LC_ALL, "");
-    bindtextdomain ( GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR );
-    bind_textdomain_codeset ( GETTEXT_PACKAGE, "UTF-8" );
-    textdomain ( GETTEXT_PACKAGE );
-#endif
-
-    p = g_getenv("_LXSESSION_PID");
-    if( ! p || (pid = atoi( p)) == 0 )
-    {
-        g_print( _("Error: %s\n"), _("LXSession is not running." ));
-        return 1;
-    }
-
-    /* parse command line arguments */
-    context = g_option_context_new ("");
-    g_option_context_add_main_entries (context, opt_entries, GETTEXT_PACKAGE);
-    g_option_context_add_group (context, gtk_get_option_group(TRUE));
-    /* gtk_init( &argc, &argv ); is not needed if g_option_context_parse is called */
-    if( G_UNLIKELY( ! g_option_context_parse (context, &argc, &argv, &err) ) )
-    {
-        g_print( _("Error: %s\n"), err->message );
-        g_error_free( err );
-        return 1;
-    }
-    g_option_context_free( context );
-
-    back = create_background();
-
-    /* check if the window is composited */
-    composited = gtk_widget_is_composited( back );
-
-    gtk_icon_theme_append_search_path( gtk_icon_theme_get_default(),
-                                            PACKAGE_DATA_DIR "/lxsession/images" );
-
-    dlg = gtk_dialog_new_with_buttons( _("Logout"), (GtkWindow*)back, GTK_DIALOG_MODAL,
-                                               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL );
-    gtk_container_set_border_width( (GtkContainer*)dlg, 6 );
-    vbox = ((GtkDialog*)dlg)->vbox;
-
-    if( banner )
-    {
-        GtkWidget* img = gtk_image_new_from_file( banner );
-        banner_pos = get_banner_position();
-        switch( banner_pos )
-        {
-        case GTK_POS_LEFT:
-        case GTK_POS_RIGHT:
-            box = gtk_hbox_new( FALSE,2 );
-            gtk_box_pack_start( GTK_BOX(vbox), box, TRUE, TRUE, 2 );
-
-            if( banner_pos == GTK_POS_LEFT )
-            {
-                gtk_box_pack_start( GTK_BOX(box), img, FALSE, TRUE, 2 );
-                gtk_box_pack_start( GTK_BOX(box), gtk_vseparator_new(), FALSE, TRUE, 2 );
-            }
-            else
-            {
-                gtk_box_pack_end( GTK_BOX(box), img, FALSE, TRUE, 2 );
-                gtk_box_pack_end( GTK_BOX(box), gtk_vseparator_new(), FALSE, TRUE, 2 );
-            }
-            vbox = gtk_vbox_new( FALSE, 2 );
-            gtk_box_pack_start( GTK_BOX(box), vbox, TRUE, TRUE, 2 );
-            gtk_misc_set_alignment( GTK_MISC(img), 0.5, 0.0 );
-            break;
-        case GTK_POS_TOP:
-        case GTK_POS_BOTTOM:
-            if( banner_pos == GTK_POS_TOP )
-            {
-                gtk_box_pack_start( GTK_BOX(vbox), img, FALSE, TRUE, 2 );
-                gtk_box_pack_start( GTK_BOX(vbox), gtk_hseparator_new(), FALSE, TRUE, 2 );
-            }
-            else
-            {
-                gtk_box_pack_end( GTK_BOX(vbox), img, FALSE, TRUE, 2 );
-                gtk_box_pack_end( GTK_BOX(vbox), gtk_hseparator_new(), FALSE, TRUE, 2 );
-            }
-            break;
-        }
-    }
-
-    label = gtk_label_new("");
-    if( ! prompt ) {
-        const char* session_name = g_getenv("DESKTOP_SESSION");
-        if( ! session_name )
-            session_name = "LXDE";
-        /* %s is the name of the desktop session */
-        prompt = g_strdup_printf( _("<b><big>Logout %s session?</big></b>"), session_name );
-    }
-
-    gtk_label_set_markup( GTK_LABEL(label), prompt );
-    gtk_box_pack_start( GTK_BOX(vbox), label, FALSE, FALSE, 4 );
-
-    check_available_actions();
-
-    if( available_actions & LOGOUT_ACTION_SHUTDOWN )
-    {
-        btn = create_dlg_btn(_("Sh_utdown"), "system-shutdown", LOGOUT_ACTION_SHUTDOWN );
-        gtk_box_pack_start( GTK_BOX(vbox), btn, FALSE, FALSE, 4 );
-    }
-    if( available_actions & LOGOUT_ACTION_REBOOT )
-    {
-        btn = create_dlg_btn(_("_Reboot"), "gnome-session-reboot", LOGOUT_ACTION_REBOOT );
-        gtk_box_pack_start( GTK_BOX(vbox), btn, FALSE, FALSE, 4 );
-    }
-    if( available_actions & LOGOUT_ACTION_SUSPEND )
-    {
-        btn = create_dlg_btn(_("_Suspend"), "gnome-session-suspend", LOGOUT_ACTION_SUSPEND );
-        gtk_box_pack_start( GTK_BOX(vbox), btn, FALSE, FALSE, 4 );
-    }
-    if( available_actions & LOGOUT_ACTION_HIBERNATE )
-    {
-        btn = create_dlg_btn(_("_Hibernate"), "gnome-session-hibernate", LOGOUT_ACTION_HIBERNATE );
-        gtk_box_pack_start( GTK_BOX(vbox), btn, FALSE, FALSE, 4 );
-    }
-
-    /* If GDM or KDM is running */
-    if( g_file_test("/var/run/gdm_socket", G_FILE_TEST_EXISTS)
-        || g_file_test("/tmp/.gdm_socket", G_FILE_TEST_EXISTS)
-        || g_file_test("/var/run/kdm.pid", G_FILE_TEST_EXISTS) )
-    {
-        btn = create_dlg_btn(_("S_witch User"), "gnome-session-switch", LOGOUT_ACTION_SWITCH_USER );
-        gtk_box_pack_start( GTK_BOX(vbox), btn, FALSE, FALSE, 4 );
-    }
-
-    btn = create_dlg_btn(_("_Logout"), "system-log-out", GTK_RESPONSE_OK );
-    gtk_box_pack_start( GTK_BOX(vbox), btn, FALSE, FALSE, 4 );
-
-    gtk_window_set_position( GTK_WINDOW(dlg), GTK_WIN_POS_CENTER_ALWAYS );
-    gtk_window_set_decorated( GTK_WINDOW(dlg), FALSE );
-    gtk_widget_show_all( dlg );
-
-    gtk_window_set_keep_above( (GtkWindow*)dlg, TRUE );
-
-    gdk_pointer_grab( dlg->window, TRUE, 0, NULL, NULL, GDK_CURRENT_TIME );
-    gdk_keyboard_grab( dlg->window, TRUE, GDK_CURRENT_TIME );
-//  if( !composited ) gdk_x11_grab_server();
-
-    switch( (res = gtk_dialog_run( (GtkDialog*)dlg )) )
-    {
-        case LOGOUT_ACTION_SHUTDOWN:
-        case LOGOUT_ACTION_REBOOT:
-        case LOGOUT_ACTION_SUSPEND:
-        case LOGOUT_ACTION_HIBERNATE:
-        case LOGOUT_ACTION_SWITCH_USER:
-        case GTK_RESPONSE_OK:
-            break;
-        default:
-            gtk_widget_destroy( dlg );
-            gtk_widget_destroy( back );
-            gdk_pointer_ungrab( GDK_CURRENT_TIME );
-            gdk_keyboard_ungrab( GDK_CURRENT_TIME );
-            return 0;
-    }
-//  if( !composited ) gdk_x11_ungrab_server();
-    gdk_pointer_ungrab( GDK_CURRENT_TIME );
-    gdk_keyboard_ungrab( GDK_CURRENT_TIME );
-
-    gtk_widget_destroy( dlg );
-    gtk_widget_destroy( back );
-
-    if( res != GTK_RESPONSE_OK )
-    {
-        if( res == LOGOUT_ACTION_SWITCH_USER )
-        {
-                   if( g_file_test("/var/run/gdm_socket", G_FILE_TEST_EXISTS) || g_file_test("/tmp/.gdm_socket", G_FILE_TEST_EXISTS) )
-               g_spawn_command_line_sync ("gdmflexiserver --startnew", NULL, NULL, NULL, NULL);
-            else if ( g_file_test("/var/run/kdm.pid", G_FILE_TEST_EXISTS) )
-               g_spawn_command_line_sync ("kdmctl reserve", NULL, NULL, NULL, NULL);
-            return 0;
-        }
-
-        if( use_hal )
-            xfsm_shutdown_helper_hal_send( res );
-        else
-            gdm_set_logout_action( res );
-
-        if( res != LOGOUT_ACTION_SUSPEND && res != LOGOUT_ACTION_HIBERNATE )
-            kill( pid, SIGTERM );   /* ask the session manager to do fast logout */
-    }
-    else
-    {
-        kill( pid, SIGUSR1 );   /* ask the session manager to slow log out */
-    }
-
-    return 0;
-}