morethanwords/tweb/master • 5db7cfb • 3 files, +75/-11
Center a jump on the highlighted text when the message does not fit the screen
A bubble taller than the screen cannot be centered, so fastSmoothScroll aligns
its start instead - and the search result or the quote we jumped to stays
wherever it is, several screens below: highlighted, painted and out of sight.
The scroll knows about the highlight now. When the bubble does not fit and its
start does not bring the text into view either, the text itself is centered:
findTextRect measures the match (the very ranges the highlight paints, without
painting anything), and scrollToBubble hands its offset inside the bubble to
getElementPosition and its height to fastSmoothScroll's new getElementSize -
"the part of the element that has to end up in the middle". The date group
fallback is dropped for such a scroll, it would land on the group instead of
the text, so a match taller than the screen aligns at its start, the way
tdesktop's AdjustScrollForRange does it.
Nothing moves differently when the message fits the screen, when the match is
already within its first screenful, or when there is no match to find.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
morethanwords/tweb/master • b21491c • 300 files, +811/-800
Build
#webk
Center a jump on the highlighted text when the message does not fit the screen
A bubble taller than the screen cannot be centered, so fastSmoothScroll aligns
its start instead - and the search result or the quote we jumped to stays
wherever it is, several screens below: highlighted, painted and out of sight.
The scroll knows about the highlight now. When the bubble does not fit and its
start does not bring the text into view either, the text itself is centered:
findTextRect measures the match (the very ranges the highlight paints, without
painting anything), and scrollToBubble hands its offset inside the bubble to
getElementPosition and its height to fastSmoothScroll's new getElementSize -
"the part of the element that has to end up in the middle". The date group
fallback is dropped for such a scroll, it would land on the group instead of
the text, so a match taller than the screen aligns at its start, the way
tdesktop's AdjustScrollForRange does it.
Nothing moves differently when the message fits the screen, when the match is
already within its first screenful, or when there is no match to find.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
morethanwords/tweb/master • b21491c • 300 files, +811/-800
Build
#webk
🫡3
UnigramDev/Unigram/playback-reconcile • 3b08a55 • 3 files, +323/-2
Keep the playlist in step with the chat and the profile
Chat playlists follow UpdateNewMessage, UpdateDeleteMessages and
UpdateMessageSendSucceeded; deleting the playing message skips to the
next one rather than letting it play out.
Profile audio has no such updates and only ever changes from the playback
popup, so the popup reports it, and an audio removed there plays on.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
Keep the playlist in step with the chat and the profile
Chat playlists follow UpdateNewMessage, UpdateDeleteMessages and
UpdateMessageSendSucceeded; deleting the playing message skips to the
next one rather than letting it play out.
Profile audio has no such updates and only ever changes from the playback
popup, so the popup reports it, and an audio removed there plays on.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
UnigramDev/Unigram/develop • 39ce27d • 1 files, +13/-3
Never lay out the incoming page from the navigated handler
Writing a scroll mode on a scroller that is already laid out reconfigures its
manipulation, and that runs a layout pass over the whole tree. The incoming page
is the frame content by then but NavigateToAsync has not activated it, so
ChatView was arranged without a view model: it threw, and the exception unwound
the navigation before anything could be activated.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 4878bfb • 2 files, +371/-52
Match Chrome's back gesture, in distance and in affordance
The pan commits at 30% of the display's larger edge rather than at a fixed 120,
which is what makes the distance feel the same whatever the window size, and the
first 60 DIPs only recognise the gesture. The chip is Chrome's: a 20-radius
circle over a ripple that grows to 40 and bursts to 48 on commit, travelling 146
with 72 of rubber band past it, inverting to the accent as it activates, and
retreating over a duration proportional to how far it came.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 4a16484 • 2 files, +63/-4
Size and load the chat search autocomplete from its own collection
The list is handed an empty collection that fills asynchronously, so a null
check on the source never saw a row: it now follows CollectionChanged too, and
starts the first page itself, since a collapsed list is never measured and its
panel never asks. Member rows are 44, not the 64 a ChatCell declares.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • a156a68 • 3 files, +101/-23
Snap a word or paragraph to the line the pointer is on
A paragraph break takes no rendered unit, so the end of a line and the start of
the next share an index: expanding from it always resolved to the following
paragraph, and a double tap on an empty line selected the next line's first
word. Hit-testing now reports which paragraph the point landed in, and reports
none for an empty line, where there is nothing to expand to.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 9147943 • 1 files, +61/-9
Show a hand cursor over an inline button
The I-beam was driven for anything that isn't a hyperlink, buttons included,
and a disabled button takes no pointer input at all, so the pointer fell
through to the text behind it: its wrapper now carries a transparent
background, and the negative margin with it, to cover what the button paints.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
Never lay out the incoming page from the navigated handler
Writing a scroll mode on a scroller that is already laid out reconfigures its
manipulation, and that runs a layout pass over the whole tree. The incoming page
is the frame content by then but NavigateToAsync has not activated it, so
ChatView was arranged without a view model: it threw, and the exception unwound
the navigation before anything could be activated.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 4878bfb • 2 files, +371/-52
Match Chrome's back gesture, in distance and in affordance
The pan commits at 30% of the display's larger edge rather than at a fixed 120,
which is what makes the distance feel the same whatever the window size, and the
first 60 DIPs only recognise the gesture. The chip is Chrome's: a 20-radius
circle over a ripple that grows to 40 and bursts to 48 on commit, travelling 146
with 72 of rubber band past it, inverting to the accent as it activates, and
retreating over a duration proportional to how far it came.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 4a16484 • 2 files, +63/-4
Size and load the chat search autocomplete from its own collection
The list is handed an empty collection that fills asynchronously, so a null
check on the source never saw a row: it now follows CollectionChanged too, and
starts the first page itself, since a collapsed list is never measured and its
panel never asks. Member rows are 44, not the 64 a ChatCell declares.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • a156a68 • 3 files, +101/-23
Snap a word or paragraph to the line the pointer is on
A paragraph break takes no rendered unit, so the end of a line and the start of
the next share an index: expanding from it always resolved to the following
paragraph, and a double tap on an empty line selected the next line's first
word. Hit-testing now reports which paragraph the point landed in, and reports
none for an empty line, where there is nothing to expand to.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 9147943 • 1 files, +61/-9
Show a hand cursor over an inline button
The I-beam was driven for anything that isn't a hyperlink, buttons included,
and a disabled button takes no pointer input at all, so the pointer fell
through to the text behind it: its wrapper now carries a transparent
background, and the negative margin with it, to cover what the button paints.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
UnigramDev/Unigram/develop • 03f39d7 • 1 files, +19/-4
Flatten an inline button's label as plain text
The label's own entities competed with the button entity over the same range,
and a run carrying both reports the inner type: a label of custom emoji
rendered as emoji, with no button around them.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 1ea35f4 • 1 files, +23/-2
Stop waiting for TDLib to transform a frame once the call is closing
Transform blocks a media thread until TDLib answers, and Dispose blocks TDLib's
update thread until tgcalls has stopped — and that is the thread the answer would
come from. A transform still waiting when Dispose runs holds the two against each
other, with the call window frozen behind the manager lock.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 1a017ae • 1 files, +45/-32
Stop the group call managers outside the manager lock
Stop waits for the tgcalls threads to wind down, and the UI thread sits on the
lock for as long as that takes, which is what freezes the call window while a
call is torn down. The lock only has to cover the fields: once they are null the
UI thread has nothing left to reach, and the instance the caller took out is its
own to stop.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • fbb0e7f • 1 files, +51/-23
Tear the group call managers down off TDLib's update thread
Stopping a manager waits for the tgcalls threads behind it, and one of those can
be waiting on a request whose answer arrives on the very thread Dispose runs on.
EndScreenSharing has the mirror problem: called from the UI thread, it held the
window for the whole teardown.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 3f8a338 • 2 files, +9/-2
Fix the order and the icons of the group call participant list
A participant moving down the list was inserted one place too low, since the
index was measured before the removal shifted everything after it. Sorting only
looked right for participants moving up, and the list drifts as people speak.
The icon for someone sharing a screen but no camera was behind a condition that
repeated the one above it, so the row kept whatever the recycled container had.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
Flatten an inline button's label as plain text
The label's own entities competed with the button entity over the same range,
and a run carrying both reports the inner type: a label of custom emoji
rendered as emoji, with no button around them.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 1ea35f4 • 1 files, +23/-2
Stop waiting for TDLib to transform a frame once the call is closing
Transform blocks a media thread until TDLib answers, and Dispose blocks TDLib's
update thread until tgcalls has stopped — and that is the thread the answer would
come from. A transform still waiting when Dispose runs holds the two against each
other, with the call window frozen behind the manager lock.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 1a017ae • 1 files, +45/-32
Stop the group call managers outside the manager lock
Stop waits for the tgcalls threads to wind down, and the UI thread sits on the
lock for as long as that takes, which is what freezes the call window while a
call is torn down. The lock only has to cover the fields: once they are null the
UI thread has nothing left to reach, and the instance the caller took out is its
own to stop.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • fbb0e7f • 1 files, +51/-23
Tear the group call managers down off TDLib's update thread
Stopping a manager waits for the tgcalls threads behind it, and one of those can
be waiting on a request whose answer arrives on the very thread Dispose runs on.
EndScreenSharing has the mirror problem: called from the UI thread, it held the
window for the whole teardown.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 3f8a338 • 2 files, +9/-2
Fix the order and the icons of the group call participant list
A participant moving down the list was inserted one place too low, since the
index was measured before the removal shifted everything after it. Sorting only
looked right for participants moving up, and the list drifts as people speak.
The icon for someone sharing a screen but no camera was behind a condition that
repeated the one above it, so the row kept whatever the recycled container had.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
UnigramDev/Unigram/develop • 53f18ac • 1 files, +13/-2
Take the video list down with the pinned cell it belongs to
The list exists to hold the videos the pinned cell covers, so when that cell goes
away the grid lays them out again while the list still holds them, and every
remaining participant shows up twice. Clearing the pin was not enough: nothing
tore the list down, and the participant rows stayed hidden with it.
LoadVideoInfo replays every participant, which could put the pinned endpoint in
the list the same way.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • bf72417 • 1 files, +67/-14
Pin a shared screen without being asked to
A screen share takes the pinned slot as it arrives, and again if the pinned cell
goes away while another one is running. One automatic pin replaces another, but a
cell the user pinned themselves is never taken over.
Selecting a cell moves out of the click handler, since both paths need it. The
only difference is that an automatic pin does not scroll the compact list to the
top, which would move it under whoever is reading it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 49d97ae • 1 files, +8/-0
Let a new back gesture take the chip from a burst still playing
The burst animates the chip's opacity to zero, and a property under a running
animation ignores direct writes, so the next gesture's reset was dropped and the
burst left the chip hidden for the whole of it - while the tracker carried the
gesture through to the navigation regardless.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
Take the video list down with the pinned cell it belongs to
The list exists to hold the videos the pinned cell covers, so when that cell goes
away the grid lays them out again while the list still holds them, and every
remaining participant shows up twice. Clearing the pin was not enough: nothing
tore the list down, and the participant rows stayed hidden with it.
LoadVideoInfo replays every participant, which could put the pinned endpoint in
the list the same way.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • bf72417 • 1 files, +67/-14
Pin a shared screen without being asked to
A screen share takes the pinned slot as it arrives, and again if the pinned cell
goes away while another one is running. One automatic pin replaces another, but a
cell the user pinned themselves is never taken over.
Selecting a cell moves out of the click handler, since both paths need it. The
only difference is that an automatic pin does not scroll the compact list to the
top, which would move it under whoever is reading it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
UnigramDev/Unigram/develop • 49d97ae • 1 files, +8/-0
Let a new back gesture take the chip from a burst still playing
The burst animates the chip's opacity to zero, and a property under a running
animation ignores direct writes, so the next gesture's reset was dropped and the
burst left the chip hidden for the whole of it - while the tracker carried the
gesture through to the navigation regardless.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
UnigramDev/Unigram/playback-shuffle • e6346dd • 3 files, +215/-36
Implement shuffle
The button existed in two places and set IsReversed, since shuffle itself
was never written. It now walks a fixed shuffled order, so Previous goes
back to what was actually heard, and pages loaded later are folded into
the part not yet played.
Paging is measured against the playlist rather than the order being
walked, which shuffle reaches the ends of in no particular order.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
Implement shuffle
The button existed in two places and set IsReversed, since shuffle itself
was never written. It now walks a fixed shuffled order, so Previous goes
back to what was actually heard, and pages loaded later are folded into
the part not yet played.
Paging is measured against the playlist rather than the order being
walked, which shuffle reaches the ends of in no particular order.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
telegramdesktop/tdesktop/nightly • 565c076 • 5 files, +2/-67
Removed protobuf dependency from cld3 and build recipes.
#tdesktop
Removed protobuf dependency from cld3 and build recipes.
#tdesktop
🫡3
telegramdesktop/tdesktop/nightly • af5bb1b • 1 files, +2/-0
Enabled LTO in Release configuration on Windows CI.
#tdesktop
Enabled LTO in Release configuration on Windows CI.
#tdesktop
🫡3
telegramdesktop/tdesktop/nightly • 37b4ed4 • 1 files, +24/-11
Switched macOS CI to Release build with LTO on nightly.
#tdesktop
Switched macOS CI to Release build with LTO on nightly.
#tdesktop
🫡3
UnigramDev/Unigram/develop • ffdc081 • 5 files, +31/-23
Update emoji to Unicode 17.0
UnigramDev/Unigram/develop • 37b0fc4 • 1 files, +0/-0
Trim emoji font size
UnigramDev/Unigram/develop • 6b4b9cd • 1 files, +3/-3
Fix shift when sending a message after many unread messages
UnigramDev/Unigram/develop • 761ab7b • 1 files, +1/-0
Clear children before add
#unigram
Update emoji to Unicode 17.0
UnigramDev/Unigram/develop • 37b0fc4 • 1 files, +0/-0
Trim emoji font size
UnigramDev/Unigram/develop • 6b4b9cd • 1 files, +3/-3
Fix shift when sending a message after many unread messages
UnigramDev/Unigram/develop • 761ab7b • 1 files, +1/-0
Clear children before add
#unigram
UnigramDev/Unigram/record-start-on-press • 51b52ea • 1 files, +19/-0
Note the sixty-second pause and message drafts as todo
The official apps stop at sixty seconds and show the pause UI rather than
sending, which 4.3 does not, and they keep an unsent recording as a draft,
which Unigram has no notion of.
UnigramDev/Unigram/record-start-on-press • 0889840 • 1 files, +4/-0
Note that the sixty-second stop cannot be resumed from
The limit reuses the pause UI, but a video message gets no more time, so the
pause button has to go rather than offer its resume glyph.
UnigramDev/Unigram/record-start-on-press • e892215 • 1 files, +3/-10
Drop two flags the timer and the session already answer for
_recordAudioVideoRunnableStarted said what _timer.IsEnabled says, and
_calledRecordRunnable was only ever read where a recording exists, which the
session knows.
UnigramDev/Unigram/record-start-on-press • 4da4557 • 1 files, +8/-1
Don't record for a press that was let go while rights were checked
The check is awaited between the press and the timer, so a release during it
left the press running: the timer started with no pointer down, and a recording
began three hundred milliseconds later that nobody was holding.
UnigramDev/Unigram/record-start-on-press • 3069c66 • 1 files, +21/-4
Close off opening the device on the press
Warming the device up under the hold timer works, but it marks the microphone
and the camera as accessed for a tap that only switches mode, and lights the
privacy LED on hardware that has one. Written down so it isn't tried again.
#unigram
Note the sixty-second pause and message drafts as todo
The official apps stop at sixty seconds and show the pause UI rather than
sending, which 4.3 does not, and they keep an unsent recording as a draft,
which Unigram has no notion of.
UnigramDev/Unigram/record-start-on-press • 0889840 • 1 files, +4/-0
Note that the sixty-second stop cannot be resumed from
The limit reuses the pause UI, but a video message gets no more time, so the
pause button has to go rather than offer its resume glyph.
UnigramDev/Unigram/record-start-on-press • e892215 • 1 files, +3/-10
Drop two flags the timer and the session already answer for
_recordAudioVideoRunnableStarted said what _timer.IsEnabled says, and
_calledRecordRunnable was only ever read where a recording exists, which the
session knows.
UnigramDev/Unigram/record-start-on-press • 4da4557 • 1 files, +8/-1
Don't record for a press that was let go while rights were checked
The check is awaited between the press and the timer, so a release during it
left the press running: the timer started with no pointer down, and a recording
began three hundred milliseconds later that nobody was holding.
UnigramDev/Unigram/record-start-on-press • 3069c66 • 1 files, +21/-4
Close off opening the device on the press
Warming the device up under the hold timer works, but it marks the microphone
and the camera as accessed for a tap that only switches mode, and lights the
privacy LED on hardware that has one. Written down so it isn't tried again.
#unigram
UnigramDev/Unigram/develop • cf37ec8 • 1 files, +19/-0
Note the sixty-second pause and message drafts as todo
The official apps stop at sixty seconds and show the pause UI rather than
sending, which 4.3 does not, and they keep an unsent recording as a draft,
which Unigram has no notion of.
UnigramDev/Unigram/develop • 134180d • 1 files, +4/-0
Note that the sixty-second stop cannot be resumed from
The limit reuses the pause UI, but a video message gets no more time, so the
pause button has to go rather than offer its resume glyph.
UnigramDev/Unigram/develop • e71214d • 1 files, +3/-10
Drop two flags the timer and the session already answer for
_recordAudioVideoRunnableStarted said what _timer.IsEnabled says, and
_calledRecordRunnable was only ever read where a recording exists, which the
session knows.
UnigramDev/Unigram/develop • 57630df • 1 files, +8/-1
Don't record for a press that was let go while rights were checked
The check is awaited between the press and the timer, so a release during it
left the press running: the timer started with no pointer down, and a recording
began three hundred milliseconds later that nobody was holding.
UnigramDev/Unigram/develop • 86ad43f • 1 files, +21/-4
Close off opening the device on the press
Warming the device up under the hold timer works, but it marks the microphone
and the camera as accessed for a tap that only switches mode, and lights the
privacy LED on hardware that has one. Written down so it isn't tried again.
#unigram
Note the sixty-second pause and message drafts as todo
The official apps stop at sixty seconds and show the pause UI rather than
sending, which 4.3 does not, and they keep an unsent recording as a draft,
which Unigram has no notion of.
UnigramDev/Unigram/develop • 134180d • 1 files, +4/-0
Note that the sixty-second stop cannot be resumed from
The limit reuses the pause UI, but a video message gets no more time, so the
pause button has to go rather than offer its resume glyph.
UnigramDev/Unigram/develop • e71214d • 1 files, +3/-10
Drop two flags the timer and the session already answer for
_recordAudioVideoRunnableStarted said what _timer.IsEnabled says, and
_calledRecordRunnable was only ever read where a recording exists, which the
session knows.
UnigramDev/Unigram/develop • 57630df • 1 files, +8/-1
Don't record for a press that was let go while rights were checked
The check is awaited between the press and the timer, so a release during it
left the press running: the timer started with no pointer down, and a recording
began three hundred milliseconds later that nobody was holding.
UnigramDev/Unigram/develop • 86ad43f • 1 files, +21/-4
Close off opening the device on the press
Warming the device up under the hold timer works, but it marks the microphone
and the camera as accessed for a tap that only switches mode, and lights the
privacy LED on hardware that has one. Written down so it isn't tried again.
#unigram
telegramdesktop/tdesktop/nightly • 74da0c3 • 1 files, +30/-1
Enabled LTO in Release configuration on Windows CI.
telegramdesktop/tdesktop/nightly • f7c7386 • 1 files, +24/-11
Switched macOS CI to Release build with LTO on nightly.
#tdesktop
Enabled LTO in Release configuration on Windows CI.
telegramdesktop/tdesktop/nightly • f7c7386 • 1 files, +24/-11
Switched macOS CI to Release build with LTO on nightly.
#tdesktop
🫡3
telegramdesktop/tdesktop/nightly • 9ac4970 • 1 files, +35/-1
Enabled LTO in Release configuration on Windows CI.
telegramdesktop/tdesktop/nightly • eb2a3dc • 1 files, +24/-11
Switched macOS CI to Release build with LTO on nightly.
#tdesktop
Enabled LTO in Release configuration on Windows CI.
telegramdesktop/tdesktop/nightly • eb2a3dc • 1 files, +24/-11
Switched macOS CI to Release build with LTO on nightly.
#tdesktop
🫡3
telegramdesktop/tdesktop/nightly • 396ada1 • 1 files, +38/-1
Enabled LTO in Release configuration on Windows CI.
telegramdesktop/tdesktop/nightly • 6cda4dd • 1 files, +24/-11
Switched macOS CI to Release build with LTO on nightly.
#tdesktop
Enabled LTO in Release configuration on Windows CI.
telegramdesktop/tdesktop/nightly • 6cda4dd • 1 files, +24/-11
Switched macOS CI to Release build with LTO on nightly.
#tdesktop
🫡3
telegramdesktop/tdesktop/nightly • 4f1f0f5 • 3 files, +138/-1
Added packing of Lottie animations into tgs at build time.
telegramdesktop/tdesktop/nightly • 567462e • 226 files, +1071/-112
Replaced animation tgs blobs with plain json sources.
#tdesktop
Added packing of Lottie animations into tgs at build time.
telegramdesktop/tdesktop/nightly • 567462e • 226 files, +1071/-112
Replaced animation tgs blobs with plain json sources.
#tdesktop
🫡2
UnigramDev/Unigram/develop • ec0529b • 1 files, +0/-0
Fix space char in emoji font
UnigramDev/Unigram/develop • b9ed1af • 1 files, +4/-1
Normalize log tail
UnigramDev/Unigram/develop • 1914371 • 1 files, +18/-2
Log focus manager exceptions
UnigramDev/Unigram/develop • 7189e2b • 1 files, +16/-0
Try to park window focus before swapping content
UnigramDev/Unigram/develop • 9d60582 • 1 files, +4/-1
Enable bubble tails only in high performance mode
UnigramDev/Unigram/develop • c3cdae3 • 1 files, +1/-1
Don't ignore source ImageBrush
UnigramDev/Unigram/develop • a99cbaf • 31 files, +222/-87
Update TDLib
UnigramDev/Unigram/develop • 0907419 • 3 files, +11/-12
Update webrtc to the 2026-08-19 archives, built with Visual Studio 18
UnigramDev/Unigram/develop • 6fcff0b • 6 files, +29/-0
Split generators into two projects
UnigramDev/Unigram/develop • 6fb1c62 • 10 files, +230/-64
Support message ephemeral content
UnigramDev/Unigram/develop • a2e5b96 • 6 files, +63/-6
Handle unsupported rich message blocks
UnigramDev/Unigram/develop • c2b0239 • 1 files, +24/-0
Store community full info
UnigramDev/Unigram/develop • a16508c • 1 files, +3/-0
Unsubscribe events on unlock
UnigramDev/Unigram/develop • dafbee5 • 1 files, +7/-3
Fix VideoAnimation getting stuck on read loop
UnigramDev/Unigram/develop • 0769a06 • 1 files, +6/-1
Capture RPC_E_WRONG_THREAD too
#unigram
Fix space char in emoji font
UnigramDev/Unigram/develop • b9ed1af • 1 files, +4/-1
Normalize log tail
UnigramDev/Unigram/develop • 1914371 • 1 files, +18/-2
Log focus manager exceptions
UnigramDev/Unigram/develop • 7189e2b • 1 files, +16/-0
Try to park window focus before swapping content
UnigramDev/Unigram/develop • 9d60582 • 1 files, +4/-1
Enable bubble tails only in high performance mode
UnigramDev/Unigram/develop • c3cdae3 • 1 files, +1/-1
Don't ignore source ImageBrush
UnigramDev/Unigram/develop • a99cbaf • 31 files, +222/-87
Update TDLib
UnigramDev/Unigram/develop • 0907419 • 3 files, +11/-12
Update webrtc to the 2026-08-19 archives, built with Visual Studio 18
UnigramDev/Unigram/develop • 6fcff0b • 6 files, +29/-0
Split generators into two projects
UnigramDev/Unigram/develop • 6fb1c62 • 10 files, +230/-64
Support message ephemeral content
UnigramDev/Unigram/develop • a2e5b96 • 6 files, +63/-6
Handle unsupported rich message blocks
UnigramDev/Unigram/develop • c2b0239 • 1 files, +24/-0
Store community full info
UnigramDev/Unigram/develop • a16508c • 1 files, +3/-0
Unsubscribe events on unlock
UnigramDev/Unigram/develop • dafbee5 • 1 files, +7/-3
Fix VideoAnimation getting stuck on read loop
UnigramDev/Unigram/develop • 0769a06 • 1 files, +6/-1
Capture RPC_E_WRONG_THREAD too
#unigram
UnigramDev/Unigram/develop • ba5dbcb • 13 files, +1220/-43
Animate deleted messages coming apart
A frozen visual surface captures at the compositor commit that follows the
freeze, so the view's mirror holds a removal back for one frame to give it one.
The view model applies updateDeleteMessages unchanged.
IsInitial becomes AnimationState, which is also how the view tells a deletion
from a row leaving the list for any other reason. The renderer is a diagnostics
setting, off by default in the Store build.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
UnigramDev/Unigram/develop • c290b37 • 1 files, +8/-1
Try to fix null ref
UnigramDev/Unigram/develop • 24927ab • 1 files, +73/-9
Park focus asynchronously when swapping window content
Control.Focus answers before the focus pipeline has run, and reports success
even when a LosingFocus handler cancels the move underneath it. Focus stayed
on the passcode field, which was then detached with it, leaving the focus
manager pointing at an element XAML can no longer resolve a peer for.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#unigram
Animate deleted messages coming apart
A frozen visual surface captures at the compositor commit that follows the
freeze, so the view's mirror holds a removal back for one frame to give it one.
The view model applies updateDeleteMessages unchanged.
IsInitial becomes AnimationState, which is also how the view tells a deletion
from a row leaving the list for any other reason. The renderer is a diagnostics
setting, off by default in the Store build.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
UnigramDev/Unigram/develop • c290b37 • 1 files, +8/-1
Try to fix null ref
UnigramDev/Unigram/develop • 24927ab • 1 files, +73/-9
Park focus asynchronously when swapping window content
Control.Focus answers before the focus pipeline has run, and reports success
even when a LosingFocus handler cancels the move underneath it. Focus stayed
on the passcode field, which was then detached with it, leaving the focus
manager pointing at an element XAML can no longer resolve a peer for.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#unigram
Ajaxy/telegram-tt/master • b70a9f3 • 3 files, +4/-4
12.0.40
Ajaxy/telegram-tt/master • 00b3e6c • 28 files, +627/-17
Profile: Add "Playlist" tab with saved music
Lists the music a peer has added to their profile, next to Posts and Gifts
and ahead of the shared media tabs. The tab is shown when `userFull` reports
saved music, so it costs no extra request.
Tracks come from `users.getSavedMusic` as bare documents, so they are played
inline through their own `savedMusic` track queue, which advances in listing
order. `TrackId` accepts document-based ids alongside message-based ones, and
file references are repaired via `users.getSavedMusicByID`.
Also keeps the current user's own playlist in step with "Add to Profile", so
toggling does not need a refetch.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ajaxy/telegram-tt/master • a91fb87 • 2 files, +8/-1
Modals: Fix link overflow for modal windows (#7216)
Ajaxy/telegram-tt/master • a821d5d • 5 files, +47/-22
TLottie: Bump renderer (#7227)
Ajaxy/telegram-tt/master • 81fe0ff • 80 files, +4141/-1446
Emoji Picker: Add search (#7210)
Ajaxy/telegram-tt/master • 4542449 • 1 files, +5/-1
Round Video: Fix width (#7226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Ajaxy/telegram-tt/master • 8b63941 • 144 files, +593/-569
[Build]
#webz
12.0.40
Ajaxy/telegram-tt/master • 00b3e6c • 28 files, +627/-17
Profile: Add "Playlist" tab with saved music
Lists the music a peer has added to their profile, next to Posts and Gifts
and ahead of the shared media tabs. The tab is shown when `userFull` reports
saved music, so it costs no extra request.
Tracks come from `users.getSavedMusic` as bare documents, so they are played
inline through their own `savedMusic` track queue, which advances in listing
order. `TrackId` accepts document-based ids alongside message-based ones, and
file references are repaired via `users.getSavedMusicByID`.
Also keeps the current user's own playlist in step with "Add to Profile", so
toggling does not need a refetch.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ajaxy/telegram-tt/master • a91fb87 • 2 files, +8/-1
Modals: Fix link overflow for modal windows (#7216)
Ajaxy/telegram-tt/master • a821d5d • 5 files, +47/-22
TLottie: Bump renderer (#7227)
Ajaxy/telegram-tt/master • 81fe0ff • 80 files, +4141/-1446
Emoji Picker: Add search (#7210)
Ajaxy/telegram-tt/master • 4542449 • 1 files, +5/-1
Round Video: Fix width (#7226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Ajaxy/telegram-tt/master • 8b63941 • 144 files, +593/-569
[Build]
#webz