gdk-activate-window-on-keyboard-grabs.patch 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. From: Samuel Thibault <samuel.thibault@ens-lyon.org>
  2. Date: Fri, 1 Jun 2018 16:43:01 +0200
  3. Subject: gdk: activate window on keyboard grabs
  4. In 01455399e83a ("gdk: do not deactivate surface on keyboard grabs"), we
  5. made gdk avoid deactivating surfaces when another application takes a
  6. keyboard grab, by using has_focus_window instead of has_focus. That however
  7. broke activating surfaces when the gdk application acquired a grab itself,
  8. in which case has_focus_window is false but has_focus is true.
  9. We thus actually need to use both: surfaces should be activated either
  10. because we have normal keyboard focus, or because we grabbed the keyboard.
  11. This also renames HAS_FOCUS to APPEARS_FOCUSED to better reflect its
  12. role.
  13. Bug: #85
  14. (cherry picked from commit 3287ac96e02ff236d74db10164c5b0c1e7b2b0bf)
  15. (cherry picked from commit 039285deb92b6baf6ef594b0d718e8f7a7e1d0ac)
  16. Origin: upstream, 2.24.33, commit:853f786727a954d10ed78405adc18e0772ccd1cb
  17. ---
  18. gdk/x11/gdkevents-x11.c | 20 ++++++++++----------
  19. 1 file changed, 10 insertions(+), 10 deletions(-)
  20. diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c
  21. index 360b0c7..bef77b5 100644
  22. --- a/gdk/x11/gdkevents-x11.c
  23. +++ b/gdk/x11/gdkevents-x11.c
  24. @@ -621,8 +621,8 @@ gdk_check_wm_state_changed (GdkWindow *window)
  25. do_net_wm_state_changes (window);
  26. }
  27. -#define HAS_FOCUS(toplevel) \
  28. - ((toplevel)->has_focus_window || (toplevel)->has_pointer_focus)
  29. +#define APPEARS_FOCUSED(toplevel) \
  30. + ((toplevel)->has_focus || (toplevel)->has_focus_window || (toplevel)->has_pointer_focus)
  31. static void
  32. generate_focus_event (GdkWindow *window,
  33. @@ -1344,11 +1344,11 @@ gdk_event_translate (GdkDisplay *display,
  34. if (xevent->xcrossing.focus && !toplevel->has_focus_window)
  35. {
  36. - gboolean had_focus = HAS_FOCUS (toplevel);
  37. + gboolean had_focus = APPEARS_FOCUSED (toplevel);
  38. toplevel->has_pointer_focus = TRUE;
  39. - if (HAS_FOCUS (toplevel) != had_focus)
  40. + if (APPEARS_FOCUSED (toplevel) != had_focus)
  41. generate_focus_event (window, TRUE);
  42. }
  43. }
  44. @@ -1441,11 +1441,11 @@ gdk_event_translate (GdkDisplay *display,
  45. if (xevent->xcrossing.focus && !toplevel->has_focus_window)
  46. {
  47. - gboolean had_focus = HAS_FOCUS (toplevel);
  48. + gboolean had_focus = APPEARS_FOCUSED (toplevel);
  49. toplevel->has_pointer_focus = FALSE;
  50. - if (HAS_FOCUS (toplevel) != had_focus)
  51. + if (APPEARS_FOCUSED (toplevel) != had_focus)
  52. generate_focus_event (window, FALSE);
  53. }
  54. }
  55. @@ -1523,7 +1523,7 @@ gdk_event_translate (GdkDisplay *display,
  56. if (toplevel)
  57. {
  58. - gboolean had_focus = HAS_FOCUS (toplevel);
  59. + gboolean had_focus = APPEARS_FOCUSED (toplevel);
  60. switch (xevent->xfocus.detail)
  61. {
  62. @@ -1569,7 +1569,7 @@ gdk_event_translate (GdkDisplay *display,
  63. break;
  64. }
  65. - if (HAS_FOCUS (toplevel) != had_focus)
  66. + if (APPEARS_FOCUSED (toplevel) != had_focus)
  67. generate_focus_event (window, TRUE);
  68. }
  69. break;
  70. @@ -1582,7 +1582,7 @@ gdk_event_translate (GdkDisplay *display,
  71. if (toplevel)
  72. {
  73. - gboolean had_focus = HAS_FOCUS (toplevel);
  74. + gboolean had_focus = APPEARS_FOCUSED (toplevel);
  75. switch (xevent->xfocus.detail)
  76. {
  77. @@ -1620,7 +1620,7 @@ gdk_event_translate (GdkDisplay *display,
  78. break;
  79. }
  80. - if (HAS_FOCUS (toplevel) != had_focus)
  81. + if (APPEARS_FOCUSED (toplevel) != had_focus)
  82. generate_focus_event (window, FALSE);
  83. }
  84. break;