From 4d1604c77de2b97c7759574fb3ca9a400be32403 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 25 Nov 2010 12:28:08 +0100 Subject: [PATCH] gdk: Move window beeps into GdkWindowImpl One less magic function. Also refactored it to make it easier to implement. It now returns TRUE if it beeped and FALSE if it failed to do so. A default implementation exists that just returns FALSE for all the backends that can't beep windows (read: everything but X11 with XKB - and why on earth do keyboard libs implement beeping?) --- gdk/gdkinternals.h | 1 - gdk/gdkwindow.c | 12 ++++++++---- gdk/gdkwindowimpl.c | 10 +++++++++- gdk/gdkwindowimpl.h | 3 +++ gdk/quartz/gdkwindow-quartz.c | 8 -------- gdk/win32/gdkwindow-win32.c | 6 ------ gdk/x11/gdkwindow-x11.c | 22 ++++++++++++---------- 7 files changed, 32 insertions(+), 30 deletions(-) diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h index 830e5d7a03..8aede53cce 100644 --- a/gdk/gdkinternals.h +++ b/gdk/gdkinternals.h @@ -356,7 +356,6 @@ gulong _gdk_windowing_window_get_next_serial (GdkDisplay *display); void _gdk_windowing_window_get_offsets (GdkWindow *window, gint *x_offset, gint *y_offset); -void _gdk_windowing_window_beep (GdkWindow *window); void _gdk_windowing_get_device_state (GdkDisplay *display, diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 9e84e2a280..36d13f611e 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -8065,10 +8065,14 @@ gdk_window_beep (GdkWindow *window) toplevel = get_event_toplevel (window); display = gdk_window_get_display (window); - if (toplevel && !gdk_window_is_offscreen (toplevel)) - _gdk_windowing_window_beep (toplevel); - else - gdk_display_beep (display); + if (toplevel) + { + if (GDK_WINDOW_IMPL_CLASS (toplevel)->beep (window)) + return; + } + + /* If windows fail to beep, we beep the display. */ + gdk_display_beep (display); } /** diff --git a/gdk/gdkwindowimpl.c b/gdk/gdkwindowimpl.c index 57aed07552..ef81fcffd0 100644 --- a/gdk/gdkwindowimpl.c +++ b/gdk/gdkwindowimpl.c @@ -33,10 +33,18 @@ G_DEFINE_TYPE (GdkWindowImpl, gdk_window_impl, G_TYPE_OBJECT); +static gboolean +gdk_window_impl_beep (GdkWindow *window) +{ + /* FALSE means windows can't beep, so the display will be + * made to beep instead. */ + return FALSE; +} static void -gdk_window_impl_class_init (GdkWindowImplClass *klass) +gdk_window_impl_class_init (GdkWindowImplClass *impl_class) { + impl_class->beep = gdk_window_impl_beep; } static void diff --git a/gdk/gdkwindowimpl.h b/gdk/gdkwindowimpl.h index dfcf3b4dc7..0332a31b71 100644 --- a/gdk/gdkwindowimpl.h +++ b/gdk/gdkwindowimpl.h @@ -158,6 +158,9 @@ struct _GdkWindowImplClass cairo_surface_t *surface, gint width, gint height); + + /* optional */ + gboolean (* beep) (GdkWindow *window); }; /* Interface Functions */ diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c index 42117ac557..40b9dbb854 100644 --- a/gdk/quartz/gdkwindow-quartz.c +++ b/gdk/quartz/gdkwindow-quartz.c @@ -2919,14 +2919,6 @@ gdk_window_destroy_notify (GdkWindow *window) check_grab_destroy (window); } -void -_gdk_windowing_window_beep (GdkWindow *window) -{ - g_return_if_fail (GDK_IS_WINDOW (window)); - - gdk_display_beep (_gdk_display); -} - void gdk_window_set_opacity (GdkWindow *window, gdouble opacity) diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c index ad291b24f4..bcbdca33a1 100644 --- a/gdk/win32/gdkwindow-win32.c +++ b/gdk/win32/gdkwindow-win32.c @@ -3121,12 +3121,6 @@ gdk_window_configure_finished (GdkWindow *window) g_return_if_fail (GDK_IS_WINDOW (window)); } -void -_gdk_windowing_window_beep (GdkWindow *window) -{ - gdk_display_beep (_gdk_display); -} - void gdk_window_set_opacity (GdkWindow *window, gdouble opacity) diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index d3c4a8ec2a..725f77a61b 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -5350,24 +5350,25 @@ gdk_window_configure_finished (GdkWindow *window) #endif } -void -_gdk_windowing_window_beep (GdkWindow *window) +static gboolean +gdk_x11_window_beep (GdkWindow *window) { GdkDisplay *display; - g_return_if_fail (GDK_IS_WINDOW (window)); - display = GDK_WINDOW_DISPLAY (window); #ifdef HAVE_XKB if (GDK_DISPLAY_X11 (display)->use_xkb) - XkbBell (GDK_DISPLAY_XDISPLAY (display), - GDK_WINDOW_XID (window), - 0, - None); - else + { + XkbBell (GDK_DISPLAY_XDISPLAY (display), + GDK_WINDOW_XID (window), + 0, + None); + return TRUE; + } #endif - gdk_display_beep (display); + + return FALSE; } /** @@ -5591,5 +5592,6 @@ gdk_window_impl_x11_class_init (GdkWindowImplX11Class *klass) impl_class->resize_cairo_surface = gdk_window_x11_resize_cairo_surface; impl_class->get_shape = gdk_x11_window_get_shape; impl_class->get_input_shape = gdk_x11_window_get_input_shape; + impl_class->beep = gdk_x11_window_beep; }