diff --git a/distro-packages/Arch-Linux/skald-git/PKGBUILD b/distro-packages/Arch-Linux/skald-git/PKGBUILD index 2f860e8..0a29284 100644 --- a/distro-packages/Arch-Linux/skald-git/PKGBUILD +++ b/distro-packages/Arch-Linux/skald-git/PKGBUILD @@ -2,7 +2,7 @@ # shellcheck shell=bash disable=SC2034,SC2154 pkgname=skald-git -pkgver=0.0.0.r1536.ga35ae10 +pkgver=0.0.0.r1537.g7cfbcda pkgrel=1 pkgdesc='Audio-only hall-based conferencing server' arch=('x86_64' 'aarch64') diff --git a/static/skald.js b/static/skald.js index ddca81b..d293151 100644 --- a/static/skald.js +++ b/static/skald.js @@ -2614,6 +2614,17 @@ function announceChat(text) { let chalkboardRevision = 0; let chalkboardSendTimer = null; let applyingChalkboardUpdate = false; +let chalkboardAnnouncementTimer = null; +let chalkboardHasPendingAnnouncement = false; +let chalkboardPendingHasText = false; +let chalkboardLocalTextPending = null; + +function clearChalkboardAnnouncementTimer() { + if(chalkboardAnnouncementTimer) { + clearTimeout(chalkboardAnnouncementTimer); + chalkboardAnnouncementTimer = null; + } +} function canEditChalkboard() { if(!serverConnection || !serverConnection.permissions) @@ -2650,6 +2661,10 @@ function updateChalkboardCopyButton() { function resetChalkboard() { chalkboardRevision = 0; + chalkboardHasPendingAnnouncement = false; + chalkboardPendingHasText = false; + chalkboardLocalTextPending = null; + clearChalkboardAnnouncementTimer(); if(chalkboardSendTimer) { clearTimeout(chalkboardSendTimer); chalkboardSendTimer = null; @@ -2682,6 +2697,37 @@ async function copyChalkboardToClipboard() { } } +function announcePendingChalkboardUpdate() { + clearChalkboardAnnouncementTimer(); + if(!chalkboardHasPendingAnnouncement) + return; + + announceChat( + chalkboardPendingHasText ? + 'Chalkboard updated. Contents available in the chalkboard.' : + 'Chalkboard cleared.', + ); + chalkboardHasPendingAnnouncement = false; +} + +function scheduleChalkboardUpdateAnnouncement(hasText) { + let chalkboard = /** @type {HTMLTextAreaElement} */ + (document.getElementById('chalkboard')); + if(!chalkboard) + return; + + chalkboardHasPendingAnnouncement = true; + chalkboardPendingHasText = hasText; + if(document.activeElement === chalkboard) + return; + + clearChalkboardAnnouncementTimer(); + chalkboardAnnouncementTimer = setTimeout(() => { + chalkboardAnnouncementTimer = null; + announceChat(hasText ? 'Chalkboard updated.' : 'Chalkboard cleared.'); + }, 2000); +} + /** * @param {any} message */ @@ -2700,10 +2746,20 @@ function applyChalkboardUpdate(message) { (document.getElementById('chalkboard')); if(!chalkboard) return; + let isLocalEcho = + chalkboardLocalTextPending !== null && + text === chalkboardLocalTextPending; if(chalkboard.value !== text) { applyingChalkboardUpdate = true; chalkboard.value = text; applyingChalkboardUpdate = false; + if(isLocalEcho) { + chalkboardLocalTextPending = null; + } else { + scheduleChalkboardUpdateAnnouncement(text.length > 0); + } + } else if(isLocalEcho) { + chalkboardLocalTextPending = null; } updateChalkboardAccess(); } @@ -2719,6 +2775,7 @@ function scheduleChalkboardSend() { (document.getElementById('chalkboard')); if(!chalkboard || !serverConnection || !serverConnection.socket) return; + chalkboardLocalTextPending = chalkboard.value; serverConnection.hallAction('chalkboard', { text: chalkboard.value, revision: chalkboardRevision, @@ -3718,6 +3775,10 @@ document.getElementById('chalkboard').addEventListener('keydown', function(e) { return; }); +document.getElementById('chalkboard').addEventListener('focus', function(e) { + announcePendingChalkboardUpdate(); +}); + document.getElementById('chalkboard-copy').addEventListener('click', function(e) { e.preventDefault(); copyChalkboardToClipboard();