Fork of pop-os/cosmic-comp @ upstream

This commit is contained in:
d
2026-08-09 22:37:21 +07:00
commit 6ce5e75b0b
273 changed files with 79114 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
- [ ] I have disclosed use of any AI generated code in my commit messages.
- If you are using an LLM, and do not fully understand the changes it is making to the code base, do not create a PR.
- In our experience, AI generated code often results in overly complex code that lacks enough context for a proper fix or feature inclusion. This results in considerably longer code reviews. Due to this, AI authored or partially authored PRs may be closed without comment.
- [ ] I understand these changes in full and will be able to respond to review comments.
- [ ] My change is accurately described in the commit message.
- [ ] My contribution is tested and working as described.
- [ ] I have read the [Developer Certificate of Origin](https://developercertificate.org/) and certify my contribution under its conditions.
+104
View File
@@ -0,0 +1,104 @@
name: Continuous Integration
on:
push:
branches: [master]
pull_request:
branches: [master]
jobs:
format:
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v6
- name: Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- name: Cargo cache
uses: actions/cache@v5
with:
path: |
~/.cargo/registry
~/.cargo/git
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}
- name: Format
run: cargo +stable fmt --all -- --check
clippy-check:
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v6
- name: Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- name: Cargo cache
uses: actions/cache@v5
with:
path: |
~/.cargo/registry
~/.cargo/git
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}
- name: System dependencies
run: sudo apt-get update; sudo apt-get install libudev-dev libgbm-dev libxkbcommon-dev libegl1-mesa-dev libwayland-dev libinput-dev libdbus-1-dev libsystemd-dev libseat-dev libdisplay-info-dev
- name: Clippy
run: cargo +stable clippy --all-features -- -D warnings
check-features:
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v6
- name: Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cargo cache
uses: actions/cache@v5
with:
path: |
~/.cargo/registry
~/.cargo/git
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}
- name: System dependencies
run: sudo apt-get update; sudo apt-get install libudev-dev libgbm-dev libxkbcommon-dev libegl1-mesa-dev libwayland-dev libinput-dev libdbus-1-dev libsystemd-dev libseat-dev libdisplay-info-dev
- run: cargo +stable check --no-default-features
- run: cargo +stable check --features debug
- run: cargo +stable check --features profile-with-tracy
- run: cargo +stable check --features profile-with-tracy-gpu
test:
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v6
- name: Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cargo cache
uses: actions/cache@v5
with:
path: |
~/.cargo/registry
~/.cargo/git
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}
- name: System dependencies
run: sudo apt-get update; sudo apt-get install libudev-dev libgbm-dev libxkbcommon-dev libegl1-mesa-dev libwayland-dev libinput-dev libdbus-1-dev libsystemd-dev libdisplay-info-dev libpixman-1-dev meson ninja-build
- name: Build cache
uses: actions/cache@v5
with:
path: target
key: ${{ runner.os }}-build-${{ hashFiles('**/Cargo.toml') }}
- name: Build and install Libseat
run: |
wget https://git.sr.ht/~kennylevinsen/seatd/archive/0.9.1.tar.gz -O libseat-source.tar.gz
tar xf libseat-source.tar.gz
cd seatd-0.9.1
meson setup -Dlibseat-builtin=enabled -Dserver=disabled -Dexamples=disabled -Dman-pages=disabled build .
ninja -C build
sudo meson install -C build
sudo ldconfig
- name: Test features
env:
RUST_BACKTRACE: full
run: cargo test --all-features
+16
View File
@@ -0,0 +1,16 @@
debian/*
!debian/cfs-tweak.service
!debian/changelog
!debian/control
!debian/copyright
!debian/cosmic-comp.install
!debian/postinst
!debian/rules
!debian/source
.cargo
target
vendor
vendor.tar
.vscode
*.log
/result
Generated
+7219
View File
File diff suppressed because it is too large Load Diff
+147
View File
@@ -0,0 +1,147 @@
[package]
authors = ["Victoria Brekenfeld"]
edition = "2024"
license = "GPL-3.0-only"
name = "cosmic-comp"
version = "1.0.0"
rust-version = "1.93"
[workspace]
members = ["cosmic-comp-config"]
[dependencies]
anyhow = { version = "1.0.102", features = ["backtrace"] }
bitflags = "2.11.0"
calloop = { version = "0.14.4", features = ["executor", "stream"] }
cosmic-comp-config = { path = "cosmic-comp-config", features = [
"libdisplay-info",
"output",
] }
cosmic-config = { git = "https://github.com/pop-os/libcosmic", features = [
"calloop",
"macro",
] }
cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols", rev = "160b086", default-features = false, features = [
"server",
] }
cosmic-settings-config = { git = "https://github.com/pop-os/cosmic-settings-daemon" }
cosmic-settings-daemon-config = { git = "https://github.com/pop-os/cosmic-settings-daemon", features = [
"greeter",
] }
cosmic-text = { version = "0.19", features = [
"shape-run-cache",
] }
libdisplay-info = "0.3.0"
egui = { version = "0.31.1", optional = true }
egui_plot = { version = "0.31.0", optional = true }
i18n-embed = { version = "0.16", features = [
"fluent-system",
"desktop-requester",
] }
i18n-embed-fl = "0.10"
iced_tiny_skia = { git = "https://github.com/pop-os/libcosmic" }
iced_graphics = { git = "https://github.com/pop-os/libcosmic/", features = ["geometry"] }
indexmap = "2.13"
keyframe = "1.1.1"
libcosmic = { git = "https://github.com/pop-os/libcosmic", default-features = false }
libsystemd = { version = "0.7", optional = true }
log-panics = { version = "2", features = ["with-backtrace"] }
ordered-float = "5.1"
png = "0.18"
regex = "1"
ron = "0.12"
rust-embed = { version = "8.11", features = ["debug-embed"] }
sanitize-filename = "0.6.0"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
thiserror = "2.0.18"
jiff = "0.2"
tiny-skia = "0.11"
tracing = { version = "0.1.44", features = [
"max_level_debug",
"release_max_level_info",
] }
tracing-journald = "0.3.2"
tracing-subscriber = { version = "0.3.22", features = [
"env-filter",
"tracing-log",
] }
tracy-client = { version = "0.18.4", default-features = false }
wayland-backend = "0.3.12"
wayland-scanner = "0.31.8"
xcursor = "0.3.10"
xdg = "^3.0"
xdg-user = "0.2.1"
xkbcommon = "0.9"
zbus = "5.14.0"
profiling = { version = "1.0" }
rustix = { version = "1.1.4", features = ["process"] }
rand = "0.10"
# CLI arguments
clap_lex = "1.0"
parking_lot = "0.12.5"
logind-zbus = { version = "5.3.2", optional = true }
futures-executor = { version = "0.3.32" }
futures-util = "0.3.32"
glam = { version = "0.33", default-features = false, features = ["std"] }
smallvec = "1.15.2"
[dependencies.id_tree]
branch = "feature/copy_clone"
git = "https://github.com/Drakulix/id-tree.git"
[dependencies.smithay]
version = "0.7.0"
default-features = false
features = [
"backend_drm",
"backend_gbm",
"backend_egl",
"backend_libinput",
"backend_session_libseat",
"backend_udev",
"backend_winit",
"backend_vulkan",
"backend_x11",
"desktop",
"renderer_glow",
"renderer_multi",
"renderer_pixman",
"wayland_frontend",
"xwayland",
]
[dependencies.smithay-egui]
version = "0.2.0"
features = ["svg"]
optional = true
[features]
debug = ["egui", "egui_plot", "smithay-egui", "anyhow/backtrace"]
default = ["systemd"]
logind = ["logind-zbus"]
systemd = ["libsystemd", "logind"]
profile-with-tracy = ["profiling/profile-with-tracy", "tracy-client/default"]
profile-with-tracy-gpu = ["profile-with-tracy", "smithay/tracy_gpu_profiling"]
[profile.dev.package.tiny-skia]
opt-level = 2
[profile.dev.package.rustybuzz]
opt-level = 2
[profile.dev.package.ttf-parser]
opt-level = 2
[profile.fastdebug]
debug = true
inherits = "release"
[profile.release]
lto = "fat"
[patch."https://github.com/pop-os/cosmic-protocols"]
cosmic-protocols = { git = "https://github.com/pop-os//cosmic-protocols", branch = "main" }
[patch.crates-io]
smithay = { git = "https://github.com/smithay/smithay.git", rev = "1ed69cb" }
+674
View File
@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
+67
View File
@@ -0,0 +1,67 @@
export prefix ?= /usr
sysconfdir ?= /etc
bindir = $(prefix)/bin
libdir = $(prefix)/lib
sharedir = $(prefix)/share
BINARY = cosmic-comp
CARGO_TARGET_DIR ?= target
TARGET = debug
DEBUG ?= 0
.PHONY = all clean install uninstall vendor
ifeq ($(DEBUG),0)
TARGET = release
ARGS += --release
endif
VENDOR ?= 0
ifneq ($(VENDOR),0)
ARGS += --offline --locked
endif
TARGET_BIN="$(DESTDIR)$(bindir)/$(BINARY)"
KEYBINDINGS_CONF="$(DESTDIR)$(sharedir)/cosmic/com.system76.CosmicSettings.Shortcuts/v1/defaults"
TILING_EXCEPTIONS_CONF="$(DESTDIR)$(sharedir)/cosmic/com.system76.CosmicSettings.WindowRules/v1/tiling_exception_defaults"
all: extract-vendor
cargo build $(ARGS)
clean:
cargo clean
distclean:
rm -rf .cargo vendor vendor.tar target
vendor:
mkdir -p .cargo
cargo vendor | head -n -1 > .cargo/config
echo 'directory = "vendor"' >> .cargo/config
[ -n "$(SOURCE_GIT_HASH)" ] && printf '\n[env]\nGIT_HASH = "%s"\n' "$(SOURCE_GIT_HASH)" >> .cargo/config || true
tar pcf vendor.tar vendor
rm -rf vendor
extract-vendor:
ifeq ($(VENDOR),1)
rm -rf vendor; tar pxf vendor.tar
endif
install:
install -Dm0755 "$(CARGO_TARGET_DIR)/$(TARGET)/$(BINARY)" "$(TARGET_BIN)"
install -Dm0644 "data/keybindings.ron" "$(KEYBINDINGS_CONF)"
install -Dm0644 "data/tiling-exceptions.ron" "$(TILING_EXCEPTIONS_CONF)"
install-bare-session: install
install -Dm0644 "data/cosmic.desktop" "$(DESTDIR)$(sharedir)/wayland-sessions/cosmic.desktop"
install -Dm0644 "data/cosmic-session.target" "$(DESTDIR)$(libdir)/systemd/user/cosmic-session.target"
install -Dm0644 "data/cosmic-session-pre.target" "$(DESTDIR)$(libdir)/systemd/user/cosmic-session-pre.target"
install -Dm0644 "data/cosmic-comp.service" "$(DESTDIR)$(libdir)/systemd/user/cosmic-comp.service"
install -Dm0755 "data/cosmic-service" "$(DESTDIR)/$(bindir)/cosmic-service"
uninstall:
rm "$(TARGET_BIN)" "$(KEYBINDINGS_CONF)"
uninstall-bare-session:
rm "$(DESTDIR)$(sharedir)/wayland-sessions/cosmic.desktop"
+9
View File
@@ -0,0 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-only
use std::process::Command;
fn main() {
if let Ok(output) = Command::new("git").args(["rev-parse", "HEAD"]).output() {
let git_hash = String::from_utf8(output.stdout).unwrap();
println!("cargo:rustc-env=GIT_HASH={}", git_hash);
}
}
+21
View File
@@ -0,0 +1,21 @@
[package]
name = "cosmic-comp-config"
version = "1.0.0"
edition = "2024"
[dependencies]
cosmic-config = { git = "https://github.com/pop-os/libcosmic/" }
cosmic-randr-shell = { git = "https://github.com/pop-os/cosmic-randr/", optional = true }
input = "0.10.0"
libdisplay-info = { version = "0.3.0", optional = true }
serde = { version = "1", features = ["derive"] }
ron = { version = "0.12", optional = true }
tracing = { version = "0.1.44", features = [
"max_level_debug",
"release_max_level_info",
], optional = true }
[features]
default = []
output = ["ron", "tracing"]
randr = ["cosmic-randr-shell", "output"]
+216
View File
@@ -0,0 +1,216 @@
// SPDX-License-Identifier: GPL-3.0-only
#![allow(non_snake_case)]
pub use input::{AccelProfile, ClickMethod, ScrollMethod, TapButtonMap};
use serde::{Deserialize, Serialize};
// Note: For the following values, None is used to represent the system default
// Configuration for input devices
#[derive(Clone, Debug, Default, PartialEq, Deserialize, Serialize)]
pub struct InputConfig {
pub state: DeviceState,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub acceleration: Option<AccelConfig>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub calibration: Option<[f32; 6]>,
#[serde(with = "ClickMethodDef")]
#[serde(skip_serializing_if = "Option::is_none", default)]
pub click_method: Option<ClickMethod>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub disable_while_typing: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub left_handed: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub middle_button_emulation: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub rotation_angle: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub scroll_config: Option<ScrollConfig>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub tap_config: Option<TapConfig>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub map_to_output: Option<String>,
}
#[derive(Clone, Debug, Default, PartialEq, Deserialize, Serialize)]
pub struct AccelConfig {
#[serde(with = "AccelProfileDef")]
pub profile: Option<AccelProfile>,
pub speed: f64,
}
#[derive(Clone, Debug, Default, PartialEq, Deserialize, Serialize)]
pub struct ScrollConfig {
#[serde(with = "ScrollMethodDef")]
pub method: Option<ScrollMethod>,
pub natural_scroll: Option<bool>,
pub scroll_button: Option<u32>,
pub scroll_factor: Option<f64>,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub enum DeviceState {
#[default]
Enabled,
Disabled,
DisabledOnExternalMouse,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone, Copy, PartialEq, Eq, Hash)]
pub enum TouchpadOverride {
#[default]
None,
ForceDisable,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct TapConfig {
pub enabled: bool,
#[serde(with = "TapButtonMapDef")]
pub button_map: Option<TapButtonMap>,
pub drag: bool,
pub drag_lock: bool,
}
mod ClickMethodDef {
use input::ClickMethod as ClickMethodOrig;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Debug, Serialize, Deserialize)]
pub enum ClickMethod {
ButtonAreas,
Clickfinger,
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<ClickMethodOrig>, D::Error>
where
D: Deserializer<'de>,
{
let o = Option::deserialize(deserializer)?;
Ok(o.map(|x| match x {
ClickMethod::ButtonAreas => ClickMethodOrig::ButtonAreas,
ClickMethod::Clickfinger => ClickMethodOrig::Clickfinger,
}))
}
pub fn serialize<S>(arg: &Option<ClickMethodOrig>, ser: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let arg = match arg {
Some(ClickMethodOrig::ButtonAreas) => Some(ClickMethod::ButtonAreas),
Some(ClickMethodOrig::Clickfinger) => Some(ClickMethod::Clickfinger),
Some(_) | None => None,
};
Option::serialize(&arg, ser)
}
}
mod AccelProfileDef {
use input::AccelProfile as AccelProfileOrig;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Debug, Serialize, Deserialize)]
enum AccelProfile {
Flat,
Adaptive,
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<AccelProfileOrig>, D::Error>
where
D: Deserializer<'de>,
{
let o = Option::deserialize(deserializer)?;
Ok(o.map(|x| match x {
AccelProfile::Flat => AccelProfileOrig::Flat,
AccelProfile::Adaptive => AccelProfileOrig::Adaptive,
}))
}
pub fn serialize<S>(arg: &Option<AccelProfileOrig>, ser: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let arg = match arg {
Some(AccelProfileOrig::Flat) => Some(AccelProfile::Flat),
Some(AccelProfileOrig::Adaptive) => Some(AccelProfile::Adaptive),
Some(_) | None => None,
};
Option::serialize(&arg, ser)
}
}
mod ScrollMethodDef {
use input::ScrollMethod as ScrollMethodOrig;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Debug, Serialize, Deserialize)]
pub enum ScrollMethod {
NoScroll,
TwoFinger,
Edge,
OnButtonDown,
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<ScrollMethodOrig>, D::Error>
where
D: Deserializer<'de>,
{
let o = Option::deserialize(deserializer)?;
Ok(o.map(|x| match x {
ScrollMethod::NoScroll => ScrollMethodOrig::NoScroll,
ScrollMethod::TwoFinger => ScrollMethodOrig::TwoFinger,
ScrollMethod::Edge => ScrollMethodOrig::Edge,
ScrollMethod::OnButtonDown => ScrollMethodOrig::OnButtonDown,
}))
}
pub fn serialize<S>(arg: &Option<ScrollMethodOrig>, ser: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let arg = match arg {
Some(ScrollMethodOrig::NoScroll) => Some(ScrollMethod::NoScroll),
Some(ScrollMethodOrig::TwoFinger) => Some(ScrollMethod::TwoFinger),
Some(ScrollMethodOrig::Edge) => Some(ScrollMethod::Edge),
Some(ScrollMethodOrig::OnButtonDown) => Some(ScrollMethod::OnButtonDown),
Some(_) | None => None,
};
Option::serialize(&arg, ser)
}
}
mod TapButtonMapDef {
use input::TapButtonMap as TapButtonMapOrig;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Debug, Serialize, Deserialize)]
pub enum TapButtonMap {
LeftRightMiddle,
LeftMiddleRight,
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<TapButtonMapOrig>, D::Error>
where
D: Deserializer<'de>,
{
let o = Option::deserialize(deserializer)?;
Ok(o.map(|x| match x {
TapButtonMap::LeftRightMiddle => TapButtonMapOrig::LeftRightMiddle,
TapButtonMap::LeftMiddleRight => TapButtonMapOrig::LeftMiddleRight,
}))
}
pub fn serialize<S>(arg: &Option<TapButtonMapOrig>, ser: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let arg = match arg {
Some(TapButtonMapOrig::LeftRightMiddle) => Some(TapButtonMap::LeftRightMiddle),
Some(TapButtonMapOrig::LeftMiddleRight) => Some(TapButtonMap::LeftMiddleRight),
Some(_) | None => None,
};
Option::serialize(&arg, ser)
}
}
+249
View File
@@ -0,0 +1,249 @@
// SPDX-License-Identifier: GPL-3.0-only
use cosmic_config::{CosmicConfigEntry, cosmic_config_derive::CosmicConfigEntry};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use crate::input::TouchpadOverride;
pub mod input;
#[cfg(feature = "output")]
pub mod output;
pub mod workspace;
#[derive(Debug, Deserialize, Serialize, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct EdidProduct {
pub manufacturer: [char; 3],
pub product: u16,
pub serial: Option<u32>,
pub manufacture_week: i32,
pub manufacture_year: i32,
pub model_year: Option<i32>,
}
#[cfg(feature = "libdisplay-info")]
impl From<libdisplay_info::edid::VendorProduct> for EdidProduct {
fn from(vp: libdisplay_info::edid::VendorProduct) -> Self {
Self {
manufacturer: vp.manufacturer,
product: vp.product,
serial: vp.serial,
manufacture_week: vp.manufacture_week,
manufacture_year: vp.manufacture_year,
model_year: vp.model_year,
}
}
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct KeyboardConfig {
/// Boot state for numlock
pub numlock_state: NumlockState,
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum NumlockState {
BootOn,
#[default]
BootOff,
LastBoot,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct AppearanceConfig {
pub clip_floating_windows: bool,
pub clip_tiled_windows: bool,
pub shadow_tiled_windows: bool,
}
impl Default for AppearanceConfig {
fn default() -> Self {
AppearanceConfig {
clip_floating_windows: true,
clip_tiled_windows: true,
shadow_tiled_windows: false,
}
}
}
#[derive(Clone, Debug, PartialEq, CosmicConfigEntry)]
#[version = 1]
pub struct CosmicCompConfig {
pub workspaces: workspace::WorkspaceConfig,
pub pinned_workspaces: Vec<workspace::PinnedWorkspace>,
pub input_default: input::InputConfig,
pub input_touchpad: input::InputConfig,
pub input_touchpad_override: TouchpadOverride,
pub input_devices: HashMap<String, input::InputConfig>,
pub xkb_config: XkbConfig,
pub keyboard_config: KeyboardConfig,
/// Autotiling enabled
pub autotile: bool,
/// Determines the behavior of the autotile variable
/// If set to Global, autotile applies to all windows in all workspaces
/// If set to PerWorkspace, autotile only applies to new windows, and new workspaces
pub autotile_behavior: TileBehavior,
/// Active hint enabled
pub active_hint: bool,
/// Enables changing keyboard focus to windows when the cursor passes into them
pub focus_follows_cursor: bool,
/// Enables warping the cursor to the focused window when focus changes due to keyboard input
pub cursor_follows_focus: bool,
/// The delay in milliseconds before focus follows mouse (if enabled)
pub focus_follows_cursor_delay: u64,
/// Let X11 applications scale themselves
pub descale_xwayland: XwaylandDescaling,
/// Let X11 applications snoop on certain key-presses to allow for global shortcuts
pub xwayland_eavesdropping: XwaylandEavesdropping,
/// The threshold before windows snap themselves to output edges
pub edge_snap_threshold: u32,
pub accessibility_zoom: ZoomConfig,
pub appearance_settings: AppearanceConfig,
/// Hide the cursor after this many seconds of pointer inactivity (None disables)
pub cursor_hide_timeout: Option<u32>,
pub activation_policy: ActivationPolicy,
}
impl Default for CosmicCompConfig {
fn default() -> Self {
Self {
workspaces: Default::default(),
pinned_workspaces: Vec::new(),
input_default: Default::default(),
// By default, enable tap-to-click and disable-while-typing.
input_touchpad: input::InputConfig {
state: input::DeviceState::Enabled,
click_method: Some(input::ClickMethod::Clickfinger),
disable_while_typing: Some(true),
tap_config: Some(input::TapConfig {
enabled: true,
button_map: Some(input::TapButtonMap::LeftRightMiddle),
drag: true,
drag_lock: false,
}),
..Default::default()
},
input_touchpad_override: Default::default(),
input_devices: Default::default(),
xkb_config: Default::default(),
keyboard_config: Default::default(),
autotile: Default::default(),
autotile_behavior: Default::default(),
active_hint: true,
focus_follows_cursor: false,
cursor_follows_focus: false,
focus_follows_cursor_delay: 250,
descale_xwayland: XwaylandDescaling::Fractional,
xwayland_eavesdropping: XwaylandEavesdropping::default(),
edge_snap_threshold: 0,
accessibility_zoom: ZoomConfig::default(),
appearance_settings: AppearanceConfig::default(),
cursor_hide_timeout: None,
activation_policy: ActivationPolicy::default(),
}
}
}
#[derive(Debug, Default, Copy, Clone, PartialEq, Deserialize, Serialize)]
pub enum TileBehavior {
#[default]
Global,
PerWorkspace,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct XkbConfig {
pub rules: String,
pub model: String,
pub layout: String,
pub variant: String,
pub options: Option<String>,
#[serde(default = "default_repeat_delay")]
pub repeat_delay: u32,
#[serde(default = "default_repeat_rate")]
pub repeat_rate: u32,
}
impl Default for XkbConfig {
fn default() -> XkbConfig {
XkbConfig {
rules: String::new(),
model: String::new(),
layout: String::new(),
variant: String::new(),
options: None,
repeat_delay: default_repeat_delay(),
repeat_rate: default_repeat_rate(),
}
}
}
fn default_repeat_rate() -> u32 {
25
}
fn default_repeat_delay() -> u32 {
600
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
pub struct ZoomConfig {
pub start_on_login: bool,
pub show_overlay: bool,
pub increment: u32,
pub view_moves: ZoomMovement,
pub enable_mouse_zoom_shortcuts: bool,
}
impl Default for ZoomConfig {
fn default() -> Self {
ZoomConfig {
start_on_login: false,
show_overlay: true,
increment: 50,
view_moves: ZoomMovement::Continuously,
enable_mouse_zoom_shortcuts: true,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
pub enum ZoomMovement {
OnEdge,
Centered,
Continuously,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
pub struct XwaylandEavesdropping {
pub keyboard: EavesdroppingKeyboardMode,
pub pointer: bool,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
pub enum EavesdroppingKeyboardMode {
#[default]
None,
Modifiers,
Combinations,
All,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, Default, PartialEq, Eq)]
pub enum ActivationPolicy {
#[default]
Focus,
FocusIfActiveWorkspace,
Urgent,
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, Default, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum XwaylandDescaling {
#[serde(rename = "true")]
Enabled,
#[serde(rename = "false")]
Disabled,
#[default]
Fractional,
}
+137
View File
@@ -0,0 +1,137 @@
// SPDX-License-Identifier: GPL-3.0-only
use serde::{Deserialize, Serialize};
use std::{collections::HashMap, fs::OpenOptions, path::Path};
use tracing::{error, warn};
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum OutputState {
#[serde(rename = "true")]
Enabled,
#[serde(rename = "false")]
Disabled,
Mirroring(String),
}
fn default_state() -> OutputState {
OutputState::Enabled
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum AdaptiveSync {
#[serde(rename = "true")]
Enabled,
#[serde(rename = "false")]
Disabled,
Force,
}
fn default_sync() -> AdaptiveSync {
AdaptiveSync::Enabled
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct OutputsConfig {
pub config: HashMap<Vec<OutputInfo>, Vec<OutputConfig>>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct OutputConfig {
pub mode: ((i32, i32), Option<u32>),
#[serde(default = "default_sync")]
pub vrr: AdaptiveSync,
pub scale: f64,
pub transform: TransformDef,
pub position: (u32, u32),
#[serde(default = "default_state")]
pub enabled: OutputState,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_bpc: Option<u32>,
#[serde(default)]
pub xwayland_primary: bool,
}
impl Default for OutputConfig {
fn default() -> OutputConfig {
OutputConfig {
mode: ((0, 0), None),
vrr: AdaptiveSync::Enabled,
scale: 1.0,
transform: TransformDef::Normal,
position: (0, 0),
enabled: OutputState::Enabled,
max_bpc: None,
xwayland_primary: false,
}
}
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct OutputInfo {
pub connector: String,
pub make: String,
pub model: String,
}
pub fn load_outputs(path: Option<impl AsRef<Path>>) -> OutputsConfig {
if let Some(path) = path.as_ref() {
let path: &Path = path.as_ref();
if path.exists() {
match ron::de::from_reader::<_, OutputsConfig>(
OpenOptions::new().read(true).open(path).unwrap(),
) {
Ok(mut config) => {
for (info, config) in config.config.iter_mut() {
let config_clone = config.clone();
for conf in config.iter_mut() {
if let OutputState::Mirroring(conn) = &conf.enabled {
if let Some((j, _)) = info
.iter()
.enumerate()
.find(|(_, info)| &info.connector == conn)
{
if config_clone[j].enabled != OutputState::Enabled {
warn!(
"Invalid Mirroring tag, overriding with `Enabled` instead"
);
conf.enabled = OutputState::Enabled;
}
} else {
warn!(
"Invalid Mirroring tag, overriding with `Enabled` instead"
);
conf.enabled = OutputState::Enabled;
}
}
}
}
return config;
}
Err(err) => {
warn!(?err, "Failed to read output_config, resetting..");
if let Err(err) = std::fs::remove_file(path) {
error!(?err, "Failed to remove output_config.");
}
}
};
}
}
OutputsConfig {
config: HashMap::new(),
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TransformDef {
Normal,
_90,
_180,
_270,
Flipped,
Flipped90,
Flipped180,
Flipped270,
}
+6
View File
@@ -0,0 +1,6 @@
/// Internal output configurations used by cosmic-comp
pub mod comp;
#[cfg(feature = "randr")]
/// cosmic-randr style output configurations
pub mod randr;
+95
View File
@@ -0,0 +1,95 @@
use std::path::Path;
use cosmic_randr_shell::{AdaptiveSyncState, List};
use crate::output::comp::OutputState;
pub struct CompList {
infos: Vec<super::comp::OutputInfo>,
outputs: Vec<super::comp::OutputConfig>,
}
impl From<CompList> for cosmic_randr_shell::List {
fn from(CompList { infos, outputs }: CompList) -> cosmic_randr_shell::List {
let mut list = cosmic_randr_shell::List::default();
for (info, output) in infos.into_iter().zip(outputs.into_iter()) {
let current = list.modes.insert(cosmic_randr_shell::Mode {
size: (output.mode.0.0 as u32, output.mode.0.1 as u32),
refresh_rate: output.mode.1.unwrap_or_default(),
// XXX not in config as far as i can tell
preferred: false,
});
let modes = vec![current];
// for mode in output. {}
list.outputs.insert(cosmic_randr_shell::Output {
name: info.connector,
enabled: !matches!(output.enabled, OutputState::Disabled),
mirroring: match output.enabled {
OutputState::Mirroring(m) => Some(m),
_ => None,
},
make: Some(info.make).filter(|make| make != "Unknown"),
model: if info.model.as_str() == "Unknown" {
String::new()
} else {
info.model
},
position: (output.position.0 as i32, output.position.1 as i32),
scale: output.scale,
transform: Some(match output.transform {
crate::output::comp::TransformDef::Normal => {
cosmic_randr_shell::Transform::Normal
}
crate::output::comp::TransformDef::_90 => {
cosmic_randr_shell::Transform::Rotate90
}
crate::output::comp::TransformDef::_180 => {
cosmic_randr_shell::Transform::Rotate180
}
crate::output::comp::TransformDef::_270 => {
cosmic_randr_shell::Transform::Rotate270
}
crate::output::comp::TransformDef::Flipped => {
cosmic_randr_shell::Transform::Flipped
}
crate::output::comp::TransformDef::Flipped90 => {
cosmic_randr_shell::Transform::Flipped90
}
crate::output::comp::TransformDef::Flipped180 => {
cosmic_randr_shell::Transform::Flipped180
}
crate::output::comp::TransformDef::Flipped270 => {
cosmic_randr_shell::Transform::Flipped270
}
}),
modes,
current: Some(current),
adaptive_sync: Some(match output.vrr {
crate::output::comp::AdaptiveSync::Enabled => AdaptiveSyncState::Auto,
crate::output::comp::AdaptiveSync::Disabled => AdaptiveSyncState::Disabled,
crate::output::comp::AdaptiveSync::Force => AdaptiveSyncState::Always,
}),
xwayland_primary: Some(output.xwayland_primary),
// XXX no physical output size in the config
physical: (0, 0),
adaptive_sync_availability: None,
serial_number: String::new(),
});
}
list
}
}
pub fn load_outputs(path: Option<impl AsRef<Path>>) -> Vec<List> {
let output_config = crate::output::comp::load_outputs(path);
output_config
.config
.into_iter()
.map(|(infos, outputs)| {
let comp_config = CompList { infos, outputs };
List::from(comp_config)
})
.collect()
}
+67
View File
@@ -0,0 +1,67 @@
// SPDX-License-Identifier: GPL-3.0-only
use serde::{Deserialize, Serialize};
use crate::EdidProduct;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WorkspaceConfig {
pub workspace_mode: WorkspaceMode,
#[serde(default)]
pub workspace_layout: WorkspaceLayout,
#[serde(default)]
pub action_on_typing: Action,
#[serde(default = "default_wraparound")]
pub workspace_wraparound: bool,
}
fn default_wraparound() -> bool {
true
}
impl Default for WorkspaceConfig {
fn default() -> Self {
Self {
workspace_mode: WorkspaceMode::default(),
workspace_layout: WorkspaceLayout::default(),
action_on_typing: Action::default(),
workspace_wraparound: default_wraparound(),
}
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum WorkspaceMode {
#[default]
OutputBound,
Global,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum WorkspaceLayout {
#[default]
Vertical,
Horizontal,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum Action {
#[default]
None,
OpenLauncher,
OpenApplications,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct OutputMatch {
pub name: String,
pub edid: Option<EdidProduct>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct PinnedWorkspace {
pub output: OutputMatch,
pub tiling_enabled: bool,
pub id: Option<String>,
pub name: Option<String>,
}
+12
View File
@@ -0,0 +1,12 @@
[Unit]
Description=Cosmic wayland compositor
BindsTo=cosmic-session.target
Wants=cosmic-session-pre.target
After=cosmic-session-pre.target
Before=cosmic-session.target
[Service]
Type=notify
ExecStart=/usr/bin/cosmic-comp
Restart=never
ExecStopPost=/usr/bin/systemctl --user unset-environment DISPLAY WAYLAND_DISPLAY
+32
View File
@@ -0,0 +1,32 @@
#!/bin/bash
# From: https://people.debian.org/~mpitt/systemd.conf-2016-graphical-session.pdf
# robustness: if the previous graphical session left some failed units,
# reset them so that they don't break this startup
for unit in $(systemctl --user --no-legend --state=failed --plain list-units | cut -f1 -d' '); do
partof="$(systemctl --user show -p PartOf --value "$unit")"
for target in cosmic-session.target graphical-session.target; do
if [ "$partof" = "$target" ]; then
systemctl --user reset-failed "$unit"
break
fi
done
done
# /etc/profile contains a lot of important environment variables
source /etc/profile
export XDG_CURRENT_DESKTOP=cosmic
# save environment variables that will be added to systemd
new_env=$(systemctl --user show-environment | cut -d'=' -f 1 | sort | comm -13 - <(env | cut -d'=' -f 1 | sort))
# import environment variables from the login manager
systemctl --user import-environment
# then start the service
systemctl --wait --user start cosmic-comp.service
# cleanup environment
systemctl --user unset-environment $new_env
+8
View File
@@ -0,0 +1,8 @@
[Unit]
Description=Cosmic session early services
Documentation=man:systemd.special(7)
RefuseManualStart=yes
StopWhenUnneeded=yes
BindsTo=graphical-session-pre.target
Before=graphical-session-pre.target
Before=cosmic-session.target
+7
View File
@@ -0,0 +1,7 @@
[Unit]
Description=Cosmic session
Documentation=man:systemd.special(7)
RefuseManualStart=yes
StopWhenUnneeded=yes
BindsTo=graphical-session.target
Before=graphical-session.target
+8
View File
@@ -0,0 +1,8 @@
[Desktop Entry]
Name=Cosmic
Commment=This session logs you into Cosmic
Commment[sv]=Denna session loggar in dig till Cosmic
Exec=/usr/bin/cosmic-service
Type=Application
DesktopNames=pop:COSMIC
X-GDM-SessionRegisters=false
+128
View File
@@ -0,0 +1,128 @@
{
(modifiers: [Super, Alt], key: "Escape"): Terminate,
(modifiers: [Super, Shift], key: "Escape"): System(LogOut),
(modifiers: [Super, Ctrl], key: "Escape"): Debug,
(modifiers: [Super], key: "Escape"): System(LockScreen),
(modifiers: [Super], key: "q"): Close,
(modifiers: [Alt], key: "F4"): Close,
(modifiers: [Super], key: "Left"): Focus(Left),
(modifiers: [Super], key: "Right"): Focus(Right),
(modifiers: [Super], key: "Up"): Focus(Up),
(modifiers: [Super], key: "Down"): Focus(Down),
(modifiers: [Super], key: "h"): Focus(Left),
(modifiers: [Super], key: "j"): Focus(Down),
(modifiers: [Super], key: "k"): Focus(Up),
(modifiers: [Super], key: "l"): Focus(Right),
(modifiers: [Super], key: "u"): Focus(Out),
(modifiers: [Super], key: "i"): Focus(In),
(modifiers: [Super, Shift], key: "Left"): Move(Left),
(modifiers: [Super, Shift], key: "Right"): Move(Right),
(modifiers: [Super, Shift], key: "Up"): Move(Up),
(modifiers: [Super, Shift], key: "Down"): Move(Down),
(modifiers: [Super, Shift], key: "h"): Move(Left),
(modifiers: [Super, Shift], key: "j"): Move(Down),
(modifiers: [Super, Shift], key: "k"): Move(Up),
(modifiers: [Super, Shift], key: "l"): Move(Right),
(modifiers: [Super], key: "1"): Workspace(1),
(modifiers: [Super], key: "2"): Workspace(2),
(modifiers: [Super], key: "3"): Workspace(3),
(modifiers: [Super], key: "4"): Workspace(4),
(modifiers: [Super], key: "5"): Workspace(5),
(modifiers: [Super], key: "6"): Workspace(6),
(modifiers: [Super], key: "7"): Workspace(7),
(modifiers: [Super], key: "8"): Workspace(8),
(modifiers: [Super], key: "9"): Workspace(9),
(modifiers: [Super], key: "0"): LastWorkspace,
(modifiers: [Super, Shift], key: "1"): MoveToWorkspace(1),
(modifiers: [Super, Shift], key: "2"): MoveToWorkspace(2),
(modifiers: [Super, Shift], key: "3"): MoveToWorkspace(3),
(modifiers: [Super, Shift], key: "4"): MoveToWorkspace(4),
(modifiers: [Super, Shift], key: "5"): MoveToWorkspace(5),
(modifiers: [Super, Shift], key: "6"): MoveToWorkspace(6),
(modifiers: [Super, Shift], key: "7"): MoveToWorkspace(7),
(modifiers: [Super, Shift], key: "8"): MoveToWorkspace(8),
(modifiers: [Super, Shift], key: "9"): MoveToWorkspace(9),
(modifiers: [Super, Shift], key: "0"): MoveToLastWorkspace,
(modifiers: [Super, Ctrl], key: "Left"): PreviousWorkspace,
(modifiers: [Super, Ctrl], key: "Down"): NextWorkspace,
(modifiers: [Super, Ctrl], key: "Up"): PreviousWorkspace,
(modifiers: [Super, Ctrl], key: "Right"): NextWorkspace,
(modifiers: [Super, Ctrl], key: "h"): PreviousWorkspace,
(modifiers: [Super, Ctrl], key: "j"): NextWorkspace,
(modifiers: [Super, Ctrl], key: "k"): PreviousWorkspace,
(modifiers: [Super, Ctrl], key: "l"): NextWorkspace,
(modifiers: [Super, Shift, Ctrl], key: "Left"): MoveToPreviousWorkspace,
(modifiers: [Super, Shift, Ctrl], key: "Down"): MoveToNextWorkspace,
(modifiers: [Super, Shift, Ctrl], key: "Up"): MoveToPreviousWorkspace,
(modifiers: [Super, Shift, Ctrl], key: "Right"): MoveToNextWorkspace,
(modifiers: [Super, Shift, Ctrl], key: "h"): MoveToPreviousWorkspace,
(modifiers: [Super, Shift, Ctrl], key: "j"): MoveToNextWorkspace,
(modifiers: [Super, Shift, Ctrl], key: "k"): MoveToPreviousWorkspace,
(modifiers: [Super, Shift, Ctrl], key: "l"): MoveToNextWorkspace,
(modifiers: [Super, Alt], key: "Left"): SwitchOutput(Left),
(modifiers: [Super, Alt], key: "Down"): SwitchOutput(Down),
(modifiers: [Super, Alt], key: "Up"): SwitchOutput(Up),
(modifiers: [Super, Alt], key: "Right"): SwitchOutput(Right),
(modifiers: [Super, Alt], key: "h"): SwitchOutput(Left),
(modifiers: [Super, Alt], key: "k"): SwitchOutput(Up),
(modifiers: [Super, Alt], key: "j"): SwitchOutput(Down),
(modifiers: [Super, Alt], key: "l"): SwitchOutput(Right),
(modifiers: [Super, Shift, Alt], key: "Left"): MoveToOutput(Left),
(modifiers: [Super, Shift, Alt], key: "Down"): MoveToOutput(Down),
(modifiers: [Super, Shift, Alt], key: "Up"): MoveToOutput(Up),
(modifiers: [Super, Shift, Alt], key: "Right"): MoveToOutput(Right),
(modifiers: [Super, Shift, Alt], key: "h"): MoveToOutput(Left),
(modifiers: [Super, Shift, Alt], key: "k"): MoveToOutput(Up),
(modifiers: [Super, Shift, Alt], key: "j"): MoveToOutput(Down),
(modifiers: [Super, Shift, Alt], key: "l"): MoveToOutput(Right),
(modifiers: [Super], key: "o"): ToggleOrientation,
(modifiers: [Super], key: "s"): ToggleStacking,
(modifiers: [Super], key: "y"): ToggleTiling,
(modifiers: [Super], key: "g"): ToggleWindowFloating,
(modifiers: [Super], key: "x"): SwapWindow,
(modifiers: [Super], key: "m"): Maximize,
(modifiers: [Super], key: "F11"): Fullscreen,
(modifiers: [Super], key: "r"): Resizing(Outwards),
(modifiers: [Super, Shift], key: "r"): Resizing(Inwards),
(modifiers: [Super, Alt], key: "s"): System(ScreenReader),
(modifiers: [Super], key: "equal"): ZoomIn,
(modifiers: [Super], key: "minus"): ZoomOut,
(modifiers: [Super], key: "period"): ZoomIn,
(modifiers: [Super], key: "comma"): ZoomOut,
(modifiers: [Super], key: "b"): System(WebBrowser),
(modifiers: [Super], key: "f"): System(HomeFolder),
(modifiers: [Super], key: "space"): System(InputSourceSwitch),
(modifiers: [Super], key: "t"): System(Terminal),
(modifiers: [Super], key: "a"): System(AppLibrary),
(modifiers: [Super], key: "w"): System(WorkspaceOverview),
(modifiers: [Super], key: "slash"): System(Launcher),
(modifiers: [Super]): System(Launcher),
(modifiers: [Alt], key: "Tab"): System(WindowSwitcher),
(modifiers: [Alt, Shift], key: "Tab"): System(WindowSwitcherPrevious),
(modifiers: [Super], key: "Tab"): System(WindowSwitcher),
(modifiers: [Super, Shift], key: "Tab"): System(WindowSwitcherPrevious),
(modifiers: [], key: "Print"): System(Screenshot),
(modifiers: [], key: "XF86AudioRaiseVolume"): System(VolumeRaise),
(modifiers: [], key: "XF86AudioLowerVolume"): System(VolumeLower),
(modifiers: [], key: "XF86AudioMute"): System(Mute),
(modifiers: [], key: "XF86AudioMicMute"): System(MuteMic),
(modifiers: [], key: "XF86MonBrightnessUp"): System(BrightnessUp),
(modifiers: [], key: "XF86MonBrightnessDown"): System(BrightnessDown),
(modifiers: [], key: "XF86AudioPlay"): System(PlayPause),
(modifiers: [], key: "XF86AudioPrev"): System(PlayPrev),
(modifiers: [], key: "XF86AudioNext"): System(PlayNext),
(modifiers: [], key: "XF86PowerOff"): System(PowerOff),
(modifiers: [], key: "XF86TouchpadToggle"): System(TouchpadToggle),
(modifiers: [Super, Ctrl], key: "XF86TouchpadToggle"): System(TouchpadToggle),
(modifiers: [], key: "XF86LaunchA"): System(WorkspaceOverview),
}
+53
View File
@@ -0,0 +1,53 @@
[
// Any appid title only matching
(
appid: ".*",
titles: [
"Discord Updater",
]
),
// Empty appid title only matches
(
appid: "",
titles: [
"Steam",
"wl-clipboard",
]
),
// Appid matches
(appid: "Authy Desktop", titles: [".*"]),
(appid: "Com.github.amezin.ddterm", titles: [".*"]),
(appid: "Com.github.donadigo.eddy", titles: [".*"]),
(appid: "com.system76.CosmicFilesDialog", titles: [".*"]),
(appid: "com.system76.CosmicStoreDialog", titles: [".*"]),
(appid: "Enpass", titles: ["Enpass Assistant"]),
(appid: "Gjs", titles: ["Settings"]),
(appid: "Gnome-initial-setup", titles: [".*"]),
(appid: "Gnome-terminal", titles: ["Preferences - General"]),
(appid: "Guake", titles: [".*"]),
(appid: "Io.elementary.sideload", titles: [".*"]),
(appid: "KotatogramDesktop", titles: ["Media viewer"]),
(appid: "Mozilla VPN", titles: [".*"]),
(appid: "update-manager", titles: ["Software Updater"]),
(appid: "Solaar", titles: [".*"]),
(appid: "Steam", titles: ["^.*?(Guard|Login).*"]),
(appid: "TelegramDesktop", titles: ["Media viewer"]),
(appid: "Zotero", titles: ["Quick Format Citation"]),
(appid: "gjs", titles: [".*"]),
(appid: "gnome-screenshot", titles: [".*"]),
(appid: "ibus-.*", titles: [".*"]),
(appid: "jetbrains-toolbox", titles: [".*"]),
(appid: "jetbrains-webstorm", titles: ["Customize WebStorm", "License Activation", "Welcome to WebStorm"]),
(appid: "krunner", titles: [".*"]),
(appid: "pritunl", titles: [".*"]),
(appid: "re.sonny.Junction", titles: [".*"]),
(appid: "system76-driver", titles: [".*"]),
(appid: "tilda", titles: [".*"]),
(appid: "zoom", titles: [".*"]),
(appid: "Tor Browser", titles: [".*"]),
(appid: "^.*?action=join.*$", titles: [".*"]),
(appid: "^(slack|com.slack.Slack)", titles: ["^.*?(Huddle Preview).*"]),
(appid: "^(thunderbird|org.mozilla.thunderbird)(-esr|_esr)*", titles: ["^(Write:).*"]),
]
+5
View File
@@ -0,0 +1,5 @@
cosmic-comp (0.1) jammy; urgency=medium
* Initial pre-release.
-- Victoria Brekenfeld <[email protected]> Wed, 09 Feb 2022 14:20:23 +0100
+35
View File
@@ -0,0 +1,35 @@
Source: cosmic-comp
Section: x11
Priority: optional
Maintainer: Victoria Brekenfeld <[email protected]>
Build-Depends:
cargo,
cmake,
debhelper-compat (=10),
libegl1-mesa-dev,
libfontconfig-dev,
libgbm-dev,
libinput-dev,
libpixman-1-dev,
libseat-dev,
libsystemd-dev,
libudev-dev,
libwayland-dev,
libxcb1-dev,
libxkbcommon-dev,
libdisplay-info-dev,
rustc (>=1.57),
Standards-Version: 4.1.1
Homepage: https://github.com/pop-os/cosmic-comp
Package: cosmic-comp
Architecture: amd64 arm64
Depends:
${misc:Depends},
${shlibs:Depends},
libegl1,
libwayland-server0,
Recommends:
cosmic-session,
libgl1-mesa-dri
Description: Wayland compositor of pop-os cosmic shell
+7
View File
@@ -0,0 +1,7 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: cosmic-comp
Upstream-Contact: Victoria Brekenfeld <[email protected]>
Source: https://github.com/pop-os/cosmic-comp
Files: *
Copyright: System76 <[email protected]>
License: GPL-3.0-only
+2
View File
@@ -0,0 +1,2 @@
#!/bin/sh
set -x
Vendored Executable
+22
View File
@@ -0,0 +1,22 @@
#!/usr/bin/make -f
export sysconfdir = "/usr/share"
export VENDOR ?= 1
CLEAN ?= 1
%:
dh $@ --with=systemd
override_dh_auto_clean:
ifeq ($(CLEAN),1)
ischroot && make clean || make distclean
endif
ifeq ($(VENDOR),1)
ischroot || make vendor
endif
override_dh_installinit:
dh_installinit -r
override_dh_systemd_start:
dh_systemd_start -r
+1
View File
@@ -0,0 +1 @@
3.0 (native)
+2
View File
@@ -0,0 +1,2 @@
tar-ignore=target
tar-ignore=vendor
+79
View File
@@ -0,0 +1,79 @@
use cosmic::iced::{Color, Rectangle, Size};
use cosmic::widget;
use cosmic::widget::canvas;
use cosmic_comp::hooks::{Decorations, Hooks};
use cosmic_comp::shell::element::stack::{
DefaultDecorations as DefaultStackDecorations, TAB_HEIGHT,
};
use cosmic_comp::shell::element::window::{
DefaultDecorations as DefaultWindowDecorations, SSD_HEIGHT,
};
use std::sync::Arc;
/// The struct implementing Decorations hook
#[derive(Debug)]
struct AddIndicator<Lower> {
lower: Lower,
height: i32,
}
/// An iced program drawing a circle, which we'll add to the window decorations
struct Circle {
radius: f32,
color: Color,
}
impl<Message, Theme, Renderer: iced_graphics::geometry::Renderer>
canvas::Program<Message, Theme, Renderer> for Circle
{
type State = ();
fn draw(
&self,
_state: &(),
renderer: &Renderer,
_theme: &Theme,
bounds: Rectangle,
_cursor: cosmic::iced::mouse::Cursor,
) -> Vec<Renderer::Geometry> {
let bounds = bounds.size();
let min = bounds.height.min(bounds.width);
let mut frame = canvas::Frame::new(renderer, Size::new(min, min));
let circle = canvas::Path::circle(frame.center(), self.radius);
frame.fill(&circle, self.color);
vec![frame.into_geometry()]
}
}
impl<Internal, Message: std::clone::Clone + 'static, Lower: Decorations<Internal, Message>>
Decorations<Internal, Message> for AddIndicator<Lower>
{
fn view(&self, window: &Internal) -> cosmic::Element<'_, Message> {
let orig = self.lower.view(window);
widget::row([
widget::column([canvas(Circle {
radius: (self.height as f32 / 2.) * 0.8,
color: Color::from_rgba(1.0, 0.0, 0.0, 1.0),
})
.into()])
.width(self.height as f32)
.into(),
orig,
])
.into()
}
}
/// The customized cosmic-comp entrypoint
fn main() -> Result<(), Box<dyn std::error::Error>> {
cosmic_comp::run(Hooks {
window_decorations: Some(Arc::new(AddIndicator {
height: SSD_HEIGHT,
lower: DefaultWindowDecorations,
})),
stack_decorations: Some(Arc::new(AddIndicator {
height: TAB_HEIGHT,
lower: DefaultStackDecorations,
})),
})
}
Generated
+101
View File
@@ -0,0 +1,101 @@
{
"nodes": {
"crane": {
"locked": {
"lastModified": 1724974107,
"narHash": "sha256-69+1W0Ao5K9su569YUfUPANeN/Ea7aKu7xIZP1MSl9o=",
"owner": "ipetkov",
"repo": "crane",
"rev": "63396562b8e08efda3b3c66e32661b8a513055de",
"type": "github"
},
"original": {
"owner": "ipetkov",
"repo": "crane",
"type": "github"
}
},
"nix-filter": {
"locked": {
"lastModified": 1710156097,
"narHash": "sha256-1Wvk8UP7PXdf8bCCaEoMnOT1qe5/Duqgj+rL8sRQsSM=",
"owner": "numtide",
"repo": "nix-filter",
"rev": "3342559a24e85fc164b295c3444e8a139924675b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "nix-filter",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1725067332,
"narHash": "sha256-bMi5zhDwR6jdmN5mBHEu9gQQf9CibIEasA/6mc34Iek=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "192e7407cc66e2eccc3a6c5ad3834dd62fae3800",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"parts": {
"inputs": {
"nixpkgs-lib": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1725024810,
"narHash": "sha256-ODYRm8zHfLTH3soTFWE452ydPYz2iTvr9T8ftDMUQ3E=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "af510d4a62d071ea13925ce41c95e3dec816c01d",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"root": {
"inputs": {
"crane": "crane",
"nix-filter": "nix-filter",
"nixpkgs": "nixpkgs",
"parts": "parts",
"rust": "rust"
}
},
"rust": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1724984647,
"narHash": "sha256-BC6MUq0CTdmAu/cueVcdWTI+S95s0mJcn19SoEgd7gU=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "87b6cffc276795b46ef544d7ed8d7fed6ad9c8e4",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
}
},
"root": "root",
"version": 7
}
+116
View File
@@ -0,0 +1,116 @@
{
description = "Compositor for the COSMIC desktop environment";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
parts.url = "github:hercules-ci/flake-parts";
parts.inputs.nixpkgs-lib.follows = "nixpkgs";
crane.url = "github:ipetkov/crane";
rust.url = "github:oxalica/rust-overlay";
rust.inputs.nixpkgs.follows = "nixpkgs";
nix-filter.url = "github:numtide/nix-filter";
};
outputs =
inputs@{
self,
nixpkgs,
parts,
crane,
rust,
nix-filter,
...
}:
parts.lib.mkFlake { inherit inputs; } {
systems = [
"aarch64-linux"
"x86_64-linux"
];
perSystem =
{
self',
lib,
system,
...
}:
let
pkgs = nixpkgs.legacyPackages.${system}.extend rust.overlays.default;
rust-toolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
craneLib = (crane.mkLib pkgs).overrideToolchain rust-toolchain;
craneArgs = {
pname = "cosmic-comp";
version = self.rev or "dirty";
src = nix-filter.lib.filter {
root = ./.;
include = [
./src
./i18n.toml
./Cargo.toml
./Cargo.lock
./resources
./cosmic-comp-config
];
};
nativeBuildInputs = with pkgs; [
pkg-config
autoPatchelfHook
cmake
];
buildInputs = with pkgs; [
wayland
systemd # For libudev
seatd # For libseat
libxkbcommon
libinput
mesa # For libgbm
fontconfig
stdenv.cc.cc.lib
pixman
libdisplay-info
];
runtimeDependencies = with pkgs; [
libglvnd # For libEGL
wayland # winit->wayland-sys wants to dlopen libwayland-egl.so
# for running in X11
xorg.libX11
xorg.libXcursor
xorg.libxcb
xorg.libXi
libxkbcommon
# for vulkan backend
vulkan-loader
];
};
cargoArtifacts = craneLib.buildDepsOnly craneArgs;
cosmic-comp = craneLib.buildPackage (craneArgs // { inherit cargoArtifacts; });
in
{
apps.cosmic-comp = {
type = "app";
program = lib.getExe self'.packages.default;
};
checks.cosmic-comp = cosmic-comp;
packages.default = cosmic-comp;
devShells.default = craneLib.devShell {
LD_LIBRARY_PATH = lib.makeLibraryPath (
__concatMap (d: d.runtimeDependencies) (__attrValues self'.checks)
);
# include build inputs
inputsFrom = [ cosmic-comp ];
};
};
};
}
+4
View File
@@ -0,0 +1,4 @@
fallback_language = "en"
[fluent]
assets_dir = "resources/i18n"
Binary file not shown.
View File
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = يتحرك العرض بإستمرار مع المؤشر
a11y-zoom-move-onedge = يتحرك العرض عندما يصل المؤشر إلي الحافة
a11y-zoom-move-centered = يتحرك العرض لإبقاء المؤشر في مركز الشاشة
a11y-zoom-settings = إعدادات المكبر...
grow-window = وَسِّع
shrink-window = قلِّص
swap-windows = بدِّل النافذتين
stack-windows = كدِّس النوافذ
unknown-keybinding = <غير محدد>
window-menu-minimize = صغِّر
window-menu-maximize = كبِّر
window-menu-fullscreen = ملء الشاشة
window-menu-tiled = نافذة عائمة
window-menu-screenshot = التقط لقطة شاشة
window-menu-move = حرِّك
window-menu-resize = تغيير الحجم
window-menu-move-prev-workspace = حرِّك إلى مساحة العمل السابقة
window-menu-move-next-workspace = حرِّك إلى مساحة العمل التالية
window-menu-stack = أنشئ كدسة نوافذ
window-menu-unstack-all = ألغِ تكديس النوافذ
window-menu-unstack = ألغِ تكديس النافذة
window-menu-sticky = نافذة ثابتة
window-menu-close = أغلِق
window-menu-close-all = أغلِق جميع النوافذ
window-menu-resize-edge-top = الأعلى
window-menu-resize-edge-left = الشمال
window-menu-resize-edge-right = اليمين
window-menu-resize-edge-bottom = الأسفل
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = Прагляд рухаецца бесперапынна за указальнікам
a11y-zoom-move-onedge = Прагляд рухаецца, калі указальнік дасягае краю
a11y-zoom-move-centered = Прагляд рухаецца, каб утрымліваць указальнік у цэнтры
a11y-zoom-settings = Налады лупы...
grow-window = Павялічыць
shrink-window = Паменшыць
swap-windows = Памяняць вокны месцамі
stack-windows = Згрупаваць вокны
unknown-keybinding = <не зададзена>
window-menu-minimize = Згарнуць
window-menu-maximize = Разгарнуць
window-menu-fullscreen = На ўвесь экран
window-menu-tiled = Плавае акно
window-menu-screenshot = Зрабіць скрыншот
window-menu-move = Перамясціць
window-menu-resize = Змяніць памер
window-menu-move-prev-workspace = Перамясціць на папярэднюю працоўную прастору
window-menu-move-next-workspace = Перамясціць на наступную працоўную прастору
window-menu-stack = Стварыць групу вокнаў
window-menu-unstack-all = Разгрупаваць вокны
window-menu-unstack = Разгрупаваць акно
window-menu-sticky = Ліпкае акно
window-menu-close = Закрыць
window-menu-close-all = Закрыць усе вокны
window-menu-resize-edge-top = Уверх
window-menu-resize-edge-left = Улева
window-menu-resize-edge-right = Управа
window-menu-resize-edge-bottom = Уніз
+28
View File
@@ -0,0 +1,28 @@
window-menu-close = Затваряне
window-menu-close-all = Затваряне на всички прозорци
window-menu-resize = Преоразмеряване
window-menu-move = Преместване
window-menu-fullscreen = На цял екран
window-menu-maximize = Максимизиране
window-menu-minimize = Минимизиране
a11y-zoom-settings = Настройки на лупата...
swap-windows = Разменяне на прозорци
window-menu-move-prev-workspace = Преместване в предишното работно пространство
window-menu-move-next-workspace = Преместване в следващото работно пространство
window-menu-resize-edge-top = Горе
window-menu-resize-edge-left = Ляво
window-menu-resize-edge-right = Дясно
window-menu-resize-edge-bottom = Долу
window-menu-screenshot = Снимане на екрана
a11y-zoom-move-continuously = Изгледът се движи непрекъснато с показалеца
a11y-zoom-move-onedge = Изгледът се движи, когато показалецът достигне края
a11y-zoom-move-centered = Изгледът се премества да запази показалеца центриран
grow-window = Уголемяване
shrink-window = Свиване
stack-windows = Подреждане на прозорците на куп
unknown-keybinding = <unset>
window-menu-tiled = Плаващ прозорец
window-menu-stack = Създаване на куп от прозорци
window-menu-unstack-all = Разделяне на прозорците от купа
window-menu-unstack = Разделяне на прозореца от купа
window-menu-sticky = Лепкав прозорец
View File
View File
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = Zobrazení se pohybuje plynule s ukazatelem
a11y-zoom-move-onedge = Zobrazení se pohybuje, když ukazatel dosáhne okraje
a11y-zoom-move-centered = Zobrazení se pohybuje tak, aby ukazatel zůstal uprostřed
a11y-zoom-settings = Nastavení lupy...
grow-window = Zvětšit
shrink-window = Zmenšit
swap-windows = Prohodit okna
stack-windows = Seskupit okna
unknown-keybinding = <nenastaveno>
window-menu-minimize = Minimalizovat
window-menu-maximize = Maximalizovat
window-menu-tiled = Plovoucí okno
window-menu-screenshot = Pořídit snímek obrazovky
window-menu-move = Přesunout
window-menu-resize = Změnit velikost
window-menu-move-prev-workspace = Přesunout na předchozí pracovní plochu
window-menu-move-next-workspace = Přesunout na další pracovní plochu
window-menu-stack = Vytvořit zásobník oken
window-menu-unstack-all = Oddělit okna
window-menu-unstack = Oddělit okno
window-menu-sticky = Ponechat okno vždy nahoře
window-menu-close = Zavřít
window-menu-close-all = Zavřít všechna okna
window-menu-resize-edge-top = Nahoře
window-menu-resize-edge-left = Vlevo
window-menu-resize-edge-right = Vpravo
window-menu-resize-edge-bottom = Dole
window-menu-fullscreen = Režim celé obrazovky
View File
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = Ansicht bewegt sich kontinuierlich mit dem Cursor
a11y-zoom-move-onedge = Ansicht bewegt sich, sobald der Cursor den Rand erreicht
a11y-zoom-move-centered = Ansicht bewegt sich, um den Cursor zentiert zu halten
a11y-zoom-settings = Vergrößerungsglas-Einstellungen ...
grow-window = Vergrößern
shrink-window = Verkleinern
swap-windows = Fenster tauschen
stack-windows = Fenster stapeln
unknown-keybinding = <unset>
window-menu-minimize = Minimieren
window-menu-maximize = Maximieren
window-menu-tiled = Fenster schweben lassen
window-menu-screenshot = Bildschirmfoto machen
window-menu-move = Verschieben
window-menu-resize = Größe anpassen
window-menu-move-prev-workspace = Zur vorherigen Arbeitsfläche verschieben
window-menu-move-next-workspace = Zur nächsten Arbeitsfläche verschieben
window-menu-stack = Fensterstapel erstellen
window-menu-unstack-all = Fensterstapel auflösen
window-menu-unstack = Fenster aus Stapel lösen
window-menu-sticky = Klebendes Fenster
window-menu-close = Schließen
window-menu-close-all = Alle Fenster schließen
window-menu-resize-edge-top = Oben
window-menu-resize-edge-left = Links
window-menu-resize-edge-right = Rechts
window-menu-resize-edge-bottom = Unten
window-menu-fullscreen = Vollbild
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = Η προβολή μετακινείται συνεχώς με τον κέρσορα
window-menu-minimize = Ελαχιστοποίηση
window-menu-maximize = Μεγιστοποίηση
window-menu-fullscreen = Πλήρης οθόνη
window-menu-screenshot = Λήψη στιγμιότυπου οθόνης
window-menu-move = Μετακίνηση
window-menu-resize = Αλλαγή μεγέθους
window-menu-move-prev-workspace = Μετακίνηση στον προηγούμενο χώρο εργασίας
window-menu-move-next-workspace = Μετακίνηση στον επόμενο χώρο εργασίας
window-menu-stack = Δημιουργία στοίβας παραθύρων
window-menu-unstack-all = Κατάργηση στοίβας παραθύρων
window-menu-close = Κλείσιμο
window-menu-close-all = Κλείσιμο όλων των παραθύρων
window-menu-resize-edge-top = Πάνω
window-menu-resize-edge-left = Αριστερά
window-menu-resize-edge-right = Δεξιά
window-menu-resize-edge-bottom = Κάτω
shrink-window = Συρρίκνωση
swap-windows = Εναλλαγή παραθύρων
a11y-zoom-settings = Ρυθμίσεις μεγεθυντικού φακού...
a11y-zoom-move-onedge = Η προβολή μετακινείται όταν ο κέρσορας φτάνει στην άκρη
a11y-zoom-move-centered = Η προβολή μετακινείται για να διατηρεί τον κέρσορα στο κέντρο
grow-window = Ανάπτυξη
stack-windows = Στοίβαξη παραθύρων
window-menu-sticky = Καρφιτσωμένο παράθυρο
unknown-keybinding = <δεν έχει οριστεί>
window-menu-unstack = Κατάργηση στοίβας παραθύρου
window-menu-tiled = Αιώρηση παραθύρου
+20
View File
@@ -0,0 +1,20 @@
a11y-zoom-move-continuously = View moves continuously with pointer
a11y-zoom-move-onedge = View moves when pointer reaches edge
a11y-zoom-move-centered = View moves to keep pointer centred
a11y-zoom-settings = Magnifier settings...
grow-window = Grow
shrink-window = Shrink
swap-windows = Swap Windows
stack-windows = Stack Windows
unknown-keybinding = <unset>
window-menu-minimize = Minimise
window-menu-maximize = Maximise
window-menu-fullscreen = Fullscreen
window-menu-tiled = Float window
window-menu-screenshot = Take screenshot
window-menu-move = Move
window-menu-resize = Resize
window-menu-move-prev-workspace = Move to previous workspace
window-menu-move-next-workspace = Move to next workspace
window-menu-stack = Create window stack
window-menu-unstack-all = Unstack windows
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = View moves continuously with pointer
a11y-zoom-move-onedge = View moves when pointer reaches edge
a11y-zoom-move-centered = View moves to keep pointer centered
a11y-zoom-settings = Magnifier settings...
grow-window = Grow
shrink-window = Shrink
swap-windows = Swap Windows
stack-windows = Stack Windows
unknown-keybinding = <unset>
window-menu-minimize = Minimize
window-menu-maximize = Maximize
window-menu-fullscreen = Fullscreen
window-menu-tiled = Float window
window-menu-screenshot = Take screenshot
window-menu-move = Move
window-menu-resize = Resize
window-menu-move-prev-workspace = Move to previous workspace
window-menu-move-next-workspace = Move to next workspace
window-menu-stack = Create window stack
window-menu-unstack-all = Unstack windows
window-menu-unstack = Unstack window
window-menu-sticky = Sticky window
window-menu-close = Close
window-menu-close-all = Close all windows
window-menu-resize-edge-top = Top
window-menu-resize-edge-left = Left
window-menu-resize-edge-right = Right
window-menu-resize-edge-bottom = Bottom
View File
+28
View File
@@ -0,0 +1,28 @@
grow-window = Expandir
shrink-window = Disminuir
swap-windows = Intercambiar ventanas
stack-windows = Apilar ventanas
unknown-keybinding = <sin asignar>
window-menu-minimize = Minimizar
window-menu-maximize = Maximizar
window-menu-tiled = Ventana flotante
window-menu-screenshot = Tomar captura de pantalla
window-menu-move = Mover
window-menu-resize = Redimensionar
window-menu-move-prev-workspace = Mover al espacio de trabajo anterior
window-menu-move-next-workspace = Mover al espacio de trabajo siguiente
window-menu-stack = Crear pila de ventanas
window-menu-unstack-all = Desapilar ventanas
window-menu-unstack = Desapilar ventana
window-menu-sticky = Ventana siempre visible
window-menu-close = Cerrar
window-menu-close-all = Cerrar todas las ventanas
window-menu-resize-edge-top = Arriba
window-menu-resize-edge-left = Izquierda
window-menu-resize-edge-right = Derecha
window-menu-resize-edge-bottom = Abajo
a11y-zoom-move-continuously = La vista se mueve continuamente con el puntero
a11y-zoom-move-onedge = La vista se mueve cuando el puntero alcanza el borde
a11y-zoom-move-centered = La vista se mueve para mantener el puntero centrado
a11y-zoom-settings = Configuración de la ampliación de pantalla...
window-menu-fullscreen = Pantalla completa
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = La vista se mueve siguiendo el movimiento del puntero
a11y-zoom-move-onedge = La vista se mueve cuando el puntero alcanza un borde
a11y-zoom-move-centered = La vista se mueve manteniendo el puntero centrado
a11y-zoom-settings = Configuración de la Lupa...
grow-window = Agrandar
shrink-window = Disminuir
swap-windows = Intercambiar ventanas
stack-windows = Apilar ventanas
unknown-keybinding = <ninguno>
window-menu-minimize = Minimizar
window-menu-maximize = Maximizar
window-menu-tiled = Ventana flotante
window-menu-screenshot = Tomar captura de pantalla
window-menu-move = Mover
window-menu-resize = Redimensionar
window-menu-move-prev-workspace = Mover al espacio de trabajo anterior
window-menu-move-next-workspace = Mover al espacio de trabajo siguiente
window-menu-stack = Crear pila de ventanas
window-menu-unstack-all = Dispersar ventanas
window-menu-unstack = Dispersar ventana
window-menu-sticky = Ventana siempre visible
window-menu-close = Cerrar
window-menu-close-all = Cerrar todas las ventanas
window-menu-resize-edge-top = Arriba
window-menu-resize-edge-left = Izquierda
window-menu-resize-edge-right = Derecha
window-menu-resize-edge-bottom = Abajo
window-menu-fullscreen = Pantalla completa
+11
View File
@@ -0,0 +1,11 @@
window-menu-sticky = Kleepuv aken
window-menu-close = Sulge
window-menu-close-all = Sulge kõik aknad
window-menu-screenshot = Tee ekraanitõmmis
window-menu-move = Liiguta
window-menu-resize = Muuda suurust
window-menu-move-prev-workspace = Tõsta eelmisele tööalale
window-menu-move-next-workspace = Tõsta järgmisele tööalale
window-menu-minimize = Minimeeri
window-menu-maximize = Maksimeeri
window-menu-fullscreen = Täisekraanivaade
View File
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = نمای بزرگنمایی به طور مداوم با نشانگر حرکت می‌کند
a11y-zoom-move-onedge = نمای بزرگنمایی با رسیدن نشانگر به لبه حرکت می‌کند
a11y-zoom-move-centered = نمای بزرگنمایی برای نگه داشتن نشانگر در مرکز حرکت می‌کند
a11y-zoom-settings = تنظیمات ذره‌بین...
grow-window = بزرگ کردن
shrink-window = کوچک کردن
swap-windows = جابجایی پنجره‌ها
stack-windows = روی هم چیدن پنجره‌ها
unknown-keybinding = <تنظیم‌نشده>
window-menu-minimize = کوچک‌سازی
window-menu-maximize = بزرگ‌سازی
window-menu-fullscreen = تمام‌صفحه
window-menu-tiled = شناور کردن پنجره
window-menu-screenshot = گرفتن اسکرین‌شات
window-menu-move = جابجایی
window-menu-resize = تغییر اندازه
window-menu-move-prev-workspace = انتقال به محیط کاری قبلی
window-menu-move-next-workspace = انتقال به محیط کاری بعدی
window-menu-stack = ایجاد چینش پنجره‌ها
window-menu-unstack-all = برچیدن پنجره‌ها
window-menu-unstack = برچیدن پنجره‌
window-menu-sticky = پنجره چسبان
window-menu-close = بستن
window-menu-close-all = بستن همه پنجره‌ها
window-menu-resize-edge-top = بالا
window-menu-resize-edge-left = چپ
window-menu-resize-edge-right = راست
window-menu-resize-edge-bottom = پایین
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = Näkymä seuraa osoitinta
a11y-zoom-move-onedge = Näkymä liikkuu osoittimen osuessa reunaan
a11y-zoom-move-centered = Näkymä liikkuu pitäen osoittimen keskellä
a11y-zoom-settings = Suurennuslasin asetukset...
window-menu-minimize = Pienennä
window-menu-maximize = Suurenna
window-menu-fullscreen = Koko näyttö
window-menu-screenshot = Ota kuvakaappaus
window-menu-move = Siirrä
window-menu-resize = Muuta kokoa
window-menu-move-prev-workspace = Siirrä edelliseen työtilaan
window-menu-move-next-workspace = Siirrä seuraavaan työtilaan
window-menu-stack = Luo ikkunapino
window-menu-unstack-all = Poista ikkunat pinosta
window-menu-unstack = Poista ikkuna pinosta
window-menu-close = Sulje
window-menu-close-all = Sulje kaikki ikkunat
swap-windows = Vaihda ikkunoita
unknown-keybinding = <ei asetettu>
window-menu-tiled = Leijuva ikkuna
window-menu-sticky = Tahmea ikkuna
grow-window = Kasvata
shrink-window = Kutista
stack-windows = Pinoa ikkunat
window-menu-resize-edge-top = Ylös
window-menu-resize-edge-left = Vasemmalle
window-menu-resize-edge-right = Oikealle
window-menu-resize-edge-bottom = Alas
+28
View File
@@ -0,0 +1,28 @@
grow-window = Agrandir
shrink-window = Réduire
swap-windows = Basculer les fenêtres
stack-windows = Regrouper les fenêtres
unknown-keybinding = <unset>
window-menu-minimize = Minimiser
window-menu-maximize = Maximiser
window-menu-tiled = Fenêtre flottante
window-menu-screenshot = Prendre une capture d'écran
window-menu-move = Déplacer
window-menu-resize = Redimensionner
window-menu-move-prev-workspace = Déplacer vers l'espace de travail précédent
window-menu-move-next-workspace = Déplacer vers l'espace de travail suivant
window-menu-stack = Créer un regroupement de fenêtres
window-menu-unstack-all = Dégrouper toutes les fenêtres
window-menu-unstack = Dégrouper la fenêtre
window-menu-sticky = Fenêtre épinglée
window-menu-close = Fermer
window-menu-close-all = Fermer toutes les fenêtres
window-menu-resize-edge-top = Haut
window-menu-resize-edge-left = Gauche
window-menu-resize-edge-right = Droite
window-menu-resize-edge-bottom = Bas
window-menu-fullscreen = Plein écran
a11y-zoom-move-onedge = La vue se déplace lorsque le curseur atteint le bord
a11y-zoom-move-centered = La vue se déplace pour maintenir le curseur centré
a11y-zoom-settings = Paramètres de la loupe...
a11y-zoom-move-continuously = La vue se déplace continuellement avec le curseur
View File
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = Bogann an radharc go leanúnach leis an pointeoir
a11y-zoom-move-onedge = Bogann an radharc nuair a shroicheann an pointeoir an imeall
a11y-zoom-move-centered = Féach ar ghluaiseachtaí chun an pointeoir a choinneáil i lár an aonaigh
a11y-zoom-settings = Socruithe formhéadaitheora...
grow-window = Fás
shrink-window = Laghdaigh
swap-windows = Malartaigh fuinneoga
stack-windows = Fuinneoga Cruachta
unknown-keybinding = <unset>
window-menu-minimize = Íoslaghdaigh
window-menu-maximize = Uasmhéadaigh
window-menu-fullscreen = Lánscáileán
window-menu-tiled = Fuinneog snámhach
window-menu-screenshot = Tóg seat scáileán
window-menu-move = Bog
window-menu-resize = Athraigh méid
window-menu-move-prev-workspace = Bog go dtí an spás oibre roimhe seo
window-menu-move-next-workspace = Bog go dtí an chéad spás oibre eile
window-menu-stack = Cruigh cruach fuinneoige
window-menu-unstack-all = Díchruachadh fuinneoga
window-menu-unstack = Fuinneog a dhíchruachadh
window-menu-sticky = Fuinneog ghreamaitheach
window-menu-close = Dún
window-menu-close-all = Dún na fuinneoga go léir
window-menu-resize-edge-top = Barr
window-menu-resize-edge-left = Ar chlé
window-menu-resize-edge-right = Ar dheis
window-menu-resize-edge-bottom = Bun
+23
View File
@@ -0,0 +1,23 @@
grow-window = Fàs
shrink-window = Seac
swap-windows = Mùth uinneagan
stack-windows = Stac uinneagan
unknown-keybinding = <falamh>
window-menu-minimize = Fìor-lùghdaich
window-menu-maximize = Làn-mheudaich
window-menu-tiled = Uinneag fleòdraidh
window-menu-screenshot = Gabh dealbh-sgrìn
window-menu-move = Gluais
window-menu-resize = Ath-mheudachadh
window-menu-move-prev-workspace = Gluais gu àite-obrach roimhe
window-menu-move-next-workspace = Gluais chun ath àite-obrach
window-menu-stack = Cruthaich stac uinneig
window-menu-unstack-all = Thoir air falbh na h-uinneagan
window-menu-unstack = Thoir air falbh an uinneag
window-menu-sticky = Uinneag steigeach
window-menu-close = Dùin
window-menu-close-all = Dùin a h-uile uinneag
window-menu-resize-edge-top = Bàrr
window-menu-resize-edge-left = Clì
window-menu-resize-edge-right = Deas
window-menu-resize-edge-bottom = Bun
View File
View File
View File
View File
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = A nézet folyamatosan követi a mutatót
a11y-zoom-move-onedge = A nézet csak akkor mozog, ha a mutató eléri a szélét
a11y-zoom-move-centered = A nézet úgy mozog, hogy a mutató középen maradjon
a11y-zoom-settings = Nagyító beállításai…
grow-window = Növelés
shrink-window = Zsugorítás
swap-windows = Ablakok felcserélése
stack-windows = Ablakok egymásra helyezése
unknown-keybinding = <nincs beállítva>
window-menu-minimize = Minimalizálás
window-menu-maximize = Maximalizálás
window-menu-fullscreen = Teljes képernyő
window-menu-tiled = Ablak lebegtetése
window-menu-screenshot = Képernyőkép készítése
window-menu-move = Mozgatás
window-menu-resize = Átméretezés
window-menu-move-prev-workspace = Áthelyezés az előző munkaterületre
window-menu-move-next-workspace = Áthelyezés a következő munkaterületre
window-menu-stack = Ablakhalom létrehozása
window-menu-unstack-all = Ablakok szétválasztása
window-menu-unstack = Ablak szétválasztása
window-menu-sticky = Ragadós ablak
window-menu-close = Bezárás
window-menu-close-all = Összes ablak bezárása
window-menu-resize-edge-top = Felső
window-menu-resize-edge-left = Bal
window-menu-resize-edge-right = Jobb
window-menu-resize-edge-bottom = Alsó
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = Tampilan bergerak terus menerus dengan penunjuk
a11y-zoom-move-onedge = Tampilan bergerak saat penunjuk mencapai tepi
a11y-zoom-move-centered = Tampilan bergerak untuk menjaga penunjuk tetap di tengah
a11y-zoom-settings = Pengaturan kaca pembesar...
unknown-keybinding = <unset>
window-menu-resize-edge-top = Atas
window-menu-resize-edge-left = Kiri
window-menu-resize-edge-right = Kanan
window-menu-resize-edge-bottom = Bawah
window-menu-close = Tutup
window-menu-close-all = Tutup semua jendela
grow-window = Perbesar
shrink-window = Perkecil
swap-windows = Tukarkan Jendela
stack-windows = Tumpukkan Jendela
window-menu-screenshot = Ambil tangkapan layar
window-menu-move = Pindahkan
window-menu-resize = Ukur ulang
window-menu-minimize = Perkecil
window-menu-maximize = Perbesar
window-menu-fullscreen = Layar penuh
window-menu-tiled = Jendela apung
window-menu-move-prev-workspace = Pindahkan ke ruang kerja sebelumnya
window-menu-move-next-workspace = Pindahkan ke ruang kerja selanjutnya
window-menu-stack = Buat tumpukan jendela
window-menu-sticky = Jendela lengket
window-menu-unstack-all = Bongkar tumpukan jendela
window-menu-unstack = Bongkar tumpukan jendela
View File
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = Skjásýn færist stöðugt með bendli
a11y-zoom-move-onedge = Skjásýn færist þegar bendill kemur að brún
a11y-zoom-move-centered = Skjásýn færist til að halda bendli í miðju
a11y-zoom-settings = Stillingar stækkunarglers...
stack-windows = Stafla gluggum
window-menu-minimize = Fela
window-menu-maximize = Fullstækka
window-menu-fullscreen = Fylla skjá
window-menu-tiled = Fleyta glugga
window-menu-screenshot = Taka skjámynd
window-menu-move = Færa
window-menu-resize = Breyta stærð
window-menu-move-prev-workspace = Færa á fyrra vinnusvæði
window-menu-move-next-workspace = Færa á næsta vinnusvæði
window-menu-stack = Búa til gluggastafla
window-menu-unstack-all = Afstafla gluggum
window-menu-unstack = Afstafla glugga
window-menu-close = Loka
window-menu-close-all = Loka öllum gluggum
window-menu-resize-edge-top = Efst
window-menu-resize-edge-left = Vinstri
window-menu-resize-edge-right = Hægri
window-menu-resize-edge-bottom = Neðst
swap-windows = Skipta út gluggum
grow-window = Víkka út
shrink-window = Draga saman
window-menu-sticky = Klístraður gluggi
unknown-keybinding = <afvelja>
+28
View File
@@ -0,0 +1,28 @@
grow-window = Crescere
shrink-window = Riduci
swap-windows = Scambia le finestre
stack-windows = Sovrapponi le finestre
unknown-keybinding = <unset>
window-menu-minimize = Minimizza
window-menu-maximize = Massimizza
window-menu-tiled = Finestra flottante
window-menu-screenshot = Scatta uno screenshot
window-menu-move = Sposta
window-menu-resize = Ridimensiona
window-menu-move-prev-workspace = Sposta all'area di lavoro precedente
window-menu-move-next-workspace = Sposta all'area di lavoro successiva
window-menu-stack = Crea una pila di finestre
window-menu-unstack-all = Disimpila le finestre
window-menu-unstack = Disimpila la finestra
window-menu-sticky = Finestra fissa
window-menu-close = Chiudi
window-menu-close-all = Chiudi tutte le finestre
window-menu-resize-edge-top = In alto
window-menu-resize-edge-left = Sinistra
window-menu-resize-edge-right = Destra
window-menu-resize-edge-bottom = In basso
window-menu-fullscreen = Schermo intero
a11y-zoom-settings = Impostazioni lente d'ingrandimento...
a11y-zoom-move-continuously = Segue sempre il cursorse
a11y-zoom-move-centered = Mantiene il cursore centrato
a11y-zoom-move-onedge = Segue il cursore ai bordi
+28
View File
@@ -0,0 +1,28 @@
grow-window = 伸びさせる
shrink-window = 縮ませる
swap-windows = ウィンドウを取り替える
stack-windows = ウィンドウを積む
unknown-keybinding = <設定されていない>
window-menu-minimize = 最小化
window-menu-maximize = 最大化
window-menu-tiled = フローティングにする
window-menu-screenshot = スクリーンショットを撮る
window-menu-move = 動かす
window-menu-resize = サイズ変更
window-menu-move-prev-workspace = 前のワークスペースに切り替える
window-menu-move-next-workspace = 次のワークスペースに切り替える
window-menu-stack = ウィンドウ積み重ねを作成
window-menu-unstack-all = すべてのウィンドウを下ろす
window-menu-unstack = ウィンドウを下ろす
window-menu-sticky = スティッキーウィンドウ
window-menu-close = 閉じる
window-menu-close-all = ウィンドウをすべて閉じる
window-menu-resize-edge-top = 上
window-menu-resize-edge-left = 左
window-menu-resize-edge-right = 右
window-menu-resize-edge-bottom = 下
a11y-zoom-move-continuously = ポインターに合わせてビューを継続的に移動
a11y-zoom-move-onedge = ポインターが端に達するとビューを移動
a11y-zoom-move-centered = ポインターを中央に維持するようにビューを移動
a11y-zoom-settings = 拡大鏡の設定...
window-menu-fullscreen = フルスクリーン
View File
View File
+27
View File
@@ -0,0 +1,27 @@
window-menu-fullscreen = Agdil aččuran
window-menu-close = Mdel
window-menu-resize-edge-top = D asawen
window-menu-resize-edge-left = Zelmaḍ
window-menu-resize-edge-right = Yeffus
window-menu-resize-edge-bottom = Ddaw
window-menu-screenshot = Ṭṭef tuṭṭfa n ugdil
a11y-zoom-settings = Iɣewwaṛen n usemɣeṛ…
grow-window = Semɣer
shrink-window = Semẓi
stack-windows = Settef isfuyla
window-menu-minimize = Senɣes
window-menu-maximize = Afellay
window-menu-tiled = Asfaylu yettifliwen
window-menu-move = Smutti
window-menu-move-prev-workspace = Smutti ɣer tallunt n umahil tuzwirt
window-menu-move-next-workspace = Smutti ɣer tallunt n umahil tuḍfirt
window-menu-stack = Rnu asettef n isfuyla
window-menu-unstack-all = Kkes asettef n isfuyla
window-menu-unstack = Kkes asettef n usfaylu
window-menu-sticky = Asfaylu amsenṭaḍ
window-menu-close-all = Mdel akk isfuyla
a11y-zoom-move-continuously = Timeẓri tezga dima tetteddu s usewwaṛ
a11y-zoom-move-onedge = Timeẓri tetteddu mi ara yaweḍ usewwaṛ ɣer yiri
a11y-zoom-move-centered = Timeẓri tetteddu iwakken ad tḥerzeḍ asewwaṛ d alemmas
swap-windows = Senfel isfuyla
window-menu-resize = Beddel tiddi
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = Көрініс курсормен бірге үздіксіз қозғалады
a11y-zoom-move-onedge = Көрініс курсор жиекке жеткенде қозғалады
a11y-zoom-move-centered = Көрініс курсорды ортада сақтау үшін қозғалады
a11y-zoom-settings = Үлкейткіш баптаулары...
grow-window = Үлкейту
shrink-window = Кішірейту
swap-windows = Терезелерді алмастыру
stack-windows = Терезелерді жинақтау
unknown-keybinding = <орнатылмаған>
window-menu-minimize = Қайыру
window-menu-maximize = Жазық қылу
window-menu-fullscreen = Толық экран
window-menu-tiled = Қалқымалы терезе
window-menu-screenshot = Скриншот түсіру
window-menu-move = Жылжыту
window-menu-resize = Өлшемін өзгерту
window-menu-move-prev-workspace = Алдыңғы жұмыс орнына жылжыту
window-menu-move-next-workspace = Келесі жұмыс орнына жылжыту
window-menu-stack = Терезелер жинағын жасау
window-menu-unstack-all = Терезелерді жинақтан шығару
window-menu-unstack = Терезені жинақтан шығару
window-menu-sticky = Жабысқақ терезе
window-menu-close = Жабу
window-menu-close-all = Барлық терезелерді жабу
window-menu-resize-edge-top = Жоғарғы
window-menu-resize-edge-left = Сол жақ
window-menu-resize-edge-right = Оң жақ
window-menu-resize-edge-bottom = Төменгі
+28
View File
@@ -0,0 +1,28 @@
grow-window = Mezin bike
shrink-window = Biçûk bike
window-menu-move = Bilivîne
window-menu-close = Bigire
window-menu-resize-edge-top = Jor
window-menu-resize-edge-left = Çep
window-menu-resize-edge-right = Rast
window-menu-resize-edge-bottom = Jêr
unknown-keybinding = <unset>
window-menu-minimize = Biçûk bike
window-menu-maximize = Mezin bike
window-menu-fullscreen = Dîmendera tije
window-menu-tiled = Çarçoveya herikbar
window-menu-screenshot = Wêneya dîmenderê bigire
window-menu-resize = Mezinahiyê ji nû ve saz bike
window-menu-move-prev-workspace = Bilivîne bo qada xebatê ya paş
window-menu-move-next-workspace = Bilivîne bo qada xebatê ya pêş
window-menu-stack = Komkirina çarçoveyê biafrîne
window-menu-unstack-all = Çarçoveyan kom neke
window-menu-unstack = Çarçoveyê kom neke
window-menu-sticky = Çarçoveya daliqandî
window-menu-close-all = Hemû çarçoveyan bigire
a11y-zoom-move-continuously = Dîtin bi nîşanker re bi awayekî domdar dilive
a11y-zoom-move-onedge = Dîtin dema nîşanker dikeve qeraxê dilive
a11y-zoom-move-centered = Dîtin dilive da ku nîşanker navîn bimîne
a11y-zoom-settings = Sazkariyên mezinkerê...
swap-windows = Çarçoveyan biguhêrîne
stack-windows = Çarçoveyan dalqîne
View File
+28
View File
@@ -0,0 +1,28 @@
window-menu-resize-edge-top = 상단
window-menu-resize-edge-left = 좌측
window-menu-resize-edge-right = 우측
window-menu-resize-edge-bottom = 하단
window-menu-move = 이동
window-menu-minimize = 최소화
window-menu-maximize = 최대화
window-menu-fullscreen = 전체 화면
window-menu-move-prev-workspace = 이전 작업 공간으로 이동
window-menu-move-next-workspace = 다음 작업 공간으로 이동
a11y-zoom-settings = 돋보기 설정...
grow-window = 확대
shrink-window = 축소
swap-windows = 창 바꾸기
stack-windows = 창 스택
window-menu-tiled = 플로팅 창으로 전환
window-menu-screenshot = 스크린샷 찍기
window-menu-resize = 크기 조정
window-menu-stack = 창 스택 생성
window-menu-unstack-all = 모든 창 스택 해제
window-menu-unstack = 창 스택 해제
a11y-zoom-move-continuously = 포인터를 따라 화면이 계속 이동
a11y-zoom-move-onedge = 포인터가 가장자리에 도달할 때 화면 이동
a11y-zoom-move-centered = 포인터를 화면 중앙에 유지하며 이동
window-menu-close = 닫기
window-menu-close-all = 모든 창 닫기
unknown-keybinding = <unset>
window-menu-sticky = 고정된 창
View File
View File
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = Vaizdo nuolatinis žymeklio sekimas
a11y-zoom-move-onedge = Vaizdo sekimas, kol žymeklis pasieks kraštą
a11y-zoom-move-centered = Rodyti vaizdą taip, kad žymeklis būtų centre
a11y-zoom-settings = Didinamojo stiklo nustatymai...
grow-window = Didinti
shrink-window = Mažinti
swap-windows = Apkeisti Langus Vietomis
stack-windows = Kaupti Langus
unknown-keybinding = <nenustatytas>
window-menu-minimize = Sumažinti
window-menu-maximize = Padidinti
window-menu-fullscreen = Visas ekranas
window-menu-tiled = Slankus langas
window-menu-screenshot = Padaryti ekrano kopiją
window-menu-move = Perkelti
window-menu-resize = Keisti dydį
window-menu-move-prev-workspace = Perkelti į ankstesnę darbo sritį
window-menu-move-next-workspace = Perkelti į sekančią darbo sritį
window-menu-stack = Sukurti langų krūvą
window-menu-unstack-all = Išskaidyti langus iš krūvos
window-menu-unstack = Atskirti langą nuo krūvos
window-menu-sticky = Lipnus langas
window-menu-close = Užverti
window-menu-close-all = Užverti visus langus
window-menu-resize-edge-top = Viršus
window-menu-resize-edge-left = Kairė
window-menu-resize-edge-right = Dešinė
window-menu-resize-edge-bottom = Apačia
View File
View File
+28
View File
@@ -0,0 +1,28 @@
window-menu-tiled = Flytende vindu
a11y-zoom-settings = Forstørrelsesglass-innstillinger...
grow-window = Voks
shrink-window = Krymp
swap-windows = Bytt Vinduer
stack-windows = Stable Vinduer
unknown-keybinding = <usatt>
window-menu-minimize = Minimer
window-menu-maximize = Maksimer
window-menu-fullscreen = Fullskjerm
window-menu-screenshot = Ta skjermbilde
window-menu-move = Flytt
window-menu-resize = Endre størrelse
window-menu-move-prev-workspace = Flytt til forrige arbeidsområde
window-menu-move-next-workspace = Flytt til neste arbeidsområde
window-menu-stack = Lag vindustabel
window-menu-unstack-all = Løsne vinduer
window-menu-unstack = Løsne vindu
window-menu-sticky = Festet vindu
window-menu-close = Lukk
window-menu-resize-edge-right = Høyre
window-menu-resize-edge-bottom = Nederst
window-menu-close-all = Lukk alle vinduer
window-menu-resize-edge-left = Venstre
window-menu-resize-edge-top = Øverst
a11y-zoom-move-centered = Visningen flytter seg for å holde pekeren sentrert
a11y-zoom-move-onedge = Visningen flytter seg når pekeren når kanten
a11y-zoom-move-continuously = Visningen flytter seg kontinuerlig med pekeren
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = Aanzicht met de cursor mee laten bewegen
a11y-zoom-move-onedge = Aanzicht verplaatst zich pas als de cursor een schermrand raakt
a11y-zoom-move-centered = Aanzicht houdt de cursor gecentreerd
a11y-zoom-settings = Vergrootglasinstellingen…
grow-window = Vergroten
shrink-window = Verkleinen
swap-windows = Vensters omwisselen
stack-windows = Vensters stapelen
unknown-keybinding = <unset>
window-menu-minimize = Minimaliseren
window-menu-maximize = Maximaliseren
window-menu-tiled = Venster laten zweven
window-menu-screenshot = Schermafdruk maken
window-menu-move = Verplaatsen
window-menu-resize = Grootte aanpassen
window-menu-move-prev-workspace = Naar vorig werkblad verplaatsen
window-menu-move-next-workspace = Naar volgend werkblad verplaatsen
window-menu-stack = Vensterstapel beginnen
window-menu-unstack-all = Vensterstapel opheffen
window-menu-unstack = Venster uit stapel halen
window-menu-sticky = Venster vastzetten
window-menu-close = Sluiten
window-menu-close-all = Alle vensters sluiten
window-menu-resize-edge-top = Boven
window-menu-resize-edge-left = Links
window-menu-resize-edge-right = Rechts
window-menu-resize-edge-bottom = Onder
window-menu-fullscreen = Volledig scherm
+1
View File
@@ -0,0 +1 @@
a11y-zoom-move-continuously = Visninga flyttar seg kontinuerleg med peikaren
View File
+21
View File
@@ -0,0 +1,21 @@
grow-window = ਵਧਾਓ
a11y-zoom-settings = ਵੱਡਦਰਸ਼ੀ ਸੈਟਿੰਗਾਂ...
shrink-window = ਸੰਘੁੜੋ
swap-windows = ਵਿੰਡੋਆਂ ਨੂੰ ਆਪਸ 'ਚ ਬਦਲੋ
stack-windows = ਵਿੰਡੋਆਂ ਦਾ ਢੇਰ ਲਾਓ
window-menu-minimize = ਘੱਟੋ-ਘੱਟ
window-menu-maximize = ਵੱਧ ਤੋਂ ਵੱਧ
window-menu-fullscreen = ਪੂਰੀ ਸਕਰੀਨ
window-menu-tiled = ਤਰਦੀ ਵਿੰਡੋ
window-menu-screenshot = ਸਕਰੀਨਸ਼ਾਟ ਲਵੋ
window-menu-move = ਭੇਜੋ
window-menu-resize = ਆਕਾਰ ਬਦਲੋ
window-menu-move-prev-workspace = ਪਿਛਲੇ ਵਰਕਸਪੇਸ ਵਿੱਚ ਭੇਜੋ
window-menu-move-next-workspace = ਅਗਲੇ ਵਰਕਸਪੇਸ ਵਿੱਚ ਭੇਜੋ
window-menu-stack = ਵਿੰਡੋ ਢੇਰੀ ਬਣਾਓ
window-menu-close = ਬੰਦ ਕਰੋ
window-menu-close-all = ਸਾਰੀਆਂ ਵਿੰਡੋਆਂ ਨੂੰ ਬੰਦ ਕਰੋ
window-menu-resize-edge-top = ਉੱਤੇ
window-menu-resize-edge-left = ਖੱਬੇ
window-menu-resize-edge-right = ਸੱਜੇ
window-menu-resize-edge-bottom = ਹੇਠਾਂ
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = Widok podąża za wskaźnikiem
a11y-zoom-move-onedge = Widok przesuwa się gdy wskaźnik osiąga krawędź
a11y-zoom-move-centered = Widok przesuwa się tak, aby wskaźnik znajdował się w środku
a11y-zoom-settings = Ustawienia lupy…
grow-window = Powiększ
shrink-window = Zmniejsz
swap-windows = Zamień Okna Miejscami
stack-windows = Okna w Kartach
unknown-keybinding = <unset>
window-menu-minimize = Minimalizuj
window-menu-maximize = Maksymalizuj
window-menu-tiled = Pływające Okno
window-menu-screenshot = Zrób zrzut ekranu
window-menu-move = Przesuń
window-menu-resize = Zmień rozmiar
window-menu-move-prev-workspace = Przenieś do poprzedniego obszaru roboczego
window-menu-move-next-workspace = Przenieś do następnego obszaru roboczego
window-menu-stack = Zgrupuj okna w karty
window-menu-unstack-all = Rozdziel grupę okien
window-menu-unstack = Wydziel okno z grupy
window-menu-sticky = Zakrywające okno
window-menu-close = Zamknij
window-menu-close-all = Zamknij wszystkie okna
window-menu-resize-edge-top = Górnej
window-menu-resize-edge-left = Lewej
window-menu-resize-edge-right = Prawej
window-menu-resize-edge-bottom = Dolnej
window-menu-fullscreen = Tryb Pełnoekranowy
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = A visualização se move continuamente com o ponteiro
a11y-zoom-move-onedge = A visualização se move quando o ponteiro atinge a borda
a11y-zoom-move-centered = A visualização se move para manter o ponteiro centralizado
a11y-zoom-settings = Configurações do ampliador de tela...
grow-window = Aumentar
shrink-window = Diminuir
swap-windows = Trocar janelas
stack-windows = Empilhar janelas
unknown-keybinding = <não configurado>
window-menu-minimize = Minimizar
window-menu-maximize = Maximizar
window-menu-fullscreen = Tela cheia
window-menu-tiled = Janela flutuante
window-menu-screenshot = Fazer captura de tela
window-menu-move = Mover
window-menu-resize = Redimensionar
window-menu-move-prev-workspace = Mover para o espaço de trabalho anterior
window-menu-move-next-workspace = Mover para o próximo espaço de trabalho
window-menu-stack = Empilhar janelas
window-menu-unstack-all = Desempilhar janelas
window-menu-unstack = Desempilhar janela
window-menu-sticky = Manter a janela sempre na frente
window-menu-close = Fechar
window-menu-close-all = Fechar todas as janelas
window-menu-resize-edge-top = Para cima
window-menu-resize-edge-left = Para a esquerda
window-menu-resize-edge-right = Para a direita
window-menu-resize-edge-bottom = Para baixo
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = A visualização move-se continuamente com o cursor
a11y-zoom-move-onedge = A vista move-se quando o ponteiro atinge a extremidade
a11y-zoom-move-centered = A vista move-se para manter o ponteiro centrado
a11y-zoom-settings = Definições do ampliador...
grow-window = Aumentar
shrink-window = Diminuir
swap-windows = Trocar Janelas
stack-windows = Empilhar Janelas
unknown-keybinding = <não definido>
window-menu-minimize = Minimizar
window-menu-maximize = Maximizar
window-menu-tiled = Janela flutuante
window-menu-screenshot = Tirar uma captura de ecrã
window-menu-move = Mover
window-menu-resize = Redimensionar
window-menu-move-prev-workspace = Mover para a área de trabalho anterior
window-menu-move-next-workspace = Mover para a área de trabalho seguinte
window-menu-stack = Criar pilha de janelas
window-menu-unstack-all = Desempilhar janelas
window-menu-unstack = Desempilhar janela
window-menu-sticky = Janela fixa
window-menu-close = Fechar
window-menu-close-all = Fechar todas as janelas
window-menu-resize-edge-top = Cima
window-menu-resize-edge-left = Esquerda
window-menu-resize-edge-right = Direita
window-menu-resize-edge-bottom = Baixo
window-menu-fullscreen = Ecrã inteiro
+23
View File
@@ -0,0 +1,23 @@
grow-window = Mărește
shrink-window = Micșorează
swap-windows = Schimbă ferestrele
stack-windows = Suprapune ferestrele
unknown-keybinding = <neatribuit>
window-menu-minimize = Minimizează
window-menu-maximize = Maximizează
window-menu-tiled = Fereastră plutitoare
window-menu-screenshot = Capturează ecranul
window-menu-move = Mută
window-menu-resize = Redimensionează
window-menu-move-prev-workspace = Mută la spațiul de lucru anterior
window-menu-move-next-workspace = Mută la spațiul de lucru următor
window-menu-stack = Creează o stivă de ferestre
window-menu-unstack-all = Scoate toate ferestrele din stivă
window-menu-unstack = Scoate fereastra din stivă
window-menu-sticky = Fereastră vizibilă permanent
window-menu-close = Închide
window-menu-close-all = Închide toate ferestrele
window-menu-resize-edge-top = Sus
window-menu-resize-edge-left = Stânga
window-menu-resize-edge-right = Dreapta
window-menu-resize-edge-bottom = Jos
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = Лупа двигается за курсором
a11y-zoom-move-onedge = Лупа двигается когда курсор достигает края
a11y-zoom-move-centered = Лупа двигается с курсором в центре
a11y-zoom-settings = Параметры лупы...
grow-window = Увеличить
shrink-window = Уменьшить
swap-windows = Сменить окна
stack-windows = Стопка
unknown-keybinding = <не задано>
window-menu-minimize = Свернуть
window-menu-maximize = Развернуть
window-menu-fullscreen = Во весь экран
window-menu-tiled = Плавающее окно
window-menu-screenshot = Сделать снимок окна
window-menu-move = Переместить
window-menu-resize = Изменить размер
window-menu-move-prev-workspace = На пред. рабочий стол
window-menu-move-next-workspace = На след. рабочий стол
window-menu-stack = Создать стопку окон
window-menu-unstack-all = Распустить стопку окон
window-menu-unstack = Убрать из стопки
window-menu-sticky = Закрепить окно поверх других
window-menu-close = Закрыть
window-menu-close-all = Закрыть все окна
window-menu-resize-edge-top = Наверх
window-menu-resize-edge-left = Влево
window-menu-resize-edge-right = Вправо
window-menu-resize-edge-bottom = Вниз
View File
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = Zobrazenie sa pohybuje nepretržite s kurzorom
a11y-zoom-move-onedge = Zobrazenie sa pohybuje, keď kurzor dosiahne okraj
a11y-zoom-move-centered = Zobrazenie sa pohybuje, aby kurzor zostal v strede
a11y-zoom-settings = Nastavenia lupy...
grow-window = Zväčšiť
shrink-window = Zmenšiť
swap-windows = Vymeniť okná
stack-windows = Zoskupiť okná
unknown-keybinding = <nenastavené>
window-menu-minimize = Minimalizovať
window-menu-maximize = Maximalizovať
window-menu-fullscreen = Celá obrazovka
window-menu-tiled = Plávajúce okno
window-menu-screenshot = Urobiť snímku obrazovky
window-menu-move = Presunúť
window-menu-resize = Zmeniť veľkosť
window-menu-move-prev-workspace = Presunúť na predchádzajúcu pracovnú plochu
window-menu-move-next-workspace = Presunúť na nasledujúcu pracovnú plochu
window-menu-stack = Vytvoriť skupinu okien
window-menu-unstack-all = Oddeliť všetky okná
window-menu-unstack = Oddeliť okno
window-menu-sticky = Prilepiť okno
window-menu-close = Zavrieť
window-menu-close-all = Zavrieť všetky okná
window-menu-resize-edge-top = Hore
window-menu-resize-edge-left = Vľavo
window-menu-resize-edge-right = Vpravo
window-menu-resize-edge-bottom = Dole
View File
+28
View File
@@ -0,0 +1,28 @@
grow-window = Повећај
shrink-window = Смањи
swap-windows = Замени прозоре
stack-windows = Групиши прозоре
unknown-keybinding = <није подешено>
window-menu-minimize = Умањи
window-menu-maximize = Увећај
window-menu-tiled = Плутајући прозор
window-menu-screenshot = Направи снимак апликације
window-menu-move = Помери
window-menu-resize = Промени величину
window-menu-move-prev-workspace = Помери на претходни радни простор
window-menu-move-next-workspace = Помери на следећи радни простор
window-menu-stack = Направи групу прозора
window-menu-unstack-all = Уклони све прозоре из групе
window-menu-unstack = Уклони прозор из групе
window-menu-sticky = Лепљиви прозор
window-menu-close = Затвори
window-menu-close-all = Затвори све прозоре
window-menu-resize-edge-top = Горе
window-menu-resize-edge-left = Лево
window-menu-resize-edge-right = Десно
window-menu-resize-edge-bottom = Доле
a11y-zoom-move-continuously = Види покрете непрекидно помоћу показивача
a11y-zoom-move-onedge = Покажи покрете када показивач достигне ивицу
a11y-zoom-move-centered = Покажи покрете зарад центрирања показивача
a11y-zoom-settings = Подешавања лупе...
window-menu-fullscreen = Цео екран
+23
View File
@@ -0,0 +1,23 @@
grow-window = Povećaj
shrink-window = Smanji
swap-windows = Zameni prozore
stack-windows = Grupiši prozore
unknown-keybinding = <nije podešeno>
window-menu-minimize = Umanji
window-menu-maximize = Uvećaj
window-menu-tiled = Plutajući prozor
window-menu-screenshot = Napravi snimak aplikacije
window-menu-move = Pomeri
window-menu-resize = Promeni veličinu
window-menu-move-prev-workspace = Pomeri na prethodni radni prostor
window-menu-move-next-workspace = Pomeri na sledeći radni prostor
window-menu-stack = Napravi grupu prozora
window-menu-unstack-all = Ukloni sve prozore iz grupe
window-menu-unstack = Ukloni prozor iz grupe
window-menu-sticky = Lepljivi prozor
window-menu-close = Zatvori
window-menu-close-all = Zatvori sve prozore
window-menu-resize-edge-top = Gore
window-menu-resize-edge-left = Levo
window-menu-resize-edge-right = Desno
window-menu-resize-edge-bottom = Dole
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = Преглед се непрекидно помера показивачем
a11y-zoom-move-onedge = Преглед се помера када показивач достигне ивицу
a11y-zoom-move-centered = Преглед се помера како би се показивач задржао на средини
a11y-zoom-settings = Подешавања лупе...
grow-window = Увећај
shrink-window = Смањи
swap-windows = Замени прозоре
stack-windows = Наслагај прозоре
unknown-keybinding = <непостављено>
window-menu-minimize = Умањи
window-menu-maximize = Увећај
window-menu-fullscreen = Цео екран
window-menu-tiled = Плутајући прозор
window-menu-screenshot = Направи снимак екрана
window-menu-move = Помери
window-menu-resize = Промени величину
window-menu-move-prev-workspace = Помери на претходни радни простор
window-menu-move-next-workspace = Помери на следећи радни простор
window-menu-stack = Направи стек прозора
window-menu-unstack-all = Раздвоји прозоре
window-menu-unstack = Одвоји прозор
window-menu-sticky = Лепљив прозор
window-menu-close = Затвори
window-menu-close-all = Затвори све прозоре
window-menu-resize-edge-top = Горе
window-menu-resize-edge-left = Лево
window-menu-resize-edge-right = Десно
window-menu-resize-edge-bottom = Доле
+28
View File
@@ -0,0 +1,28 @@
a11y-zoom-move-continuously = Vyn flyttar sig kontinuerligt med pekaren
a11y-zoom-move-onedge = Vyn flyttar på sig när pekaren når kanten
a11y-zoom-move-centered = Vyn flyttar på sig för att behålla pekaren centrerad
a11y-zoom-settings = Inställningar för förstoringsglas...
grow-window = Väx
shrink-window = Krymp
swap-windows = Byt fönster
stack-windows = Stapla fönstren
unknown-keybinding = <inaktiverad>
window-menu-minimize = Minimera
window-menu-maximize = Maximera
window-menu-tiled = Flytande fönster
window-menu-screenshot = Ta skärmbild
window-menu-move = Flytta
window-menu-resize = Ändra storlek
window-menu-move-prev-workspace = Flytta till föregående arbetsyta
window-menu-move-next-workspace = Flytta till nästa arbetsyta
window-menu-stack = Skapa fönsterstapel
window-menu-unstack-all = Avstapla fönster
window-menu-unstack = Avstapla fönster
window-menu-sticky = Klistrigt fönster
window-menu-close = Stäng
window-menu-close-all = Stäng alla fönster
window-menu-resize-edge-top = Högst upp
window-menu-resize-edge-left = Vänster
window-menu-resize-edge-right = Höger
window-menu-resize-edge-bottom = Längst ned
window-menu-fullscreen = Helskärm
View File
View File
View File

Some files were not shown because too many files have changed in this diff Show More