Compare commits

...

22 commits
v1.5.3 ... main

Author SHA1 Message Date
Vendicated
5d675efb64
upgrade to electron33 it probably goes crazy idk what they changed 2024-10-26 13:56:28 +02:00
lewisakura
03c7ad4cc0
ci: remove mentions from meta workflow [skip ci] 2024-10-22 20:22:00 +01:00
δDD
135a369848
fix typo in Settings ui (#924)
Fixed spelling mistake (Miscelleanous → Miscellaneous)
2024-10-22 13:44:49 +00:00
ryanamay
8993b0d520
fix screenshare picker window subtitle alignment (#875)
Co-authored-by: v <vendicated@riseup.net>
2024-10-14 17:40:47 +02:00
adryd
ccff1ac3ef
Enable speech-dispatcher support for TTS on linux (#874) 2024-10-04 18:51:55 +00:00
Tiagoquix
062b536617
Update text in bug report (#873) 2024-09-24 23:55:04 +02:00
Vendicated
d008f90399
update arrpc to 5aadc307cb 2024-09-20 20:27:26 +02:00
Vendicated
4fdf43ea6a
https://tenor.com/view/ah-eto-bleh-27178660 2024-09-20 20:23:57 +02:00
Vendicated
b94379f5bd
workaround electron/electron#43367 2024-09-20 20:16:11 +02:00
Vendicated
37db07807a
upgrade electron to v32 2024-09-20 20:07:17 +02:00
Aiden
4274647c81
update ESLint to v9 (#859) 2024-09-20 20:02:15 +02:00
v
24fbf35542
https://x.com/ArmCordClient/status/1834617546445672703 2024-09-13 23:16:42 +02:00
lewisakura
c8eccc7e9d
ci: add signing certificate password for mac [skip ci] 2024-09-13 22:02:34 +01:00
v
a318f6b407
Update feature-request.yml 2024-08-27 12:59:57 +02:00
donCESAR12345
75354ad8e6
fix(rpm): don't generate build_id links to avoid conflicts (#826)
...with other packages
2024-08-24 00:17:27 +02:00
lewisakura
af9ed58eef
ci: update winget releaser [skip ci] 2024-08-10 10:21:31 +01:00
v
e0453418bd
Update bug_report.yml 2024-08-05 19:18:22 +02:00
lewisakura
22344512ad
feat: notarization (#776) 2024-07-23 15:10:50 +01:00
Noah
9acc6652ff
AudioShare: Even more granular selection, Allow device sharing (#750) 2024-07-12 16:14:18 +02:00
vee
61bbd7f6aa
Update bug_report.yml 2024-07-11 05:31:07 +02:00
github-actions[bot]
f31f06f5c4
meta: Insert release changes for v1.5.3 (#724) 2024-07-04 20:21:38 +02:00
vee
786fe131b8
Update install instructions 2024-07-04 20:21:14 +02:00
20 changed files with 1802 additions and 1288 deletions

View file

@ -1,69 +0,0 @@
{
"root": true,
"parser": "@typescript-eslint/parser",
"ignorePatterns": ["dist", "node_modules"],
"plugins": [
"@typescript-eslint",
"license-header",
"simple-import-sort",
"unused-imports",
"path-alias",
"prettier"
],
"settings": {
"import/resolver": {
"alias": {
"map": []
}
}
},
"rules": {
"license-header/header": ["error", "scripts/header.txt"],
"eqeqeq": ["error", "always", { "null": "ignore" }],
"spaced-comment": ["error", "always", { "markers": ["!"] }],
"yoda": "error",
"prefer-destructuring": [
"error",
{
"VariableDeclarator": { "array": false, "object": true },
"AssignmentExpression": { "array": false, "object": false }
}
],
"operator-assignment": ["error", "always"],
"no-useless-computed-key": "error",
"no-unneeded-ternary": ["error", { "defaultAssignment": false }],
"no-invalid-regexp": "error",
"no-constant-condition": ["error", { "checkLoops": false }],
"no-duplicate-imports": "error",
"no-extra-semi": "error",
"dot-notation": "error",
"no-useless-escape": "error",
"no-fallthrough": "error",
"for-direction": "error",
"no-async-promise-executor": "error",
"no-cond-assign": "error",
"no-dupe-else-if": "error",
"no-duplicate-case": "error",
"no-irregular-whitespace": "error",
"no-loss-of-precision": "error",
"no-misleading-character-class": "error",
"no-prototype-builtins": "error",
"no-regex-spaces": "error",
"no-shadow-restricted-names": "error",
"no-unexpected-multiline": "error",
"no-unsafe-optional-chaining": "error",
"no-useless-backreference": "error",
"use-isnan": "error",
"prefer-const": "error",
"prefer-spread": "error",
"simple-import-sort/imports": "error",
"simple-import-sort/exports": "error",
"unused-imports/no-unused-imports": "error",
"path-alias/no-relative": "error",
"prettier/prettier": "error"
}
}

View file

@ -11,18 +11,32 @@ body:
Make sure a similar issue doesn't already exist by [searching the existing issues](https://github.com/Vencord/Vesktop/issues?q=is%3Aissue) for keywords! Make sure a similar issue doesn't already exist by [searching the existing issues](https://github.com/Vencord/Vesktop/issues?q=is%3Aissue) for keywords!
Make sure both Vesktop and Vencord are fully up to date. You can update Vencord by right-clicking the Vesktop tray icon and pressing "Update Vencord" Make sure both Vesktop and Vencord are fully up to date. You can update Vencord by right-clicking the Vesktop tray icon and pressing "Repair Vencord"
**DO NOT REPORT** any of the following issues: **DO NOT REPORT** any of the following issues:
- Purely graphical glitches like flickering, scaling issues, etc: Issue with your gpu. Nothing we can do, update drivers or disable hardware acceleration - Purely graphical glitches like flickering, scaling issues[^1]
- App crashing / not showing window with mentions of the gpu process in the stacktrace[^1]
- Screenshare not starting, black screening or crashing[^2]
- Vencord related issues: This is the Vesktop repo, not Vencord - Vencord related issues: This is the Vesktop repo, not Vencord
- **SCREENSHARE NOT STARTING** / black screening on Linux: Issue with your desktop environment, specifically its xdg-desktop-portal. - Captchas[^3]
If you're on flatpak, try using native version. If that also doesn't work, you have to fix your systen. Inspect errors and google around. - Issues with opening URLs[^4]
- Issues with Notifications[^4]
- Issues with Input Methods[^4]
- Issues with File Drag and Drop[^5]
- Network Errors[^6]
Linux users: Please only report issues with supported packages (flatpak and any builds from the README / releases). Linux users: Please only report issues with supported packages (flatpak and any builds from the README / releases).
We do not support other packages, like the AUR or Nix packages, so please first make sure your issue is reproducible with official releases, We do not support other packages, like the AUR or Nix packages, so please first make sure your issue is reproducible with official releases,
like [our Flatpak](https://flathub.org/apps/dev.vencord.Vesktop) or [AppImage](https://vencord.dev/download/vesktop/amd64/appimage) like [our Flatpak](https://flathub.org/apps/dev.vencord.Vesktop) or [AppImage](https://vencord.dev/download/vesktop/amd64/appimage)
[^1]: GPU issue. Disable hardware acceleration in Vesktop Settings or run with `--disable-gpu`
[^2]: System issue. You will have to fix it
[^3]: If you are receiving a lot of captchas, it means Discord thinks you might be a bot. Make sure you're not using a VPN/Proxy
[^4]: These things are handled by Chromium / Electron, not us. If they don't work, it's either an issue with your system or a bug with Chromium.
[^5]: You are likely using the Vesktop flatpak and trying to drop a file the flatpak can't access. You can fix this by installing Flatseal and using it to grant Vesktop full access to your files
[^6]: Issue on your end, you have to fix it. Try changing your DNS to [1.1.1.1 (Cloudflare DNS)](https://developers.cloudflare.com/1.1.1.1/setup/)
- type: input - type: input
id: discord id: discord
attributes: attributes:
@ -50,6 +64,15 @@ body:
validations: validations:
required: false required: false
- type: input
id: install-type
attributes:
label: Package Type
description: What kind of Vesktop package are you using? (Setup exe, Portable, Flatpak, AppImage, Deb, etc)
placeholder: Flatpak
validations:
required: true
- type: textarea - type: textarea
id: bug-description id: bug-description
attributes: attributes:
@ -85,7 +108,7 @@ body:
id: debug-logs id: debug-logs
attributes: attributes:
label: Debug Logs label: Debug Logs
description: Run vesktop from the command line. Include the relevant command line output here description: Run vesktop from the command line. Include the relevant command line output here. If there are any lines that seem relevant, try googling them or searching existing issues
value: | value: |
``` ```
Replace this text with your crash-log. Do not remove the backticks Replace this text with your crash-log. Do not remove the backticks

View file

@ -14,6 +14,8 @@ body:
This form is only meant for **Vesktop feature requests**. This form is only meant for **Vesktop feature requests**.
For plugin requests or Vencord feature requests, go [here](https://github.com/Vencord/plugin-requests/issues/new?template=request.yml) instead! For plugin requests or Vencord feature requests, go [here](https://github.com/Vencord/plugin-requests/issues/new?template=request.yml) instead!
**DO NOT** make any icon related requests or you will be blocked.
- type: input - type: input
id: discord id: discord
attributes: attributes:

View file

@ -33,6 +33,6 @@ jobs:
git add meta/dev.vencord.Vesktop.metainfo.xml git add meta/dev.vencord.Vesktop.metainfo.xml
git commit -m "Insert release changes for ${{ github.event.release.tag_name }}" git commit -m "Insert release changes for ${{ github.event.release.tag_name }}"
git push origin ci/meta-update git push origin ci/meta-update
gh pr create -B main -H ci/meta-update -t "Metainfo for ${{ github.event.release.tag_name }}" -b "This PR updates the metainfo for release ${{ github.event.release.tag_name }}. @lewisakura @Vendicated" gh pr create -B main -H ci/meta-update -t "Metainfo for ${{ github.event.release.tag_name }}" -b "This PR updates the metainfo for release ${{ github.event.release.tag_name }}."
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View file

@ -47,7 +47,13 @@ jobs:
- name: Run Electron Builder - name: Run Electron Builder
if: ${{ matrix.platform == 'mac' }} if: ${{ matrix.platform == 'mac' }}
run: | run: |
echo "$API_KEY" > apple.p8
pnpm electron-builder --${{ matrix.platform }} --publish always pnpm electron-builder --${{ matrix.platform }} --publish always
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CSC_LINK: ${{ secrets.APPLE_SIGNING_CERT }} CSC_LINK: ${{ secrets.APPLE_SIGNING_CERT }}
CSC_KEY_PASSWORD: ${{ secrets.APPLE_SIGNING_CERT_PASSWORD }}
API_KEY: ${{ secrets.APPLE_API_KEY }}
APPLE_API_KEY: apple.p8
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}

View file

@ -16,7 +16,7 @@ jobs:
runs-on: windows-latest runs-on: windows-latest
steps: steps:
- name: Submit package to Winget Community Repo - name: Submit package to Winget Community Repo
uses: vedantmgoyal2009/winget-releaser@4614300d5812e5df91cb02ef0edbece623d5dea8 uses: vedantmgoyal2009/winget-releaser@0db4f0a478166abd0fa438c631849f0b8dcfb99f
with: with:
identifier: Vencord.Vesktop identifier: Vencord.Vesktop
token: ${{ secrets.WINGET_PAT }} token: ${{ secrets.WINGET_PAT }}

View file

@ -21,15 +21,14 @@ Vesktop is a custom Discord desktop app
If you don't know the difference, pick the Installer. If you don't know the difference, pick the Installer.
- [Installer](https://vencord.dev/download/vesktop/amd64/windows) - [Installer](https://vencord.dev/download/vesktop/universal/windows)
- [Portable](https://vencord.dev/download/vesktop/amd64/windows-portable) - Portable:
- [x64 / amd64](https://vencord.dev/download/vesktop/amd64/windows-portable)
- [Arm® 64](https://vencord.dev/download/vesktop/arm64/windows-portable)
### Mac ### Mac
If you don't know the difference, pick the Intel build. [Vesktop.dmg](https://vencord.dev/download/vesktop/universal/dmg)
- [Intel build (amd64)](https://vencord.dev/download/vesktop/amd64/dmg)
- [Apple Silicon (arm64)](https://vencord.dev/download/vesktop/arm64/dmg)
### Linux ### Linux
@ -42,7 +41,7 @@ If you don't know the difference, pick amd64.
- [Ubuntu/Debian (.deb)](https://vencord.dev/download/vesktop/amd64/deb) - [Ubuntu/Debian (.deb)](https://vencord.dev/download/vesktop/amd64/deb)
- [Fedora/RHEL (.rpm)](https://vencord.dev/download/vesktop/amd64/rpm) - [Fedora/RHEL (.rpm)](https://vencord.dev/download/vesktop/amd64/rpm)
- [tarball](https://vencord.dev/download/vesktop/amd64/tar) - [tarball](https://vencord.dev/download/vesktop/amd64/tar)
- arm64 / aarch64 - Arm® 64 / aarch64
- [AppImage](https://vencord.dev/download/vesktop/arm64/appimage) - [AppImage](https://vencord.dev/download/vesktop/arm64/appimage)
- [Ubuntu/Debian (.deb)](https://vencord.dev/download/vesktop/arm64/deb) - [Ubuntu/Debian (.deb)](https://vencord.dev/download/vesktop/arm64/deb)
- [Fedora/RHEL (.rpm)](https://vencord.dev/download/vesktop/arm64/rpm) - [Fedora/RHEL (.rpm)](https://vencord.dev/download/vesktop/arm64/rpm)

102
eslint.config.mjs Normal file
View file

@ -0,0 +1,102 @@
/*
* SPDX-License-Identifier: GPL-3.0
* Vesktop, a desktop app aiming to give you a snappier Discord Experience
* Copyright (c) 2023 Vendicated and Vencord contributors
*/
//@ts-check
import stylistic from "@stylistic/eslint-plugin";
import pathAlias from "eslint-plugin-path-alias";
import header from "eslint-plugin-simple-header";
import importSort from "eslint-plugin-simple-import-sort";
import unusedImports from "eslint-plugin-unused-imports";
import tseslint from "typescript-eslint";
import prettier from "eslint-plugin-prettier";
export default tseslint.config(
{ ignores: ["dist"] },
{
files: ["src/**/*.{tsx,ts,mts,mjs,js,jsx}"],
plugins: {
header,
stylistic,
importSort,
unusedImports,
pathAlias,
prettier
},
settings: {
"import/resolver": {
alias: {
map: []
}
}
},
languageOptions: {
parser: tseslint.parser,
parserOptions: {
project: true,
tsconfigRootDir: import.meta.dirname
}
},
rules: {
"header/header": [
"error",
{
files: ["scripts/header.txt"]
}
],
// ESLint Rules
yoda: "error",
eqeqeq: ["error", "always", { null: "ignore" }],
"prefer-destructuring": [
"error",
{
VariableDeclarator: { array: false, object: true },
AssignmentExpression: { array: false, object: false }
}
],
"operator-assignment": ["error", "always"],
"no-useless-computed-key": "error",
"no-unneeded-ternary": ["error", { defaultAssignment: false }],
"no-invalid-regexp": "error",
"no-constant-condition": ["error", { checkLoops: false }],
"no-duplicate-imports": "error",
"dot-notation": "error",
"no-useless-escape": "error",
"no-fallthrough": "error",
"for-direction": "error",
"no-async-promise-executor": "error",
"no-cond-assign": "error",
"no-dupe-else-if": "error",
"no-duplicate-case": "error",
"no-irregular-whitespace": "error",
"no-loss-of-precision": "error",
"no-misleading-character-class": "error",
"no-prototype-builtins": "error",
"no-regex-spaces": "error",
"no-shadow-restricted-names": "error",
"no-unexpected-multiline": "error",
"no-unsafe-optional-chaining": "error",
"no-useless-backreference": "error",
"use-isnan": "error",
"prefer-const": "error",
"prefer-spread": "error",
// Styling Rules
"stylistic/spaced-comment": ["error", "always", { markers: ["!"] }],
"stylistic/no-extra-semi": "error",
// Plugin Rules
"importSort/imports": "error",
"importSort/exports": "error",
"unusedImports/no-unused-imports": "error",
"pathAlias/no-relative": "error",
"prettier/prettier": "error"
}
}
);

View file

@ -28,6 +28,34 @@
</screenshot> </screenshot>
</screenshots> </screenshots>
<releases> <releases>
<release version="1.5.3" date="2024-07-04" type="stable">
<url>https://github.com/Vencord/Vesktop/releases/tag/v1.5.3</url>
<description>
<p>Features</p>
<ul>
<li>added arm64 Windows support</li>
<li>windows &amp; macOS builds are now universal</li>
<li>added option to configure spellcheck languages</li>
<li>will auto-update from now on</li>
<li>updated electron to 31 &amp; Chromium to 126</li>
<li>macOS: Added customized dmg background by @khcrysalis</li>
<li>Windows Portable: store settings in portable folder by @MrGarlic1</li>
<li>linux audioshare: added granular selection, more options, better ui by @Curve</li>
<li>changed default screen-sharing quality to 720p 30 FPS by @Tiagoquix</li>
</ul>
<p>Fixes</p>
<ul>
<li>macOS: Added workaround for making things in draggable area clickable by @HAHALOSAH</li>
<li>fixed Screenshare UI for non-linux systems by @PolisanTheEasyNick</li>
<li>fixed opening on screen that was disconnected by @MrGarlic1</li>
<li>mac: hide native window controls with custom titlebar enabled by @MrGarlic1</li>
<li>fixed some broken patches by @D3SOX</li>
<li>fixed framerate in constraints by @kittykel</li>
<li>fixed some first launch switches not applying</li>
<li>fixed potential sandbox escape via custom vencord location</li>
</ul>
</description>
</release>
<release version="1.5.2" date="2024-05-01" type="stable"> <release version="1.5.2" date="2024-05-01" type="stable">
<url>https://github.com/Vencord/Vesktop/releases/tag/v1.5.2</url> <url>https://github.com/Vencord/Vesktop/releases/tag/v1.5.2</url>
<description> <description>
@ -208,4 +236,4 @@
<keyword>Privacy</keyword> <keyword>Privacy</keyword>
<keyword>Mod</keyword> <keyword>Mod</keyword>
</keywords> </keywords>
</component> </component>

View file

@ -2,7 +2,7 @@
"name": "vesktop", "name": "vesktop",
"version": "1.5.3", "version": "1.5.3",
"private": true, "private": true,
"description": "", "description": "Vesktop is a custom Discord desktop app",
"keywords": [], "keywords": [],
"homepage": "https://vencord.dev/", "homepage": "https://vencord.dev/",
"license": "GPL-3.0", "license": "GPL-3.0",
@ -13,7 +13,7 @@
"build:dev": "pnpm build --dev", "build:dev": "pnpm build --dev",
"package": "pnpm build && electron-builder", "package": "pnpm build && electron-builder",
"package:dir": "pnpm build && electron-builder --dir", "package:dir": "pnpm build && electron-builder --dir",
"lint": "eslint . --ext .js,.jsx,.ts,.tsx,.mts,.mjs", "lint": "eslint",
"lint:fix": "pnpm lint --fix", "lint:fix": "pnpm lint --fix",
"start": "pnpm build && electron .", "start": "pnpm build && electron .",
"start:dev": "pnpm build:dev && electron .", "start:dev": "pnpm build:dev && electron .",
@ -24,37 +24,36 @@
"updateMeta": "tsx scripts/utils/updateMeta.mts" "updateMeta": "tsx scripts/utils/updateMeta.mts"
}, },
"dependencies": { "dependencies": {
"arrpc": "github:OpenAsar/arrpc#c62ec6a04c8d870530aa6944257fe745f6c59a24", "arrpc": "github:OpenAsar/arrpc#5aadc307cb9bf4479f0a12364a253b07a77ace22",
"electron-updater": "^6.2.1" "electron-updater": "^6.3.4"
}, },
"optionalDependencies": { "optionalDependencies": {
"@vencord/venmic": "^6.1.0" "@vencord/venmic": "^6.1.0"
}, },
"devDependencies": { "devDependencies": {
"@fal-works/esbuild-plugin-global-externals": "^2.1.2", "@fal-works/esbuild-plugin-global-externals": "^2.1.2",
"@types/node": "^20.11.26", "@stylistic/eslint-plugin": "^2.8.0",
"@types/react": "^18.2.0", "@types/node": "^22.5.5",
"@typescript-eslint/eslint-plugin": "^7.2.0", "@types/react": "^18.3.8",
"@typescript-eslint/parser": "^7.2.0",
"@vencord/types": "^1.8.4", "@vencord/types": "^1.8.4",
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"electron": "^31.1.0", "electron": "^33.0.2",
"electron-builder": "^24.13.3", "electron-builder": "^25.0.5",
"esbuild": "^0.20.1", "esbuild": "^0.23.1",
"eslint": "^8.57.0", "eslint": "^9.11.0",
"eslint-config-prettier": "^9.1.0",
"eslint-import-resolver-alias": "^1.1.2", "eslint-import-resolver-alias": "^1.1.2",
"eslint-plugin-license-header": "^0.6.0", "eslint-plugin-path-alias": "^2.1.0",
"eslint-plugin-path-alias": "^1.0.0", "eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-prettier": "^5.1.3", "eslint-plugin-simple-header": "^1.2.1",
"eslint-plugin-simple-import-sort": "^12.0.0", "eslint-plugin-simple-import-sort": "^12.1.1",
"eslint-plugin-unused-imports": "^3.1.0", "eslint-plugin-unused-imports": "^4.1.4",
"prettier": "^3.2.5", "prettier": "^3.3.3",
"source-map-support": "^0.5.21", "source-map-support": "^0.5.21",
"tsx": "^4.7.1", "tsx": "^4.19.1",
"type-fest": "^4.12.0", "type-fest": "^4.26.1",
"typescript": "^5.4.2", "typescript": "^5.6.2",
"xml-formatter": "^3.6.2" "typescript-eslint": "^8.6.0",
"xml-formatter": "^3.6.3"
}, },
"packageManager": "pnpm@9.1.0", "packageManager": "pnpm@9.1.0",
"engines": { "engines": {
@ -124,13 +123,15 @@
] ]
} }
], ],
"category": "Network", "category": "public.app-category.social-networking",
"darkModeSupport": true,
"extendInfo": { "extendInfo": {
"NSMicrophoneUsageDescription": "This app needs access to the microphone", "NSMicrophoneUsageDescription": "This app needs access to the microphone",
"NSCameraUsageDescription": "This app needs access to the camera", "NSCameraUsageDescription": "This app needs access to the camera",
"com.apple.security.device.audio-input": true, "com.apple.security.device.audio-input": true,
"com.apple.security.device.camera": true "com.apple.security.device.camera": true
} },
"notarize": true
}, },
"dmg": { "dmg": {
"background": "build/background.tiff", "background": "build/background.tiff",
@ -177,11 +178,16 @@
}, },
"publish": { "publish": {
"provider": "github" "provider": "github"
},
"rpm": {
"fpm": [
"--rpm-rpmbuild-define=_build_id_links none"
]
} }
}, },
"pnpm": { "pnpm": {
"patchedDependencies": { "patchedDependencies": {
"arrpc@3.4.0": "patches/arrpc@3.4.0.patch" "arrpc@3.5.0": "patches/arrpc@3.5.0.patch"
} }
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -61,11 +61,11 @@ export const DEFAULT_HEIGHT = 720;
export const DISCORD_HOSTNAMES = ["discord.com", "canary.discord.com", "ptb.discord.com"]; export const DISCORD_HOSTNAMES = ["discord.com", "canary.discord.com", "ptb.discord.com"];
const VersionString = `AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${process.versions.chrome.split(".")[0]}.0.0.0 Safari/537.36`;
const BrowserUserAgents = { const BrowserUserAgents = {
darwin: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", darwin: `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ${VersionString}`,
linux: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", linux: `Mozilla/5.0 (X11; Linux x86_64) ${VersionString}`,
windows: windows: `Mozilla/5.0 (Windows NT 10.0; Win64; x64) ${VersionString}`
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}; };
export const BrowserUserAgent = BrowserUserAgents[process.platform] || BrowserUserAgents.windows; export const BrowserUserAgent = BrowserUserAgents[process.platform] || BrowserUserAgents.windows;

View file

@ -60,6 +60,9 @@ function init() {
// WidgetLayering (Vencord Added): Fix DevTools context menus https://github.com/electron/electron/issues/38790 // WidgetLayering (Vencord Added): Fix DevTools context menus https://github.com/electron/electron/issues/38790
disabledFeatures.push("WinRetrieveSuggestionsOnlyOnDemand", "HardwareMediaKeyHandling", "MediaSessionService"); disabledFeatures.push("WinRetrieveSuggestionsOnlyOnDemand", "HardwareMediaKeyHandling", "MediaSessionService");
// Support TTS on Linux using speech-dispatcher
app.commandLine.appendSwitch("enable-speech-dispatcher");
app.commandLine.appendSwitch("enable-features", [...new Set(enabledFeatures)].filter(Boolean).join(",")); app.commandLine.appendSwitch("enable-features", [...new Set(enabledFeatures)].filter(Boolean).join(","));
app.commandLine.appendSwitch("disable-features", [...new Set(disabledFeatures)].filter(Boolean).join(",")); app.commandLine.appendSwitch("disable-features", [...new Set(disabledFeatures)].filter(Boolean).join(","));

View file

@ -499,5 +499,17 @@ export async function createWindows() {
}); });
}); });
// evil hack to fix electron 32 regression that makes devtools always light theme
// https://github.com/electron/electron/issues/43367
// TODO: remove once fixed
mainWin.webContents.on("devtools-opened", () => {
if (!nativeTheme.shouldUseDarkColors) return;
nativeTheme.themeSource = "light";
setTimeout(() => {
nativeTheme.themeSource = "dark";
}, 100);
});
initArRPC(); initArRPC();
} }

View file

@ -72,7 +72,7 @@ ipcMain.handle(IpcEvents.VIRT_MIC_LIST, () => {
const { granularSelect } = Settings.store.audio ?? {}; const { granularSelect } = Settings.store.audio ?? {};
const targets = obtainVenmic() const targets = obtainVenmic()
?.list(granularSelect ? ["application.process.id"] : undefined) ?.list(granularSelect ? ["node.name"] : undefined)
.filter(s => s["application.process.id"] !== audioPid); .filter(s => s["application.process.id"] !== audioPid);
return targets ? { ok: true, targets, hasPipewirePulse } : { ok: false, isGlibCxxOutdated }; return targets ? { ok: true, targets, hasPipewirePulse } : { ok: false, isGlibCxxOutdated };

View file

@ -254,7 +254,13 @@ function AudioSettingsModal({
</Switch> </Switch>
<Switch <Switch
hideBorder hideBorder
onChange={v => (Settings.audio = { ...Settings.audio, ignoreDevices: v })} onChange={v =>
(Settings.audio = {
...Settings.audio,
ignoreDevices: v,
deviceSelect: v ? false : Settings.audio?.deviceSelect
})
}
value={Settings.audio?.ignoreDevices ?? true} value={Settings.audio?.ignoreDevices ?? true}
note={<>Exclude device nodes, such as nodes belonging to microphones or speakers.</>} note={<>Exclude device nodes, such as nodes belonging to microphones or speakers.</>}
> >
@ -271,6 +277,23 @@ function AudioSettingsModal({
> >
Granular Selection Granular Selection
</Switch> </Switch>
<Switch
hideBorder
onChange={value => {
Settings.audio = { ...Settings.audio, deviceSelect: value };
setAudioSources("None");
}}
value={Settings.audio?.deviceSelect ?? false}
disabled={Settings.audio?.ignoreDevices}
note={
<>
Allow to select devices such as microphones. Requires <b>Ignore Devices</b> to be turned
off.
</>
}
>
Device Selection
</Switch>
</Modals.ModalContent> </Modals.ModalContent>
<Modals.ModalFooter className="vcd-screen-picker-footer"> <Modals.ModalFooter className="vcd-screen-picker-footer">
<Button color={Button.Colors.TRANSPARENT} onClick={close}> <Button color={Button.Colors.TRANSPARENT} onClick={close}>
@ -423,6 +446,7 @@ function StreamSettings({
openSettings={openSettings} openSettings={openSettings}
includeSources={settings.includeSources} includeSources={settings.includeSources}
excludeSources={settings.excludeSources} excludeSources={settings.excludeSources}
deviceSelect={Settings.audio?.deviceSelect}
granularSelect={Settings.audio?.granularSelect} granularSelect={Settings.audio?.granularSelect}
setIncludeSources={sources => setSettings(s => ({ ...s, includeSources: sources }))} setIncludeSources={sources => setSettings(s => ({ ...s, includeSources: sources }))}
setExcludeSources={sources => setSettings(s => ({ ...s, excludeSources: sources }))} setExcludeSources={sources => setSettings(s => ({ ...s, excludeSources: sources }))}
@ -441,13 +465,23 @@ function hasMatchingProps(value: Node, other: Node) {
return Object.keys(value).every(key => value[key] === other[key]); return Object.keys(value).every(key => value[key] === other[key]);
} }
function mapToAudioItem(node: AudioSource, granularSelect?: boolean): AudioItem[] { function mapToAudioItem(node: AudioSource, granularSelect?: boolean, deviceSelect?: boolean): AudioItem[] {
if (isSpecialSource(node)) { if (isSpecialSource(node)) {
return [{ name: node, value: node }]; return [{ name: node, value: node }];
} }
const rtn: AudioItem[] = []; const rtn: AudioItem[] = [];
const mediaClass = node["media.class"];
if (mediaClass?.includes("Video") || mediaClass?.includes("Midi")) {
return rtn;
}
if (!deviceSelect && node["device.id"]) {
return rtn;
}
const name = node["application.name"]; const name = node["application.name"];
if (name) { if (name) {
@ -458,9 +492,15 @@ function mapToAudioItem(node: AudioSource, granularSelect?: boolean): AudioItem[
return rtn; return rtn;
} }
const binary = node["application.process.binary"]; const rawName = node["node.name"];
if (!name) { if (!name) {
rtn.push({ name: rawName, value: { "node.name": rawName } });
}
const binary = node["application.process.binary"];
if (!name && binary) {
rtn.push({ name: binary, value: { "application.process.binary": binary } }); rtn.push({ name: binary, value: { "application.process.binary": binary } });
} }
@ -469,10 +509,12 @@ function mapToAudioItem(node: AudioSource, granularSelect?: boolean): AudioItem[
const first = rtn[0]; const first = rtn[0];
const firstValues = first.value as Node; const firstValues = first.value as Node;
rtn.push({ if (pid) {
name: `${first.name} (${pid})`, rtn.push({
value: { ...firstValues, "application.process.id": pid } name: `${first.name} (${pid})`,
}); value: { ...firstValues, "application.process.id": pid }
});
}
const mediaName = node["media.name"]; const mediaName = node["media.name"];
@ -483,17 +525,13 @@ function mapToAudioItem(node: AudioSource, granularSelect?: boolean): AudioItem[
}); });
} }
const mediaClass = node["media.class"]; if (mediaClass) {
rtn.push({
if (!mediaClass) { name: `${first.name} [${mediaClass}]`,
return rtn; value: { ...firstValues, "media.class": mediaClass }
});
} }
rtn.push({
name: `${first.name} [${mediaClass}]`,
value: { ...firstValues, "media.class": mediaClass }
});
return rtn; return rtn;
} }
@ -535,6 +573,7 @@ function updateItems(setSources: (s: AudioSources) => void, sources?: AudioSourc
function AudioSourcePickerLinux({ function AudioSourcePickerLinux({
includeSources, includeSources,
excludeSources, excludeSources,
deviceSelect,
granularSelect, granularSelect,
openSettings, openSettings,
setIncludeSources, setIncludeSources,
@ -542,6 +581,7 @@ function AudioSourcePickerLinux({
}: { }: {
includeSources?: AudioSources; includeSources?: AudioSources;
excludeSources?: AudioSources; excludeSources?: AudioSources;
deviceSelect?: boolean;
granularSelect?: boolean; granularSelect?: boolean;
openSettings: () => void; openSettings: () => void;
setIncludeSources: (s: AudioSources) => void; setIncludeSources: (s: AudioSources) => void;
@ -592,7 +632,7 @@ function AudioSourcePickerLinux({
const allSources = sources.ok const allSources = sources.ok
? [...specialSources, ...sources.targets] ? [...specialSources, ...sources.targets]
.map(target => mapToAudioItem(target, granularSelect)) .map(target => mapToAudioItem(target, granularSelect, deviceSelect))
.flat() .flat()
.filter(uniqueName) .filter(uniqueName)
: []; : [];

View file

@ -33,15 +33,16 @@
.vcd-screen-picker-grid label { .vcd-screen-picker-grid label {
overflow: hidden; overflow: hidden;
padding: 4px 0px; padding: 8px;
cursor: pointer; cursor: pointer;
display: grid;
justify-items: center;
} }
.vcd-screen-picker-grid label:hover { .vcd-screen-picker-grid label:hover {
outline: 2px solid var(--brand-500); outline: 2px solid var(--brand-500);
} }
.vcd-screen-picker-grid div { .vcd-screen-picker-grid div {
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;
@ -101,7 +102,6 @@
.vcd-screen-picker-quality { .vcd-screen-picker-quality {
display: flex; display: flex;
gap: 1em; gap: 1em;
margin-bottom: 0.5em; margin-bottom: 0.5em;
} }

View file

@ -103,7 +103,7 @@ const SettingsOptions: Record<string, Array<BooleanSetting | SettingsComponent>>
} }
], ],
Notifications: [NotificationBadgeToggle], Notifications: [NotificationBadgeToggle],
Miscelleanous: [ Miscellaneous: [
{ {
key: "arRPC", key: "arRPC",
title: "Rich Presence", title: "Rich Presence",

View file

@ -30,6 +30,8 @@ export interface Settings {
audio?: { audio?: {
workaround?: boolean; workaround?: boolean;
deviceSelect?: boolean;
granularSelect?: boolean; granularSelect?: boolean;
ignoreVirtual?: boolean; ignoreVirtual?: boolean;