summaryrefslogtreecommitdiff
path: root/gdk/quartz
diff options
context:
space:
mode:
authorRichard Hult <richard@imendio.com>2006-07-20 08:06:54 +0000
committerRichard Hult <rhult@src.gnome.org>2006-07-20 08:06:54 +0000
commitcb5f9e62e996e3720ddcefcfa29484854a04787e (patch)
tree3e6365c94ad7c3f54e7140bafa129f15374f82bf /gdk/quartz
parent456b9fbc956a7a5adbb189363c6da49536414abd (diff)
downloadgtk+-cb5f9e62e996e3720ddcefcfa29484854a04787e.tar.gz
Append the event to the queue instead of using gdk_event_put.
2006-07-20 Richard Hult <richard@imendio.com> * gdk/quartz/gdkevents-quartz.c: (generate_grab_broken_event): Append the event to the queue instead of using gdk_event_put. (_gdk_quartz_get_mouse_window, find_current_keyboard_window): Handle grabs. (get_event_mask_from_ns_event, create_focus_event) (convert_window_coordinates_to_root, find_window_for_event) (gdk_event_translate): Improve readability (style changes). (gdk_flush, gdk_display_sync, gdk_display_flush) (gdk_event_send_client_message_for_display), (gdk_screen_broadcast_client_message): Remove FIXMEs. (gdk_screen_get_setting): Reindent. Also move find_child_window_by_point to gdkwindow-quartz.c. * gdk/quartz/gdkwindow-quartz.c: (find_child_window_by_point_helper), (_gdk_quartz_find_child_window_by_point): Move here from gdkevents-quartz.c (_gdk_windowing_window_get_pointer): Handle destroyed windows and imlement the return value. (_gdk_windowing_window_at_pointer): Implement.
Diffstat (limited to 'gdk/quartz')
-rw-r--r--gdk/quartz/gdkevents-quartz.c167
-rw-r--r--gdk/quartz/gdkprivate-quartz.h22
-rw-r--r--gdk/quartz/gdkwindow-quartz.c111
3 files changed, 175 insertions, 125 deletions
diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c
index 9129ae01ab..d19ea8848e 100644
--- a/gdk/quartz/gdkevents-quartz.c
+++ b/gdk/quartz/gdkevents-quartz.c
@@ -52,6 +52,8 @@ static gboolean pointer_grab_implicit;
GdkWindow *_gdk_quartz_keyboard_grab_window;
static gboolean keyboard_grab_owner_events;
+static void append_event (GdkEvent *event);
+
static gboolean
gdk_event_prepare (GSource *source,
gint *timeout)
@@ -345,20 +347,18 @@ generate_grab_broken_event (GdkWindow *window,
{
if (!GDK_WINDOW_DESTROYED (window))
{
- GdkEvent event;
-
- event.type = GDK_GRAB_BROKEN;
- event.grab_broken.window = window;
- event.grab_broken.send_event = 0;
- event.grab_broken.keyboard = keyboard;
- event.grab_broken.implicit = implicit;
- event.grab_broken.grab_window = grab_window;
+ GdkEvent *event = gdk_event_new (GDK_GRAB_BROKEN);
+
+ event->grab_broken.window = window;
+ event->grab_broken.send_event = 0;
+ event->grab_broken.keyboard = keyboard;
+ event->grab_broken.implicit = implicit;
+ event->grab_broken.grab_window = grab_window;
- gdk_event_put (&event);
+ append_event (event);
}
}
-
GdkGrabStatus
gdk_keyboard_grab (GdkWindow *window,
gint owner_events,
@@ -422,7 +422,6 @@ pointer_ungrab_internal (gboolean implicit)
/* FIXME: Send crossing events */
}
-
gboolean
gdk_display_pointer_is_grabbed (GdkDisplay *display)
{
@@ -564,69 +563,17 @@ apply_filters (GdkWindow *window,
return result;
}
-static GdkWindow *
-find_child_window_by_point_helper (GdkWindow *window, int x, int y, int x_offset, int y_offset, int *x_ret, int *y_ret)
-{
- GList *children;
-
- for (children = GDK_WINDOW_OBJECT (window)->children;
- children; children = children->next)
- {
- GdkWindowObject *private = GDK_WINDOW_OBJECT (children->data);
- GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
- int temp_x, temp_y;
-
- if (!GDK_WINDOW_IS_MAPPED (private))
- continue;
-
- temp_x = x_offset + private->x;
- temp_y = y_offset + private->y;
-
- /* FIXME: Are there off by one errors here? */
- if (x >= temp_x && y >= temp_y &&
- x < temp_x + impl->width && y < temp_y + impl->height)
- {
- *x_ret = x - x_offset - private->x;
- *y_ret = y - y_offset - private->y;
-
- /* Look for child windows */
- return find_child_window_by_point_helper (GDK_WINDOW (children->data), x, y, temp_x, temp_y, x_ret, y_ret);
- }
- }
-
- return window;
-}
-
-/* Given a toplevel window and coordinates, returns the window
- * in which the point is.
- */
-static GdkWindow *
-find_child_window_by_point (GdkWindow *toplevel, int x, int y, int *x_ret, int *y_ret)
-{
- GdkWindowObject *private = (GdkWindowObject *)toplevel;
- GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
-
- /* If the point is in the title bar, ignore it */
- if (y > impl->height)
- return NULL;
-
- /* FIXME: Check this for off-by-one errors */
- /* First flip the y coordinate */
- y = impl->height - y;
-
- return find_child_window_by_point_helper (toplevel, x, y, 0, 0, x_ret, y_ret);
-}
-
/* Returns the current keyboard window */
static GdkWindow *
find_current_keyboard_window (void)
{
- /* FIXME: Handle keyboard grabs */
-
+ if (_gdk_quartz_keyboard_grab_window && keyboard_grab_owner_events)
+ return _gdk_quartz_keyboard_grab_window;
+
return current_keyboard_window;
}
-/* this function checks if the passed in window is interested in the
+/* This function checks if the passed in window is interested in the
* event mask. If so, it's returned. If not, the event can be propagated
* to its parent.
*/
@@ -679,9 +626,7 @@ convert_mouse_button_number (int button)
static GdkEventMask
get_event_mask_from_ns_event (NSEvent *nsevent)
{
- NSEventType event_type = [nsevent type];
-
- switch (event_type)
+ switch ([nsevent type])
{
case NSLeftMouseDown:
case NSRightMouseDown:
@@ -692,23 +637,27 @@ get_event_mask_from_ns_event (NSEvent *nsevent)
case NSOtherMouseUp:
return GDK_BUTTON_RELEASE_MASK;
case NSMouseMoved:
- return GDK_POINTER_MOTION_MASK|GDK_POINTER_MOTION_HINT_MASK;
+ return GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK;
case NSScrollWheel:
/* Since applications that want button press events can get
* scroll events on X11 (since scroll wheel events are really
* button press events there), we need to use GDK_BUTTON_PRESS_MASK too.
*/
- return GDK_SCROLL_MASK|GDK_BUTTON_PRESS_MASK;
+ return GDK_SCROLL_MASK | GDK_BUTTON_PRESS_MASK;
case NSLeftMouseDragged:
- return GDK_POINTER_MOTION_MASK|GDK_POINTER_MOTION_HINT_MASK|
+ return GDK_POINTER_MOTION_MASK|GDK_POINTER_MOTION_HINT_MASK |
GDK_BUTTON_MOTION_MASK|GDK_BUTTON1_MOTION_MASK;
case NSRightMouseDragged:
- return GDK_POINTER_MOTION_MASK|GDK_POINTER_MOTION_HINT_MASK|
+ return GDK_POINTER_MOTION_MASK|GDK_POINTER_MOTION_HINT_MASK |
GDK_BUTTON_MOTION_MASK|GDK_BUTTON3_MOTION_MASK;
case NSOtherMouseDragged:
{
- GdkEventMask mask = GDK_POINTER_MOTION_MASK|GDK_POINTER_MOTION_HINT_MASK|
- GDK_BUTTON_MOTION_MASK;
+ GdkEventMask mask;
+
+ mask = (GDK_POINTER_MOTION_MASK |
+ GDK_POINTER_MOTION_HINT_MASK |
+ GDK_BUTTON_MOTION_MASK);
+
if (convert_mouse_button_number ([nsevent buttonNumber]) == 2)
mask |= GDK_BUTTON2_MOTION_MASK;
@@ -718,14 +667,17 @@ get_event_mask_from_ns_event (NSEvent *nsevent)
case NSKeyUp:
case NSFlagsChanged:
{
- GdkEventType type = _gdk_quartz_key_event_type (nsevent);
- switch (type)
- {
- case GDK_KEY_PRESS: return GDK_KEY_PRESS_MASK;
- case GDK_KEY_RELEASE: return GDK_KEY_RELEASE_MASK;
- case GDK_NOTHING: return 0;
- default: g_assert_not_reached ();
- }
+ switch (_gdk_quartz_key_event_type (nsevent))
+ {
+ case GDK_KEY_PRESS:
+ return GDK_KEY_PRESS_MASK;
+ case GDK_KEY_RELEASE:
+ return GDK_KEY_RELEASE_MASK;
+ case GDK_NOTHING:
+ return 0;
+ default:
+ g_assert_not_reached ();
+ }
}
default:
g_assert_not_reached ();
@@ -742,7 +694,6 @@ create_focus_event (GdkWindow *window,
event = gdk_event_new (GDK_FOCUS_CHANGE);
event->focus_change.window = window;
- /* FIXME: send event */
event->focus_change.in = in;
return event;
@@ -821,8 +772,11 @@ get_keyboard_modifiers_from_nsevent (NSEvent *nsevent)
}
static void
-convert_window_coordinates_to_root (GdkWindow *window, gdouble x, gdouble y,
- gdouble *x_root, gdouble *y_root)
+convert_window_coordinates_to_root (GdkWindow *window,
+ gdouble x,
+ gdouble y,
+ gdouble *x_root,
+ gdouble *y_root)
{
gint ox, oy;
@@ -1017,7 +971,6 @@ synthesize_crossing_events (GdkWindow *window,
_gdk_quartz_update_mouse_window (window);
}
-
void
_gdk_quartz_send_map_events (GdkWindow *window)
{
@@ -1044,7 +997,9 @@ _gdk_quartz_send_map_events (GdkWindow *window)
GdkWindow *
_gdk_quartz_get_mouse_window (void)
{
- /* FIXME: What about grabs? */
+ if (_gdk_quartz_pointer_grab_window)
+ return _gdk_quartz_pointer_grab_window;
+
return current_mouse_window;
}
@@ -1106,7 +1061,7 @@ find_window_for_event (NSEvent *nsevent, gint *x, gint *y)
NSPoint point = [nsevent locationInWindow];
GdkWindow *mouse_window;
- mouse_window = find_child_window_by_point (toplevel, point.x, point.y, x, y);
+ mouse_window = _gdk_quartz_find_child_window_by_point (toplevel, point.x, point.y, x, y);
if (!mouse_window)
mouse_window = _gdk_root;
@@ -1152,8 +1107,11 @@ find_window_for_event (NSEvent *nsevent, gint *x, gint *y)
if (pointer_grab_event_mask & get_event_mask_from_ns_event (nsevent))
{
int tempx, tempy;
- GdkWindowObject *w = GDK_WINDOW_OBJECT (_gdk_quartz_pointer_grab_window);
- GdkWindowObject *grab_toplevel = GDK_WINDOW_OBJECT (gdk_window_get_toplevel (_gdk_quartz_pointer_grab_window));
+ GdkWindowObject *w;
+ GdkWindowObject *grab_toplevel;
+
+ w = GDK_WINDOW_OBJECT (_gdk_quartz_pointer_grab_window);
+ grab_toplevel = GDK_WINDOW_OBJECT (gdk_window_get_toplevel (_gdk_quartz_pointer_grab_window));
tempx = point.x;
tempy = GDK_WINDOW_IMPL_QUARTZ (grab_toplevel->impl)->height -
@@ -1182,9 +1140,9 @@ find_window_for_event (NSEvent *nsevent, gint *x, gint *y)
{
mouse_window = _gdk_root;
}
- else
+ else
{
- mouse_window = find_child_window_by_point (toplevel, point.x, point.y, x, y);
+ mouse_window = _gdk_quartz_find_child_window_by_point (toplevel, point.x, point.y, x, y);
}
event_mask = get_event_mask_from_ns_event (nsevent);
@@ -1202,7 +1160,7 @@ find_window_for_event (NSEvent *nsevent, gint *x, gint *y)
toplevel = [(GdkQuartzView *)[nswindow contentView] gdkWindow];
- mouse_window = find_child_window_by_point (toplevel, point.x, point.y, x, y);
+ mouse_window = _gdk_quartz_find_child_window_by_point (toplevel, point.x, point.y, x, y);
synthesize_crossing_events (mouse_window, GDK_CROSSING_NORMAL, nsevent, *x, *y);
@@ -1453,7 +1411,6 @@ gdk_event_translate (NSEvent *nsevent)
}
window = find_window_for_event (nsevent, &x, &y);
-
if (!window)
return FALSE;
@@ -1548,15 +1505,17 @@ gdk_event_translate (NSEvent *nsevent)
case NSKeyUp:
case NSFlagsChanged:
{
- GdkEventType type = _gdk_quartz_key_event_type (nsevent);
+ GdkEventType type;
+
+ type = _gdk_quartz_key_event_type (nsevent);
if (type == GDK_NOTHING)
return FALSE;
event = create_key_event (window, nsevent, type);
append_event (event);
return TRUE;
- break;
}
+ break;
default:
NSLog(@"Untranslated: %@", nsevent);
}
@@ -1580,19 +1539,19 @@ _gdk_events_queue (GdkDisplay *display)
void
gdk_flush (void)
{
- gdk_display_flush (NULL);
+ /* Not supported. */
}
void
gdk_display_sync (GdkDisplay *display)
{
- /* FIXME: Implement */
+ /* Not supported. */
}
void
gdk_display_flush (GdkDisplay *display)
{
- /* FIXME: Implement */
+ /* Not supported. */
}
gboolean
@@ -1600,13 +1559,15 @@ gdk_event_send_client_message_for_display (GdkDisplay *display,
GdkEvent *event,
GdkNativeWindow winid)
{
+ /* Not supported. */
return FALSE;
}
void
gdk_screen_broadcast_client_message (GdkScreen *screen,
- GdkEvent *event)
+ GdkEvent *event)
{
+ /* Not supported. */
}
gboolean
@@ -1616,7 +1577,7 @@ gdk_screen_get_setting (GdkScreen *screen,
{
if (strcmp (name, "gtk-font-name") == 0)
{
- /* FIXME: This should be fetched from the correct preference value */
+ /* FIXME: This should be fetched from the correct preference value */
g_value_set_string (value, "Lucida Grande 13");
return TRUE;
}
diff --git a/gdk/quartz/gdkprivate-quartz.h b/gdk/quartz/gdkprivate-quartz.h
index bbd1f72f85..88a1ae533e 100644
--- a/gdk/quartz/gdkprivate-quartz.h
+++ b/gdk/quartz/gdkprivate-quartz.h
@@ -103,15 +103,19 @@ void _gdk_quartz_set_context_stroke_color_from_pixel (CGContextRef context, GdkC
void _gdk_quartz_update_context_from_gc (CGContextRef context, GdkGC *gc);
-void _gdk_quartz_update_focus_window (GdkWindow *new_window,
- gboolean got_focus);
-
-gint _gdk_quartz_get_inverted_screen_y (gint y);
-
-GdkWindow *_gdk_quartz_get_mouse_window (void);
-void _gdk_quartz_update_mouse_window (GdkWindow *window);
-
-void _gdk_quartz_update_cursor (GdkWindow *window);
+gint _gdk_quartz_get_inverted_screen_y (gint y);
+
+GdkWindow * _gdk_quartz_find_child_window_by_point (GdkWindow *toplevel,
+ int x,
+ int y,
+ int *x_ret,
+ int *y_ret);
+
+void _gdk_quartz_update_focus_window (GdkWindow *new_window,
+ gboolean got_focus);
+GdkWindow *_gdk_quartz_get_mouse_window (void);
+void _gdk_quartz_update_mouse_window (GdkWindow *window);
+void _gdk_quartz_update_cursor (GdkWindow *window);
GdkImage *_gdk_quartz_copy_to_image (GdkDrawable *drawable,
GdkImage *image,
diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c
index a2497de7fb..65fc970813 100644
--- a/gdk/quartz/gdkwindow-quartz.c
+++ b/gdk/quartz/gdkwindow-quartz.c
@@ -290,6 +290,72 @@ _gdk_quartz_get_inverted_screen_y (gint y)
return rect.size.height - y;
}
+static GdkWindow *
+find_child_window_by_point_helper (GdkWindow *window,
+ int x,
+ int y,
+ int x_offset,
+ int y_offset,
+ int *x_ret,
+ int *y_ret)
+{
+ GList *l;
+
+ for (l = GDK_WINDOW_OBJECT (window)->children; l; l = l->next)
+ {
+ GdkWindowObject *private = GDK_WINDOW_OBJECT (l->data);
+ GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+ int temp_x, temp_y;
+
+ if (!GDK_WINDOW_IS_MAPPED (private))
+ continue;
+
+ temp_x = x_offset + private->x;
+ temp_y = y_offset + private->y;
+
+ /* FIXME: Are there off by one errors here? */
+ if (x >= temp_x && y >= temp_y &&
+ x < temp_x + impl->width && y < temp_y + impl->height)
+ {
+ *x_ret = x - x_offset - private->x;
+ *y_ret = y - y_offset - private->y;
+
+ /* Look for child windows */
+ return find_child_window_by_point_helper (GDK_WINDOW (l->data),
+ x, y,
+ temp_x, temp_y,
+ x_ret, y_ret);
+ }
+ }
+
+ return window;
+}
+
+/* Given a toplevel window and coordinates, returns the window
+ * in which the point is. Note that x and y should be non-flipped
+ * (and relative the toplevel), while the returned positions are
+ * flipped.
+ */
+GdkWindow *
+_gdk_quartz_find_child_window_by_point (GdkWindow *toplevel,
+ int x,
+ int y,
+ int *x_ret,
+ int *y_ret)
+{
+ GdkWindowObject *private = (GdkWindowObject *)toplevel;
+ GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+
+ /* If the point is in the title bar, ignore it */
+ if (y > impl->height)
+ return NULL;
+
+ /* First flip the y coordinate */
+ y = impl->height - y;
+
+ return find_child_window_by_point_helper (toplevel, x, y, 0, 0, x_ret, y_ret);
+}
+
GdkWindow *
gdk_window_new (GdkWindow *parent,
GdkWindowAttr *attributes,
@@ -435,7 +501,10 @@ gdk_window_new (GdkWindow *parent,
style_mask = NSBorderlessWindowMask;
break;
default:
- style_mask = NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask;
+ style_mask = (NSTitledWindowMask |
+ NSClosableWindowMask |
+ NSMiniaturizableWindowMask |
+ NSResizableWindowMask);
}
impl->toplevel = [[GdkQuartzWindow alloc] initWithContentRect:content_rect
@@ -450,7 +519,6 @@ gdk_window_new (GdkWindow *parent,
[impl->toplevel setLevel:NSPopUpMenuWindowLevel];
gdk_window_set_title (window, title);
-
if (draw_impl->colormap == gdk_screen_get_rgba_colormap (_gdk_screen))
{
@@ -961,6 +1029,7 @@ _gdk_windowing_get_pointer (GdkDisplay *display,
_gdk_windowing_window_get_pointer (_gdk_display, _gdk_root, x, y, mask);
}
+/* Returns coordinates relative to the upper left corner of window. */
GdkWindow *
_gdk_windowing_window_get_pointer (GdkDisplay *display,
GdkWindow *window,
@@ -968,11 +1037,23 @@ _gdk_windowing_window_get_pointer (GdkDisplay *display,
gint *y,
GdkModifierType *mask)
{
- GdkWindow *toplevel = gdk_window_get_toplevel (window);
- GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
- GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
+ GdkWindow *toplevel;
+ GdkWindowImplQuartz *impl;
+ GdkWindowObject *private;
NSPoint point;
- int x_tmp, y_tmp;
+ gint x_tmp, y_tmp;
+
+ if (GDK_WINDOW_DESTROYED (window))
+ {
+ *x = 0;
+ *y = 0;
+ *mask = 0;
+ return NULL;
+ }
+
+ toplevel = gdk_window_get_toplevel (window);
+ impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
+ private = GDK_WINDOW_OBJECT (window);
/* Must flip the y coordinate. */
if (window == _gdk_root)
@@ -987,7 +1068,7 @@ _gdk_windowing_window_get_pointer (GdkDisplay *display,
y_tmp = impl->height - point.y;
}
x_tmp = point.x;
-
+
while (private != GDK_WINDOW_OBJECT (toplevel))
{
x_tmp -= private->x;
@@ -996,14 +1077,14 @@ _gdk_windowing_window_get_pointer (GdkDisplay *display,
private = private->parent;
}
+ /* FIXME: Implement mask. */
*x = x_tmp;
*y = y_tmp;
-
- /* FIXME: Implement mask. */
*mask = 0;
- /* FIXME: Implement return value */
- return NULL;
+ return _gdk_quartz_find_child_window_by_point (window,
+ point.x, point.y,
+ &x_tmp, &y_tmp);
}
void
@@ -1020,8 +1101,12 @@ _gdk_windowing_window_at_pointer (GdkDisplay *display,
gint *win_x,
gint *win_y)
{
- /* FIXME: Implement */
- return NULL;
+ GdkModifierType mask;
+
+ return _gdk_windowing_window_get_pointer (display,
+ _gdk_root,
+ win_x, win_y,
+ &mask);
}
GdkEventMask