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.
>
>>
>
>>
>> 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

Reply via email to