height: Adjust based on layer surface width
This commit is contained in:
		@ -42,6 +42,7 @@ struct _ServerContextService {
 | 
			
		||||
    GtkWidget *window;
 | 
			
		||||
    GtkWidget *widget;
 | 
			
		||||
    guint hiding;
 | 
			
		||||
    guint last_requested_height;
 | 
			
		||||
 | 
			
		||||
    gdouble size_constraint_landscape[2];
 | 
			
		||||
    gdouble size_constraint_portrait[2];
 | 
			
		||||
@ -110,9 +111,48 @@ static void
 | 
			
		||||
on_notify_unmap (GObject    *object,
 | 
			
		||||
                 ServerContextService *context)
 | 
			
		||||
{
 | 
			
		||||
    (void)object;
 | 
			
		||||
    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
 | 
			
		||||
make_window (ServerContextService *context)
 | 
			
		||||
{
 | 
			
		||||
@ -121,12 +161,7 @@ make_window (ServerContextService *context)
 | 
			
		||||
 | 
			
		||||
    struct wl_output *output = squeek_outputs_get_current(squeek_wayland->outputs);
 | 
			
		||||
    int32_t width = squeek_outputs_get_perceptual_width(squeek_wayland->outputs, output);
 | 
			
		||||
    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
 | 
			
		||||
    }
 | 
			
		||||
    uint32_t height = calculate_height(width);
 | 
			
		||||
 | 
			
		||||
    context->window = g_object_new (
 | 
			
		||||
        PHOSH_TYPE_LAYER_SURFACE,
 | 
			
		||||
@ -147,6 +182,7 @@ make_window (ServerContextService *context)
 | 
			
		||||
                      "signal::destroy", G_CALLBACK(on_destroy), context,
 | 
			
		||||
                      "signal::map", G_CALLBACK(on_notify_map), context,
 | 
			
		||||
                      "signal::unmap", G_CALLBACK(on_notify_unmap), context,
 | 
			
		||||
                      "signal::configured", G_CALLBACK(on_surface_configure), context,
 | 
			
		||||
                      NULL);
 | 
			
		||||
 | 
			
		||||
    // The properties below are just to make hacking easier.
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user