[gnome-builder] source-view: don't beep if toplevel is offscreen window



commit e509baa35dac597a08dfa0a972707e3253aa3117
Author: Christian Hergert <christian hergert me>
Date:   Wed Apr 22 16:38:12 2015 -0700

    source-view: don't beep if toplevel is offscreen window
    
    GdkOffscreenWindowImpl will segfault if beep is called.

 libide/ide-source-view-mode.c |   26 +++++++++++++++++++++++++-
 1 files changed, 25 insertions(+), 1 deletions(-)
---
diff --git a/libide/ide-source-view-mode.c b/libide/ide-source-view-mode.c
index cec0944..7ecebd6 100644
--- a/libide/ide-source-view-mode.c
+++ b/libide/ide-source-view-mode.c
@@ -378,6 +378,30 @@ is_modifier_key (GdkEventKey *event)
   return FALSE;
 }
 
+static gboolean
+toplevel_is_offscreen (GdkWindow *window)
+{
+  /*
+   * FIXME: This function is a workaround for a segfault in gdk_window_beep()
+   *        with offscreen windows.
+   *
+   *        https://bugzilla.gnome.org/show_bug.cgi?id=748341
+   */
+  for (;
+       window != NULL;
+       window = gdk_window_get_parent (window))
+    {
+      GdkWindowType type;
+
+      type = gdk_window_get_window_type (window);
+
+      if (type == GDK_WINDOW_OFFSCREEN)
+        return TRUE;
+    }
+
+  return FALSE;
+}
+
 gboolean
 _ide_source_view_mode_do_event (IdeSourceViewMode *mode,
                                 GdkEventKey       *event,
@@ -427,7 +451,7 @@ _ide_source_view_mode_do_event (IdeSourceViewMode *mode,
         /* don't block possible accelerators, but supress others */
         if (!handled && suppress_unbound && ((event->state & GDK_MODIFIER_MASK) == 0))
           {
-            if (!is_modifier_key (event))
+            if (!is_modifier_key (event) && !toplevel_is_offscreen (event->window))
               gdk_window_beep (event->window);
 
             /* cancel any inflight macros */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]