Skip to content

Latest commit

 

History

History
57 lines (50 loc) · 2.12 KB

scrolling.md

File metadata and controls

57 lines (50 loc) · 2.12 KB

Scrolling

Scrolling is implemented by the compositor. Compositor layers that opt in to scroll events via the wants_scroll_events flag can scroll their contents. These will be referred "scrolling roots." Scrolling roots serve as a viewport into their content, which is stored in descendant layers. In order for scrolling roots to be able to scroll their content, they need to be smaller than that content. If the content was smaller than the scrolling root, it would not be able to move around inside the scrolling root. Imagine a browser window that is larger than the content that it contains. The size of each layer is defined by the window size (the root layer) or the block size for iframes and elements with overflow:scroll.

Since the compositor allows layers to exist independently of their parents, child layers can overflow or fail to intersect their parents completely. To prevent this, scrolling roots use the masks_to_bounds flag, which is a signal to the compositor that it should not paint the parts of descendant layers that lie outside the boundaries of the scrolling root.

Below is an ASCII art diagram showing a scrolling root with three content layers (a, b, and c), scrolled down a few ticks. masks_to_bounds has not been applied in the diagram.

+-----------------------+
|                       |
=========================
|                       |  scrolling
|           <-------------+root
|                       |
|             +-------+ |
=========================
|             |  b    | |
++-------+    +--^----+ |
||       |       |      |
||       |       |      |  content
||   c <---------+---------+layers
|+-------+    /         |
|          a <          |
|                       |
+-----------------------+

Everything above and below the set of ==== bars would be hidden by masks_to_bounds, so the composited scene will just be the viewport defined by the scrolling root with the content layers a and b visible.

=========================
|                       |
|                       |
|                       |
|             +-------+ |
=========================