summary refs log tree commit diff
path: root/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop')
-rw-r--r--pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/default.nix232
-rw-r--r--pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/kotato-10.12-sdk.patch415
-rw-r--r--pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/shortcuts-binary-path.patch38
-rw-r--r--pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/tg_owt-10.12-sdk.patch55
-rw-r--r--pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/tg_owt.nix118
5 files changed, 816 insertions, 42 deletions
diff --git a/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/default.nix b/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/default.nix
index cb4f3e5e5d1..ce5dc0e266e 100644
--- a/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/default.nix
+++ b/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/default.nix
@@ -1,53 +1,231 @@
-{ mkDerivation, lib, fetchFromGitHub, callPackage
-, pkg-config, cmake, ninja, python3, wrapGAppsHook, wrapQtAppsHook
-, qtbase, qtimageformats, gtk3, libsForQt5, lz4, xxHash
-, ffmpeg, openalSoft, minizip, libopus, alsa-lib, libpulseaudio, range-v3
-, tl-expected, hunspell, glibmm, webkitgtk
-# Transitive dependencies:
-, pcre, xorg, util-linux, libselinux, libsepol, libepoxy
-, at-spi2-core, libXtst, libthai, libdatrie
+{ lib
+, stdenv
+, fetchFromGitHub
+, callPackage
+, pkg-config
+, cmake
+, ninja
+, clang
+, python3
+, wrapGAppsHook
+, wrapQtAppsHook
+, removeReferencesTo
+, extra-cmake-modules
+, qtbase
+, qtimageformats
+, qtsvg
+, kwayland
+, lz4
+, xxHash
+, ffmpeg
+, openalSoft
+, minizip
+, libopus
+, alsa-lib
+, libpulseaudio
+, range-v3
+, tl-expected
+, hunspell
+, glibmm
+, webkitgtk
+, jemalloc
+, rnnoise
+, abseil-cpp
+, microsoft_gsl
+, wayland
+, libicns
+, Cocoa
+, CoreFoundation
+, CoreServices
+, CoreText
+, CoreGraphics
+, CoreMedia
+, OpenGL
+, AudioUnit
+, ApplicationServices
+, Foundation
+, AGL
+, Security
+, SystemConfiguration
+, Carbon
+, AudioToolbox
+, VideoToolbox
+, VideoDecodeAcceleration
+, AVFoundation
+, CoreAudio
+, CoreVideo
+, CoreMediaIO
+, QuartzCore
+, AppKit
+, CoreWLAN
+, WebKit
+, IOKit
+, GSS
+, MediaPlayer
+, IOSurface
+, Metal
+, MetalKit
+, withWebKit ? false
 }:
 
 with lib;
 
 let
-  tg_owt = callPackage ./tg_owt.nix {};
-in mkDerivation rec {
+  tg_owt = callPackage ./tg_owt.nix {
+    abseil-cpp = (abseil-cpp.override {
+      # abseil-cpp should use the same compiler
+      inherit stdenv;
+      cxxStandard = "20";
+    }).overrideAttrs (_: {
+      # https://github.com/NixOS/nixpkgs/issues/130963
+      NIX_LDFLAGS = optionalString stdenv.isDarwin "-lc++abi";
+    });
+
+    # tg_owt should use the same compiler
+    inherit stdenv;
+
+    inherit Cocoa AppKit IOKit IOSurface Foundation AVFoundation CoreMedia VideoToolbox
+      CoreGraphics CoreVideo OpenGL Metal MetalKit CoreFoundation ApplicationServices;
+  };
+in
+stdenv.mkDerivation rec {
   pname = "kotatogram-desktop";
-  version = "1.4.1";
+  version = "1.4.9";
 
   src = fetchFromGitHub {
     owner = "kotatogram";
     repo = "kotatogram-desktop";
     rev = "k${version}";
-    sha256 = "07z56gz3sk45n5j0gw9p9mxrbwixxsmp7lvqc6lqnxmglz6knc1d";
+    sha256 = "sha256-6bF/6fr8mJyyVg53qUykysL7chuewtJB8E22kVyxjHw=";
     fetchSubmodules = true;
   };
 
-  postPatch = ''
+  patches = [
+    ./shortcuts-binary-path.patch
+    # let it build with nixpkgs 10.12 sdk
+    ./kotato-10.12-sdk.patch
+  ];
+
+  postPatch = optionalString stdenv.isLinux ''
+    substituteInPlace Telegram/ThirdParty/libtgvoip/os/linux/AudioInputALSA.cpp \
+      --replace '"libasound.so.2"' '"${alsa-lib}/lib/libasound.so.2"'
+    substituteInPlace Telegram/ThirdParty/libtgvoip/os/linux/AudioOutputALSA.cpp \
+      --replace '"libasound.so.2"' '"${alsa-lib}/lib/libasound.so.2"'
+    substituteInPlace Telegram/ThirdParty/libtgvoip/os/linux/AudioPulse.cpp \
+      --replace '"libpulse.so.0"' '"${libpulseaudio}/lib/libpulse.so.0"'
+  '' + optionalString (stdenv.isLinux && withWebKit) ''
+    substituteInPlace Telegram/lib_webview/webview/platform/linux/webview_linux_webkit_gtk.cpp \
+      --replace '"libwebkit2gtk-4.0.so.37"' '"${webkitgtk}/lib/libwebkit2gtk-4.0.so.37"'
+  '' + optionalString stdenv.isDarwin ''
     substituteInPlace Telegram/CMakeLists.txt \
-      --replace '"''${TDESKTOP_LAUNCHER_BASENAME}.appdata.xml"' '"''${TDESKTOP_LAUNCHER_BASENAME}.metainfo.xml"'
+      --replace 'COMMAND iconutil' 'COMMAND png2icns' \
+      --replace '--convert icns' "" \
+      --replace '--output AppIcon.icns' 'AppIcon.icns' \
+      --replace "\''${appicon_path}" "\''${appicon_path}/icon_16x16.png \''${appicon_path}/icon_32x32.png \''${appicon_path}/icon_128x128.png \''${appicon_path}/icon_256x256.png \''${appicon_path}/icon_512x512.png"
   '';
 
   # We want to run wrapProgram manually (with additional parameters)
-  dontWrapGApps = true;
-  dontWrapQtApps = true;
+  dontWrapGApps = stdenv.isLinux;
+  dontWrapQtApps = stdenv.isLinux && withWebKit;
 
-  nativeBuildInputs = [ pkg-config cmake ninja python3 wrapGAppsHook wrapQtAppsHook ];
+  nativeBuildInputs = [
+    pkg-config
+    cmake
+    ninja
+    python3
+    wrapQtAppsHook
+    removeReferencesTo
+  ] ++ optionals stdenv.isLinux [
+    # to build bundled libdispatch
+    clang
+    extra-cmake-modules
+  ] ++ optionals (stdenv.isLinux && withWebKit) [
+    wrapGAppsHook
+  ];
 
   buildInputs = [
-    qtbase qtimageformats gtk3 libsForQt5.kwayland libsForQt5.libdbusmenu lz4 xxHash
-    ffmpeg openalSoft minizip libopus alsa-lib libpulseaudio range-v3
-    tl-expected hunspell glibmm webkitgtk
+    qtbase
+    qtimageformats
+    qtsvg
+    lz4
+    xxHash
+    ffmpeg
+    openalSoft
+    minizip
+    libopus
+    range-v3
+    tl-expected
+    rnnoise
     tg_owt
-    # Transitive dependencies:
-    pcre xorg.libXdmcp util-linux libselinux libsepol libepoxy
-    at-spi2-core libXtst libthai libdatrie
+    microsoft_gsl
+  ] ++ optionals stdenv.isLinux [
+    kwayland
+    alsa-lib
+    libpulseaudio
+    hunspell
+    glibmm
+    jemalloc
+    wayland
+  ] ++ optionals (stdenv.isLinux && withWebKit) [
+    webkitgtk
+  ] ++ optionals stdenv.isDarwin [
+    Cocoa
+    CoreFoundation
+    CoreServices
+    CoreText
+    CoreGraphics
+    CoreMedia
+    OpenGL
+    AudioUnit
+    ApplicationServices
+    Foundation
+    AGL
+    Security
+    SystemConfiguration
+    Carbon
+    AudioToolbox
+    VideoToolbox
+    VideoDecodeAcceleration
+    AVFoundation
+    CoreAudio
+    CoreVideo
+    CoreMediaIO
+    QuartzCore
+    AppKit
+    CoreWLAN
+    WebKit
+    IOKit
+    GSS
+    MediaPlayer
+    IOSurface
+    Metal
+    libicns
   ];
 
-  cmakeFlags = [ "-DTDESKTOP_API_TEST=ON" ];
+  # https://github.com/NixOS/nixpkgs/issues/130963
+  NIX_LDFLAGS = optionalString stdenv.isDarwin "-lc++abi";
+
+  enableParallelBuilding = true;
+
+  cmakeFlags = [
+    "-DTDESKTOP_API_TEST=ON"
+    "-DDESKTOP_APP_QT6=OFF"
+  ];
+
+  installPhase = optionalString stdenv.isDarwin ''
+    mkdir -p $out/Applications
+    cp -r Kotatogram.app $out/Applications
+    ln -s $out/Applications/Kotatogram.app/Contents/MacOS $out/bin
+  '';
+
+  preFixup = ''
+    binName=${if stdenv.isLinux then "kotatogram-desktop" else "Kotatogram"}
+    remove-references-to -t ${stdenv.cc.cc} $out/bin/$binName
+    remove-references-to -t ${microsoft_gsl} $out/bin/$binName
+    remove-references-to -t ${tg_owt.dev} $out/bin/$binName
+  '';
 
-  postFixup = ''
+  postFixup = optionalString (stdenv.isLinux && withWebKit) ''
     # We also use gappsWrapperArgs from wrapGAppsHook.
     wrapProgram $out/bin/kotatogram-desktop \
       "''${gappsWrapperArgs[@]}" \
@@ -66,9 +244,9 @@ in mkDerivation rec {
       It contains some useful (or purely cosmetic) features, but they could be unstable. A detailed list is available here: https://kotatogram.github.io/changes
     '';
     license = licenses.gpl3;
-    platforms = platforms.linux;
+    platforms = platforms.all;
     homepage = "https://kotatogram.github.io";
-    changelog = "https://github.com/kotatogram/kotatogram-desktop/releases/tag/k{ver}";
+    changelog = "https://github.com/kotatogram/kotatogram-desktop/releases/tag/k{version}";
     maintainers = with maintainers; [ ilya-fedin ];
   };
 }
diff --git a/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/kotato-10.12-sdk.patch b/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/kotato-10.12-sdk.patch
new file mode 100644
index 00000000000..d603c967cfd
--- /dev/null
+++ b/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/kotato-10.12-sdk.patch
@@ -0,0 +1,415 @@
+diff --git a/Telegram/SourceFiles/platform/mac/file_bookmark_mac.mm b/Telegram/SourceFiles/platform/mac/file_bookmark_mac.mm
+index 337055443..09604b117 100644
+--- a/Telegram/SourceFiles/platform/mac/file_bookmark_mac.mm
++++ b/Telegram/SourceFiles/platform/mac/file_bookmark_mac.mm
+@@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
+ 
+ #include <Cocoa/Cocoa.h>
+ #include <CoreFoundation/CFURL.h>
++#undef check
+ 
+ namespace Platform {
+ namespace {
+diff --git a/Telegram/SourceFiles/platform/mac/specific_mac.mm b/Telegram/SourceFiles/platform/mac/specific_mac.mm
+index 3b4395ae3..7f8ee401f 100644
+--- a/Telegram/SourceFiles/platform/mac/specific_mac.mm
++++ b/Telegram/SourceFiles/platform/mac/specific_mac.mm
+@@ -119,6 +119,7 @@ PermissionStatus GetPermissionStatus(PermissionType type) {
+ 	switch (type) {
+ 	case PermissionType::Microphone:
+ 	case PermissionType::Camera:
++#if 0
+ 		const auto nativeType = (type == PermissionType::Microphone)
+ 			? AVMediaTypeAudio
+ 			: AVMediaTypeVideo;
+@@ -133,6 +134,7 @@ PermissionStatus GetPermissionStatus(PermissionType type) {
+ 					return PermissionStatus::Denied;
+ 			}
+ 		}
++#endif
+ 		break;
+ 	}
+ 	return PermissionStatus::Granted;
+@@ -142,6 +144,7 @@ void RequestPermission(PermissionType type, Fn<void(PermissionStatus)> resultCal
+ 	switch (type) {
+ 	case PermissionType::Microphone:
+ 	case PermissionType::Camera:
++#if 0
+ 		const auto nativeType = (type == PermissionType::Microphone)
+ 			? AVMediaTypeAudio
+ 			: AVMediaTypeVideo;
+@@ -152,6 +155,7 @@ void RequestPermission(PermissionType type, Fn<void(PermissionStatus)> resultCal
+ 				});
+ 			}];
+ 		}
++#endif
+ 		break;
+ 	}
+ 	resultCallback(PermissionStatus::Granted);
+diff --git a/Telegram/SourceFiles/platform/mac/touchbar/items/mac_formatter_item.h b/Telegram/SourceFiles/platform/mac/touchbar/items/mac_formatter_item.h
+index a537929c8..82ef2b837 100644
+--- a/Telegram/SourceFiles/platform/mac/touchbar/items/mac_formatter_item.h
++++ b/Telegram/SourceFiles/platform/mac/touchbar/items/mac_formatter_item.h
+@@ -9,8 +9,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
+ 
+ #import <AppKit/NSPopoverTouchBarItem.h>
+ #import <AppKit/NSTouchBar.h>
++#undef check
+ 
+-API_AVAILABLE(macos(10.12.2))
+ @interface TextFormatPopover : NSPopoverTouchBarItem
+ - (id)init:(NSTouchBarItemIdentifier)identifier;
+ @end
+diff --git a/Telegram/SourceFiles/platform/mac/touchbar/items/mac_pinned_chats_item.h b/Telegram/SourceFiles/platform/mac/touchbar/items/mac_pinned_chats_item.h
+index c6a4b886f..d2e0936c0 100644
+--- a/Telegram/SourceFiles/platform/mac/touchbar/items/mac_pinned_chats_item.h
++++ b/Telegram/SourceFiles/platform/mac/touchbar/items/mac_pinned_chats_item.h
+@@ -8,12 +8,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
+ #pragma once
+ 
+ #include <AppKit/NSImageView.h>
++#undef check
+ 
+ namespace Main {
+ class Session;
+ } // namespace Main
+ 
+-API_AVAILABLE(macos(10.12.2))
+ @interface PinnedDialogsPanel : NSImageView
+ - (id)init:(not_null<Main::Session*>)session
+ 	destroyEvent:(rpl::producer<>)touchBarSwitches;
+diff --git a/Telegram/SourceFiles/platform/mac/touchbar/items/mac_scrubber_item.h b/Telegram/SourceFiles/platform/mac/touchbar/items/mac_scrubber_item.h
+index 27b04467c..b1a7dfbd9 100644
+--- a/Telegram/SourceFiles/platform/mac/touchbar/items/mac_scrubber_item.h
++++ b/Telegram/SourceFiles/platform/mac/touchbar/items/mac_scrubber_item.h
+@@ -9,12 +9,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
+ 
+ #import <AppKit/NSPopoverTouchBarItem.h>
+ #import <AppKit/NSTouchBar.h>
++#undef check
+ 
+ namespace Window {
+ class Controller;
+ } // namespace Window
+ 
+-API_AVAILABLE(macos(10.12.2))
+ @interface StickerEmojiPopover : NSPopoverTouchBarItem<NSTouchBarDelegate>
+ - (id)init:(not_null<Window::Controller*>)controller
+ 	identifier:(NSTouchBarItemIdentifier)identifier;
+diff --git a/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_audio.h b/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_audio.h
+index ec4596c67..972461aef 100644
+--- a/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_audio.h
++++ b/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_audio.h
+@@ -8,8 +8,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
+ #pragma once
+ 
+ #import <AppKit/NSTouchBar.h>
++#undef check
+ 
+-API_AVAILABLE(macos(10.12.2))
+ @interface TouchBarAudioPlayer : NSTouchBar<NSTouchBarDelegate>
+ - (rpl::producer<>)closeRequests;
+ @end
+diff --git a/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_common.h b/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_common.h
+index 52b54de12..ac3857f9b 100644
+--- a/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_common.h
++++ b/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_common.h
+@@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
+ 
+ #import <AppKit/NSImage.h>
+ #import <Foundation/Foundation.h>
++#undef check
+ 
+ namespace TouchBar {
+ 
+diff --git a/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_controls.h b/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_controls.h
+index 1cc8c832f..c2178c975 100644
+--- a/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_controls.h
++++ b/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_controls.h
+@@ -20,19 +20,19 @@ struct TrackState;
+ 
+ namespace TouchBar {
+ 
+-[[nodiscard]] API_AVAILABLE(macos(10.12.2))
++[[nodiscard]]
+ NSButton *CreateTouchBarButton(
+ 	NSImage *image,
+ 	rpl::lifetime &lifetime,
+ 	Fn<void()> callback);
+ 
+-[[nodiscard]] API_AVAILABLE(macos(10.12.2))
++[[nodiscard]]
+ NSButton *CreateTouchBarButton(
+ 	const style::icon &icon,
+ 	rpl::lifetime &lifetime,
+ 	Fn<void()> callback);
+ 
+-[[nodiscard]] API_AVAILABLE(macos(10.12.2))
++[[nodiscard]]
+ NSButton *CreateTouchBarButtonWithTwoStates(
+ 	NSImage *icon1,
+ 	NSImage *icon2,
+@@ -41,7 +41,7 @@ NSButton *CreateTouchBarButtonWithTwoStates(
+ 	bool firstState,
+ 	rpl::producer<bool> stateChanged = rpl::never<bool>());
+ 
+-[[nodiscard]] API_AVAILABLE(macos(10.12.2))
++[[nodiscard]]
+ NSButton *CreateTouchBarButtonWithTwoStates(
+ 	const style::icon &icon1,
+ 	const style::icon &icon2,
+@@ -50,14 +50,14 @@ NSButton *CreateTouchBarButtonWithTwoStates(
+ 	bool firstState,
+ 	rpl::producer<bool> stateChanged = rpl::never<bool>());
+ 
+-[[nodiscard]] API_AVAILABLE(macos(10.12.2))
++[[nodiscard]]
+ NSSliderTouchBarItem *CreateTouchBarSlider(
+ 	NSString *itemId,
+ 	rpl::lifetime &lifetime,
+ 	Fn<void(bool, double, double)> callback,
+ 	rpl::producer<Media::Player::TrackState> stateChanged);
+ 
+-[[nodiscard]] API_AVAILABLE(macos(10.12.2))
++[[nodiscard]]
+ NSCustomTouchBarItem *CreateTouchBarTrackPosition(
+ 	NSString *itemId,
+ 	rpl::producer<Media::Player::TrackState> stateChanged);
+diff --git a/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_main.h b/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_main.h
+index f03546eaf..bc8c63678 100644
+--- a/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_main.h
++++ b/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_main.h
+@@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
+ #pragma once
+ 
+ #import <AppKit/NSTouchBar.h>
++#undef check
+ 
+ namespace Window {
+ class Controller;
+@@ -21,7 +22,6 @@ const auto kPopoverPickerItemIdentifier = @"pickerButtons";
+ 
+ } // namespace TouchBar::Main
+ 
+-API_AVAILABLE(macos(10.12.2))
+ @interface TouchBarMain : NSTouchBar
+ - (id)init:(not_null<Window::Controller*>)controller
+ 	touchBarSwitches:(rpl::producer<>)touchBarSwitches;
+diff --git a/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_manager.h b/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_manager.h
+index 464f87c9c..9a008c75e 100644
+--- a/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_manager.h
++++ b/Telegram/SourceFiles/platform/mac/touchbar/mac_touchbar_manager.h
+@@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
+ #pragma once
+ 
+ #import <AppKit/NSTouchBar.h>
++#undef check
+ 
+ namespace Main {
+ class Domain;
+@@ -17,7 +18,6 @@ namespace Window {
+ class Controller;
+ } // namespace Window
+ 
+-API_AVAILABLE(macos(10.12.2))
+ @interface RootTouchBar : NSTouchBar<NSTouchBarDelegate>
+ - (id)init:(rpl::producer<bool>)canApplyMarkdown
+ 	controller:(not_null<Window::Controller*>)controller
+Submodule Telegram/ThirdParty/tgcalls contains modified content
+diff --git a/Telegram/ThirdParty/tgcalls/tgcalls/platform/darwin/TGRTCDefaultVideoDecoderFactory.mm b/Telegram/ThirdParty/tgcalls/tgcalls/platform/darwin/TGRTCDefaultVideoDecoderFactory.mm
+index 8a4417b..2d9794e 100644
+--- a/Telegram/ThirdParty/tgcalls/tgcalls/platform/darwin/TGRTCDefaultVideoDecoderFactory.mm
++++ b/Telegram/ThirdParty/tgcalls/tgcalls/platform/darwin/TGRTCDefaultVideoDecoderFactory.mm
+@@ -71,7 +71,7 @@
+     if (@available(iOS 11.0, *)) {
+         [result addObject:h265Info];
+     }
+-#else // WEBRTC_IOS
++#elif 0 // WEBRTC_IOS
+     if (@available(macOS 10.13, *)) {
+         [result addObject:h265Info];
+     }
+@@ -101,7 +101,7 @@
+       return [[TGRTCVideoDecoderH265 alloc] init];
+     }
+   }
+-#else // WEBRTC_IOS
++#elif 0 // WEBRTC_IOS
+   if (@available(macOS 10.13, *)) {
+     if ([info.name isEqualToString:kRTCVideoCodecH265Name]) {
+       return [[TGRTCVideoDecoderH265 alloc] init];
+diff --git a/Telegram/ThirdParty/tgcalls/tgcalls/platform/darwin/TGRTCDefaultVideoEncoderFactory.mm b/Telegram/ThirdParty/tgcalls/tgcalls/platform/darwin/TGRTCDefaultVideoEncoderFactory.mm
+index 2901417..ac9ec2a 100644
+--- a/Telegram/ThirdParty/tgcalls/tgcalls/platform/darwin/TGRTCDefaultVideoEncoderFactory.mm
++++ b/Telegram/ThirdParty/tgcalls/tgcalls/platform/darwin/TGRTCDefaultVideoEncoderFactory.mm
+@@ -76,7 +76,7 @@
+       [result addObject:h265Info];
+     }
+   }
+-#else // WEBRTC_IOS
++#elif 0 // WEBRTC_IOS
+   if (@available(macOS 10.13, *)) {
+     if ([[AVAssetExportSession allExportPresets] containsObject:AVAssetExportPresetHEVCHighestQuality]) {
+       [result addObject:h265Info];
+@@ -112,7 +112,7 @@
+       return [[TGRTCVideoEncoderH265 alloc] initWithCodecInfo:info];
+     }
+   }
+-#else // WEBRTC_IOS
++#elif 0 // WEBRTC_IOS
+   if (@available(macOS 10.13, *)) {
+     if ([info.name isEqualToString:kRTCVideoCodecH265Name]) {
+       return [[TGRTCVideoEncoderH265 alloc] initWithCodecInfo:info];
+diff --git a/Telegram/ThirdParty/tgcalls/tgcalls/platform/darwin/VideoCameraCapturerMac.mm b/Telegram/ThirdParty/tgcalls/tgcalls/platform/darwin/VideoCameraCapturerMac.mm
+index de92427..9a5b20d 100644
+--- a/Telegram/ThirdParty/tgcalls/tgcalls/platform/darwin/VideoCameraCapturerMac.mm
++++ b/Telegram/ThirdParty/tgcalls/tgcalls/platform/darwin/VideoCameraCapturerMac.mm
+@@ -507,8 +507,7 @@ static tgcalls::DarwinVideoTrackSource *getObjCVideoSource(const rtc::scoped_ref
+ - (void)captureOutput:(AVCaptureOutput *)captureOutput
+     didDropSampleBuffer:(CMSampleBufferRef)sampleBuffer
+          fromConnection:(AVCaptureConnection *)connection {
+-  NSString *droppedReason =
+-      (__bridge NSString *)CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_DroppedFrameReason, nil);
++  NSString *droppedReason = nil;
+   RTCLogError(@"Dropped sample buffer. Reason: %@", droppedReason);
+ }
+ 
+diff --git a/Telegram/ThirdParty/tgcalls/tgcalls/platform/darwin/VideoMetalViewMac.mm b/Telegram/ThirdParty/tgcalls/tgcalls/platform/darwin/VideoMetalViewMac.mm
+index bcabcf7..de7b6c7 100644
+--- a/Telegram/ThirdParty/tgcalls/tgcalls/platform/darwin/VideoMetalViewMac.mm
++++ b/Telegram/ThirdParty/tgcalls/tgcalls/platform/darwin/VideoMetalViewMac.mm
+@@ -245,9 +245,11 @@ private:
+     layer.framebufferOnly = true;
+     layer.opaque = false;
+ //    layer.cornerRadius = 4;
++#if 0
+     if (@available(macOS 10.13, *)) {
+         layer.displaySyncEnabled = NO;
+     }
++#endif
+ //    layer.presentsWithTransaction = YES;
+     layer.backgroundColor = [NSColor clearColor].CGColor;
+     layer.contentsGravity = kCAGravityResizeAspectFill;
+@@ -334,9 +336,7 @@ private:
+ - (RTCVideoRotation)rtcFrameRotation {
+     if (_rotationOverride) {
+         RTCVideoRotation rotation;
+-        if (@available(macOS 10.13, *)) {
+-            [_rotationOverride getValue:&rotation size:sizeof(rotation)];
+-        } else {
++        {
+             [_rotationOverride getValue:&rotation];
+         }
+         return rotation;
+Submodule Telegram/lib_base contains modified content
+diff --git a/Telegram/lib_base/base/platform/mac/base_global_shortcuts_mac.mm b/Telegram/lib_base/base/platform/mac/base_global_shortcuts_mac.mm
+index 5491702..32befc6 100644
+--- a/Telegram/lib_base/base/platform/mac/base_global_shortcuts_mac.mm
++++ b/Telegram/lib_base/base/platform/mac/base_global_shortcuts_mac.mm
+@@ -128,6 +128,7 @@ bool Available() {
+ }
+ 
+ bool Allowed() {
++#if 0
+ 	if (@available(macOS 10.15, *)) {
+ 		// Input Monitoring is required on macOS 10.15 an later.
+ 		// Even if user grants access, restart is required.
+@@ -141,6 +142,7 @@ bool Allowed() {
+ 		return AXIsProcessTrustedWithOptions(
+ 			(__bridge CFDictionaryRef)options);
+ 	}
++#endif
+ 	return true;
+ }
+ 
+diff --git a/Telegram/lib_base/base/platform/mac/base_info_mac.mm b/Telegram/lib_base/base/platform/mac/base_info_mac.mm
+index 29e368f..ea1f65f 100644
+--- a/Telegram/lib_base/base/platform/mac/base_info_mac.mm
++++ b/Telegram/lib_base/base/platform/mac/base_info_mac.mm
+@@ -203,16 +203,20 @@ void Finish() {
+ }
+ 
+ void OpenInputMonitoringPrivacySettings() {
++#if 0
+ 	if (@available(macOS 10.15, *)) {
+ 		IOHIDRequestAccess(kIOHIDRequestTypeListenEvent);
+ 	}
++#endif
+ 	[[NSWorkspace sharedWorkspace] openURL:PrivacySettingsUrl("Privacy_ListenEvent")];
+ }
+ 
+ void OpenDesktopCapturePrivacySettings() {
++#if 0
+ 	if (@available(macOS 11.0, *)) {
+ 		CGRequestScreenCaptureAccess();
+ 	}
++#endif
+ 	[[NSWorkspace sharedWorkspace] openURL:PrivacySettingsUrl("Privacy_ScreenCapture")];
+ }
+ 
+diff --git a/Telegram/lib_base/base/platform/mac/base_system_media_controls_mac.mm b/Telegram/lib_base/base/platform/mac/base_system_media_controls_mac.mm
+index c86ac77..b081162 100644
+--- a/Telegram/lib_base/base/platform/mac/base_system_media_controls_mac.mm
++++ b/Telegram/lib_base/base/platform/mac/base_system_media_controls_mac.mm
+@@ -271,6 +271,7 @@ void SystemMediaControls::setThumbnail(const QImage &thumbnail) {
+ 	if (thumbnail.isNull()) {
+ 		return;
+ 	}
++#if 0
+ 	if (@available(macOS 10.13.2, *)) {
+ 		const auto copy = thumbnail;
+ 		[_private->info
+@@ -284,6 +285,7 @@ void SystemMediaControls::setThumbnail(const QImage &thumbnail) {
+ 			forKey:MPMediaItemPropertyArtwork];
+ 		updateDisplay();
+ 	}
++#endif
+ }
+ 
+ void SystemMediaControls::setDuration(int duration) {
+@@ -302,10 +304,12 @@ void SystemMediaControls::setVolume(float64 volume) {
+ }
+ 
+ void SystemMediaControls::clearThumbnail() {
++#if 0
+ 	if (@available(macOS 10.13.2, *)) {
+ 		[_private->info removeObjectForKey:MPMediaItemPropertyArtwork];
+ 		updateDisplay();
+ 	}
++#endif
+ }
+ 
+ void SystemMediaControls::clearMetadata() {
+@@ -367,9 +371,11 @@ bool SystemMediaControls::volumeSupported() const {
+ }
+ 
+ bool SystemMediaControls::Supported() {
++#if 0
+ 	if (@available(macOS 10.12.2, *)) {
+ 		return true;
+ 	}
++#endif
+ 	return false;
+ }
+ 
+Submodule Telegram/lib_webrtc contains modified content
+diff --git a/Telegram/lib_webrtc/webrtc/mac/webrtc_media_devices_mac.mm b/Telegram/lib_webrtc/webrtc/mac/webrtc_media_devices_mac.mm
+index 21e93f7..10a3890 100644
+--- a/Telegram/lib_webrtc/webrtc/mac/webrtc_media_devices_mac.mm
++++ b/Telegram/lib_webrtc/webrtc/mac/webrtc_media_devices_mac.mm
+@@ -397,6 +397,7 @@ void MacMediaDevices::videoInputRefreshed() {
+ }
+ 
+ bool MacDesktopCaptureAllowed() {
++#if 0
+ 	if (@available(macOS 11.0, *)) {
+ 		// Screen Recording is required on macOS 10.15 an later.
+ 		// Even if user grants access, restart is required.
+@@ -421,6 +422,7 @@ bool MacDesktopCaptureAllowed() {
+ 		CFRelease(stream);
+ 		return true;
+ 	}
++#endif
+ 	return true;
+ }
+ 
diff --git a/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/shortcuts-binary-path.patch b/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/shortcuts-binary-path.patch
new file mode 100644
index 00000000000..f173a64f141
--- /dev/null
+++ b/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/shortcuts-binary-path.patch
@@ -0,0 +1,38 @@
+diff --git a/Telegram/SourceFiles/core/application.cpp b/Telegram/SourceFiles/core/application.cpp
+index 2a092c6ea..de46dd269 100644
+--- a/Telegram/SourceFiles/core/application.cpp
++++ b/Telegram/SourceFiles/core/application.cpp
+@@ -1173,7 +1173,7 @@ void Application::startShortcuts() {
+ 
+ void Application::RegisterUrlScheme() {
+ 	base::Platform::RegisterUrlScheme(base::Platform::UrlSchemeDescriptor{
+-		.executable = cExeDir() + cExeName(),
++		.executable = qsl("kotatogram-desktop"),
+ 		.arguments = qsl("-workdir \"%1\"").arg(cWorkingDir()),
+ 		.protocol = qsl("tg"),
+ 		.protocolName = qsl("Telegram Link"),
+diff --git a/Telegram/SourceFiles/platform/linux/specific_linux.cpp b/Telegram/SourceFiles/platform/linux/specific_linux.cpp
+index 26168baa7..00d2525a0 100644
+--- a/Telegram/SourceFiles/platform/linux/specific_linux.cpp
++++ b/Telegram/SourceFiles/platform/linux/specific_linux.cpp
+@@ -303,19 +303,11 @@ bool GenerateDesktopFile(
+ 
+ 	QFile target(targetFile);
+ 	if (target.open(QIODevice::WriteOnly)) {
+-		fileText = fileText.replace(
+-			QRegularExpression(
+-				qsl("^TryExec=.*$"),
+-				QRegularExpression::MultilineOption),
+-			qsl("TryExec=%1").arg(
+-				QString(cExeDir() + cExeName()).replace('\\', "\\\\")));
+-
+ 		fileText = fileText.replace(
+ 			QRegularExpression(
+ 				qsl("^Exec=kotatogram-desktop(.*)$"),
+ 				QRegularExpression::MultilineOption),
+-			qsl("Exec=%1 -workdir %2\\1").arg(
+-				EscapeShellInLauncher(cExeDir() + cExeName()),
++			qsl("Exec=kotatogram-desktop -workdir %1\\1").arg(
+ 				EscapeShellInLauncher(cWorkingDir())));
+ 
+ 		fileText = fileText.replace(
diff --git a/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/tg_owt-10.12-sdk.patch b/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/tg_owt-10.12-sdk.patch
new file mode 100644
index 00000000000..a9adf5737a5
--- /dev/null
+++ b/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/tg_owt-10.12-sdk.patch
@@ -0,0 +1,55 @@
+diff --git a/src/rtc_base/system/gcd_helpers.m b/src/rtc_base/system/gcd_helpers.m
+index fd9a361f..3a63be6d 100644
+--- a/src/rtc_base/system/gcd_helpers.m
++++ b/src/rtc_base/system/gcd_helpers.m
+@@ -13,9 +13,6 @@
+ dispatch_queue_t RTCDispatchQueueCreateWithTarget(const char *label,
+                                                   dispatch_queue_attr_t attr,
+                                                   dispatch_queue_t target) {
+-  if (@available(iOS 10, macOS 10.12, tvOS 10, watchOS 3, *)) {
+-    return dispatch_queue_create_with_target(label, attr, target);
+-  }
+   dispatch_queue_t queue = dispatch_queue_create(label, attr);
+   dispatch_set_target_queue(queue, target);
+   return queue;
+diff --git a/src/sdk/objc/components/video_codec/nalu_rewriter.cc b/src/sdk/objc/components/video_codec/nalu_rewriter.cc
+index 61c1e7d6..b19f3f91 100644
+--- a/src/sdk/objc/components/video_codec/nalu_rewriter.cc
++++ b/src/sdk/objc/components/video_codec/nalu_rewriter.cc
+@@ -245,10 +245,7 @@ bool H265CMSampleBufferToAnnexBBuffer(
+   int nalu_header_size = 0;
+   size_t param_set_count = 0;
+   OSStatus status = noErr;
+-  if (__builtin_available(macOS 10.13, *)) {
+-    status = CMVideoFormatDescriptionGetHEVCParameterSetAtIndex(
+-        description, 0, nullptr, nullptr, &param_set_count, &nalu_header_size);
+-  } else {
++  {
+     RTC_LOG(LS_ERROR) << "Not supported.";
+     return false;
+   }
+@@ -271,10 +268,7 @@ bool H265CMSampleBufferToAnnexBBuffer(
+     size_t param_set_size = 0;
+     const uint8_t* param_set = nullptr;
+     for (size_t i = 0; i < param_set_count; ++i) {
+-      if (__builtin_available(macOS 10.13, *)) {
+-        status = CMVideoFormatDescriptionGetHEVCParameterSetAtIndex(
+-            description, i, &param_set, &param_set_size, nullptr, nullptr);
+-      } else {
++      {
+         RTC_LOG(LS_ERROR) << "Not supported.";
+         return false;
+       }
+@@ -514,11 +508,7 @@ CMVideoFormatDescriptionRef CreateH265VideoFormatDescription(
+   // Parse the SPS and PPS into a CMVideoFormatDescription.
+   CMVideoFormatDescriptionRef description = nullptr;
+   OSStatus status = noErr;
+-  if (__builtin_available(macOS 10.13, *)) {
+-    status = CMVideoFormatDescriptionCreateFromHEVCParameterSets(
+-        kCFAllocatorDefault, 3, param_set_ptrs, param_set_sizes, 4, nullptr,
+-        &description);
+-  } else {
++  {
+     RTC_LOG(LS_ERROR) << "Not supported.";
+     return nullptr;
+   }
diff --git a/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/tg_owt.nix b/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/tg_owt.nix
index aff74a174b9..fe62270b8e8 100644
--- a/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/tg_owt.nix
+++ b/pkgs/applications/networking/instant-messengers/telegram/kotatogram-desktop/tg_owt.nix
@@ -1,35 +1,123 @@
-{ lib, stdenv, fetchFromGitHub, pkg-config, cmake, ninja, yasm
-, libjpeg, openssl, libopus, ffmpeg_4, alsa-lib, libpulseaudio, protobuf
-, xorg, libXtst
+{ lib
+, stdenv
+, fetchFromGitHub
+, pkg-config
+, cmake
+, ninja
+, yasm
+, libjpeg
+, openssl
+, libopus
+, ffmpeg_4
+, protobuf
+, openh264
+, usrsctp
+, libvpx
+, libX11
+, libXtst
+, libXcomposite
+, libXdamage
+, libXext
+, libXrender
+, libXrandr
+, libXi
+, glib
+, abseil-cpp
+, pipewire
+, mesa
+, libglvnd
+, libepoxy
+, Cocoa
+, AppKit
+, IOKit
+, IOSurface
+, Foundation
+, AVFoundation
+, CoreMedia
+, VideoToolbox
+, CoreGraphics
+, CoreVideo
+, OpenGL
+, Metal
+, MetalKit
+, CoreFoundation
+, ApplicationServices
 }:
 
-let
-  rev = "2d804d2c9c5d05324c8ab22f2e6ff8306521b3c3";
-  sha256 = "0kz0i381iwsgcc3yzsq7njx3gkqja4bb9fsgc24vhg0md540qhyn";
-
-in stdenv.mkDerivation {
+stdenv.mkDerivation {
   pname = "tg_owt";
-  version = "git-${rev}";
+  version = "unstable-2022-02-26";
 
   src = fetchFromGitHub {
     owner = "desktop-app";
     repo = "tg_owt";
-    inherit rev sha256;
+    rev = "a264028ec71d9096e0aa629113c49c25db89d260";
+    sha256 = "sha256-JR+M+4w0QsQLfIunZ/7W+5Knn+gX+RR3DBrpOz7q44I=";
     fetchSubmodules = true;
   };
 
+  patches = [
+    # let it build with nixpkgs 10.12 sdk
+    ./tg_owt-10.12-sdk.patch
+  ];
+
   outputs = [ "out" "dev" ];
 
   nativeBuildInputs = [ pkg-config cmake ninja yasm ];
 
   buildInputs = [
-    libjpeg openssl libopus ffmpeg_4 alsa-lib libpulseaudio protobuf
-    xorg.libX11 libXtst
+    libjpeg
+    openssl
+    libopus
+    ffmpeg_4
+    protobuf
+    openh264
+    usrsctp
+    libvpx
+    abseil-cpp
+  ] ++ lib.optionals stdenv.isLinux [
+    libX11
+    libXtst
+    libXcomposite
+    libXdamage
+    libXext
+    libXrender
+    libXrandr
+    libXi
+    glib
+    pipewire
+    mesa
+    libepoxy
+    libglvnd
+  ] ++ lib.optionals stdenv.isDarwin [
+    Cocoa
+    AppKit
+    IOKit
+    IOSurface
+    Foundation
+    AVFoundation
+    CoreMedia
+    VideoToolbox
+    CoreGraphics
+    CoreVideo
+    OpenGL
+    Metal
+    MetalKit
+    CoreFoundation
+    ApplicationServices
   ];
 
-  cmakeFlags = [
-    # Building as a shared library isn't officially supported and currently broken:
-    "-DBUILD_SHARED_LIBS=OFF"
+  # https://github.com/NixOS/nixpkgs/issues/130963
+  NIX_LDFLAGS = lib.optionalString stdenv.isDarwin "-lc++abi";
+
+  enableParallelBuilding = true;
+
+  propagatedBuildInputs = [
+    # Required for linking downstream binaries.
+    abseil-cpp
+    openh264
+    usrsctp
+    libvpx
   ];
 
   meta.license = lib.licenses.bsd3;