From 408292959e0b59d5be257a4a6f8e726dcf9e60b6 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Fri, 14 Jul 2017 23:34:05 +0200 Subject: [PATCH] core: Add meta_close_dialog_focus() vmethod This is used to request key focus on the close dialog whenever a window that is frozen would receive key focus. Also, ensure that the dialog gets focus when first shown if the window was meant to receive input. https://bugzilla.gnome.org/show_bug.cgi?id=762083 --- src/core/delete.c | 5 +++++ src/core/meta-close-dialog.c | 19 +++++++++++++++++++ src/core/window.c | 4 ++++ src/meta/meta-close-dialog.h | 2 ++ 4 files changed, 30 insertions(+) diff --git a/src/core/delete.c b/src/core/delete.c index 3727bd2db..af7cffed9 100644 --- a/src/core/delete.c +++ b/src/core/delete.c @@ -66,6 +66,11 @@ meta_window_set_alive (MetaWindow *window, { meta_window_ensure_close_dialog (window); meta_close_dialog_show (window->close_dialog); + + if (window->display && + window->display->event_route == META_EVENT_ROUTE_NORMAL && + window == window->display->focus_window) + meta_close_dialog_focus (window->close_dialog); } } diff --git a/src/core/meta-close-dialog.c b/src/core/meta-close-dialog.c index bdec804d2..b105602c8 100644 --- a/src/core/meta-close-dialog.c +++ b/src/core/meta-close-dialog.c @@ -121,3 +121,22 @@ meta_close_dialog_is_visible (MetaCloseDialog *dialog) { return GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (dialog), quark_visible)); } + +/** + * meta_close_dialog_focus: + * @dialog: a #MetaCloseDialog + * + * Call whenever @dialog should receive keyboard focus, + * usually when the window would. + **/ +void +meta_close_dialog_focus (MetaCloseDialog *dialog) +{ + MetaCloseDialogInterface *iface; + + g_return_if_fail (META_IS_CLOSE_DIALOG (dialog)); + + iface = META_CLOSE_DIALOG_GET_IFACE (dialog); + if (iface->focus) + iface->focus (dialog); +} diff --git a/src/core/window.c b/src/core/window.c index 9a607c88b..68d5bcb67 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -4369,6 +4369,10 @@ meta_window_focus (MetaWindow *window, clutter_stage_set_key_focus (stage, NULL); } + if (window->close_dialog && + meta_close_dialog_is_visible (window->close_dialog)) + meta_close_dialog_focus (window->close_dialog); + if (window->wm_state_demands_attention) meta_window_unset_demands_attention(window); diff --git a/src/meta/meta-close-dialog.h b/src/meta/meta-close-dialog.h index 77d225215..0b4ac2230 100644 --- a/src/meta/meta-close-dialog.h +++ b/src/meta/meta-close-dialog.h @@ -42,10 +42,12 @@ struct _MetaCloseDialogInterface void (* show) (MetaCloseDialog *dialog); void (* hide) (MetaCloseDialog *dialog); + void (* focus) (MetaCloseDialog *dialog); }; void meta_close_dialog_show (MetaCloseDialog *dialog); void meta_close_dialog_hide (MetaCloseDialog *dialog); +void meta_close_dialog_focus (MetaCloseDialog *dialog); gboolean meta_close_dialog_is_visible (MetaCloseDialog *dialog); void meta_close_dialog_response (MetaCloseDialog *dialog,