Paul Pogonyshev wrote: > daa84 wrote: >> daa84 ?????: >> > I start to write my widget with FlowLayout functionality (with >>> row-breaking). And find next problem: >>> >>> gtk_widget_size_request function obtains the preferred size of a widget >>> gtk_widget_size_allocate assign a size and position to child widgets >>> >>> When I fill GtkRequisition structure I send my preferred size of a >>> widget (width and height). But in size_allocate function I get new width >>> that smaller then first width value. Than it is need to increase size. >>> How can I do it? Initiate call size_request function another one time or >>> change GtkAllocation values. >>> >>> This is only my thoughts, I don't test this in code for now. > > Initiate new resizing session and be sure to request smaller size next time > (so that you are not allocated this size again.) GTK+ is not really suited > for full-scaled negotiation of size. > > Adjusting allocation values will not achieve anything since the container > (the one which your flow-layout one is in) will not care. > >> I solve this problem using gtk_widget_set_size_request function in >> allocation function. > > This is good as long as the number and size requests of the widgets your > container contains don't change, which is hard to say in advance, especially > the latter part. Less importantly, this will break if theme/font/etc. is > changed in runtime. > > Paul > >
I write next code for size_allocate function and all work fine (window resizing processed normally): width = 0; rows_count = 1; row_height = 1; for (cur = g_list_first (priv->buttons_list); cur != NULL; cur = g_list_next (cur)) { child = GTK_WIDGET (cur->data); if (GTK_WIDGET_VISIBLE (child)) { gtk_widget_size_request (child, &child_req); width += child_req.width; if (width > allocation->width && width != child_req.width) { rows_count++; width = child_req.width; } row_height = MAX (row_height, child_req.height); } } if (priv->rows_count != rows_count || priv->row_height != row_height) { priv->rows_count = rows_count; priv->row_height = row_height; gtk_widget_set_size_request (widget, -1, row_height * rows_count); } width = 0; row = 1; for (cur = g_list_first (priv->buttons_list); cur != NULL; cur = g_list_next (cur)) { child = GTK_WIDGET (cur->data); if (GTK_WIDGET_VISIBLE (child)) { gtk_widget_get_child_requisition (child, &child_req); width += child_req.width; if (width > allocation->width && width != child_req.width) // this need when width is vary small { row++; width = child_req.width; } child_alloc.width = child_req.width; child_alloc.height = row_height; child_alloc.x = allocation->x + width - child_req.width; child_alloc.y = allocation->y + row_height * (row - 1); gtk_widget_size_allocate (child, &child_alloc); } } And no implementation for size_request function. I don't fully understand what gtk_widget_set_size_request doing, I find this solution in gimp sources. Thanks! Sorry for my bad English. -- Andrey Dubravin _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list