Upaya pengubahan ukuran GTK3 memperbesar jendela secara eksponensial

Saya memiliki program C GTK3 yang memiliki notebook dengan dua gambar. Saya ingin dapat mengambil sudut jendela dan menyesuaikan ukuran gambar yang sedang ditampilkan. Apa yang saya miliki saat ini adalah sebuah program yang setelah dimulai, jendelanya terus membesar sampai saya mematikannya dari terminal menggunakan ctrl-c. Saya melakukan panggilan tidur di panggilan balik untuk memperlambatnya, tetapi panggilan itu masih terus bertambah. Bagaimana cara menghentikan pertumbuhan jendela kecuali saya "mengambil" sudut jendela dan menyesuaikannya sendiri?

#include <stdio.h>
#include <gtk/gtk.h>
#include <gdk-pixbuf/gdk-pixbuf.h>

GtkWidget *notebook;

gboolean resize_image(GtkWidget *widget, GdkRectangle *allocation,
    gpointer user_data)
{
    int w,h, pagenum;
    GdkPixbuf *pxbscaled;
    GtkWidget *image;
    GdkPixbuf *pixbuf;

    pagenum = gtk_notebook_get_current_page (GTK_NOTEBOOK(notebook));
    image = gtk_notebook_get_nth_page (GTK_NOTEBOOK(notebook), pagenum);
//  GtkImageType image_type = gtk_image_get_storage_type
//      (GTK_IMAGE(image));

    pixbuf = gtk_image_get_pixbuf(GTK_IMAGE(image));

    h = allocation->height;
    w = (gdk_pixbuf_get_width(pixbuf) * h) / gdk_pixbuf_get_height(pixbuf);

    pxbscaled = gdk_pixbuf_scale_simple(pixbuf, w, h, GDK_INTERP_BILINEAR);

    printf("Allocation height %d width %d.\n", h, w);

    gtk_image_set_from_pixbuf(GTK_IMAGE(image), pxbscaled);

    g_object_unref (pxbscaled);

    sleep(2);

    return FALSE;
}

static gboolean delete( GtkWidget *widget,
            GtkWidget *event,
            gpointer   data )
{
    gtk_main_quit ();
    return FALSE;
}

int main( int argc,
      char *argv[] )
{
    GtkWidget *window;
    GtkWidget *button;
    GtkWidget *table;
    GtkWidget *label;
    GtkWidget *image;
    int i;
    char bufferl[32];

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
//  gtk_widget_set_size_request (GTK_WIDGET(window), 800, 480);

    g_signal_connect (window, "delete-event",
              G_CALLBACK (delete), NULL);

    gtk_container_set_border_width (GTK_CONTAINER (window), 10);

    table = gtk_grid_new ();
    gtk_container_add (GTK_CONTAINER (window), table);

    /* Create notebook, place position of tabs */
    notebook = gtk_notebook_new ();
    gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);
    gtk_grid_attach (GTK_GRID (table), notebook, 0, 6, 3, 3);
    gtk_widget_show (notebook);

    /* Append pages to the notebook */
    for (i = 0; i < 2; i++) {
        sprintf(bufferl, "Page %d", i + 1);

        if (i == 0) {
            image = gtk_image_new_from_file("image1.jpg");
        } else {
            image = gtk_image_new_from_file("image2.jpg");
        }

        gtk_widget_set_halign(image, GTK_ALIGN_START);
        gtk_widget_set_valign(image, GTK_ALIGN_START);

        g_signal_connect(window, "size-allocate", 
            G_CALLBACK(resize_image), NULL);

        label = gtk_label_new (bufferl);
        gtk_notebook_append_page (GTK_NOTEBOOK(notebook), 
            image, label);
    }

    /* Create a close button */
    button = gtk_button_new_with_label ("close");
    g_signal_connect (button, "clicked",
                  G_CALLBACK (delete), NULL);

    gtk_grid_attach (GTK_GRID (table), button, 0, 10, 1, 1);

    gtk_widget_show_all (window);

    gtk_main ();

    return 0;
}

Pengguna harus menyediakan image1.jpg dan image2.jpg. Mengedit panggilan tidur akan membuat program mengisi layar dengan sangat cepat.

EDIT: Saya juga menanyakan pertanyaan ini di milis gtk.


person jackson80    schedule 31.07.2018    source sumber


Jawaban (1)


Jendela yang berisi gambar bertambah besar karena saya menerapkan ukuran jendela pada gambar. Oleh karena itu gambar menjadi lebih besar dan membuat jendela menjadi lebih besar. Yang berlanjut dalam perkembangan tanpa akhir, sinyal "alokasikan ukuran" terus-menerus dipanggil. Saya memperbaikinya dengan membatasi tinggi alokasi di panggilan balik, dengan mengalikannya dengan 0,75. Sekarang saya dapat memperluas dan mengontrak jendela dengan mudah dan tidak menjadi lepas kendali. Gambarnya cepat jelek, tapi itu masalah lain.

person jackson80    schedule 02.08.2018