telegramdesktop/tdesktop/public-canary • 12682e6 • 1 files, +4/-2
[ai] Reconcile only the groups the run selected
telegramdesktop/tdesktop/public-canary • 51ac1a6 • 1 files, +7/-2
Fixed abort scheduling TTL with a wrong system clock.
The interval was computed from two int32 timestamps, so a wrapped or
stale unixtime::now() - which is what the OS correcting a badly wrong
clock produces - overflowed it negative, and base::Timer aborts on that.
telegramdesktop/tdesktop/public-canary • fa86363 • 2 files, +59/-28
Fixed stale last message after a topic switch.
The reply fields decide topicRootId(), so setReplyFields() can move an
item to another topic. History::itemRemoved() later notifies only the
current topic(), leaving the old one holding a raw pointer to an item it
would never hear about again.
Also stop publishing item data changes from inside createComponents():
notifying about an item that new HistoryItem() has not finished building
lets a listener re-enter and reach it half-constructed.
telegramdesktop/tdesktop/public-canary • 61be1b5 • 1 files, +1/-1
Fixed crash showing a popup menu destroyed inside show().
telegramdesktop/tdesktop/public-canary • 5efbf50 • 3 files, +15/-2
Reset palette icon copies through their own palette.
telegramdesktop/tdesktop/public-canary • d0b86c6 • 2 files, +2/-2
Update Qt patches to guard windows destroyed mid-event.
telegramdesktop/tdesktop/public-canary • 9959fd7 • 1 files, +14/-3
Fixed assertion editing a deleted proxy into a duplicate.
replaceItemWith() removed the edited row from the settings list without
restoring it first, so doing that to a row already marked deleted - which
is not in that list at all - failed the Assert. Its sibling
replaceItemValue() has restored first all along.
_list is also a vector, so erasing the edited item shifts everything
after it and left the iterator for the duplicate naming a different item
- or one past the end when the duplicate was last. Read its id and
deleted flag before the erase; everything after it works by id anyway.
#tdesktop
[ai] Reconcile only the groups the run selected
telegramdesktop/tdesktop/public-canary • 51ac1a6 • 1 files, +7/-2
Fixed abort scheduling TTL with a wrong system clock.
The interval was computed from two int32 timestamps, so a wrapped or
stale unixtime::now() - which is what the OS correcting a badly wrong
clock produces - overflowed it negative, and base::Timer aborts on that.
telegramdesktop/tdesktop/public-canary • fa86363 • 2 files, +59/-28
Fixed stale last message after a topic switch.
The reply fields decide topicRootId(), so setReplyFields() can move an
item to another topic. History::itemRemoved() later notifies only the
current topic(), leaving the old one holding a raw pointer to an item it
would never hear about again.
Also stop publishing item data changes from inside createComponents():
notifying about an item that new HistoryItem() has not finished building
lets a listener re-enter and reach it half-constructed.
telegramdesktop/tdesktop/public-canary • 61be1b5 • 1 files, +1/-1
Fixed crash showing a popup menu destroyed inside show().
telegramdesktop/tdesktop/public-canary • 5efbf50 • 3 files, +15/-2
Reset palette icon copies through their own palette.
telegramdesktop/tdesktop/public-canary • d0b86c6 • 2 files, +2/-2
Update Qt patches to guard windows destroyed mid-event.
telegramdesktop/tdesktop/public-canary • 9959fd7 • 1 files, +14/-3
Fixed assertion editing a deleted proxy into a duplicate.
replaceItemWith() removed the edited row from the settings list without
restoring it first, so doing that to a row already marked deleted - which
is not in that list at all - failed the Assert. Its sibling
replaceItemValue() has restored first all along.
_list is also a vector, so erasing the edited item shifts everything
after it and left the iterator for the duplicate naming a different item
- or one past the end when the duplicate was last. Read its id and
deleted flag before the erase; everything after it works by id anyway.
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • 499b1bb • 2 files, +30/-6
Fixed stack overflow typing a date with an IME.
Same cycle the phone field fix closed: putNext() ends in setFocus(), and
on Windows a focus change with an open IME composition makes
QWindowsInputContext::reset() re-send the commit to the field we came
from, whose correctValue() fires putNext() again. Focus the next field
asynchronously, the way Ui::TimeInput already breaks this exact loop - a
re-entrancy flag would instead swallow a chained overflow digit, since
correctValue() can hand one straight on to the field after next.
telegramdesktop/tdesktop/public-canary • e1b410e • 1 files, +6/-0
Fixed crash painting an info layer with no content.
parentResized() can move the content out into a MoveMemento and only
queue hideSpecialLayer(), and LayerStackWidget renders the layer
synchronously through Ui::Shadow::grab() during transitions, so
paintEvent could run in the same window showFinished() was guarded for.
telegramdesktop/tdesktop/public-canary • f827ef8 • 1 files, +7/-1
Fixed crash in the media viewer with no monitors left.
telegramdesktop/tdesktop/public-canary • f012556 • 1 files, +11/-3
Fixed huge allocation blurring a video preview.
The frame was blurred at full resolution and only then scaled down to the
preview width, which both allocates by the source pixel count and washes
the blur out in proportion to how much is scaled away - a 4K video got a
noticeably sharper preview than a small one.
telegramdesktop/tdesktop/public-canary • 1a5921f • 1 files, +7/-1
Don't leak a background subscription per font family tap.
telegramdesktop/tdesktop/public-canary • 07d3096 • 1 files, +1/-1
Don't abort on E_OUTOFMEMORY building media controls.
telegramdesktop/tdesktop/public-canary • 7d5492e • 1 files, +45/-26
Fixed acting on the wrong sticker in a mixed set.
Hit testing yields an index into _elements, which skips the premium
stickers an account that cannot get premium must not see, while preview,
sending, the context menu, deletion and reordering all looked that index
up in _pack - which keeps them. With one skipped sticker before a visible
one, clicking a sticker sent a different one.
Everything driven by a visible position now reads _elements, and the
reorder translates both positions through the documents so the full pack
and the server still get the position in the whole set.
telegramdesktop/tdesktop/public-canary • 7caa13c • 1 files, +1/-1
Fixed reentrancy destroying the last menu separator.
#tdesktop
Fixed stack overflow typing a date with an IME.
Same cycle the phone field fix closed: putNext() ends in setFocus(), and
on Windows a focus change with an open IME composition makes
QWindowsInputContext::reset() re-send the commit to the field we came
from, whose correctValue() fires putNext() again. Focus the next field
asynchronously, the way Ui::TimeInput already breaks this exact loop - a
re-entrancy flag would instead swallow a chained overflow digit, since
correctValue() can hand one straight on to the field after next.
telegramdesktop/tdesktop/public-canary • e1b410e • 1 files, +6/-0
Fixed crash painting an info layer with no content.
parentResized() can move the content out into a MoveMemento and only
queue hideSpecialLayer(), and LayerStackWidget renders the layer
synchronously through Ui::Shadow::grab() during transitions, so
paintEvent could run in the same window showFinished() was guarded for.
telegramdesktop/tdesktop/public-canary • f827ef8 • 1 files, +7/-1
Fixed crash in the media viewer with no monitors left.
telegramdesktop/tdesktop/public-canary • f012556 • 1 files, +11/-3
Fixed huge allocation blurring a video preview.
The frame was blurred at full resolution and only then scaled down to the
preview width, which both allocates by the source pixel count and washes
the blur out in proportion to how much is scaled away - a 4K video got a
noticeably sharper preview than a small one.
telegramdesktop/tdesktop/public-canary • 1a5921f • 1 files, +7/-1
Don't leak a background subscription per font family tap.
telegramdesktop/tdesktop/public-canary • 07d3096 • 1 files, +1/-1
Don't abort on E_OUTOFMEMORY building media controls.
telegramdesktop/tdesktop/public-canary • 7d5492e • 1 files, +45/-26
Fixed acting on the wrong sticker in a mixed set.
Hit testing yields an index into _elements, which skips the premium
stickers an account that cannot get premium must not see, while preview,
sending, the context menu, deletion and reordering all looked that index
up in _pack - which keeps them. With one skipped sticker before a visible
one, clicking a sticker sent a different one.
Everything driven by a visible position now reads _elements, and the
reorder translates both positions through the documents so the full pack
and the server still get the position in the whole set.
telegramdesktop/tdesktop/public-canary • 7caa13c • 1 files, +1/-1
Fixed reentrancy destroying the last menu separator.
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • f1f07db • 1 files, +1/-1
Guard the other popup menu show paths as well.
telegramdesktop/tdesktop/public-canary • b3e85dc • 2 files, +41/-2
Fixed resetting icons that outlived their owner.
ChatStyle::value() hands its result to the caller, so the icons it makes
are not ours to keep in _ownedIcons: the lifetime overload's icons die
with the caller - a section's corner buttons, for instance, while the
session style lives on - and the by-value overload's live in a local.
A later palette change then reset through freed pointers.
Track only what the lifetime overload creates, and drop it again when
that lifetime ends.
telegramdesktop/tdesktop/public-canary • 4f3da4d • 1 files, +7/-0
Fixed stale last message after a service edition.
createServiceFromMtp() rebuilds the data topicRootId() reads, so a
service edition can move the item to another topic - and the old one was
left holding a raw pointer History::itemRemoved() would never tell it
about. The sublist beside it was already handled this way.
telegramdesktop/tdesktop/public-canary • 7e4e39d • 1 files, +5/-3
Don't hide a download another entry still owns.
detach() reported the item removed even when another downloaded entry
still held it, so the downloads list dropped a row that was still backed
by a file until the view was rebuilt.
telegramdesktop/tdesktop/public-canary • 98807cc • 1 files, +1/-1
Don't call through a null WinRT stream reference factory.
telegramdesktop/tdesktop/public-canary • 2ad89e6 • 2 files, +2/-2
Update Qt patches, narrower guard and a wider cocoa one.
telegramdesktop/tdesktop/public-canary • eda64ab • 1 files, +38/-13
Fixed huge allocation cropping a panorama thumbnail.
Expanding to the box before cropping avoids deep copying a 12000x9000
photo, but it blows up the other way on an extreme aspect ratio: a
2560x26 panorama expands to about 35000x360, where cropping first cost
almost nothing. Both orders scale by the same factor, so take whichever
intermediate is smaller.
telegramdesktop/tdesktop/public-canary • 9f47cda • 1 files, +4/-1
Fixed one more crash when the last monitor is removed.
#tdesktop
Guard the other popup menu show paths as well.
telegramdesktop/tdesktop/public-canary • b3e85dc • 2 files, +41/-2
Fixed resetting icons that outlived their owner.
ChatStyle::value() hands its result to the caller, so the icons it makes
are not ours to keep in _ownedIcons: the lifetime overload's icons die
with the caller - a section's corner buttons, for instance, while the
session style lives on - and the by-value overload's live in a local.
A later palette change then reset through freed pointers.
Track only what the lifetime overload creates, and drop it again when
that lifetime ends.
telegramdesktop/tdesktop/public-canary • 4f3da4d • 1 files, +7/-0
Fixed stale last message after a service edition.
createServiceFromMtp() rebuilds the data topicRootId() reads, so a
service edition can move the item to another topic - and the old one was
left holding a raw pointer History::itemRemoved() would never tell it
about. The sublist beside it was already handled this way.
telegramdesktop/tdesktop/public-canary • 7e4e39d • 1 files, +5/-3
Don't hide a download another entry still owns.
detach() reported the item removed even when another downloaded entry
still held it, so the downloads list dropped a row that was still backed
by a file until the view was rebuilt.
telegramdesktop/tdesktop/public-canary • 98807cc • 1 files, +1/-1
Don't call through a null WinRT stream reference factory.
telegramdesktop/tdesktop/public-canary • 2ad89e6 • 2 files, +2/-2
Update Qt patches, narrower guard and a wider cocoa one.
telegramdesktop/tdesktop/public-canary • eda64ab • 1 files, +38/-13
Fixed huge allocation cropping a panorama thumbnail.
Expanding to the box before cropping avoids deep copying a 12000x9000
photo, but it blows up the other way on an extreme aspect ratio: a
2560x26 panorama expands to about 35000x360, where cropping first cost
almost nothing. Both orders scale by the same factor, so take whichever
intermediate is smaller.
telegramdesktop/tdesktop/public-canary • 9f47cda • 1 files, +4/-1
Fixed one more crash when the last monitor is removed.
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • ccfb5b3 • 2 files, +21/-1
Give up clearing a history after enough failed retries.
Re-requesting the dialog entry until the last message is known has no
bound, so an entry that keeps coming back unknown - offline, or a flood
wait - spun requests forever and the clear never finished.
telegramdesktop/tdesktop/public-canary • 367052b • 4 files, +7/-0
Add public keys for canary channel.
telegramdesktop/tdesktop/public-canary • 570c478 • 9 files, +1279/-0
Add v2 update verification core and build channels
telegramdesktop/tdesktop/public-canary • ebc783a • 3 files, +672/-0
Support v2 channel packing in the Packer
telegramdesktop/tdesktop/public-canary • 72a32c4 • 7 files, +662/-141
Verify, fetch and install v2 updates in the client
telegramdesktop/tdesktop/public-canary • 1c3da59 • 2 files, +9/-1
Show canary version and skip changelogs on canary
telegramdesktop/tdesktop/public-canary • 8823c56 • 2 files, +821/-0
Add focused tests for v2 update verification
telegramdesktop/tdesktop/public-canary • 86bf3a8 • 1 files, +862/-0
Add canary build and publish workflow
telegramdesktop/tdesktop/public-canary • af2d7d9 • 1 files, +186/-163
Build one canary lane per repository in CI
telegramdesktop/tdesktop/public-canary • 2ee9549 • 3 files, +31/-13
Use readable v2 update file names
telegramdesktop/tdesktop/public-canary • 2363f18 • 4 files, +117/-8
Use new update names and pinned Bot API image in CI
telegramdesktop/tdesktop/public-canary • 81bb9f4 • 3 files, +108/-62
Ship per-arch mac updates with a universal installer
#tdesktop
Give up clearing a history after enough failed retries.
Re-requesting the dialog entry until the last message is known has no
bound, so an entry that keeps coming back unknown - offline, or a flood
wait - spun requests forever and the clear never finished.
telegramdesktop/tdesktop/public-canary • 367052b • 4 files, +7/-0
Add public keys for canary channel.
telegramdesktop/tdesktop/public-canary • 570c478 • 9 files, +1279/-0
Add v2 update verification core and build channels
telegramdesktop/tdesktop/public-canary • ebc783a • 3 files, +672/-0
Support v2 channel packing in the Packer
telegramdesktop/tdesktop/public-canary • 72a32c4 • 7 files, +662/-141
Verify, fetch and install v2 updates in the client
telegramdesktop/tdesktop/public-canary • 1c3da59 • 2 files, +9/-1
Show canary version and skip changelogs on canary
telegramdesktop/tdesktop/public-canary • 8823c56 • 2 files, +821/-0
Add focused tests for v2 update verification
telegramdesktop/tdesktop/public-canary • 86bf3a8 • 1 files, +862/-0
Add canary build and publish workflow
telegramdesktop/tdesktop/public-canary • af2d7d9 • 1 files, +186/-163
Build one canary lane per repository in CI
telegramdesktop/tdesktop/public-canary • 2ee9549 • 3 files, +31/-13
Use readable v2 update file names
telegramdesktop/tdesktop/public-canary • 2363f18 • 4 files, +117/-8
Use new update names and pinned Bot API image in CI
telegramdesktop/tdesktop/public-canary • 81bb9f4 • 3 files, +108/-62
Ship per-arch mac updates with a universal installer
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • 1800603 • 1 files, +70/-28
Publish portable archives as canary first installs
telegramdesktop/tdesktop/public-canary • 430ae6d • 1 files, +5/-4
Drop the bundled d3d compiler from canary builds
telegramdesktop/tdesktop/public-canary • e240f44 • 3 files, +41/-4
Embed external and local signatures in one packer pass
telegramdesktop/tdesktop/public-canary • b7cc975 • 2 files, +82/-3
Add a v2 update switch to the release build scripts
telegramdesktop/tdesktop/public-canary • 64256c5 • 1 files, +29/-1
Read the pinned metadata through the local Bot API
telegramdesktop/tdesktop/public-canary • 98a224c • 3 files, +25/-1
Support v2 updates in the updater and deploy scripts
telegramdesktop/tdesktop/public-canary • 183a2c6 • 23 files, +872/-216
Harden canary builds running.
telegramdesktop/tdesktop/public-canary • e3802ea • 4 files, +20/-10
Fix build for Release.
telegramdesktop/tdesktop/public-canary • edb6eea • 2 files, +68/-21
Try to fix signing.
telegramdesktop/tdesktop/public-canary • 5e2e4e0 • 1 files, +77/-5
Improve caching.
telegramdesktop/tdesktop/public-canary • 9a8e58b • 1 files, +17/-5
Try to fix signing again.
telegramdesktop/tdesktop/public-canary • 6ed6442 • 10 files, +598/-311
New names, separate publishing.
telegramdesktop/tdesktop/public-canary • 27a8777 • 7 files, +255/-6
Fix translocated launch on macOS.
#tdesktop
Publish portable archives as canary first installs
telegramdesktop/tdesktop/public-canary • 430ae6d • 1 files, +5/-4
Drop the bundled d3d compiler from canary builds
telegramdesktop/tdesktop/public-canary • e240f44 • 3 files, +41/-4
Embed external and local signatures in one packer pass
telegramdesktop/tdesktop/public-canary • b7cc975 • 2 files, +82/-3
Add a v2 update switch to the release build scripts
telegramdesktop/tdesktop/public-canary • 64256c5 • 1 files, +29/-1
Read the pinned metadata through the local Bot API
telegramdesktop/tdesktop/public-canary • 98a224c • 3 files, +25/-1
Support v2 updates in the updater and deploy scripts
telegramdesktop/tdesktop/public-canary • 183a2c6 • 23 files, +872/-216
Harden canary builds running.
telegramdesktop/tdesktop/public-canary • e3802ea • 4 files, +20/-10
Fix build for Release.
telegramdesktop/tdesktop/public-canary • edb6eea • 2 files, +68/-21
Try to fix signing.
telegramdesktop/tdesktop/public-canary • 5e2e4e0 • 1 files, +77/-5
Improve caching.
telegramdesktop/tdesktop/public-canary • 9a8e58b • 1 files, +17/-5
Try to fix signing again.
telegramdesktop/tdesktop/public-canary • 6ed6442 • 10 files, +598/-311
New names, separate publishing.
telegramdesktop/tdesktop/public-canary • 27a8777 • 7 files, +255/-6
Fix translocated launch on macOS.
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • 86649fa • 4 files, +32/-14
Improve version display for canary.
telegramdesktop/tdesktop/public-canary • d53ae21 • 1 files, +141/-40
Split macOS canary build into per-arch jobs.
telegramdesktop/tdesktop/public-canary • 1f34704 • 7 files, +198/-3
Add an in-title CANARY/PRIVATE marking.
telegramdesktop/tdesktop/public-canary • 083f5df • 6 files, +42/-24
Rename canary branches.
telegramdesktop/tdesktop/public-canary • 588628f • 1 files, +3/-0
Fixed per-arch build picking universal crashpad handler.
telegramdesktop/tdesktop/public-canary • a893870 • 1 files, +11/-4
Keep TelegramForcePortable in portable archives.
telegramdesktop/tdesktop/public-canary • 45de183 • 1 files, +11/-11
Allow CANARY_ALLOW_UNSIGNED in public lane too.
telegramdesktop/tdesktop/public-canary • 48e5556 • 1 files, +38/-3
Try workaround clone problems.
telegramdesktop/tdesktop/public-canary • b5896f2 • 1 files, +25/-19
Fix build with GCC.
telegramdesktop/tdesktop/public-canary • 4ddbb38 • 2 files, +36/-19
Fix public publishing.
telegramdesktop/tdesktop/public-canary • 145ddf7 • 1 files, +6/-6
Keep canary artifacts for seven days
telegramdesktop/tdesktop/public-canary • b0dc6e1 • 1 files, +29/-1
Fixed missing ATL breaking breakpad build in canary Windows job.
telegramdesktop/tdesktop/public-canary • ccfadeb • 1 files, +50/-20
Install ATL for the pinned Windows toolset
#tdesktop
Improve version display for canary.
telegramdesktop/tdesktop/public-canary • d53ae21 • 1 files, +141/-40
Split macOS canary build into per-arch jobs.
telegramdesktop/tdesktop/public-canary • 1f34704 • 7 files, +198/-3
Add an in-title CANARY/PRIVATE marking.
telegramdesktop/tdesktop/public-canary • 083f5df • 6 files, +42/-24
Rename canary branches.
telegramdesktop/tdesktop/public-canary • 588628f • 1 files, +3/-0
Fixed per-arch build picking universal crashpad handler.
telegramdesktop/tdesktop/public-canary • a893870 • 1 files, +11/-4
Keep TelegramForcePortable in portable archives.
telegramdesktop/tdesktop/public-canary • 45de183 • 1 files, +11/-11
Allow CANARY_ALLOW_UNSIGNED in public lane too.
telegramdesktop/tdesktop/public-canary • 48e5556 • 1 files, +38/-3
Try workaround clone problems.
telegramdesktop/tdesktop/public-canary • b5896f2 • 1 files, +25/-19
Fix build with GCC.
telegramdesktop/tdesktop/public-canary • 4ddbb38 • 2 files, +36/-19
Fix public publishing.
telegramdesktop/tdesktop/public-canary • 145ddf7 • 1 files, +6/-6
Keep canary artifacts for seven days
telegramdesktop/tdesktop/public-canary • b0dc6e1 • 1 files, +29/-1
Fixed missing ATL breaking breakpad build in canary Windows job.
telegramdesktop/tdesktop/public-canary • ccfadeb • 1 files, +50/-20
Install ATL for the pinned Windows toolset
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • e4a8e0b • 1 files, +10/-1
Fallback to v1 update unpacking.
telegramdesktop/tdesktop/public-canary • 3a10553 • 3 files, +26/-7
[ai] Refuse implausible test watchdog values
Task: 2026/08/23/refuse-implausible-test-watchdog-values
telegramdesktop/tdesktop/public-canary • b441b83 • 3 files, +0/-0
Delete unused account_check icon rasters
Task: 2026/08/18/delete-orphaned-account-check-icon
telegramdesktop/tdesktop/public-canary • 329910a • 2 files, +11/-2
Correct shared media index writes and viewer counts
Task: 2026/08/18/repair-shared-media-index-and-count-bookkeeping
telegramdesktop/tdesktop/public-canary • ef9be27 • 1 files, +16/-3
Re-index a sent message only when its thread moves
Task: 2026/08/18/repair-shared-media-index-and-count-bookkeeping
telegramdesktop/tdesktop/public-canary • 99ad271 • 2 files, +60/-6
Derive the pinned bar's topic root from the thread
Task: 2026/08/19/align-replies-thread-shared-media-attribution
telegramdesktop/tdesktop/public-canary • 206edab • 2 files, +1/-1
Pair the uploaded media edit's shared media removal
Task: 2026/08/19/pair-media-edit-removal-with-index-add
telegramdesktop/tdesktop/public-canary • 4f10eb6 • 1 files, +20/-5
Drop a sent message from the shared media lists it left
Task: 2026/08/19/match-sent-message-removal-to-written-mask
telegramdesktop/tdesktop/public-canary • f1e7b58 • 1 files, +3/-3
Don't keep a media reference across rich page changes
Task: 2026/08/19/refetch-saved-media-after-rich-page-changes
telegramdesktop/tdesktop/public-canary • 0b9f3f9 • 5 files, +30/-13
Don't lower shared media counts for unindexed messages
Task: 2026/08/20/stop-unmatched-removal-lowering-shared-media-counts
telegramdesktop/tdesktop/public-canary • e4dc19f • 7 files, +40/-56
Tie stored pinned index writes to the pinned flag
Task: 2026/08/19/unify-pinned-index-writers
#tdesktop
Fallback to v1 update unpacking.
telegramdesktop/tdesktop/public-canary • 3a10553 • 3 files, +26/-7
[ai] Refuse implausible test watchdog values
Task: 2026/08/23/refuse-implausible-test-watchdog-values
telegramdesktop/tdesktop/public-canary • b441b83 • 3 files, +0/-0
Delete unused account_check icon rasters
Task: 2026/08/18/delete-orphaned-account-check-icon
telegramdesktop/tdesktop/public-canary • 329910a • 2 files, +11/-2
Correct shared media index writes and viewer counts
Task: 2026/08/18/repair-shared-media-index-and-count-bookkeeping
telegramdesktop/tdesktop/public-canary • ef9be27 • 1 files, +16/-3
Re-index a sent message only when its thread moves
Task: 2026/08/18/repair-shared-media-index-and-count-bookkeeping
telegramdesktop/tdesktop/public-canary • 99ad271 • 2 files, +60/-6
Derive the pinned bar's topic root from the thread
Task: 2026/08/19/align-replies-thread-shared-media-attribution
telegramdesktop/tdesktop/public-canary • 206edab • 2 files, +1/-1
Pair the uploaded media edit's shared media removal
Task: 2026/08/19/pair-media-edit-removal-with-index-add
telegramdesktop/tdesktop/public-canary • 4f10eb6 • 1 files, +20/-5
Drop a sent message from the shared media lists it left
Task: 2026/08/19/match-sent-message-removal-to-written-mask
telegramdesktop/tdesktop/public-canary • f1e7b58 • 1 files, +3/-3
Don't keep a media reference across rich page changes
Task: 2026/08/19/refetch-saved-media-after-rich-page-changes
telegramdesktop/tdesktop/public-canary • 0b9f3f9 • 5 files, +30/-13
Don't lower shared media counts for unindexed messages
Task: 2026/08/20/stop-unmatched-removal-lowering-shared-media-counts
telegramdesktop/tdesktop/public-canary • e4dc19f • 7 files, +40/-56
Tie stored pinned index writes to the pinned flag
Task: 2026/08/19/unify-pinned-index-writers
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • 411085f • 2 files, +52/-1
Write the pinned thread index only in forum peers
Task: 2026/08/20/stop-orphaning-general-id-shared-media-lists
telegramdesktop/tdesktop/public-canary • 4023d1a • 2 files, +5/-2
Give a saved sublist its own pinned message list
Task: 2026/08/19/make-saved-sublist-pinned-bar-read-one-list
telegramdesktop/tdesktop/public-canary • 3ec95b8 • 1 files, +6/-0
Retire shared media of a deleted topic with no object
Task: 2026/08/20/retire-forum-media-lists-without-topic-objects
telegramdesktop/tdesktop/public-canary • 30876f2 • 5 files, +31/-0
Retire all topic shared media when a forum is destroyed
Task: 2026/08/20/retire-stranded-forum-media-keys-on-forum-teardown
telegramdesktop/tdesktop/public-canary • 2b9fb29 • 1 files, +6/-4
Guard the live-topic media unload against a zero root
Task: 2026/08/20/guard-live-topic-unload-against-zero-root
telegramdesktop/tdesktop/public-canary • e389116 • 1 files, +6/-4
Guard the forum teardown media unload against a zero root
Task: 2026/08/20/guard-forum-teardown-unload-against-zero-root
telegramdesktop/tdesktop/public-canary • 8cde4e4 • 2 files, +4/-4
Resolve the self peer sublist in the shared resolver
Task: 2026/08/20/resolve-self-peer-sublist-in-shared-resolver
telegramdesktop/tdesktop/public-canary • 5dada73 • 2 files, +0/-2
Drop the write-only monoforum id from top controls
Task: 2026/08/20/retire-write-only-top-controls-monoforum-peer-id
telegramdesktop/tdesktop/public-canary • fee7306 • 1 files, +1/-1
Read the inbox when a sublist has no parent chat
Task: 2026/08/20/restore-read-inbox-on-parentless-sublist-send
telegramdesktop/tdesktop/public-canary • f5b5f84 • 1 files, +2/-8
Use the shared sublist resolver in the player panel
Task: 2026/08/20/collapse-player-panel-sublist-onto-shared-resolver
#tdesktop
Write the pinned thread index only in forum peers
Task: 2026/08/20/stop-orphaning-general-id-shared-media-lists
telegramdesktop/tdesktop/public-canary • 4023d1a • 2 files, +5/-2
Give a saved sublist its own pinned message list
Task: 2026/08/19/make-saved-sublist-pinned-bar-read-one-list
telegramdesktop/tdesktop/public-canary • 3ec95b8 • 1 files, +6/-0
Retire shared media of a deleted topic with no object
Task: 2026/08/20/retire-forum-media-lists-without-topic-objects
telegramdesktop/tdesktop/public-canary • 30876f2 • 5 files, +31/-0
Retire all topic shared media when a forum is destroyed
Task: 2026/08/20/retire-stranded-forum-media-keys-on-forum-teardown
telegramdesktop/tdesktop/public-canary • 2b9fb29 • 1 files, +6/-4
Guard the live-topic media unload against a zero root
Task: 2026/08/20/guard-live-topic-unload-against-zero-root
telegramdesktop/tdesktop/public-canary • e389116 • 1 files, +6/-4
Guard the forum teardown media unload against a zero root
Task: 2026/08/20/guard-forum-teardown-unload-against-zero-root
telegramdesktop/tdesktop/public-canary • 8cde4e4 • 2 files, +4/-4
Resolve the self peer sublist in the shared resolver
Task: 2026/08/20/resolve-self-peer-sublist-in-shared-resolver
telegramdesktop/tdesktop/public-canary • 5dada73 • 2 files, +0/-2
Drop the write-only monoforum id from top controls
Task: 2026/08/20/retire-write-only-top-controls-monoforum-peer-id
telegramdesktop/tdesktop/public-canary • fee7306 • 1 files, +1/-1
Read the inbox when a sublist has no parent chat
Task: 2026/08/20/restore-read-inbox-on-parentless-sublist-send
telegramdesktop/tdesktop/public-canary • f5b5f84 • 1 files, +2/-8
Use the shared sublist resolver in the player panel
Task: 2026/08/20/collapse-player-panel-sublist-onto-shared-resolver
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • 2c095b0 • 4 files, +35/-0
Request pinned messages when a pin is not loaded
Task: 2026/08/20/reach-unloaded-pin-on-complete-pinned-slice
telegramdesktop/tdesktop/public-canary • 7fc04c3 • 6 files, +21/-10
Open a saved sublist's own shared media page
Task: 2026/08/20/open-saved-sublist-own-info-media-page
telegramdesktop/tdesktop/public-canary • 3188a10 • 9 files, +63/-43
Align sublist media count, query and window keys
Task: 2026/08/21/align-sublist-media-count-query-and-window-keys
telegramdesktop/tdesktop/public-canary • 0fb9de2 • 4 files, +55/-3
Keep Info pages on their topic or sublist
Task: 2026/08/21/preserve-info-thread-identity-and-lifetime
telegramdesktop/tdesktop/public-canary • dfa728f • 1 files, +12/-10
Tear down Info after a sublist is destroyed
Task: 2026/08/21/preserve-info-thread-identity-and-lifetime
telegramdesktop/tdesktop/public-canary • 5af7323 • 1 files, +14/-12
Clear Info immediately when its sublist dies
Task: 2026/08/21/preserve-info-thread-identity-and-lifetime
telegramdesktop/tdesktop/public-canary • 48fc35a • 1 files, +9/-13
Always drop an Info wrap when its sublist dies
Task: 2026/08/21/preserve-info-thread-identity-and-lifetime
telegramdesktop/tdesktop/public-canary • 7c87f53 • 6 files, +90/-34
Reach unloaded pins on thread keys and updates
Task: 2026/08/21/reach-unloaded-pins-across-thread-and-update-paths
telegramdesktop/tdesktop/public-canary • 8ca5c10 • 3 files, +11/-4
Rebind Info wrap teardown when a sublist is replaced
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
telegramdesktop/tdesktop/public-canary • 2f3b1b2 • 2 files, +14/-10
Tear down Layer Info instantly when its sublist dies
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
telegramdesktop/tdesktop/public-canary • 298f4c8 • 2 files, +17/-14
Queue Info wrap teardown off sublist destroyed()
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
#tdesktop
Request pinned messages when a pin is not loaded
Task: 2026/08/20/reach-unloaded-pin-on-complete-pinned-slice
telegramdesktop/tdesktop/public-canary • 7fc04c3 • 6 files, +21/-10
Open a saved sublist's own shared media page
Task: 2026/08/20/open-saved-sublist-own-info-media-page
telegramdesktop/tdesktop/public-canary • 3188a10 • 9 files, +63/-43
Align sublist media count, query and window keys
Task: 2026/08/21/align-sublist-media-count-query-and-window-keys
telegramdesktop/tdesktop/public-canary • 0fb9de2 • 4 files, +55/-3
Keep Info pages on their topic or sublist
Task: 2026/08/21/preserve-info-thread-identity-and-lifetime
telegramdesktop/tdesktop/public-canary • dfa728f • 1 files, +12/-10
Tear down Info after a sublist is destroyed
Task: 2026/08/21/preserve-info-thread-identity-and-lifetime
telegramdesktop/tdesktop/public-canary • 5af7323 • 1 files, +14/-12
Clear Info immediately when its sublist dies
Task: 2026/08/21/preserve-info-thread-identity-and-lifetime
telegramdesktop/tdesktop/public-canary • 48fc35a • 1 files, +9/-13
Always drop an Info wrap when its sublist dies
Task: 2026/08/21/preserve-info-thread-identity-and-lifetime
telegramdesktop/tdesktop/public-canary • 7c87f53 • 6 files, +90/-34
Reach unloaded pins on thread keys and updates
Task: 2026/08/21/reach-unloaded-pins-across-thread-and-update-paths
telegramdesktop/tdesktop/public-canary • 8ca5c10 • 3 files, +11/-4
Rebind Info wrap teardown when a sublist is replaced
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
telegramdesktop/tdesktop/public-canary • 2f3b1b2 • 2 files, +14/-10
Tear down Layer Info instantly when its sublist dies
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
telegramdesktop/tdesktop/public-canary • 298f4c8 • 2 files, +17/-14
Queue Info wrap teardown off sublist destroyed()
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • 4f6a48f • 3 files, +19/-21
Hide Layer Info before its sublist is erased
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
telegramdesktop/tdesktop/public-canary • 1aaeee4 • 2 files, +15/-18
Preserve teardown stream across Info wrap removal
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
telegramdesktop/tdesktop/public-canary • 055522e • 1 files, +0/-1
Remove stale Info teardown implementation note
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
telegramdesktop/tdesktop/public-canary • dea7ba5 • 1 files, +3/-2
Keep saved sublists alive through item teardown
Task: 2026/08/21/finish-info-wrap-sublist-teardown-past-item-destroy
telegramdesktop/tdesktop/public-canary • 28d924b • 4 files, +39/-20
Align sublist media counts, windows and titles
Task: 2026/08/21/align-sublist-media-count-window-and-title
telegramdesktop/tdesktop/public-canary • 5f1bf03 • 1 files, +7/-5
Show the new window tooltip only on entries that have one
Task: 2026/08/23/verify-saved-sublist-media-surfaces-and-gate-tooltip
telegramdesktop/tdesktop/public-canary • 0cb4b75 • 4 files, +90/-67
Unify sublist media window ids and persisted titles
Task: 2026/08/23/unify-sublist-separate-id-and-window-naming-rulings
telegramdesktop/tdesktop/public-canary • 7f9844b • 1 files, +2/-2
Limit media topic context to forum chats
telegramdesktop/tdesktop/public-canary • 1a70cff • 1 files, +1/-1
Removed stale comment about swscale destination format caching.
telegramdesktop/tdesktop/public-canary • 963f8bb • 1 files, +5/-0
Restricted transcode temp directory permissions to user.
Related commit: 0807483acc.
telegramdesktop/tdesktop/public-canary • dae8e52 • 2 files, +26/-6
Extracted video editor layer showing to shared helper.
#tdesktop
Hide Layer Info before its sublist is erased
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
telegramdesktop/tdesktop/public-canary • 1aaeee4 • 2 files, +15/-18
Preserve teardown stream across Info wrap removal
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
telegramdesktop/tdesktop/public-canary • 055522e • 1 files, +0/-1
Remove stale Info teardown implementation note
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
telegramdesktop/tdesktop/public-canary • dea7ba5 • 1 files, +3/-2
Keep saved sublists alive through item teardown
Task: 2026/08/21/finish-info-wrap-sublist-teardown-past-item-destroy
telegramdesktop/tdesktop/public-canary • 28d924b • 4 files, +39/-20
Align sublist media counts, windows and titles
Task: 2026/08/21/align-sublist-media-count-window-and-title
telegramdesktop/tdesktop/public-canary • 5f1bf03 • 1 files, +7/-5
Show the new window tooltip only on entries that have one
Task: 2026/08/23/verify-saved-sublist-media-surfaces-and-gate-tooltip
telegramdesktop/tdesktop/public-canary • 0cb4b75 • 4 files, +90/-67
Unify sublist media window ids and persisted titles
Task: 2026/08/23/unify-sublist-separate-id-and-window-naming-rulings
telegramdesktop/tdesktop/public-canary • 7f9844b • 1 files, +2/-2
Limit media topic context to forum chats
telegramdesktop/tdesktop/public-canary • 1a70cff • 1 files, +1/-1
Removed stale comment about swscale destination format caching.
telegramdesktop/tdesktop/public-canary • 963f8bb • 1 files, +5/-0
Restricted transcode temp directory permissions to user.
Related commit: 0807483acc.
telegramdesktop/tdesktop/public-canary • dae8e52 • 2 files, +26/-6
Extracted video editor layer showing to shared helper.
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • 74503d9 • 1 files, +26/-10
Extracted shared video encoder setup from H264 encoder.
telegramdesktop/tdesktop/public-canary • cb897b2 • 2 files, +7/-3
Added VP9 encoder and webm muxer to ffmpeg build configs.
telegramdesktop/tdesktop/public-canary • 46be7b3 • 2 files, +150/-20
Added webm sticker output mode to video encoder.
telegramdesktop/tdesktop/public-canary • 181a39f • 7 files, +332/-69
Added adapting video stickers into custom emoji.
Related commit: 9895e5bb89.
#tdesktop
Extracted shared video encoder setup from H264 encoder.
telegramdesktop/tdesktop/public-canary • cb897b2 • 2 files, +7/-3
Added VP9 encoder and webm muxer to ffmpeg build configs.
telegramdesktop/tdesktop/public-canary • 46be7b3 • 2 files, +150/-20
Added webm sticker output mode to video encoder.
telegramdesktop/tdesktop/public-canary • 181a39f • 7 files, +332/-69
Added adapting video stickers into custom emoji.
Related commit: 9895e5bb89.
#tdesktop
🫡4🤨1
morethanwords/tweb/master • ef41b29 • 183 files, +7649/-4673
Migrate legacy rows to Solid RowTsx
#webk
Migrate legacy rows to Solid RowTsx
#webk
🫡4
telegramdesktop/tdesktop/dev • 70f4f42 • 1 files, +1/-1
Fixed crash constructing a raced shared Lottie state.
A shared provider is destroyed by the first render() that fails, on the
renderer thread, while SharedState is constructed on a crl::async one -
so _shared could go away between valid() and construct(). Tolerate that
instead of asserting, and treat a missing cover as a failed animation:
the metadata copied at load time no longer describes such a state, and
frameForPaint() would have asserted on its null frame later on.
telegramdesktop/tdesktop/dev • 50efdbc • 1 files, +8/-1
Guard enlarging a group call video with no monitors.
videoEndpointLargeValue() fires on data, not on user input, so it can
reach enlargeVideo() during the interval when the last monitor is gone
and QWidget::screen() is nullptr.
telegramdesktop/tdesktop/dev • 8bcbab7 • 1 files, +5/-1
Show the moved service message in its new topic.
The half beside applyItemRemoved() was missing: the edited item left the
old topic but was never offered to the new one, so its preview and order
in the topic list stayed stale until a reload.
telegramdesktop/tdesktop/dev • 23b6c1b • 1 files, +1/-1
Destroy a removed menu item before its action.
An item reads action() while it is being torn down, so removeAction()
deleting the action first left it pointing at freed memory for the whole
widget destructor. clearActions() and clearLastSeparator() already do it
in this order.
telegramdesktop/tdesktop/dev • 9732805 • 1 files, +1/-1
Don't clear metadata through a null display updater.
init() registers the ButtonPressed handler before it fills in the display
updater, so an E_OUTOFMEMORY in between leaves the token set and the
updater null - and the destructor takes exactly that branch, calling
ClearAll() on a null projected interface at process exit.
telegramdesktop/tdesktop/dev • 7f65351 • 2 files, +12/-4
Destroy the info controller with its content widgets.
createMemento() freed the Controller while _content lived on, and the
content widgets hold it by a raw pointer: MainWidget::showHistory takes
the memento, runs a whole HistoryWidget::showHistory - which reaches
itemVisibilitiesUpdated() and the still-subscribed media list - and only
then destroys the section. The nulling was never a lifetime requirement,
just the "memento already taken" flag showInternal() reads, so make that
a flag and let the controller die with the widget after _content.
telegramdesktop/tdesktop/dev • 4023790 • 1 files, +1/-1
Update lib_ui.
#tdesktop
Fixed crash constructing a raced shared Lottie state.
A shared provider is destroyed by the first render() that fails, on the
renderer thread, while SharedState is constructed on a crl::async one -
so _shared could go away between valid() and construct(). Tolerate that
instead of asserting, and treat a missing cover as a failed animation:
the metadata copied at load time no longer describes such a state, and
frameForPaint() would have asserted on its null frame later on.
telegramdesktop/tdesktop/dev • 50efdbc • 1 files, +8/-1
Guard enlarging a group call video with no monitors.
videoEndpointLargeValue() fires on data, not on user input, so it can
reach enlargeVideo() during the interval when the last monitor is gone
and QWidget::screen() is nullptr.
telegramdesktop/tdesktop/dev • 8bcbab7 • 1 files, +5/-1
Show the moved service message in its new topic.
The half beside applyItemRemoved() was missing: the edited item left the
old topic but was never offered to the new one, so its preview and order
in the topic list stayed stale until a reload.
telegramdesktop/tdesktop/dev • 23b6c1b • 1 files, +1/-1
Destroy a removed menu item before its action.
An item reads action() while it is being torn down, so removeAction()
deleting the action first left it pointing at freed memory for the whole
widget destructor. clearActions() and clearLastSeparator() already do it
in this order.
telegramdesktop/tdesktop/dev • 9732805 • 1 files, +1/-1
Don't clear metadata through a null display updater.
init() registers the ButtonPressed handler before it fills in the display
updater, so an E_OUTOFMEMORY in between leaves the token set and the
updater null - and the destructor takes exactly that branch, calling
ClearAll() on a null projected interface at process exit.
telegramdesktop/tdesktop/dev • 7f65351 • 2 files, +12/-4
Destroy the info controller with its content widgets.
createMemento() freed the Controller while _content lived on, and the
content widgets hold it by a raw pointer: MainWidget::showHistory takes
the memento, runs a whole HistoryWidget::showHistory - which reaches
itemVisibilitiesUpdated() and the still-subscribed media list - and only
then destroys the section. The nulling was never a lifetime requirement,
just the "memento already taken" flag showInternal() reads, so make that
a flag and let the controller die with the widget after _content.
telegramdesktop/tdesktop/dev • 4023790 • 1 files, +1/-1
Update lib_ui.
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • ba23d84 • 1 files, +3/-1
Fixed nosound flag dropping animated attribute from sent GIFs.
Regression was introduced in fe7e967258.
telegramdesktop/tdesktop/dev • 3fe5164 • 1 files, +7/-4
Added mp4 conversion for quicktime videos sent as GIFs.
Related commit: fe7e967258.
telegramdesktop/tdesktop/dev • 049b4ad • 2 files, +6/-0
Added getter of automatic clear time to emoji statuses.
telegramdesktop/tdesktop/dev • 2661216 • 8 files, +137/-0
Added emoji status actions to custom emoji context menu.
#tdesktop
Fixed nosound flag dropping animated attribute from sent GIFs.
Regression was introduced in fe7e967258.
telegramdesktop/tdesktop/dev • 3fe5164 • 1 files, +7/-4
Added mp4 conversion for quicktime videos sent as GIFs.
Related commit: fe7e967258.
telegramdesktop/tdesktop/dev • 049b4ad • 2 files, +6/-0
Added getter of automatic clear time to emoji statuses.
telegramdesktop/tdesktop/dev • 2661216 • 8 files, +137/-0
Added emoji status actions to custom emoji context menu.
#tdesktop
🫡4🤝1
UnigramDev/Unigram/develop • f902c66 • 8 files, +52/-1
Toast when adding/removing from a folder
UnigramDev/Unigram/develop • 40f235a • 4 files, +68/-11
Add a solution for the Win32 flavour
UnigramDev/Unigram/develop • 9b3d428 • 6 files, +28/-6
Windows Hello support in Win32 project
UnigramDev/Unigram/develop • e12bb7f • 1 files, +0/-1
Don't clear passcode from session closed handler
UnigramDev/Unigram/develop • b82f6cf • 15 files, +2046/-1868
Reorganize extensions
UnigramDev/Unigram/develop • 708a738 • 1 files, +31/-2
Fix parsing spaces in html paste
UnigramDev/Unigram/develop • 5182e58 • 5 files, +1/-96
Remove dead code from the extension helpers
UnigramDev/Unigram/develop • bd846e9 • 4 files, +46/-108
Collapse duplicated extension overloads
UnigramDev/Unigram/develop • 0d6bfb0 • 1 files, +123/-33
Reset pooled spans and bound the text element pool
UnigramDev/Unigram/develop • 1278bc5 • 1 files, +127/-75
Fix search collection asking for more items forever
UnigramDev/Unigram/develop • 1a078d0 • 57 files, +1413/-284
Replace Rg.DiffUtils with an in-tree diff reader
UnigramDev/Unigram/develop • e949899 • 1 files, +35/-0
Hash the stowed origin trace into the crash group
UnigramDev/Unigram/develop • 88c5aa5 • 2 files, +16/-1
Fix null ref
UnigramDev/Unigram/develop • 99bb3f1 • 64 files, +428/-549
Merge MvxObservableCollection into DiffObservableCollection
UnigramDev/Unigram/develop • d6ecdaa • 2 files, +3/-11
Remove ToTimestampMilliseconds
#unigram
Toast when adding/removing from a folder
UnigramDev/Unigram/develop • 40f235a • 4 files, +68/-11
Add a solution for the Win32 flavour
UnigramDev/Unigram/develop • 9b3d428 • 6 files, +28/-6
Windows Hello support in Win32 project
UnigramDev/Unigram/develop • e12bb7f • 1 files, +0/-1
Don't clear passcode from session closed handler
UnigramDev/Unigram/develop • b82f6cf • 15 files, +2046/-1868
Reorganize extensions
UnigramDev/Unigram/develop • 708a738 • 1 files, +31/-2
Fix parsing spaces in html paste
UnigramDev/Unigram/develop • 5182e58 • 5 files, +1/-96
Remove dead code from the extension helpers
UnigramDev/Unigram/develop • bd846e9 • 4 files, +46/-108
Collapse duplicated extension overloads
UnigramDev/Unigram/develop • 0d6bfb0 • 1 files, +123/-33
Reset pooled spans and bound the text element pool
UnigramDev/Unigram/develop • 1278bc5 • 1 files, +127/-75
Fix search collection asking for more items forever
UnigramDev/Unigram/develop • 1a078d0 • 57 files, +1413/-284
Replace Rg.DiffUtils with an in-tree diff reader
UnigramDev/Unigram/develop • e949899 • 1 files, +35/-0
Hash the stowed origin trace into the crash group
UnigramDev/Unigram/develop • 88c5aa5 • 2 files, +16/-1
Fix null ref
UnigramDev/Unigram/develop • 99bb3f1 • 64 files, +428/-549
Merge MvxObservableCollection into DiffObservableCollection
UnigramDev/Unigram/develop • d6ecdaa • 2 files, +3/-11
Remove ToTimestampMilliseconds
#unigram
UnigramDev/Unigram/streaming-download-buttons • 6736c6e • 3 files, +73/-0
Track the files a reader is streaming
UnigramDev/Unigram/streaming-download-buttons • bb7a503 • 13 files, +181/-138
Hide a download that only feeds a reader from the file buttons
#unigram
Track the files a reader is streaming
UnigramDev/Unigram/streaming-download-buttons • bb7a503 • 13 files, +181/-138
Hide a download that only feeds a reader from the file buttons
#unigram
UnigramDev/Unigram/streaming-download-buttons • f8a6759 • 3 files, +73/-0
Track the files a reader is streaming
UnigramDev/Unigram/streaming-download-buttons • 278c0a1 • 13 files, +181/-138
Hide a download that only feeds a reader from the file buttons
#unigram
Track the files a reader is streaming
UnigramDev/Unigram/streaming-download-buttons • 278c0a1 • 13 files, +181/-138
Hide a download that only feeds a reader from the file buttons
#unigram
UnigramDev/Unigram/incremental-loading-terminates • b21d133 • 1 files, +14/-7
Stop the reaction list asking for more items forever
#unigram
Stop the reaction list asking for more items forever
#unigram
UnigramDev/Unigram/video-chat-aliases-itemssource • 5d2aea8 • 1 files, +5/-1
Pass the projected sender vector to VideoChatAliasesPopup
#unigram
Pass the projected sender vector to VideoChatAliasesPopup
#unigram
morethanwords/tweb/master • 882c48a • 1 files, +10/-0
Fix stale forum avatar unread badge
morethanwords/tweb/master • e934b90 • 3 files, +4/-5
Remove ripple from archive and community rows
morethanwords/tweb/master • 8f6b380 • 9 files, +152/-61
Show forum membership actions
morethanwords/tweb/master • 119c827 • 3 files, +65/-83
Align chat actions plate with translation layout
morethanwords/tweb/master • 1cb8bb8 • 9 files, +513/-203
Use thread separators instead of topic chips
morethanwords/tweb/master • 1d0e373 • 11 files, +218/-64
Pinned message plate: thread-scoped everywhere, no flicker
Opening a forum topic flashed the plate with the channel-wide pin: the initial
hint came from `fullPeer.pinned_msg_id` while the plate's own list is fetched
with `threadId`, so a topic with no pins revealed the plate and hid it again
one task later (and shifted `--pinned-floating-height` with it).
topbar: seed the hint only when there is no threadId; key the staged setup by
peer + thread (on mobile one chat instance is reused across peer changes, so
peerId alone kept the previous topic's plate); pass threadId into the pinned
tab and its title counter; drop the eagerly created throwaway plate
pinnedMessage: clear pinnedMid/pinnedIndex when the list resolves to empty, so
no phantom hint is saved into ChatSavedPosition and re-flashed next open
Pinning while sitting at the end of the chat kept the previous pin with a
bumped counter: the `peer_pinned_messages` anchor was unconditional. Anchor
only while the user is actually walking the pin list (locked /
waitForScrollBottom) and not already at the end of the history.
Rest of the review of the plate:
- forum: unpin-all / hide are thread-scoped too (top_msg_id, thread-keyed
hiddenPinnedMessages, thread-filtered local pFlags.pinned sweep), and both
pin events carry threadId so a change in one topic no longer resets the
plate of every other open topic
- chat: isPinnedMessagesNeeded() dropped the stale `|| isForum`, which put a
plate inside a forum's own pinned-messages tab (and scheduled, and search)
- getPinnedMessage remembers an empty list; testMid mirrors setCorrectIndex's
no-pins guard, so a jump-to-message in a chat without pins stops refetching
- _setPinnedMessage takes a render seq so an older run can't commit over a
newer pin; destroy() cancels the debounce, throttle and leaving-button
timers; the stale dataset.mid is cleared when nothing is pinned
- getCurrentIndexPromise is reset before the trailing testMid/setCorrectIndex
so a fetch they start isn't orphaned
- followPinnedMessage falls back to mids[0] when pinnedMaxMid isn't known yet,
instead of wrapping onto the oldest pin
- setCorrectIndex returns for static (Discussion) plates instead of doing an
elementFromPoint reflow on every throttled scroll
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#webk
Fix stale forum avatar unread badge
morethanwords/tweb/master • e934b90 • 3 files, +4/-5
Remove ripple from archive and community rows
morethanwords/tweb/master • 8f6b380 • 9 files, +152/-61
Show forum membership actions
morethanwords/tweb/master • 119c827 • 3 files, +65/-83
Align chat actions plate with translation layout
morethanwords/tweb/master • 1cb8bb8 • 9 files, +513/-203
Use thread separators instead of topic chips
morethanwords/tweb/master • 1d0e373 • 11 files, +218/-64
Pinned message plate: thread-scoped everywhere, no flicker
Opening a forum topic flashed the plate with the channel-wide pin: the initial
hint came from `fullPeer.pinned_msg_id` while the plate's own list is fetched
with `threadId`, so a topic with no pins revealed the plate and hid it again
one task later (and shifted `--pinned-floating-height` with it).
topbar: seed the hint only when there is no threadId; key the staged setup by
peer + thread (on mobile one chat instance is reused across peer changes, so
peerId alone kept the previous topic's plate); pass threadId into the pinned
tab and its title counter; drop the eagerly created throwaway plate
pinnedMessage: clear pinnedMid/pinnedIndex when the list resolves to empty, so
no phantom hint is saved into ChatSavedPosition and re-flashed next open
Pinning while sitting at the end of the chat kept the previous pin with a
bumped counter: the `peer_pinned_messages` anchor was unconditional. Anchor
only while the user is actually walking the pin list (locked /
waitForScrollBottom) and not already at the end of the history.
Rest of the review of the plate:
- forum: unpin-all / hide are thread-scoped too (top_msg_id, thread-keyed
hiddenPinnedMessages, thread-filtered local pFlags.pinned sweep), and both
pin events carry threadId so a change in one topic no longer resets the
plate of every other open topic
- chat: isPinnedMessagesNeeded() dropped the stale `|| isForum`, which put a
plate inside a forum's own pinned-messages tab (and scheduled, and search)
- getPinnedMessage remembers an empty list; testMid mirrors setCorrectIndex's
no-pins guard, so a jump-to-message in a chat without pins stops refetching
- _setPinnedMessage takes a render seq so an older run can't commit over a
newer pin; destroy() cancels the debounce, throttle and leaving-button
timers; the stale dataset.mid is cleared when nothing is pinned
- getCurrentIndexPromise is reset before the trailing testMid/setCorrectIndex
so a fetch they start isn't orphaned
- followPinnedMessage falls back to mids[0] when pinnedMaxMid isn't known yet,
instead of wrapping onto the oldest pin
- setCorrectIndex returns for static (Discussion) plates instead of doing an
elementFromPoint reflow on every throttled scroll
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#webk
🫡3
morethanwords/tweb/master • cc42eb7 • 1 files, +8/-7
Let the link preview be dismissed back to the reply plate
Quoting a message and then typing a link left the plate stuck on the web page:
neither Escape, nor the cross, nor "Remove preview" could get rid of it.
setTopInfo({type: 'webpage'}) only repaints the plate - helperType stays
'reply' - so onHelperCancel restores the previous helper by calling
helperFunc(). But willSendWebPage was dropped only AFTER that call, and
setTopInfo bails out early on `willSendWebPage && type === 'reply'`, so the
reply was never repainted: the plate kept showing a preview that was already
gone from the state. setCurrentHover got an undefined element along the way,
which also killed the hover menu holding "Remove preview" - hence "stuck".
Drop willSendWebPage before restoring the helper; lastUrl / noWebPage are
still restored afterwards, since setTopInfo's clearHelper resets them.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
morethanwords/tweb/master • f30c242 • 3 files, +151/-26
Offer Reopen Topic in the chat actions plate
A closed forum topic gave a manager no way back: the input stayed writable
(canSendToPeer lets canManageTopic through) but reopening was buried in the
chat-list context menu. tdesktop puts a TopicReopenBar right in the bar stack
that already carries the peer-settings actions, so the same plate carries it
here.
dialogsStorage.canReopenTopic(peerId, threadId) composes the two halves of
tdesktop's state - the topic is closed, and we may manage it - into one sync
read, so the UI asks once instead of fetching the topic and then asking about
rights.
actions plate:
- the peer-settings actions and the reopen action are now independent halves
recombined by applyButtons(), which decides the visible list (reopen first)
and the hidden state synchronously - the peer-change path keeps committing
in one go, no flicker
- the close button renders only for the peer-settings half: tdesktop's reopen
bar has no cross, and hidePeerSettingsBar would be meaningless there.
Dismissing now clears only that half, so a still-closed topic keeps its
button
- a lone button with no close beside it spans the plate (is-single) instead of
sitting in the centred pill width that reserves an end slot for the cross
- state follows the topic live: dialogs_multiupdate carries the closed flag
(it arrives as a messageActionTopicEdit service message) and chat_update
covers rights changing under us, which is what tdesktop watches
adminRightsValue for
- gated to ChatType.Chat with a thread on a chat peer, so it can't surface in
the pinned/discussion/saved views
The topic check joins the existing acked getPeerSettings call, and it answers
from worker cache, so the chat-open batch stays uncached-round-trip free.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#webk
Let the link preview be dismissed back to the reply plate
Quoting a message and then typing a link left the plate stuck on the web page:
neither Escape, nor the cross, nor "Remove preview" could get rid of it.
setTopInfo({type: 'webpage'}) only repaints the plate - helperType stays
'reply' - so onHelperCancel restores the previous helper by calling
helperFunc(). But willSendWebPage was dropped only AFTER that call, and
setTopInfo bails out early on `willSendWebPage && type === 'reply'`, so the
reply was never repainted: the plate kept showing a preview that was already
gone from the state. setCurrentHover got an undefined element along the way,
which also killed the hover menu holding "Remove preview" - hence "stuck".
Drop willSendWebPage before restoring the helper; lastUrl / noWebPage are
still restored afterwards, since setTopInfo's clearHelper resets them.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
morethanwords/tweb/master • f30c242 • 3 files, +151/-26
Offer Reopen Topic in the chat actions plate
A closed forum topic gave a manager no way back: the input stayed writable
(canSendToPeer lets canManageTopic through) but reopening was buried in the
chat-list context menu. tdesktop puts a TopicReopenBar right in the bar stack
that already carries the peer-settings actions, so the same plate carries it
here.
dialogsStorage.canReopenTopic(peerId, threadId) composes the two halves of
tdesktop's state - the topic is closed, and we may manage it - into one sync
read, so the UI asks once instead of fetching the topic and then asking about
rights.
actions plate:
- the peer-settings actions and the reopen action are now independent halves
recombined by applyButtons(), which decides the visible list (reopen first)
and the hidden state synchronously - the peer-change path keeps committing
in one go, no flicker
- the close button renders only for the peer-settings half: tdesktop's reopen
bar has no cross, and hidePeerSettingsBar would be meaningless there.
Dismissing now clears only that half, so a still-closed topic keeps its
button
- a lone button with no close beside it spans the plate (is-single) instead of
sitting in the centred pill width that reserves an end slot for the cross
- state follows the topic live: dialogs_multiupdate carries the closed flag
(it arrives as a messageActionTopicEdit service message) and chat_update
covers rights changing under us, which is what tdesktop watches
adminRightsValue for
- gated to ChatType.Chat with a thread on a chat peer, so it can't surface in
the pinned/discussion/saved views
The topic check joins the existing acked getPeerSettings call, and it answers
from worker cache, so the chat-open batch stays uncached-round-trip free.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#webk
🫡3