diff options
author | Tim Janik <timj@gtk.org> | 2001-06-28 22:49:20 +0000 |
---|---|---|
committer | Tim Janik <timj@src.gnome.org> | 2001-06-28 22:49:20 +0000 |
commit | 00f85bf815499a651ecec41fcccb234b56c2f383 (patch) | |
tree | 4069b72a22071efc323f61711e3a63ae22ff6e5f /gdk | |
parent | 10f047cf4ce86b7ff32050279214faac3c294f11 (diff) | |
download | gtk+-00f85bf815499a651ecec41fcccb234b56c2f383.tar.gz |
!GTK_OBJECT_DESTROYED() -> GTK_WIDGET_REALIZE() for resize queueing.
Thu Jun 28 23:53:31 2001 Tim Janik <timj@gtk.org>
* gtk/gtkwidget.c (gtk_widget_hide): !GTK_OBJECT_DESTROYED() ->
GTK_WIDGET_REALIZE() for resize queueing.
* gtk/gtkmain.c (gtk_main_do_event): !GTK_OBJECT_DESTROYED() ->
GTK_WIDGET_REALIZE() for post event delivery destruction upon
GDK_DESTROY.
* gtk/gtkwidget.c: added GtkWidget::event-after notification signal, to
sompensate for former (pre-2.0) connect_after() facility.
(gtk_widget_send_expose):
(gtk_widget_event): assert the widget is realized, since event delivery
to non-realized widgets is essentially a bug. event handlers should
be able to unconditionally rely on widget->window (unless they
emit events on their own which can trigger widget destruction).
(gtk_widget_event_internal): removed old outdated GTK_OBJECT_DESTROYED()
logic. event delivery happens as follows:
a) emission of GtkWidget::event (RUN_LAST handler). returns was_handled.
b) if !was_handled in (a) and the widget is still realized, emit event-
specific signal (RUN_LAST handler). returns was_handled.
c) emission of GtkWidget::event-after for notification if the widget is
still realized (regardless of was_handled from previous stages, no
class handler). no return value.
d) was_handled gets passed on to caller, to determine further
propagation. if the widget got unrealized meanwhile, was_handled
is returned as TRUE.
* gdk/gdkevents.[hc]: added gdk_event_get_root_coords() and
gdk_event_get_coords().
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/gdkevents.c | 119 | ||||
-rw-r--r-- | gdk/gdkevents.h | 7 |
2 files changed, 125 insertions, 1 deletions
diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c index 57f3da04e4..72bfbc236b 100644 --- a/gdk/gdkevents.c +++ b/gdk/gdkevents.c @@ -560,6 +560,125 @@ gdk_event_get_state (GdkEvent *event, } /** + * gdk_event_get_coords: + * @event: a #GdkEvent + * @x_root: location to put event window x coordinate + * @y_root: location to put event window y coordinate + * + * Extract the event window relative x/y coordinates from an event. + * + * Return value: %TRUE if the event delivered event window coordinates + **/ +gboolean +gdk_event_get_coords (GdkEvent *event, + gdouble *x_win, + gdouble *y_win) +{ + gdouble x = 0, y = 0; + gboolean fetched = TRUE; + + g_return_val_if_fail (event != NULL, FALSE); + + switch (event->type) + { + case GDK_CONFIGURE: + x = event->configure.x; + y = event->configure.y; + break; + case GDK_ENTER_NOTIFY: + case GDK_LEAVE_NOTIFY: + x = event->crossing.x; + y = event->crossing.y; + break; + case GDK_SCROLL: + x = event->scroll.x; + y = event->scroll.y; + break; + case GDK_BUTTON_PRESS: + case GDK_2BUTTON_PRESS: + case GDK_3BUTTON_PRESS: + case GDK_BUTTON_RELEASE: + x = event->button.x; + y = event->button.y; + break; + case GDK_MOTION_NOTIFY: + x = event->motion.x; + y = event->motion.y; + break; + default: + fetched = FALSE; + break; + } + + if (x_win) + *x_win = x; + if (y_win) + *y_win = x; + + return fetched; +} + +/** + * gdk_event_get_root_coords: + * @event: a #GdkEvent + * @x_root: location to put root window x coordinate + * @y_root: location to put root window y coordinate + * + * Extract the root window relative x/y coordinates from an event. + * + * Return value: %TRUE if the event delivered root window coordinates + **/ +gboolean +gdk_event_get_root_coords (GdkEvent *event, + gdouble *x_root, + gdouble *y_root) +{ + gdouble x = 0, y = 0; + gboolean fetched = TRUE; + + g_return_val_if_fail (event != NULL, FALSE); + + switch (event->type) + { + case GDK_MOTION_NOTIFY: + x = event->motion.x_root; + y = event->motion.y_root; + break; + case GDK_BUTTON_PRESS: + case GDK_2BUTTON_PRESS: + case GDK_3BUTTON_PRESS: + case GDK_BUTTON_RELEASE: + x = event->button.x_root; + y = event->button.y_root; + break; + case GDK_ENTER_NOTIFY: + case GDK_LEAVE_NOTIFY: + x = event->crossing.x_root; + y = event->crossing.y_root; + break; + case GDK_DRAG_ENTER: + case GDK_DRAG_LEAVE: + case GDK_DRAG_MOTION: + case GDK_DRAG_STATUS: + case GDK_DROP_START: + case GDK_DROP_FINISHED: + x = event->dnd.x_root; + y = event->dnd.y_root; + break; + default: + fetched = FALSE; + break; + } + + if (x_root) + *x_root = x; + if (y_root) + *y_root = x; + + return fetched; +} + +/** * gdk_event_get_axis: * @event: a #GdkEvent * @axis_use: the axis use to look for diff --git a/gdk/gdkevents.h b/gdk/gdkevents.h index a1eeb02ed2..763c1a377a 100644 --- a/gdk/gdkevents.h +++ b/gdk/gdkevents.h @@ -456,10 +456,15 @@ void gdk_event_free (GdkEvent *event); guint32 gdk_event_get_time (GdkEvent *event); gboolean gdk_event_get_state (GdkEvent *event, GdkModifierType *state); +gboolean gdk_event_get_coords (GdkEvent *event, + gdouble *x_win, + gdouble *y_win); +gboolean gdk_event_get_root_coords (GdkEvent *event, + gdouble *x_root, + gdouble *y_root); gboolean gdk_event_get_axis (GdkEvent *event, GdkAxisUse axis_use, gdouble *value); - void gdk_event_handler_set (GdkEventFunc func, gpointer data, GDestroyNotify notify); |