Pasting from other applications. Neither Ctrl+V nor the middle button pasted into an ltk app anything copied in another application; only what was copied within the same process pasted. The Wayland backend bound its `wl_data_device` and its primary-selection device in `SeatHandler::new_seat`, which smithay-client-toolkit calls only for seats announced after start-up: `SeatState::new` binds the seats already in the registry without calling it, and on every compositor the seat is there when the app connects. The app therefore never had either device, the compositor never offered it another client's selection, and what it copied did not reach other applications through the compositor either. A Wayland trace of prompt shows both managers bound and neither `get_data_device` nor `get_device` sent. Both devices are now bound in `new_capability`, which comes for every seat, the first time it does; `new_seat` does nothing. The middle button and a selection just made. A compositor offers the primary selection to the window it gives the keyboard, and gives it on the press, so a middle click on a window that did not have the keyboard arrives together with the offer. ltk reads an offer on a thread of its own and pasted at once what it held, so after selecting in another application an ltk app pasted the selection before that. `Platform::primary_selection_pending` says whether another application's selection is still being read: the Wayland backend counts the reader threads it starts and the selections that arrive (`PrimarySelection::pending`), and the other backends answer `false`. A middle-button paste, into the text field under the pointer (`PrimaryPaste::Field`) or for an app that asked with `SelectionKind::Primary` (`PrimaryPaste::App`), goes through `AppData::paste_primary`, which while a read is pending keeps it in `pending_primary_paste`; `check_primary_paste`, run before every draw, makes it once the selection has arrived or after 500 ms with what there is, and `next_primary_paste_wakeup` wakes the loop every 10 ms meanwhile, since the reading thread does not. A field paste is made only if the field still has the focus. The clipboard and the primary selection in a browser desktop. On a page with forge/web, what an app copies goes to forge/web as a `set_selection` request as well as to the browser's clipboard, and the selection the middle button pastes, which did nothing in a browser, as `set_primary_selection` (`Connection::set_selection`). forge/web's `selection` and `primary_selection` events, which every client hears when one sets them and each hears on connecting, become `PageEvent::Selection` and so `AppData::clipboard` and `AppData::primary_selection`, as another client's selection does on Wayland. Copying, and selecting and pasting with the middle button, thus work between the page's applications whether or not the browser lets a page write its clipboard. A `paste` from the browser still brings what other applications of the computer copied; a browser has no primary selection a page can reach. The office icons. The default theme's word processor, spreadsheet and presentation icons came from Figma with a `foreignObject` backdrop blur that resvg ignores, and showed as flat white discs with pale glyphs. They are drawn again as the terminal's are: a dark gradient disc in each one's colour (blue, green, orange), a bright glyph and the terminal's filter. The doc comment of `ltk::files` links `write()` as a function, since `write` alone was ambiguous with the macro for rustdoc. `CHANGELOG.md` describes the changes.
55 lines
3.6 KiB
XML
55 lines
3.6 KiB
XML
<svg width="72" height="72" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<rect width="72" height="72" rx="36" fill="url(#paint0_slides)"/>
|
|
<g filter="url(#filter0_diiii_slides)">
|
|
<path d="M24 18H56C57.1046 18 58 18.8954 58 20V42C58 43.1046 57.1046 44 56 44H24C22.8954 44 22 43.1046 22 42V20C22 18.8954 22.8954 18 24 18Z" fill="#FFD9A0" stroke="url(#paint1_slides)" stroke-width="0.3"/>
|
|
<path d="M16 26H48C49.1046 26 50 26.8954 50 28V50C50 51.1046 49.1046 52 48 52H16C14.8954 52 14 51.1046 14 50V28C14 26.8954 14.8954 26 16 26Z" fill="#FFA62B" stroke="url(#paint1_slides)" stroke-width="0.3"/>
|
|
</g>
|
|
<rect x="19" y="32" width="10" height="10" rx="1.5" fill="#3A1404"/>
|
|
<circle cx="39" cy="37" r="5.5" fill="#3A1404"/>
|
|
<rect x="19" y="45" width="26" height="2.5" rx="1.25" fill="#3A1404"/>
|
|
<defs>
|
|
<filter id="filter0_diiii_slides" x="-29" y="-22.9081" width="130" height="117.816" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
|
<feOffset/>
|
|
<feGaussianBlur stdDeviation="4.5"/>
|
|
<feComposite in2="hardAlpha" operator="out"/>
|
|
<feColorMatrix type="matrix" values="0 0 0 0 0.129977 0 0 0 0 0.129977 0 0 0 0 0.129977 0 0 0 0.25 0"/>
|
|
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_slides"/>
|
|
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_slides" result="shape"/>
|
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
|
<feOffset dx="-3.6" dy="-3.6"/>
|
|
<feGaussianBlur stdDeviation="6.75"/>
|
|
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
|
<feColorMatrix type="matrix" values="0 0 0 0 0.333333 0 0 0 0 0.333333 0 0 0 0 0.333333 0 0 0 1 0"/>
|
|
<feBlend mode="plus-lighter" in2="shape" result="effect2_innerShadow_slides"/>
|
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
|
<feOffset dx="1.8" dy="1.8"/>
|
|
<feGaussianBlur stdDeviation="0.9"/>
|
|
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
|
<feColorMatrix type="matrix" values="0 0 0 0 0.333333 0 0 0 0 0.333333 0 0 0 0 0.333333 0 0 0 1 0"/>
|
|
<feBlend mode="plus-lighter" in2="effect2_innerShadow_slides" result="effect3_innerShadow_slides"/>
|
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
|
<feOffset dx="0.45" dy="0.45"/>
|
|
<feGaussianBlur stdDeviation="0.45"/>
|
|
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
|
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0"/>
|
|
<feBlend mode="overlay" in2="effect3_innerShadow_slides" result="effect4_innerShadow_slides"/>
|
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
|
<feOffset dx="1.8" dy="1.8"/>
|
|
<feGaussianBlur stdDeviation="3.6"/>
|
|
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
|
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"/>
|
|
<feBlend mode="normal" in2="effect4_innerShadow_slides" result="effect5_innerShadow_slides"/>
|
|
</filter>
|
|
<linearGradient id="paint0_slides" x1="36" y1="0" x2="36" y2="72" gradientUnits="userSpaceOnUse">
|
|
<stop stop-color="#B35A12"/>
|
|
<stop offset="1" stop-color="#3A1404"/>
|
|
</linearGradient>
|
|
<linearGradient id="paint1_slides" x1="36" y1="18" x2="36" y2="52" gradientUnits="userSpaceOnUse">
|
|
<stop stop-color="white"/>
|
|
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
|
</linearGradient>
|
|
</defs>
|
|
</svg>
|