Skip to content

Commit 96afcaa

Browse files
committed
rustdoc: fix janky behavior on iPadOS
1 parent 54fbbed commit 96afcaa

File tree

3 files changed

+52
-13
lines changed

3 files changed

+52
-13
lines changed

src/librustdoc/html/static/css/rustdoc.css

+18-4
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,7 @@ img {
407407
}
408408

409409
.sidebar-resizer {
410+
touch-action: none;
410411
width: 9px;
411412
cursor: col-resize;
412413
z-index: 10;
@@ -417,12 +418,14 @@ img {
417418
}
418419

419420
.rustdoc.src .sidebar-resizer {
420-
/* when closed, place resizer glow on top of the normal src sidebar border (no need to worry about sidebar) */
421+
/* when closed, place resizer glow on top of the normal src sidebar border (no need to worry
422+
about sidebar) */
421423
left: 49px;
422424
}
423425

424426
.src-sidebar-expanded .rustdoc.src .sidebar-resizer {
425-
/* for src sidebar, gap is already provided by 1px border on sidebar itself, so place resizer to right of it */
427+
/* for src sidebar, gap is already provided by 1px border on sidebar itself, so place resizer
428+
to right of it */
426429
left: var(--src-sidebar-width, 300px);
427430
}
428431

@@ -443,7 +446,8 @@ img {
443446
.sidebar-resizer.active {
444447
width: 10px;
445448
margin: 0;
446-
/* when active or hovered, place resizer glow on top of the sidebar (right next to, or even on top of, the scrollbar) */
449+
/* when active or hovered, place resizer glow on top of the sidebar (right next to, or even
450+
on top of, the scrollbar) */
447451
left: var(--desktop-sidebar-width, 200px);
448452
border-left: solid 1px var(--sidebar-resizer-hover);
449453
}
@@ -456,8 +460,18 @@ img {
456460
left: calc(var(--src-sidebar-width, 300px) - 1px);
457461
}
458462

463+
@media (pointer: coarse) {
464+
.sidebar-resizer,
465+
.sidebar-resizer:hover,
466+
.sidebar-resizer:active,
467+
.sidebar-resizer:focus {
468+
width: 15px;
469+
}
470+
}
471+
459472
.sidebar-resizer.active {
460-
/* make the resize tool bigger when actually resizing, to avoid :hover styles on other stuff while resizing */
473+
/* make the resize tool bigger when actually resizing, to avoid :hover styles on other stuff
474+
while resizing */
461475
padding: 0 140px;
462476
width: 2px;
463477
margin-left: -140px;

src/librustdoc/html/static/js/main.js

+32-7
Original file line numberDiff line numberDiff line change
@@ -1239,6 +1239,7 @@ href="https://doc.rust-lang.org/${channel}/rustdoc/how-to-read-rustdoc.html\
12391239
e.preventDefault();
12401240
});
12411241
}
1242+
let currentPointerId = null;
12421243
const resizer = document.getElementsByClassName("sidebar-resizer")[0];
12431244
const sidebar = document.getElementsByClassName("sidebar")[0];
12441245
if (!resizer || !sidebar) {
@@ -1280,6 +1281,10 @@ href="https://doc.rust-lang.org/${channel}/rustdoc/how-to-read-rustdoc.html\
12801281
hasClass(document.documentElement, "hide-sidebar");
12811282
};
12821283
const resize = e => {
1284+
if (currentPointerId === null || currentPointerId !== e.pointerId) {
1285+
return;
1286+
}
1287+
e.preventDefault();
12831288
const pos = e.clientX - sidebar.offsetLeft - 3;
12841289
if (pos < 50) {
12851290
hideSidebar();
@@ -1292,22 +1297,42 @@ href="https://doc.rust-lang.org/${channel}/rustdoc/how-to-read-rustdoc.html\
12921297
changeSidebarSize(Math.min(pos, window.innerWidth - 100));
12931298
}
12941299
};
1295-
const stopResize = () => {
1300+
const stopResize = e => {
1301+
if (currentPointerId === null) {
1302+
return;
1303+
}
1304+
e.preventDefault();
12961305
removeClass(resizer, "active");
1297-
window.removeEventListener("mousemove", resize, false);
1298-
window.removeEventListener("mouseup", stopResize, false);
1306+
window.removeEventListener("pointermove", resize, false);
1307+
window.removeEventListener("pointerup", stopResize, false);
12991308
removeClass(document.documentElement, "sidebar-resizing");
1309+
if (resizer.releasePointerCapture) {
1310+
resizer.releasePointerCapture(currentPointerId);
1311+
currentPointerId = null;
1312+
}
13001313
};
13011314
const initResize = e => {
1302-
if (e.altKey || e.ctrlKey || e.metaKey || e.button !== 0) {
1315+
if (currentPointerId !== null || e.altKey || e.ctrlKey || e.metaKey || e.button !== 0) {
13031316
return;
13041317
}
1305-
window.addEventListener("mousemove", resize, false);
1306-
window.addEventListener("mouseup", stopResize, false);
1318+
if (resizer.setPointerCapture) {
1319+
resizer.setPointerCapture(e.pointerId);
1320+
if (!resizer.hasPointerCapture(e.pointerId)) {
1321+
// unable to capture pointer; something else has it
1322+
// on iOS, this usually means you long-clicked a link instead
1323+
resizer.releasePointerCapture(e.pointerId);
1324+
return;
1325+
}
1326+
currentPointerId = e.pointerId;
1327+
}
1328+
e.preventDefault();
1329+
window.addEventListener("pointermove", resize, false);
1330+
window.addEventListener("pointercancel", stopResize, false);
1331+
window.addEventListener("pointerup", stopResize, false);
13071332
addClass(resizer, "active");
13081333
addClass(document.documentElement, "sidebar-resizing");
13091334
};
1310-
resizer.addEventListener("mousedown", initResize, false);
1335+
resizer.addEventListener("pointerdown", initResize, false);
13111336
}());
13121337

13131338
(function() {

src/librustdoc/html/static/js/storage.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -196,14 +196,14 @@ if (getSettingValue("hide-sidebar") === "true") {
196196

197197
function updateSidebarWidth() {
198198
const desktopSidebarWidth = getSettingValue("desktop-sidebar-width");
199-
if (desktopSidebarWidth) {
199+
if (desktopSidebarWidth && desktopSidebarWidth !== "null") {
200200
document.documentElement.style.setProperty(
201201
"--desktop-sidebar-width",
202202
desktopSidebarWidth + "px"
203203
);
204204
}
205205
const srcSidebarWidth = getSettingValue("src-sidebar-width");
206-
if (srcSidebarWidth) {
206+
if (srcSidebarWidth && srcSidebarWidth !== "null") {
207207
document.documentElement.style.setProperty(
208208
"--src-sidebar-width",
209209
srcSidebarWidth + "px"

0 commit comments

Comments
 (0)