Telegram github commits and releases
4.43K subscribers
601 files
21K links
Broadcast from the most important Telegram clients' repositories
Download Telegram
telegramdesktop/tdesktop/dev • 0152fa2 • 2 files, +3/-1
Redirected chat list typing to search field in screen reader mode.

#tdesktop
🫡3
telegramdesktop/tdesktop/dev • b9aad5d • 2 files, +15/-3
Engaged chat search on typing instead of focus in screen reader mode.

In screen reader mode, focusing the dialogs search field no longer opens
the suggestions panel or shows the cancel-search button. Search engages
only when the user types, stays engaged after clearing the query, and
disengages only on explicit Escape or the cancel-search button. Tab and
Backspace on an empty query no longer exit search in this mode.

Non-screen-reader behavior is unchanged.

#tdesktop
🫡3
UnigramDev/Unigram/develop • 3d046d0 • 1 files, +1/-1
Update microtex

UnigramDev/Unigram/develop • 5d1a827 • 1 files, +2/-2
Fix null ref

UnigramDev/Unigram/develop • 596faf5 • 8 files, +69/-14
Accent improvements

UnigramDev/Unigram/develop • 2159edb • 1 files, +12/-2
Show error toast

UnigramDev/Unigram/develop • 0075f8a • 1 files, +1/-1
Update TDLib

UnigramDev/Unigram/develop • b6cd604 • 16 files, +3354/-743
Working on rich messages editor

UnigramDev/Unigram/develop • 2714fe0 • 3 files, +235/-310
Rich messages improvements

UnigramDev/Unigram/develop • 7dd814c • 1 files, +2/-2
Use cascadia if available

UnigramDev/Unigram/develop • a26c239 • 1 files, +1/-1
Bump version to 12.8.1

#unigram
🫡2
telegramdesktop/tdesktop/dev • 34c91cc • 1 files, +1/-0
Fix clangd in vscode devcontainer

telegramdesktop/tdesktop/dev • 4fff6a1 • 1 files, +2/-0
Ensure cmake gets preferred binutils version from PATH

#tdesktop
🫡3
telegramdesktop/tdesktop/dev • baa53ca • 6 files, +60/-6
Support alternative edited-on date display.

telegramdesktop/tdesktop/dev • cb97504 • 1 files, +1/-1
Fix pre-history visibility in manage group.

#tdesktop
🫡4
telegramdesktop/tdesktop/dev • e98856d • 2 files, +3/-3
One more attempt to restore context with ANGLE.

#tdesktop
🫡3
morethanwords/tweb/master • bcd2792 • 3 files, +67/-1
fix: detect group-call media-transport stall (ICE connected, DTLS hung)

GroupCallInstance.connectionState (and thus the call UI) reports only the
ICE connection state, so a call where ICE reaches `connected` but the
RTCPeerConnection never does — the DTLS handshake stalls, seen on
restrictive networks / some VPNs — looked "connected" while no media ever
flowed: black video tiles, silence, the SFU data channel never opening,
no error anywhere.

Watch the real RTCPeerConnection.connectionState in groupCallsController:
arm a 10s watchdog when ICE connects, and if connectionState hasn't
reached `connected` by then (or goes `failed` — which the existing ICE
`failed` branch never caught, since ICE stays `connected` while DTLS
fails), surface it via the existing conference-bug breadcrumb and hang up
the dead call instead of leaving the user on a silent black call.

Also log the DtlsTransport state on connectionstatechange so an exported
log pins a DTLS stall directly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

morethanwords/tweb/master • 007cf7c • 13 files, +821/-100
fix: harden E2E call crypto — DH param validation + block authorization

The server is the explicit adversary of Telegram's E2E calls, but WebK trusted
server-supplied data in two places, and the tde2e port had skipped several
validations the reference (tdlib/tdesktop) enforces.

1-on-1 calls (src/lib/crypto):
- Validate the DH config {p,g} from messages.getDhConfig: pin the known 2048-bit
safe prime (safe-prime + generator-congruence fallback) and range-check both
our g_a and the peer's g_b (1<x<p-1, 2^(2048-64) bounds) — mirrors tdesktop
mtproto_dh_utils. Defeats a malicious server's smooth prime (passive key
recovery, invisible to the emoji SAS) and degenerate peer values. Hang up on
any failure.

E2E group calls (src/lib/calls/e2e/blockchain.ts):
- Port tde2e State::apply per-change authorization: derive the signer's
permissions from the prior group state and reject changes it isn't entitled
to make (may_add_users / may_remove_users, no granting flags the signer lacks,
no widening external_permissions, may_change_shared_key requires membership).
- Make state-proof validation faithful to validate_state (group_state/shared_key
omitted-when-changed, present-when-not) and require >=1 SetValue/SetGroupState.

tde2e port hardening:
- TLReader.vector: reject a length larger than the remaining buffer (DoS).
- Reject trailing data after decodeBlock / decodeGroupBroadcast (fetch_end).
- serverToLocal: only strip the +1 magic when magic-1 is a known constructor.
- hydrateStateFromBlock: reject negative block height.
- Buffer future-height verification broadcasts and replay them when the chain
advances (delayed_broadcasts_), so SFU reordering can't suppress the emoji SAS.
- Re-check our pubkey<->user_id on every epoch; co-locate the SELF_PACKET guard.

Adds unit + adversarial tests: DH validation, block authorization, state-proof
shape, and broadcast reordering.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

#webk
👍3🫡1
morethanwords/tweb/master • 9d58fe1 • 117 files, +1371/-403
feat: Document Picture-in-Picture — pop the whole client into an always-on-top window

Move the live app DOM into a Document PiP window (same instance, instant) via the left-sidebar More submenu "Picture-in-Picture" entry, gated on Chromium support and toggling to "Exit" while popped out.

Core: appWindow.ts metrics/overlay rebind layer (getAppWindow / getOverlayRoot / bindActiveWindowListener / onAppWindowChange); clientPip move/restore + mirrorDocumentStyles + ClientPipPlaceholder for the vacated tab.

Plus a broad realm-coupling sweep so overlays, context menus, gestures, keyboard, paste/drop, IntersectionObserver, scroll preservation and cross-realm instanceof all keep working when the app lives in the PiP window.

Fullscreen from the media viewer is unavailable in PiP (forbidden by spec and activation cannot cross windows); the button shows a hint to return to the tab instead.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

morethanwords/tweb/master • 0fa2741 • 2 files, +53/-1
fix: deepEqual no longer leaks ignoreKeys into nested objects

Bug (discovery scan, src/helpers/object/deepEqual.ts)
-----------------------------------------------------
`deepEqual(x, y, ignoreKeys)` is meant to skip the listed keys at the
level being compared (e.g. drafts ignore `date`/`reply_to`; the chat
pattern renderer ignores `element`). But the recursive call passed the
SAME `ignoreKeys` down into every nested object:

ok(x).every((key) => deepEqual(x[key], y[key], ignoreKeys))

so any nested property whose name matched an ignored key was silently
skipped at every depth. Two objects that differed only inside a nested
object — under a same-named key — were wrongly reported equal.

Root cause (current code, line 12)
----------------------------------
`ignoreKeys` was forwarded unconditionally in the recursion, turning a
top-level filter into a global, all-depths filter.

Fix
---
Drop `ignoreKeys` from the recursive call so it applies only at the
comparison (top) level — the documented intent. One-token change plus a
doc note. Both existing callers (drafts `['date','reply_to']`, pattern
renderer `['element']`) compare flat shapes with no nested same-named
keys, so their behavior is unchanged; the fix is strictly more correct
and removes a footgun for any future caller.

Evidence
--------
New src/tests/deepEqual.test.ts (6 tests): flat compare, undefined-prop
skipping, nested recursion, top-level ignore, and the regression case
"does NOT ignore the keys inside nested objects". The regression test
FAILS on master (returns true, expected false) and PASSES after the fix;
the other 5 lock existing behavior. Full suite: 215 passed (the lone
unrelated failure, appGroupCallsManagerJoin.test.ts, is pre-existing on
master and in an off-limits area).

Gates: tsc --noEmit 0 · eslint 0 (both files) · vitest 6/6 green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

#webk
👍3🫡2
morethanwords/tweb/master • 690ab5f • 4 files, +50/-4
fix: format file sizes >= 1 TB instead of emitting a bare "1.000 "

Bug (class: bugs.telegram.org #5273-adjacent number/size formatting +
direct code defect): formatBytesPure / formatBytes drop the unit for
sizes >= 1 TB.

Root cause: both helpers index a length-4 sizes array
(['B','KB','MB','GB']) with i = floor(log(bytes)/log(1024)). For
bytes >= 1024^4 the index becomes 4 (or more), so sizes[i] is
undefined. formatBytesPure(1024**4) returned "1.000 " (value, a space,
NO unit, trailing space); 5 TB -> "5.000 ". formatBytes was worse: it
passed the undefined LangPackKey straight into i18n(), garbling the
unit. There was also no FileSize.TB lang key.

Reachable from the Data & Storage UI: storageQuota.tsx formats
navigator.storage.estimate() quota, which on a modern multi-TB disk
routinely exceeds 1 TB, plus cumulative cache totals.

Fix: extend the sizes arrays with TB and PB and clamp i to the array
bounds (Math.min(..., sizes.length - 1)) so the index can never select
an undefined unit; add the matching FileSize.TB / FileSize.PB lang keys.

Test (src/tests/formatBytesPure.test.ts): pure-unit Vitest.
Before the fix it FAILED — formatBytesPure(1024**4) === "1.000 " and
5*1024**4 === "5.000 " (bare value, no unit). After the fix it returns
"1.000 TB" / "5.000 TB", and a regression guard asserts the output
always ends in a real unit. Boundary cases (0, 1023, 1024, 1 GB)
unchanged.

Gates: npx tsc --noEmit (0), npx eslint on changed files (0),
npx vitest run src/tests/formatBytesPure.test.ts (7 passed).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

#webk
🫡3
morethanwords/tweb/master • 07d14fb • 7 files, +176/-69
feat: peer-color background-emoji pattern behind web-page previews (tdesktop geometry, shared with replies)

Web-page previews now render the peer-color background-emoji pattern (the sender's
name-color `background_emoji_id`) that tweb already draws behind replies and quotes.
Previously the webpage box got only the quote background + left peer-color border.

Reference (tdesktop): `FillBackgroundEmoji` (history_view_reply.cpp:267) is defined
once and reused by replies (857), contacts (394) AND web pages
(history_view_web_page.cpp:1036) — the same geometry for all; web pages and normal
replies call it with quote=false.

This pulls tdesktop's EXACT pattern geometry into one shared module and points both
replies and web pages at it:
- New `src/components/wrappers/peerColorPattern.ts` owns the pattern (reads the peer's
`color.background_emoji_id`, computes the tint, calls `wrapEmojiPattern`, optional
collectible gift) AND the geometry ported 1:1 from tdesktop — the three cached frame
sizes 12/16/20 (reply.cpp:237-239) across 9 right-anchored positions with per-emoji
opacity (reply.cpp:296-310). tdesktop's right-anchored x maps to tweb's left-origin
canvas as `width - distanceFromRight` (the canvas is CSS-pinned to the box's right
edge); canvas 130x76, emojiSize 24 (source raster >= the largest 20px draw). The
quote-like box's overflow:hidden clips it to the real box height, mirroring tdesktop's
`if(y >= rect.height()) return`.
- `reply.ts` and `bubbles.ts` (webPage box ref) both call `wrapPeerColorPattern` with no
geometry of their own — single source of truth, identical look, exactly as tdesktop
shares one function. Webpage pattern gated on `!isOut && !isSponsored`, peer =
`fwdFromId || fromId` (same as the bubble border, so border + pattern share one color).
- `_chatPinned.scss` `.reply-background-canvas` unified to flush top-right
(top:0; inset-inline-end:0; pointer-events:none) — matching `.webpage-background-canvas`
and tdesktop's right anchor (was top:-6; inset-inline-end:9px).

Note: this is tdesktop's non-quote layout (webpage / contact / normal reply). The
quote-reply variant (+2 emoji, +12px offset, quote=_hasQuoteIcon) is not yet
distinguished in tweb's reply path — a possible follow-up.

Pure logic extracted + unit-tested: `pickPatternEmojiColor.ts` (collectible accent vs
gradient[0], night/dark fallback). Tests: `peerColorPattern.test.ts` 4/4.

Gates: tsc --noEmit clean (touched files); eslint clean; vitest 4/4. Visual verified in
an authed Chrome preview (replies + web-page previews render the identical tdesktop cluster).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

#webk
🫡3
morethanwords/tweb/master • a274135 • 6 files, +155/-3
feat: render sticker-set / custom-emoji webpage preview as a sticker grid

A webPage linking to a sticker set or custom-emoji set (type
telegram_stickerset) carries a webPageAttributeStickerSet with the set's
preview stickers. tweb mapped the footer button + click (open the set popup)
but never rendered the stickers, so the bubble showed only text + button. All
three official clients draw a small right-aligned square NxN grid in the
square-photo slot (4 -> 2x2, 9 -> 3x3, side = ceil(sqrt(count))). This ports it.

- appWebPagesManager.saveWebPage: normalize the attribute's preview docs through
appDocsManager.saveDoc (MyDocument + file_reference context, like the
webPageAttributeStory precedent) so wrapSticker has media context. Same fix
applied to webPageAttributeStarGiftCollection icons.
- bubbles.ts (messageMediaWebPage): render the square grid into the existing
square-photo preview slot via the existing wrapSticker; custom-emoji + text
color tint gated on pFlags.emojis && pFlags.text_color. Previews loop.
- footer button: a custom-emoji set (pFlags.emojis) says "VIEW EMOJI"
(OpenEmojiSet), a sticker set keeps "VIEW STICKERS" (OpenStickers).
- _chatBubble.scss: grid layout + let the square resizer size to the inline box.
- New pure helper helpers/stickerSetPreviewGrid.ts isolates the grid geometry,
with src/tests/stickerSetPreviewGrid.test.ts (8 cases).

Reference: tdesktop history_view_web_page.cpp:1063-1084; Android (DrKLO)
ChatMessageCell.java:7499-7512.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

#webk
🫡2👍1
morethanwords/tweb/master • df939e8 • 4 files, +238/-21
feat(reactions): enforce reactions_uniq_max in the reaction picker

The per-user reaction-count cap (reactions_user_max_default / _premium,
"how many distinct reactions ONE user may place on ONE message") is already
fully implemented in tweb — getLimit('reactions') in apiManagerMethods.ts
(maps to those two appConfig keys, premium-aware) is enforced in
appReactionsManager.sendReaction(), which silently drops the user's OLDEST
chosen reaction beyond the cap. This matches tdesktop
(data/data_message_reactions.cpp:1937-2002) and iOS
(MessageReactions.swift:159-164) exactly — no blocking, no toast. Nothing
to build there.

The one reaction cap tweb did NOT implement is reactions_uniq_max
(appConfig.d.ts:27, default 11) — the total number of DISTINCT reactions
allowed to EXIST on a single message. Reference: tdesktop
data/data_peer_values.cpp:86-87 (UniqueReactionsLimit) consumed by
LookupPossibleReactions (data/data_message_reactions.cpp:211-261): once a
message already carries 11 distinct reactions, the picker is narrowed to the
reactions already present on the message, so a user can pile onto an existing
kind but can't introduce a 12th distinct one.

All three official clients enforce this the SAME way — a silent UX gate, no
toast/error — and crucially they gate the custom-emoji search/picker too, not
just the static reaction strip:
- tdesktop: LookupPossibleReactions leaves customAllowed=false at the cap, so
the selector opens in EmojiListMode::RecentReactions and the footer (search +
custom-emoji packs) is never created (history_view_reactions_selector.cpp:1462,
emoji_list_widget.cpp:1627).
- iOS: peerMessageAllowedReactions() returns .set of the present reactions, so
the context menu shows areCustomEmojiEnabled:false and the custom picker is
not offered (TopMessageReactions.swift:48, ChatControllerOpenMessageContextMenu).
- Android: hitLimit → showCustomEmojiReaction()=false hides the (+) expand button
(ReactionsContainerLayout.java:1058,1119,539), and MessageObject.selectReaction()
also returns false for a novel reaction at the cap, counting distinct reactions
EXCLUDING TL_reactionPaid (MessageObject.java:11918-11929).

Implementation:
- Pure helpers in @appManagers/utils/reactions/filterReactionsAtUniqCap:
countDistinctReactions() (excludes reactionPaid, the ⭐ star counter — matching
Android's chosenCount), isMessageAtUniqReactionCap(), and filterReactionsAtUniqCap
which narrows the offered list to the kinds already present once at the cap
(reactionPaid and already-present reactions kept). Default 11 mirrors tdesktop.
- appReactionsManager.getAvailableReactionsByMessage resolves the warm-cached
appConfig alongside the per-peer reactions (apiManager.getAppConfig, the same
accessor getLimit uses), narrows peerAvailableReactions.reactions, and flags
peerAvailableReactions.atUniqCap from the same uniqMax — single source of truth,
on the picker-open path (not chat-open) so the cached await is fine.
- reactionsMenu hides the custom-emoji search + packs (noSearch = noPacks = true)
when atUniqCap, so a novel reaction can't be introduced via the EmojiTab search
onFinish path — matching the three clients above. The narrowed grid still lets
the user pile onto existing kinds.

Tests: src/tests/filterReactionsAtUniqCap.test.ts — 14 cases covering default
fallback, below-cap pass-through (same reference), at-cap narrowing, reactionPaid
always kept + never counted toward the cap, present custom-emoji kept, custom
uniqMax bounds, empty/undefined inputs, over-cap, and the countDistinctReactions /
isMessageAtUniqReactionCap predicates. All green.

Gates: tsc --noEmit 0 errors; eslint 0 on all 4 files; vitest 14/14 green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

#webk
🫡3👍1
morethanwords/tweb/master • f259511 • 7 files, +145/-5
feat: giveaway end-date validation + live, second-accurate date-picker minimum

Giveaway creation (Boosts via Gifts) allowed a past or out-of-window end date,
and the shared date/time picker's "Minimum send time" froze at popup-open so it
drifted into the past. Bound the giveaway end date to [now, now +
giveaway_period_max] like the official clients, and make the picker's minimum
track the clock to the second.

Giveaway end-date validation (boostsViaGifts):
- The expiration picker now passes minDate (today) + minTimeDate (now), so past
days/times are unselectable, plus a defense-in-depth submit guard that
re-validates via isGiveawayUntilDateValid before building the payload
(toast + shake if giveaway_period_max drifted after the date was picked).
- isGiveawayUntilDateValid (new pure helper): untilDate > now && untilDate <=
now + periodMax (seconds). Mirrors tdesktop ChooseDateTimeBox bounds
(.min = now, .max = now + giveawayPeriodMax) and its collect() guard.
- lang: BoostsViaGifts.InvalidEndDate.

Date-picker live minimum (datePicker, benefits every caller — giveaway,
suggested-post, poll end):
- minTimeDate was captured once at open: the caption showed a stale minimum, and
because the displayed floor is minute-granular while the hard guard compared
seconds, the shown minute itself became unselectable once its :00 had elapsed.
- earliestSelectableMinuteMs(minTime, now) (new, @helpers/date): ceil(max(minTime,
now)) up to the next full minute — never behind the clock, never offers a
minute already partly in the past, keeps the caption and Confirm-enable
consistent.
- A 1s clock ticks the minute bucket; the caption, the confirm guard and the
initial input seed all derive from it via the new helper.

Tests: giveawayUntilDate (5 cases) + earliestSelectableMinute (5 cases).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

#webk
🫡4
morethanwords/tweb/master • da8b380 • 7 files, +351/-345
Regenerate icons

#webk
🫡2
telegramdesktop/tdesktop/dev • 20542a1 • 3 files, +20/-14
Added logs of source path when an unknown deleted message is re-added.

Related commit: 384f6d9a31.

telegramdesktop/tdesktop/dev • 0cf37dd • 4 files, +28/-1
Replaced gift button with call button for channel owner in info top bar.

telegramdesktop/tdesktop/dev • 550f623 • 1 files, +10/-1
Slightly improved trackpad scroll handling in profile flexible top bar.

telegramdesktop/tdesktop/dev • 16d9706 • 5 files, +111/-0
Added playback wave animation around voice message play button.

telegramdesktop/tdesktop/dev • 92e9644 • 1 files, +1/-2
Allowed swipe-to-reply gesture in channels.

telegramdesktop/tdesktop/dev • 9a38ab7 • 2 files, +4/-1
Fixed invisible small group call videos.

telegramdesktop/tdesktop/dev • c56fd45 • 1 files, +2/-2
Fixed repaint region for third column section animation.

telegramdesktop/tdesktop/dev • 969e84f • 1 files, +1/-0
Fixed clipped overlay buttons in group call QRhi viewport.

telegramdesktop/tdesktop/dev • 407d2cf • 4 files, +10/-0
Fixed new account intro opening in wrong window.

telegramdesktop/tdesktop/dev • df64efd • 6 files, +37/-9
Fixed back from new account intro focusing wrong window.

telegramdesktop/tdesktop/dev • 5d52a28 • 6 files, +66/-2
Added experimental option to keep unmuted unread dialogs on top.

telegramdesktop/tdesktop/dev • a74ee60 • 8 files, +297/-0
Added initial support of swipe-next-channel.

telegramdesktop/tdesktop/dev • 49396c4 • 4 files, +565/-12
Added growing-capsule swipe-next-channel pull indicator with userpic.

#tdesktop
🫡3
telegramdesktop/tdesktop/dev • 7549185 • 7 files, +111/-14
Added bottom-up section slide for swipe-next-channel jump.

telegramdesktop/tdesktop/dev • 1b88612 • 2 files, +22/-10
Fixed stale truncated history view top bar title on peer name change.

telegramdesktop/tdesktop/dev • 792cc5c • 1 files, +18/-4
Fixed text recognition overlay rotation in QRhi media viewer.

telegramdesktop/tdesktop/dev • 2da46cb • 2 files, +52/-16
Added text recognition for image documents in media viewer.

telegramdesktop/tdesktop/dev • b9d6b07 • 9 files, +628/-17
Added recognized text selection and copying in overlay media viewer.

telegramdesktop/tdesktop/dev • 05cb1e4 • 3 files, +41/-4
Added blockquote and code block rendering to media viewer captions.

telegramdesktop/tdesktop/dev • d0dba2e • 7 files, +119/-23
Added text transfer between message field and gif caption box.

telegramdesktop/tdesktop/dev • d10e9ce • 8 files, +271/-17
Added alphabetical section headers to contacts list sorted by name.

telegramdesktop/tdesktop/dev • 076de2d • 6 files, +498/-0
Added alphabetical fast-scroll index strip to contacts box.

telegramdesktop/tdesktop/dev • b8e82e3 • 1 files, +8/-5
Fixed opening sections from the settings search results.

telegramdesktop/tdesktop/dev • 165d20a • 5 files, +106/-15
Added support of deep link copying to settings search results.

telegramdesktop/tdesktop/dev • c40446b • 2 files, +13/-4
[thanos] Fixed lost auto-scroll to bottom during animation.

telegramdesktop/tdesktop/dev • 0ef307f • 2 files, +29/-17
Added right-button clicks support to pinned bar.

#tdesktop
🫡4👍1
telegramdesktop/tdesktop/dev • 1ab8597 • 6 files, +106/-0
Added reverse iteration over pinned messages on right click.

telegramdesktop/tdesktop/dev • a1f3ee5 • 15 files, +193/-5
Added tooltip above link for hidden forwarded sender.

telegramdesktop/tdesktop/dev • e0504dd • 7 files, +763/-1121
[ai] Attempt to automate testing changes.

telegramdesktop/tdesktop/dev • 9ca694f • 1 files, +51/-51
Rename currency-balance and post-suggestion strings to Grams.

telegramdesktop/tdesktop/dev • 4089646 • 6 files, +41/-32
Refresh and unify the TON diamond vector icons.

telegramdesktop/tdesktop/dev • c9ed5ef • 1 files, +1/-1
Update lib_base.

telegramdesktop/tdesktop/dev • ee39aa3 • 4 files, +4/-23
Switch to Qt's queued invoker

#tdesktop
🫡4
telegramdesktop/tdesktop/dev • 156c8e7 • 4 files, +21/-11
Use new base::option::changes in a few old options

telegramdesktop/tdesktop/dev • 1520a81 • 7 files, +7/-7
Bump actions/checkout from 6 to 7

Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

#tdesktop
🫡3💅1
telegramdesktop/tdesktop/dev • 1d17852 • 1 files, +1/-1
Return hinting for math formula fonts.

telegramdesktop/tdesktop/dev • c8ef31a • 4 files, +18/-26
Fix rich pages in scheduled / shorcuts sending.

telegramdesktop/tdesktop/dev • 54a7fd0 • 9 files, +101/-24
Use correct table entities limits.

telegramdesktop/tdesktop/dev • b01d375 • 1 files, +1/-1
Add some more math formula guardrails.

telegramdesktop/tdesktop/dev • fa9b926 • 5 files, +44/-48
Make InputField menu extension with hooks.

telegramdesktop/tdesktop/dev • 8997785 • 5 files, +81/-31
Enable jump-to-date in forum search.

telegramdesktop/tdesktop/dev • 2e54c33 • 1 files, +0/-2
Fix build with MSVC.

#tdesktop
🫡3