diff --git a/gdk/mir/gdkmir-private.h b/gdk/mir/gdkmir-private.h index d81f62f724..d1792a1131 100644 --- a/gdk/mir/gdkmir-private.h +++ b/gdk/mir/gdkmir-private.h @@ -14,22 +14,6 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . */ -/* GDK - The GIMP Drawing Kit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ #ifndef __GDK_PRIVATE_MIR_H__ #define __GDK_PRIVATE_MIR_H__ @@ -51,43 +35,6 @@ typedef struct _GdkMirEventSource GdkMirEventSource; #define GDK_MIR_WINDOW_IMPL(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_WINDOW_IMPL_MIR, GdkMirWindowImpl)) #define GDK_IS_WINDOW_IMPL_MIR(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_WINDOW_IMPL_MIR)) -struct _GdkMirWindowImpl -{ - GdkWindowImpl parent_instance; - - /* Window we are temporary for */ - GdkWindow *transient_for; - GdkRectangle transient_size; - - /* Child windows (e.g. tooltips) */ - GList *transient_children; - - /* Desired surface attributes */ - MirSurfaceType surface_type; // FIXME - MirSurfaceState surface_state; - - /* Pattern for background */ - cairo_pattern_t *background; - - /* Current button state for checking which buttons are being pressed / released */ - gdouble x; - gdouble y; - MirMotionButton button_state; - - /* Surface being rendered to (only exists when window visible) */ - MirSurface *surface; - - /* Cairo context for current frame */ - cairo_surface_t *cairo_surface; - - /* TRUE if the window can be seen */ - gboolean visible; - - /* TRUE if cursor is inside this window */ - gboolean cursor_inside; -}; - - GdkDisplay *_gdk_mir_display_open (const gchar *display_name); GdkScreen *_gdk_mir_screen_new (GdkDisplay *display); @@ -108,6 +55,12 @@ GdkCursor *_gdk_mir_cursor_new (GdkDisplay *display, GdkCursorType type); GdkWindowImpl *_gdk_mir_window_impl_new (void); +void _gdk_mir_window_impl_set_surface_state (GdkMirWindowImpl *impl, MirSurfaceState state); + +void _gdk_mir_window_impl_set_cursor_state (GdkMirWindowImpl *impl, gdouble x, gdouble y, gboolean cursor_inside, MirMotionButton button_state); + +void _gdk_mir_window_impl_get_cursor_state (GdkMirWindowImpl *impl, gdouble *x, gdouble *y, gboolean *cursor_inside, MirMotionButton *button_state); + GdkMirEventSource *_gdk_mir_display_get_event_source (GdkDisplay *display); GdkMirEventSource *_gdk_mir_event_source_new (GdkDisplay *display); diff --git a/gdk/mir/gdkmirdisplay.c b/gdk/mir/gdkmirdisplay.c index e7052399b7..7a56587f9c 100644 --- a/gdk/mir/gdkmirdisplay.c +++ b/gdk/mir/gdkmirdisplay.c @@ -513,10 +513,10 @@ gdk_mir_display_init (GdkMirDisplay *display) } static void -gdk_mir_display_class_init (GdkMirDisplayClass * class) +gdk_mir_display_class_init (GdkMirDisplayClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (class); - GdkDisplayClass *display_class = GDK_DISPLAY_CLASS (class); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GdkDisplayClass *display_class = GDK_DISPLAY_CLASS (klass); object_class->dispose = gdk_mir_display_dispose; object_class->finalize = gdk_mir_display_finalize; diff --git a/gdk/mir/gdkmireventsource.c b/gdk/mir/gdkmireventsource.c index 2e4d383882..831962baac 100644 --- a/gdk/mir/gdkmireventsource.c +++ b/gdk/mir/gdkmireventsource.c @@ -555,53 +555,59 @@ static void handle_motion_event (GdkWindow *window, const MirMotionEvent *event) { GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); + gdouble x, y; + gboolean cursor_inside; + MirMotionButton button_state; guint modifier_state; GdkEventType event_type; MirMotionButton changed_button_state; + _gdk_mir_window_impl_get_cursor_state (impl, &x, &y, &cursor_inside, &button_state); if (event->pointer_count > 0) { - impl->x = event->pointer_coordinates[0].x; - impl->y = event->pointer_coordinates[0].y; + x = event->pointer_coordinates[0].x; + y = event->pointer_coordinates[0].y; } modifier_state = get_modifier_state (event->modifiers, event->button_state); /* The Mir events generate hover-exits even while inside the window so counteract this by always generating an enter notify on all other events */ - if (!impl->cursor_inside && event->action != mir_motion_action_hover_exit) + if (!cursor_inside && event->action != mir_motion_action_hover_exit) { - impl->cursor_inside = TRUE; - generate_crossing_event (window, GDK_ENTER_NOTIFY, impl->x, impl->y); + cursor_inside = TRUE; + generate_crossing_event (window, GDK_ENTER_NOTIFY, x, y); } /* Update which window has focus */ - _gdk_mir_pointer_set_location (get_pointer (window), impl->x, impl->y, window, modifier_state); + _gdk_mir_pointer_set_location (get_pointer (window), x, y, window, modifier_state); switch (event->action) { case mir_motion_action_down: case mir_motion_action_up: event_type = event->action == mir_motion_action_down ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE; - changed_button_state = impl->button_state ^ event->button_state; + changed_button_state = button_state ^ event->button_state; if ((changed_button_state & mir_motion_button_primary) != 0) - generate_button_event (window, event_type, impl->x, impl->y, GDK_BUTTON_PRIMARY, modifier_state); + generate_button_event (window, event_type, x, y, GDK_BUTTON_PRIMARY, modifier_state); if ((changed_button_state & mir_motion_button_secondary) != 0) - generate_button_event (window, event_type, impl->x, impl->y, GDK_BUTTON_SECONDARY, modifier_state); + generate_button_event (window, event_type, x, y, GDK_BUTTON_SECONDARY, modifier_state); if ((changed_button_state & mir_motion_button_tertiary) != 0) - generate_button_event (window, event_type, impl->x, impl->y, GDK_BUTTON_MIDDLE, modifier_state); - impl->button_state = event->button_state; + generate_button_event (window, event_type, x, y, GDK_BUTTON_MIDDLE, modifier_state); + button_state = event->button_state; break; case mir_motion_action_scroll: - generate_scroll_event (window, impl->x, impl->y, event->pointer_coordinates[0].hscroll, event->pointer_coordinates[0].vscroll, modifier_state); + generate_scroll_event (window, x, y, event->pointer_coordinates[0].hscroll, event->pointer_coordinates[0].vscroll, modifier_state); break; case mir_motion_action_move: // move with button case mir_motion_action_hover_move: // move without button - generate_motion_event (window, impl->x, impl->y, modifier_state); + generate_motion_event (window, x, y, modifier_state); break; case mir_motion_action_hover_exit: - impl->cursor_inside = FALSE; - generate_crossing_event (window, GDK_LEAVE_NOTIFY, impl->x, impl->y); + cursor_inside = FALSE; + generate_crossing_event (window, GDK_LEAVE_NOTIFY, x, y); break; } + + _gdk_mir_window_impl_set_cursor_state (impl, x, y, cursor_inside, button_state); } static void @@ -614,7 +620,7 @@ handle_surface_event (GdkWindow *window, const MirSurfaceEvent *event) case mir_surface_attrib_type: break; case mir_surface_attrib_state: - impl->surface_state = event->value; + _gdk_mir_window_impl_set_surface_state (impl, event->value); // FIXME: notify break; case mir_surface_attrib_swapinterval: diff --git a/gdk/mir/gdkmirwindowimpl.c b/gdk/mir/gdkmirwindowimpl.c index a3d94256b0..8eada379a9 100644 --- a/gdk/mir/gdkmirwindowimpl.c +++ b/gdk/mir/gdkmirwindowimpl.c @@ -34,6 +34,42 @@ typedef struct _GdkMirWindowImplClass GdkMirWindowImplClass; +struct _GdkMirWindowImpl +{ + GdkWindowImpl parent_instance; + + /* Window we are temporary for */ + GdkWindow *transient_for; + GdkRectangle transient_size; + + /* Child windows (e.g. tooltips) */ + GList *transient_children; + + /* Desired surface attributes */ + MirSurfaceType surface_type; // FIXME + MirSurfaceState surface_state; + + /* Pattern for background */ + cairo_pattern_t *background; + + /* Current button state for checking which buttons are being pressed / released */ + gdouble x; + gdouble y; + MirMotionButton button_state; + + /* Surface being rendered to (only exists when window visible) */ + MirSurface *surface; + + /* Cairo context for current frame */ + cairo_surface_t *cairo_surface; + + /* TRUE if the window can be seen */ + gboolean visible; + + /* TRUE if cursor is inside this window */ + gboolean cursor_inside; +}; + struct _GdkMirWindowImplClass { GdkWindowImplClass parent_class; @@ -49,6 +85,42 @@ _gdk_mir_window_impl_new (void) return g_object_new (GDK_TYPE_MIR_WINDOW_IMPL, NULL); } +void +_gdk_mir_window_impl_set_surface_state (GdkMirWindowImpl *impl, MirSurfaceState state) +{ + impl->surface_state = state; +} + +void +_gdk_mir_window_impl_set_cursor_state (GdkMirWindowImpl *impl, + gdouble x, + gdouble y, + gboolean cursor_inside, + MirMotionButton button_state) +{ + impl->x = x; + impl->y = y; + impl->cursor_inside = cursor_inside; + impl->button_state = button_state; +} + +void +_gdk_mir_window_impl_get_cursor_state (GdkMirWindowImpl *impl, + gdouble *x, + gdouble *y, + gboolean *cursor_inside, + MirMotionButton *button_state) +{ + if (x) + *x = impl->x; + if (y) + *y = impl->y; + if (cursor_inside) + *cursor_inside = impl->cursor_inside; + if (button_state) + *button_state = impl->button_state; +} + static void gdk_mir_window_impl_init (GdkMirWindowImpl *impl) { @@ -61,7 +133,8 @@ get_connection (GdkWindow *window) } static void -set_surface_state (GdkMirWindowImpl *impl, MirSurfaceState state) +set_surface_state (GdkMirWindowImpl *impl, + MirSurfaceState state) { impl->surface_state = state; if (impl->surface)