diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2014-05-27 15:56:22 +0200 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2014-06-17 13:45:42 +1200 |
commit | bc1328f7ae8a65f26cccbfe72dd1f18e8072d676 (patch) | |
tree | 73363fdc827d2cdaacd3a774a87e6b00590f34cf | |
parent | 610b1bd5615e290fde428c190579109ce55ff295 (diff) | |
download | gtk+-bc1328f7ae8a65f26cccbfe72dd1f18e8072d676.tar.gz |
Correctly hide windows
-rw-r--r-- | gdk/mir/gdkmir-private.h | 2 | ||||
-rw-r--r-- | gdk/mir/gdkmirdisplay.c | 4 | ||||
-rw-r--r-- | gdk/mir/gdkmirkeyboard.c | 4 | ||||
-rw-r--r-- | gdk/mir/gdkmirpointer.c | 4 | ||||
-rw-r--r-- | gdk/mir/gdkmirscreen.c | 4 | ||||
-rw-r--r-- | gdk/mir/gdkmirwindowimpl.c | 133 |
6 files changed, 92 insertions, 59 deletions
diff --git a/gdk/mir/gdkmir-private.h b/gdk/mir/gdkmir-private.h index 2a6ff04543..95a5af680a 100644 --- a/gdk/mir/gdkmir-private.h +++ b/gdk/mir/gdkmir-private.h @@ -60,6 +60,6 @@ void _gdk_mir_pointer_set_location (GdkDevice *pointer, gdouble x, gdouble y, Gd GdkCursor *_gdk_mir_cursor_new (GdkDisplay *display, GdkCursorType type); -GdkWindowImpl *_gdk_mir_window_impl_new (int width, int height, GdkEventMask event_mask); +GdkWindowImpl *_gdk_mir_window_impl_new (void); #endif /* __GDK_PRIVATE_MIR_H__ */ diff --git a/gdk/mir/gdkmirdisplay.c b/gdk/mir/gdkmirdisplay.c index aaf02bb2ee..e257cf2f36 100644 --- a/gdk/mir/gdkmirdisplay.c +++ b/gdk/mir/gdkmirdisplay.c @@ -367,7 +367,7 @@ static void gdk_mir_display_notify_startup_complete (GdkDisplay *display, const gchar *startup_id) { - g_printerr ("gdk_mir_display_notify_startup_complete\n"); + //g_printerr ("gdk_mir_display_notify_startup_complete\n"); } static void @@ -395,7 +395,7 @@ gdk_mir_display_create_window_impl (GdkDisplay *display, gint attributes_mask) { g_printerr ("gdk_mir_display_create_window_impl (%d, %d, %d, %d)\n", window->x, window->y, window->width, window->height); - window->impl = _gdk_mir_window_impl_new (window->width, window->height, event_mask); + window->impl = _gdk_mir_window_impl_new (); } static GdkKeymap * diff --git a/gdk/mir/gdkmirkeyboard.c b/gdk/mir/gdkmirkeyboard.c index 93268fc7b7..86c0d9f4ea 100644 --- a/gdk/mir/gdkmirkeyboard.c +++ b/gdk/mir/gdkmirkeyboard.c @@ -118,7 +118,7 @@ gdk_mir_keyboard_grab (GdkDevice *device, GdkCursor *cursor, guint32 time_) { - g_printerr ("gdk_mir_keyboard_grab\n"); + //g_printerr ("gdk_mir_keyboard_grab\n"); /* Mir doesn't do grabs, so sure, you have the grab */ return GDK_GRAB_SUCCESS; } @@ -127,7 +127,7 @@ static void gdk_mir_keyboard_ungrab (GdkDevice *device, guint32 time_) { - g_printerr ("gdk_mir_keyboard_ungrab\n"); + //g_printerr ("gdk_mir_keyboard_ungrab\n"); /* Mir doesn't do grabs */ } diff --git a/gdk/mir/gdkmirpointer.c b/gdk/mir/gdkmirpointer.c index 3b4fcc966d..c249f9c5a9 100644 --- a/gdk/mir/gdkmirpointer.c +++ b/gdk/mir/gdkmirpointer.c @@ -172,7 +172,7 @@ gdk_mir_pointer_grab (GdkDevice *device, GdkCursor *cursor, guint32 time_) { - g_printerr ("gdk_mir_pointer_grab\n"); + //g_printerr ("gdk_mir_pointer_grab\n"); /* Mir doesn't do grabs, so sure, you have the grab */ return GDK_GRAB_SUCCESS; } @@ -181,7 +181,7 @@ static void gdk_mir_pointer_ungrab (GdkDevice *device, guint32 time_) { - g_printerr ("gdk_mir_pointer_ungrab\n"); + //g_printerr ("gdk_mir_pointer_ungrab\n"); /* Mir doesn't do grabs */ } diff --git a/gdk/mir/gdkmirscreen.c b/gdk/mir/gdkmirscreen.c index 57d28038aa..8be7ec094e 100644 --- a/gdk/mir/gdkmirscreen.c +++ b/gdk/mir/gdkmirscreen.c @@ -225,7 +225,7 @@ gdk_mir_screen_get_root_window (GdkScreen *screen) get_screen_size (GDK_MIR_SCREEN (screen)->display_config, &width, &height); s->root_window = _gdk_display_create_window (s->display); - s->root_window->impl = _gdk_mir_window_impl_new (width, height, 0); + s->root_window->impl = _gdk_mir_window_impl_new (); s->root_window->impl_window = s->root_window; s->root_window->visual = s->visual; s->root_window->window_type = GDK_WINDOW_ROOT; @@ -333,7 +333,7 @@ gdk_mir_screen_get_system_visual (GdkScreen *screen) static GdkVisual * gdk_mir_screen_get_rgba_visual (GdkScreen *screen) { - g_printerr ("gdk_mir_screen_get_rgba_visual\n"); + //g_printerr ("gdk_mir_screen_get_rgba_visual\n"); return GDK_MIR_SCREEN (screen)->visual; } diff --git a/gdk/mir/gdkmirwindowimpl.c b/gdk/mir/gdkmirwindowimpl.c index 5e94d35aa9..84b1fbf400 100644 --- a/gdk/mir/gdkmirwindowimpl.c +++ b/gdk/mir/gdkmirwindowimpl.c @@ -42,12 +42,7 @@ struct _GdkMirWindowImpl { GdkWindowImpl parent_instance; - /* Events to report */ - GdkEventMask event_mask; - /* Desired surface attributes */ - int width; - int height; MirSurfaceType surface_type; // FIXME MirSurfaceState surface_state; @@ -62,6 +57,9 @@ struct _GdkMirWindowImpl /* Cairo context for current frame */ cairo_surface_t *cairo_surface; + + /* TRUE if the window can be seen */ + gboolean visible; }; struct _GdkMirWindowImplClass @@ -72,15 +70,9 @@ struct _GdkMirWindowImplClass G_DEFINE_TYPE (GdkMirWindowImpl, gdk_mir_window_impl, GDK_TYPE_WINDOW_IMPL) GdkWindowImpl * -_gdk_mir_window_impl_new (int width, int height, GdkEventMask event_mask) +_gdk_mir_window_impl_new (void) { - GdkMirWindowImpl *impl = g_object_new (GDK_TYPE_MIR_WINDOW_IMPL, NULL); - - impl->width = width; - impl->height = height; - impl->event_mask = event_mask; - - return GDK_WINDOW_IMPL (impl); + return g_object_new (GDK_TYPE_MIR_WINDOW_IMPL, NULL); } static void @@ -556,8 +548,8 @@ handle_motion_event (GdkWindow *window, MirMotionEvent *event) 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; - if ((event_type == GDK_BUTTON_PRESS && (impl->event_mask & GDK_BUTTON_PRESS_MASK) != 0) || - (event_type == GDK_BUTTON_RELEASE && (impl->event_mask & GDK_BUTTON_RELEASE_MASK) != 0)) + if ((event_type == GDK_BUTTON_PRESS && (window->event_mask & GDK_BUTTON_PRESS_MASK) != 0) || + (event_type == GDK_BUTTON_RELEASE && (window->event_mask & GDK_BUTTON_RELEASE_MASK) != 0)) { if ((changed_button_state & mir_motion_button_primary) != 0) generate_button_event (window, event_type, x, y, GDK_BUTTON_PRIMARY, modifier_state); @@ -569,15 +561,15 @@ handle_motion_event (GdkWindow *window, MirMotionEvent *event) impl->button_state = event->button_state; break; case mir_motion_action_scroll: - if ((impl->event_mask & GDK_SMOOTH_SCROLL_MASK) != 0) + if ((window->event_mask & GDK_SMOOTH_SCROLL_MASK) != 0) 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 - if ((impl->event_mask & GDK_POINTER_MOTION_MASK) != 0 || - ((impl->event_mask & (GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK)) != 0 && (modifier_state & GDK_BUTTON1_MASK)) != 0 || - ((impl->event_mask & (GDK_BUTTON_MOTION_MASK | GDK_BUTTON2_MOTION_MASK)) != 0 && (modifier_state & GDK_BUTTON2_MASK)) != 0 || - ((impl->event_mask & (GDK_BUTTON_MOTION_MASK | GDK_BUTTON3_MOTION_MASK)) != 0 && (modifier_state & GDK_BUTTON3_MASK)) != 0) + if ((window->event_mask & GDK_POINTER_MOTION_MASK) != 0 || + ((window->event_mask & (GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK)) != 0 && (modifier_state & GDK_BUTTON1_MASK)) != 0 || + ((window->event_mask & (GDK_BUTTON_MOTION_MASK | GDK_BUTTON2_MOTION_MASK)) != 0 && (modifier_state & GDK_BUTTON2_MASK)) != 0 || + ((window->event_mask & (GDK_BUTTON_MOTION_MASK | GDK_BUTTON3_MOTION_MASK)) != 0 && (modifier_state & GDK_BUTTON3_MASK)) != 0) generate_motion_event (window, x, y, modifier_state); break; } @@ -657,6 +649,8 @@ event_cb (MirSurface *surface, const MirEvent *event, void *context) return; } +static int surface_count = 0; + static void ensure_surface (GdkWindow *window) { @@ -680,17 +674,40 @@ ensure_surface (GdkWindow *window) } parameters.name = "GTK+ Mir"; - parameters.width = impl->width; - parameters.height = impl->height; + parameters.width = window->width; + parameters.height = window->height; parameters.pixel_format = pixel_format; parameters.buffer_usage = mir_buffer_usage_software; parameters.output_id = mir_display_output_id_invalid; impl->surface = mir_connection_create_surface_sync (get_connection (window), ¶meters); + surface_count++; + g_printerr ("+%p %p %d\n", window, impl->surface, surface_count); mir_surface_set_event_handler (impl->surface, &event_delegate); // FIXME: Ignore some events until shown set_surface_state (impl, impl->surface_state); } static void +ensure_no_surface (GdkWindow *window) +{ + GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); + + if (impl->cairo_surface) + { + cairo_surface_finish (impl->cairo_surface); + cairo_surface_destroy (impl->cairo_surface); + impl->cairo_surface = NULL; + } + + if (impl->surface) + { + surface_count--; + g_printerr ("-%p %p %d\n", window, impl->surface, surface_count); + mir_surface_release_sync (impl->surface); + impl->surface = NULL; + } +} + +static void send_buffer (GdkWindow *window) { GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); @@ -709,7 +726,7 @@ send_buffer (GdkWindow *window) static cairo_surface_t * gdk_mir_window_impl_ref_cairo_surface (GdkWindow *window) { - g_printerr ("gdk_mir_window_impl_ref_cairo_surface\n"); + //g_printerr ("gdk_mir_window_impl_ref_cairo_surface\n"); GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); MirGraphicsRegion region; cairo_format_t pixel_format = CAIRO_FORMAT_INVALID; @@ -767,7 +784,7 @@ gdk_mir_window_impl_create_similar_image_surface (GdkWindow *window, int width, int height) { - g_printerr ("gdk_mir_window_impl_create_similar_image_surface\n"); + //g_printerr ("gdk_mir_window_impl_create_similar_image_surface\n"); return cairo_image_surface_create (format, width, height); } @@ -790,9 +807,12 @@ static void gdk_mir_window_impl_show (GdkWindow *window, gboolean already_mapped) { + GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); cairo_surface_t *s; - g_printerr ("gdk_mir_window_impl_show\n"); + //g_printerr ("gdk_mir_window_impl_show\n"); + + impl->visible = TRUE; /* Make sure there's a surface to see */ ensure_surface (window); @@ -806,20 +826,21 @@ gdk_mir_window_impl_show (GdkWindow *window, static void gdk_mir_window_impl_hide (GdkWindow *window) { - g_printerr ("gdk_mir_window_impl_hide\n"); + //g_printerr ("gdk_mir_window_impl_hide\n"); GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); - if (impl->surface) - { - mir_surface_release_sync (impl->surface); - impl->surface = NULL; - } + impl->visible = FALSE; + ensure_no_surface (window); } static void gdk_mir_window_impl_withdraw (GdkWindow *window) { - g_printerr ("gdk_mir_window_impl_withdraw\n"); + //g_printerr ("gdk_mir_window_impl_withdraw\n"); + GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); + + impl->visible = FALSE; + ensure_no_surface (window); } static void @@ -861,7 +882,11 @@ gdk_mir_window_impl_move_resize (GdkWindow *window, gint width, gint height) { - g_printerr ("gdk_mir_window_impl_move_resize\n"); + g_printerr ("gdk_mir_window_impl_move_resize (%d, %d, %d, %d)\n", x, y, width, height); + + /* If resize requested then destroy surface */ + if (width >= 0) + ensure_no_surface (window); } static void @@ -880,7 +905,7 @@ static GdkEventMask gdk_mir_window_impl_get_events (GdkWindow *window) { //g_printerr ("gdk_mir_window_impl_get_events\n"); - return GDK_MIR_WINDOW_IMPL (window)->event_mask; + return window->event_mask; } static void @@ -888,7 +913,7 @@ gdk_mir_window_impl_set_events (GdkWindow *window, GdkEventMask event_mask) { //g_printerr ("gdk_mir_window_impl_set_events\n"); - GDK_MIR_WINDOW_IMPL (window->impl)->event_mask = event_mask; + /* We just use the event mask from the GdkWindow class */ } static gboolean @@ -918,16 +943,15 @@ gdk_mir_window_impl_get_geometry (GdkWindow *window, gint *height) { //g_printerr ("gdk_mir_window_impl_get_geometry\n"); - GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); if (x) *x = 0; // FIXME if (y) *y = 0; // FIXME if (width) - *width = impl->width; + *width = window->width; if (height) - *height = impl->height; + *height = window->height; } static gint @@ -966,7 +990,7 @@ static gboolean gdk_mir_window_impl_begin_paint_region (GdkWindow *window, const cairo_region_t *region) { - g_printerr ("gdk_mir_window_impl_begin_paint_region\n"); + //g_printerr ("gdk_mir_window_impl_begin_paint_region\n"); /* Indicate we are ready to be drawn onto directly? */ return FALSE; } @@ -974,8 +998,11 @@ gdk_mir_window_impl_begin_paint_region (GdkWindow *window, static void gdk_mir_window_impl_end_paint (GdkWindow *window) { - g_printerr ("gdk_mir_window_impl_end_paint\n"); - send_buffer (window); + GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); + + //g_printerr ("gdk_mir_window_impl_end_paint\n"); + if (impl->visible) + send_buffer (window); } static cairo_region_t * @@ -1022,7 +1049,8 @@ static gboolean gdk_mir_window_impl_queue_antiexpose (GdkWindow *window, cairo_region_t *area) { - g_printerr ("gdk_mir_window_impl_queue_antiexpose\n"); + //g_printerr ("gdk_mir_window_impl_queue_antiexpose\n"); + // FIXME: ? return FALSE; } @@ -1031,7 +1059,11 @@ gdk_mir_window_impl_destroy (GdkWindow *window, gboolean recursing, gboolean foreign_destroy) { - g_printerr ("gdk_mir_window_impl_destroy\n"); + //g_printerr ("gdk_mir_window_impl_destroy\n"); + GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); + + impl->visible = FALSE; + ensure_no_surface (window); } static void @@ -1061,7 +1093,8 @@ static void gdk_mir_window_impl_set_type_hint (GdkWindow *window, GdkWindowTypeHint hint) { - g_printerr ("gdk_mir_window_impl_set_type_hint\n"); + //g_printerr ("gdk_mir_window_impl_set_type_hint\n"); + // FIXME: ? } static GdkWindowTypeHint @@ -1134,7 +1167,8 @@ static void gdk_mir_window_impl_set_transient_for (GdkWindow *window, GdkWindow *parent) { - g_printerr ("gdk_mir_window_impl_set_transient_for\n"); + //g_printerr ("gdk_mir_window_impl_set_transient_for\n"); + //FIXME } static void @@ -1381,15 +1415,14 @@ static void gdk_mir_window_impl_process_updates_recurse (GdkWindow *window, cairo_region_t *region) { - g_printerr ("gdk_mir_window_impl_process_updates_recurse\n"); - GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); + //g_printerr ("gdk_mir_window_impl_process_updates_recurse\n"); cairo_rectangle_int_t rectangle; /* We redraw the whole region, but we should track the buffers and only redraw what has changed since we sent this buffer */ rectangle.x = 0; rectangle.y = 0; - rectangle.width = impl->width; - rectangle.height = impl->height; + rectangle.width = window->width; + rectangle.height = window->height; cairo_region_union_rectangle (region, &rectangle); _gdk_window_process_updates_recurse (window, region); @@ -1458,7 +1491,7 @@ static void gdk_mir_window_impl_delete_property (GdkWindow *window, GdkAtom property) { - g_printerr ("gdk_mir_window_impl_delete_property\n"); + //g_printerr ("gdk_mir_window_impl_delete_property\n"); } static gint |