From 0c8dbfc17a82b877ec38e72fcfef1a6bdf2ab8ca Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 23 Feb 2010 11:10:21 -0600 Subject: Removing the old logout dialog. It's been through too much, better to start over. --- src/gtk-dialog/logout-dialog.c | 371 ----------------------------------------- src/gtk-dialog/logout-dialog.h | 99 ----------- 2 files changed, 470 deletions(-) delete mode 100644 src/gtk-dialog/logout-dialog.c delete mode 100644 src/gtk-dialog/logout-dialog.h diff --git a/src/gtk-dialog/logout-dialog.c b/src/gtk-dialog/logout-dialog.c deleted file mode 100644 index 65df9fe..0000000 --- a/src/gtk-dialog/logout-dialog.c +++ /dev/null @@ -1,371 +0,0 @@ -/* - * 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., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#include -#include - -#include -#include -#include -#include - -#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_window_set_icon_name (GTK_WINDOW(dialog), icon_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)); - /* remove superfluous window buttons */ - gdk_window_set_functions (GTK_WIDGET(logout_dialog)->window, 0); - gdk_window_set_decorations (GTK_WIDGET(logout_dialog)->window, GDK_DECOR_BORDER | GDK_DECOR_TITLE); - - /* 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); - - /* Window Title and Icon */ - gtk_window_set_title (GTK_WINDOW(logout_dialog), _(title_strings[logout_dialog->action])); - gtk_window_set_icon_name (GTK_WINDOW(logout_dialog), icon_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 deleted file mode 100644 index 8b0ff09..0000000 --- a/src/gtk-dialog/logout-dialog.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * 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., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifndef __LOGOUT_DIALOG_H__ -#define __LOGOUT_DIALOG_H__ - -#include - -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 -- cgit v1.2.3 From c96dfa4fcf905cdf73b02589b2c64b83849160a6 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 23 Feb 2010 11:33:18 -0600 Subject: Place holder new object --- src/gtk-dialog/Makefile.am | 4 ++-- src/gtk-dialog/dialog.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++ src/gtk-dialog/dialog.h | 31 +++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 src/gtk-dialog/dialog.c create mode 100644 src/gtk-dialog/dialog.h diff --git a/src/gtk-dialog/Makefile.am b/src/gtk-dialog/Makefile.am index 3f14d78..2c7e61a 100644 --- a/src/gtk-dialog/Makefile.am +++ b/src/gtk-dialog/Makefile.am @@ -7,8 +7,8 @@ gtk_logout_helper_SOURCES = \ ck-pk-helper.h \ gconf-helper.c \ gconf-helper.h \ - logout-dialog.c \ - logout-dialog.h + dialog.c \ + dialog.h gtk_logout_helper_CFLAGS = $(SESSIONSERVICE_CFLAGS) $(GTKLOGOUTHELPER_CFLAGS) $(GCONF_CFLAGS) -Wall -Werror -DINDICATOR_ICONS_DIR="\"$(INDICATORICONSDIR)\"" gtk_logout_helper_LDADD = $(SESSIONSERVICE_LIBS) $(GTKLOGOUTHELPER_LIBS) $(GCONF_LIBS) diff --git a/src/gtk-dialog/dialog.c b/src/gtk-dialog/dialog.c new file mode 100644 index 0000000..c9d66b3 --- /dev/null +++ b/src/gtk-dialog/dialog.c @@ -0,0 +1,58 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "dialog.h" + +typedef struct _LogoutDialogPrivate LogoutDialogPrivate; +struct _LogoutDialogPrivate { + guint type; +}; + +#define LOGOUT_DIALOG_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), LOGOUT_DIALOG_TYPE, LogoutDialogPrivate)) + +static void logout_dialog_class_init (LogoutDialogClass *klass); +static void logout_dialog_init (LogoutDialog *self); +static void logout_dialog_dispose (GObject *object); +static void logout_dialog_finalize (GObject *object); + +G_DEFINE_TYPE (LogoutDialog, logout_dialog, GTK_TYPE_DIALOG); + +static void +logout_dialog_class_init (LogoutDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (LogoutDialogPrivate)); + + object_class->dispose = logout_dialog_dispose; + object_class->finalize = logout_dialog_finalize; + + return; +} + +static void +logout_dialog_init (LogoutDialog *self) +{ + + return; +} + +static void +logout_dialog_dispose (GObject *object) +{ + + + G_OBJECT_CLASS (logout_dialog_parent_class)->dispose (object); + return; +} + +static void +logout_dialog_finalize (GObject *object) +{ + + + G_OBJECT_CLASS (logout_dialog_parent_class)->finalize (object); + return; +} diff --git a/src/gtk-dialog/dialog.h b/src/gtk-dialog/dialog.h new file mode 100644 index 0000000..eeb93ed --- /dev/null +++ b/src/gtk-dialog/dialog.h @@ -0,0 +1,31 @@ +#ifndef __LOGOUT_DIALOG_H__ +#define __LOGOUT_DIALOG_H__ + +#include +#include + +G_BEGIN_DECLS + +#define LOGOUT_DIALOG_TYPE (logout_dialog_get_type ()) +#define LOGOUT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LOGOUT_DIALOG_TYPE, LogoutDialog)) +#define LOGOUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LOGOUT_DIALOG_TYPE, LogoutDialogClass)) +#define IS_LOGOUT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LOGOUT_DIALOG_TYPE)) +#define IS_LOGOUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LOGOUT_DIALOG_TYPE)) +#define LOGOUT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LOGOUT_DIALOG_TYPE, LogoutDialogClass)) + +typedef struct _LogoutDialog LogoutDialog; +typedef struct _LogoutDialogClass LogoutDialogClass; + +struct _LogoutDialogClass { + GtkDialogClass parent_class; +}; + +struct _LogoutDialog { + GtkDialog parent; +}; + +GType logout_dialog_get_type (void); + +G_END_DECLS + +#endif -- cgit v1.2.3 From 40e989fdb054344be699414ae040585f4f87f657 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Feb 2010 17:12:55 -0600 Subject: Adding some types of dialog and a new function. --- src/gtk-dialog/dialog.c | 7 +++++++ src/gtk-dialog/dialog.h | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/src/gtk-dialog/dialog.c b/src/gtk-dialog/dialog.c index c9d66b3..06b146c 100644 --- a/src/gtk-dialog/dialog.c +++ b/src/gtk-dialog/dialog.c @@ -56,3 +56,10 @@ logout_dialog_finalize (GObject *object) G_OBJECT_CLASS (logout_dialog_parent_class)->finalize (object); return; } + +LogoutDialog * +logout_dialog_new (LogoutDialogType type) +{ + + return NULL; +} diff --git a/src/gtk-dialog/dialog.h b/src/gtk-dialog/dialog.h index eeb93ed..79c8a05 100644 --- a/src/gtk-dialog/dialog.h +++ b/src/gtk-dialog/dialog.h @@ -13,6 +13,13 @@ G_BEGIN_DECLS #define IS_LOGOUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LOGOUT_DIALOG_TYPE)) #define LOGOUT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LOGOUT_DIALOG_TYPE, LogoutDialogClass)) +typedef enum _LogoutDialogType LogoutDialogType; +enum _LogoutDialogType { + LOGOUT_DIALOG_TYPE_LOG_OUT, + LOGOUT_DIALOG_TYPE_RESTART, + LOGOUT_DIALOG_TYPE_SHUTDOWN +}; + typedef struct _LogoutDialog LogoutDialog; typedef struct _LogoutDialogClass LogoutDialogClass; @@ -25,6 +32,7 @@ struct _LogoutDialog { }; GType logout_dialog_get_type (void); +LogoutDialog * logout_dialog_new (LogoutDialogType type); G_END_DECLS -- cgit v1.2.3 From 64602f8dd39b0fd35b0bfc6697fe62bd7a2de0ad Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 24 Feb 2010 17:16:14 -0600 Subject: Changing to new enums and function prototypes. --- src/gtk-dialog/ck-pk-helper.c | 10 +++++----- src/gtk-dialog/ck-pk-helper.h | 2 +- src/gtk-dialog/dialog.h | 2 ++ src/gtk-dialog/gtk-logout-helper.c | 22 +++++++++++----------- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/gtk-dialog/ck-pk-helper.c b/src/gtk-dialog/ck-pk-helper.c index dc7d900..6879517 100644 --- a/src/gtk-dialog/ck-pk-helper.c +++ b/src/gtk-dialog/ck-pk-helper.c @@ -26,7 +26,7 @@ with this program. If not, see . #include #include -#include "logout-dialog.h" +#include "dialog.h" #include "ck-pk-helper.h" static gboolean @@ -150,20 +150,20 @@ ck_multiple_users (void) } gboolean -pk_require_auth (LogoutDialogAction action) { - if (action == LOGOUT_DIALOG_LOGOUT) { +pk_require_auth (LogoutDialogType action) { + if (action == LOGOUT_DIALOG_TYPE_LOG_OUT) { return FALSE; } gchar * pk_action; if (ck_multiple_users()) { - if (action == LOGOUT_DIALOG_RESTART) { + if (action == LOGOUT_DIALOG_TYPE_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) { + if (action == LOGOUT_DIALOG_TYPE_RESTART) { pk_action = "org.freedesktop.consolekit.system.restart"; } else { pk_action = "org.freedesktop.consolekit.system.stop"; diff --git a/src/gtk-dialog/ck-pk-helper.h b/src/gtk-dialog/ck-pk-helper.h index 501a8c8..dfbb432 100644 --- a/src/gtk-dialog/ck-pk-helper.h +++ b/src/gtk-dialog/ck-pk-helper.h @@ -26,7 +26,7 @@ with this program. If not, see . #include -gboolean pk_require_auth (LogoutDialogAction action); +gboolean pk_require_auth (LogoutDialogType action); gboolean pk_can_do_action (const gchar *action_id, PolkitAuthorizationResult ** pol_result); #endif /* __CK_PK_HELPER__ */ diff --git a/src/gtk-dialog/dialog.h b/src/gtk-dialog/dialog.h index 79c8a05..bd6abd2 100644 --- a/src/gtk-dialog/dialog.h +++ b/src/gtk-dialog/dialog.h @@ -4,6 +4,8 @@ #include #include +#include + G_BEGIN_DECLS #define LOGOUT_DIALOG_TYPE (logout_dialog_get_type ()) diff --git a/src/gtk-dialog/gtk-logout-helper.c b/src/gtk-dialog/gtk-logout-helper.c index d8aea6b..09e6e86 100644 --- a/src/gtk-dialog/gtk-logout-helper.c +++ b/src/gtk-dialog/gtk-logout-helper.c @@ -25,12 +25,12 @@ with this program. If not, see . #include #include #include -#include "logout-dialog.h" +#include "dialog.h" #include "ck-pk-helper.h" #include "gconf-helper.h" static void -session_action (LogoutDialogAction action) +session_action (LogoutDialogType action) { DBusGConnection * sbus; DBusGProxy * sm_proxy; @@ -55,13 +55,13 @@ session_action (LogoutDialogAction action) g_clear_error (&error); - if (action == LOGOUT_DIALOG_LOGOUT) { + if (action == LOGOUT_DIALOG_TYPE_LOG_OUT) { 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) { + } else if (action == LOGOUT_DIALOG_TYPE_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) { + } else if (action == LOGOUT_DIALOG_TYPE_RESTART) { res = dbus_g_proxy_call_with_timeout (sm_proxy, "RequestReboot", INT_MAX, &error, G_TYPE_INVALID, G_TYPE_INVALID); } else { @@ -85,26 +85,26 @@ session_action (LogoutDialogAction action) return; } -static LogoutDialogAction type = LOGOUT_DIALOG_LOGOUT; +static LogoutDialogType type = LOGOUT_DIALOG_TYPE_LOG_OUT; static gboolean option_logout (const gchar * arg, const gchar * value, gpointer data, GError * error) { - type = LOGOUT_DIALOG_LOGOUT; + type = LOGOUT_DIALOG_TYPE_LOG_OUT; return TRUE; } static gboolean option_shutdown (const gchar * arg, const gchar * value, gpointer data, GError * error) { - type = LOGOUT_DIALOG_SHUTDOWN; + type = LOGOUT_DIALOG_TYPE_SHUTDOWN; return TRUE; } static gboolean option_restart (const gchar * arg, const gchar * value, gpointer data, GError * error) { - type = LOGOUT_DIALOG_RESTART; + type = LOGOUT_DIALOG_TYPE_RESTART; return TRUE; } @@ -150,7 +150,7 @@ main (int argc, char * argv[]) not getting a dialog at all. */ /* if (!pk_require_auth(type) && !supress_confirmations()) { */ if (!supress_confirmations()) { - dialog = logout_dialog_new(type); + dialog = GTK_WIDGET(logout_dialog_new(type)); } if (dialog != NULL) { @@ -158,7 +158,7 @@ main (int argc, char * argv[]) gtk_widget_hide(dialog); if (response == GTK_RESPONSE_HELP) { - type = LOGOUT_DIALOG_RESTART; + type = LOGOUT_DIALOG_TYPE_RESTART; response = GTK_RESPONSE_OK; } -- cgit v1.2.3 From bdd9261ccfbd3bf0e59a6cb495663c425a0dcbe3 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 13:39:51 -0600 Subject: Adding in all the strings. --- src/gtk-dialog/dialog.c | 34 ++++++++++++++++++++++++++++++++++ src/gtk-dialog/dialog.h | 3 ++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/gtk-dialog/dialog.c b/src/gtk-dialog/dialog.c index 06b146c..186a506 100644 --- a/src/gtk-dialog/dialog.c +++ b/src/gtk-dialog/dialog.c @@ -2,8 +2,42 @@ #include "config.h" #endif +#include + #include "dialog.h" +/* Strings */ + +static const gchar * title_strings[LOGOUT_DIALOG_TYPE_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ NC_("title", "Log Out"), + /* LOGOUT_DIALOG_RESTART, */ NC_("title", "Restart"), + /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("title", "Switch Off") +}; + +static const gchar * body_strings[LOGOUT_DIALOG_TYPE_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ N_("Are you sure you want to close all programs and log out?"), + /* LOGOUT_DIALOG_RESTART, */ N_("Are you sure you want to close all programs and restart the computer?"), + /* LOGOUT_DIALOG_SHUTDOWN, */ N_("Are you sure you want to close all programs and shut down the computer?") +}; + +static const gchar * button_strings[LOGOUT_DIALOG_TYPE_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ NC_("button", "Log Out"), + /* LOGOUT_DIALOG_RESTART, */ NC_("button", "Restart"), + /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button", "Switch Off") +}; + +static const gchar * restart_updates = N_("Restart Instead"); +static const gchar * restart_auth = N_("Restart..."); +static const gchar * body_logout_update = N_("Some software updates won't apply until the computer next restarts."); + +static const gchar * icon_strings[LOGOUT_DIALOG_TYPE_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ "system-log-out", + /* LOGOUT_DIALOG_RESTART, */ "system-restart", + /* LOGOUT_DIALOG_SHUTDOWN, */ "system-shutdown" +}; + + + typedef struct _LogoutDialogPrivate LogoutDialogPrivate; struct _LogoutDialogPrivate { guint type; diff --git a/src/gtk-dialog/dialog.h b/src/gtk-dialog/dialog.h index bd6abd2..1e6f575 100644 --- a/src/gtk-dialog/dialog.h +++ b/src/gtk-dialog/dialog.h @@ -19,7 +19,8 @@ typedef enum _LogoutDialogType LogoutDialogType; enum _LogoutDialogType { LOGOUT_DIALOG_TYPE_LOG_OUT, LOGOUT_DIALOG_TYPE_RESTART, - LOGOUT_DIALOG_TYPE_SHUTDOWN + LOGOUT_DIALOG_TYPE_SHUTDOWN, + LOGOUT_DIALOG_TYPE_CNT }; typedef struct _LogoutDialog LogoutDialog; -- cgit v1.2.3 From 087e8950fc86d9a6e2454d54df505ff167f5dc71 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 13:41:16 -0600 Subject: Switching translatable file. --- po/POTFILES.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/po/POTFILES.in b/po/POTFILES.in index 4f28e2a..913dc25 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -3,6 +3,6 @@ data/indicator-session.schemas.in src/gtk-dialog/ck-pk-helper.c src/gtk-dialog/gconf-helper.c src/gtk-dialog/gtk-logout-helper.c -src/gtk-dialog/logout-dialog.c +src/gtk-dialog/dialog.c src/indicator-session.c src/session-service.c -- cgit v1.2.3 From 25a24b5af992231732e58763786d7fc82914da8e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 14:13:11 -0600 Subject: Provide the basis for the window --- src/gtk-dialog/dialog.c | 27 ++++++++++++++++++++++++--- src/gtk-dialog/dialog.h | 4 ++-- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/gtk-dialog/dialog.c b/src/gtk-dialog/dialog.c index 186a506..9dcc194 100644 --- a/src/gtk-dialog/dialog.c +++ b/src/gtk-dialog/dialog.c @@ -26,9 +26,11 @@ static const gchar * button_strings[LOGOUT_DIALOG_TYPE_CNT] = { /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button", "Switch Off") }; +/* static const gchar * restart_updates = N_("Restart Instead"); static const gchar * restart_auth = N_("Restart..."); static const gchar * body_logout_update = N_("Some software updates won't apply until the computer next restarts."); +*/ static const gchar * icon_strings[LOGOUT_DIALOG_TYPE_CNT] = { /* LOGOUT_DIALOG_LOGOUT, */ "system-log-out", @@ -51,7 +53,7 @@ static void logout_dialog_init (LogoutDialog *self); static void logout_dialog_dispose (GObject *object); static void logout_dialog_finalize (GObject *object); -G_DEFINE_TYPE (LogoutDialog, logout_dialog, GTK_TYPE_DIALOG); +G_DEFINE_TYPE (LogoutDialog, logout_dialog, GTK_TYPE_MESSAGE_DIALOG); static void logout_dialog_class_init (LogoutDialogClass *klass) @@ -94,6 +96,25 @@ logout_dialog_finalize (GObject *object) LogoutDialog * logout_dialog_new (LogoutDialogType type) { - - return NULL; + LogoutDialog * dialog = LOGOUT_DIALOG(g_object_new(LOGOUT_DIALOG_TYPE, + /* Window */ + "icon-name", icon_strings[type], + "modal", TRUE, + "resizable", FALSE, + "title", _(title_strings[type]), + "window-position", GTK_WIN_POS_CENTER_ALWAYS, + /* Dialog */ + "has-separator", FALSE, + /* Message Dialog */ + "message-type", GTK_MESSAGE_OTHER, + "buttons", GTK_BUTTONS_NONE, + "text", _(body_strings[type]), + NULL)); + + gtk_dialog_add_buttons(GTK_DIALOG(dialog), + _(button_strings[type]), GTK_RESPONSE_OK, + _("Cancel"), GTK_RESPONSE_CANCEL, + NULL); + + return dialog; } diff --git a/src/gtk-dialog/dialog.h b/src/gtk-dialog/dialog.h index 1e6f575..3240a8e 100644 --- a/src/gtk-dialog/dialog.h +++ b/src/gtk-dialog/dialog.h @@ -27,11 +27,11 @@ typedef struct _LogoutDialog LogoutDialog; typedef struct _LogoutDialogClass LogoutDialogClass; struct _LogoutDialogClass { - GtkDialogClass parent_class; + GtkMessageDialogClass parent_class; }; struct _LogoutDialog { - GtkDialog parent; + GtkMessageDialog parent; }; GType logout_dialog_get_type (void); -- cgit v1.2.3 From 84c4324d547a81969e0de563732eb923c83e7ea6 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 14:16:56 -0600 Subject: Putting the image in and cleaning up the props --- src/gtk-dialog/dialog.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/gtk-dialog/dialog.c b/src/gtk-dialog/dialog.c index 9dcc194..96ebf21 100644 --- a/src/gtk-dialog/dialog.c +++ b/src/gtk-dialog/dialog.c @@ -96,6 +96,9 @@ logout_dialog_finalize (GObject *object) LogoutDialog * logout_dialog_new (LogoutDialogType type) { + GtkWidget * image = gtk_image_new_from_icon_name(icon_strings[type], GTK_ICON_SIZE_DIALOG); + gtk_widget_show(image); + LogoutDialog * dialog = LOGOUT_DIALOG(g_object_new(LOGOUT_DIALOG_TYPE, /* Window */ "icon-name", icon_strings[type], @@ -103,11 +106,10 @@ logout_dialog_new (LogoutDialogType type) "resizable", FALSE, "title", _(title_strings[type]), "window-position", GTK_WIN_POS_CENTER_ALWAYS, - /* Dialog */ - "has-separator", FALSE, /* Message Dialog */ - "message-type", GTK_MESSAGE_OTHER, "buttons", GTK_BUTTONS_NONE, + "image", image, + "message-type", GTK_MESSAGE_OTHER, "text", _(body_strings[type]), NULL)); -- cgit v1.2.3 From 3f35021350143255280fe30b1f38c46219c72f6b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 14:51:57 -0600 Subject: Flipping button order --- src/gtk-dialog/dialog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gtk-dialog/dialog.c b/src/gtk-dialog/dialog.c index 96ebf21..18f345f 100644 --- a/src/gtk-dialog/dialog.c +++ b/src/gtk-dialog/dialog.c @@ -114,8 +114,8 @@ logout_dialog_new (LogoutDialogType type) NULL)); gtk_dialog_add_buttons(GTK_DIALOG(dialog), - _(button_strings[type]), GTK_RESPONSE_OK, _("Cancel"), GTK_RESPONSE_CANCEL, + _(button_strings[type]), GTK_RESPONSE_OK, NULL); return dialog; -- cgit v1.2.3 From f998b8b0d4bb9d9965f804ad5004b089a61f0248 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 14:52:09 -0600 Subject: Removing the old ck-pk helpers. --- src/gtk-dialog/Makefile.am | 2 - src/gtk-dialog/ck-pk-helper.c | 222 ------------------------------------- src/gtk-dialog/ck-pk-helper.h | 32 ------ src/gtk-dialog/gtk-logout-helper.c | 6 - 4 files changed, 262 deletions(-) delete mode 100644 src/gtk-dialog/ck-pk-helper.c delete mode 100644 src/gtk-dialog/ck-pk-helper.h diff --git a/src/gtk-dialog/Makefile.am b/src/gtk-dialog/Makefile.am index 2c7e61a..508beb2 100644 --- a/src/gtk-dialog/Makefile.am +++ b/src/gtk-dialog/Makefile.am @@ -3,8 +3,6 @@ libexec_PROGRAMS = gtk-logout-helper gtk_logout_helper_SOURCES = \ gtk-logout-helper.c \ - ck-pk-helper.c \ - ck-pk-helper.h \ gconf-helper.c \ gconf-helper.h \ dialog.c \ diff --git a/src/gtk-dialog/ck-pk-helper.c b/src/gtk-dialog/ck-pk-helper.c deleted file mode 100644 index 6879517..0000000 --- a/src/gtk-dialog/ck-pk-helper.c +++ /dev/null @@ -1,222 +0,0 @@ -/* -A small wrapper utility to load indicators and put them as menu items -into the gnome-panel using it's applet interface. - -Copyright 2009 Canonical Ltd. - -Authors: - Ted Gould - -This program is free software: you can redistribute it and/or modify it -under the terms of the GNU General Public License version 3, as published -by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranties of -MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . -*/ - - -#include -#include -#include -#include - -#include "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 (LogoutDialogType action) { - if (action == LOGOUT_DIALOG_TYPE_LOG_OUT) { - return FALSE; - } - - gchar * pk_action; - if (ck_multiple_users()) { - if (action == LOGOUT_DIALOG_TYPE_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_TYPE_RESTART) { - pk_action = "org.freedesktop.consolekit.system.restart"; - } else { - pk_action = "org.freedesktop.consolekit.system.stop"; - } - } - - PolkitAuthorizationResult *polres = NULL; - gboolean ret = FALSE; - if (pk_can_do_action(pk_action, &polres)) { - if (polkit_authorization_result_get_is_challenge (polres)) { - ret = TRUE; - } - g_debug ("pk_require_auth(%s): authorized, is_challenge: %i", pk_action, ret); - } else { - g_debug ("pk_require_auth(%s): not authorized", pk_action); - } - if (polres) { - g_object_unref (polres); - } - return ret; -} - -gboolean -pk_can_do_action (const gchar *action_id, PolkitAuthorizationResult ** pol_result) -{ - PolkitAuthority *authority; - PolkitSubject *subject; - PolkitAuthorizationResult *result; - gboolean ret; - - authority = polkit_authority_get(); - if (!authority) { - g_warning ("Could not get PolicyKit authority instance"); - return FALSE; - } - subject = polkit_unix_process_new (getpid()); - - result = polkit_authority_check_authorization_sync (authority, subject, action_id, NULL, 0, NULL, NULL); - g_object_unref (authority); - - ret = FALSE; - if (result) { - ret = polkit_authorization_result_get_is_authorized (result) || - polkit_authorization_result_get_is_challenge (result); - g_debug ("pk_can_do_action(%s): %i", action_id, ret); - } else { - g_warning ("pk_can_do_action(%s): check_authorization returned NULL", action_id); - } - if (pol_result) { - *pol_result = result; - } else { - g_object_unref (result); - } - return ret; - -} diff --git a/src/gtk-dialog/ck-pk-helper.h b/src/gtk-dialog/ck-pk-helper.h deleted file mode 100644 index dfbb432..0000000 --- a/src/gtk-dialog/ck-pk-helper.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -A small wrapper utility to load indicators and put them as menu items -into the gnome-panel using it's applet interface. - -Copyright 2009 Canonical Ltd. - -Authors: - Ted Gould - -This program is free software: you can redistribute it and/or modify it -under the terms of the GNU General Public License version 3, as published -by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranties of -MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . -*/ - - -#ifndef __CK_PK_HELPER_H__ -#define __CK_PK_HELPER_H__ 1 - -#include - -gboolean pk_require_auth (LogoutDialogType action); -gboolean pk_can_do_action (const gchar *action_id, PolkitAuthorizationResult ** pol_result); - -#endif /* __CK_PK_HELPER__ */ diff --git a/src/gtk-dialog/gtk-logout-helper.c b/src/gtk-dialog/gtk-logout-helper.c index 09e6e86..5f087ff 100644 --- a/src/gtk-dialog/gtk-logout-helper.c +++ b/src/gtk-dialog/gtk-logout-helper.c @@ -26,7 +26,6 @@ with this program. If not, see . #include #include #include "dialog.h" -#include "ck-pk-helper.h" #include "gconf-helper.h" static void @@ -144,11 +143,6 @@ main (int argc, char * argv[]) INDICATOR_ICONS_DIR); GtkWidget * dialog = NULL; - /* TODO: We're disabling PolicyKit checking here because there - is a bug in ConsoleKit where the dialog doesn't come up until - the session is entirely closed. Stupid, but it's better than - not getting a dialog at all. */ - /* if (!pk_require_auth(type) && !supress_confirmations()) { */ if (!supress_confirmations()) { dialog = GTK_WIDGET(logout_dialog_new(type)); } -- cgit v1.2.3 From b51d58db757ccec277216f3e4f3e74c67ea75884 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 15:27:51 -0600 Subject: Skeleton for checking the different states. --- src/gtk-dialog/dialog.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/gtk-dialog/dialog.c b/src/gtk-dialog/dialog.c index 18f345f..7e2347e 100644 --- a/src/gtk-dialog/dialog.c +++ b/src/gtk-dialog/dialog.c @@ -93,6 +93,25 @@ logout_dialog_finalize (GObject *object) return; } +/* Checks for updates that would signal that a restart is + required for them to apply */ +static gboolean +check_restart_required (void) +{ + + return FALSE; +} + +/* Checks with console kit to see if we can do what we want */ +static gboolean +ck_check_allowed (LogoutDialogType type) +{ + + + + return TRUE; +} + LogoutDialog * logout_dialog_new (LogoutDialogType type) { @@ -113,6 +132,18 @@ logout_dialog_new (LogoutDialogType type) "text", _(body_strings[type]), NULL)); + gboolean allowed = FALSE; + if (type == LOGOUT_DIALOG_TYPE_LOG_OUT) { + allowed = ck_check_allowed(LOGOUT_DIALOG_TYPE_RESTART); + } else { + allowed = ck_check_allowed(type); + } + + gboolean restart_required = FALSE; + if (type == LOGOUT_DIALOG_TYPE_LOG_OUT) { + restart_required = check_restart_required(); + } + gtk_dialog_add_buttons(GTK_DIALOG(dialog), _("Cancel"), GTK_RESPONSE_CANCEL, _(button_strings[type]), GTK_RESPONSE_OK, -- cgit v1.2.3 From d9dd91ad86cfff9457140ee4debd68752e79a99c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 15:42:31 -0600 Subject: Updating merge to new enums. --- src/gtk-dialog/gtk-logout-helper.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/gtk-dialog/gtk-logout-helper.c b/src/gtk-dialog/gtk-logout-helper.c index a76a135..bf37ca7 100644 --- a/src/gtk-dialog/gtk-logout-helper.c +++ b/src/gtk-dialog/gtk-logout-helper.c @@ -29,7 +29,7 @@ with this program. If not, see . #include "gconf-helper.h" static void -consolekit_fallback (LogoutDialogAction action) +consolekit_fallback (LogoutDialogType action) { DBusGConnection * sbus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); g_return_if_fail(sbus != NULL); /* worst case */ @@ -45,16 +45,16 @@ consolekit_fallback (LogoutDialogAction action) GError * error = NULL; switch (action) { - case LOGOUT_DIALOG_LOGOUT: + case LOGOUT_DIALOG_TYPE_LOG_OUT: g_warning("Unable to fallback to ConsoleKit for logout as it's a session issue. We need some sort of session handler."); break; - case LOGOUT_DIALOG_SHUTDOWN: + case LOGOUT_DIALOG_TYPE_SHUTDOWN: dbus_g_proxy_call(proxy, "Stop", &error, G_TYPE_INVALID); break; - case LOGOUT_DIALOG_RESTART: + case LOGOUT_DIALOG_TYPE_RESTART: dbus_g_proxy_call(proxy, "Restart", &error, -- cgit v1.2.3 From 68d13604c069937cdb1e6cab3ecd54cfb45fc593 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 15:49:41 -0600 Subject: Flattening the build tree. --- configure.ac | 1 - po/POTFILES.in | 7 +- src/Makefile.am | 31 +++++- src/dialog.c | 153 ++++++++++++++++++++++++++ src/dialog.h | 42 ++++++++ src/gconf-helper.c | 73 +++++++++++++ src/gconf-helper.h | 50 +++++++++ src/gtk-dialog/Makefile.am | 13 --- src/gtk-dialog/dialog.c | 153 -------------------------- src/gtk-dialog/dialog.h | 42 -------- src/gtk-dialog/gconf-helper.c | 73 ------------- src/gtk-dialog/gconf-helper.h | 50 --------- src/gtk-dialog/gtk-logout-helper.c | 216 ------------------------------------- src/gtk-logout-helper.c | 216 +++++++++++++++++++++++++++++++++++++ src/session-service.c | 2 +- 15 files changed, 566 insertions(+), 556 deletions(-) create mode 100644 src/dialog.c create mode 100644 src/dialog.h create mode 100644 src/gconf-helper.c create mode 100644 src/gconf-helper.h delete mode 100644 src/gtk-dialog/Makefile.am delete mode 100644 src/gtk-dialog/dialog.c delete mode 100644 src/gtk-dialog/dialog.h delete mode 100644 src/gtk-dialog/gconf-helper.c delete mode 100644 src/gtk-dialog/gconf-helper.h delete mode 100644 src/gtk-dialog/gtk-logout-helper.c create mode 100644 src/gtk-logout-helper.c diff --git a/configure.ac b/configure.ac index b3bfd8b..0faca94 100644 --- a/configure.ac +++ b/configure.ac @@ -127,7 +127,6 @@ AM_GLIB_GNU_GETTEXT AC_OUTPUT([ Makefile src/Makefile -src/gtk-dialog/Makefile data/Makefile data/icons/Makefile data/icons/16x16/Makefile diff --git a/po/POTFILES.in b/po/POTFILES.in index 913dc25..6492f1e 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,8 +1,7 @@ [encoding: UTF-8] data/indicator-session.schemas.in -src/gtk-dialog/ck-pk-helper.c -src/gtk-dialog/gconf-helper.c -src/gtk-dialog/gtk-logout-helper.c -src/gtk-dialog/dialog.c +src/gconf-helper.c +src/gtk-logout-helper.c +src/dialog.c src/indicator-session.c src/session-service.c diff --git a/src/Makefile.am b/src/Makefile.am index a07c782..cd525bd 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,7 @@ -SUBDIRS = gtk-dialog -libexec_PROGRAMS = indicator-session-service +libexec_PROGRAMS = \ + indicator-session-service \ + gtk-logout-helper ################### # Indicator Stuff @@ -50,13 +51,37 @@ indicator_session_service_SOURCES = \ lock-helper.h \ session-service.c \ dbusmenu-shared.h \ - gtk-dialog/gconf-helper.c \ + gconf-helper.c \ users-service-dbus.h \ users-service-dbus.c \ users-service-marshal.c indicator_session_service_CFLAGS = $(SESSIONSERVICE_CFLAGS) $(GCONF_CFLAGS) -DLIBEXECDIR=\"$(libexecdir)\" -Wall -Werror indicator_session_service_LDADD = $(SESSIONSERVICE_LIBS) $(GCONF_LIBS) +################# +# GTK Logout Stuff +################# + +gtk_logout_helper_SOURCES = \ + gtk-logout-helper.c \ + gconf-helper.c \ + gconf-helper.h \ + dialog.c \ + dialog.h + +gtk_logout_helper_CFLAGS = \ + $(SESSIONSERVICE_CFLAGS) \ + $(GTKLOGOUTHELPER_CFLAGS) \ + $(GCONF_CFLAGS) \ + -Wall -Werror \ + -DINDICATOR_ICONS_DIR="\"$(INDICATORICONSDIR)\"" + +gtk_logout_helper_LDADD = \ + $(SESSIONSERVICE_LIBS) \ + $(GTKLOGOUTHELPER_LIBS) \ + $(GCONF_LIBS) + + ############### # Other Stuff ############### diff --git a/src/dialog.c b/src/dialog.c new file mode 100644 index 0000000..7e2347e --- /dev/null +++ b/src/dialog.c @@ -0,0 +1,153 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "dialog.h" + +/* Strings */ + +static const gchar * title_strings[LOGOUT_DIALOG_TYPE_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ NC_("title", "Log Out"), + /* LOGOUT_DIALOG_RESTART, */ NC_("title", "Restart"), + /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("title", "Switch Off") +}; + +static const gchar * body_strings[LOGOUT_DIALOG_TYPE_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ N_("Are you sure you want to close all programs and log out?"), + /* LOGOUT_DIALOG_RESTART, */ N_("Are you sure you want to close all programs and restart the computer?"), + /* LOGOUT_DIALOG_SHUTDOWN, */ N_("Are you sure you want to close all programs and shut down the computer?") +}; + +static const gchar * button_strings[LOGOUT_DIALOG_TYPE_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ NC_("button", "Log Out"), + /* LOGOUT_DIALOG_RESTART, */ NC_("button", "Restart"), + /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button", "Switch Off") +}; + +/* +static const gchar * restart_updates = N_("Restart Instead"); +static const gchar * restart_auth = N_("Restart..."); +static const gchar * body_logout_update = N_("Some software updates won't apply until the computer next restarts."); +*/ + +static const gchar * icon_strings[LOGOUT_DIALOG_TYPE_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ "system-log-out", + /* LOGOUT_DIALOG_RESTART, */ "system-restart", + /* LOGOUT_DIALOG_SHUTDOWN, */ "system-shutdown" +}; + + + +typedef struct _LogoutDialogPrivate LogoutDialogPrivate; +struct _LogoutDialogPrivate { + guint type; +}; + +#define LOGOUT_DIALOG_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), LOGOUT_DIALOG_TYPE, LogoutDialogPrivate)) + +static void logout_dialog_class_init (LogoutDialogClass *klass); +static void logout_dialog_init (LogoutDialog *self); +static void logout_dialog_dispose (GObject *object); +static void logout_dialog_finalize (GObject *object); + +G_DEFINE_TYPE (LogoutDialog, logout_dialog, GTK_TYPE_MESSAGE_DIALOG); + +static void +logout_dialog_class_init (LogoutDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (LogoutDialogPrivate)); + + object_class->dispose = logout_dialog_dispose; + object_class->finalize = logout_dialog_finalize; + + return; +} + +static void +logout_dialog_init (LogoutDialog *self) +{ + + return; +} + +static void +logout_dialog_dispose (GObject *object) +{ + + + G_OBJECT_CLASS (logout_dialog_parent_class)->dispose (object); + return; +} + +static void +logout_dialog_finalize (GObject *object) +{ + + + G_OBJECT_CLASS (logout_dialog_parent_class)->finalize (object); + return; +} + +/* Checks for updates that would signal that a restart is + required for them to apply */ +static gboolean +check_restart_required (void) +{ + + return FALSE; +} + +/* Checks with console kit to see if we can do what we want */ +static gboolean +ck_check_allowed (LogoutDialogType type) +{ + + + + return TRUE; +} + +LogoutDialog * +logout_dialog_new (LogoutDialogType type) +{ + GtkWidget * image = gtk_image_new_from_icon_name(icon_strings[type], GTK_ICON_SIZE_DIALOG); + gtk_widget_show(image); + + LogoutDialog * dialog = LOGOUT_DIALOG(g_object_new(LOGOUT_DIALOG_TYPE, + /* Window */ + "icon-name", icon_strings[type], + "modal", TRUE, + "resizable", FALSE, + "title", _(title_strings[type]), + "window-position", GTK_WIN_POS_CENTER_ALWAYS, + /* Message Dialog */ + "buttons", GTK_BUTTONS_NONE, + "image", image, + "message-type", GTK_MESSAGE_OTHER, + "text", _(body_strings[type]), + NULL)); + + gboolean allowed = FALSE; + if (type == LOGOUT_DIALOG_TYPE_LOG_OUT) { + allowed = ck_check_allowed(LOGOUT_DIALOG_TYPE_RESTART); + } else { + allowed = ck_check_allowed(type); + } + + gboolean restart_required = FALSE; + if (type == LOGOUT_DIALOG_TYPE_LOG_OUT) { + restart_required = check_restart_required(); + } + + gtk_dialog_add_buttons(GTK_DIALOG(dialog), + _("Cancel"), GTK_RESPONSE_CANCEL, + _(button_strings[type]), GTK_RESPONSE_OK, + NULL); + + return dialog; +} diff --git a/src/dialog.h b/src/dialog.h new file mode 100644 index 0000000..3240a8e --- /dev/null +++ b/src/dialog.h @@ -0,0 +1,42 @@ +#ifndef __LOGOUT_DIALOG_H__ +#define __LOGOUT_DIALOG_H__ + +#include +#include + +#include + +G_BEGIN_DECLS + +#define LOGOUT_DIALOG_TYPE (logout_dialog_get_type ()) +#define LOGOUT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LOGOUT_DIALOG_TYPE, LogoutDialog)) +#define LOGOUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LOGOUT_DIALOG_TYPE, LogoutDialogClass)) +#define IS_LOGOUT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LOGOUT_DIALOG_TYPE)) +#define IS_LOGOUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LOGOUT_DIALOG_TYPE)) +#define LOGOUT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LOGOUT_DIALOG_TYPE, LogoutDialogClass)) + +typedef enum _LogoutDialogType LogoutDialogType; +enum _LogoutDialogType { + LOGOUT_DIALOG_TYPE_LOG_OUT, + LOGOUT_DIALOG_TYPE_RESTART, + LOGOUT_DIALOG_TYPE_SHUTDOWN, + LOGOUT_DIALOG_TYPE_CNT +}; + +typedef struct _LogoutDialog LogoutDialog; +typedef struct _LogoutDialogClass LogoutDialogClass; + +struct _LogoutDialogClass { + GtkMessageDialogClass parent_class; +}; + +struct _LogoutDialog { + GtkMessageDialog parent; +}; + +GType logout_dialog_get_type (void); +LogoutDialog * logout_dialog_new (LogoutDialogType type); + +G_END_DECLS + +#endif diff --git a/src/gconf-helper.c b/src/gconf-helper.c new file mode 100644 index 0000000..213592e --- /dev/null +++ b/src/gconf-helper.c @@ -0,0 +1,73 @@ +/* +A small wrapper utility for connecting to gconf. + +Copyright 2009 Canonical Ltd. + +Authors: + Christoph Korn + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . +*/ + + +#include + +#include + +#include +#include + +#include +#include + +#include "gconf-helper.h" + +static GConfClient * gconf_client = NULL; + +gboolean +supress_confirmations (void) { + if(!gconf_client) { + gconf_client = gconf_client_get_default (); + } + return gconf_client_get_bool (gconf_client, SUPPRESS_KEY, NULL) ; +} + +static void update_menu_entries_callback (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer data) { + RestartShutdownLogoutMenuItems * restart_shutdown_logout_mi = (RestartShutdownLogoutMenuItems*) data; + GConfValue * value = gconf_entry_get_value (entry); + const gchar * key = gconf_entry_get_key (entry); + + if(g_strcmp0 (key, SUPPRESS_KEY) == 0) { + if (gconf_value_get_bool (value)) { + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out")); + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart")); + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown")); + } else { + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out...")); + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart...")); + dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown...")); + } + } +} + +void +update_menu_entries(RestartShutdownLogoutMenuItems * restart_shutdown_logout_mi) { + if(!gconf_client) { + gconf_client = gconf_client_get_default (); + } + gconf_client_add_dir (gconf_client, GLOBAL_DIR, + GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); + gconf_client_notify_add (gconf_client, SUPPRESS_KEY, + update_menu_entries_callback, restart_shutdown_logout_mi, NULL, NULL); +} + diff --git a/src/gconf-helper.h b/src/gconf-helper.h new file mode 100644 index 0000000..951bb0f --- /dev/null +++ b/src/gconf-helper.h @@ -0,0 +1,50 @@ +/* +A small wrapper utility for connecting to gconf. + +Copyright 2009 Canonical Ltd. + +Authors: + Christoph Korn + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . +*/ + + +#ifndef __GCONF_HELPER_H__ +#define __GCONF_HELPER_H__ 1 + +#include + +#include + +#include +#include + +#include +#include + +#define SUPPRESS_KEY "/apps/indicator-session/suppress_logout_restart_shutdown" +#define GLOBAL_DIR "/apps/indicator-session" + +typedef struct _RestartShutdownLogoutMenuItems +{ + DbusmenuMenuitem * logout_mi; + DbusmenuMenuitem * restart_mi; + DbusmenuMenuitem * shutdown_mi; +} +RestartShutdownLogoutMenuItems; + +void update_menu_entries(RestartShutdownLogoutMenuItems*); +gboolean supress_confirmations (void); + +#endif /* __GCONF_HELPER__ */ diff --git a/src/gtk-dialog/Makefile.am b/src/gtk-dialog/Makefile.am deleted file mode 100644 index 508beb2..0000000 --- a/src/gtk-dialog/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ - -libexec_PROGRAMS = gtk-logout-helper - -gtk_logout_helper_SOURCES = \ - gtk-logout-helper.c \ - gconf-helper.c \ - gconf-helper.h \ - dialog.c \ - dialog.h - -gtk_logout_helper_CFLAGS = $(SESSIONSERVICE_CFLAGS) $(GTKLOGOUTHELPER_CFLAGS) $(GCONF_CFLAGS) -Wall -Werror -DINDICATOR_ICONS_DIR="\"$(INDICATORICONSDIR)\"" -gtk_logout_helper_LDADD = $(SESSIONSERVICE_LIBS) $(GTKLOGOUTHELPER_LIBS) $(GCONF_LIBS) - diff --git a/src/gtk-dialog/dialog.c b/src/gtk-dialog/dialog.c deleted file mode 100644 index 7e2347e..0000000 --- a/src/gtk-dialog/dialog.c +++ /dev/null @@ -1,153 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -#include "dialog.h" - -/* Strings */ - -static const gchar * title_strings[LOGOUT_DIALOG_TYPE_CNT] = { - /* LOGOUT_DIALOG_LOGOUT, */ NC_("title", "Log Out"), - /* LOGOUT_DIALOG_RESTART, */ NC_("title", "Restart"), - /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("title", "Switch Off") -}; - -static const gchar * body_strings[LOGOUT_DIALOG_TYPE_CNT] = { - /* LOGOUT_DIALOG_LOGOUT, */ N_("Are you sure you want to close all programs and log out?"), - /* LOGOUT_DIALOG_RESTART, */ N_("Are you sure you want to close all programs and restart the computer?"), - /* LOGOUT_DIALOG_SHUTDOWN, */ N_("Are you sure you want to close all programs and shut down the computer?") -}; - -static const gchar * button_strings[LOGOUT_DIALOG_TYPE_CNT] = { - /* LOGOUT_DIALOG_LOGOUT, */ NC_("button", "Log Out"), - /* LOGOUT_DIALOG_RESTART, */ NC_("button", "Restart"), - /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button", "Switch Off") -}; - -/* -static const gchar * restart_updates = N_("Restart Instead"); -static const gchar * restart_auth = N_("Restart..."); -static const gchar * body_logout_update = N_("Some software updates won't apply until the computer next restarts."); -*/ - -static const gchar * icon_strings[LOGOUT_DIALOG_TYPE_CNT] = { - /* LOGOUT_DIALOG_LOGOUT, */ "system-log-out", - /* LOGOUT_DIALOG_RESTART, */ "system-restart", - /* LOGOUT_DIALOG_SHUTDOWN, */ "system-shutdown" -}; - - - -typedef struct _LogoutDialogPrivate LogoutDialogPrivate; -struct _LogoutDialogPrivate { - guint type; -}; - -#define LOGOUT_DIALOG_GET_PRIVATE(o) \ -(G_TYPE_INSTANCE_GET_PRIVATE ((o), LOGOUT_DIALOG_TYPE, LogoutDialogPrivate)) - -static void logout_dialog_class_init (LogoutDialogClass *klass); -static void logout_dialog_init (LogoutDialog *self); -static void logout_dialog_dispose (GObject *object); -static void logout_dialog_finalize (GObject *object); - -G_DEFINE_TYPE (LogoutDialog, logout_dialog, GTK_TYPE_MESSAGE_DIALOG); - -static void -logout_dialog_class_init (LogoutDialogClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - g_type_class_add_private (klass, sizeof (LogoutDialogPrivate)); - - object_class->dispose = logout_dialog_dispose; - object_class->finalize = logout_dialog_finalize; - - return; -} - -static void -logout_dialog_init (LogoutDialog *self) -{ - - return; -} - -static void -logout_dialog_dispose (GObject *object) -{ - - - G_OBJECT_CLASS (logout_dialog_parent_class)->dispose (object); - return; -} - -static void -logout_dialog_finalize (GObject *object) -{ - - - G_OBJECT_CLASS (logout_dialog_parent_class)->finalize (object); - return; -} - -/* Checks for updates that would signal that a restart is - required for them to apply */ -static gboolean -check_restart_required (void) -{ - - return FALSE; -} - -/* Checks with console kit to see if we can do what we want */ -static gboolean -ck_check_allowed (LogoutDialogType type) -{ - - - - return TRUE; -} - -LogoutDialog * -logout_dialog_new (LogoutDialogType type) -{ - GtkWidget * image = gtk_image_new_from_icon_name(icon_strings[type], GTK_ICON_SIZE_DIALOG); - gtk_widget_show(image); - - LogoutDialog * dialog = LOGOUT_DIALOG(g_object_new(LOGOUT_DIALOG_TYPE, - /* Window */ - "icon-name", icon_strings[type], - "modal", TRUE, - "resizable", FALSE, - "title", _(title_strings[type]), - "window-position", GTK_WIN_POS_CENTER_ALWAYS, - /* Message Dialog */ - "buttons", GTK_BUTTONS_NONE, - "image", image, - "message-type", GTK_MESSAGE_OTHER, - "text", _(body_strings[type]), - NULL)); - - gboolean allowed = FALSE; - if (type == LOGOUT_DIALOG_TYPE_LOG_OUT) { - allowed = ck_check_allowed(LOGOUT_DIALOG_TYPE_RESTART); - } else { - allowed = ck_check_allowed(type); - } - - gboolean restart_required = FALSE; - if (type == LOGOUT_DIALOG_TYPE_LOG_OUT) { - restart_required = check_restart_required(); - } - - gtk_dialog_add_buttons(GTK_DIALOG(dialog), - _("Cancel"), GTK_RESPONSE_CANCEL, - _(button_strings[type]), GTK_RESPONSE_OK, - NULL); - - return dialog; -} diff --git a/src/gtk-dialog/dialog.h b/src/gtk-dialog/dialog.h deleted file mode 100644 index 3240a8e..0000000 --- a/src/gtk-dialog/dialog.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef __LOGOUT_DIALOG_H__ -#define __LOGOUT_DIALOG_H__ - -#include -#include - -#include - -G_BEGIN_DECLS - -#define LOGOUT_DIALOG_TYPE (logout_dialog_get_type ()) -#define LOGOUT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LOGOUT_DIALOG_TYPE, LogoutDialog)) -#define LOGOUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LOGOUT_DIALOG_TYPE, LogoutDialogClass)) -#define IS_LOGOUT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LOGOUT_DIALOG_TYPE)) -#define IS_LOGOUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LOGOUT_DIALOG_TYPE)) -#define LOGOUT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LOGOUT_DIALOG_TYPE, LogoutDialogClass)) - -typedef enum _LogoutDialogType LogoutDialogType; -enum _LogoutDialogType { - LOGOUT_DIALOG_TYPE_LOG_OUT, - LOGOUT_DIALOG_TYPE_RESTART, - LOGOUT_DIALOG_TYPE_SHUTDOWN, - LOGOUT_DIALOG_TYPE_CNT -}; - -typedef struct _LogoutDialog LogoutDialog; -typedef struct _LogoutDialogClass LogoutDialogClass; - -struct _LogoutDialogClass { - GtkMessageDialogClass parent_class; -}; - -struct _LogoutDialog { - GtkMessageDialog parent; -}; - -GType logout_dialog_get_type (void); -LogoutDialog * logout_dialog_new (LogoutDialogType type); - -G_END_DECLS - -#endif diff --git a/src/gtk-dialog/gconf-helper.c b/src/gtk-dialog/gconf-helper.c deleted file mode 100644 index 213592e..0000000 --- a/src/gtk-dialog/gconf-helper.c +++ /dev/null @@ -1,73 +0,0 @@ -/* -A small wrapper utility for connecting to gconf. - -Copyright 2009 Canonical Ltd. - -Authors: - Christoph Korn - -This program is free software: you can redistribute it and/or modify it -under the terms of the GNU General Public License version 3, as published -by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranties of -MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . -*/ - - -#include - -#include - -#include -#include - -#include -#include - -#include "gconf-helper.h" - -static GConfClient * gconf_client = NULL; - -gboolean -supress_confirmations (void) { - if(!gconf_client) { - gconf_client = gconf_client_get_default (); - } - return gconf_client_get_bool (gconf_client, SUPPRESS_KEY, NULL) ; -} - -static void update_menu_entries_callback (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer data) { - RestartShutdownLogoutMenuItems * restart_shutdown_logout_mi = (RestartShutdownLogoutMenuItems*) data; - GConfValue * value = gconf_entry_get_value (entry); - const gchar * key = gconf_entry_get_key (entry); - - if(g_strcmp0 (key, SUPPRESS_KEY) == 0) { - if (gconf_value_get_bool (value)) { - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out")); - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart")); - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown")); - } else { - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->logout_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Log Out...")); - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart...")); - dbusmenu_menuitem_property_set(restart_shutdown_logout_mi->shutdown_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Shutdown...")); - } - } -} - -void -update_menu_entries(RestartShutdownLogoutMenuItems * restart_shutdown_logout_mi) { - if(!gconf_client) { - gconf_client = gconf_client_get_default (); - } - gconf_client_add_dir (gconf_client, GLOBAL_DIR, - GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); - gconf_client_notify_add (gconf_client, SUPPRESS_KEY, - update_menu_entries_callback, restart_shutdown_logout_mi, NULL, NULL); -} - diff --git a/src/gtk-dialog/gconf-helper.h b/src/gtk-dialog/gconf-helper.h deleted file mode 100644 index 951bb0f..0000000 --- a/src/gtk-dialog/gconf-helper.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -A small wrapper utility for connecting to gconf. - -Copyright 2009 Canonical Ltd. - -Authors: - Christoph Korn - -This program is free software: you can redistribute it and/or modify it -under the terms of the GNU General Public License version 3, as published -by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranties of -MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . -*/ - - -#ifndef __GCONF_HELPER_H__ -#define __GCONF_HELPER_H__ 1 - -#include - -#include - -#include -#include - -#include -#include - -#define SUPPRESS_KEY "/apps/indicator-session/suppress_logout_restart_shutdown" -#define GLOBAL_DIR "/apps/indicator-session" - -typedef struct _RestartShutdownLogoutMenuItems -{ - DbusmenuMenuitem * logout_mi; - DbusmenuMenuitem * restart_mi; - DbusmenuMenuitem * shutdown_mi; -} -RestartShutdownLogoutMenuItems; - -void update_menu_entries(RestartShutdownLogoutMenuItems*); -gboolean supress_confirmations (void); - -#endif /* __GCONF_HELPER__ */ diff --git a/src/gtk-dialog/gtk-logout-helper.c b/src/gtk-dialog/gtk-logout-helper.c deleted file mode 100644 index bf37ca7..0000000 --- a/src/gtk-dialog/gtk-logout-helper.c +++ /dev/null @@ -1,216 +0,0 @@ -/* -A small wrapper utility to load indicators and put them as menu items -into the gnome-panel using it's applet interface. - -Copyright 2009 Canonical Ltd. - -Authors: - Ted Gould - Christoph Korn - -This program is free software: you can redistribute it and/or modify it -under the terms of the GNU General Public License version 3, as published -by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranties of -MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . -*/ - -#include -#include -#include -#include -#include "dialog.h" -#include "gconf-helper.h" - -static void -consolekit_fallback (LogoutDialogType action) -{ - DBusGConnection * sbus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); - g_return_if_fail(sbus != NULL); /* 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) { - g_warning("Unable to get consolekit proxy"); - return; - } - - GError * error = NULL; - - switch (action) { - case LOGOUT_DIALOG_TYPE_LOG_OUT: - g_warning("Unable to fallback to ConsoleKit for logout as it's a session issue. We need some sort of session handler."); - break; - case LOGOUT_DIALOG_TYPE_SHUTDOWN: - dbus_g_proxy_call(proxy, - "Stop", - &error, - G_TYPE_INVALID); - break; - case LOGOUT_DIALOG_TYPE_RESTART: - dbus_g_proxy_call(proxy, - "Restart", - &error, - G_TYPE_INVALID); - break; - default: - g_warning("Unknown action"); - break; - } - - g_object_unref(proxy); - - if (error != NULL) { - g_error("Unable to signal ConsoleKit: %s", error->message); - g_error_free(error); - } - - return; -} - -static void -session_action (LogoutDialogType 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); - - consolekit_fallback(action); - return; - } - - g_clear_error (&error); - - if (action == LOGOUT_DIALOG_TYPE_LOG_OUT) { - 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_TYPE_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_TYPE_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 LogoutDialogType type = LOGOUT_DIALOG_TYPE_LOG_OUT; - -static gboolean -option_logout (const gchar * arg, const gchar * value, gpointer data, GError * error) -{ - type = LOGOUT_DIALOG_TYPE_LOG_OUT; - return TRUE; -} - -static gboolean -option_shutdown (const gchar * arg, const gchar * value, gpointer data, GError * error) -{ - type = LOGOUT_DIALOG_TYPE_SHUTDOWN; - return TRUE; -} - -static gboolean -option_restart (const gchar * arg, const gchar * value, gpointer data, GError * error) -{ - type = LOGOUT_DIALOG_TYPE_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); - - /* Setting up i18n and gettext. Apparently, we need - all of these. */ - setlocale (LC_ALL, ""); - bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); - textdomain (GETTEXT_PACKAGE); - - 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; - } - - /* Init some theme/icon stuff */ - gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(), - INDICATOR_ICONS_DIR); - - GtkWidget * dialog = NULL; - if (!supress_confirmations()) { - dialog = GTK_WIDGET(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_TYPE_RESTART; - response = GTK_RESPONSE_OK; - } - - if (response != GTK_RESPONSE_OK) { - return 0; - } - } - - session_action(type); - - return 0; -} diff --git a/src/gtk-logout-helper.c b/src/gtk-logout-helper.c new file mode 100644 index 0000000..bf37ca7 --- /dev/null +++ b/src/gtk-logout-helper.c @@ -0,0 +1,216 @@ +/* +A small wrapper utility to load indicators and put them as menu items +into the gnome-panel using it's applet interface. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + Christoph Korn + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . +*/ + +#include +#include +#include +#include +#include "dialog.h" +#include "gconf-helper.h" + +static void +consolekit_fallback (LogoutDialogType action) +{ + DBusGConnection * sbus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); + g_return_if_fail(sbus != NULL); /* 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) { + g_warning("Unable to get consolekit proxy"); + return; + } + + GError * error = NULL; + + switch (action) { + case LOGOUT_DIALOG_TYPE_LOG_OUT: + g_warning("Unable to fallback to ConsoleKit for logout as it's a session issue. We need some sort of session handler."); + break; + case LOGOUT_DIALOG_TYPE_SHUTDOWN: + dbus_g_proxy_call(proxy, + "Stop", + &error, + G_TYPE_INVALID); + break; + case LOGOUT_DIALOG_TYPE_RESTART: + dbus_g_proxy_call(proxy, + "Restart", + &error, + G_TYPE_INVALID); + break; + default: + g_warning("Unknown action"); + break; + } + + g_object_unref(proxy); + + if (error != NULL) { + g_error("Unable to signal ConsoleKit: %s", error->message); + g_error_free(error); + } + + return; +} + +static void +session_action (LogoutDialogType 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); + + consolekit_fallback(action); + return; + } + + g_clear_error (&error); + + if (action == LOGOUT_DIALOG_TYPE_LOG_OUT) { + 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_TYPE_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_TYPE_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 LogoutDialogType type = LOGOUT_DIALOG_TYPE_LOG_OUT; + +static gboolean +option_logout (const gchar * arg, const gchar * value, gpointer data, GError * error) +{ + type = LOGOUT_DIALOG_TYPE_LOG_OUT; + return TRUE; +} + +static gboolean +option_shutdown (const gchar * arg, const gchar * value, gpointer data, GError * error) +{ + type = LOGOUT_DIALOG_TYPE_SHUTDOWN; + return TRUE; +} + +static gboolean +option_restart (const gchar * arg, const gchar * value, gpointer data, GError * error) +{ + type = LOGOUT_DIALOG_TYPE_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); + + /* Setting up i18n and gettext. Apparently, we need + all of these. */ + setlocale (LC_ALL, ""); + bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); + textdomain (GETTEXT_PACKAGE); + + 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; + } + + /* Init some theme/icon stuff */ + gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(), + INDICATOR_ICONS_DIR); + + GtkWidget * dialog = NULL; + if (!supress_confirmations()) { + dialog = GTK_WIDGET(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_TYPE_RESTART; + response = GTK_RESPONSE_OK; + } + + if (response != GTK_RESPONSE_OK) { + return 0; + } + } + + session_action(type); + + return 0; +} diff --git a/src/session-service.c b/src/session-service.c index 289bff8..af3c3e5 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -40,7 +40,7 @@ with this program. If not, see . #include "dbus-shared-names.h" #include "dbusmenu-shared.h" -#include "gtk-dialog/gconf-helper.h" +#include "gconf-helper.h" #include "users-service-dbus.h" #include "lock-helper.h" -- cgit v1.2.3 From 2ae450d4f50ed3da4383ad5e4fcd470986deee3b Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 16:18:00 -0600 Subject: Filling in the code to check and see if we can restart or stop. --- src/dialog.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/dialog.c b/src/dialog.c index 7e2347e..6dd7a90 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -4,6 +4,7 @@ #include +#include "consolekit-manager-client.h" #include "dialog.h" /* Strings */ @@ -106,10 +107,30 @@ check_restart_required (void) static gboolean ck_check_allowed (LogoutDialogType type) { + DBusGConnection * system_bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL); + g_return_val_if_fail(system_bus != NULL, TRUE); + + DBusGProxy * ck_proxy = dbus_g_proxy_new_for_name (system_bus, + "org.freedesktop.ConsoleKit", + "/org/freedesktop/ConsoleKit/Manager", + "org.freedesktop.ConsoleKit.Manager"); + g_return_val_if_fail(ck_proxy != NULL, TRUE); + + gboolean retval = TRUE; + switch (type) { + case LOGOUT_DIALOG_TYPE_RESTART: + org_freedesktop_ConsoleKit_Manager_can_restart(ck_proxy, &retval, NULL); + break; + case LOGOUT_DIALOG_TYPE_SHUTDOWN: + org_freedesktop_ConsoleKit_Manager_can_stop(ck_proxy, &retval, NULL); + break; + default: + break; + } + g_object_unref(ck_proxy); - - return TRUE; + return retval; } LogoutDialog * -- cgit v1.2.3 From a76563f00527498fd4121d2b824ef622bc062985 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 16:38:44 -0600 Subject: Adding in different button strings if we need authentication. --- src/dialog.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/dialog.c b/src/dialog.c index 6dd7a90..dd681b3 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -27,6 +27,14 @@ static const gchar * button_strings[LOGOUT_DIALOG_TYPE_CNT] = { /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button", "Switch Off") }; +/* TRANSLATORS: These strings have an ellipsis so that the user knows + they are also going to get a password dialog to do the action. */ +static const gchar * button_auth_strings[LOGOUT_DIALOG_TYPE_CNT] = { + /* LOGOUT_DIALOG_LOGOUT, */ NC_("button auth", "Log Out"), + /* LOGOUT_DIALOG_RESTART, */ NC_("button auth", "Restart..."), + /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button auth", "Switch Off...") +}; + /* static const gchar * restart_updates = N_("Restart Instead"); static const gchar * restart_auth = N_("Restart..."); @@ -165,9 +173,16 @@ logout_dialog_new (LogoutDialogType type) restart_required = check_restart_required(); } + const gchar * button_text; + if (allowed) { + button_text = _(button_strings[type]); + } else { + button_text = _(button_auth_strings[type]); + } + gtk_dialog_add_buttons(GTK_DIALOG(dialog), _("Cancel"), GTK_RESPONSE_CANCEL, - _(button_strings[type]), GTK_RESPONSE_OK, + button_text, GTK_RESPONSE_OK, NULL); return dialog; -- cgit v1.2.3 From 3928d091aaa4beacbf86dfc51b5ccc04c9ee4b36 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 16:55:50 -0600 Subject: Checking to see if we need updates and allowing that on logout dialogs. --- src/dialog.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/dialog.c b/src/dialog.c index dd681b3..f30eb17 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -35,11 +35,9 @@ static const gchar * button_auth_strings[LOGOUT_DIALOG_TYPE_CNT] = { /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button auth", "Switch Off...") }; -/* static const gchar * restart_updates = N_("Restart Instead"); static const gchar * restart_auth = N_("Restart..."); static const gchar * body_logout_update = N_("Some software updates won't apply until the computer next restarts."); -*/ static const gchar * icon_strings[LOGOUT_DIALOG_TYPE_CNT] = { /* LOGOUT_DIALOG_LOGOUT, */ "system-log-out", @@ -107,8 +105,7 @@ logout_dialog_finalize (GObject *object) static gboolean check_restart_required (void) { - - return FALSE; + return g_file_test("/var/run/reboot-required", G_FILE_TEST_EXISTS); } /* Checks with console kit to see if we can do what we want */ @@ -180,10 +177,27 @@ logout_dialog_new (LogoutDialogType type) button_text = _(button_auth_strings[type]); } - gtk_dialog_add_buttons(GTK_DIALOG(dialog), - _("Cancel"), GTK_RESPONSE_CANCEL, - button_text, GTK_RESPONSE_OK, - NULL); + if (restart_required) { + const gchar * restart_req; + if (allowed) { + restart_req = restart_updates; + } else { + restart_req = restart_auth; + } + + g_object_set(dialog, "secondary-text", _(body_logout_update), NULL); + + gtk_dialog_add_buttons(GTK_DIALOG(dialog), + _(restart_req), GTK_RESPONSE_HELP, + _("Cancel"), GTK_RESPONSE_CANCEL, + button_text, GTK_RESPONSE_OK, + NULL); + } else { + gtk_dialog_add_buttons(GTK_DIALOG(dialog), + _("Cancel"), GTK_RESPONSE_CANCEL, + button_text, GTK_RESPONSE_OK, + NULL); + } return dialog; } -- cgit v1.2.3 From 8d96a4fc56e194b1c4e8b1370d1a35703b92a3fe Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 16:57:37 -0600 Subject: String fixes and a comment. --- src/dialog.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/dialog.c b/src/dialog.c index f30eb17..b63ecef 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -35,8 +35,11 @@ static const gchar * button_auth_strings[LOGOUT_DIALOG_TYPE_CNT] = { /* LOGOUT_DIALOG_SHUTDOWN, */ NC_("button auth", "Switch Off...") }; +/* TRANSLATORS: This button appears on the logout dialog when + there are updates that require restart. It will do a restart + in place of a log out. */ static const gchar * restart_updates = N_("Restart Instead"); -static const gchar * restart_auth = N_("Restart..."); +static const gchar * restart_auth = N_("Restart Instead..."); static const gchar * body_logout_update = N_("Some software updates won't apply until the computer next restarts."); static const gchar * icon_strings[LOGOUT_DIALOG_TYPE_CNT] = { -- cgit v1.2.3 From 10e1e69dae2be7388dca78a253173e3e5e9e3641 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 17:00:45 -0600 Subject: Setting the default button. --- src/dialog.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dialog.c b/src/dialog.c index b63ecef..fcc3334 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -202,5 +202,7 @@ logout_dialog_new (LogoutDialogType type) NULL); } + gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); + return dialog; } -- cgit v1.2.3 From edeb525d966748a31e0abd7526c84c59f5c0e365 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 20:36:18 -0600 Subject: Slightly longer string for better wrapping. --- src/dialog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dialog.c b/src/dialog.c index fcc3334..3e3799d 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -16,7 +16,7 @@ static const gchar * title_strings[LOGOUT_DIALOG_TYPE_CNT] = { }; static const gchar * body_strings[LOGOUT_DIALOG_TYPE_CNT] = { - /* LOGOUT_DIALOG_LOGOUT, */ N_("Are you sure you want to close all programs and log out?"), + /* LOGOUT_DIALOG_LOGOUT, */ N_("Are you sure you want to close all programs and log out of the computer?"), /* LOGOUT_DIALOG_RESTART, */ N_("Are you sure you want to close all programs and restart the computer?"), /* LOGOUT_DIALOG_SHUTDOWN, */ N_("Are you sure you want to close all programs and shut down the computer?") }; -- cgit v1.2.3 From 25e5df53f5584fa04ff0f9949f619f9031acc4a1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 20:37:47 -0600 Subject: Copyright headers --- src/dialog.c | 22 ++++++++++++++++++++++ src/dialog.h | 22 ++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/src/dialog.c b/src/dialog.c index 3e3799d..deefe0b 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -1,3 +1,25 @@ +/* +A dialog to ask the user about the various logout options that +are available. + +Copyright 2010 Canonical Ltd. + +Authors: + Ted Gould + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . +*/ + #ifdef HAVE_CONFIG_H #include "config.h" #endif diff --git a/src/dialog.h b/src/dialog.h index 3240a8e..18a55a7 100644 --- a/src/dialog.h +++ b/src/dialog.h @@ -1,3 +1,25 @@ +/* +A dialog to ask the user about the various logout options that +are available. + +Copyright 2010 Canonical Ltd. + +Authors: + Ted Gould + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . +*/ + #ifndef __LOGOUT_DIALOG_H__ #define __LOGOUT_DIALOG_H__ -- cgit v1.2.3 From 2aeb4a3c7a9dc8821361aac9fc2db6494a7b45cd Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 20:47:35 -0600 Subject: LGPL not needed with dropping the logout-dialog.c file. --- COPYING.LGPL | 481 ----------------------------------------------------------- Makefile.am | 2 +- 2 files changed, 1 insertion(+), 482 deletions(-) delete mode 100644 COPYING.LGPL diff --git a/COPYING.LGPL b/COPYING.LGPL deleted file mode 100644 index 2676d08..0000000 --- a/COPYING.LGPL +++ /dev/null @@ -1,481 +0,0 @@ - GNU LIBRARY GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the library GPL. It is - numbered 2 because it goes with version 2 of the ordinary GPL.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Library General Public License, applies to some -specially designated Free Software Foundation software, and to any -other libraries whose authors decide to use it. You can use it for -your libraries, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if -you distribute copies of the library, or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link a program with the library, you must provide -complete object files to the recipients so that they can relink them -with the library, after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - Our method of protecting your rights has two steps: (1) copyright -the library, and (2) offer you this license which gives you legal -permission to copy, distribute and/or modify the library. - - Also, for each distributor's protection, we want to make certain -that everyone understands that there is no warranty for this free -library. If the library is modified by someone else and passed on, we -want its recipients to know that what they have is not the original -version, so that any problems introduced by others will not reflect on -the original authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that companies distributing free -software will individually obtain patent licenses, thus in effect -transforming the program into proprietary software. To prevent this, -we have made it clear that any patent must be licensed for everyone's -free use or not licensed at all. - - Most GNU software, including some libraries, is covered by the ordinary -GNU General Public License, which was designed for utility programs. This -license, the GNU Library General Public License, applies to certain -designated libraries. This license is quite different from the ordinary -one; be sure to read it in full, and don't assume that anything in it is -the same as in the ordinary license. - - The reason we have a separate public license for some libraries is that -they blur the distinction we usually make between modifying or adding to a -program and simply using it. Linking a program with a library, without -changing the library, is in some sense simply using the library, and is -analogous to running a utility program or application program. However, in -a textual and legal sense, the linked executable is a combined work, a -derivative of the original library, and the ordinary General Public License -treats it as such. - - Because of this blurred distinction, using the ordinary General -Public License for libraries did not effectively promote software -sharing, because most developers did not use the libraries. We -concluded that weaker conditions might promote sharing better. - - However, unrestricted linking of non-free programs would deprive the -users of those programs of all benefit from the free status of the -libraries themselves. This Library General Public License is intended to -permit developers of non-free programs to use free libraries, while -preserving your freedom as a user of such programs to change the free -libraries that are incorporated in them. (We have not seen how to achieve -this as regards changes in header files, but we have achieved it as regards -changes in the actual functions of the Library.) The hope is that this -will lead to faster development of free libraries. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, while the latter only -works together with the library. - - Note that it is possible for a library to be covered by the ordinary -General Public License rather than by this special one. - - GNU LIBRARY GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library which -contains a notice placed by the copyright holder or other authorized -party saying it may be distributed under the terms of this Library -General Public License (also called "this License"). Each licensee is -addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also compile or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - c) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - d) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the source code distributed need not include anything that is normally -distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Library General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/Makefile.am b/Makefile.am index 3d97874..39b5cdb 100644 --- a/Makefile.am +++ b/Makefile.am @@ -4,7 +4,7 @@ SUBDIRS = \ data \ po -EXTRA_DIST = COPYING.LGPL autogen.sh +EXTRA_DIST = autogen.sh DISTCHECK_CONFIGURE_FLAGS = --enable-localinstall -- cgit v1.2.3 From be3f65e45fb928f6afe189fe41ab7a25243d1d90 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 21:50:37 -0600 Subject: Adds a file watcher to see if we should change the menuitem to warn that a restart is recommended. --- src/session-service.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/session-service.c b/src/session-service.c index eb1966e..62ee0a7 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -27,6 +27,7 @@ with this program. If not, see . #include #include +#include #include #include @@ -605,6 +606,42 @@ service_shutdown (IndicatorService * service, gpointer user_data) return; } +static void +restart_dir_changed (void) +{ + gboolean restart_required = g_file_test("/var/run/reboot-required", G_FILE_TEST_EXISTS); + + if (restart_required) { + if (supress_confirmations()) { + dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart Required")); + } else { + dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart Required...")); + } + dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_ICON_NAME, "emblem-important"); + } else { + if (supress_confirmations()) { + dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart")); + } else { + dbusmenu_menuitem_property_set(restart_mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Restart...")); + } + dbusmenu_menuitem_property_remove(restart_mi, DBUSMENU_MENUITEM_PROP_ICON_NAME); + } + + return; +} + +static void +setup_restart_watch (void) +{ + GFile * filedir = g_file_new_for_path("/var/run"); + GFileMonitor * filemon = g_file_monitor_directory(filedir, G_FILE_MONITOR_NONE, NULL, NULL); + if (filemon != NULL) { + g_signal_connect(G_OBJECT(filemon), "changed", G_CALLBACK(restart_dir_changed), NULL); + } + restart_dir_changed(); + return; +} + /* Main, is well, main. It brings everything up and throws us into the mainloop of no return. */ int @@ -642,6 +679,8 @@ main (int argc, char ** argv) G_CALLBACK (user_change), root_menuitem); + setup_restart_watch(); + setup_up(); DbusmenuServer * server = dbusmenu_server_new(INDICATOR_SESSION_DBUS_OBJECT); -- cgit v1.2.3 From d018794d6717df1f4dfcb1f26258d6cd2820d8bd Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 3 Mar 2010 21:51:57 -0600 Subject: Some function comments. --- src/session-service.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/session-service.c b/src/session-service.c index 62ee0a7..7183472 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -606,6 +606,8 @@ service_shutdown (IndicatorService * service, gpointer user_data) return; } +/* When the directory changes we need to figure out how our menu + item should look. */ static void restart_dir_changed (void) { @@ -630,6 +632,9 @@ restart_dir_changed (void) return; } +/* Buids a file watcher for the directory so that when it + changes we can check to see if our reboot-required is + there. */ static void setup_restart_watch (void) { -- cgit v1.2.3 From 2b85f39462428c849c00b16ac35e2197d8cb51f5 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 4 Mar 2010 12:16:23 -0600 Subject: 0.2.5 --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 0faca94..f79fa93 100644 --- a/configure.ac +++ b/configure.ac @@ -4,7 +4,7 @@ AC_INIT(src/indicator-session.c) AC_PREREQ(2.53) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(indicator-session, 0.2.4) +AM_INIT_AUTOMAKE(indicator-session, 0.2.5) AM_MAINTAINER_MODE -- cgit v1.2.3