mirror of https://github.com/msgbyte/tailchat
feat: add getDisplayMedia support for desktop #158
parent
915ed01a51
commit
18bc2ed4a6
@ -0,0 +1,138 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Capturer Picker</title>
|
||||
<style>
|
||||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.desktop-capturer-selection {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
background: rgba(30, 30, 30, 0.75);
|
||||
color: #fff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.desktop-capturer-selection__scroller {
|
||||
width: 100%;
|
||||
max-height: 100vh;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.desktop-capturer-selection__list {
|
||||
max-width: calc(100% - 100px);
|
||||
margin: auto;
|
||||
padding: 0;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
list-style: none;
|
||||
overflow: hidden;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.desktop-capturer-selection__item {
|
||||
display: flex;
|
||||
margin: 4px;
|
||||
}
|
||||
|
||||
.desktop-capturer-selection__btn {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
width: 160px;
|
||||
height: auto;
|
||||
border-radius: 3px;
|
||||
padding: 4px;
|
||||
background: #252626;
|
||||
text-align: left;
|
||||
transition: background-color 0.15s, box-shadow 0.15s;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.desktop-capturer-selection__btn:hover,
|
||||
.desktop-capturer-selection__btn:focus {
|
||||
background: rgba(98, 100, 167, 0.8);
|
||||
}
|
||||
|
||||
.desktop-capturer-selection__thumbnail {
|
||||
width: 100%;
|
||||
height: 90px;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.desktop-capturer-selection__name {
|
||||
margin: 6px 0 6px;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
color: white;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body></body>
|
||||
<script>
|
||||
window.electron.ipcRenderer.on('SEND_SCREEN_SHARE_SOURCES', (sources) => {
|
||||
try {
|
||||
const selectionElem = document.createElement('div');
|
||||
selectionElem.classList = 'desktop-capturer-selection';
|
||||
selectionElem.innerHTML = `
|
||||
<div class="desktop-capturer-selection__scroller">
|
||||
<ul class="desktop-capturer-selection__list">
|
||||
${sources
|
||||
.map(
|
||||
({ id, name, thumbnail, display_id, appIcon }) => `
|
||||
<li class="desktop-capturer-selection__item">
|
||||
<button class="desktop-capturer-selection__btn" data-id="${id}" title="${name}">
|
||||
<img class="desktop-capturer-selection__thumbnail" src="${String(
|
||||
thumbnail
|
||||
)}" />
|
||||
<span class="desktop-capturer-selection__name">${name}</span>
|
||||
</button>
|
||||
</li>
|
||||
`
|
||||
)
|
||||
.join('')}
|
||||
</ul>
|
||||
</div>
|
||||
`;
|
||||
document.body.appendChild(selectionElem);
|
||||
|
||||
document
|
||||
.querySelectorAll('.desktop-capturer-selection__btn')
|
||||
.forEach((button) => {
|
||||
button.addEventListener('dblclick', async () => {
|
||||
try {
|
||||
const id = button.getAttribute('data-id');
|
||||
const source = sources.find((source) => source.id === id);
|
||||
if (!source) {
|
||||
throw new Error(`Source with id ${id} does not exist`);
|
||||
}
|
||||
|
||||
window.electron.ipcRenderer.sendMessage(
|
||||
'selectCapturerSource',
|
||||
source
|
||||
);
|
||||
} catch (err) {
|
||||
console.error('Error selecting desktop capture source:', err);
|
||||
window.electron.ipcRenderer.sendMessage(null);
|
||||
}
|
||||
});
|
||||
});
|
||||
} catch (err) {
|
||||
console.error('Error displaying desktop capture sources:', err);
|
||||
window.electron.ipcRenderer.sendMessage(null);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</html>
|
Loading…
Reference in New Issue