summaryrefslogtreecommitdiff
path: root/gdk/gdkevents.c
diff options
context:
space:
mode:
authorTim Janik <timj@gtk.org>2001-06-28 22:49:20 +0000
committerTim Janik <timj@src.gnome.org>2001-06-28 22:49:20 +0000
commit00f85bf815499a651ecec41fcccb234b56c2f383 (patch)
tree4069b72a22071efc323f61711e3a63ae22ff6e5f /gdk/gdkevents.c
parent10f047cf4ce86b7ff32050279214faac3c294f11 (diff)
downloadgdk-pixbuf-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/gdkevents.c')
-rw-r--r--gdk/gdkevents.c119
1 files changed, 119 insertions, 0 deletions
diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c
index 57f3da04e..72bfbc236 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