[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#745359: cdebconf-gtk-udeb: fails to extend banner when needed



Package: cdebconf-gtk-udeb
Version: 0.189
Severity: important
Tags: patch pending

rootskel-gtk ships a 800px-wide banner, and that ought to be sufficient
since the default mode is 800x600. Some systems are using a wider
display though (seen with kfreebsd-amd64, or even with amd64 on some
EFI-based systems), which leads to a bad display (centered banner, with
a blank margin on both sides).

One could think of various options, including:
 - ship banner in different sizes;
 - replicate a 1px-wide strip on the left and on the right to fill in
   the blanks;
 - stretch/scale the banner.

I've decided to implement the last option. Before/after screenshots are
attached. Easy to reproduce, replacing vga=788 with vga=791 on the
kernel command line, at the syslinux prompt.

Of course, scaling isn't looking too nice, but I feel it's better than
the current situation. The patch I'm planning to commit is also
attached.

I note this also fixes the label's being unreadable (that happens in
rescue mode for example).

Mraw,
KiBi.
--- a/src/modules/frontend/gtk/fe_data.h
+++ b/src/modules/frontend/gtk/fe_data.h
@@ -66,6 +66,8 @@ struct frontend_data
      */
     int logo_width;
     int logo_height;
+    bool logo_adjusted;
+    GtkWidget * logo_widget;
 
     /** Internal data of the handler of progress commands.
      *
--- a/src/modules/frontend/gtk/ui.c
+++ b/src/modules/frontend/gtk/ui.c
@@ -103,6 +103,30 @@ static gboolean handle_exposed_banner(GtkWidget * widget,
     gchar * message;
     char * text;
 
+    /* There's no way to get the window size before it's realized, so
+     * defer (possibly) adjusting the logo size until the first expose
+     * event.
+     */
+    if (TRUE != fe_data->logo_adjusted) {
+        fprintf(stderr, "Checking the need for logo adjustment.\n");
+
+        /* If logo and window widths differ, scale. */
+        GtkAllocation allocation;
+        gtk_widget_get_allocation(fe_data->window, &allocation);
+        if (fe_data->logo_width != allocation.width) {
+            fprintf(stderr, "Logo needs scaling: width from %d to %d pixels.\n", fe_data->logo_width, allocation.width);
+            GdkPixbuf * scaled_pixbuf = gdk_pixbuf_scale_simple(gtk_image_get_pixbuf(GTK_IMAGE(fe_data->logo_widget)),
+                                                                allocation.width,
+                                                                fe_data->logo_height,
+                                                                GDK_INTERP_BILINEAR);
+            gtk_image_set_from_pixbuf(GTK_IMAGE(fe_data->logo_widget), scaled_pixbuf);
+            fe_data->logo_width = allocation.width;
+        } else {
+            fprintf(stderr, "Logo needs no scaling: width stays at %d pixels.\n", allocation.width);
+        }
+        fe_data->logo_adjusted = TRUE;
+    }
+
     if (NULL != fe->info) {
         text = q_get_description(fe, fe->info);
         message = g_strdup_printf(
@@ -189,6 +213,8 @@ static void create_banner(struct frontend * fe, GtkWidget * container)
     pixbuf = gtk_image_get_pixbuf(GTK_IMAGE(logo));
     fe_data->logo_width = gdk_pixbuf_get_width(pixbuf);
     fe_data->logo_height = gdk_pixbuf_get_height(pixbuf);
+    fe_data->logo_adjusted = FALSE;
+    fe_data->logo_widget = logo;
 
     g_signal_connect_after(G_OBJECT(banner), "expose_event",
                            G_CALLBACK(handle_exposed_banner), fe);

Attachment: before-cropped.png
Description: PNG image

Attachment: after-cropped.png
Description: PNG image


Reply to: