telegramdesktop/tdesktop/dev • cd43bca • 2 files, +38/-9
Fixed losing active profile tab on message edit.
telegramdesktop/tdesktop/dev • 2139ef0 • 1 files, +2/-0
Added restoring of chosen profile tab after it hides.
telegramdesktop/tdesktop/dev • d32499d • 1 files, +9/-2
Disabled unsupported formatting in poll question and answers.
telegramdesktop/tdesktop/dev • 5fe465b • 7 files, +90/-40
Fixed reverse focus order on Shift+Tab in input fields.
telegramdesktop/tdesktop/dev • 2bc48fb • 11 files, +391/-5
Added pasting of spreadsheet tables into article editor.
telegramdesktop/tdesktop/dev • 199c039 • 1 files, +1/-1
Fixed clipped caret at end of long line in input fields.
telegramdesktop/tdesktop/dev • 6af3039 • 1 files, +23/-12
Replaced pill tabs with profile tabs strip in peer color box.
telegramdesktop/tdesktop/dev • a4bca94 • 1 files, +6/-3
Fixed ripple shape of forum userpic buttons.
telegramdesktop/tdesktop/dev • c92d390 • 1 files, +6/-4
Fixed open photo action display for peers without photo.
telegramdesktop/tdesktop/dev • 5e90a11 • 3 files, +6/-5
[img-editor] Fixed userpic crop shape for communities.
telegramdesktop/tdesktop/dev • 51185c4 • 3 files, +6/-1
Added icon for remove from community button in edit peer community box.
telegramdesktop/tdesktop/dev • 2dda1fd • 1 files, +15/-0
Added arrow to linked community row in edit peer info box.
telegramdesktop/tdesktop/dev • 804d610 • 2 files, +33/-16
Added helpers for enabling and disabling auto-download by source.
#tdesktop
Fixed losing active profile tab on message edit.
telegramdesktop/tdesktop/dev • 2139ef0 • 1 files, +2/-0
Added restoring of chosen profile tab after it hides.
telegramdesktop/tdesktop/dev • d32499d • 1 files, +9/-2
Disabled unsupported formatting in poll question and answers.
telegramdesktop/tdesktop/dev • 5fe465b • 7 files, +90/-40
Fixed reverse focus order on Shift+Tab in input fields.
telegramdesktop/tdesktop/dev • 2bc48fb • 11 files, +391/-5
Added pasting of spreadsheet tables into article editor.
telegramdesktop/tdesktop/dev • 199c039 • 1 files, +1/-1
Fixed clipped caret at end of long line in input fields.
telegramdesktop/tdesktop/dev • 6af3039 • 1 files, +23/-12
Replaced pill tabs with profile tabs strip in peer color box.
telegramdesktop/tdesktop/dev • a4bca94 • 1 files, +6/-3
Fixed ripple shape of forum userpic buttons.
telegramdesktop/tdesktop/dev • c92d390 • 1 files, +6/-4
Fixed open photo action display for peers without photo.
telegramdesktop/tdesktop/dev • 5e90a11 • 3 files, +6/-5
[img-editor] Fixed userpic crop shape for communities.
telegramdesktop/tdesktop/dev • 51185c4 • 3 files, +6/-1
Added icon for remove from community button in edit peer community box.
telegramdesktop/tdesktop/dev • 2dda1fd • 1 files, +15/-0
Added arrow to linked community row in edit peer info box.
telegramdesktop/tdesktop/dev • 804d610 • 2 files, +33/-16
Added helpers for enabling and disabling auto-download by source.
#tdesktop
🫡2🤨1
telegramdesktop/tdesktop/dev • eeb3e7c • 2 files, +66/-0
Added separated toggle helper for settings buttons.
telegramdesktop/tdesktop/dev • 009ae7d • 1 files, +74/-28
Added master toggles to auto-download rows in advanced settings.
telegramdesktop/tdesktop/dev • 175b900 • 1 files, +35/-4
Fixed rounding of top corners in scrolled cocoon box.
telegramdesktop/tdesktop/dev • 6a90ccd • 2 files, +22/-5
Added community userpic to chats list top bar.
telegramdesktop/tdesktop/dev • 852d968 • 3 files, +17/-2
Decreased size in style for userpic from community top bar.
telegramdesktop/tdesktop/dev • 2002c1c • 6 files, +214/-66
Added pasting of rich HTML blocks into article editor.
telegramdesktop/tdesktop/dev • bc7b646 • 2 files, +4/-1
Added anchors and quote captions to article editor HTML import.
telegramdesktop/tdesktop/dev • d018ef9 • 3 files, +36/-39
Allowed AI creation without premium in article editor.
telegramdesktop/tdesktop/dev • 732e48a • 1 files, +8/-1
Added submit way support to prompt field in AI creation box.
telegramdesktop/tdesktop/dev • 44e2551 • 3 files, +41/-3
Added showing of error popup service notifications in article window.
telegramdesktop/tdesktop/dev • 8677d91 • 2 files, +14/-2
Added bottom outer corners painting toggle to labeled emoji tabs.
telegramdesktop/tdesktop/dev • c459690 • 2 files, +23/-8
Added single use tone api support to AI compose requests.
telegramdesktop/tdesktop/dev • 58e1eb7 • 6 files, +325/-52
Added prompt tab with custom prompt field to AI editor.
#tdesktop
Added separated toggle helper for settings buttons.
telegramdesktop/tdesktop/dev • 009ae7d • 1 files, +74/-28
Added master toggles to auto-download rows in advanced settings.
telegramdesktop/tdesktop/dev • 175b900 • 1 files, +35/-4
Fixed rounding of top corners in scrolled cocoon box.
telegramdesktop/tdesktop/dev • 6a90ccd • 2 files, +22/-5
Added community userpic to chats list top bar.
telegramdesktop/tdesktop/dev • 852d968 • 3 files, +17/-2
Decreased size in style for userpic from community top bar.
telegramdesktop/tdesktop/dev • 2002c1c • 6 files, +214/-66
Added pasting of rich HTML blocks into article editor.
telegramdesktop/tdesktop/dev • bc7b646 • 2 files, +4/-1
Added anchors and quote captions to article editor HTML import.
telegramdesktop/tdesktop/dev • d018ef9 • 3 files, +36/-39
Allowed AI creation without premium in article editor.
telegramdesktop/tdesktop/dev • 732e48a • 1 files, +8/-1
Added submit way support to prompt field in AI creation box.
telegramdesktop/tdesktop/dev • 44e2551 • 3 files, +41/-3
Added showing of error popup service notifications in article window.
telegramdesktop/tdesktop/dev • 8677d91 • 2 files, +14/-2
Added bottom outer corners painting toggle to labeled emoji tabs.
telegramdesktop/tdesktop/dev • c459690 • 2 files, +23/-8
Added single use tone api support to AI compose requests.
telegramdesktop/tdesktop/dev • 58e1eb7 • 6 files, +325/-52
Added prompt tab with custom prompt field to AI editor.
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • deb3677 • 4 files, +48/-30
Extracted rich draft clearing from rich editor migration.
telegramdesktop/tdesktop/dev • 96d58e6 • 6 files, +146/-0
Added discard button to rich message draft in composer.
telegramdesktop/tdesktop/dev • 684017e • 2 files, +36/-12
Added wrapping of size limit label in export settings.
telegramdesktop/tdesktop/dev • 654b6d1 • 3 files, +19/-1
Added extra export panel height for wrapped size limit label.
telegramdesktop/tdesktop/dev • fd7052e • 1 files, +3/-1
Added layer guard for context menu in media view overlay widget.
telegramdesktop/tdesktop/dev • dbf47a6 • 2 files, +5/-0
Added context menu propagation guard to tabbed selector.
telegramdesktop/tdesktop/dev • e444d5a • 3 files, +9/-1
Added effects panel style override to send menu details.
telegramdesktop/tdesktop/dev • fb08f95 • 3 files, +4/-1
Added contextual icon for gif caption item in gifs list menu.
telegramdesktop/tdesktop/dev • 90736a7 • 5 files, +39/-13
Added contextual styles to sticker set and emoji list menus.
telegramdesktop/tdesktop/dev • deb6b61 • 4 files, +5/-2
Added contextual ripple to search shortcut packs in tabbed panel.
telegramdesktop/tdesktop/dev • 66a7790 • 3 files, +19/-6
Added contextual style to reset recents item in emoji menu.
telegramdesktop/tdesktop/dev • 5c0660e • 2 files, +4/-3
Added open sets feature guard to sticker set creator badge.
telegramdesktop/tdesktop/dev • 8f30928 • 2 files, +4/-3
Fixed voice record bar shape in stories compose controls.
#tdesktop
Extracted rich draft clearing from rich editor migration.
telegramdesktop/tdesktop/dev • 96d58e6 • 6 files, +146/-0
Added discard button to rich message draft in composer.
telegramdesktop/tdesktop/dev • 684017e • 2 files, +36/-12
Added wrapping of size limit label in export settings.
telegramdesktop/tdesktop/dev • 654b6d1 • 3 files, +19/-1
Added extra export panel height for wrapped size limit label.
telegramdesktop/tdesktop/dev • fd7052e • 1 files, +3/-1
Added layer guard for context menu in media view overlay widget.
telegramdesktop/tdesktop/dev • dbf47a6 • 2 files, +5/-0
Added context menu propagation guard to tabbed selector.
telegramdesktop/tdesktop/dev • e444d5a • 3 files, +9/-1
Added effects panel style override to send menu details.
telegramdesktop/tdesktop/dev • fb08f95 • 3 files, +4/-1
Added contextual icon for gif caption item in gifs list menu.
telegramdesktop/tdesktop/dev • 90736a7 • 5 files, +39/-13
Added contextual styles to sticker set and emoji list menus.
telegramdesktop/tdesktop/dev • deb6b61 • 4 files, +5/-2
Added contextual ripple to search shortcut packs in tabbed panel.
telegramdesktop/tdesktop/dev • 66a7790 • 3 files, +19/-6
Added contextual style to reset recents item in emoji menu.
telegramdesktop/tdesktop/dev • 5c0660e • 2 files, +4/-3
Added open sets feature guard to sticker set creator badge.
telegramdesktop/tdesktop/dev • 8f30928 • 2 files, +4/-3
Fixed voice record bar shape in stories compose controls.
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • 4e60982 • 1 files, +6/-2
Fixed crash on tab switching in tabbed selector.
#tdesktop
Fixed crash on tab switching in tabbed selector.
#tdesktop
🫡2
telegramdesktop/tdesktop/dev • 97fe436 • 1 files, +11/-2
Preserve video progress clipping in slideshows
Task: 2026/08/04/clip-slideshow-video-progress-during-transitions
telegramdesktop/tdesktop/dev • 49d0922 • 1 files, +1/-1
[ai] Correct style built-in type documentation
Task: 2026/08/04/correct-style-builtin-type-docs
telegramdesktop/tdesktop/dev • 92877af • 1 files, +18/-10
[ai] Default test interface scale per run
Task: 2026/08/04/default-test-interface-scale-per-run
telegramdesktop/tdesktop/dev • 058b9fe • 1 files, +1/-1
Document hidden RpWidget geometry event deferral
Task: 2026/08/04/mark-hidden-widget-width-trap
telegramdesktop/tdesktop/dev • 194d4b2 • 1 files, +1/-1
Track generated and third-party header dependencies
Task: 2026/08/04/track-headers-at-three-system-include-sites
telegramdesktop/tdesktop/dev • f56f7f7 • 1 files, +9/-0
Suppress MicroTeX reorder warnings in td_iv builds
Task: 2026/08/04/track-headers-at-three-system-include-sites
telegramdesktop/tdesktop/dev • 8e921d1 • 2 files, +13/-1
Order MicroTeX suppressions after MSVC enablers
Task: 2026/08/05/order-microtex-msvc-suppressions-after-enablers
#tdesktop
Preserve video progress clipping in slideshows
Task: 2026/08/04/clip-slideshow-video-progress-during-transitions
telegramdesktop/tdesktop/dev • 49d0922 • 1 files, +1/-1
[ai] Correct style built-in type documentation
Task: 2026/08/04/correct-style-builtin-type-docs
telegramdesktop/tdesktop/dev • 92877af • 1 files, +18/-10
[ai] Default test interface scale per run
Task: 2026/08/04/default-test-interface-scale-per-run
telegramdesktop/tdesktop/dev • 058b9fe • 1 files, +1/-1
Document hidden RpWidget geometry event deferral
Task: 2026/08/04/mark-hidden-widget-width-trap
telegramdesktop/tdesktop/dev • 194d4b2 • 1 files, +1/-1
Track generated and third-party header dependencies
Task: 2026/08/04/track-headers-at-three-system-include-sites
telegramdesktop/tdesktop/dev • f56f7f7 • 1 files, +9/-0
Suppress MicroTeX reorder warnings in td_iv builds
Task: 2026/08/04/track-headers-at-three-system-include-sites
telegramdesktop/tdesktop/dev • 8e921d1 • 2 files, +13/-1
Order MicroTeX suppressions after MSVC enablers
Task: 2026/08/05/order-microtex-msvc-suppressions-after-enablers
#tdesktop
🫡4
🫡3
New telegramdesktop/tdesktop release:
- Add saving rich messages to HTML and importing them back.
- Add custom prompt tab to AI editing in the article editor.
- Add experimental Vulkan rendering option on Linux.
- Crash fixes.
#tdesktop
v7.0.9 (stable)- Add saving rich messages to HTML and importing them back.
- Add custom prompt tab to AI editing in the article editor.
- Add experimental Vulkan rendering option on Linux.
- Crash fixes.
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • 90ca232 • 8 files, +304/-18
Added external task entries to downloads manager.
telegramdesktop/tdesktop/dev • 2e457a8 • 11 files, +2440/-0
Added rich message saving to HTML.
telegramdesktop/tdesktop/dev • e177d7f • 8 files, +603/-31
Added rich message import from exported HTML.
telegramdesktop/tdesktop/dev • 3a03bd7 • 1 files, +59/-28
Added regrouping of mixed media selections in rich message editor.
telegramdesktop/tdesktop/dev • 8b54d62 • 1 files, +10/-0
Added group type switch to grouped media context menu.
telegramdesktop/tdesktop/dev • 5f50566 • 3 files, +89/-0
Added ungrouping of grouped media to selection context menu.
telegramdesktop/tdesktop/dev • 580a6e5 • 1 files, +5/-1
Fixed userpic flicker in mentions autocomplete on every typed character.
telegramdesktop/tdesktop/dev • 33f38da • 2 files, +13/-2
Fixed clipped collapsed badge for large counts in emoji list widget.
telegramdesktop/tdesktop/dev • 9e2ff91 • 8 files, +173/-17
Added keep aspect ratio toggle to sticker creation editor.
telegramdesktop/tdesktop/dev • 40751b4 • 1 files, +1/-1
Fix libvpx build with nasm.
telegramdesktop/tdesktop/dev • 91303da • 6 files, +89/-44
Fix possible crash in miniapps.
telegramdesktop/tdesktop/dev • f931072 • 2 files, +3/-1
Fix build with MSVC.
telegramdesktop/tdesktop/dev • e45d60d • 6 files, +105/-30
Add some hardenings to blocking popups.
telegramdesktop/tdesktop/dev • 3ec91b5 • 2 files, +0/-14
Fix build with GCC.
#tdesktop
Added external task entries to downloads manager.
telegramdesktop/tdesktop/dev • 2e457a8 • 11 files, +2440/-0
Added rich message saving to HTML.
telegramdesktop/tdesktop/dev • e177d7f • 8 files, +603/-31
Added rich message import from exported HTML.
telegramdesktop/tdesktop/dev • 3a03bd7 • 1 files, +59/-28
Added regrouping of mixed media selections in rich message editor.
telegramdesktop/tdesktop/dev • 8b54d62 • 1 files, +10/-0
Added group type switch to grouped media context menu.
telegramdesktop/tdesktop/dev • 5f50566 • 3 files, +89/-0
Added ungrouping of grouped media to selection context menu.
telegramdesktop/tdesktop/dev • 580a6e5 • 1 files, +5/-1
Fixed userpic flicker in mentions autocomplete on every typed character.
telegramdesktop/tdesktop/dev • 33f38da • 2 files, +13/-2
Fixed clipped collapsed badge for large counts in emoji list widget.
telegramdesktop/tdesktop/dev • 9e2ff91 • 8 files, +173/-17
Added keep aspect ratio toggle to sticker creation editor.
telegramdesktop/tdesktop/dev • 40751b4 • 1 files, +1/-1
Fix libvpx build with nasm.
telegramdesktop/tdesktop/dev • 91303da • 6 files, +89/-44
Fix possible crash in miniapps.
telegramdesktop/tdesktop/dev • f931072 • 2 files, +3/-1
Fix build with MSVC.
telegramdesktop/tdesktop/dev • e45d60d • 6 files, +105/-30
Add some hardenings to blocking popups.
telegramdesktop/tdesktop/dev • 3ec91b5 • 2 files, +0/-14
Fix build with GCC.
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • a1e89e1 • 6 files, +22/-15
Version 7.0.9.
- Add saving rich messages to HTML and importing them back.
- Add custom prompt tab to AI editing in the article editor.
- Add experimental Vulkan rendering option on Linux.
- Crash fixes.
#tdesktop
Version 7.0.9.
- Add saving rich messages to HTML and importing them back.
- Add custom prompt tab to AI editing in the article editor.
- Add experimental Vulkan rendering option on Linux.
- Crash fixes.
#tdesktop
🫡3
Assets for release
• Source code (tar.gz, full)
• Windows on ARM: Portable
• Windows 64 bit: Portable
• Windows 32 bit: Portable
• Windows on ARM: Installer
• Windows 64 bit: Installer
• macOS 10.13+: Installer
• Windows 32 bit: Installer
• Linux 64 bit: Binary
#tdesktop
v7.0.9 of telegramdesktop/tdesktop:• Source code (tar.gz, full)
• Windows on ARM: Portable
• Windows 64 bit: Portable
• Windows 32 bit: Portable
• Windows on ARM: Installer
• Windows 64 bit: Installer
• macOS 10.13+: Installer
• Windows 32 bit: Installer
• Linux 64 bit: Binary
#tdesktop
🫡3
UnigramDev/Unigram/develop • ebe5e84 • 1 files, +16/-8
fix: Update Shortcuts.md (#3193)
* fix: Update shortcuts
- Add missing formatting options;
- Reordered shortcuts to be in the same order, as they appear in the application;
- Add consistency (spaces between keys and `+` symbols) for shortcuts;
* increase rowspan
#unigram
fix: Update Shortcuts.md (#3193)
* fix: Update shortcuts
- Add missing formatting options;
- Reordered shortcuts to be in the same order, as they appear in the application;
- Add consistency (spaces between keys and `+` symbols) for shortcuts;
* increase rowspan
#unigram
🫡2
UnigramDev/Unigram/crash-message-selector-null-content-root • abd63ce • 1 files, +40/-5
Fix crash when MessageSelector loads before its content is realized
MessageSelector.OnLoaded built the TextSelectionManager unconditionally:
_textSelectionManager ??= new TextSelectionManager(this, ContentTemplateRoot);
TextSelectionManager's constructor rejects a null root, so whenever a
container was connected before its ContentPresenter had realized the content,
ContentTemplateRoot was still null and the constructor threw
ArgumentNullException out of a Loaded handler, which is unhandled and takes
the app down.
Reported by crash telemetry on 12.8.2 ("Value cannot be null. Parameter
name: root"). The reported log tails show it under heavy UI churn — chat
navigation with popups opening — which is when layout is most likely to lag
behind connection.
Attach as soon as a root is actually available instead: on load when the
content is already realized, otherwise on the first arrange, by which point
the presenter has always produced one. Selection is therefore attached within
the same layout pass and nothing is lost.
The arrange path is guarded by a field null check, so once attached it costs
one comparison and never allocates.
EnsureTextSelectionManager also checks IsConnected. Only OnUnloaded detaches
the manager, so attaching while disconnected would leave the pointer handlers
on the content root permanently and, through them, root the control for the
rest of the session.
The four selection accessors dereferenced the manager unconditionally, which
would have turned this window into a NullReferenceException instead; they are
now null-safe.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
Fix crash when MessageSelector loads before its content is realized
MessageSelector.OnLoaded built the TextSelectionManager unconditionally:
_textSelectionManager ??= new TextSelectionManager(this, ContentTemplateRoot);
TextSelectionManager's constructor rejects a null root, so whenever a
container was connected before its ContentPresenter had realized the content,
ContentTemplateRoot was still null and the constructor threw
ArgumentNullException out of a Loaded handler, which is unhandled and takes
the app down.
Reported by crash telemetry on 12.8.2 ("Value cannot be null. Parameter
name: root"). The reported log tails show it under heavy UI churn — chat
navigation with popups opening — which is when layout is most likely to lag
behind connection.
Attach as soon as a root is actually available instead: on load when the
content is already realized, otherwise on the first arrange, by which point
the presenter has always produced one. Selection is therefore attached within
the same layout pass and nothing is lost.
The arrange path is guarded by a field null check, so once attached it costs
one comparison and never allocates.
EnsureTextSelectionManager also checks IsConnected. Only OnUnloaded detaches
the manager, so attaching while disconnected would leave the pointer handlers
on the content root permanently and, through them, root the control for the
rest of the session.
The four selection accessors dereferenced the manager unconditionally, which
would have turned this window into a NullReferenceException instead; they are
now null-safe.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
🫡2💅1
UnigramDev/Unigram/crash-message-selector-null-content-root • 15b9841 • 1 files, +49/-5
Fix crash when MessageSelector loads before its content is set
MessageSelector.OnLoaded built the TextSelectionManager unconditionally:
_textSelectionManager ??= new TextSelectionManager(this, ContentTemplateRoot);
TextSelectionManager's constructor rejects a null root, so whenever a
container was connected before it had been given content, the constructor
threw ArgumentNullException out of a Loaded handler, which is unhandled and
takes the app down.
Reported by crash telemetry on 12.8.2 ("Value cannot be null. Parameter
name: root"). The reported log tails show it under heavy UI churn — chat
navigation with popups opening — which is when layout is most likely to lag
behind connection.
Attach whenever a content element is actually present instead: on load, and
again from OnContentChanged whenever the content itself changes. The control
is always handed a UIElement directly and is never initialized through a
ContentTemplate, so Content is the element to attach to and ContentTemplateRoot
was the wrong property to read in the first place.
OnContentChanged detaches first. The manager's pointer handlers live on the
previous content element, so they have to come off before attaching to the
new one, or they outlive the element they were added to and the manager keeps
reporting selection for content that is no longer displayed.
EnsureTextSelectionManager also checks IsConnected. Only OnUnloaded and
OnContentChanged detach the manager, so attaching while disconnected would
leave the pointer handlers on the content permanently and, through them, root
the control for the rest of the session.
The four selection accessors dereferenced the manager unconditionally, which
would have turned this window into a NullReferenceException instead; they are
now null-safe.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
Fix crash when MessageSelector loads before its content is set
MessageSelector.OnLoaded built the TextSelectionManager unconditionally:
_textSelectionManager ??= new TextSelectionManager(this, ContentTemplateRoot);
TextSelectionManager's constructor rejects a null root, so whenever a
container was connected before it had been given content, the constructor
threw ArgumentNullException out of a Loaded handler, which is unhandled and
takes the app down.
Reported by crash telemetry on 12.8.2 ("Value cannot be null. Parameter
name: root"). The reported log tails show it under heavy UI churn — chat
navigation with popups opening — which is when layout is most likely to lag
behind connection.
Attach whenever a content element is actually present instead: on load, and
again from OnContentChanged whenever the content itself changes. The control
is always handed a UIElement directly and is never initialized through a
ContentTemplate, so Content is the element to attach to and ContentTemplateRoot
was the wrong property to read in the first place.
OnContentChanged detaches first. The manager's pointer handlers live on the
previous content element, so they have to come off before attaching to the
new one, or they outlive the element they were added to and the manager keeps
reporting selection for content that is no longer displayed.
EnsureTextSelectionManager also checks IsConnected. Only OnUnloaded and
OnContentChanged detach the manager, so attaching while disconnected would
leave the pointer handlers on the content permanently and, through them, root
the control for the rest of the session.
The four selection accessors dereferenced the manager unconditionally, which
would have turned this window into a NullReferenceException instead; they are
now null-safe.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
🫡2
UnigramDev/Unigram/develop • b844676 • 1 files, +49/-5
Fix crash when MessageSelector loads before its content is set (#3316)
MessageSelector.OnLoaded built the TextSelectionManager unconditionally:
_textSelectionManager ??= new TextSelectionManager(this, ContentTemplateRoot);
TextSelectionManager's constructor rejects a null root, so whenever a
container was connected before it had been given content, the constructor
threw ArgumentNullException out of a Loaded handler, which is unhandled and
takes the app down.
Reported by crash telemetry on 12.8.2 ("Value cannot be null. Parameter
name: root"). The reported log tails show it under heavy UI churn — chat
navigation with popups opening — which is when layout is most likely to lag
behind connection.
Attach whenever a content element is actually present instead: on load, and
again from OnContentChanged whenever the content itself changes. The control
is always handed a UIElement directly and is never initialized through a
ContentTemplate, so Content is the element to attach to and ContentTemplateRoot
was the wrong property to read in the first place.
OnContentChanged detaches first. The manager's pointer handlers live on the
previous content element, so they have to come off before attaching to the
new one, or they outlive the element they were added to and the manager keeps
reporting selection for content that is no longer displayed.
EnsureTextSelectionManager also checks IsConnected. Only OnUnloaded and
OnContentChanged detach the manager, so attaching while disconnected would
leave the pointer handlers on the content permanently and, through them, root
the control for the rest of the session.
The four selection accessors dereferenced the manager unconditionally, which
would have turned this window into a NullReferenceException instead; they are
now null-safe.
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
Fix crash when MessageSelector loads before its content is set (#3316)
MessageSelector.OnLoaded built the TextSelectionManager unconditionally:
_textSelectionManager ??= new TextSelectionManager(this, ContentTemplateRoot);
TextSelectionManager's constructor rejects a null root, so whenever a
container was connected before it had been given content, the constructor
threw ArgumentNullException out of a Loaded handler, which is unhandled and
takes the app down.
Reported by crash telemetry on 12.8.2 ("Value cannot be null. Parameter
name: root"). The reported log tails show it under heavy UI churn — chat
navigation with popups opening — which is when layout is most likely to lag
behind connection.
Attach whenever a content element is actually present instead: on load, and
again from OnContentChanged whenever the content itself changes. The control
is always handed a UIElement directly and is never initialized through a
ContentTemplate, so Content is the element to attach to and ContentTemplateRoot
was the wrong property to read in the first place.
OnContentChanged detaches first. The manager's pointer handlers live on the
previous content element, so they have to come off before attaching to the
new one, or they outlive the element they were added to and the manager keeps
reporting selection for content that is no longer displayed.
EnsureTextSelectionManager also checks IsConnected. Only OnUnloaded and
OnContentChanged detach the manager, so attaching while disconnected would
leave the pointer handlers on the content permanently and, through them, root
the control for the rest of the session.
The four selection accessors dereferenced the manager unconditionally, which
would have turned this window into a NullReferenceException instead; they are
now null-safe.
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
🫡2
UnigramDev/Unigram/develop • 6404539 • 1 files, +15/-6
Fix crash opening the context menu on a partially selected message (#3317)
Message_ContextRequested built a MessageQuote straight from the selection and
immediately dereferenced it:
quote = new MessageQuote
{
Quote = parent.GetSelectedSourceText(out selectionStart),
...
};
selectionEnd = selectionStart + quote.Quote.Text.Length;
MessageSelector.HasSelection only reports that a selection is currently shown.
It is a plain flag, tracked separately from the ranges the text actually comes
from, so it can be true while GetSelectedSourceText returns null — when there
are no selected ranges, when the range collapses to nothing in source offsets,
or when the underlying block no longer has source text (GetSourceText returns
null for either of the last two). The result was a NullReferenceException out
of an async void handler, which is unhandled and takes the app down.
Reported by crash telemetry on 12.8.2.
Take the selected text first and only build the quote when there is one.
Everything downstream already treats a null quote as "no quote" — the very
next block reads `if (quote != null && MessageQuote_Loaded(...))` and falls
back to a plain reply — so leaving it unset is the behaviour the caller
already expects.
This only makes the call site agree with what the API can return; the flag and
the ranges are still tracked separately in TextSelectionManager, which is worth
revisiting on its own.
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
Fix crash opening the context menu on a partially selected message (#3317)
Message_ContextRequested built a MessageQuote straight from the selection and
immediately dereferenced it:
quote = new MessageQuote
{
Quote = parent.GetSelectedSourceText(out selectionStart),
...
};
selectionEnd = selectionStart + quote.Quote.Text.Length;
MessageSelector.HasSelection only reports that a selection is currently shown.
It is a plain flag, tracked separately from the ranges the text actually comes
from, so it can be true while GetSelectedSourceText returns null — when there
are no selected ranges, when the range collapses to nothing in source offsets,
or when the underlying block no longer has source text (GetSourceText returns
null for either of the last two). The result was a NullReferenceException out
of an async void handler, which is unhandled and takes the app down.
Reported by crash telemetry on 12.8.2.
Take the selected text first and only build the quote when there is one.
Everything downstream already treats a null quote as "no quote" — the very
next block reads `if (quote != null && MessageQuote_Loaded(...))` and falls
back to a plain reply — so leaving it unset is the behaviour the caller
already expects.
This only makes the call site agree with what the API can return; the flag and
the ranges are still tracked separately in TextSelectionManager, which is worth
revisiting on its own.
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
🫡2
UnigramDev/Unigram/crash-autocomplete-template-mismatch • 381ea2d • 1 files, +24/-14
Fix crash populating autocomplete rows from a mismatched template
Autocomplete_ContainerContentChanging walked the container's visual tree on
the assumption that it matches args.Item:
var content = args.ItemContainer.ContentTemplateRoot as Grid;
var title = content.Children[1] as TextBlock;
var description = title.Inlines[1] as Run;
...
description.Text = ...
The list uses ItemTemplateSelector, so containers are recycled across item
types that have different templates, and ContentTemplateRoot can still be the
previous type's tree when this fires. Every step of that walk is an `as` cast
whose result is dereferenced immediately, so a mismatch is a
NullReferenceException in an event handler — fatal, not caught anywhere.
Reported by crash telemetry on 12.8.2, landing on the QuickReplyShortcut
branch. args.InRecycleQueue was already handled; this is the other half of the
recycling problem, where the container is live but not yet re-templated.
Match the expected shape and bail out when it isn't there, rather than
indexing into whatever tree happens to be present. Applied to the reported
branch and to the User branch, which is structurally identical and has the
same latent fault.
The remaining branches index container children the same way and share the
pattern, but have no reported crashes; leaving them for now to keep the change
reviewable rather than rewriting the whole handler.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
Fix crash populating autocomplete rows from a mismatched template
Autocomplete_ContainerContentChanging walked the container's visual tree on
the assumption that it matches args.Item:
var content = args.ItemContainer.ContentTemplateRoot as Grid;
var title = content.Children[1] as TextBlock;
var description = title.Inlines[1] as Run;
...
description.Text = ...
The list uses ItemTemplateSelector, so containers are recycled across item
types that have different templates, and ContentTemplateRoot can still be the
previous type's tree when this fires. Every step of that walk is an `as` cast
whose result is dereferenced immediately, so a mismatch is a
NullReferenceException in an event handler — fatal, not caught anywhere.
Reported by crash telemetry on 12.8.2, landing on the QuickReplyShortcut
branch. args.InRecycleQueue was already handled; this is the other half of the
recycling problem, where the container is live but not yet re-templated.
Match the expected shape and bail out when it isn't there, rather than
indexing into whatever tree happens to be present. Applied to the reported
branch and to the User branch, which is structurally identical and has the
same latent fault.
The remaining branches index container children the same way and share the
pattern, but have no reported crashes; leaving them for now to keep the change
reviewable rather than rewriting the whole handler.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
🫡2
UnigramDev/Unigram/crash-sharetarget-null-window • 235fc66 • 1 files, +19/-2
Fix crash activating the app as a share target without a window context
InitializeFrame dereferenced WindowContext.Current unconditionally:
if (WindowContext.Current.Content == null)
{
WindowContext.Current.Content = CreateRootElement(e, WindowContext.Current);
}
WindowContext._current is [ThreadStatic]. It is assigned by the constructor,
which OnWindowCreated calls, and cleared again in OnShutdownCompleted when the
view's dispatcher shuts down. An activation arriving on a view that has been
through that shutdown therefore finds no context, and the app dies with a
NullReferenceException before it has a window.
Its only caller already allows for exactly this:
if (WindowContext.Current?.Content == null)
{
InitializeFrame(e);
}
The null-conditional makes a missing context indistinguishable from missing
content, so the branch is taken and InitializeFrame is called precisely when
there is nothing to dereference.
Build the context instead of assuming one. That is what OnWindowCreated would
have done, and it leaves the frame actually initialized rather than merely not
crashing, so the activation still gets a usable window. Where there is no
Window.Current either, there is nothing to build against; log and return.
Reported by crash telemetry on 12.8.1, all of it through OnShareTargetActivated,
and the code is unchanged on develop.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
Fix crash activating the app as a share target without a window context
InitializeFrame dereferenced WindowContext.Current unconditionally:
if (WindowContext.Current.Content == null)
{
WindowContext.Current.Content = CreateRootElement(e, WindowContext.Current);
}
WindowContext._current is [ThreadStatic]. It is assigned by the constructor,
which OnWindowCreated calls, and cleared again in OnShutdownCompleted when the
view's dispatcher shuts down. An activation arriving on a view that has been
through that shutdown therefore finds no context, and the app dies with a
NullReferenceException before it has a window.
Its only caller already allows for exactly this:
if (WindowContext.Current?.Content == null)
{
InitializeFrame(e);
}
The null-conditional makes a missing context indistinguishable from missing
content, so the branch is taken and InitializeFrame is called precisely when
there is nothing to dereference.
Build the context instead of assuming one. That is what OnWindowCreated would
have done, and it leaves the frame actually initialized rather than merely not
crashing, so the activation still gets a usable window. Where there is no
Window.Current either, there is nothing to build against; log and return.
Reported by crash telemetry on 12.8.1, all of it through OnShareTargetActivated,
and the code is unchanged on develop.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
🫡2
telegramdesktop/tdesktop/dev • 8e18cb7 • 1 files, +1/-0
Work around bugged D-Bus cmake config
It overrides pkg-config search paths but never restores them leading to pipewire being not found, disable the find_package call so that openal falls back to pkg-config directly
#tdesktop
Work around bugged D-Bus cmake config
It overrides pkg-config search paths but never restores them leading to pipewire being not found, disable the find_package call so that openal falls back to pkg-config directly
#tdesktop
🫡3
UnigramDev/Unigram/crash-sharetarget-null-window • e30f8e4 • 1 files, +38/-2
Fix crash activating the app as a share target before its window is created
InitializeFrame dereferenced WindowContext.Current unconditionally:
if (WindowContext.Current.Content == null)
{
WindowContext.Current.Content = CreateRootElement(e, WindowContext.Current);
}
Share target activation appears to race window creation: the view has a
Window, but OnWindowCreated has not run yet, so no WindowContext exists and
the app dies with a NullReferenceException before it has any content.
Its only caller already allows for this — it tests WindowContext.Current?.Content
— so the null-conditional makes a missing context indistinguishable from
missing content, and InitializeFrame is called precisely when there is nothing
to dereference.
Make CreateWindowWrapper idempotent, and build the context early when
activation gets there first.
The idempotence is the load-bearing half. WindowContext's constructor assigns
the thread-static Current, so constructing a second one for a view that
already has one replaces it and silently orphans whatever was attached to the
first — including the frame. Creating the context during activation is only
safe because the OnWindowCreated that follows now reuses it instead of
replacing it. It is compared by window rather than assumed, and a context
belonging to a different window is still replaced, as before.
Logging is added on each path — reusing, creating, replacing, activating
early, and activating with no window at all — since this is a race that only
shows up in the field and the log tail is the only way to see which way it
went.
Reported by crash telemetry on 12.8.1, all of it through OnShareTargetActivated,
and the code is unchanged on develop.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
Fix crash activating the app as a share target before its window is created
InitializeFrame dereferenced WindowContext.Current unconditionally:
if (WindowContext.Current.Content == null)
{
WindowContext.Current.Content = CreateRootElement(e, WindowContext.Current);
}
Share target activation appears to race window creation: the view has a
Window, but OnWindowCreated has not run yet, so no WindowContext exists and
the app dies with a NullReferenceException before it has any content.
Its only caller already allows for this — it tests WindowContext.Current?.Content
— so the null-conditional makes a missing context indistinguishable from
missing content, and InitializeFrame is called precisely when there is nothing
to dereference.
Make CreateWindowWrapper idempotent, and build the context early when
activation gets there first.
The idempotence is the load-bearing half. WindowContext's constructor assigns
the thread-static Current, so constructing a second one for a view that
already has one replaces it and silently orphans whatever was attached to the
first — including the frame. Creating the context during activation is only
safe because the OnWindowCreated that follows now reuses it instead of
replacing it. It is compared by window rather than assumed, and a context
belonging to a different window is still replaced, as before.
Logging is added on each path — reusing, creating, replacing, activating
early, and activating with no window at all — since this is a race that only
shows up in the field and the log tail is the only way to see which way it
went.
Reported by crash telemetry on 12.8.1, all of it through OnShareTargetActivated,
and the code is unchanged on develop.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
🫡2
UnigramDev/Unigram/develop • 0d19263 • 1 files, +38/-2
Fix crash activating the app as a share target before its window is created (#3320)
InitializeFrame dereferenced WindowContext.Current unconditionally:
if (WindowContext.Current.Content == null)
{
WindowContext.Current.Content = CreateRootElement(e, WindowContext.Current);
}
Share target activation appears to race window creation: the view has a
Window, but OnWindowCreated has not run yet, so no WindowContext exists and
the app dies with a NullReferenceException before it has any content.
Its only caller already allows for this — it tests WindowContext.Current?.Content
— so the null-conditional makes a missing context indistinguishable from
missing content, and InitializeFrame is called precisely when there is nothing
to dereference.
Make CreateWindowWrapper idempotent, and build the context early when
activation gets there first.
The idempotence is the load-bearing half. WindowContext's constructor assigns
the thread-static Current, so constructing a second one for a view that
already has one replaces it and silently orphans whatever was attached to the
first — including the frame. Creating the context during activation is only
safe because the OnWindowCreated that follows now reuses it instead of
replacing it. It is compared by window rather than assumed, and a context
belonging to a different window is still replaced, as before.
Logging is added on each path — reusing, creating, replacing, activating
early, and activating with no window at all — since this is a race that only
shows up in the field and the log tail is the only way to see which way it
went.
Reported by crash telemetry on 12.8.1, all of it through OnShareTargetActivated,
and the code is unchanged on develop.
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
Fix crash activating the app as a share target before its window is created (#3320)
InitializeFrame dereferenced WindowContext.Current unconditionally:
if (WindowContext.Current.Content == null)
{
WindowContext.Current.Content = CreateRootElement(e, WindowContext.Current);
}
Share target activation appears to race window creation: the view has a
Window, but OnWindowCreated has not run yet, so no WindowContext exists and
the app dies with a NullReferenceException before it has any content.
Its only caller already allows for this — it tests WindowContext.Current?.Content
— so the null-conditional makes a missing context indistinguishable from
missing content, and InitializeFrame is called precisely when there is nothing
to dereference.
Make CreateWindowWrapper idempotent, and build the context early when
activation gets there first.
The idempotence is the load-bearing half. WindowContext's constructor assigns
the thread-static Current, so constructing a second one for a view that
already has one replaces it and silently orphans whatever was attached to the
first — including the frame. Creating the context during activation is only
safe because the OnWindowCreated that follows now reuses it instead of
replacing it. It is compared by window rather than assumed, and a context
belonging to a different window is still replaced, as before.
Logging is added on each path — reusing, creating, replacing, activating
early, and activating with no window at all — since this is a race that only
shows up in the field and the log tail is the only way to see which way it
went.
Reported by crash telemetry on 12.8.1, all of it through OnShareTargetActivated,
and the code is unchanged on develop.
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
#unigram
🫡2