summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2018-07-15 08:48:46 -0400
committerMatthias Clasen <mclasen@redhat.com>2018-07-15 09:00:43 -0400
commit979e564254bd01af8cc88ebad1ef9b1deb3a5cd0 (patch)
treef03f5304e3ad8915c4d9e47703fca3bae6185c45
parent443f8ddf6bbb15d4516bf2b5fd2c8b77fa10f840 (diff)
downloadgtk+-wip/matthiasc/kill-expose-event.tar.gz
Instead of an event, use a ::expose signal on GdkSurface. This is in line with the move to use events only for input.
-rw-r--r--gdk/gdkevents.c12
-rw-r--r--gdk/gdkevents.h4
-rw-r--r--gdk/gdkeventsprivate.h19
-rw-r--r--gdk/gdksurface.c23
-rw-r--r--gtk/gtkmain.c5
-rw-r--r--gtk/gtkwidget.c30
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
@@ -64,23 +64,6 @@ struct _GdkEventAny
};
/*
- * 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.
* @surface: the surface which received 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);
}
/**