.
================================================
FILE: README.md
================================================
# Quick Settings Tweaks [
](https://extensions.gnome.org/extension/5446/quick-settings-tweaker/)
### Let's tweak Gnome Quick Settings!
[

](https://extensions.gnome.org/extension/5446/quick-settings-tweaker/)
Quick Settings Tweaker is a Gnome 46+ extension which allows you to customize the new Quick Settings Panel to your liking!
## Features
| With this extension, you can...
| How it will appear |
|:-------------------------------|:--------------------:|
| **Add the Media Controls Widget**
Control your music and videos directly from the Quick Settings, instead of the Date Menu.
For a cooler look, you can also get colors from the cover image and create a gradient.
|
|
| **Add the Volume Mixer Widget**
Adjust application volumes, without opening extra application.
Place the menu button next to the output slider for a compact and natural layout.
|
|
| **Add the Notifications Widget**
You can check what has been sent to your mailbox or messenger, without missing!
|
|
| **Layout customize**
Hide, re-order, re-color your panel and Quick Settings layout
Make it simple and keep organized!
|
|
| **Overlay menu layout**
Your Quick Settings panel is too big?
Try overlay layout! you can customize background and animation style too.
|
|
## Sponsor
You can promote and support development by [github sponsor!](https://github.com/sponsors/qwreey) You can help keep this project maintained
Here is my sponsors, thank for your support!
[](https://github.com/sponsors/qwreey)
## Stars
[](https://star-history.com/#qwreey/quick-settings-tweaks&Date)
## Development
### Building
> Prerequirements: You need to install nodejs, bash, and gnome-shell for compiling extension from source
You can create development build by executing `TARGET=dev ./install.sh create-release`. make sure run `npm i` first to ensure all build dependencies installed
Or, you can get nightly preview build from [github releases tab](https://github.com/qwreey/quick-settings-tweaks/releases). Build extension from `dev` branch is not encouraged, because the `dev` branch has unchecked bleeding-edge features not guaranteed to work. github-preview build is tested by developer and much stable than building `dev` branch.
### Contribution and Issues
Keep in mind that there may be one or a few developers, but there may be many issues and users. I think you know how to behave with manners without even having to say it.
Please check github [project board page](https://github.com/users/qwreey/projects/2) for issue priority and progress.
#### Raise an issue
If you want to raise an issue, First, **you must search your issue first.** duplicated issue will be closed, and disturb developer's time.
Second, **you must attach a related log files, gnome version and extension version informations.** if you don't provide information much about your issue, it is hard to solve your issue. and to be clear, Please use `[migration]`, `[feature]`, `[bug]` prefix for issue title, It is very useful for searching and organizing issues
And last, **you must use well-formed english** You can use a translator or AI to write it, so avoid wasting time by having the developer translate and take notes. This takes up a surprising amount of the developer's time, making analysis very difficult, especially if the logs are mixed in English and other languages.
#### PR and code contribution
If you want to contribute, **you must pull `dev` branch, Not master branch.** master branch is release branch, because AUR and some user distributions use master branch as build source. **If you create pull-request to master branch, it will be closed.** you should re-open PR to dev branch.
### Testing

You can test extension with command `./install.sh dev`. You will need tigervnc client and docker in host. Tested in arch linux but it should working on any systemd based platform
You can re-build extension by log out and close vnc window or send SIGINT to exit dev docker.
================================================
FILE: Todo.md
================================================
Scroll view layout for media widget
Touch enchantments:
Notifications: slide to discard
Readme file
homepage?
배터리 알약 아이콘
widgets:
sound output:
device to hide
show device name
sound input:
always show slider
show device name
device to hide
volume mixer
item to hide
show hidden item button (temporary)
as submenu (like background apps)
키보드로 포커스 가능해야함
더보기 아이콘 sound card 로 바꾸고 싶은데 그런 옵션이 있으면 좋겠음
Add cover image round clip effect option
이미지 비율 설정 기능
날씨 로딩중에 라벨 위치
패널 전체 오더링 << 가능했으면 좋겠음.......... 왼쪽 오른쪽 중간 고르기 가능하고
위젯 오더링
습도계
시스템 메뉴에 시간 표시
datemenu format
백그라운드 앱스 스타일: 일반, 퀵토글, 시스템레이아웃
열리는 애니메이션
미디어 타이틀 움직이도록
show full title
never
when hover, move around
always, move around
when hover, as tooltip
어나더: 자동으로 지우는 알림 리스트 (타이틀 regex)
datemenu 왼쪽 레이아웃 오른쪽레이아웃, 메뉴 열지 않기
more dimmer
option to hide widget header?
믹서 디바이스 변경 구현하기
================================================
FILE: dirzsh.zsh
================================================
$ID:load() {
lib:path-alloc2 "PATHALLOC_$ID" ./scripts :
alias execute="ID=$ID $ID:execute"
alias lg="ID=$ID $ID:lg"
alias dbus-docker="ID=$ID $ID:dbus-docker"
alias notify="ID=$ID $ID:notify"
alias notify-test="ID=$ID $ID:notify-test"
alias prefs="ID=$ID $ID:prefs"
}
$ID:unload() {
lib:path-free "PATHALLOC_$ID"
unalias execute
unalias lg
unalias dbus-docker
unalias notify
unalias notify-test
unalias prefs
}
$ID:execute() {
if [ -e ./host/vncready ]; then
sudo docker compose exec -u gnome gnome-docker env DISPLAY=":0" DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus gdbus call -e -d org.gnome.Shell -o /org/gnome/Shell -m org.gnome.Shell.Eval "$1"
else
gdbus call -e -d org.gnome.Shell -o /org/gnome/Shell -m org.gnome.Shell.Eval "$1"
fi
}
$ID:dbus-docker() {
sudo docker compose exec -u gnome gnome-docker env DISPLAY=":0" DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus $@
}
$ID:lg() {
$ID:execute "Main.createLookingGlass().toggle()"
}
$ID:notify() {
if [ -e ./host/vncready ]; then
$ID:dbus-docker notify-send $@
else
notify-send $@
fi
}
$ID:notify-test() {
$ID:notify test testmessage -u normal -t 0
}
$ID:prefs() {
if [ -e ./host/vncready ]; then
$ID:dbus-docker gnome-extensions prefs quick-settings-tweaks@qwreey
else
gnome-extensions prefs quick-settings-tweaks@qwreey
fi
}
================================================
FILE: docker-compose.example.yml
================================================
services:
gnome-docker:
container_name: gnome-docker
hostname: gnome-docker
build: ./host/gnome-docker
environment:
VNC_OPTION: -SecurityTypes=None -rfbunixpath /host/vncsocket -rfbport 5900
BEFORE_GNOME: "/extension/install.sh dev-guest"
ROOTMODE: false
XVFB_GPU: false
XVFB_SCREEN_WIDTH: 1080
RDP_OPTION: "-auth /monitors:0"
# Remote
ports:
# for rdp
- 3389:3389
# for vnc
- 5900:5900
# For systemd
security_opt:
- seccomp:unconfined
- apparmor:unconfined
cgroup: host
# Mounts
volumes:
# Systemd requirements
- type: tmpfs
target: /tmp
- type: tmpfs
target: /run
- /sys/fs/cgroup:/sys/fs/cgroup:ro
- /sys/fs/cgroup/system.slice:/sys/fs/cgroup/system.slice:rw
# Host dir
- ./host:/host:rw
- ./:/extension
- ./host/home:/home/gnome
================================================
FILE: install.sh
================================================
#!/usr/bin/env bash
cd "$(dirname "$(readlink -f "$0")")"
function update-po() {
build
echo '' > messages.po
[ "$?" != "0" ] && echo "update-po: Unable to create ./messages.po file" && return 1
which xgettext 2>/dev/null >/dev/null
[ "$?" != "0" ] && echo "update-po: xgettext is not installed on this system. please install and try again" && return 1
find ./target/out -type f \( -name "*.ui" -or -name "*.js" \) | xgettext --from-code utf-8 -j messages.po -f -
[ "$?" != "0" ] && echo "update-po: Unable to update messages.po file by xgettext" && return 1
sed -i 's|"Content\-Type: text/plain; charset=CHARSET\\n"|"Content-Type: text/plain; charset=UTF-8\\n"|g' messages.po
[ "$?" != "0" ] && echo "update-po: Unable to set charset in messages.po file" && return 1
find ./po -type f -name "*.po" | xargs -i msgmerge {} messages.po -N --no-wrap -U
[ "$?" != "0" ] && echo "update-po: Failed to update *.po files (msgmerge error)" && return 1
mv messages.po $(find ./po -type f -name "*.pot")
[ "$?" != "0" ] && echo "update-po: Unable to move messages.po file (pot file not found)" && return 1
return 0
}
function fetch-contributors() {
LABELS=$(cat scripts/contributor-labels.json)
echo "["
FIRST="1"
curl -Ls "https://api.github.com/repos/qwreey/quick-settings-tweaks/contributors?per_page=16&page=1" | while read line; do
if echo $line | grep -oP '^ *{ *$' > /dev/null; then
[ "$FIRST" = "0" ] && echo -e "\t},"
FIRST="0"
echo -e "\t{"
fi
if NAME=$(echo $line | grep -oP '(?<="login": ").*(?=")'); then
USER_LABEL=$(printf "%s" "$LABELS" | grep -oP "(?<=\"$NAME\": \").*(?=\")")
echo -e "\t\t\"name\": \"$NAME\","
echo -e "\t\t\"image\": \"$NAME\","
echo -en "\t\t"
echo "\"label\": \"${USER_LABEL:-ETC}\","
curl -Lso target/contributors/$NAME.png "https://github.com/$NAME.png?size=38"
fi
if HOMEPAGE=$(echo $line | grep -oP '(?<="html_url": ").*(?=")'); then
echo -e "\t\t\"link\": \"$HOMEPAGE\""
fi
done
echo -e "\t}"
echo "]"
}
function build() {
rm -rf target/out
mkdir -p target/out
# Typescript compiling
(
npx tsc --noCheck
cp -r target/tsc/* target/out
) &
TSC_PID=$!
# Stylesheet compiling
(
npx sass\
--no-source-map\
src/stylesheet.scss:target/out/stylesheet.css
sed $'s/^ /\t/g' -i target/out/stylesheet.css
) &
SASS_PID=$!
# Fetch contributors & Copy assets
(
if [ ! -e target/contributors ]; then
mkdir -p target/contributors
fetch-contributors > target/contributors/data.json
fi
cp metadata.json target/out
cp -r schemas target/out
cp -r media target/out
cp -r target/contributors target/out/media
) &
COPYING_PID=$!
# Wait for tasks
wait $TSC_PID
wait $SASS_PID
wait $COPYING_PID
# Update config metadata
case "$TARGET" in
dev )
sed 's/isDevelopmentBuild: false/isDevelopmentBuild: true/' -i target/out/config.js
;;
preview )
;;
release )
sed 's/isReleaseBuild: false/isReleaseBuild: true/' -i target/out/config.js
;;
github-release )
sed 's/isReleaseBuild: false/isReleaseBuild: true/' -i target/out/config.js
sed 's/isGithubBuild: false/isGithubBuild: true/' -i target/out/config.js
;;
github-preview )
sed 's/isGithubBuild: false/isGithubBuild: true/' -i target/out/config.js
;;
esac
if [ -z "$VERSION" ]; then
VERSION=$(git branch --show-current)
fi
sed "s/version: \"unknown\"/version: \"$VERSION\"/" -i target/out/config.js
[ ! -z "$BUILD_NUMBER" ] && sed "s/buildNumber: 0/buildNumber: $BUILD_NUMBER/" -i target/out/config.js
# Change indents for reducing size of target
node scripts/reindent.js -- target/out/**/*.js
# Pack extension
gnome-extensions pack target/out\
--podir=../../po\
--extra-source=features\
--extra-source=libs\
--extra-source=prefPages\
--extra-source=media\
--extra-source=global.js\
--extra-source=config.js\
--out-dir=target\
--force
[ "$?" != "0" ] && echo "Failed to pack extension" && return 1
return 0
}
function enable() {
gnome-extensions enable quick-settings-tweaks@qwreey
}
function install() {
gnome-extensions install\
target/quick-settings-tweaks@qwreey.shell-extension.zip\
--force
[ "$?" != "0" ] && echo "Failed to install extension" && return 1
echo "Extension was installed. logout and login shell, and check extension list."
return 0
}
function log() {
journalctl /usr/bin/gnome-shell -f -q --output cat | grep '\[EXTENSION QSTweaks\] '
}
function clear-old-po() {
rm ./po/*.po~
}
function compile-preferences() {
glib-compile-schemas --targetdir=target/out/schemas schemas
[ "$?" != "0" ] && echo "compile-preferences: glib-compile-schemas command failed" && return 1
return 0
}
function increase-middle-version() {
echo $(( $(cat scripts/version/latest-middle-version) + 1 )) > scripts/version/latest-middle-version
echo $(( $(cat scripts/version/latest-build-number) + 1 )) > scripts/version/latest-build-number
echo 1 > scripts/version/latest-minor-version
}
function increase-minor-version() {
echo $(( $(cat scripts/version/latest-build-number) + 1 )) > scripts/version/latest-build-number
echo $(( $(cat scripts/version/latest-minor-version) + 1 )) > scripts/version/latest-minor-version
}
function get-full-version() {
VERSION_MAJOR=$(cat scripts/version/major-version)
VERSION_MIDDLE=$(cat scripts/version/latest-middle-version)
VERSION_MINOR=$(cat scripts/version/latest-minor-version)
BUILD_NUMBER=$(cat scripts/version/latest-build-number)
VERSION_TAG=""
case "$TARGET" in
dev )
VERSION_TAG="-dev$VERSION_MINOR"
;;
preview )
VERSION_TAG="-pre$VERSION_MINOR"
;;
release )
VERSION_TAG=""
;;
github-release )
VERSION_TAG=""
;;
github-preview )
VERSION_TAG="-pre$VERSION_MINOR"
;;
esac
VERSION="$VERSION_MAJOR.$VERSION_MIDDLE$VERSION_TAG"
}
function update-metadata-version() {
get-full-version
sed 's| *"version-name": *"[^"]*",| "version-name": "'$VERSION'",|g' -i metadata.json
}
function create-release() {
get-full-version
update-metadata-version
VERSION=$VERSION BUILD_NUMBER=$BUILD_NUMBER build
cp target/quick-settings-tweaks@qwreey.shell-extension.zip target/$VERSION-$TARGET.zip
}
function dev() {
if ! sudo echo > /dev/null; then
return
fi
mkdir -p host
[ -e host/extension-ready ] && rm host/extension-ready
mkfifo host/extension-ready
[ -e host/extension-build ] && rm host/extension-build
mkfifo host/extension-build
# Build
(
TARGET="${TARGET:-dev}" create-release
echo > host/extension-ready
) &
# Watch Build Request
read -d '' INNER_BUILDWATCH << EOF
cat host/extension-build > /dev/null
while true; do
cat host/extension-build > /dev/null
if [ ! -e host/vncready ]; then
break
fi
TARGET="\${TARGET:-dev}" create-release
echo > host/extension-ready
done
EOF
setsid bash -c "$INNER_BUILDWATCH" &
BUILDWATCH_PID=$!
[ ! -e ./docker-compose.yml ] && cp ./docker-compose.example.yml ./docker-compose.yml
CURTAG=""
if [ -e "./host/gnome-docker" ]; then
CURTAG="$(git -C host/gnome-docker describe --tags --always --abbrev=0 HEAD)"
else
git clone https://github.com/qwreey/gnome-docker host/gnome-docker --recursive --tags
fi
TARTAG="$(cat scripts/version/gnome-docker-version)"
if [[ "$CURTAG" != "$TARTAG" ]]; then
git -C host/gnome-docker pull origin master --tags
git -C host/gnome-docker submodule update
git -C host/gnome-docker checkout "$TARTAG"
sudo docker compose -f ./docker-compose.yml build
fi
COMPOSEFILE="./docker-compose.yml" ./host/gnome-docker/test.sh
rm host/extension-build host/extension-ready
kill $BUILDWATCH_PID 2> /dev/null
wait $BUILDWATCH_PID
exit 0
}
function dev-guest() {
echo > /host/extension-build
cat /host/extension-ready > /dev/null
install
enable
}
function usage() {
echo 'Usage: ./install.sh COMMAND'
echo 'COMMAND:'
echo " install install the extension in the user's home directory"
echo ' under ~/.local'
echo ' build Creates a zip file of the extension'
echo ' update-po Update po files to match source files'
echo ' dev Run dev docker'
echo ' log show extension logs (live)'
echo ' clear-old-po clear *.po~'
echo ' enable enable extension'
echo ' install-enable install and enable'
echo ' compile-preferences compile schema file (test)'
}
case "$1" in
"install" )
install
;;
"install-enable" )
install
enable
;;
"build" )
build
;;
"log" )
log
;;
"update-po" )
update-po
;;
"clear-old-po" )
clear-old-po
;;
"enable" )
enable
;;
"dev" )
dev
;;
"dev-guest" )
dev-guest
;;
"compile-preferences")
compile-preferences
;;
"increase-minor-version")
increase-minor-version
;;
"increase-middle-version")
increase-middle-version
;;
"update-metadata-version")
update-metadata-version
;;
"create-release")
create-release
;;
* )
usage
;;
esac
exit
================================================
FILE: media/Changelog.md
================================================
# 2.3-stable
{{HEADER}}
- Drop gnome 48 support
- Add support for gnome 49
- Remove dnd quick toggle (now gnome support it natively)
- Add 'overlay-menu-overflow-anchor' option for adjust overlay menu box overflowing
## Fix
- VolumeMixer widget
- Fix already been disposed warning
# 2.2-stable
{{HEADER}}
- Drop gnome 46, 47 support
- Add support for gnome 48
- Remove non-compatible feature
- Date Menu
- Hide Media Control
- Hide Notifications
## Fix
- Weather widget
- Fix 'already disposed' warning
- DND Toggle
- Fix missing icon when it's turned off by PR #191
- Notification
- Better padding for Native notifications clear button by PR #184
- Fix settings names by PR #183
# 2.1-stable
{{HEADER}}
- Layout editor shows only useful items
> For example, a DND quick toggle only appears when enabled
- Migration for gnome 48 (partially)
- 'vertical' property migration
- Fix some typescript type errors
- Update locales
- Add github sponsor (replace original one)
## New Features
- Menu animation
- Add background brightness option
- Weather widget
- Add show or hide location label option
- Add max forecasts option
- Add weather interval option
- System Indicators
- Monochrome option for privacy indicators
## Fix
- System Indicators
- Fix accent indicators color not match with shell accent color
- Weather widget
- Fix status label style
- Fix project name
# 2.1-pre7
{{HEADER}}
- Improve ordering editors
- Update locale files
- Migration for gnome 48 (partially)
- Media widget: Lowered GNOME Shell API dependency for backwards compatibility
## New Features
- Quick toggle layout
- Add GType name filter option
- Now you can hide 'Unsorted items'
- System indicators layout
- Add ordering and hiding option
- Add accent screen sharing & recording indicators option
- Add accent privacy indicators option
## Fix
- Default value optimization for menu animation
- Fix broken scrollbar padding
- Fix mixer description only shows 'Playback Stream'
- Fix smooth scroll cause scrolling issue on media widget
- Fix mixer widget menu section initial state
- Fix #170, some quick toggles are not hiding
- Fix 'has been already disposed' error on weather widget
- Fix '(intermediate value).Extension.features is null' error when extension unloading
# 2.1-pre6
{{HEADER}}
- Reduce reloading cost
## New Features
- Media widget
- Add adjust smooth scroll speed option
- Overlay menu
- Smoother animation
- Better animation start offset for flyout style
- Volume mixer widget
- Add show stream icon option
- Add attach menu to output slider option
## Fix
- Media widget
- Fix 'event.moveStartCoords is undefined' error
# 2.1-pre5
{{HEADER}}
- List the license in more detail
- Weather feature is now stable
## New Features
- Media widget
- Add round clip effect detailed option
- Support trackpad and trackpoint smooth scroll
- Date menu
- Add hide left box option
- Add hide right box option
- Add menu disable option
- Add menu button hide option
- VolumeMixer widget
- Migrated from 1.18
## Fix
- Fix 'st_widget_get_theme_node called on the widget which is not in the stage' issue
## Prefs QOL patch
- Add detailed button on some options
# 2.1-pre4
{{HEADER}}
- Changelog viewer enchantments
- Show build number, git hash, and date in detailed view
## New Features
- Media widget
- Add gradient background option
- Add progress bar style option
- Add contorl button opacity option
- Implement swipe to switch page
- Implement round clip effect to make transition better
- Weather widget
- Add click command option
- Debugging
- Expose features
## Fix
- Fix gnome-shell segfault on dragging media widget
- Media widget
- Fix page indicator click action
## New Licenses
- rounded-window-corners
- Auther: yilozt
- URL: https://github.com/yilozt/rounded-window-corners
# 2.1-pre3
{{HEADER}}
- Update repo url in metadata
## New Features
- Option to hide dnd indicator completely
- Debugging
- Use better logging format
- Add logging level option
- Add extension environment expose option
- Notifications widget
- Add vfade offset option
- Add scrollbar visibility option
## Fix
- Fix 'PageIndicators has been already disposed' issue
- Add more promise catch handlers and source naming for debugging
- Removed fixStScrollViewScrollbarOverflow, use vscrollbar_policy instead
## Known issues
- Cannot hide keyboard quick toggle
# 2.1-pre2
{{HEADER}}
## New Features
- Add quick toggle ordering and hiding
- Add page indicator on media widget
- Add DND indicator position option
- Add save last session state option on unsafe mode quick toggle
## Fix
- Fix changelog text align
- Fix pref page scroll flickering issue
- Fix weather widget empty when no location selected issue
## Prefs QOL patch
- Move contributor rows to dialog
# 2.1-pre1
{{HEADER}}
- **Droped gnome-shell 43 and 44 support COMPLETELY** due to ESM incompatible
- Using major.middle.minor version system
- Using girs and typescript, for better development
- New stable, github-stable, github-preview release channel
## Shell version bump
shell-version >= 45, >= 48
## Prefs QOL patch
- Some space rich option groups are now using bottom sheet layout
- Add button for reset modified options
- Organize about section
- Add changelogs subpage
## New Features
- Reorder and hide system items
- Reanimate menu, overlay menu mode
- Weather widget
## Known issues
- Sometime, the media progress bar displayed even should't be displayed
- Weather widget shows empty box when region wasn't selected
================================================
FILE: media/dbus.xml
================================================
================================================
FILE: media/licenses.json
================================================
[
{
"licenseUri": "https://github.com/qwreey/quick-settings-tweaks/blob/master/LICENSE",
"name": "quick-settings-tweaks",
"author": "qwreey",
"url": "https://github.com/qwreey/quick-settings-tweaks",
"licenseSummary": "LGPL v3.0"
},
{
"licenseUri": "https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/COPYING",
"name": "gnome-shell",
"author": "gnome",
"url": "https://gitlab.gnome.org/GNOME/gnome-shell",
"licenseSummary": "GPL v2"
},
{
"licenseUri": "https://github.com/microsoft/TypeScript/blob/main/LICENSE.txt",
"name": "TypeScript",
"author": "microsoft",
"url": "https://www.typescriptlang.org",
"description": "Typescript compiler",
"licenseSummary": "Apache License 2.0"
},
{
"licenseUri": "https://github.com/gjsify/gnome-shell/blob/main/LICENSE",
"name": "girs",
"author": "gisify",
"url": "https://github.com/gjsify/gnome-shell",
"description": "Gnome shell typescript types",
"licenseSummary": "MIT License"
},
{
"licenseUri": "https://github.com/sass/dart-sass/blob/main/LICENSE",
"name": "sass",
"url": "https://sass-lang.com/",
"description": "Stylesheet pre-processor",
"licenseSummary": "MIT License"
},
{
"name": "gnome-volume-mixer",
"author": "mymindstorm",
"url": "https://github.com/mymindstorm/gnome-volume-mixer",
"licenseUri": "https://github.com/mymindstorm/gnome-volume-mixer/blob/master/LICENSE",
"description": "Volume mixer widget",
"affectedFiles": [
"features/widget/volumeMixer.ts"
],
"licenseSummary": "MIT License"
},
{
"licenseUri": "https://github.com/yilozt/rounded-window-corners/blob/main/LICENSE",
"name": "rounded-window-corners",
"author": "yilozt",
"url": "https://github.com/yilozt/rounded-window-corners",
"affectedFiles": [
"media/rounded_corners.frag",
"libs/roundClip.ts"
],
"description": "Round clip shader"
}
]
================================================
FILE: media/rounded_corners.frag
================================================
// This shader is copied from Mutter project:
// https://gitlab.gnome.org/GNOME/mutter/-/blob/main/src/compositor/meta-background-content.c
//
// With a litte change to make it works well with windows
// The uniforms variables for controls
uniform vec4 bounds; // x, y: top left; z, w: bottom right
uniform float clip_radius;
uniform vec4 inner_bounds;
uniform float inner_clip_radius;
uniform vec2 pixel_step;
uniform float border_width;
uniform vec4 border_color;
uniform float exponent;
float circle_bounds(vec2 p, vec2 center, float clip_radius) {
vec2 delta = p - vec2(center.x, center.y);
float dist_squared = dot(delta, delta);
// Fully outside the circle
float outer_radius = clip_radius + 0.5;
if(dist_squared >= (outer_radius * outer_radius))
return 0.0;
// Fully inside the circle
float inner_radius = clip_radius - 0.5;
if(dist_squared <= (inner_radius * inner_radius))
return 1.0;
// Only pixels on the edge of the curve need expensive antialiasing
return outer_radius - sqrt(dist_squared);
}
float squircle_bounds(vec2 p, vec2 center, float clip_radius, float exponent) {
vec2 delta = abs(p - center);
float pow_dx = pow(delta.x, exponent);
float pow_dy = pow(delta.y, exponent);
float dist = pow(pow_dx + pow_dy, 1.0 / exponent);
return clamp(clip_radius - dist + 0.5, 0.0, 1.0);
}
float rounded_rect_coverage(vec2 p, vec4 bounds, float clip_radius, float exponent) {
// Outside the bounds
if(p.x < bounds.x || p.x > bounds.z || p.y < bounds.y || p.y > bounds.w) {
return 0.0;
}
vec2 center;
float center_left = bounds.x + clip_radius;
float center_right = bounds.z - clip_radius;
if(p.x < center_left)
center.x = center_left;
else if(p.x > center_right)
center.x = center_right;
else
return 1.0; // The vast majority of pixels exit early here
float center_top = bounds.y + clip_radius;
float center_bottom = bounds.w - clip_radius;
if(p.y < center_top)
center.y = center_top;
else if(p.y > center_bottom)
center.y = center_bottom;
else
return 1.0;
if(exponent <= 2.0) {
return circle_bounds(p, center, clip_radius);
} else {
return squircle_bounds(p, center, clip_radius, exponent);
}
}
void main() {
vec2 texture_coord = cogl_tex_coord0_in.xy / pixel_step;
float outer_alpha = rounded_rect_coverage(texture_coord, bounds, clip_radius, exponent);
if(border_width > 0.9 || border_width < -0.9) {
float inner_alpha = rounded_rect_coverage(texture_coord, inner_bounds, inner_clip_radius, exponent);
float border_alpha = clamp(abs(outer_alpha - inner_alpha), 0.0, 1.0);
if (border_width > 0.0) {
// Clip corners of window first
cogl_color_out *= outer_alpha;
// Then mix Rounded window and border
cogl_color_out = mix(cogl_color_out, vec4(border_color.rgb, 1.0), border_alpha * border_color.a);
} else {
// Fill an rounded rectangle with border color first
vec4 border_rect = vec4(border_color.rgb, 1.0) * inner_alpha * border_color.a;
// Then mix rounded window and border, rounded window is smaller than border_rect
cogl_color_out = mix(border_rect, cogl_color_out, outer_alpha);
}
} else {
cogl_color_out *= outer_alpha;
}
}
================================================
FILE: metadata.json
================================================
{
"name": "Quick Settings Tweaks",
"uuid": "quick-settings-tweaks@qwreey",
"description": "Let's tweak gnome's quick settings! You can add Media Controls, Notifications, Volume Mixer on quick settings and remove useless buttons!",
"shell-version": ["48", "49"],
"url": "https://github.com/qwreey/quick-settings-tweaks",
"settings-schema": "org.gnome.shell.extensions.quick-settings-tweaks",
"gettext-domain": "quick-settings-tweaks",
"version-name": "2.2-pre1",
"donations": {
"github": "qwreey"
}
}
================================================
FILE: old/features/volumeMixer.ts
================================================
import { featureReloader } from "../libs/utility.js"
import { VolumeMixer } from "../libs/volumeMixerHandler.js"
import { Global } from "../global.js"
export class VolumeMixerFeature {
load() {
let settings = Global.Settings
// setup reloader
featureReloader.enableWithSettingKeys(this, [
"volume-mixer-enabled",
"volume-mixer-position",
"volume-mixer-filtered-apps",
"volume-mixer-show-description",
"volume-mixer-show-icon",
"volume-mixer-filter-mode",
"volume-mixer-use-regex",
"volume-mixer-check-description"
])
// check is feature enabled
if (!Global.Settings.get_boolean("volume-mixer-enabled")) return
// Make volume mixer
this.volumeMixer = new VolumeMixer({
'volume-mixer-filtered-apps': settings.get_strv("volume-mixer-filtered-apps"),
'volume-mixer-filter-mode': settings.get_string("volume-mixer-filter-mode"),
'volume-mixer-show-description': settings.get_boolean("volume-mixer-show-description"),
'volume-mixer-show-icon': settings.get_boolean("volume-mixer-show-icon"),
'volume-mixer-check-description': settings.get_boolean("volume-mixer-check-description"),
'volume-mixer-use-regex': settings.get_boolean("volume-mixer-use-regex")
})
// Insert volume mixer into Quick Settings
Global.QuickSettingsMenu.addItem(this.volumeMixer.actor, 2)
if (Global.Settings.get_string("volume-mixer-position") === "top") {
Global.GetStreamSlider(({ InputStreamSlider }) => {
Global.QuickSettingsMenu._grid.set_child_above_sibling(
this.volumeMixer.actor,
InputStreamSlider
)
})
}
}
unload() {
// disable feature reloader
featureReloader.disable(this)
if (this.volumeMixer) this.volumeMixer.destroy()
this.volumeMixer = null
}
}
================================================
FILE: old/inputOutput.ts
================================================
import { Global } from "./global.js"
import St from "gi://St"
import * as Volume from "resource:///org/gnome/shell/ui/status/volume.js"
import * as PopupMenu from "resource:///org/gnome/shell/ui/popupMenu.js"
import { FeatureBase, type SettingLoader } from "./libs/shell/feature.js"
import { logger } from "./libs/shared/logger.js"
export class SoundTweakFeature extends FeatureBase {
// #region settings
outputShowSelected: boolean
inputShowSelected: boolean
inputAlwaysShow: boolean
outputHide: {name: string}[]
inputHide: {name: string}[]
loadSettings(loader: SettingLoader): void {
this.outputShowSelected = loader.loadBoolean("sound-output-show-selected")
this.inputShowSelected = loader.loadBoolean("sound-input-show-selected")
this.inputAlwaysShow = loader.loadBoolean("sound-input-always-show")
this.outputHide = loader.loadValue("sound-output-hide")
this.inputHide = loader.loadValue("sound-input-hide")
}
// #endregion settings
onLoad() {
if (this.outputShowSelected) {
const label = this.maid.destroyJob(new St.Label({
style_class: "QSTWEAKS-volume-mixer-label"
}))
Global.QuickSettingsMenu.addItem(label, 2)
Global.GetStreamSlider().then(({ OutputStreamSlider }) => {
Global.QuickSettingsGrid.set_child_below_sibling(label, OutputStreamSlider)
}).catch(logger.error)
}
}
onUnload(): void {}
}
unload() {
// disable feature reloader
featureReloader.disable(this)
if (this._inputListener) {
this._detachInputLabel()
Volume.getMixerControl().disconnect(this._inputListener)
this._inputListener = null
}
if (this._inputVisibilityListener) {
let inputVisibilityListener = this._inputVisibilityListener
this._inputVisibilityListener = null
Global.GetStreamSlider(({ InputStreamSlider }) => {
InputStreamSlider.disconnect(inputVisibilityListener)
InputStreamSlider.visible = InputStreamSlider._shouldBeVisible()
})
}
if (this._outputListener) {
this._detachOutputLabel()
Volume.getMixerControl().disconnect(this._outputListener)
this._outputListener = null
}
}
// =========================================== Ouput ===========================================
_setupOutputChangedListener() {
this._attachOutputLabel()
this._outputListener = Volume.getMixerControl().connect('active-output-update', (c, id) => this._onOutputDeviceChanged(id))
}
_onOutputDeviceChanged(deviceId) {
const device = Volume.getMixerControl().lookup_output_id(deviceId)
this.outputLabel.text = this._getDeviceName(device)
}
_attachOutputLabel() {
this.outputLabel = new St.Label()
this.outputLabel.style_class = "QSTWEAKS-volume-mixer-label"
Global.QuickSettingsMenu.addItem(this.outputLabel, 2)
this.outputLabel.visible = Global.Settings.get_boolean("output-show-selected")
Global.GetStreamSlider(({ OutputStreamSlider }) => {
Global.QuickSettingsGrid.set_child_below_sibling(this.outputLabel, OutputStreamSlider)
this.outputLabel.text = this._findActiveDevice(OutputStreamSlider)
})
}
_detachOutputLabel() {
if (this.outputLabel && this.outputLabel.get_parent()) {
this.outputLabel.get_parent().remove_child(this.outputLabel)
this.outputLabel = null
}
}
// =========================================== Input ===========================================
_setupInputChangedListener() {
this._attachInputLabel()
this._inputListener = Volume.getMixerControl().connect('active-input-update', (c, id) => this._onInputDeviceChanged(id))
}
_attachInputLabel() {
this.inputLabel = new St.Label()
this.inputLabel.style_class = "QSTWEAKS-volume-mixer-label"
Global.QuickSettingsMenu.addItem(this.inputLabel, 2)
Global.GetStreamSlider(({ InputStreamSlider }) => {
Global.QuickSettingsGrid.set_child_below_sibling(this.inputLabel, InputStreamSlider)
this.inputLabel.text = this._findActiveDevice(InputStreamSlider)
})
this._setInputLabelVisibility()
}
_onInputDeviceChanged(deviceId) {
const device = Volume.getMixerControl().lookup_input_id(deviceId)
this.inputLabel.text = this._getDeviceName(device)
}
_detachInputLabel() {
if (this.inputLabel && this.inputLabel.get_parent()) {
this.inputLabel.get_parent().remove_child(this.inputLabel)
this.inputLabel = null
}
}
// =========================================== Input Visbility ===========================================
_setupInputVisibilityObserver() {
Global.GetStreamSlider(({ InputStreamSlider }) => {
this._inputVisibilityListener = InputStreamSlider.connect("notify::visible", () => this._onInputStreamSliderSynced())
this._onInputStreamSliderSynced()
})
}
_onInputStreamSliderSynced() {
this._setInputStreamSliderVisibility()
if (this._inputListener) {
this._setInputLabelVisibility()
}
}
_setInputStreamSliderVisibility() {
Global.GetStreamSlider(({ InputStreamSlider }) => {
InputStreamSlider.visible = InputStreamSlider._shouldBeVisible() || Global.Settings.get_boolean("input-always-show")
})
}
_setInputLabelVisibility() {
Global.GetStreamSlider(({ InputStreamSlider }) => {
this.inputLabel.visible = InputStreamSlider.visible && Global.Settings.get_boolean("input-show-selected")
})
}
// =========================================== Utils ===========================================
_findActiveDevice(sliderObject) {
// find the current selected input and grab the input text from that
let menuChildren = sliderObject.menu.box.get_children()[1].get_children()
for (let index = 0; index < menuChildren.length; index++) {
let item = menuChildren[index]
if (item._ornament == PopupMenu.Ornament.CHECK) {
return item.label.text
}
}
return null
}
_getDeviceName(device) {
if (!device)
return
const { description, origin } = device
const name = origin
? `${description} – ${origin}`
: description
return name
}
}
================================================
FILE: old/layoutCustomize.ts
================================================
import St from "gi://St"
import { Global } from "../global.js"
import { FeatureBase, type SettingLoader } from "../libs/feature.js"
import { QuickMenuToggle } from "resource:///org/gnome/shell/ui/quickSettings.js"
export class LayoutCustomize extends FeatureBase {
_scroll: St.ScrollView
_sections: St.BoxLayout
// #region settings
override loadSettings(loader: SettingLoader): void {
}
// #endregion settings
onChild(actor: QuickMenuToggle) {
actor.get_parent().remove_child(actor)
this._sections.add_child(actor)
}
checkChildren() {
for (const item of Global.QuickSettingsGrid.get_children()) {
if (item instanceof QuickMenuToggle) this.onChild(item)
}
}
update() {
}
override onLoad(): void {
Global.QuickSettingsBox.vertical = false
// Global.QuickSettingsBox.add_child(
// new St.Button({height: 100, width: 100, style: "background-color:red;"})
// )
this.maid.connectJob(
Global.QuickSettingsBox, "notify::mapped", ()=>{
if (Global.QuickSettingsBox.mapped) this.update()
}
)
}
override onUnload(): void {
Global.QuickSettingsBox.vertical = true
}
}
================================================
FILE: old/libs/streamSlider.ts
================================================
import GObject from "gi://GObject"
import Gio from "gi://Gio"
import GLib from "gi://GLib"
import Gvc from "gi://Gvc"
import { QuickSlider } from "resource:///org/gnome/shell/ui/quickSettings.js"
import * as PopupMenu from "resource:///org/gnome/shell/ui/popupMenu.js"
const ALLOW_AMPLIFIED_VOLUME_KEY = 'allow-volume-above-100-percent'
class StreamSlider extends QuickSlider {
_init(control) {
super._init()
this._connections = [] // ADDED BY QWREEY
this._control = control
this._inDrag = false
this._notifyVolumeChangeId = 0
this._soundSettings = new Gio.Settings({
schema_id: 'org.gnome.desktop.sound',
})
// MODED BY QWREEY
this._connections.push([
this._soundSettings,
this._soundSettings.connect(`changed::${ALLOW_AMPLIFIED_VOLUME_KEY}`,
() => this._amplifySettingsChanged())
])
this._amplifySettingsChanged()
this._sliderChangedId = this.slider.connect('notify::value',
() => this._sliderChanged())
this._connections.push([ // ADDED BY QWREEY
this.slider, this._sliderChangedId
])
this._connections.push([ // MODED BY QWREEY
this.slider,
this.slider.connect('drag-begin', () => (this._inDrag = true))
])
this._connections.push([ // MODED BY QWREEY
this.slider,
this.slider.connect('drag-end', () => {
this._inDrag = false
this._notifyVolumeChange()
})
])
this._deviceItems = new Map()
this._deviceSection = new PopupMenu.PopupMenuSection()
this.menu.addMenuItem(this._deviceSection)
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem())
this.menu.addSettingsAction(_('Sound Settings'), 'gnome-sound-panel.desktop')
this._stream = null
this._volumeCancellable = null
this._icons = []
this._sync()
this._connections.push([ // ADDED BY QWREEY
this,
this.connect('destroy', this._destroy.bind(this))
])
}
get stream() {
return this._stream
}
set stream(stream) {
this._stream?.disconnectObject(this)
this._stream = stream
if (this._stream) {
this._connectStream(this._stream)
this._updateVolume()
} else {
this.emit('stream-updated')
}
this._sync()
}
_connectStream(stream) {
stream.connectObject(
'notify::is-muted', this._updateVolume.bind(this),
'notify::volume', this._updateVolume.bind(this), this)
}
_lookupDevice(_id) {
throw new GObject.NotImplementedError(
`_lookupDevice in ${this.constructor.name}`)
}
_activateDevice(_device) {
throw new GObject.NotImplementedError(
`_activateDevice in ${this.constructor.name}`)
}
_addDevice(id) {
if (this._deviceItems.has(id))
return
const device = this._lookupDevice(id)
if (!device)
return
const { description, origin } = device
const name = origin
? `${description} – ${origin}`
: description
const item = new PopupMenu.PopupImageMenuItem(name, device.get_gicon())
this._connections.push([
item,
item.connect('activate', () => this._activateDevice(device))
])
this._deviceSection.addMenuItem(item)
this._deviceItems.set(id, item)
this._sync()
}
_removeDevice(id) {
this._deviceItems.get(id)?.destroy()
if (this._deviceItems.delete(id))
this._sync()
}
_setActiveDevice(activeId) {
for (const [id, item] of this._deviceItems) {
item.setOrnament(id === activeId
? PopupMenu.Ornament.CHECK
: PopupMenu.Ornament.NONE)
}
}
_shouldBeVisible() {
return this._stream != null
}
_sync() {
this.visible = this._shouldBeVisible()
this.menuEnabled = this._deviceItems.size > 1
}
_sliderChanged() {
if (!this._stream)
return
let value = this.slider.value
let volume = value * this._control.get_vol_max_norm()
let prevMuted = this._stream.is_muted
let prevVolume = this._stream.volume
if (volume < 1) {
this._stream.volume = 0
if (!prevMuted)
this._stream.change_is_muted(true)
} else {
this._stream.volume = volume
if (prevMuted)
this._stream.change_is_muted(false)
}
this._stream.push_volume()
let volumeChanged = this._stream.volume !== prevVolume
if (volumeChanged && !this._notifyVolumeChangeId && !this._inDrag) {
this._notifyVolumeChangeId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 30, () => {
this._notifyVolumeChange()
this._notifyVolumeChangeId = 0
return GLib.SOURCE_REMOVE
})
GLib.Source.set_name_by_id(this._notifyVolumeChangeId,
'[gnome-shell] this._notifyVolumeChangeId')
}
}
_notifyVolumeChange() {
if (this._volumeCancellable)
this._volumeCancellable.cancel()
this._volumeCancellable = null
if (this._stream.state === Gvc.MixerStreamState.RUNNING)
return // feedback not necessary while playing
this._volumeCancellable = new Gio.Cancellable()
let player = global.display.get_sound_player()
player.play_from_theme('audio-volume-change',
_('Volume changed'), this._volumeCancellable)
}
_changeSlider(value) {
this.slider.block_signal_handler(this._sliderChangedId)
this.slider.value = value
this.slider.unblock_signal_handler(this._sliderChangedId)
}
_updateVolume() {
let muted = this._stream.is_muted
this._changeSlider(muted
? 0 : this._stream.volume / this._control.get_vol_max_norm())
this.emit('stream-updated')
}
_amplifySettingsChanged() {
this._allowAmplified = this._soundSettings.get_boolean(ALLOW_AMPLIFIED_VOLUME_KEY)
this.slider.maximum_value = this._allowAmplified
? this.getMaxLevel() : 1
if (this._stream)
this._updateVolume()
}
getIcon() {
if (!this._stream)
return null
let volume = this._stream.volume
let n
if (this._stream.is_muted || volume <= 0) {
n = 0
} else {
n = Math.ceil(3 * volume / this._control.get_vol_max_norm())
n = Math.clamp(n, 1, this._icons.length - 1)
}
return this._icons[n]
}
getLevel() {
if (!this._stream)
return null
return this._stream.volume / this._control.get_vol_max_norm()
}
getMaxLevel() {
let maxVolume = this._control.get_vol_max_norm()
if (this._allowAmplified)
maxVolume = this._control.get_vol_max_amplified()
return maxVolume / this._control.get_vol_max_norm()
}
// ADDED BY QWREEY
_destroy() {
GLib.Source.remove(this._notifyVolumeChangeId)
for (const item of this._connections) {
item[0].disconnect(item[1])
}
this._connections = null
}
}
GObject.registerClass({
Signals: {
'stream-updated': {},
},
}, StreamSlider)
================================================
FILE: old/libs/volumeMixerHandlerNotImpled.ts
================================================
/*
* This code is partially licensed under the gnome-volume-mixer license.
* For more details, please check the license page in the about tab of the extension settings.
*/
import St from "gi://St"
import Gvc from "gi://Gvc"
import GObject from "gi://GObject"
import Gio from "gi://Gio"
import GLib from "gi://GLib"
import { QuickSlider } from "resource:///org/gnome/shell/ui/quickSettings.js"
import * as PopupMenu from "resource:///org/gnome/shell/ui/popupMenu.js"
import * as Volume from "resource:///org/gnome/shell/ui/status/volume.js"
import Maid from "./libs/maid.js"
const ALLOW_AMPLIFIED_VOLUME_KEY = 'allow-volume-above-100-percent'
// 디바이스 변경 구현하기
// 루프는 오직 컨테이너가 보이는 상태에서만 작동해야함
class StreamSlider extends QuickSlider {
_init(control: Gvc.MixerControl, stream: Gvc.MixerStream) {
// ...
this._maid.connectJob(this.slider, "drag-begin", () => { this._inDrag = true })
this._maid.connectJob(this.slider, "drag-end", () => { this._inDrag = false })
// this._deviceItems = new Map()
// this._deviceSection = new PopupMenu.PopupMenuSection()
// this.menu.addMenuItem(this._deviceSection)
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem())
this.menu.addSettingsAction(_('Sound Settings'), 'gnome-sound-panel.desktop')
// ...
}
// ...
_connectStream(stream: Gvc.MixerStream) {
}
// ...
// _lookupDevice(_id) {
// throw new GObject.NotImplementedError(
// `_lookupDevice in ${this.constructor.name}`)
// }
// _activateDevice(_device) {
// throw new GObject.NotImplementedError(
// `_activateDevice in ${this.constructor.name}`)
// }
// _addDevice(id) {
// if (this._deviceItems.has(id))
// return
// const device = this._lookupDevice(id)
// if (!device)
// return
// const { description, origin } = device
// const name = origin
// ? `${description} – ${origin}`
// : description
// const item = new PopupMenu.PopupImageMenuItem(name, device.get_gicon())
// this._connections.push([
// item,
// item.connect('activate', () => this._activateDevice(device))
// ])
// this._deviceSection.addMenuItem(item)
// this._deviceItems.set(id, item)
// this._sync()
// }
// _removeDevice(id) {
// this._deviceItems.get(id)?.destroy()
// if (this._deviceItems.delete(id))
// this._sync()
// }
// _setActiveDevice(activeId) {
// for (const [id, item] of this._deviceItems) {
// item.setOrnament(id === activeId
// ? PopupMenu.Ornament.CHECK
// : PopupMenu.Ornament.NONE)
// }
// }
// ...
_shouldBeVisible() {
return this._stream != null
}
// not used
getIcon() {
if (!this._stream)
return null
let volume = this._stream.volume
let n
if (this._stream.is_muted || volume <= 0) {
n = 0
} else {
n = Math.ceil(3 * volume / this._control.get_vol_max_norm())
n = Math.clamp(n, 1, this._icons.length - 1)
}
return this._icons[n]
}
}
================================================
FILE: old/menus.ts
================================================
// Sound output menu
// Sound input menu
// Bluetooth
// Wifi
// VPN
// Power mode (detailed?)
// Wired
// Hide item from...
================================================
FILE: old/other.ts
================================================
import Adw from "gi://Adw"
import GObject from "gi://GObject"
import Gio from "gi://Gio"
import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"
import Config from "../config.js"
import type QstExtensionPreferences from "../prefs.js"
import {
Group,
SwitchRow,
fixPageScrollIssue,
} from "../libs/prefComponents.js"
export const OtherPage = GObject.registerClass({
GTypeName: Config.baseGTypeName+"OtherPage",
}, class OtherPage extends Adw.PreferencesPage {
constructor(settings: Gio.Settings, _prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) {
super({
name: "Other",
title: _("Other"),
iconName: "preferences-system-symbolic",
})
fixPageScrollIssue(this)
}
})
================================================
FILE: old/panel.ts
================================================
================================================
FILE: old/prefsPages/volumeMixer.ts
================================================
import Adw from "gi://Adw"
import Gtk from "gi://Gtk"
import GObject from "gi://GObject"
import Gio from "gi://Gio"
import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"
import {
baseGTypeName,
SwitchRow,
makeDropdown
} from "../libs/prefComponents.js"
export const VolumeMixerAddFilterDialog = GObject.registerClass({
GTypeName: baseGTypeName+'VolumeMixerAddFilterDialog',
}, class VolumeMixerAddFilterDialog extends Gtk.Dialog {
appNameEntry
filterListData
constructor(callingWidget, filterListData) {
super({
use_header_bar: true,
transient_for: callingWidget.get_root(),
destroy_with_parent: true,
modal: true,
resizable: false,
title: _("Add Application to filtering")
})
this.filterListData = filterListData
const addButton = this.add_button(_("Add"), Gtk.ResponseType.OK)
addButton.get_style_context().add_class('suggested-action')
addButton.sensitive = false
this.add_button(_("Cancel"), Gtk.ResponseType.CANCEL)
const dialogContent = this.get_content_area()
dialogContent.margin_top = 20
dialogContent.margin_bottom = 20
dialogContent.margin_end = 20
dialogContent.margin_start = 20
const appNameLabel = new Gtk.Label({
label: _("Application name"),
halign: Gtk.Align.START,
margin_bottom: 10
})
dialogContent.append(appNameLabel)
this.appNameEntry = new Gtk.Entry()
this.appNameEntry.connect('activate', () => {
if (this.checkInputValid()) {
this.response(Gtk.ResponseType.OK)
}
})
dialogContent.append(this.appNameEntry)
this.appNameEntry.connect("changed", () => {
addButton.sensitive = this.checkInputValid()
})
}
checkInputValid() {
if (this.appNameEntry.text.length === 0) {
return false
} else if (this.filterListData.indexOf(this.appNameEntry.text) !== -1) {
return false
} else {
return true
}
}
})
export const FilterMode = GObject.registerClass({
Properties: {
'name': GObject.ParamSpec.string(
'name', 'name', 'name',
GObject.ParamFlags.READWRITE,
null),
'value': GObject.ParamSpec.string(
'value', 'value', 'value',
GObject.ParamFlags.READWRITE,
null),
},
}, class FilterMode extends GObject.Object {
_init(name, value) {
super._init({ name, value })
}
})
export const volumeMixerPage = GObject.registerClass({
GTypeName: baseGTypeName+'volumeMixerPage',
}, class volumeMixerPage extends Adw.PreferencesPage {
constructor(settings) {
// group config
super({
name: 'volumeMixer',
title: _('Volume Mixer'),
iconName: 'audio-volume-high-symbolic',
})
this.settings = settings
this.filterListData = this.settings.get_strv("volume-mixer-filtered-apps")
const generalGroup = new Adw.PreferencesGroup({
title: _("General"),
description: _("Enchant input/output slider")
})
SwitchRow({
parent: generalGroup,
title: _("Show current audio output selection"),
value: settings.get_boolean("output-show-selected"),
subtitle: _("Always show the current audio output selection above the volume slider"),
bind: "output-show-selected]
})
SwitchRow({
parent: generalGroup,
title: _("Show current audio input selection"),
value: settings.get_boolean("input-show-selected"),
subtitle: _("Always show the current audio input selection above the volume slider"),
bind: "input-show-selected]
})
SwitchRow({
parent: generalGroup,
title: _("Always show input"),
value: settings.get_boolean("input-always-show"),
subtitle: _("Always show the audio input volume slider, even when there is no audio input stream."),
bind: "input-always-show]
})
this.add(generalGroup)
// volumeMixerGroup
const volumeMixerGroup = new Adw.PreferencesGroup({
title: _("Add volume mixer (PulseAudio, Pipewire)"),
description: _("Turn on to make the volume mixer visible\nForked from https://github.com/mymindstorm/gnome-volume-mixer"),
headerSuffix: SwitchRow({
title: "",
value: settings.get_boolean("volume-mixer-enabled"),
bind: "volume-mixer-enabled",
})
})
makeDropdown({ // move to bottom
parent: volumeMixerGroup,
title: _("Position"),
subtitle: _("Set volume mixer position"),
value: this.settings.get_string('volume-mixer-position'),
type: "string",
bind: [this.settings, 'volume-mixer-position'],
items: [
{name: _("Top (Below Output/Input slider)"), value: "top"},
{name: _("Bottom"), value: "bottom"},
],
sensitiveBind: "volume-mixer-enabled",
})
SwitchRow({ // show-description
title: _('Show stream Description'),
subtitle: _('Show audio stream description above the slider'),
value: this.settings.get_boolean('volume-mixer-show-description'),
parent: volumeMixerGroup,
bind: [this.settings, 'volume-mixer-show-description'],
sensitiveBind: "volume-mixer-enabled",
})
SwitchRow({ // show-icon
title: _('Show stream Icon'),
subtitle: _('Show application icon in front of the slider'),
value: this.settings.get_boolean('volume-mixer-show-icon'),
parent: volumeMixerGroup,
bind: [this.settings, 'volume-mixer-show-icon'],
sensitiveBind: "volume-mixer-enabled",
})
this.add(volumeMixerGroup)
// Application filter settings group
const filterGroup = new Adw.PreferencesGroup({
title: "",
description: _('Filter applications shown in the volume mixer.'),
})
this.add(filterGroup)
// filter-mode
makeDropdown({
parent: filterGroup,
title: _("Filter Mode"),
value: this.settings.get_string('volume-mixer-filter-mode'),
type: "string",
bind: [this.settings, 'volume-mixer-filter-mode'],
items: [
{name: _("Blacklist"), value: "block"},
{name: _("Whitelist"), value: "allow"},
],
sensitiveBind: "volume-mixer-enabled",
})
SwitchRow({
parent: filterGroup,
title: _('Using Javascript Regex'),
subtitle: _('Use Javascript RegExp for filtering app name or description'),
value: this.settings.get_boolean('volume-mixer-use-regex'),
bind: [this.settings, 'volume-mixer-use-regex'],
sensitiveBind: "volume-mixer-enabled",
})
SwitchRow({
parent: filterGroup,
title: _("Check Stream Description"),
subtitle: _("Check Description also"),
value: this.settings.get_boolean('volume-mixer-check-description'),
bind: [this.settings, 'volume-mixer-check-description'],
sensitiveBind: "volume-mixer-enabled",
})
// group to act as spacer for filter list
this.filteredAppsGroup = new Adw.PreferencesGroup()
settings.bind(
"volume-mixer-enabled",
this.filteredAppsGroup,'sensitive',
Gio.SettingsBindFlags.DEFAULT
)
this.filteredAppsGroup.sensitive = settings.get_boolean("volume-mixer-enabled")
this.add(this.filteredAppsGroup)
// List of filtered apps
for (const filteredAppName of this.filterListData) {
this.filteredAppsGroup.add(this.buildFilterListRow(filteredAppName))
}
// Add filter entry button
this.createAddFilteredAppButtonRow()
// TODO: modes
// - group by application
// - group by application but as a dropdown with streams
// - show all streams
// TODO: go thru github issues
// popularity: page 26, 5th from the top
// TODO: style
}
createAddFilteredAppButtonRow() {
// I wanted to use Adw.PrefrencesRow, but you can't get the 'row-activated' signal unless it's part of a Gtk.ListBox.
// Adw.PrefrencesGroup doesn't extend Gtk.ListBox.
// TODO: Learn a less hacky to do this. I'm currently too new to GTK to know the best practice.
this.addFilteredAppButtonRow = new Adw.ActionRow()
const addIcon = Gtk.Image.new_from_icon_name("list-add")
addIcon.height_request = 40
this.addFilteredAppButtonRow.set_child(addIcon)
this.filteredAppsGroup.add(this.addFilteredAppButtonRow)
// It won't send 'activated' signal w/o this being set.
this.addFilteredAppButtonRow.activatable_widget = addIcon
this.addFilteredAppButtonRow.connect('activated', (callingWidget) => {
this.showFilteredAppDialog(callingWidget, this.filterListData)
})
}
buildFilterListRow(filteredAppName) {
const filterListRow = new Adw.PreferencesRow({
title: filteredAppName,
activatable: false,
})
// Make box for custom row
const filterListBox = new Gtk.Box({
margin_bottom:6,
margin_top: 6,
margin_end: 15,
margin_start: 15
})
// Add title
const filterListLabel = Gtk.Label.new(filterListRow.title)
filterListLabel.hexpand = true
filterListLabel.halign = Gtk.Align.START
filterListBox.append(filterListLabel)
// Add remove button
const filterListButton = new Gtk.Button({
halign: Gtk.Align.END
})
// Add icon to remove button
const filterListImage = Gtk.Image.new_from_icon_name("user-trash-symbolic")
filterListButton.set_child(filterListImage)
// Tie action to remove button
filterListButton.connect("clicked", (_button) => this.removeFilteredApp(filteredAppName, filterListRow))
filterListBox.append(filterListButton)
filterListRow.set_child(filterListBox)
return filterListRow
}
removeFilteredApp(filteredAppName, filterListRow) {
this.filterListData.splice(this.filterListData.indexOf(filteredAppName), 1)
this.settings.set_strv("volume-mixer-filtered-apps", this.filterListData)
this.filteredAppsGroup.remove(filterListRow)
}
addFilteredApp(filteredAppName) {
this.filterListData.push(filteredAppName)
this.settings.set_strv("volume-mixer-filtered-apps", this.filterListData)
this.filteredAppsGroup.remove(this.addFilteredAppButtonRow)
this.filteredAppsGroup.add(this.buildFilterListRow(filteredAppName))
this.filteredAppsGroup.add(this.addFilteredAppButtonRow)
}
showFilteredAppDialog(callingWidget, filterListData) {
const dialog = new VolumeMixerAddFilterDialog(callingWidget, filterListData)
dialog.connect('response', (_dialog, response) => {
if (response === Gtk.ResponseType.OK) {
this.addFilteredApp(dialog.appNameEntry.text)
}
dialog.close()
dialog.destroy()
})
dialog.show()
}
})
================================================
FILE: old/sidebarPrefs.ts
================================================
import Gtk from "gi://Gtk"
import Gdk from "gi://Gdk"
import Gio from "gi://Gio"
import Adw from "gi://Adw"
import { ExtensionPreferences } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"
import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"
import { WidgetsPage } from "./prefPages/widgets.js"
import { TogglesPage } from "./prefPages/toggles.js"
import { OtherPage } from "./prefPages/other.js"
import { AboutPage } from "./prefPages/about.js"
import { MenuPage } from "./prefPages/menu.js"
import { ContributorsRow, LicenseRow, Row, Group } from "./libs/prefComponents.js"
import Config from "./config.js"
var pageList = [
WidgetsPage,
TogglesPage,
MenuPage,
OtherPage,
AboutPage,
]
export default class QstExtensionPreferences extends ExtensionPreferences {
appendIconPath(path: string) {
const iconTheme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default())
if (!iconTheme.get_search_path().includes(path))
iconTheme.add_search_path(path)
}
readExtensionFile(path: string) {
const decoder = new TextDecoder()
const file = Gio.File.new_for_path(`${this.path}/${path}`)
const content = file.load_contents(null)[1]
return decoder.decode(content)
}
getContributorRows(): ContributorsRow.Contributor[][] {
const contributors = JSON.parse(
this.readExtensionFile("media/contributors/data.json")
) as ContributorsRow.Contributor[]
if (!contributors.length) return []
const rows: ContributorsRow.Contributor[][] = [[]]
contributors.reduce((currentRow: ContributorsRow.Contributor[], obj: ContributorsRow.Contributor)=>{
if (currentRow.length >= 4) rows.push(currentRow = [])
currentRow.push(obj)
return currentRow
}, rows[0])
return rows
}
getLicenses(): LicenseRow.License[] {
const licenses = JSON.parse(
this.readExtensionFile("media/licenses.json")
) as LicenseRow.License[]
for (const item of licenses) {
if (item.file) {
item.content = async () => this.readExtensionFile(item.file)
}
}
return licenses
}
getVersionString(): string {
let version = Config.version.toUpperCase().replace(/-.*?$/, "")
if (this.metadata.version) {
version += "." + this.metadata.version
}
version += " — "
if (Config.isReleaseBuild) {
version += _("Stable")
} else if (Config.isDevelopmentBuild) {
version += _("Development")
} else {
version += _("Preview")
}
if (Config.isGithubBuild) {
version += " " + _("(Github Release)")
} else if (!this.metadata.version) {
version += " " + _("(Built from source)")
}
return version
}
getChangelog(): string {
return this.readExtensionFile("media/Changelog.md")
}
async fillPreferencesWindow(window: Adw.PreferencesWindow) {
let settings = this.getSettings()
// Register icon path
this.appendIconPath(this.path + "/media")
this.appendIconPath(this.path + "/media/contributors")
// Set window options
window.set_search_enabled(true)
window.set_default_size(720, 640)
// Create sidebar area
const sidebar = new Adw.NavigationPage({
title: this.metadata.name,
width_request: 196,
})
const sidebarToolbar = new Adw.ToolbarView()
const sidebarHeader = new Adw.HeaderBar()
sidebarToolbar.add_top_bar(sidebarHeader)
sidebar.set_child(sidebarToolbar)
const sidebarPage = new Adw.PreferencesPage()
sidebarToolbar.set_content(sidebarPage)
// Create content area
const content = new Adw.NavigationPage({
title: "undefined"
})
const contentToolbar = new Adw.ToolbarView()
const contentHeader = new Adw.HeaderBar()
contentToolbar.add_top_bar(contentHeader)
content.set_child(contentToolbar)
// Create navigation
const navigation = new Adw.NavigationSplitView({
vexpand: true,
hexpand: true,
})
navigation.set_show_content(true)
navigation.set_sidebar(sidebar)
navigation.set_content(content)
window.set_content(navigation)
window.add(new Adw.PreferencesPage())
const open = (page: Adw.PreferencesPage) => {
contentToolbar.content = page
content.title = page.title
}
const sidebarGroup = Group({
parent: sidebarPage,
})
for (const PageClass of pageList) {
const page = new PageClass(settings, this, window)
const row = Row({
parent: sidebarGroup,
title: page.title,
icon: page.iconName,
noLinkIcon: true,
action: ()=>{
open(page)
}
})
if (!contentToolbar.content) open(page)
}
}
}
================================================
FILE: old/widgetManager.ts
================================================
import St from "gi://St"
import { Global } from "../global.js"
import Maid from "./maid.js"
export class WidgetManager {
_scroll: St.ScrollView
_sections: St.BoxLayout
_maid: Maid
_boxes: St.BoxLayout[]
update() {
this._boxes[]
}
load(): void {
this._maid = new Maid()
Global.QuickSettingsBox.vertical = false
this._maid.connectJob(
Global.Settings,
"changed::layout",
this.update.bind(this)
)
this._maid.connectJob(
Global.QuickSettingsBox, "notify::mapped", ()=>{
if (Global.QuickSettingsBox.mapped) this.update()
}
)
}
unload(): void {
this._maid.destroy()
Global.QuickSettingsBox.vertical = true
}
}
================================================
FILE: package.json
================================================
{
"name": "quick-settings-tweaks",
"description": "A TypeScript GNOME Extension",
"version": "0.0.0",
"author": {
"email": "me@qwreey.moe",
"name": "qwreey",
"url": "https://github.com/qwreey"
},
"type": "module",
"sideEffects": false,
"license": "LGPL-3.0-or-later",
"homepage": "https://github.com/qwreey/quick-settings-tweaks#readme",
"private": true,
"bugs": {
"url": "https://github.com/qwreey/quick-settings-tweaks/issues"
},
"repository": {
"type": "git",
"url": "git+https://github.com/qwreey/quick-settings-tweaks.git"
},
"devDependencies": {
"sass": "^1.83.4",
"typescript": "^5.7.3"
},
"dependencies": {
"@girs/gjs": "^4.0.0-beta.38",
"@girs/gnome-shell": "^49.0.1"
}
}
================================================
FILE: po/ca.po
================================================
# AUTHORS
# jcatfor https://github.com/jcatfor, 2023.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-20 15:34+0000\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: target/out/libs/prefs/components.js:57
msgid "Details"
msgstr ""
#: target/out/libs/prefs/components.js:144
msgid "This feature marked as experimental"
msgstr ""
#: target/out/libs/prefs/components.js:274
msgid "Reset to default"
msgstr ""
#: target/out/libs/prefs/components.js:512
msgid "Theme default"
msgstr ""
#: target/out/libs/prefs/components.js:853
msgid "Homepage"
msgstr ""
#: target/out/libs/prefs/components.js:859
#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49
#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56
msgid "License"
msgstr ""
#: target/out/libs/prefs/components.js:860
msgid "Loading ..."
msgstr ""
#: target/out/libs/prefs/components.js:869
msgid "Affected Files"
msgstr ""
#: target/out/libs/prefs/components.js:924
msgid "Changelog"
msgstr ""
#: target/out/libs/prefs/components.js:938
msgid "(Current)"
msgstr ""
#: target/out/libs/prefs/components.js:969
#, javascript-format
msgid "> **Date:** %s"
msgstr ""
#: target/out/libs/prefs/components.js:970
#, javascript-format
msgid "> **Git Hash:** %s"
msgstr ""
#: target/out/libs/prefs/components.js:971
#, javascript-format
msgid "> **Build Number:** %d"
msgstr ""
#: target/out/libs/prefs/components.js:1034
msgid "Padding"
msgstr ""
#: target/out/libs/prefs/components.js:1038
msgid "Top"
msgstr ""
#: target/out/libs/prefs/components.js:1049
msgid "Bottom"
msgstr ""
#: target/out/libs/prefs/components.js:1060
msgid "Left"
msgstr ""
#: target/out/libs/prefs/components.js:1071
msgid "Right"
msgstr ""
#: target/out/prefs.js:60
msgid "Stable"
msgstr ""
#: target/out/prefs.js:63
msgid "Development"
msgstr ""
#: target/out/prefs.js:66
msgid "Preview"
msgstr ""
#: target/out/prefs.js:69
msgid "(Github Release)"
msgstr ""
#: target/out/prefs.js:72
msgid "(Built from source)"
msgstr ""
#: target/out/features/widget/notifications.js:26
msgid "No Notifications"
msgstr ""
#: target/out/features/widget/notifications.js:58
#: target/out/features/widget/notifications.js:122
msgid "Clear"
msgstr ""
# Quick settings notifications title text
# Notifications title
#: target/out/features/widget/notifications.js:76
msgid "Notifications"
msgstr "Notificacions"
#: target/out/features/widget/notifications.js:105
#: target/out/features/toggle/dndQuickToggle.js:10
#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485
msgid "Do Not Disturb"
msgstr ""
#: target/out/features/widget/media.js:118
msgid "Unknown title"
msgstr ""
#: target/out/features/widget/media.js:888
msgid "Media"
msgstr ""
#: target/out/features/widget/volumeMixer.js:105
msgid "Volume changed"
msgstr ""
#: target/out/features/widget/volumeMixer.js:463
msgid "Open volumx mixer"
msgstr ""
#: target/out/features/widget/volumeMixer.js:480
msgid "Volume Mixer"
msgstr ""
#: target/out/features/widget/weather.js:73
msgid "Weather"
msgstr ""
#: target/out/features/widget/weather.js:192
msgid "Location has not been set"
msgstr ""
# Unsafe mode
#: target/out/features/toggle/unsafeQuickToggle.js:11
#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496
msgid "Unsafe Mode"
msgstr "Mode no segur"
#: target/out/prefPages/widgets.js:11
msgid "Handle radius"
msgstr ""
#: target/out/prefPages/widgets.js:12
msgid "Set this to 0 to use default radius"
msgstr ""
#: target/out/prefPages/widgets.js:18
msgid "Handle color"
msgstr ""
#: target/out/prefPages/widgets.js:36
msgid "Slider style"
msgstr ""
#: target/out/prefPages/widgets.js:39
msgid "Slim"
msgstr ""
#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766
msgid "Default"
msgstr ""
#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173
msgid "Background color"
msgstr ""
#: target/out/prefPages/widgets.js:55
msgid "Active Background color"
msgstr ""
#: target/out/prefPages/widgets.js:62
msgid "Thickness"
msgstr ""
#: target/out/prefPages/widgets.js:66
msgid "Set this to 0 to use default thickness"
msgstr ""
#: target/out/prefPages/widgets.js:76
msgid "Widgets"
msgstr ""
#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136
#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224
msgid "Media Widget"
msgstr ""
#: target/out/prefPages/widgets.js:88
msgid "Turn on to make the media widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280
#: target/out/prefPages/widgets.js:343
msgid "Compact mode"
msgstr ""
#: target/out/prefPages/widgets.js:93
msgid ""
"Make Media Controls widget smaller\n"
"Make it more similar in size to the notification message"
msgstr ""
#: target/out/prefPages/widgets.js:99
msgid "Control buttons opacity"
msgstr ""
#: target/out/prefPages/widgets.js:100
msgid "Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/widgets.js:108
msgid "Show next button"
msgstr ""
#: target/out/prefPages/widgets.js:109
msgid "Add next contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:115
msgid "Show previous button"
msgstr ""
#: target/out/prefPages/widgets.js:116
msgid "Add previous contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:122
msgid "Show pause button"
msgstr ""
#: target/out/prefPages/widgets.js:123
msgid "Add pause contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138
msgid "Show progress bar"
msgstr ""
#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139
msgid "Add progress bar under description"
msgstr ""
#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164
msgid "Gradient background"
msgstr ""
#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169
msgid ""
"Use gradient background extracted from cover image\n"
"May affect performance slightly"
msgstr ""
#: target/out/prefPages/widgets.js:174
msgid "Base background color"
msgstr ""
#: target/out/prefPages/widgets.js:182
msgid "Start opacity"
msgstr ""
#: target/out/prefPages/widgets.js:183
msgid "Adjust left side transparency, Set this to 1000 to make opaque"
msgstr ""
#: target/out/prefPages/widgets.js:190
msgid "Start color"
msgstr ""
#: target/out/prefPages/widgets.js:191
msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color"
msgstr ""
#: target/out/prefPages/widgets.js:198
msgid "End opacity"
msgstr ""
#: target/out/prefPages/widgets.js:199
msgid "Adjust right side transparency, Set this to 1000 to make opaque"
msgstr ""
#: target/out/prefPages/widgets.js:206
msgid "End color"
msgstr ""
#: target/out/prefPages/widgets.js:207
msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color"
msgstr ""
#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226
msgid "Round clip effect"
msgstr ""
#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231
msgid "Use round clip effect to make transition more natural"
msgstr ""
#: target/out/prefPages/widgets.js:234
msgid "Padding adjustment"
msgstr ""
#: target/out/prefPages/widgets.js:236
msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding"
msgstr ""
#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318
#: target/out/prefPages/widgets.js:350
msgid "Remove shadow"
msgstr ""
#: target/out/prefPages/widgets.js:254
msgid ""
"Remove shadow from media message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:260
msgid "Smooth scroll speed"
msgstr ""
#: target/out/prefPages/widgets.js:261
msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction"
msgstr ""
#: target/out/prefPages/widgets.js:271
msgid "Notifications Widget"
msgstr ""
#: target/out/prefPages/widgets.js:276
msgid "Turn on to make the notifications widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:281
msgid "Make notifications smaller"
msgstr ""
#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418
msgid "Max height"
msgstr ""
#: target/out/prefPages/widgets.js:288
#, javascript-format
msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441
msgid "Fade out offset"
msgstr ""
#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442
msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46"
msgstr ""
#: target/out/prefPages/widgets.js:304
msgid "Auto hide"
msgstr ""
#: target/out/prefPages/widgets.js:305
msgid "Hide the Notifications widget when have no notifications"
msgstr ""
#: target/out/prefPages/widgets.js:311
msgid "Use native controls"
msgstr ""
#: target/out/prefPages/widgets.js:312
msgid "Use native dnd switch and clear button"
msgstr ""
#: target/out/prefPages/widgets.js:319
msgid ""
"Remove shadow from notification message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427
msgid "Show scrollbar"
msgstr ""
#: target/out/prefPages/widgets.js:326
msgid "Show scrollbar on message list"
msgstr ""
#: target/out/prefPages/widgets.js:334
msgid "Weather Widget"
msgstr ""
#: target/out/prefPages/widgets.js:339
msgid "Turn on to make the weather widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:344
msgid "Make weather widget smaller"
msgstr ""
#: target/out/prefPages/widgets.js:351
msgid ""
"Remove shadow from weather widget\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:357
msgid "Click command"
msgstr ""
#: target/out/prefPages/widgets.js:363
msgid "Show location"
msgstr ""
#: target/out/prefPages/widgets.js:364
msgid "Show the location label on header"
msgstr ""
#: target/out/prefPages/widgets.js:373
msgid "Forecast interval"
msgstr ""
#: target/out/prefPages/widgets.js:374
msgid "Adjust forecast interval in hour"
msgstr ""
#: target/out/prefPages/widgets.js:381
msgid "Max forecasts"
msgstr ""
#: target/out/prefPages/widgets.js:382
msgid "Adjust max forecasts"
msgstr ""
#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456
msgid "Volume mixer Widget"
msgstr ""
#: target/out/prefPages/widgets.js:393
msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:397
msgid "Label text"
msgstr ""
#: target/out/prefPages/widgets.js:398
msgid "Choose label above slider text source"
msgstr ""
#: target/out/prefPages/widgets.js:400
msgid "Both"
msgstr ""
#: target/out/prefPages/widgets.js:401
msgid "Title"
msgstr ""
#: target/out/prefPages/widgets.js:402
msgid "Description"
msgstr ""
#: target/out/prefPages/widgets.js:403
msgid "None"
msgstr ""
#: target/out/prefPages/widgets.js:411
msgid "Label opacity"
msgstr ""
#: target/out/prefPages/widgets.js:412
msgid ""
"Adjust label opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/widgets.js:419
#, javascript-format
msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:428
msgid "Show scrollbar on mixer list"
msgstr ""
#: target/out/prefPages/widgets.js:434
msgid "Show stream icon"
msgstr ""
#: target/out/prefPages/widgets.js:435
msgid "Show stream icon above mixer sliders"
msgstr ""
#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458
msgid "Attach to output slider"
msgstr ""
#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459
msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout"
msgstr ""
#: target/out/prefPages/widgets.js:468
msgid "Menu icon"
msgstr ""
#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32
msgid "About"
msgstr ""
#: target/out/prefPages/about.js:33
msgid "Common extension informations"
msgstr ""
#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40
msgid "Changelogs"
msgstr ""
#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41
msgid "View the change history for this extension"
msgstr ""
#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57
msgid "License of codes"
msgstr ""
#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65
#: target/out/prefPages/about.js:69
msgid "Contributors"
msgstr ""
#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70
msgid "The creators of this extension"
msgstr ""
#: target/out/prefPages/about.js:74
msgid "More contributors"
msgstr ""
#: target/out/prefPages/about.js:75
msgid "See more contributors on github"
msgstr ""
#: target/out/prefPages/about.js:85
msgid "Link"
msgstr ""
#: target/out/prefPages/about.js:86
msgid "External links about this extension"
msgstr ""
#: target/out/prefPages/about.js:90
msgid "Donate via github sponsors"
msgstr ""
#: target/out/prefPages/about.js:91
msgid "Support development!"
msgstr ""
#: target/out/prefPages/about.js:97
msgid "Rate and comment the extension!"
msgstr ""
#: target/out/prefPages/about.js:102
msgid "Github Repository"
msgstr ""
#: target/out/prefPages/about.js:103
msgid ""
"Add Star on Repository is helping me a lot!\n"
"Please, if you found bug from this extension, you can make issue to make me know that!\n"
"Or, you can create PR with wonderful features!"
msgstr ""
#: target/out/prefPages/about.js:109
msgid "Add translation to this extension!"
msgstr ""
#: target/out/prefPages/about.js:115
msgid "Debug"
msgstr ""
#: target/out/prefPages/about.js:116
msgid "Extension debugging options"
msgstr ""
#: target/out/prefPages/about.js:120
msgid "Expose environment"
msgstr ""
#: target/out/prefPages/about.js:121
msgid "Expose extension environment to globalThis.qst"
msgstr ""
#: target/out/prefPages/about.js:126
msgid "Show layout border"
msgstr ""
#: target/out/prefPages/about.js:127
msgid "Show layout borders on Quick Settings"
msgstr ""
#: target/out/prefPages/about.js:132
msgid "Log level"
msgstr ""
#: target/out/prefPages/about.js:135
msgid "none"
msgstr ""
#: target/out/prefPages/about.js:136
msgid "error"
msgstr ""
#: target/out/prefPages/about.js:137
msgid "info"
msgstr ""
#: target/out/prefPages/about.js:138
msgid "debug"
msgstr ""
#: target/out/prefPages/toggles.js:12
msgid "Toggles"
msgstr ""
#: target/out/prefPages/toggles.js:19
msgid "DND Quick Toggle"
msgstr ""
#: target/out/prefPages/toggles.js:20
msgid "Turn on to add the DND quick toggle on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/toggles.js:28
msgid "DND indicator position"
msgstr ""
#: target/out/prefPages/toggles.js:29
msgid "Set DND indicator position"
msgstr ""
#: target/out/prefPages/toggles.js:33
msgid "System Tray"
msgstr ""
#: target/out/prefPages/toggles.js:34
msgid "Date Menu Button"
msgstr ""
#: target/out/prefPages/toggles.js:41
msgid "Unsafe Mode Quick Toggle"
msgstr ""
#: target/out/prefPages/toggles.js:42
msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/toggles.js:50
msgid "Save last session state"
msgstr ""
#: target/out/prefPages/toggles.js:51
msgid "Turn on to save last session unsafe state"
msgstr ""
#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141
msgid "Advanced animation style"
msgstr ""
#: target/out/prefPages/menu.js:13
msgid "Open Duration"
msgstr ""
#: target/out/prefPages/menu.js:14
msgid "Open animation duration in microseconds"
msgstr ""
#: target/out/prefPages/menu.js:21
msgid "Close Duration"
msgstr ""
#: target/out/prefPages/menu.js:22
msgid "Close animation duration in microseconds"
msgstr ""
#: target/out/prefPages/menu.js:29
msgid "Grid Content Opacity"
msgstr ""
#: target/out/prefPages/menu.js:30
msgid ""
"Adjust grid content opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:37
msgid "Background Blur Radius"
msgstr ""
#: target/out/prefPages/menu.js:38
msgid ""
"Adjust background blur radius.\n"
"Set this to 0 to disable blur effect"
msgstr ""
#: target/out/prefPages/menu.js:45
msgid "Background Brightness"
msgstr ""
#: target/out/prefPages/menu.js:46
msgid ""
"Adjust background brightness.\n"
"Set this to 1000 to disable brightness control effect.\n"
"Not impacts on gnome-shell's default dim effect."
msgstr ""
#: target/out/prefPages/menu.js:53
msgid "Background Opacity"
msgstr ""
#: target/out/prefPages/menu.js:54
msgid ""
"Adjust background opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:61
msgid "Background X Scale"
msgstr ""
#: target/out/prefPages/menu.js:62
msgid "Adjust background x scale, 1000 means 1.0 scale"
msgstr ""
#: target/out/prefPages/menu.js:69
msgid "Background Y Scale"
msgstr ""
#: target/out/prefPages/menu.js:70
msgid "Adjust background y scale, 1000 means 1.0 scale"
msgstr ""
#: target/out/prefPages/menu.js:84
msgid "Menu"
msgstr ""
#: target/out/prefPages/menu.js:91
msgid "Overlay Mode"
msgstr ""
#: target/out/prefPages/menu.js:92
msgid "Display toggle, power, and sound menus as overlay"
msgstr ""
#: target/out/prefPages/menu.js:101
msgid "Overlay Width"
msgstr ""
#: target/out/prefPages/menu.js:102
msgid ""
"Adjust overlay menu width\n"
"Set this to 0 to disable adjusting"
msgstr ""
#: target/out/prefPages/menu.js:109
msgid "Overlay Animation Duration"
msgstr ""
#: target/out/prefPages/menu.js:110
msgid ""
"Custom menu open animation duration in microseconds\n"
"Set this to 0 to disable custom animation"
msgstr ""
#: target/out/prefPages/menu.js:117
msgid "Overlay Animation Style"
msgstr ""
#: target/out/prefPages/menu.js:118
msgid "Custom menu open animation style"
msgstr ""
#: target/out/prefPages/menu.js:120
msgid "Flyout"
msgstr ""
#: target/out/prefPages/menu.js:121
msgid "Dialog"
msgstr ""
#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143
msgid "Animation"
msgstr ""
#: target/out/prefPages/menu.js:131
msgid ""
"Add menu animation on toggle menu opening and closing\n"
"To get the best feel, turn on overlay mode"
msgstr ""
#: target/out/prefPages/menu.js:142
msgid "Adjust speed, blur, scale, and opacity"
msgstr ""
#: target/out/prefPages/layout.js:25
msgid "The item not found"
msgstr ""
#: target/out/prefPages/layout.js:28
msgid "No changes"
msgstr ""
#: target/out/prefPages/layout.js:31
msgid "The same item already exists"
msgstr ""
#: target/out/prefPages/layout.js:40
#, javascript-format
msgid "Properties of %s"
msgstr ""
#: target/out/prefPages/layout.js:47
msgid "Save"
msgstr ""
#: target/out/prefPages/layout.js:64
msgid "Toggle editor"
msgstr ""
#: target/out/prefPages/layout.js:84
msgid "This option requires full gnome-shell reloading"
msgstr ""
#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278
#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672
msgid "Hide"
msgstr ""
#: target/out/prefPages/layout.js:232
#, javascript-format
msgid "My item #%d"
msgstr ""
#: target/out/prefPages/layout.js:250
msgid "New Item"
msgstr ""
#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610
#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787
#: target/out/prefPages/layout.js:813
msgid "Ordering and Hiding"
msgstr ""
#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432
msgid "Friendly Name"
msgstr ""
#: target/out/prefPages/layout.js:283
msgid "Title Regex (Javascript Regex)"
msgstr ""
#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442
msgid "Constructor Name"
msgstr ""
#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448
msgid "GType Name"
msgstr ""
#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456
msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension"
msgstr ""
#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461
msgid "Javascript constructor name"
msgstr ""
#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466
msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance"
msgstr ""
#: target/out/prefPages/layout.js:342
msgid "Keyboard Backlight"
msgstr ""
#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538
msgid "Unordered items"
msgstr ""
#: target/out/prefPages/layout.js:486
msgid "Remote Access Applet"
msgstr ""
#: target/out/prefPages/layout.js:487
msgid "Camera"
msgstr ""
#: target/out/prefPages/layout.js:488
msgid "Volume Input"
msgstr ""
#: target/out/prefPages/layout.js:489
msgid "Location"
msgstr ""
#: target/out/prefPages/layout.js:490
msgid "Thunderbolt"
msgstr ""
#: target/out/prefPages/layout.js:492
msgid "Network"
msgstr ""
#: target/out/prefPages/layout.js:495
msgid "Volume Output"
msgstr ""
#: target/out/prefPages/layout.js:497
msgid "System (Battery)"
msgstr ""
#: target/out/prefPages/layout.js:618
msgid "Desktop Spacer"
msgstr ""
#: target/out/prefPages/layout.js:629
msgid "Laptop Spacer"
msgstr ""
#: target/out/prefPages/layout.js:641
msgid "Capture button"
msgstr ""
#: target/out/prefPages/layout.js:647
msgid "Settings button"
msgstr ""
#: target/out/prefPages/layout.js:653
msgid "Lock button"
msgstr ""
#: target/out/prefPages/layout.js:659
msgid "Shutdown button"
msgstr ""
#: target/out/prefPages/layout.js:665
msgid "Battery button"
msgstr ""
#: target/out/prefPages/layout.js:711
msgid "Layout"
msgstr ""
#: target/out/prefPages/layout.js:718
msgid "Quick Toggles Layout"
msgstr ""
#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734
msgid "Adjust quick toggles layout"
msgstr ""
#: target/out/prefPages/layout.js:738
msgid "Reorder and hide quick toggles"
msgstr ""
#: target/out/prefPages/layout.js:745
msgid "System Indicators"
msgstr ""
#: target/out/prefPages/layout.js:746
msgid "Adjust system indicators layout and style"
msgstr ""
#: target/out/prefPages/layout.js:751
msgid "Accent screen sharing indicator"
msgstr ""
#: target/out/prefPages/layout.js:752
msgid "Use shell accent color on screen sharing indicator"
msgstr ""
#: target/out/prefPages/layout.js:757
msgid "Accent screen recording indicator"
msgstr ""
#: target/out/prefPages/layout.js:758
msgid "Use shell accent color on screen recording indicator"
msgstr ""
#: target/out/prefPages/layout.js:763
msgid "Privacy indicators style"
msgstr ""
#: target/out/prefPages/layout.js:764
msgid "Use monochrome or shell accent color on privarcy indicators"
msgstr ""
#: target/out/prefPages/layout.js:767
msgid "Accent"
msgstr ""
#: target/out/prefPages/layout.js:768
msgid "Monochrome"
msgstr ""
#: target/out/prefPages/layout.js:777
msgid "Adjust system indicators"
msgstr ""
#: target/out/prefPages/layout.js:788
msgid "Reorder and hide system indicators"
msgstr ""
#: target/out/prefPages/layout.js:795
msgid "System Items Layout"
msgstr ""
#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815
msgid "Adjust system items layout"
msgstr ""
#: target/out/prefPages/layout.js:804
msgid "Hide layout box"
msgstr ""
#: target/out/prefPages/layout.js:805
msgid "Hide all buttons and layout box"
msgstr ""
#: target/out/prefPages/layout.js:814
msgid "Reorder and hide system items"
msgstr ""
#: target/out/prefPages/layout.js:823
msgid "Date Menu"
msgstr ""
#: target/out/prefPages/layout.js:824
msgid "Adjust Date Menu layout"
msgstr ""
#: target/out/prefPages/layout.js:828
msgid "Hide left box"
msgstr ""
#: target/out/prefPages/layout.js:829
msgid "Hide the left box of the date menu, which contains notifications and media control"
msgstr ""
#: target/out/prefPages/layout.js:834
msgid "Hide right box"
msgstr ""
#: target/out/prefPages/layout.js:835
msgid "Hide the right box of the date menu, which contains calendar, world clock and weather"
msgstr ""
#: target/out/prefPages/layout.js:840
msgid "Disable menu"
msgstr ""
#: target/out/prefPages/layout.js:841
msgid "Do not open date menu when the date menu button clicked"
msgstr ""
================================================
FILE: po/cs.po
================================================
# AUTHORS
# ondra05 https://github.com/ondra05, 2023.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-20 15:34+0000\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: target/out/libs/prefs/components.js:57
msgid "Details"
msgstr ""
#: target/out/libs/prefs/components.js:144
msgid "This feature marked as experimental"
msgstr ""
#: target/out/libs/prefs/components.js:274
msgid "Reset to default"
msgstr ""
#: target/out/libs/prefs/components.js:512
msgid "Theme default"
msgstr ""
#: target/out/libs/prefs/components.js:853
msgid "Homepage"
msgstr ""
#: target/out/libs/prefs/components.js:859
#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49
#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56
msgid "License"
msgstr ""
#: target/out/libs/prefs/components.js:860
msgid "Loading ..."
msgstr ""
#: target/out/libs/prefs/components.js:869
msgid "Affected Files"
msgstr ""
#: target/out/libs/prefs/components.js:924
msgid "Changelog"
msgstr ""
#: target/out/libs/prefs/components.js:938
msgid "(Current)"
msgstr ""
#: target/out/libs/prefs/components.js:969
#, javascript-format
msgid "> **Date:** %s"
msgstr ""
#: target/out/libs/prefs/components.js:970
#, javascript-format
msgid "> **Git Hash:** %s"
msgstr ""
#: target/out/libs/prefs/components.js:971
#, javascript-format
msgid "> **Build Number:** %d"
msgstr ""
#: target/out/libs/prefs/components.js:1034
msgid "Padding"
msgstr ""
#: target/out/libs/prefs/components.js:1038
msgid "Top"
msgstr ""
#: target/out/libs/prefs/components.js:1049
msgid "Bottom"
msgstr ""
#: target/out/libs/prefs/components.js:1060
msgid "Left"
msgstr ""
#: target/out/libs/prefs/components.js:1071
msgid "Right"
msgstr ""
#: target/out/prefs.js:60
msgid "Stable"
msgstr ""
#: target/out/prefs.js:63
msgid "Development"
msgstr ""
#: target/out/prefs.js:66
msgid "Preview"
msgstr ""
#: target/out/prefs.js:69
msgid "(Github Release)"
msgstr ""
#: target/out/prefs.js:72
msgid "(Built from source)"
msgstr ""
#: target/out/features/widget/notifications.js:26
msgid "No Notifications"
msgstr ""
#: target/out/features/widget/notifications.js:58
#: target/out/features/widget/notifications.js:122
msgid "Clear"
msgstr ""
# Quick settings notifications title text
#: target/out/features/widget/notifications.js:76
msgid "Notifications"
msgstr "Upozornění"
#: target/out/features/widget/notifications.js:105
#: target/out/features/toggle/dndQuickToggle.js:10
#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485
msgid "Do Not Disturb"
msgstr ""
#: target/out/features/widget/media.js:118
msgid "Unknown title"
msgstr ""
#: target/out/features/widget/media.js:888
msgid "Media"
msgstr ""
#: target/out/features/widget/volumeMixer.js:105
msgid "Volume changed"
msgstr ""
#: target/out/features/widget/volumeMixer.js:463
msgid "Open volumx mixer"
msgstr ""
#: target/out/features/widget/volumeMixer.js:480
msgid "Volume Mixer"
msgstr ""
#: target/out/features/widget/weather.js:73
msgid "Weather"
msgstr ""
#: target/out/features/widget/weather.js:192
msgid "Location has not been set"
msgstr ""
#: target/out/features/toggle/unsafeQuickToggle.js:11
#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496
msgid "Unsafe Mode"
msgstr ""
#: target/out/prefPages/widgets.js:11
msgid "Handle radius"
msgstr ""
#: target/out/prefPages/widgets.js:12
msgid "Set this to 0 to use default radius"
msgstr ""
#: target/out/prefPages/widgets.js:18
msgid "Handle color"
msgstr ""
#: target/out/prefPages/widgets.js:36
msgid "Slider style"
msgstr ""
#: target/out/prefPages/widgets.js:39
msgid "Slim"
msgstr ""
#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766
msgid "Default"
msgstr ""
#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173
msgid "Background color"
msgstr ""
#: target/out/prefPages/widgets.js:55
msgid "Active Background color"
msgstr ""
#: target/out/prefPages/widgets.js:62
msgid "Thickness"
msgstr ""
#: target/out/prefPages/widgets.js:66
msgid "Set this to 0 to use default thickness"
msgstr ""
#: target/out/prefPages/widgets.js:76
msgid "Widgets"
msgstr ""
#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136
#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224
msgid "Media Widget"
msgstr ""
#: target/out/prefPages/widgets.js:88
msgid "Turn on to make the media widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280
#: target/out/prefPages/widgets.js:343
msgid "Compact mode"
msgstr ""
#: target/out/prefPages/widgets.js:93
msgid ""
"Make Media Controls widget smaller\n"
"Make it more similar in size to the notification message"
msgstr ""
#: target/out/prefPages/widgets.js:99
msgid "Control buttons opacity"
msgstr ""
#: target/out/prefPages/widgets.js:100
msgid "Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/widgets.js:108
msgid "Show next button"
msgstr ""
#: target/out/prefPages/widgets.js:109
msgid "Add next contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:115
msgid "Show previous button"
msgstr ""
#: target/out/prefPages/widgets.js:116
msgid "Add previous contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:122
msgid "Show pause button"
msgstr ""
#: target/out/prefPages/widgets.js:123
msgid "Add pause contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138
msgid "Show progress bar"
msgstr ""
#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139
msgid "Add progress bar under description"
msgstr ""
#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164
msgid "Gradient background"
msgstr ""
#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169
msgid ""
"Use gradient background extracted from cover image\n"
"May affect performance slightly"
msgstr ""
#: target/out/prefPages/widgets.js:174
msgid "Base background color"
msgstr ""
#: target/out/prefPages/widgets.js:182
msgid "Start opacity"
msgstr ""
#: target/out/prefPages/widgets.js:183
msgid "Adjust left side transparency, Set this to 1000 to make opaque"
msgstr ""
#: target/out/prefPages/widgets.js:190
msgid "Start color"
msgstr ""
#: target/out/prefPages/widgets.js:191
msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color"
msgstr ""
#: target/out/prefPages/widgets.js:198
msgid "End opacity"
msgstr ""
#: target/out/prefPages/widgets.js:199
msgid "Adjust right side transparency, Set this to 1000 to make opaque"
msgstr ""
#: target/out/prefPages/widgets.js:206
msgid "End color"
msgstr ""
#: target/out/prefPages/widgets.js:207
msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color"
msgstr ""
#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226
msgid "Round clip effect"
msgstr ""
#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231
msgid "Use round clip effect to make transition more natural"
msgstr ""
#: target/out/prefPages/widgets.js:234
msgid "Padding adjustment"
msgstr ""
#: target/out/prefPages/widgets.js:236
msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding"
msgstr ""
#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318
#: target/out/prefPages/widgets.js:350
msgid "Remove shadow"
msgstr ""
#: target/out/prefPages/widgets.js:254
msgid ""
"Remove shadow from media message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:260
msgid "Smooth scroll speed"
msgstr ""
#: target/out/prefPages/widgets.js:261
msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction"
msgstr ""
#: target/out/prefPages/widgets.js:271
msgid "Notifications Widget"
msgstr ""
#: target/out/prefPages/widgets.js:276
msgid "Turn on to make the notifications widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:281
msgid "Make notifications smaller"
msgstr ""
#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418
msgid "Max height"
msgstr ""
#: target/out/prefPages/widgets.js:288
#, javascript-format
msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441
msgid "Fade out offset"
msgstr ""
#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442
msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46"
msgstr ""
#: target/out/prefPages/widgets.js:304
msgid "Auto hide"
msgstr ""
#: target/out/prefPages/widgets.js:305
msgid "Hide the Notifications widget when have no notifications"
msgstr ""
#: target/out/prefPages/widgets.js:311
msgid "Use native controls"
msgstr ""
#: target/out/prefPages/widgets.js:312
msgid "Use native dnd switch and clear button"
msgstr ""
#: target/out/prefPages/widgets.js:319
msgid ""
"Remove shadow from notification message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427
msgid "Show scrollbar"
msgstr ""
#: target/out/prefPages/widgets.js:326
msgid "Show scrollbar on message list"
msgstr ""
#: target/out/prefPages/widgets.js:334
msgid "Weather Widget"
msgstr ""
#: target/out/prefPages/widgets.js:339
msgid "Turn on to make the weather widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:344
msgid "Make weather widget smaller"
msgstr ""
#: target/out/prefPages/widgets.js:351
msgid ""
"Remove shadow from weather widget\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:357
msgid "Click command"
msgstr ""
#: target/out/prefPages/widgets.js:363
msgid "Show location"
msgstr ""
#: target/out/prefPages/widgets.js:364
msgid "Show the location label on header"
msgstr ""
#: target/out/prefPages/widgets.js:373
msgid "Forecast interval"
msgstr ""
#: target/out/prefPages/widgets.js:374
msgid "Adjust forecast interval in hour"
msgstr ""
#: target/out/prefPages/widgets.js:381
msgid "Max forecasts"
msgstr ""
#: target/out/prefPages/widgets.js:382
msgid "Adjust max forecasts"
msgstr ""
#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456
msgid "Volume mixer Widget"
msgstr ""
#: target/out/prefPages/widgets.js:393
msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:397
msgid "Label text"
msgstr ""
#: target/out/prefPages/widgets.js:398
msgid "Choose label above slider text source"
msgstr ""
#: target/out/prefPages/widgets.js:400
msgid "Both"
msgstr ""
#: target/out/prefPages/widgets.js:401
msgid "Title"
msgstr ""
#: target/out/prefPages/widgets.js:402
msgid "Description"
msgstr ""
#: target/out/prefPages/widgets.js:403
msgid "None"
msgstr ""
#: target/out/prefPages/widgets.js:411
msgid "Label opacity"
msgstr ""
#: target/out/prefPages/widgets.js:412
msgid ""
"Adjust label opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/widgets.js:419
#, javascript-format
msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:428
msgid "Show scrollbar on mixer list"
msgstr ""
#: target/out/prefPages/widgets.js:434
msgid "Show stream icon"
msgstr ""
#: target/out/prefPages/widgets.js:435
msgid "Show stream icon above mixer sliders"
msgstr ""
#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458
msgid "Attach to output slider"
msgstr ""
#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459
msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout"
msgstr ""
#: target/out/prefPages/widgets.js:468
msgid "Menu icon"
msgstr ""
#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32
msgid "About"
msgstr ""
#: target/out/prefPages/about.js:33
msgid "Common extension informations"
msgstr ""
#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40
msgid "Changelogs"
msgstr ""
#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41
msgid "View the change history for this extension"
msgstr ""
#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57
msgid "License of codes"
msgstr ""
#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65
#: target/out/prefPages/about.js:69
msgid "Contributors"
msgstr ""
#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70
msgid "The creators of this extension"
msgstr ""
#: target/out/prefPages/about.js:74
msgid "More contributors"
msgstr ""
#: target/out/prefPages/about.js:75
msgid "See more contributors on github"
msgstr ""
#: target/out/prefPages/about.js:85
msgid "Link"
msgstr ""
#: target/out/prefPages/about.js:86
msgid "External links about this extension"
msgstr ""
#: target/out/prefPages/about.js:90
msgid "Donate via github sponsors"
msgstr ""
#: target/out/prefPages/about.js:91
msgid "Support development!"
msgstr ""
#: target/out/prefPages/about.js:97
msgid "Rate and comment the extension!"
msgstr ""
#: target/out/prefPages/about.js:102
msgid "Github Repository"
msgstr ""
#: target/out/prefPages/about.js:103
msgid ""
"Add Star on Repository is helping me a lot!\n"
"Please, if you found bug from this extension, you can make issue to make me know that!\n"
"Or, you can create PR with wonderful features!"
msgstr ""
#: target/out/prefPages/about.js:109
msgid "Add translation to this extension!"
msgstr ""
#: target/out/prefPages/about.js:115
msgid "Debug"
msgstr ""
#: target/out/prefPages/about.js:116
msgid "Extension debugging options"
msgstr ""
#: target/out/prefPages/about.js:120
msgid "Expose environment"
msgstr ""
#: target/out/prefPages/about.js:121
msgid "Expose extension environment to globalThis.qst"
msgstr ""
#: target/out/prefPages/about.js:126
msgid "Show layout border"
msgstr ""
#: target/out/prefPages/about.js:127
msgid "Show layout borders on Quick Settings"
msgstr ""
#: target/out/prefPages/about.js:132
msgid "Log level"
msgstr ""
#: target/out/prefPages/about.js:135
msgid "none"
msgstr ""
#: target/out/prefPages/about.js:136
msgid "error"
msgstr ""
#: target/out/prefPages/about.js:137
msgid "info"
msgstr ""
#: target/out/prefPages/about.js:138
msgid "debug"
msgstr ""
#: target/out/prefPages/toggles.js:12
msgid "Toggles"
msgstr ""
#: target/out/prefPages/toggles.js:19
msgid "DND Quick Toggle"
msgstr ""
#: target/out/prefPages/toggles.js:20
msgid "Turn on to add the DND quick toggle on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/toggles.js:28
msgid "DND indicator position"
msgstr ""
#: target/out/prefPages/toggles.js:29
msgid "Set DND indicator position"
msgstr ""
#: target/out/prefPages/toggles.js:33
msgid "System Tray"
msgstr ""
#: target/out/prefPages/toggles.js:34
msgid "Date Menu Button"
msgstr ""
#: target/out/prefPages/toggles.js:41
msgid "Unsafe Mode Quick Toggle"
msgstr ""
#: target/out/prefPages/toggles.js:42
msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/toggles.js:50
msgid "Save last session state"
msgstr ""
#: target/out/prefPages/toggles.js:51
msgid "Turn on to save last session unsafe state"
msgstr ""
#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141
msgid "Advanced animation style"
msgstr ""
#: target/out/prefPages/menu.js:13
msgid "Open Duration"
msgstr ""
#: target/out/prefPages/menu.js:14
msgid "Open animation duration in microseconds"
msgstr ""
#: target/out/prefPages/menu.js:21
msgid "Close Duration"
msgstr ""
#: target/out/prefPages/menu.js:22
msgid "Close animation duration in microseconds"
msgstr ""
#: target/out/prefPages/menu.js:29
msgid "Grid Content Opacity"
msgstr ""
#: target/out/prefPages/menu.js:30
msgid ""
"Adjust grid content opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:37
msgid "Background Blur Radius"
msgstr ""
#: target/out/prefPages/menu.js:38
msgid ""
"Adjust background blur radius.\n"
"Set this to 0 to disable blur effect"
msgstr ""
#: target/out/prefPages/menu.js:45
msgid "Background Brightness"
msgstr ""
#: target/out/prefPages/menu.js:46
msgid ""
"Adjust background brightness.\n"
"Set this to 1000 to disable brightness control effect.\n"
"Not impacts on gnome-shell's default dim effect."
msgstr ""
#: target/out/prefPages/menu.js:53
msgid "Background Opacity"
msgstr ""
#: target/out/prefPages/menu.js:54
msgid ""
"Adjust background opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:61
msgid "Background X Scale"
msgstr ""
#: target/out/prefPages/menu.js:62
msgid "Adjust background x scale, 1000 means 1.0 scale"
msgstr ""
#: target/out/prefPages/menu.js:69
msgid "Background Y Scale"
msgstr ""
#: target/out/prefPages/menu.js:70
msgid "Adjust background y scale, 1000 means 1.0 scale"
msgstr ""
#: target/out/prefPages/menu.js:84
msgid "Menu"
msgstr ""
#: target/out/prefPages/menu.js:91
msgid "Overlay Mode"
msgstr ""
#: target/out/prefPages/menu.js:92
msgid "Display toggle, power, and sound menus as overlay"
msgstr ""
#: target/out/prefPages/menu.js:101
msgid "Overlay Width"
msgstr ""
#: target/out/prefPages/menu.js:102
msgid ""
"Adjust overlay menu width\n"
"Set this to 0 to disable adjusting"
msgstr ""
#: target/out/prefPages/menu.js:109
msgid "Overlay Animation Duration"
msgstr ""
#: target/out/prefPages/menu.js:110
msgid ""
"Custom menu open animation duration in microseconds\n"
"Set this to 0 to disable custom animation"
msgstr ""
#: target/out/prefPages/menu.js:117
msgid "Overlay Animation Style"
msgstr ""
#: target/out/prefPages/menu.js:118
msgid "Custom menu open animation style"
msgstr ""
#: target/out/prefPages/menu.js:120
msgid "Flyout"
msgstr ""
#: target/out/prefPages/menu.js:121
msgid "Dialog"
msgstr ""
#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143
msgid "Animation"
msgstr ""
#: target/out/prefPages/menu.js:131
msgid ""
"Add menu animation on toggle menu opening and closing\n"
"To get the best feel, turn on overlay mode"
msgstr ""
#: target/out/prefPages/menu.js:142
msgid "Adjust speed, blur, scale, and opacity"
msgstr ""
#: target/out/prefPages/layout.js:25
msgid "The item not found"
msgstr ""
#: target/out/prefPages/layout.js:28
msgid "No changes"
msgstr ""
#: target/out/prefPages/layout.js:31
msgid "The same item already exists"
msgstr ""
#: target/out/prefPages/layout.js:40
#, javascript-format
msgid "Properties of %s"
msgstr ""
#: target/out/prefPages/layout.js:47
msgid "Save"
msgstr ""
#: target/out/prefPages/layout.js:64
msgid "Toggle editor"
msgstr ""
#: target/out/prefPages/layout.js:84
msgid "This option requires full gnome-shell reloading"
msgstr ""
#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278
#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672
msgid "Hide"
msgstr ""
#: target/out/prefPages/layout.js:232
#, javascript-format
msgid "My item #%d"
msgstr ""
#: target/out/prefPages/layout.js:250
msgid "New Item"
msgstr ""
#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610
#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787
#: target/out/prefPages/layout.js:813
msgid "Ordering and Hiding"
msgstr ""
#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432
msgid "Friendly Name"
msgstr ""
#: target/out/prefPages/layout.js:283
msgid "Title Regex (Javascript Regex)"
msgstr ""
#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442
msgid "Constructor Name"
msgstr ""
#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448
msgid "GType Name"
msgstr ""
#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456
msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension"
msgstr ""
#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461
msgid "Javascript constructor name"
msgstr ""
#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466
msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance"
msgstr ""
#: target/out/prefPages/layout.js:342
msgid "Keyboard Backlight"
msgstr ""
#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538
msgid "Unordered items"
msgstr ""
#: target/out/prefPages/layout.js:486
msgid "Remote Access Applet"
msgstr ""
#: target/out/prefPages/layout.js:487
msgid "Camera"
msgstr ""
#: target/out/prefPages/layout.js:488
msgid "Volume Input"
msgstr ""
#: target/out/prefPages/layout.js:489
msgid "Location"
msgstr ""
#: target/out/prefPages/layout.js:490
msgid "Thunderbolt"
msgstr ""
#: target/out/prefPages/layout.js:492
msgid "Network"
msgstr ""
#: target/out/prefPages/layout.js:495
msgid "Volume Output"
msgstr ""
#: target/out/prefPages/layout.js:497
msgid "System (Battery)"
msgstr ""
#: target/out/prefPages/layout.js:618
msgid "Desktop Spacer"
msgstr ""
#: target/out/prefPages/layout.js:629
msgid "Laptop Spacer"
msgstr ""
#: target/out/prefPages/layout.js:641
msgid "Capture button"
msgstr ""
#: target/out/prefPages/layout.js:647
msgid "Settings button"
msgstr ""
#: target/out/prefPages/layout.js:653
msgid "Lock button"
msgstr ""
#: target/out/prefPages/layout.js:659
msgid "Shutdown button"
msgstr ""
#: target/out/prefPages/layout.js:665
msgid "Battery button"
msgstr ""
#: target/out/prefPages/layout.js:711
msgid "Layout"
msgstr ""
#: target/out/prefPages/layout.js:718
msgid "Quick Toggles Layout"
msgstr ""
#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734
msgid "Adjust quick toggles layout"
msgstr ""
#: target/out/prefPages/layout.js:738
msgid "Reorder and hide quick toggles"
msgstr ""
#: target/out/prefPages/layout.js:745
msgid "System Indicators"
msgstr ""
#: target/out/prefPages/layout.js:746
msgid "Adjust system indicators layout and style"
msgstr ""
#: target/out/prefPages/layout.js:751
msgid "Accent screen sharing indicator"
msgstr ""
#: target/out/prefPages/layout.js:752
msgid "Use shell accent color on screen sharing indicator"
msgstr ""
#: target/out/prefPages/layout.js:757
msgid "Accent screen recording indicator"
msgstr ""
#: target/out/prefPages/layout.js:758
msgid "Use shell accent color on screen recording indicator"
msgstr ""
#: target/out/prefPages/layout.js:763
msgid "Privacy indicators style"
msgstr ""
#: target/out/prefPages/layout.js:764
msgid "Use monochrome or shell accent color on privarcy indicators"
msgstr ""
#: target/out/prefPages/layout.js:767
msgid "Accent"
msgstr ""
#: target/out/prefPages/layout.js:768
msgid "Monochrome"
msgstr ""
#: target/out/prefPages/layout.js:777
msgid "Adjust system indicators"
msgstr ""
#: target/out/prefPages/layout.js:788
msgid "Reorder and hide system indicators"
msgstr ""
#: target/out/prefPages/layout.js:795
msgid "System Items Layout"
msgstr ""
#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815
msgid "Adjust system items layout"
msgstr ""
#: target/out/prefPages/layout.js:804
msgid "Hide layout box"
msgstr ""
#: target/out/prefPages/layout.js:805
msgid "Hide all buttons and layout box"
msgstr ""
#: target/out/prefPages/layout.js:814
msgid "Reorder and hide system items"
msgstr ""
#: target/out/prefPages/layout.js:823
msgid "Date Menu"
msgstr ""
#: target/out/prefPages/layout.js:824
msgid "Adjust Date Menu layout"
msgstr ""
#: target/out/prefPages/layout.js:828
msgid "Hide left box"
msgstr ""
#: target/out/prefPages/layout.js:829
msgid "Hide the left box of the date menu, which contains notifications and media control"
msgstr ""
#: target/out/prefPages/layout.js:834
msgid "Hide right box"
msgstr ""
#: target/out/prefPages/layout.js:835
msgid "Hide the right box of the date menu, which contains calendar, world clock and weather"
msgstr ""
#: target/out/prefPages/layout.js:840
msgid "Disable menu"
msgstr ""
#: target/out/prefPages/layout.js:841
msgid "Do not open date menu when the date menu button clicked"
msgstr ""
================================================
FILE: po/de.po
================================================
msgid ""
msgstr ""
"Project-Id-Version: quick-settings-tweaker\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-20 15:32+0000\n"
"PO-Revision-Date: 2025-07-16 23:47+0200\n"
"Last-Translator: Andreas Rohr \n"
"Language-Team: German\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: quick-settings-tweaker\n"
"X-Crowdin-Project-ID: 809722\n"
"X-Crowdin-Language: de\n"
"X-Crowdin-File: quick-settings-tweaks@qwreey.pot\n"
"X-Crowdin-File-ID: 4\n"
"X-Generator: Poedit 3.6\n"
#: target/out/libs/prefs/components.js:57
msgid "Details"
msgstr "Details"
#: target/out/libs/prefs/components.js:144
msgid "This feature marked as experimental"
msgstr "Diese Funktion wurde als experimentell markiert"
#: target/out/libs/prefs/components.js:274
msgid "Reset to default"
msgstr "Auf Standard zurücksetzen"
#: target/out/libs/prefs/components.js:512
msgid "Theme default"
msgstr "Standard-Theme"
#: target/out/libs/prefs/components.js:853
msgid "Homepage"
msgstr "Homepage"
#: target/out/libs/prefs/components.js:859
#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49
#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56
msgid "License"
msgstr "Lizenz"
#: target/out/libs/prefs/components.js:860
msgid "Loading ..."
msgstr "Laden ..."
#: target/out/libs/prefs/components.js:869
msgid "Affected Files"
msgstr "Betroffene Dateien"
#: target/out/libs/prefs/components.js:924
msgid "Changelog"
msgstr "Changelog"
#: target/out/libs/prefs/components.js:938
msgid "(Current)"
msgstr "(Aktuell)"
#: target/out/libs/prefs/components.js:969
#, javascript-format
msgid "> **Date:** %s"
msgstr "> **Datum:** %s"
#: target/out/libs/prefs/components.js:970
#, javascript-format
msgid "> **Git Hash:** %s"
msgstr "> **Git Hash:** %s"
#: target/out/libs/prefs/components.js:971
#, javascript-format
msgid "> **Build Number:** %d"
msgstr "> **Build Nummer:** %d"
#: target/out/libs/prefs/components.js:1034
msgid "Padding"
msgstr "Padding"
#: target/out/libs/prefs/components.js:1038
msgid "Top"
msgstr "Oben"
#: target/out/libs/prefs/components.js:1049
msgid "Bottom"
msgstr "Unten"
#: target/out/libs/prefs/components.js:1060
msgid "Left"
msgstr "Links"
#: target/out/libs/prefs/components.js:1071
msgid "Right"
msgstr "Rechts"
#: target/out/prefs.js:60
msgid "Stable"
msgstr "Stabil"
#: target/out/prefs.js:63
msgid "Development"
msgstr "Entwicklung"
#: target/out/prefs.js:66
msgid "Preview"
msgstr "Vorschau"
#: target/out/prefs.js:69
msgid "(Github Release)"
msgstr "(Github Release)"
#: target/out/prefs.js:72
msgid "(Built from source)"
msgstr "(Aus Quelle gebaut)"
#: target/out/features/widget/notifications.js:26
msgid "No Notifications"
msgstr "Keine Benachrichtigungen"
#: target/out/features/widget/notifications.js:58
#: target/out/features/widget/notifications.js:122
msgid "Clear"
msgstr "Löschen"
#: target/out/features/widget/notifications.js:76
msgid "Notifications"
msgstr "Benachrichtigungen"
#: target/out/features/widget/notifications.js:105
#: target/out/features/toggle/dndQuickToggle.js:10
#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485
msgid "Do Not Disturb"
msgstr "Nicht stören"
#: target/out/features/widget/media.js:118
msgid "Unknown title"
msgstr "Unbekannter Titel"
#: target/out/features/widget/media.js:888
msgid "Media"
msgstr "Medien"
#: target/out/features/widget/volumeMixer.js:105
msgid "Volume changed"
msgstr "Lautstärke geändert"
#: target/out/features/widget/volumeMixer.js:463
msgid "Open volumx mixer"
msgstr "Lautstärkemixer öffnen"
#: target/out/features/widget/volumeMixer.js:480
msgid "Volume Mixer"
msgstr "Lautstärkemixer"
#: target/out/features/widget/weather.js:73
msgid "Weather"
msgstr "Wetter"
#: target/out/features/widget/weather.js:192
msgid "Location has not been set"
msgstr "Standort wurde nicht festgelegt"
#: target/out/features/toggle/unsafeQuickToggle.js:11
#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496
msgid "Unsafe Mode"
msgstr "Unsicherer Modus"
#: target/out/prefPages/widgets.js:11
msgid "Handle radius"
msgstr "Handle-Radius"
#: target/out/prefPages/widgets.js:12
msgid "Set this to 0 to use default radius"
msgstr "Setze dies auf 0, um den Standard-Radius zu verwenden"
#: target/out/prefPages/widgets.js:18
msgid "Handle color"
msgstr "Handle Farbe"
#: target/out/prefPages/widgets.js:36
msgid "Slider style"
msgstr "Slider-Stil"
#: target/out/prefPages/widgets.js:39
msgid "Slim"
msgstr "Schmal"
#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766
msgid "Default"
msgstr "Vorgabe"
#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173
msgid "Background color"
msgstr "Hintergrundfarbe"
#: target/out/prefPages/widgets.js:55
msgid "Active Background color"
msgstr "Aktive Hintergrundfarbe"
#: target/out/prefPages/widgets.js:62
msgid "Thickness"
msgstr ""
#: target/out/prefPages/widgets.js:66
msgid "Set this to 0 to use default thickness"
msgstr ""
#: target/out/prefPages/widgets.js:76
msgid "Widgets"
msgstr "Widgets"
#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136
#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224
msgid "Media Widget"
msgstr "Medien-Widget"
#: target/out/prefPages/widgets.js:88
msgid "Turn on to make the media widget visible on the Quick Settings panel"
msgstr "Einschalten, um das Medien-Widget in den Schnelleinstellungen sichtbar zu machen"
#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280
#: target/out/prefPages/widgets.js:343
msgid "Compact mode"
msgstr "Kompakter Modus"
#: target/out/prefPages/widgets.js:93
msgid ""
"Make Media Controls widget smaller\n"
"Make it more similar in size to the notification message"
msgstr ""
"Verkleinern Sie das Widget „Mediensteuerung“\\n\n"
"Passen Sie die Größe der Benachrichtigungsnachricht an"
#: target/out/prefPages/widgets.js:99
msgid "Control buttons opacity"
msgstr "Deckkraft der Steuertasten"
#: target/out/prefPages/widgets.js:100
msgid "Set this to 255 to make opaque, and 0 to make transparent"
msgstr "Setze dies auf 255, um undurchsichtig zu machen und 0 um transparent zu machen"
#: target/out/prefPages/widgets.js:108
msgid "Show next button"
msgstr "Nächste Schaltfläche anzeigen"
#: target/out/prefPages/widgets.js:109
msgid "Add next contorl button next to description"
msgstr "Nächste Control-Taste neben der Beschreibung hinzufügen"
#: target/out/prefPages/widgets.js:115
msgid "Show previous button"
msgstr "Vorherige Schaltfläche anzeigen"
#: target/out/prefPages/widgets.js:116
msgid "Add previous contorl button next to description"
msgstr "Vorherige Control-Taste neben der Beschreibung hinzufügen"
#: target/out/prefPages/widgets.js:122
msgid "Show pause button"
msgstr "Pause-Button anzeigen"
#: target/out/prefPages/widgets.js:123
msgid "Add pause contorl button next to description"
msgstr "Füge Control-Taste neben der Beschreibung hinzu"
#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138
msgid "Show progress bar"
msgstr "Fortschrittsleiste anzeigen"
#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139
msgid "Add progress bar under description"
msgstr "Fortschrittsleiste unter Beschreibung hinzufügen"
#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164
msgid "Gradient background"
msgstr "Farbverlauf Hintergrund"
#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169
msgid ""
"Use gradient background extracted from cover image\n"
"May affect performance slightly"
msgstr ""
"Hintergrund des Farbverlaufs des Covers\n"
"kann die Leistung leicht beeinflussen"
#: target/out/prefPages/widgets.js:174
msgid "Base background color"
msgstr "Hintergrundfarbe Basis"
#: target/out/prefPages/widgets.js:182
msgid "Start opacity"
msgstr ""
#: target/out/prefPages/widgets.js:183
msgid "Adjust left side transparency, Set this to 1000 to make opaque"
msgstr "Linksseitige Transparenz anpassen. Auf 1000 setzen, um undurchsichtig zu machen"
#: target/out/prefPages/widgets.js:190
msgid "Start color"
msgstr ""
#: target/out/prefPages/widgets.js:191
msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color"
msgstr "Linke Hintergrundfarbenmischung anpassen. Setze diese auf 1000 um, die extrahierte Farbe anzuzeigen"
#: target/out/prefPages/widgets.js:198
msgid "End opacity"
msgstr ""
#: target/out/prefPages/widgets.js:199
msgid "Adjust right side transparency, Set this to 1000 to make opaque"
msgstr "Rechtsseitige Transparenz einstellen, auf 1000 setzen, um undurchsichtig zu machen"
#: target/out/prefPages/widgets.js:206
msgid "End color"
msgstr ""
#: target/out/prefPages/widgets.js:207
msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color"
msgstr "Anpassung der rechten Seite des Hintergrundfarbenmix auf 1000 setzen, um die extrahierte Farbe anzuzeigen"
#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226
msgid "Round clip effect"
msgstr "Clip-Effekt runden"
#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231
msgid "Use round clip effect to make transition more natural"
msgstr "Benutze den runden Clip-Effekt, um den Übergang natürlicher zu machen"
#: target/out/prefPages/widgets.js:234
msgid "Padding adjustment"
msgstr "Polsteranpassung"
#: target/out/prefPages/widgets.js:236
msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding"
msgstr "Passen Sie Clip-Effekt an, bearbeiten Sie diese, wenn Ihr Theme einen anderen Rand oder Polster hat"
#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318
#: target/out/prefPages/widgets.js:350
msgid "Remove shadow"
msgstr "Schatten entfernen"
#: target/out/prefPages/widgets.js:254
msgid ""
"Remove shadow from media message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
"Schatten von Medien-Nachricht entfernen\n"
"Benutzen, wenn Ihr Theme unnötige Schatten erstellt"
#: target/out/prefPages/widgets.js:260
msgid "Smooth scroll speed"
msgstr "Glatte Scrollgeschwindigkeit"
#: target/out/prefPages/widgets.js:261
msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction"
msgstr "Trackpad und Trackpoint-Scrollgeschwindigkeit anpassen, negative Zahl für Invert-Richtung"
#: target/out/prefPages/widgets.js:271
msgid "Notifications Widget"
msgstr "Benachrichtigungs-Widget"
#: target/out/prefPages/widgets.js:276
msgid "Turn on to make the notifications widget visible on the Quick Settings panel"
msgstr "Einschalten, um das Benachrichtigungs-Widget in den Schnelleinstellungen sichtbar zu machen"
#: target/out/prefPages/widgets.js:281
msgid "Make notifications smaller"
msgstr "Benachrichtigungen verkleinern"
#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418
msgid "Max height"
msgstr "Maximale Höhe"
#: target/out/prefPages/widgets.js:288
#, javascript-format
msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height"
msgstr "Legen Sie die maximale Höhe des Benachrichtigungs-Widgets fest, Standard ist %d. Setzen Sie dies auf 0, um die maximale Höhe zu deaktivieren"
#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441
msgid "Fade out offset"
msgstr "Ausblenden Offset"
#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442
msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46"
msgstr "Setze die Position des Ausblendeffekts ein. Setze dies auf 0, um den Ausblendeffekt zu deaktivieren. Standard ist 46"
#: target/out/prefPages/widgets.js:304
msgid "Auto hide"
msgstr "Auto-Verstecken"
#: target/out/prefPages/widgets.js:305
msgid "Hide the Notifications widget when have no notifications"
msgstr "Das Benachrichtigungs-Widget ausblenden, wenn keine Benachrichtigungen vorhanden sind"
#: target/out/prefPages/widgets.js:311
msgid "Use native controls"
msgstr "Native Steuerelemente verwenden"
#: target/out/prefPages/widgets.js:312
msgid "Use native dnd switch and clear button"
msgstr "Benutze DND-Schalter und Löschen-Taste"
#: target/out/prefPages/widgets.js:319
msgid ""
"Remove shadow from notification message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
"Schatten aus der Benachrichtigungsnachricht entfernen\n"
"Benutzen, wenn Ihr Template unnötige Schatten erstellt"
#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427
msgid "Show scrollbar"
msgstr "Scrollbar anzeigen"
#: target/out/prefPages/widgets.js:326
msgid "Show scrollbar on message list"
msgstr "Scrollbar in der Nachrichtenliste anzeigen"
#: target/out/prefPages/widgets.js:334
msgid "Weather Widget"
msgstr "Wetter-Widget"
#: target/out/prefPages/widgets.js:339
msgid "Turn on to make the weather widget visible on the Quick Settings panel"
msgstr "Einschalten, um das Wetter-Widget in den Schnelleinstellungen sichtbar zu machen"
#: target/out/prefPages/widgets.js:344
msgid "Make weather widget smaller"
msgstr "Wetter-Widget verkleinern"
#: target/out/prefPages/widgets.js:351
msgid ""
"Remove shadow from weather widget\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
"Schatten vom Wetter-Widget entfernen\n"
"Verwenden Sie diese Option, wenn Ihr Design unnötige Schatten erzeugt"
#: target/out/prefPages/widgets.js:357
msgid "Click command"
msgstr "Klick Befehl"
#: target/out/prefPages/widgets.js:363
msgid "Show location"
msgstr "Standort anzeigen"
#: target/out/prefPages/widgets.js:364
msgid "Show the location label on header"
msgstr "Standortbezeichnung im Kopfbereich anzeigen"
#: target/out/prefPages/widgets.js:373
msgid "Forecast interval"
msgstr "Prognoseintervall"
#: target/out/prefPages/widgets.js:374
msgid "Adjust forecast interval in hour"
msgstr "Vorhersageintervall in Stunde anpassen"
#: target/out/prefPages/widgets.js:381
msgid "Max forecasts"
msgstr "Maximale Vorhersagen"
#: target/out/prefPages/widgets.js:382
msgid "Adjust max forecasts"
msgstr "Maximale Vorhersagen anpassen"
#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456
msgid "Volume mixer Widget"
msgstr "Lautstärkeregler Widget"
#: target/out/prefPages/widgets.js:393
msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel"
msgstr "Einschalten, um das Lautstärkeregler Widget in den Schnelleinstellungen sichtbar zu machen"
#: target/out/prefPages/widgets.js:397
msgid "Label text"
msgstr "Text der Beschriftung"
#: target/out/prefPages/widgets.js:398
msgid "Choose label above slider text source"
msgstr "Label über Slider-Textquelle wählen"
#: target/out/prefPages/widgets.js:400
msgid "Both"
msgstr "Beides"
#: target/out/prefPages/widgets.js:401
msgid "Title"
msgstr "Titel"
#: target/out/prefPages/widgets.js:402
msgid "Description"
msgstr "Beschreibung"
#: target/out/prefPages/widgets.js:403
msgid "None"
msgstr "Keine"
#: target/out/prefPages/widgets.js:411
msgid "Label opacity"
msgstr "Deckkraft des Labels"
#: target/out/prefPages/widgets.js:412
msgid ""
"Adjust label opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
"Deckkraft des Labels anpassen.\n"
"Setze dies auf 255, um undurchsichtig zu machen, und 0 um transparent zu machen"
#: target/out/prefPages/widgets.js:419
#, javascript-format
msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height"
msgstr "Legen Sie die maximale Höhe des Volume Mixer Widgets fest, Standard ist %d. Setzen Sie dies auf 0, um die maximale Höhe zu deaktivieren"
#: target/out/prefPages/widgets.js:428
msgid "Show scrollbar on mixer list"
msgstr "Scrollbar in der Mixer-Liste anzeigen"
#: target/out/prefPages/widgets.js:434
msgid "Show stream icon"
msgstr "Stream-Symbol anzeigen"
#: target/out/prefPages/widgets.js:435
msgid "Show stream icon above mixer sliders"
msgstr "Stream-Symbol über Mixer-Schieberegler anzeigen"
#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458
msgid "Attach to output slider"
msgstr "An Ausgaberegler anhängen"
#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459
msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout"
msgstr "Lautstärkeregler an den Ausgaberegler anhängen. Benutzen, wenn Sie ein kompaktes Layout bevorzugen"
#: target/out/prefPages/widgets.js:468
msgid "Menu icon"
msgstr "Menüsymbol"
#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32
msgid "About"
msgstr "Über"
#: target/out/prefPages/about.js:33
msgid "Common extension informations"
msgstr "Allgemeine Erweiterungsinformationen"
#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40
msgid "Changelogs"
msgstr "Changelogs"
#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41
msgid "View the change history for this extension"
msgstr "Änderungshistorie für diese Erweiterung anzeigen"
#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57
msgid "License of codes"
msgstr "Codelizenz"
#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65
#: target/out/prefPages/about.js:69
msgid "Contributors"
msgstr "Mitwirkende"
#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70
msgid "The creators of this extension"
msgstr "Die Ersteller dieser Erweiterung"
#: target/out/prefPages/about.js:74
msgid "More contributors"
msgstr "Mehr Mitwirkende"
#: target/out/prefPages/about.js:75
msgid "See more contributors on github"
msgstr "Mehr Mitwirkende auf Github ansehen"
#: target/out/prefPages/about.js:85
msgid "Link"
msgstr "Link"
#: target/out/prefPages/about.js:86
msgid "External links about this extension"
msgstr "Externe Links zu dieser Erweiterung"
#: target/out/prefPages/about.js:90
msgid "Donate via github sponsors"
msgstr "Spenden über GitHub Sponsoren"
#: target/out/prefPages/about.js:91
msgid "Support development!"
msgstr "Entwicklung unterstützen!"
#: target/out/prefPages/about.js:97
msgid "Rate and comment the extension!"
msgstr "Bewerten und kommentieren Sie die Erweiterung!"
#: target/out/prefPages/about.js:102
msgid "Github Repository"
msgstr "Github Repository"
#: target/out/prefPages/about.js:103
msgid ""
"Add Star on Repository is helping me a lot!\n"
"Please, if you found bug from this extension, you can make issue to make me know that!\n"
"Or, you can create PR with wonderful features!"
msgstr ""
"Das Hinzufügen eines Sterns zum Repository hilft mir sehr!\n"
"Wenn Sie einen Fehler in dieser Erweiterung finden, können Sie mir das Problem melden!\n"
"Oder Sie können einen PR mit tollen Funktionen erstellen!"
#: target/out/prefPages/about.js:109
msgid "Add translation to this extension!"
msgstr "Übersetzung zu dieser Erweiterung hinzufügen!"
#: target/out/prefPages/about.js:115
msgid "Debug"
msgstr "Debug"
#: target/out/prefPages/about.js:116
msgid "Extension debugging options"
msgstr "Debug-Optionen"
#: target/out/prefPages/about.js:120
msgid "Expose environment"
msgstr "Umgebung freigeben"
#: target/out/prefPages/about.js:121
msgid "Expose extension environment to globalThis.qst"
msgstr "Erweiterungsumgebung globalThis.qst anzeigen"
#: target/out/prefPages/about.js:126
msgid "Show layout border"
msgstr "Layout-Rahmen anzeigen"
#: target/out/prefPages/about.js:127
msgid "Show layout borders on Quick Settings"
msgstr "Layout-Ränder in Schnelleinstellungen anzeigen"
#: target/out/prefPages/about.js:132
msgid "Log level"
msgstr "Log-Level"
#: target/out/prefPages/about.js:135
msgid "none"
msgstr "keine"
#: target/out/prefPages/about.js:136
msgid "error"
msgstr "fehlerhaft"
#: target/out/prefPages/about.js:137
msgid "info"
msgstr "Info"
#: target/out/prefPages/about.js:138
msgid "debug"
msgstr "Debug"
#: target/out/prefPages/toggles.js:12
msgid "Toggles"
msgstr "Toggles"
#: target/out/prefPages/toggles.js:19
msgid "DND Quick Toggle"
msgstr "DND Quick Toggle"
#: target/out/prefPages/toggles.js:20
msgid "Turn on to add the DND quick toggle on the Quick Settings panel"
msgstr "Aktivieren, um den DND-Schnellschalter in den Schnelleinstellungen hinzuzufügen"
#: target/out/prefPages/toggles.js:28
msgid "DND indicator position"
msgstr "DND-Indikatorposition"
#: target/out/prefPages/toggles.js:29
msgid "Set DND indicator position"
msgstr "DND-Indikatorposition festlegen"
#: target/out/prefPages/toggles.js:33
msgid "System Tray"
msgstr "System Tray"
#: target/out/prefPages/toggles.js:34
msgid "Date Menu Button"
msgstr "Datumsmenü-Taste"
#: target/out/prefPages/toggles.js:41
msgid "Unsafe Mode Quick Toggle"
msgstr "Unsicherer Modus Schnellwechsel"
#: target/out/prefPages/toggles.js:42
msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel"
msgstr "Einschalten, um den unsicheren Schnelleinstellungen hinzuzufügen"
#: target/out/prefPages/toggles.js:50
msgid "Save last session state"
msgstr "Letzten Sitzungsstatus speichern"
#: target/out/prefPages/toggles.js:51
msgid "Turn on to save last session unsafe state"
msgstr "Aktivieren, um den unsicheren Status der letzten Sitzung zu speichern"
#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141
msgid "Advanced animation style"
msgstr "Erweiterter Animationsstil"
#: target/out/prefPages/menu.js:13
msgid "Open Duration"
msgstr "Öffne Dauer"
#: target/out/prefPages/menu.js:14
msgid "Open animation duration in microseconds"
msgstr "Animationsdauer in Mikrosekunden öffnen"
#: target/out/prefPages/menu.js:21
msgid "Close Duration"
msgstr "Dauer schließen"
#: target/out/prefPages/menu.js:22
msgid "Close animation duration in microseconds"
msgstr "Dauer der Animation in Mikrosekunden schließen"
#: target/out/prefPages/menu.js:29
msgid "Grid Content Opacity"
msgstr "Deckkraft des Gitters"
#: target/out/prefPages/menu.js:30
msgid ""
"Adjust grid content opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
"Deckkraft des Gitters anpassen.\n"
"Auf 255 setzen, um Deckkraft zu erzeugen, und 0 um transparent zu machen"
#: target/out/prefPages/menu.js:37
msgid "Background Blur Radius"
msgstr "Hintergrundunschärfe-Radius"
#: target/out/prefPages/menu.js:38
msgid ""
"Adjust background blur radius.\n"
"Set this to 0 to disable blur effect"
msgstr ""
"Hintergrundunschärfe-Radius anpassen.\n"
"Setze dies auf 0, um Unschärfe-Effekt zu deaktivieren"
#: target/out/prefPages/menu.js:45
msgid "Background Brightness"
msgstr "Hintergrundhelligkeit"
#: target/out/prefPages/menu.js:46
msgid ""
"Adjust background brightness.\n"
"Set this to 1000 to disable brightness control effect.\n"
"Not impacts on gnome-shell's default dim effect."
msgstr ""
"Hintergrundhelligkeit anpassen.\n"
"Setze dies auf 1000 um, den Helligkeitskontroll-Effekt zu deaktivieren.\n"
"Wirkt sich nicht auf Gnome-Shells Standard-Dim-Effekt aus."
#: target/out/prefPages/menu.js:53
msgid "Background Opacity"
msgstr "Hintergrundtransparenz"
#: target/out/prefPages/menu.js:54
msgid ""
"Adjust background opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
"Deckkraft des Hintergrunds anpassen.\n"
"Setze dies auf 255, um undurchsichtig zu machen, und 0 um transparent zu machen"
#: target/out/prefPages/menu.js:61
msgid "Background X Scale"
msgstr "Hintergrund X Skala"
#: target/out/prefPages/menu.js:62
msgid "Adjust background x scale, 1000 means 1.0 scale"
msgstr "Hintergrund x Skalierung anpassen, 1000 bedeutet 1,0 Skala"
#: target/out/prefPages/menu.js:69
msgid "Background Y Scale"
msgstr "Hintergrund Y-Skala"
#: target/out/prefPages/menu.js:70
msgid "Adjust background y scale, 1000 means 1.0 scale"
msgstr "Hintergrund y Skalierung anpassen, 1000 bedeutet 1,0 Skala"
#: target/out/prefPages/menu.js:84
msgid "Menu"
msgstr "Menü"
#: target/out/prefPages/menu.js:91
msgid "Overlay Mode"
msgstr "Overlay Mode"
#: target/out/prefPages/menu.js:92
msgid "Display toggle, power, and sound menus as overlay"
msgstr "Schalt-, Power- und Sound-Menüs als Overlay anzeigen"
#: target/out/prefPages/menu.js:101
msgid "Overlay Width"
msgstr "Overlay-Breite"
#: target/out/prefPages/menu.js:102
msgid ""
"Adjust overlay menu width\n"
"Set this to 0 to disable adjusting"
msgstr ""
"Überlagerungsmenü Breite\n"
"Auf 0 setzen, um Anpassung zu deaktivieren"
#: target/out/prefPages/menu.js:109
msgid "Overlay Animation Duration"
msgstr "Dauer der Overlay-Animation"
#: target/out/prefPages/menu.js:110
msgid ""
"Custom menu open animation duration in microseconds\n"
"Set this to 0 to disable custom animation"
msgstr ""
"Angepasste Menü-Animationsdauer in Mikrosekunden\n"
"Setze dies auf 0, um benutzerdefinierte Animation zu deaktivieren"
#: target/out/prefPages/menu.js:117
msgid "Overlay Animation Style"
msgstr "Animationsstil überlagern"
#: target/out/prefPages/menu.js:118
msgid "Custom menu open animation style"
msgstr "Animationsstil des Menüs öffnen"
#: target/out/prefPages/menu.js:120
msgid "Flyout"
msgstr "Flyout"
#: target/out/prefPages/menu.js:121
msgid "Dialog"
msgstr "Dialog"
#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143
msgid "Animation"
msgstr "Animation"
#: target/out/prefPages/menu.js:131
msgid ""
"Add menu animation on toggle menu opening and closing\n"
"To get the best feel, turn on overlay mode"
msgstr ""
"Menüanimation beim Öffnen und Schließen des Menüs\n"
"hinzufügen, um das beste Gefühl zu erhalten, aktivieren Sie den Overlay-Modus"
#: target/out/prefPages/menu.js:142
msgid "Adjust speed, blur, scale, and opacity"
msgstr "Schnelligkeit, Unschärfe, Skalierung und Deckkraft anpassen"
#: target/out/prefPages/layout.js:25
msgid "The item not found"
msgstr "Das Element nicht gefunden"
#: target/out/prefPages/layout.js:28
msgid "No changes"
msgstr "Keine Änderungen"
#: target/out/prefPages/layout.js:31
msgid "The same item already exists"
msgstr "Das gleiche Element existiert bereits"
#: target/out/prefPages/layout.js:40
#, javascript-format
msgid "Properties of %s"
msgstr "Objekte von %s"
#: target/out/prefPages/layout.js:47
msgid "Save"
msgstr "Speichern"
#: target/out/prefPages/layout.js:64
msgid "Toggle editor"
msgstr "Editor umschalten"
#: target/out/prefPages/layout.js:84
msgid "This option requires full gnome-shell reloading"
msgstr "Diese Option erfordert ein vollständiges Nachladen von Gnome-Shell"
#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278
#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672
msgid "Hide"
msgstr "Verstecken"
#: target/out/prefPages/layout.js:232
#, javascript-format
msgid "My item #%d"
msgstr "Mein Artikel #%d"
#: target/out/prefPages/layout.js:250
msgid "New Item"
msgstr "Neues Element"
#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610
#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787
#: target/out/prefPages/layout.js:813
msgid "Ordering and Hiding"
msgstr "Reihenfolge und Verstecken"
#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432
msgid "Friendly Name"
msgstr "Freundlicher Name"
#: target/out/prefPages/layout.js:283
msgid "Title Regex (Javascript Regex)"
msgstr "Titel Regex (Javascript Regex)"
#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442
msgid "Constructor Name"
msgstr "Name des Konstrukteurs"
#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448
msgid "GType Name"
msgstr "GType Name"
#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456
msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension"
msgstr "Dies ist der Kommentar zur einfachen Identifizierung in der Einstellungsliste. Er hat keine Auswirkung auf das Verhalten der Erweiterung"
#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461
msgid "Javascript constructor name"
msgstr "Name des Javascript-Konstruktors"
#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466
msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance"
msgstr "GObject gtype Name. Sie können diesen Wert erhalten, indem Sie GObject.type_name_from_instance aufrufen"
#: target/out/prefPages/layout.js:342
msgid "Keyboard Backlight"
msgstr "Tastaturbeleuchtung"
#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538
msgid "Unordered items"
msgstr "Unbestellte Artikel"
#: target/out/prefPages/layout.js:486
msgid "Remote Access Applet"
msgstr "Remote-Zugangs-Applet"
#: target/out/prefPages/layout.js:487
msgid "Camera"
msgstr "Kamera"
#: target/out/prefPages/layout.js:488
msgid "Volume Input"
msgstr "Volume Input"
#: target/out/prefPages/layout.js:489
msgid "Location"
msgstr "Standort"
#: target/out/prefPages/layout.js:490
msgid "Thunderbolt"
msgstr "Donnerblitz"
#: target/out/prefPages/layout.js:492
msgid "Network"
msgstr "Netzwerk"
#: target/out/prefPages/layout.js:495
msgid "Volume Output"
msgstr "Lautstärke-Ausgabe"
#: target/out/prefPages/layout.js:497
msgid "System (Battery)"
msgstr "System (Groß)"
#: target/out/prefPages/layout.js:618
msgid "Desktop Spacer"
msgstr "Desktop-Abstand"
#: target/out/prefPages/layout.js:629
msgid "Laptop Spacer"
msgstr "Laptop-Spacer"
#: target/out/prefPages/layout.js:641
msgid "Capture button"
msgstr "Aufnahme-Button"
#: target/out/prefPages/layout.js:647
msgid "Settings button"
msgstr "Einstellungen-Schaltfläche"
#: target/out/prefPages/layout.js:653
msgid "Lock button"
msgstr "Sperren-Taste"
#: target/out/prefPages/layout.js:659
msgid "Shutdown button"
msgstr "Herunterfahren-Schaltfläche"
#: target/out/prefPages/layout.js:665
msgid "Battery button"
msgstr "Akku-Taste"
#: target/out/prefPages/layout.js:711
msgid "Layout"
msgstr "Layout"
#: target/out/prefPages/layout.js:718
msgid "Quick Toggles Layout"
msgstr "Schnellwechsel-Layout"
#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734
msgid "Adjust quick toggles layout"
msgstr "Schnellschaltlayout anpassen"
#: target/out/prefPages/layout.js:738
msgid "Reorder and hide quick toggles"
msgstr "Schnellschalter neu anordnen und ausblenden"
#: target/out/prefPages/layout.js:745
msgid "System Indicators"
msgstr "Systemindikatoren"
#: target/out/prefPages/layout.js:746
msgid "Adjust system indicators layout and style"
msgstr "Layout und Stil der Systemindikatoren anpassen"
#: target/out/prefPages/layout.js:751
msgid "Accent screen sharing indicator"
msgstr "Display-Sharing-Indikator"
#: target/out/prefPages/layout.js:752
msgid "Use shell accent color on screen sharing indicator"
msgstr "Shell-Akzentfarbe für Bildschirmfreigabe verwenden"
#: target/out/prefPages/layout.js:757
msgid "Accent screen recording indicator"
msgstr "Display-Aufnahme-Indikator"
#: target/out/prefPages/layout.js:758
msgid "Use shell accent color on screen recording indicator"
msgstr "Shell-Akzentfarbe für Bildschirmaufzeichnung verwenden"
#: target/out/prefPages/layout.js:763
msgid "Privacy indicators style"
msgstr "Stil der Datenschutzindikatoren"
#: target/out/prefPages/layout.js:764
msgid "Use monochrome or shell accent color on privarcy indicators"
msgstr "Verwenden Sie monochrome oder Shell-Akzentfarbe in Privatsachen Indikatoren"
#: target/out/prefPages/layout.js:767
msgid "Accent"
msgstr "Akzent"
#: target/out/prefPages/layout.js:768
msgid "Monochrome"
msgstr "Monochrom"
#: target/out/prefPages/layout.js:777
msgid "Adjust system indicators"
msgstr "Systemindikatoren anpassen"
#: target/out/prefPages/layout.js:788
msgid "Reorder and hide system indicators"
msgstr "Systemindikatoren neu anordnen und verstecken"
#: target/out/prefPages/layout.js:795
msgid "System Items Layout"
msgstr "Layout der Systemelemente"
#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815
msgid "Adjust system items layout"
msgstr "Layout der Systemelemente anpassen"
#: target/out/prefPages/layout.js:804
msgid "Hide layout box"
msgstr "Layoutbox ausblenden"
#: target/out/prefPages/layout.js:805
msgid "Hide all buttons and layout box"
msgstr "Alle Buttons und Layout-Box ausblenden"
#: target/out/prefPages/layout.js:814
msgid "Reorder and hide system items"
msgstr "Systemelemente neu anordnen und verstecken"
#: target/out/prefPages/layout.js:823
msgid "Date Menu"
msgstr "Datumsmenü"
#: target/out/prefPages/layout.js:824
msgid "Adjust Date Menu layout"
msgstr "Datumsmenü-Layout anpassen"
#: target/out/prefPages/layout.js:828
msgid "Hide left box"
msgstr "Linkskiste ausblenden"
#: target/out/prefPages/layout.js:829
msgid "Hide the left box of the date menu, which contains notifications and media control"
msgstr "Verstecke das linke Feld des Datumsmenüs, welches Benachrichtigungen und Medienkontrolle enthält"
#: target/out/prefPages/layout.js:834
msgid "Hide right box"
msgstr "Verstecke rechte Box"
#: target/out/prefPages/layout.js:835
msgid "Hide the right box of the date menu, which contains calendar, world clock and weather"
msgstr "Verstecke das rechte Feld des Datumsmenüs, welches Kalender, Weltzeit und Wetter enthält"
#: target/out/prefPages/layout.js:840
msgid "Disable menu"
msgstr "Menü deaktivieren"
#: target/out/prefPages/layout.js:841
msgid "Do not open date menu when the date menu button clicked"
msgstr "Datumsmenü nicht öffnen, wenn der Datumsmenü-Button angeklickt wurde"
#~ msgid "Height"
#~ msgstr "Höhe"
#~ msgid "Set this to 0 to use default height"
#~ msgstr "Auf 0 setzen, um die Standardhöhe zu verwenden"
#~ msgid "Start opaque"
#~ msgstr "Starte Deckkraft"
#~ msgid "End opaque"
#~ msgstr "Undurchsichtig beenden"
#~ msgid "Hide Notifications"
#~ msgstr "Benachrichtigungen ausblenden"
#~ msgid "Hide notifications on the date menu"
#~ msgstr "Benachrichtigungen im Datumsmenü ausblenden"
#~ msgid "Hide Media Control"
#~ msgstr "Mediensteuerung ausblenden"
#~ msgid "Hide media control on the date menu"
#~ msgstr "Mediensteuerung im Datumsmenü ausblenden"
================================================
FILE: po/en.po
================================================
# AUTHORS
# qwreey75 (aka qwreey) https://github.com/qwreey75/, 2023.
# DodoLeDev https://github.com/DodoLeDev, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-20 15:34+0000\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: target/out/libs/prefs/components.js:57
msgid "Details"
msgstr ""
#: target/out/libs/prefs/components.js:144
msgid "This feature marked as experimental"
msgstr ""
#: target/out/libs/prefs/components.js:274
msgid "Reset to default"
msgstr ""
#: target/out/libs/prefs/components.js:512
msgid "Theme default"
msgstr ""
#: target/out/libs/prefs/components.js:853
msgid "Homepage"
msgstr ""
#: target/out/libs/prefs/components.js:859
#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49
#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56
msgid "License"
msgstr ""
#: target/out/libs/prefs/components.js:860
msgid "Loading ..."
msgstr ""
#: target/out/libs/prefs/components.js:869
msgid "Affected Files"
msgstr ""
#: target/out/libs/prefs/components.js:924
msgid "Changelog"
msgstr ""
#: target/out/libs/prefs/components.js:938
msgid "(Current)"
msgstr ""
#: target/out/libs/prefs/components.js:969
#, javascript-format
msgid "> **Date:** %s"
msgstr ""
#: target/out/libs/prefs/components.js:970
#, javascript-format
msgid "> **Git Hash:** %s"
msgstr ""
#: target/out/libs/prefs/components.js:971
#, javascript-format
msgid "> **Build Number:** %d"
msgstr ""
#: target/out/libs/prefs/components.js:1034
msgid "Padding"
msgstr ""
#: target/out/libs/prefs/components.js:1038
msgid "Top"
msgstr "Top"
#: target/out/libs/prefs/components.js:1049
msgid "Bottom"
msgstr "Bottom"
#: target/out/libs/prefs/components.js:1060
msgid "Left"
msgstr ""
#: target/out/libs/prefs/components.js:1071
msgid "Right"
msgstr ""
#: target/out/prefs.js:60
msgid "Stable"
msgstr ""
#: target/out/prefs.js:63
msgid "Development"
msgstr ""
#: target/out/prefs.js:66
msgid "Preview"
msgstr ""
#: target/out/prefs.js:69
msgid "(Github Release)"
msgstr ""
#: target/out/prefs.js:72
msgid "(Built from source)"
msgstr ""
#: target/out/features/widget/notifications.js:26
msgid "No Notifications"
msgstr "No Notifications"
#: target/out/features/widget/notifications.js:58
#: target/out/features/widget/notifications.js:122
msgid "Clear"
msgstr "Clear"
# Quick settings notifications title text
# Notifications title
#: target/out/features/widget/notifications.js:76
msgid "Notifications"
msgstr "Notifications"
#: target/out/features/widget/notifications.js:105
#: target/out/features/toggle/dndQuickToggle.js:10
#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485
msgid "Do Not Disturb"
msgstr "Do Not Disturb"
#: target/out/features/widget/media.js:118
msgid "Unknown title"
msgstr ""
#: target/out/features/widget/media.js:888
msgid "Media"
msgstr ""
#: target/out/features/widget/volumeMixer.js:105
msgid "Volume changed"
msgstr "Volume changed"
#: target/out/features/widget/volumeMixer.js:463
msgid "Open volumx mixer"
msgstr ""
#: target/out/features/widget/volumeMixer.js:480
msgid "Volume Mixer"
msgstr "Volume Mixer"
#: target/out/features/widget/weather.js:73
msgid "Weather"
msgstr ""
#: target/out/features/widget/weather.js:192
msgid "Location has not been set"
msgstr ""
# Unsafe mode
#: target/out/features/toggle/unsafeQuickToggle.js:11
#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496
msgid "Unsafe Mode"
msgstr "Unsafe Mode"
#: target/out/prefPages/widgets.js:11
msgid "Handle radius"
msgstr ""
#: target/out/prefPages/widgets.js:12
msgid "Set this to 0 to use default radius"
msgstr ""
#: target/out/prefPages/widgets.js:18
msgid "Handle color"
msgstr ""
#: target/out/prefPages/widgets.js:36
msgid "Slider style"
msgstr ""
#: target/out/prefPages/widgets.js:39
msgid "Slim"
msgstr ""
#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766
msgid "Default"
msgstr ""
#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173
msgid "Background color"
msgstr ""
#: target/out/prefPages/widgets.js:55
msgid "Active Background color"
msgstr ""
#: target/out/prefPages/widgets.js:62
msgid "Thickness"
msgstr ""
#: target/out/prefPages/widgets.js:66
msgid "Set this to 0 to use default thickness"
msgstr ""
#: target/out/prefPages/widgets.js:76
msgid "Widgets"
msgstr ""
#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136
#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224
msgid "Media Widget"
msgstr ""
#: target/out/prefPages/widgets.js:88
msgid "Turn on to make the media widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280
#: target/out/prefPages/widgets.js:343
msgid "Compact mode"
msgstr ""
#: target/out/prefPages/widgets.js:93
msgid ""
"Make Media Controls widget smaller\n"
"Make it more similar in size to the notification message"
msgstr ""
"Make Media Controls widget smaller\n"
"Make it more similar in size to the notification message"
#: target/out/prefPages/widgets.js:99
msgid "Control buttons opacity"
msgstr ""
#: target/out/prefPages/widgets.js:100
msgid "Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/widgets.js:108
msgid "Show next button"
msgstr ""
#: target/out/prefPages/widgets.js:109
msgid "Add next contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:115
msgid "Show previous button"
msgstr ""
#: target/out/prefPages/widgets.js:116
msgid "Add previous contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:122
msgid "Show pause button"
msgstr ""
#: target/out/prefPages/widgets.js:123
msgid "Add pause contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138
msgid "Show progress bar"
msgstr ""
#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139
msgid "Add progress bar under description"
msgstr ""
#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164
msgid "Gradient background"
msgstr ""
#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169
msgid ""
"Use gradient background extracted from cover image\n"
"May affect performance slightly"
msgstr ""
#: target/out/prefPages/widgets.js:174
msgid "Base background color"
msgstr ""
#: target/out/prefPages/widgets.js:182
msgid "Start opacity"
msgstr ""
#: target/out/prefPages/widgets.js:183
msgid "Adjust left side transparency, Set this to 1000 to make opaque"
msgstr ""
#: target/out/prefPages/widgets.js:190
msgid "Start color"
msgstr ""
#: target/out/prefPages/widgets.js:191
msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color"
msgstr ""
#: target/out/prefPages/widgets.js:198
msgid "End opacity"
msgstr ""
#: target/out/prefPages/widgets.js:199
msgid "Adjust right side transparency, Set this to 1000 to make opaque"
msgstr ""
#: target/out/prefPages/widgets.js:206
msgid "End color"
msgstr ""
#: target/out/prefPages/widgets.js:207
msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color"
msgstr ""
#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226
msgid "Round clip effect"
msgstr ""
#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231
msgid "Use round clip effect to make transition more natural"
msgstr ""
#: target/out/prefPages/widgets.js:234
msgid "Padding adjustment"
msgstr ""
#: target/out/prefPages/widgets.js:236
msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding"
msgstr ""
#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318
#: target/out/prefPages/widgets.js:350
msgid "Remove shadow"
msgstr ""
#: target/out/prefPages/widgets.js:254
msgid ""
"Remove shadow from media message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:260
msgid "Smooth scroll speed"
msgstr ""
#: target/out/prefPages/widgets.js:261
msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction"
msgstr ""
#: target/out/prefPages/widgets.js:271
msgid "Notifications Widget"
msgstr ""
#: target/out/prefPages/widgets.js:276
msgid "Turn on to make the notifications widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:281
msgid "Make notifications smaller"
msgstr ""
#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418
msgid "Max height"
msgstr "Max height"
#: target/out/prefPages/widgets.js:288
#, javascript-format
msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441
msgid "Fade out offset"
msgstr ""
#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442
msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46"
msgstr ""
#: target/out/prefPages/widgets.js:304
msgid "Auto hide"
msgstr ""
#: target/out/prefPages/widgets.js:305
msgid "Hide the Notifications widget when have no notifications"
msgstr "Hide the Notifications widget when have no notifications"
#: target/out/prefPages/widgets.js:311
msgid "Use native controls"
msgstr "Use native controls"
#: target/out/prefPages/widgets.js:312
msgid "Use native dnd switch and clear button"
msgstr "Use native dnd switch and clear button"
#: target/out/prefPages/widgets.js:319
msgid ""
"Remove shadow from notification message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427
msgid "Show scrollbar"
msgstr ""
#: target/out/prefPages/widgets.js:326
msgid "Show scrollbar on message list"
msgstr ""
#: target/out/prefPages/widgets.js:334
msgid "Weather Widget"
msgstr ""
#: target/out/prefPages/widgets.js:339
msgid "Turn on to make the weather widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:344
msgid "Make weather widget smaller"
msgstr ""
#: target/out/prefPages/widgets.js:351
msgid ""
"Remove shadow from weather widget\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:357
msgid "Click command"
msgstr ""
#: target/out/prefPages/widgets.js:363
msgid "Show location"
msgstr ""
#: target/out/prefPages/widgets.js:364
msgid "Show the location label on header"
msgstr ""
#: target/out/prefPages/widgets.js:373
msgid "Forecast interval"
msgstr ""
#: target/out/prefPages/widgets.js:374
msgid "Adjust forecast interval in hour"
msgstr ""
#: target/out/prefPages/widgets.js:381
msgid "Max forecasts"
msgstr ""
#: target/out/prefPages/widgets.js:382
msgid "Adjust max forecasts"
msgstr ""
#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456
msgid "Volume mixer Widget"
msgstr ""
#: target/out/prefPages/widgets.js:393
msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:397
msgid "Label text"
msgstr ""
#: target/out/prefPages/widgets.js:398
msgid "Choose label above slider text source"
msgstr ""
#: target/out/prefPages/widgets.js:400
msgid "Both"
msgstr ""
#: target/out/prefPages/widgets.js:401
msgid "Title"
msgstr ""
#: target/out/prefPages/widgets.js:402
msgid "Description"
msgstr ""
#: target/out/prefPages/widgets.js:403
msgid "None"
msgstr ""
#: target/out/prefPages/widgets.js:411
msgid "Label opacity"
msgstr ""
#: target/out/prefPages/widgets.js:412
msgid ""
"Adjust label opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/widgets.js:419
#, javascript-format
msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:428
msgid "Show scrollbar on mixer list"
msgstr ""
#: target/out/prefPages/widgets.js:434
msgid "Show stream icon"
msgstr ""
#: target/out/prefPages/widgets.js:435
msgid "Show stream icon above mixer sliders"
msgstr ""
#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458
msgid "Attach to output slider"
msgstr ""
#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459
msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout"
msgstr ""
#: target/out/prefPages/widgets.js:468
msgid "Menu icon"
msgstr ""
#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32
msgid "About"
msgstr "About"
#: target/out/prefPages/about.js:33
msgid "Common extension informations"
msgstr ""
#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40
msgid "Changelogs"
msgstr ""
#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41
msgid "View the change history for this extension"
msgstr ""
#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57
msgid "License of codes"
msgstr ""
#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65
#: target/out/prefPages/about.js:69
msgid "Contributors"
msgstr ""
#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70
msgid "The creators of this extension"
msgstr "The creators of this extension"
#: target/out/prefPages/about.js:74
msgid "More contributors"
msgstr ""
#: target/out/prefPages/about.js:75
msgid "See more contributors on github"
msgstr ""
#: target/out/prefPages/about.js:85
msgid "Link"
msgstr ""
#: target/out/prefPages/about.js:86
msgid "External links about this extension"
msgstr ""
#: target/out/prefPages/about.js:90
msgid "Donate via github sponsors"
msgstr ""
#: target/out/prefPages/about.js:91
msgid "Support development!"
msgstr "Support development!"
#: target/out/prefPages/about.js:97
msgid "Rate and comment the extension!"
msgstr "Rate and comment the extension!"
#: target/out/prefPages/about.js:102
msgid "Github Repository"
msgstr "Github Repository"
#: target/out/prefPages/about.js:103
msgid ""
"Add Star on Repository is helping me a lot!\n"
"Please, if you found bug from this extension, you can make issue to make me know that!\n"
"Or, you can create PR with wonderful features!"
msgstr ""
"Add Star on Repository is helping me a lot!\n"
"Please, if you found bug from this extension, you can make issue to make me know that!\n"
"Or, you can create PR with wonderful features!"
#: target/out/prefPages/about.js:109
msgid "Add translation to this extension!"
msgstr ""
#: target/out/prefPages/about.js:115
msgid "Debug"
msgstr ""
#: target/out/prefPages/about.js:116
msgid "Extension debugging options"
msgstr ""
#: target/out/prefPages/about.js:120
msgid "Expose environment"
msgstr ""
#: target/out/prefPages/about.js:121
msgid "Expose extension environment to globalThis.qst"
msgstr ""
#: target/out/prefPages/about.js:126
msgid "Show layout border"
msgstr ""
#: target/out/prefPages/about.js:127
msgid "Show layout borders on Quick Settings"
msgstr ""
#: target/out/prefPages/about.js:132
msgid "Log level"
msgstr ""
#: target/out/prefPages/about.js:135
msgid "none"
msgstr ""
#: target/out/prefPages/about.js:136
msgid "error"
msgstr ""
#: target/out/prefPages/about.js:137
msgid "info"
msgstr ""
#: target/out/prefPages/about.js:138
msgid "debug"
msgstr ""
#: target/out/prefPages/toggles.js:12
msgid "Toggles"
msgstr ""
#: target/out/prefPages/toggles.js:19
msgid "DND Quick Toggle"
msgstr "DND Quick Toggle"
#: target/out/prefPages/toggles.js:20
msgid "Turn on to add the DND quick toggle on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/toggles.js:28
msgid "DND indicator position"
msgstr ""
#: target/out/prefPages/toggles.js:29
msgid "Set DND indicator position"
msgstr ""
#: target/out/prefPages/toggles.js:33
msgid "System Tray"
msgstr ""
#: target/out/prefPages/toggles.js:34
msgid "Date Menu Button"
msgstr ""
#: target/out/prefPages/toggles.js:41
msgid "Unsafe Mode Quick Toggle"
msgstr "Unsafe Mode Quick Toggle"
#: target/out/prefPages/toggles.js:42
msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/toggles.js:50
msgid "Save last session state"
msgstr ""
#: target/out/prefPages/toggles.js:51
msgid "Turn on to save last session unsafe state"
msgstr ""
#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141
msgid "Advanced animation style"
msgstr ""
#: target/out/prefPages/menu.js:13
msgid "Open Duration"
msgstr ""
#: target/out/prefPages/menu.js:14
msgid "Open animation duration in microseconds"
msgstr ""
#: target/out/prefPages/menu.js:21
msgid "Close Duration"
msgstr ""
#: target/out/prefPages/menu.js:22
msgid "Close animation duration in microseconds"
msgstr ""
#: target/out/prefPages/menu.js:29
msgid "Grid Content Opacity"
msgstr ""
#: target/out/prefPages/menu.js:30
msgid ""
"Adjust grid content opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:37
msgid "Background Blur Radius"
msgstr ""
#: target/out/prefPages/menu.js:38
msgid ""
"Adjust background blur radius.\n"
"Set this to 0 to disable blur effect"
msgstr ""
#: target/out/prefPages/menu.js:45
msgid "Background Brightness"
msgstr ""
#: target/out/prefPages/menu.js:46
msgid ""
"Adjust background brightness.\n"
"Set this to 1000 to disable brightness control effect.\n"
"Not impacts on gnome-shell's default dim effect."
msgstr ""
#: target/out/prefPages/menu.js:53
msgid "Background Opacity"
msgstr ""
#: target/out/prefPages/menu.js:54
msgid ""
"Adjust background opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:61
msgid "Background X Scale"
msgstr ""
#: target/out/prefPages/menu.js:62
msgid "Adjust background x scale, 1000 means 1.0 scale"
msgstr ""
#: target/out/prefPages/menu.js:69
msgid "Background Y Scale"
msgstr ""
#: target/out/prefPages/menu.js:70
msgid "Adjust background y scale, 1000 means 1.0 scale"
msgstr ""
#: target/out/prefPages/menu.js:84
msgid "Menu"
msgstr ""
#: target/out/prefPages/menu.js:91
msgid "Overlay Mode"
msgstr ""
#: target/out/prefPages/menu.js:92
msgid "Display toggle, power, and sound menus as overlay"
msgstr ""
#: target/out/prefPages/menu.js:101
msgid "Overlay Width"
msgstr ""
#: target/out/prefPages/menu.js:102
msgid ""
"Adjust overlay menu width\n"
"Set this to 0 to disable adjusting"
msgstr ""
#: target/out/prefPages/menu.js:109
msgid "Overlay Animation Duration"
msgstr ""
#: target/out/prefPages/menu.js:110
msgid ""
"Custom menu open animation duration in microseconds\n"
"Set this to 0 to disable custom animation"
msgstr ""
#: target/out/prefPages/menu.js:117
msgid "Overlay Animation Style"
msgstr ""
#: target/out/prefPages/menu.js:118
msgid "Custom menu open animation style"
msgstr ""
#: target/out/prefPages/menu.js:120
msgid "Flyout"
msgstr ""
#: target/out/prefPages/menu.js:121
msgid "Dialog"
msgstr ""
#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143
msgid "Animation"
msgstr ""
#: target/out/prefPages/menu.js:131
msgid ""
"Add menu animation on toggle menu opening and closing\n"
"To get the best feel, turn on overlay mode"
msgstr ""
#: target/out/prefPages/menu.js:142
msgid "Adjust speed, blur, scale, and opacity"
msgstr ""
#: target/out/prefPages/layout.js:25
msgid "The item not found"
msgstr ""
#: target/out/prefPages/layout.js:28
msgid "No changes"
msgstr ""
#: target/out/prefPages/layout.js:31
msgid "The same item already exists"
msgstr ""
#: target/out/prefPages/layout.js:40
#, javascript-format
msgid "Properties of %s"
msgstr ""
#: target/out/prefPages/layout.js:47
msgid "Save"
msgstr ""
#: target/out/prefPages/layout.js:64
msgid "Toggle editor"
msgstr ""
#: target/out/prefPages/layout.js:84
msgid "This option requires full gnome-shell reloading"
msgstr ""
#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278
#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672
msgid "Hide"
msgstr ""
#: target/out/prefPages/layout.js:232
#, javascript-format
msgid "My item #%d"
msgstr ""
#: target/out/prefPages/layout.js:250
msgid "New Item"
msgstr ""
#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610
#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787
#: target/out/prefPages/layout.js:813
msgid "Ordering and Hiding"
msgstr ""
#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432
msgid "Friendly Name"
msgstr ""
#: target/out/prefPages/layout.js:283
msgid "Title Regex (Javascript Regex)"
msgstr ""
#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442
msgid "Constructor Name"
msgstr ""
#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448
msgid "GType Name"
msgstr ""
#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456
msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension"
msgstr ""
#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461
msgid "Javascript constructor name"
msgstr ""
#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466
msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance"
msgstr ""
#: target/out/prefPages/layout.js:342
msgid "Keyboard Backlight"
msgstr ""
#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538
msgid "Unordered items"
msgstr ""
#: target/out/prefPages/layout.js:486
msgid "Remote Access Applet"
msgstr ""
#: target/out/prefPages/layout.js:487
msgid "Camera"
msgstr ""
#: target/out/prefPages/layout.js:488
msgid "Volume Input"
msgstr ""
#: target/out/prefPages/layout.js:489
msgid "Location"
msgstr ""
#: target/out/prefPages/layout.js:490
msgid "Thunderbolt"
msgstr ""
#: target/out/prefPages/layout.js:492
msgid "Network"
msgstr ""
#: target/out/prefPages/layout.js:495
msgid "Volume Output"
msgstr ""
#: target/out/prefPages/layout.js:497
msgid "System (Battery)"
msgstr ""
#: target/out/prefPages/layout.js:618
msgid "Desktop Spacer"
msgstr ""
#: target/out/prefPages/layout.js:629
msgid "Laptop Spacer"
msgstr ""
#: target/out/prefPages/layout.js:641
msgid "Capture button"
msgstr ""
#: target/out/prefPages/layout.js:647
msgid "Settings button"
msgstr ""
#: target/out/prefPages/layout.js:653
msgid "Lock button"
msgstr ""
#: target/out/prefPages/layout.js:659
msgid "Shutdown button"
msgstr ""
#: target/out/prefPages/layout.js:665
msgid "Battery button"
msgstr ""
#: target/out/prefPages/layout.js:711
msgid "Layout"
msgstr ""
#: target/out/prefPages/layout.js:718
msgid "Quick Toggles Layout"
msgstr ""
#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734
msgid "Adjust quick toggles layout"
msgstr ""
#: target/out/prefPages/layout.js:738
msgid "Reorder and hide quick toggles"
msgstr ""
#: target/out/prefPages/layout.js:745
msgid "System Indicators"
msgstr ""
#: target/out/prefPages/layout.js:746
msgid "Adjust system indicators layout and style"
msgstr ""
#: target/out/prefPages/layout.js:751
msgid "Accent screen sharing indicator"
msgstr ""
#: target/out/prefPages/layout.js:752
msgid "Use shell accent color on screen sharing indicator"
msgstr ""
#: target/out/prefPages/layout.js:757
msgid "Accent screen recording indicator"
msgstr ""
#: target/out/prefPages/layout.js:758
msgid "Use shell accent color on screen recording indicator"
msgstr ""
#: target/out/prefPages/layout.js:763
msgid "Privacy indicators style"
msgstr ""
#: target/out/prefPages/layout.js:764
msgid "Use monochrome or shell accent color on privarcy indicators"
msgstr ""
#: target/out/prefPages/layout.js:767
msgid "Accent"
msgstr ""
#: target/out/prefPages/layout.js:768
msgid "Monochrome"
msgstr ""
#: target/out/prefPages/layout.js:777
msgid "Adjust system indicators"
msgstr ""
#: target/out/prefPages/layout.js:788
msgid "Reorder and hide system indicators"
msgstr ""
#: target/out/prefPages/layout.js:795
msgid "System Items Layout"
msgstr ""
#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815
msgid "Adjust system items layout"
msgstr ""
#: target/out/prefPages/layout.js:804
msgid "Hide layout box"
msgstr ""
#: target/out/prefPages/layout.js:805
msgid "Hide all buttons and layout box"
msgstr ""
#: target/out/prefPages/layout.js:814
msgid "Reorder and hide system items"
msgstr ""
#: target/out/prefPages/layout.js:823
msgid "Date Menu"
msgstr ""
#: target/out/prefPages/layout.js:824
msgid "Adjust Date Menu layout"
msgstr ""
#: target/out/prefPages/layout.js:828
msgid "Hide left box"
msgstr ""
#: target/out/prefPages/layout.js:829
msgid "Hide the left box of the date menu, which contains notifications and media control"
msgstr ""
#: target/out/prefPages/layout.js:834
msgid "Hide right box"
msgstr ""
#: target/out/prefPages/layout.js:835
msgid "Hide the right box of the date menu, which contains calendar, world clock and weather"
msgstr ""
#: target/out/prefPages/layout.js:840
msgid "Disable menu"
msgstr ""
#: target/out/prefPages/layout.js:841
msgid "Do not open date menu when the date menu button clicked"
msgstr ""
#~ msgid "Donate via patreon"
#~ msgstr "Donate via patreon"
#~ msgid "Set maximum height of the Notifications widget. default is 292"
#~ msgstr "Set maximum height of the Notifications widget. default is 292"
#~ msgid "Other"
#~ msgstr "Other"
#~ msgid ""
#~ "Hide notifications on date menu.\n"
#~ "*this option removes media control on date menu too*"
#~ msgstr ""
#~ "Hide notifications on date menu.\n"
#~ "*this option removes media control on date menu too*"
#~ msgid "Hide media control on date menu."
#~ msgstr "Hide media control on date menu."
#~ msgid "Sound Settings"
#~ msgstr "Sound Settings"
#~ msgid "Notification Widget"
#~ msgstr "Notification Widget"
#~ msgid "Turn on to make the notification widget visible on the Quick Settings panel"
#~ msgstr "Turn on to make the notification widget visible on the Quick Settings panel"
#~ msgid "Links"
#~ msgstr "Links"
#~ msgid "Contributor"
#~ msgstr "Contributor"
#~ msgid "Add Application to filtering"
#~ msgstr "Add Application to filtering"
#~ msgid "Add"
#~ msgstr "Add"
#~ msgid "Cancel"
#~ msgstr "Cancel"
#~ msgid "Application name"
#~ msgstr "Application name"
#~ msgid "General"
#~ msgstr "General"
#~ msgid "Enchant input/output slider"
#~ msgstr "Enchant input/output slider"
#~ msgid "Show current audio output selection"
#~ msgstr "Show current audio output selection"
#~ msgid "Always show the current audio output selection above the volume slider"
#~ msgstr "Always show the current audio output selection above the volume slider"
#~ msgid "Show current audio input selection"
#~ msgstr "Show current audio input selection"
#~ msgid "Always show the current audio input selection above the volume slider"
#~ msgstr "Always show the current audio input selection above the volume slider"
#~ msgid "Always show input"
#~ msgstr "Always show input"
#~ msgid "Always show the audio input volume slider, even when there is no audio input stream."
#~ msgstr "Always show the audio input volume slider, even when there is no audio input stream."
#~ msgid "Add volume mixer (PulseAudio, Pipewire)"
#~ msgstr "Add volume mixer (PulseAudio, Pipewire)"
#~ msgid ""
#~ "Turn on to make the volume mixer visible\n"
#~ "Forked from https://github.com/mymindstorm/gnome-volume-mixer"
#~ msgstr "Turn on to make the volume mixer visible. Forked from https://github.com/mymindstorm/gnome-volume-mixer"
#~ msgid "Position"
#~ msgstr "Position"
#~ msgid "Set volume mixer position"
#~ msgstr "Set volume mixer position"
#~ msgid "Top (Below Output/Input slider)"
#~ msgstr "Top (Below Output/Input slider)"
#~ msgid "Show stream Description"
#~ msgstr "Show stream Description"
#~ msgid "Show audio stream description above the slider"
#~ msgstr "Show audio stream description above the slider"
#~ msgid "Show stream Icon"
#~ msgstr "Show stream Icon"
#~ msgid "Show application icon in front of the slider"
#~ msgstr "Show application icon in front of the slider"
#~ msgid "Filter applications shown in the volume mixer."
#~ msgstr "Filter applications shown in the volume mixer."
#~ msgid "Filter Mode"
#~ msgstr "Filter Mode"
#~ msgid "Blacklist"
#~ msgstr "Blacklist"
#~ msgid "Whitelist"
#~ msgstr "Whitelist"
#~ msgid "Using Javascript Regex"
#~ msgstr "Using Javascript Regex"
#~ msgid "Use Javascript RegExp for filtering app name or description"
#~ msgstr "Use Javascript RegExp for filtering app name or description"
#~ msgid "Check Stream Description"
#~ msgstr "Check Stream Description"
#~ msgid "Check Description also"
#~ msgstr "Check Description also"
#~ msgid "Add more buttons"
#~ msgstr "Add more buttons"
#~ msgid "Turn on the buttons you want to add on Quick Settings"
#~ msgstr "Turn on the buttons you want to add on Quick Settings"
#~ msgid "Turn on to make the DND quick toggle visible on the Quick Settings panel"
#~ msgstr "Turn on to make the DND quick toggle visible on the Quick Settings panel"
#~ msgid "Turn on to make the unsafe quick toggle visible on the Quick Settings panel"
#~ msgstr "Turn on to make the unsafe quick toggle visible on the Quick Settings panel"
#~ msgid "This extension is distributed with license GPL 3+"
#~ msgstr "This extension is distributed with license GPL 3+"
#~ msgid "excludes Third-party. Third party codes follow their license"
#~ msgstr "excludes Third-party. Third party codes follow their license"
#~ msgid "Extension Version"
#~ msgstr "Extension Version"
#~ msgid "Unknown (Built from source)"
#~ msgstr "Unknown (Built from source)"
#~ msgid "Third party LICENSE"
#~ msgstr "Third party LICENSE"
#~ msgid "LICENSE OF CODES WHICH USED ON THIS EXTENSION"
#~ msgstr "LICENSE OF CODES WHICH USED ON THIS EXTENSION"
#~ msgid "Media Controls widget"
#~ msgstr "Media Controls widget"
#~ msgid "Turn on to make the Media Control widget visible on the Quick Settings panel"
#~ msgstr "Turn on to make the Media Control widget visible on the Quick Settings panel"
#~ msgid "Compact Mode"
#~ msgstr "Compact Mode"
#~ msgid "Auto Hide"
#~ msgstr "Auto Hide"
#~ msgid "Quick Toggles"
#~ msgstr "Quick Toggles"
#~ msgid "Fix Weather Widget Overflow"
#~ msgstr "Fix Weather Widget Overflow"
#~ msgid "Fix overflow visual bug of weather widget in datemenu"
#~ msgstr "Fix overflow visual bug of weather widget in datemenu"
#~ msgid "Remove Notifications On Date Menu"
#~ msgstr "Remove Notifications On Date Menu"
#~ msgid "Remove Media Control On Date Menu"
#~ msgstr "Remove Media Control On Date Menu"
#~ msgid "Do not adjust the border radius of contents."
#~ msgstr "Do not adjust the border radius of contents."
#~ msgid "Don't adjust the border of messages and media controls."
#~ msgstr "Don't adjust the border of messages and media controls."
#~ msgid "Do not remove the shadow of contents."
#~ msgstr "Do not remove the shadow of contents."
#~ msgid "Don't remove the shadow of messages and media controls."
#~ msgstr "Don't remove the shadow of messages and media controls."
#~ msgid "Set Notifications widget position"
#~ msgstr "Set Notifications widget position"
#~ msgid "Buttons to remove"
#~ msgstr "Buttons to remove"
#~ msgid "Turn on the buttons you want to remove from Quick Settings"
#~ msgstr "Turn on the buttons you want to remove from Quick Settings"
#~ msgid "Remove chosen buttons from quick panel"
#~ msgstr "Remove chosen buttons from quick panel"
#~ msgid "Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover"
#~ msgstr "Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover"
#~ msgid "This feature is unstable sometime"
#~ msgstr "This feature is unstable sometime"
#~ msgid ""
#~ "When lock/unlock with gnome-screensaver, unexpected behavior occurs\n"
#~ "Please do not report issue about known issue, Almost duplicated\n"
#~ "Known issue:\n"
#~ " button doesn't remove after lockscreen\n"
#~ " modal get bigger after lockscreen"
#~ msgstr ""
#~ "When lock/unlock with gnome-screensaver, unexpected behavior occurs\n"
#~ "Please do not report issue about known issue, Almost duplicated\n"
#~ "Known issue:\n"
#~ " button doesn't remove after lockscreen\n"
#~ " modal get bigger after lockscreen"
#~ msgid "Please turn off if some bug occurred"
#~ msgstr "Please turn off if some bug occurred"
#~ msgid "Unknown"
#~ msgstr "Unknown"
#~ msgid ""
#~ "Do not separate Quick Settings and Notifications widgets, \byou should enable this option because separated panels can make many visual bugs\n"
#~ "(such as margin or padding not matching with the theme)"
#~ msgstr ""
#~ "Do not separate Quick Settings and Notifications widgets, \byou should enable this option because separated panels can make many visual bugs\n"
#~ "(such as margin or padding not matching with the theme)"
#~ msgid "Information"
#~ msgstr "Information"
#~ msgid "Version"
#~ msgstr "Version"
#~ msgid ""
#~ "Forked from https://github.com/mymindstorm/gnome-volume-mixer\n"
#~ "This feature works well with both PulseAudio and Pipewire protocols"
#~ msgstr ""
#~ "Forked from https://github.com/mymindstorm/gnome-volume-mixer\n"
#~ "This feature works well with both PulseAudio and Pipewire protocols"
#~ msgid "Visible"
#~ msgstr "Visible"
#~ msgid "Turn on to make the volume mixer visible"
#~ msgstr "Turn on to make the volume mixer visible"
#~ msgid "Application Filtering"
#~ msgstr "Application Filtering"
#~ msgid "Input/Output"
#~ msgstr "Input/Output"
#~ msgid "Add notifications widget"
#~ msgstr "Add notifications widget"
#~ msgid ""
#~ "Reference from https://github.com/Aylur/gnome-extensions\n"
#~ "Source code of that is not used on this extension"
#~ msgstr ""
#~ "Reference from https://github.com/Aylur/gnome-extensions\n"
#~ "Source code of that is not used on this extension"
#~ msgid "Media Controls"
#~ msgstr "Media Controls"
#~ msgid "Add Media Controls widget"
#~ msgstr "Add Media Controls widget"
================================================
FILE: po/ja.po
================================================
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-20 15:34+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: target/out/libs/prefs/components.js:57
msgid "Details"
msgstr ""
#: target/out/libs/prefs/components.js:144
msgid "This feature marked as experimental"
msgstr ""
#: target/out/libs/prefs/components.js:274
msgid "Reset to default"
msgstr ""
#: target/out/libs/prefs/components.js:512
msgid "Theme default"
msgstr ""
#: target/out/libs/prefs/components.js:853
msgid "Homepage"
msgstr ""
#: target/out/libs/prefs/components.js:859
#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49
#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56
msgid "License"
msgstr ""
#: target/out/libs/prefs/components.js:860
msgid "Loading ..."
msgstr ""
#: target/out/libs/prefs/components.js:869
msgid "Affected Files"
msgstr ""
#: target/out/libs/prefs/components.js:924
msgid "Changelog"
msgstr ""
#: target/out/libs/prefs/components.js:938
msgid "(Current)"
msgstr ""
#: target/out/libs/prefs/components.js:969
#, javascript-format
msgid "> **Date:** %s"
msgstr ""
#: target/out/libs/prefs/components.js:970
#, javascript-format
msgid "> **Git Hash:** %s"
msgstr ""
#: target/out/libs/prefs/components.js:971
#, javascript-format
msgid "> **Build Number:** %d"
msgstr ""
#: target/out/libs/prefs/components.js:1034
msgid "Padding"
msgstr ""
#: target/out/libs/prefs/components.js:1038
msgid "Top"
msgstr ""
#: target/out/libs/prefs/components.js:1049
msgid "Bottom"
msgstr ""
#: target/out/libs/prefs/components.js:1060
msgid "Left"
msgstr ""
#: target/out/libs/prefs/components.js:1071
msgid "Right"
msgstr ""
#: target/out/prefs.js:60
msgid "Stable"
msgstr ""
#: target/out/prefs.js:63
msgid "Development"
msgstr ""
#: target/out/prefs.js:66
msgid "Preview"
msgstr ""
#: target/out/prefs.js:69
msgid "(Github Release)"
msgstr ""
#: target/out/prefs.js:72
msgid "(Built from source)"
msgstr ""
#: target/out/features/widget/notifications.js:26
msgid "No Notifications"
msgstr ""
#: target/out/features/widget/notifications.js:58
#: target/out/features/widget/notifications.js:122
msgid "Clear"
msgstr ""
#: target/out/features/widget/notifications.js:76
msgid "Notifications"
msgstr ""
#: target/out/features/widget/notifications.js:105
#: target/out/features/toggle/dndQuickToggle.js:10
#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485
msgid "Do Not Disturb"
msgstr ""
#: target/out/features/widget/media.js:118
msgid "Unknown title"
msgstr ""
#: target/out/features/widget/media.js:888
msgid "Media"
msgstr ""
#: target/out/features/widget/volumeMixer.js:105
msgid "Volume changed"
msgstr ""
#: target/out/features/widget/volumeMixer.js:463
msgid "Open volumx mixer"
msgstr ""
#: target/out/features/widget/volumeMixer.js:480
msgid "Volume Mixer"
msgstr ""
#: target/out/features/widget/weather.js:73
msgid "Weather"
msgstr ""
#: target/out/features/widget/weather.js:192
msgid "Location has not been set"
msgstr ""
#: target/out/features/toggle/unsafeQuickToggle.js:11
#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496
msgid "Unsafe Mode"
msgstr ""
#: target/out/prefPages/widgets.js:11
msgid "Handle radius"
msgstr ""
#: target/out/prefPages/widgets.js:12
msgid "Set this to 0 to use default radius"
msgstr ""
#: target/out/prefPages/widgets.js:18
msgid "Handle color"
msgstr ""
#: target/out/prefPages/widgets.js:36
msgid "Slider style"
msgstr ""
#: target/out/prefPages/widgets.js:39
msgid "Slim"
msgstr ""
#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766
msgid "Default"
msgstr ""
#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173
msgid "Background color"
msgstr ""
#: target/out/prefPages/widgets.js:55
msgid "Active Background color"
msgstr ""
#: target/out/prefPages/widgets.js:62
msgid "Thickness"
msgstr ""
#: target/out/prefPages/widgets.js:66
msgid "Set this to 0 to use default thickness"
msgstr ""
#: target/out/prefPages/widgets.js:76
msgid "Widgets"
msgstr ""
#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136
#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224
msgid "Media Widget"
msgstr ""
#: target/out/prefPages/widgets.js:88
msgid "Turn on to make the media widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280
#: target/out/prefPages/widgets.js:343
msgid "Compact mode"
msgstr ""
#: target/out/prefPages/widgets.js:93
msgid ""
"Make Media Controls widget smaller\n"
"Make it more similar in size to the notification message"
msgstr ""
#: target/out/prefPages/widgets.js:99
msgid "Control buttons opacity"
msgstr ""
#: target/out/prefPages/widgets.js:100
msgid "Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/widgets.js:108
msgid "Show next button"
msgstr ""
#: target/out/prefPages/widgets.js:109
msgid "Add next contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:115
msgid "Show previous button"
msgstr ""
#: target/out/prefPages/widgets.js:116
msgid "Add previous contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:122
msgid "Show pause button"
msgstr ""
#: target/out/prefPages/widgets.js:123
msgid "Add pause contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138
msgid "Show progress bar"
msgstr ""
#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139
msgid "Add progress bar under description"
msgstr ""
#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164
msgid "Gradient background"
msgstr ""
#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169
msgid ""
"Use gradient background extracted from cover image\n"
"May affect performance slightly"
msgstr ""
#: target/out/prefPages/widgets.js:174
msgid "Base background color"
msgstr ""
#: target/out/prefPages/widgets.js:182
msgid "Start opacity"
msgstr ""
#: target/out/prefPages/widgets.js:183
msgid "Adjust left side transparency, Set this to 1000 to make opaque"
msgstr ""
#: target/out/prefPages/widgets.js:190
msgid "Start color"
msgstr ""
#: target/out/prefPages/widgets.js:191
msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color"
msgstr ""
#: target/out/prefPages/widgets.js:198
msgid "End opacity"
msgstr ""
#: target/out/prefPages/widgets.js:199
msgid "Adjust right side transparency, Set this to 1000 to make opaque"
msgstr ""
#: target/out/prefPages/widgets.js:206
msgid "End color"
msgstr ""
#: target/out/prefPages/widgets.js:207
msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color"
msgstr ""
#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226
msgid "Round clip effect"
msgstr ""
#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231
msgid "Use round clip effect to make transition more natural"
msgstr ""
#: target/out/prefPages/widgets.js:234
msgid "Padding adjustment"
msgstr ""
#: target/out/prefPages/widgets.js:236
msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding"
msgstr ""
#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318
#: target/out/prefPages/widgets.js:350
msgid "Remove shadow"
msgstr ""
#: target/out/prefPages/widgets.js:254
msgid ""
"Remove shadow from media message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:260
msgid "Smooth scroll speed"
msgstr ""
#: target/out/prefPages/widgets.js:261
msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction"
msgstr ""
#: target/out/prefPages/widgets.js:271
msgid "Notifications Widget"
msgstr ""
#: target/out/prefPages/widgets.js:276
msgid "Turn on to make the notifications widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:281
msgid "Make notifications smaller"
msgstr ""
#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418
msgid "Max height"
msgstr ""
#: target/out/prefPages/widgets.js:288
#, javascript-format
msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441
msgid "Fade out offset"
msgstr ""
#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442
msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46"
msgstr ""
#: target/out/prefPages/widgets.js:304
msgid "Auto hide"
msgstr ""
#: target/out/prefPages/widgets.js:305
msgid "Hide the Notifications widget when have no notifications"
msgstr ""
#: target/out/prefPages/widgets.js:311
msgid "Use native controls"
msgstr ""
#: target/out/prefPages/widgets.js:312
msgid "Use native dnd switch and clear button"
msgstr ""
#: target/out/prefPages/widgets.js:319
msgid ""
"Remove shadow from notification message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427
msgid "Show scrollbar"
msgstr ""
#: target/out/prefPages/widgets.js:326
msgid "Show scrollbar on message list"
msgstr ""
#: target/out/prefPages/widgets.js:334
msgid "Weather Widget"
msgstr ""
#: target/out/prefPages/widgets.js:339
msgid "Turn on to make the weather widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:344
msgid "Make weather widget smaller"
msgstr ""
#: target/out/prefPages/widgets.js:351
msgid ""
"Remove shadow from weather widget\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:357
msgid "Click command"
msgstr ""
#: target/out/prefPages/widgets.js:363
msgid "Show location"
msgstr ""
#: target/out/prefPages/widgets.js:364
msgid "Show the location label on header"
msgstr ""
#: target/out/prefPages/widgets.js:373
msgid "Forecast interval"
msgstr ""
#: target/out/prefPages/widgets.js:374
msgid "Adjust forecast interval in hour"
msgstr ""
#: target/out/prefPages/widgets.js:381
msgid "Max forecasts"
msgstr ""
#: target/out/prefPages/widgets.js:382
msgid "Adjust max forecasts"
msgstr ""
#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456
msgid "Volume mixer Widget"
msgstr ""
#: target/out/prefPages/widgets.js:393
msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:397
msgid "Label text"
msgstr ""
#: target/out/prefPages/widgets.js:398
msgid "Choose label above slider text source"
msgstr ""
#: target/out/prefPages/widgets.js:400
msgid "Both"
msgstr ""
#: target/out/prefPages/widgets.js:401
msgid "Title"
msgstr ""
#: target/out/prefPages/widgets.js:402
msgid "Description"
msgstr ""
#: target/out/prefPages/widgets.js:403
msgid "None"
msgstr ""
#: target/out/prefPages/widgets.js:411
msgid "Label opacity"
msgstr ""
#: target/out/prefPages/widgets.js:412
msgid ""
"Adjust label opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/widgets.js:419
#, javascript-format
msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:428
msgid "Show scrollbar on mixer list"
msgstr ""
#: target/out/prefPages/widgets.js:434
msgid "Show stream icon"
msgstr ""
#: target/out/prefPages/widgets.js:435
msgid "Show stream icon above mixer sliders"
msgstr ""
#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458
msgid "Attach to output slider"
msgstr ""
#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459
msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout"
msgstr ""
#: target/out/prefPages/widgets.js:468
msgid "Menu icon"
msgstr ""
#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32
msgid "About"
msgstr ""
#: target/out/prefPages/about.js:33
msgid "Common extension informations"
msgstr ""
#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40
msgid "Changelogs"
msgstr ""
#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41
msgid "View the change history for this extension"
msgstr ""
#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57
msgid "License of codes"
msgstr ""
#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65
#: target/out/prefPages/about.js:69
msgid "Contributors"
msgstr ""
#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70
msgid "The creators of this extension"
msgstr ""
#: target/out/prefPages/about.js:74
msgid "More contributors"
msgstr ""
#: target/out/prefPages/about.js:75
msgid "See more contributors on github"
msgstr ""
#: target/out/prefPages/about.js:85
msgid "Link"
msgstr ""
#: target/out/prefPages/about.js:86
msgid "External links about this extension"
msgstr ""
#: target/out/prefPages/about.js:90
msgid "Donate via github sponsors"
msgstr ""
#: target/out/prefPages/about.js:91
msgid "Support development!"
msgstr ""
#: target/out/prefPages/about.js:97
msgid "Rate and comment the extension!"
msgstr ""
#: target/out/prefPages/about.js:102
msgid "Github Repository"
msgstr ""
#: target/out/prefPages/about.js:103
msgid ""
"Add Star on Repository is helping me a lot!\n"
"Please, if you found bug from this extension, you can make issue to make me know that!\n"
"Or, you can create PR with wonderful features!"
msgstr ""
#: target/out/prefPages/about.js:109
msgid "Add translation to this extension!"
msgstr ""
#: target/out/prefPages/about.js:115
msgid "Debug"
msgstr ""
#: target/out/prefPages/about.js:116
msgid "Extension debugging options"
msgstr ""
#: target/out/prefPages/about.js:120
msgid "Expose environment"
msgstr ""
#: target/out/prefPages/about.js:121
msgid "Expose extension environment to globalThis.qst"
msgstr ""
#: target/out/prefPages/about.js:126
msgid "Show layout border"
msgstr ""
#: target/out/prefPages/about.js:127
msgid "Show layout borders on Quick Settings"
msgstr ""
#: target/out/prefPages/about.js:132
msgid "Log level"
msgstr ""
#: target/out/prefPages/about.js:135
msgid "none"
msgstr ""
#: target/out/prefPages/about.js:136
msgid "error"
msgstr ""
#: target/out/prefPages/about.js:137
msgid "info"
msgstr ""
#: target/out/prefPages/about.js:138
msgid "debug"
msgstr ""
#: target/out/prefPages/toggles.js:12
msgid "Toggles"
msgstr ""
#: target/out/prefPages/toggles.js:19
msgid "DND Quick Toggle"
msgstr ""
#: target/out/prefPages/toggles.js:20
msgid "Turn on to add the DND quick toggle on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/toggles.js:28
msgid "DND indicator position"
msgstr ""
#: target/out/prefPages/toggles.js:29
msgid "Set DND indicator position"
msgstr ""
#: target/out/prefPages/toggles.js:33
msgid "System Tray"
msgstr ""
#: target/out/prefPages/toggles.js:34
msgid "Date Menu Button"
msgstr ""
#: target/out/prefPages/toggles.js:41
msgid "Unsafe Mode Quick Toggle"
msgstr ""
#: target/out/prefPages/toggles.js:42
msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/toggles.js:50
msgid "Save last session state"
msgstr ""
#: target/out/prefPages/toggles.js:51
msgid "Turn on to save last session unsafe state"
msgstr ""
#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141
msgid "Advanced animation style"
msgstr ""
#: target/out/prefPages/menu.js:13
msgid "Open Duration"
msgstr ""
#: target/out/prefPages/menu.js:14
msgid "Open animation duration in microseconds"
msgstr ""
#: target/out/prefPages/menu.js:21
msgid "Close Duration"
msgstr ""
#: target/out/prefPages/menu.js:22
msgid "Close animation duration in microseconds"
msgstr ""
#: target/out/prefPages/menu.js:29
msgid "Grid Content Opacity"
msgstr ""
#: target/out/prefPages/menu.js:30
msgid ""
"Adjust grid content opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:37
msgid "Background Blur Radius"
msgstr ""
#: target/out/prefPages/menu.js:38
msgid ""
"Adjust background blur radius.\n"
"Set this to 0 to disable blur effect"
msgstr ""
#: target/out/prefPages/menu.js:45
msgid "Background Brightness"
msgstr ""
#: target/out/prefPages/menu.js:46
msgid ""
"Adjust background brightness.\n"
"Set this to 1000 to disable brightness control effect.\n"
"Not impacts on gnome-shell's default dim effect."
msgstr ""
#: target/out/prefPages/menu.js:53
msgid "Background Opacity"
msgstr ""
#: target/out/prefPages/menu.js:54
msgid ""
"Adjust background opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:61
msgid "Background X Scale"
msgstr ""
#: target/out/prefPages/menu.js:62
msgid "Adjust background x scale, 1000 means 1.0 scale"
msgstr ""
#: target/out/prefPages/menu.js:69
msgid "Background Y Scale"
msgstr ""
#: target/out/prefPages/menu.js:70
msgid "Adjust background y scale, 1000 means 1.0 scale"
msgstr ""
#: target/out/prefPages/menu.js:84
msgid "Menu"
msgstr ""
#: target/out/prefPages/menu.js:91
msgid "Overlay Mode"
msgstr ""
#: target/out/prefPages/menu.js:92
msgid "Display toggle, power, and sound menus as overlay"
msgstr ""
#: target/out/prefPages/menu.js:101
msgid "Overlay Width"
msgstr ""
#: target/out/prefPages/menu.js:102
msgid ""
"Adjust overlay menu width\n"
"Set this to 0 to disable adjusting"
msgstr ""
#: target/out/prefPages/menu.js:109
msgid "Overlay Animation Duration"
msgstr ""
#: target/out/prefPages/menu.js:110
msgid ""
"Custom menu open animation duration in microseconds\n"
"Set this to 0 to disable custom animation"
msgstr ""
#: target/out/prefPages/menu.js:117
msgid "Overlay Animation Style"
msgstr ""
#: target/out/prefPages/menu.js:118
msgid "Custom menu open animation style"
msgstr ""
#: target/out/prefPages/menu.js:120
msgid "Flyout"
msgstr ""
#: target/out/prefPages/menu.js:121
msgid "Dialog"
msgstr ""
#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143
msgid "Animation"
msgstr ""
#: target/out/prefPages/menu.js:131
msgid ""
"Add menu animation on toggle menu opening and closing\n"
"To get the best feel, turn on overlay mode"
msgstr ""
#: target/out/prefPages/menu.js:142
msgid "Adjust speed, blur, scale, and opacity"
msgstr ""
#: target/out/prefPages/layout.js:25
msgid "The item not found"
msgstr ""
#: target/out/prefPages/layout.js:28
msgid "No changes"
msgstr ""
#: target/out/prefPages/layout.js:31
msgid "The same item already exists"
msgstr ""
#: target/out/prefPages/layout.js:40
#, javascript-format
msgid "Properties of %s"
msgstr ""
#: target/out/prefPages/layout.js:47
msgid "Save"
msgstr ""
#: target/out/prefPages/layout.js:64
msgid "Toggle editor"
msgstr ""
#: target/out/prefPages/layout.js:84
msgid "This option requires full gnome-shell reloading"
msgstr ""
#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278
#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672
msgid "Hide"
msgstr ""
#: target/out/prefPages/layout.js:232
#, javascript-format
msgid "My item #%d"
msgstr ""
#: target/out/prefPages/layout.js:250
msgid "New Item"
msgstr ""
#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610
#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787
#: target/out/prefPages/layout.js:813
msgid "Ordering and Hiding"
msgstr ""
#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432
msgid "Friendly Name"
msgstr ""
#: target/out/prefPages/layout.js:283
msgid "Title Regex (Javascript Regex)"
msgstr ""
#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442
msgid "Constructor Name"
msgstr ""
#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448
msgid "GType Name"
msgstr ""
#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456
msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension"
msgstr ""
#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461
msgid "Javascript constructor name"
msgstr ""
#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466
msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance"
msgstr ""
#: target/out/prefPages/layout.js:342
msgid "Keyboard Backlight"
msgstr ""
#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538
msgid "Unordered items"
msgstr ""
#: target/out/prefPages/layout.js:486
msgid "Remote Access Applet"
msgstr ""
#: target/out/prefPages/layout.js:487
msgid "Camera"
msgstr ""
#: target/out/prefPages/layout.js:488
msgid "Volume Input"
msgstr ""
#: target/out/prefPages/layout.js:489
msgid "Location"
msgstr ""
#: target/out/prefPages/layout.js:490
msgid "Thunderbolt"
msgstr ""
#: target/out/prefPages/layout.js:492
msgid "Network"
msgstr ""
#: target/out/prefPages/layout.js:495
msgid "Volume Output"
msgstr ""
#: target/out/prefPages/layout.js:497
msgid "System (Battery)"
msgstr ""
#: target/out/prefPages/layout.js:618
msgid "Desktop Spacer"
msgstr ""
#: target/out/prefPages/layout.js:629
msgid "Laptop Spacer"
msgstr ""
#: target/out/prefPages/layout.js:641
msgid "Capture button"
msgstr ""
#: target/out/prefPages/layout.js:647
msgid "Settings button"
msgstr ""
#: target/out/prefPages/layout.js:653
msgid "Lock button"
msgstr ""
#: target/out/prefPages/layout.js:659
msgid "Shutdown button"
msgstr ""
#: target/out/prefPages/layout.js:665
msgid "Battery button"
msgstr ""
#: target/out/prefPages/layout.js:711
msgid "Layout"
msgstr ""
#: target/out/prefPages/layout.js:718
msgid "Quick Toggles Layout"
msgstr ""
#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734
msgid "Adjust quick toggles layout"
msgstr ""
#: target/out/prefPages/layout.js:738
msgid "Reorder and hide quick toggles"
msgstr ""
#: target/out/prefPages/layout.js:745
msgid "System Indicators"
msgstr ""
#: target/out/prefPages/layout.js:746
msgid "Adjust system indicators layout and style"
msgstr ""
#: target/out/prefPages/layout.js:751
msgid "Accent screen sharing indicator"
msgstr ""
#: target/out/prefPages/layout.js:752
msgid "Use shell accent color on screen sharing indicator"
msgstr ""
#: target/out/prefPages/layout.js:757
msgid "Accent screen recording indicator"
msgstr ""
#: target/out/prefPages/layout.js:758
msgid "Use shell accent color on screen recording indicator"
msgstr ""
#: target/out/prefPages/layout.js:763
msgid "Privacy indicators style"
msgstr ""
#: target/out/prefPages/layout.js:764
msgid "Use monochrome or shell accent color on privarcy indicators"
msgstr ""
#: target/out/prefPages/layout.js:767
msgid "Accent"
msgstr ""
#: target/out/prefPages/layout.js:768
msgid "Monochrome"
msgstr ""
#: target/out/prefPages/layout.js:777
msgid "Adjust system indicators"
msgstr ""
#: target/out/prefPages/layout.js:788
msgid "Reorder and hide system indicators"
msgstr ""
#: target/out/prefPages/layout.js:795
msgid "System Items Layout"
msgstr ""
#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815
msgid "Adjust system items layout"
msgstr ""
#: target/out/prefPages/layout.js:804
msgid "Hide layout box"
msgstr ""
#: target/out/prefPages/layout.js:805
msgid "Hide all buttons and layout box"
msgstr ""
#: target/out/prefPages/layout.js:814
msgid "Reorder and hide system items"
msgstr ""
#: target/out/prefPages/layout.js:823
msgid "Date Menu"
msgstr ""
#: target/out/prefPages/layout.js:824
msgid "Adjust Date Menu layout"
msgstr ""
#: target/out/prefPages/layout.js:828
msgid "Hide left box"
msgstr ""
#: target/out/prefPages/layout.js:829
msgid "Hide the left box of the date menu, which contains notifications and media control"
msgstr ""
#: target/out/prefPages/layout.js:834
msgid "Hide right box"
msgstr ""
#: target/out/prefPages/layout.js:835
msgid "Hide the right box of the date menu, which contains calendar, world clock and weather"
msgstr ""
#: target/out/prefPages/layout.js:840
msgid "Disable menu"
msgstr ""
#: target/out/prefPages/layout.js:841
msgid "Do not open date menu when the date menu button clicked"
msgstr ""
================================================
FILE: po/ko.po
================================================
# AUTHORS
# qwreey75 (aka qwreey) https://github.com/qwreey75/, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-20 15:34+0000\n"
"PO-Revision-Date: 2025-07-15 12:36+0000\n"
"Last-Translator: Qwreey \n"
"Language-Team: Korean \n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.10.2\n"
#: target/out/libs/prefs/components.js:57
msgid "Details"
msgstr "자세히"
#: target/out/libs/prefs/components.js:144
msgid "This feature marked as experimental"
msgstr "이 기능은 실험적입니다"
#: target/out/libs/prefs/components.js:274
msgid "Reset to default"
msgstr "기본값으로 재설정"
#: target/out/libs/prefs/components.js:512
msgid "Theme default"
msgstr "테마 기본값"
#: target/out/libs/prefs/components.js:853
msgid "Homepage"
msgstr "홈페이지"
#: target/out/libs/prefs/components.js:859
#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49
#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56
msgid "License"
msgstr "라이선스"
#: target/out/libs/prefs/components.js:860
msgid "Loading ..."
msgstr "로드중 ..."
#: target/out/libs/prefs/components.js:869
msgid "Affected Files"
msgstr "영향받은 파일들"
#: target/out/libs/prefs/components.js:924
msgid "Changelog"
msgstr "변경사항"
#: target/out/libs/prefs/components.js:938
msgid "(Current)"
msgstr "(현재)"
#: target/out/libs/prefs/components.js:969
#, javascript-format
msgid "> **Date:** %s"
msgstr "> **날짜:** %s"
#: target/out/libs/prefs/components.js:970
#, javascript-format
msgid "> **Git Hash:** %s"
msgstr "> **깃 해시:** %s"
#: target/out/libs/prefs/components.js:971
#, javascript-format
msgid "> **Build Number:** %d"
msgstr "> **빌드 넘버:** %d"
#: target/out/libs/prefs/components.js:1034
msgid "Padding"
msgstr "여백"
#: target/out/libs/prefs/components.js:1038
msgid "Top"
msgstr "상단"
#: target/out/libs/prefs/components.js:1049
msgid "Bottom"
msgstr "하단"
#: target/out/libs/prefs/components.js:1060
msgid "Left"
msgstr "좌"
#: target/out/libs/prefs/components.js:1071
msgid "Right"
msgstr "우"
#: target/out/prefs.js:60
msgid "Stable"
msgstr "안정 빌드"
#: target/out/prefs.js:63
msgid "Development"
msgstr "개발 빌드"
#: target/out/prefs.js:66
msgid "Preview"
msgstr "프리뷰 빌드"
#: target/out/prefs.js:69
msgid "(Github Release)"
msgstr "(깃허브 릴리즈)"
#: target/out/prefs.js:72
msgid "(Built from source)"
msgstr "(소스에서 빌드됨)"
#: target/out/features/widget/notifications.js:26
msgid "No Notifications"
msgstr "알림이 없습니다"
#: target/out/features/widget/notifications.js:58
#: target/out/features/widget/notifications.js:122
msgid "Clear"
msgstr "모두 읽음"
# Quick settings notifications title text
#: target/out/features/widget/notifications.js:76
msgid "Notifications"
msgstr "알림"
#: target/out/features/widget/notifications.js:105
#: target/out/features/toggle/dndQuickToggle.js:10
#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485
msgid "Do Not Disturb"
msgstr "방해 금지 모드"
#: target/out/features/widget/media.js:118
msgid "Unknown title"
msgstr "알 수 없는 제목"
#: target/out/features/widget/media.js:888
msgid "Media"
msgstr "미디어"
#: target/out/features/widget/volumeMixer.js:105
msgid "Volume changed"
msgstr "볼륨 변경됨"
#: target/out/features/widget/volumeMixer.js:463
msgid "Open volumx mixer"
msgstr "볼륨 믹서 열기"
#: target/out/features/widget/volumeMixer.js:480
msgid "Volume Mixer"
msgstr "볼륨 믹서"
#: target/out/features/widget/weather.js:73
msgid "Weather"
msgstr "날씨"
#: target/out/features/widget/weather.js:192
msgid "Location has not been set"
msgstr "위치가 지정되지 않았습니다"
#: target/out/features/toggle/unsafeQuickToggle.js:11
#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496
msgid "Unsafe Mode"
msgstr "위험 모드"
#: target/out/prefPages/widgets.js:11
msgid "Handle radius"
msgstr "핸들 반지름"
#: target/out/prefPages/widgets.js:12
msgid "Set this to 0 to use default radius"
msgstr "0 으로 설정하여 기본 반지름을 사용합니다"
#: target/out/prefPages/widgets.js:18
msgid "Handle color"
msgstr "핸들 색깔"
#: target/out/prefPages/widgets.js:36
msgid "Slider style"
msgstr "슬라이더 스타일"
#: target/out/prefPages/widgets.js:39
msgid "Slim"
msgstr "슬림"
#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766
msgid "Default"
msgstr "기본"
#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173
msgid "Background color"
msgstr "배경 색깔"
#: target/out/prefPages/widgets.js:55
msgid "Active Background color"
msgstr "활성화된 배경 색깔"
#: target/out/prefPages/widgets.js:62
msgid "Thickness"
msgstr ""
#: target/out/prefPages/widgets.js:66
msgid "Set this to 0 to use default thickness"
msgstr ""
#: target/out/prefPages/widgets.js:76
msgid "Widgets"
msgstr "위젯"
#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136
#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224
msgid "Media Widget"
msgstr "미디어 위젯"
#: target/out/prefPages/widgets.js:88
msgid "Turn on to make the media widget visible on the Quick Settings panel"
msgstr "퀵 패널에 미디어 위젯을 보여줍니다"
#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280
#: target/out/prefPages/widgets.js:343
msgid "Compact mode"
msgstr "레이아웃 축소"
#: target/out/prefPages/widgets.js:93
msgid ""
"Make Media Controls widget smaller\n"
"Make it more similar in size to the notification message"
msgstr ""
"미디어 컨트롤 위젯을 작게 만듭니다\n"
"알림 메시지와 비슷한 크기로 조정됩니다"
#: target/out/prefPages/widgets.js:99
msgid "Control buttons opacity"
msgstr "컨트롤 버튼 투명도"
#: target/out/prefPages/widgets.js:100
msgid "Set this to 255 to make opaque, and 0 to make transparent"
msgstr "255로 설정해 불투명하게, 0으로 설정해 투명하게 만듭니다"
#: target/out/prefPages/widgets.js:108
msgid "Show next button"
msgstr "다음 버튼 보이기"
#: target/out/prefPages/widgets.js:109
msgid "Add next contorl button next to description"
msgstr "다음 버튼을 설명 옆에 추가합니다"
#: target/out/prefPages/widgets.js:115
msgid "Show previous button"
msgstr "이전 버튼 보이기"
#: target/out/prefPages/widgets.js:116
msgid "Add previous contorl button next to description"
msgstr "이전 버튼을 설명 옆에 추가합니다"
#: target/out/prefPages/widgets.js:122
msgid "Show pause button"
msgstr "멈춤 버튼 보이기"
#: target/out/prefPages/widgets.js:123
msgid "Add pause contorl button next to description"
msgstr "멈춤 버튼을 설명 옆에 추가합니다"
#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138
msgid "Show progress bar"
msgstr "재생 바 보이기"
#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139
msgid "Add progress bar under description"
msgstr "미디어 설명 아래에 재생 바를 보여줍니다"
#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164
msgid "Gradient background"
msgstr "그라데이션 배경"
#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169
msgid ""
"Use gradient background extracted from cover image\n"
"May affect performance slightly"
msgstr ""
"커버 이미지로부터 추출된 색으로 배경에 그라데이션을 줍니다\n"
"성능에 영향을 미칠 수 있습니다"
#: target/out/prefPages/widgets.js:174
msgid "Base background color"
msgstr "기반 배경 색깔"
#: target/out/prefPages/widgets.js:182
msgid "Start opacity"
msgstr ""
#: target/out/prefPages/widgets.js:183
msgid "Adjust left side transparency, Set this to 1000 to make opaque"
msgstr "왼쪽 구석의 투명도를 설정합니다, 1000 으로 설정하여 완전히 불투명하게 만듭니다"
#: target/out/prefPages/widgets.js:190
msgid "Start color"
msgstr ""
#: target/out/prefPages/widgets.js:191
msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color"
msgstr "왼쪽 구석의 배경 믹싱을 조절합니다, 1000 으로 설정하여 추출된 색을 그대로 보여줍니다"
#: target/out/prefPages/widgets.js:198
msgid "End opacity"
msgstr ""
#: target/out/prefPages/widgets.js:199
msgid "Adjust right side transparency, Set this to 1000 to make opaque"
msgstr "오른쪽 구석의 투명도를 설정합니다, 1000 으로 설정하여 완전히 불투명하게 만듭니다"
#: target/out/prefPages/widgets.js:206
msgid "End color"
msgstr ""
#: target/out/prefPages/widgets.js:207
msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color"
msgstr "오른쪽 구석의 배경 믹싱을 조절합니다, 1000 으로 설정하여 추출된 색을 그대로 보여줍니다"
#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226
msgid "Round clip effect"
msgstr "둥글게 자르기 효과"
#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231
msgid "Use round clip effect to make transition more natural"
msgstr "둥글게 자르는 효과를 사용해 트랜지션을 더욱 자연스럽게 만듭니다"
#: target/out/prefPages/widgets.js:234
msgid "Padding adjustment"
msgstr "여백 조절"
#: target/out/prefPages/widgets.js:236
msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding"
msgstr "자르는 효과의 여백을 조절합니다, 테마가 다른 여백을 가지고 있다면 여백을 조절하세요"
#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318
#: target/out/prefPages/widgets.js:350
msgid "Remove shadow"
msgstr "그림자 제거"
#: target/out/prefPages/widgets.js:254
msgid ""
"Remove shadow from media message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
"미디어 메시지에서 그림자를 지웁니다\n"
"사용중인 테마가 불필요한 그림자를 만드는 경우에 사용하십시오"
#: target/out/prefPages/widgets.js:260
msgid "Smooth scroll speed"
msgstr "부드러운 스크롤 속도"
#: target/out/prefPages/widgets.js:261
msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction"
msgstr "트랙패드 또는 트랙포인트 스크롤 속도를 조절합니다, 음수 값을 사용해 방향을 뒤집을 수 있습니다"
#: target/out/prefPages/widgets.js:271
msgid "Notifications Widget"
msgstr "알림 위젯"
#: target/out/prefPages/widgets.js:276
msgid "Turn on to make the notifications widget visible on the Quick Settings panel"
msgstr "퀵 패널에 알림 위젯을 보여줍니다"
#: target/out/prefPages/widgets.js:281
msgid "Make notifications smaller"
msgstr "알림을 작게 만듭니다"
#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418
msgid "Max height"
msgstr "최대 높이"
#: target/out/prefPages/widgets.js:288
#, javascript-format
msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height"
msgstr "알림 위젯의 최대 높이를 지정합니다. 기본값은 %d 입니다. 0 으로 설정하여 높이 제한을 해제합니다"
#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441
msgid "Fade out offset"
msgstr "페이드 아웃 오프셋"
#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442
msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46"
msgstr "페이드 아웃 효과가 시작되는 위치를 지정합니다. 0 으로 설정하여 페이드 아웃 효과를 비활성화합니다. 기본값은 46 입니다"
#: target/out/prefPages/widgets.js:304
msgid "Auto hide"
msgstr "자동 숨김"
#: target/out/prefPages/widgets.js:305
msgid "Hide the Notifications widget when have no notifications"
msgstr "표시할 알림이 없으면 알림 위젯을 자동으로 숨깁니다"
#: target/out/prefPages/widgets.js:311
msgid "Use native controls"
msgstr "네이티브 컨트롤 사용"
#: target/out/prefPages/widgets.js:312
msgid "Use native dnd switch and clear button"
msgstr "\"방해 금지 스위치\"와 \"알림 모두 읽기 버튼\"에 그놈의 기본 컨트롤을 사용합니다"
#: target/out/prefPages/widgets.js:319
msgid ""
"Remove shadow from notification message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
"알림 메시지에서 그림자를 지웁니다\n"
"사용중인 테마가 불필요한 그림자를 만드는 경우에 사용하십시오"
#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427
msgid "Show scrollbar"
msgstr "스크롤바 보이기"
#: target/out/prefPages/widgets.js:326
msgid "Show scrollbar on message list"
msgstr "스크롤바를 메시지 목록에 보여줍니다"
#: target/out/prefPages/widgets.js:334
msgid "Weather Widget"
msgstr "날씨 위젯"
#: target/out/prefPages/widgets.js:339
msgid "Turn on to make the weather widget visible on the Quick Settings panel"
msgstr "퀵 패널에 날씨 위젯을 보여줍니다"
#: target/out/prefPages/widgets.js:344
msgid "Make weather widget smaller"
msgstr "날씨 위젯을 작게 만듭니다"
#: target/out/prefPages/widgets.js:351
msgid ""
"Remove shadow from weather widget\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
"날씨 위젯에서 그림자를 지웁니다\n"
"사용중인 테마가 불필요한 그림자를 만드는 경우에 사용하십시오"
#: target/out/prefPages/widgets.js:357
msgid "Click command"
msgstr "클릭 커맨드"
#: target/out/prefPages/widgets.js:363
msgid "Show location"
msgstr "위치 보이기"
#: target/out/prefPages/widgets.js:364
msgid "Show the location label on header"
msgstr "위치 라벨을 해더에 보여줍니다"
#: target/out/prefPages/widgets.js:373
msgid "Forecast interval"
msgstr "예보 간격"
#: target/out/prefPages/widgets.js:374
msgid "Adjust forecast interval in hour"
msgstr "예보 간격을 시간 단위로 조절합니다"
#: target/out/prefPages/widgets.js:381
msgid "Max forecasts"
msgstr "최대 예보 수"
#: target/out/prefPages/widgets.js:382
msgid "Adjust max forecasts"
msgstr "최대 예보 수를 조절합니다"
#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456
msgid "Volume mixer Widget"
msgstr "볼륨 믹서 위젯"
#: target/out/prefPages/widgets.js:393
msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel"
msgstr "퀵 패널에 볼륨 믹서 위젯을 보여줍니다"
#: target/out/prefPages/widgets.js:397
msgid "Label text"
msgstr ""
#: target/out/prefPages/widgets.js:398
msgid "Choose label above slider text source"
msgstr ""
#: target/out/prefPages/widgets.js:400
msgid "Both"
msgstr "둘 다"
#: target/out/prefPages/widgets.js:401
msgid "Title"
msgstr "제목"
#: target/out/prefPages/widgets.js:402
msgid "Description"
msgstr "설명"
#: target/out/prefPages/widgets.js:403
msgid "None"
msgstr ""
#: target/out/prefPages/widgets.js:411
msgid "Label opacity"
msgstr ""
#: target/out/prefPages/widgets.js:412
msgid ""
"Adjust label opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/widgets.js:419
#, javascript-format
msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:428
msgid "Show scrollbar on mixer list"
msgstr ""
#: target/out/prefPages/widgets.js:434
msgid "Show stream icon"
msgstr "스트림 아이콘 보이기"
#: target/out/prefPages/widgets.js:435
msgid "Show stream icon above mixer sliders"
msgstr ""
#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458
msgid "Attach to output slider"
msgstr "출력 슬라이더에 메뉴 부착"
#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459
msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout"
msgstr "출력 슬라이더에 볼륨 믹서를 여는 메뉴 버튼을 부착합니다. 만약 간결한 레이아웃을 원하는 경우 사용하세요"
#: target/out/prefPages/widgets.js:468
msgid "Menu icon"
msgstr "메뉴 아이콘"
#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32
msgid "About"
msgstr "정보"
#: target/out/prefPages/about.js:33
msgid "Common extension informations"
msgstr "일반적인 확장 정보들"
#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40
msgid "Changelogs"
msgstr "변경 사항들"
#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41
msgid "View the change history for this extension"
msgstr "확장 프로그램의 변경 기록들을 봅니다"
#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57
msgid "License of codes"
msgstr "코드의 라이선스"
#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65
#: target/out/prefPages/about.js:69
msgid "Contributors"
msgstr "기여자들"
#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70
msgid "The creators of this extension"
msgstr "이 확장 프로그램을 만든 이들"
#: target/out/prefPages/about.js:74
msgid "More contributors"
msgstr "더 많은 기여자들"
#: target/out/prefPages/about.js:75
msgid "See more contributors on github"
msgstr "깃허브에서 더 많은 기여자들을 봅니다"
#: target/out/prefPages/about.js:85
msgid "Link"
msgstr "링크"
#: target/out/prefPages/about.js:86
msgid "External links about this extension"
msgstr "익스텐션과 관련된 외부 링크"
#: target/out/prefPages/about.js:90
msgid "Donate via github sponsors"
msgstr ""
#: target/out/prefPages/about.js:91
msgid "Support development!"
msgstr "개발을 지원해주세요!"
#: target/out/prefPages/about.js:97
msgid "Rate and comment the extension!"
msgstr "확장 프로그램을 평가해주세요!"
#: target/out/prefPages/about.js:102
msgid "Github Repository"
msgstr "Github 저장소"
#: target/out/prefPages/about.js:103
msgid ""
"Add Star on Repository is helping me a lot!\n"
"Please, if you found bug from this extension, you can make issue to make me know that!\n"
"Or, you can create PR with wonderful features!"
msgstr ""
"저장소에 Star를 남겨주신다면 제게 큰 도움이 됩니다!\n"
"버그를 찾은 경우, Issue 를 남겨 저희가 알 수 있게 해주세요!\n"
"환상적인 기능을 만들어 PR 을 남기는 것도 환영입니다!"
#: target/out/prefPages/about.js:109
msgid "Add translation to this extension!"
msgstr "확장 번역에 기여해주세요!"
#: target/out/prefPages/about.js:115
msgid "Debug"
msgstr "디버깅"
#: target/out/prefPages/about.js:116
msgid "Extension debugging options"
msgstr "확장 디버깅 옵션"
#: target/out/prefPages/about.js:120
msgid "Expose environment"
msgstr "환경 노출"
#: target/out/prefPages/about.js:121
msgid "Expose extension environment to globalThis.qst"
msgstr "익스텐션 환경을 globalThis.qst 에 노출시킵니다"
#: target/out/prefPages/about.js:126
msgid "Show layout border"
msgstr "레이아웃 보더 보이기"
#: target/out/prefPages/about.js:127
msgid "Show layout borders on Quick Settings"
msgstr "퀵 패널의 레이아웃 보더들을 보여줍니다"
#: target/out/prefPages/about.js:132
msgid "Log level"
msgstr "로그 수준"
#: target/out/prefPages/about.js:135
msgid "none"
msgstr "안함"
#: target/out/prefPages/about.js:136
msgid "error"
msgstr "오류"
#: target/out/prefPages/about.js:137
msgid "info"
msgstr "정보"
#: target/out/prefPages/about.js:138
msgid "debug"
msgstr "디버깅"
#: target/out/prefPages/toggles.js:12
msgid "Toggles"
msgstr "토글"
#: target/out/prefPages/toggles.js:19
msgid "DND Quick Toggle"
msgstr "방해 금지 모드 퀵 토글"
#: target/out/prefPages/toggles.js:20
msgid "Turn on to add the DND quick toggle on the Quick Settings panel"
msgstr "활성화하여 방해 금지 퀵 토글을 퀵 패널에 추가합니다"
#: target/out/prefPages/toggles.js:28
msgid "DND indicator position"
msgstr "방해 금지 인디케이터 위치"
#: target/out/prefPages/toggles.js:29
msgid "Set DND indicator position"
msgstr "방해 금지 인디케이터의 위치를 설정합니다"
#: target/out/prefPages/toggles.js:33
msgid "System Tray"
msgstr "시스템 트레이"
#: target/out/prefPages/toggles.js:34
msgid "Date Menu Button"
msgstr "날짜 메뉴 버튼"
#: target/out/prefPages/toggles.js:41
msgid "Unsafe Mode Quick Toggle"
msgstr "위험 모드 퀵 토글"
#: target/out/prefPages/toggles.js:42
msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel"
msgstr "활성화하여 위험모드 퀵 토글을 퀵 패널에 추가합니다"
#: target/out/prefPages/toggles.js:50
msgid "Save last session state"
msgstr "이전 세션 상태를 저장하기"
#: target/out/prefPages/toggles.js:51
msgid "Turn on to save last session unsafe state"
msgstr "활성화하여 세션 위험모드 상태를 저장합니다"
#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141
msgid "Advanced animation style"
msgstr "애니메이션 스타일"
#: target/out/prefPages/menu.js:13
msgid "Open Duration"
msgstr "여는 애니메이션 시간"
#: target/out/prefPages/menu.js:14
msgid "Open animation duration in microseconds"
msgstr "여는 애니메이션의 재생 시간입니다. 마이크로초 단위를 사용합니다"
#: target/out/prefPages/menu.js:21
msgid "Close Duration"
msgstr "닫는 애니메이션 시간"
#: target/out/prefPages/menu.js:22
msgid "Close animation duration in microseconds"
msgstr "닫는 애니메이션의 재생 시간입니다. 마이크로초 단위를 사용합니다"
#: target/out/prefPages/menu.js:29
msgid "Grid Content Opacity"
msgstr "토글 그리드 투명도"
#: target/out/prefPages/menu.js:30
msgid ""
"Adjust grid content opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:37
msgid "Background Blur Radius"
msgstr "배경 흐림 반경"
#: target/out/prefPages/menu.js:38
msgid ""
"Adjust background blur radius.\n"
"Set this to 0 to disable blur effect"
msgstr ""
"배경 흐림 처리의 정도를 조절합니다\n"
"0으로 설정하면 블러 효과가 비활성화됩니다"
#: target/out/prefPages/menu.js:45
msgid "Background Brightness"
msgstr "배경 밝기"
#: target/out/prefPages/menu.js:46
msgid ""
"Adjust background brightness.\n"
"Set this to 1000 to disable brightness control effect.\n"
"Not impacts on gnome-shell's default dim effect."
msgstr ""
"배경 밝기를 조절합니다.\n"
"1000 으로 설정하여 밝기 조절을 비활성화합니다.\n"
"그놈 셸의 기본 dim 효과에는 영향을 미치지 않습니다"
#: target/out/prefPages/menu.js:53
msgid "Background Opacity"
msgstr "배경 투명도"
#: target/out/prefPages/menu.js:54
msgid ""
"Adjust background opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:61
msgid "Background X Scale"
msgstr "배경 X축 스케일"
#: target/out/prefPages/menu.js:62
msgid "Adjust background x scale, 1000 means 1.0 scale"
msgstr "배경의 가로 스케일을 조절합니다. 1000 은 1.0 (100%) 을 의미합니다"
#: target/out/prefPages/menu.js:69
msgid "Background Y Scale"
msgstr "배경 Y축 스케일"
#: target/out/prefPages/menu.js:70
msgid "Adjust background y scale, 1000 means 1.0 scale"
msgstr "배경의 세로 스케일을 조절합니다, 1000 은 1.0 (100%) 를 의미합니다"
#: target/out/prefPages/menu.js:84
msgid "Menu"
msgstr "메뉴"
#: target/out/prefPages/menu.js:91
msgid "Overlay Mode"
msgstr "오버레이 모드"
#: target/out/prefPages/menu.js:92
msgid "Display toggle, power, and sound menus as overlay"
msgstr "토글, 전원, 사운드 메뉴를 오버레이로 보여줍니다"
#: target/out/prefPages/menu.js:101
msgid "Overlay Width"
msgstr "오버레이 너비"
#: target/out/prefPages/menu.js:102
msgid ""
"Adjust overlay menu width\n"
"Set this to 0 to disable adjusting"
msgstr ""
"오버레이 메뉴의 너비를 조절합니다\n"
"0으로 설정하면 조절이 비활성화됩니다"
#: target/out/prefPages/menu.js:109
msgid "Overlay Animation Duration"
msgstr "오버레이 애니메이션 시간"
#: target/out/prefPages/menu.js:110
msgid ""
"Custom menu open animation duration in microseconds\n"
"Set this to 0 to disable custom animation"
msgstr ""
"커스텀 메뉴 오픈 애니메이션의 시간입니다. 마이크로초 단위를 사용합니다\n"
"0으로 설정하면 커스텀 애니메이션 효과가 비활성화됩니다"
#: target/out/prefPages/menu.js:117
msgid "Overlay Animation Style"
msgstr "오버레이 애니메이션 스타일"
#: target/out/prefPages/menu.js:118
msgid "Custom menu open animation style"
msgstr "메뉴 여는 애니메이션 조정"
#: target/out/prefPages/menu.js:120
msgid "Flyout"
msgstr "플라이아웃"
#: target/out/prefPages/menu.js:121
msgid "Dialog"
msgstr "대화 상자"
#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143
msgid "Animation"
msgstr "애니메이션"
#: target/out/prefPages/menu.js:131
msgid ""
"Add menu animation on toggle menu opening and closing\n"
"To get the best feel, turn on overlay mode"
msgstr ""
"토글 메뉴를 여닫을 때 애니메이션을 줍니다\n"
"극적인 효과를 위해서는 오버레이 모드와 같이 사용하세요"
#: target/out/prefPages/menu.js:142
msgid "Adjust speed, blur, scale, and opacity"
msgstr "속도, 흐림 효과, 스케일, 투명도를 조절합니다"
#: target/out/prefPages/layout.js:25
msgid "The item not found"
msgstr ""
#: target/out/prefPages/layout.js:28
msgid "No changes"
msgstr "변경사항 없음"
#: target/out/prefPages/layout.js:31
msgid "The same item already exists"
msgstr "이미 같은 아이템이 존재합니다"
#: target/out/prefPages/layout.js:40
#, javascript-format
msgid "Properties of %s"
msgstr "%s 의 세부사항"
#: target/out/prefPages/layout.js:47
msgid "Save"
msgstr "저장"
#: target/out/prefPages/layout.js:64
msgid "Toggle editor"
msgstr "토글 편집기"
#: target/out/prefPages/layout.js:84
msgid "This option requires full gnome-shell reloading"
msgstr "이 옵션은 그놈 셸의 완전한 재시작이 필요합니다"
#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278
#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672
msgid "Hide"
msgstr "숨김"
#: target/out/prefPages/layout.js:232
#, javascript-format
msgid "My item #%d"
msgstr "내 아이템 %d"
#: target/out/prefPages/layout.js:250
msgid "New Item"
msgstr "새로운 아이템"
#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610
#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787
#: target/out/prefPages/layout.js:813
msgid "Ordering and Hiding"
msgstr "정렬과 숨김"
#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432
msgid "Friendly Name"
msgstr "표시용 이름"
#: target/out/prefPages/layout.js:283
msgid "Title Regex (Javascript Regex)"
msgstr "제목 정규표현식 (자바스크립트 정규표현식)"
#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442
msgid "Constructor Name"
msgstr "생성자 이름"
#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448
msgid "GType Name"
msgstr "GType 이름"
#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456
msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension"
msgstr "목록에서 쉽게 구분하기 위한 주석입니다. 확장의 기능에는 아무런 영향을 미치지 않습니다"
#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461
msgid "Javascript constructor name"
msgstr "자바스크립트 생성자 이름"
#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466
msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance"
msgstr "GObject 의 gtype 이름. GObject.type_name_from_instance 를 호출하여 확인할 수 있습니다"
#: target/out/prefPages/layout.js:342
msgid "Keyboard Backlight"
msgstr "키보드 백라이트"
#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538
msgid "Unordered items"
msgstr "정렬되지 않은 아이템들"
#: target/out/prefPages/layout.js:486
msgid "Remote Access Applet"
msgstr "원격 접근 애플릿"
#: target/out/prefPages/layout.js:487
msgid "Camera"
msgstr "카메라"
#: target/out/prefPages/layout.js:488
msgid "Volume Input"
msgstr "입력 볼륨"
#: target/out/prefPages/layout.js:489
msgid "Location"
msgstr "위치"
#: target/out/prefPages/layout.js:490
msgid "Thunderbolt"
msgstr "썬더볼트"
#: target/out/prefPages/layout.js:492
msgid "Network"
msgstr "네트워크"
#: target/out/prefPages/layout.js:495
msgid "Volume Output"
msgstr "출력 볼륨"
#: target/out/prefPages/layout.js:497
msgid "System (Battery)"
msgstr "시스템 (베터리)"
#: target/out/prefPages/layout.js:618
msgid "Desktop Spacer"
msgstr "데스크톱 여백"
#: target/out/prefPages/layout.js:629
msgid "Laptop Spacer"
msgstr "랩톱 여백"
#: target/out/prefPages/layout.js:641
msgid "Capture button"
msgstr "캡처 버튼"
#: target/out/prefPages/layout.js:647
msgid "Settings button"
msgstr "설정 버튼"
#: target/out/prefPages/layout.js:653
msgid "Lock button"
msgstr "잠금 버튼"
#: target/out/prefPages/layout.js:659
msgid "Shutdown button"
msgstr "종료 버튼"
#: target/out/prefPages/layout.js:665
msgid "Battery button"
msgstr "배터리 버튼"
#: target/out/prefPages/layout.js:711
msgid "Layout"
msgstr "레이아웃"
#: target/out/prefPages/layout.js:718
msgid "Quick Toggles Layout"
msgstr "퀵 토글 레이아웃"
#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734
msgid "Adjust quick toggles layout"
msgstr "퀵 토글 레이아웃을 조절합니다"
#: target/out/prefPages/layout.js:738
msgid "Reorder and hide quick toggles"
msgstr "퀵 토글을 정렬하거나 숨깁니다"
#: target/out/prefPages/layout.js:745
msgid "System Indicators"
msgstr "시스템 인디케이터"
#: target/out/prefPages/layout.js:746
msgid "Adjust system indicators layout and style"
msgstr "시스템 인디케이터의 레이아웃과 스타일을 조절합니다"
#: target/out/prefPages/layout.js:751
msgid "Accent screen sharing indicator"
msgstr "강조 색상 화면 공유 인디케이터"
#: target/out/prefPages/layout.js:752
msgid "Use shell accent color on screen sharing indicator"
msgstr "셸의 강조 색상을 화면 공유 인디케이터에 배경으로 사용합니다"
#: target/out/prefPages/layout.js:757
msgid "Accent screen recording indicator"
msgstr "강조 색상 화면 녹화 인디케이터"
#: target/out/prefPages/layout.js:758
msgid "Use shell accent color on screen recording indicator"
msgstr "셸의 강조 색상을 화면 녹화 인디케이터에 배경으로 사용합니다"
#: target/out/prefPages/layout.js:763
msgid "Privacy indicators style"
msgstr "프라이버시 인디케이터 스타일"
#: target/out/prefPages/layout.js:764
msgid "Use monochrome or shell accent color on privarcy indicators"
msgstr "단색 또는 셸의 강조 색상을 프라이버시 인디케이터에 아이콘 색으로 사용합니다"
#: target/out/prefPages/layout.js:767
msgid "Accent"
msgstr "강조 색상"
#: target/out/prefPages/layout.js:768
msgid "Monochrome"
msgstr "단색"
#: target/out/prefPages/layout.js:777
msgid "Adjust system indicators"
msgstr "시스템 인디케이터 조절"
#: target/out/prefPages/layout.js:788
msgid "Reorder and hide system indicators"
msgstr "시스템 인디케이터를 정렬하거나 숨깁니다"
#: target/out/prefPages/layout.js:795
msgid "System Items Layout"
msgstr "시스템 아이템 레이아웃"
#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815
msgid "Adjust system items layout"
msgstr "시스템 요소의 레이아웃을 조정합니다"
#: target/out/prefPages/layout.js:804
msgid "Hide layout box"
msgstr "레이아웃 상자 숨기기"
#: target/out/prefPages/layout.js:805
msgid "Hide all buttons and layout box"
msgstr "모든 버튼과 레이아웃 박스를 숨깁니다"
#: target/out/prefPages/layout.js:814
msgid "Reorder and hide system items"
msgstr "시스템 아이템을 정렬하거나 숨깁니다"
#: target/out/prefPages/layout.js:823
msgid "Date Menu"
msgstr "달력 메뉴"
#: target/out/prefPages/layout.js:824
msgid "Adjust Date Menu layout"
msgstr "달력 메뉴의 레이아웃을 조절합니다"
#: target/out/prefPages/layout.js:828
msgid "Hide left box"
msgstr "왼쪽 상자 숨기기"
#: target/out/prefPages/layout.js:829
msgid "Hide the left box of the date menu, which contains notifications and media control"
msgstr "날짜 메뉴의 알림과 미디어 컨트롤이 있는 왼쪽 레이아웃을 숨깁니다"
#: target/out/prefPages/layout.js:834
msgid "Hide right box"
msgstr "오른쪽 상자 숨기기"
#: target/out/prefPages/layout.js:835
msgid "Hide the right box of the date menu, which contains calendar, world clock and weather"
msgstr "날짜 메뉴의 칼렌더와 세계 시간, 날씨가 있는 오른쪽 레이아웃을 숨깁니다"
#: target/out/prefPages/layout.js:840
msgid "Disable menu"
msgstr "메뉴 비활성화"
#: target/out/prefPages/layout.js:841
msgid "Do not open date menu when the date menu button clicked"
msgstr "날짜 메뉴 버튼을 눌렀을 때 날짜 메뉴가 열림을 비활성화합니다"
#~ msgid "Height"
#~ msgstr "높이"
#~ msgid "Set this to 0 to use default height"
#~ msgstr "0 으로 설정하여 기본 높이를 사용합니다"
#~ msgid "Start opaque"
#~ msgstr "시작 불투명도"
#~ msgid "End opaque"
#~ msgstr "끝 불투명도"
#~ msgid "Hide Notifications"
#~ msgstr "알림 숨김"
#~ msgid "Hide notifications on the date menu"
#~ msgstr "알림을 날짜 메뉴에서 숨깁니다"
#~ msgid "Hide Media Control"
#~ msgstr "미디어 컨트롤 숨김"
#~ msgid "Hide media control on the date menu"
#~ msgstr "미디어 컨트롤을 날짜 메뉴에서 숨깁니다"
#~ msgid "Donate via patreon"
#~ msgstr "Patreon으로 후원"
#~ msgid ""
#~ "Use gradient background extracted from cover image\n"
#~ "May affect performance"
#~ msgstr "커버 이미지로부터 추출된 색으로 배경에 그라데이션을 줍니다성능에 영향을 미칠 수 있습니다"
#~ msgid "Set maximum height of the Notifications widget. default is 292"
#~ msgstr "알림 위젯의 최대 높이(px)를 설정합니다. 기본값은 292입니다"
#~ msgid "Other"
#~ msgstr "기타"
#~ msgid ""
#~ "Hide notifications on date menu.\n"
#~ "*this option removes media control on date menu too*"
#~ msgstr ""
#~ "달력 메뉴에서 알림 항목을 제거합니다.\n"
#~ "*이 옵션은 달력 메뉴에서 미디어 컨트롤 영역도 같이 제거합니다*"
#~ msgid "Hide media control on date menu."
#~ msgstr "달력 메뉴에서 미디어 컨트롤 항목을 제거합니다."
#~ msgid ""
#~ "Adjust grid content opacity.\n"
#~ "Set this to 255 to opaque, and 0 to transparent"
#~ msgstr ""
#~ "토글 그리드 콘텐츠의 투명도를 조절합니다\n"
#~ "255로 하면 완전히 불투명해지고, 0으로 하면 완전히 투명해집니다"
#~ msgid ""
#~ "Adjust background opacity.\n"
#~ "Set this to 255 to opaque, and 0 to transparent"
#~ msgstr ""
#~ "배경 투명도를 조절합니다\n"
#~ "255로 하면 완전히 불투명해지고, 0으로 하면 완전히 투명해집니다"
#~ msgid "Sound Settings"
#~ msgstr "소리 설정"
#~ msgid "Notification Widget"
#~ msgstr "알림 위젯"
#~ msgid "Turn on to make the notification widget visible on the Quick Settings panel"
#~ msgstr "퀵 패널에 알림 위젯을 보여줍니다"
#~ msgid "Links"
#~ msgstr "링크"
#~ msgid "Contributor"
#~ msgstr "기여자"
#~ msgid "System Items"
#~ msgstr "시스템 요소"
#~ msgid "Hide layout"
#~ msgstr "레이아웃 숨김"
#~ msgid "Add Application to filtering"
#~ msgstr "필터링할 애플리케이션 추가"
#~ msgid "Add"
#~ msgstr "추가"
#~ msgid "Cancel"
#~ msgstr "취소"
#~ msgid "Application name"
#~ msgstr "애플리케이션 이름"
#~ msgid "General"
#~ msgstr "일반"
#~ msgid "Enchant input/output slider"
#~ msgstr "입력/출력 슬라이더를 강화합니다"
#~ msgid "Show current audio output selection"
#~ msgstr "오디오 출력 장치 표시"
#~ msgid "Always show the current audio output selection above the volume slider"
#~ msgstr "항상 사용 중인 오디오 출력 장치를 볼륨 슬라이더 위에 보여줍니다"
#~ msgid "Show current audio input selection"
#~ msgstr "오디오 입력 장치 표시"
#~ msgid "Always show the current audio input selection above the volume slider"
#~ msgstr "항상 사용 중인 오디오 입력 장치를 볼륨 슬라이더 위에 보여줍니다"
#~ msgid "Always show input"
#~ msgstr "항상 입력 볼륨 바 표시"
#~ msgid "Always show the audio input volume slider, even when there is no audio input stream."
#~ msgstr "오디오 입력 스트림이 없더라도 항상 오디오 입력 볼륨 슬라이더를 보여줍니다."
#~ msgid "Add volume mixer (PulseAudio, Pipewire)"
#~ msgstr "볼륨 믹서 추가 (PulseAudio, Pipewire)"
#~ msgid ""
#~ "Turn on to make the volume mixer visible\n"
#~ "Forked from https://github.com/mymindstorm/gnome-volume-mixer"
#~ msgstr ""
#~ "볼륨 믹서를 활성화합니다\n"
#~ "https://github.com/mymindstorm/gnome-volume-mixer 에서 포크된 기능입니다"
#~ msgid "Position"
#~ msgstr "위치"
#~ msgid "Set volume mixer position"
#~ msgstr "볼륨 믹서의 위치를 선택합니다"
#~ msgid "Top (Below Output/Input slider)"
#~ msgstr "상단 (입력/출력 슬라이더 밑에 표시됩니다)"
#~ msgid "Show stream Description"
#~ msgstr "스트림 설명 표시"
#~ msgid "Show audio stream description above the slider"
#~ msgstr "오디오 스트림의 설명을 슬라이더 아래에 표시합니다"
#~ msgid "Show stream Icon"
#~ msgstr "스트림 아이콘 표시"
#~ msgid "Show application icon in front of the slider"
#~ msgstr "애플리케이션 아이콘을 슬라이더 앞에 추가합니다"
#~ msgid "Filter applications shown in the volume mixer."
#~ msgstr "볼륨 믹서에 보일 애플리케이션을 필터링합니다."
#~ msgid "Filter Mode"
#~ msgstr "필터 모드"
#~ msgid "Blacklist"
#~ msgstr "블랙리스트"
#~ msgid "Whitelist"
#~ msgstr "화이트리스트"
#~ msgid "Using Javascript Regex"
#~ msgstr "정규 표현식 사용"
#~ msgid "Use Javascript RegExp for filtering app name or description"
#~ msgstr "자바스크립트의 정규 표현식을 사용해 애플리케이션 이름 혹은 설명을 필터링합니다"
#~ msgid "Check Stream Description"
#~ msgstr "스트림 설명도 확인"
#~ msgid "Check Description also"
#~ msgstr "스트림의 설명도 필터링에 사용합니다"
#~ msgid "Add more buttons"
#~ msgstr "버튼 추가"
#~ msgid "Turn on the buttons you want to add on Quick Settings"
#~ msgstr "퀵 패널에 추가하려는 버튼을 체크하세요"
#~ msgid "Turn on to make the DND quick toggle visible on the Quick Settings panel"
#~ msgstr "방해 금지 모드 퀵 토글을 퀵 패널에 보여줍니다"
#~ msgid "Turn on to make the unsafe quick toggle visible on the Quick Settings panel"
#~ msgstr "위험 모드 퀵 토글을 퀵 패널에 보여줍니다"
#~ msgid "This extension is distributed with license GPL 3+"
#~ msgstr "이 확장 프로그램은 GPL 3+ 라이선스 아래 배포됩니다"
#~ msgid "excludes Third-party. Third party codes follow their license"
#~ msgstr "서드파티는 제외합니다. 서드파티 코드는 각각 원본 코드의 라이선스를 따릅니다"
#~ msgid "Extension Version"
#~ msgstr "확장프로그램 버전"
#~ msgid "Unknown (Built from source)"
#~ msgstr "알 수 없음 (소스에서 직접 빌드됨)"
#~ msgid "Third party LICENSE"
#~ msgstr "서드파티 라이선스"
#~ msgid "LICENSE OF CODES WHICH USED ON THIS EXTENSION"
#~ msgstr "*이 확장 프로그램에 포함되어있는 일부 코드의 라이선스입니다*"
#~ msgid "Media Controls widget"
#~ msgstr "미디어 컨트롤 위젯"
#~ msgid "Turn on to make the Media Control widget visible on the Quick Settings panel"
#~ msgstr "미디어 위젯을 퀵패널에 추가합니다"
#~ msgid "Compact Mode"
#~ msgstr "깔끔한 모드"
#~ msgid "Auto Hide"
#~ msgstr "자동 숨기기"
#~ msgid "Quick Toggles"
#~ msgstr "퀵 토글"
#~ msgid "Fix Weather Widget Overflow"
#~ msgstr "날씨 위젯 오버플로우 고치기"
#~ msgid "Fix overflow visual bug of weather widget in datemenu"
#~ msgstr "날짜 메뉴의 날씨 위젯이 흘러 넘쳐 보이는 비쥬얼 버그를 고칩니다"
#~ msgid "Remove Notifications On Date Menu"
#~ msgstr "날짜 메뉴 알림 제거"
#~ msgid "Remove Media Control On Date Menu"
#~ msgstr "날짜 메뉴 미디어 컨트롤 제거"
#~ msgid "Do not adjust the border radius of contents."
#~ msgstr "콘텐츠의 가장자리 둥글기 정도를 조정하지 않기"
#~ msgid "Don't adjust the border of messages and media controls."
#~ msgstr "메시지와 미디어 컨트롤의 가장자리 둥글기 정도를 조정하지 않습니다"
#~ msgid "Do not remove the shadow of contents."
#~ msgstr "콘텐츠의 그림자 지우지 않기"
#~ msgid "Don't remove the shadow of messages and media controls."
#~ msgstr "메시지와 미디어 컨트롤의 그림자를 지우지 않습니다"
#~ msgid "Set Notifications widget position"
#~ msgstr "알림 위젯의 위치"
#~ msgid "Buttons to remove"
#~ msgstr "지울 버튼"
#~ msgid "Turn on the buttons you want to remove from Quick Settings"
#~ msgstr "퀵패널에서 지우고 싶은 버튼을 채크하세요"
#~ msgid "Remove chosen buttons from quick panel"
#~ msgstr "선택한 버튼들이 퀵패널에서 제거됩니다"
#~ msgid "Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover"
#~ msgstr "나의 익스텐션 https://github.com/qwreey75/gnome-quick-settings-button-remover 에서 포크되었습니다"
#~ msgid "This feature is unstable sometime"
#~ msgstr "이 기능은 때때로 불안정합니다"
#~ msgid ""
#~ "When lock/unlock with gnome-screensaver, unexpected behavior occurs\n"
#~ "Please do not report issue about known issue, Almost duplicated\n"
#~ "Known issue:\n"
#~ " button doesn't remove after lockscreen\n"
#~ " modal get bigger after lockscreen"
#~ msgstr ""
#~ "그놈 화면 보호기를 켜고 끌 때, 예상하지 않은 동작이 발생합니다\n"
#~ "알려진 이슈를 보고하지 마세요. 대부분 버그 리포트가 존재합니다\n"
#~ "알려진 이슈:\n"
#~ " 버튼이 화면 보호기가 작동한 후 지워지지 않습니다\n"
#~ " 패널이 화면 보호기가 작동한 후 더 크게 보입니다"
#~ msgid "Please turn off if some bug occurred"
#~ msgstr "문제가 발생하면 끄십시오"
#~ msgid "Unknown"
#~ msgstr "알 수 없음"
#~ msgid "Information"
#~ msgstr "정보"
#~ msgid "Version"
#~ msgstr "버전"
#~ msgid ""
#~ "Forked from https://github.com/mymindstorm/gnome-volume-mixer\n"
#~ "This feature works well with both PulseAudio and Pipewire protocols"
#~ msgstr ""
#~ "https://github.com/mymindstorm/gnome-volume-mixer 에서 포크된 기능입니다\n"
#~ "이 기능은 PulseAudio 와 Pipewire 프로토콜에서 모두 잘 작동합니다"
#~ msgid "Visible"
#~ msgstr "보이기"
#~ msgid "Turn on to make the volume mixer visible"
#~ msgstr "볼륨 믹서를 보이게 합니다"
#~ msgid "Application Filtering"
#~ msgstr "애플리케이션 필터링"
#~ msgid "Input/Output"
#~ msgstr "입력/출력"
#~ msgid "Add notifications widget"
#~ msgstr "알림 위젯을 추가합니다"
#~ msgid ""
#~ "Reference from https://github.com/Aylur/gnome-extensions\n"
#~ "Source code of that is not used on this extension"
#~ msgstr ""
#~ "https://github.com/Aylur/gnome-extensions 에서 영감받았습니다\n"
#~ "해당 저장소의 소스코드 자체는 이 확장프로그램에 사용되지 않았습니다"
#~ msgid "Media Controls"
#~ msgstr "미디어 컨트롤"
#~ msgid "Add Media Controls widget"
#~ msgstr "미디어 컨트롤 위젯 추가"
================================================
FILE: po/pl.po
================================================
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
# Adam Lewicki , 2025.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-20 15:34+0000\n"
"PO-Revision-Date: 2025-03-13 13:35+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: po\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.4.4\n"
#: target/out/libs/prefs/components.js:57
msgid "Details"
msgstr "Szczegóły"
#: target/out/libs/prefs/components.js:144
msgid "This feature marked as experimental"
msgstr "Funkcja eksperymentalna"
#: target/out/libs/prefs/components.js:274
msgid "Reset to default"
msgstr "Przywróć ustawienia domyślne"
#: target/out/libs/prefs/components.js:512
msgid "Theme default"
msgstr "Domyślnie dla motywu"
#: target/out/libs/prefs/components.js:853
msgid "Homepage"
msgstr "Strona główna"
#: target/out/libs/prefs/components.js:859
#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49
#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56
msgid "License"
msgstr "Licencje"
#: target/out/libs/prefs/components.js:860
msgid "Loading ..."
msgstr "Ładowanie..."
#: target/out/libs/prefs/components.js:869
msgid "Affected Files"
msgstr "Uwzględnione pliki"
#: target/out/libs/prefs/components.js:924
msgid "Changelog"
msgstr "Dziennik zmian"
#: target/out/libs/prefs/components.js:938
msgid "(Current)"
msgstr "(Aktualnie)"
#: target/out/libs/prefs/components.js:969
#, javascript-format
msgid "> **Date:** %s"
msgstr "> **Data:** %s"
#: target/out/libs/prefs/components.js:970
#, javascript-format
msgid "> **Git Hash:** %s"
msgstr "> **Git Hash:** %s"
#: target/out/libs/prefs/components.js:971
#, javascript-format
msgid "> **Build Number:** %d"
msgstr "> **Komplikacja:** %d"
#: target/out/libs/prefs/components.js:1034
msgid "Padding"
msgstr "Wypełnienie"
#: target/out/libs/prefs/components.js:1038
msgid "Top"
msgstr "U góry"
#: target/out/libs/prefs/components.js:1049
msgid "Bottom"
msgstr "Na dole"
#: target/out/libs/prefs/components.js:1060
msgid "Left"
msgstr "Po lewej"
#: target/out/libs/prefs/components.js:1071
msgid "Right"
msgstr "Po prawej"
#: target/out/prefs.js:60
msgid "Stable"
msgstr "Stabilna"
#: target/out/prefs.js:63
msgid "Development"
msgstr "Rozwojowa"
#: target/out/prefs.js:66
msgid "Preview"
msgstr "Podgląd"
#: target/out/prefs.js:69
msgid "(Github Release)"
msgstr "(Wydanie GitHub)"
#: target/out/prefs.js:72
msgid "(Built from source)"
msgstr "(Skompilowane ze źródła)"
#: target/out/features/widget/notifications.js:26
msgid "No Notifications"
msgstr "Brak powiadomień"
#: target/out/features/widget/notifications.js:58
#: target/out/features/widget/notifications.js:122
msgid "Clear"
msgstr "Wyczyść"
#: target/out/features/widget/notifications.js:76
msgid "Notifications"
msgstr "Powiadomienia"
#: target/out/features/widget/notifications.js:105
#: target/out/features/toggle/dndQuickToggle.js:10
#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485
msgid "Do Not Disturb"
msgstr "Nie przeszkadzać"
#: target/out/features/widget/media.js:118
msgid "Unknown title"
msgstr "Nieznany tytuł"
#: target/out/features/widget/media.js:888
msgid "Media"
msgstr "Media"
#: target/out/features/widget/volumeMixer.js:105
msgid "Volume changed"
msgstr "Zmieniono głośność"
#: target/out/features/widget/volumeMixer.js:463
msgid "Open volumx mixer"
msgstr "Otwórz poziomy głośności"
#: target/out/features/widget/volumeMixer.js:480
msgid "Volume Mixer"
msgstr "Poziomy głośności"
#: target/out/features/widget/weather.js:73
msgid "Weather"
msgstr "Pogoda"
#: target/out/features/widget/weather.js:192
msgid "Location has not been set"
msgstr "Nie ustawiono lokalizacji"
#: target/out/features/toggle/unsafeQuickToggle.js:11
#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496
msgid "Unsafe Mode"
msgstr "Tryb niezabezpieczony"
#: target/out/prefPages/widgets.js:11
msgid "Handle radius"
msgstr "Promień przytwierdzenia"
#: target/out/prefPages/widgets.js:12
msgid "Set this to 0 to use default radius"
msgstr "0 - domyślny prommień"
#: target/out/prefPages/widgets.js:18
msgid "Handle color"
msgstr "Kolor przytwierdzenia"
#: target/out/prefPages/widgets.js:36
msgid "Slider style"
msgstr "Styl suwaka"
#: target/out/prefPages/widgets.js:39
msgid "Slim"
msgstr "Wąski"
#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766
msgid "Default"
msgstr "Domyślny"
#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173
msgid "Background color"
msgstr "Kolor tła"
#: target/out/prefPages/widgets.js:55
msgid "Active Background color"
msgstr "Aktywny kolor tła"
#: target/out/prefPages/widgets.js:62
msgid "Thickness"
msgstr ""
#: target/out/prefPages/widgets.js:66
msgid "Set this to 0 to use default thickness"
msgstr ""
#: target/out/prefPages/widgets.js:76
msgid "Widgets"
msgstr "Widżety"
#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136
#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224
msgid "Media Widget"
msgstr "Media"
#: target/out/prefPages/widgets.js:88
msgid "Turn on to make the media widget visible on the Quick Settings panel"
msgstr "Pokazuj widżet na panelu szybkich ustawień"
#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280
#: target/out/prefPages/widgets.js:343
msgid "Compact mode"
msgstr "Tryb kompaktowy"
#: target/out/prefPages/widgets.js:93
msgid ""
"Make Media Controls widget smaller\n"
"Make it more similar in size to the notification message"
msgstr ""
"Mały widźet mediów\n"
"Uczyń go bardziej podobnym do komunikatu powiadomienia"
#: target/out/prefPages/widgets.js:99
msgid "Control buttons opacity"
msgstr "Przezroczystość przycików sterowania"
#: target/out/prefPages/widgets.js:100
msgid "Set this to 255 to make opaque, and 0 to make transparent"
msgstr "255 - nieprzezroczyste, 0 - przezroczyste"
#: target/out/prefPages/widgets.js:108
msgid "Show next button"
msgstr "Przycisk dalej"
#: target/out/prefPages/widgets.js:109
msgid "Add next contorl button next to description"
msgstr "Dodaj przycisk 'Dalej' obok opisu"
#: target/out/prefPages/widgets.js:115
msgid "Show previous button"
msgstr "Przycisk wstecz"
#: target/out/prefPages/widgets.js:116
msgid "Add previous contorl button next to description"
msgstr "Dodaj przycisk 'Wstecz' obok opisu"
#: target/out/prefPages/widgets.js:122
msgid "Show pause button"
msgstr "Przycisk wstrzymaj"
#: target/out/prefPages/widgets.js:123
msgid "Add pause contorl button next to description"
msgstr "Dodaj przycisk 'Wstrzymaj' obok opisu"
#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138
msgid "Show progress bar"
msgstr "Pasek postępu"
#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139
msgid "Add progress bar under description"
msgstr "Dodaj pasek postępu pod opisem"
#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164
msgid "Gradient background"
msgstr "Gradient tła"
#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169
msgid ""
"Use gradient background extracted from cover image\n"
"May affect performance slightly"
msgstr ""
"Użyj gradientu tła z okładki\n"
"Może wpłynąć na wydajność"
#: target/out/prefPages/widgets.js:174
msgid "Base background color"
msgstr "Kolor tła"
#: target/out/prefPages/widgets.js:182
msgid "Start opacity"
msgstr ""
#: target/out/prefPages/widgets.js:183
msgid "Adjust left side transparency, Set this to 1000 to make opaque"
msgstr "Dostosuj przezroczystość po lewej stronie. 1000 oznacza brak przezroczystości"
#: target/out/prefPages/widgets.js:190
msgid "Start color"
msgstr ""
#: target/out/prefPages/widgets.js:191
msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color"
msgstr "Dostosuj mieszanie koloru po lewej stronie. 1000 oznacza kolor pobrany"
#: target/out/prefPages/widgets.js:198
msgid "End opacity"
msgstr ""
#: target/out/prefPages/widgets.js:199
msgid "Adjust right side transparency, Set this to 1000 to make opaque"
msgstr "Dostosuj przezroczystość po prawej stronie. 1000 oznacza brak przezroczystości"
#: target/out/prefPages/widgets.js:206
msgid "End color"
msgstr ""
#: target/out/prefPages/widgets.js:207
msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color"
msgstr "Dostosuj mieszanie koloru po prawej stronie. 1000 oznacza kolor pobrany"
#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226
msgid "Round clip effect"
msgstr "Zaokrąglenie"
#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231
msgid "Use round clip effect to make transition more natural"
msgstr "Użyj zaokrąglenia, aby efekt był bardziej naturalny"
#: target/out/prefPages/widgets.js:234
msgid "Padding adjustment"
msgstr "Dostosowywanie wypełnienia"
#: target/out/prefPages/widgets.js:236
msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding"
msgstr "Dostosuj efekt wypełnienia, jeśli Twój motyw ma inny margines wypełnieia"
#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318
#: target/out/prefPages/widgets.js:350
msgid "Remove shadow"
msgstr "Usuń cień"
#: target/out/prefPages/widgets.js:254
msgid ""
"Remove shadow from media message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
"Usuń cień z powiadomień mediów\n"
"Użyj, jeśli motyw tworzy niepotrzebne cienie"
#: target/out/prefPages/widgets.js:260
msgid "Smooth scroll speed"
msgstr "Kontrla prędkości przewijania"
#: target/out/prefPages/widgets.js:261
msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction"
msgstr "Dostosuj prędkość przewijania panelu dotykowego lub rolki. Wartość ujemna odwraca kierunek"
#: target/out/prefPages/widgets.js:271
msgid "Notifications Widget"
msgstr "Powiadomienia"
#: target/out/prefPages/widgets.js:276
msgid "Turn on to make the notifications widget visible on the Quick Settings panel"
msgstr "Pokazuj widżet na panelu szybkich ustawień"
#: target/out/prefPages/widgets.js:281
msgid "Make notifications smaller"
msgstr "Zmniejsz powiadomienia"
#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418
msgid "Max height"
msgstr "Maksymalna wysokość"
#: target/out/prefPages/widgets.js:288
#, javascript-format
msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height"
msgstr "Ustaw maksymalną wysokość powiadomienia, domyślnie %d. Wartość 0 - wyłącza"
#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441
msgid "Fade out offset"
msgstr "Odstęp zanikania"
#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442
msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46"
msgstr "Ostaw początek pozycji zanikania. 0 - wyłączenie efektu, domyślnie 46"
#: target/out/prefPages/widgets.js:304
msgid "Auto hide"
msgstr "Automatyczne ukrywanie"
#: target/out/prefPages/widgets.js:305
msgid "Hide the Notifications widget when have no notifications"
msgstr "Ukryj widźet powiadomień, jeśli ich nie ma"
#: target/out/prefPages/widgets.js:311
msgid "Use native controls"
msgstr "Użyj wbudowanej kontroli"
#: target/out/prefPages/widgets.js:312
msgid "Use native dnd switch and clear button"
msgstr "Użyj wbudowanego przycisku Nie przeszkadzać i przycisku Wyczyść"
#: target/out/prefPages/widgets.js:319
msgid ""
"Remove shadow from notification message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
"Usuń cień z powiadomień\n"
"Użyj, jeśli motyw tworzy nieporzebne cienie"
#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427
msgid "Show scrollbar"
msgstr "Pokaż pasek przewijania"
#: target/out/prefPages/widgets.js:326
msgid "Show scrollbar on message list"
msgstr "Pokaż pasek przewijania"
#: target/out/prefPages/widgets.js:334
msgid "Weather Widget"
msgstr "Pogoda"
#: target/out/prefPages/widgets.js:339
msgid "Turn on to make the weather widget visible on the Quick Settings panel"
msgstr "Pokazuj widźet w panelu szybkich ustawień"
#: target/out/prefPages/widgets.js:344
msgid "Make weather widget smaller"
msgstr "Zmienjsz widźet pogody"
#: target/out/prefPages/widgets.js:351
msgid ""
"Remove shadow from weather widget\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
"Usuń cień z powiadomień\n"
"Użyj, jeśli motyw tworzy nieporzebne cienie"
#: target/out/prefPages/widgets.js:357
msgid "Click command"
msgstr "Polecenie kliknięcia"
#: target/out/prefPages/widgets.js:363
msgid "Show location"
msgstr "Pokaż lokalizację"
#: target/out/prefPages/widgets.js:364
msgid "Show the location label on header"
msgstr "Pokaż lokalizację w nagłówku"
#: target/out/prefPages/widgets.js:373
msgid "Forecast interval"
msgstr "Odstęp aktualizacji prognozy"
#: target/out/prefPages/widgets.js:374
msgid "Adjust forecast interval in hour"
msgstr "Dostisuj odstęp aktualiacji prognozy"
#: target/out/prefPages/widgets.js:381
msgid "Max forecasts"
msgstr "Ilość dni"
#: target/out/prefPages/widgets.js:382
msgid "Adjust max forecasts"
msgstr "Maksymalna ilość dni"
#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456
msgid "Volume mixer Widget"
msgstr "Poziomy głośności"
#: target/out/prefPages/widgets.js:393
msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel"
msgstr "Pokazuj widźet w panelu szubkich ustawień"
#: target/out/prefPages/widgets.js:397
msgid "Label text"
msgstr "Etykieta"
#: target/out/prefPages/widgets.js:398
msgid "Choose label above slider text source"
msgstr "Wybierz etykietę pod żródłem treści suwaka"
#: target/out/prefPages/widgets.js:400
msgid "Both"
msgstr "Oba"
#: target/out/prefPages/widgets.js:401
msgid "Title"
msgstr "Tytuł"
#: target/out/prefPages/widgets.js:402
msgid "Description"
msgstr "Opis"
#: target/out/prefPages/widgets.js:403
msgid "None"
msgstr "Brak"
#: target/out/prefPages/widgets.js:411
msgid "Label opacity"
msgstr "Przezroczystość"
#: target/out/prefPages/widgets.js:412
msgid ""
"Adjust label opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
"Dostosuj przezroczystość etykiety.\n"
"255 - nieprzezroczyste, 0 - przezroczyste"
#: target/out/prefPages/widgets.js:419
#, javascript-format
msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height"
msgstr "Ustaw maksymalną wysokość widźetu, domyslnie %d. Wartość 0 - wyłącza"
#: target/out/prefPages/widgets.js:428
msgid "Show scrollbar on mixer list"
msgstr "Pasek przewijania"
#: target/out/prefPages/widgets.js:434
msgid "Show stream icon"
msgstr "Ikona strumienia"
#: target/out/prefPages/widgets.js:435
msgid "Show stream icon above mixer sliders"
msgstr "Pokaż ikone strumienia nad suwakiem"
#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458
msgid "Attach to output slider"
msgstr "Załącz do suwaka wyjścia"
#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459
msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout"
msgstr "Załącz poziomy głośności do suwaka wyjścia. Uzywaj, jeśli wolisz tryb kompaktowy"
#: target/out/prefPages/widgets.js:468
msgid "Menu icon"
msgstr "Ikona menu"
#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32
msgid "About"
msgstr "O programie"
#: target/out/prefPages/about.js:33
msgid "Common extension informations"
msgstr "Podstawowe informacje o rozszerzeniu"
#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40
msgid "Changelogs"
msgstr "Dziennik zmian"
#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41
msgid "View the change history for this extension"
msgstr "Wyświetl historię zmian tego rozszerzenia"
#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57
msgid "License of codes"
msgstr "Licencja"
#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65
#: target/out/prefPages/about.js:69
msgid "Contributors"
msgstr "Współtwórcy"
#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70
msgid "The creators of this extension"
msgstr "Twórcy tego rozszerzenia"
#: target/out/prefPages/about.js:74
msgid "More contributors"
msgstr "Więcej współtwórców"
#: target/out/prefPages/about.js:75
msgid "See more contributors on github"
msgstr "Więcej na GitHub"
#: target/out/prefPages/about.js:85
msgid "Link"
msgstr "Odnośnik"
#: target/out/prefPages/about.js:86
msgid "External links about this extension"
msgstr "Odnośniki zewnętrzne"
#: target/out/prefPages/about.js:90
msgid "Donate via github sponsors"
msgstr "Dotacje za pomoca sponsorów GitHub"
#: target/out/prefPages/about.js:91
msgid "Support development!"
msgstr "Wspomóż twórców!"
#: target/out/prefPages/about.js:97
msgid "Rate and comment the extension!"
msgstr "Oceń i skomentuj rozszerzenie!"
#: target/out/prefPages/about.js:102
msgid "Github Repository"
msgstr "Repozytorium GitHub"
#: target/out/prefPages/about.js:103
msgid ""
"Add Star on Repository is helping me a lot!\n"
"Please, if you found bug from this extension, you can make issue to make me know that!\n"
"Or, you can create PR with wonderful features!"
msgstr ""
"Dodanie gwiazdki w repozytorium bardzo mi pomaga!\n"
"Jeśli znalazłeś błąd tego rozszerzenia, możesz zgłosić go, aby powiadomić nas o nim!\n"
"Lub możesz stworzyć PR ze wspaniałymi funkcjami!"
#: target/out/prefPages/about.js:109
msgid "Add translation to this extension!"
msgstr "Dodaj tłumaczenie do tego rozszerzenia!"
#: target/out/prefPages/about.js:115
msgid "Debug"
msgstr "Debuguj"
#: target/out/prefPages/about.js:116
msgid "Extension debugging options"
msgstr "Opcje"
#: target/out/prefPages/about.js:120
msgid "Expose environment"
msgstr "Wystaw środowisko"
#: target/out/prefPages/about.js:121
msgid "Expose extension environment to globalThis.qst"
msgstr "Wystaw środowisko na globalThis.qst"
#: target/out/prefPages/about.js:126
msgid "Show layout border"
msgstr "Granice układu"
#: target/out/prefPages/about.js:127
msgid "Show layout borders on Quick Settings"
msgstr "Pokaż granice ukladu panela szybkich ustawień"
#: target/out/prefPages/about.js:132
msgid "Log level"
msgstr "Poziom dziennika zdarzeń"
#: target/out/prefPages/about.js:135
msgid "none"
msgstr "brak"
#: target/out/prefPages/about.js:136
msgid "error"
msgstr "błąd"
#: target/out/prefPages/about.js:137
msgid "info"
msgstr "info"
#: target/out/prefPages/about.js:138
msgid "debug"
msgstr "debug"
#: target/out/prefPages/toggles.js:12
msgid "Toggles"
msgstr "Przełączniki"
#: target/out/prefPages/toggles.js:19
msgid "DND Quick Toggle"
msgstr "Nie przeszkadzać"
#: target/out/prefPages/toggles.js:20
msgid "Turn on to add the DND quick toggle on the Quick Settings panel"
msgstr "Włącz przycisk w ustalonej pozycji"
#: target/out/prefPages/toggles.js:28
msgid "DND indicator position"
msgstr "Pozycja"
#: target/out/prefPages/toggles.js:29
msgid "Set DND indicator position"
msgstr "Ustaw pozycję"
#: target/out/prefPages/toggles.js:33
msgid "System Tray"
msgstr "Panel szybkich ustawień"
#: target/out/prefPages/toggles.js:34
msgid "Date Menu Button"
msgstr "Menu daty"
#: target/out/prefPages/toggles.js:41
msgid "Unsafe Mode Quick Toggle"
msgstr "Tryb niezabezpieczony"
#: target/out/prefPages/toggles.js:42
msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel"
msgstr "Włącz przycisk w panelu szybkich ustawień"
#: target/out/prefPages/toggles.js:50
msgid "Save last session state"
msgstr "Pamiętaj stan"
#: target/out/prefPages/toggles.js:51
msgid "Turn on to save last session unsafe state"
msgstr "Włącz zapamiętywanie ostatniego stanu"
#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141
msgid "Advanced animation style"
msgstr "Dostosowywanie"
#: target/out/prefPages/menu.js:13
msgid "Open Duration"
msgstr "Czas"
#: target/out/prefPages/menu.js:14
msgid "Open animation duration in microseconds"
msgstr "Czas otwarcia w mikrosekundach"
#: target/out/prefPages/menu.js:21
msgid "Close Duration"
msgstr "Zamknięcie"
#: target/out/prefPages/menu.js:22
msgid "Close animation duration in microseconds"
msgstr "Czas zamkniecia w mikrosekundach"
#: target/out/prefPages/menu.js:29
msgid "Grid Content Opacity"
msgstr "Przezroczystość"
#: target/out/prefPages/menu.js:30
msgid ""
"Adjust grid content opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
"Dostosuj przezroczystość zawartości siatki.\n"
"255 - nieprzeroczyste, 0 - przezroczyste"
#: target/out/prefPages/menu.js:37
msgid "Background Blur Radius"
msgstr "Rozmycie"
#: target/out/prefPages/menu.js:38
msgid ""
"Adjust background blur radius.\n"
"Set this to 0 to disable blur effect"
msgstr ""
"Dostsuj rozmycie tła.\n"
"0 - bez rozycia tła"
#: target/out/prefPages/menu.js:45
msgid "Background Brightness"
msgstr "Jasność"
#: target/out/prefPages/menu.js:46
msgid ""
"Adjust background brightness.\n"
"Set this to 1000 to disable brightness control effect.\n"
"Not impacts on gnome-shell's default dim effect."
msgstr ""
"1000 - wyłącza zarządzanie jasnością.\n"
"nie wpływa na domyślny efekt powłoki GNOME."
#: target/out/prefPages/menu.js:53
msgid "Background Opacity"
msgstr "Przezroczystość"
#: target/out/prefPages/menu.js:54
msgid ""
"Adjust background opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
"Dostosuj przezroczystość tła.\n"
"255 - nieprzeroczyste, 0 - przezroczyste"
#: target/out/prefPages/menu.js:61
msgid "Background X Scale"
msgstr "Skalowanie w osi X"
#: target/out/prefPages/menu.js:62
msgid "Adjust background x scale, 1000 means 1.0 scale"
msgstr "Dostosuj skalowanie w osi X, 1000 oznaza skalę 1.0"
#: target/out/prefPages/menu.js:69
msgid "Background Y Scale"
msgstr "Skalowanie w osi Y"
#: target/out/prefPages/menu.js:70
msgid "Adjust background y scale, 1000 means 1.0 scale"
msgstr "Dostosuj skalowanie w osi Y, 1000 oznaza skalę 1.0"
#: target/out/prefPages/menu.js:84
msgid "Menu"
msgstr "Menu"
#: target/out/prefPages/menu.js:91
msgid "Overlay Mode"
msgstr "Tryb nakładania"
#: target/out/prefPages/menu.js:92
msgid "Display toggle, power, and sound menus as overlay"
msgstr "Nakładaj na przełączniki, zasilanie oraz wyjścia audio dodatkowe menu"
#: target/out/prefPages/menu.js:101
msgid "Overlay Width"
msgstr "Szerokość"
#: target/out/prefPages/menu.js:102
msgid ""
"Adjust overlay menu width\n"
"Set this to 0 to disable adjusting"
msgstr ""
"Dostosuj szerokość dodatkowego menu\n"
"0 - wyłącza"
#: target/out/prefPages/menu.js:109
msgid "Overlay Animation Duration"
msgstr "Czas animacji"
#: target/out/prefPages/menu.js:110
msgid ""
"Custom menu open animation duration in microseconds\n"
"Set this to 0 to disable custom animation"
msgstr ""
"Czas otwarcia animacji w mikrosekundach\n"
"0 - wyłącza"
#: target/out/prefPages/menu.js:117
msgid "Overlay Animation Style"
msgstr "Styl"
#: target/out/prefPages/menu.js:118
msgid "Custom menu open animation style"
msgstr "Rodzaj animacji"
#: target/out/prefPages/menu.js:120
msgid "Flyout"
msgstr "Wylatywanie"
#: target/out/prefPages/menu.js:121
msgid "Dialog"
msgstr "Okno"
#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143
msgid "Animation"
msgstr "Animacja"
#: target/out/prefPages/menu.js:131
msgid ""
"Add menu animation on toggle menu opening and closing\n"
"To get the best feel, turn on overlay mode"
msgstr ""
"Dodaj animację do otwierania oraz zamykania menu\n"
"Włącz tryb nakładania, dla lepszego efektu"
#: target/out/prefPages/menu.js:142
msgid "Adjust speed, blur, scale, and opacity"
msgstr "Dostosuj pręszkość, rozycie, skalowanie oraz przezroczystość"
#: target/out/prefPages/layout.js:25
msgid "The item not found"
msgstr "NIe znaleziono elementu"
#: target/out/prefPages/layout.js:28
msgid "No changes"
msgstr "Brak zmian"
#: target/out/prefPages/layout.js:31
msgid "The same item already exists"
msgstr "Taki element już istnieje"
#: target/out/prefPages/layout.js:40
#, javascript-format
msgid "Properties of %s"
msgstr "Właściwości %s"
#: target/out/prefPages/layout.js:47
msgid "Save"
msgstr "Zapisz"
#: target/out/prefPages/layout.js:64
msgid "Toggle editor"
msgstr "Edytor przełącznika"
#: target/out/prefPages/layout.js:84
msgid "This option requires full gnome-shell reloading"
msgstr "Opcja wymaga przeładowania powłoki GNOME"
#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278
#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672
msgid "Hide"
msgstr "Ukryj"
#: target/out/prefPages/layout.js:232
#, javascript-format
msgid "My item #%d"
msgstr "Mój element #%d"
#: target/out/prefPages/layout.js:250
msgid "New Item"
msgstr "Nowy element"
#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610
#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787
#: target/out/prefPages/layout.js:813
msgid "Ordering and Hiding"
msgstr "Ukrywanie i kolejność"
#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432
msgid "Friendly Name"
msgstr "Nazwa przełącznika"
#: target/out/prefPages/layout.js:283
msgid "Title Regex (Javascript Regex)"
msgstr "Tytuł Regex (JavaScript Regex)"
#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442
msgid "Constructor Name"
msgstr "Nazwa"
#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448
msgid "GType Name"
msgstr "Nazwa GType"
#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456
msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension"
msgstr "To jest komentarz do łatwej identyfikacji na liście ustawień. Nie ma on wpływu na zachowanie rozszerzenia"
#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461
msgid "Javascript constructor name"
msgstr "Nazwa konstruktora JavaScript"
#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466
msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance"
msgstr "Nazwa typu GObject. Możesz uzyskać tę wartość, wywołując GObject.type_name_from_instance"
#: target/out/prefPages/layout.js:342
msgid "Keyboard Backlight"
msgstr "Podświetlenie klawiatury"
#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538
msgid "Unordered items"
msgstr "Elementy bez kolejności"
#: target/out/prefPages/layout.js:486
msgid "Remote Access Applet"
msgstr "Aplet dostępu zdalnego"
#: target/out/prefPages/layout.js:487
msgid "Camera"
msgstr "Aparat"
#: target/out/prefPages/layout.js:488
msgid "Volume Input"
msgstr "Wejście audio"
#: target/out/prefPages/layout.js:489
msgid "Location"
msgstr "Lokalizacja"
#: target/out/prefPages/layout.js:490
msgid "Thunderbolt"
msgstr "Thunderbolt"
#: target/out/prefPages/layout.js:492
msgid "Network"
msgstr "Sieć"
#: target/out/prefPages/layout.js:495
msgid "Volume Output"
msgstr "Wyjscie audio"
#: target/out/prefPages/layout.js:497
msgid "System (Battery)"
msgstr "System (bateria)"
#: target/out/prefPages/layout.js:618
msgid "Desktop Spacer"
msgstr "Pusta przestrzeń pulpitu"
#: target/out/prefPages/layout.js:629
msgid "Laptop Spacer"
msgstr "Pusta przestrzeń laptopa"
#: target/out/prefPages/layout.js:641
msgid "Capture button"
msgstr "Przechwytywanie"
#: target/out/prefPages/layout.js:647
msgid "Settings button"
msgstr "Ustawienia"
#: target/out/prefPages/layout.js:653
msgid "Lock button"
msgstr "Zablokuj"
#: target/out/prefPages/layout.js:659
msgid "Shutdown button"
msgstr "Wyłącz"
#: target/out/prefPages/layout.js:665
msgid "Battery button"
msgstr "Bateria"
#: target/out/prefPages/layout.js:711
msgid "Layout"
msgstr "Układ"
#: target/out/prefPages/layout.js:718
msgid "Quick Toggles Layout"
msgstr "Układ przełączników"
#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734
msgid "Adjust quick toggles layout"
msgstr "Dostosuj układ przełączników"
#: target/out/prefPages/layout.js:738
msgid "Reorder and hide quick toggles"
msgstr "Zmień kolejność i ukryj"
#: target/out/prefPages/layout.js:745
msgid "System Indicators"
msgstr "Wskaźniki systemowe"
#: target/out/prefPages/layout.js:746
msgid "Adjust system indicators layout and style"
msgstr "Dostosuj układ oraz styl wskaźników systemowych"
#: target/out/prefPages/layout.js:751
msgid "Accent screen sharing indicator"
msgstr "Udostępnianie"
#: target/out/prefPages/layout.js:752
msgid "Use shell accent color on screen sharing indicator"
msgstr "Użyj koloru powłoki"
#: target/out/prefPages/layout.js:757
msgid "Accent screen recording indicator"
msgstr "Nagrywanie ekranu"
#: target/out/prefPages/layout.js:758
msgid "Use shell accent color on screen recording indicator"
msgstr "Użyj koloru powłoki"
#: target/out/prefPages/layout.js:763
msgid "Privacy indicators style"
msgstr "Prywatność"
#: target/out/prefPages/layout.js:764
msgid "Use monochrome or shell accent color on privarcy indicators"
msgstr "Użyj koloru powłoki"
#: target/out/prefPages/layout.js:767
msgid "Accent"
msgstr "Kolor akcentu"
#: target/out/prefPages/layout.js:768
msgid "Monochrome"
msgstr "Monochromatyczny"
#: target/out/prefPages/layout.js:777
msgid "Adjust system indicators"
msgstr "Dostosuj wskaźniki systemowe"
#: target/out/prefPages/layout.js:788
msgid "Reorder and hide system indicators"
msgstr "Zmień i ukryj wskaźniki systemowe"
#: target/out/prefPages/layout.js:795
msgid "System Items Layout"
msgstr "Elementy systemowe"
#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815
msgid "Adjust system items layout"
msgstr "Dostosuj układ elementów systemowych"
#: target/out/prefPages/layout.js:804
msgid "Hide layout box"
msgstr "Elementy systemowe"
#: target/out/prefPages/layout.js:805
msgid "Hide all buttons and layout box"
msgstr "Ukryj wszystkie przyciski"
#: target/out/prefPages/layout.js:814
msgid "Reorder and hide system items"
msgstr "Zmień kolejność i ukryj elementy"
#: target/out/prefPages/layout.js:823
msgid "Date Menu"
msgstr "Data"
#: target/out/prefPages/layout.js:824
msgid "Adjust Date Menu layout"
msgstr "Dostosuj układ menu daty"
#: target/out/prefPages/layout.js:828
msgid "Hide left box"
msgstr "Lewy panel"
#: target/out/prefPages/layout.js:829
msgid "Hide the left box of the date menu, which contains notifications and media control"
msgstr "Ukryj lewy panel, który zawiera powiadomienia oraz sterownie mediami"
#: target/out/prefPages/layout.js:834
msgid "Hide right box"
msgstr "Prawy panel"
#: target/out/prefPages/layout.js:835
msgid "Hide the right box of the date menu, which contains calendar, world clock and weather"
msgstr "Ukryj prawy panel. który zawiera kalendarz, zegar światowy oraz pogodę"
#: target/out/prefPages/layout.js:840
msgid "Disable menu"
msgstr "Wyłącz menu"
#: target/out/prefPages/layout.js:841
msgid "Do not open date menu when the date menu button clicked"
msgstr "Nie otwieraj menu po jego kliknięciu"
#~ msgid "Height"
#~ msgstr "Wysokość"
#~ msgid "Set this to 0 to use default height"
#~ msgstr "0 - domyślna wysokość"
#~ msgid "Start opaque"
#~ msgstr "Wyłącz przezroczystość"
#~ msgid "End opaque"
#~ msgstr "Włącz przezroczystość"
#~ msgid "Hide Notifications"
#~ msgstr "Przestrzeń powiadomień"
#~ msgid "Hide notifications on the date menu"
#~ msgstr "Ukryj przestrzeń powiadomień"
#~ msgid "Hide Media Control"
#~ msgstr "Sterowanie mediami"
#~ msgid "Hide media control on the date menu"
#~ msgstr "Ukryj sterowanie mediami"
================================================
FILE: po/pt.po
================================================
# AUTHORS
# DanGLES3 https://github.com/DanGLES3, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-20 15:34+0000\n"
"PO-Revision-Date: 2025-03-09 17:10+0000\n"
"Last-Translator: Duarte Souto Assunção \n"
"Language-Team: Portuguese \n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.10.2\n"
#: target/out/libs/prefs/components.js:57
msgid "Details"
msgstr "Detalhes"
#: target/out/libs/prefs/components.js:144
msgid "This feature marked as experimental"
msgstr "Esta funcionalidade é experimental"
#: target/out/libs/prefs/components.js:274
msgid "Reset to default"
msgstr "Redefinir para o padrão"
#: target/out/libs/prefs/components.js:512
msgid "Theme default"
msgstr "Tema padrão"
#: target/out/libs/prefs/components.js:853
msgid "Homepage"
msgstr "Página principal"
#: target/out/libs/prefs/components.js:859
#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49
#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56
msgid "License"
msgstr "Licença"
#: target/out/libs/prefs/components.js:860
msgid "Loading ..."
msgstr "A carregar..."
#: target/out/libs/prefs/components.js:869
msgid "Affected Files"
msgstr "Ficheiros afetados"
#: target/out/libs/prefs/components.js:924
msgid "Changelog"
msgstr "Mudança"
#: target/out/libs/prefs/components.js:938
msgid "(Current)"
msgstr "Atual"
#: target/out/libs/prefs/components.js:969
#, javascript-format
msgid "> **Date:** %s"
msgstr "> **Data:** %s"
#: target/out/libs/prefs/components.js:970
#, javascript-format
msgid "> **Git Hash:** %s"
msgstr ""
#: target/out/libs/prefs/components.js:971
#, javascript-format
msgid "> **Build Number:** %d"
msgstr ""
#: target/out/libs/prefs/components.js:1034
msgid "Padding"
msgstr ""
#: target/out/libs/prefs/components.js:1038
msgid "Top"
msgstr "Superior"
#: target/out/libs/prefs/components.js:1049
msgid "Bottom"
msgstr "Inferior"
#: target/out/libs/prefs/components.js:1060
msgid "Left"
msgstr "Esquerda"
#: target/out/libs/prefs/components.js:1071
msgid "Right"
msgstr "Direita"
#: target/out/prefs.js:60
msgid "Stable"
msgstr "Estável"
#: target/out/prefs.js:63
msgid "Development"
msgstr "Desenvolvimento"
#: target/out/prefs.js:66
msgid "Preview"
msgstr "Pré-visualização"
#: target/out/prefs.js:69
msgid "(Github Release)"
msgstr ""
#: target/out/prefs.js:72
msgid "(Built from source)"
msgstr ""
#: target/out/features/widget/notifications.js:26
msgid "No Notifications"
msgstr "Nenhuma notificação"
#: target/out/features/widget/notifications.js:58
#: target/out/features/widget/notifications.js:122
msgid "Clear"
msgstr "Limpar"
# Quick settings notifications title text
# Notifications title
#: target/out/features/widget/notifications.js:76
msgid "Notifications"
msgstr "Notificações"
#: target/out/features/widget/notifications.js:105
#: target/out/features/toggle/dndQuickToggle.js:10
#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485
msgid "Do Not Disturb"
msgstr "Não Perturbe"
#: target/out/features/widget/media.js:118
msgid "Unknown title"
msgstr "Título desconhecido"
#: target/out/features/widget/media.js:888
msgid "Media"
msgstr "Mídia"
#: target/out/features/widget/volumeMixer.js:105
msgid "Volume changed"
msgstr "Volume alterado"
#: target/out/features/widget/volumeMixer.js:463
msgid "Open volumx mixer"
msgstr "Abrir mixer de volume"
#: target/out/features/widget/volumeMixer.js:480
msgid "Volume Mixer"
msgstr "Mixer de Volume"
#: target/out/features/widget/weather.js:73
msgid "Weather"
msgstr "Clima"
#: target/out/features/widget/weather.js:192
msgid "Location has not been set"
msgstr "Localização não foi definida"
#: target/out/features/toggle/unsafeQuickToggle.js:11
#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496
msgid "Unsafe Mode"
msgstr "Modo Inseguro"
#: target/out/prefPages/widgets.js:11
msgid "Handle radius"
msgstr ""
#: target/out/prefPages/widgets.js:12
msgid "Set this to 0 to use default radius"
msgstr "Coloque a 0 para usar o raio padrão"
#: target/out/prefPages/widgets.js:18
msgid "Handle color"
msgstr ""
#: target/out/prefPages/widgets.js:36
msgid "Slider style"
msgstr "Estilo do slider"
#: target/out/prefPages/widgets.js:39
msgid "Slim"
msgstr "Magro"
#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766
msgid "Default"
msgstr "Padrão"
#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173
msgid "Background color"
msgstr "Cor de fundo"
#: target/out/prefPages/widgets.js:55
msgid "Active Background color"
msgstr "Cor de fundo ativa"
#: target/out/prefPages/widgets.js:62
msgid "Thickness"
msgstr ""
#: target/out/prefPages/widgets.js:66
msgid "Set this to 0 to use default thickness"
msgstr ""
#: target/out/prefPages/widgets.js:76
msgid "Widgets"
msgstr "Widgets"
#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136
#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224
msgid "Media Widget"
msgstr "Widget de Mídia"
#: target/out/prefPages/widgets.js:88
msgid "Turn on to make the media widget visible on the Quick Settings panel"
msgstr "Ligue para visualizar o widget de mídia no Painel de Definições Rápidas"
#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280
#: target/out/prefPages/widgets.js:343
msgid "Compact mode"
msgstr "Modo compacto"
#: target/out/prefPages/widgets.js:93
msgid ""
"Make Media Controls widget smaller\n"
"Make it more similar in size to the notification message"
msgstr ""
"Deixar o widget de Controles de Mídia menor\n"
"Deixá-lo com tamanho similar a uma mensagem de notificação"
#: target/out/prefPages/widgets.js:99
msgid "Control buttons opacity"
msgstr "Opacidade do botão de controlo"
#: target/out/prefPages/widgets.js:100
msgid "Set this to 255 to make opaque, and 0 to make transparent"
msgstr "Coloque a 255 para opaco ou 0 para transparente"
#: target/out/prefPages/widgets.js:108
msgid "Show next button"
msgstr "Mostrar o próximo botão"
#: target/out/prefPages/widgets.js:109
msgid "Add next contorl button next to description"
msgstr "Adicionar o próximo botão de controle a seguir à descrição"
#: target/out/prefPages/widgets.js:115
msgid "Show previous button"
msgstr "Mostrar botão anterior"
#: target/out/prefPages/widgets.js:116
msgid "Add previous contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:122
msgid "Show pause button"
msgstr "Mostrar botão de pausa"
#: target/out/prefPages/widgets.js:123
msgid "Add pause contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138
msgid "Show progress bar"
msgstr "Mostrar barra de progresso"
#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139
msgid "Add progress bar under description"
msgstr "Adicionar barra de progresso abaixo da descrição"
#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164
msgid "Gradient background"
msgstr "Fundo degradê"
#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169
msgid ""
"Use gradient background extracted from cover image\n"
"May affect performance slightly"
msgstr ""
"Usar fundo degradê extraído da imagem de capa\n"
"Pode afetar a preformance ligeiramente"
#: target/out/prefPages/widgets.js:174
msgid "Base background color"
msgstr "Cor de fundo base"
#: target/out/prefPages/widgets.js:182
msgid "Start opacity"
msgstr ""
#: target/out/prefPages/widgets.js:183
msgid "Adjust left side transparency, Set this to 1000 to make opaque"
msgstr "Ajustar transparência do lado esquerdo, Coloque a 1000 para opaco"
#: target/out/prefPages/widgets.js:190
msgid "Start color"
msgstr ""
#: target/out/prefPages/widgets.js:191
msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color"
msgstr ""
#: target/out/prefPages/widgets.js:198
msgid "End opacity"
msgstr ""
#: target/out/prefPages/widgets.js:199
msgid "Adjust right side transparency, Set this to 1000 to make opaque"
msgstr ""
#: target/out/prefPages/widgets.js:206
msgid "End color"
msgstr ""
#: target/out/prefPages/widgets.js:207
msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color"
msgstr ""
#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226
msgid "Round clip effect"
msgstr "Efeito de clip redondo"
#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231
msgid "Use round clip effect to make transition more natural"
msgstr "Usar efeito de clip redondo para fazer transição mais natural"
#: target/out/prefPages/widgets.js:234
#, fuzzy
msgid "Padding adjustment"
msgstr "Ajuste de padding"
#: target/out/prefPages/widgets.js:236
msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding"
msgstr ""
#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318
#: target/out/prefPages/widgets.js:350
msgid "Remove shadow"
msgstr "Remover sombra"
#: target/out/prefPages/widgets.js:254
msgid ""
"Remove shadow from media message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
"Remover sobra da mensagem de mídia\n"
"Use se o seu tema cria sombras desnecessárias"
#: target/out/prefPages/widgets.js:260
msgid "Smooth scroll speed"
msgstr "Velocidade de scroll suave"
#: target/out/prefPages/widgets.js:261
msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction"
msgstr ""
#: target/out/prefPages/widgets.js:271
msgid "Notifications Widget"
msgstr "Widget de notificação"
#: target/out/prefPages/widgets.js:276
msgid "Turn on to make the notifications widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:281
msgid "Make notifications smaller"
msgstr "Fazer notificações mais pequenas"
#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418
msgid "Max height"
msgstr "Altura máxima"
#: target/out/prefPages/widgets.js:288
#, javascript-format
msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441
msgid "Fade out offset"
msgstr ""
#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442
msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46"
msgstr ""
#: target/out/prefPages/widgets.js:304
msgid "Auto hide"
msgstr "Esconder automáticamente"
#: target/out/prefPages/widgets.js:305
msgid "Hide the Notifications widget when have no notifications"
msgstr "Ocultar o widget de Notificações quando não houver nenhuma notificação"
#: target/out/prefPages/widgets.js:311
msgid "Use native controls"
msgstr "Usar controles nativos"
#: target/out/prefPages/widgets.js:312
msgid "Use native dnd switch and clear button"
msgstr "Usar interruptor do Não Perturbe e botão Limpar nativos"
#: target/out/prefPages/widgets.js:319
msgid ""
"Remove shadow from notification message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
"Remover sombra da mensagem de notificação\n"
"Use se o seu tema cria sombras desnecessárias"
#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427
msgid "Show scrollbar"
msgstr "Mostrar barra de scroll"
#: target/out/prefPages/widgets.js:326
msgid "Show scrollbar on message list"
msgstr "Mostrar barra de scroll na lista de mensagens"
#: target/out/prefPages/widgets.js:334
msgid "Weather Widget"
msgstr "Widget de Clima"
#: target/out/prefPages/widgets.js:339
msgid "Turn on to make the weather widget visible on the Quick Settings panel"
msgstr "Ligue para fazer o widget de clima visível no Painel de Definições Rápidas"
#: target/out/prefPages/widgets.js:344
msgid "Make weather widget smaller"
msgstr "Fazer widget de clima mais pequeno"
#: target/out/prefPages/widgets.js:351
msgid ""
"Remove shadow from weather widget\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
"Remover sombra do widget de clima\n"
"Use se o seu tema cria sombras desnecessárias"
#: target/out/prefPages/widgets.js:357
msgid "Click command"
msgstr "Comando de clique"
#: target/out/prefPages/widgets.js:363
msgid "Show location"
msgstr "Mostrar localização"
#: target/out/prefPages/widgets.js:364
msgid "Show the location label on header"
msgstr "Mostrar a etiqueta de localização no título"
#: target/out/prefPages/widgets.js:373
msgid "Forecast interval"
msgstr "Intervalo de previsão"
#: target/out/prefPages/widgets.js:374
msgid "Adjust forecast interval in hour"
msgstr "Ajustar intervalo de previsão em hora"
#: target/out/prefPages/widgets.js:381
msgid "Max forecasts"
msgstr "Máximas previsões"
#: target/out/prefPages/widgets.js:382
msgid "Adjust max forecasts"
msgstr "Ajustar máximas previsões"
#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456
msgid "Volume mixer Widget"
msgstr "Widget de mixer de volume"
#: target/out/prefPages/widgets.js:393
msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:397
msgid "Label text"
msgstr "Etiqueta de texto"
#: target/out/prefPages/widgets.js:398
msgid "Choose label above slider text source"
msgstr ""
#: target/out/prefPages/widgets.js:400
msgid "Both"
msgstr "Ambos"
#: target/out/prefPages/widgets.js:401
msgid "Title"
msgstr "Título"
#: target/out/prefPages/widgets.js:402
msgid "Description"
msgstr "Descrição"
#: target/out/prefPages/widgets.js:403
msgid "None"
msgstr "Nenhum"
#: target/out/prefPages/widgets.js:411
msgid "Label opacity"
msgstr "Opacidade de etiqueta"
#: target/out/prefPages/widgets.js:412
msgid ""
"Adjust label opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
"Ajustar opacidade de etiqueta\n"
"Coloque a 255 para opaco ou 0 para transparente"
#: target/out/prefPages/widgets.js:419
#, javascript-format
msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:428
msgid "Show scrollbar on mixer list"
msgstr "Mostrar barra de scroll na lista do mixer"
#: target/out/prefPages/widgets.js:434
msgid "Show stream icon"
msgstr "Mostrar ícone de stream"
#: target/out/prefPages/widgets.js:435
msgid "Show stream icon above mixer sliders"
msgstr "Mostar ícone de stream acima dos sliders do mixer"
#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458
msgid "Attach to output slider"
msgstr "Afixar ao slider de saída"
#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459
msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout"
msgstr ""
#: target/out/prefPages/widgets.js:468
msgid "Menu icon"
msgstr "Ícone de menu"
#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32
msgid "About"
msgstr "Sobre"
#: target/out/prefPages/about.js:33
msgid "Common extension informations"
msgstr "Informações de extensão comuns"
#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40
msgid "Changelogs"
msgstr "Mudanças"
#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41
msgid "View the change history for this extension"
msgstr "Ver o histórico de mudanças desta extensão"
#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57
msgid "License of codes"
msgstr "Licença de códigos"
#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65
#: target/out/prefPages/about.js:69
msgid "Contributors"
msgstr "Contribuidores"
#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70
msgid "The creators of this extension"
msgstr "Os criadores desta extensão"
#: target/out/prefPages/about.js:74
msgid "More contributors"
msgstr "Mais contribuições"
#: target/out/prefPages/about.js:75
msgid "See more contributors on github"
msgstr "Ver mais contruibuições no github"
#: target/out/prefPages/about.js:85
msgid "Link"
msgstr "Link"
#: target/out/prefPages/about.js:86
msgid "External links about this extension"
msgstr "Links externos sobre esta extensão"
#: target/out/prefPages/about.js:90
msgid "Donate via github sponsors"
msgstr "Doar via github sponsors"
#: target/out/prefPages/about.js:91
msgid "Support development!"
msgstr "Apoie o desenvolvimento!"
#: target/out/prefPages/about.js:97
msgid "Rate and comment the extension!"
msgstr "Classifique e comente sobre a extensão!"
#: target/out/prefPages/about.js:102
msgid "Github Repository"
msgstr "Repositório do GitHub"
#: target/out/prefPages/about.js:103
msgid ""
"Add Star on Repository is helping me a lot!\n"
"Please, if you found bug from this extension, you can make issue to make me know that!\n"
"Or, you can create PR with wonderful features!"
msgstr ""
"Dar uma estrela no repositório me ajuda muito!\n"
"Por favor, se encontrar um problema com esta extensão, pode criar um relato de problema para me avisar disso!\n"
"Ou pode criar um PR com funcionalidades incríveis!"
#: target/out/prefPages/about.js:109
msgid "Add translation to this extension!"
msgstr "Adicione uma tradução para esta extensão!"
#: target/out/prefPages/about.js:115
msgid "Debug"
msgstr "Debug"
#: target/out/prefPages/about.js:116
msgid "Extension debugging options"
msgstr "Opções de debug da extensão"
#: target/out/prefPages/about.js:120
msgid "Expose environment"
msgstr "Expor ambiente"
#: target/out/prefPages/about.js:121
msgid "Expose extension environment to globalThis.qst"
msgstr "Expor ambiente de extensão para globalThis.qst"
#: target/out/prefPages/about.js:126
msgid "Show layout border"
msgstr "Mostar borda do esquema"
#: target/out/prefPages/about.js:127
msgid "Show layout borders on Quick Settings"
msgstr "Mostrar esquema de bordas nas Definições Rápidas"
#: target/out/prefPages/about.js:132
msgid "Log level"
msgstr "Nível de log"
#: target/out/prefPages/about.js:135
msgid "none"
msgstr "nenhum"
#: target/out/prefPages/about.js:136
msgid "error"
msgstr "erro"
#: target/out/prefPages/about.js:137
msgid "info"
msgstr "informação"
#: target/out/prefPages/about.js:138
msgid "debug"
msgstr "debug"
#: target/out/prefPages/toggles.js:12
msgid "Toggles"
msgstr "Botões"
#: target/out/prefPages/toggles.js:19
msgid "DND Quick Toggle"
msgstr "Botão Rápido do Não Perturbe"
#: target/out/prefPages/toggles.js:20
msgid "Turn on to add the DND quick toggle on the Quick Settings panel"
msgstr "Ligue para adicionar o botão rápido de Não Perturbe no Painel de Definições Rápidas"
#: target/out/prefPages/toggles.js:28
msgid "DND indicator position"
msgstr "Indicador de posição do Não Perturbe"
#: target/out/prefPages/toggles.js:29
msgid "Set DND indicator position"
msgstr "Definir posição do indicador de Não Perturbe"
#: target/out/prefPages/toggles.js:33
msgid "System Tray"
msgstr "Tray de Sistema"
#: target/out/prefPages/toggles.js:34
msgid "Date Menu Button"
msgstr "Botão do Menu da Data"
#: target/out/prefPages/toggles.js:41
msgid "Unsafe Mode Quick Toggle"
msgstr "Quick Toggle do Modo Inseguro"
#: target/out/prefPages/toggles.js:42
msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/toggles.js:50
msgid "Save last session state"
msgstr "Salvar o estado da última sessão"
#: target/out/prefPages/toggles.js:51
msgid "Turn on to save last session unsafe state"
msgstr ""
#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141
msgid "Advanced animation style"
msgstr "Estilo de animação avançado"
#: target/out/prefPages/menu.js:13
msgid "Open Duration"
msgstr "Duração de abertura"
#: target/out/prefPages/menu.js:14
msgid "Open animation duration in microseconds"
msgstr ""
#: target/out/prefPages/menu.js:21
msgid "Close Duration"
msgstr "Fechar Duração"
#: target/out/prefPages/menu.js:22
msgid "Close animation duration in microseconds"
msgstr ""
#: target/out/prefPages/menu.js:29
msgid "Grid Content Opacity"
msgstr "Opacidade do Conteúdo da Grelha"
#: target/out/prefPages/menu.js:30
msgid ""
"Adjust grid content opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:37
msgid "Background Blur Radius"
msgstr "Raio do blur de fundo"
#: target/out/prefPages/menu.js:38
msgid ""
"Adjust background blur radius.\n"
"Set this to 0 to disable blur effect"
msgstr ""
#: target/out/prefPages/menu.js:45
msgid "Background Brightness"
msgstr "Brilho do fundo"
#: target/out/prefPages/menu.js:46
msgid ""
"Adjust background brightness.\n"
"Set this to 1000 to disable brightness control effect.\n"
"Not impacts on gnome-shell's default dim effect."
msgstr ""
#: target/out/prefPages/menu.js:53
msgid "Background Opacity"
msgstr "Opacidade do Fundo"
#: target/out/prefPages/menu.js:54
msgid ""
"Adjust background opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:61
msgid "Background X Scale"
msgstr "Escala X do fundo"
#: target/out/prefPages/menu.js:62
msgid "Adjust background x scale, 1000 means 1.0 scale"
msgstr ""
#: target/out/prefPages/menu.js:69
msgid "Background Y Scale"
msgstr "Escala Y do fundo"
#: target/out/prefPages/menu.js:70
msgid "Adjust background y scale, 1000 means 1.0 scale"
msgstr ""
#: target/out/prefPages/menu.js:84
msgid "Menu"
msgstr "Menu"
#: target/out/prefPages/menu.js:91
msgid "Overlay Mode"
msgstr ""
#: target/out/prefPages/menu.js:92
msgid "Display toggle, power, and sound menus as overlay"
msgstr ""
#: target/out/prefPages/menu.js:101
msgid "Overlay Width"
msgstr ""
#: target/out/prefPages/menu.js:102
msgid ""
"Adjust overlay menu width\n"
"Set this to 0 to disable adjusting"
msgstr ""
#: target/out/prefPages/menu.js:109
msgid "Overlay Animation Duration"
msgstr ""
#: target/out/prefPages/menu.js:110
msgid ""
"Custom menu open animation duration in microseconds\n"
"Set this to 0 to disable custom animation"
msgstr ""
#: target/out/prefPages/menu.js:117
msgid "Overlay Animation Style"
msgstr ""
#: target/out/prefPages/menu.js:118
msgid "Custom menu open animation style"
msgstr ""
#: target/out/prefPages/menu.js:120
msgid "Flyout"
msgstr ""
#: target/out/prefPages/menu.js:121
msgid "Dialog"
msgstr "Diálogo"
#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143
msgid "Animation"
msgstr "Animação"
#: target/out/prefPages/menu.js:131
msgid ""
"Add menu animation on toggle menu opening and closing\n"
"To get the best feel, turn on overlay mode"
msgstr ""
#: target/out/prefPages/menu.js:142
msgid "Adjust speed, blur, scale, and opacity"
msgstr "Ajustar velocidade, blur, escala e opacidade"
#: target/out/prefPages/layout.js:25
msgid "The item not found"
msgstr "O ítem não encontrado"
#: target/out/prefPages/layout.js:28
msgid "No changes"
msgstr "Nenhuma mudança"
#: target/out/prefPages/layout.js:31
msgid "The same item already exists"
msgstr "Este ítem já existe"
#: target/out/prefPages/layout.js:40
#, javascript-format
msgid "Properties of %s"
msgstr "Propriedades de %s"
#: target/out/prefPages/layout.js:47
msgid "Save"
msgstr "Salvar"
#: target/out/prefPages/layout.js:64
msgid "Toggle editor"
msgstr "Ligar editor"
#: target/out/prefPages/layout.js:84
msgid "This option requires full gnome-shell reloading"
msgstr ""
#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278
#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672
msgid "Hide"
msgstr "Esconder"
#: target/out/prefPages/layout.js:232
#, javascript-format
msgid "My item #%d"
msgstr "Meu item #%d"
#: target/out/prefPages/layout.js:250
msgid "New Item"
msgstr "Novo item"
#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610
#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787
#: target/out/prefPages/layout.js:813
msgid "Ordering and Hiding"
msgstr ""
#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432
msgid "Friendly Name"
msgstr "Nome amigável"
#: target/out/prefPages/layout.js:283
msgid "Title Regex (Javascript Regex)"
msgstr "Regex de Título (Regex de Javascript)"
#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442
msgid "Constructor Name"
msgstr "Nome do construtor"
#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448
msgid "GType Name"
msgstr ""
#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456
msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension"
msgstr ""
#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461
msgid "Javascript constructor name"
msgstr "Nome do construtor de Javascript"
#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466
msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance"
msgstr ""
#: target/out/prefPages/layout.js:342
msgid "Keyboard Backlight"
msgstr "Luz de teclado"
#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538
msgid "Unordered items"
msgstr ""
#: target/out/prefPages/layout.js:486
msgid "Remote Access Applet"
msgstr ""
#: target/out/prefPages/layout.js:487
msgid "Camera"
msgstr "Câmera"
#: target/out/prefPages/layout.js:488
msgid "Volume Input"
msgstr "Entrada de volume"
#: target/out/prefPages/layout.js:489
msgid "Location"
msgstr "Localização"
#: target/out/prefPages/layout.js:490
msgid "Thunderbolt"
msgstr "Thunderbolt"
#: target/out/prefPages/layout.js:492
msgid "Network"
msgstr "Rede"
#: target/out/prefPages/layout.js:495
msgid "Volume Output"
msgstr "Saída de volume"
#: target/out/prefPages/layout.js:497
msgid "System (Battery)"
msgstr "Sistema (Bateria)"
#: target/out/prefPages/layout.js:618
msgid "Desktop Spacer"
msgstr ""
#: target/out/prefPages/layout.js:629
msgid "Laptop Spacer"
msgstr ""
#: target/out/prefPages/layout.js:641
msgid "Capture button"
msgstr "Botão de captura"
#: target/out/prefPages/layout.js:647
msgid "Settings button"
msgstr "Botão de definições"
#: target/out/prefPages/layout.js:653
msgid "Lock button"
msgstr "Botão de bloqueio"
#: target/out/prefPages/layout.js:659
msgid "Shutdown button"
msgstr "Botão de desligar"
#: target/out/prefPages/layout.js:665
msgid "Battery button"
msgstr "Botão de bateria"
#: target/out/prefPages/layout.js:711
msgid "Layout"
msgstr "Esquema"
#: target/out/prefPages/layout.js:718
msgid "Quick Toggles Layout"
msgstr "Esquema de Botões Rápidos"
#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734
msgid "Adjust quick toggles layout"
msgstr ""
#: target/out/prefPages/layout.js:738
msgid "Reorder and hide quick toggles"
msgstr ""
#: target/out/prefPages/layout.js:745
msgid "System Indicators"
msgstr "Indicadores de sistema"
#: target/out/prefPages/layout.js:746
msgid "Adjust system indicators layout and style"
msgstr ""
#: target/out/prefPages/layout.js:751
msgid "Accent screen sharing indicator"
msgstr ""
#: target/out/prefPages/layout.js:752
msgid "Use shell accent color on screen sharing indicator"
msgstr "Usar cor de destaque da shell no indicador de partilha de ecrã"
#: target/out/prefPages/layout.js:757
msgid "Accent screen recording indicator"
msgstr "Indicador de gravação no ecrã destaque"
#: target/out/prefPages/layout.js:758
msgid "Use shell accent color on screen recording indicator"
msgstr "Usar cor de destaque de shell no indicador de gravação de ecrã"
#: target/out/prefPages/layout.js:763
msgid "Privacy indicators style"
msgstr "Estilo de indicadores de privacidade"
#: target/out/prefPages/layout.js:764
msgid "Use monochrome or shell accent color on privarcy indicators"
msgstr ""
#: target/out/prefPages/layout.js:767
msgid "Accent"
msgstr "Destaque"
#: target/out/prefPages/layout.js:768
msgid "Monochrome"
msgstr ""
#: target/out/prefPages/layout.js:777
msgid "Adjust system indicators"
msgstr "Ajustar indicadores de sistema"
#: target/out/prefPages/layout.js:788
msgid "Reorder and hide system indicators"
msgstr "Reordenar e esconder indicadores de sistema"
#: target/out/prefPages/layout.js:795
msgid "System Items Layout"
msgstr "Esquema de itens de sistema"
#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815
msgid "Adjust system items layout"
msgstr "Ajustar esquema de itens de sistema"
#: target/out/prefPages/layout.js:804
msgid "Hide layout box"
msgstr "Esconder caixa de esquema"
#: target/out/prefPages/layout.js:805
msgid "Hide all buttons and layout box"
msgstr "Esconder todos os botões e caixa de esquema"
#: target/out/prefPages/layout.js:814
msgid "Reorder and hide system items"
msgstr "Reordenar e esconder itens de sistema"
#: target/out/prefPages/layout.js:823
msgid "Date Menu"
msgstr "Menu de Data"
#: target/out/prefPages/layout.js:824
msgid "Adjust Date Menu layout"
msgstr "Ajustar esquema do Menu de Data"
#: target/out/prefPages/layout.js:828
msgid "Hide left box"
msgstr "Esconder caixa da esquerda"
#: target/out/prefPages/layout.js:829
msgid "Hide the left box of the date menu, which contains notifications and media control"
msgstr "Esconder caixa da esquerda do menu de data, que contém notificações e controlo de mídia"
#: target/out/prefPages/layout.js:834
msgid "Hide right box"
msgstr "Esconder caixa da direita"
#: target/out/prefPages/layout.js:835
msgid "Hide the right box of the date menu, which contains calendar, world clock and weather"
msgstr "Esconder caixa da direita do menu de data, que contém calendário, relógio mundial e clima"
#: target/out/prefPages/layout.js:840
msgid "Disable menu"
msgstr "Desabilitar menu"
#: target/out/prefPages/layout.js:841
msgid "Do not open date menu when the date menu button clicked"
msgstr "Não abrir menu de data quando for clicado"
#~ msgid "Height"
#~ msgstr "Altura"
#~ msgid "Set this to 0 to use default height"
#~ msgstr "Coloque a 0 para usar a altura padrão"
#~ msgid "Start opaque"
#~ msgstr "Começar opaco"
#~ msgid "End opaque"
#~ msgstr "Terminar opaco"
#~ msgid "Hide Notifications"
#~ msgstr "Esconder Notificações"
#~ msgid "Hide notifications on the date menu"
#~ msgstr "Esconder notificações no menu de data"
#~ msgid "Hide Media Control"
#~ msgstr "Esconder controle de mídia"
#~ msgid "Hide media control on the date menu"
#~ msgstr "Esconder controle de mídia no menu de data"
#~ msgid "Donate via patreon"
#~ msgstr "Doar pelo Patreon"
#~ msgid "Set maximum height of the Notifications widget. default is 292"
#~ msgstr "Defina a altura máxima do widget de Notificações. O padrão é 292"
#~ msgid "Other"
#~ msgstr "Outros"
#~ msgid ""
#~ "Hide notifications on date menu.\n"
#~ "*this option removes media control on date menu too*"
#~ msgstr ""
#~ "Ocultar notificações no menu de data.\n"
#~ "*esta opção também remove os controles de mídia no menu de data*"
#~ msgid "Hide media control on date menu."
#~ msgstr "Ocultar controles de mídia no menu de data."
#~ msgid "Sound Settings"
#~ msgstr "Configurações de som"
#~ msgid "Notification Widget"
#~ msgstr "Widget de notificação"
#~ msgid "Turn on to make the notification widget visible on the Quick Settings panel"
#~ msgstr "Ative para deixar o widget de notificação visível no painel de Configurações Rápidas"
#~ msgid "Links"
#~ msgstr "Links"
#~ msgid "Contributor"
#~ msgstr "Colaborador"
#~ msgid "Add Application to filtering"
#~ msgstr "Adicionar aplicativo ao filtro"
#~ msgid "Add"
#~ msgstr "Adicionar"
#~ msgid "Cancel"
#~ msgstr "Cancelar"
#~ msgid "Application name"
#~ msgstr "Nome do aplicativo"
#~ msgid "General"
#~ msgstr "Geral"
#~ msgid "Enchant input/output slider"
#~ msgstr "Personalize o slider de entrada/saída"
#~ msgid "Show current audio output selection"
#~ msgstr "Mostrar saída de áudio atual"
#~ msgid "Always show the current audio output selection above the volume slider"
#~ msgstr "Sempre mostrar a saída de áudio atualmente selecionada acima do slider de volume"
#~ msgid "Show current audio input selection"
#~ msgstr "Mostrar entrada de áudio atual"
#~ msgid "Always show the current audio input selection above the volume slider"
#~ msgstr "Sempre mostrar a entrada de áudio atualmente selecionada acima do slider de volume"
#~ msgid "Always show input"
#~ msgstr "Sempre mostrar entrada"
#~ msgid "Always show the audio input volume slider, even when there is no audio input stream."
#~ msgstr "Sempre mostrar o slider de volume da entrada de áudio, mesmo quando não houver fluxo de entrada de áudio."
#~ msgid "Add volume mixer (PulseAudio, Pipewire)"
#~ msgstr "Adicionar mixer de volume (PulseAudio, PipeWire)"
#~ msgid ""
#~ "Turn on to make the volume mixer visible\n"
#~ "Forked from https://github.com/mymindstorm/gnome-volume-mixer"
#~ msgstr ""
#~ "Ative para tornar visível o mixer de volume\n"
#~ "Uma ramificação de https://github.com/mymindstorm/gnome-volume-mixer"
#~ msgid "Position"
#~ msgstr "Posição"
#~ msgid "Set volume mixer position"
#~ msgstr "Definir posição do mixer de volume"
#~ msgid "Top (Below Output/Input slider)"
#~ msgstr "Superior (sob o slider de saída/entrada)"
#~ msgid "Show stream Description"
#~ msgstr "Mostrar descrição do fluxo"
#~ msgid "Show audio stream description above the slider"
#~ msgstr "Mostrar descrição do fluxo de áudio acima do slider"
#~ msgid "Show stream Icon"
#~ msgstr "Mostrar ícone do fluxo"
#~ msgid "Show application icon in front of the slider"
#~ msgstr "Mostrar ícone do aplicativo na frente do slider"
#~ msgid "Filter applications shown in the volume mixer."
#~ msgstr "Filtrar aplicativos mostrados no mixer de volume."
#~ msgid "Filter Mode"
#~ msgstr "Modo de Filtragem"
#~ msgid "Blacklist"
#~ msgstr "Lista negra"
#~ msgid "Whitelist"
#~ msgstr "Lista branca"
#~ msgid "Using Javascript Regex"
#~ msgstr "Usar Regex do Javascript"
#~ msgid "Use Javascript RegExp for filtering app name or description"
#~ msgstr "Usar RegExp do Javascript para filtrar nomes ou descrições de aplicativos"
#~ msgid "Check Stream Description"
#~ msgstr "Conferir descrição do fluxo"
#~ msgid "Check Description also"
#~ msgstr "Conferir também a descrição"
#~ msgid "Add more buttons"
#~ msgstr "Adicionar botões"
#~ msgid "Turn on the buttons you want to add on Quick Settings"
#~ msgstr "Ative os botões que você deseja adicionar às Configurações Rápidas"
#~ msgid "Turn on to make the DND quick toggle visible on the Quick Settings panel"
#~ msgstr "Ative para deixar o Quick Toggle do Não Perturbe visível no painel de Configurações Rápidas"
#~ msgid "Turn on to make the unsafe quick toggle visible on the Quick Settings panel"
#~ msgstr "Ative para deixar o Quick Toggle do Modo Inseguro visível no painel de Configurações Rápidas"
#~ msgid "This extension is distributed with license GPL 3+"
#~ msgstr "Esta extensão é distribuída sob a licença GPL 3+"
#~ msgid "excludes Third-party. Third party codes follow their license"
#~ msgstr "Exclui terceiros. Código de terceiros segue suas próprias licenças"
#~ msgid "Extension Version"
#~ msgstr "Versão da extensão"
#~ msgid "Unknown (Built from source)"
#~ msgstr "Desconhecida (compilada do código-fonte)"
#~ msgid "Third party LICENSE"
#~ msgstr "Licenças de Terceiros"
#~ msgid "LICENSE OF CODES WHICH USED ON THIS EXTENSION"
#~ msgstr "Licenças de códigos que foram utilizados nesta extensão"
#~ msgid "Media Controls widget"
#~ msgstr "Widget de controles de mídia"
#~ msgid "Turn on to make the Media Control widget visible on the Quick Settings panel"
#~ msgstr "Ative para deixar o widget de Controles de Mídia visível no painel de Configurações Rápidas"
#~ msgid "Compact Mode"
#~ msgstr "Modo compacto"
#~ msgid "Auto Hide"
#~ msgstr "Ocultar automaticamente"
#~ msgid "Quick Toggles"
#~ msgstr "Quick Toggles"
#~ msgid "Fix Weather Widget Overflow"
#~ msgstr "Corrigir transbordamento do widget de Meteorologia"
#~ msgid "Fix overflow visual bug of weather widget in datemenu"
#~ msgstr "Corrigir problema visual de transbordamento do widget de Meteorologia no menu de data"
#~ msgid "Remove Notifications On Date Menu"
#~ msgstr "Remover notificações no menu de data"
#~ msgid "Remove Media Control On Date Menu"
#~ msgstr "Remover controles de mídia no menu de data"
#~ msgid "Do not adjust the border radius of contents."
#~ msgstr "Não ajustar o raio de curvatura das bordas dos conteúdos."
#~ msgid "Don't adjust the border of messages and media controls."
#~ msgstr "Não ajustar as bordas das mensagens e dos controles de mídia."
#~ msgid "Do not remove the shadow of contents."
#~ msgstr "Não remover as sombras dos conteúdos."
#~ msgid "Don't remove the shadow of messages and media controls."
#~ msgstr "Não remover as sombras das mensagens e dos controles de mídia."
#~ msgid "Set Notifications widget position"
#~ msgstr "Definir posição do widget de Notificações"
#~ msgid "Buttons to remove"
#~ msgstr "Remover botões"
#~ msgid "Turn on the buttons you want to remove from Quick Settings"
#~ msgstr "Ative os botões que você deseja remover das Configurações Rápidas"
#~ msgid "Remove chosen buttons from quick panel"
#~ msgstr "Remover botões escolhidos do painel de Configurações Rápidas"
#~ msgid "Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover"
#~ msgstr "Uma ramificação da minha extensão https://github.com/qwreey75/gnome-quick-settings-button-remover"
#~ msgid "This feature is unstable sometime"
#~ msgstr "Esta funcionalidade às vezes pode ser instável"
#~ msgid ""
#~ "When lock/unlock with gnome-screensaver, unexpected behavior occurs\n"
#~ "Please do not report issue about known issue, Almost duplicated\n"
#~ "Known issue:\n"
#~ " button doesn't remove after lockscreen\n"
#~ " modal get bigger after lockscreen"
#~ msgstr ""
#~ "Ao bloquear/desbloquear com o gnome-screensaver, um comportamento inesperado ocorre\n"
#~ "Favor não criar um relato de problema sobre um problema já conhecido, quase duplicado\n"
#~ "Problemas conhecidos:\n"
#~ " botão não é removido após a tela de bloqueio\n"
#~ " modal fica maior após a tela de bloqueio"
#~ msgid "Please turn off if some bug occurred"
#~ msgstr "Favor desativar se algum problema ocorrer"
#~ msgid "Unknown"
#~ msgstr "Desconhecido"
#~ msgid ""
#~ "Do not separate Quick Settings and Notifications widgets, \byou should enable this option because separated panels can make many visual bugs\n"
#~ "(such as margin or padding not matching with the theme)"
#~ msgstr ""
#~ "Não separar os widgets de Configurações Rápidas e de Notificações \\bvocê deve ativar esta opção porque painéis separados podem gerar vários problemas visuais\n"
#~ "(como margens e espaçamentos não corresponderem ao tema)"
================================================
FILE: po/quick-settings-tweaks@qwreey.pot
================================================
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-20 15:34+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: target/out/libs/prefs/components.js:57
msgid "Details"
msgstr ""
#: target/out/libs/prefs/components.js:144
msgid "This feature marked as experimental"
msgstr ""
#: target/out/libs/prefs/components.js:274
msgid "Reset to default"
msgstr ""
#: target/out/libs/prefs/components.js:512
msgid "Theme default"
msgstr ""
#: target/out/libs/prefs/components.js:853
msgid "Homepage"
msgstr ""
#: target/out/libs/prefs/components.js:859
#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49
#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56
msgid "License"
msgstr ""
#: target/out/libs/prefs/components.js:860
msgid "Loading ..."
msgstr ""
#: target/out/libs/prefs/components.js:869
msgid "Affected Files"
msgstr ""
#: target/out/libs/prefs/components.js:924
msgid "Changelog"
msgstr ""
#: target/out/libs/prefs/components.js:938
msgid "(Current)"
msgstr ""
#: target/out/libs/prefs/components.js:969
#, javascript-format
msgid "> **Date:** %s"
msgstr ""
#: target/out/libs/prefs/components.js:970
#, javascript-format
msgid "> **Git Hash:** %s"
msgstr ""
#: target/out/libs/prefs/components.js:971
#, javascript-format
msgid "> **Build Number:** %d"
msgstr ""
#: target/out/libs/prefs/components.js:1034
msgid "Padding"
msgstr ""
#: target/out/libs/prefs/components.js:1038
msgid "Top"
msgstr ""
#: target/out/libs/prefs/components.js:1049
msgid "Bottom"
msgstr ""
#: target/out/libs/prefs/components.js:1060
msgid "Left"
msgstr ""
#: target/out/libs/prefs/components.js:1071
msgid "Right"
msgstr ""
#: target/out/prefs.js:60
msgid "Stable"
msgstr ""
#: target/out/prefs.js:63
msgid "Development"
msgstr ""
#: target/out/prefs.js:66
msgid "Preview"
msgstr ""
#: target/out/prefs.js:69
msgid "(Github Release)"
msgstr ""
#: target/out/prefs.js:72
msgid "(Built from source)"
msgstr ""
#: target/out/features/widget/notifications.js:26
msgid "No Notifications"
msgstr ""
#: target/out/features/widget/notifications.js:58
#: target/out/features/widget/notifications.js:122
msgid "Clear"
msgstr ""
#: target/out/features/widget/notifications.js:76
msgid "Notifications"
msgstr ""
#: target/out/features/widget/notifications.js:105
#: target/out/features/toggle/dndQuickToggle.js:10
#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485
msgid "Do Not Disturb"
msgstr ""
#: target/out/features/widget/media.js:118
msgid "Unknown title"
msgstr ""
#: target/out/features/widget/media.js:888
msgid "Media"
msgstr ""
#: target/out/features/widget/volumeMixer.js:105
msgid "Volume changed"
msgstr ""
#: target/out/features/widget/volumeMixer.js:463
msgid "Open volumx mixer"
msgstr ""
#: target/out/features/widget/volumeMixer.js:480
msgid "Volume Mixer"
msgstr ""
#: target/out/features/widget/weather.js:73
msgid "Weather"
msgstr ""
#: target/out/features/widget/weather.js:192
msgid "Location has not been set"
msgstr ""
#: target/out/features/toggle/unsafeQuickToggle.js:11
#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496
msgid "Unsafe Mode"
msgstr ""
#: target/out/prefPages/widgets.js:11
msgid "Handle radius"
msgstr ""
#: target/out/prefPages/widgets.js:12
msgid "Set this to 0 to use default radius"
msgstr ""
#: target/out/prefPages/widgets.js:18
msgid "Handle color"
msgstr ""
#: target/out/prefPages/widgets.js:36
msgid "Slider style"
msgstr ""
#: target/out/prefPages/widgets.js:39
msgid "Slim"
msgstr ""
#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766
msgid "Default"
msgstr ""
#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173
msgid "Background color"
msgstr ""
#: target/out/prefPages/widgets.js:55
msgid "Active Background color"
msgstr ""
#: target/out/prefPages/widgets.js:62
msgid "Thickness"
msgstr ""
#: target/out/prefPages/widgets.js:66
msgid "Set this to 0 to use default thickness"
msgstr ""
#: target/out/prefPages/widgets.js:76
msgid "Widgets"
msgstr ""
#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136
#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224
msgid "Media Widget"
msgstr ""
#: target/out/prefPages/widgets.js:88
msgid "Turn on to make the media widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280
#: target/out/prefPages/widgets.js:343
msgid "Compact mode"
msgstr ""
#: target/out/prefPages/widgets.js:93
msgid ""
"Make Media Controls widget smaller\n"
"Make it more similar in size to the notification message"
msgstr ""
#: target/out/prefPages/widgets.js:99
msgid "Control buttons opacity"
msgstr ""
#: target/out/prefPages/widgets.js:100
msgid "Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/widgets.js:108
msgid "Show next button"
msgstr ""
#: target/out/prefPages/widgets.js:109
msgid "Add next contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:115
msgid "Show previous button"
msgstr ""
#: target/out/prefPages/widgets.js:116
msgid "Add previous contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:122
msgid "Show pause button"
msgstr ""
#: target/out/prefPages/widgets.js:123
msgid "Add pause contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138
msgid "Show progress bar"
msgstr ""
#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139
msgid "Add progress bar under description"
msgstr ""
#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164
msgid "Gradient background"
msgstr ""
#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169
msgid ""
"Use gradient background extracted from cover image\n"
"May affect performance slightly"
msgstr ""
#: target/out/prefPages/widgets.js:174
msgid "Base background color"
msgstr ""
#: target/out/prefPages/widgets.js:182
msgid "Start opacity"
msgstr ""
#: target/out/prefPages/widgets.js:183
msgid "Adjust left side transparency, Set this to 1000 to make opaque"
msgstr ""
#: target/out/prefPages/widgets.js:190
msgid "Start color"
msgstr ""
#: target/out/prefPages/widgets.js:191
msgid ""
"Adjust left side background color mixing, Set this to 1000 to show extracted "
"color"
msgstr ""
#: target/out/prefPages/widgets.js:198
msgid "End opacity"
msgstr ""
#: target/out/prefPages/widgets.js:199
msgid "Adjust right side transparency, Set this to 1000 to make opaque"
msgstr ""
#: target/out/prefPages/widgets.js:206
msgid "End color"
msgstr ""
#: target/out/prefPages/widgets.js:207
msgid ""
"Adjust right side background color mixing, Set this to 1000 to show "
"extracted color"
msgstr ""
#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226
msgid "Round clip effect"
msgstr ""
#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231
msgid "Use round clip effect to make transition more natural"
msgstr ""
#: target/out/prefPages/widgets.js:234
msgid "Padding adjustment"
msgstr ""
#: target/out/prefPages/widgets.js:236
msgid ""
"Adjust clip effect padding, edit this if your theme has a different margin "
"or padding"
msgstr ""
#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318
#: target/out/prefPages/widgets.js:350
msgid "Remove shadow"
msgstr ""
#: target/out/prefPages/widgets.js:254
msgid ""
"Remove shadow from media message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:260
msgid "Smooth scroll speed"
msgstr ""
#: target/out/prefPages/widgets.js:261
msgid ""
"Adjust trackpad and trackpoint scroll speed, negative number for invert "
"direction"
msgstr ""
#: target/out/prefPages/widgets.js:271
msgid "Notifications Widget"
msgstr ""
#: target/out/prefPages/widgets.js:276
msgid ""
"Turn on to make the notifications widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:281
msgid "Make notifications smaller"
msgstr ""
#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418
msgid "Max height"
msgstr ""
#: target/out/prefPages/widgets.js:288
#, javascript-format
msgid ""
"Set maximum height of the Notifications widget, default is %d. Set this to 0 "
"to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441
msgid "Fade out offset"
msgstr ""
#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442
msgid ""
"Set position of the fade out effect begins. Set this to 0 to disable fade "
"out effect. default is 46"
msgstr ""
#: target/out/prefPages/widgets.js:304
msgid "Auto hide"
msgstr ""
#: target/out/prefPages/widgets.js:305
msgid "Hide the Notifications widget when have no notifications"
msgstr ""
#: target/out/prefPages/widgets.js:311
msgid "Use native controls"
msgstr ""
#: target/out/prefPages/widgets.js:312
msgid "Use native dnd switch and clear button"
msgstr ""
#: target/out/prefPages/widgets.js:319
msgid ""
"Remove shadow from notification message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427
msgid "Show scrollbar"
msgstr ""
#: target/out/prefPages/widgets.js:326
msgid "Show scrollbar on message list"
msgstr ""
#: target/out/prefPages/widgets.js:334
msgid "Weather Widget"
msgstr ""
#: target/out/prefPages/widgets.js:339
msgid "Turn on to make the weather widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:344
msgid "Make weather widget smaller"
msgstr ""
#: target/out/prefPages/widgets.js:351
msgid ""
"Remove shadow from weather widget\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:357
msgid "Click command"
msgstr ""
#: target/out/prefPages/widgets.js:363
msgid "Show location"
msgstr ""
#: target/out/prefPages/widgets.js:364
msgid "Show the location label on header"
msgstr ""
#: target/out/prefPages/widgets.js:373
msgid "Forecast interval"
msgstr ""
#: target/out/prefPages/widgets.js:374
msgid "Adjust forecast interval in hour"
msgstr ""
#: target/out/prefPages/widgets.js:381
msgid "Max forecasts"
msgstr ""
#: target/out/prefPages/widgets.js:382
msgid "Adjust max forecasts"
msgstr ""
#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456
msgid "Volume mixer Widget"
msgstr ""
#: target/out/prefPages/widgets.js:393
msgid ""
"Turn on to make the volume mixer widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:397
msgid "Label text"
msgstr ""
#: target/out/prefPages/widgets.js:398
msgid "Choose label above slider text source"
msgstr ""
#: target/out/prefPages/widgets.js:400
msgid "Both"
msgstr ""
#: target/out/prefPages/widgets.js:401
msgid "Title"
msgstr ""
#: target/out/prefPages/widgets.js:402
msgid "Description"
msgstr ""
#: target/out/prefPages/widgets.js:403
msgid "None"
msgstr ""
#: target/out/prefPages/widgets.js:411
msgid "Label opacity"
msgstr ""
#: target/out/prefPages/widgets.js:412
msgid ""
"Adjust label opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/widgets.js:419
#, javascript-format
msgid ""
"Set maximum height of the Volume mixer widget, default is %d. Set this to 0 "
"to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:428
msgid "Show scrollbar on mixer list"
msgstr ""
#: target/out/prefPages/widgets.js:434
msgid "Show stream icon"
msgstr ""
#: target/out/prefPages/widgets.js:435
msgid "Show stream icon above mixer sliders"
msgstr ""
#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458
msgid "Attach to output slider"
msgstr ""
#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459
msgid ""
"Attach volume mixer menu button to output slider. Use if you prefer compact "
"layout"
msgstr ""
#: target/out/prefPages/widgets.js:468
msgid "Menu icon"
msgstr ""
#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32
msgid "About"
msgstr ""
#: target/out/prefPages/about.js:33
msgid "Common extension informations"
msgstr ""
#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40
msgid "Changelogs"
msgstr ""
#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41
msgid "View the change history for this extension"
msgstr ""
#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57
msgid "License of codes"
msgstr ""
#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65
#: target/out/prefPages/about.js:69
msgid "Contributors"
msgstr ""
#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70
msgid "The creators of this extension"
msgstr ""
#: target/out/prefPages/about.js:74
msgid "More contributors"
msgstr ""
#: target/out/prefPages/about.js:75
msgid "See more contributors on github"
msgstr ""
#: target/out/prefPages/about.js:85
msgid "Link"
msgstr ""
#: target/out/prefPages/about.js:86
msgid "External links about this extension"
msgstr ""
#: target/out/prefPages/about.js:90
msgid "Donate via github sponsors"
msgstr ""
#: target/out/prefPages/about.js:91
msgid "Support development!"
msgstr ""
#: target/out/prefPages/about.js:97
msgid "Rate and comment the extension!"
msgstr ""
#: target/out/prefPages/about.js:102
msgid "Github Repository"
msgstr ""
#: target/out/prefPages/about.js:103
msgid ""
"Add Star on Repository is helping me a lot!\n"
"Please, if you found bug from this extension, you can make issue to make me "
"know that!\n"
"Or, you can create PR with wonderful features!"
msgstr ""
#: target/out/prefPages/about.js:109
msgid "Add translation to this extension!"
msgstr ""
#: target/out/prefPages/about.js:115
msgid "Debug"
msgstr ""
#: target/out/prefPages/about.js:116
msgid "Extension debugging options"
msgstr ""
#: target/out/prefPages/about.js:120
msgid "Expose environment"
msgstr ""
#: target/out/prefPages/about.js:121
msgid "Expose extension environment to globalThis.qst"
msgstr ""
#: target/out/prefPages/about.js:126
msgid "Show layout border"
msgstr ""
#: target/out/prefPages/about.js:127
msgid "Show layout borders on Quick Settings"
msgstr ""
#: target/out/prefPages/about.js:132
msgid "Log level"
msgstr ""
#: target/out/prefPages/about.js:135
msgid "none"
msgstr ""
#: target/out/prefPages/about.js:136
msgid "error"
msgstr ""
#: target/out/prefPages/about.js:137
msgid "info"
msgstr ""
#: target/out/prefPages/about.js:138
msgid "debug"
msgstr ""
#: target/out/prefPages/toggles.js:12
msgid "Toggles"
msgstr ""
#: target/out/prefPages/toggles.js:19
msgid "DND Quick Toggle"
msgstr ""
#: target/out/prefPages/toggles.js:20
msgid "Turn on to add the DND quick toggle on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/toggles.js:28
msgid "DND indicator position"
msgstr ""
#: target/out/prefPages/toggles.js:29
msgid "Set DND indicator position"
msgstr ""
#: target/out/prefPages/toggles.js:33
msgid "System Tray"
msgstr ""
#: target/out/prefPages/toggles.js:34
msgid "Date Menu Button"
msgstr ""
#: target/out/prefPages/toggles.js:41
msgid "Unsafe Mode Quick Toggle"
msgstr ""
#: target/out/prefPages/toggles.js:42
msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/toggles.js:50
msgid "Save last session state"
msgstr ""
#: target/out/prefPages/toggles.js:51
msgid "Turn on to save last session unsafe state"
msgstr ""
#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141
msgid "Advanced animation style"
msgstr ""
#: target/out/prefPages/menu.js:13
msgid "Open Duration"
msgstr ""
#: target/out/prefPages/menu.js:14
msgid "Open animation duration in microseconds"
msgstr ""
#: target/out/prefPages/menu.js:21
msgid "Close Duration"
msgstr ""
#: target/out/prefPages/menu.js:22
msgid "Close animation duration in microseconds"
msgstr ""
#: target/out/prefPages/menu.js:29
msgid "Grid Content Opacity"
msgstr ""
#: target/out/prefPages/menu.js:30
msgid ""
"Adjust grid content opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:37
msgid "Background Blur Radius"
msgstr ""
#: target/out/prefPages/menu.js:38
msgid ""
"Adjust background blur radius.\n"
"Set this to 0 to disable blur effect"
msgstr ""
#: target/out/prefPages/menu.js:45
msgid "Background Brightness"
msgstr ""
#: target/out/prefPages/menu.js:46
msgid ""
"Adjust background brightness.\n"
"Set this to 1000 to disable brightness control effect.\n"
"Not impacts on gnome-shell's default dim effect."
msgstr ""
#: target/out/prefPages/menu.js:53
msgid "Background Opacity"
msgstr ""
#: target/out/prefPages/menu.js:54
msgid ""
"Adjust background opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:61
msgid "Background X Scale"
msgstr ""
#: target/out/prefPages/menu.js:62
msgid "Adjust background x scale, 1000 means 1.0 scale"
msgstr ""
#: target/out/prefPages/menu.js:69
msgid "Background Y Scale"
msgstr ""
#: target/out/prefPages/menu.js:70
msgid "Adjust background y scale, 1000 means 1.0 scale"
msgstr ""
#: target/out/prefPages/menu.js:84
msgid "Menu"
msgstr ""
#: target/out/prefPages/menu.js:91
msgid "Overlay Mode"
msgstr ""
#: target/out/prefPages/menu.js:92
msgid "Display toggle, power, and sound menus as overlay"
msgstr ""
#: target/out/prefPages/menu.js:101
msgid "Overlay Width"
msgstr ""
#: target/out/prefPages/menu.js:102
msgid ""
"Adjust overlay menu width\n"
"Set this to 0 to disable adjusting"
msgstr ""
#: target/out/prefPages/menu.js:109
msgid "Overlay Animation Duration"
msgstr ""
#: target/out/prefPages/menu.js:110
msgid ""
"Custom menu open animation duration in microseconds\n"
"Set this to 0 to disable custom animation"
msgstr ""
#: target/out/prefPages/menu.js:117
msgid "Overlay Animation Style"
msgstr ""
#: target/out/prefPages/menu.js:118
msgid "Custom menu open animation style"
msgstr ""
#: target/out/prefPages/menu.js:120
msgid "Flyout"
msgstr ""
#: target/out/prefPages/menu.js:121
msgid "Dialog"
msgstr ""
#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143
msgid "Animation"
msgstr ""
#: target/out/prefPages/menu.js:131
msgid ""
"Add menu animation on toggle menu opening and closing\n"
"To get the best feel, turn on overlay mode"
msgstr ""
#: target/out/prefPages/menu.js:142
msgid "Adjust speed, blur, scale, and opacity"
msgstr ""
#: target/out/prefPages/layout.js:25
msgid "The item not found"
msgstr ""
#: target/out/prefPages/layout.js:28
msgid "No changes"
msgstr ""
#: target/out/prefPages/layout.js:31
msgid "The same item already exists"
msgstr ""
#: target/out/prefPages/layout.js:40
#, javascript-format
msgid "Properties of %s"
msgstr ""
#: target/out/prefPages/layout.js:47
msgid "Save"
msgstr ""
#: target/out/prefPages/layout.js:64
msgid "Toggle editor"
msgstr ""
#: target/out/prefPages/layout.js:84
msgid "This option requires full gnome-shell reloading"
msgstr ""
#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278
#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672
msgid "Hide"
msgstr ""
#: target/out/prefPages/layout.js:232
#, javascript-format
msgid "My item #%d"
msgstr ""
#: target/out/prefPages/layout.js:250
msgid "New Item"
msgstr ""
#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610
#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787
#: target/out/prefPages/layout.js:813
msgid "Ordering and Hiding"
msgstr ""
#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432
msgid "Friendly Name"
msgstr ""
#: target/out/prefPages/layout.js:283
msgid "Title Regex (Javascript Regex)"
msgstr ""
#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442
msgid "Constructor Name"
msgstr ""
#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448
msgid "GType Name"
msgstr ""
#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456
msgid ""
"This is the comment for easy identification in the settings list. It has no "
"effect on the behavior of the extension"
msgstr ""
#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461
msgid "Javascript constructor name"
msgstr ""
#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466
msgid ""
"GObject gtype name. You can get this value by calling "
"GObject.type_name_from_instance"
msgstr ""
#: target/out/prefPages/layout.js:342
msgid "Keyboard Backlight"
msgstr ""
#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538
msgid "Unordered items"
msgstr ""
#: target/out/prefPages/layout.js:486
msgid "Remote Access Applet"
msgstr ""
#: target/out/prefPages/layout.js:487
msgid "Camera"
msgstr ""
#: target/out/prefPages/layout.js:488
msgid "Volume Input"
msgstr ""
#: target/out/prefPages/layout.js:489
msgid "Location"
msgstr ""
#: target/out/prefPages/layout.js:490
msgid "Thunderbolt"
msgstr ""
#: target/out/prefPages/layout.js:492
msgid "Network"
msgstr ""
#: target/out/prefPages/layout.js:495
msgid "Volume Output"
msgstr ""
#: target/out/prefPages/layout.js:497
msgid "System (Battery)"
msgstr ""
#: target/out/prefPages/layout.js:618
msgid "Desktop Spacer"
msgstr ""
#: target/out/prefPages/layout.js:629
msgid "Laptop Spacer"
msgstr ""
#: target/out/prefPages/layout.js:641
msgid "Capture button"
msgstr ""
#: target/out/prefPages/layout.js:647
msgid "Settings button"
msgstr ""
#: target/out/prefPages/layout.js:653
msgid "Lock button"
msgstr ""
#: target/out/prefPages/layout.js:659
msgid "Shutdown button"
msgstr ""
#: target/out/prefPages/layout.js:665
msgid "Battery button"
msgstr ""
#: target/out/prefPages/layout.js:711
msgid "Layout"
msgstr ""
#: target/out/prefPages/layout.js:718
msgid "Quick Toggles Layout"
msgstr ""
#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734
msgid "Adjust quick toggles layout"
msgstr ""
#: target/out/prefPages/layout.js:738
msgid "Reorder and hide quick toggles"
msgstr ""
#: target/out/prefPages/layout.js:745
msgid "System Indicators"
msgstr ""
#: target/out/prefPages/layout.js:746
msgid "Adjust system indicators layout and style"
msgstr ""
#: target/out/prefPages/layout.js:751
msgid "Accent screen sharing indicator"
msgstr ""
#: target/out/prefPages/layout.js:752
msgid "Use shell accent color on screen sharing indicator"
msgstr ""
#: target/out/prefPages/layout.js:757
msgid "Accent screen recording indicator"
msgstr ""
#: target/out/prefPages/layout.js:758
msgid "Use shell accent color on screen recording indicator"
msgstr ""
#: target/out/prefPages/layout.js:763
msgid "Privacy indicators style"
msgstr ""
#: target/out/prefPages/layout.js:764
msgid "Use monochrome or shell accent color on privarcy indicators"
msgstr ""
#: target/out/prefPages/layout.js:767
msgid "Accent"
msgstr ""
#: target/out/prefPages/layout.js:768
msgid "Monochrome"
msgstr ""
#: target/out/prefPages/layout.js:777
msgid "Adjust system indicators"
msgstr ""
#: target/out/prefPages/layout.js:788
msgid "Reorder and hide system indicators"
msgstr ""
#: target/out/prefPages/layout.js:795
msgid "System Items Layout"
msgstr ""
#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815
msgid "Adjust system items layout"
msgstr ""
#: target/out/prefPages/layout.js:804
msgid "Hide layout box"
msgstr ""
#: target/out/prefPages/layout.js:805
msgid "Hide all buttons and layout box"
msgstr ""
#: target/out/prefPages/layout.js:814
msgid "Reorder and hide system items"
msgstr ""
#: target/out/prefPages/layout.js:823
msgid "Date Menu"
msgstr ""
#: target/out/prefPages/layout.js:824
msgid "Adjust Date Menu layout"
msgstr ""
#: target/out/prefPages/layout.js:828
msgid "Hide left box"
msgstr ""
#: target/out/prefPages/layout.js:829
msgid ""
"Hide the left box of the date menu, which contains notifications and media "
"control"
msgstr ""
#: target/out/prefPages/layout.js:834
msgid "Hide right box"
msgstr ""
#: target/out/prefPages/layout.js:835
msgid ""
"Hide the right box of the date menu, which contains calendar, world clock "
"and weather"
msgstr ""
#: target/out/prefPages/layout.js:840
msgid "Disable menu"
msgstr ""
#: target/out/prefPages/layout.js:841
msgid "Do not open date menu when the date menu button clicked"
msgstr ""
================================================
FILE: po/ru.po
================================================
# AUTHORS
# David Lapshin https://github.com/daudix-UFO, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-20 15:34+0000\n"
"PO-Revision-Date: 2024-01-31 13:38+0000\n"
"Last-Translator: \"Droid.SUGI\" \n"
"Language-Team: Russian \n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.2.1\n"
#: target/out/libs/prefs/components.js:57
msgid "Details"
msgstr ""
#: target/out/libs/prefs/components.js:144
msgid "This feature marked as experimental"
msgstr ""
#: target/out/libs/prefs/components.js:274
msgid "Reset to default"
msgstr ""
#: target/out/libs/prefs/components.js:512
msgid "Theme default"
msgstr ""
#: target/out/libs/prefs/components.js:853
msgid "Homepage"
msgstr ""
#: target/out/libs/prefs/components.js:859
#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49
#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56
msgid "License"
msgstr ""
#: target/out/libs/prefs/components.js:860
msgid "Loading ..."
msgstr ""
#: target/out/libs/prefs/components.js:869
msgid "Affected Files"
msgstr ""
#: target/out/libs/prefs/components.js:924
msgid "Changelog"
msgstr ""
#: target/out/libs/prefs/components.js:938
msgid "(Current)"
msgstr ""
#: target/out/libs/prefs/components.js:969
#, javascript-format
msgid "> **Date:** %s"
msgstr ""
#: target/out/libs/prefs/components.js:970
#, javascript-format
msgid "> **Git Hash:** %s"
msgstr ""
#: target/out/libs/prefs/components.js:971
#, javascript-format
msgid "> **Build Number:** %d"
msgstr ""
#: target/out/libs/prefs/components.js:1034
msgid "Padding"
msgstr ""
#: target/out/libs/prefs/components.js:1038
msgid "Top"
msgstr "Верх"
#: target/out/libs/prefs/components.js:1049
msgid "Bottom"
msgstr "Низ"
#: target/out/libs/prefs/components.js:1060
msgid "Left"
msgstr ""
#: target/out/libs/prefs/components.js:1071
msgid "Right"
msgstr ""
#: target/out/prefs.js:60
msgid "Stable"
msgstr ""
#: target/out/prefs.js:63
msgid "Development"
msgstr ""
#: target/out/prefs.js:66
msgid "Preview"
msgstr ""
#: target/out/prefs.js:69
msgid "(Github Release)"
msgstr ""
#: target/out/prefs.js:72
msgid "(Built from source)"
msgstr ""
#: target/out/features/widget/notifications.js:26
msgid "No Notifications"
msgstr "Нет уведомлений"
#: target/out/features/widget/notifications.js:58
#: target/out/features/widget/notifications.js:122
msgid "Clear"
msgstr "Очистить"
# Quick settings notifications title text
# Notifications title
#: target/out/features/widget/notifications.js:76
msgid "Notifications"
msgstr "Уведомления"
#: target/out/features/widget/notifications.js:105
#: target/out/features/toggle/dndQuickToggle.js:10
#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485
msgid "Do Not Disturb"
msgstr "Не беспокоить"
#: target/out/features/widget/media.js:118
msgid "Unknown title"
msgstr ""
#: target/out/features/widget/media.js:888
msgid "Media"
msgstr ""
#: target/out/features/widget/volumeMixer.js:105
msgid "Volume changed"
msgstr "Громкость изменена"
#: target/out/features/widget/volumeMixer.js:463
msgid "Open volumx mixer"
msgstr ""
#: target/out/features/widget/volumeMixer.js:480
msgid "Volume Mixer"
msgstr "Микшер громкости"
#: target/out/features/widget/weather.js:73
msgid "Weather"
msgstr ""
#: target/out/features/widget/weather.js:192
msgid "Location has not been set"
msgstr ""
#: target/out/features/toggle/unsafeQuickToggle.js:11
#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496
msgid "Unsafe Mode"
msgstr "Небезопасный режим"
#: target/out/prefPages/widgets.js:11
msgid "Handle radius"
msgstr ""
#: target/out/prefPages/widgets.js:12
msgid "Set this to 0 to use default radius"
msgstr ""
#: target/out/prefPages/widgets.js:18
msgid "Handle color"
msgstr ""
#: target/out/prefPages/widgets.js:36
msgid "Slider style"
msgstr ""
#: target/out/prefPages/widgets.js:39
msgid "Slim"
msgstr ""
#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766
msgid "Default"
msgstr ""
#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173
msgid "Background color"
msgstr ""
#: target/out/prefPages/widgets.js:55
msgid "Active Background color"
msgstr ""
#: target/out/prefPages/widgets.js:62
msgid "Thickness"
msgstr ""
#: target/out/prefPages/widgets.js:66
msgid "Set this to 0 to use default thickness"
msgstr ""
#: target/out/prefPages/widgets.js:76
msgid "Widgets"
msgstr ""
#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136
#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224
msgid "Media Widget"
msgstr ""
#: target/out/prefPages/widgets.js:88
msgid "Turn on to make the media widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280
#: target/out/prefPages/widgets.js:343
msgid "Compact mode"
msgstr ""
#: target/out/prefPages/widgets.js:93
msgid ""
"Make Media Controls widget smaller\n"
"Make it more similar in size to the notification message"
msgstr ""
"Сделать виджет управлением медиа меньше\n"
"Сделать его размер более схожим на уведомление"
#: target/out/prefPages/widgets.js:99
msgid "Control buttons opacity"
msgstr ""
#: target/out/prefPages/widgets.js:100
msgid "Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/widgets.js:108
msgid "Show next button"
msgstr ""
#: target/out/prefPages/widgets.js:109
msgid "Add next contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:115
msgid "Show previous button"
msgstr ""
#: target/out/prefPages/widgets.js:116
msgid "Add previous contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:122
msgid "Show pause button"
msgstr ""
#: target/out/prefPages/widgets.js:123
msgid "Add pause contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138
msgid "Show progress bar"
msgstr ""
#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139
msgid "Add progress bar under description"
msgstr ""
#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164
msgid "Gradient background"
msgstr ""
#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169
msgid ""
"Use gradient background extracted from cover image\n"
"May affect performance slightly"
msgstr ""
#: target/out/prefPages/widgets.js:174
msgid "Base background color"
msgstr ""
#: target/out/prefPages/widgets.js:182
msgid "Start opacity"
msgstr ""
#: target/out/prefPages/widgets.js:183
msgid "Adjust left side transparency, Set this to 1000 to make opaque"
msgstr ""
#: target/out/prefPages/widgets.js:190
msgid "Start color"
msgstr ""
#: target/out/prefPages/widgets.js:191
msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color"
msgstr ""
#: target/out/prefPages/widgets.js:198
msgid "End opacity"
msgstr ""
#: target/out/prefPages/widgets.js:199
msgid "Adjust right side transparency, Set this to 1000 to make opaque"
msgstr ""
#: target/out/prefPages/widgets.js:206
msgid "End color"
msgstr ""
#: target/out/prefPages/widgets.js:207
msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color"
msgstr ""
#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226
msgid "Round clip effect"
msgstr ""
#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231
msgid "Use round clip effect to make transition more natural"
msgstr ""
#: target/out/prefPages/widgets.js:234
msgid "Padding adjustment"
msgstr ""
#: target/out/prefPages/widgets.js:236
msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding"
msgstr ""
#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318
#: target/out/prefPages/widgets.js:350
msgid "Remove shadow"
msgstr ""
#: target/out/prefPages/widgets.js:254
msgid ""
"Remove shadow from media message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:260
msgid "Smooth scroll speed"
msgstr ""
#: target/out/prefPages/widgets.js:261
msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction"
msgstr ""
#: target/out/prefPages/widgets.js:271
msgid "Notifications Widget"
msgstr ""
#: target/out/prefPages/widgets.js:276
msgid "Turn on to make the notifications widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:281
msgid "Make notifications smaller"
msgstr ""
#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418
msgid "Max height"
msgstr "Максимальная высота"
#: target/out/prefPages/widgets.js:288
#, javascript-format
msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441
msgid "Fade out offset"
msgstr ""
#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442
msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46"
msgstr ""
#: target/out/prefPages/widgets.js:304
msgid "Auto hide"
msgstr ""
#: target/out/prefPages/widgets.js:305
msgid "Hide the Notifications widget when have no notifications"
msgstr "Прятать виджет уведомлений когда нет уведомлений"
#: target/out/prefPages/widgets.js:311
msgid "Use native controls"
msgstr "Использовать нативное управление"
#: target/out/prefPages/widgets.js:312
msgid "Use native dnd switch and clear button"
msgstr "Использовать встроенные кнопки Не Беспокоить и очистки"
#: target/out/prefPages/widgets.js:319
msgid ""
"Remove shadow from notification message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427
msgid "Show scrollbar"
msgstr ""
#: target/out/prefPages/widgets.js:326
msgid "Show scrollbar on message list"
msgstr ""
#: target/out/prefPages/widgets.js:334
msgid "Weather Widget"
msgstr ""
#: target/out/prefPages/widgets.js:339
msgid "Turn on to make the weather widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:344
msgid "Make weather widget smaller"
msgstr ""
#: target/out/prefPages/widgets.js:351
msgid ""
"Remove shadow from weather widget\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:357
msgid "Click command"
msgstr ""
#: target/out/prefPages/widgets.js:363
msgid "Show location"
msgstr ""
#: target/out/prefPages/widgets.js:364
msgid "Show the location label on header"
msgstr ""
#: target/out/prefPages/widgets.js:373
msgid "Forecast interval"
msgstr ""
#: target/out/prefPages/widgets.js:374
msgid "Adjust forecast interval in hour"
msgstr ""
#: target/out/prefPages/widgets.js:381
msgid "Max forecasts"
msgstr ""
#: target/out/prefPages/widgets.js:382
msgid "Adjust max forecasts"
msgstr ""
#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456
msgid "Volume mixer Widget"
msgstr ""
#: target/out/prefPages/widgets.js:393
msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:397
msgid "Label text"
msgstr ""
#: target/out/prefPages/widgets.js:398
msgid "Choose label above slider text source"
msgstr ""
#: target/out/prefPages/widgets.js:400
msgid "Both"
msgstr ""
#: target/out/prefPages/widgets.js:401
msgid "Title"
msgstr ""
#: target/out/prefPages/widgets.js:402
msgid "Description"
msgstr ""
#: target/out/prefPages/widgets.js:403
msgid "None"
msgstr ""
#: target/out/prefPages/widgets.js:411
msgid "Label opacity"
msgstr ""
#: target/out/prefPages/widgets.js:412
msgid ""
"Adjust label opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/widgets.js:419
#, javascript-format
msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:428
msgid "Show scrollbar on mixer list"
msgstr ""
#: target/out/prefPages/widgets.js:434
msgid "Show stream icon"
msgstr ""
#: target/out/prefPages/widgets.js:435
msgid "Show stream icon above mixer sliders"
msgstr ""
#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458
msgid "Attach to output slider"
msgstr ""
#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459
msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout"
msgstr ""
#: target/out/prefPages/widgets.js:468
msgid "Menu icon"
msgstr ""
#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32
msgid "About"
msgstr "О расширении"
#: target/out/prefPages/about.js:33
msgid "Common extension informations"
msgstr ""
#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40
msgid "Changelogs"
msgstr ""
#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41
msgid "View the change history for this extension"
msgstr ""
#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57
msgid "License of codes"
msgstr ""
#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65
#: target/out/prefPages/about.js:69
msgid "Contributors"
msgstr ""
#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70
msgid "The creators of this extension"
msgstr "Создатели этого расширения"
#: target/out/prefPages/about.js:74
msgid "More contributors"
msgstr ""
#: target/out/prefPages/about.js:75
msgid "See more contributors on github"
msgstr ""
#: target/out/prefPages/about.js:85
msgid "Link"
msgstr ""
#: target/out/prefPages/about.js:86
msgid "External links about this extension"
msgstr ""
#: target/out/prefPages/about.js:90
msgid "Donate via github sponsors"
msgstr ""
#: target/out/prefPages/about.js:91
msgid "Support development!"
msgstr "Поддержите разработку!"
#: target/out/prefPages/about.js:97
msgid "Rate and comment the extension!"
msgstr "Оцените и прокомментируйте расширение!"
#: target/out/prefPages/about.js:102
msgid "Github Repository"
msgstr "Репозиторий Github"
#: target/out/prefPages/about.js:103
msgid ""
"Add Star on Repository is helping me a lot!\n"
"Please, if you found bug from this extension, you can make issue to make me know that!\n"
"Or, you can create PR with wonderful features!"
msgstr ""
"Добавление звездочки в репозиторий нам очень помогает!\n"
"Пожалуйста, если вы нашли ошибку в этом расширении, создайте проблему, чтобы мы знали об этом!\n"
"Или вы можете создать PR с новыми функциями!"
#: target/out/prefPages/about.js:109
msgid "Add translation to this extension!"
msgstr "Добавьте перевод в это расширение!"
#: target/out/prefPages/about.js:115
msgid "Debug"
msgstr ""
#: target/out/prefPages/about.js:116
msgid "Extension debugging options"
msgstr ""
#: target/out/prefPages/about.js:120
msgid "Expose environment"
msgstr ""
#: target/out/prefPages/about.js:121
msgid "Expose extension environment to globalThis.qst"
msgstr ""
#: target/out/prefPages/about.js:126
msgid "Show layout border"
msgstr ""
#: target/out/prefPages/about.js:127
msgid "Show layout borders on Quick Settings"
msgstr ""
#: target/out/prefPages/about.js:132
msgid "Log level"
msgstr ""
#: target/out/prefPages/about.js:135
msgid "none"
msgstr ""
#: target/out/prefPages/about.js:136
msgid "error"
msgstr ""
#: target/out/prefPages/about.js:137
msgid "info"
msgstr ""
#: target/out/prefPages/about.js:138
msgid "debug"
msgstr ""
#: target/out/prefPages/toggles.js:12
msgid "Toggles"
msgstr ""
#: target/out/prefPages/toggles.js:19
msgid "DND Quick Toggle"
msgstr "Кнопка переключения DND"
#: target/out/prefPages/toggles.js:20
msgid "Turn on to add the DND quick toggle on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/toggles.js:28
msgid "DND indicator position"
msgstr ""
#: target/out/prefPages/toggles.js:29
msgid "Set DND indicator position"
msgstr ""
#: target/out/prefPages/toggles.js:33
msgid "System Tray"
msgstr ""
#: target/out/prefPages/toggles.js:34
msgid "Date Menu Button"
msgstr ""
#: target/out/prefPages/toggles.js:41
msgid "Unsafe Mode Quick Toggle"
msgstr "Кнопка переключения небезопасного режима"
#: target/out/prefPages/toggles.js:42
msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/toggles.js:50
msgid "Save last session state"
msgstr ""
#: target/out/prefPages/toggles.js:51
msgid "Turn on to save last session unsafe state"
msgstr ""
#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141
msgid "Advanced animation style"
msgstr ""
#: target/out/prefPages/menu.js:13
msgid "Open Duration"
msgstr ""
#: target/out/prefPages/menu.js:14
msgid "Open animation duration in microseconds"
msgstr ""
#: target/out/prefPages/menu.js:21
msgid "Close Duration"
msgstr ""
#: target/out/prefPages/menu.js:22
msgid "Close animation duration in microseconds"
msgstr ""
#: target/out/prefPages/menu.js:29
msgid "Grid Content Opacity"
msgstr ""
#: target/out/prefPages/menu.js:30
msgid ""
"Adjust grid content opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:37
msgid "Background Blur Radius"
msgstr ""
#: target/out/prefPages/menu.js:38
msgid ""
"Adjust background blur radius.\n"
"Set this to 0 to disable blur effect"
msgstr ""
#: target/out/prefPages/menu.js:45
msgid "Background Brightness"
msgstr ""
#: target/out/prefPages/menu.js:46
msgid ""
"Adjust background brightness.\n"
"Set this to 1000 to disable brightness control effect.\n"
"Not impacts on gnome-shell's default dim effect."
msgstr ""
#: target/out/prefPages/menu.js:53
msgid "Background Opacity"
msgstr ""
#: target/out/prefPages/menu.js:54
msgid ""
"Adjust background opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:61
msgid "Background X Scale"
msgstr ""
#: target/out/prefPages/menu.js:62
msgid "Adjust background x scale, 1000 means 1.0 scale"
msgstr ""
#: target/out/prefPages/menu.js:69
msgid "Background Y Scale"
msgstr ""
#: target/out/prefPages/menu.js:70
msgid "Adjust background y scale, 1000 means 1.0 scale"
msgstr ""
#: target/out/prefPages/menu.js:84
msgid "Menu"
msgstr ""
#: target/out/prefPages/menu.js:91
msgid "Overlay Mode"
msgstr ""
#: target/out/prefPages/menu.js:92
msgid "Display toggle, power, and sound menus as overlay"
msgstr ""
#: target/out/prefPages/menu.js:101
msgid "Overlay Width"
msgstr ""
#: target/out/prefPages/menu.js:102
msgid ""
"Adjust overlay menu width\n"
"Set this to 0 to disable adjusting"
msgstr ""
#: target/out/prefPages/menu.js:109
msgid "Overlay Animation Duration"
msgstr ""
#: target/out/prefPages/menu.js:110
msgid ""
"Custom menu open animation duration in microseconds\n"
"Set this to 0 to disable custom animation"
msgstr ""
#: target/out/prefPages/menu.js:117
msgid "Overlay Animation Style"
msgstr ""
#: target/out/prefPages/menu.js:118
msgid "Custom menu open animation style"
msgstr ""
#: target/out/prefPages/menu.js:120
msgid "Flyout"
msgstr ""
#: target/out/prefPages/menu.js:121
msgid "Dialog"
msgstr ""
#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143
msgid "Animation"
msgstr ""
#: target/out/prefPages/menu.js:131
msgid ""
"Add menu animation on toggle menu opening and closing\n"
"To get the best feel, turn on overlay mode"
msgstr ""
#: target/out/prefPages/menu.js:142
msgid "Adjust speed, blur, scale, and opacity"
msgstr ""
#: target/out/prefPages/layout.js:25
msgid "The item not found"
msgstr ""
#: target/out/prefPages/layout.js:28
msgid "No changes"
msgstr ""
#: target/out/prefPages/layout.js:31
msgid "The same item already exists"
msgstr ""
#: target/out/prefPages/layout.js:40
#, javascript-format
msgid "Properties of %s"
msgstr ""
#: target/out/prefPages/layout.js:47
msgid "Save"
msgstr ""
#: target/out/prefPages/layout.js:64
msgid "Toggle editor"
msgstr ""
#: target/out/prefPages/layout.js:84
msgid "This option requires full gnome-shell reloading"
msgstr ""
#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278
#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672
msgid "Hide"
msgstr ""
#: target/out/prefPages/layout.js:232
#, javascript-format
msgid "My item #%d"
msgstr ""
#: target/out/prefPages/layout.js:250
msgid "New Item"
msgstr ""
#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610
#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787
#: target/out/prefPages/layout.js:813
msgid "Ordering and Hiding"
msgstr ""
#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432
msgid "Friendly Name"
msgstr ""
#: target/out/prefPages/layout.js:283
msgid "Title Regex (Javascript Regex)"
msgstr ""
#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442
msgid "Constructor Name"
msgstr ""
#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448
msgid "GType Name"
msgstr ""
#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456
msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension"
msgstr ""
#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461
msgid "Javascript constructor name"
msgstr ""
#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466
msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance"
msgstr ""
#: target/out/prefPages/layout.js:342
msgid "Keyboard Backlight"
msgstr ""
#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538
msgid "Unordered items"
msgstr ""
#: target/out/prefPages/layout.js:486
msgid "Remote Access Applet"
msgstr ""
#: target/out/prefPages/layout.js:487
msgid "Camera"
msgstr ""
#: target/out/prefPages/layout.js:488
msgid "Volume Input"
msgstr ""
#: target/out/prefPages/layout.js:489
msgid "Location"
msgstr ""
#: target/out/prefPages/layout.js:490
msgid "Thunderbolt"
msgstr ""
#: target/out/prefPages/layout.js:492
msgid "Network"
msgstr ""
#: target/out/prefPages/layout.js:495
msgid "Volume Output"
msgstr ""
#: target/out/prefPages/layout.js:497
msgid "System (Battery)"
msgstr ""
#: target/out/prefPages/layout.js:618
msgid "Desktop Spacer"
msgstr ""
#: target/out/prefPages/layout.js:629
msgid "Laptop Spacer"
msgstr ""
#: target/out/prefPages/layout.js:641
msgid "Capture button"
msgstr ""
#: target/out/prefPages/layout.js:647
msgid "Settings button"
msgstr ""
#: target/out/prefPages/layout.js:653
msgid "Lock button"
msgstr ""
#: target/out/prefPages/layout.js:659
msgid "Shutdown button"
msgstr ""
#: target/out/prefPages/layout.js:665
msgid "Battery button"
msgstr ""
#: target/out/prefPages/layout.js:711
msgid "Layout"
msgstr ""
#: target/out/prefPages/layout.js:718
msgid "Quick Toggles Layout"
msgstr ""
#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734
msgid "Adjust quick toggles layout"
msgstr ""
#: target/out/prefPages/layout.js:738
msgid "Reorder and hide quick toggles"
msgstr ""
#: target/out/prefPages/layout.js:745
msgid "System Indicators"
msgstr ""
#: target/out/prefPages/layout.js:746
msgid "Adjust system indicators layout and style"
msgstr ""
#: target/out/prefPages/layout.js:751
msgid "Accent screen sharing indicator"
msgstr ""
#: target/out/prefPages/layout.js:752
msgid "Use shell accent color on screen sharing indicator"
msgstr ""
#: target/out/prefPages/layout.js:757
msgid "Accent screen recording indicator"
msgstr ""
#: target/out/prefPages/layout.js:758
msgid "Use shell accent color on screen recording indicator"
msgstr ""
#: target/out/prefPages/layout.js:763
msgid "Privacy indicators style"
msgstr ""
#: target/out/prefPages/layout.js:764
msgid "Use monochrome or shell accent color on privarcy indicators"
msgstr ""
#: target/out/prefPages/layout.js:767
msgid "Accent"
msgstr ""
#: target/out/prefPages/layout.js:768
msgid "Monochrome"
msgstr ""
#: target/out/prefPages/layout.js:777
msgid "Adjust system indicators"
msgstr ""
#: target/out/prefPages/layout.js:788
msgid "Reorder and hide system indicators"
msgstr ""
#: target/out/prefPages/layout.js:795
msgid "System Items Layout"
msgstr ""
#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815
msgid "Adjust system items layout"
msgstr ""
#: target/out/prefPages/layout.js:804
msgid "Hide layout box"
msgstr ""
#: target/out/prefPages/layout.js:805
msgid "Hide all buttons and layout box"
msgstr ""
#: target/out/prefPages/layout.js:814
msgid "Reorder and hide system items"
msgstr ""
#: target/out/prefPages/layout.js:823
msgid "Date Menu"
msgstr ""
#: target/out/prefPages/layout.js:824
msgid "Adjust Date Menu layout"
msgstr ""
#: target/out/prefPages/layout.js:828
msgid "Hide left box"
msgstr ""
#: target/out/prefPages/layout.js:829
msgid "Hide the left box of the date menu, which contains notifications and media control"
msgstr ""
#: target/out/prefPages/layout.js:834
msgid "Hide right box"
msgstr ""
#: target/out/prefPages/layout.js:835
msgid "Hide the right box of the date menu, which contains calendar, world clock and weather"
msgstr ""
#: target/out/prefPages/layout.js:840
msgid "Disable menu"
msgstr ""
#: target/out/prefPages/layout.js:841
msgid "Do not open date menu when the date menu button clicked"
msgstr ""
#~ msgid "Donate via patreon"
#~ msgstr "Пожертвование через patreon"
#~ msgid "Other"
#~ msgstr "Другое"
#~ msgid ""
#~ "Hide notifications on date menu.\n"
#~ "*this option removes media control on date menu too*"
#~ msgstr ""
#~ "Скрыть уведомления в меню даты.\n"
#~ "*эта опция также удаляет управление мультимедиа в меню даты*"
#~ msgid "Hide media control on date menu."
#~ msgstr "Скрыть управление мультимедиа в меню даты."
#~ msgid "Links"
#~ msgstr "Ссылки"
#~ msgid "Contributor"
#~ msgstr "Участники"
#~ msgid "Add Application to filtering"
#~ msgstr "Добавить приложение в фильтрацию"
#~ msgid "Add"
#~ msgstr "Добавить"
#~ msgid "Cancel"
#~ msgstr "Отменить"
#~ msgid "Application name"
#~ msgstr "Название приложения"
#~ msgid "General"
#~ msgstr "Общие"
#~ msgid "Enchant input/output slider"
#~ msgstr "Расширенный ползунок ввода/вывода"
#~ msgid "Add more buttons"
#~ msgstr "Добавить больше кнопок"
#~ msgid "Turn on the buttons you want to add on Quick Settings"
#~ msgstr "Включите кнопки, которые вы хотите добавить в быстрые настройки"
#~ msgid "Turn on to make the DND quick toggle visible on the Quick Settings panel"
#~ msgstr "Включите, чтобы сделать кнопку DND видимой на панели быстрых настроек"
#~ msgid "Turn on to make the unsafe quick toggle visible on the Quick Settings panel"
#~ msgstr "Включите, чтобы сделать кнопку небезопасного режима видимой на панели быстрых настроек"
#~ msgid "This extension is distributed with license GPL 3+"
#~ msgstr "Это расширение распространяется под лицензией GPL 3+"
#~ msgid "excludes Third-party. Third party codes follow their license"
#~ msgstr "исключая сторонние разработки. Сторонние разработки следуют своей лицензии"
#~ msgid "Extension Version"
#~ msgstr "Версия расширения"
#~ msgid "Unknown (Built from source)"
#~ msgstr "Неизвестно (создано из исходного кода)"
#~ msgid "Third party LICENSE"
#~ msgstr "ЛИЦЕНЗИЯ третьей стороны"
#~ msgid "LICENSE OF CODES WHICH USED ON THIS EXTENSION"
#~ msgstr "ЛИЦЕНЗИИ НА РАЗРАБОТКИ, КОТОРЫЕ ИСПОЛЬЗОВАЛИСЬ В ЭТОМ РАСШИРЕНИИ"
#~ msgid "Quick Toggles"
#~ msgstr "Быстрые настройки"
#~ msgid "Fix Weather Widget Overflow"
#~ msgstr "Исправление переполнения виджета погоды"
#~ msgid "Fix overflow visual bug of weather widget in datemenu"
#~ msgstr "Исправление визуальной ошибки переполнения виджета погоды в меню даты"
#~ msgid "Remove Notifications On Date Menu"
#~ msgstr "Удалить уведомления в меню даты"
#~ msgid "Remove Media Control On Date Menu"
#~ msgstr "Удалить управление мультимедиа в меню даты"
#~ msgid "Do not adjust the border radius of contents."
#~ msgstr "Не изменяйте радиус границы контента."
#~ msgid "Don't adjust the border of messages and media controls."
#~ msgstr "Не меняйте границы сообщений и элементов управления мультимедиа."
#~ msgid "Do not remove the shadow of contents."
#~ msgstr "Не удаляйте тень контента."
#~ msgid "Don't remove the shadow of messages and media controls."
#~ msgstr "Не удаляйте тень сообщений и элементов управления мультимедиа."
#~ msgid "Buttons to remove"
#~ msgstr "Удаление кнопок"
#~ msgid "Turn on the buttons you want to remove from Quick Settings"
#~ msgstr "Включите кнопки, которые вы хотите удалить из быстрых настроек"
#~ msgid "Remove chosen buttons from quick panel"
#~ msgstr "Удалить выбранные кнопки с панели быстрого доступа"
#~ msgid "Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover"
#~ msgstr "Форкнуто с расширения https://github.com/qwreey75/gnome-quick-settings-button-remover"
#~ msgid "This feature is unstable sometime"
#~ msgstr "Иногда эта функция работает нестабильно"
#~ msgid ""
#~ "When lock/unlock with gnome-screensaver, unexpected behavior occurs\n"
#~ "Please do not report issue about known issue, Almost duplicated\n"
#~ "Known issue:\n"
#~ " button doesn't remove after lockscreen\n"
#~ " modal get bigger after lockscreen"
#~ msgstr ""
#~ "При блокировке/разблокировке с помощью gnome-screensaver происходит неожиданное поведение\n"
#~ "Пожалуйста, не сообщайте об известной проблеме, часто дублируется\n"
#~ "Известная проблема:\n"
#~ " кнопка не убирается после блокировки экрана\n"
#~ " модальное окно становится больше после блокировки экрана"
#~ msgid "Please turn off if some bug occurred"
#~ msgstr "Пожалуйста, отключите, если произошла какая-то ошибка"
#~ msgid "Unknown"
#~ msgstr "Неизвестно"
#~ msgid " (invisible by system)"
#~ msgstr " (невидимые системой)"
#~ msgid "Show current audio output selection"
#~ msgstr "Показывать текущий аудиовыход"
#~ msgid "Always show the current audio output selection above the volume slider"
#~ msgstr "Всегда показывать текущий выбор аудиовыхода над ползунком громкости"
#~ msgid "Show current audio input selection"
#~ msgstr "Показывать текущий выбор аудиовхода"
#~ msgid "Always show the current audio input selection above the volume slider"
#~ msgstr "Всегда показывать текущий выбор аудиовхода над ползунком громкости"
#~ msgid "Always show input"
#~ msgstr "Всегда показывать ввод"
#~ msgid "Always show the audio input volume slider, even when there is no audio input stream."
#~ msgstr "Всегда показывать аудиовход над ползунком громкости, даже когда нету потока аудиовхода."
#~ msgid "Add volume mixer (PulseAudio, Pipewire)"
#~ msgstr "Добавить микшер громкости (PulseAudio, Pipewire)"
#~ msgid ""
#~ "Turn on to make the volume mixer visible\n"
#~ "Forked from https://github.com/mymindstorm/gnome-volume-mixer"
#~ msgstr ""
#~ "Включить чтобы микшер громкости был видимым\n"
#~ "Ответвление с https://github.com/mymindstorm/gnome-volume-mixer"
#~ msgid "Position"
#~ msgstr "Позиция"
#~ msgid "Set volume mixer position"
#~ msgstr "Установить позицию микшера громкости"
#~ msgid "Top (Below Output/Input slider)"
#~ msgstr "Верх (Снизу от ползунка выхода/входа)"
#~ msgid "Show stream Description"
#~ msgstr "Показывать описание потока"
#~ msgid "Show audio stream description above the slider"
#~ msgstr "Показывать описание аудиопотока надо ползунком"
#~ msgid "Show stream Icon"
#~ msgstr "Показывать иконку потока"
#~ msgid "Show application icon in front of the slider"
#~ msgstr "Показывать иконку приложения в начале ползунка"
#~ msgid "Filter applications shown in the volume mixer."
#~ msgstr "Фильтровать приложения показанные в микшере громкости."
#~ msgid "Filter Mode"
#~ msgstr "Режим фильтра"
#~ msgid "Blacklist"
#~ msgstr "Чёрный Список"
#~ msgid "Whitelist"
#~ msgstr "Белый Список"
#~ msgid "Using Javascript Regex"
#~ msgstr "Используя JavaScript Regex"
#~ msgid "Use Javascript RegExp for filtering app name or description"
#~ msgstr "Использовать JavaScript RegExp для фильтрации названия приложения или описания"
#~ msgid "Check Stream Description"
#~ msgstr "Проверять описание потока"
#~ msgid "Check Description also"
#~ msgstr "Также проверять описание"
#~ msgid "Noti&Media"
#~ msgstr "Увед&Медиа"
#~ msgid "Media Controls widget"
#~ msgstr "Виджет управлением медиа"
#~ msgid "Turn on to make the Media Control widget visible on the Quick Settings panel"
#~ msgstr "Включите чтобы сделать виджет управлением медиа видимым на панели быстрых настроек"
#~ msgid "Compact Mode"
#~ msgstr "Компакт Режим"
#~ msgid "Notification Widget"
#~ msgstr "Виджет уведомления"
#~ msgid "Turn on to make the notification widget visible on the Quick Settings panel"
#~ msgstr "Включите чтобы сделать виджет уведомления видимым на панели быстрых настроек"
#~ msgid "Set maximum height of the Notifications widget. default is 292"
#~ msgstr "Установить максимальную высоту виджета уведомлений. По умолчанию 292"
#~ msgid "Set Notifications widget position"
#~ msgstr "Установить позицию виджета уведмолений"
#~ msgid "Attach to QS panel"
#~ msgstr "Прикрепить к панели QS"
#~ msgid "Auto Hide"
#~ msgstr "Прятать автоматически"
#~ msgid "Sound Settings"
#~ msgstr "Настройки звука"
================================================
FILE: po/ta.po
================================================
#Killersparrow1
msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-20 15:34+0000\n"
"PO-Revision-Date: 2025-11-01 09:55+IST\n"
"Last-Translator: LeoDas \n"
"Language-Team: Tamil\n"
"Language: ta\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: target/out/libs/prefs/components.js:57
msgid "Details"
msgstr "விவரங்கள்"
#: target/out/libs/prefs/components.js:144
msgid "This feature marked as experimental"
msgstr "இந்தச் செயல்பாடு சோதனைக்குரியதாகக் குறிக்கப்பட்டுள்ளது"
#: target/out/libs/prefs/components.js:274
msgid "Reset to default"
msgstr "இயல்புநிலைக்கு மீட்டமை"
#: target/out/libs/prefs/components.js:512
msgid "Theme default"
msgstr "கருப்பொருள் இயல்புநிலை"
#: target/out/libs/prefs/components.js:853
msgid "Homepage"
msgstr "முகப்புப் பக்கம்"
#: target/out/libs/prefs/components.js:859
#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49
#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56
msgid "License"
msgstr "உரிமம்"
#: target/out/libs/prefs/components.js:860
msgid "Loading ..."
msgstr "ஏற்றுகிறது..."
#: target/out/libs/prefs/components.js:869
msgid "Affected Files"
msgstr "பாதிக்கப்பட்ட கோப்புகள்"
#: target/out/libs/prefs/components.js:924
msgid "Changelog"
msgstr "மாற்றப் பதிவு"
#: target/out/libs/prefs/components.js:938
msgid "(Current)"
msgstr "(தற்போதைய)"
#: target/out/libs/prefs/components.js:969
#, javascript-format
msgid "> **Date:** %s"
msgstr "> **தேதி:** %s"
#: target/out/libs/prefs/components.js:970
#, javascript-format
msgid "> **Git Hash:** %s"
msgstr "> **Git குறியீடு:** %s"
#: target/out/libs/prefs/components.js:971
#, javascript-format
msgid "> **Build Number:** %d"
msgstr "> **உருவாக்க எண்:** %d"
#: target/out/libs/prefs/components.js:1034
msgid "Padding"
msgstr "உட்புற இடைவெளி"
#: target/out/libs/prefs/components.js:1038
msgid "Top"
msgstr "மேல்"
#: target/out/libs/prefs/components.js:1049
msgid "Bottom"
msgstr "கீழ்"
#: target/out/libs/prefs/components.js:1060
msgid "Left"
msgstr "இடம்"
#: target/out/libs/prefs/components.js:1071
msgid "Right"
msgstr "வலம்"
#: target/out/prefs.js:60
msgid "Stable"
msgstr "நிலையான"
#: target/out/prefs.js:63
msgid "Development"
msgstr "வளர்ச்சி நிலை"
#: target/out/prefs.js:66
msgid "Preview"
msgstr "முன்னோட்டம்"
#: target/out/prefs.js:69
msgid "(Github Release)"
msgstr "(கிட்ஹப் வெளியீடு)"
#: target/out/prefs.js:72
msgid "(Built from source)"
msgstr "(மூலக் குறியீட்டில் இருந்து கட்டப்பட்டது)"
#: target/out/features/widget/notifications.js:26
msgid "No Notifications"
msgstr "அறிவிப்புகள் இல்லை"
#: target/out/features/widget/notifications.js:58
#: target/out/features/widget/notifications.js:122
msgid "Clear"
msgstr "அழி"
#: target/out/features/widget/notifications.js:76
msgid "Notifications"
msgstr "அறிவிப்புகள்"
#: target/out/features/widget/notifications.js:105
#: target/out/features/toggle/dndQuickToggle.js:10
#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485
msgid "Do Not Disturb"
msgstr "தொந்தரவு செய்யாதீர்"
#: target/out/features/widget/media.js:118
msgid "Unknown title"
msgstr "அறியப்படாத தலைப்பு"
#: target/out/features/widget/media.js:888
msgid "Media"
msgstr "ஊடகம்"
#: target/out/features/widget/volumeMixer.js:105
msgid "Volume changed"
msgstr "ஒலி அளவு மாற்றப்பட்டது"
#: target/out/features/widget/volumeMixer.js:463
msgid "Open volumx mixer"
msgstr "ஒலி அலவன் பெட்டியைத் திற"
#: target/out/features/widget/volumeMixer.js:480
msgid "Volume Mixer"
msgstr "ஒலி அலவன் பெட்டி"
#: target/out/features/widget/weather.js:73
msgid "Weather"
msgstr "வானிலை"
#: target/out/features/widget/weather.js:192
msgid "Location has not been set"
msgstr "இடம் அமைக்கப்படவில்லை"
#: target/out/features/toggle/unsafeQuickToggle.js:11
#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496
msgid "Unsafe Mode"
msgstr "பாதுகாப்பற்ற முறை"
#: target/out/prefPages/widgets.js:11
msgid "Handle radius"
msgstr "கைப்பிடி ஆரம்"
#: target/out/prefPages/widgets.js:12
msgid "Set this to 0 to use default radius"
msgstr "இயல்புநிலை ஆரத்தைப் பயன்படுத்த இதை 0 ஆக அமைக்கவும்"
#: target/out/prefPages/widgets.js:18
msgid "Handle color"
msgstr "கைப்பிடி வண்ணம்"
#: target/out/prefPages/widgets.js:36
msgid "Slider style"
msgstr "சறுக்குபட்டியின் நடை"
#: target/out/prefPages/widgets.js:39
msgid "Slim"
msgstr "ஒல்லி"
#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766
msgid "Default"
msgstr "இயல்புநிலை"
#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173
msgid "Background color"
msgstr "பின்புல வண்ணம்"
#: target/out/prefPages/widgets.js:55
msgid "Active Background color"
msgstr "செயலில் உள்ள பின்புல வண்ணம்"
#: target/out/prefPages/widgets.js:62
msgid "Thickness"
msgstr "தடிமன்"
#: target/out/prefPages/widgets.js:66
msgid "Set this to 0 to use default thickness"
msgstr "இயல்புநிலை தடிமன் பயன்படுத்த இதை 0 ஆக அமைக்கவும்"
#: target/out/prefPages/widgets.js:76
msgid "Widgets"
msgstr "சிறுசாளரங்கள்"
#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136
#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224
msgid "Media Widget"
msgstr "ஊடக சிறுசாளரம்"
#: target/out/prefPages/widgets.js:88
msgid "Turn on to make the media widget visible on the Quick Settings panel"
msgstr "விரைவு அமைப்புகள் பலகத்தில் ஊடகச் சிறுசாளரத்தைக் காண இதை இயக்கு"
#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280
#: target/out/prefPages/widgets.js:343
msgid "Compact mode"
msgstr "அடக்கு முறை"
#: target/out/prefPages/widgets.js:93
msgid ""
"Make Media Controls widget smaller\n"
"Make it more similar in size to the notification message"
msgstr ""
"ஊடகக் கட்டுப்பாட்டுச் சிறுசாளரத்தை சிறியதாக்குக\n"
"அறிவிப்புச் செய்தியின் அளவிற்கு ஒத்ததாக மாற்றுக"
#: target/out/prefPages/widgets.js:99
msgid "Control buttons opacity"
msgstr "கட்டுப்பாட்டு பொத்தான்களின் ஒளிபுகாமை"
#: target/out/prefPages/widgets.js:100
msgid "Set this to 255 to make opaque, and 0 to make transparent"
msgstr "ஒளிபுகா செய்ய 255 ஆகவும், வெளிப்படையாக்க 0 ஆகவும் அமைக்கவும்"
#: target/out/prefPages/widgets.js:108
msgid "Show next button"
msgstr "அடுத்த பொத்தானைக் காட்டு"
#: target/out/prefPages/widgets.js:109
msgid "Add next contorl button next to description"
msgstr "விளக்கத்திற்கு அருகில் அடுத்த கட்டுப்பாட்டு பொத்தானைச் சேர்"
#: target/out/prefPages/widgets.js:115
msgid "Show previous button"
msgstr "முந்தைய பொத்தானைக் காட்டு"
#: target/out/prefPages/widgets.js:116
msgid "Add previous contorl button next to description"
msgstr "விளக்கத்திற்கு அருகில் முந்தைய கட்டுப்பாட்டு பொத்தானைச் சேர்"
#: target/out/prefPages/widgets.js:122
msgid "Show pause button"
msgstr "இடைநிறுத்த பொத்தானைக் காட்டு"
#: target/out/prefPages/widgets.js:123
msgid "Add pause contorl button next to description"
msgstr "விளக்கத்திற்கு அருகில் இடைநிறுத்த கட்டுப்பாட்டு பொத்தானைச் சேர்"
#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138
msgid "Show progress bar"
msgstr "முன்னேற்றப் பட்டியைக் காட்டு"
#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139
msgid "Add progress bar under description"
msgstr "விளக்கத்தின் கீழ் முன்னேற்றப் பட்டியைச் சேர்"
#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164
msgid "Gradient background"
msgstr "சாய்வு பின்புலம்"
#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169
msgid ""
"Use gradient background extracted from cover image\n"
"May affect performance slightly"
msgstr ""
"அட்டைப் படத்திலிருந்து எடுக்கப்பட்ட சாய்வு பின்புலத்தைப் பயன்படுத்துக\n"
"செயல்திறனை லேசாகப் பாதிக்கலாம்"
#: target/out/prefPages/widgets.js:174
msgid "Base background color"
msgstr "அடிப்படை பின்புல வண்ணம்"
#: target/out/prefPages/widgets.js:182
msgid "Start opacity"
msgstr "தொடங்கும் ஒளிபுகாமை"
#: target/out/prefPages/widgets.js:183
msgid "Adjust left side transparency, Set this to 1000 to make opaque"
msgstr "இடது பக்க வெளிப்படைத்தன்மையைச் சரிசெய், ஒளிபுகா செய்ய இதை 1000 ஆக அமைக்கவும்"
#: target/out/prefPages/widgets.js:190
msgid "Start color"
msgstr "தொடக்க வண்ணம்"
#: target/out/prefPages/widgets.js:191
msgid ""
"Adjust left side background color mixing, Set this to 1000 to show extracted "
"color"
msgstr ""
"இடது பக்க பின்புல வண்ணக் கலவையைச் சரிசெய், எடுக்கப்பட்ட வண்ணத்தைக் காட்ட இதை 1000 ஆக அமைக்கவும்"
#: target/out/prefPages/widgets.js:198
msgid "End opacity"
msgstr "முடியும் ஒளிபுகாமை"
#: target/out/prefPages/widgets.js:199
msgid "Adjust right side transparency, Set this to 1000 to make opaque"
msgstr "வலது பக்க வெளிப்படைத்தன்மையைச் சரிசெய், ஒளிபுகா செய்ய இதை 1000 ஆக அமைக்கவும்"
#: target/out/prefPages/widgets.js:206
msgid "End color"
msgstr "முடிவு வண்ணம்"
#: target/out/prefPages/widgets.js:207
msgid ""
"Adjust right side background color mixing, Set this to 1000 to show "
"extracted color"
msgstr ""
"வலது பக்க பின்புல வண்ணக் கலவையைச் சரிசெய், எடுக்கப்பட்ட வண்ணத்தைக் காட்ட இதை 1000 ஆக அமைக்கவும்"
#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226
msgid "Round clip effect"
msgstr "வட்ட வடிவ கிளிப் விளைவு"
#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231
msgid "Use round clip effect to make transition more natural"
msgstr "மாற்றத்தை இயல்பானதாக மாற்ற வட்ட வடிவ கிளிப் விளைவைப் பயன்படுத்துக"
#: target/out/prefPages/widgets.js:234
msgid "Padding adjustment"
msgstr "உட்புற இடைவெளி சரிசெய்தல்"
#: target/out/prefPages/widgets.js:236
msgid ""
"Adjust clip effect padding, edit this if your theme has a different margin "
"or padding"
msgstr ""
"கிளிப் விளைவின் உட்புற இடைவெளியைச் சரிசெய், உங்கள் கருப்பொருளில் வேறுபட்ட விளிம்பு அல்லது உட்புற இடைவெளி இருந்தால் இதைத் திருத்து"
#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318
#: target/out/prefPages/widgets.js:350
msgid "Remove shadow"
msgstr "நிழலை நீக்குக"
#: target/out/prefPages/widgets.js:254
msgid ""
"Remove shadow from media message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
"ஊடகச் செய்தியிலிருந்து நிழலை நீக்குக\n"
"உங்கள் கருப்பொருள் தேவையற்ற நிழல்களை உருவாக்கினால் பயன்படுத்துக"
#: target/out/prefPages/widgets.js:260
msgid "Smooth scroll speed"
msgstr "மென்மையான சுருள் வேகம்"
#: target/out/prefPages/widgets.js:261
msgid ""
"Adjust trackpad and trackpoint scroll speed, negative number for invert "
"direction"
msgstr ""
"டிராக்பேட் மற்றும் டிராக்பாயிண்ட் சுருள் வேகத்தைச் சரிசெய், தலைகீழ் திசைக்கு எதிர்மறை எண்ணைப் பயன்படுத்து"
#: target/out/prefPages/widgets.js:271
msgid "Notifications Widget"
msgstr "அறிவிப்புச் சிறுசாளரம்"
#: target/out/prefPages/widgets.js:276
msgid ""
"Turn on to make the notifications widget visible on the Quick Settings panel"
msgstr "விரைவு அமைப்புகள் பலகத்தில் அறிவிப்புச் சிறுசாளரத்தைக் காண இதை இயக்கு"
#: target/out/prefPages/widgets.js:281
msgid "Make notifications smaller"
msgstr "அறிவிப்புகளை சிறியதாக்குக"
#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418
msgid "Max height"
msgstr "அதிகபட்ச உயரம்"
#: target/out/prefPages/widgets.js:288
#, javascript-format
msgid ""
"Set maximum height of the Notifications widget, default is %d. Set this to 0 "
"to disable max height"
msgstr ""
"அறிவிப்புச் சிறுசாளரத்தின் அதிகபட்ச உயரத்தை அமை, இயல்புநிலை %d. அதிகபட்ச உயரத்தை முடக்க இதை 0 ஆக அமைக்கவும்"
#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441
msgid "Fade out offset"
msgstr "மறைந்து போகும் ஆஃப்செட்"
#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442
msgid ""
"Set position of the fade out effect begins. Set this to 0 to disable fade "
"out effect. default is 46"
msgstr ""
"மறைந்து போகும் விளைவு தொடங்கும் நிலையை அமை. மறைந்து போகும் விளைவை முடக்க இதை 0 ஆக அமைக்கவும். இயல்புநிலை 46"
#: target/out/prefPages/widgets.js:304
msgid "Auto hide"
msgstr "தானாக மறை"
#: target/out/prefPages/widgets.js:305
msgid "Hide the Notifications widget when have no notifications"
msgstr "அறிவிப்புகள் இல்லாதபோது அறிவிப்புச் சிறுசாளரத்தை மறை"
#: target/out/prefPages/widgets.js:311
msgid "Use native controls"
msgstr "சொந்தக் கட்டுப்பாடுகளைப் பயன்படுத்துக"
#: target/out/prefPages/widgets.js:312
msgid "Use native dnd switch and clear button"
msgstr "சொந்தமான DND மாற்றி மற்றும் அழி பொத்தானைப் பயன்படுத்துக"
#: target/out/prefPages/widgets.js:319
msgid ""
"Remove shadow from notification message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
"அறிவிப்புச் செய்தியிலிருந்து நிழலை நீக்குக\n"
"உங்கள் கருப்பொருள் தேவையற்ற நிழல்களை உருவாக்கினால் பயன்படுத்துக"
#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427
msgid "Show scrollbar"
msgstr "சுருள் பட்டியைக் காட்டு"
#: target/out/prefPages/widgets.js:326
msgid "Show scrollbar on message list"
msgstr "செய்தி பட்டியலில் சுருள் பட்டியைக் காட்டு"
#: target/out/prefPages/widgets.js:334
msgid "Weather Widget"
msgstr "வானிலை சிறுசாளரம்"
#: target/out/prefPages/widgets.js:339
msgid "Turn on to make the weather widget visible on the Quick Settings panel"
msgstr "விரைவு அமைப்புகள் பலகத்தில் வானிலைச் சிறுசாளரத்தைக் காண இதை இயக்கு"
#: target/out/prefPages/widgets.js:344
msgid "Make weather widget smaller"
msgstr "வானிலைச் சிறுசாளரத்தை சிறியதாக்குக"
#: target/out/prefPages/widgets.js:351
msgid ""
"Remove shadow from weather widget\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
"வானிலைச் சிறுசாளரத்திலிருந்து நிழலை நீக்குக\n"
"உங்கள் கருப்பொருள் தேவையற்ற நிழல்களை உருவாக்கினால் பயன்படுத்துக"
#: target/out/prefPages/widgets.js:357
msgid "Click command"
msgstr "கிளிக் கட்டளை"
#: target/out/prefPages/widgets.js:363
msgid "Show location"
msgstr "இடத்தைக் காட்டு"
#: target/out/prefPages/widgets.js:364
msgid "Show the location label on header"
msgstr "தலைப்பில் இருப்பிட லேபிளைக் காட்டு"
#: target/out/prefPages/widgets.js:373
msgid "Forecast interval"
msgstr "முன்னறிவிப்பு இடைவெளி"
#: target/out/prefPages/widgets.js:374
msgid "Adjust forecast interval in hour"
msgstr "மணிநேரத்தில் முன்னறிவிப்பு இடைவெளியைச் சரிசெய்"
#: target/out/prefPages/widgets.js:381
msgid "Max forecasts"
msgstr "அதிகபட்ச முன்னறிவிப்புகள்"
#: target/out/prefPages/widgets.js:382
msgid "Adjust max forecasts"
msgstr "அதிகபட்ச முன்னறிவிப்புகளைச் சரிசெய்"
#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456
msgid "Volume mixer Widget"
msgstr "ஒலி அலவன் பெட்டி சிறுசாளரம்"
#: target/out/prefPages/widgets.js:393
msgid ""
"Turn on to make the volume mixer widget visible on the Quick Settings panel"
msgstr "விரைவு அமைப்புகள் பலகத்தில் ஒலி அலவன் பெட்டி சிறுசாளரத்தைக் காண இதை இயக்கு"
#: target/out/prefPages/widgets.js:397
msgid "Label text"
msgstr "லேபிள் உரை"
#: target/out/prefPages/widgets.js:398
msgid "Choose label above slider text source"
msgstr "சறுக்குபட்டியின் மேல் உள்ள லேபிள் உரை மூலத்தைத் தேர்ந்தெடு"
#: target/out/prefPages/widgets.js:400
msgid "Both"
msgstr "இரண்டும்"
#: target/out/prefPages/widgets.js:401
msgid "Title"
msgstr "தலைப்பு"
#: target/out/prefPages/widgets.js:402
msgid "Description"
msgstr "விளக்கம்"
#: target/out/prefPages/widgets.js:403
msgid "None"
msgstr "ஏதுமில்லை"
#: target/out/prefPages/widgets.js:411
msgid "Label opacity"
msgstr "லேபிள் ஒளிபுகாமை"
#: target/out/prefPages/widgets.js:412
msgid ""
"Adjust label opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
"லேபிள் ஒளிபுகாமையைச் சரிசெய்.\n"
"ஒளிபுகா செய்ய 255 ஆகவும், வெளிப்படையாக்க 0 ஆகவும் அமைக்கவும்"
#: target/out/prefPages/widgets.js:419
#, javascript-format
msgid ""
"Set maximum height of the Volume mixer widget, default is %d. Set this to 0 "
"to disable max height"
msgstr ""
"ஒலி அலவன் பெட்டி சிறுசாளரத்தின் அதிகபட்ச உயரத்தை அமை, இயல்புநிலை %d. அதிகபட்ச உயரத்தை முடக்க இதை 0 ஆக அமைக்கவும்"
#: target/out/prefPages/widgets.js:428
msgid "Show scrollbar on mixer list"
msgstr "அலவன் பட்டியலில் சுருள் பட்டியைக் காட்டு"
#: target/out/prefPages/widgets.js:434
msgid "Show stream icon"
msgstr "ஓடை ஐகானைக் காட்டு"
#: target/out/prefPages/widgets.js:435
msgid "Show stream icon above mixer sliders"
msgstr "அலவன் சறுக்குபட்டியின் மேலே ஓடை ஐகானைக் காட்டு"
#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458
msgid "Attach to output slider"
msgstr "வெளியீட்டு சறுக்குபட்டியுடன் இணை"
#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459
msgid ""
"Attach volume mixer menu button to output slider. Use if you prefer compact "
"layout"
msgstr ""
"ஒலி அலவன் பெட்டியின் பட்டி பொத்தானை வெளியீட்டு சறுக்குபட்டியுடன் இணை. நீங்கள் அடக்கமான அமைப்பை விரும்பினால் பயன்படுத்துக"
#: target/out/prefPages/widgets.js:468
msgid "Menu icon"
msgstr "பட்டி ஐகான்"
#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32
msgid "About"
msgstr "பற்றி"
#: target/out/prefPages/about.js:33
msgid "Common extension informations"
msgstr "பொதுவான நீட்டிப்புத் தகவல்கள்"
#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40
msgid "Changelogs"
msgstr "மாற்றப் பதிவுகள்"
#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41
msgid "View the change history for this extension"
msgstr "இந்த நீட்டிப்பின் மாற்ற வரலாற்றைக் காண்க"
#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57
msgid "License of codes"
msgstr "குறியீடுகளின் உரிமம்"
#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65
#: target/out/prefPages/about.js:69
msgid "Contributors"
msgstr "பங்களிப்பாளர்கள்"
#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70
msgid "The creators of this extension"
msgstr "இந்த நீட்டிப்பை உருவாக்கியவர்கள்"
#: target/out/prefPages/about.js:74
msgid "More contributors"
msgstr "மேலும் பங்களிப்பாளர்கள்"
#: target/out/prefPages/about.js:75
msgid "See more contributors on github"
msgstr "கிட்ஹப்பில் மேலும் பங்களிப்பாளர்களைக் காண்க"
#: target/out/prefPages/about.js:85
msgid "Link"
msgstr "இணைப்பு"
#: target/out/prefPages/about.js:86
msgid "External links about this extension"
msgstr "இந்த நீட்டிப்பு குறித்த வெளி இணைப்புகள்"
#: target/out/prefPages/about.js:90
msgid "Donate via github sponsors"
msgstr "கிட்ஹப் ஸ்பான்சர்கள் மூலம் நன்கொடை அளி"
#: target/out/prefPages/about.js:91
msgid "Support development!"
msgstr "வளர்ச்சிக்கு ஆதரவளி!"
#: target/out/prefPages/about.js:97
msgid "Rate and comment the extension!"
msgstr "நீட்டிப்பை மதிப்பிட்டு கருத்துத் தெரிவிக்கவும்!"
#: target/out/prefPages/about.js:102
msgid "Github Repository"
msgstr "கிட்ஹப் களஞ்சியம்"
#: target/out/prefPages/about.js:103
msgid ""
"Add Star on Repository is helping me a lot!\n"
"Please, if you found bug from this extension, you can make issue to make me "
"know that!\n"
"Or, you can create PR with wonderful features!"
msgstr ""
"களஞ்சியத்திற்கு நட்சத்திரம் சேர்ப்பது எனக்கு மிகவும் உதவுகிறது!\n"
"இந்த நீட்டிப்பில் ஏதேனும் பிழையைக் கண்டால், எனக்குத் தெரியப்படுத்த ஒரு சிக்கலை உருவாக்கலாம்!\n"
"அல்லது, நீங்கள் அற்புதமான அம்சங்களுடன் ஒரு PR ஐ உருவாக்கலாம்!"
#: target/out/prefPages/about.js:109
msgid "Add translation to this extension!"
msgstr "இந்த நீட்டிப்புக்கு மொழிபெயர்ப்பைச் சேர்!"
#: target/out/prefPages/about.js:115
msgid "Debug"
msgstr "பிழைநீக்கம்"
#: target/out/prefPages/about.js:116
msgid "Extension debugging options"
msgstr "நீட்டிப்பு பிழைநீக்க விருப்பங்கள்"
#: target/out/prefPages/about.js:120
msgid "Expose environment"
msgstr "சூழலை வெளிப்படுத்து"
#: target/out/prefPages/about.js:121
msgid "Expose extension environment to globalThis.qst"
msgstr "நீட்டிப்புச் சூழலை globalThis.qst க்கு வெளிப்படுத்து"
#: target/out/prefPages/about.js:126
msgid "Show layout border"
msgstr "அமைவு எல்லையைக் காட்டு"
#: target/out/prefPages/about.js:127
msgid "Show layout borders on Quick Settings"
msgstr "விரைவு அமைப்புகளில் அமைவு எல்லைகளைக் காட்டு"
#: target/out/prefPages/about.js:132
msgid "Log level"
msgstr "பதிவு நிலை"
#: target/out/prefPages/about.js:135
msgid "none"
msgstr "ஏதுமில்லை"
#: target/out/prefPages/about.js:136
msgid "error"
msgstr "பிழை"
#: target/out/prefPages/about.js:137
msgid "info"
msgstr "தகவல்"
#: target/out/prefPages/about.js:138
msgid "debug"
msgstr "பிழைநீக்கு"
#: target/out/prefPages/toggles.js:12
msgid "Toggles"
msgstr "நிலைமாற்றிகள்"
#: target/out/prefPages/toggles.js:19
msgid "DND Quick Toggle"
msgstr "DND விரைவு நிலைமாற்றி"
#: target/out/prefPages/toggles.js:20
msgid "Turn on to add the DND quick toggle on the Quick Settings panel"
msgstr "விரைவு அமைப்புகள் பலகத்தில் DND விரைவு நிலைமாற்றியைச் சேர்க்க இதை இயக்கு"
#: target/out/prefPages/toggles.js:28
msgid "DND indicator position"
msgstr "DND குறிக்காட்டியின் நிலை"
#: target/out/prefPages/toggles.js:29
msgid "Set DND indicator position"
msgstr "DND குறிக்காட்டியின் நிலையை அமை"
#: target/out/prefPages/toggles.js:33
msgid "System Tray"
msgstr "கணினி தட்டு"
#: target/out/prefPages/toggles.js:34
msgid "Date Menu Button"
msgstr "தேதி பட்டி பொத்தான்"
#: target/out/prefPages/toggles.js:41
msgid "Unsafe Mode Quick Toggle"
msgstr "பாதுகாப்பற்ற முறை விரைவு நிலைமாற்றி"
#: target/out/prefPages/toggles.js:42
msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel"
msgstr "விரைவு அமைப்புகள் பலகத்தில் பாதுகாப்பற்ற முறை விரைவு நிலைமாற்றியைச் சேர்க்க இதை இயக்கு"
#: target/out/prefPages/toggles.js:50
msgid "Save last session state"
msgstr "கடைசி அமர்வு நிலையைச் சேமி"
#: target/out/prefPages/toggles.js:51
msgid "Turn on to save last session unsafe state"
msgstr "கடைசி அமர்வின் பாதுகாப்பற்ற நிலையைச் சேமிக்க இதை இயக்கு"
#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141
msgid "Advanced animation style"
msgstr "மேம்பட்ட அசைவூட்ட நடை"
#: target/out/prefPages/menu.js:13
msgid "Open Duration"
msgstr "திறக்கும் நேரம்"
#: target/out/prefPages/menu.js:14
msgid "Open animation duration in microseconds"
msgstr "திறக்கும் அசைவூட்டத்தின் நேரம் மைக்ரோ விநாடிகளில்"
#: target/out/prefPages/menu.js:21
msgid "Close Duration"
msgstr "மூடும் நேரம்"
#: target/out/prefPages/menu.js:22
msgid "Close animation duration in microseconds"
msgstr "மூடும் அசைவூட்டத்தின் நேரம் மைக்ரோ விநாடிகளில்"
#: target/out/prefPages/menu.js:29
msgid "Grid Content Opacity"
msgstr "கட்டத்தின் உள்ளடக்கம் ஒளிபுகாமை"
#: target/out/prefPages/menu.js:30
msgid ""
"Adjust grid content opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
"கட்டத்தின் உள்ளடக்கம் ஒளிபுகாமையைச் சரிசெய்.\n"
"ஒளிபுகா செய்ய 255 ஆகவும், வெளிப்படையாக்க 0 ஆகவும் அமைக்கவும்"
#: target/out/prefPages/menu.js:37
msgid "Background Blur Radius"
msgstr "பின்புல மங்கல் ஆரம்"
#: target/out/prefPages/menu.js:38
msgid ""
"Adjust background blur radius.\n"
"Set this to 0 to disable blur effect"
msgstr ""
"பின்புல மங்கல் ஆரத்தைச் சரிசெய்.\n"
"மங்கல் விளைவை முடக்க இதை 0 ஆக அமைக்கவும்"
#: target/out/prefPages/menu.js:45
msgid "Background Brightness"
msgstr "பின்புல வெளிச்சம்"
#: target/out/prefPages/menu.js:46
msgid ""
"Adjust background brightness.\n"
"Set this to 1000 to disable brightness control effect.\n"
"Not impacts on gnome-shell's default dim effect."
msgstr ""
"பின்புல வெளிச்சத்தைச் சரிசெய்.\n"
"வெளிச்சக் கட்டுப்பாட்டு விளைவை முடக்க இதை 1000 ஆக அமைக்கவும்.\n"
"gnome-shell இன் இயல்புநிலை மங்கலான விளைவைப் பாதிக்காது."
#: target/out/prefPages/menu.js:53
msgid "Background Opacity"
msgstr "பின்புல ஒளிபுகாமை"
#: target/out/prefPages/menu.js:54
msgid ""
"Adjust background opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
"பின்புல ஒளிபுகாமையைச் சரிசெய்.\n"
"ஒளிபுகா செய்ய 255 ஆகவும், வெளிப்படையாக்க 0 ஆகவும் அமைக்கவும்"
#: target/out/prefPages/menu.js:61
msgid "Background X Scale"
msgstr "பின்புல X அளவு"
#: target/out/prefPages/menu.js:62
msgid "Adjust background x scale, 1000 means 1.0 scale"
msgstr "பின்புல X அளவைச் சரிசெய், 1000 என்பது 1.0 அளவைக் குறிக்கிறது"
#: target/out/prefPages/menu.js:69
msgid "Background Y Scale"
msgstr "பின்புல Y அளவு"
#: target/out/prefPages/menu.js:70
msgid "Adjust background y scale, 1000 means 1.0 scale"
msgstr "பின்புல Y அளவைச் சரிசெய், 1000 என்பது 1.0 அளவைக் குறிக்கிறது"
#: target/out/prefPages/menu.js:84
msgid "Menu"
msgstr "பட்டி"
#: target/out/prefPages/menu.js:91
msgid "Overlay Mode"
msgstr "மேல்மூடு முறை"
#: target/out/prefPages/menu.js:92
msgid "Display toggle, power, and sound menus as overlay"
msgstr "நிலைமாற்றி, பவர் மற்றும் ஒலி பட்டிகளை மேல்மூடாகக் காட்டு"
#: target/out/prefPages/menu.js:101
msgid "Overlay Width"
msgstr "மேல்மூடு அகலம்"
#: target/out/prefPages/menu.js:102
msgid ""
"Adjust overlay menu width\n"
"Set this to 0 to disable adjusting"
msgstr ""
"மேல்மூடு பட்டி அகலத்தைச் சரிசெய்\n"
"சரிசெய்வதை முடக்க இதை 0 ஆக அமைக்கவும்"
#: target/out/prefPages/menu.js:109
msgid "Overlay Animation Duration"
msgstr "மேல்மூடு அசைவூட்ட நேரம்"
#: target/out/prefPages/menu.js:110
msgid ""
"Custom menu open animation duration in microseconds\n"
"Set this to 0 to disable custom animation"
msgstr ""
"தனிப்பயன் பட்டி திறக்கும் அசைவூட்ட நேரம் மைக்ரோ விநாடிகளில்\n"
"தனிப்பயன் அசைவூட்டத்தை முடக்க இதை 0 ஆக அமைக்கவும்"
#: target/out/prefPages/menu.js:117
msgid "Overlay Animation Style"
msgstr "மேல்மூடு அசைவூட்ட நடை"
#: target/out/prefPages/menu.js:118
msgid "Custom menu open animation style"
msgstr "தனிப்பயன் பட்டி திறக்கும் அசைவூட்ட நடை"
#: target/out/prefPages/menu.js:120
msgid "Flyout"
msgstr "பறந்து செல்லல்"
#: target/out/prefPages/menu.js:121
msgid "Dialog"
msgstr "உரையாடல்"
#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143
msgid "Animation"
msgstr "அசைவூட்டம்"
#: target/out/prefPages/menu.js:131
msgid ""
"Add menu animation on toggle menu opening and closing\n"
"To get the best feel, turn on overlay mode"
msgstr ""
"நிலைமாற்றி பட்டி திறக்கும் மற்றும் மூடும்போது பட்டி அசைவூட்டத்தைச் சேர்\n"
"சிறந்த உணர்வைப் பெற, மேல்மூடு முறையை இயக்கு"
#: target/out/prefPages/menu.js:142
msgid "Adjust speed, blur, scale, and opacity"
msgstr "வேகம், மங்கல், அளவு மற்றும் ஒளிபுகாமையைச் சரிசெய்"
#: target/out/prefPages/layout.js:25
msgid "The item not found"
msgstr "பொருள் காணப்படவில்லை"
#: target/out/prefPages/layout.js:28
msgid "No changes"
msgstr "மாற்றங்கள் இல்லை"
#: target/out/prefPages/layout.js:31
msgid "The same item already exists"
msgstr "அதே பொருள் ஏற்கனவே உள்ளது"
#: target/out/prefPages/layout.js:40
#, javascript-format
msgid "Properties of %s"
msgstr "%s இன் பண்புகள்"
#: target/out/prefPages/layout.js:47
msgid "Save"
msgstr "சேமி"
#: target/out/prefPages/layout.js:64
msgid "Toggle editor"
msgstr "நிலைமாற்றி திருத்தி"
#: target/out/prefPages/layout.js:84
msgid "This option requires full gnome-shell reloading"
msgstr "இந்த விருப்பத்திற்கு முழுமையான gnome-shell மறுஏற்றம் தேவை"
#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278
#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672
msgid "Hide"
msgstr "மறை"
#: target/out/prefPages/layout.js:232
#, javascript-format
msgid "My item #%d"
msgstr "எனது பொருள் #%d"
#: target/out/prefPages/layout.js:250
msgid "New Item"
msgstr "புதிய பொருள்"
#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610
#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787
#: target/out/prefPages/layout.js:813
msgid "Ordering and Hiding"
msgstr "வரிசைப்படுத்துதல் மற்றும் மறைத்தல்"
#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432
msgid "Friendly Name"
msgstr "பயனர் பெயர்"
#: target/out/prefPages/layout.js:283
msgid "Title Regex (Javascript Regex)"
msgstr "தலைப்பு ரெஜெக்ஸ் (ஜாஸ்வா ஸ்கிரிப்ட் ரெஜெக்ஸ்)"
#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442
msgid "Constructor Name"
msgstr "கட்டுநர் பெயர்"
#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448
msgid "GType Name"
msgstr "Gவகை பெயர்"
#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456
msgid ""
"This is the comment for easy identification in the settings list. It has no "
"effect on the behavior of the extension"
msgstr ""
"இது அமைப்புகள் பட்டியலில் எளிதாக அடையாளம் காணும் கருத்து. இது நீட்டிப்பின் செயல்பாட்டில் எந்த விளைவையும் ஏற்படுத்தாது"
#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461
msgid "Javascript constructor name"
msgstr "ஜாஸ்வா ஸ்கிரிப்ட் கட்டுநர் பெயர்"
#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466
msgid ""
"GObject gtype name. You can get this value by calling "
"GObject.type_name_from_instance"
msgstr ""
"GObject gtype பெயர். GObject.type_name_from_instance ஐ அழைப்பதன் மூலம் இந்த மதிப்பை நீங்கள் பெறலாம்"
#: target/out/prefPages/layout.js:342
msgid "Keyboard Backlight"
msgstr "விசைப்பலகை பின்புற ஒளி"
#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538
msgid "Unordered items"
msgstr "வரிசைப்படுத்தப்படாத பொருள்கள்"
#: target/out/prefPages/layout.js:486
msgid "Remote Access Applet"
msgstr "தொலைநிலை அணுகல் ஆப்லெட்"
#: target/out/prefPages/layout.js:487
msgid "Camera"
msgstr "புகைப்படக் கருவி"
#: target/out/prefPages/layout.js:488
msgid "Volume Input"
msgstr "ஒலி உள்ளீடு"
#: target/out/prefPages/layout.js:489
msgid "Location"
msgstr "இருப்பிடம்"
#: target/out/prefPages/layout.js:490
msgid "Thunderbolt"
msgstr "தண்டர்போல்ட்"
#: target/out/prefPages/layout.js:492
msgid "Network"
msgstr "பிணையம்"
#: target/out/prefPages/layout.js:495
msgid "Volume Output"
msgstr "ஒலி வெளியீடு"
#: target/out/prefPages/layout.js:497
msgid "System (Battery)"
msgstr "கணினி (மின்கலம்)"
#: target/out/prefPages/layout.js:618
msgid "Desktop Spacer"
msgstr "மேசை இடைவெளி"
#: target/out/prefPages/layout.js:629
msgid "Laptop Spacer"
msgstr "மடிக்கணினி இடைவெளி"
#: target/out/prefPages/layout.js:641
msgid "Capture button"
msgstr "பிடிப்பு பொத்தான்"
#: target/out/prefPages/layout.js:647
msgid "Settings button"
msgstr "அமைப்புகள் பொத்தான்"
#: target/out/prefPages/layout.js:653
msgid "Lock button"
msgstr "பூட்டு பொத்தான்"
#: target/out/prefPages/layout.js:659
msgid "Shutdown button"
msgstr "செயல்தவிர்ப்பு பொத்தான்"
#: target/out/prefPages/layout.js:665
msgid "Battery button"
msgstr "மின்கல பொத்தான்"
#: target/out/prefPages/layout.js:711
msgid "Layout"
msgstr "அமைப்பு"
#: target/out/prefPages/layout.js:718
msgid "Quick Toggles Layout"
msgstr "விரைவு நிலைமாற்றிகள் அமைப்பு"
#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734
msgid "Adjust quick toggles layout"
msgstr "விரைவு நிலைமாற்றிகளின் அமைப்பைச் சரிசெய்"
#: target/out/prefPages/layout.js:738
msgid "Reorder and hide quick toggles"
msgstr "விரைவு நிலைமாற்றிகளை மறுவரிசைப்படுத்தி மறை"
#: target/out/prefPages/layout.js:745
msgid "System Indicators"
msgstr "கணினி குறிக்காட்டிகள்"
#: target/out/prefPages/layout.js:746
msgid "Adjust system indicators layout and style"
msgstr "கணினி குறிக்காட்டிகளின் அமைப்பையும் நடையையும் சரிசெய்"
#: target/out/prefPages/layout.js:751
msgid "Accent screen sharing indicator"
msgstr "திரைப் பகிர்வு குறிக்காட்டிக்கு உச்சரிப்பைச் சேர்"
#: target/out/prefPages/layout.js:752
msgid "Use shell accent color on screen sharing indicator"
msgstr "திரைப் பகிர்வு குறிக்காட்டியில் ஷெல் உச்சரிப்பு வண்ணத்தைப் பயன்படுத்துக"
#: target/out/prefPages/layout.js:757
msgid "Accent screen recording indicator"
msgstr "திரைப் பதிவு குறிக்காட்டிக்கு உச்சரிப்பைச் சேர்"
#: target/out/prefPages/layout.js:758
msgid "Use shell accent color on screen recording indicator"
msgstr "திரைப் பதிவு குறிக்காட்டியில் ஷெல் உச்சரிப்பு வண்ணத்தைப் பயன்படுத்துக"
#: target/out/prefPages/layout.js:763
msgid "Privacy indicators style"
msgstr "தனியுரிமைக் குறிக்காட்டிகளின் நடை"
#: target/out/prefPages/layout.js:764
msgid "Use monochrome or shell accent color on privarcy indicators"
msgstr "தனியுரிமைக் குறிக்காட்டிகளில் ஒரே வண்ண அல்லது ஷெல் உச்சரிப்பு வண்ணத்தைப் பயன்படுத்துக"
#: target/out/prefPages/layout.js:767
msgid "Accent"
msgstr "உச்சரிப்பு"
#: target/out/prefPages/layout.js:768
msgid "Monochrome"
msgstr "ஒரே வண்ணம்"
#: target/out/prefPages/layout.js:777
msgid "Adjust system indicators"
msgstr "கணினி குறிக்காட்டிகளைச் சரிசெய்"
#: target/out/prefPages/layout.js:788
msgid "Reorder and hide system indicators"
msgstr "கணினி குறிக்காட்டிகளை மறுவரிசைப்படுத்தி மறை"
#: target/out/prefPages/layout.js:795
msgid "System Items Layout"
msgstr "கணினிப் பொருட்களின் அமைப்பு"
#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815
msgid "Adjust system items layout"
msgstr "கணினிப் பொருட்களின் அமைப்பைச் சரிசெய்"
#: target/out/prefPages/layout.js:804
msgid "Hide layout box"
msgstr "அமைவு பெட்டியை மறை"
#: target/out/prefPages/layout.js:805
msgid "Hide all buttons and layout box"
msgstr "அனைத்து பொத்தான்கள் மற்றும் அமைவு பெட்டியை மறை"
#: target/out/prefPages/layout.js:814
msgid "Reorder and hide system items"
msgstr "கணினிப் பொருட்களை மறுவரிசைப்படுத்தி மறை"
#: target/out/prefPages/layout.js:823
msgid "Date Menu"
msgstr "தேதி பட்டி"
#: target/out/prefPages/layout.js:824
msgid "Adjust Date Menu layout"
msgstr "தேதி பட்டியில் அமைப்பைச் சரிசெய்"
#: target/out/prefPages/layout.js:828
msgid "Hide left box"
msgstr "இடது பெட்டியை மறை"
#: target/out/prefPages/layout.js:829
msgid ""
"Hide the left box of the date menu, which contains notifications and media "
"control"
msgstr ""
"தேதி பட்டியின் இடது பெட்டியை மறை, அதில் அறிவிப்புகள் மற்றும் ஊடகக் கட்டுப்பாடு உள்ளன"
#: target/out/prefPages/layout.js:834
msgid "Hide right box"
msgstr "வலது பெட்டியை மறை"
#: target/out/prefPages/layout.js:835
msgid ""
"Hide the right box of the date menu, which contains calendar, world clock "
"and weather"
msgstr ""
"தேதி பட்டியின் வலது பெட்டியை மறை, அதில் நாள்காட்டி, உலக கடிகாரம் மற்றும் வானிலை உள்ளன"
#: target/out/prefPages/layout.js:840
msgid "Disable menu"
msgstr "பட்டியை முடக்கு"
#: target/out/prefPages/layout.js:841
msgid "Do not open date menu when the date menu button clicked"
msgstr "தேதி பட்டி பொத்தானைக் கிளிக் செய்யும்போது தேதி பட்டியைத் திறக்க வேண்டாம்"
================================================
FILE: po/zh_Hans.po
================================================
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-20 15:34+0000\n"
"PO-Revision-Date: 2024-02-06 23:38+0000\n"
"Last-Translator: mechtifs \n"
"Language-Team: Chinese (Simplified) \n"
"Language: zh_Hans\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.2.1\n"
#: target/out/libs/prefs/components.js:57
msgid "Details"
msgstr ""
#: target/out/libs/prefs/components.js:144
msgid "This feature marked as experimental"
msgstr ""
#: target/out/libs/prefs/components.js:274
msgid "Reset to default"
msgstr ""
#: target/out/libs/prefs/components.js:512
msgid "Theme default"
msgstr ""
#: target/out/libs/prefs/components.js:853
msgid "Homepage"
msgstr ""
#: target/out/libs/prefs/components.js:859
#: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49
#: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56
msgid "License"
msgstr ""
#: target/out/libs/prefs/components.js:860
msgid "Loading ..."
msgstr ""
#: target/out/libs/prefs/components.js:869
msgid "Affected Files"
msgstr ""
#: target/out/libs/prefs/components.js:924
msgid "Changelog"
msgstr ""
#: target/out/libs/prefs/components.js:938
msgid "(Current)"
msgstr ""
#: target/out/libs/prefs/components.js:969
#, javascript-format
msgid "> **Date:** %s"
msgstr ""
#: target/out/libs/prefs/components.js:970
#, javascript-format
msgid "> **Git Hash:** %s"
msgstr ""
#: target/out/libs/prefs/components.js:971
#, javascript-format
msgid "> **Build Number:** %d"
msgstr ""
#: target/out/libs/prefs/components.js:1034
msgid "Padding"
msgstr ""
#: target/out/libs/prefs/components.js:1038
msgid "Top"
msgstr "顶端"
#: target/out/libs/prefs/components.js:1049
msgid "Bottom"
msgstr "底部"
#: target/out/libs/prefs/components.js:1060
msgid "Left"
msgstr ""
#: target/out/libs/prefs/components.js:1071
msgid "Right"
msgstr ""
#: target/out/prefs.js:60
msgid "Stable"
msgstr ""
#: target/out/prefs.js:63
msgid "Development"
msgstr ""
#: target/out/prefs.js:66
msgid "Preview"
msgstr ""
#: target/out/prefs.js:69
msgid "(Github Release)"
msgstr ""
#: target/out/prefs.js:72
msgid "(Built from source)"
msgstr ""
#: target/out/features/widget/notifications.js:26
msgid "No Notifications"
msgstr "无通知"
#: target/out/features/widget/notifications.js:58
#: target/out/features/widget/notifications.js:122
msgid "Clear"
msgstr "清除"
#: target/out/features/widget/notifications.js:76
msgid "Notifications"
msgstr "通知"
#: target/out/features/widget/notifications.js:105
#: target/out/features/toggle/dndQuickToggle.js:10
#: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485
msgid "Do Not Disturb"
msgstr "免打扰"
#: target/out/features/widget/media.js:118
msgid "Unknown title"
msgstr ""
#: target/out/features/widget/media.js:888
msgid "Media"
msgstr ""
#: target/out/features/widget/volumeMixer.js:105
msgid "Volume changed"
msgstr "音量改变"
#: target/out/features/widget/volumeMixer.js:463
msgid "Open volumx mixer"
msgstr ""
#: target/out/features/widget/volumeMixer.js:480
msgid "Volume Mixer"
msgstr "音量混合器"
#: target/out/features/widget/weather.js:73
msgid "Weather"
msgstr ""
#: target/out/features/widget/weather.js:192
msgid "Location has not been set"
msgstr ""
#: target/out/features/toggle/unsafeQuickToggle.js:11
#: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496
msgid "Unsafe Mode"
msgstr "不安全模式"
#: target/out/prefPages/widgets.js:11
msgid "Handle radius"
msgstr ""
#: target/out/prefPages/widgets.js:12
msgid "Set this to 0 to use default radius"
msgstr ""
#: target/out/prefPages/widgets.js:18
msgid "Handle color"
msgstr ""
#: target/out/prefPages/widgets.js:36
msgid "Slider style"
msgstr ""
#: target/out/prefPages/widgets.js:39
msgid "Slim"
msgstr ""
#: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766
msgid "Default"
msgstr ""
#: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173
msgid "Background color"
msgstr ""
#: target/out/prefPages/widgets.js:55
msgid "Active Background color"
msgstr ""
#: target/out/prefPages/widgets.js:62
msgid "Thickness"
msgstr ""
#: target/out/prefPages/widgets.js:66
msgid "Set this to 0 to use default thickness"
msgstr ""
#: target/out/prefPages/widgets.js:76
msgid "Widgets"
msgstr ""
#: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136
#: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224
msgid "Media Widget"
msgstr ""
#: target/out/prefPages/widgets.js:88
msgid "Turn on to make the media widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280
#: target/out/prefPages/widgets.js:343
msgid "Compact mode"
msgstr ""
#: target/out/prefPages/widgets.js:93
msgid ""
"Make Media Controls widget smaller\n"
"Make it more similar in size to the notification message"
msgstr ""
"使音频控制组件变小\n"
"使其与通知组件大小相近"
#: target/out/prefPages/widgets.js:99
msgid "Control buttons opacity"
msgstr ""
#: target/out/prefPages/widgets.js:100
msgid "Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/widgets.js:108
msgid "Show next button"
msgstr ""
#: target/out/prefPages/widgets.js:109
msgid "Add next contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:115
msgid "Show previous button"
msgstr ""
#: target/out/prefPages/widgets.js:116
msgid "Add previous contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:122
msgid "Show pause button"
msgstr ""
#: target/out/prefPages/widgets.js:123
msgid "Add pause contorl button next to description"
msgstr ""
#: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138
msgid "Show progress bar"
msgstr ""
#: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139
msgid "Add progress bar under description"
msgstr ""
#: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164
msgid "Gradient background"
msgstr ""
#: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169
msgid ""
"Use gradient background extracted from cover image\n"
"May affect performance slightly"
msgstr ""
#: target/out/prefPages/widgets.js:174
msgid "Base background color"
msgstr ""
#: target/out/prefPages/widgets.js:182
msgid "Start opacity"
msgstr ""
#: target/out/prefPages/widgets.js:183
msgid "Adjust left side transparency, Set this to 1000 to make opaque"
msgstr ""
#: target/out/prefPages/widgets.js:190
msgid "Start color"
msgstr ""
#: target/out/prefPages/widgets.js:191
msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color"
msgstr ""
#: target/out/prefPages/widgets.js:198
msgid "End opacity"
msgstr ""
#: target/out/prefPages/widgets.js:199
msgid "Adjust right side transparency, Set this to 1000 to make opaque"
msgstr ""
#: target/out/prefPages/widgets.js:206
msgid "End color"
msgstr ""
#: target/out/prefPages/widgets.js:207
msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color"
msgstr ""
#: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226
msgid "Round clip effect"
msgstr ""
#: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231
msgid "Use round clip effect to make transition more natural"
msgstr ""
#: target/out/prefPages/widgets.js:234
msgid "Padding adjustment"
msgstr ""
#: target/out/prefPages/widgets.js:236
msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding"
msgstr ""
#: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318
#: target/out/prefPages/widgets.js:350
msgid "Remove shadow"
msgstr ""
#: target/out/prefPages/widgets.js:254
msgid ""
"Remove shadow from media message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:260
msgid "Smooth scroll speed"
msgstr ""
#: target/out/prefPages/widgets.js:261
msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction"
msgstr ""
#: target/out/prefPages/widgets.js:271
msgid "Notifications Widget"
msgstr ""
#: target/out/prefPages/widgets.js:276
msgid "Turn on to make the notifications widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:281
msgid "Make notifications smaller"
msgstr ""
#: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418
msgid "Max height"
msgstr "最大高度"
#: target/out/prefPages/widgets.js:288
#, javascript-format
msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441
msgid "Fade out offset"
msgstr ""
#: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442
msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46"
msgstr ""
#: target/out/prefPages/widgets.js:304
msgid "Auto hide"
msgstr ""
#: target/out/prefPages/widgets.js:305
msgid "Hide the Notifications widget when have no notifications"
msgstr "当没有通知时,隐藏通知组件"
#: target/out/prefPages/widgets.js:311
msgid "Use native controls"
msgstr "使用原始风格控制"
#: target/out/prefPages/widgets.js:312
msgid "Use native dnd switch and clear button"
msgstr "使用原始风格免打扰控制开关及清除按钮"
#: target/out/prefPages/widgets.js:319
msgid ""
"Remove shadow from notification message\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427
msgid "Show scrollbar"
msgstr ""
#: target/out/prefPages/widgets.js:326
msgid "Show scrollbar on message list"
msgstr ""
#: target/out/prefPages/widgets.js:334
msgid "Weather Widget"
msgstr ""
#: target/out/prefPages/widgets.js:339
msgid "Turn on to make the weather widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:344
msgid "Make weather widget smaller"
msgstr ""
#: target/out/prefPages/widgets.js:351
msgid ""
"Remove shadow from weather widget\n"
"Use if your theme creates unnecessary shadows"
msgstr ""
#: target/out/prefPages/widgets.js:357
msgid "Click command"
msgstr ""
#: target/out/prefPages/widgets.js:363
msgid "Show location"
msgstr ""
#: target/out/prefPages/widgets.js:364
msgid "Show the location label on header"
msgstr ""
#: target/out/prefPages/widgets.js:373
msgid "Forecast interval"
msgstr ""
#: target/out/prefPages/widgets.js:374
msgid "Adjust forecast interval in hour"
msgstr ""
#: target/out/prefPages/widgets.js:381
msgid "Max forecasts"
msgstr ""
#: target/out/prefPages/widgets.js:382
msgid "Adjust max forecasts"
msgstr ""
#: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456
msgid "Volume mixer Widget"
msgstr ""
#: target/out/prefPages/widgets.js:393
msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/widgets.js:397
msgid "Label text"
msgstr ""
#: target/out/prefPages/widgets.js:398
msgid "Choose label above slider text source"
msgstr ""
#: target/out/prefPages/widgets.js:400
msgid "Both"
msgstr ""
#: target/out/prefPages/widgets.js:401
msgid "Title"
msgstr ""
#: target/out/prefPages/widgets.js:402
msgid "Description"
msgstr ""
#: target/out/prefPages/widgets.js:403
msgid "None"
msgstr ""
#: target/out/prefPages/widgets.js:411
msgid "Label opacity"
msgstr ""
#: target/out/prefPages/widgets.js:412
msgid ""
"Adjust label opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/widgets.js:419
#, javascript-format
msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height"
msgstr ""
#: target/out/prefPages/widgets.js:428
msgid "Show scrollbar on mixer list"
msgstr ""
#: target/out/prefPages/widgets.js:434
msgid "Show stream icon"
msgstr ""
#: target/out/prefPages/widgets.js:435
msgid "Show stream icon above mixer sliders"
msgstr ""
#: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458
msgid "Attach to output slider"
msgstr ""
#: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459
msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout"
msgstr ""
#: target/out/prefPages/widgets.js:468
msgid "Menu icon"
msgstr ""
#: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32
msgid "About"
msgstr "关于"
#: target/out/prefPages/about.js:33
msgid "Common extension informations"
msgstr ""
#: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40
msgid "Changelogs"
msgstr ""
#: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41
msgid "View the change history for this extension"
msgstr ""
#: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57
msgid "License of codes"
msgstr ""
#: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65
#: target/out/prefPages/about.js:69
msgid "Contributors"
msgstr ""
#: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70
msgid "The creators of this extension"
msgstr "本拓展的主要开发者"
#: target/out/prefPages/about.js:74
msgid "More contributors"
msgstr ""
#: target/out/prefPages/about.js:75
msgid "See more contributors on github"
msgstr ""
#: target/out/prefPages/about.js:85
msgid "Link"
msgstr ""
#: target/out/prefPages/about.js:86
msgid "External links about this extension"
msgstr ""
#: target/out/prefPages/about.js:90
msgid "Donate via github sponsors"
msgstr ""
#: target/out/prefPages/about.js:91
msgid "Support development!"
msgstr "支持开发工作!"
#: target/out/prefPages/about.js:97
msgid "Rate and comment the extension!"
msgstr "对本拓展进行评分及评论!"
#: target/out/prefPages/about.js:102
msgid "Github Repository"
msgstr "GitHub 代码仓库"
#: target/out/prefPages/about.js:103
msgid ""
"Add Star on Repository is helping me a lot!\n"
"Please, if you found bug from this extension, you can make issue to make me know that!\n"
"Or, you can create PR with wonderful features!"
msgstr ""
"欢迎为本代码仓库添加星标!\n"
"如果你在使用本拓展的过程中发现任何问题,你可以提交 Issue 来让我了解详情!\n"
"或者,你也可以提交 PR 来增加更多的功能!"
#: target/out/prefPages/about.js:109
msgid "Add translation to this extension!"
msgstr "将本拓展翻译为其他语言!"
#: target/out/prefPages/about.js:115
msgid "Debug"
msgstr ""
#: target/out/prefPages/about.js:116
msgid "Extension debugging options"
msgstr ""
#: target/out/prefPages/about.js:120
msgid "Expose environment"
msgstr ""
#: target/out/prefPages/about.js:121
msgid "Expose extension environment to globalThis.qst"
msgstr ""
#: target/out/prefPages/about.js:126
msgid "Show layout border"
msgstr ""
#: target/out/prefPages/about.js:127
msgid "Show layout borders on Quick Settings"
msgstr ""
#: target/out/prefPages/about.js:132
msgid "Log level"
msgstr ""
#: target/out/prefPages/about.js:135
msgid "none"
msgstr ""
#: target/out/prefPages/about.js:136
msgid "error"
msgstr ""
#: target/out/prefPages/about.js:137
msgid "info"
msgstr ""
#: target/out/prefPages/about.js:138
msgid "debug"
msgstr ""
#: target/out/prefPages/toggles.js:12
msgid "Toggles"
msgstr ""
#: target/out/prefPages/toggles.js:19
msgid "DND Quick Toggle"
msgstr "免打扰快捷开关"
#: target/out/prefPages/toggles.js:20
msgid "Turn on to add the DND quick toggle on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/toggles.js:28
msgid "DND indicator position"
msgstr ""
#: target/out/prefPages/toggles.js:29
msgid "Set DND indicator position"
msgstr ""
#: target/out/prefPages/toggles.js:33
msgid "System Tray"
msgstr ""
#: target/out/prefPages/toggles.js:34
msgid "Date Menu Button"
msgstr ""
#: target/out/prefPages/toggles.js:41
msgid "Unsafe Mode Quick Toggle"
msgstr "不安全模式快捷开关"
#: target/out/prefPages/toggles.js:42
msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel"
msgstr ""
#: target/out/prefPages/toggles.js:50
msgid "Save last session state"
msgstr ""
#: target/out/prefPages/toggles.js:51
msgid "Turn on to save last session unsafe state"
msgstr ""
#: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141
msgid "Advanced animation style"
msgstr ""
#: target/out/prefPages/menu.js:13
msgid "Open Duration"
msgstr ""
#: target/out/prefPages/menu.js:14
msgid "Open animation duration in microseconds"
msgstr ""
#: target/out/prefPages/menu.js:21
msgid "Close Duration"
msgstr ""
#: target/out/prefPages/menu.js:22
msgid "Close animation duration in microseconds"
msgstr ""
#: target/out/prefPages/menu.js:29
msgid "Grid Content Opacity"
msgstr ""
#: target/out/prefPages/menu.js:30
msgid ""
"Adjust grid content opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:37
msgid "Background Blur Radius"
msgstr ""
#: target/out/prefPages/menu.js:38
msgid ""
"Adjust background blur radius.\n"
"Set this to 0 to disable blur effect"
msgstr ""
#: target/out/prefPages/menu.js:45
msgid "Background Brightness"
msgstr ""
#: target/out/prefPages/menu.js:46
msgid ""
"Adjust background brightness.\n"
"Set this to 1000 to disable brightness control effect.\n"
"Not impacts on gnome-shell's default dim effect."
msgstr ""
#: target/out/prefPages/menu.js:53
msgid "Background Opacity"
msgstr ""
#: target/out/prefPages/menu.js:54
msgid ""
"Adjust background opacity.\n"
"Set this to 255 to make opaque, and 0 to make transparent"
msgstr ""
#: target/out/prefPages/menu.js:61
msgid "Background X Scale"
msgstr ""
#: target/out/prefPages/menu.js:62
msgid "Adjust background x scale, 1000 means 1.0 scale"
msgstr ""
#: target/out/prefPages/menu.js:69
msgid "Background Y Scale"
msgstr ""
#: target/out/prefPages/menu.js:70
msgid "Adjust background y scale, 1000 means 1.0 scale"
msgstr ""
#: target/out/prefPages/menu.js:84
msgid "Menu"
msgstr ""
#: target/out/prefPages/menu.js:91
msgid "Overlay Mode"
msgstr ""
#: target/out/prefPages/menu.js:92
msgid "Display toggle, power, and sound menus as overlay"
msgstr ""
#: target/out/prefPages/menu.js:101
msgid "Overlay Width"
msgstr ""
#: target/out/prefPages/menu.js:102
msgid ""
"Adjust overlay menu width\n"
"Set this to 0 to disable adjusting"
msgstr ""
#: target/out/prefPages/menu.js:109
msgid "Overlay Animation Duration"
msgstr ""
#: target/out/prefPages/menu.js:110
msgid ""
"Custom menu open animation duration in microseconds\n"
"Set this to 0 to disable custom animation"
msgstr ""
#: target/out/prefPages/menu.js:117
msgid "Overlay Animation Style"
msgstr ""
#: target/out/prefPages/menu.js:118
msgid "Custom menu open animation style"
msgstr ""
#: target/out/prefPages/menu.js:120
msgid "Flyout"
msgstr ""
#: target/out/prefPages/menu.js:121
msgid "Dialog"
msgstr ""
#: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143
msgid "Animation"
msgstr ""
#: target/out/prefPages/menu.js:131
msgid ""
"Add menu animation on toggle menu opening and closing\n"
"To get the best feel, turn on overlay mode"
msgstr ""
#: target/out/prefPages/menu.js:142
msgid "Adjust speed, blur, scale, and opacity"
msgstr ""
#: target/out/prefPages/layout.js:25
msgid "The item not found"
msgstr ""
#: target/out/prefPages/layout.js:28
msgid "No changes"
msgstr ""
#: target/out/prefPages/layout.js:31
msgid "The same item already exists"
msgstr ""
#: target/out/prefPages/layout.js:40
#, javascript-format
msgid "Properties of %s"
msgstr ""
#: target/out/prefPages/layout.js:47
msgid "Save"
msgstr ""
#: target/out/prefPages/layout.js:64
msgid "Toggle editor"
msgstr ""
#: target/out/prefPages/layout.js:84
msgid "This option requires full gnome-shell reloading"
msgstr ""
#: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278
#: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672
msgid "Hide"
msgstr ""
#: target/out/prefPages/layout.js:232
#, javascript-format
msgid "My item #%d"
msgstr ""
#: target/out/prefPages/layout.js:250
msgid "New Item"
msgstr ""
#: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610
#: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787
#: target/out/prefPages/layout.js:813
msgid "Ordering and Hiding"
msgstr ""
#: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432
msgid "Friendly Name"
msgstr ""
#: target/out/prefPages/layout.js:283
msgid "Title Regex (Javascript Regex)"
msgstr ""
#: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442
msgid "Constructor Name"
msgstr ""
#: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448
msgid "GType Name"
msgstr ""
#: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456
msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension"
msgstr ""
#: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461
msgid "Javascript constructor name"
msgstr ""
#: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466
msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance"
msgstr ""
#: target/out/prefPages/layout.js:342
msgid "Keyboard Backlight"
msgstr ""
#: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538
msgid "Unordered items"
msgstr ""
#: target/out/prefPages/layout.js:486
msgid "Remote Access Applet"
msgstr ""
#: target/out/prefPages/layout.js:487
msgid "Camera"
msgstr ""
#: target/out/prefPages/layout.js:488
msgid "Volume Input"
msgstr ""
#: target/out/prefPages/layout.js:489
msgid "Location"
msgstr ""
#: target/out/prefPages/layout.js:490
msgid "Thunderbolt"
msgstr ""
#: target/out/prefPages/layout.js:492
msgid "Network"
msgstr ""
#: target/out/prefPages/layout.js:495
msgid "Volume Output"
msgstr ""
#: target/out/prefPages/layout.js:497
msgid "System (Battery)"
msgstr ""
#: target/out/prefPages/layout.js:618
msgid "Desktop Spacer"
msgstr ""
#: target/out/prefPages/layout.js:629
msgid "Laptop Spacer"
msgstr ""
#: target/out/prefPages/layout.js:641
msgid "Capture button"
msgstr ""
#: target/out/prefPages/layout.js:647
msgid "Settings button"
msgstr ""
#: target/out/prefPages/layout.js:653
msgid "Lock button"
msgstr ""
#: target/out/prefPages/layout.js:659
msgid "Shutdown button"
msgstr ""
#: target/out/prefPages/layout.js:665
msgid "Battery button"
msgstr ""
#: target/out/prefPages/layout.js:711
msgid "Layout"
msgstr ""
#: target/out/prefPages/layout.js:718
msgid "Quick Toggles Layout"
msgstr ""
#: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734
msgid "Adjust quick toggles layout"
msgstr ""
#: target/out/prefPages/layout.js:738
msgid "Reorder and hide quick toggles"
msgstr ""
#: target/out/prefPages/layout.js:745
msgid "System Indicators"
msgstr ""
#: target/out/prefPages/layout.js:746
msgid "Adjust system indicators layout and style"
msgstr ""
#: target/out/prefPages/layout.js:751
msgid "Accent screen sharing indicator"
msgstr ""
#: target/out/prefPages/layout.js:752
msgid "Use shell accent color on screen sharing indicator"
msgstr ""
#: target/out/prefPages/layout.js:757
msgid "Accent screen recording indicator"
msgstr ""
#: target/out/prefPages/layout.js:758
msgid "Use shell accent color on screen recording indicator"
msgstr ""
#: target/out/prefPages/layout.js:763
msgid "Privacy indicators style"
msgstr ""
#: target/out/prefPages/layout.js:764
msgid "Use monochrome or shell accent color on privarcy indicators"
msgstr ""
#: target/out/prefPages/layout.js:767
msgid "Accent"
msgstr ""
#: target/out/prefPages/layout.js:768
msgid "Monochrome"
msgstr ""
#: target/out/prefPages/layout.js:777
msgid "Adjust system indicators"
msgstr ""
#: target/out/prefPages/layout.js:788
msgid "Reorder and hide system indicators"
msgstr ""
#: target/out/prefPages/layout.js:795
msgid "System Items Layout"
msgstr ""
#: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815
msgid "Adjust system items layout"
msgstr ""
#: target/out/prefPages/layout.js:804
msgid "Hide layout box"
msgstr ""
#: target/out/prefPages/layout.js:805
msgid "Hide all buttons and layout box"
msgstr ""
#: target/out/prefPages/layout.js:814
msgid "Reorder and hide system items"
msgstr ""
#: target/out/prefPages/layout.js:823
msgid "Date Menu"
msgstr ""
#: target/out/prefPages/layout.js:824
msgid "Adjust Date Menu layout"
msgstr ""
#: target/out/prefPages/layout.js:828
msgid "Hide left box"
msgstr ""
#: target/out/prefPages/layout.js:829
msgid "Hide the left box of the date menu, which contains notifications and media control"
msgstr ""
#: target/out/prefPages/layout.js:834
msgid "Hide right box"
msgstr ""
#: target/out/prefPages/layout.js:835
msgid "Hide the right box of the date menu, which contains calendar, world clock and weather"
msgstr ""
#: target/out/prefPages/layout.js:840
msgid "Disable menu"
msgstr ""
#: target/out/prefPages/layout.js:841
msgid "Do not open date menu when the date menu button clicked"
msgstr ""
#~ msgid "Donate via patreon"
#~ msgstr "在 Patreon 上捐赠"
#~ msgid "Set maximum height of the Notifications widget. default is 292"
#~ msgstr "设置通知组件的最大高度。默认为 292"
#~ msgid "Other"
#~ msgstr "其他"
#~ msgid ""
#~ "Hide notifications on date menu.\n"
#~ "*this option removes media control on date menu too*"
#~ msgstr ""
#~ "隐藏日期菜单中的通知组件。\n"
#~ "*此选项也会移除日期菜单中的音乐控制组件*"
#~ msgid "Hide media control on date menu."
#~ msgstr "隐藏日期菜单中的音乐组件。"
#~ msgid "Sound Settings"
#~ msgstr "声音设置"
#~ msgid "Notification Widget"
#~ msgstr "通知组件"
#~ msgid "Turn on to make the notification widget visible on the Quick Settings panel"
#~ msgstr "启用以令通知组件在快捷控制面板中可见"
#~ msgid "Links"
#~ msgstr "链接"
#~ msgid "Contributor"
#~ msgstr "贡献者"
#~ msgid "Add Application to filtering"
#~ msgstr "添加应用至过滤"
#~ msgid "Add"
#~ msgstr "添加"
#~ msgid "Cancel"
#~ msgstr "取消"
#~ msgid "Application name"
#~ msgstr "应用名称"
#~ msgid "General"
#~ msgstr "通用"
#~ msgid "Enchant input/output slider"
#~ msgstr "显示输入/输出滑动控制条"
#~ msgid "Show current audio output selection"
#~ msgstr "显示当前音频输出选择"
#~ msgid "Always show the current audio output selection above the volume slider"
#~ msgstr "总是在音量滑动控制条上方显示当前音频输出选择"
#~ msgid "Show current audio input selection"
#~ msgstr "显示当前音频输入选择"
#~ msgid "Always show the current audio input selection above the volume slider"
#~ msgstr "总是在音量控制条上方显示当前音频输入选择"
#~ msgid "Always show input"
#~ msgstr "总是显示输入"
#~ msgid "Always show the audio input volume slider, even when there is no audio input stream."
#~ msgstr "即使在没有音频输入流的情况下,总是显示音频输入音量滑动控制条。"
#~ msgid "Add volume mixer (PulseAudio, Pipewire)"
#~ msgstr "添加音量混合器(PulseAudio、Pipewire)"
#~ msgid ""
#~ "Turn on to make the volume mixer visible\n"
#~ "Forked from https://github.com/mymindstorm/gnome-volume-mixer"
#~ msgstr ""
#~ "启用以令音量混合器可见\n"
#~ "Fork 自 https://github.com/mymindstorm/gnome-volume-mixer"
#~ msgid "Position"
#~ msgstr "位置"
#~ msgid "Set volume mixer position"
#~ msgstr "设置音量混合器位置"
#~ msgid "Top (Below Output/Input slider)"
#~ msgstr "顶端(位于输入/输出滑动控制条底部)"
#~ msgid "Show stream Description"
#~ msgstr "显示音频流描述"
#~ msgid "Show audio stream description above the slider"
#~ msgstr "在滑动控制条上方显示音频流描述"
#~ msgid "Show stream Icon"
#~ msgstr "显示音频流图标"
#~ msgid "Show application icon in front of the slider"
#~ msgstr "在滑动控制条前显示应用图标"
#~ msgid "Filter applications shown in the volume mixer."
#~ msgstr "过滤音量混合器中可见的应用。"
#~ msgid "Filter Mode"
#~ msgstr "过滤模式"
#~ msgid "Blacklist"
#~ msgstr "黑名单"
#~ msgid "Whitelist"
#~ msgstr "白名单"
#~ msgid "Using Javascript Regex"
#~ msgstr "使用 JavaScript 正则表达式"
#~ msgid "Use Javascript RegExp for filtering app name or description"
#~ msgstr "使用 JavaScript 正则表达式以过滤应用名称或描述"
#~ msgid "Check Stream Description"
#~ msgstr "检查音频流描述"
#~ msgid "Check Description also"
#~ msgstr "同时检查描述"
#~ msgid "Add more buttons"
#~ msgstr "增加更多按钮"
#~ msgid "Turn on the buttons you want to add on Quick Settings"
#~ msgstr "启用需添加至快捷控制面板的按钮"
#~ msgid "Turn on to make the DND quick toggle visible on the Quick Settings panel"
#~ msgstr "开启以令免打扰快捷开关在快捷控制面板中可见"
#~ msgid "Turn on to make the unsafe quick toggle visible on the Quick Settings panel"
#~ msgstr "开启以令不安全模式快捷开关在快捷控制面板中可见"
#~ msgid "This extension is distributed with license GPL 3+"
#~ msgstr "此拓展以 GPL 3+ 协议进行分发"
#~ msgid "excludes Third-party. Third party codes follow their license"
#~ msgstr "除第三方外。第三方代码遵循其协议"
#~ msgid "Extension Version"
#~ msgstr "拓展版本"
#~ msgid "Unknown (Built from source)"
#~ msgstr "未知(编译自源代码)"
#~ msgid "Third party LICENSE"
#~ msgstr "第三方协议"
#~ msgid "LICENSE OF CODES WHICH USED ON THIS EXTENSION"
#~ msgstr "本拓展使用的代码协议"
#~ msgid "Media Controls widget"
#~ msgstr "音频控制组件"
#~ msgid "Turn on to make the Media Control widget visible on the Quick Settings panel"
#~ msgstr "启用以令音频控制组件在快捷控制面板中可见"
#~ msgid "Compact Mode"
#~ msgstr "紧凑模式"
#~ msgid "Auto Hide"
#~ msgstr "自动隐藏"
#~ msgid "Quick Toggles"
#~ msgstr "快捷开关"
#~ msgid "Fix Weather Widget Overflow"
#~ msgstr "修复天气组件溢出"
#~ msgid "Fix overflow visual bug of weather widget in datemenu"
#~ msgstr "修复天气组件在日期菜单中的视觉溢出问题"
#~ msgid "Remove Notifications On Date Menu"
#~ msgstr "移除日期菜单中的通知组件"
#~ msgid "Remove Media Control On Date Menu"
#~ msgstr "移除日期菜单中的音乐控制组件"
#~ msgid "Do not adjust the border radius of contents."
#~ msgstr "不要调整组件的边框圆角弧度。"
#~ msgid "Don't adjust the border of messages and media controls."
#~ msgstr "不要调整通知与音乐控制组件的边框。"
#~ msgid "Do not remove the shadow of contents."
#~ msgstr "不要移除组件的阴影。"
#~ msgid "Don't remove the shadow of messages and media controls."
#~ msgstr "不要移除通知与音乐控制组件的阴影。"
#~ msgid "Set Notifications widget position"
#~ msgstr "设置通知组件位置"
#~ msgid "Buttons to remove"
#~ msgstr "欲移除的按钮"
#~ msgid "Turn on the buttons you want to remove from Quick Settings"
#~ msgstr "启用欲从快捷控制面板中移除的按钮"
#~ msgid "Remove chosen buttons from quick panel"
#~ msgstr "从快捷控制面板中移除所选按钮"
#~ msgid "Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover"
#~ msgstr "Fork 此拓展 https://github.com/qwreey75/gnome-quick-settings-button-remover"
#~ msgid "This feature is unstable sometime"
#~ msgstr "此功能可能不稳定"
#~ msgid ""
#~ "When lock/unlock with gnome-screensaver, unexpected behavior occurs\n"
#~ "Please do not report issue about known issue, Almost duplicated\n"
#~ "Known issue:\n"
#~ " button doesn't remove after lockscreen\n"
#~ " modal get bigger after lockscreen"
#~ msgstr ""
#~ "当 gnome-screensaver 启用或解锁时,会产生不可预期的行为\n"
#~ "请不要报告已知或几乎重复的问题\n"
#~ "已知问题:\n"
#~ " 按钮在解锁后不移除\n"
#~ " 组件在解锁后变大"
#~ msgid "Please turn off if some bug occurred"
#~ msgstr "如果发生了一些问题,请关闭计算机"
#~ msgid "Unknown"
#~ msgstr "未知"
#~ msgid ""
#~ "Do not separate Quick Settings and Notifications widgets, \byou should enable this option because separated panels can make many visual bugs\n"
#~ "(such as margin or padding not matching with the theme)"
#~ msgstr ""
#~ "不要分离快捷控制面板与通知组件,\\b建议启用此选项,因为分离面板可能造成许多视觉问题\n"
#~ "(例如边框距离与主题样式不匹配)"
================================================
FILE: schemas/org.gnome.shell.extensions.quick-settings-tweaks.gschema.xml
================================================
false
false
0
true
true
false
true
true
292
46
true
true
true
true
true
true
true
true
230
true
false
[ 0, 0, 0, 0 ]
true
'slim'
[]
0
[]
[]
0
true
true
[127,127,127]
340
820
160
180
16
true
false
true
true
''
true
5
1
true
true
"both"
220
true
true
0
46
,
'nameRegex': ,
'description': ,
'descriptionRegex': ,
'applicationId': ,
'applicationIdRegex':
}]
]]>
,
'nameRegex': ,
'description': ,
'descriptionRegex': ,
'applicationId': ,
'applicationIdRegex':
}]
]]>
,
'nameRegex': ,
'description': ,
'descriptionRegex': ,
'applicationId': ,
'applicationIdRegex':
}]
]]>
'block'
true
'open-menu-symbolic'
true
true
false
false
false
false
false
false
false
false
false
['battery', 'laptopSpacer', 'screenshot', 'settings', 'desktopSpacer', 'lock', 'shutdown']
'default'
false
false
false
, 'hide': },
{ 'hide': , 'isSystem': , 'gtypeName': <'Gjs_toggle_dndQuickToggle_DndIndicator'> },
{ 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_remoteAccess_RemoteAccessApplet'> },
{ 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_camera_Indicator'> },
{ 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_volume_InputIndicator'> },
{ 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_location_Indicator'> },
{ 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_thunderbolt_Indicator'> },
{ 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_nightLight_Indicator'> },
{ 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_network_Indicator'> },
{ 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_bluetooth_Indicator'> },
{ 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_rfkill_Indicator'> },
{ 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_volume_OutputIndicator'> },
{ 'hide': , 'isSystem': , 'gtypeName': <'Gjs_ui_panel_UnsafeModeIndicator'> },
{ 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_system_Indicator'> }
]
]]>
,
constructorName: ,
friendlyName: ,
nonOrdered: ,
isSystem: ,
hide:
}]
]]>
false
false
false
'open-menu-symbolic'
'open-menu-symbolic'
false
, 'isSystem': , 'constructorName': <'NMWiredToggle'> },
{ 'hide': , 'isSystem': , 'constructorName': <'NMWirelessToggle'> },
{ 'hide': , 'isSystem': , 'constructorName': <'NMModemToggle'> },
{ 'hide': , 'isSystem': , 'constructorName': <'NMBluetoothToggle'> },
{ 'hide': , 'isSystem': , 'constructorName': <'NMVpnToggle'> },
{ 'hide': , 'isSystem': , 'constructorName': <'BluetoothToggle'> },
{ 'hide': , 'isSystem': , 'constructorName': <'PowerProfilesToggle'> },
{ 'hide': , 'isSystem': , 'constructorName': <'NightLightToggle'> },
{ 'hide': , 'isSystem': , 'constructorName': <'DarkModeToggle'> },
{ 'hide': , 'isSystem': , 'constructorName': <'DoNotDisturbToggle'> },
{ 'hide': , 'isSystem': , 'constructorName': <'KeyboardBrightnessToggle'> },
{ 'hide': , 'isSystem': , 'constructorName': <'RfkillToggle'> },
{ 'hide': , 'isSystem': , 'constructorName': <'RotationToggle'> },
{ 'hide': , 'isSystem': , 'constructorName': <'DndQuickToggle'> },
{ 'hide': , 'isSystem': , 'constructorName': <'UnsafeQuickToggle'> },
{ 'nonOrdered': , 'hide': }
]
]]>
,
constructorName: ,
titleRegex: ,
friendlyName: ,
nonOrdered: ,
isSystem: ,
hide:
}]
]]>
false
false
true
false
4
900
220
100
920
920
380
380
false
380
360
'dialog'
{
'weather-widget': [0, 0],
'notifications-widget': [0, 0],
'media-widget': [0, 0],
'mixer-widget': [0, 0]
}
'top'
================================================
FILE: scripts/contributor-labels.json
================================================
{
"qwreey": "Owner",
"DaPigGuy": "Gnome 45 Port",
"Leleat": "Style & Code\nimprove",
"kgdn": "Gnome 45 Port",
"DodoLeDev": "Readme & Code\nimprove",
"andia89": "Code improve",
"DanGLES3": "Portuguese\ntranslation",
"jcatfor": "Catalan\ntranslation",
"ondra05": "Czech\ntranslation",
"daudix": "Russian\ntranslation",
"JohnOberhauser": "Audio\nInput/Output",
"314eter": "Bug fix\nCode improve",
"Tuba2": "Portuguese\ntranslation",
"mechtifs": "Chinese Simplified\ntranslation",
"MrXvnov": "Russian\ntranslation",
"ryzendew": "Gnome 47 Port",
"prapooskur": "Gnome 46 Port",
"alewicki95": "Polish\ntranslation",
"nulta": "Korean\ntranslation"
}
================================================
FILE: scripts/reindent.js
================================================
import { promises as fs } from "fs"
function getItems() {
let allowed = false
const items = process.argv.filter(item => {
if (allowed) return true
if (item == "--") allowed = true
return false
})
return items
}
async function main() {
await Promise.all(getItems().map(item =>
fs.readFile(`./${item}`, { encoding: "utf-8" })
.then(content =>
content.replaceAll(/[^\n]*/g,
substr => substr.replace(
/^ */,
indent => "\t".repeat(Math.floor(indent.length / 4))
)
))
.then(fs.writeFile.bind(fs, item))
))
}
main()
================================================
FILE: scripts/version/gnome-docker-version
================================================
1.0.3
================================================
FILE: scripts/version/latest-build-number
================================================
9
================================================
FILE: scripts/version/latest-middle-version
================================================
2
================================================
FILE: scripts/version/latest-minor-version
================================================
1
================================================
FILE: scripts/version/major-version
================================================
2
================================================
FILE: src/ambient.d.ts
================================================
// Provide missing types
declare global {
export interface EasingParams {
repeatCount?: number
autoReverse?: boolean
animationRequired?: boolean
duration?: number
delay?: number
mode?: Clutter.AnimationMode | any
}
export type EasingParamsWithProps = EasingParams & { [key: string]: any }
}
declare module "gi://GWeather" {
import GObject from "gi://GObject"
class Info extends GObject.Object {
static store_cache(): void
constructor(location: Location)
abort(): void
get_apparent(): string
/// Get the application ID of the application fetching the weather
/** @returns { string } the application ID */
get_application_id(): string
/// Some weather services require the application showing the data to include an attribution text, possibly including links to the service website.
/// This must be shown prominently toghether with the data.
/** @returns { string } the required attribution text, in Pango markup form, or null if not required */
get_attribution(): string
get_conditions(): string
/// Get the contact information of the application fetching the weather.
/** @returns { string } the contact information */
get_contact_info(): string
get_dew(): string
/// Gets the bitmask of enabled GWeather.Provider weather providers.
get_enabled_providers(): Provider
/**
* @returns {Info[]}
* list of GWeatherInfo* objects for the forecast.
* The list is owned by the 'info' object thus is alive as long as the 'info'.
* The 'update' property is the date/time when the forecast info is used for.
*/
get_forecast_list(): Info[]
get_humidity(): string
get_icon_name(): string
get_location(): Location
get_location_name(): string
get_pressure(): string
get_sky(): string
get_sunrise(): string
get_sunset(): string
get_symbolic_icon_name(): string
get_temp(): string
get_temp_max(): string
get_temp_min(): string
get_temp_summary(): string
get_upcoming_moonphases(phases: number): boolean
get_update(): string
/** @param { TemperatureUnit } unit the desired unit, as a GWeather.TemperatureUnit */
/**
* @returns {[boolean, number]}
* ok - TRUE is value is valid, FALSE otherwise
*
* value - the apparent temperature
*/
get_value_apparent(unit: TemperatureUnit): [boolean, number]
/// Fills out phenomenon and qualifier with current weather conditions.
/**
* @returns {[boolean, GWeather.ConditionPhenomenon, GWeather.ConditionQualifier]}
* ok - TRUE is out arguments are valid, FALSE otherwise.
*
* phenomenon - a location for a GWeather.ConditionPhenomenon.
*
* qualifier - a location for a GWeather.ConditionQualifier.
*/
get_value_conditions(): [boolean, ConditionPhenomenon, ConditionQualifier]
/**
* @returns {[boolean, number]}
* ok - TRUE is value is valid, FALSE otherwise.
*
* value - the dew point
*/
get_value_dew(unit: TemperatureUnit): [boolean, number]
/**
* @returns {[boolean, MoonPhase, MoonLatitude]}
* ok - TRUE is value is valid, FALSE otherwise.
*
* value - the current moon phase
*
* lat - the moon declension
*/
get_value_moonphase(): [boolean, MoonPhase, MoonLatitude]
/** @param {PressureUnit} unit the desired unit, as a GWeather.PressureUnit */
/**
* @returns {[boolean, number]}
* ok - TRUE if value is valid, FALSE otherwise.
*
* value - forecasted pressure, expressed in unit
*/
get_value_pressure(unit): [boolean, number]
/**
* @returns {[boolean, Sky]}
* ok - TRUE is sky is valid, FALSE otherwise.
*
* sky - a location for a GWeather.Sky.
*/
get_value_sky(): [boolean, Sky]
/**
* @returns {[boolean, number]}
* ok - TRUE is value is valid, FALSE otherwise.
*
* value - the time of sunrise
*/
get_value_sunrise(): [boolean, number]
/**
* @returns {[boolean, number]}
* ok - TRUE is value is valid, FALSE otherwise.
*
* value - the time of sunset
*/
get_value_sunset(): [boolean, number]
/** @param {TemperatureUnit} unit the desired unit, as a GWeather.TemperatureUnit */
/**
* @returns {[boolean, number]}
* ok - TRUE is value is valid, FALSE otherwise.
*
* value - the temperature value
*/
get_value_temp(unit: TemperatureUnit): [boolean, number]
/** @param {GWeather.TemperatureUnit} unit the desired unit, as a GWeather.TemperatureUnit */
/**
* @returns {[boolean, number]}
* ok - TRUE is value is valid, FALSE otherwise.
*
* value - the maximum temperature value
*/
get_value_temp_max(unit: TemperatureUnit): [boolean, number]
/** @param {GWeather.TemperatureUnit} unit the desired unit, as a GWeather.TemperatureUnit */
/**
* @returns {[boolean, number]}
* ok - TRUE is value is valid, FALSE otherwise.
*
* value - the minimum temperature value
*/
get_value_temp_min(unit: TemperatureUnit): [boolean, number]
/// Note that value may be 0 if this has not yet been updated.
/**
* @returns {[boolean, number]}
* ok - TRUE is value is valid, FALSE otherwise.
*
* value - the time this was last updated
*/
get_value_update(): [boolean, number]
/** @param {GWeather.DistanceUnit} unit the desired unit, as a GWeather.DistanceUnit */
/**
* @returns {[boolean, number]}
* ok - TRUE if value is valid, FALSE otherwise.
*
* value - forecasted visibility, expressed in unit
*/
get_value_visibility(unit: DistanceUnit): [boolean, number]
/** @param {GWeather.SpeedUnit} unit the desired unit, as a GWeather.SpeedUnit */
/**
* @returns {[boolean, number, GWeather.WindDirection]}
* ok - TRUE if speed and direction are valid, FALSE otherwise.
*
* speed - forecasted wind speed
*
* direction - forecasted wind direction
*/
get_value_wind(unit: SpeedUnit): [boolean, number, WindDirection]
get_visibility(): string
/** @returns {string} a summary for current weather conditions. */
get_weather_summary(): string
get_wind(): string
/**
* @returns {boolean}
* Whether it is daytime (that is, if the sun is visible) or not at the location and the point of time referred by this.
*
* This is mostly equivalent to comparing the return value of GWeather.Info.get_value_sunrise and GWeather.Info.get_value_sunset, but it accounts also for midnight sun and polar night, for locations within the Artic and Antartic circles.
*/
is_daytime(): boolean
is_valid(): boolean
network_error(): boolean
next_sun_event(): number
/// Sets the application ID of the application fetching the weather.
/// It is a requirement for using any of the online weather providers.
///
/// If the application uses Gio.Application, then the application ID will be automatically filled in.
/** @param {string} application_id the application ID to set
set_application_id(application_id: string): void
/// Sets the contact information for the application fetching the weather.
/// It is a requirement for using any of the online weather providers as it allows API providers to contact application developers in case of terms of use breaches.
///
/// The contact information should be an email address, or the full URL to an online contact form which weather providers can use to contact the application developer. Avoid using bug tracker URLs which require creating accounts.
/** @param {string} contact_info the contact information for the application */
set_contact_info(contact_info: string): void
/// Sets the enabled providers for fetching the weather.
/// Note that it is up to the application developer to make sure that the terms of use for each service are respected.
///
/// Online providers will not be enabled if the application ID is not set to a valid value.
/** @param {GWeather.Provider} providers a bitmask of GWeather.Provider */
set_enabled_providers(providers: Provider): void
/// Changes the location of the weather report.
///
/// Note that this will clear any forecast or current conditions, and you must call [method@GWeather.Info.update] to obtain the new data.
/** @param {GWeather.Location} location a location for which weather is desired */
set_location(location: Location): void
/// Requests a reload of weather conditions and forecast data from enabled network services.
/// This call does no synchronous IO: rather, the result is delivered by emitting the GWeather.Info.updated signal.
/// Note that if no network services are enabled, the signal will not be emitted. See GWeather.Info.enabled-providers for details.
update(): void
}
/// A GWeatherLocation represents a "location" of some type known to libgweather; anything from a single weather station to the entire world.
///
/// See [enum@GWeather.LocationLevel] for information about how the hierarchy of locations works.
class Location extends GObject.Object {
// TODO
}
/// The current or forecasted significant phenomenon.
enum ConditionPhenomenon {
DRIZZLE,
DUST,
DUST_WHIRLS,
DUSTSTORM,
FOG,
FUNNEL_CLOUD,
HAIL,
HAZE,
ICE_CRYSTALS,
ICE_PELLETS,
INVALID,
LAST,
MIST,
NONE,
RAIN,
SAND,
SANDSTORM,
SMALL_HAIL,
SMOKE,
SNOW,
SNOW_GRAINS,
SPRAY,
SQUALL,
TORNADO,
UNKNOWN_PRECIPITATION,
VOLCANIC_ASH,
}
/// An additional modifier applied to a GWeather.ConditionPhenomenon to describe the current or forecasted weather conditions.
///
/// The exact meaning of each qualifier is described at http://www.weather.com/glossary/ and http://www.crh.noaa.gov/arx/wx.tbl.php
enum ConditionQualifier {
BLOWING,
DRIFTING,
FREEZING,
HEAVY,
INVALID,
LAST,
LIGHT,
MODERATE,
NONE,
PARTIAL,
PATCHES,
SHALLOW,
SHOWERS,
THUNDERSTORM,
VICINITY,
}
enum DistanceUnit {
DEFAULT,
INVALID,
KM,
METERS,
MILES,
}
/// The size/scope of a particular [class@GWeather.Location].
///
/// Locations form a hierarchy, with a GWEATHER_LOCATION_WORLD location at the top, divided into regions or countries, and so on.
///
/// Countries may or may not be divided into "adm1"s, and "adm1"s may or may not be divided into "adm2"s.
/// A city will have at least one, and possibly several, weather stations inside it.
/// Weather stations will never appear outside of cities.
///
/// Building a database with [func@GWeather.Location.get_world] will never create detached instances, but deserializing might.
enum LocationLevel {
ADM1,
CITY,
COUNTRY,
DETACHED,
NAMED_TIMEZONE,
REGION,
WEATHER_STATION,
WORLD,
}
namespace LocationLevel {
/// Returns the location level as a string, useful for debugging purposes.
/** @param {GWeather.LocationLevel} level a GWeather.LocationLevel */
/** @returns {string} a string */
export function to_string(level: LocationLevel): string
}
/// The measure unit to use for atmospheric pressure values, when retrieved by GWeather.Info.get_value_pressure.
enum PressureUnit {
ATM,
DEFAULT,
HPA,
INCH_HG,
INVALID,
KPA,
MB,
MM_HG,
}
enum Provider {
ALL,
IWIN,
MET_NO,
METAR,
NONE,
NWS,
OWM,
}
/// The sky and cloud visibility.
/// In general it is discouraged to use this value directly to compute the forecast icon: applications should instead use GWeather.Info.get_icon_name or GWeather.Info.get_symbolic_icon_name.
enum Sky {
BROKEN,
CLEAR,
FEW,
INVALID,
LAST,
OVERCAST,
SCATTERED,
}
namespace Sky {
export function to_string(sky: Sky): string
export function to_string_full(sky: Sky, options: {[key: string]: any}): string
}
/// The measure unit to use for wind speed values, when retrieved by GWeather.Info.get_value_wind.
enum SpeedUnit {
BFT,
DEFAULT,
INVALID,
KNOTS,
KPH,
MPH,
MS,
}
namespace SpeedUnit {
/** @param {GWeather.SpeedUnit} unit a speed unit, or GWeather.SpeedUnit.DEFAULT */
export function to_string(unit: SpeedUnit): string
}
/// The measure unit to use for temperature values, when retrieved by the GWeather.Info.get_value_temp family of functions.
enum TemperatureUnit {
CENTIGRADE,
DEFAULT,
FAHRENHEIT,
INVALID,
KELVIN,
}
namespace TemperatureUnit {
/** @param {GWeather.TemperatureUnit} unit a tempeature unit, or GWeather.TemperatureUnit.DEFAULT */
export function to_real(unit: TemperatureUnit): TemperatureUnit
}
/// The direction of the prevailing wind.
/// Composite values such as north-north-east indicate a direction between the two component value (north and north-east).
enum WindDirection {
E,
ENE,
ESE,
INVALID,
LAST,
N,
NE,
NNE,
NNW,
NW,
S,
SE,
SSE,
SSW,
SW,
VARIABLE,
W,
WNW,
WSW,
}
namespace WindDirection {
export function to_string(wind: WindDirection): string
export function to_string_full(wind: WindDirection, options: {[key: string]: any}): string
}
}
declare module "resource:///org/gnome/shell/ui/pageIndicators.js" {
import St from "gi://St"
import Clutter from "gi://Clutter"
export class PageIndicators extends St.BoxLayout {
constructor(orientation: Clutter.Orientation)
connect(id: string, callback: (...args: any[]) => any): number;
connect_after(id: string, callback: (...args: any[]) => any): number;
connect(sigName: 'page-activated', callback: ($obj: PageIndicators, page: number) => void): number
connect_after(sigName: 'page-activated', callback: ($obj: PageIndicators, page: number) => void): number
setReactive(reactive: boolean): void
setNPages(nPages: number): void
setCurrentPosition(currentPosition: number): void
readonly nPages: number
}
}
declare module "resource:///org/gnome/shell/misc/weather.js" {
import Signals from "resource:///org/gnome/shell/misc/signals.js"
import GWeather from "gi://GWeather"
export class WeatherClient extends Signals.EventEmitter {
readonly available: boolean
readonly loading: boolean
readonly hasLocation: boolean
readonly info: GWeather.Info
activateApp(): void
update(): void
}
}
================================================
FILE: src/config.ts
================================================
export default {
isDevelopmentBuild: false,
isReleaseBuild: false,
isGithubBuild: false,
version: "unknown",
buildNumber: 0,
baseGTypeName: "quick-settings-tweaks_",
loggerPrefix: "[quick-settings-tweaks]",
}
================================================
FILE: src/extension.ts
================================================
/**
* Viewer Note:
* stylesheet and javascript files are compiled from scss and typescript.
* To modify this extension, please check original source-codes from repository
* https://github.com/qwreey/quick-settings-tweaks
*/
import { Extension } from "resource:///org/gnome/shell/extensions/extension.js"
import Logger from "./libs/shared/logger.js"
import Global from "./global.js"
import Config from "./config.js"
import { type FeatureBase } from "./libs/shell/feature.js"
import { UnsafeQuickToggleFeature } from "./features/toggle/unsafeQuickToggle.js"
import { MediaWidgetFeature } from "./features/widget/media.js"
import { WeatherWidgetFeature } from "./features/widget/weather.js"
import { NotificationsWidgetFeature } from "./features/widget/notifications.js"
import { TogglesLayoutFeature } from "./features/layout/toggles.js"
import { SystemItemsLayoutFeature } from "./features/layout/systemItems.js"
import { DateMenuLayoutFeature } from "./features/layout/dateMenu.js"
import { OverlayMenu } from "./features/overlayMenu.js"
import { MenuAnimation } from "./features/menuAnimation.js"
import { DebugFeature } from "./features/debug.js"
import { VolumeMixerWidgetFeature } from "./features/widget/volumeMixer.js"
import { SystemIndicatorLayoutFeature } from "./features/layout/systemIndicator.js"
export default class QstExtension extends Extension {
private features: FeatureBase[]
private debug: DebugFeature
disable() {
Logger(`Extension ${this.metadata.name} deactivation started`)
let start = +Date.now()
// Unload debug feature
this.debug.unload()
this.debug = null
// Unload features
for (const feature of this.features) {
Logger(`Unload feature '${feature.constructor.name}'`)
feature.unload()
}
this.features = null // Null-out all features, loaded objects, arrays should be GC'd
// Unload global context
Global.unload()
Logger("Diabled. " + (+new Date() - start) + "ms taken")
}
enable() {
// Load global context
Global.load(this)
// Create features
this.features = [
new UnsafeQuickToggleFeature(),
// new InputOutputFeature(),
new NotificationsWidgetFeature(),
new MediaWidgetFeature(),
new VolumeMixerWidgetFeature(),
new DateMenuLayoutFeature(),
new WeatherWidgetFeature(),
new OverlayMenu(),
new MenuAnimation(),
new SystemItemsLayoutFeature(),
new TogglesLayoutFeature(),
new SystemIndicatorLayoutFeature(),
]
// Load debug feature
this.debug = new DebugFeature()
this.debug.load()
Logger(`Extension activation started, version: ${Config.version}`)
// Load features
Logger.debug("Initializing features ...")
let start = +Date.now()
for (const feature of this.features) {
Logger.debug(()=>`Loading feature '${feature.constructor.name}'`)
feature.load()
}
Logger(`Extension Loaded, ${+Date.now() - start}ms taken`)
}
}
================================================
FILE: src/features/debug.ts
================================================
import { FeatureBase, type SettingLoader } from "../libs/shell/feature.js"
import Global from "../global.js"
import Logger from "../libs/shared/logger.js"
import Config from "../config.js"
export class DebugFeature extends FeatureBase {
disableDebugMessage = true
// #region settings
expose: boolean
showLayoutBorder: boolean
logLevel: number
override loadSettings(loader: SettingLoader): void {
this.expose = loader.loadBoolean("debug-expose")
this.showLayoutBorder = loader.loadBoolean("debug-show-layout-border")
this.logLevel = loader.loadInt("debug-log-level")
}
// #endregion settings
override onLoad() {
Logger.setHeader(Config.loggerPrefix)
Logger.setLogLevel(this.logLevel)
Logger.debug(()=>`Logger initialized, LogLevel: ${this.logLevel}`)
if (this.expose) {
globalThis.qst = Global
for (const feature of (Global.Extension as any).features) {
Global[feature.constructor.name] = feature
}
this.maid.functionJob(()=>{
for (const feature of (Global.Extension as any).features) {
delete Global[feature.constructor.name]
}
delete globalThis.qst
})
Logger.debug("Extension environment expose enabled")
}
if (this.showLayoutBorder) {
// @ts-ignore Box pointer is private
Global.QuickSettingsMenu._boxPointer.style_class += " QSTWEAKS-debug-show-layout"
this.maid.functionJob(()=>{
// @ts-ignore Box pointer is private
Global.QuickSettingsMenu._boxPointer.style_class =
// @ts-ignore Box pointer is private
Global.QuickSettingsMenu._boxPointer.style_class.replace(/ QSTWEAKS-debug-show-layout/, "")
})
Logger.debug("Show layout border enabled")
}
}
override onUnload(): void {}
}
================================================
FILE: src/features/layout/dateMenu.ts
================================================
import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js"
import { StyleClass } from "../../libs/shared/styleClass.js"
import Global from "../../global.js"
import Logger from "../../libs/shared/logger.js"
export class DateMenuLayoutFeature extends FeatureBase {
// #region settings
hideMediaControl: boolean
hideNotifications: boolean
hideLeftBox: boolean
hideRightBox: boolean
disableMenu: boolean
override loadSettings(loader: SettingLoader): void {
this.hideLeftBox = loader.loadBoolean("datemenu-hide-left-box")
this.hideRightBox = loader.loadBoolean("datemenu-hide-right-box")
this.disableMenu = loader.loadBoolean("datemenu-disable-menu")
}
// #endregion settings
override onLoad() {
const style = new StyleClass((Global.DateMenuBox as any).style_class)
// Hide left box from date menu
if (this.hideLeftBox) {
const leftBox = Global.DateMenuHolder.get_first_child()
if (leftBox) {
this.maid.hideJob(
leftBox,
()=>true
)
} else {
Logger.error("Failed to get date menu left box")
}
style.add("QSTWEAKS-hide-left-box")
}
// Hide right box from date menu
if (this.hideRightBox) {
const rightBox = Global.DateMenuHolder.get_last_child()
if (rightBox) {
this.maid.hideJob(
rightBox,
()=>true
)
} else {
Logger.error("Failed to get date menu right box")
}
style.add("QSTWEAKS-hide-right-box")
}
// Disable menu open action
if (this.disableMenu) {
Global.DateMenu.reactive = false
this.maid.functionJob(()=>{
Global.DateMenu.reactive = true
})
}
// Modify style class
if (style.modified) {
(Global.DateMenuBox as any).style_class = style.stringify()
}
}
override onUnload(): void {
// Remove modified styles
const style = new StyleClass((Global.DateMenuBox as any).style_class)
.remove("QSTWEAKS-hide-right-box")
.remove("QSTWEAKS-hide-left-box")
if (style.modified) {
(Global.DateMenuBox as any).style_class = style.stringify()
}
}
}
================================================
FILE: src/features/layout/sound.ts
================================================
import { FeatureBase, SettingLoader } from "../../libs/shell/feature.js"
import GObject from "gi://GObject"
// TODO: migration from qst 1.8
export class SoundLayoutFeature extends FeatureBase {
// #region settings
override loadSettings(loader: SettingLoader): void {
throw GObject.NotImplementedError
}
// #endregion settings
override onLoad(): void {
throw GObject.NotImplementedError
}
override onUnload(): void {
throw GObject.NotImplementedError
}
}
================================================
FILE: src/features/layout/systemIndicator.ts
================================================
import * as Main from "resource:///org/gnome/shell/ui/main.js"
import { SystemIndicator } from "resource:///org/gnome/shell/ui/quickSettings.js"
import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js"
import { SystemIndicatorTracker } from "../../libs/shell/quickSettingsUtils.js"
import { SystemIndicatorOrderItem } from "../../libs/types/systemIndicatorOrderItem.js"
import { StyleClass } from "../../libs/shared/styleClass.js"
import Maid from "../../libs/shared/maid.js"
import Global from "../../global.js"
export class SystemIndicatorLayoutFeature extends FeatureBase {
// #region settings
orderEnabled: boolean
order: SystemIndicatorOrderItem[]
unordered: SystemIndicatorOrderItem
privacyIndicatorStyle: "default" | "monochrome" | "accent"
accentScreenSharingIndicator: boolean
accentScreenRecordingIndicator: boolean
override loadSettings(loader: SettingLoader): void {
this.orderEnabled = loader.loadBoolean("system-indicator-layout-enabled")
this.order = loader.loadValue("system-indicator-layout-order")
this.unordered = this.order.find(item => item.nonOrdered)
this.privacyIndicatorStyle = loader.loadString("system-indicator-privacy-indicator-style") as SystemIndicatorLayoutFeature["privacyIndicatorStyle"]
this.accentScreenSharingIndicator = loader.loadBoolean("system-indicator-screen-sharing-indicator-use-accent")
this.accentScreenRecordingIndicator = loader.loadBoolean("system-indicator-screen-recording-indicator-use-accent")
}
// #endregion settings
onIndicatorCreated(maid: Maid, indicator: SystemIndicator): void {
const rule: SystemIndicatorOrderItem =
this.order.find(item => SystemIndicatorOrderItem.indicatorMatch(item, indicator))
?? this.unordered
if (rule.hide) maid.hideJob(indicator)
}
onUpdate(): void {
const children = Global.Indicators.get_children()
const head: SystemIndicator[] = []
const middle: SystemIndicator[] = children.filter(child => child instanceof SystemIndicator) as any
const tail: SystemIndicator[] = []
let overNonOrdered: boolean = false
for (const item of this.order) {
if (item.nonOrdered) {
overNonOrdered = true
continue
}
const middleIndex = middle.findIndex(toggle => SystemIndicatorOrderItem.indicatorMatch(item, toggle))
if (middleIndex == -1) continue
const toggle = middle[middleIndex]
middle.splice(middleIndex, 1);
(overNonOrdered ? tail : head).push(toggle)
}
let last: SystemIndicator|null = null
for (const item of [head, middle, tail].flat()) {
if (last) Global.Indicators.set_child_above_sibling(item, last)
last = item
}
}
tracker: SystemIndicatorTracker
override onLoad(): void {
// Colored privacy indicator
const privacyIndicatorStyle = new StyleClass(Global.Indicators.style_class)
if (this.privacyIndicatorStyle == "accent") {
privacyIndicatorStyle.add("QSTWEAKS-privacy-indicator-use-accent")
} else if (this.privacyIndicatorStyle == "monochrome") {
privacyIndicatorStyle.add("QSTWEAKS-privacy-indicator-use-monochrome")
}
if (privacyIndicatorStyle.modified) {
Global.Indicators.style_class = privacyIndicatorStyle.stringify()
this.maid.functionJob(()=>{
Global.Indicators.style_class =
new StyleClass(Global.Indicators.style_class)
.remove("QSTWEAKS-privacy-indicator-use-accent")
.remove("QSTWEAKS-privacy-indicator-use-monochrome")
.stringify()
})
}
// Colored screen sharing indicator
if (this.accentScreenSharingIndicator) {
Main.panel.statusArea["screenSharing"].style_class =
new StyleClass(Main.panel.statusArea["screenSharing"].style_class)
.add("QSTWEAKS-screen-sharing-indicator-use-accent")
.stringify()
this.maid.functionJob(()=>{
Main.panel.statusArea["screenSharing"].style_class =
new StyleClass(Main.panel.statusArea["screenSharing"].style_class)
.remove("QSTWEAKS-screen-sharing-indicator-use-accent")
.stringify()
})
}
// Colored screen recording indicator
if (this.accentScreenRecordingIndicator) {
Main.panel.statusArea["screenRecording"].style_class =
new StyleClass(Main.panel.statusArea["screenRecording"].style_class)
.add("QSTWEAKS-screen-recording-indicator-use-accent")
.stringify()
this.maid.functionJob(()=>{
Main.panel.statusArea["screenRecording"].style_class =
new StyleClass(Main.panel.statusArea["screenRecording"].style_class)
.remove("QSTWEAKS-screen-recording-indicator-use-accent")
.stringify()
})
}
// Ordering
if (!this.orderEnabled) return
this.tracker = new SystemIndicatorTracker()
this.tracker.onIndicatorCreated = this.onIndicatorCreated.bind(this)
this.tracker.onUpdate = this.onUpdate.bind(this)
this.tracker.load()
}
override onUnload(): void {
const tracker = this.tracker
if (tracker) {
this.tracker = null
tracker.unload()
}
}
}
================================================
FILE: src/features/layout/systemItems.ts
================================================
import Clutter from "gi://Clutter"
import { type PowerToggle } from "resource:///org/gnome/shell/ui/status/system.js"
import { type QuickSettingsItem } from "resource:///org/gnome/shell/ui/quickSettings.js"
import { type SystemItem } from "resource:///org/gnome/shell/ui/status/system.js"
import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js"
import Logger from "../../libs/shared/logger.js"
import Global from "../../global.js"
export class SystemItemsLayoutFeature extends FeatureBase {
// #region settings
hideScreenshot: boolean
hideSettings: boolean
hideLock: boolean
hideShutdown: boolean
hideBattery: boolean
hideLayout: boolean
enabled: boolean
order: string[]
override loadSettings(loader: SettingLoader): void {
this.hideScreenshot = loader.loadBoolean("system-items-layout-hide-screenshot")
this.hideSettings = loader.loadBoolean("system-items-layout-hide-settings")
this.hideLock = loader.loadBoolean("system-items-layout-hide-lock")
this.hideShutdown = loader.loadBoolean("system-items-layout-hide-shutdown")
this.hideBattery = loader.loadBoolean("system-items-layout-hide-battery")
this.hideLayout = loader.loadBoolean("system-items-layout-hide")
this.enabled = loader.loadBoolean("system-items-layout-enabled")
this.order = loader.loadStrv("system-items-layout-order")
}
// #endregion settings
async getItmes(): Promise<{
screenshot: QuickSettingsItem,
settings: QuickSettingsItem,
lock: QuickSettingsItem,
shutdown: QuickSettingsItem,
battery: PowerToggle,
box: SystemItem,
laptopSpacer: Clutter.Actor,
desktopSpacer: Clutter.Actor,
}> {
const systemItem = await Global.QuickSettingsSystemItem
const children = systemItem.child.get_children()
let screenshotItem: QuickSettingsItem
let settingsItem: QuickSettingsItem
let lockItem: QuickSettingsItem
let shutdownItem: QuickSettingsItem
for (const child of children) {
if (child.constructor.name == "ScreenshotItem") {
screenshotItem = child as QuickSettingsItem
continue
}
if (child.constructor.name == "SettingsItem") {
settingsItem = child as QuickSettingsItem
continue
}
if (child.constructor.name == "LockItem") {
lockItem = child as QuickSettingsItem
continue
}
if (child.constructor.name == "ShutdownItem") {
shutdownItem = child as QuickSettingsItem
}
}
return {
screenshot: screenshotItem,
settings: settingsItem,
lock: lockItem,
shutdown: shutdownItem,
battery: systemItem.powerToggle,
laptopSpacer: (systemItem as any)._laptopSpacer,
desktopSpacer: (systemItem as any)._desktopSpacer,
box: systemItem
}
}
override onLoad() {
if (!this.enabled) return
this.getItmes().then(items => {
if (this.hideLayout) {
this.maid.hideJob(items.box, ()=>true)
return
}
if (this.hideBattery) {
this.maid.hideJob(items.battery, ()=>{
(items.battery as any)._sync()
})
}
if (this.hideScreenshot) {
this.maid.hideJob(items.screenshot, ()=>true)
}
if (this.hideLock) {
this.maid.hideJob(items.lock, ()=>true)
}
if (this.hideShutdown) {
this.maid.hideJob(items.shutdown, ()=>true)
}
if (this.hideSettings) {
this.maid.hideJob(items.settings, ()=>true)
}
let last: any
for (const [index, item] of this.order.entries()) {
const current = items[item]
if (index) items.box.child.set_child_above_sibling(current, last)
last = current
}
}).catch(Logger.error)
}
override onUnload(): void {}
}
================================================
FILE: src/features/layout/toggles.ts
================================================
import {
QuickToggle,
QuickMenuToggle,
} from "resource:///org/gnome/shell/ui/quickSettings.js"
import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js"
import { QuickSettingsToggleTracker } from "../../libs/shell/quickSettingsUtils.js"
import { ToggleOrderItem } from "../../libs/types/toggleOrderItem.js"
import Maid from "../../libs/shared/maid.js"
import Global from "../../global.js"
export class TogglesLayoutFeature extends FeatureBase {
// #region settings
enabled: boolean
order: ToggleOrderItem[]
unordered: ToggleOrderItem
override loadSettings(loader: SettingLoader): void {
this.enabled = loader.loadBoolean("toggles-layout-enabled")
this.order = loader.loadValue("toggles-layout-order")
for (const orderItem of this.order) {
if (orderItem.titleRegex) {
orderItem.cachedTitleRegex = new RegExp(orderItem.titleRegex)
}
if (orderItem.nonOrdered) {
this.unordered = orderItem
}
}
}
// #endregion settings
onToggleCreated(maid: Maid, toggle: QuickToggle|QuickMenuToggle): void {
const rule: ToggleOrderItem =
this.order.find(item => ToggleOrderItem.toggleMatch(item, toggle))
?? this.unordered
if (rule.hide) maid.hideJob(toggle)
}
onUpdate(): void {
const children = Global.QuickSettingsGrid.get_children()
const head: QuickToggle[] = []
const middle: QuickToggle[] = children.filter(child =>
(
(child instanceof QuickMenuToggle)
|| (child instanceof QuickToggle)
)
&& child.constructor.name != "BackgroundAppsToggle"
) as any
const tail: QuickToggle[] = []
let overNonOrdered: boolean = false
for (const item of this.order) {
if (item.nonOrdered) {
overNonOrdered = true
continue
}
const middleIndex = middle.findIndex(toggle => ToggleOrderItem.toggleMatch(item, toggle))
if (middleIndex == -1) continue
const toggle = middle[middleIndex]
middle.splice(middleIndex, 1);
(overNonOrdered ? tail : head).push(toggle)
}
let last: QuickToggle|null = null
for (const item of [head, middle, tail].flat()) {
if (last) Global.QuickSettingsGrid.set_child_above_sibling(item, last)
last = item
}
}
tracker: QuickSettingsToggleTracker
override onLoad(): void {
if (!this.enabled) return
this.tracker = new QuickSettingsToggleTracker()
this.tracker.onToggleCreated = this.onToggleCreated.bind(this)
this.tracker.onUpdate = this.onUpdate.bind(this)
this.tracker.load()
}
override onUnload(): void {
const tracker = this.tracker
if (tracker) {
this.tracker = null
tracker.unload()
}
}
}
================================================
FILE: src/features/menuAnimation.ts
================================================
import Clutter from "gi://Clutter"
import Shell from "gi://Shell"
import { type QuickSettingsMenu } from "resource:///org/gnome/shell/ui/quickSettings.js"
import { FeatureBase, type SettingLoader } from "../libs/shell/feature.js"
import { QuickSettingsMenuTracker } from "../libs/shell/quickSettingsUtils.js"
import Global from "../global.js"
import Maid from "../libs/shared/maid.js"
export class MenuAnimation extends FeatureBase {
// #region settings
enabled: boolean
backgroundBlurRadius: number
bakgroundBrightness: number
backgroundOpacity: number
backgroundScaleX: number
backgroundScaleY: number
gridContentOpacity: number
openDuration: number
closeDuration: number
override loadSettings(loader: SettingLoader): void {
this.enabled = loader.loadBoolean("menu-animation-enabled")
this.backgroundBlurRadius = loader.loadInt("menu-animation-background-blur-radius")
this.bakgroundBrightness = loader.loadInt("menu-animation-background-brightness") / 1000
this.backgroundOpacity = loader.loadInt("menu-animation-background-opacity")
this.backgroundScaleX = loader.loadInt("menu-animation-background-scale-x") / 1000
this.backgroundScaleY = loader.loadInt("menu-animation-background-scale-y") / 1000
this.openDuration = loader.loadInt("menu-animation-open-duration")
this.closeDuration = loader.loadInt("menu-animation-close-duration")
this.gridContentOpacity = loader.loadInt("menu-animation-grid-content-opacity")
}
// #endregion settings
onOpen(_maid: Maid, _menu: QuickSettingsMenu, isOpen: boolean) {
if (this.blur) this.blur.enabled = isOpen
if (isOpen) {
Global.QuickSettingsBox.set_pivot_point(0.5, 0.5)
Global.QuickSettingsBox.ease({
duration: this.openDuration,
mode: Clutter.AnimationMode.EASE_OUT_QUINT,
scaleX: this.backgroundScaleX,
scaleY: this.backgroundScaleY,
opacity: this.backgroundOpacity,
})
Global.QuickSettingsGrid.ease({
duration: this.openDuration,
mode: Clutter.AnimationMode.EASE_OUT_QUINT,
opacity: this.gridContentOpacity,
})
} else {
Global.QuickSettingsBox.ease({
duration: this.closeDuration,
mode: Clutter.AnimationMode.EASE_OUT_QUINT,
scaleX: 1,
scaleY: 1,
opacity: 255,
onComplete: ()=>{
Global.QuickSettingsBox.set_pivot_point(0, 0)
}
})
Global.QuickSettingsGrid.ease({
duration: this.openDuration,
mode: Clutter.AnimationMode.EASE_OUT_QUINT,
opacity: 255,
})
}
}
blur: Shell.BlurEffect
tracker: QuickSettingsMenuTracker
override onLoad(): void {
if (!this.enabled) return
if (this.backgroundBlurRadius) {
this.blur = new Shell.BlurEffect({
enabled: false,
mode: Shell.BlurMode.ACTOR,
radius: this.backgroundBlurRadius,
brightness: this.bakgroundBrightness,
})
// @ts-ignore Box pointer is private
Global.QuickSettingsMenu._boxPointer.add_effect_with_name("blur", this.blur)
}
this.tracker = new QuickSettingsMenuTracker()
this.tracker.onMenuOpen = this.onOpen.bind(this)
this.tracker.load()
}
override onUnload(): void {
const tracker = this.tracker
if (!tracker) return
this.tracker = null
tracker.unload()
if (this.blur) {
// @ts-ignore Box pointer is private
Global.QuickSettingsMenu._boxPointer.remove_effect(this.blur)
this.blur = null
}
Global.QuickSettingsBox.remove_all_transitions()
Global.QuickSettingsBox.scaleX = 1
Global.QuickSettingsBox.scaleY = 1
Global.QuickSettingsBox.opacity = 255
Global.QuickSettingsBox.set_pivot_point(0, 0)
}
}
================================================
FILE: src/features/overlayMenu.ts
================================================
import Clutter from "gi://Clutter"
import { QuickSlider, type QuickSettingsMenu } from "resource:///org/gnome/shell/ui/quickSettings.js"
import { FeatureBase, type SettingLoader } from "../libs/shell/feature.js"
import { QuickSettingsMenuTracker } from "../libs/shell/quickSettingsUtils.js"
import * as AdvAni from "../libs/shell/advani.js"
import Global from "../global.js"
import Maid from "../libs/shared/maid.js"
export class OverlayMenu extends FeatureBase {
// #region settings
enabled: boolean
width: number
duration: number
animationStyle: string
overflowAnchor: string
override loadSettings(loader: SettingLoader): void {
this.enabled = loader.loadBoolean("overlay-menu-enabled")
this.width = loader.loadInt("overlay-menu-width")
this.duration = loader.loadInt("overlay-menu-animate-duration")
this.animationStyle = loader.loadString("overlay-menu-animate-style")
this.overflowAnchor = loader.loadString("overlay-menu-overflow-anchor")
}
// #endregion settings
getCoords(menu: QuickSettingsMenu): {
outerHeight: number,
targetHeight: number,
targetWidth: number,
sourceX: number,
sourceY: number,
sourceHeight: number,
sourceWidth: number,
offsetY: number,
offsetX: number,
} {
menu.actor.height = -1
let [outerHeight] = menu.actor.get_preferred_height(-1)
const targetWidth = menu.actor.width - menu.box.marginLeft - menu.box.marginRight
const targetHeight = outerHeight - menu.box.marginTop
let offsetY: number
if (Global.QuickSettingsBox.height < targetHeight && this.overflowAnchor != "center") {
if (this.overflowAnchor == "top") {
offsetY = 0
} else {
offsetY = Global.QuickSettingsBox.height - targetHeight
}
} else {
offsetY = Math.floor((Global.QuickSettingsBox.height - targetHeight) / 2)
}
const isSlider = menu.sourceActor instanceof QuickSlider
const sourceHeight = Math.floor(menu.sourceActor.height + 0.5)
const sourceBaseWidth = Math.floor(menu.sourceActor.width + 0.5)
const sourceWidth = isSlider ? sourceHeight : sourceBaseWidth
const sourceBaseX = Math.floor(Global.QuickSettingsGrid.x + menu.sourceActor.x + 0.5)
const sourceY = Math.floor(Global.QuickSettingsGrid.y + menu.sourceActor.y + 0.5)
const sourceX = sourceBaseX + (isSlider ? (sourceBaseWidth - sourceWidth) : 0)
const offsetX = Math.floor((Global.QuickSettingsBox.width - targetWidth) / 2)
return {
outerHeight,
targetHeight,
targetWidth,
sourceX,
sourceY,
sourceHeight,
sourceWidth,
offsetY,
offsetX,
}
}
onOpen(_maid: Maid, menu: QuickSettingsMenu, isOpen: boolean) {
if (!isOpen || !this.duration) menu.actor.set_easing_duration(0)
else menu.actor.remove_all_transitions()
if (!isOpen) return
const coords = this.getCoords(menu)
this.yconstraint.offset = coords.offsetY
if (this.duration) {
menu.box.opacity = 0
menu.box.ease({
opacity: 255,
duration: Math.floor(this.duration / 3),
})
if (this.animationStyle == "flyout") {
menu.box.translation_x = Math.floor(coords.sourceX - coords.offsetX + menu.box.marginLeft)
menu.box.translation_y = Math.floor(coords.sourceY - coords.offsetY + menu.box.marginTop)
menu.box.scale_x = coords.sourceWidth / coords.targetWidth
menu.box.scale_y = coords.sourceHeight / coords.targetHeight
AdvAni.ease(menu.box, {
translation_x: 0,
translation_y: 0,
scale_x: 1,
scale_y: 1,
mode: AdvAni.AdvAnimationMode.LowBackover,
// mode: Clutter.AnimationMode.EASE_OUT_EXPO,
duration: this.duration,
})
} else if (this.animationStyle == "dialog") {
menu.box.translation_x = 0.2*coords.targetWidth*.5
menu.box.translation_y = 0.2*coords.targetHeight*.5
menu.box.scale_x = 0.8
menu.box.scale_y = 0.8
AdvAni.ease(menu.box, {
translation_x: 0,
translation_y: 0,
scale_x: 1,
scale_y: 1,
mode: AdvAni.AdvAnimationMode.MiddleBackover,
// mode: Clutter.AnimationMode.EASE_OUT_EXPO,
duration: this.duration,
})
}
}
}
onMenuCreated(maid: Maid, menu: QuickSettingsMenu) {
menu.actor.get_constraints()[0].enabled = false
if (this.width) {
menu.actor.width = this.width
menu.actor.x_expand = false
}
maid.connectJob(menu.box, "notify::height", ()=>{
if (!menu.isOpen) return
const coords = this.getCoords(menu)
this.yconstraint.offset = coords.offsetY
})
}
tracker: QuickSettingsMenuTracker
yconstraint: Clutter.BindConstraint
override reload(changedKey?: string): void {
if (changedKey == "overlay-menu-animate-duration") return
if (changedKey == "overlay-menu-animate-style") return
if (changedKey == "overlay-menu-overflow-anchor") return
super.reload(changedKey)
}
override onLoad(): void {
if (!this.enabled) return
// Offset handle
this.yconstraint = new Clutter.BindConstraint({
coordinate: Clutter.BindCoordinate.Y,
// @ts-ignore Box pointer is private
source: Global.QuickSettingsMenu._boxPointer,
})
// Disable Y sync (overlay y offset)
// @ts-ignore Overlay is private field
Global.QuickSettingsMenu._overlay.get_constraints()[0].enabled = false
// @ts-ignore Overlay is private field
Global.QuickSettingsMenu._overlay.add_constraint(this.yconstraint)
// Disable Placeholder height sync (grid height increase)
// @ts-ignore Overlay is private field
Global.QuickSettingsGrid.layout_manager._overlay.get_constraints()[0].enabled = false
this.tracker = new QuickSettingsMenuTracker()
this.tracker.onMenuCreated = this.onMenuCreated.bind(this)
this.tracker.onMenuOpen = this.onOpen.bind(this)
this.tracker.load()
}
override onUnload(): void {
const tracker = this.tracker
if (!tracker) return
this.tracker = null
for (const menu of tracker.items) {
menu.actor.x_expand = true
menu.actor.get_constraints()[0].enabled = true
}
tracker.unload()
// @ts-ignore Overlay is private field
Global.QuickSettingsMenu._overlay.get_constraints()[0].enabled = true
// @ts-ignore Overlay is private field
Global.QuickSettingsGrid.layout_manager._overlay.get_constraints()[0].enabled = true
// @ts-ignore Overlay is private field
Global.QuickSettingsMenu._overlay.remove_constraint(this.yconstraint)
}
}
================================================
FILE: src/features/toggle/unsafeQuickToggle.ts
================================================
import GObject from "gi://GObject"
import { gettext as _ } from "resource:///org/gnome/shell/extensions/extension.js"
import { QuickToggle, SystemIndicator } from "resource:///org/gnome/shell/ui/quickSettings.js"
import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js"
import Global from "../../global.js"
// #region UnsafeQuickToggle
class UnsafeQuickToggle extends QuickToggle {
_onUpdate: (value: boolean)=>void
constructor(onUpdate: UnsafeQuickToggle["_onUpdate"]) { super(onUpdate as any) }
_init(onUpdate: any) {
super._init({
title: _("Unsafe Mode"),
iconName: "channel-insecure-symbolic",
})
this._onUpdate = onUpdate
// bind click
this.connect("clicked", this._toggleMode.bind(this))
// Fetch global context
this._sync()
}
_updateIcon() {
this.iconName = this.checked ? "channel-insecure-symbolic" : "channel-secure-symbolic"
}
// Toggle context
_toggleMode() {
this.checked = !global.context.unsafe_mode
global.context.unsafe_mode = this.checked
this._updateIcon()
this._onUpdate(this.checked)
}
// Sync context
_sync() {
this.checked = global.context.unsafe_mode
this._updateIcon()
}
}
GObject.registerClass(UnsafeQuickToggle)
// #endregion UnsafeQuickToggle
// #region UnsafeIndicator
class UnsafeIndicator extends SystemIndicator {
constructor(onUpdate: UnsafeQuickToggle["_onUpdate"]) { super(onUpdate as any) }
// @ts-ignore
_init(onUpdate: any) {
super._init()
this.quickSettingsItems.push(new UnsafeQuickToggle(onUpdate))
}
destroy() {
this.quickSettingsItems.forEach(item => item.destroy())
super.destroy()
}
}
GObject.registerClass(UnsafeIndicator)
export { UnsafeIndicator }
// #endregion UnsafeIndicator
// #region UnsafeQuickToggleFeature
export class UnsafeQuickToggleFeature extends FeatureBase {
// #region settings
enabled: boolean
override loadSettings(loader: SettingLoader): void {
this.enabled = loader.loadBoolean("unsafe-quick-toggle-enabled")
}
// #endregion settings
indicator: UnsafeIndicator
override onLoad(): void {
if (!this.enabled) return
// Load last state
if (Global.Settings.get_boolean("unsafe-quick-toggle-save-last-state")) {
global.context.unsafe_mode = Global.Settings.get_boolean("unsafe-quick-toggle-last-state")
}
// Add Unsafe Quick Toggle
this.maid.destroyJob(
this.indicator = new UnsafeIndicator(
(state) => Global.Settings.set_boolean("unsafe-quick-toggle-last-state", state)
)
)
// @ts-expect-error Missing addExternalIndicator method (QuickSettings is private class)
Global.QuickSettings.addExternalIndicator(this.indicator)
}
override onUnload(): void {
global.context.unsafe_mode = false
this.indicator = null
}
}
// #endregion UnsafeQuickToggleFeature
================================================
FILE: src/features/widget/media.ts
================================================
import St from "gi://St"
import Clutter from "gi://Clutter"
import GObject from "gi://GObject"
import GLib from "gi://GLib"
import Gio from "gi://Gio"
import GdkPixbuf from "gi://GdkPixbuf"
import Shell from "gi://Shell"
// @ts-expect-error idk why
import Soup from "gi://Soup"
import * as Main from "resource:///org/gnome/shell/ui/main.js"
import * as MessageList from "resource:///org/gnome/shell/ui/messageList.js"
import { loadInterfaceXML } from "resource:///org/gnome/shell/misc/fileUtils.js"
import { Slider } from "resource:///org/gnome/shell/ui/slider.js"
import { PageIndicators } from "resource:///org/gnome/shell/ui/pageIndicators.js"
import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js"
import { Rgb } from "../../libs/shared/colors.js"
import { getImageMeanColor } from "../../libs/shared/imageUtils.js"
import { lerp } from "../../libs/shared/jsUtils.js"
import { Drag, Scroll } from "../../libs/shell/gesture.js"
import { RoundClipEffect } from "../../libs/shell/effects.js"
import { StyledSlider } from "../../libs/shell/styler.js"
import Global from "../../global.js"
import Logger from "../../libs/shared/logger.js"
// #region Player
class Player extends GObject.Object {
private _playerProxy: Gio.DBusProxy
private _propertiesProxy: Gio.DBusProxy
private _mprisProxy: Gio.DBusProxy
source: MessageList.Source
canPlay: boolean
canSeek: boolean
constructor(busName: string) {
super()
this._busName = busName
this.source = new MessageList.Source()
// Create properties proxy for Position
const propertiesIface = Global.GetDbusInterface("media/dbus.xml","org.freedesktop.DBus.Properties")
const propertiesPromise = Gio.DBusProxy.new(
Gio.DBus.session,
Gio.DBusProxyFlags.NONE,
propertiesIface,
busName,
"/org/mpris/MediaPlayer2",
propertiesIface.name,
null,
)
// @ts-expect-error Missing promise type support
.then((proxy: Gio.DbusProxy) => this._propertiesProxy = proxy)
.catch(Logger.error)
// Create proxy for seeking
const playerIface = Global.GetDbusInterface("media/dbus.xml","org.mpris.MediaPlayer2.Player")
const playerPromise = Gio.DBusProxy.new(
Gio.DBus.session,
Gio.DBusProxyFlags.NONE,
playerIface,
busName,
"/org/mpris/MediaPlayer2",
playerIface.name,
null,
)
// @ts-expect-error Missing promise type support
.then((proxy: Gio.DbusProxy) => this._playerProxy = proxy)
.catch(Logger.error)
// Create proxy for mpris
const mprisIface = Global.GetDbusInterface("media/dbus.xml","org.mpris.MediaPlayer2")
const mprisPromise = Gio.DBusProxy.new(
Gio.DBus.session,
Gio.DBusProxyFlags.NONE,
mprisIface,
busName,
"/org/mpris/MediaPlayer2",
mprisIface.name,
null,
)
// @ts-expect-error Missing promise type support
.then((proxy: Gio.DbusProxy) => this._mprisProxy = proxy)
.catch(Logger.error)
// Waitting for proxies
Promise.all([
playerPromise,
propertiesPromise,
mprisPromise
])
.then(this._ready.bind(this))
.catch(Logger.error)
}
// Position
get position(): Promise {
return this._propertiesProxy.GetAsync(
"org.mpris.MediaPlayer2.Player",
"Position"
).then((result: any) => {
return result[0].get_int64()
}).catch(()=> null)
}
set position(value: number) {
this._playerProxy.SetPositionAsync(
this._trackId,
Math.min(this._length, Math.max(1, value))
).catch(Logger.error)
}
// States
private _busName: string
private _trackId: string
private _length: number | null
private _trackArtists: string[] | null
private _trackTitle: string | null
private _trackCoverUrl: string | null
private _app: Shell.App | null
get busName(): string {
return this._busName
}
get trackId(): string {
return this._trackId
}
get length(): number|null {
return this._length
}
get trackArtists(): string[] | null {
return this._trackArtists
}
get trackTitle(): string | null {
return this._trackTitle
}
get trackCoverUrl(): string | null {
return this._trackCoverUrl
}
get app(): Shell.App | null {
return this._app
}
get canGoNext(): boolean | null {
return this._playerProxy.CanGoNext
}
get canGoPrevious(): boolean | null {
return this._playerProxy.CanGoPrevious
}
get status(): string | null {
return this._playerProxy.PlaybackStatus
}
// Update states
_parseMetadata(metadata: any) {
if (!metadata) {
this._trackId = null
this._length = null
this._trackArtists = null
this._trackCoverUrl = null
return
}
this._trackId = metadata["mpris:trackid"]?.get_string()[0] ?? null
this._length = metadata["mpris:length"]?.deepUnpack() ?? null
// Get trak artists
this._trackArtists = metadata['xesam:artist']?.deepUnpack()
if (typeof this._trackArtists === "string") {
this._trackArtists = [this._trackArtists]
} else if (
!Array.isArray(this._trackArtists)
|| !this._trackArtists.every(artist => typeof artist === 'string')
) {
this._trackArtists = [(_)('Unknown artist')]
}
// Get track title
this._trackTitle = metadata['xesam:title']?.deepUnpack()
if (typeof this._trackTitle !== 'string') {
this._trackTitle = _('Unknown title')
}
// Get track cover
this._trackCoverUrl = metadata['mpris:artUrl']?.deepUnpack()
if (typeof this._trackCoverUrl !== 'string') {
this._trackCoverUrl = null
}
// Update desktop entry
if (this._mprisProxy.DesktopEntry) {
this._app = Shell.AppSystem.get_default().lookup_app(
this._mprisProxy.DesktopEntry + ".desktop"
)
} else {
this._app = null
}
// Update source
this.source.set({
title: this._app?.get_name() ?? this._mprisProxy.Identity,
icon: this._app?.get_icon() ?? null,
})
// Update can play
this.canPlay = !!this._playerProxy.CanPlay
this.canSeek = this._playerProxy.CanSeek
}
_update() {
try {
const metadata = (this as any)._playerProxy.Metadata
this._parseMetadata(metadata)
} catch {}
this.emit("changed")
}
// Methods
previous() {
this._playerProxy.PreviousAsync()
.catch(Logger.error)
}
next() {
this._playerProxy.NextAsync()
.catch(Logger.error)
}
playPause() {
this._playerProxy.PlayPauseAsync()
.catch(Logger.error)
}
raise() {
if (this._app) {
this._app.activate()
} else if (this._mprisProxy.CanRaise) {
this._mprisProxy.RaiseAsync().catch(logError)
}
}
isPlaying(): boolean {
return this.status === "Playing"
}
// Proxy handling
_ready() {
// Connect mpris proxy
this._mprisProxy.connectObject('notify::g-name-owner',
() => {
if (!this._mprisProxy.g_name_owner) this._close()
},
this
)
if (!this._mprisProxy.g_name_owner) this._close()
// Connect player proxy
this._playerProxy.connectObject(
'g-properties-changed',
this._update.bind(this),
this
)
this._update()
}
_close() {
this._mprisProxy.disconnectObject(this)
this._playerProxy.disconnectObject(this)
this._mprisProxy = null
this._playerProxy = null
this._propertiesProxy = null
}
}
GObject.registerClass({
Properties: {
"can-play": GObject.ParamSpec.boolean(
"can-play", null, null,
GObject.ParamFlags.READWRITE,
false
),
"can-seek": GObject.ParamSpec.boolean(
"can-seek", null, null,
GObject.ParamFlags.READWRITE,
false
),
},
Signals: {
"changed": {},
},
}, Player)
// #endregion Player
// #region Source
// Copied from gnome source; for backward compatibility
// https://github.com/GNOME/gnome-shell/blob/ef4af961bfb39911ae09cb95e1e57d374c70fe1d/js/ui/mpris.js#L189
const DBusIface = loadInterfaceXML("org.freedesktop.DBus")
const DBusProxy = Gio.DBusProxy.makeProxyWrapper(DBusIface)
const MPRIS_PLAYER_PREFIX = "org.mpris.MediaPlayer2."
class Source extends GObject.Object {
_players: Map
_proxy: Gio.DBusProxy
_init() {
super._init()
this._players = new Map()
}
start() {
// @ts-expect-error Type error (DBusProxy is not a class)
this._proxy = new DBusProxy(Gio.DBus.session,
'org.freedesktop.DBus',
'/org/freedesktop/DBus',
this._onProxyReady.bind(this)
)
}
get players(): Player[] {
return [...this._players.values()]
}
private _addPlayer(busName: string) {
if (this._players.has(busName)) return
const player = new Player(busName)
this._players.set(busName, player)
player.connectObject("notify::can-play",
() => {
this.emit(
player.canPlay ? "player-added" : "player-removed",
player
)
},
this
)
}
private async _onProxyReady() {
const [names]: [string[]] = await this._proxy.ListNamesAsync()
for (const name of names) {
if (!name.startsWith(MPRIS_PLAYER_PREFIX)) continue
this._addPlayer(name)
}
// @ts-expect-error
this._proxy.connectSignal(
'NameOwnerChanged',
this._onNameOwnerChanged.bind(this)
)
}
private _onNameOwnerChanged(proxy: any, sender: any, [name, oldOwner, newOwner]: any[]) {
if (!name.startsWith(MPRIS_PLAYER_PREFIX)) return
if (oldOwner) {
const player = this._players.get(name)
if (player) {
this._players.delete(name)
player.disconnectObject(this)
this.emit('player-removed', player)
}
}
if (newOwner) this._addPlayer(name)
}
}
GObject.registerClass({
Signals: {
"player-added": {param_types: [Player as any]},
"player-removed": {param_types: [Player as any]},
},
}, Source)
// #endregion
// #region ProgressControl
class ProgressControl extends St.BoxLayout {
_positionLabel: St.Label
_lengthLabel: St.Label
_slider: Slider
_player: Player
_positionTracker: number|null
_dragging: boolean
_shown: boolean
_options: ProgressControl.Options
constructor(player: Player, options: ProgressControl.Options) {
super(player as any, options as any)
}
_init(player: Player, options: ProgressControl.Options): void {
this._player = player
this._positionTracker = null
this._dragging = false
this._shown = false
this._options = options
super._init({
x_expand: true,
style_class: "QSTWEAKS-progress-control",
})
this._createLabels()
this._createSlider()
this.add_child(this._positionLabel)
this.add_child(this._slider)
this.add_child(this._lengthLabel)
this.connect("notify::mapped", this._updateTracker.bind(this))
this.connect("destroy", this._dropTracker.bind(this))
this._player.connectObject("changed", () => this._updateStatus(), this)
}
// Create position, length label
_createLabels() {
this._positionLabel = new St.Label({
y_expand: true,
y_align: Clutter.ActorAlign.CENTER,
style_class: "QSTWEAKS-position-label",
})
this._lengthLabel = new St.Label({
y_expand: true,
y_align: Clutter.ActorAlign.CENTER,
style_class: "QSTWEAKS-length-label",
})
}
// Create slider and connect drag event
_createSlider() {
const oldSlider = this._slider
const slider = this._slider ??= new Slider(0)
// Update style
slider.style = StyledSlider.getStyle(this._options.sliderStyle)
if (oldSlider) return
// Process Dragging
slider.connectObject("drag-begin", () => {
this._dragging = true
return Clutter.EVENT_PROPAGATE
}, this)
slider.connectObject("drag-end", () => {
this._player.position = (Math.floor(slider.value) * 1000000)
this._dragging = false
return Clutter.EVENT_PROPAGATE
}, this)
slider.connectObject("scroll-event", () => {
return Clutter.EVENT_STOP
}, this)
slider.connectObject("notify::value", () => {
if (this._dragging) this._updatePosition(Math.floor(slider.value) * 1000000)
}, this)
}
// Show / Hide by playing status
_updateStatus(noAnimate?: boolean) {
if (!this.mapped) return
this._shown = this._player.isPlaying()
if (this._shown) this._trackPosition()
const previousHeight = this.height
this.height = -1
const height = this._shown ? this.get_preferred_height(-1)[0] : 0
this.height = previousHeight
const opacity = this._shown ? 255 : 0
if (noAnimate) {
this.remove_all_transitions()
this.height = height
this.opacity = opacity
return
}
if (this._shown) {
this.ease({
height,
duration: 150,
onComplete: ()=>{
this.ease({
opacity,
duration: 150,
})
}
})
} else {
this.ease({
opacity,
duration: 200,
onComplete: ()=>{
this.ease({
height,
duration: 150,
})
}
})
}
}
// Update slider and label
_updatePosition(current: number) {
const currentSeconds = Math.floor(current / 1000000)
const lengthSeconds = Math.floor(this._player.length / 1000000)
this._positionLabel.text = this._formatSeconds(currentSeconds)
this._lengthLabel.text = this._formatSeconds(lengthSeconds)
this._slider.overdriveStart = this._slider.maximumValue = lengthSeconds
this._slider.value = currentSeconds
}
// Use polling to update position when only shown
_trackPosition() {
this._slider.reactive = this._player.canSeek
if (this._shown && !this._dragging) {
this._player.position
.then(this._updatePosition.bind(this))
.catch(Logger.error)
}
return GLib.SOURCE_CONTINUE
}
_dropTracker() {
if (this._positionTracker === null) return
GLib.source_remove(this._positionTracker)
this._positionTracker = null
}
_createTracker() {
this._positionTracker = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 1000, this._trackPosition.bind(this))
GLib.source_set_name_by_id(
this._positionTracker,
"[quick-settings-tweaks] ProgressControl._createTracker: this._positionTracker"
)
}
_updateTracker() {
if (this.mapped) this._createTracker()
else this._dropTracker()
this._updateStatus(true)
}
// Seconds => HH:MM:SS or MM:SS
_formatSeconds(seconds: number) {
const minutes = Math.floor(seconds / 60) % 60
const hours = Math.floor(seconds / 3600) % 60
seconds %= 60
const secondsPadded = seconds.toString().padStart(2, "0")
const minutesPadded = minutes.toString().padStart(2, "0")
if (hours > 0) return `${hours}:${minutesPadded}:${secondsPadded}`
return `${minutes}:${secondsPadded}`
}
}
GObject.registerClass(ProgressControl)
namespace ProgressControl {
export interface OptionsBase {
sliderStyle: StyledSlider.Options
}
export type Options = {
} & OptionsBase
}
// #endregion ProgressControl
// #region MediaItem
class MediaItem extends MessageList.Message {
// Gnome 48 doesn't exports MediaMessage, so we should implement it
// (i have no idea why, backward compatibility killer)
_player: Player
_cachedColors: Map>
_options: MediaItem.Options
_progressControl?: ProgressControl
_prevButton: St.Button
_pauseButton: St.Button
_nextButton: St.Button
constructor(player: Player, options: MediaItem.Options) {
super(player.source)
this.add_style_class_name('media-message')
this._options = options
this._player = player
this.addEventStop((this as any)._header)
// Create controls
if (options.progressEnabled) {
this.child.add_child(
this._progressControl = new ProgressControl(player, options)
)
}
this._createControlButtons()
// Connect player
this._player.connectObject(
'changed', this._update.bind(this),
this
)
this._update()
}
// Create and update control buttons
_createControlButtons() {
const options = this._options
if (options.showPrevButton) this._prevButton ??= this.addEventStop(this.addMediaControl(
'media-skip-backward-symbolic',
() => this._player.previous()
) as unknown as St.Button)
if (options.showPauseButton) this._pauseButton ??= this.addEventStop(this.addMediaControl(
'',
() => this._player.playPause()
) as unknown as St.Button)
if (options.showNextButton) this._nextButton ??= this.addEventStop(this.addMediaControl(
'media-skip-forward-symbolic',
() => this._player.next()
) as unknown as St.Button)
const opacity = options.contorlOpacity
if (this._nextButton) this._nextButton.opacity = opacity
if (this._prevButton) this._prevButton.opacity = opacity
if (this._pauseButton) this._pauseButton.opacity = opacity
}
// Sync to player
_update() {
// Get icon
let icon: Gio.Icon
if (this._player.trackCoverUrl) {
const file = Gio.File.new_for_uri(this._player.trackCoverUrl)
icon = new Gio.FileIcon({file});
} else {
icon = new Gio.ThemedIcon({name: 'audio-x-generic-symbolic'})
}
// Get artist string
const trackArtists: string =
this._player.trackArtists?.join(",") ?? ""
// Update base informations
this.set({
title: this._player.trackTitle,
body: trackArtists,
icon,
})
// Update control buttons
if (this._pauseButton) {
let isPlaying = this._player.status === 'Playing';
let iconName = isPlaying
? 'media-playback-pause-symbolic'
: 'media-playback-start-symbolic';
(this._pauseButton.child as St.Icon).icon_name = iconName
}
if (this._prevButton)
this._prevButton.reactive = this._player.canGoPrevious
if (this._nextButton)
this._nextButton.reactive = this._player.canGoNext
this._updateGradient()
}
_updateGradient(): void {
// If disabled
if (!this._options?.gradientEnabled) {
this.style = ""
return
}
// Push get color task, use cache if possible
this._cachedColors ??= new Map()
const coverUrl = this._player.trackCoverUrl
let colorTask;
if (!coverUrl || coverUrl.endsWith(".svg")) return
if (coverUrl.startsWith("file://")) {
const coverPath = decodeURIComponent(coverUrl.replace(/^file:\/\//,""))
colorTask = this._cachedColors.get(coverPath)
if (!colorTask) {
let pixbuf: GdkPixbuf.Pixbuf;
try {
pixbuf = GdkPixbuf.Pixbuf.new_from_file(coverPath)
} catch (error) {
return
} finally {
if (!pixbuf) {
return
}
colorTask = getImageMeanColor(pixbuf)
this._cachedColors.set(coverPath, colorTask)
}
}
} else if (coverUrl.startsWith("https://") || coverUrl.startsWith("http://")) {
const coverPath = decodeURIComponent(coverUrl.replace(/^https?:\/\//,"").replace(/^http?:\/\//,""))
colorTask = this._cachedColors.get(coverPath)
if (!colorTask) {
const session = new Soup.Session();
const uri = GLib.Uri.parse(coverUrl, GLib.UriFlags.NONE);
const message = new Soup.Message({method: 'GET', uri});
colorTask = session.send_and_read_async(message, null, null)
.then(img_bytes => {
if (!img_bytes) throw new Error("No image data received");
const stream = Gio.MemoryInputStream.new_from_bytes(img_bytes);
const pixbuf = GdkPixbuf.Pixbuf.new_from_stream(stream as any, null);
return getImageMeanColor(pixbuf);
})
.catch(error => {
return null;
});
this._cachedColors.set(coverPath, colorTask);
}
}
// Update style
colorTask.then(color=>{
if (!color) return
if (!this._cachedColors) return
const mixStart = this._options.gradientStartMix / 1000
const mixEnd = this._options.gradientEndMix / 1000
const [bgr, bgg, bgb] = this._options.gradientBackground
const [r,g,b] = color
this.style =
`background-gradient-direction:horizontal;background-gradient-start:rgba(${
lerp(bgr, r, mixStart)
},${
lerp(bgg, g, mixStart)
},${
lerp(bgb, b, mixStart)
},${
this._options.gradientStartOpaque/1000
});background-gradient-end:rgba(${
lerp(bgr, r, mixEnd)
},${
lerp(bgg, g, mixEnd)
},${
lerp(bgb, b, mixEnd)
},${
this._options.gradientEndOpaque/1000
});`
})
}
// Pass all gesture actions to the parent
vfunc_button_press_event(_event: Clutter.Event): boolean {
return Clutter.EVENT_PROPAGATE
}
vfunc_button_release_event(_event: Clutter.Event): boolean {
return Clutter.EVENT_PROPAGATE
}
vfunc_motion_event(_event: Clutter.Event): boolean {
return Clutter.EVENT_PROPAGATE
}
vfunc_touch_event(_event: Clutter.Event): boolean {
return Clutter.EVENT_PROPAGATE
}
addEventStop(actor: T): T {
// actor.connect("button-press-event", ()=>Clutter.EVENT_STOP);
return actor;
}
}
GObject.registerClass(MediaItem)
namespace MediaItem {
export interface OptionsBase {
progressEnabled: boolean
gradientBackground: Rgb
gradientStartOpaque: number
gradientStartMix: number
gradientEndOpaque: number
gradientEndMix: number
gradientEnabled: boolean
contorlOpacity: number
showNextButton: boolean
showPrevButton: boolean
showPauseButton: boolean
}
export type Options = {
}
& OptionsBase
& ProgressControl.OptionsBase
}
// #endregion MediaItem
// #region MediaList
class MediaList extends St.BoxLayout {
_options: MediaList.Options
_current?: MediaItem
_currentMaxPage: number
_currentPage: number
_effect?: RoundClipEffect
_drag: boolean
_scroll: boolean
_dragTranslation?: number
_items: Map
_source: Source
get _messages(): MediaItem[] {
return this.get_children() as MediaItem[]
}
empty: boolean
constructor(options: MediaList.Options) {
// @ts-ignore
super(options)
}
// @ts-ignore
_init(options: MediaList.Options): void {
super._init({
can_focus: true,
reactive: true,
track_hover: true,
hover: false,
clip_to_allocation: true,
})
this._current = null
this._options = options
this._currentMaxPage = 0
this._currentPage = 0
this._drag = false
this._items = new Map()
// Round clip effect
this._initEffect()
this.connect("notify::height", this._updateEffect.bind(this))
this.connect("notify::width", this._updateEffect.bind(this))
// Scroll Event
this.connect("scroll-event", (_: Clutter.Actor, event: Clutter.Event) => {
if (this._drag) return
const direction = event.get_scroll_direction()
if (direction === Clutter.ScrollDirection.UP) {
this._seekPage(-1)
}
if (direction === Clutter.ScrollDirection.DOWN) {
this._seekPage(1)
}
})
// Connect source
this._source = new Source()
this._source.connectObject("player-removed", (_source: any, player: Player)=>{
const item = this._items.get(player)
if (!item) return
item.destroy()
this._items.delete(player)
this._sync()
},this)
this._source.connectObject("player-added", (_source: any, player: Player)=>{
if (this._items.has(player)) return
const item = new MediaItem(player, this._options)
this._items.set(player, item)
this.add_child(item)
this._sync()
}, this)
this._source.start()
}
// Round clip effect
_initEffect() {
// Disabled
if (!this._options.roundClipEnabled) {
if (this._effect) {
this.remove_effect_by_name("round-clip")
}
this._effect = null
return
}
// Enabled
const effect = this._effect = new RoundClipEffect()
effect.enabled = false
this.add_effect_with_name("round-clip", effect)
effect.connectObject("notify::enabled", ()=>{
if (effect !== this._effect) return
if (effect.enabled) this._updateEffect()
}, this)
this._updateEffect()
}
_updateEffect() {
if (!this._effect) return
if (!this.get_stage()) return
const themeNode = this.mapped ? this._current?.get_theme_node() : null
const padding = this._options.roundClipPadding
this._effect.updateUniforms(1, {
border_radius: themeNode?.get_border_radius(null) ?? 16,
smoothing: 0,
},{
x1: padding?.[3] ?? 2,
y1: padding?.[0] ?? 3,
x2: this.width - (padding?.[1] ?? 2),
y2: this.height - (padding?.[2] ?? 2)
})
}
// Handle dragging
_updateDragOffset(current: MediaItem, offset: number) {
const sign = Math.sign(offset)
const width = current.allocation.get_width()
const ratio = Math.max(Math.min(offset / width, 1), -1)
const halfRatio = Math.max(Math.min(offset * 0.5 / width, 1), -1)
const expoRatio = (1 - Math.pow(1 - Math.abs(halfRatio), 4)) * sign
current.remove_all_transitions()
this._dragTranslation = current.translationX = expoRatio * (width * 0.6)
current.opacity = Math.floor(lerp(255, 80, Math.abs(ratio)))
}
_finalizeDragOffset(current: MediaItem, offset: number) {
const width = current.allocation.get_width()
const direction = -Math.sign(offset)
if (
(this._currentPage == this._currentMaxPage - 1 && direction == 1)
|| (this._currentPage == 0 && direction == -1)
|| (width/4 > Math.abs(offset))
) {
current.ease({
mode: Clutter.AnimationMode.EASE_OUT_EXPO,
translationX: 0,
duration: 360,
opacity: 255,
onComplete: ()=>{
if (this._effect) this._effect.enabled = false
}
})
this._dragTranslation = null
return
}
this._seekPage(direction)
this._dragTranslation = null
}
dfunc_drag_end(event: Drag.Event): void {
this._drag = false
const current = this._current
if (!current || this._scroll) {
this._dragTranslation = null
return
}
if (event.isClick) {
Main.overview.hide()
Main.panel.closeQuickSettings()
current._player?.raise()
}
const offset = event.coords[0] - (event.moveStartCoords || event.startCoords)[0]
this._finalizeDragOffset(current, offset)
}
dfunc_drag_start(_event: Drag.Event): void {
if (this._scroll) return
this._drag = true
this._dragTranslation = 0
if (this._effect) this._effect.enabled = true
}
dfunc_drag_motion(event: Drag.Event): void {
if (this._scroll) return
const current = this._current
if (event.isClick || !current) return
const offset = event.coords[0] - event.moveStartCoords[0]
this._updateDragOffset(current, offset)
}
// Handle smooth scrolling
dfunc_scroll_start(_event: Scroll.Event): void {
if (this._drag) return
this._scroll = true
this._dragTranslation = 0
if (this._effect) this._effect.enabled = true
}
dfunc_scroll_motion(event: Scroll.Event): void {
if (this._drag) return
const current = this._current
if (!current) return
this._updateDragOffset(current, -event.scrollSumX * this._options.smoothScrollSpeed)
}
dfunc_scroll_end(event: Scroll.Event): void {
this._scroll = false
const current = this._current
if (!current || this._drag) {
this._dragTranslation = null
return
}
this._finalizeDragOffset(current, -event.scrollSumX * this._options.smoothScrollSpeed)
}
// Handle page action
get page(): number {
return this._currentPage
}
set page(page: number) {
this._setPage(this._messages[page])
}
get maxPage(): number {
return this._currentMaxPage
}
_showFirstPlaying() {
// Show first playing message
const messages = this._messages
this._setPage(
messages.find(message => message?._player.isPlaying())
?? messages[0]
)
}
_setPage(to: MediaItem) {
const current = this._current
const messages = this._messages
this._current = to
if (!to || to == current) return
for (const message of messages) {
message.remove_all_transitions()
if (message == current) continue
message.hide()
}
const toIndex = messages.findIndex(message => message == to)
this._currentPage = toIndex
this.emit("page-updated", toIndex)
if (!current) {
to.show()
return
}
const currentIndex = messages.findIndex(message => message == current)
if (this._effect) this._effect.enabled = true
current.ease({
opacity: 0,
translationX: (toIndex > currentIndex ? -120 : 120) + (this._dragTranslation ?? 0),
duration: 100,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: ()=>{
current.hide()
to.opacity = 0
to.translationX = toIndex > currentIndex ? 120 : -120
to.show()
to.ease({
mode: Clutter.AnimationMode.EASE_OUT_EXPO,
duration: 280,
translationX: 0,
opacity: 255,
onStopped: ()=>{
if (this._effect) this._effect.enabled = false
if (!this._messages.includes(to)) return
to.opacity = 255
to.translationX = 0
}
})
},
onStopped: ()=>{
if (!this._messages.includes(current)) return
current.opacity = 255
current.translationX = 0
}
})
}
_seekPage(offset: number) {
const messages = this._messages
if (this._current === null) return
let currentIndex = messages.findIndex(message => message == this._current)
if (currentIndex == -1) currentIndex = 0
const length = messages.length
this._setPage(messages[((currentIndex + offset + length) % length)])
}
// New message / Remove message
_sync() {
const messages = this._messages
const empty = messages.length == 0
// Emit max page update
if (this._currentMaxPage != messages.length) {
this.emit("max-page-updated",
this._currentMaxPage = messages.length
)
}
// Current message destroyed
if (this._current && (empty || !messages.includes(this._current))) {
this._current = null
}
// Hide new message
for (const message of messages) {
if (message == this._current) continue
message.hide()
}
// Show first playing message if nothing shown
if (!this._current) {
this._showFirstPlaying()
}
// Update empty state
this.empty = empty
}
}
Drag.applyTo(MediaList)
Scroll.applyTo(MediaList)
GObject.registerClass({
Signals: {
"page-updated": {param_types: [GObject.TYPE_INT]},
"max-page-updated": {param_types: [GObject.TYPE_INT]},
},
Properties: {
"empty": GObject.ParamSpec.boolean(
"empty", null, null,
GObject.ParamFlags.READWRITE,
true
),
}
}, MediaList)
namespace MediaList {
export type Options = Partial<{
roundClipEnabled: boolean,
roundClipPadding: null|[number, number, number, number],
smoothScrollSpeed: number,
} & St.BoxLayout.ConstructorProps>
& MediaItem.OptionsBase
& ProgressControl.OptionsBase
}
// #endregion MediaList
// #region Header
class Header extends St.BoxLayout {
_headerLabel: St.Label
_pageIndicator: PageIndicators
constructor(options: Header.Options) {
super(options)
}
_init(_options: Header.Options) {
super._init({
style_class: "QSTWEAKS-header"
} as Partial)
// Label
this._headerLabel = new St.Label({
text: _("Media"),
style_class: "QSTWEAKS-header-label",
y_align: Clutter.ActorAlign.CENTER,
x_align: Clutter.ActorAlign.START,
x_expand: true
})
this.add_child(this._headerLabel)
this._pageIndicator = new PageIndicators(Clutter.Orientation.HORIZONTAL)
this._pageIndicator.x_align = Clutter.ActorAlign.END
this._pageIndicator.connectObject(
"page-activated",
(_: any, page: number) => this.emit("page-activated", page),
this
)
this._pageIndicator.y_align = Clutter.ActorAlign.CENTER
this.add_child(this._pageIndicator)// as unknown as St.BoxLayout)
}
set maxPage(maxPage: number) {
(this._pageIndicator as any).setNPages(maxPage)
}
get maxPage(): number {
return (this._pageIndicator as any).nPages
}
set page(page: number) {
(this._pageIndicator as any).setCurrentPosition(page)
}
get page(): number {
return (this._pageIndicator as any)._currentPosition
}
}
GObject.registerClass({
Signals: {
"page-activated": {param_types: [GObject.TYPE_INT]},
}
}, Header)
namespace Header {
export type Options = Partial<{
} & St.BoxLayout.ConstructorProps>
}
// #endregion Header
// #region MediaWidget
class MediaWidget extends St.BoxLayout {
_options: MediaWidget.Options
_scroll: St.ScrollView
_list: MediaList
_header: Header
_sections: St.BoxLayout
constructor(options: MediaWidget.Options) {
super(options)
}
_init(options: MediaWidget.Options) {
super._init({
orientation: Clutter.Orientation.VERTICAL,
x_expand: true,
y_expand: true,
reactive: true,
} as Partial)
this._options = options
this._updateStyleClass()
// Create header
this._header = new Header({})
this.add_child(this._header)
// Create list
this._list = new MediaList(options)
this.add_child(this._list)
this._list.connectObject(
"notify::empty",
this._syncEmpty.bind(this),
this
)
this._syncEmpty()
// Sync page update & page indicator
this._header.page = this._list.page
this._header.maxPage = this._list.maxPage
this._list.connectObject("page-updated", (_, page: number): void => {
if (this._header.page == page) return
this._header.page = page
}, this)
this._list.connectObject("max-page-updated", (_, maxPage: number): void => {
if (this._header.maxPage == maxPage) return
this._header.maxPage = maxPage
}, this)
this._header.connectObject("page-activated", (_, page: number) => {
this._list.page = page
}, this)
}
_syncEmpty() {
this.visible = !this._list.empty
}
_updateStyleClass() {
const options = this._options
let style = "QSTWEAKS-media"
if (options.compact) style += " QSTWEAKS-message-compact"
if (options.removeShadow) style += " QSTWEAKS-message-remove-shadow"
this.style_class = style
}
}
GObject.registerClass(MediaWidget)
namespace MediaWidget {
export type Options = Partial<{
compact: boolean
removeShadow: boolean
} & St.BoxLayout.ConstructorProps>
& MediaItem.OptionsBase
& ProgressControl.OptionsBase
}
// #endregion MediaWidget
// #region MediaWidgetFeature
export class MediaWidgetFeature extends FeatureBase {
// #region settings
enabled: boolean
header: boolean
compact: boolean
removeShadow: boolean
progressEnabled: boolean
sliderStyle: StyledSlider.Options
gradientBackground: Rgb
gradientStartOpaque: number
gradientStartMix: number
gradientEndOpaque: number
gradientEndMix: number
gradientEnabled: boolean
contorlOpacity: number
roundClipEnabled: boolean
roundClipPadding: null|[number, number, number, number]
smoothScrollSpeed: number
showNextButton: boolean
showPrevButton: boolean
showPauseButton: boolean
override loadSettings(loader: SettingLoader): void {
this.enabled = loader.loadBoolean("media-enabled")
this.header = loader.loadBoolean("media-show-header")
this.compact = loader.loadBoolean("media-compact")
this.removeShadow = loader.loadBoolean("media-remove-shadow")
this.smoothScrollSpeed = loader.loadInt("media-smooth-scroll-speed")
// Control buttons
this.contorlOpacity = loader.loadInt("media-contorl-opacity")
this.showNextButton = loader.loadBoolean("media-contorl-show-next-button")
this.showPrevButton = loader.loadBoolean("media-contorl-show-prev-button")
this.showPauseButton = loader.loadBoolean("media-contorl-show-pause-button")
// Gradient
this.gradientBackground = loader.loadRgb("media-gradient-background-color")!
this.gradientEnabled = loader.loadBoolean("media-gradient-enabled")
this.gradientStartOpaque = loader.loadInt("media-gradient-start-opaque")
this.gradientStartMix = loader.loadInt("media-gradient-start-mix")
this.gradientEndOpaque = loader.loadInt("media-gradient-end-opaque")
this.gradientEndMix = loader.loadInt("media-gradient-end-mix")
// Progress
this.progressEnabled = loader.loadBoolean("media-progress-enabled")
this.sliderStyle = StyledSlider.Options.fromLoader(loader, "media-progress")
// Round clip
this.roundClipEnabled = loader.loadBoolean("media-round-clip-enabled")
const roundClipPaddingValue = loader.loadValue("media-round-clip-padding-adjustment-value")
const roundClipPaddingEnabled = loader.loadBoolean("media-round-clip-padding-adjustment-enabled")
this.roundClipPadding = (roundClipPaddingEnabled ? roundClipPaddingValue : null) as any
}
// #endregion settings
mediaWidget?: MediaWidget
override reload(key: string): void {
// Slider style
if (StyledSlider.Options.isStyleKey("media-progress", key)) {
if (!this.enabled) return
if (!this.progressEnabled) return
for (const message of this.mediaWidget!._list._messages) {
message._progressControl!._createSlider()
}
return
}
switch (key) {
case "media-compact":
case "media-remove-shadow":
if (!this.enabled) return
this.mediaWidget!._updateStyleClass()
break
// Round clip
case "media-round-clip-enabled":
if (!this.enabled) return
this.mediaWidget!._list._initEffect()
break
// Scroll speed
case "media-smooth-scroll-speed":
break
// Round clip padding
case "media-round-clip-padding-adjustment-value":
case "media-round-clip-padding-adjustment-enabled":
break
// Control opacity
case "media-contorl-opacity":
if (!this.enabled) return
for (const message of this.mediaWidget!._list._messages) {
message._createControlButtons()
}
break
// Gradient
case "media-gradient-background-color":
case "media-gradient-enabled":
case "media-gradient-start-opaque":
case "media-gradient-start-mix":
case "media-gradient-end-opaque":
case "media-gradient-end-mix":
if (!this.enabled) return
for (const message of this.mediaWidget!._list._messages) {
message._updateGradient()
}
break
default:
super.reload()
break
}
}
override onLoad(): void {
if (!this.enabled) return
this.maid.destroyJob(
this.mediaWidget = new MediaWidget(this)
)
Global.QuickSettingsGrid.add_child(this.mediaWidget)
Global.QuickSettingsGrid.layout_manager.child_set_property(
Global.QuickSettingsGrid, this.mediaWidget, "column-span", 2
)
}
override onUnload(): void {
this.mediaWidget = null
}
}
// #endregion MediaWidgetFeature
================================================
FILE: src/features/widget/notifications.ts
================================================
import GObject from "gi://GObject"
import St from "gi://St"
import Clutter from "gi://Clutter"
import * as MessageList from "resource:///org/gnome/shell/ui/messageList.js"
import { gettext as _ } from "resource:///org/gnome/shell/extensions/extension.js"
import { type DoNotDisturbSwitch } from "resource:///org/gnome/shell/ui/calendar.js"
import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js"
import { StyledScroll } from "../../libs/shell/styler.js"
import Global from "../../global.js"
// #region Placeholder
class Placeholder extends St.BoxLayout {
_icon: St.Icon
_label: St.Label
_init() {
super._init({
orientation: Clutter.Orientation.VERTICAL,
style_class: "QSTWEAKS-placeholder",
x_align: Clutter.ActorAlign.CENTER,
opacity: 60,
x_expand: true,
} as Partial)
// Symbolic Icon
this._icon = new St.Icon({
style_class: "QSTWEAKS-icon",
icon_name: "no-notifications-symbolic"
})
this.add_child(this._icon)
// No Notifications Label
this._label = new St.Label({ text: _("No Notifications") })
this.add_child(this._label)
}
}
GObject.registerClass(Placeholder)
// #endregion Placeholder
// #region ClearButton
class ClearButton extends St.Button {
_icon: St.Icon
_label: St.Label
_container: St.BoxLayout
_init() {
// Child Container
this._container = new St.BoxLayout({
x_expand: true,
y_expand: true,
})
// Button
super._init({
style_class: "QSTWEAKS-clear-button",
button_mask: St.ButtonMask.ONE,
child: this._container,
reactive: true,
can_focus: true,
y_align: Clutter.ActorAlign.CENTER,
} as Partial)
// Icon
this._icon = new St.Icon({
style_class: "QSTWEAKS-icon",
icon_name: "user-trash-symbolic",
icon_size: 12
})
this._container.add_child(this._icon)
// Label
this._label = new St.Label({
text: _("Clear")
})
this._container.add_child(this._label)
}
}
GObject.registerClass(ClearButton)
// #endregion ClearButton
// #region Header
class Header extends St.BoxLayout {
_headerLabel: St.Label
_clearButton: ClearButton
constructor(options: Header.Options) {
super(options)
}
_init(options: Header.Options) {
super._init({
style_class: "QSTWEAKS-header"
} as Partial)
// Label
this._headerLabel = new St.Label({
text: _("Notifications"),
style_class: "QSTWEAKS-header-label",
y_align: Clutter.ActorAlign.CENTER,
x_align: Clutter.ActorAlign.START,
x_expand: true
})
this.add_child(this._headerLabel)
// Clear button
if (options.createClearButton) {
this._clearButton = new ClearButton()
this.add_child(this._clearButton)
}
}
}
GObject.registerClass(Header)
namespace Header {
export type Options = Partial<{
createClearButton: boolean
} & St.BoxLayout.ConstructorProps>
}
// #endregion Header
// #region NativeControl
class NativeControl extends St.BoxLayout {
_clearButton: St.Button
_dndButton: St.Button
_dndLabel: St.Label
_dndSwitch: DoNotDisturbSwitch
_init() {
// See : https://github.com/GNOME/gnome-shell/blob/934dbe549567f87d7d6deb6f28beaceda7da1d46/js/ui/calendar.js#L979
super._init({
style_class: "QSTWEAKS-native-controls",
} as Partial)
// DND Switch
this._dndSwitch = new (Global.MessageList._dndSwitch.constructor as any)() // Calendar.DoNotDisturbSwitch();
this._dndSwitch.style_class += " QSTWEAKS-native-dnd-switch"
// DND Label
this._dndLabel = new St.Label({
style_class: "QSTWEAKS-native-dnd-text",
text: _("Do Not Disturb"),
y_align: Clutter.ActorAlign.CENTER,
})
this.add_child(this._dndLabel)
this._dndButton = new St.Button({
style_class: "dnd-button",
can_focus: true,
toggle_mode: true,
child: this._dndSwitch,
label_actor: this._dndLabel,
y_align: Clutter.ActorAlign.CENTER,
})
this._dndSwitch.bind_property("state",
this._dndButton, "checked",
GObject.BindingFlags.BIDIRECTIONAL | GObject.BindingFlags.SYNC_CREATE)
this.add_child(this._dndButton)
// Clear Button
this._clearButton = new St.Button({
style_class: "message-list-clear-button button QSTWEAKS-native-clear-button",
label: _("Clear"),
can_focus: true,
x_expand: true,
x_align: Clutter.ActorAlign.END,
accessible_name: C_("action", "Clear all notifications"),
})
this.add_child(this._clearButton)
}
}
GObject.registerClass(NativeControl)
// #endregion NativeControl
// #region NotificationList
class NotificationList extends MessageList.MessageView {
constructor() {
super()
}
// Do not setup mpris
_setupMpris() {}
}
GObject.registerClass(NotificationList)
// #endregion NotificationList
// #region NotificationWidget
class NotificationWidget extends St.BoxLayout {
_options: NotificationWidget.Options
_header: Header
_placeholder: Placeholder
_list: NotificationList
_scroll: St.ScrollView
_nativeControl: NativeControl
_sections: St.BoxLayout
constructor(options: NotificationWidget.Options) {
super(options)
}
_init(options: NotificationWidget.Options) {
super._init({
orientation: Clutter.Orientation.VERTICAL,
} as Partial)
this._options = options
this._createScroll()
this._createHeaderArea()
this._createPlaceholder()
this._createNativeControl()
this.add_child(this._header)
this.add_child(this._scroll)
if (this._placeholder) this.add_child(this._placeholder)
if (this._nativeControl) this.add_child(this._nativeControl)
this._list.connectObject(
"notify::empty",
this._syncEmpty.bind(this),
this
)
this._list.connectObject(
"notify::can-clear",
this._syncClear.bind(this),
this
)
this._syncEmpty()
this._syncClear()
this._updateMaxHeight()
this._updateStyleClass()
}
// Box style
_updateMaxHeight() {
const maxHeight = this._options.maxHeight
this.style = maxHeight
? `max-height:${maxHeight}px;`
: ""
}
_updateStyleClass() {
const options = this._options
let style = "QSTWEAKS-notifications"
if (options.useNativeControls) style += " QSTWEAKS-use-native-controls"
if (options.compact) style += " QSTWEAKS-message-compact"
if (options.removeShadow) style += " QSTWEAKS-message-remove-shadow"
this.style_class = style
}
// Scroll view
_createScroll() {
this._list = new NotificationList()
this._scroll = new St.ScrollView({
x_expand: true,
y_expand: true,
child: this._list,
})
this._updateScrollStyle()
this._scroll.connectObject(
"notify::vscrollbar-visible",
this._syncScrollbarPadding.bind(this),
this
)
this._syncScrollbarPadding()
}
_updateScrollStyle() {
StyledScroll.updateStyle(this._scroll, this._options.scrollStyle)
}
_syncScrollbarPadding() {
this._scroll.style_class =
this._scroll.vscrollbar_visible
? "QSTWEAKS-has-scrollbar"
: ""
}
_createHeaderArea() {
const header = this._header = new Header({ createClearButton: !this._options.useNativeControls })
if (header._clearButton) {
header._clearButton.connectObject(
"clicked",
this._list.clear.bind(this._list),
this
)
}
}
_createPlaceholder() {
if (this._options.autoHide) return
this._placeholder = new Placeholder()
}
_createNativeControl() {
if (!this._options.useNativeControls) return
this._nativeControl = new NativeControl()
this._nativeControl._clearButton.connectObject(
"clicked",
this._list.clear.bind(this._list),
this
)
}
// See : https://github.com/GNOME/gnome-shell/blob/934dbe549567f87d7d6deb6f28beaceda7da1d46/js/ui/calendar.js#L1043
_syncClear() {
// Sync clear button reactive state
const canClear = this._list.canClear;
// Update native control clear button if it exists
if (this._nativeControl) {
this._nativeControl._clearButton.reactive = canClear;
this._nativeControl._clearButton.can_focus = canClear;
// Update style to visually indicate if button is enabled/disabled
if (canClear) {
this._nativeControl._clearButton.remove_style_class_name('disabled');
} else {
this._nativeControl._clearButton.add_style_class_name('disabled');
}
}
// Update custom clear button if it exists
const clearButton = this._header._clearButton;
if (clearButton) {
clearButton.visible = canClear;
clearButton.reactive = canClear;
clearButton.can_focus = canClear;
// Update style to visually indicate if button is enabled/disabled
if (canClear) {
clearButton.remove_style_class_name('disabled');
} else {
clearButton.add_style_class_name('disabled');
}
}
}
_syncEmpty() {
// placeholder / autohide
const empty = this._list.empty
if (this._options.autoHide) {
this.visible = !empty
} else {
this._scroll.visible = !empty
this._placeholder.visible = empty
}
}
}
GObject.registerClass(NotificationWidget)
namespace NotificationWidget {
export type Options = {
useNativeControls: boolean
autoHide: boolean
maxHeight: number
compact: boolean
removeShadow: boolean
scrollStyle: StyledScroll.Options
}
& Partial
}
// #endregion NotificationWidget
// #region NotificationsWidgetFeature
export class NotificationsWidgetFeature extends FeatureBase {
// #region settings
enabled: boolean
useNativeControls: boolean
autoHide: boolean
maxHeight: number
compact: boolean
removeShadow: boolean
header: boolean
scrollStyle: StyledScroll.Options
override loadSettings(loader: SettingLoader): void {
this.enabled = loader.loadBoolean("notifications-enabled")
this.useNativeControls = loader.loadBoolean("notifications-use-native-controls")
this.autoHide = loader.loadBoolean("notifications-autohide")
this.maxHeight = loader.loadInt("notifications-max-height")
this.compact = loader.loadBoolean("notifications-compact")
this.removeShadow = loader.loadBoolean("notifications-remove-shadow")
this.header = loader.loadBoolean("notifications-show-header")
this.scrollStyle = StyledScroll.Options.fromLoader(loader, "notifications")
}
// #endregion settings
notificationWidget: NotificationWidget
override reload(key: string): void {
switch (key) {
case "notifications-max-height":
if (!this.enabled) return
this.notificationWidget!._updateMaxHeight()
break
case "notifications-compact":
case "notifications-remove-shadow":
if (!this.enabled) return
this.notificationWidget!._updateStyleClass()
break
case "notifications-fade-offset":
case "notifications-show-scrollbar":
if (!this.enabled) return
this.notificationWidget!._updateScrollStyle()
break
default:
super.reload()
break
}
}
override onLoad(): void {
if (!this.enabled) return
// Create Notification Box
this.maid.destroyJob(
this.notificationWidget = new NotificationWidget(this)
)
// Add to grid
Global.QuickSettingsGrid.add_child(this.notificationWidget)
Global.QuickSettingsGrid.layout_manager.child_set_property(
Global.QuickSettingsGrid, this.notificationWidget, "column-span", 2
)
}
override onUnload(): void {
this.notificationWidget = null
}
}
// #endregion NotificationsWidgetFeature
================================================
FILE: src/features/widget/volumeMixer.ts
================================================
/*
* This code is partially licensed under the gnome-volume-mixer license.
* For more details, please check the license page in the about tab of the extension settings.
*/
import St from "gi://St"
import Gvc from "gi://Gvc"
import GObject from "gi://GObject"
import Gio from "gi://Gio"
import GLib from "gi://GLib"
import { QuickSlider } from "resource:///org/gnome/shell/ui/quickSettings.js"
import * as Main from "resource:///org/gnome/shell/ui/main.js"
import * as PopupMenu from "resource:///org/gnome/shell/ui/popupMenu.js"
import * as Volume from "resource:///org/gnome/shell/ui/status/volume.js"
import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js"
import { StyledScroll } from "../../libs/shell/styler.js"
import { updateMenuSeparators } from "../../libs/shell/quickSettingsUtils.js"
import Maid from "../../libs/shared/maid.js"
import Global from "../../global.js"
import Logger from "../../libs/shared/logger.js"
import Clutter from "gi://Clutter"
const ALLOW_AMPLIFIED_VOLUME_KEY = "allow-volume-above-100-percent"
// #region StreamSlider
class StreamSlider extends QuickSlider {
_maid: Maid
_control: Gvc.MixerControl
_inDrag: boolean
_notifyVolumeChangeId: number
_deviceSection: PopupMenu.PopupMenuSection
_sliderChangedId: number
_options: StreamSlider.Options
constructor(
control: Gvc.MixerControl,
stream: Gvc.MixerStream,
options: VolumeMixerList.Options
) {
// @ts-ignore
super(control, stream, options)
}
// @ts-ignore
_init(control: Gvc.MixerControl, stream: Gvc.MixerStream|undefined, options: StreamSlider.Options) {
this._options = options
this._control = control
this._notifyVolumeChangeId = 0
this._maid = new Maid()
super._init()
this._maid.connectJob(this, "destroy", this._destroy.bind(this))
// Update allow amplify
this._soundSettings = new Gio.Settings({
schema_id: 'org.gnome.desktop.sound',
})
this._maid.connectJob(
this._soundSettings,
`changed::${ALLOW_AMPLIFIED_VOLUME_KEY}`,
this._updateAllowAmplified.bind(this)
)
this._updateAllowAmplified()
// Update icon
this.iconReactive = true
this.connect("icon-clicked", ()=>{
if (!this._stream) return
this._stream.set_is_muted(!this._stream.is_muted)
})
// Value change connection
this._inDrag = false
this._sliderChangedId = this._maid.connectJob(this.slider, "notify::value", this._sliderChanged.bind(this))
this._maid.connectJob(this.slider, "drag-begin", () => { this._inDrag = true })
this._maid.connectJob(this.slider, "drag-end", () => { this._inDrag = false })
// this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem())
// this.menu.addSettingsAction(_('Sound Settings'), 'gnome-sound-panel.desktop')
// Update stream
if (stream) {
this.stream = stream
} else {
this._stream = null
}
}
// Stream connection
_stream: Gvc.MixerStream
get stream(): Gvc.MixerStream {
return this._stream
}
set stream(stream: Gvc.MixerStream) {
if (this._stream == stream) return
this._stream?.disconnectObject(this)
this._stream = stream
if (stream) {
// Create connection
stream.connectObject(
'notify::is-muted', this._updateSlider.bind(this),
'notify::volume', this._updateSlider.bind(this),
this
)
this._updateSlider()
} else {
this.emit('stream-updated')
}
this._sync()
}
_sync() {
// Sync visibility
this.visible = this._stream != null
this.menuEnabled = false // this._deviceItems.size > 1
// Show icon
if (this._options.showIcon) {
// this.icon_name = stream.get_icon_name()
this.gicon = this._stream.get_gicon()
}
}
// Volume feedback sfx
_volumeCancellable?: Gio.Cancellable|null
_feedbackVolumeChange() {
// Cancel last sound
if (this._volumeCancellable) this._volumeCancellable.cancel()
this._volumeCancellable = null
// Feedback not necessary while playing
if (this._stream.state === Gvc.MixerStreamState.RUNNING) return
// Play sound feedback
this._volumeCancellable = new Gio.Cancellable()
global
.display
.get_sound_player()
.play_from_theme(
'audio-volume-change',
_('Volume changed'),
this._volumeCancellable
)
}
// Update slider value (without emitting notify::value connection)
_updateSlider() {
this.slider.block_signal_handler(this._sliderChangedId)
this.slider.value =
this._stream.is_muted
? 0
: (this._stream.volume / this._control.get_vol_max_norm())
this.slider.unblock_signal_handler(this._sliderChangedId)
this.emit('stream-updated')
}
// Slider value notify
_sliderChanged() {
if (!this._stream) return
const volume: number = this.slider.value * this._control.get_vol_max_norm()
const prevMuted: boolean = this._stream.is_muted
const prevVolume: number = this._stream.volume
const volumeChanged: boolean = this._stream.volume !== prevVolume
if (volume < 1) {
this._stream.volume = 0
if (!prevMuted) this._stream.change_is_muted(true)
} else {
this._stream.volume = volume
if (prevMuted) this._stream.change_is_muted(false)
}
this._stream.push_volume()
if (volumeChanged && !this._notifyVolumeChangeId && !this._inDrag) {
this._notifyVolumeChangeId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 30, () => {
this._feedbackVolumeChange()
this._notifyVolumeChangeId = 0
return GLib.SOURCE_REMOVE
})
GLib.Source.set_name_by_id(
this._notifyVolumeChangeId,
'[quick-settings-tweaks] StreamSlider._sliderChanged: this._notifyVolumeChangeId'
)
}
}
// Update allow amplified from org.gnome.desktop.sound
_soundSettings: Gio.Settings
_allowAmplified: boolean
_updateAllowAmplified() {
this._allowAmplified = this._soundSettings.get_boolean(ALLOW_AMPLIFIED_VOLUME_KEY)
this.slider.maximumValue = this._allowAmplified ? this.getMaxLevel() : 1
if (this._stream) this._updateSlider()
}
getLevel(): number|null {
if (!this._stream) return null
return this._stream.volume / this._control.get_vol_max_norm()
}
getMaxLevel(): number {
const maxVolume =
this._allowAmplified
? this._control.get_vol_max_amplified()
: this._control.get_vol_max_norm()
return maxVolume / this._control.get_vol_max_norm()
}
_destroy() {
this._maid.destroy()
this._maid = null
if (this._notifyVolumeChangeId) {
GLib.Source.remove(this._notifyVolumeChangeId)
this._notifyVolumeChangeId = null
}
this._soundSettings = null
if (this._volumeCancellable) {
this._volumeCancellable.cancel()
this._volumeCancellable = null
}
}
// I have no idea why, slider has finite height, so we should floor it for scroll layout
vfunc_get_preferred_height(for_width: number): [number, number] {
return super.vfunc_get_preferred_height(for_width).map(Math.floor) as [number, number]
}
}
GObject.registerClass({
Signals: {
'stream-updated': {},
},
}, StreamSlider)
namespace StreamSlider {
export interface Options {
showIcon: boolean
}
}
// #endregion StreamSlider
// #region VolumeMixerItem
class VolumeMixerItem extends St.BoxLayout {
_control: Gvc.MixerControl
_stream: Gvc.MixerStream
_options: VolumeMixerItem.Options
_slider: StreamSlider
_label: St.Label
constructor(
control: Gvc.MixerControl,
stream: Gvc.MixerStream|undefined,
options: VolumeMixerItem.Options
) {
super(control, stream, options)
}
_init(
control: Gvc.MixerControl,
stream: Gvc.MixerStream|undefined,
options: VolumeMixerItem.Options
) {
super._init({
orientation: Clutter.Orientation.VERTICAL,
style_class: "QSTWEAKS-item",
})
this._control = control
this._stream = stream
this._options = options
// Create label
const label = this._label = new St.Label({
x_expand: true,
style_class: "QSTWEAKS-label",
opacity: this._options.labelOpacity,
})
this._updateLabel()
this.add_child(label)
// Create Slider
const slider = this._slider = new StreamSlider(control, stream, options)
this.add_child(slider)
}
_updateLabel() {
const label = this._label
const name = this._stream.get_name()
const description = this._stream.get_description()
switch (this._options.labelText) {
case "title":
if (name) label.text = name
else if (description) label.text = description
if (description || name) label.show()
else label.hide()
break
case "description":
if (description) label.text = description
else if (name) label.text = name
if (description || name) label.show()
else label.hide()
break
case "both":
if (name && description) label.text = `${name} - ${description}`
else if (name) label.text = name
else if (description) label.text = description
if (name || description) label.show()
else label.hide()
break
case "none":
label.hide()
break
}
}
_sync() {
this._updateLabel()
this._slider._sync()
}
}
GObject.registerClass(VolumeMixerItem)
namespace VolumeMixerItem {
export type Options = {
labelText: "title"|"description"|"both"|"none",
labelOpacity: number,
} & StreamSlider.Options
}
// #endregion VolumeMixerItem
// #region VolumeMixerList
class VolumeMixerList extends St.BoxLayout {
_control: Gvc.MixerControl
_maid: Maid
_options: VolumeMixerList.Options
_sliders: Map
shouldShow: boolean
constructor(options: VolumeMixerList.Options) {
super({
orientation: Clutter.Orientation.VERTICAL,
style_class: "QSTWEAKS-volume-mixer",
clip_to_allocation: true,
x_expand: true,
})
this._options = options
this._maid = new Maid()
this._sliders = new Map()
// this._applicationMenus = new Map()//{}
this._control = Volume.getMixerControl()
this._maid.connectJob(this._control, "stream-added", this._streamAdded.bind(this))
this._maid.connectJob(this._control, "stream-removed", this._streamRemoved.bind(this))
this._maid.connectJob(this._control, "stream-changed", this._streamChanged.bind(this))
for (const stream of this._control.get_streams()) {
this._streamAdded(this._control, stream.get_id())
}
this.connect("destroy", ()=>{
this._maid.destroy()
this._maid = null
for (const slider of this._sliders.values()) {
slider.destroy()
}
this._sliders = null
})
// Group with application id << we need this
// description regex
// name regex
// application regex
// show as popup menu
// this._filteredApps = settings["volume-mixer-filtered-apps"]
// this._filterMode = settings["volume-mixer-filter-mode"]
// this._showStreamDesc = settings["volume-mixer-show-description"]
// this._showStreamIcon = settings["volume-mixer-show-icon"]
// this._useRegex = settings["volume-mixer-use-regex"]
// this._checkDescription = settings["volume-mixer-check-description"]
}
_streamAdded(control: Gvc.MixerControl, id: number) {
if (this._sliders.has(id)) {
return
}
const stream = control.lookup_stream_id(id)
if (stream.is_event_stream || !(stream instanceof Gvc.MixerSinkInput)) {
return
}
// const applicationId = stream.get_application_id()
// const name = stream.get_name()
// const description = stream.get_description()
// filter here
// let hasFiltered = false
// for (const matchStr of this._filteredApps) {
// let matchExp = this._useRegex ? new RegExp(matchStr) : matchStr
// if (
// // Check name
// this._checkMatch(name, matchExp)
// // Check description
// || this._checkDescription && this._checkMatch(description, matchExp)
// ) { hasFiltered = true; break }
// }
// if (this._filterMode === "block" && hasFiltered) return
// if (this._filterMode === "allow" && !hasFiltered) return
const slider = new VolumeMixerItem(
this._control,
stream,
this._options
)
this._sliders.set(id, slider)
this.add_child(slider)
this._sync()
}
_streamChanged(control: Gvc.MixerControl, id: number) {
const slider = this._sliders.get(id)
const stream = control.lookup_stream_id(id)
if (!slider) return
// filter check here, or create new here
slider._sync()
}
_streamRemoved(_control: Gvc.MixerControl, id: number) {
const slider = this._sliders.get(id)
if (!slider) return
slider.destroy()
this._sliders.delete(id)
this._sync()
}
_sync() {
if (!this._sliders.size) {
this.shouldShow = false
return
}
for (const slider of this._sliders.values()) {
if (slider.visible) {
this.shouldShow = true
return
}
}
this.shouldShow = false
}
}
GObject.registerClass({
Properties: {
'should-show': GObject.ParamSpec.boolean(
'should-show', null, null,
GObject.ParamFlags.READWRITE,
false),
},
}, VolumeMixerList)
namespace VolumeMixerList {
export type Options = {
} & VolumeMixerItem.Options
}
// #endregion VolumeMixerList
// #region VolumeMixerWidget
class VolumeMixerWidget extends St.BoxLayout {
_options: VolumeMixerWidget.Options
// _header: Header
_list: VolumeMixerList
_scroll: St.ScrollView
_sections: St.BoxLayout
constructor(options: VolumeMixerWidget.Options) {
super(options)
}
_init(options: VolumeMixerWidget.Options) {
super._init({
orientation: Clutter.Orientation.VERTICAL,
} as Partial)
this._options = options
this._createScroll()
this.add_child(this._scroll)
this._updateMaxHeight()
this._updateStyleClass()
this._list.connectObject(
"notify::should-show",
this._sync.bind(this),
this
)
this._sync()
}
// Box style
_updateMaxHeight() {
const maxHeight = this._options.maxHeight
this.style = maxHeight
? `max-height:${maxHeight}px;`
: ""
}
_updateStyleClass() {
const options = this._options
let style = "QSTWEAKS-volume-mixer"
this.style_class = style
}
// Scroll view
_createScroll() {
this._sections = new St.BoxLayout({
orientation: Clutter.Orientation.VERTICAL,
x_expand: true,
y_expand: true,
})
this._scroll = new St.ScrollView({
x_expand: true,
y_expand: true,
child: this._sections,
})
this._updateScrollStyle()
this._scroll.connectObject(
"notify::vscrollbar-visible",
this._syncScrollbarPadding.bind(this),
this
)
this._syncScrollbarPadding()
this._list = new VolumeMixerList(this._options)
this._sections.add_child(this._list)
}
_updateScrollStyle() {
StyledScroll.updateStyle(this._scroll, this._options.scrollStyle)
}
_syncScrollbarPadding() {
this._sections.style_class =
this._scroll.vscrollbar_visible
? "QSTWEAKS-has-scrollbar"
: ""
}
// Get height with avoiding unnecessary allocation
vfunc_get_preferred_height(for_width: number): [number, number] {
if (!this.get_stage()) return [0, 0]
const contentHeight = this._list.get_preferred_height(for_width)
const maxHeight = this._options.maxHeight
if (!maxHeight) return contentHeight
return [Math.min(maxHeight, contentHeight[0]), Math.min(maxHeight, contentHeight[1])]
}
_sync() {
this.visible = this._list.shouldShow
}
}
GObject.registerClass(VolumeMixerWidget)
namespace VolumeMixerWidget {
export type Options = {
maxHeight: number,
scrollStyle: StyledScroll.Options
}
& Partial
& VolumeMixerList.Options
}
// #endregion VolumeMixerWidget
// #region VolumeMixerWidgetFeature
export class VolumeMixerWidgetFeature extends FeatureBase {
// #region settings
enabled: boolean
showIcon: boolean
maxHeight: number
labelText: VolumeMixerItem.Options["labelText"]
labelOpacity: number
menuEnabled: boolean
menuIcon: string
scrollStyle: StyledScroll.Options
override loadSettings(loader: SettingLoader): void {
this.enabled = loader.loadBoolean("volume-mixer-enabled")
this.showIcon = loader.loadBoolean("volume-mixer-show-icon")
this.maxHeight = loader.loadInt("volume-mixer-max-height")
this.labelText = loader.loadString("volume-mixer-label-text") as VolumeMixerItem.Options["labelText"]
this.labelOpacity = loader.loadInt("volume-mixer-label-opacity")
this.menuEnabled = loader.loadBoolean("volume-mixer-menu-enabled")
this.menuIcon = loader.loadString("volume-mixer-menu-icon")
this.scrollStyle = StyledScroll.Options.fromLoader(loader, "volume-mixer")
}
// #endregion settings
volumeMixerWidget: VolumeMixerWidget
mixerMenuButton: St.Button
mixerMenuSection: PopupMenu.PopupMenuSection
createMenu(slider: QuickSlider) {
// Create section
this.mixerMenuSection = new PopupMenu.PopupMenuSection()
this.mixerMenuSection.box.add_child(this.volumeMixerWidget)
this.mixerMenuSection.box.hide()
this.maid.destroyJob(this.mixerMenuSection)
// Create button
this.mixerMenuButton = new St.Button({
child: new St.Icon({icon_name: this.menuIcon}),
style_class: "icon-button flat",
can_focus: true,
x_expand: false,
y_expand: true,
visible: this.volumeMixerWidget.visible,
accessible_name: _("Open volumx mixer"),
})
this.volumeMixerWidget.bind_property(
"visible",
this.mixerMenuButton,
"visible",
null
)
// Push to output stream slider menu
slider.menu.addMenuItem(this.mixerMenuSection, 1)
slider.child.add_child(this.mixerMenuButton)
const revertChanges = ()=>{
slider.menu.setHeader("audio-headphones-symbolic", (_)("Sound Output"));
(slider.menu as any)._setSettingsVisibility(Main.sessionMode.allowSettings);
updateMenuSeparators(slider.menu);
(slider as any)._deviceSection.box.show()
}
this.maid.connectJob(this.mixerMenuButton, "clicked", () => {
this.mixerMenuSection.box.show();
(slider as any)._deviceSection.box.hide();
(slider.menu as any)._setSettingsVisibility(false)
updateMenuSeparators(slider.menu)
slider.menu.setHeader("audio-headphones-symbolic", _("Volume Mixer"))
slider.menu.open(true)
})
this.maid.destroyJob(this.mixerMenuButton)
this.maid.connectJob(slider.menu, "menu-closed", ()=>{
this.mixerMenuSection.box.hide()
revertChanges()
})
this.maid.functionJob(revertChanges)
}
override reload(key: string): void {
switch (key) {
case "volume-mixer-max-height":
if (!this.enabled) return
this.volumeMixerWidget!._updateMaxHeight()
break
case "volume-mixer-fade-offset":
case "volume-mixer-show-scrollbar":
if (!this.enabled) return
this.volumeMixerWidget!._updateScrollStyle()
break
default:
super.reload()
break
}
}
override onLoad(): void {
this.maid.destroyJob(
this.volumeMixerWidget = new VolumeMixerWidget(this)
)
if (this.menuEnabled) {
Global.GetStreamSlider().then(
({ OutputStreamSlider }) => this.createMenu(OutputStreamSlider)
).catch(Logger.error)
} else {
(Global.QuickSettingsMenu as any).addItem(this.volumeMixerWidget, 2)
Global.GetStreamSlider().then(({ InputStreamSlider }) => {
Global.QuickSettingsGrid.set_child_above_sibling(
this.volumeMixerWidget,
InputStreamSlider
)
})
}
}
override onUnload(): void {
this.volumeMixerWidget = null
}
}
// #endregion VolumeMixerWidgetFeature
================================================
FILE: src/features/widget/weather.ts
================================================
import Clutter from "gi://Clutter"
import GObject from "gi://GObject"
import GLib from "gi://GLib"
import Pango from "gi://Pango"
import St from "gi://St"
import * as Main from "resource:///org/gnome/shell/ui/main.js"
/// @ts-expect-error
import {formatTime} from "resource:///org/gnome/shell/misc/dateUtils.js"
import { WeatherClient } from "resource:///org/gnome/shell/misc/weather.js"
import GWeather from "gi://GWeather"
import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js"
import Global from "../../global.js"
// #region Client
class Client extends WeatherClient {
getInfos(maxForecasts: number, intervalHour: number): GWeather.Info[] {
const infos = []
const forecasts = this.info.get_forecast_list()
const now = GLib.DateTime.new_now_local()
let current = GLib.DateTime.new_from_unix_local(0)
for (let i = 0; i < forecasts.length; i++) {
const [valid, timestamp] = forecasts[i].get_value_update()
if (!valid || timestamp === 0) {
continue // 0 means 'never updated'
}
const datetime = GLib.DateTime.new_from_unix_local(timestamp)
if (now.difference(datetime) > 0) {
continue // Ignore earlier forecasts
}
if (datetime.difference(current) < GLib.TIME_SPAN_HOUR * intervalHour) {
continue // Enforce a minimum interval of 1h
}
if (infos.push(forecasts[i]) === maxForecasts) {
break // Use a maximum of five forecasts
}
current = datetime
}
return infos
}
getBestCurrentLocationName(): string {
return this.getBestLocationName(this.info.get_location())
}
getBestLocationName(loc: GWeather.Location): string {
/// @ts-expect-error
const locName = loc.get_name()
if (
/// @ts-expect-error
loc.get_level() === GWeather.LocationLevel.CITY
/// @ts-expect-error
|| !loc.has_coords()
) return locName
/// @ts-expect-error
const world = GWeather.Location.get_world()
/// @ts-expect-error
const city = world.find_nearest_city(...loc.get_coords())
const cityName = city.get_name()
return locName.includes(cityName) ? cityName : locName
}
}
// #endregion Client
// #region Header
class Header extends St.BoxLayout {
_headerLabel: St.Label
_locationLabel: St.Label
_client: Client
_options: Header.Options
constructor(client: Client, options: Header.Options) {
super(client as any, options as any)
}
_init(client: Client, options: Header.Options) {
this._options = options
this._client = client
super._init({
style_class: "QSTWEAKS-header"
} as Partial)
// Labels
this._headerLabel = new St.Label({
text: _("Weather"),
style_class: "QSTWEAKS-header-label",
y_align: Clutter.ActorAlign.CENTER,
x_align: Clutter.ActorAlign.START,
x_expand: true,
})
this._locationLabel = new St.Label({
style_class: "QSTWEAKS-location-label",
y_align: Clutter.ActorAlign.CENTER,
opacity: 190,
})
this.add_child(this._headerLabel)
this.add_child(this._locationLabel)
// Client connection
client.connectObject("changed", this._sync.bind(this), this)
this._sync.bind(this)
}
_sync() {
if (
this._locationLabel.visible =
this._options.showLocation
&& this._client.hasLocation
) {
this._locationLabel.text = this._client.getBestCurrentLocationName()
}
}
}
GObject.registerClass(Header)
namespace Header {
export type Options = {
showLocation: boolean,
}
}
// #endregion Header
// #region WeatherSection
class WeatherSection extends St.Button {
_client: Client
_grid: St.Widget
_layout: Clutter.GridLayout
_options: WeatherSection.Options
constructor(client: Client, options: WeatherSection.Options) {
super(client as any, options as any)
}
_init(client: Client, options: WeatherSection.Options) {
this._client = client
this._options = options
super._init({
style_class: "weather-button message",
can_focus: true,
x_expand: true,
})
const box = this.child = new St.BoxLayout({
orientation: Clutter.Orientation.VERTICAL,
style_class: "weather-box",
x_expand: true,
})
const layout = this._layout = new Clutter.GridLayout({
orientation: Clutter.Orientation.VERTICAL,
})
const grid = this._grid = new St.Widget({
style_class: "weather-grid",
layout_manager: layout,
})
// @ts-expect-error
layout.hookup_style(grid)
box.add_child(grid)
client.connectObject("changed", this._sync.bind(this), this)
this._sync()
this.connect("clicked", this._click.bind(this))
}
_addForecast(forecast: GWeather.Info, col: number) {
const [, timestamp] = forecast.get_value_update()
const timeStr = formatTime(new Date(timestamp * 1000), {
timeOnly: true,
ampm: false,
})
const [, tempValue] = forecast.get_value_temp(GWeather.TemperatureUnit.DEFAULT)
const tempPrefix = Math.round(tempValue) >= 0 ? " " : ""
const time = new St.Label({
style_class: "weather-forecast-time",
text: timeStr,
x_align: Clutter.ActorAlign.CENTER,
})
const icon = new St.Icon({
style_class: "weather-forecast-icon",
icon_name: forecast.get_symbolic_icon_name(),
x_align: Clutter.ActorAlign.CENTER,
x_expand: true,
})
const temp = new St.Label({
style_class: "weather-forecast-temp",
text: `${tempPrefix}${Math.round(tempValue)}°`,
x_align: Clutter.ActorAlign.CENTER,
})
temp.clutter_text.ellipsize = Pango.EllipsizeMode.NONE
time.clutter_text.ellipsize = Pango.EllipsizeMode.NONE
this._layout.attach(time, col, 0, 1, 1)
this._layout.attach(icon, col, 1, 1, 1)
this._layout.attach(temp, col, 2, 1, 1)
}
_updateForecasts() {
const infos = this._client.getInfos(
this._options.maxForecasts,
this._options.intervalHour
)
// RTL support
if (this._grid.text_direction === Clutter.TextDirection.RTL) {
infos.reverse()
}
let col = 0
for (const forecast of infos) {
if (!forecast.is_valid()) continue
this._addForecast(forecast, col)
col++
}
}
_setStatusLabel(text: string) {
let layout = this._grid.layout_manager
let label = new St.Label({
text,
style_class: "QSTWEAKS-status-label",
})
/// @ts-expect-error
layout.attach(label, 0, 0, 1, 1)
}
_sync() {
this._grid.destroy_all_children()
if (!this._client.available) {
this._setStatusLabel((_)("Weather Information Unavailable"))
return
}
if (!this._client.hasLocation) {
this._setStatusLabel(_("Location has not been set"))
return
}
if (this._client.loading) {
this._setStatusLabel((_)("Loading…"))
return
}
const info = this._client.info
if (info.is_valid()) {
this._updateForecasts()
return
}
if (info.network_error()) {
this._setStatusLabel((_)("Go Online for Weather Information"))
} else {
this._setStatusLabel((_)("Weather Information Unavailable"))
}
}
// Show weather app
_click() {
const command = this._options.clickCommand
if (command) {
GLib.spawn_async(null, ['sh', '-c', command], null, GLib.SpawnFlags.SEARCH_PATH, null)
} else {
this._client.activateApp()
}
Main.overview.hide()
Main.panel.closeCalendar()
}
}
GObject.registerClass(WeatherSection)
namespace WeatherSection {
export type Options = {
maxForecasts: number,
intervalHour: number,
clickCommand: string,
} & Header.Options
}
// #endregion WeatherSection
// #region WeatherWidget
class WeatherWidget extends St.BoxLayout {
_item: St.Button
_header: Header
_client: Client
_options: WeatherWidget.Options
constructor(options: WeatherWidget.Options) {
super(options as any)
}
_init(options: WeatherWidget.Options) {
this._options = options
const client = this._client = new Client()
super._init({
orientation: Clutter.Orientation.VERTICAL,
})
this.add_child(
this._header = new Header(client, options)
)
this.add_child(
this._item = new WeatherSection(client, options)
)
// Sync changes
this._client.connectObject(
"changed",
this._updateStyleClass.bind(this),
this
)
this._updateStyleClass()
}
_updateStyleClass(): void {
const options = this._options
let style = "QSTWEAKS-weather"
if (options.removeShadow) style += " QSTWEAKS-weather-remove-shadow"
if (options.compact) style += " QSTWEAKS-weather-compact"
this.styleClass = style
}
// Update weather client when widget shown
vfunc_map() {
this._client.update()
super.vfunc_map()
}
}
GObject.registerClass(WeatherWidget)
namespace WeatherWidget {
export type Options = {
compact: boolean
removeShadow: boolean
} & WeatherSection.Options
}
// #endregion WeatherWidget
// #region WeatherWidgetFeature
export class WeatherWidgetFeature extends FeatureBase {
// #region settings
enabled: boolean
compact: boolean
removeShadow: boolean
clickCommand: string
header: boolean
maxForecasts: number
intervalHour: number
showLocation: boolean
override loadSettings(loader: SettingLoader): void {
this.enabled = loader.loadBoolean("weather-enabled")
this.removeShadow = loader.loadBoolean("weather-remove-shadow")
this.compact = loader.loadBoolean("weather-compact")
this.clickCommand = loader.loadString("weather-click-command")
this.header = loader.loadBoolean("weather-show-header")
this.showLocation = loader.loadBoolean("weather-show-location")
this.maxForecasts = loader.loadInt("weather-max-forecasts")
this.intervalHour = loader.loadInt("weather-interval-hour")
}
// #endregion settings
weatherWidget: WeatherWidget
override reload(key: string): void {
switch (key) {
case "weather-compact":
case "weather-remove-shadow":
if (!this.enabled) return
this.weatherWidget!._updateStyleClass()
break
case "weather-click-command":
break
default:
super.reload()
break
}
}
override onLoad(): void {
if (!this.enabled) return
this.maid.destroyJob(
this.weatherWidget = new WeatherWidget(this)
)
Global.QuickSettingsGrid.add_child(this.weatherWidget)
Global.QuickSettingsGrid.layout_manager.child_set_property(
Global.QuickSettingsGrid, this.weatherWidget, "column-span", 2
)
}
override onUnload(): void {
this.weatherWidget = null
}
}
// #endregion WeatherWidgetFeature
================================================
FILE: src/global.scss
================================================
$p: ".QSTWEAKS";
$v: "-QSTWEAKS";
================================================
FILE: src/global.ts
================================================
import Clutter from "gi://Clutter"
import St from "gi://St"
import GLib from "gi://GLib"
import Gio from "gi://Gio"
import * as Main from "resource:///org/gnome/shell/ui/main.js"
import { type Extension } from "resource:///org/gnome/shell/extensions/extension.js"
import { type MessageTray } from "resource:///org/gnome/shell/ui/messageTray.js"
import { type DateMenuButton } from "resource:///org/gnome/shell/ui/dateMenu.js"
import * as PanelMenu from "resource:///org/gnome/shell/ui/panelMenu.js"
import {
type CalendarMessageList
} from "resource:///org/gnome/shell/ui/calendar.js";
import {
type SystemItem,
type Indicator as SystemIndicator
} from "resource:///org/gnome/shell/ui/status/system.js"
import { type PopupMenu } from "resource:///org/gnome/shell/ui/popupMenu.js"
import { type QuickSlider, type QuickSettingsMenu } from "resource:///org/gnome/shell/ui/quickSettings.js"
import Logger from "./libs/shared/logger.js"
type StreamSlider = {
VolumeInput: any,
InputStreamSlider: QuickSlider,
OutputStreamSlider: QuickSlider,
}
export default class Global {
static QuickSettings: PanelMenu.Button
static QuickSettingsMenu: QuickSettingsMenu
static QuickSettingsGrid: St.Widget
static QuickSettingsBox: St.BoxLayout
static QuickSettingsActor: St.Widget
static get QuickSettingsSystemIndicator(): Promise {
return new Promise(resolve => {
let system = (this.QuickSettings as any)._system
if (system) {
resolve(system)
return
}
GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
system = (this.QuickSettings as any)._system
if (!system) return GLib.SOURCE_CONTINUE
resolve(system)
return GLib.SOURCE_REMOVE
})
})
}
static get QuickSettingsSystemItem(): Promise {
return this.QuickSettingsSystemIndicator
.then(system=>(system as any)._systemItem)
.catch(Logger.error)
}
static Indicators: St.BoxLayout
static DateMenu: DateMenuButton
static DateMenuMenu: PopupMenu
static DateMenuBox: Clutter.Actor
static DateMenuHolder: Clutter.Actor
static MessageTray: MessageTray
static Extension: Extension
static Settings: Gio.Settings
static get MessageList(): CalendarMessageList {
return (this.DateMenu as any)._messageList
}
static get DateMenuIndicator(): Clutter.Actor {
return (this.DateMenu as any)._indicator
}
static GetShutdownMenuBox(): Promise {
// To prevent freeze, priority should be PRIORITY_DEFAULT_IDLE instead of PRIORITY_DEFAULT
return new Promise(resolve => {
GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
if (!(this.QuickSettings as any)._system)
return GLib.SOURCE_CONTINUE
resolve((this.QuickSettings as any)._system._systemItem.menu.box)
return GLib.SOURCE_REMOVE
})
})
}
private static StreamSliderGetter(): StreamSlider|null {
if (!(this.QuickSettings as any)._volumeInput)
return null
return {
VolumeInput: (this.QuickSettings as any)._volumeInput,
InputStreamSlider: (this.QuickSettings as any)._volumeInput._input,
OutputStreamSlider: (this.QuickSettings as any)._volumeOutput._output,
}
}
static GetStreamSlider(): Promise {
return new Promise(resolve => {
let streamSlider = this.StreamSliderGetter()
if (streamSlider) {
resolve(streamSlider)
return
}
GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
streamSlider = this.StreamSliderGetter()
if (!streamSlider) return GLib.SOURCE_CONTINUE
resolve(streamSlider)
return GLib.SOURCE_REMOVE
})
})
}
private static DBusFiles: Map
private static Decoder: TextDecoder
static GetDbusInterface(path: string, interfaceName: string) {
let cachedInfo = this.DBusFiles.get(path)
if (!cachedInfo) {
const DbusFile = Gio.File.new_for_path(`${this.Extension.path}/${path}`)
cachedInfo = Gio.DBusNodeInfo.new_for_xml(this.Decoder.decode(DbusFile.load_contents(null)[1]))
this.DBusFiles.set(path, cachedInfo)
}
return cachedInfo.lookup_interface(interfaceName)
}
private static Shaders: Map
static GetShader(path: string): [string, string] {
let cachedInfo = this.Shaders.get(path)
if (!cachedInfo) {
const shaderFile = Gio.File.new_for_path(`${this.Extension.path}/${path}`)
const [declarations, main] = this.Decoder.decode(shaderFile.load_contents(null)[1]).split(
/^.*?main\(\s?\)\s?/m
) as [string, string]
cachedInfo = [
declarations.trim(),
main.trim().replace(/^[{}]/gm, '').trim()
]
this.Shaders.set(path, cachedInfo)
}
return cachedInfo
}
static unload() {
this.QuickSettings = null
this.QuickSettingsMenu = null
this.QuickSettingsGrid = null
this.QuickSettingsBox = null
this.QuickSettingsActor = null
this.Indicators = null
this.DateMenu = null
this.DateMenuMenu = null
this.DateMenuBox = null
this.DateMenuHolder = null
this.MessageTray = null
this.Extension = null
this.Settings = null
this.DBusFiles = null
this.Shaders = null
this.Decoder = null
}
static load(extension: Extension) {
this.Extension = extension
this.Settings = extension.getSettings()
this.Shaders = new Map()
this.DBusFiles = new Map()
this.Decoder = new TextDecoder("utf-8")
// Quick Settings Items
const QuickSettings = this.QuickSettings = Main.panel.statusArea.quickSettings
this.QuickSettingsMenu = QuickSettings.menu
this.QuickSettingsGrid = QuickSettings.menu._grid
this.QuickSettingsBox = QuickSettings.menu.box
this.QuickSettingsActor = QuickSettings.menu.actor
this.Indicators = QuickSettings._indicators
// Date Menu
const DateMenu = this.DateMenu = Main.panel.statusArea.dateMenu
const DateMenuMenu = this.DateMenuMenu = DateMenu.menu as any
this.DateMenuBox = DateMenuMenu.box
this.DateMenuHolder = DateMenuMenu.box.first_child.first_child
// Message
this.MessageTray = Main.messageTray
}
}
================================================
FILE: src/libs/prefs/components.ts
================================================
import Adw from "gi://Adw"
import Gio from "gi://Gio"
import Gtk from "gi://Gtk"
import Gdk from "gi://Gdk"
import GLib from "gi://GLib"
import GObject from "gi://GObject"
import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"
import { deepEqual } from "../shared/jsUtils.js"
function addChildren(target: any, funcName: string, children?: any[]) {
if (!children) return
for (const item of children) {
if (!item) continue
target[funcName](item)
}
}
function setLinkCursor(target: any) {
target.cursor = Gdk.Cursor.new_from_name("pointer", null)
}
export function setScrollToFocus(target: Adw.PreferencesPage, value: boolean) {
const viewport: Gtk.Viewport = target
.get_first_child() // GtkScrolledWindow
.get_first_child() as any // GtkViewport
viewport.scrollToFocus = value
}
export function delayedSetScrollToFocus(target: Adw.PreferencesPage, value: boolean) {
const id = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 10, ()=>{
setScrollToFocus(target, value)
return GLib.SOURCE_REMOVE
})
GLib.source_set_name_by_id(id, "[quick-settings-tweaks] delayedSetScrollToFocus: id")
}
// Fix adwaita scroll flicking issue
export function fixPageScrollIssue(page: Adw.PreferencesPage) {
page.connect("unmap", ()=>{
setScrollToFocus(page, false)
})
page.connect("map", ()=>{
delayedSetScrollToFocus(page, true)
})
}
export function pushButton(row_with_suffix: Adw.ActionRow, button: any): any {
const suffixes = row_with_suffix
.get_first_child() // GtkBox header
.get_last_child() // GtkBox suffixes
const first_suffix = suffixes.get_first_child()
button
.insert_before(
suffixes, first_suffix
)
return first_suffix
}
export function pushDetailedButton(
row_with_suffix: Adw.ActionRow,
onDetailed: ()=>void
): Gtk.Button {
const buttonBox = Button({
action: onDetailed,
iconName: "emblem-system-symbolic",
hasFrame: false,
tooltip: _("Details"),
})
buttonBox.marginEnd = 2
const button: Gtk.Button = buttonBox.get_first_child() as any
const image: Gtk.Image = button.get_first_child() as any
image.pixel_size = 12
image.opacity = 0.75
row_with_suffix.activatable_widget = null
row_with_suffix.connect("activated", ()=>onDetailed())
const switchWidget: Gtk.Switch|null = pushButton(row_with_suffix, buttonBox)
if (switchWidget) switchWidget.canFocus = true
return button
}
export function removeRowBottomBorder(row: Adw.EntryRow|Adw.ActionRow) {
const style = new Gtk.CssProvider()
style.load_from_string("row{border-bottom-width:0px;}")
row.get_style_context().add_provider(style, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
}
export function removeRowMinHeight(row: Adw.EntryRow|Adw.ActionRow) {
const styleRow = new Gtk.CssProvider()
styleRow.load_from_string("row{min-height:0px;}")
row.get_style_context().add_provider(styleRow, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
const styleBox = new Gtk.CssProvider()
styleBox.load_from_string(".header{min-height:0px; margin-bottom: 4px;}")
row.get_first_child().get_style_context().add_provider(styleBox, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
}
// #region Dialog
export function Dialog({
window,
title,
minHeight,
usePopup,
childrenRequest,
}: Dialog.Options): Adw.PreferencesDialog {
const dialog = new Dialog.PrefDialog(title, childrenRequest, usePopup ?? false)
if (minHeight) dialog.height_request = minHeight
dialog.present(window)
return dialog
}
export namespace Dialog {
export type ChildrenRequest = (page: Adw.PreferencesPage, dialog: Adw.PreferencesDialog)=>any
export interface Options {
title?: string
minHeight?: number
childrenRequest: ChildrenRequest
window: Adw.PreferencesWindow
usePopup?: boolean
}
export const PrefDialogPage = GObject.registerClass({
GTypeName: "qwreey-pref-components-PrefDialogPage",
}, class PrefDialogPage extends Adw.PreferencesPage {
constructor(childrenRequest: ChildrenRequest, dialog: Adw.PreferencesDialog, title?: string) {
super({
name: "PrefDialogPage",
})
if (title) {
this.title = title
}
addChildren(this, "add", childrenRequest(this, dialog))
}
})
export const PrefDialog = GObject.registerClass({
GTypeName: "qwreey-pref-components-PrefDialog",
}, class PrefDialog extends Adw.PreferencesDialog {
constructor(title: string, childrenRequest: ChildrenRequest, usePopup: boolean) {
super({
title: title ?? "",
search_enabled: true,
presentation_mode: usePopup
? Adw.DialogPresentationMode.FLOATING
: Adw.DialogPresentationMode.BOTTOM_SHEET,
})
this.add(new PrefDialogPage(childrenRequest, this))
}
})
export function StackedPage({ title, dialog, childrenRequest }: {
title: string,
dialog: Adw.PreferencesDialog,
childrenRequest: ChildrenRequest,
}): Adw.NavigationPage {
const page = new Adw.NavigationPage({
title: title,
can_pop: true,
})
const view = page.child = new Adw.ToolbarView()
view.add_top_bar(new Adw.HeaderBar())
view.content = new Dialog.PrefDialogPage(childrenRequest, dialog)
dialog.push_subpage(page)
return page
}
}
// #endregion Dialog
// #region ExperimentalIcon
export function ExperimentalIcon(options?: ExperimentalIcon.Options): Gtk.Image {
return new Gtk.Image({
css_classes: ["icon"],
icon_name: "applications-science-symbolic",
pixel_size: options?.pixelSize ?? 16,
margin_end: options?.marginEnd ?? 4,
margin_start: options?.marginStart ?? 2,
opacity: 0.8,
has_tooltip: true,
tooltip_text: _("This feature marked as experimental"),
})
}
export namespace ExperimentalIcon {
export interface Options {
marginEnd?: number
marginStart?: number
pixelSize?: number
}
export function prependExperimentalIcon(holder: Gtk.Widget, options?: ExperimentalIcon.Options) {
ExperimentalIcon(options).insert_before(holder,holder.get_first_child())
}
}
// #endregion ExperimentalIcon
// #region Group
export function Group(options: Group.Options, children?: any[]): Adw.PreferencesGroup {
options.title ??= ""
const { experimental, parent, onCreated, nesting } = options
delete options.parent
delete options.experimental
delete options.onCreated
delete options.nesting
const target = new Adw.PreferencesGroup(options)
if (nesting) target.marginTop = 14
if (experimental) ExperimentalIcon.prependExperimentalIcon(
target.get_first_child().get_first_child(),
{ marginEnd: 18, marginStart: 4, pixelSize: 20 }
)
addChildren(target, "add", children)
if (parent) parent.add(target)
if (onCreated) onCreated(target)
return target
}
export namespace Group {
export type Options = Partialvoid,
}>
}
// #endregion Group
// #region Row
export function Row({
settings,
parent,
title,
subtitle,
uri,
icon,
sensitiveBind,
suffix,
prefix,
experimental,
noLinkIcon,
action,
onCreated,
}: Row.Options): Adw.ActionRow {
const row = new Adw.ActionRow({
title: title ?? null,
subtitle: subtitle ?? null,
activatable: (!!uri) || (!!action),
})
if (parent) {
parent.add(row)
}
if (uri) {
row.connect("activated", ()=>{
Gio.AppInfo.launch_default_for_uri_async(uri, null, null, null)
})
setLinkCursor(row)
if (!noLinkIcon) Row.addSuffixIcon(row, "adw-external-link-symbolic")
row.tooltip_text = uri
row.has_tooltip = true
}
if (action) {
row.connect("activated", ()=>action())
setLinkCursor(row)
if (!noLinkIcon) Row.addSuffixIcon(row, "go-next-symbolic")
}
if (icon) Row.appendLinkIcon(row, icon)
if (suffix) {
row.add_suffix(suffix)
}
if (prefix) {
row.add_prefix(prefix)
}
if (sensitiveBind) {
settings.bind(
sensitiveBind,
row, "sensitive",
Gio.SettingsBindFlags.DEFAULT
)
row.sensitive = settings.get_boolean(sensitiveBind)
}
if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)
if (onCreated) onCreated(row)
return row
}
export namespace Row {
export interface Options {
parent?: any
title?: string
subtitle?: string
uri?: string
icon?: string
settings?: Gio.Settings
sensitiveBind?: string
suffix?: Gtk.Widget
prefix?: Gtk.Widget
experimental?: boolean
noLinkIcon?: boolean,
action?: ()=>void
onCreated?: (row: Adw.ActionRow)=>void
}
export function appendLinkIcon(row: any, name: string) {
const linkText = row.child.get_first_child()
linkText.margin_start = 32
const image = new Gtk.Image({
css_classes: ["icon"],
icon_name: name,
pixel_size: 20,
margin_start: 2,
margin_end: 2,
halign: Gtk.Align.START,
})
image.insert_before(row.child, linkText)
}
export function addSuffixIcon(row: Adw.ActionRow, name: string) {
row.add_suffix(new Gtk.Image({
css_classes: ["icon"],
icon_name: name,
pixel_size: 16,
margin_end: 4,
valign: Gtk.Align.CENTER,
}))
}
}
// #endregion Row
// #region DialogRow
export function DialogRow(options: DialogRow.Options): Adw.ActionRow {
return Row({
...options,
action: () => {
const dialog = Dialog({
...options,
title: options.dialogTitle,
})
if (options.onDialogCreated) {
options.onDialogCreated(dialog)
}
}
})
}
export namespace DialogRow {
export interface Options extends Dialog.Options, Row.Options {
dialogTitle?: string
onDialogCreated?: (dialog: Adw.PreferencesDialog)=>void
}
}
// #endregion DialogRow
// #region ResetButton
export function ResetButton(options: ResetButton.Options): Gtk.Box {
const { settings, bind } = options
options.iconName ??= "view-refresh-symbolic"
const box = Button({
...options,
onCreated: null,
})
box.halign = Gtk.Align.END
const button: Gtk.Button = box.get_first_child() as any
button.valign = Gtk.Align.CENTER
button.has_frame = false
button.tooltip_text = _("Reset to default")
button.connect("clicked", ()=>settings.reset(bind))
const image: Gtk.Image = button.get_first_child() as any
image.pixel_size = 12
image.opacity = 0.75
const setVisible = ()=>{
const state = ResetButton.getOptionState(settings, bind)
box.visible = options.dontHideWhenMatch ? state.isSet : (!state.isMatch)
}
const settingsConnection = settings.connect(`changed::${bind}`, setVisible)
setVisible()
box.connect("destroy", ()=>{
settings.disconnect(settingsConnection)
})
return box
}
export namespace ResetButton {
export interface Options extends Button.OptionsBase {
bind: string,
dontHideWhenMatch?: boolean
}
export function getOptionState(settings: Gio.Settings, key: string): {
isMatch: boolean,
isSet: boolean,
} {
const userValue = settings.get_user_value(key)
const defaultValue = settings.get_default_value(key)
return {
isSet: userValue != null,
isMatch:
(userValue == null)
|| (userValue && defaultValue && userValue.equal(defaultValue)),
}
}
export function pushResetButton(row_with_suffix: Adw.ActionRow, options: ResetButton.Options) {
pushButton(row_with_suffix, ResetButton(options))
}
}
// #endregion ResetButton
// #region SwitchRow
export function SwitchRow({
bind,
parent,
value,
title,
subtitle,
action,
sensitiveBind,
settings,
experimental,
noResetButton,
onCreated,
onDetailed,
}: SwitchRow.Options): Adw.SwitchRow {
if (bind) value ??= settings.get_boolean(bind)
const row = new Adw.SwitchRow({
title: title ?? "",
subtitle: subtitle ?? null,
active: value,
})
setLinkCursor(row)
if (action) {
row.connect("notify::active", () => action(row.get_active()))
}
if (parent) {
parent.add(row)
}
if (onDetailed) pushDetailedButton(row, onDetailed)
if (bind) {
settings.bind(
bind,
row, "active",
Gio.SettingsBindFlags.DEFAULT
)
if (!noResetButton) ResetButton.pushResetButton(row, { settings, bind })
}
if (sensitiveBind) {
settings.bind(
sensitiveBind,
row, "sensitive",
Gio.SettingsBindFlags.DEFAULT
)
row.sensitive = settings.get_boolean(sensitiveBind)
}
if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)
if (onCreated) onCreated(row)
return row
}
export namespace SwitchRow {
export interface Options {
settings?: Gio.Settings
value?: boolean
bind?: string
parent?: any
title?: string
subtitle?: string
action?: (value: boolean)=>void
sensitiveBind?: string
experimental?: boolean
noResetButton?: boolean
onCreated?: (row: Adw.SwitchRow)=>void
onDetailed?: ()=>void
}
}
// #endregion SwitchRow
// #region ToggleButtonRow
export function ToggleButtonRow({
bind,
parent,
value,
title,
subtitle,
action,
sensitiveBind,
settings,
experimental,
text,
noResetButton,
onCreated,
}: ToggleButtonRow.Options): Adw.ActionRow {
if (bind) value ??= settings.get_boolean(bind)
const row = new Adw.ActionRow({
title: title ?? "",
subtitle: subtitle ?? null,
})
const box = new Gtk.Box({
margin_bottom: 8,
margin_top: 8,
})
const toggle = new Gtk.ToggleButton({
label: text,
active: value,
})
box.insert_child_after(toggle, null)
row.add_suffix(box)
setLinkCursor(row)
if (action) {
toggle.connect("notify::active", () => action(toggle.get_active()))
}
if (parent) {
parent.add(row)
}
if (bind) {
settings.bind(
bind,
toggle, "active",
Gio.SettingsBindFlags.DEFAULT
)
if (!noResetButton) ResetButton.pushResetButton(row, { settings, bind })
}
if (sensitiveBind) {
settings.bind(
sensitiveBind,
row, "sensitive",
Gio.SettingsBindFlags.DEFAULT
)
row.sensitive = settings.get_boolean(sensitiveBind)
settings.bind(
sensitiveBind,
toggle, "sensitive",
Gio.SettingsBindFlags.DEFAULT
)
toggle.sensitive = settings.get_boolean(sensitiveBind)
}
if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)
if (onCreated) onCreated(row)
return row
}
export namespace ToggleButtonRow {
export interface Options {
settings?: Gio.Settings
value?: boolean
bind?: string
parent?: any
title?: string
subtitle?: string
action?: (value: boolean)=>void
sensitiveBind?: string
experimental?: boolean
text?: string
noResetButton?: boolean
onCreated?: (row: Adw.ActionRow)=>void
}
}
// #endregion ToggleButtonRow
// #region Button
export function Button({
parent,
action,
sensitiveBind,
settings,
text,
marginTop,
marginBottom,
iconName,
hasFrame,
tooltip,
onCreated,
}: Button.Options): Gtk.Box {
const box = new Gtk.Box({
margin_bottom: marginBottom ?? 8,
margin_top: marginTop ?? 8,
})
const button = new Gtk.Button({
has_frame: hasFrame ?? true,
})
box.insert_child_after(button, null)
setLinkCursor(button)
if (iconName && !text) {
button.icon_name = iconName
}
if (text && !iconName) {
button.label = text
}
if (iconName && text) {
const box = button.child = new Gtk.Box({})
new Gtk.Image({
icon_name: iconName,
pixel_size: 12,
margin_end: 6,
}).insert_before(box, null)
new Gtk.Label({
label: text,
}).insert_before(box, null)
}
if (tooltip) {
button.tooltip_text = tooltip
button.has_tooltip = true
}
if (action) {
button.connect("clicked", () => action())
}
if (parent) {
parent.add(box)
}
if (sensitiveBind) {
settings.bind(
sensitiveBind,
button, "sensitive",
Gio.SettingsBindFlags.DEFAULT
)
button.sensitive = settings.get_boolean(sensitiveBind)
}
if (onCreated) onCreated(box)
return box
}
export namespace Button {
export interface Options extends OptionsBase {
onCreated?: (row: Gtk.Box)=>void
}
export interface OptionsBase {
settings?: Gio.Settings
parent?: any
action?: ()=>void
sensitiveBind?: string
text?: string
marginTop?: number
marginBottom?: number
iconName?: string
hasFrame?: boolean
tooltip?: string
}
}
// #endregion Button
// #region ButtonRow
export function ButtonRow(options: ButtonRow.Options): Adw.ActionRow {
const {
parent,
title,
subtitle,
experimental,
onCreated,
} = options
const row = new Adw.ActionRow({
title: title ?? "",
subtitle: subtitle ?? null,
})
setLinkCursor(row)
row.add_suffix(Button({
...options,
onCreated: null,
}))
if (parent) {
parent.add(row)
}
if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)
if (onCreated) onCreated(row)
return row
}
export namespace ButtonRow {
export interface Options extends Button.OptionsBase {
settings?: Gio.Settings
parent?: any
title?: string
subtitle?: string
action?: ()=>void
sensitiveBind?: string
experimental?: boolean
text?: string
marginTop?: number
marginBottom?: number
onCreated?: (row: Adw.ActionRow)=>void
}
}
// #endregion ButtonRow
// #region UpDownButton
export function UpDownButton({
parent,
action,
sensitiveBind,
settings,
marginTop,
marginBottom,
spacing,
onCreated,
}: UpDownButton.Options): Gtk.Box {
const box = new Gtk.Box({
margin_bottom: marginTop ?? 8,
margin_top: marginBottom ?? 8,
spacing: spacing ?? 8
})
const down = new Gtk.Button({
icon_name: "go-down-symbolic"
})
const up = new Gtk.Button({
icon_name: "go-up-symbolic"
})
setLinkCursor(up)
setLinkCursor(down)
box.insert_child_after(up, null)
box.insert_child_after(down, up)
if (action) {
down.connect("clicked", () => action(UpDownButton.Direction.Down))
up.connect("clicked", () => action(UpDownButton.Direction.Up))
}
if (parent) {
parent.add(box)
}
if (sensitiveBind) {
settings.bind(
sensitiveBind,
up, "sensitive",
Gio.SettingsBindFlags.DEFAULT
)
up.sensitive = settings.get_boolean(sensitiveBind)
settings.bind(
sensitiveBind,
down, "sensitive",
Gio.SettingsBindFlags.DEFAULT
)
down.sensitive = settings.get_boolean(sensitiveBind)
}
if (onCreated) onCreated(box)
return box
}
export namespace UpDownButton {
export interface Options {
settings?: Gio.Settings
parent?: any
marginTop?: number
marginBottom?: number
spacing?: number
action?: (direction: Direction)=>void
sensitiveBind?: string
onCreated?: (row: Gtk.Box)=>void
}
export enum Direction {
Up,
Down,
}
}
// #endregion UpDownButton
// #region RgbColorRow
export function RgbColorRow({
title,
subtitle,
action,
sensitiveBind,
settings,
bind,
experimental,
noResetButton,
onCreated,
parent,
value,
useAlpha,
}: RgbColorRow.Options): Adw.ActionRow {
if (bind) value ??= settings.get_value(bind).recursiveUnpack()
const row = new Adw.ActionRow({
title: title ?? "",
subtitle: subtitle ?? null,
activatable: true,
})
const button = new Gtk.ColorButton({
margin_start: 6,
margin_top: 6,
margin_bottom: 6,
use_alpha: useAlpha ?? false,
})
row.add_suffix(button)
const themeDefaultLabel = new Gtk.Label({
label: _("Theme default"),
margin_start: 12,
margin_end: 12,
visible: false,
})
const themeDefaultOverlay = new Gtk.Overlay()
themeDefaultOverlay.child = themeDefaultLabel
themeDefaultOverlay.insert_before(
button,
null
)
row.connect("activated", ()=>button.activate())
setLinkCursor(row)
const updateColor = ()=>{
themeDefaultLabel.visible = value.length == 0
const color = button.get_color().copy()
color.red = (value[0] ?? 0) / 255
color.green = (value[1] ?? 0) / 255
color.blue = (value[2] ?? 0) / 255
if (useAlpha) color.alpha = (value[3] ?? 1000) / 1000
button.set_rgba(color)
}
updateColor()
if (parent) {
parent.add(row)
}
if (action || bind) button.connect("color-set", ()=>{
const color = button.get_rgba()
const arr = [
Math.floor(color.red * 255 + .5),
Math.floor(color.green * 255 + .5),
Math.floor(color.blue * 255 + .5)
] as RgbColorRow.Color
if (useAlpha) arr.push(Math.floor(color.alpha * 1000 + .5))
if (bind) settings.set_value(bind, new GLib.Variant("ai", arr))
if (action) action(arr)
})
if (bind) settings.connect(`changed::${bind}`, ()=>{
const newValue = settings.get_value(bind).recursiveUnpack()
if (
newValue[0] != value[0]
|| newValue[1] != value[1]
|| newValue[2] != value[2]
|| newValue[3] != value[3]
) {
value = newValue
updateColor()
}
})
if (sensitiveBind) {
settings.bind(
sensitiveBind,
row, "sensitive",
Gio.SettingsBindFlags.DEFAULT
)
settings.bind(
sensitiveBind,
button, "sensitive",
Gio.SettingsBindFlags.DEFAULT
)
button.sensitive = row.sensitive = settings.get_boolean(sensitiveBind)
}
if (bind && !noResetButton) {
ResetButton.pushResetButton(row, { settings, bind })
}
if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)
if (onCreated) onCreated(row)
return row
}
export namespace RgbColorRow {
export type Color = number[]
export interface Options {
title?: string
subtitle?: string
action?: (color: Color)=>void
sensitiveBind?: string
settings?: Gio.Settings
bind?: string
experimental?: boolean
noResetButton?: boolean
onCreated?: (row: Adw.ActionRow)=>void
parent?: any
value?: Color
useAlpha?: boolean
enableThemeDefault?: boolean
}
}
// #endregion RgbColorRow
// #region EntryRow
export function EntryRow({
bind,
parent,
value,
title,
action,
sensitiveBind,
settings,
experimental,
noResetButton,
onCreated,
}: EntryRow.Options): Adw.EntryRow {
if (bind) value ??= settings.get_string(bind)
const row = new Adw.EntryRow({
title: title ?? "",
})
if (action) {
row.connect("notify::text", () => {
action(row.text)
})
}
if (parent) {
parent.add(row)
}
if (bind) {
settings.bind(
bind,
row, "text",
Gio.SettingsBindFlags.DEFAULT
)
if (!noResetButton) row.add_suffix(ResetButton({ settings, bind }))
}
if (sensitiveBind) {
settings.bind(
sensitiveBind,
row, "sensitive",
Gio.SettingsBindFlags.DEFAULT
)
row.sensitive = settings.get_boolean(sensitiveBind)
}
if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)
if (onCreated) onCreated(row)
return row
}
export namespace EntryRow {
export interface Options {
settings?: Gio.Settings
bind?: string
parent?: any
value?: string
title?: string
action?: (value: string)=>void
sensitiveBind?: string
experimental?: boolean
noResetButton?: boolean
onCreated?: (row: Adw.EntryRow)=>void
}
}
// #endregion EntryRow
// #region AdjustmentRow
export function AdjustmentRow({
max,
min,
stepIncrement,
pageIncrement,
bind,
parent,
value,
title,
subtitle,
action,
sensitiveBind,
settings,
experimental,
noResetButton,
onCreated,
}: AdjustmentRow.Options): Adw.SpinRow {
if (bind) value ??= settings.get_int(bind)
const row = new Adw.SpinRow({
title: title ?? "",
subtitle: subtitle ?? null,
adjustment: new Gtk.Adjustment({
upper: max ?? 100,
lower: min ?? 0,
stepIncrement: stepIncrement ?? 1,
pageIncrement: pageIncrement ?? 10,
value: value
}),
})
setLinkCursor(row)
const header = row
.get_first_child() // GtkBox header
const suffixes = header
.get_last_child() // GtkBox suffixes
const spin = suffixes
.get_first_child() // GtkSpinButton spin_button
spin.hexpand = false
suffixes.hexpand = false
new Gtk.Box({ hexpand: true }).insert_before(header, suffixes)
if (action) {
row.connect("notify::value", () => {
action(row.get_value())
})
}
if (parent) {
parent.add(row)
}
if (bind) {
settings.bind(
bind,
row, "value",
Gio.SettingsBindFlags.DEFAULT
)
if (!noResetButton) ResetButton.pushResetButton(row, { settings, bind })
}
if (sensitiveBind) {
settings.bind(
sensitiveBind,
row, "sensitive",
Gio.SettingsBindFlags.DEFAULT
)
row.sensitive = settings.get_boolean(sensitiveBind)
}
if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)
if (onCreated) onCreated(row)
return row
}
export namespace AdjustmentRow {
export interface Options {
settings?: Gio.Settings
max?: number
min?: number
stepIncrement?: number
pageIncrement?: number
bind?: string
parent?: any
value?: number
title?: string
subtitle?: string
action?: (value: number)=>void
sensitiveBind?: string
experimental?: boolean
noResetButton?: boolean
onCreated?: (row: Adw.SpinRow)=>void
}
}
// #endregion AdjustmentRow
// #region ExpanderRow
export function ExpanderRow({
parent,
title,
subtitle,
expanded,
experimental,
useMarkup,
action,
onCreated,
}: ExpanderRow.Options, children?: any[]): Adw.ExpanderRow {
const row = new Adw.ExpanderRow({
title: title ?? null,
subtitle: subtitle ?? null,
use_markup: useMarkup ?? false,
})
setLinkCursor(row)
if (parent) {
parent.add(row)
}
addChildren(row, "add_row", children)
if (expanded === false || expanded === true) {
row.expanded = expanded
}
if (action) row.connect("notify::expanded", ()=>action(row.expanded))
if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)
if (onCreated) onCreated(row)
return row
}
export namespace ExpanderRow {
export interface Options {
parent?: any
title?: string
subtitle?: string
expanded?: boolean
experimental?: boolean
useMarkup?: boolean
action?: (expanded: boolean)=>void
onCreated?: (row: Adw.ExpanderRow)=>void
}
}
// #endregion ExpanderRow
// #region DropdownRow
export function DropdownRow({
settings,
items,
bind,
parent,
value,
title,
subtitle,
action,
sensitiveBind,
experimental,
noResetButton,
onCreated,
}: DropdownRow.Options) {
let filterModeModel = new Gio.ListStore({ item_type: DropdownRow.Items as any })
let type: "number"|"string"
for (const item of items) {
type ??= (typeof item.value) as typeof type
filterModeModel.append(new (DropdownRow.Items as any)(item.name, item.value))
}
const getIndex = (value: string) => {
for (let i = 0; i < filterModeModel.get_n_items(); i++) {
if ((filterModeModel.get_item(i) as any).value === value) {
return i
}
}
return -1
}
const getValueFromBind = (): any => {
if (type == "string") {
return settings.get_string(bind)
}
if (type == "number") {
return settings.get_int(bind)
}
}
const setValueFromBind = (value: any) => {
if (type == "string") {
settings.set_string(bind, value)
return
}
if (type == "number") {
settings.set_int(bind, value)
return
}
}
if (bind) value ??= getValueFromBind()
let row = new Adw.ComboRow({
title: title ?? "",
subtitle: subtitle ?? null,
model: filterModeModel,
expression: new (Gtk.PropertyExpression as any)(DropdownRow.Items, null, "name"),
selected: getIndex(value),
})
setLinkCursor(row)
if (parent) {
parent.add(row)
}
if (bind) {
if (!noResetButton) ResetButton.pushResetButton(row, { settings, bind })
const settingsConnection = settings.connect(`changed::${bind}`, ()=>{
const selected = (row.selectedItem as any).value
const changedTo = getValueFromBind()
if (selected != changedTo) {
row.selected = getIndex(changedTo)
}
})
row.connect("destroy", ()=>settings.disconnect(settingsConnection))
}
if (bind || action) row.connect("notify::selected", () => {
const selected = (row.selectedItem as any).value
if (bind && (selected != getValueFromBind())) {
setValueFromBind(selected)
}
if (action) {
action(selected)
}
})
if (sensitiveBind) {
settings.bind(
sensitiveBind,
row, "sensitive",
Gio.SettingsBindFlags.DEFAULT
)
row.sensitive = settings.get_boolean(sensitiveBind)
}
if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child)
if (onCreated) onCreated(row)
return row
}
export namespace DropdownRow {
export interface Options {
settings?: Gio.Settings
items: { name: string, value: T }[]
bind?: string
parent?: any
value?: string
title?: string
subtitle?: string
sensitiveBind?: string
action?: (value: string)=>void
experimental?: boolean
noResetButton?: boolean
onCreated?: (row: Adw.ComboRow)=>void
}
export const Items = GObject.registerClass({
Properties: {
"name": GObject.ParamSpec.string(
"name", "name", "name",
GObject.ParamFlags.READWRITE,
null),
},
}, class DropdownItems extends GObject.Object {
value: T
_init(name: string, value: T) {
super._init({ name })
this.value = value
}
})
}
// #endregion DropdownRow
// #region ContributorsRow
export function ContributorsRow(row: ContributorsRow.Contributor[]): Adw.ActionRow {
const target = Row({})
const box = new Gtk.Box({
baseline_position: Gtk.BaselinePosition.CENTER,
homogeneous: true,
orientation: Gtk.Orientation.HORIZONTAL,
})
target.set_child(box)
for (const item of row) {
let itemButton = new Gtk.Button({
has_frame: false,
})
let itemBox = new Gtk.Box({
baseline_position: Gtk.BaselinePosition.CENTER,
orientation: Gtk.Orientation.VERTICAL,
cursor: Gdk.Cursor.new_from_name("pointer", null),
})
itemButton.child = itemBox
itemButton.connect("clicked", ()=>{
Gio.AppInfo.launch_default_for_uri_async(item.link, null, null, null)
})
const itemImage = new Gtk.Image({
margin_bottom: 2,
margin_top: 2,
icon_name: item.image,
pixel_size: 38,
})
itemBox.append(itemImage)
const nameText = new Gtk.Label({
label: `${item.name}`,
useMarkup: true,
hexpand: true,
})
itemBox.append(nameText)
let labelBox = new Gtk.Box({
baseline_position: Gtk.BaselinePosition.CENTER,
orientation: Gtk.Orientation.VERTICAL,
vexpand: true,
hexpand: true,
margin_bottom: 2,
valign: Gtk.Align.CENTER
})
for (const label of item.label.split("\n")) {
const labelText = new Gtk.Label({
label: `${label}`,
useMarkup: true,
hexpand: true,
opacity: 0.7,
})
labelBox.append(labelText)
}
itemBox.append(labelBox)
box.append(itemButton)
}
return target
}
export namespace ContributorsRow {
export interface Contributor {
name: string
label: string
link: string
image: string
}
}
// #endregion ContributorsRow
// #region LicenseRow
export function LicenseRow(item: LicenseRow.License): Adw.ExpanderRow {
let contentRow: Adw.ActionRow
let loaded = false
return ExpanderRow({
title: item.name + (item.author ? ` by ${item.author}` : ""),
subtitle: item.description ?? "",
expanded: false,
useMarkup: true,
action: (expanded)=>{
if (!expanded) return
if (loaded) return
if (item.content) item.content().then(
subtitle => contentRow.subtitle = subtitle
).catch(
error => {
contentRow.subtitle = `ERROR: ${error}`
log(error)
}
)
}
},[
Row({
title: _("Homepage"),
subtitle: item.url,
uri: item.url,
icon: "go-home",
}),
item.content ? (contentRow = Row({
title: _("License"),
subtitle: _("Loading ..."),
})) : null,
item.licenseUri ? Row({
title: _("License"),
subtitle: item.licenseUri,
icon: "emblem-documents-symbolic",
uri: item.licenseUri
}) : null,
item.affectedFiles ? Row({
title: _("Affected Files"),
subtitle: item.affectedFiles.join("\n"),
icon: "text-x-generic-symbolic",
}) : null,
])
}
export namespace LicenseRow {
export interface License {
url: string
author: string
name: string
file?: string
content?: ()=>Promise
licenseUri?: string
affectedFiles?: string[]
description?: string
}
}
// #endregion LicenseRow
// #region LogoBox
export function LogoBox({
icon, name, version, versionAction,
}: LogoBox.Options): Gtk.Box {
const logoBox = new Gtk.Box({
baseline_position: Gtk.BaselinePosition.CENTER,
margin_top: 6,
spacing: 20,
orientation: Gtk.Orientation.VERTICAL,
})
// Logo icon
const logoImage = new Gtk.Image({
icon_name: icon,
pixel_size: 100,
})
logoBox.append(logoImage)
// Extension name
const logoText = new Gtk.Label({
label: name,
css_classes: ["title-2"],
halign: Gtk.Align.CENTER,
})
logoBox.append(logoText)
// Version
const logoVersion = new Gtk.Button({
css_classes: ["success"],
label: version,
halign: Gtk.Align.CENTER,
})
logoBox.append(logoVersion)
if (versionAction) {
logoVersion.connect("clicked", ()=>versionAction())
setLinkCursor(logoVersion)
}
return logoBox
}
export namespace LogoBox {
export interface Options {
name: string
version: string
icon: string
versionAction?: ()=>void
}
}
// #endregion LogoBox
// #region LogoGroup
export function LogoGroup(options: LogoGroup.Options): Adw.PreferencesGroup {
return Group({
parent: options.parent,
},[
LogoBox(options),
])
}
export namespace LogoGroup {
export interface Options extends LogoBox.Options {
parent: any,
}
}
// #endregion LogoGroup
// #region ChangelogDialog
export function ChangelogDialog({
content,
window,
currentBuildNumber,
defaultPageBuildNumber,
title,
subtitle,
}: ChangelogDialog.Options): Adw.PreferencesDialog {
const dialog = Dialog({
window,
title: title ?? _("Changelog"),
childrenRequest: ()=>[Group({
title: title ?? "",
description: subtitle ?? "",
onCreated: (group: Adw.PreferencesGroup) => {
content()
.then(ChangelogDialog.getReleases)
.then(releases => releases.map(release => Row({
title: release.version,
subtitle: release.Date ?? "",
action: ()=>ChangelogDialog.ChangelogPage(dialog, release),
onCreated: (row)=>{
if (release.BuildNumber == currentBuildNumber) {
row.add_css_class("success")
row.title += " " + _("(Current)")
}
if (release.BuildNumber == defaultPageBuildNumber) {
ChangelogDialog.ChangelogPage(dialog, release)
}
group.add(row)
}
})))
.catch(log)
},
})]
})
dialog.height_request = 520
return dialog
}
export namespace ChangelogDialog {
export interface Options {
window: Adw.PreferencesWindow
currentBuildNumber: number
content: ()=>Promise
defaultPageBuildNumber?: number
title?: string
subtitle?: string
}
const BOLD = (t: string)=>`${t}`
const LITEM = (t: string,lv: number)=>`${" ".repeat(lv)} • ${t}`
const TITLE = (t: string,lv: number)=>`${"#".repeat(lv)} ${t}`
const QUOTE = (t: string)=>`> ${t}`
export function simpleMarked(mdlike: string): string {
return mdlike.split("\n").map(
line => line
.replaceAll(
/^( *)\- *(.*)/g,
(_, indent, t: string)=>LITEM(t, Math.floor(indent.length/2))
)
.replaceAll(
/^ *\> *(.*)/g,
(_, t: string)=>QUOTE(t)
)
.replaceAll(
/^ *(\#*) *(.*)/g,
(_, head: string, t: string)=>TITLE(t, head.length)
)
.replaceAll(
/\*\*(.*?)\*\*/g,
(_, t: string)=>BOLD(t)
)
.replaceAll(
/\<\!\-\-.*?\-\-\>/g,
""
)
).join("\n")
}
export interface Release {
version: string
content: string
Includes: string[]
BuildNumber: number
Date: string
Git: string
}
export function createHeader(release: Partial): string {
return [
_("> **Date:** %s").format(release.Date ?? ""),
_("> **Git Hash:** %s").format(release.Git ?? ""),
_("> **Build Number:** %d").format(release.BuildNumber ?? 0),
].join("\n")
}
export function getReleases(content: string): Release[] {
type Item = Partial
const releases: Item[] = []
let last: Item
for (const line of content.split("\n")) {
const version = line.match(/^# *(.*) *$/)
if (version) {
releases.push(last = {
version: version[1],
buffer: [line],
})
continue
}
const meta = line.match("\<\!\-\- *\@([^ ]*) *: *(.*?) *\-\-\>")
if (meta) {
last[meta[1]] = JSON.parse(meta[2])
continue
}
if (!last) continue
last.buffer.push(line.replaceAll(/\{\{HEADER\}\}/g, ()=>createHeader(last)))
}
for (const item of releases) {
item.content = item.buffer.join("\n")
delete item.buffer
}
return releases as Release[]
}
export function ChangelogPage(
dialog: Adw.PreferencesDialog,
release: Release,
): Adw.NavigationPage {
return Dialog.StackedPage({
dialog,
title: release.version,
childrenRequest: ()=>[
Group({},[
new Gtk.Label({
use_markup: true,
label: ChangelogDialog.simpleMarked(release.content),
halign: Gtk.Align.START,
hexpand: true,
})
])
]
})
}
}
// #endregion ChangelogDialog
// #region PaddingDialog
export function PaddingDialog({
settings,
sensitiveBind,
bind,
window,
}: PaddingDialog.Options) {
const getValue = ()=>
settings.get_value(bind).recursiveUnpack() as [number, number, number, number]
let current = getValue()
let top: Adw.SpinRow, right: Adw.SpinRow, bottom: Adw.SpinRow, left: Adw.SpinRow
const save = ()=>{
if (deepEqual(current, getValue())) return
settings.set_value(bind, new GLib.Variant("ai", current))
}
const dialog = Dialog({
window,
title: _("Padding"),
usePopup: true,
childrenRequest: ()=>[Group({
},[
top = AdjustmentRow({
title: _("Top"),
max: 2048,
value: current[0],
action: (value: number)=>{
current[0] = value
save()
},
settings,
sensitiveBind,
}),
bottom = AdjustmentRow({
title: _("Bottom"),
max: 2048,
value: current[2],
action: (value: number)=>{
current[2] = value
save()
},
settings,
sensitiveBind,
}),
left = AdjustmentRow({
title: _("Left"),
max: 2048,
value: current[3],
action: (value: number)=>{
current[3] = value
save()
},
settings,
sensitiveBind,
}),
right = AdjustmentRow({
title: _("Right"),
max: 2048,
value: current[1],
action: (value: number)=>{
current[1] = value
save()
},
settings,
sensitiveBind,
}),
])],
})
const settingsConnection = settings.connect(`changed::${bind}`, ()=>{
current = getValue()
top.value = current[0]
right.value = current[1]
bottom.value = current[2]
left.value = current[3]
})
dialog.connect("destroy", ()=>{
settings.disconnect(settingsConnection)
})
}
export namespace PaddingDialog {
export interface Options {
settings: Gio.Settings
window: Adw.PreferencesWindow
sensitiveBind?: string
bind: string
}
}
// #endregion PaddingDialog
================================================
FILE: src/libs/shared/colors.ts
================================================
export type Rgba = [number, number, number, number]
export namespace Rgba {
export function formatCss(color: Rgba): string {
const [r,g,b,a] = color
return `rgba(${r},${g},${b},${a/1000})`
}
}
export type Rgb = [number, number, number]
================================================
FILE: src/libs/shared/imageUtils.ts
================================================
import GdkPixbuf from "gi://GdkPixbuf"
import GLib from "gi://GLib"
namespace ImageMeanColor {
const BASE_SIZE = 128
const SKIP_RATE = 4
const MAX_DIST = 255+255+255
const CHANNEL_DIFF_MAX = 255
const CHANNEL_DIFF_MAX_DOUBLE = CHANNEL_DIFF_MAX * CHANNEL_DIFF_MAX
const CHANNEL_DIFF_CUT = 32
const DIV = CHANNEL_DIFF_MAX_DOUBLE * MAX_DIST
const CACHE_INDEXER_Y = BASE_SIZE
const CACHE_SIZE = BASE_SIZE * BASE_SIZE
export function getImageMeanColor(
image: GdkPixbuf.Pixbuf
): Promise {
return new Promise(resolve=>{
// const id = Math.floor(Math.random()*1000)
// console.time("getImageMeanColor_"+id)
const baseImage = image.scale_simple(BASE_SIZE, BASE_SIZE, GdkPixbuf.InterpType.NEAREST)
const channels = baseImage.n_channels
if (channels < 3) return null
const rowstride = baseImage.rowstride
const pixbuf = baseImage.get_pixels()
let maxGravity = 0
let colorR = 0, colorG = 0, colorB = 0
const channelDiffCaches = new Array(CACHE_SIZE)
let curY=0, curX=-1
GLib.idle_add(GLib.PRIORITY_LOW, ()=>{
// Move current cursor
curX += SKIP_RATE
if (curX >= BASE_SIZE) { curX = 0; curY += SKIP_RATE }
if (curY >= BASE_SIZE) {
// console.timeEnd("getImageMeanColor_"+id)
resolve([colorR, colorG, colorB])
return GLib.SOURCE_REMOVE
}
// Get current pixel
const index = curY * rowstride + curX * channels
const r = pixbuf[index]
const g = pixbuf[index+1]
const b = pixbuf[index+2]
// Get channel difference of current pixel
// Note: spidermonkey js engine doesn't have fastapi like v8, so Math.abs much slower
const cacheIndex1 = curY * CACHE_INDEXER_Y + curX
let channelDiff1 = channelDiffCaches[cacheIndex1]
if (channelDiff1 === undefined) {
const da = r-g, db = r-b, dc = g-b
channelDiff1 = channelDiffCaches[cacheIndex1] = Math.max(da<0?-da:da, db<0?-db:db, dc<0?-dc:dc)
}
if (channelDiff1 <= CHANNEL_DIFF_CUT) return GLib.SOURCE_CONTINUE
// Get gravity
let gravity = 0
for (let x=0; x deepEqual(value, b[index]))
}
if (a instanceof Object && b instanceof Object) {
for (const [key, value] of Object.entries(a)) {
if (!deepEqual(b[key], value)) return false
}
return true
}
return false
}
================================================
FILE: src/libs/shared/logger.ts
================================================
// Prefixed, leveled logger
function Logger(str: string|(()=>string)) {
if (str instanceof Function) str = str()
if (Logger.show_info) console.log(Logger.LOG_INFO_HEADER + str)
}
namespace Logger {
export let LOG_HEADER_PREFIX: string = ""
export let LOG_INFO_HEADER: string = ""
export let LOG_DEBUG_HEADER: string = ""
export let LOG_ERROR_HEADER: string = ""
export let show_info: boolean = true
export function setHeader(header: string) {
LOG_HEADER_PREFIX = header
LOG_INFO_HEADER = `${header} (info) `
LOG_DEBUG_HEADER = `${header} (debug) `
LOG_ERROR_HEADER = `${header} (error) `
}
export enum LogLevel {
none = -1,
error = 0,
info = 1,
debug = 2,
}
const void_function = (()=>{}) as (str: string)=>void
export let debug: (str: string|(()=>string))=>void
function debug_internal(str: string|(()=>string)) {
if (str instanceof Function) str = str()
console.log(LOG_DEBUG_HEADER + str)
}
export let error: (str: string|(()=>string))=>void
function error_internal(str: string|(()=>string)) {
if (str instanceof Function) str = str()
console.log(`${LOG_ERROR_HEADER}${str}\n${new Error().stack}`)
}
export let currentLevel: number
export function setLogLevel(level: number) {
debug = level >= LogLevel.debug
? debug_internal
: void_function
error = level >= LogLevel.error
? error_internal
: void_function
show_info = level >= LogLevel.info
currentLevel = level
}
}
export default Logger
================================================
FILE: src/libs/shared/maid.ts
================================================
// Connection destroyer
class Maid {
private records: [Maid.TaskType, number, ...any][]
constructor() {
this.records = []
}
connectJob(
signalObject: any,
signalName: string,
handleFunc: (...args: any)=>any,
priority: number = 0
): number {
const id = signalObject.connect(signalName, handleFunc)
this.getRecords().push([Maid.TaskType.Connect, priority, signalObject, id])
return id
}
functionJob(func: (...args: any)=>any, priority: number = 0) {
this.getRecords().push([Maid.TaskType.Function, priority, func])
}
disposeJobvoid }>(object: T, priority: number = 0): T {
this.getRecords().push([Maid.TaskType.Dispose, priority, object])
return object
}
runDisposeJobvoid }>(object: any, priority: number = 0): T {
this.getRecords().push([Maid.TaskType.RunDispose, priority, object])
return object
}
destroyJobvoid }>(object: T, priority: number = 0): T {
this.getRecords().push([Maid.TaskType.Destroy, priority, object])
return object
}
destroy() {
this.clear()
this.records = null
}
getRecords(): Maid["records"] {
if (!this.records) Error("Maid object already destroyed")
return this.records
}
patchJob(
patchObject: any,
patchName: string,
handleFunc: (...args: any)=>any,
priority: number = 0
) {
// Check if patchObject is defined before accessing its properties
if (!patchObject) {
console.error('Maid.patchJob: patchObject is undefined');
return;
}
const original = patchObject[patchName]
this.getRecords().push([Maid.TaskType.Patch, priority, patchObject, patchName, original])
patchObject[patchName] = handleFunc(original)
}
// [ patchObject, connection, original, undo? ]
hideJob(
patchObject: T,
undo?: (old: boolean, patchObject: T)=>(boolean|null|void|undefined),
priority: number = 0
) {
// Check if patchObject is defined
if (!patchObject) {
console.error('Maid.hideJob: patchObject is undefined');
return;
}
const original = patchObject.visible
const connection = patchObject.connect("show", ()=>{
patchObject.hide()
})
patchObject.hide()
this.getRecords().push([Maid.TaskType.Hide, priority, patchObject, connection, original, undo])
}
clear() {
const records = this.getRecords()
records.sort((a, b) => b[1] - a[1])
for (const record of records) {
switch (record[0]) {
case Maid.TaskType.Connect:
record[2].disconnect(record[3])
break
case Maid.TaskType.Function:
record[2]()
break
case Maid.TaskType.Dispose:
record[2].dispose()
break
case Maid.TaskType.RunDispose:
record[2].run_dispose()
break
case Maid.TaskType.Destroy:
record[2].destroy()
break
case Maid.TaskType.Patch:
// Check if patchObject (record[2]) is defined
if (record[2]) {
record[2][record[3]] = record[4]
}
break
case Maid.TaskType.Hide:
{
const patchObject = record[2]
// Check if patchObject is defined before using it
if (!patchObject) break;
const original = record[4]
const undo = record[5]
patchObject.disconnect(record[3])
if (undo) {
const result = undo(original, patchObject)
if (result === true) {
patchObject.show()
}
} else {
if (original) patchObject.show()
}
}
break
default:
throw Error("Unknown task type.")
}
}
this.records = []
}
}
namespace Maid {
export enum TaskType {
Connect,
Function,
Dispose,
RunDispose,
Destroy,
Patch,
Hide,
}
export const Priority = {
High: 2000,
Default: 0,
Low: -2000,
}
}
export default Maid
================================================
FILE: src/libs/shared/styleClass.ts
================================================
// Re-layout & painting only once
// We use StyleClass instead of add_style_class_name in this extension
export class StyleClass {
classArray: string[]
modified: boolean
constructor(classString: string) {
this.modified = false
this.classArray = classString.split(" ")
}
remove(className: string): StyleClass {
const lastLen = this.classArray.length
this.classArray = this.classArray.filter(
i => i != className
)
if (this.classArray.length != lastLen) {
this.modified = true
}
return this
}
add(className: string): StyleClass {
if (this.classArray.includes(className)) return this
this.classArray.push(className)
this.modified = true
return this
}
stringify(): string {
return this.classArray.join(" ")
}
}
================================================
FILE: src/libs/shell/advani.ts
================================================
import Clutter from "gi://Clutter"
import Graphene from "gi://Graphene"
// Gnome base ease function params
export interface EasingParams {
repeatCount?: number
autoReverse?: boolean
animationRequired?: boolean
duration?: number
delay?: number
mode?: Clutter.AnimationMode | any
[key: string]: any
}
// AdvAni ease function params
export interface AdvEasingParams extends EasingParams {
mode: Clutter.AnimationMode | AdvAnimationMode,
}
// AdvAni ease mode define type
export interface ModeDefineIface {
mode: Clutter.AnimationMode
getCubicBezierProgress?: ()=>[Graphene.Point, Graphene.Point]
cubicBezierProgress?: [Graphene.Point, Graphene.Point]
}
export interface ModeDefine extends ModeDefineIface {}
export class ModeDefine {
constructor(params: ModeDefineIface) {
for (const [key, value] of Object.entries(params)) {
this[key] = value
}
}
}
// Utility functions
export function createBezier(
x1: number, y1: number, x2: number, y2: number
):[Graphene.Point, Graphene.Point] {
return [
new Graphene.Point({ x: x1, y: y1 }),
new Graphene.Point({ x: x2, y: y2 })
]
}
// Template AdvAni animations
export enum AdvAnimationMode {
LowBackover = 2000,
MiddleBackover = 2001,
}
export const AdvAnimationModeDefines = [
new ModeDefine({
mode: Clutter.AnimationMode.CUBIC_BEZIER,
getCubicBezierProgress: ()=>createBezier(.225,1.2,.45,1)
}),
new ModeDefine({
mode: Clutter.AnimationMode.CUBIC_BEZIER,
getCubicBezierProgress: ()=>createBezier(.4,1.35,.55,1)
}),
] as ModeDefine[]
// Main AdvAni ease function
export function ease(actor: Clutter.Actor, params: AdvEasingParams) {
// Get mode defines
let modeDefine: ModeDefine|null
if (params.mode && params.mode > Clutter.AnimationMode.ANIMATION_LAST) {
modeDefine = AdvAnimationModeDefines[params.mode - AdvAnimationMode.LowBackover]
params.mode = modeDefine.mode
} else if ((typeof params.mode == "object") && ((params.mode as any) instanceof ModeDefine)) {
modeDefine = params.mode
params.mode = modeDefine.mode
}
// Run gnome ease function
actor.ease(params)
if (!modeDefine) return
// Adjust bezier progress if option exist
let { getCubicBezierProgress, cubicBezierProgress } = modeDefine
if (getCubicBezierProgress) cubicBezierProgress = getCubicBezierProgress()
if (cubicBezierProgress) {
for (const key in params) {
const transition = actor.get_transition(key.replace(/_/g, '-'))
if (!transition) continue
transition.set_cubic_bezier_progress(...cubicBezierProgress)
}
}
}
================================================
FILE: src/libs/shell/effects.ts
================================================
import GObject from 'gi://GObject'
import Shell from 'gi://Shell'
import Cogl from 'gi://Cogl'
import Clutter from 'gi://Clutter'
import Global from '../../global.js'
// #region RoundClipEffect
export class RoundClipEffect extends Shell.GLSLEffect {
static uniforms: RoundClipEffect.Uniforms|null = null
vfunc_build_pipeline (): void {
const [declarations, code] = Global.GetShader("media/rounded_corners.frag")
this.add_glsl_snippet(
// FIXME: waitting for type definition update
Cogl.SnippetHook.FRAGMENT as any,
declarations,
code,
false
)
}
vfunc_paint_target (node: Clutter.PaintNode, ctx: Clutter.PaintContext) {
// Reset to default blend string.
this.get_pipeline()?.set_blend(
'RGBA = ADD(SRC_COLOR, DST_COLOR*(1-SRC_COLOR[A]))'
)
super.vfunc_paint_target(node, ctx)
}
updateUniforms (
scale_factor: number,
corners_cfg: {
padding?: { left: number, right: number, top: number, bottom: number },
border_radius: number,
smoothing: number,
},
outer_bounds: { x1: number, x2: number, y1: number, y2: number },
border?: {
width: number
color: [number, number, number, number]
},
pixel_step?: [number, number]
) {
const border_width = (border?.width ?? 0) * scale_factor
const border_color = border?.color ?? [0, 0, 0, 0]
const outer_radius = corners_cfg.border_radius * scale_factor
const { padding, smoothing } = corners_cfg
const bounds = [
outer_bounds.x1 + (padding ? (padding.left * scale_factor) : 0),
outer_bounds.y1 + (padding ? (padding.top * scale_factor) : 0),
outer_bounds.x2 - (padding ? (padding.right * scale_factor) : 0),
outer_bounds.y2 - (padding ? (padding.bottom * scale_factor) : 0),
]
const inner_bounds = [
bounds[0] + border_width,
bounds[1] + border_width,
bounds[2] - border_width,
bounds[3] - border_width,
]
let inner_radius = outer_radius - border_width
if (inner_radius < 0.001) {
inner_radius = 0.0
}
if (!pixel_step) {
const actor = this.actor
pixel_step = [1 / actor.get_width (), 1 / actor.get_height ()]
}
// Setup with squircle shape
let exponent = smoothing * 10.0 + 2.0
let radius = outer_radius * 0.5 * exponent
const max_radius = Math.min (bounds[3] - bounds[0], bounds[4] - bounds[1])
if (radius > max_radius) {
exponent *= max_radius / radius
radius = max_radius
}
inner_radius *= radius / outer_radius
const location = this.getLocation()
this.set_uniform_float(location.bounds, 4, bounds)
this.set_uniform_float(location.inner_bounds, 4, inner_bounds)
this.set_uniform_float(location.pixel_step, 2, pixel_step)
this.set_uniform_float(location.border_width, 1, [border_width])
this.set_uniform_float(location.exponent, 1, [exponent])
this.set_uniform_float(location.clip_radius, 1, [radius])
this.set_uniform_float(location.border_color, 4, border_color)
this.set_uniform_float(location.inner_clip_radius, 1, [inner_radius])
this.queue_repaint()
}
getLocation(): RoundClipEffect.Uniforms {
let location = RoundClipEffect.uniforms
if (!location) {
location = new RoundClipEffect.Uniforms()
for (const key in location) {
location[key] = this.get_uniform_location(key)
}
RoundClipEffect.uniforms = location
}
return location
}
}
GObject.registerClass(RoundClipEffect)
export namespace RoundClipEffect {
// Uniform location cache
export class Uniforms {
bounds = 0
clip_radius = 0
exponent = 0
inner_bounds = 0
inner_clip_radius = 0
pixel_step = 0
border_width = 0
border_color = 0
}
}
// #endregion RoundClipEffect
================================================
FILE: src/libs/shell/feature.ts
================================================
import { type Rgb, type Rgba } from "../shared/colors.js"
import Maid from "../shared/maid.js";
import Global from "../../global.js";
import Logger from "../shared/logger.js";
export class SettingLoader {
records: Set
listeners: number[]
onChange: (key: string)=>void
parent: FeatureBase
constructor(
onChange: SettingLoader["onChange"],
parent: FeatureBase,
) {
this.parent = parent
this.records = new Set()
this.listeners = []
this.onChange = onChange
}
private push(key: string) {
if (this.records.has(key)) return
this.records.add(key)
this.listeners.push(
Global.Settings.connect(
`changed::${key}`,
() => this.onChange(key)
)
)
if (!this.parent.disableDebugMessage)
Logger.debug(()=>`Setting listener for key '${key}' added for feature ${this.parent.constructor.name}`)
}
clear() {
for (const source of this.listeners) {
Global.Settings.disconnect(source)
}
this.listeners = []
this.records.clear()
if (!this.parent.disableDebugMessage) {
Logger.debug(()=>`Disconnected setting listeners for feature ${this.parent.constructor.name }`)
}
}
loadBoolean(key: string): boolean {
this.push(key)
return Global.Settings.get_boolean(key)
}
loadString(key: string): string {
this.push(key)
return Global.Settings.get_string(key)
}
loadInt(key: string): number {
this.push(key)
return Global.Settings.get_int(key)
}
loadStrv(key: string): string[] {
this.push(key)
return Global.Settings.get_strv(key)
}
loadValue(key: string): T {
this.push(key)
return Global.Settings.get_value(key).recursiveUnpack()
}
loadRgb(key: string): Rgb|null {
this.push(key)
const color = Global.Settings.get_value(key).recursiveUnpack()
if (!color.length) return null
return color
}
loadRgba(key: string): Rgba|null {
this.push(key)
const color = Global.Settings.get_value(key).recursiveUnpack()
if (!color.length) return null
return color
}
}
export abstract class FeatureBase {
disableDebugMessage: boolean = false
loader: SettingLoader
maid: Maid
constructor() {
this.maid = new Maid()
this.loader = new SettingLoader((key: string)=>{
this.loader.clear()
this.loadSettings(this.loader)
this.reload(key)
}, this)
}
load(noSettingsLoad?: boolean): void {
if (!noSettingsLoad) this.loadSettings(this.loader)
this.onLoad()
}
unload(noSettingsUnload?: boolean): void {
if (!noSettingsUnload) this.loader.clear()
this.onUnload()
this.maid.clear()
}
abstract onLoad(): void
abstract onUnload(): void
reload(changedKey?: string): void {
this.unload(true)
this.load(true)
}
abstract loadSettings(loader: SettingLoader): void
}
================================================
FILE: src/libs/shell/gesture.ts
================================================
import St from "gi://St"
import Clutter from "gi://Clutter"
// #region Drag
export abstract class Drag extends St.Bin {
_dragging: boolean
_dragIsClick: boolean
_dragStartCoords: Drag.Coords
_dragMoveStartCoords: Drag.Coords
_grab: Clutter.Grab
_grabbedDevice: Clutter.InputDevice
_grabbedSequence: Clutter.EventSequence
dfunc_drag_end: (event: Drag.Event)=>void
dfunc_drag_start: (event: Drag.Event)=>void
dfunc_drag_motion: (event: Drag.Event)=>void
_dragStart(event: Clutter.Event): boolean {
if (this._dragging) return Clutter.EVENT_PROPAGATE
this._dragging = true
this._dragIsClick = true
this._dragStartCoords = event.get_coords()
this._grabbedDevice = event.get_device()
this._grabbedSequence = event.get_event_sequence()
// @ts-expect-error Types not implemented
this._grab = global.stage.grab(this)
const dragEvent: Drag.Event = event as Drag.Event
dragEvent.isClick = true
dragEvent.startCoords = this._dragStartCoords
dragEvent.coords = this._dragStartCoords
dragEvent.moveStartCoords = this._dragMoveStartCoords
if (this.dfunc_drag_start) this.dfunc_drag_start(dragEvent)
return Clutter.EVENT_STOP
}
_dragEnd(event: Clutter.Event): boolean {
if (!this._dragging) {
return Clutter.EVENT_PROPAGATE
}
if (this._grab) {
this._grab.dismiss()
this._grab = null
}
this._grabbedSequence = null
this._grabbedDevice = null
this._dragging = false
const coords = event.get_coords()
this._checkDragIsClick(coords)
const dragEvent: Drag.Event = event as Drag.Event
dragEvent.isClick = this._dragIsClick
dragEvent.startCoords = this._dragStartCoords
dragEvent.coords = coords
dragEvent.moveStartCoords = this._dragMoveStartCoords
this._dragStartCoords =
this._dragMoveStartCoords = null
if (this.dfunc_drag_end) this.dfunc_drag_end(dragEvent)
return Clutter.EVENT_STOP
}
_dragMotion(event: Clutter.Event): boolean {
const coords = event.get_coords()
this._checkDragIsClick(coords)
const dragEvent: Drag.Event = event as Drag.Event
dragEvent.isClick = this._dragIsClick
dragEvent.startCoords = this._dragStartCoords
dragEvent.coords = coords
dragEvent.moveStartCoords = this._dragMoveStartCoords
if (this.dfunc_drag_motion) this.dfunc_drag_motion(dragEvent)
return Clutter.EVENT_STOP
}
_checkDragIsClick(coords: Drag.Coords) {
if (!this._dragIsClick) return
if (
Drag.getCoordsDistanceSquare(
coords, this._dragStartCoords
) > Drag.DragMinPixelSquare
) {
this._dragMoveStartCoords = coords
this._dragIsClick = false
}
}
vfunc_button_press_event(event: Clutter.Event): boolean {
return this._dragStart(event)
}
vfunc_button_release_event(event: Clutter.Event): boolean {
return this._dragEnd(event)
}
vfunc_touch_event(event: Clutter.Event): boolean {
const sequence = event.get_event_sequence()
const slotSame = this._grabbedSequence && sequence.get_slot() === this._grabbedSequence.get_slot()
switch (event.type()) {
case Clutter.EventType.TOUCH_BEGIN:
return this._dragStart(event)
case Clutter.EventType.TOUCH_UPDATE:
if (!slotSame) return Clutter.EVENT_PROPAGATE
return this._dragMotion(event)
case Clutter.EventType.TOUCH_END:
if (!slotSame) return Clutter.EVENT_PROPAGATE
return this._dragEnd(event)
}
return Clutter.EVENT_PROPAGATE;
}
vfunc_motion_event(event: Clutter.Event): boolean {
if (this._dragging && !this._grabbedSequence) {
return this._dragMotion(event)
}
return Clutter.EVENT_PROPAGATE
}
static applyTo(widgetClass: any) {
const widgetProto = widgetClass.prototype
const dragProto = Drag.prototype
for (const methodName of Object.getOwnPropertyNames(dragProto)) {
Object.defineProperty(widgetProto, methodName, {
value: dragProto[methodName],
configurable: true,
writable: true,
})
}
}
static getCoordsDistanceSquare(coordsA: Drag.Coords, coordsB: Drag.Coords): number {
const [ax, ay] = coordsA
const [bx, by] = coordsB
const xdist = ax - bx
const ydist = ay - by
return xdist*xdist + ydist*ydist
}
}
export namespace Drag {
export const DragMinPixel = 6
export const DragMinPixelSquare = DragMinPixel*DragMinPixel
export type Coords = [number, number]
export type Event = Clutter.Event & {
isClick: boolean,
moveStartCoords: Coords,
startCoords: Coords,
coords: Coords,
}
}
// #endregion Drag
// #region Scroll
export abstract class Scroll extends St.Bin {
_scrollSumY: number
_scrollSumX: number
_scrolling: boolean
dfunc_scroll_start: (event: Scroll.Event)=>void
dfunc_scroll_motion: (event: Scroll.Event)=>void
dfunc_scroll_end: (event: Scroll.Event)=>void
vfunc_scroll_event(event: Clutter.Event): boolean {
if (
event.get_scroll_direction() != Clutter.ScrollDirection.SMOOTH
|| event.get_scroll_source() == Clutter.ScrollSource.WHEEL
) return Clutter.EVENT_PROPAGATE
const finish = event.get_scroll_finish_flags()
const [dx, dy] = event.get_scroll_delta()
if (!this._scrolling) {
this._scrolling = true
this._scrollSumX = dx
this._scrollSumY = dy
if (this.dfunc_scroll_start) {
const scrollEvent: Scroll.Event = event as Scroll.Event
scrollEvent.scrollSumX = dx
scrollEvent.scrollSumY = dy
scrollEvent.dx = dx
scrollEvent.dy = dy
this.dfunc_scroll_start(scrollEvent)
}
} else {
this._scrollSumX += dx
this._scrollSumY += dy
if (this.dfunc_scroll_motion) {
const scrollEvent: Scroll.Event = event as Scroll.Event
scrollEvent.scrollSumX = this._scrollSumX
scrollEvent.scrollSumY = this._scrollSumY
scrollEvent.dx = dx
scrollEvent.dy = dy
this.dfunc_scroll_motion(scrollEvent)
}
}
if (finish != Clutter.ScrollFinishFlags.NONE) {
this._scrolling = false
if (this.dfunc_scroll_end) {
const scrollEvent: Scroll.Event = event as Scroll.Event
scrollEvent.scrollSumX = this._scrollSumX
scrollEvent.scrollSumY = this._scrollSumY
scrollEvent.dx = dx
scrollEvent.dy = dy
scrollEvent.finish = finish
this.dfunc_scroll_end(scrollEvent)
}
}
}
static applyTo(widgetClass: any) {
const widgetProto = widgetClass.prototype
const scrollProto = Scroll.prototype
for (const methodName of Object.getOwnPropertyNames(scrollProto)) {
Object.defineProperty(widgetProto, methodName, {
value: scrollProto[methodName],
configurable: true,
writable: true,
})
}
}
}
export namespace Scroll {
export type Event = Clutter.Event & {
scrollSumX: number
scrollSumY: number
dx: number
dy: number
finish?: Clutter.ScrollFinishFlags
}
}
// #endregion Scroll
================================================
FILE: src/libs/shell/quickSettingsUtils.ts
================================================
import {
QuickMenuToggle,
QuickToggle,
SystemIndicator,
type QuickSettingsMenu,
} from "resource:///org/gnome/shell/ui/quickSettings.js"
import { type PopupMenuBase, PopupSeparatorMenuItem } from "resource:///org/gnome/shell/ui/popupMenu.js"
import Global from "../../global.js"
import Maid from "../shared/maid.js"
export abstract class ChildrenTrackerBase {
appliedChild: Map
addConnection: number
connectTarget: any
protected abstract getConnectTarget(): any
protected abstract catchChild(child: any): void
load(): void {
const connectTarget = this.connectTarget = this.getConnectTarget()
this.appliedChild = new Map()
this.addConnection = connectTarget.connect("child-added", (_: any, child: any)=>{
this.catchChild(child)
if (this.onUpdate) this.onUpdate()
})
for (const child of connectTarget.get_children()) {
this.catchChild(child)
}
if (this.onUpdate) this.onUpdate()
}
unload(): void {
for (const maid of this.appliedChild.values()) {
maid.destroy()
}
this.connectTarget.disconnect(this.addConnection)
this.addConnection = null
this.appliedChild = null
}
get items(): T[] {
if (!this.appliedChild) return []
return [...this.appliedChild.keys()]
}
onUpdate: ()=>void
}
export class QuickSettingsMenuTracker extends ChildrenTrackerBase {
onMenuOpen: (maid: Maid, menu: QuickSettingsMenu, isOpen: boolean)=>void
onMenuCreated: (maid: Maid, menu: QuickSettingsMenu)=>void
protected override catchChild(child: any): void {
const menu = child.menu
if (!menu) return
if (this.appliedChild.has(menu)) return
const menuMaid = new Maid()
menuMaid.functionJob(()=>{
this.appliedChild.delete(menu)
})
menuMaid.connectJob(menu, "open-state-changed", (_: any, isOpen: boolean) => {
if (this.onMenuOpen) this.onMenuOpen(menuMaid, menu, isOpen)
})
menuMaid.connectJob(menu, "destroy", ()=>{
menuMaid.destroy()
})
if (this.onMenuCreated) this.onMenuCreated(menuMaid, menu)
this.appliedChild.set(menu, menuMaid)
}
protected override getConnectTarget() {
return Global.QuickSettingsGrid
}
get menus() {
if (!this.appliedChild) return []
return [...this.appliedChild.keys()]
}
}
export class QuickSettingsToggleTracker extends ChildrenTrackerBase {
onToggleCreated: (maid: Maid, toggle: QuickToggle|QuickMenuToggle)=>void
protected override catchChild(child: any): void {
if (
!(child instanceof QuickToggle)
&& !(child instanceof QuickMenuToggle)
) return
if (this.appliedChild.has(child)) return
const toggleMaid = new Maid()
toggleMaid.functionJob(()=>{
this.appliedChild.delete(child)
})
toggleMaid.connectJob(child, "destroy", ()=>{
toggleMaid.destroy()
})
if (this.onToggleCreated) this.onToggleCreated(toggleMaid, child)
this.appliedChild.set(child, toggleMaid)
}
protected override getConnectTarget() {
return Global.QuickSettingsGrid
}
}
export class SystemIndicatorTracker extends ChildrenTrackerBase {
onIndicatorCreated: (maid: Maid, indicator: SystemIndicator)=>void
protected override catchChild(child: any): void {
if (
!(child instanceof SystemIndicator)
) return
if (this.appliedChild.has(child)) return
const indicatorMaid = new Maid()
indicatorMaid.functionJob(()=>{
this.appliedChild.delete(child)
})
indicatorMaid.connectJob(child, "destroy", ()=>{
indicatorMaid.destroy()
})
if (this.onIndicatorCreated) this.onIndicatorCreated(indicatorMaid, child)
this.appliedChild.set(child, indicatorMaid)
}
protected override getConnectTarget() {
return Global.Indicators
}
}
export function updateMenuSeparators(menu: PopupMenuBase) {
for (const item of (menu as any)._getMenuItems()) {
if (!(item instanceof PopupSeparatorMenuItem)) {
continue
}
(menu as any)._updateSeparatorVisibility(item)
}
}
================================================
FILE: src/libs/shell/styler.ts
================================================
import St from "gi://St"
import { type SettingLoader } from "./feature.js"
import { Rgba } from "../shared/colors.js"
export namespace StyledSlider {
export interface Options {
style: "slim" | "default"
activeBackgroundColor: Rgba | null
handleRadius: number
handleColor: Rgba | null
backgroundColor: Rgba | null
height: number
}
export function getStyle(options: Options): string {
const {
style,
activeBackgroundColor,
handleRadius,
handleColor,
backgroundColor,
height,
} = options
const styleList = []
switch (style) {
case "slim":
styleList.push("-slider-handle-radius:0px")
if (activeBackgroundColor) {
styleList.push("color:"+Rgba.formatCss(activeBackgroundColor))
} else {
styleList.push("color:-st-accent-color")
}
break
case "default":
default:
if (handleRadius) {
styleList.push(`-slider-handle-radius:${handleRadius}px`)
}
if (handleColor) {
styleList.push(`color:${Rgba.formatCss(handleColor)}`)
}
break
}
if (height) styleList.push(`-barlevel-height:${height}px`)
if (activeBackgroundColor) styleList.push(
`-barlevel-active-background-color:${Rgba.formatCss(activeBackgroundColor)}`
)
if (backgroundColor) styleList.push(
`-barlevel-background-color:${Rgba.formatCss(backgroundColor)}`
)
const result = styleList.join(";")
return result
}
export namespace Options {
export function fromLoader(loader: SettingLoader, prefix: string): Options {
return {
style: loader.loadString(prefix+"-style") as Options["style"],
handleColor: loader.loadRgba(prefix+"-handle-color"),
handleRadius: loader.loadInt(prefix+"-handle-radius"),
backgroundColor: loader.loadRgba(prefix+"-background-color"),
height: loader.loadInt(prefix+"-height"),
activeBackgroundColor: loader.loadRgba(prefix+"-active-background-color"),
}
}
export function isStyleKey(prefix: string, key: string): boolean {
if (key == prefix + "-style") return true
if (key == prefix + "-handle-color") return true
if (key == prefix + "-handle-radius") return true
if (key == prefix + "-background-color") return true
if (key == prefix + "-height") return true
if (key == prefix + "-active-background-color") return true
return false
}
}
}
export namespace StyledScroll {
export interface Options {
showScrollbar: boolean
fadeOffset: number
}
export function updateStyle(scroll: St.ScrollView, options: Options) {
scroll.style_class =
options.fadeOffset
? "vfade"
: ""
scroll.vscrollbar_policy =
options.showScrollbar
? St.PolicyType.AUTOMATIC
: St.PolicyType.EXTERNAL
scroll.style =
options.fadeOffset
? `-st-vfade-offset:${options.fadeOffset}px;`
: ""
}
export namespace Options {
export function fromLoader(loader: SettingLoader, prefix: string): Options {
return {
showScrollbar: loader.loadBoolean(prefix+"-show-scrollbar"),
fadeOffset: loader.loadInt(prefix+"-fade-offset"),
}
}
}
}
================================================
FILE: src/libs/types/quickSettingsOrderItem.ts
================================================
export interface QuickSettingsOrderItem {
id?: string
lineBreak?: boolean
pageBreak?: boolean
hide?: boolean // not used
friendlyName?: string // not used
}
export namespace QuickSettingsOrderItem {
export function match(a: QuickSettingsOrderItem, b: QuickSettingsOrderItem) {
return a.id == b.id
}
}
================================================
FILE: src/libs/types/systemIndicatorOrderItem.ts
================================================
import GObject from "gi://GObject"
import {
type SystemIndicator,
} from "resource:///org/gnome/shell/ui/quickSettings.js"
export interface SystemIndicatorOrderItem {
gtypeName?: string
constructorName?: string
friendlyName?: string
nonOrdered?: boolean
isSystem?: boolean
hide?: boolean
}
export namespace SystemIndicatorOrderItem {
export function match(a: SystemIndicatorOrderItem, b: SystemIndicatorOrderItem) {
if (
a.isSystem != b.isSystem
|| a.nonOrdered != b.nonOrdered
|| a.hide != b.hide
) return false
if (a.nonOrdered) return true
if (a.isSystem) return a.gtypeName == b.gtypeName
return (
a.constructorName == b.constructorName
&& a.friendlyName == b.friendlyName
&& a.gtypeName == b.gtypeName
)
}
export function indicatorMatch(item: SystemIndicatorOrderItem, indicator: SystemIndicator): boolean {
if (item.nonOrdered) return false
if (item.gtypeName && GObject.type_name_from_instance(indicator as any) != item.gtypeName)
return false
if (item.constructorName && indicator.constructor.name != item.constructorName)
return false
return true
}
export const Default: SystemIndicatorOrderItem = {
hide: false,
constructorName: "",
friendlyName: "",
gtypeName: "",
}
export function create(friendlyName: string): SystemIndicatorOrderItem {
return {
...Default,
friendlyName,
}
}
}
================================================
FILE: src/libs/types/toggleOrderItem.ts
================================================
import GObject from "gi://GObject"
import {
type QuickToggle,
type QuickMenuToggle,
} from "resource:///org/gnome/shell/ui/quickSettings.js"
export interface ToggleOrderItem {
gtypeName?: string
constructorName?: string
titleRegex?: string
friendlyName?: string
nonOrdered?: boolean
isSystem?: boolean
cachedTitleRegex?: RegExp
hide?: boolean
}
export namespace ToggleOrderItem {
export function match(a: ToggleOrderItem, b: ToggleOrderItem) {
if (
a.isSystem != b.isSystem
|| a.nonOrdered != b.nonOrdered
|| a.hide != b.hide
) return false
if (a.nonOrdered) return true
if (a.isSystem) return a.constructorName == b.constructorName
return (
a.constructorName == b.constructorName
&& a.titleRegex == b.titleRegex
&& a.friendlyName == b.friendlyName
&& a.gtypeName == b.gtypeName
)
}
export function toggleMatch(item: ToggleOrderItem, toggle: QuickToggle|QuickMenuToggle): boolean {
if (item.nonOrdered) return false
if (item.gtypeName && GObject.type_name_from_instance(toggle as any) != item.gtypeName)
return false
if (item.constructorName && toggle.constructor.name != item.constructorName)
return false
if (item.cachedTitleRegex && toggle.title.match(item.cachedTitleRegex) == null)
return false
if (!item.gtypeName && !item.constructorName && !item.cachedTitleRegex) return false
return true
}
export const Default: ToggleOrderItem = {
hide: false,
titleRegex: "",
constructorName: "",
friendlyName: "",
gtypeName: "",
}
export function create(friendlyName: string): ToggleOrderItem {
return {
...Default,
friendlyName,
}
}
}
================================================
FILE: src/prefPages/about.ts
================================================
import Adw from "gi://Adw"
import GObject from "gi://GObject"
import Gio from "gi://Gio"
import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"
import type QstExtensionPreferences from "../prefs.js"
import Config from "../config.js"
import {
Group,
Row,
ContributorsRow,
LicenseRow,
LogoGroup,
DialogRow,
ChangelogDialog,
fixPageScrollIssue,
SwitchRow,
DropdownRow,
} from "../libs/prefs/components.js"
export const AboutPage = GObject.registerClass({
GTypeName: Config.baseGTypeName+"AboutPage",
}, class AboutPage extends Adw.PreferencesPage {
constructor(settings: Gio.Settings, prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) {
super({
name: "about",
title: _("About"),
iconName: "dialog-information-symbolic"
})
fixPageScrollIssue(this)
// Logo
LogoGroup({
parent: this,
name: prefs.metadata.name,
icon: "qst-project-icon",
version: prefs.getVersionString(),
versionAction: () => ChangelogDialog({
window,
content: async () => prefs.getChangelog(),
currentBuildNumber: Config.buildNumber,
defaultPageBuildNumber: Config.buildNumber,
})
})
// About
Group({
parent: this,
title: _("About"),
description: _("Common extension informations"),
},[
Row({
title: _("Changelogs"),
subtitle: _("View the change history for this extension"),
action: ()=>ChangelogDialog({
window,
title: _("Changelogs"),
subtitle: _("View the change history for this extension"),
content: async () => prefs.getChangelog(),
currentBuildNumber: Config.buildNumber,
}),
icon: "object-rotate-right-symbolic",
}),
DialogRow({
window,
title: _("License"),
subtitle: _("License of codes"),
dialogTitle: _("License"),
minHeight: 520,
icon: "document-open-recent-symbolic",
childrenRequest: _page=>[
Group({
title: _("License"),
description: _("License of codes")
}, prefs.getLicenses().map(LicenseRow)),
],
}),
DialogRow({
window,
title: _("Contributors"),
subtitle: _("The creators of this extension"),
dialogTitle: _("Contributors"),
icon: "starred-symbolic",
childrenRequest: _page=>[
Group({
title: _("Contributors"),
description: _("The creators of this extension"),
}, [
...prefs.getContributorRows().map(ContributorsRow),
Row({
title: _("More contributors"),
subtitle: _("See more contributors on github"),
uri: "https://github.com/qwreey/quick-settings-tweaks/graphs/contributors"
}),
])
]
})
])
// Links
Group({
parent: this,
title: _("Link"),
description: _("External links about this extension")
},[
Row({
uri: "https://github.com/sponsors/qwreey",
title: _("Donate via github sponsors"),
subtitle: _("Support development!"),
icon: "emblem-favorite-symbolic",
}),
Row({
uri: "https://extensions.gnome.org/extension/5446/quick-settings-tweaker/",
title: "Gnome Extension",
subtitle: _("Rate and comment the extension!"),
icon: "qst-gnome-extension-logo-symbolic",
}),
Row({
uri: "https://github.com/qwreey75/quick-settings-tweaks",
title: _("Github Repository"),
subtitle: _("Add Star on Repository is helping me a lot!\nPlease, if you found bug from this extension, you can make issue to make me know that!\nOr, you can create PR with wonderful features!"),
icon: "qst-github-logo-symbolic",
}),
// Row({
// uri: "https://weblate.paring.moe/projects/gs-quick-settings-tweaks/",
// title: "Webslate",
// subtitle: _("Add translation to this extension!"),
// icon: "qst-weblate-logo-symbolic",
// }),
])
Group({
parent: this,
title: _("Debug"),
description: _("Extension debugging options"),
}, [
SwitchRow({
settings,
title: _("Expose environment"),
subtitle: _("Expose extension environment to globalThis.qst"),
bind: "debug-expose"
}),
SwitchRow({
settings,
title: _("Show layout border"),
subtitle: _("Show layout borders on Quick Settings"),
bind: "debug-show-layout-border"
}),
DropdownRow({
settings,
title: _("Log level"),
bind: "debug-log-level",
items: [
{ name: _("none"), value: -1 },
{ name: _("error"), value: 0 },
{ name: _("info"), value: 1 },
{ name: _("debug"), value: 2 },
],
}),
])
}
})
================================================
FILE: src/prefPages/layout.ts
================================================
import Adw from "gi://Adw"
import GObject from "gi://GObject"
import Gio from "gi://Gio"
import GLib from "gi://GLib"
import Gtk from "gi://Gtk"
import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"
import Config from "../config.js"
import type QstExtensionPreferences from "../prefs.js"
import { ToggleOrderItem } from "../libs/types/toggleOrderItem.js"
import {
SwitchRow,
UpDownButton,
Row,
Group,
DialogRow,
ToggleButtonRow,
ResetButton,
setScrollToFocus,
delayedSetScrollToFocus,
fixPageScrollIssue,
Dialog,
Button,
removeRowBottomBorder,
removeRowMinHeight,
DropdownRow,
} from "../libs/prefs/components.js"
import { SystemIndicatorOrderItem } from "../libs/types/systemIndicatorOrderItem.js"
import { QuickSettingsOrderItem } from "../libs/types/quickSettingsOrderItem.js"
// #region OrderGroup
function OrderGroup({
page, dialog, bind, sensitiveBind, info
}:{
page: Adw.PreferencesPage,
dialog: Adw.PreferencesDialog,
bind: string,
sensitiveBind: string,
info: OrderInfo
}): Adw.PreferencesGroup {
// Create group
const itemRows = new Map()
const header = new Gtk.Box({})
const group = Group({
title: info.getGroupTitle(),
description: info.getGroupDescription(),
headerSuffix: header
})
// Edit functions
const saveItem = (item: T, edited: T): string|null => {
const list = info.getListFromSettings()
const index = list.findIndex(targetItem => info.match(targetItem, item))
if (index == -1) {
return _("The item not found")
}
if (info.match(item, edited)) {
return _("No changes")
}
if (list.some(listItem => info.match(listItem, edited))) {
return _("The same item already exists")
}
list[index] = edited
info.setListToSettings(list)
return null
}
const editItem = (item: T)=>{
Dialog.StackedPage({
dialog,
title: _("Properties of %s").format(item.friendlyName),
childrenRequest: (_page, _dialog)=>{
const editLayout = info.createEditLayout(item)
const saveButton = Button({
marginBottom: 0,
marginTop: 0,
iconName: "document-save-symbolic",
text: _("Save"),
action: ()=>{
const edited = editLayout.getValue()
const saved = saveItem(item, edited)
if (saved == null) {
item = edited
} else {
dialog.add_toast(new Adw.Toast({
timeout: 6,
title: saved
}))
}
}
})
return [
Group({
title: _("Toggle editor"),
header_suffix: saveButton,
}, editLayout.layout)
]
}
})
}
const deleteItem = (item: T)=>{
const list = info.getListFromSettings()
const index = list.findIndex(targetItem => info.match(targetItem, item))
if (index == -1) return
list.splice(index, 1)
info.setListToSettings(list)
}
const hideItem = (item: T, hide: boolean)=>{
const list = info.getListFromSettings()
list.find(targetItem => info.match(targetItem, item)).hide = hide
info.setListToSettings(list)
dialog.add_toast(new Adw.Toast({
title: _("This option requires full gnome-shell reloading"),
timeout: 12,
}))
}
const moveItem = (item: T, offset: number)=>{
const list = info.getListFromSettings()
const index = list.findIndex(targetItem => info.match(targetItem, item))
if (!offset) return
const sign = Math.sign(offset)
let targetIndex = index
for (let count = Math.abs(offset); count > 0;) {
if (targetIndex <= 0 && sign == -1) break
if ((targetIndex >= (list.length - 1)) && sign == 1) break
if (info.moveBlocking(list, item, index, list[targetIndex], targetIndex)) break
targetIndex += sign
if (info.skip(list, item, index, list[targetIndex], targetIndex)) count--
}
if (index == targetIndex) return
list.splice(index, 1)
list.splice(targetIndex, 0, item)
info.setListToSettings(list)
}
// Control items
const pruneItems = (list: T[])=>{
for (const [targetItem, row] of itemRows.entries()) {
if (list.some(item => info.match(item, targetItem))) continue
itemRows.delete(targetItem)
group.remove(row)
}
}
const pushItems = (list: T[])=>{
for (const newItem of list) {
// Filter already exist
if ([...itemRows.entries()].find(([item]) => info.match(item, newItem)))
continue
// Create row
const row = Row({
settings: info.settings,
title: info.getDisplayName(newItem),
subtitle: info.getSubtitle(newItem),
sensitiveBind,
})
row.visible = info.shouldShow(newItem)
// Update icon
const systemKey = info.getSystemKey(newItem)
const iconName = systemKey && info.systemIcons.get(systemKey)
if (iconName) {
const icon = new Gtk.Image({
icon_name: iconName,
pixel_size: 18,
margin_start: 8,
margin_end: 2,
})
row.add_prefix(icon)
}
// Create Up & Down button
const updown = UpDownButton({
settings: info.settings,
sensitiveBind: "toggles-layout-enabled",
action: (direction)=>{
moveItem(newItem, direction == UpDownButton.Direction.Up ? -1 : 1)
}
})
row.add_prefix(updown)
// Hide button
if (info.canHide(newItem)) {
const toggle = new Gtk.ToggleButton({
margin_bottom: 8,
margin_top: 8,
label: _("Hide"),
active: newItem.hide ?? false,
})
toggle.connect("notify::active", () => hideItem(newItem, toggle.get_active()))
row.add_suffix(toggle)
}
// Delete & Edit button
if (info.canEdit(newItem)) {
const deleteButton = new Gtk.Button({
icon_name: "edit-clear-symbolic",
margin_bottom: 8,
margin_top: 8,
})
const editButton = new Gtk.Button({
icon_name: "document-edit-symbolic",
margin_bottom: 8,
margin_top: 8,
})
deleteButton.connect("clicked", deleteItem.bind(null, newItem))
editButton.connect("clicked", editItem.bind(null, newItem))
row.add_suffix(deleteButton)
row.add_suffix(editButton)
}
itemRows.set(newItem, row)
group.add(row)
}
}
const orderItems = (list: T[])=>{
const rows = [...itemRows.entries()]
const orderedRows = list
.map(
targetItem=>rows.find(
([item]) => info.match(targetItem, item)
)?.[1] ?? null
)
for (const row of orderedRows) {
if (!row) continue
group.remove(row)
group.add(row)
}
}
// Reset button
const resetButton = ResetButton({ settings: info.settings, bind, marginBottom: 0, marginTop: 0 })
resetButton.insert_after(header, null)
// Add button
const addButton = info.createAddButton(editItem)
addButton.insert_after(header, resetButton)
// Sync to settings
const update = ()=>{
setScrollToFocus(page, false)
const list = info.getListFromSettings()
pushItems(list)
pruneItems(list)
orderItems(list)
delayedSetScrollToFocus(page, true)
}
const settingsConnection = info.settings.connect(`changed::${bind}`, update.bind(null))
update()
page.connect("destroy", ()=>info.settings.disconnect(settingsConnection))
return group
}
abstract class OrderInfo {
settings: Gio.Settings
constructor(settings: Gio.Settings) {
this.settings = settings
}
abstract getSystemNames(): Map
abstract getSystemIcons(): Map
abstract getSystemKey(item: T): string
abstract getListFromSettings(): T[]
abstract setListToSettings(list: T[]): void
private _systemNames: Map
private _systemIcons: Map
get systemNames(): Map {
return this._systemNames ??= this.getSystemNames()
}
get systemIcons(): Map {
return this._systemIcons ??= this.getSystemIcons()
}
abstract getDisplayName(item: T): string
abstract getSubtitle(item: T): string
abstract canHide(item: T): boolean
abstract canEdit(item: T): boolean
abstract createEditLayout(item: T): OrderInfo.EditLayout
getNextName(list: T[]): string {
let nth = 1
let name: string
while (true) {
name = _("My item #%d").format(nth)
if (list.findIndex(item => item.friendlyName == name) == -1) break
nth += 1
}
return name
}
abstract create(friendlyName: string): T
abstract match(a: T, b: T): boolean
abstract shouldShow(item: T): boolean
skip(_list: T[], _moving: T, _movingIndex: number, target: T, _targetIndex: number): boolean {
return this.shouldShow(target)
}
moveBlocking(_list: T[], _moving: T, _movingIndex: number, target: T, _targetIndex: number): boolean {
return false
}
createAddButton(editItem: (item: T)=>void): Gtk.Widget {
return Button({
marginBottom: 0,
marginTop: 0,
iconName: "list-add",
text: _("New Item"),
action: ()=>{
const list = this.getListFromSettings()
const item = this.create(this.getNextName(list))
list.push(item)
this.setListToSettings(list)
editItem(item)
}
})
}
getGroupTitle(): string {
return _("Ordering and Hiding")
}
getGroupDescription(): string|null {
return null
}
}
namespace OrderInfo {
export type EditLayout = {
layout: any[],
getValue: ()=>T,
}
export type Base = {
hide?: boolean,
friendlyName?: string,
}
}
// #endregion OrderGroup
class ToggleOrderInfo extends OrderInfo {
createEditLayout(item: ToggleOrderItem): OrderInfo.EditLayout {
const friendlyName = new Adw.EntryRow({
text: item.friendlyName ?? "",
max_length: 2048,
title: _("Friendly Name"),
})
removeRowBottomBorder(friendlyName)
const hideRow = new Adw.SwitchRow({
active: item.hide ?? false,
title: _("Hide"),
})
const titleRegex = new Adw.EntryRow({
text: item.titleRegex ?? "",
max_length: 2048,
title: _("Title Regex (Javascript Regex)")
})
const constructorName = new Adw.EntryRow({
text: item.constructorName ?? "",
max_length: 2028,
title: _("Constructor Name")
})
removeRowBottomBorder(constructorName)
const gtypeName = new Adw.EntryRow({
text: item.gtypeName ?? "",
max_length: 2028,
title: _("GType Name")
})
removeRowBottomBorder(gtypeName)
return {
layout: [
hideRow,
friendlyName,
Row({
subtitle: _("This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension"),
onCreated: removeRowMinHeight,
}),
constructorName,
Row({
subtitle: _("Javascript constructor name"),
onCreated: removeRowMinHeight,
}),
gtypeName,
Row({
subtitle: _("GObject gtype name. You can get this value by calling GObject.type_name_from_instance"),
onCreated: removeRowMinHeight,
}),
titleRegex,
],
getValue: ()=>({
...item,
friendlyName: friendlyName.text,
constructorName: constructorName.text,
gtypeName: gtypeName.text,
titleRegex: titleRegex.text,
hide: hideRow.active,
})
}
}
getSystemKey(item: ToggleOrderItem): string {
return item.constructorName
}
getSystemNames(): Map {
const IGNORE_XGETTEXT=_
return new Map([
[ "NMWiredToggle", IGNORE_XGETTEXT("Wired Connections") ],
[ "NMWirelessToggle", IGNORE_XGETTEXT("Wi-Fi") ],
[ "NMModemToggle", IGNORE_XGETTEXT("Mobile Connections") ],
[ "NMBluetoothToggle", IGNORE_XGETTEXT("Bluetooth Tethers") ],
[ "NMVpnToggle", IGNORE_XGETTEXT("VPN") ],
[ "BluetoothToggle", IGNORE_XGETTEXT("Bluetooth") ],
[ "PowerProfilesToggle", IGNORE_XGETTEXT("Power Mode") ],
[ "NightLightToggle", IGNORE_XGETTEXT("Night Light") ],
[ "DarkModeToggle", IGNORE_XGETTEXT("Dark Style") ],
[ "KeyboardBrightnessToggle", _("Keyboard Backlight") ],
[ "RfkillToggle", IGNORE_XGETTEXT("Airplane Mode") ],
[ "RotationToggle", IGNORE_XGETTEXT("Auto Rotate") ],
[ "DoNotDisturbToggle", _("Do Not Disturb") ],
[ "UnsafeQuickToggle", _("Unsafe Mode") ],
])
}
getSystemIcons(): Map {
return new Map([
[ "NMWiredToggle", "network-wired-symbolic" ],
[ "NMWirelessToggle", "network-wireless-signal-excellent-symbolic" ],
[ "NMModemToggle", "network-cellular-symbolic" ],
[ "NMBluetoothToggle", "network-cellular-symbolic" ],
[ "NMVpnToggle", "network-vpn-symbolic" ],
[ "BluetoothToggle", "bluetooth-active-symbolic" ],
[ "PowerProfilesToggle", "power-profile-balanced-symbolic" ],
[ "NightLightToggle", "night-light-symbolic" ],
[ "DarkModeToggle", "weather-clear-night" ],
[ "KeyboardBrightnessToggle", "preferences-desktop-keyboard" ],
[ "RfkillToggle", "airplane-mode-symbolic" ],
[ "RotationToggle", "object-rotate-right" ],
[ "DoNotDisturbToggle", "notifications-disabled-symbolic" ],
[ "UnsafeQuickToggle", "channel-secure-symbolic" ],
])
}
getListFromSettings(): ToggleOrderItem[] {
return this.settings.get_value("toggles-layout-order").recursiveUnpack() as ToggleOrderItem[]
}
setListToSettings(list: ToggleOrderItem[]): void {
const mappedList = list.map(item => {
const out = {}
for (const [key, value] of Object.entries(item)) {
switch (typeof value) {
case "boolean":
out[key] = GLib.Variant.new_variant(
GLib.Variant.new_boolean(value)
)
break
case "string":
out[key] = GLib.Variant.new_variant(
GLib.Variant.new_string(value)
)
}
}
return out
})
this.settings.set_value("toggles-layout-order", new GLib.Variant("aa{sv}", mappedList))
}
getDisplayName(item: ToggleOrderItem): string {
if (item.nonOrdered) return _("Unordered items")
if (item.isSystem) return this.systemNames.get(item.constructorName) ?? "Unknown"
return item.friendlyName || item.constructorName || item.gtypeName || item.titleRegex || "Unknown"
}
getSubtitle(item: ToggleOrderItem): string {
if (item.nonOrdered) return ""
if (item.isSystem) return item.constructorName ?? ""
if (item.friendlyName) return item.constructorName || item.gtypeName || item.titleRegex || "Unknown"
return ""
}
canHide(item: ToggleOrderItem): boolean {
if (!item.isSystem) return true
return (
item.constructorName != "UnsafeQuickToggle"
)
}
canEdit(item: ToggleOrderItem): boolean {
return !item.isSystem && !item.nonOrdered
}
match(a: ToggleOrderItem, b: ToggleOrderItem): boolean {
return ToggleOrderItem.match(a, b)
}
create(friendlyName: string): ToggleOrderItem {
return ToggleOrderItem.create(friendlyName)
}
shouldShow(item: ToggleOrderItem): boolean {
if (item.constructorName == "UnsafeQuickToggle") {
return this.settings.get_boolean("unsafe-quick-toggle-enabled")
}
return true
}
}
class SystemIndicatorOrderInfo extends OrderInfo {
createEditLayout(item: SystemIndicatorOrderItem): OrderInfo.EditLayout {
const friendlyName = new Adw.EntryRow({
text: item.friendlyName ?? "",
max_length: 2048,
title: _("Friendly Name"),
})
removeRowBottomBorder(friendlyName)
const hideRow = new Adw.SwitchRow({
active: item.hide ?? false,
title: _("Hide"),
})
const constructorName = new Adw.EntryRow({
text: item.constructorName ?? "",
max_length: 2028,
title: _("Constructor Name")
})
removeRowBottomBorder(constructorName)
const gtypeName = new Adw.EntryRow({
text: item.gtypeName ?? "",
max_length: 2028,
title: _("GType Name")
})
removeRowBottomBorder(gtypeName)
return {
layout: [
hideRow,
friendlyName,
Row({
subtitle: _("This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension"),
onCreated: removeRowMinHeight,
}),
constructorName,
Row({
subtitle: _("Javascript constructor name"),
onCreated: removeRowMinHeight,
}),
gtypeName,
Row({
subtitle: _("GObject gtype name. You can get this value by calling GObject.type_name_from_instance"),
onCreated: removeRowMinHeight,
}),
],
getValue: ()=>({
...item,
friendlyName: friendlyName.text,
constructorName: constructorName.text,
gtypeName: gtypeName.text,
hide: hideRow.active,
})
}
}
getSystemKey(item: SystemIndicatorOrderItem): string {
return item.gtypeName
}
getSystemNames(): Map {
const IGNORE_XGETTEXT=_
return new Map([
[ "Gjs_toggle_dndQuickToggle_DndIndicator", _("Do Not Disturb") ],
[ "Gjs_status_remoteAccess_RemoteAccessApplet", _("Remote Access Applet") ],
[ "Gjs_status_camera_Indicator", _("Camera") ],
[ "Gjs_status_volume_InputIndicator", _("Volume Input") ],
[ "Gjs_status_location_Indicator", _("Location") ],
[ "Gjs_status_thunderbolt_Indicator", _("Thunderbolt") ],
[ "Gjs_status_nightLight_Indicator", IGNORE_XGETTEXT("Night Light") ],
[ "Gjs_status_network_Indicator", _("Network") ],
[ "Gjs_status_bluetooth_Indicator", IGNORE_XGETTEXT("Bluetooth") ],
[ "Gjs_status_rfkill_Indicator", IGNORE_XGETTEXT("Airplane Mode") ],
[ "Gjs_status_volume_OutputIndicator", _("Volume Output") ],
[ "Gjs_ui_panel_UnsafeModeIndicator", _("Unsafe Mode") ],
[ "Gjs_status_system_Indicator", _("System (Battery)") ],
])
}
getSystemIcons(): Map {
return new Map([
[ "Gjs_toggle_dndQuickToggle_DndIndicator", "notifications-disabled-symbolic" ],
[ "Gjs_status_remoteAccess_RemoteAccessApplet", "preferences-desktop-remote-desktop" ],
[ "Gjs_status_camera_Indicator", "camera-photo-symbolic" ],
[ "Gjs_status_volume_InputIndicator", "microphone-sensitivity-high-symbolic" ],
[ "Gjs_status_location_Indicator", "find-location-symbolic" ],
[ "Gjs_status_thunderbolt_Indicator", "system-run-symbolic" ],
[ "Gjs_status_nightLight_Indicator", "night-light-symbolic" ],
[ "Gjs_status_network_Indicator", "network-wireless-signal-excellent-symbolic" ],
[ "Gjs_status_bluetooth_Indicator", "bluetooth-active-symbolic" ],
[ "Gjs_status_rfkill_Indicator", "airplane-mode-symbolic" ],
[ "Gjs_status_volume_OutputIndicator", "audio-volume-medium-symbolic" ],
[ "Gjs_ui_panel_UnsafeModeIndicator", "channel-secure-symbolic" ],
[ "Gjs_status_system_Indicator", "system-shutdown-symbolic" ],
])
}
getListFromSettings(): SystemIndicatorOrderItem[] {
return this.settings.get_value("system-indicator-layout-order").recursiveUnpack() as SystemIndicatorOrderItem[]
}
setListToSettings(list: SystemIndicatorOrderItem[]): void {
const mappedList = list.map(item => {
const out = {}
for (const [key, value] of Object.entries(item)) {
switch (typeof value) {
case "boolean":
out[key] = GLib.Variant.new_variant(
GLib.Variant.new_boolean(value)
)
break
case "string":
out[key] = GLib.Variant.new_variant(
GLib.Variant.new_string(value)
)
}
}
return out
})
this.settings.set_value("system-indicator-layout-order", new GLib.Variant("aa{sv}", mappedList))
}
getDisplayName(item: SystemIndicatorOrderItem): string {
if (item.nonOrdered) return _("Unordered items")
if (item.isSystem) return this.systemNames.get(item.gtypeName) ?? "Unknown"
return item.friendlyName || item.constructorName || item.gtypeName || "Unknown"
}
getSubtitle(item: SystemIndicatorOrderItem): string {
if (item.nonOrdered) return ""
if (item.isSystem) return item.gtypeName ?? ""
if (item.friendlyName) return item.constructorName || item.gtypeName || "Unknown"
return ""
}
canHide(item: SystemIndicatorOrderItem): boolean {
if (!item.isSystem) return true
return item.gtypeName != "Gjs_toggle_dndQuickToggle_DndIndicator"
}
canEdit(item: SystemIndicatorOrderItem): boolean {
return !item.isSystem && !item.nonOrdered
}
match(a: SystemIndicatorOrderItem, b: SystemIndicatorOrderItem): boolean {
return SystemIndicatorOrderItem.match(a, b)
}
create(friendlyName: string): SystemIndicatorOrderItem {
return SystemIndicatorOrderItem.create(friendlyName)
}
shouldShow(item: SystemIndicatorOrderItem): boolean {
if (item.gtypeName == "Gjs_toggle_dndQuickToggle_DndIndicator") {
return (
this.settings.get_string("dnd-quick-toggle-indicator-position") == "system-tray"
)
}
return true
}
}
// class QuickSettingsOrderInfo extends OrderInfo {
// }
// #region SystemItemOrderGroup
function SystemItemOrderGroup(settings: Gio.Settings, page: Adw.PreferencesPage): Adw.PreferencesGroup {
let items = new Map()
let group: Adw.PreferencesGroup
const reorder = ()=>{
setScrollToFocus(page, false)
const order = SystemItemOrderGroup.copyOrder(settings.get_strv("system-items-layout-order"))
for (const name of order) {
const target = items.get(name)
group.remove(target)
group.add(target)
}
delayedSetScrollToFocus(page, true)
}
const move = (direction: UpDownButton.Direction, name: string)=>{
const order = SystemItemOrderGroup.copyOrder(settings.get_strv("system-items-layout-order"))
const index = order.indexOf(name)
if (direction == UpDownButton.Direction.Up) {
if (index == 0) return
order[index] = order[index - 1]
order[index - 1] = name
} else {
if (index == (SystemItemOrderGroup.DefaultOrder.length - 1)) return
order[index] = order[index + 1]
order[index + 1] = name
}
settings.set_strv("system-items-layout-order", order)
}
const orderConnection = settings.connect("changed::system-items-layout-order", reorder)
page.connect("destroy", ()=>settings.disconnect(orderConnection))
return Group({
title: _("Ordering and Hiding"),
headerSuffix: ResetButton({ settings, bind: "system-items-layout-order", marginBottom: 0, marginTop: 0 }),
onCreated(row: Adw.PreferencesGroup) {
group = row
reorder()
},
}, [
Row({
title: _("Desktop Spacer"),
prefix: UpDownButton({
settings,
sensitiveBind: "system-items-layout-enabled",
action: (direction) => move(direction, "desktopSpacer"),
}),
onCreated(row) {
items.set("desktopSpacer", row)
},
}),
Row({
title: _("Laptop Spacer"),
prefix: UpDownButton({
settings,
sensitiveBind: "system-items-layout-enabled",
action: (direction) => move(direction, "laptopSpacer"),
}),
onCreated(row) {
items.set("laptopSpacer", row)
},
}),
...[
{
title: _("Capture button"),
bind: "system-items-layout-hide-screenshot",
icon: "camera-photo",
targetName: "screenshot",
},
{
title: _("Settings button"),
bind: "system-items-layout-hide-settings",
icon: "preferences-system-symbolic",
targetName: "settings",
},
{
title: _("Lock button"),
bind: "system-items-layout-hide-lock",
icon: "system-lock-screen-symbolic",
targetName: "lock",
},
{
title: _("Shutdown button"),
bind: "system-items-layout-hide-shutdown",
icon: "system-shutdown-symbolic",
targetName: "shutdown",
},
{
title: _("Battery button"),
bind: "system-items-layout-hide-battery",
icon: "battery-symbolic",
targetName: "battery",
},
].map(item => ToggleButtonRow({
settings,
text: _("Hide"),
sensitiveBind: "system-items-layout-enabled",
...item,
onCreated(row: Adw.ActionRow) {
items.set(item.targetName, row)
row.add_prefix(new Gtk.Image({
icon_name: item.icon,
pixel_size: 16,
margin_start: 8
}))
row.add_prefix(UpDownButton({
settings,
sensitiveBind: "system-items-layout-enabled",
action: (direction) => move(direction, item.targetName),
}))
},
}))
])
}
namespace SystemItemOrderGroup {
export const DefaultOrder = ["battery", "laptopSpacer", "screenshot", "settings", "desktopSpacer", "lock", "shutdown"]
export function copyOrder(order: string[]): string[] {
return DefaultOrder
.map(item => ({
item,
index: order.indexOf(item),
}))
.sort((a, b)=>a.index-b.index)
.map(item => item.item)
}
}
// #endregion SystemItemOrderGroup
export const LayoutPage = GObject.registerClass({
GTypeName: Config.baseGTypeName+"LayoutPage",
}, class LayoutPage extends Adw.PreferencesPage {
constructor(settings: Gio.Settings, _prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) {
super({
name: "Layout",
title: _("Layout"),
iconName: "view-sort-descending-symbolic",
})
fixPageScrollIssue(this)
// Quick toggles
Group({
parent: this,
title: _("Quick Toggles Layout"),
description: _("Adjust quick toggles layout"),
},[
SwitchRow({
bind: "toggles-layout-enabled",
settings,
onDetailed: ()=>{
Dialog({
window,
childrenRequest: (page, dialog) => [OrderGroup({
page,
dialog,
bind: "toggles-layout-order",
sensitiveBind: "toggles-layout-enabled",
info: new ToggleOrderInfo(settings),
})],
title: _("Adjust quick toggles layout"),
})
},
title: _("Ordering and Hiding"),
subtitle: _("Reorder and hide quick toggles"),
experimental: true,
}),
])
// System indicators
Group({
parent: this,
title: _("System Indicators"),
description: _("Adjust system indicators layout and style"),
},[
SwitchRow({
settings,
bind: "system-indicator-screen-sharing-indicator-use-accent",
title: _("Accent screen sharing indicator"),
subtitle: _("Use shell accent color on screen sharing indicator"),
}),
SwitchRow({
settings,
bind: "system-indicator-screen-recording-indicator-use-accent",
title: _("Accent screen recording indicator"),
subtitle: _("Use shell accent color on screen recording indicator"),
}),
DropdownRow({
settings,
bind: "system-indicator-privacy-indicator-style",
title: _("Privacy indicators style"),
subtitle: _("Use monochrome or shell accent color on privarcy indicators"),
items: [
{ name: _("Default"), value: "default" },
{ name: _("Accent"), value: "accent" },
{ name: _("Monochrome"), value: "monochrome" },
],
}),
SwitchRow({
settings,
bind: "system-indicator-layout-enabled",
onDetailed: ()=>{
Dialog({
window,
title: _("Adjust system indicators"),
childrenRequest: (page, dialog) => [OrderGroup({
page,
dialog,
bind: "system-indicator-layout-order",
sensitiveBind: "system-indicator-layout-enabled",
info: new SystemIndicatorOrderInfo(settings),
})],
})
},
title: _("Ordering and Hiding"),
subtitle: _("Reorder and hide system indicators"),
experimental: true,
}),
])
// System Items
Group({
parent: this,
title: _("System Items Layout"),
headerSuffix: SwitchRow({
settings,
bind: "system-items-layout-enabled",
}),
description: _("Adjust system items layout"),
},[
SwitchRow({
settings,
title: _("Hide layout box"),
subtitle: _("Hide all buttons and layout box"),
bind: "system-items-layout-hide",
sensitiveBind: "system-items-layout-enabled",
}),
DialogRow({
settings,
window,
sensitiveBind: "system-items-layout-enabled",
title: _("Ordering and Hiding"),
subtitle: _("Reorder and hide system items"),
dialogTitle: _("Adjust system items layout"),
experimental: true,
childrenRequest: page => [SystemItemOrderGroup(settings, page)],
}),
])
// DateMenu
Group({
parent: this,
title: _("Date Menu"),
description: _("Adjust Date Menu layout"),
},[
SwitchRow({
settings,
title: _("Hide left box"),
subtitle: _("Hide the left box of the date menu, which contains notifications and media control"),
bind: "datemenu-hide-left-box",
}),
SwitchRow({
settings,
title: _("Hide right box"),
subtitle: _("Hide the right box of the date menu, which contains calendar, world clock and weather"),
bind: "datemenu-hide-right-box",
}),
SwitchRow({
settings,
title: _("Disable menu"),
subtitle: _("Do not open date menu when the date menu button clicked"),
bind: "datemenu-disable-menu",
}),
])
}
})
================================================
FILE: src/prefPages/menu.ts
================================================
import Adw from "gi://Adw"
import GObject from "gi://GObject"
import Gio from "gi://Gio"
import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"
import Config from "../config.js"
import type QstExtensionPreferences from "../prefs.js"
import {
SwitchRow,
AdjustmentRow,
DropdownRow,
Group,
DialogRow,
fixPageScrollIssue,
} from "../libs/prefs/components.js"
// #region AdvancedAnimationStyleGroup
function AdvancedAnimationStyleGroup(settings: Gio.Settings): Adw.PreferencesGroup {
return Group({
title: _("Advanced animation style"),
},[
AdjustmentRow({
settings,
title: _("Open Duration"),
subtitle: _("Open animation duration in microseconds"),
sensitiveBind: "menu-animation-enabled",
bind: "menu-animation-open-duration",
max: 4000,
}),
AdjustmentRow({
settings,
title: _("Close Duration"),
subtitle: _("Close animation duration in microseconds"),
sensitiveBind: "menu-animation-enabled",
bind: "menu-animation-close-duration",
max: 4000,
}),
AdjustmentRow({
settings,
title: _("Grid Content Opacity"),
subtitle: _("Adjust grid content opacity.\nSet this to 255 to make opaque, and 0 to make transparent"),
sensitiveBind: "menu-animation-enabled",
bind: "menu-animation-grid-content-opacity",
max: 255,
}),
AdjustmentRow({
settings,
title: _("Background Blur Radius"),
subtitle: _("Adjust background blur radius.\nSet this to 0 to disable blur effect"),
sensitiveBind: "menu-animation-enabled",
bind: "menu-animation-background-blur-radius",
max: 32,
}),
AdjustmentRow({
settings,
title: _("Background Brightness"),
subtitle: _("Adjust background brightness.\nSet this to 1000 to disable brightness control effect.\nNot impacts on gnome-shell's default dim effect."),
sensitiveBind: "menu-animation-enabled",
bind: "menu-animation-background-brightness",
max: 2000,
}),
AdjustmentRow({
settings,
title: _("Background Opacity"),
subtitle: _("Adjust background opacity.\nSet this to 255 to make opaque, and 0 to make transparent"),
sensitiveBind: "menu-animation-enabled",
bind: "menu-animation-background-opacity",
max: 255,
}),
AdjustmentRow({
settings,
title: _("Background X Scale"),
subtitle: _("Adjust background x scale, 1000 means 1.0 scale"),
sensitiveBind: "menu-animation-enabled",
bind: "menu-animation-background-scale-x",
max: 4000,
}),
AdjustmentRow({
settings,
title: _("Background Y Scale"),
subtitle: _("Adjust background y scale, 1000 means 1.0 scale"),
sensitiveBind: "menu-animation-enabled",
bind: "menu-animation-background-scale-y",
max: 4000,
}),
])
}
// #endregion AdvancedAnimationStyleGroup
export const MenuPage = GObject.registerClass({
GTypeName: Config.baseGTypeName+"MenuPage",
}, class MenuPage extends Adw.PreferencesPage {
constructor(settings: Gio.Settings, _prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) {
super({
name: "Menu",
title: _("Menu"),
iconName: "user-available-symbolic",
})
fixPageScrollIssue(this)
// Overlay
Group({
parent: this,
title: _("Overlay Mode"),
description: _("Display toggle, power, and sound menus as overlay"),
headerSuffix: SwitchRow({
settings,
bind: "overlay-menu-enabled",
}),
experimental: true,
},[
AdjustmentRow({
settings,
title: _("Overlay Width"),
subtitle: _("Adjust overlay menu width\nSet this to 0 to disable adjusting"),
sensitiveBind: "overlay-menu-enabled",
bind: "overlay-menu-width",
max: 2048,
}),
AdjustmentRow({
settings,
title: _("Overlay Animation Duration"),
subtitle: _("Custom menu open animation duration in microseconds\nSet this to 0 to disable custom animation"),
sensitiveBind: "overlay-menu-enabled",
bind: "overlay-menu-animate-duration",
max: 4000,
}),
DropdownRow({
settings,
title: _("Overlay Animation Style"),
subtitle: _("Custom menu open animation style"),
items: [
{ "name": _("Flyout"), "value": "flyout" },
{ "name": _("Dialog"), "value": "dialog" },
],
bind: "overlay-menu-animate-style",
sensitiveBind: "overlay-menu-enabled"
}),
DropdownRow({
settings,
title: _("Overlay overflow anchor"),
subtitle: _("When the menu box is taller than Quick Settings, determines where in Quick Settings the menu box will be fixed"),
items: [
{ "name": _("Top"), "value": "top" },
{ "name": _("Center"), "value": "center" },
{ "name": _("Bottom"), "value": "bottom" },
],
bind: "overlay-menu-overflow-anchor",
sensitiveBind: "overlay-menu-enabled"
})
])
// Animation
Group({
parent: this,
title: _("Animation"),
description: _("Add menu animation on toggle menu opening and closing\nTo get the best feel, turn on overlay mode"),
headerSuffix: SwitchRow({
settings,
bind: "menu-animation-enabled",
}),
experimental: true,
},[
DialogRow({
window,
settings,
title: _("Advanced animation style"),
subtitle: _("Adjust speed, blur, scale, and opacity"),
dialogTitle: _("Animation"),
sensitiveBind: "menu-animation-enabled",
childrenRequest: ()=>[AdvancedAnimationStyleGroup(settings)],
}),
])
}
})
================================================
FILE: src/prefPages/toggles.ts
================================================
import Adw from "gi://Adw"
import GObject from "gi://GObject"
import Gio from "gi://Gio"
import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"
import Config from "../config.js"
import type QstExtensionPreferences from "../prefs.js"
import {
SwitchRow,
Group,
fixPageScrollIssue,
} from "../libs/prefs/components.js"
export const TogglesPage = GObject.registerClass({
GTypeName: Config.baseGTypeName+"TogglesPage",
}, class TogglesPage extends Adw.PreferencesPage {
constructor(settings: Gio.Settings, _prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) {
super({
name: "Toggles",
title: _("Toggles"),
iconName: "view-grid-symbolic",
})
fixPageScrollIssue(this)
// Unsafe Mode Toggle
Group({
parent: this,
title: _("Unsafe Mode Quick Toggle"),
description: _("Turn on to add the unsafe quick toggle on the Quick Settings panel"),
headerSuffix: SwitchRow({
settings,
bind: "unsafe-quick-toggle-enabled",
}),
}, [
SwitchRow({
settings,
title: _("Save last session state"),
subtitle: _("Turn on to save last session unsafe state"),
bind: "unsafe-quick-toggle-save-last-state",
sensitiveBind: "unsafe-quick-toggle-enabled",
}),
])
}
})
================================================
FILE: src/prefPages/widgets.ts
================================================
import Adw from "gi://Adw"
import GObject from "gi://GObject"
import Gio from "gi://Gio"
import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"
import Config from "../config.js"
import type QstExtensionPreferences from "../prefs.js"
import {
SwitchRow,
AdjustmentRow,
Group,
fixPageScrollIssue,
RgbColorRow,
DropdownRow,
EntryRow,
Dialog,
PaddingDialog,
} from "../libs/prefs/components.js"
function SliderCustomizes({
settings,
baseName,
sensitiveBind,
}: {
settings: Gio.Settings,
baseName: string,
sensitiveBind?: string
}): any[] {
// Handle color & radius
const handleRadius = AdjustmentRow({
settings,
max: 1000,
title: _("Handle radius"),
subtitle: _("Set this to 0 to use default radius"),
bind: baseName+"-handle-radius",
sensitiveBind,
})
const handleColor = RgbColorRow({
settings,
title: _("Handle color"),
bind: baseName+"-handle-color",
sensitiveBind,
useAlpha: true,
})
const updateHandleOptionVisible = ()=>{
const value = settings.get_string(baseName+"-style")
handleRadius.visible =
handleColor.visible = value != "slim"
}
const updateHandleOptionVisibleConnection =
settings.connect(
`changed::${baseName}-style`,
updateHandleOptionVisible
)
updateHandleOptionVisible()
handleColor.child.connect("destroy", ()=>{
settings.disconnect(updateHandleOptionVisibleConnection)
})
return [
DropdownRow({
settings,
title: _("Slider style"),
bind: baseName+"-style",
items: [
{ name: _("Slim"), value: "slim" },
{ name: _("Default"), value: "default" },
],
sensitiveBind,
}),
handleRadius,
handleColor,
RgbColorRow({
settings,
title: _("Background color"),
bind: baseName+"-background-color",
sensitiveBind,
useAlpha: true,
}),
RgbColorRow({
settings,
title: _("Active Background color"),
bind: baseName+"-active-background-color",
sensitiveBind,
useAlpha: true,
}),
AdjustmentRow({
settings,
title: _("Thickness"),
max: 1000,
bind: baseName+"-height",
sensitiveBind,
subtitle: _("Set this to 0 to use default thickness"),
})
]
}
export const WidgetsPage = GObject.registerClass({
GTypeName: Config.baseGTypeName+"WidgetsPage",
}, class WidgetsPage extends Adw.PreferencesPage {
constructor(settings: Gio.Settings, _prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) {
super({
name: "Widgets",
title: _("Widgets"),
iconName: "window-new-symbolic",
})
fixPageScrollIssue(this)
// media
Group({
parent: this,
title: _("Media Widget"),
headerSuffix: SwitchRow({
settings,
bind: "media-enabled",
}),
description: _("Turn on to make the media widget visible on the Quick Settings panel"),
},[
SwitchRow({
settings,
title: _("Compact mode"),
subtitle: _("Make Media Controls widget smaller\nMake it more similar in size to the notification message"),
bind: "media-compact",
sensitiveBind: "media-enabled",
}),
AdjustmentRow({
settings,
title: _("Control buttons opacity"),
subtitle: _("Set this to 255 to make opaque, and 0 to make transparent"),
max: 255,
bind: "media-contorl-opacity",
sensitiveBind: "media-enabled",
}),
SwitchRow({
settings,
bind: "media-contorl-show-next-button",
title: _("Show next button"),
subtitle: _("Add next contorl button next to description"),
sensitiveBind: "media-enabled",
}),
SwitchRow({
settings,
bind: "media-contorl-show-prev-button",
title: _("Show previous button"),
subtitle: _("Add previous contorl button next to description"),
sensitiveBind: "media-enabled",
}),
SwitchRow({
settings,
bind: "media-contorl-show-pause-button",
title: _("Show pause button"),
subtitle: _("Add pause contorl button next to description"),
sensitiveBind: "media-enabled",
}),
SwitchRow({
settings,
bind: "media-progress-enabled",
title: _("Show progress bar"),
subtitle: _("Add progress bar under description"),
experimental: true,
sensitiveBind: "media-enabled",
onDetailed: ()=>{Dialog({
window,
title: _("Media Widget"),
childrenRequest: ()=>[Group({
title: _("Show progress bar"),
description: _("Add progress bar under description"),
header_suffix: SwitchRow({
settings,
bind: "media-progress-enabled",
}),
}, SliderCustomizes({
settings,
baseName: "media-progress",
sensitiveBind: "media-progress-enabled"
}))],
})}
}),
SwitchRow({
settings,
bind: "media-gradient-enabled",
title: _("Gradient background"),
subtitle: _("Use gradient background extracted from cover image\nMay affect performance slightly"),
sensitiveBind: "media-enabled",
experimental: true,
onDetailed: ()=>{Dialog({
window,
title: _("Media Widget"),
childrenRequest: ()=>[Group({
title: _("Gradient background"),
header_suffix: SwitchRow({
settings,
bind: "media-gradient-enabled",
}),
description: _("Use gradient background extracted from cover image\nMay affect performance slightly"),
},[
RgbColorRow({
settings,
title: _("Background color"),
subtitle: _("Base background color"),
bind: "media-gradient-background-color",
sensitiveBind: "media-gradient-enabled",
}),
AdjustmentRow({
settings,
max: 1000,
sensitiveBind: "media-gradient-enabled",
title: _("Start opacity"),
subtitle: _("Adjust left side transparency, Set this to 1000 to make opaque"),
bind: "media-gradient-start-opaque",
}),
AdjustmentRow({
settings,
max: 1000,
sensitiveBind: "media-gradient-enabled",
title: _("Start color"),
subtitle: _("Adjust left side background color mixing, Set this to 1000 to show extracted color"),
bind: "media-gradient-start-mix",
}),
AdjustmentRow({
settings,
max: 1000,
sensitiveBind: "media-gradient-enabled",
title: _("End opacity"),
subtitle: _("Adjust right side transparency, Set this to 1000 to make opaque"),
bind: "media-gradient-end-opaque",
}),
AdjustmentRow({
settings,
max: 1000,
sensitiveBind: "media-gradient-enabled",
title: _("End color"),
subtitle: _("Adjust right side background color mixing, Set this to 1000 to show extracted color"),
bind: "media-gradient-end-mix",
}),
])],
})}
}),
SwitchRow({
settings,
title: _("Round clip effect"),
subtitle: _("Use round clip effect to make transition more natural"),
bind: "media-round-clip-enabled",
sensitiveBind: "media-enabled",
experimental: true,
onDetailed: ()=>{Dialog({
window,
title: _("Media Widget"),
childrenRequest: ()=>[Group({
title: _("Round clip effect"),
header_suffix: SwitchRow({
settings,
bind: "media-round-clip-enabled",
}),
description: _("Use round clip effect to make transition more natural"),
},[
SwitchRow({
title: _("Padding adjustment"),
settings,
subtitle: _("Adjust clip effect padding, edit this if your theme has a different margin or padding"),
bind: "media-round-clip-padding-adjustment-enabled",
sensitiveBind: "media-round-clip-enabled",
onDetailed: ()=>{
PaddingDialog({
window,
settings,
bind: "media-round-clip-padding-adjustment-value",
})
}
})
])],
})}
}),
SwitchRow({
settings,
title: _("Remove shadow"),
subtitle: _("Remove shadow from media message\nUse if your theme creates unnecessary shadows"),
bind: "media-remove-shadow",
sensitiveBind: "media-enabled",
}),
AdjustmentRow({
settings,
title: _("Smooth scroll speed"),
subtitle: _("Adjust trackpad and trackpoint scroll speed, negative number for invert direction"),
max: 2048,
min: -2048,
bind: "media-smooth-scroll-speed",
sensitiveBind: "media-enabled",
}),
])
// notification
Group({
parent: this,
title: _("Notifications Widget"),
headerSuffix: SwitchRow({
settings,
bind: "notifications-enabled"
}),
description: _("Turn on to make the notifications widget visible on the Quick Settings panel"),
},[
SwitchRow({
settings,
title: _("Compact mode"),
subtitle: _("Make notifications smaller"),
bind: "notifications-compact",
sensitiveBind: "notifications-enabled",
}),
AdjustmentRow({
settings,
title: _("Max height"),
subtitle: _("Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height")
.format(settings.get_default_value("notifications-max-height").unpack()),
max: 2048,
bind: "notifications-max-height",
sensitiveBind: "notifications-enabled",
}),
AdjustmentRow({
settings,
title: _("Fade out offset"),
subtitle: _("Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46"),
max: 2048,
bind: "notifications-fade-offset",
sensitiveBind: "notifications-enabled",
}),
SwitchRow({
settings,
title: _("Auto hide"),
subtitle: _("Hide the Notifications widget when have no notifications"),
bind: "notifications-autohide",
sensitiveBind: "notifications-enabled",
}),
SwitchRow({
settings,
title: _("Use native controls"),
subtitle: _("Use native dnd switch and clear button"),
bind: "notifications-use-native-controls",
sensitiveBind: "notifications-enabled",
}),
SwitchRow({
settings,
title: _("Remove shadow"),
subtitle: _("Remove shadow from notification message\nUse if your theme creates unnecessary shadows"),
bind: "notifications-remove-shadow",
sensitiveBind: "notifications-enabled",
}),
SwitchRow({
settings,
title: _("Show scrollbar"),
subtitle: _("Show scrollbar on message list"),
bind: "notifications-show-scrollbar",
sensitiveBind: "notifications-enabled",
}),
])
// weather
Group({
parent: this,
title: _("Weather Widget"),
headerSuffix: SwitchRow({
settings,
bind: "weather-enabled"
}),
description: _("Turn on to make the weather widget visible on the Quick Settings panel"),
},[
SwitchRow({
settings,
title: _("Compact mode"),
subtitle: _("Make weather widget smaller"),
bind: "weather-compact",
sensitiveBind: "weather-enabled",
}),
SwitchRow({
settings,
title: _("Remove shadow"),
subtitle: _("Remove shadow from weather widget\nUse if your theme creates unnecessary shadows"),
bind: "weather-remove-shadow",
sensitiveBind: "weather-enabled",
}),
EntryRow({
settings,
title: _("Click command"),
bind: "weather-click-command",
sensitiveBind: "weather-enabled",
}),
SwitchRow({
settings,
title: _("Show location"),
subtitle: _("Show the location label on header"),
bind: "weather-show-location",
sensitiveBind: "weather-enabled",
}),
AdjustmentRow({
settings,
max: 1024,
min: 1,
bind: "weather-interval-hour",
title: _("Forecast interval"),
subtitle: _("Adjust forecast interval in hour"),
}),
AdjustmentRow({
settings,
max: 12,
min: 0,
bind: "weather-max-forecasts",
title: _("Max forecasts"),
subtitle: _("Adjust max forecasts"),
}),
])
// volume mixer
Group({
parent: this,
title: _("Volume mixer Widget"),
headerSuffix: SwitchRow({
settings,
bind: "volume-mixer-enabled"
}),
description: _("Turn on to make the volume mixer widget visible on the Quick Settings panel"),
},[
DropdownRow({
settings,
title: _("Label text"),
subtitle: _("Choose label above slider text source"),
items: [
{ name: _("Both"), value: "both" },
{ name: _("Title"), value: "title" },
{ name: _("Description"), value: "description" },
{ name: _("None"), value: "none" },
],
bind: "volume-mixer-label-text",
sensitiveBind: "volume-mixer-enabled",
}),
AdjustmentRow({
settings,
max: 255,
title: _("Label opacity"),
subtitle: _("Adjust label opacity.\nSet this to 255 to make opaque, and 0 to make transparent"),
bind: "volume-mixer-label-opacity",
sensitiveBind: "volume-mixer-enabled",
}),
AdjustmentRow({
settings,
title: _("Max height"),
subtitle: _("Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height")
.format(settings.get_default_value("volume-mixer-max-height").unpack()),
max: 2048,
bind: "volume-mixer-max-height",
sensitiveBind: "volume-mixer-enabled",
}),
SwitchRow({
settings,
title: _("Show scrollbar"),
subtitle: _("Show scrollbar on mixer list"),
bind: "volume-mixer-show-scrollbar",
sensitiveBind: "volume-mixer-enabled",
}),
SwitchRow({
settings,
title: _("Show stream icon"),
subtitle: _("Show stream icon above mixer sliders"),
bind: "volume-mixer-show-icon",
sensitiveBind: "volume-mixer-enabled",
}),
AdjustmentRow({
settings,
title: _("Fade out offset"),
subtitle: _("Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46"),
max: 2048,
bind: "volume-mixer-fade-offset",
sensitiveBind: "volume-mixer-enabled",
}),
SwitchRow({
settings,
bind: "volume-mixer-menu-enabled",
title: _("Attach to output slider"),
subtitle: _("Attach volume mixer menu button to output slider. Use if you prefer compact layout"),
sensitiveBind: "volume-mixer-enabled",
onDetailed: ()=>{Dialog({
window,
title: _("Volume mixer Widget"),
childrenRequest: ()=>[Group({
title: _("Attach to output slider"),
description: _("Attach volume mixer menu button to output slider. Use if you prefer compact layout"),
header_suffix: SwitchRow({
settings,
bind: "volume-mixer-menu-enabled",
}),
},[
EntryRow({
settings,
bind: "volume-mixer-menu-icon",
title: _("Menu icon"),
sensitiveBind: "volume-mixer-menu-enabled",
})
])],
})}
}),
])
}
})
================================================
FILE: src/prefs.ts
================================================
import Gtk from "gi://Gtk"
import Gdk from "gi://Gdk"
import Gio from "gi://Gio"
import Adw from "gi://Adw"
import { ExtensionPreferences } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"
import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js"
import { WidgetsPage } from "./prefPages/widgets.js"
import { TogglesPage } from "./prefPages/toggles.js"
import { LayoutPage } from "./prefPages/layout.js"
import { AboutPage } from "./prefPages/about.js"
import { MenuPage } from "./prefPages/menu.js"
import { ContributorsRow, LicenseRow } from "./libs/prefs/components.js"
import Config from "./config.js"
var pageList = [
WidgetsPage,
TogglesPage,
LayoutPage,
MenuPage,
AboutPage,
]
export default class QstExtensionPreferences extends ExtensionPreferences {
appendIconPath(path: string) {
const iconTheme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default())
if (!iconTheme.get_search_path().includes(path))
iconTheme.add_search_path(path)
}
readExtensionFile(path: string) {
const decoder = new TextDecoder()
const file = Gio.File.new_for_path(`${this.path}/${path}`)
const content = file.load_contents(null)[1]
return decoder.decode(content)
}
getContributorRows(): ContributorsRow.Contributor[][] {
const contributors = JSON.parse(
this.readExtensionFile("media/contributors/data.json")
) as ContributorsRow.Contributor[]
if (!contributors.length) return []
const rows: ContributorsRow.Contributor[][] = [[]]
contributors.reduce((currentRow: ContributorsRow.Contributor[], obj: ContributorsRow.Contributor)=>{
if (currentRow.length >= 4) rows.push(currentRow = [])
currentRow.push(obj)
return currentRow
}, rows[0])
return rows
}
getLicenses(): LicenseRow.License[] {
const licenses = JSON.parse(
this.readExtensionFile("media/licenses.json")
) as LicenseRow.License[]
for (const item of licenses) {
if (item.file) {
item.content = async () => this.readExtensionFile(item.file)
}
}
return licenses
}
getVersionString(): string {
let version = Config.version.toUpperCase().replace(/-.*?$/, "")
if (this.metadata.version) {
version += "." + this.metadata.version
}
version += " — "
if (Config.isReleaseBuild) {
version += _("Stable")
} else if (Config.isDevelopmentBuild) {
version += _("Development")
} else {
version += _("Preview")
}
if (Config.isGithubBuild) {
version += " " + _("(Github Release)")
} else if (!this.metadata.version) {
version += " " + _("(Built from source)")
}
return version
}
getChangelog(): string {
return this.readExtensionFile("media/Changelog.md")
}
async fillPreferencesWindow(window: Adw.PreferencesWindow) {
let settings = this.getSettings()
// Window options
window.set_search_enabled(true)
window.set_default_size(690, 680)
// Register icon path
this.appendIconPath(this.path + "/media")
this.appendIconPath(this.path + "/media/contributors")
for (const page of pageList) {
window.add(new page(settings, this, window))
}
}
}
================================================
FILE: src/styles/date-menu.scss
================================================
@use "../global.scss" as *;
.datemenu-popover {
{$p}-hide-left-box {
.datemenu-calendar-column {
margin: 0px;
}
}
{$p}-hide-right-box {
.message-list {
margin: 0px;
border: none;
min-height: 340px;
}
}
}
================================================
FILE: src/styles/debug.scss
================================================
@use "../global.scss" as *;
#{$p}-debug-show-layout * {
outline: 1px solid red;
}
================================================
FILE: src/styles/media-widget.scss
================================================
@use "../global.scss" as *;
#{$p}-media {
padding: 0px;
margin: 0px 0px 0px 0px;
// Message Card
.message {
margin: 0px;
}
// Message Content (Texts)
.message-content {
width: 0px; // Min size, texts will be expended
text-overflow: ellipsis;
}
// Header
#{$p}-header {
margin-bottom: 6px;
// Header Label
#{$p}-header-label {
font-weight: bold;
font-size: 0.98em;
margin-left: 4px;
}
.page-indicators {
margin-right: 4px;
spacing: 6px;
.page-indicator {
height: 8px;
width: 8px;
padding: 0px;
}
}
}
// Progress Control (Position/Length Text and Slider)
#{$p}-progress-control {
spacing: 8px;
padding: 0px 6px;
#{$p}-position-label, #{$p}-length-label {
font-size: 0.92em;
}
}
.message-list-section-list {
margin: 0px;
padding: 0px;
spacing: 0px;
}
}
================================================
FILE: src/styles/message-compact.scss
================================================
@use "../global.scss" as *;
#{$p}-message-compact {
// Message Card
.message {
margin-bottom: 8px;
padding: 5px 6px;
&.media-message {
padding: 3px 6px 8px 6px !important; // idk required for some reason
.message-media-control {
/* control button sizing */
padding-left: 5px;
padding-right: 5px;
}
}
// Message Content Box (Outside)
.message-box {
padding-top: 1px; // Header & Content spacing
// Message Content (Texts)
.message-content {
spacing: 3px; // Title & Content spacing
font-size: 0.89em;
}
}
// Message Header (App, Button)
.message-header {
spacing: 3px; // close / expand button spacing
// Buttons
.message-expand-button,
.message-close-button {
padding: 2px !important;
}
// Title
.message-header-content {
padding-left: 6px;
}
}
// Action buttons
.notification-button {
font-size: 0.9em;
padding: 5px;
margin-top: 0px;
}
}
}
================================================
FILE: src/styles/message-remove-shadow.scss
================================================
@use "../global.scss" as *;
#{$p}-message-remove-shadow .message {
box-shadow: none !important;
}
================================================
FILE: src/styles/notification-widget.scss
================================================
@use "../global.scss" as *;
#{$p}-notifications {
padding: 0px;
margin: 0px 0px 0px 0px;
// Message Card
.message {
// Message Content (Texts)
.message-content {
width: 0px; // Min size, texts will be expended
text-overflow: ellipsis;
}
// Message header
.message-header {
margin: 0px;
padding: 0px 4px 2px 6px;
spacing: 4px;
}
}
// Avoid Scrollbar
.message-view {
margin: 0px;
}
#{$p}-has-scrollbar {
.message-view {
padding: 0px 5px 0px 0px;
}
}
// Header
#{$p}-header {
margin-bottom: 6px;
// Header Label
#{$p}-header-label {
font-weight: bold;
font-size: 0.98em;
margin-left: 4px;
}
// Clear button
#{$p}-clear-button {
font-weight: bold;
font-size: 0.98em;
padding: 1px 4px;
border-radius: 8px;
margin-right: 4px;
&:hover {
background-color: rgba(127, 127, 127, .2);
}
#{$p}-icon {
margin-right: 4px;
}
}
}
{$p}-use-native-controls #{$p}-header {
margin-bottom: 8px;
}
// No notification placeholder
#{$p}-placeholder {
font-weight: bold;
margin: 10px 0px;
#{$p}-icon {
margin-bottom: 12px;
}
}
// Native controls
#{$p}-native-controls {
margin-top: 5px;
padding: 0px 4px;
#{$p}-native-dnd-switch {
margin: 0px 0px 0px 6px;
height: 24px; // 26px;
width: 40px;
.handle {
margin: 2px;
width: 20px;
height: 20px;
}
}
#{$p}-native-dnd-text {
font-size: 0.92em;
margin-right: 4px;
margin-bottom: 0px;
}
#{$p}-native-clear-button {
font-size: 0.92em;
padding: 4px 8px;
}
#{$p}-native-control-box {
padding: 8px 4px 0px 4px;
}
}
}
================================================
FILE: src/styles/system-indicator.scss
================================================
@use "../global.scss" as *;
#panel {
#{$p}-privacy-indicator-use-accent .privacy-indicator {
color: -st-accent-color;
}#{$p}-privacy-indicator-use-monochrome .privacy-indicator {
color: -st-accent-fg-color;
}
#{$p}-screen-sharing-indicator-use-accent,
#{$p}-screen-recording-indicator-use-accent {
box-shadow: inset 0 0 0 100px -st-accent-color;
&:hover, &:focus {
box-shadow: inset 0 0 0 100px st-mix(-st-accent-color, -st-accent-fg-color, 75%);
}
&:active {
box-shadow: inset 0 0 0 100px st-mix(-st-accent-color, -st-accent-fg-color, 60%);
}
}
}
================================================
FILE: src/styles/volume-mixer-widget.scss
================================================
@use "../global.scss" as *;
/* volume mixer label */
#{$p}-volume-mixer {
#{$p}-item {
#{$p}-label {
padding-left: 6px;
font-size: 0.92em;
text-overflow: ellipsis;
width: 0px;
}
spacing: 4px;
}
spacing: 6px;
#{$p}-has-scrollbar {
padding: 0px 5px 0px 0px;
}
}
.quick-toggle-menu-container {
#{$p}-volume-mixer {
#{$p}-item {
#{$p}-label {
font-size: 1.02em;
}
}
}
}
================================================
FILE: src/styles/weather-widget.scss
================================================
@use "../global.scss" as *;
#{$p}-weather {
{$p}-weather-remove-shadow {
.weather-button {
box-shadow: none !important;
}
}
{$p}-weather-compact {
.weather-button {
padding: 8px 0px 10px 0px;
.weather-forecast-time {
padding-top: 4px;
padding-bottom: 2px;
}
.weather-forecast-icon {
margin-bottom: 2px;
}
}
}
.weather-button {
margin: 0px;
#{$p}-status-label {
margin: 2px 10px 2px 10px;
}
}
// Header
#{$p}-header {
margin-bottom: 6px;
// Header Label
#{$p}-header-label {
font-weight: bold;
font-size: 0.98em;
margin-left: 4px;
}
// Location Label
#{$p}-location-label {
font-weight: bold;
font-size: 0.98em;
margin-right: 6px;
margin-top: 2px;
}
}
}
================================================
FILE: src/stylesheet.scss
================================================
@use "./global.scss" as *;
@use "./styles/notification-widget.scss";
@use "./styles/media-widget.scss";
@use "./styles/weather-widget.scss";
@use "./styles/message-compact.scss";
@use "./styles/message-remove-shadow.scss";
@use "./styles/volume-mixer-widget.scss";
@use "./styles/date-menu.scss";
@use "./styles/system-indicator.scss";
@use "./styles/debug.scss";
/* input output labels */
#{$p}-input-output-label {
width: auto;
}
================================================
FILE: src/types.d.ts
================================================
import "@girs/gnome-shell/ambient"
import "@girs/gnome-shell/extensions/global"
import "@girs/gjs/dom"
import "@girs/gjs"
import "./ambient"
// Shell environment
// import Clutter from "@girs/clutter-15/clutter-15"
// import GObject from "gi://GObject"
// import Atk from "gi://Atk"
declare module "@girs/clutter-15/clutter-15" {
namespace Clutter {
interface Actor {
ease(params: EasingParamsWithProps): void
ease_property(propName: string, target: any, params: EasingParams)
}
}
}
declare module "@girs/gobject-2.0/gobject-2.0" {
import SignalTracker from "resource:///org/gnome/shell/misc/signals.js"
namespace GObject {
interface Object {
connectObject: SignalTracker.EventEmitter["connectObject"]
connect_object: SignalTracker.EventEmitter["connectObject"]
disconnectObject: SignalTracker.EventEmitter["disconnectObject"]
disconnect_object: SignalTracker.EventEmitter["disconnectObject"]
}
}
}
================================================
FILE: tsconfig.json
================================================
{
"compilerOptions": {
"moduleResolution": "Bundler",
"outDir": "target/tsc",
"target": "ESNext",
"module": "ESNext",
"removeComments": false,
"skipLibCheck": true,
"lib": ["ESNext"],
"allowArbitraryExtensions": true,
"incremental": true,
"tsBuildInfoFile": "target/.tsbuildinfo",
"useDefineForClassFields": false
},
"include": ["./src/**/*.ts", "src/types.d.ts", "src/contributors.js"]
}