[mutter] core: Add meta_close_dialog_focus() vmethod
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] core: Add meta_close_dialog_focus() vmethod
- Date: Sun, 16 Jul 2017 17:27:48 +0000 (UTC)
commit 408292959e0b59d5be257a4a6f8e726dcf9e60b6
Author: Carlos Garnacho <carlosg gnome org>
Date: Fri Jul 14 23:34:05 2017 +0200
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(+), 0 deletions(-)
---
diff --git a/src/core/delete.c b/src/core/delete.c
index 3727bd2..af7cffe 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 bdec804..b105602 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 9a607c8..68d5bcb 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 77d2252..0b4ac22 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,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]