From 4e308d50e9603dfc9da230d5f2012a01ae5283e8 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Thu, 15 Feb 2018 03:43:13 +0100 Subject: [PATCH] Implement the locking dialog --- src/helper.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++- src/panel.c | 4 +-- tools/helper.c | 4 +++ 3 files changed, 72 insertions(+), 3 deletions(-) diff --git a/src/helper.c b/src/helper.c index cc9aa59..1dd8f65 100644 --- a/src/helper.c +++ b/src/helper.c @@ -209,9 +209,74 @@ static gboolean _lock_on_idle(gpointer data) /* panel_helper_lock_dialog */ +static gboolean _lock_dialog_on_closex(gpointer data); +static void _lock_dialog_on_response(GtkWidget * widget, gint response, + gpointer data); + static void _panel_helper_lock_dialog(Panel * panel) { - /* FIXME implement */ +#ifdef EMBEDDED + const char message[] = N_("This will lock your device.\n" + "Do you really want to proceed?"); +#else + const char message[] = N_("This will lock your session.\n" + "Do you really want to proceed?"); +#endif + GtkWidget * widget; + + if(panel->lk_window != NULL) + { + gtk_window_present(GTK_WINDOW(panel->lk_window)); + return; + } + panel->lk_window = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, "%s", +#if GTK_CHECK_VERSION(2, 6, 0) + _("Shutdown")); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG( + panel->lk_window), +#endif + "%s", _(message)); +#if GTK_CHECK_VERSION(2, 10, 0) + gtk_message_dialog_set_image(GTK_MESSAGE_DIALOG(panel->lk_window), + gtk_image_new_from_icon_name("gnome-lockscreen", + GTK_ICON_SIZE_DIALOG)); +#endif + gtk_dialog_add_buttons(GTK_DIALOG(panel->lk_window), GTK_STOCK_CANCEL, + FALSE, NULL); + widget = gtk_button_new_with_label(_("Lock")); + gtk_button_set_image(GTK_BUTTON(widget), gtk_image_new_from_icon_name( + "gnome-lockscreen", GTK_ICON_SIZE_BUTTON)); + gtk_widget_show_all(widget); + gtk_dialog_add_action_widget(GTK_DIALOG(panel->lk_window), widget, + TRUE); + gtk_window_set_keep_above(GTK_WINDOW(panel->lk_window), TRUE); + gtk_window_set_position(GTK_WINDOW(panel->lk_window), + GTK_WIN_POS_CENTER); + gtk_window_set_title(GTK_WINDOW(panel->lk_window), _("Lock")); + g_signal_connect(panel->lk_window, "delete-event", G_CALLBACK( + _lock_dialog_on_closex), panel); + g_signal_connect(panel->lk_window, "response", G_CALLBACK( + _lock_dialog_on_response), panel); + gtk_widget_show_all(panel->lk_window); +} + +static gboolean _lock_dialog_on_closex(gpointer data) +{ + Panel * panel = data; + + gtk_widget_hide(panel->lk_window); + return TRUE; +} + +static void _lock_dialog_on_response(GtkWidget * widget, gint response, + gpointer data) +{ + Panel * panel = data; + + gtk_widget_hide(widget); + if(response == TRUE) + _panel_helper_lock(panel); } diff --git a/src/panel.c b/src/panel.c index cca01c3..412adb4 100644 --- a/src/panel.c +++ b/src/panel.c @@ -92,6 +92,7 @@ struct _Panel /* dialogs */ GtkWidget * ab_window; + GtkWidget * lk_window; GtkWidget * lo_window; GtkWidget * sh_window; GtkWidget * su_window; @@ -170,9 +171,8 @@ Panel * panel_new(PanelPrefs const * prefs) } panel->pr_window = NULL; panel->ab_window = NULL; -#ifndef EMBEDDED + panel->lk_window = NULL; panel->lo_window = NULL; -#endif panel->sh_window = NULL; panel->su_window = NULL; if(panel->config == NULL) diff --git a/tools/helper.c b/tools/helper.c index 320d84b..2011899 100644 --- a/tools/helper.c +++ b/tools/helper.c @@ -55,6 +55,7 @@ struct _Panel /* dialogs */ GtkWidget * ab_window; + GtkWidget * lk_window; GtkWidget * lo_window; GtkWidget * sh_window; GtkWidget * su_window; @@ -167,6 +168,7 @@ static int _panel_init(Panel * panel, PanelWindowPosition position, panel->source = 0; panel->timeout = 0; panel->ab_window = NULL; + panel->lk_window = NULL; panel->lo_window = NULL; panel->sh_window = NULL; panel->su_window = NULL; @@ -188,6 +190,8 @@ static void _panel_destroy(Panel * panel) panel_window_delete(panel->windows[i]); if(panel->ab_window != NULL) gtk_widget_destroy(panel->ab_window); + if(panel->lk_window != NULL) + gtk_widget_destroy(panel->lk_window); if(panel->lo_window != NULL) gtk_widget_destroy(panel->lo_window); if(panel->sh_window != NULL)