User7723337
User7723337

Reputation: 12018

Getting the actual displayed height and width of a Gtk widget

To get the height and width of a GtkEventBox, I tried the following:

GtkRequisition requisition;
gtk_widget_get_child_requisition(widget, &requisition);
// Getting requisition.height 0

widget->allocation-x   //getting 0
widget->allocation-height   //getting -1

gtk_widget_get_size_request( widget, &height, &width); //getting 0

What function will give you the actual displayed height and width of the widget?

Upvotes: 26

Views: 29611

Answers (4)

zebediah49
zebediah49

Reputation: 7611

If you are using GTK3, and the widget has been realized you can ask for what it has been allocated. This has the advantage of being the space that it really has as opposed to what it requested.

    //GtkWidget* widget;
    GtkAllocation* alloc = g_new(GtkAllocation, 1);
    gtk_widget_get_allocation(widget, alloc);
    printf("widget size is currently %dx%d\n",alloc->width, alloc->height);
    g_free(alloc);

Upvotes: 10

joveha
joveha

Reputation: 2689

Once your widget have been realized (given a size depending on what it's parent container can give it) you should be able to get these values with widget->allocation.width and widget->allocation.height.

There's nothing wrong in the way gtk does this. There's a difference between what size a widget would like to have and what size it actually gets. So the timing on reading these values is important. Having 'get' methods for these variables wont change the fact that they are not initialized yet.

The usual way people go around this is to tap into the size-allocate signal that is emitted when the widget got a new actual size. Something like this:

void my_getsize(GtkWidget *widget, GtkAllocation *allocation, void *data) {
    printf("width = %d, height = %d\n", allocation->width, allocation->height);
}

And in your main loop somewhere, connect the signal:

g_signal_connect(mywidget, "size-allocate", G_CALLBACK(my_getsize), NULL);

Upvotes: 35

Use gtk_widget_size_request(), not gtk_widget_get_size_request().

http://library.gnome.org/devel/gtk/stable/GtkWidget.html#gtk-widget-size-request

Upvotes: 5

unwind
unwind

Reputation: 399949

Are you sure that your widget has been both shown and realized/mapped? You can't get the size until the widget has been laid out "for real".

Try listening to the map-event signal.

Upvotes: 4

Related Questions