mir: use mir_surface_spec_set_placement for menus
This API was added to Mir for GTK menus, combo boxes, etc.
This commit is contained in:
@@ -80,10 +80,15 @@ struct _GdkMirWindowImpl
|
||||
gint transient_x;
|
||||
gint transient_y;
|
||||
|
||||
/* Anchor rectangle */
|
||||
gboolean has_rect;
|
||||
MirRectangle rect;
|
||||
MirEdgeAttachment edge;
|
||||
/* gdk_window_move_to_rect */
|
||||
gboolean has_rect;
|
||||
GdkRectangle rect;
|
||||
MirRectangle mir_rect;
|
||||
MirPlacementGravity rect_anchor;
|
||||
MirPlacementGravity window_anchor;
|
||||
MirPlacementHints anchor_hints;
|
||||
gint rect_anchor_dx;
|
||||
gint rect_anchor_dy;
|
||||
|
||||
/* Desired surface attributes */
|
||||
GdkWindowTypeHint type_hint;
|
||||
@@ -299,16 +304,12 @@ create_window_type_spec (GdkDisplay *display,
|
||||
gint height,
|
||||
gboolean modal,
|
||||
GdkWindowTypeHint type,
|
||||
const MirRectangle *rect,
|
||||
MirEdgeAttachment edge,
|
||||
MirBufferUsage buffer_usage)
|
||||
{
|
||||
MirPixelFormat format;
|
||||
MirSurface *parent_surface = NULL;
|
||||
MirConnection *connection = gdk_mir_display_get_mir_connection (display);
|
||||
MirRectangle real_rect;
|
||||
|
||||
format = _gdk_mir_display_get_pixel_format (display, buffer_usage);
|
||||
MirSurface *parent_surface = NULL;
|
||||
MirPixelFormat format;
|
||||
MirRectangle rect;
|
||||
|
||||
if (parent && parent->impl)
|
||||
{
|
||||
@@ -329,24 +330,12 @@ create_window_type_spec (GdkDisplay *display,
|
||||
}
|
||||
}
|
||||
|
||||
if (rect)
|
||||
{
|
||||
real_rect = *rect;
|
||||
format = _gdk_mir_display_get_pixel_format (display, buffer_usage);
|
||||
|
||||
while (parent && !gdk_window_has_native (parent) && gdk_window_get_parent (parent))
|
||||
{
|
||||
real_rect.left += parent->x;
|
||||
real_rect.top += parent->y;
|
||||
parent = gdk_window_get_parent (parent);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
real_rect.left = x;
|
||||
real_rect.top = y;
|
||||
real_rect.width = 1;
|
||||
real_rect.height = 1;
|
||||
}
|
||||
rect.left = x;
|
||||
rect.top = y;
|
||||
rect.width = 1;
|
||||
rect.height = 1;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
@@ -380,9 +369,8 @@ create_window_type_spec (GdkDisplay *display,
|
||||
height,
|
||||
format,
|
||||
parent_surface,
|
||||
&real_rect,
|
||||
edge);
|
||||
break;
|
||||
&rect,
|
||||
0);
|
||||
case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
|
||||
case GDK_WINDOW_TYPE_HINT_UTILITY:
|
||||
return mir_connection_create_spec_for_modal_dialog (connection,
|
||||
@@ -429,15 +417,16 @@ static MirSurfaceSpec*
|
||||
create_spec (GdkWindow *window, GdkMirWindowImpl *impl)
|
||||
{
|
||||
MirSurfaceSpec *spec = NULL;
|
||||
GdkWindow *parent;
|
||||
|
||||
spec = create_window_type_spec (impl->display,
|
||||
impl->transient_for,
|
||||
impl->transient_x, impl->transient_y,
|
||||
window->width, window->height,
|
||||
impl->transient_x,
|
||||
impl->transient_y,
|
||||
window->width,
|
||||
window->height,
|
||||
impl->modal,
|
||||
impl->type_hint,
|
||||
impl->has_rect ? &impl->rect : NULL,
|
||||
impl->has_rect ? impl->edge : mir_edge_attachment_any,
|
||||
impl->buffer_usage);
|
||||
|
||||
mir_surface_spec_set_name (spec, impl->title);
|
||||
@@ -445,6 +434,32 @@ create_spec (GdkWindow *window, GdkMirWindowImpl *impl)
|
||||
|
||||
apply_geometry_hints (spec, impl);
|
||||
|
||||
if (impl->has_rect)
|
||||
{
|
||||
impl->mir_rect.left = impl->rect.x;
|
||||
impl->mir_rect.top = impl->rect.y;
|
||||
impl->mir_rect.width = impl->rect.width;
|
||||
impl->mir_rect.height = impl->rect.height;
|
||||
|
||||
parent = impl->transient_for;
|
||||
|
||||
while (parent && !gdk_window_has_native (parent))
|
||||
{
|
||||
impl->mir_rect.left += parent->x;
|
||||
impl->mir_rect.top += parent->y;
|
||||
|
||||
parent = gdk_window_get_parent (parent);
|
||||
}
|
||||
|
||||
mir_surface_spec_set_placement (spec,
|
||||
&impl->mir_rect,
|
||||
impl->rect_anchor,
|
||||
impl->window_anchor,
|
||||
impl->anchor_hints,
|
||||
impl->rect_anchor_dx,
|
||||
impl->rect_anchor_dy);
|
||||
}
|
||||
|
||||
return spec;
|
||||
}
|
||||
|
||||
@@ -832,52 +847,117 @@ gdk_mir_window_impl_move_resize (GdkWindow *window,
|
||||
}
|
||||
}
|
||||
|
||||
static MirEdgeAttachment
|
||||
get_edge_for_anchors (GdkGravity rect_anchor,
|
||||
GdkGravity window_anchor,
|
||||
GdkAnchorHints anchor_hints)
|
||||
static MirPlacementGravity
|
||||
get_mir_placement_gravity (GdkGravity gravity)
|
||||
{
|
||||
MirEdgeAttachment edge = 0;
|
||||
switch (gravity)
|
||||
{
|
||||
case GDK_GRAVITY_STATIC:
|
||||
case GDK_GRAVITY_NORTH_WEST:
|
||||
return mir_placement_gravity_northwest;
|
||||
case GDK_GRAVITY_NORTH:
|
||||
return mir_placement_gravity_north;
|
||||
case GDK_GRAVITY_NORTH_EAST:
|
||||
return mir_placement_gravity_northeast;
|
||||
case GDK_GRAVITY_WEST:
|
||||
return mir_placement_gravity_west;
|
||||
case GDK_GRAVITY_CENTER:
|
||||
return mir_placement_gravity_center;
|
||||
case GDK_GRAVITY_EAST:
|
||||
return mir_placement_gravity_east;
|
||||
case GDK_GRAVITY_SOUTH_WEST:
|
||||
return mir_placement_gravity_southwest;
|
||||
case GDK_GRAVITY_SOUTH:
|
||||
return mir_placement_gravity_south;
|
||||
case GDK_GRAVITY_SOUTH_EAST:
|
||||
return mir_placement_gravity_southeast;
|
||||
}
|
||||
|
||||
if (anchor_hints & GDK_ANCHOR_FLIP_X)
|
||||
edge |= mir_edge_attachment_vertical;
|
||||
g_warn_if_reached ();
|
||||
|
||||
if (anchor_hints & GDK_ANCHOR_FLIP_Y)
|
||||
edge |= mir_edge_attachment_horizontal;
|
||||
|
||||
return edge;
|
||||
return mir_placement_gravity_center;
|
||||
}
|
||||
|
||||
static void
|
||||
get_rect_for_edge (MirRectangle *out_rect,
|
||||
const GdkRectangle *in_rect,
|
||||
MirEdgeAttachment edge,
|
||||
GdkWindow *window)
|
||||
static MirPlacementHints
|
||||
get_mir_placement_hints (GdkAnchorHints hints)
|
||||
{
|
||||
out_rect->left = in_rect->x;
|
||||
out_rect->top = in_rect->y;
|
||||
out_rect->width = in_rect->width;
|
||||
out_rect->height = in_rect->height;
|
||||
MirPlacementHints mir_hints = 0;
|
||||
|
||||
switch (edge)
|
||||
if (hints & GDK_ANCHOR_FLIP_X)
|
||||
mir_hints |= mir_placement_hints_flip_x;
|
||||
|
||||
if (hints & GDK_ANCHOR_FLIP_Y)
|
||||
mir_hints |= mir_placement_hints_flip_y;
|
||||
|
||||
if (hints & GDK_ANCHOR_SLIDE_X)
|
||||
mir_hints |= mir_placement_hints_slide_x;
|
||||
|
||||
if (hints & GDK_ANCHOR_SLIDE_Y)
|
||||
mir_hints |= mir_placement_hints_slide_y;
|
||||
|
||||
if (hints & GDK_ANCHOR_RESIZE_X)
|
||||
mir_hints |= mir_placement_hints_resize_x;
|
||||
|
||||
if (hints & GDK_ANCHOR_RESIZE_Y)
|
||||
mir_hints |= mir_placement_hints_resize_y;
|
||||
|
||||
return mir_hints;
|
||||
}
|
||||
|
||||
static gint
|
||||
get_window_shadow_dx (GdkWindow *window,
|
||||
GdkGravity window_anchor)
|
||||
{
|
||||
switch (window_anchor)
|
||||
{
|
||||
case mir_edge_attachment_vertical:
|
||||
out_rect->left += window->shadow_right;
|
||||
out_rect->top -= window->shadow_top;
|
||||
out_rect->width -= window->shadow_left + window->shadow_right;
|
||||
out_rect->height += window->shadow_top + window->shadow_bottom;
|
||||
break;
|
||||
case GDK_GRAVITY_STATIC:
|
||||
case GDK_GRAVITY_NORTH_WEST:
|
||||
case GDK_GRAVITY_WEST:
|
||||
case GDK_GRAVITY_SOUTH_WEST:
|
||||
return -window->shadow_left;
|
||||
|
||||
case mir_edge_attachment_horizontal:
|
||||
out_rect->left -= window->shadow_left;
|
||||
out_rect->top += window->shadow_bottom;
|
||||
out_rect->width += window->shadow_left + window->shadow_right;
|
||||
out_rect->height -= window->shadow_top + window->shadow_bottom;
|
||||
break;
|
||||
case GDK_GRAVITY_NORTH:
|
||||
case GDK_GRAVITY_CENTER:
|
||||
case GDK_GRAVITY_SOUTH:
|
||||
return (window->shadow_right - window->shadow_left) / 2;
|
||||
|
||||
default:
|
||||
break;
|
||||
case GDK_GRAVITY_NORTH_EAST:
|
||||
case GDK_GRAVITY_EAST:
|
||||
case GDK_GRAVITY_SOUTH_EAST:
|
||||
return window->shadow_right;
|
||||
}
|
||||
|
||||
g_warn_if_reached ();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static gint
|
||||
get_window_shadow_dy (GdkWindow *window,
|
||||
GdkGravity window_anchor)
|
||||
{
|
||||
switch (window_anchor)
|
||||
{
|
||||
case GDK_GRAVITY_STATIC:
|
||||
case GDK_GRAVITY_NORTH_WEST:
|
||||
case GDK_GRAVITY_NORTH:
|
||||
case GDK_GRAVITY_NORTH_EAST:
|
||||
return -window->shadow_top;
|
||||
|
||||
case GDK_GRAVITY_WEST:
|
||||
case GDK_GRAVITY_CENTER:
|
||||
case GDK_GRAVITY_EAST:
|
||||
return (window->shadow_bottom - window->shadow_top) / 2;
|
||||
|
||||
case GDK_GRAVITY_SOUTH_WEST:
|
||||
case GDK_GRAVITY_SOUTH:
|
||||
case GDK_GRAVITY_SOUTH_EAST:
|
||||
return window->shadow_bottom;
|
||||
}
|
||||
|
||||
g_warn_if_reached ();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -891,18 +971,16 @@ gdk_mir_window_impl_move_to_rect (GdkWindow *window,
|
||||
{
|
||||
GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl);
|
||||
|
||||
impl->edge = get_edge_for_anchors (rect_anchor, window_anchor, anchor_hints);
|
||||
get_rect_for_edge (&impl->rect, rect, impl->edge, window);
|
||||
impl->has_rect = TRUE;
|
||||
impl->rect = *rect;
|
||||
impl->rect_anchor = get_mir_placement_gravity (rect_anchor);
|
||||
impl->window_anchor = get_mir_placement_gravity (window_anchor);
|
||||
impl->anchor_hints = get_mir_placement_hints (anchor_hints);
|
||||
impl->rect_anchor_dx = rect_anchor_dx + get_window_shadow_dx (window, window_anchor);
|
||||
impl->rect_anchor_dy = rect_anchor_dy + get_window_shadow_dy (window, window_anchor);
|
||||
|
||||
ensure_no_surface (window);
|
||||
|
||||
g_signal_emit_by_name (window,
|
||||
"moved-to-rect",
|
||||
NULL,
|
||||
NULL,
|
||||
FALSE,
|
||||
FALSE);
|
||||
if (impl->surface && !impl->pending_spec_update)
|
||||
update_surface_spec (window);
|
||||
}
|
||||
|
||||
static GdkEventMask
|
||||
|
||||
Reference in New Issue
Block a user