- From: Andrew Fedoniouk <news@terrainformatica.com>
- Date: Tue, 08 Jan 2008 00:27:25 -0800
- To: robert@ocallahan.org
- CC: Brad Kemper <brkemper@comcast.net>, Rossen Atanassov <ratan@windows.microsoft.com>, fantasai <fantasai.lists@inkedblade.net>, Alex Mogilevsky <alexmog@exchange.microsoft.com>, CSS Style <www-style@w3.org>, Sam Fortiner <samfort@microsoft.com>, Harel Williams <harelw@microsoft.com>, Scott Dickens <sdickens@exchange.microsoft.com>, Boris Zbarsky <bzbarsky@mit.edu>
- Message-ID: <478333ED.2050008@terrainformatica.com>
Robert O'Callahan wrote: > On Jan 8, 2008 8:39 PM, Andrew Fedoniouk <news@terrainformatica.com > <mailto:news@terrainformatica.com>> wrote: > > Height of HTML document by its nature is a function from its width. > height = F( width ) > When this height exceeds height of the view then v-scrollbar appears > that is effectively changes 'width' in the equation above so you have > second dependency: > width = B( height ) > > System of these two equitations is a classical "positive feedback" > condition. Solution of such a system may "hunt" or oscillate at some > input values ( e.g. when intrinsic dimensions of the content is close to > the size of the view). More on this: Nyquist criterion [1] and around. > > > It's not that bad because there are only 4 possible solutions to the > scrollbar problem: show/hide vertical scrollbar x show/hide horizontal > scrollbar. In the worst case you can check each of these solutions to > see which ones are feasible, where "feasible" means that each scrollbar > is showing if and only if it is needed. If multiple solutions are > feasible, then you pick one using whatever heuristic you like. Our > heuristics are basically, in order of priority, > 1) prefer to show no scrollbars > 2) prefer to preserve the current vertical scrollbar visibility (this is > for performance, showing/hiding the vertical scrollbar changes the > available width of the contents, so it's expensive) > 3) prefer to hide the horizontal scrollbar (showing/hiding the > horizontal scrollbar is cheap) > > If no solutions are feasible then we show whatever scrollbars we're > allowed to, so at least the user can scroll to see all the content. > > http://mxr.mozilla.org/seamonkey/source/layout/generic/nsGfxScrollFrame.cpp#606 > if you're interested :-). > I am not sure but that appears as a bit complicated. Here (in attachment) is what I have here. Not ideal too but works. Hope it will help to find something better. Regards. -- Andrew Fedoniouk. http://terrainformatica.com
void block::update_scrollbars( view& v ) { const style& cs = current_style(v); int overflow_x = cs.overflow_x; int overflow_y = cs.overflow_y; bool hsb_needed = (overflow_x == overflow_auto || overflow_x == overflow_scroll); bool vsb_needed = (overflow_y == overflow_auto || overflow_y == overflow_scroll); // 'sb' here is a scrollbar control structure - sb.hsb and sb.vsb are pointers to // struct scrollbar instances. if( sb.hsb == 0 && !hsb_needed && sb.vsb == 0 && !vsb_needed ) return; scroll_data scd; get_scroll_data(v,scd); for(int i = 0; i < 2; ++i) { int minwidth = scd.dim_doc.x; bool relayout_y = !hsb_needed? sb.remove_h(): sb.set_h(scd.pos.x, 0, minwidth, scd.dim_view.x, overflow_x == overflow_scroll); if( relayout_y) { set_height(v, dim.y); get_scroll_data(v,scd); } int minheight = scd.dim_doc.y; bool relayout_x = !vsb_needed? sb.remove_v(): sb.set_v(scd.pos.y, 0, minheight, scd.dim_view.y, overflow_y == overflow_scroll); if( relayout_x ) { do_measure(v); set_height(v, dim.y); get_scroll_data(v,scd); } else if ( minwidth == scd.dim_doc.x) break; } point sp; sp.y = limit(scd.pos.y,0,scd.dim_doc.y-scd.dim_view.y); sp.x = limit(scd.pos.x,0,scd.dim_doc.x-scd.dim_view.x); if( scd.pos != sp ) scroll_pos(sp); sb.refresh(v, this); }
Received on Tuesday, 8 January 2008 08:27:31 UTC