From 979e564254bd01af8cc88ebad1ef9b1deb3a5cd0 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 15 Jul 2018 08:48:46 -0400 Subject: Drop expose events Instead of an event, use a ::expose signal on GdkSurface. This is in line with the move to use events only for input. --- gdk/gdkevents.c | 12 ------------ gdk/gdkevents.h | 4 ---- gdk/gdkeventsprivate.h | 19 ------------------- gdk/gdksurface.c | 23 ++++++++++++----------- gtk/gtkmain.c | 5 ----- gtk/gtkwidget.c | 30 ++++++++++++------------------ 6 files changed, 24 insertions(+), 69 deletions(-) diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c index e648110212..e0e94fa666 100644 --- a/gdk/gdkevents.c +++ b/gdk/gdkevents.c @@ -646,11 +646,6 @@ gdk_event_copy (const GdkEvent *event) g_object_ref (event->dnd.drop); break; - case GDK_EXPOSE: - if (event->expose.region) - new_event->expose.region = cairo_region_copy (event->expose.region); - break; - case GDK_BUTTON_PRESS: case GDK_BUTTON_RELEASE: if (event->button.axes) @@ -730,11 +725,6 @@ gdk_event_finalize (GObject *object) g_free (event->touch.axes); break; - case GDK_EXPOSE: - if (event->expose.region) - cairo_region_destroy (event->expose.region); - break; - case GDK_MOTION_NOTIFY: g_clear_object (&event->motion.tool); g_free (event->motion.axes); @@ -832,7 +822,6 @@ gdk_event_get_time (const GdkEvent *event) case GDK_NOTHING: case GDK_DELETE: case GDK_DESTROY: - case GDK_EXPOSE: case GDK_MAP: case GDK_UNMAP: case GDK_GRAB_BROKEN: @@ -908,7 +897,6 @@ gdk_event_get_state (const GdkEvent *event, case GDK_NOTHING: case GDK_DELETE: case GDK_DESTROY: - case GDK_EXPOSE: case GDK_MAP: case GDK_UNMAP: case GDK_GRAB_BROKEN: diff --git a/gdk/gdkevents.h b/gdk/gdkevents.h index f496502ad2..87b637a952 100644 --- a/gdk/gdkevents.h +++ b/gdk/gdkevents.h @@ -104,7 +104,6 @@ G_BEGIN_DECLS typedef struct _GdkEventAny GdkEventAny; -typedef struct _GdkEventExpose GdkEventExpose; typedef struct _GdkEventMotion GdkEventMotion; typedef struct _GdkEventButton GdkEventButton; typedef struct _GdkEventTouch GdkEventTouch; @@ -145,8 +144,6 @@ typedef void (*GdkEventFunc) (GdkEvent *event, * hidden or destroyed, usually when the user clicks on a special icon in the * title bar. * @GDK_DESTROY: the surface has been destroyed. - * @GDK_EXPOSE: all or part of the surface has become visible and needs to be - * redrawn. * @GDK_MOTION_NOTIFY: the pointer (usually a mouse) has moved. * @GDK_BUTTON_PRESS: a mouse button has been pressed. * @GDK_BUTTON_RELEASE: a mouse button has been released. @@ -206,7 +203,6 @@ typedef enum GDK_NOTHING, GDK_DELETE, GDK_DESTROY, - GDK_EXPOSE, GDK_MOTION_NOTIFY, GDK_BUTTON_PRESS, GDK_BUTTON_RELEASE, diff --git a/gdk/gdkeventsprivate.h b/gdk/gdkeventsprivate.h index a7ab6a88ab..f4d15507e7 100644 --- a/gdk/gdkeventsprivate.h +++ b/gdk/gdkeventsprivate.h @@ -63,23 +63,6 @@ struct _GdkEventAny GdkDisplay *display; }; -/* - * GdkEventExpose: - * @type: the type of the event (%GDK_EXPOSE) - * @surface: the surface which received the event. - * @send_event: %TRUE if the event was sent explicitly. - * @area: bounding box of @region. - * @region: the region that needs to be redrawn. - * - * Generated when all or part of a surface becomes visible and needs to be - * redrawn. - */ -struct _GdkEventExpose -{ - GdkEventAny any; - cairo_region_t *region; -}; - /* * GdkEventMotion: * @type: the type of the event. @@ -593,7 +576,6 @@ struct _GdkEventPadGroupMode { * GdkEvent: * @type: the #GdkEventType * @any: a #GdkEventAny - * @expose: a #GdkEventExpose * @motion: a #GdkEventMotion * @button: a #GdkEventButton * @touch: a #GdkEventTouch @@ -645,7 +627,6 @@ struct _GdkEventPadGroupMode { union _GdkEvent { GdkEventAny any; - GdkEventExpose expose; GdkEventMotion motion; GdkEventButton button; GdkEventTouch touch; diff --git a/gdk/gdksurface.c b/gdk/gdksurface.c index bb9785a0a5..6c94057493 100644 --- a/gdk/gdksurface.c +++ b/gdk/gdksurface.c @@ -97,6 +97,7 @@ enum { MOVED_TO_RECT, + EXPOSE, LAST_SIGNAL }; @@ -310,6 +311,16 @@ gdk_surface_class_init (GdkSurfaceClass *klass) G_TYPE_POINTER, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN); + + signals[EXPOSE] = + g_signal_new (g_intern_static_string ("expose"), + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + 0, + NULL, + NULL, + NULL, + G_TYPE_NONE, 1, CAIRO_GOBJECT_TYPE_REGION); } static void @@ -1617,20 +1628,11 @@ static void gdk_surface_process_updates_recurse (GdkSurface *surface, cairo_region_t *expose_region) { - GdkEvent *event; - if (surface->destroyed) return; /* Paint the surface before the children, clipped to the surface region */ - - event = gdk_event_new (GDK_EXPOSE); - event->any.surface = g_object_ref (surface); - event->any.send_event = FALSE; - event->expose.region = cairo_region_reference (expose_region); - - _gdk_event_emit (event); - g_object_unref (event); + g_signal_emit (surface, signals[EXPOSE], 0, expose_region); } /* Process and remove any invalid area on the native surface by creating @@ -3913,7 +3915,6 @@ _gdk_make_event (GdkSurface *surface, case GDK_UNMAP: case GDK_DELETE: case GDK_DESTROY: - case GDK_EXPOSE: default: break; } diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 56ab6167d1..96634500a6 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -1827,11 +1827,6 @@ gtk_main_do_event (GdkEvent *event) } break; - case GDK_EXPOSE: - if (event->any.surface) - gtk_widget_render (event_widget, event->any.surface, event->expose.region); - break; - case GDK_MAP: if (GTK_IS_WINDOW (event_widget) && !_gtk_widget_get_mapped (event_widget)) { diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index c929701d94..af4cf38284 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -5091,14 +5091,6 @@ gtk_widget_event (GtkWidget *widget, g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE); g_return_val_if_fail (WIDGET_REALIZED_FOR_EVENT (widget, event), TRUE); - if (event->any.type == GDK_EXPOSE) - { - g_warning ("Events of type GDK_EXPOSE cannot be synthesized. To get " - "the same effect, call gdk_surface_invalidate_rect/region(), " - "followed by gdk_surface_process_updates()."); - return TRUE; - } - return gtk_widget_event_internal (widget, event); } @@ -5174,14 +5166,6 @@ _gtk_widget_captured_event (GtkWidget *widget, g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE); g_return_val_if_fail (WIDGET_REALIZED_FOR_EVENT (widget, event), TRUE); - if (event->any.type == GDK_EXPOSE) - { - g_warning ("Events of type GDK_EXPOSE cannot be synthesized. To get " - "the same effect, call gdk_surface_invalidate_rect/region(), " - "followed by gdk_surface_process_updates()."); - return TRUE; - } - if (!event_surface_is_still_viewable (event)) return TRUE; @@ -5217,7 +5201,6 @@ event_surface_is_still_viewable (const GdkEvent *event) */ switch ((guint) event->any.type) { - case GDK_EXPOSE: case GDK_MOTION_NOTIFY: case GDK_BUTTON_PRESS: case GDK_KEY_PRESS: @@ -5284,7 +5267,6 @@ gtk_widget_event_internal (GtkWidget *widget, /* Non input events get handled right away */ switch ((guint) event->any.type) { - case GDK_EXPOSE: case GDK_NOTHING: case GDK_DELETE: case GDK_DESTROY: @@ -11513,6 +11495,14 @@ gtk_widget_set_surface (GtkWidget *widget, } } +static void +surface_expose (GdkSurface *surface, + cairo_region_t *region, + GtkWidget *widget) +{ + gtk_widget_render (widget, surface, region); +} + /** * gtk_widget_register_surface: * @widget: a #GtkWidget @@ -11540,6 +11530,8 @@ gtk_widget_register_surface (GtkWidget *widget, g_assert (user_data == NULL); gdk_surface_set_user_data (surface, widget); + + g_signal_connect (surface, "expose", G_CALLBACK (surface_expose), widget); } /** @@ -11563,6 +11555,8 @@ gtk_widget_unregister_surface (GtkWidget *widget, gdk_surface_get_user_data (surface, &user_data); g_assert (user_data == widget); gdk_surface_set_user_data (surface, NULL); + + g_signal_handlers_disconnect_by_func (surface, surface_expose, widget); } /** -- cgit v1.2.1