2011/10/25 Denis Linvinus <linvi...@gmail.com> > > > 2011/10/24 Denis Linvinus <linvi...@gmail.com> > >> >> >> 2011/10/24 Tristan Van Berkom <t...@gnome.org> >> >>> On Sun, Oct 23, 2011 at 4:38 PM, Denis Linvinus <linvi...@gmail.com> >>> wrote: >>> > >>> > >>> > 2011/10/19 Tristan Van Berkom <t...@gnome.org> >>> >> >>> >> Note I spent a lot of time writing something like this last year. >>> >> >>> >> I would like to eventually port it into GTK+ as the internal >>> >> implementation >>> >> of the GtkToolPalette. >>> >> >>> >> See: >>> >> http://git.gnome.org/browse/libegg/tree/libegg/wrapbox >>> > >>> > Thanks for answer! >>> > But in your example same problem! >>> > If you pack wrapbox directly in to frame (without scrolled_window) >>> > then, you can not change the height of the window to smaller than it >>> was at >>> > the start. >>> >>> Ah, I get what you are saying. >>> >>> This is a limitation that cannot be avoided because GTK+ already >>> mandates that every widget in an interface receives a size allocation >>> of at least it's minimum size request. >>> >> >> yes, it is the main problem, but take a look on my videos >> >> This is my HVBox on gtk3.0 >> http://www.youtube.com/watch?v=sMB0qhuPMXc >> >> And this is same program but on Gtk3.2 >> http://www.youtube.com/watch?v=artJWLhlpms >> > > > added yet another video http://www.youtube.com/watch?v=t7DioFe7FBk > > >> >> Main different in logs, is that, while resizing on Gtk3.0, it always >> recalculate size >> get_preferred_width minimum=86 natural=2150 >> get_preferred_height minimum=28 natural=28 >> get_preferred_height_for_width=86 != 597 minimum=140 natural=140 >> get_preferred_height_for_width=597 != 597 minimum=140 natural=140 >> get_preferred_height_for_width=597 != 597 minimum=140 natural=140 >> orig size_allocate x=5 y=59 w=597 h=140 >> orig2 size_allocate x=5 y=59 w=597 h=140 >> get_preferred_height minimum=28 natural=28 >> get_preferred_height_for_width=86 != 597 minimum=140 natural=140 >> get_preferred_height minimum=28 natural=28 >> get_preferred_height_for_width=86 != 597 minimum=140 natural=140 >> get_preferred_height_for_width=597 != 597 minimum=140 natural=140 >> get_preferred_height_for_width=597 != 597 minimum=140 natural=140 >> get_preferred_height minimum=28 natural=28 >> get_preferred_height_for_width=86 != 597 minimum=140 natural=140 >> >> on gtk3.2 it recalculate size only if size increases, if i reduce size >> then i see only >> orig size_allocate x=5 y=111 w=1247 h=28 >> orig2 size_allocate x=5 y=111 w=1247 h=28 >> orig size_allocate x=5 y=55 w=1247 h=28 >> orig2 size_allocate x=5 y=55 w=1247 h=28 >> orig size_allocate x=5 y=55 w=623 h=28 >> orig2 size_allocate x=5 y=55 w=623 h=84 >> orig size_allocate x=5 y=55 w=623 h=28 >> orig2 size_allocate x=5 y=55 w=623 h=84 >> orig size_allocate x=5 y=55 w=456 h=28 >> orig2 size_allocate x=5 y=55 w=456 h=84 >> orig size_allocate x=5 y=55 w=456 h=28 >> orig2 size_allocate x=5 y=55 w=456 h=84 >> (called only size_allocate) >> >> until i move mouse inside my box (at the end of video), only after that >> widget recalculate size. >> >> But i can't understand how to force size calculation manually (like i move >> mouse inside). >> gtk_widget_set_size_request() - don't helps. >> > Ok, i have found solution,i call this.set_size_request (1,1); this.set_property("width-request",2); this.set_property("height-request",2); this.get_requisition(); Pwindow.set_size_request (1,1); Pwindow.set_property("width-request",2); Pwindow.set_property("height-request",2); Pwindow.get_requisition();
in function size_allocate. It makes no use of caching sizes on container and window, so it works absolutely the same as on Gtk3.0 Problem resolved. > >> >>> >>> When you add height-for-width to this equation, then: >>> >>> o For a "height-for-width" interface, the screen will always >>> be tall enough to hold all the content at the smallest width. >>> >>> o For a "width-for-height" interface the opposite is true, the >>> window must always stay wide enough to fit all of the content >>> at the smallest possible height. >>> >>> This deserves an explanation, so lets consider wrapping text instead >>> of the wrapbox (in practice it is the same thing though)... >>> >>> If you have a window with a wrapping text label, and the label is >>> allowed to wrap down to the smallest word... then the window >>> will need to be tall enough to fit the text in the case that it is >>> wrapped down to the smallest word, even if at display time the >>> default width is larger. >>> >>> >>> So you have 2 main ways of dealing with this: >>> >>> o Once, by setting a reasonable width on the toplevel >>> >>> Define a very small minimum width for the screen widgets >>> which are height-for-width (possibly that is default for >>> some widgets, like yours I think). Then, before showing >>> your interface set a hard limit on the toplevel GtkWindow's >>> minimum width. (using gtk_widget_set_size_request()). >>> >>> This will cause your overall window to be "shorter" >>> in height proportionally to the hard limit of width which >>> you set on the interface (If you assign a larger minimum width >>> to a window, it will receive a smaller dynamically resolved >>> minimum height). >>> >>> o Per component, by setting reasonable minimum widths >>> for any height-for-width content providing widgets in your interface. >>> >>> For instance in the above label example, if you set the >>> label's "width-chars" property then the label will always >>> request at least "width-chars" for the width of it's label. >>> >>> >>> >> Thanks for explanation, i think the same way. >> >> >>> Cheers, >>> -Tristan >>> >>> > >>> > look at screenshots >>> > this is window after start >>> > http://imageshack.us/photo/my-images/847/testwrapbox1.png/ >>> > and this is >>> > http://imageshack.us/photo/my-images/696/testwrapbox.png/ >>> > after changing the width of the window, it should allow to reduce its >>> > height, because there are many free space, but it does not. >>> > >>> > With GTK3.0 i use little trick for that, >>> > i store maximum allowed width in private variable, and in function >>> > get_preferred_height_for_width >>> > i always calculate height not for minimum width but for stored width. >>> > >>> > There is how it looks like >>> > public override void get_preferred_height_for_width (int width,out >>> int >>> > minimum_height, out int natural_height) { >>> > >>> > /*workaround for min_height, if actual available width more >>> than >>> > self minimum width*/ >>> > if( this.minimum_width!=width || >>> > !(this.minimum_width==width && this.natural_width >= width) ){ >>> > this.natural_width=width; >>> > } >>> > >>> > this._get_preferred_height_for_width(this.natural_width,out >>> > minimum_height, out natural_height); >>> > this.natural_height = natural_height; >>> > } >>> > >>> > where this.natural_width is stored maximum width. >>> > Because get_preferred_height_for_width called several times , first >>> time for >>> > minimum width, others for allocated width, >>> > and because while i resizing window, gtk always recalculate size , in >>> gtk3.0 >>> > my window always have actual size. >>> > >>> > >>> > As i'm understand, problem appears because of the following changes in >>> > gtkcontainer.c in GTK3.2 >>> > >>> > +typedef struct { >>> > + gint hfw; >>> > + gint wfh; >>> > +} RequestModeCount; >>> > + >>> > +static void >>> > +count_request_modes (GtkWidget *widget, >>> > + RequestModeCount *count) >>> > +{ >>> > + GtkSizeRequestMode mode = gtk_widget_get_request_mode (widget); >>> > + >>> > + switch (mode) >>> > + { >>> > + case GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH: >>> > + count->hfw++; >>> > + break; >>> > + case GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT: >>> > + count->wfh++; >>> > + break; >>> > + case GTK_SIZE_REQUEST_CONSTANT_SIZE: >>> > + default: >>> > + break; >>> > + } >>> > +} >>> > + >>> > +static GtkSizeRequestMode >>> > +gtk_container_get_request_mode (GtkWidget *widget) >>> > +{ >>> > + GtkContainer *container = GTK_CONTAINER (widget); >>> > + GtkContainerPrivate *priv = container->priv; >>> > + >>> > + /* Recalculate the request mode of the children by majority >>> > + * vote whenever the internal content changes */ >>> > + if (_gtk_widget_get_width_request_needed (widget) || >>> > + _gtk_widget_get_height_request_needed (widget)) >>> > + { >>> > + RequestModeCount count = { 0, 0 }; >>> > + >>> > + gtk_container_forall (container, >>> (GtkCallback)count_request_modes, >>> > &count); >>> > + >>> > + if (!count.hfw && !count.wfh) >>> > + priv->request_mode = GTK_SIZE_REQUEST_CONSTANT_SIZE; >>> > + else >>> > + priv->request_mode = count.wfh > count.hfw ? >>> > + GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT : >>> > + GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH; >>> > + } >>> > + >>> > + return priv->request_mode; >>> > +} >>> > + >>> > >>> > so, container will recalculate it size only if >>> > if (_gtk_widget_get_width_request_needed (widget) || >>> > _gtk_widget_get_height_request_needed (widget)) >>> > >>> > because of that, my trick don't working with GTK 3.2, >>> > so, my question is, how to force the container/window to recalculate >>> its >>> > size in gtk 3.2 ? >>> > >>> > i try to use set_size_request and queue_resize (for container and for >>> > window), >>> > but this functions don't help. >>> > >>> > I hope I have clearly described their thoughts. >>> > >>> > >>> >> >>> >> Cheers, >>> >> -Tristan >>> >> >>> >> On Wed, Oct 19, 2011 at 3:09 PM, Denis Linvinus <linvi...@gmail.com> >>> >> wrote: >>> >> > Hi all, >>> >> > i'm writing new GtkContainer which allocate children, firstly >>> >> > horizontally, >>> >> > then vertically. - HVBox. >>> >> > >>> >> > On gtk 3.0 it works without problems (with little trick), but with >>> gtk >>> >> > 3.2. >>> >> > window don't change height when container change, until i move mouse >>> >> > above >>> >> > my container. >>> >> > >>> >> > My idea is that my container should use minimum space as possible, >>> but >>> >> > enough to show all children. >>> >> > If available width not enough for children then container should >>> >> > increase >>> >> > height for second line, and so on. >>> >> > Something like multiline tabs in firefox. (children is a buttons) >>> >> > >>> >> > There is my sources http://pastebin.com/8qugyfqk (i use valac --pkg >>> >> > gtk+-3.0 >>> >> > -C ./main.vala to compile) >>> >> > >>> >> > image with explanation of the problem >>> >> > http://imageshack.us/photo/my-images/508/resulte.png/ >>> >> > there is two control buttons (add, remove) in one VBox, all other >>> >> > buttons >>> >> > in my HVBox container. >>> >> > As you can see at last screenshot, i lost two buttons after resize >>> >> > window on >>> >> > Gtk3.2, if i move mouse on buttons again then window will change it >>> >> > height , >>> >> > so that the lost buttons will be visible. >>> >> > >>> >> > I'm check, problem is not in vala, i use generated *.c from ubuntu >>> 11.10 >>> >> > to >>> >> > compile on Ubuntu 11.04 without modifications, and it also works >>> >> > correctly. >>> >> > >>> >> > May be someone know how to force window to recalculate size? >>> >> > Or some other method to resolve my problem? >>> >> > >>> >> > My system ubuntu 11.10 >>> >> > libgtk-3-0 3.2.0-0ubuntu3 >>> >> > >>> >> > Ubuntu 11.04 for Gtk 3.0 >>> >> > libgtk-3-0 3.0.8-0ubuntu1 >>> >> > >>> >> > I will appreciate for any help. >>> >> > p.s. sorry for my English. >>> >> > >>> >> > >>> >> > _______________________________________________ >>> >> > gtk-list mailing list >>> >> > gtk-list@gnome.org >>> >> > http://mail.gnome.org/mailman/listinfo/gtk-list >>> >> > >>> >> > >>> > >>> > >>> >> >> >
_______________________________________________ gtk-list mailing list gtk-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-list