mir: handle resize events
...including the possibility that we don't receive the buffer size that we request.
This commit is contained in:
@@ -627,6 +627,32 @@ handle_surface_event (GdkWindow *window, const MirSurfaceEvent *event)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
generate_configure_event (GdkWindow *window,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
GdkEvent *event;
|
||||
|
||||
event = gdk_event_new (GDK_CONFIGURE);
|
||||
event->configure.send_event = FALSE;
|
||||
event->configure.width = width;
|
||||
event->configure.height = height;
|
||||
|
||||
send_event (window, get_pointer (window), event);
|
||||
}
|
||||
|
||||
static void
|
||||
handle_resize_event (GdkWindow *window,
|
||||
const MirResizeEvent *event)
|
||||
{
|
||||
window->width = event->width;
|
||||
window->height = event->height;
|
||||
_gdk_window_update_size (window);
|
||||
|
||||
generate_configure_event (window, event->width, event->height);
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GdkWindow *window;
|
||||
@@ -654,9 +680,10 @@ gdk_mir_event_source_queue_event (GdkDisplay *display,
|
||||
handle_surface_event (window, &event->surface);
|
||||
break;
|
||||
case mir_event_type_resize:
|
||||
// FIXME: Generate configure event
|
||||
handle_resize_event (window, &event->resize);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
// FIXME?
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -82,6 +82,7 @@ ensure_surface (GdkWindow *window)
|
||||
unsigned int n_formats, i;
|
||||
MirSurfaceParameters parameters;
|
||||
MirEventDelegate event_delegate = { event_cb, NULL };
|
||||
GdkMirWindowReference *window_ref;
|
||||
|
||||
if (impl->surface)
|
||||
return;
|
||||
@@ -89,7 +90,9 @@ ensure_surface (GdkWindow *window)
|
||||
/* no destroy notify -- we must leak for now
|
||||
* https://bugs.launchpad.net/mir/+bug/1324100
|
||||
*/
|
||||
event_delegate.context = _gdk_mir_event_source_get_window_reference (window);
|
||||
window_ref = _gdk_mir_event_source_get_window_reference (window);
|
||||
|
||||
event_delegate.context = window_ref;
|
||||
|
||||
// Should probably calculate this once?
|
||||
// Should prefer certain formats over others
|
||||
@@ -108,6 +111,20 @@ ensure_surface (GdkWindow *window)
|
||||
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);
|
||||
|
||||
MirGraphicsRegion region;
|
||||
MirEvent resize_event;
|
||||
|
||||
mir_surface_get_graphics_region (impl->surface, ®ion);
|
||||
|
||||
/* Send the initial configure with the size the server gave... */
|
||||
resize_event.resize.type = mir_event_type_resize;
|
||||
resize_event.resize.surface_id = 0;
|
||||
resize_event.resize.width = region.width;
|
||||
resize_event.resize.height = region.height;
|
||||
|
||||
_gdk_mir_event_source_queue (window_ref, &resize_event);
|
||||
|
||||
mir_surface_set_event_handler (impl->surface, &event_delegate); // FIXME: Ignore some events until shown
|
||||
set_surface_state (impl, impl->surface_state);
|
||||
}
|
||||
@@ -116,7 +133,6 @@ static void
|
||||
ensure_no_surface (GdkWindow *window)
|
||||
{
|
||||
GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl);
|
||||
GdkMirWindowReference *window_ref;
|
||||
|
||||
if (impl->cairo_surface)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user