From f195fbc2218e1f476238ab06e76ebe762cf5f25b Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Mon, 8 Jun 2009 19:38:15 +0200 Subject: [PATCH] Implement offscreen get_pointer with offscreen signals --- gdk/gdkoffscreenwindow.c | 60 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/gdk/gdkoffscreenwindow.c b/gdk/gdkoffscreenwindow.c index beeb3d1dac..5682b22485 100644 --- a/gdk/gdkoffscreenwindow.c +++ b/gdk/gdkoffscreenwindow.c @@ -698,13 +698,71 @@ gdk_offscreen_window_get_origin (GdkWindow *window, return TRUE; } +static GdkWindow * +get_offscreen_parent (GdkWindow *window) +{ + GdkWindowObject *private; + GdkWindow *res; + + private = (GdkWindowObject *)window; + + res = NULL; + g_signal_emit_by_name (private->impl_window, + "get-offscreen-parent", + &res); + + return res; +} + +static void +from_parent (GdkWindow *window, + double parent_x, double parent_y, + double *offscreen_x, double *offscreen_y) +{ + GdkWindowObject *private; + + private = (GdkWindowObject *)window; + + g_signal_emit_by_name (private->impl_window, + "from_parent", + parent_x, parent_y, + offscreen_x, offscreen_y, + NULL); +} + + static gboolean gdk_offscreen_window_get_pointer (GdkWindow *window, gint *x, gint *y, GdkModifierType *mask) { - /* TODO: Base on signals */ + int tmpx, tmpy; + double dtmpx, dtmpy; + GdkModifierType tmpmask; + GdkWindow *parent; + + tmpx = 0; + tmpy = 0; + tmpmask = 0; + + parent = get_offscreen_parent (window); + if (parent != NULL) + { + gdk_window_get_pointer (parent, &tmpx, &tmpy, &tmpmask); + from_parent (window, + tmpx, tmpy, + &dtmpx, &dtmpy); + tmpx = floor (dtmpx + 0.5); + tmpy = floor (dtmpy + 0.5); + } + + if (x) + *x = tmpx; + if (y) + *y = tmpy; + if (mask) + *mask = tmpmask; return TRUE; }