height: Adjust based on layer surface width
This commit is contained in:
@ -42,6 +42,7 @@ struct _ServerContextService {
|
|||||||
GtkWidget *window;
|
GtkWidget *window;
|
||||||
GtkWidget *widget;
|
GtkWidget *widget;
|
||||||
guint hiding;
|
guint hiding;
|
||||||
|
guint last_requested_height;
|
||||||
|
|
||||||
gdouble size_constraint_landscape[2];
|
gdouble size_constraint_landscape[2];
|
||||||
gdouble size_constraint_portrait[2];
|
gdouble size_constraint_portrait[2];
|
||||||
@ -110,9 +111,48 @@ static void
|
|||||||
on_notify_unmap (GObject *object,
|
on_notify_unmap (GObject *object,
|
||||||
ServerContextService *context)
|
ServerContextService *context)
|
||||||
{
|
{
|
||||||
|
(void)object;
|
||||||
g_object_set (context, "visible", FALSE, NULL);
|
g_object_set (context, "visible", FALSE, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t
|
||||||
|
calculate_height(int32_t width)
|
||||||
|
{
|
||||||
|
uint32_t height = 180;
|
||||||
|
if (width < 360 && width > 0) {
|
||||||
|
height = ((unsigned)width * 7 / 12); // to match 360×210
|
||||||
|
} else if (width < 540) {
|
||||||
|
height = 180 + (540 - (unsigned)width) * 30 / 180; // smooth transition
|
||||||
|
}
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_surface_configure(PhoshLayerSurface *surface, ServerContextService *context)
|
||||||
|
{
|
||||||
|
gint width;
|
||||||
|
gint height;
|
||||||
|
g_object_get(G_OBJECT(surface),
|
||||||
|
"width", &width,
|
||||||
|
"height", &height,
|
||||||
|
NULL);
|
||||||
|
guint desired_height = calculate_height(width);
|
||||||
|
guint configured_height = (guint)height;
|
||||||
|
// if height was already requested once but a different one was given
|
||||||
|
// (for the same set of surrounding properties),
|
||||||
|
// then it's probably not reasonable to ask for it again,
|
||||||
|
// as it's likely to create pointless loops
|
||||||
|
// of request->reject->request_again->...
|
||||||
|
if (desired_height != configured_height
|
||||||
|
&& context->last_requested_height != desired_height) {
|
||||||
|
context->last_requested_height = desired_height;
|
||||||
|
phosh_layer_surface_set_size(surface, 0,
|
||||||
|
(gint)desired_height);
|
||||||
|
phosh_layer_surface_set_exclusive_zone(surface, (gint)desired_height);
|
||||||
|
phosh_layer_surface_wl_surface_commit (surface);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
make_window (ServerContextService *context)
|
make_window (ServerContextService *context)
|
||||||
{
|
{
|
||||||
@ -121,12 +161,7 @@ make_window (ServerContextService *context)
|
|||||||
|
|
||||||
struct wl_output *output = squeek_outputs_get_current(squeek_wayland->outputs);
|
struct wl_output *output = squeek_outputs_get_current(squeek_wayland->outputs);
|
||||||
int32_t width = squeek_outputs_get_perceptual_width(squeek_wayland->outputs, output);
|
int32_t width = squeek_outputs_get_perceptual_width(squeek_wayland->outputs, output);
|
||||||
uint32_t height = 180;
|
uint32_t height = calculate_height(width);
|
||||||
if (width < 360 && width > 0) {
|
|
||||||
height = ((unsigned)width * 7 / 12); // to match 360×210
|
|
||||||
} else if (width < 540) {
|
|
||||||
height = 180 + (540 - (unsigned)width) * 30 / 180; // smooth transition
|
|
||||||
}
|
|
||||||
|
|
||||||
context->window = g_object_new (
|
context->window = g_object_new (
|
||||||
PHOSH_TYPE_LAYER_SURFACE,
|
PHOSH_TYPE_LAYER_SURFACE,
|
||||||
@ -147,6 +182,7 @@ make_window (ServerContextService *context)
|
|||||||
"signal::destroy", G_CALLBACK(on_destroy), context,
|
"signal::destroy", G_CALLBACK(on_destroy), context,
|
||||||
"signal::map", G_CALLBACK(on_notify_map), context,
|
"signal::map", G_CALLBACK(on_notify_map), context,
|
||||||
"signal::unmap", G_CALLBACK(on_notify_unmap), context,
|
"signal::unmap", G_CALLBACK(on_notify_unmap), context,
|
||||||
|
"signal::configured", G_CALLBACK(on_surface_configure), context,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
// The properties below are just to make hacking easier.
|
// The properties below are just to make hacking easier.
|
||||||
|
|||||||
Reference in New Issue
Block a user