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

Reply via email to