tags:

views:

314

answers:

3

Trying to get Height and Width of GtkEventBox.
Tried following Things.

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); // Again getting 0
--------------------------------------------------------------------------

It is really bad that Gtk has not provided simple function that will give you the actual displayed height and with of the widget.

Anyone tried to get height and with of GtkWidget?

+2  A: 

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.

unwind
I am doing `gtk_widget_show` before calling these function. but i thing at that time it is not actually drawn on screen (as there parent has not been shown) but i need these parameters before it get's drawn on screen as i need to pass these values to some other process. so how do i get it?
PP
@PP: I don't think you can know, before the actual layout happens. Perhaps you can change your design so the other process can receive the coordinates once they are known?
unwind
+1  A: 

Use gtk_widget_size_request(), not gtk_widget_get_size_request().

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

el.pescado
`getting a size request requires the widget to be associated with a screen` I want to get the size of the widget before it displayed on screen.
PP
It does not have to be displayed, just associated with screen - to know what fonts to use etc.
el.pescado
Thanks, it does worked `gtk_widget_size_request()` Thank you very much.
PP
`gtk_widget_size_request()` returns the size the widget would like to have, which very well could differ from the size it got. See my answer
joveha
+3  A: 

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);

joveha