diff options
Diffstat (limited to 'src/gtk-dialog')
-rw-r--r-- | src/gtk-dialog/Makefile.am | 13 | ||||
-rw-r--r-- | src/gtk-dialog/ck-pk-helper.c | 214 | ||||
-rw-r--r-- | src/gtk-dialog/ck-pk-helper.h | 10 | ||||
-rw-r--r-- | src/gtk-dialog/gtk-logout-helper.c | 134 | ||||
-rw-r--r-- | src/gtk-dialog/logout-dialog.c | 367 | ||||
-rw-r--r-- | src/gtk-dialog/logout-dialog.h | 99 |
6 files changed, 837 insertions, 0 deletions
diff --git a/src/gtk-dialog/Makefile.am b/src/gtk-dialog/Makefile.am new file mode 100644 index 0000000..9aa0097 --- /dev/null +++ b/src/gtk-dialog/Makefile.am @@ -0,0 +1,13 @@ + +libexec_PROGRAMS = gtk-logout-helper + +gtk_logout_helper_SOURCES = \ + gtk-logout-helper.c \ + ck-pk-helper.c \ + ck-pk-helper.h \ + logout-dialog.c \ + logout-dialog.h + +gtk_logout_helper_CFLAGS = $(GTKLOGOUTHELPER_CFLAGS) -Wall -Werror +gtk_logout_helper_LDADD = $(GTKLOGOUTHELPER_LIBS) + diff --git a/src/gtk-dialog/ck-pk-helper.c b/src/gtk-dialog/ck-pk-helper.c new file mode 100644 index 0000000..9278905 --- /dev/null +++ b/src/gtk-dialog/ck-pk-helper.c @@ -0,0 +1,214 @@ + +#include <unistd.h> +#include <glib.h> +#include <dbus/dbus-glib.h> +#include <polkit-gnome/polkit-gnome.h> + +#include "logout-dialog.h" +#include "ck-pk-helper.h" + +static gboolean +ck_multiple_users (void) +{ + DBusGConnection * sbus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); + g_return_val_if_fail(sbus != NULL, TRUE); /* worst case */ + DBusGProxy * proxy = dbus_g_proxy_new_for_name(sbus, "org.freedesktop.ConsoleKit", + "/org/freedesktop/ConsoleKit/Manager", + "org.freedesktop.ConsoleKit.Manager"); + + if (proxy == NULL) { + return TRUE; + } + + gboolean result; + GPtrArray * seats = NULL; + + result = dbus_g_proxy_call(proxy, "GetSeats", NULL, G_TYPE_INVALID, + dbus_g_type_get_collection("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &seats, G_TYPE_INVALID); + + if (!result) { + g_warning("Unable to get the seats for ConsoleKit"); + g_object_unref(proxy); + return TRUE; + } + + gchar * this_session_id = NULL; + + result = dbus_g_proxy_call(proxy, "GetCurrentSession", NULL, G_TYPE_INVALID, + DBUS_TYPE_G_OBJECT_PATH, &this_session_id, G_TYPE_INVALID); + + g_object_unref(proxy); + + if (!result) { + g_warning("Unable to get current session from ConsoleKit"); + return TRUE; + } + + proxy = dbus_g_proxy_new_for_name(sbus, "org.freedesktop.ConsoleKit", + this_session_id, "org.freedesktop.ConsoleKit.Session"); + + if (proxy == NULL) { + return TRUE; + } + + guint this_session_uid; + + result = dbus_g_proxy_call(proxy, "GetUnixUser", NULL, G_TYPE_INVALID, + G_TYPE_UINT, &this_session_uid, G_TYPE_INVALID); + + if (!result) { + g_warning("Unable to get UID from ConsoleKit"); + return TRUE; + } + + guint seat; + gboolean multiple_users = FALSE; + for (seat = 0; seat < seats->len; seat++) { + gchar * seat_id = g_ptr_array_index(seats, seat); + DBusGProxy * seat_proxy = dbus_g_proxy_new_for_name(sbus, "org.freedesktop.ConsoleKit", + seat_id, "org.freedesktop.ConsoleKit.Seat"); + g_free(seat_id); + + if (seat_proxy == NULL) { + continue; + } + + GPtrArray * sessions = NULL; + + gboolean result = dbus_g_proxy_call(seat_proxy, + "GetSessions", NULL, G_TYPE_INVALID, + dbus_g_type_get_collection("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &sessions, G_TYPE_INVALID); + + g_object_unref(seat_proxy); + if (!result) { + continue; + } + + guint session; + for (session = 0; session < sessions->len; session++) { + gchar * session_id = g_ptr_array_index(sessions, session); + if (g_strcmp0(this_session_id, session_id) == 0) { + continue; + } + DBusGProxy * session_proxy = dbus_g_proxy_new_for_name(sbus, "org.freedesktop.ConsoleKit", + session_id, "org.freedesktop.ConsoleKit.Session"); + g_free(session_id); + + if (session_proxy == NULL) { + continue; + } + + guint session_uid; + result = dbus_g_proxy_call(session_proxy, "GetUnixUser", NULL, G_TYPE_INVALID, + G_TYPE_UINT, &session_uid, G_TYPE_INVALID); + g_object_unref(session_proxy); + + if (!result) { + continue; + } + + if (session_uid != this_session_uid) { + multiple_users = TRUE; + break; + } + } + + g_ptr_array_free(sessions, TRUE); + + if (multiple_users) { + break; + } + } + + g_ptr_array_free(seats, TRUE); + g_object_unref(proxy); + g_free(this_session_id); + + return multiple_users; +} + +gboolean +pk_require_auth (LogoutDialogAction action) { + if (action == LOGOUT_DIALOG_LOGOUT) { + return FALSE; + } + + gchar * pk_action; + if (ck_multiple_users()) { + if (action == LOGOUT_DIALOG_RESTART) { + pk_action = "org.freedesktop.consolekit.system.restart-multiple-users"; + } else { + pk_action = "org.freedesktop.consolekit.system.stop-multiple-users"; + } + } else { + if (action == LOGOUT_DIALOG_RESTART) { + pk_action = "org.freedesktop.consolekit.system.restart"; + } else { + pk_action = "org.freedesktop.consolekit.system.stop"; + } + } + + PolKitResult polres; + if (pk_can_do_action(pk_action, &polres)) { + if (polres == POLKIT_RESULT_YES) { + return FALSE; + } + return TRUE; + } + return FALSE; +} + +gboolean +pk_can_do_action (const gchar *action_id, PolKitResult * pol_result) +{ + PolKitGnomeContext *gnome_context; + PolKitAction *action; + PolKitCaller *caller; + DBusError dbus_error; + PolKitError *error; + PolKitResult result; + + gnome_context = polkit_gnome_context_get (NULL); + + if (gnome_context == NULL) { + return FALSE; + } + + if (gnome_context->pk_tracker == NULL) { + return FALSE; + } + + dbus_error_init (&dbus_error); + caller = polkit_tracker_get_caller_from_pid (gnome_context->pk_tracker, + getpid (), + &dbus_error); + dbus_error_free (&dbus_error); + + if (caller == NULL) { + return FALSE; + } + + action = polkit_action_new (); + if (!polkit_action_set_action_id (action, action_id)) { + polkit_action_unref (action); + polkit_caller_unref (caller); + return FALSE; + } + + result = POLKIT_RESULT_UNKNOWN; + error = NULL; + result = polkit_context_is_caller_authorized (gnome_context->pk_context, + action, caller, FALSE, + &error); + if (polkit_error_is_set (error)) { + polkit_error_free (error); + } + polkit_action_unref (action); + polkit_caller_unref (caller); + + if (pol_result != NULL) { + *pol_result = result; + } + + return result != POLKIT_RESULT_NO && result != POLKIT_RESULT_UNKNOWN; +} diff --git a/src/gtk-dialog/ck-pk-helper.h b/src/gtk-dialog/ck-pk-helper.h new file mode 100644 index 0000000..fb5936e --- /dev/null +++ b/src/gtk-dialog/ck-pk-helper.h @@ -0,0 +1,10 @@ + +#ifndef __CK_PK_HELPER_H__ +#define __CK_PK_HELPER_H__ 1 + +#include <polkit-gnome/polkit-gnome.h> + +gboolean pk_require_auth (LogoutDialogAction action); +gboolean pk_can_do_action (const gchar *action_id, PolKitResult * pol_result); + +#endif /* __CK_PK_HELPER__ */ diff --git a/src/gtk-dialog/gtk-logout-helper.c b/src/gtk-dialog/gtk-logout-helper.c new file mode 100644 index 0000000..75ab63f --- /dev/null +++ b/src/gtk-dialog/gtk-logout-helper.c @@ -0,0 +1,134 @@ + +#include <glib.h> +#include <gtk/gtk.h> +#include <dbus/dbus-glib.h> +#include "logout-dialog.h" +#include "ck-pk-helper.h" + +static void +session_action (LogoutDialogAction action) +{ + DBusGConnection * sbus; + DBusGProxy * sm_proxy; + GError * error = NULL; + gboolean res = FALSE; + + sbus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + if (sbus == NULL) { + g_warning("Unable to get DBus session bus."); + return; + } + sm_proxy = dbus_g_proxy_new_for_name_owner (sbus, + "org.gnome.SessionManager", + "/org/gnome/SessionManager", + "org.gnome.SessionManager", + &error); + if (sm_proxy == NULL) { + g_warning("Unable to get DBus proxy to SessionManager interface: %s", error->message); + g_error_free(error); + return; + } + + g_clear_error (&error); + + if (action == LOGOUT_DIALOG_LOGOUT) { + res = dbus_g_proxy_call_with_timeout (sm_proxy, "Logout", INT_MAX, &error, + G_TYPE_UINT, 1, G_TYPE_INVALID, G_TYPE_INVALID); + } else if (action == LOGOUT_DIALOG_SHUTDOWN) { + res = dbus_g_proxy_call_with_timeout (sm_proxy, "RequestShutdown", INT_MAX, &error, + G_TYPE_INVALID, G_TYPE_INVALID); + } else if (action == LOGOUT_DIALOG_RESTART) { + res = dbus_g_proxy_call_with_timeout (sm_proxy, "RequestReboot", INT_MAX, &error, + G_TYPE_INVALID, G_TYPE_INVALID); + } else { + g_warning ("Unknown session action"); + } + + if (!res) { + if (error != NULL) { + g_warning ("SessionManager action failed: %s", error->message); + } else { + g_warning ("SessionManager action failed: unknown error"); + } + } + + g_object_unref(sm_proxy); + + if (error != NULL) { + g_error_free(error); + } + + return; +} + +static LogoutDialogAction type = LOGOUT_DIALOG_LOGOUT; + +static gboolean +option_logout (const gchar * arg, const gchar * value, gpointer data, GError * error) +{ + type = LOGOUT_DIALOG_LOGOUT; + return TRUE; +} + +static gboolean +option_shutdown (const gchar * arg, const gchar * value, gpointer data, GError * error) +{ + type = LOGOUT_DIALOG_SHUTDOWN; + return TRUE; +} + +static gboolean +option_restart (const gchar * arg, const gchar * value, gpointer data, GError * error) +{ + type = LOGOUT_DIALOG_RESTART; + return TRUE; +} + +static GOptionEntry options[] = { + {"logout", 'l', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_logout, "Log out of the current session", NULL}, + {"shutdown", 's', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_shutdown, "Shutdown the entire system", NULL}, + {"restart", 'r', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, option_restart, "Restart the system", NULL}, + + {NULL} +}; + +int +main (int argc, char * argv[]) +{ + gtk_init(&argc, &argv); + + GError * error = NULL; + GOptionContext * context = g_option_context_new(" - logout of the current session"); + g_option_context_add_main_entries(context, options, "gtk-logout-helper"); + g_option_context_add_group(context, gtk_get_option_group(TRUE)); + g_option_context_set_help_enabled(context, TRUE); + + if (!g_option_context_parse(context, &argc, &argv, &error)) { + g_debug("Option parsing failed: %s", error->message); + g_error_free(error); + return 1; + } + + GtkWidget * dialog = NULL; + if (!pk_require_auth(type)) { + dialog = logout_dialog_new(type); + } + + if (dialog != NULL) { + GtkResponseType response = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_hide(dialog); + + if (response == GTK_RESPONSE_HELP) { + type = LOGOUT_DIALOG_RESTART; + response = GTK_RESPONSE_OK; + } + + if (response != GTK_RESPONSE_OK) { + return 0; + } + } + + session_action(type); + + return 0; +} diff --git a/src/gtk-dialog/logout-dialog.c b/src/gtk-dialog/logout-dialog.c new file mode 100644 index 0000000..cd49b00 --- /dev/null +++ b/src/gtk-dialog/logout-dialog.c @@ -0,0 +1,367 @@ +/* + * libgksuui -- Gtk+ widget and convenience functions for requesting passwords + * Copyright (C) 2004 Gustavo Noronha Silva + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include <string.h> +#include <math.h> + +#include <gtk/gtk.h> +#include <gdk/gdkx.h> +#include <glib/gi18n.h> +#include <X11/XKBlib.h> + +#include "logout-dialog.h" +#include "ck-pk-helper.h" + +enum { + PROP_ZERO, + PROP_ACTION +}; + + +static void +logout_dialog_class_init (LogoutDialogClass *klass); + +static void +logout_dialog_init (LogoutDialog *logout_dialog); + +static void +set_property (GObject * object, guint param_id, const GValue * value, GParamSpec *pspec); + +static void +get_property (GObject * object, guint param_id, GValue * value, GParamSpec *pspec); + +static gboolean +timer_cb (gpointer data); + +static void +show_cb (GtkWidget * widget, gpointer data); + +static void +check_restart (LogoutDialog * dialog); + +static gchar* +get_plural_string (LogoutDialog * dialog); + +static const gchar * title_strings[LOGOUT_DIALOG_ACTION_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ NC_("title", "Log Out"), + /* LOGOUT_DIALOG_RESTART, */ NC_("title", "Restart"), + /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("title", "Shut Down") +}; + +static const gchar * button_strings[LOGOUT_DIALOG_ACTION_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ NC_("button", "Log Out"), + /* LOGOUT_DIALOG_RESTART, */ NC_("button", "Restart"), + /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button", "Shut Down") +}; + +static const gchar * restart_auth = N_("Restart..."); + +static const gchar * body_logout_update = N_("You recently installed updates which will only take effect after a restart. Restart to apply software updates."); + +static const gchar * icon_strings[LOGOUT_DIALOG_ACTION_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ "system-log-out", + /* LOGOUT_DIALOG_RESTART, */ "system-restart", + /* LOGOUT_DIALOG_SHUTDOWN, */ "system-shutdown" +}; + +GType +logout_dialog_get_type (void) +{ + static GType type = 0; + + if (type == 0) + { + static const GTypeInfo info = + { + sizeof (LogoutDialogClass), /* size of class */ + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) logout_dialog_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (LogoutDialog), /* size of object */ + 0, /* n_preallocs */ + (GInstanceInitFunc) logout_dialog_init /* instance_init */ + }; + type = g_type_register_static (gtk_dialog_get_type (), + "LogoutDialogType", + &info, 0); + } + + return type; +} + +static gchar* +get_plural_string (LogoutDialog * dialog) +{ + static gchar *plural_string = ""; + + switch (dialog->action) + { + case LOGOUT_DIALOG_LOGOUT: + plural_string = ngettext("You will be logged out in %d second.", + "You will be logged out in %d seconds.", + dialog->timeout); + break; + case LOGOUT_DIALOG_RESTART: + plural_string = ngettext("The computer will restart in %d second.", + "The computer will restart in %d seconds.", + dialog->timeout); + break; + case LOGOUT_DIALOG_SHUTDOWN: + plural_string = ngettext("The computer will be shut down in %d second.", + "The computer will be shut down in %d seconds.", + dialog->timeout); + break; + default: + break; + } + + return plural_string; +} + +static void +logout_dialog_class_init (LogoutDialogClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = set_property; + gobject_class->get_property = get_property; + + g_object_class_install_property(gobject_class, PROP_ACTION, + g_param_spec_int("action", NULL, NULL, + LOGOUT_DIALOG_LOGOUT, LOGOUT_DIALOG_SHUTDOWN, + LOGOUT_DIALOG_LOGOUT, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); + + return; +} + +static void +set_property (GObject * object, guint param_id, const GValue * value, GParamSpec *pspec) +{ + g_return_if_fail(param_id == PROP_ACTION); + + LogoutDialog * dialog = LOGOUT_DIALOG(object); + dialog->action = (LogoutDialogAction)g_value_get_int(value); + + gtk_image_set_from_icon_name(GTK_IMAGE(dialog->image), icon_strings[dialog->action], GTK_ICON_SIZE_DIALOG); + gtk_window_set_title (GTK_WINDOW(dialog), _(title_strings[dialog->action])); + gtk_widget_hide(dialog->message); + gtk_button_set_label(GTK_BUTTON(dialog->ok_button), _(button_strings[dialog->action])); + + gchar * timeouttxt = g_strdup_printf(get_plural_string(dialog), dialog->timeout); + gtk_label_set_text(GTK_LABEL(dialog->timeout_text), timeouttxt); + g_free(timeouttxt); + + check_restart(dialog); + + return; +} + +static void +get_property (GObject * object, guint param_id, GValue * value, GParamSpec *pspec) +{ + g_return_if_fail(param_id == PROP_ACTION); + g_value_set_int(value, LOGOUT_DIALOG(object)->action); +} + +static gboolean +timer_cb (gpointer data) +{ + LogoutDialog * dialog = LOGOUT_DIALOG(data); + + if (dialog->timeout == 0) { + gtk_dialog_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); + dialog->timerfunc = 0; + return FALSE; + } else { + dialog->timeout--; + + gchar * timeouttxt = g_strdup_printf(get_plural_string(dialog), dialog->timeout); + gtk_label_set_text(GTK_LABEL(dialog->timeout_text), timeouttxt); + g_free(timeouttxt); + } + + return TRUE; +} + +static void +show_cb (GtkWidget * widget, gpointer data) +{ + LogoutDialog * dialog = LOGOUT_DIALOG(widget); + + if (dialog->timerfunc != 0) { + g_source_remove(dialog->timerfunc); + dialog->timerfunc = 0; + } + + dialog->timerfunc = g_timeout_add_seconds(1, timer_cb, dialog); + return; +} + +static void +check_restart (LogoutDialog * dialog) +{ + if (dialog->action != LOGOUT_DIALOG_LOGOUT) { + return; + } + + if (g_file_test("/var/run/reboot-required", G_FILE_TEST_EXISTS)) { + if (pk_can_do_action("org.freedesktop.consolekit.system.restart", NULL) || + pk_can_do_action("org.freedesktop.consolekit.system.restart-multiple-users", NULL)) { + + gtk_label_set_text(GTK_LABEL(dialog->message), _(body_logout_update)); + gtk_widget_show(dialog->message); + if (pk_require_auth(LOGOUT_DIALOG_RESTART)) { + gtk_button_set_label(GTK_BUTTON(dialog->restart_button), _(restart_auth)); + } else { + gtk_button_set_label(GTK_BUTTON(dialog->restart_button), _(button_strings[LOGOUT_DIALOG_RESTART])); + } + gtk_widget_show(dialog->restart_button); + } + } + + return; +} + +static gboolean +focus_out_cb (GtkWidget *widget, GdkEventFocus *event, gpointer user_data) +{ + gtk_window_present (GTK_WINDOW(widget)); + return TRUE; +} + +static void +logout_dialog_init (LogoutDialog *logout_dialog) +{ + GtkDialog *dialog; + gint border_width = 6; + + logout_dialog->timeout = 60; + logout_dialog->timerfunc = 0; + + /* dialog window */ + dialog = GTK_DIALOG(logout_dialog); + + /* make sure that our window will always have the focus */ + g_signal_connect (G_OBJECT(dialog), "focus-out-event", + G_CALLBACK(focus_out_cb), NULL); + + logout_dialog->main_vbox = dialog->vbox; + + gtk_window_set_title (GTK_WINDOW(logout_dialog), ""); + gtk_dialog_set_has_separator (GTK_DIALOG(logout_dialog), FALSE); + gtk_container_set_border_width (GTK_CONTAINER(logout_dialog), border_width); + gtk_box_set_spacing (GTK_BOX(logout_dialog->main_vbox), 12); + gtk_window_set_resizable (GTK_WINDOW(logout_dialog), FALSE); + + gtk_window_stick(GTK_WINDOW(logout_dialog)); + gtk_window_set_keep_above(GTK_WINDOW(logout_dialog), TRUE); + gtk_widget_realize(GTK_WIDGET(logout_dialog)); + gdk_window_set_functions(GTK_WIDGET(logout_dialog)->window, GDK_FUNC_CLOSE); + + /* center window */ + gtk_window_set_position (GTK_WINDOW(logout_dialog), GTK_WIN_POS_CENTER); + + /* the action buttons */ + /* the cancel button */ + logout_dialog->restart_button = gtk_dialog_add_button (dialog, + GTK_STOCK_HELP, + GTK_RESPONSE_HELP); + gtk_button_set_label(GTK_BUTTON(logout_dialog->restart_button), _(button_strings[LOGOUT_DIALOG_RESTART])); + gtk_widget_hide(logout_dialog->restart_button); + + /* the cancel button */ + logout_dialog->cancel_button = gtk_dialog_add_button (dialog, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL); + /* the ok button */ + logout_dialog->ok_button = gtk_dialog_add_button (dialog, + GTK_STOCK_OK, + GTK_RESPONSE_OK); + gtk_widget_grab_default (logout_dialog->ok_button); + + /* Title */ + gtk_window_set_title (GTK_WINDOW(logout_dialog), _(title_strings[logout_dialog->action])); + + /* hbox */ + logout_dialog->hbox = gtk_hbox_new (FALSE, 12); + gtk_container_set_border_width (GTK_CONTAINER(logout_dialog->hbox), 6); + gtk_box_pack_start (GTK_BOX(logout_dialog->main_vbox), + logout_dialog->hbox, FALSE, FALSE, 0); + gtk_widget_show (logout_dialog->hbox); + + /* image */ + logout_dialog->image = + gtk_image_new_from_icon_name (icon_strings[logout_dialog->action], + GTK_ICON_SIZE_DIALOG); + gtk_misc_set_alignment (GTK_MISC(logout_dialog->image), 0.5, 0); + gtk_box_pack_start (GTK_BOX(logout_dialog->hbox), logout_dialog->image, + FALSE, FALSE, 0); + gtk_widget_show (logout_dialog->image); + + /* vbox for text */ + logout_dialog->vbox_text = gtk_vbox_new(FALSE, 12); + gtk_box_pack_start(GTK_BOX(logout_dialog->hbox), logout_dialog->vbox_text, TRUE, TRUE, 0); + gtk_widget_show(logout_dialog->vbox_text); + + /* Message */ + logout_dialog->message = gtk_label_new(""); + gtk_label_set_line_wrap(GTK_LABEL(logout_dialog->message), TRUE); + gtk_label_set_single_line_mode(GTK_LABEL(logout_dialog->message), FALSE); + gtk_label_set_selectable(GTK_LABEL(logout_dialog->message), TRUE); + gtk_misc_set_alignment (GTK_MISC(logout_dialog->message), 0.0, 0.0); + gtk_box_pack_start(GTK_BOX(logout_dialog->vbox_text), logout_dialog->message, TRUE, TRUE, 0); + gtk_widget_show(logout_dialog->message); + + /* timeout */ + logout_dialog->timeout_text = gtk_label_new(""); + gtk_label_set_line_wrap(GTK_LABEL(logout_dialog->timeout_text), TRUE); + gtk_label_set_single_line_mode(GTK_LABEL(logout_dialog->timeout_text), FALSE); + gtk_label_set_selectable(GTK_LABEL(logout_dialog->timeout_text), FALSE); + gtk_misc_set_alignment (GTK_MISC(logout_dialog->timeout_text), 0.0, 0.5); + gtk_box_pack_start(GTK_BOX(logout_dialog->vbox_text), logout_dialog->timeout_text, TRUE, TRUE, 0); + gtk_widget_show(logout_dialog->timeout_text); + + g_signal_connect(G_OBJECT(logout_dialog), "show", G_CALLBACK(show_cb), logout_dialog); + + return; +} + +/** + * logout_dialog_new: + * + * Creates a new #LogoutDialog. + * + * Returns: the new #LogoutDialog + */ +GtkWidget* +logout_dialog_new (LogoutDialogAction action) +{ + LogoutDialog * dialog = g_object_new (LOGOUT_TYPE_DIALOG, "action", action, NULL); + return GTK_WIDGET(dialog); +} + +LogoutDialogAction +logout_dialog_get_action (LogoutDialog * dialog) +{ + return dialog->action; +} + diff --git a/src/gtk-dialog/logout-dialog.h b/src/gtk-dialog/logout-dialog.h new file mode 100644 index 0000000..b0e19b7 --- /dev/null +++ b/src/gtk-dialog/logout-dialog.h @@ -0,0 +1,99 @@ +/* + * libgksuui -- Gtk+ widget and convenience functions for requesting passwords + * Copyright (C) 2004 Gustavo Noronha Silva + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __LOGOUT_DIALOG_H__ +#define __LOGOUT_DIALOG_H__ + +#include <gtk/gtk.h> + +G_BEGIN_DECLS + +#define LOGOUT_TYPE_DIALOG (logout_dialog_get_type ()) +#define LOGOUT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), LOGOUT_TYPE_DIALOG, LogoutDialog)) +#define LOGOUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), LOGOUT_TYPE_DIALOG, LogoutDialogClass)) +#define LOGOUT_IS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), LOGOUT_TYPE_DIALOG)) +#define LOGOUT_IS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LOGOUT_TYPE_CONTEXT)) +#define LOGOUT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LOGOUT_TYPE_DIALOG, LogoutDialogClass)) + +typedef struct _LogoutDialogClass LogoutDialogClass; +typedef struct _LogoutDialog LogoutDialog; +typedef enum _LogoutDialogAction LogoutDialogAction; + +enum _LogoutDialogAction { + LOGOUT_DIALOG_LOGOUT, + LOGOUT_DIALOG_RESTART, + LOGOUT_DIALOG_SHUTDOWN, + LOGOUT_DIALOG_ACTION_CNT +}; + +struct _LogoutDialogClass +{ + GtkDialogClass parent_class; +}; + +/** + * LogoutDialog: + * @dialog: parent widget + * @main_vbox: GtkDialog's vbox + * @hbox: box to separate the image of the right-side widgets + * @image: the authorization image, left-side widget + * @entry_vbox: right-side widgets container + * @label: message describing what is required from the user, + * right-side widget + * @entry: place to type the password in, right-side widget + * @ok_button: OK button of the dialog + * @cancel_button: Cancel button of the dialog + * + * Convenience widget based on #GtkDialog to request a password. + */ +struct _LogoutDialog +{ + GtkDialog dialog; + + GtkWidget *main_vbox; + GtkWidget *hbox; + GtkWidget *image; + GtkWidget *ok_button; + GtkWidget *cancel_button; + GtkWidget *restart_button; + GtkWidget *vbox_text; + GtkWidget *message; + GtkWidget *timeout_text; + + LogoutDialogAction action; + + /* private */ + gchar * timeout_result; + guint timeout; + guint timerfunc; +}; + +GType +logout_dialog_get_type (void); + +GtkWidget* +logout_dialog_new (LogoutDialogAction action); + +LogoutDialogAction +logout_dialog_get_action (LogoutDialog * widget); + +G_END_DECLS + +#endif |