diff --git a/src/bin/e_actions.c b/src/bin/e_actions.c
index feda6a8f2..d99b38836 100644
--- a/src/bin/e_actions.c
+++ b/src/bin/e_actions.c
@@ -249,8 +249,41 @@ ACT_FN_GO(window_close)
}
/***************************************************************************/
+static E_Dialog *kill_dialog = NULL;
+
+static void
+_e_actions_cb_kill_dialog_ok(void *data, E_Dialog *dia)
+{
+ E_Object *obj;
+
+ obj = data;
+ e_object_del(E_OBJECT(kill_dialog));
+ kill_dialog = NULL;
+ if ((!((E_Border *)obj)->lock_close) && (!((E_Border *)obj)->internal))
+ e_border_act_kill_begin((E_Border *)obj);
+}
+
+static void
+_e_actions_cb_kill_dialog_cancel(void *data, E_Dialog *dia)
+{
+ e_object_del(E_OBJECT(kill_dialog));
+ kill_dialog = NULL;
+}
+
+static void
+_e_actions_cb_kill_dialog_delete(E_Win *win)
+{
+ E_Dialog *dia;
+
+ dia = win->data;
+ _e_actions_cb_kill_dialog_cancel(NULL, dia);
+}
+
ACT_FN_GO(window_kill)
{
+ E_Border *bd;
+ char dialog_text[1024];
+
if (!obj) obj = E_OBJECT(e_border_focused_get());
if (!obj) return;
if (obj->type != E_BORDER_TYPE)
@@ -258,8 +291,31 @@ ACT_FN_GO(window_kill)
obj = E_OBJECT(e_border_focused_get());
if (!obj) return;
}
- if (!((E_Border *)obj)->lock_close)
- e_border_act_kill_begin((E_Border *)obj);
+ bd = (E_Border *)obj;
+ snprintf(dialog_text, sizeof(dialog_text),
+ "You are about to kill %s.
"
+ "Please keep in mind that all data of this window,
"
+ "which has not been saved yet will be lost!
"
+ "Are you sure you want to kill this window?",
+ bd->client.icccm.name);
+
+ if (kill_dialog) e_object_del(E_OBJECT(kill_dialog));
+ kill_dialog = e_dialog_new(e_container_current_get(e_manager_current_get()),
+ "E", "_kill_dialog");
+ if (!kill_dialog) return;
+ e_win_delete_callback_set(kill_dialog->win,
+ _e_actions_cb_kill_dialog_delete);
+ e_dialog_title_set(kill_dialog,
+ _("Are you sure you want to kill this window?"));
+ e_dialog_text_set(kill_dialog, _(dialog_text));
+ e_dialog_icon_set(kill_dialog, "enlightenment/exit", 64);
+ e_dialog_button_add(kill_dialog, _("Yes"), NULL,
+ _e_actions_cb_kill_dialog_ok, obj);
+ e_dialog_button_add(kill_dialog, _("No"), NULL,
+ _e_actions_cb_kill_dialog_cancel, NULL);
+ e_dialog_button_focus_num(kill_dialog, 1);
+ e_win_centered_set(kill_dialog->win, 1);
+ e_dialog_show(kill_dialog);
}
/***************************************************************************/
diff --git a/src/bin/e_int_border_menu.c b/src/bin/e_int_border_menu.c
index 0c5208f0d..03d937b80 100644
--- a/src/bin/e_int_border_menu.c
+++ b/src/bin/e_int_border_menu.c
@@ -459,11 +459,14 @@ _e_border_menu_cb_iconify(void *data, E_Menu *m, E_Menu_Item *mi)
static void
_e_border_menu_cb_kill(void *data, E_Menu *m, E_Menu_Item *mi)
{
+ E_Action *a;
E_Border *bd;
bd = data;
- if ((!bd->lock_close) && (!bd->internal))
- e_border_act_kill_begin(bd);
+ if ((bd->lock_close) || (bd->internal)) return;
+
+ a = e_action_find("window_kill");
+ if ((a) && (a->func.go)) a->func.go(NULL, NULL);
}
static void