Added Berry window manager
This commit is contained in:
@@ -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>.
|
||||
@@ -0,0 +1,52 @@
|
||||
# Maintainer: Aditya Shakya <adi1090x@gmail.com>
|
||||
|
||||
pkgname=archcraft-berry
|
||||
pkgver=1.0
|
||||
pkgrel=3
|
||||
pkgdesc="berry Configurations for Archcraft"
|
||||
url="https://github.com/archcraft-os/archcraft-berry"
|
||||
arch=('any')
|
||||
license=('GPL3')
|
||||
makedepends=('git')
|
||||
depends=('berry-git'
|
||||
'alacritty' 'thunar' 'geany'
|
||||
'rofi' 'polybar' 'dunst'
|
||||
'mpd' 'mpc'
|
||||
'maim' 'xclip' 'viewnior'
|
||||
'ksuperkey'
|
||||
'betterlockscreen'
|
||||
'picom-ibhagwan-git'
|
||||
'xfce-polkit'
|
||||
'xfce4-power-manager'
|
||||
'sxhkd'
|
||||
'hsetroot')
|
||||
conflicts=()
|
||||
provides=("${pkgname}")
|
||||
options=(!strip !emptydirs)
|
||||
install="${pkgname}.install"
|
||||
|
||||
prepare() {
|
||||
cp -af ../files/. ${srcdir}
|
||||
}
|
||||
|
||||
package() {
|
||||
local _config=${pkgdir}/etc/skel/.config/berry
|
||||
mkdir -p "$_config"
|
||||
|
||||
# Copy i3wm config files
|
||||
cp -r ${srcdir}/alacritty "$_config"
|
||||
cp -r ${srcdir}/bin "$_config"
|
||||
cp -r ${srcdir}/polybar "$_config"
|
||||
cp -r ${srcdir}/rofi "$_config"
|
||||
cp -r ${srcdir}/wallpapers "$_config"
|
||||
|
||||
chmod +x "$_config"/bin/*
|
||||
chmod +x "$_config"/rofi/bin/*
|
||||
|
||||
install -Dm 755 autostart "$_config"/autostart
|
||||
install -Dm 644 dunstrc "$_config"/dunstrc
|
||||
install -Dm 644 picom.conf "$_config"/picom.conf
|
||||
install -Dm 644 sxhkdrc "$_config"/sxhkdrc
|
||||
|
||||
install -Dm 644 berry.desktop ${pkgdir}/usr/share/xsessions/berry.desktop
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
post_install() {
|
||||
local _user=`echo ${SUDO_USER:-$(whoami)}`
|
||||
local _gid=`echo ${SUDO_GID}`
|
||||
local _group=`cat /etc/group | grep ${_gid} | cut -d: -f1 | head -1`
|
||||
local _dir="/home/${_user}/.config"
|
||||
|
||||
if [[ ! -d "${_dir}/berry" ]]; then
|
||||
echo -e "\n[*] Copying berry config files into ${_dir}..."
|
||||
mkdir -p ${_dir}/berry
|
||||
cp -rf /etc/skel/.config/berry/* ${_dir}/berry/
|
||||
chown -R ${_user}:${_group} ${_dir}/berry
|
||||
if [[ -d "${_dir}/berry" ]]; then
|
||||
echo -e "[*] Done!\n"
|
||||
else
|
||||
echo -e "[*] Failed!\n"
|
||||
fi
|
||||
else
|
||||
echo -e "\n[*] Configurations for berry already exist in your config dir.\n Please copy the config files manually from '/etc/skel/.config/berry' before you login into berry.\n"
|
||||
fi
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
## Script Termination
|
||||
exit_on_signal_SIGINT () {
|
||||
{ printf "\n\n%s\n" "Script interrupted." 2>&1; echo; }
|
||||
exit 0
|
||||
}
|
||||
|
||||
exit_on_signal_SIGTERM () {
|
||||
{ printf "\n\n%s\n" "Script terminated." 2>&1; echo; }
|
||||
exit 0
|
||||
}
|
||||
|
||||
trap exit_on_signal_SIGINT SIGINT
|
||||
trap exit_on_signal_SIGTERM SIGTERM
|
||||
|
||||
# Build packages
|
||||
build_pkg () {
|
||||
echo -e "\nBuilding Package - \n"
|
||||
makepkg -s && rm -rf src pkg
|
||||
|
||||
RDIR='../packages/x86_64'
|
||||
if [[ -d "$RDIR" ]]; then
|
||||
mv -f *.pkg.tar.zst "$RDIR"
|
||||
echo -e "\nPackage moved to Repository.\n[!] Don't forget to update the database.\n"
|
||||
fi
|
||||
}
|
||||
|
||||
# Execute
|
||||
build_pkg
|
||||
Executable
+37
@@ -0,0 +1,37 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Repository cleanup
|
||||
|
||||
branch="`git branch --show-current`"
|
||||
|
||||
echo "Cleaning up repository..."
|
||||
|
||||
# Backup config & remove git dir
|
||||
echo "Backing up config & deleting git dir..."
|
||||
mv .git/config config
|
||||
rm -rf .git
|
||||
|
||||
# Setup git
|
||||
echo "Setting up git repository..."
|
||||
git config --global init.defaultBranch "$branch"
|
||||
git init
|
||||
git config --global user.name "adi1090x"
|
||||
git config --global user.email "adi1090x@gmail.com"
|
||||
sudo git config --system core.editor vim
|
||||
git config --global credential.helper cache
|
||||
git config --global credential.helper 'cache --timeout=25000'
|
||||
git config --global push.default simple
|
||||
echo "Git repository setup complete!"
|
||||
|
||||
# Move config to git again & push changes to repository
|
||||
echo "Moving config to git dir & push changes..."
|
||||
mv config .git/config
|
||||
|
||||
git add --all .
|
||||
read -p "Enter Commit Message: " cmt
|
||||
git commit -m "$cmt"
|
||||
|
||||
git remote add origin https://github.com/archcraft-os/archcraft-berry
|
||||
git push --force --set-upstream origin "$branch"
|
||||
|
||||
echo "Clean up completed."
|
||||
@@ -0,0 +1,48 @@
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
## Configuration for Alacritty, the GPU enhanced terminal emulator.
|
||||
## It's a very basic and simple config file, for full configuration...
|
||||
## See, /usr/share/doc/alacritty/example/alacritty.yml
|
||||
|
||||
## Import files (Colors, Fonts, Etc)
|
||||
import:
|
||||
- ~/.config/berry/alacritty/colors.yml
|
||||
- ~/.config/berry/alacritty/fonts.yml
|
||||
|
||||
## Set environment variables
|
||||
env:
|
||||
TERM: alacritty
|
||||
WINIT_X11_SCALE_FACTOR: '1.0'
|
||||
|
||||
## Terminal window settings
|
||||
window:
|
||||
dimensions:
|
||||
columns: 84
|
||||
lines: 24
|
||||
|
||||
padding:
|
||||
x: 25
|
||||
y: 25
|
||||
|
||||
decorations: full
|
||||
startup_mode: Windowed
|
||||
dynamic_title: true
|
||||
|
||||
## scrolling
|
||||
history: 10000
|
||||
multiplier: 3
|
||||
|
||||
## Background opacity
|
||||
opacity: 1.0
|
||||
|
||||
## Cursor
|
||||
cursor:
|
||||
style:
|
||||
shape: Block
|
||||
blinking: On
|
||||
|
||||
unfocused_hollow: false
|
||||
|
||||
## Live config reload
|
||||
live_config_reload: true
|
||||
@@ -0,0 +1,31 @@
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
## Colors configuration
|
||||
colors:
|
||||
# Default colors
|
||||
primary:
|
||||
background: '#011826'
|
||||
foreground: '#EEEEEE'
|
||||
|
||||
# Normal colors
|
||||
normal:
|
||||
black: '#152B42'
|
||||
red: '#D97E96'
|
||||
green: '#498653'
|
||||
yellow: '#838649'
|
||||
blue: '#496886'
|
||||
magenta: '#A36584'
|
||||
cyan: '#50A6A8'
|
||||
white: '#ABB2BF'
|
||||
|
||||
# Bright colors
|
||||
bright:
|
||||
black: '#1E3C5A'
|
||||
red: '#D97E96'
|
||||
green: '#498653'
|
||||
yellow: '#838649'
|
||||
blue: '#496886'
|
||||
magenta: '#A36584'
|
||||
cyan: '#50A6A8'
|
||||
white: '#B5BCC9'
|
||||
@@ -0,0 +1,37 @@
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
# Font configuration
|
||||
font:
|
||||
# Normal (roman) font face
|
||||
normal:
|
||||
family: "JetBrainsMono Nerd Font"
|
||||
#style: Regular
|
||||
|
||||
# Bold font face
|
||||
bold:
|
||||
family: "JetBrainsMono Nerd Font"
|
||||
#style: Bold
|
||||
|
||||
# Italic font face
|
||||
italic:
|
||||
family: "JetBrainsMono Nerd Font"
|
||||
#style: Italic
|
||||
|
||||
# Bold italic font face
|
||||
bold_italic:
|
||||
family: "JetBrainsMono Nerd Font"
|
||||
#style: Bold Italic
|
||||
|
||||
# Point size
|
||||
size: 10
|
||||
|
||||
# Offset
|
||||
#offset:
|
||||
# x: 0
|
||||
# y: 0
|
||||
|
||||
# Glyph offset
|
||||
#glyph_offset:
|
||||
# x: 0
|
||||
# y: 0
|
||||
Executable
+36
@@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
##
|
||||
## Config file for berry WM
|
||||
|
||||
## Berry Configs -----------------------------------------------
|
||||
|
||||
# Set decoration geometry
|
||||
berryc border_width 0
|
||||
berryc inner_border_width 4
|
||||
berryc title_height 30
|
||||
#berryc top_gap 82
|
||||
berryc edge_gap 82 20 20 20
|
||||
|
||||
# Set decoration colors
|
||||
berryc focus_color 292D3E
|
||||
berryc unfocus_color 292D3E
|
||||
berryc inner_focus_color D97E96
|
||||
berryc inner_unfocus_color 496886
|
||||
berryc text_focus_color FFFFFF
|
||||
berryc text_unfocus_color 011826
|
||||
|
||||
# Other options
|
||||
berryc set_font "Iosevka-10"
|
||||
berryc smart_place "true"
|
||||
berryc draw_text "true"
|
||||
berryc edge_lock "true"
|
||||
berryc json_status "true"
|
||||
berryc decorate_new "true"
|
||||
berryc pointer_interval 0
|
||||
berryc manage Dialog|Toolbar|Menu|Splash|Utility
|
||||
|
||||
## Autostart Programs ------------------------------------------
|
||||
bash "$HOME"/.config/berry/bin/autostart.sh
|
||||
@@ -0,0 +1,6 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Name=berry
|
||||
Comment=A healthy, bite-sized window manager written in C
|
||||
Exec=berry
|
||||
Type=XSession
|
||||
Executable
+11
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
rofi -dmenu\
|
||||
-password\
|
||||
-i\
|
||||
-no-fixed-num-lines\
|
||||
-p "User Password: "\
|
||||
-theme ~/.config/berry/rofi/themes/askpass.rasi &
|
||||
Executable
+10
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
## rofi sudo askpass helper
|
||||
export SUDO_ASKPASS=~/.config/berry/bin/askpass.sh
|
||||
|
||||
## execute the application
|
||||
sudo -A $1
|
||||
Executable
+44
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
## Autostart Programs
|
||||
|
||||
# Kill already running process
|
||||
_ps=(sxhkd polybar picom dunst ksuperkey mpd xfce-polkit xfce4-power-manager)
|
||||
for _prs in "${_ps[@]}"; do
|
||||
if [[ `pidof ${_prs}` ]]; then
|
||||
killall -9 ${_prs}
|
||||
fi
|
||||
done
|
||||
|
||||
# Fix cursor
|
||||
xsetroot -cursor_name left_ptr
|
||||
|
||||
# Polkit agent
|
||||
/usr/lib/xfce-polkit/xfce-polkit &
|
||||
|
||||
# Enable power management
|
||||
xfce4-power-manager &
|
||||
|
||||
## Enable Super Keys For Menu
|
||||
sxhkd -c ~/.config/berry/sxhkdrc &
|
||||
|
||||
# Enable Super Keys For Menu
|
||||
ksuperkey -e 'Super_L=Alt_L|F1' &
|
||||
ksuperkey -e 'Super_R=Alt_L|F1' &
|
||||
|
||||
# Set/Restore wallpaper
|
||||
hsetroot -cover ~/.config/berry/wallpapers/default.jpg
|
||||
|
||||
# Lauch polybar
|
||||
~/.config/berry/bin/berrybar.sh
|
||||
|
||||
# Lauch notification daemon
|
||||
~/.config/berry/bin/berrydunst.sh
|
||||
|
||||
# Lauch compositor
|
||||
~/.config/berry/bin/berrycomp.sh
|
||||
|
||||
# Start mpd
|
||||
exec mpd &
|
||||
Executable
+67
@@ -0,0 +1,67 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
## Files and Directories
|
||||
DIR="$HOME/.config/berry/polybar"
|
||||
SFILE="$DIR/system"
|
||||
RFILE="$DIR/.system"
|
||||
MFILE="$DIR/.module"
|
||||
|
||||
## Get system variable values for various modules
|
||||
get_values() {
|
||||
CARD=$(light -L | grep 'backlight' | head -n1 | cut -d'/' -f3)
|
||||
BATTERY=$(upower -i `upower -e | grep 'BAT'` | grep 'native-path' | cut -d':' -f2 | tr -d '[:blank:]')
|
||||
ADAPTER=$(upower -i `upower -e | grep 'AC'` | grep 'native-path' | cut -d':' -f2 | tr -d '[:blank:]')
|
||||
INTERFACE=$(ip link | awk '/state UP/ {print $2}' | tr -d :)
|
||||
}
|
||||
|
||||
## Write values to `system` file
|
||||
set_values() {
|
||||
if [[ "$ADAPTER" ]]; then
|
||||
sed -i -e "s/adapter = .*/adapter = $ADAPTER/g" ${SFILE}
|
||||
fi
|
||||
if [[ "$BATTERY" ]]; then
|
||||
sed -i -e "s/battery = .*/battery = $BATTERY/g" ${SFILE}
|
||||
fi
|
||||
if [[ "$CARD" ]]; then
|
||||
sed -i -e "s/graphics_card = .*/graphics_card = $CARD/g" ${SFILE}
|
||||
fi
|
||||
if [[ "$INTERFACE" ]]; then
|
||||
sed -i -e "s/network_interface = .*/network_interface = $INTERFACE/g" ${SFILE}
|
||||
fi
|
||||
}
|
||||
|
||||
## Launch Polybar with selected style
|
||||
launch_bar() {
|
||||
CARD=$(light -L | grep 'backlight' | head -n1 | cut -d'/' -f3)
|
||||
INTERFACE=$(ip link | awk '/state UP/ {print $2}' | tr -d :)
|
||||
|
||||
if [[ ! -f "$MFILE" ]]; then
|
||||
if [[ -z "$CARD" ]]; then
|
||||
sed -i -e 's/backlight/bna/g' "$DIR"/config
|
||||
elif [[ "$CARD" != *"intel_"* ]]; then
|
||||
sed -i -e 's/backlight/brightness/g' "$DIR"/config
|
||||
fi
|
||||
|
||||
if [[ "$INTERFACE" == e* ]]; then
|
||||
sed -i -e 's/network/ethernet/g' "$DIR"/config
|
||||
fi
|
||||
touch "$MFILE"
|
||||
fi
|
||||
|
||||
if [[ ! `pidof polybar` ]]; then
|
||||
polybar -q main -c "$DIR"/config &
|
||||
else
|
||||
polybar-msg cmd restart
|
||||
fi
|
||||
}
|
||||
|
||||
# Execute functions
|
||||
if [[ ! -f "$RFILE" ]]; then
|
||||
get_values
|
||||
set_values
|
||||
touch ${RFILE}
|
||||
fi
|
||||
launch_bar
|
||||
Executable
+13
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
# Terminate if picom is already running
|
||||
killall -q picom
|
||||
|
||||
# Wait until the processes have been shut down
|
||||
while pgrep -u $UID -x picom >/dev/null; do sleep 1; done
|
||||
|
||||
# Launch picom
|
||||
picom --config ~/.config/berry/picom.conf &
|
||||
Executable
+11
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
## Launch dunst daemon
|
||||
if [[ `pidof dunst` ]]; then
|
||||
pkill dunst
|
||||
fi
|
||||
|
||||
dunst -config ~/.config/berry/dunstrc &
|
||||
Executable
+16
@@ -0,0 +1,16 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
## launch alacritty with berry config
|
||||
|
||||
CONFIG="$HOME/.config/berry/alacritty/alacritty.yml"
|
||||
|
||||
if [ "$1" == "-f" ]; then
|
||||
alacritty --class 'alacritty-float,alacritty-float' --config-file "$CONFIG"
|
||||
elif [ "$1" == "-s" ]; then
|
||||
alacritty --class 'Fullscreen,Fullscreen' --config-file "$CONFIG" -o window.startup_mode=fullscreen window.padding.x=30 window.padding.y=30 window.opacity=0.95 font.size=14
|
||||
else
|
||||
alacritty --config-file "$CONFIG"
|
||||
fi
|
||||
@@ -0,0 +1,54 @@
|
||||
[global]
|
||||
monitor = 0
|
||||
follow = mouse
|
||||
width = 300
|
||||
height = 80
|
||||
origin = top-right
|
||||
offset = 20x82
|
||||
scale = 0
|
||||
indicate_hidden = yes
|
||||
shrink = no
|
||||
separator_height = 4
|
||||
separator_color = auto
|
||||
padding = 15
|
||||
horizontal_padding = 15
|
||||
frame_width = 0
|
||||
sort = no
|
||||
idle_threshold = 120
|
||||
font = JetBrains Mono Medium 10
|
||||
line_height = 4
|
||||
markup = full
|
||||
format = %s\n%b
|
||||
alignment = left
|
||||
show_age_threshold = 60
|
||||
word_wrap = yes
|
||||
ignore_newline = no
|
||||
stack_duplicates = false
|
||||
hide_duplicate_count = yes
|
||||
show_indicators = no
|
||||
icon_position = left
|
||||
max_icon_size = 48
|
||||
sticky_history = yes
|
||||
history_length = 20
|
||||
browser = x-www-browser -new-tab
|
||||
always_run_script = true
|
||||
title = Dunst
|
||||
class = Dunst
|
||||
|
||||
[urgency_low]
|
||||
timeout = 2
|
||||
background = "#0A2332"
|
||||
foreground = "#EEEEEE"
|
||||
frame_color = "#EEEEEE"
|
||||
|
||||
[urgency_normal]
|
||||
timeout = 5
|
||||
background = "#0A2332"
|
||||
foreground = "#EEEEEE"
|
||||
frame_color = "#EEEEEE"
|
||||
|
||||
[urgency_critical]
|
||||
timeout = 0
|
||||
background = "#0A2332"
|
||||
foreground = "#D97E96"
|
||||
frame_color = "#D97E96"
|
||||
@@ -0,0 +1,134 @@
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
#========================= Shadows =========================#
|
||||
|
||||
shadow = true;
|
||||
shadow-radius = 14;
|
||||
shadow-opacity = 0.30;
|
||||
shadow-offset-x = -14;
|
||||
shadow-offset-y = -14;
|
||||
|
||||
shadow-exclude = [
|
||||
"class_g = 'Cairo-clock'",
|
||||
"class_g = 'CoverGloobus'",
|
||||
"class_g = 'Tilda'",
|
||||
"name ?= 'gnome-pie'",
|
||||
# "class_g = 'Dmenu'",
|
||||
# "class_g ?= 'rofi'",
|
||||
# "class_g ?= 'polybar'",
|
||||
# "name *= 'Eww'",
|
||||
"class_g ?= 'Plank'",
|
||||
"name *= 'recordmydesktop'",
|
||||
"name = 'Notification'",
|
||||
"name = 'Docky'",
|
||||
"name = 'Kupfer'",
|
||||
"name = 'xfce4-notifyd'",
|
||||
"name *= 'VLC'",
|
||||
"name *= 'Chromium'",
|
||||
"name *= 'Chrome'",
|
||||
"class_g = 'Conky'",
|
||||
"class_g = 'Kupfer'",
|
||||
"class_g = 'Synapse'",
|
||||
"class_g ?= 'Notify-osd'",
|
||||
"class_g ?= 'Cairo-dock'",
|
||||
"class_g ?= 'Xfce4-notifyd'",
|
||||
"class_g ?= 'Xfce4-power-manager'",
|
||||
"_GTK_FRAME_EXTENTS@:c",
|
||||
"_NET_WM_STATE@:32a *= '_NET_WM_STATE_HIDDEN'"
|
||||
];
|
||||
|
||||
#========================= Corners =========================#
|
||||
|
||||
corner-radius: 12;
|
||||
rounded-corners-exclude = [
|
||||
# "name *= 'Eww'",
|
||||
# "class_g ?= 'rofi'",
|
||||
# "class_g ?= 'polybar'",
|
||||
];
|
||||
|
||||
#========================= Fading =========================#
|
||||
|
||||
fading = true;
|
||||
fade-in-step = 0.03;
|
||||
fade-out-step = 0.03;
|
||||
fade-delta = 5;
|
||||
|
||||
fade-exclude = [
|
||||
"class_g = 'slop'" # maim
|
||||
]
|
||||
|
||||
no-fading-openclose = false
|
||||
no-fading-destroyed-argb = true
|
||||
|
||||
#========================= Opacity =========================#
|
||||
|
||||
inactive-opacity = 1;
|
||||
frame-opacity = 1.0;
|
||||
inactive-opacity-override = false;
|
||||
active-opacity = 1.0;
|
||||
#inactive-dim = 0.5
|
||||
|
||||
focus-exclude = [
|
||||
"class_g = 'Cairo-clock'",
|
||||
"class_g = 'Bar'", # lemonbar
|
||||
"class_g = 'slop'" # maim
|
||||
];
|
||||
|
||||
opacity-rule = [
|
||||
"100:class_g = 'Bar'", # lemonbar
|
||||
"100:class_g = 'slop'", # maim
|
||||
"100:class_g = 'XTerm'",
|
||||
"100:class_g = 'URxvt'",
|
||||
"100:class_g = 'kitty'",
|
||||
"100:class_g = 'Alacritty'",
|
||||
"100:class_g = 'Polybar'",
|
||||
"100:class_g = 'code-oss'",
|
||||
"100:class_g = 'Meld'",
|
||||
"100:class_g = 'TelegramDesktop'",
|
||||
"100:class_g = 'Joplin'",
|
||||
"100:class_g = 'firefox'",
|
||||
"100:class_g = 'Thunderbird'"
|
||||
];
|
||||
|
||||
#========================= Blurring =========================#
|
||||
|
||||
blur: {
|
||||
method = "none";
|
||||
strength = 0;
|
||||
background = false;
|
||||
background-frame = false;
|
||||
background-fixed = false;
|
||||
kern = "3x3box";
|
||||
}
|
||||
|
||||
# Exclude conditions for background blur.
|
||||
blur-background-exclude = [
|
||||
"window_type = 'dock'",
|
||||
"window_type = 'desktop'",
|
||||
"class_g = 'Plank'",
|
||||
"class_g = 'slop'",
|
||||
"_GTK_FRAME_EXTENTS@:c"
|
||||
];
|
||||
|
||||
#========================= General Settings =========================#
|
||||
backend = "glx";
|
||||
#backend = "xrender";
|
||||
vsync = true
|
||||
mark-wmwin-focused = true;
|
||||
mark-ovredir-focused = true;
|
||||
detect-rounded-corners = true;
|
||||
detect-client-opacity = true;
|
||||
refresh-rate = 0;
|
||||
detect-transient = true;
|
||||
detect-client-leader = true;
|
||||
use-damage = true;
|
||||
log-level = "warn";
|
||||
|
||||
wintypes:
|
||||
{
|
||||
tooltip = { fade=true; shadow=true; opacity=0.95; focus=true; full-shadow=false; };
|
||||
popup_menu = { opacity=1.0; }
|
||||
dropdown_menu = { opacity=1.0; }
|
||||
utility = { shadow=false; opacity=1.0; }
|
||||
};
|
||||
@@ -0,0 +1,18 @@
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
||||
|
||||
[color]
|
||||
BG = #011826
|
||||
BGL = #193241
|
||||
BGA = #656565
|
||||
FG = #EEEEEE
|
||||
|
||||
pink = #D97E96
|
||||
magenta = #A36584
|
||||
purple = #635373
|
||||
blue = #496886
|
||||
slate = #152B42
|
||||
gray = #1A2133
|
||||
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
||||
@@ -0,0 +1,320 @@
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
||||
|
||||
;; Global WM Settings
|
||||
|
||||
[global/wm]
|
||||
; Adjust the _NET_WM_STRUT_PARTIAL top value
|
||||
; Used for top aligned bars
|
||||
margin-bottom = 0
|
||||
|
||||
; Adjust the _NET_WM_STRUT_PARTIAL bottom value
|
||||
; Used for bottom aligned bars
|
||||
margin-top = 0
|
||||
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
||||
|
||||
;; File Inclusion
|
||||
; include an external file, like module file, etc.
|
||||
|
||||
include-file = ~/.config/berry/polybar/system
|
||||
|
||||
include-file = ~/.config/berry/polybar/colors
|
||||
include-file = ~/.config/berry/polybar/modules
|
||||
include-file = ~/.config/berry/polybar/decor
|
||||
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
||||
|
||||
;; Bar Settings
|
||||
|
||||
[bar/main]
|
||||
; Use either of the following command to list available outputs:
|
||||
; If unspecified, the application will pick the first one it finds.
|
||||
; $ polybar -m | cut -d ':' -f 1
|
||||
; $ xrandr -q | grep " connected" | cut -d ' ' -f1
|
||||
monitor =
|
||||
|
||||
; Use the specified monitor as a fallback if the main one is not found.
|
||||
monitor-fallback =
|
||||
|
||||
; Require the monitor to be in connected state
|
||||
; XRandR sometimes reports my monitor as being disconnected (when in use)
|
||||
monitor-strict = false
|
||||
|
||||
; Tell the Window Manager not to configure the window.
|
||||
; Use this to detach the bar if your WM is locking its size/position.
|
||||
override-redirect = false
|
||||
|
||||
; Put the bar at the bottom of the screen
|
||||
bottom = false
|
||||
|
||||
; Prefer fixed center position for the `modules-center` block
|
||||
; When false, the center position will be based on the size of the other blocks.
|
||||
fixed-center = true
|
||||
|
||||
; Dimension defined as pixel value (e.g. 35) or percentage (e.g. 50%),
|
||||
; the percentage can optionally be extended with a pixel offset like so:
|
||||
; 50%:-10, this will result in a width or height of 50% minus 10 pixels
|
||||
width = 98%
|
||||
height = 40
|
||||
|
||||
; Offset defined as pixel value (e.g. 35) or percentage (e.g. 50%)
|
||||
; the percentage can optionally be extended with a pixel offset like so:
|
||||
; 50%:-10, this will result in an offset in the x or y direction
|
||||
; of 50% minus 10 pixels
|
||||
offset-x = 1%
|
||||
offset-y = 2%
|
||||
|
||||
; Background ARGB color (e.g. #f00, #ff992a, #ddff1023)
|
||||
background = ${color.BG}
|
||||
|
||||
; Foreground ARGB color (e.g. #f00, #ff992a, #ddff1023)
|
||||
foreground = ${color.FG}
|
||||
|
||||
; Background gradient (vertical steps)
|
||||
; background-[0-9]+ = #aarrggbb
|
||||
;;background-0 =
|
||||
|
||||
; Value used for drawing rounded corners
|
||||
; Note: This shouldn't be used together with border-size because the border
|
||||
; doesn't get rounded
|
||||
; Individual top/bottom values can be defined using:
|
||||
; radius-{top,bottom}
|
||||
radius = 20.0
|
||||
#radius-top = 10.0
|
||||
#radius-bottom = 10.0
|
||||
|
||||
; Under-/overline pixel size and argb color
|
||||
; Individual values can be defined using:
|
||||
; {overline,underline}-size
|
||||
; {overline,underline}-color
|
||||
line-size = 2
|
||||
line-color = ${color.AC}
|
||||
|
||||
; Values applied to all borders
|
||||
; Individual side values can be defined using:
|
||||
; border-{left,top,right,bottom}-size
|
||||
; border-{left,top,right,bottom}-color
|
||||
; The top and bottom borders are added to the bar height, so the effective
|
||||
; window height is:
|
||||
; height + border-top-size + border-bottom-size
|
||||
; Meanwhile the effective window width is defined entirely by the width key and
|
||||
; the border is placed withing this area. So you effectively only have the
|
||||
; following horizontal space on the bar:
|
||||
; width - border-right-size - border-left-size
|
||||
border-bottom-size = 0
|
||||
border-color = ${color.FG}
|
||||
|
||||
; Number of spaces to add at the beginning/end of the bar
|
||||
; Individual side values can be defined using:
|
||||
; padding-{left,right}
|
||||
padding = 2
|
||||
|
||||
; Number of spaces to add before/after each module
|
||||
; Individual side values can be defined using:
|
||||
; module-margin-{left,right}
|
||||
module-margin-left = 1
|
||||
module-margin-right = 1
|
||||
|
||||
; Fonts are defined using <font-name>;<vertical-offset>
|
||||
; Font names are specified using a fontconfig pattern.
|
||||
; font-0 = "JetBrains Mono:size=10;3"
|
||||
; font-1 = MaterialIcons:size=10
|
||||
; font-2 = Termsynu:size=8;-1
|
||||
; font-3 = FontAwesome:size=10
|
||||
; See the Fonts wiki page for more details
|
||||
|
||||
; text
|
||||
font-0 = "JetBrains Mono:size=10;4"
|
||||
; icons
|
||||
font-1 = "Iosevka Nerd Font:size=12;4"
|
||||
; glyphs
|
||||
font-2 = "Iosevka Nerd Font:size=22;5"
|
||||
; dot
|
||||
font-3 = "Iosevka Nerd Font:size=10;4"
|
||||
; clock & mpd
|
||||
font-4 = "Iosevka:style=bold:size=12;4"
|
||||
; Archcraft
|
||||
font-5 = "archcraft:size=12;3"
|
||||
|
||||
; Modules are added to one of the available blocks
|
||||
; modules-left = cpu ram
|
||||
; modules-center = xwindow xbrightness
|
||||
; modules-right = ipc clock
|
||||
|
||||
# Default
|
||||
modules-left = date dot mpd
|
||||
modules-center = berrywm
|
||||
modules-right = volume backlight network battery dot sysmenu
|
||||
|
||||
# Alternate
|
||||
;modules-left = openbox 2LD cpu 3LD memory 4LD filesystem 5LD
|
||||
;modules-center = mpd
|
||||
;modules-right = 2RD volume 3RD brightness 4RD battery 5RD network 6RD date sep
|
||||
|
||||
; The separator will be inserted between the output of each module
|
||||
separator =
|
||||
|
||||
; This value is used to add extra spacing between elements
|
||||
; @deprecated: This parameter will be removed in an upcoming version
|
||||
spacing = 0
|
||||
|
||||
; Opacity value between 0.0 and 1.0 used on fade in/out
|
||||
dim-value = 1.0
|
||||
|
||||
; Value to be used to set the WM_NAME atom
|
||||
; If the value is empty or undefined, the atom value
|
||||
; will be created from the following template: polybar-[BAR]_[MONITOR]
|
||||
; NOTE: The placeholders are not available for custom values
|
||||
wm-name =
|
||||
|
||||
; Locale used to localize various module data (e.g. date)
|
||||
; Expects a valid libc locale, for example: sv_SE.UTF-8
|
||||
locale =
|
||||
|
||||
; Position of the system tray window
|
||||
; If empty or undefined, tray support will be disabled
|
||||
; NOTE: A center aligned tray will cover center aligned modules
|
||||
;
|
||||
; Available positions:
|
||||
; left
|
||||
; center
|
||||
; right
|
||||
; none
|
||||
tray-position = right
|
||||
|
||||
; If true, the bar will not shift its
|
||||
; contents when the tray changes
|
||||
tray-detached = false
|
||||
|
||||
; Tray icon max size
|
||||
tray-maxsize = 16
|
||||
|
||||
; DEPRECATED! Since 3.3.0 the tray always uses pseudo-transparency
|
||||
; Enable pseudo transparency
|
||||
; Will automatically be enabled if a fully transparent
|
||||
; background color is defined using `tray-background`
|
||||
; tray-transparent = false
|
||||
|
||||
; Background color for the tray container
|
||||
; ARGB color (e.g. #f00, #ff992a, #ddff1023)
|
||||
; By default the tray container will use the bar
|
||||
; background color.
|
||||
tray-background = ${color.BG}
|
||||
|
||||
; Tray offset defined as pixel value (e.g. 35) or percentage (e.g. 50%)
|
||||
tray-offset-x = 10
|
||||
tray-offset-y = 0
|
||||
|
||||
; Pad the sides of each tray icon
|
||||
tray-padding = 0
|
||||
|
||||
; Scale factor for tray clients
|
||||
tray-scale = 1.0
|
||||
|
||||
; Restack the bar window and put it above the
|
||||
; selected window manager's root
|
||||
;
|
||||
; Fixes the issue where the bar is being drawn
|
||||
; on top of fullscreen window's
|
||||
;
|
||||
; Currently supported WM's:
|
||||
; bspwm
|
||||
; i3 (requires: `override-redirect = true`)
|
||||
; wm-restack =
|
||||
|
||||
; Set a DPI values used when rendering text
|
||||
; This only affects scalable fonts
|
||||
; dpi =
|
||||
|
||||
; Enable support for inter-process messaging
|
||||
; See the Messaging wiki page for more details.
|
||||
enable-ipc = true
|
||||
|
||||
; Fallback click handlers that will be called if
|
||||
; there's no matching module handler found.
|
||||
click-left =
|
||||
click-middle =
|
||||
click-right =
|
||||
scroll-up =
|
||||
scroll-down =
|
||||
double-click-left =
|
||||
double-click-middle =
|
||||
double-click-right =
|
||||
|
||||
; Requires polybar to be built with xcursor support (xcb-util-cursor)
|
||||
; Possible values are:
|
||||
; - default : The default pointer as before, can also be an empty string (default)
|
||||
; - pointer : Typically in the form of a hand
|
||||
; - ns-resize : Up and down arrows, can be used to indicate scrolling
|
||||
cursor-click =
|
||||
cursor-scroll =
|
||||
|
||||
;; WM Workspace Specific
|
||||
|
||||
; bspwm
|
||||
;;scroll-up = bspwm-desknext
|
||||
;;scroll-down = bspwm-deskprev
|
||||
;;scroll-up = bspc desktop -f prev.local
|
||||
;;scroll-down = bspc desktop -f next.local
|
||||
|
||||
;i3
|
||||
;;scroll-up = i3wm-wsnext
|
||||
;;scroll-down = i3wm-wsprev
|
||||
;;scroll-up = i3-msg workspace next_on_output
|
||||
;;scroll-down = i3-msg workspace prev_on_output
|
||||
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
||||
|
||||
;; Application Settings
|
||||
|
||||
[settings]
|
||||
; The throttle settings lets the eventloop swallow up til X events
|
||||
; if they happen within Y millisecond after first event was received.
|
||||
; This is done to prevent flood of update event.
|
||||
;
|
||||
; For example if 5 modules emit an update event at the same time, we really
|
||||
; just care about the last one. But if we wait too long for events to swallow
|
||||
; the bar would appear sluggish so we continue if timeout
|
||||
; expires or limit is reached.
|
||||
throttle-output = 5
|
||||
throttle-output-for = 10
|
||||
|
||||
; Time in milliseconds that the input handler will wait between processing events
|
||||
;throttle-input-for = 30
|
||||
|
||||
; Reload upon receiving XCB_RANDR_SCREEN_CHANGE_NOTIFY events
|
||||
screenchange-reload = false
|
||||
|
||||
; Compositing operators
|
||||
; @see: https://www.cairographics.org/manual/cairo-cairo-t.html#cairo-operator-t
|
||||
compositing-background = source
|
||||
compositing-foreground = over
|
||||
compositing-overline = over
|
||||
compositing-underline = over
|
||||
compositing-border = over
|
||||
|
||||
; Define fallback values used by all module formats
|
||||
;format-foreground =
|
||||
;format-background =
|
||||
;format-underline =
|
||||
;format-overline =
|
||||
;format-spacing =
|
||||
;format-padding =
|
||||
;format-margin =
|
||||
;format-offset =
|
||||
|
||||
; Enables pseudo-transparency for the bar
|
||||
; If set to true the bar can be transparent without a compositor.
|
||||
pseudo-transparency = false
|
||||
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
||||
;; __________ ______
|
||||
;; / ____/ __ \/ ____/
|
||||
;; / __/ / / / / /_
|
||||
;; / /___/ /_/ / __/
|
||||
;; /_____/\____/_/
|
||||
;;
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
;; DECOR _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
||||
|
||||
[module/sep]
|
||||
type = custom/text
|
||||
content = "--"
|
||||
|
||||
content-background = ${color.BG}
|
||||
content-foreground = ${color.BG}
|
||||
|
||||
;; Dots
|
||||
|
||||
[module/dot]
|
||||
type = custom/text
|
||||
content =
|
||||
content-foreground = ${color.BGL}
|
||||
content-padding = 0
|
||||
content-font = 4
|
||||
|
||||
[module/dot-alt]
|
||||
inherit = module/dot
|
||||
content-foreground = ${color.BLUEGRAY}
|
||||
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
||||
|
||||
[module/LD]
|
||||
type = custom/text
|
||||
content = "%{T3}%{T-}"
|
||||
content-background = ${color.BG}
|
||||
content-foreground = ${color.BGL}
|
||||
|
||||
[module/RD]
|
||||
type = custom/text
|
||||
content = "%{T3}%{T-}"
|
||||
content-background = ${color.BG}
|
||||
content-foreground = ${color.BGL}
|
||||
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
||||
|
||||
[module/LD1]
|
||||
type = custom/text
|
||||
content = "%{T3}%{T-}"
|
||||
content-background = ${color.BG}
|
||||
content-foreground = ${color.WHITE}
|
||||
|
||||
[module/RD1]
|
||||
type = custom/text
|
||||
content = "%{T3}%{T-}"
|
||||
content-background = ${color.BG}
|
||||
content-foreground = ${color.WHITE}
|
||||
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
||||
;; __________ ______
|
||||
;; / ____/ __ \/ ____/
|
||||
;; / __/ / / / / /_
|
||||
;; / /___/ /_/ / __/
|
||||
;; /_____/\____/_/
|
||||
;;
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,28 @@
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
||||
;;
|
||||
;; System Variables (Edit according to your system)
|
||||
;;
|
||||
;; Warning : DO NOT DELETE THIS FILE
|
||||
;;
|
||||
;; Run `ls -1 /sys/class/power_supply/` to list list batteries and adapters.
|
||||
;;
|
||||
;; Run `ls -1 /sys/class/backlight/` to list available graphics cards.
|
||||
;;
|
||||
;; Run `ip link | awk '/state UP/ {print $2}' | tr -d :` to get active network interface.
|
||||
;;
|
||||
;; Polybar Variables For Modules :
|
||||
;; card = ${system.graphics_card}
|
||||
;; battery = ${system.battery}
|
||||
;; adapter = ${system.adapter}
|
||||
;; interface = ${system.network_interface}
|
||||
|
||||
[system]
|
||||
adapter = ACAD
|
||||
battery = BAT1
|
||||
graphics_card = amdgpu_bl0
|
||||
network_interface = wlan0
|
||||
|
||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
|
||||
Executable
+45
@@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
DIR="$HOME/.config/berry"
|
||||
|
||||
rofi_command="rofi -theme $DIR/rofi/themes/asroot.rasi"
|
||||
|
||||
# Apps
|
||||
terminal=" Alacritty"
|
||||
files=" Thunar"
|
||||
editor=" Geany"
|
||||
clifm=" Ranger"
|
||||
lpad=" Leafpad"
|
||||
vim=" Vim"
|
||||
|
||||
# Variable passed to rofi
|
||||
options="$terminal\n$files\n$editor\n$clifm\n$vim"
|
||||
|
||||
# Functions
|
||||
|
||||
chosen="$(echo -e "$options" | $rofi_command -p "Run as root" -dmenu -selected-row 0)"
|
||||
case $chosen in
|
||||
$terminal)
|
||||
"$DIR"/bin/asroot.sh 'alacritty --class alacritty-float,alacritty-float --config-file /root/.config/alacritty/alacritty.yml'
|
||||
;;
|
||||
$files)
|
||||
"$DIR"/bin/asroot.sh 'dbus-run-session thunar'
|
||||
;;
|
||||
$editor)
|
||||
"$DIR"/bin/asroot.sh geany
|
||||
;;
|
||||
$clifm)
|
||||
"$DIR"/bin/asroot.sh 'alacritty --class alacritty-float,alacritty-float --config-file /root/.config/alacritty/alacritty.yml -e ranger'
|
||||
;;
|
||||
$lpad)
|
||||
"$DIR"/bin/asroot.sh leafpad
|
||||
;;
|
||||
$vim)
|
||||
"$DIR"/bin/asroot.sh 'alacritty --class alacritty-float,alacritty-float --config-file /root/.config/alacritty/alacritty.yml -e vim'
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
Executable
+10
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
rofi -dmenu\
|
||||
-i\
|
||||
-no-fixed-num-lines\
|
||||
-p "Are You Sure? : "\
|
||||
-theme ~/.config/berry/rofi/themes/confirm.rasi
|
||||
Executable
+18
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
DIR="$HOME/.config/berry"
|
||||
|
||||
rofi \
|
||||
-show drun \
|
||||
-modi run,drun \
|
||||
-no-lazy-grab \
|
||||
-scroll-method 0 \
|
||||
-drun-match-fields all \
|
||||
-drun-display-format "{name}" \
|
||||
-no-drun-show-actions \
|
||||
-terminal alacritty \
|
||||
-kb-cancel Alt-F1 \
|
||||
-theme "$DIR"/rofi/themes/launcher.rasi
|
||||
Executable
+85
@@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
DIR="$HOME/.config/berry"
|
||||
|
||||
rofi_command="rofi -theme $DIR/rofi/themes/mpd.rasi"
|
||||
|
||||
button_music=''
|
||||
button_play=''
|
||||
button_pause=''
|
||||
button_stop=''
|
||||
button_next=''
|
||||
button_previous=''
|
||||
button_repeat=''
|
||||
button_shuffle=''
|
||||
button_error=''
|
||||
|
||||
# Colors
|
||||
active=""
|
||||
urgent=""
|
||||
|
||||
# Gets the current status of mpd
|
||||
status="$(mpc status)"
|
||||
|
||||
# Defines the Play / Pause option content
|
||||
if [[ $status == *"[playing]"* ]]; then
|
||||
toggle="$button_pause"
|
||||
else
|
||||
toggle="$button_play"
|
||||
fi
|
||||
|
||||
# Display if repeat mode is on / off
|
||||
tog_repeat="$button_repeat"
|
||||
if [[ $status == *"repeat: on"* ]]; then
|
||||
active="-a 4"
|
||||
elif [[ $status == *"repeat: off"* ]]; then
|
||||
urgent="-u 4"
|
||||
else
|
||||
tog_repeat="$button_error"
|
||||
fi
|
||||
|
||||
# Display if random mode is on / off
|
||||
tog_random="$button_shuffle"
|
||||
if [[ $status == *"random: on"* ]]; then
|
||||
[ -n "$active" ] && active+=",5" || active="-a 5"
|
||||
elif [[ $status == *"random: off"* ]]; then
|
||||
[ -n "$urgent" ] && urgent+=",5" || urgent="-u 5"
|
||||
else
|
||||
tog_random="$button_error"
|
||||
fi
|
||||
|
||||
# Variable passed to rofi
|
||||
options="$toggle\n$button_stop\n$button_previous\n$button_next\n$tog_repeat\n$tog_random"
|
||||
|
||||
# Get the current playing song
|
||||
current=$(mpc current)
|
||||
# If mpd isn't running it will return an empty string, we don't want to display that
|
||||
if [[ -z "$current" ]]; then
|
||||
current="None"
|
||||
fi
|
||||
|
||||
# Spawn the mpd menu with the "Play / Pause" entry selected by default
|
||||
chosen="$(echo -e "$options" | $rofi_command -p "$current" -dmenu $active $urgent -selected-row 0)"
|
||||
case $chosen in
|
||||
$button_previous)
|
||||
mpc -q prev && kunst --size 60x60 --silent
|
||||
;;
|
||||
$toggle)
|
||||
mpc -q toggle && kunst --size 60x60 --silent
|
||||
;;
|
||||
$button_stop)
|
||||
mpc -q stop
|
||||
;;
|
||||
$button_next)
|
||||
mpc -q next && kunst --size 60x60 --silent
|
||||
;;
|
||||
$tog_repeat)
|
||||
mpc -q repeat
|
||||
;;
|
||||
$tog_random)
|
||||
mpc -q random
|
||||
;;
|
||||
esac
|
||||
Executable
+900
@@ -0,0 +1,900 @@
|
||||
#!/usr/bin/env python3
|
||||
# encoding:utf8
|
||||
"""NetworkManager command line dmenu script.
|
||||
|
||||
To add new connections or enable/disable networking requires policykit
|
||||
permissions setup per:
|
||||
https://wiki.archlinux.org/index.php/NetworkManager#Set_up_PolicyKit_permissions
|
||||
|
||||
OR running the script as root
|
||||
|
||||
Add dmenu formatting options and default terminal if desired to
|
||||
$HOME/.config/berry/rofi/themes/networkmenu_config.ini
|
||||
|
||||
"""
|
||||
import pathlib
|
||||
import struct
|
||||
import configparser
|
||||
import itertools
|
||||
import locale
|
||||
import os
|
||||
from os.path import expanduser
|
||||
import shlex
|
||||
import sys
|
||||
import uuid
|
||||
from subprocess import Popen, PIPE
|
||||
|
||||
import gi
|
||||
gi.require_version('NM', '1.0')
|
||||
from gi.repository import GLib, NM # pylint: disable=wrong-import-position
|
||||
|
||||
ENV = os.environ.copy()
|
||||
ENV['LC_ALL'] = 'C'
|
||||
ENC = locale.getpreferredencoding()
|
||||
|
||||
CLIENT = NM.Client.new(None)
|
||||
LOOP = GLib.MainLoop()
|
||||
CONNS = CLIENT.get_connections()
|
||||
|
||||
CONF = configparser.ConfigParser()
|
||||
CONF.read(expanduser("~/.config/berry/rofi/themes/networkmenu_config.ini"))
|
||||
|
||||
def dmenu_cmd(num_lines, prompt="Networks", active_lines=None): # pylint: disable=too-many-branches
|
||||
"""Parse nmd.ini if it exists and add options to the dmenu command
|
||||
|
||||
Args: args - num_lines: number of lines to display
|
||||
prompt: prompt to show
|
||||
Returns: command invocation (as a list of strings) for
|
||||
dmenu -l <num_lines> -p <prompt> -i ...
|
||||
|
||||
"""
|
||||
dmenu_command = "dmenu"
|
||||
if not CONF.sections():
|
||||
res = [dmenu_command, "-i", "-l", str(num_lines), "-p", str(prompt)]
|
||||
res.extend(sys.argv[1:])
|
||||
return res
|
||||
if CONF.has_section('dmenu'):
|
||||
args = CONF.items('dmenu')
|
||||
args_dict = dict(args)
|
||||
dmenu_args = []
|
||||
if "dmenu_command" in args_dict:
|
||||
command = shlex.split(args_dict["dmenu_command"])
|
||||
dmenu_command = command[0]
|
||||
dmenu_args = command[1:]
|
||||
del args_dict["dmenu_command"]
|
||||
if "p" in args_dict and prompt == "Networks":
|
||||
prompt = args_dict["p"]
|
||||
del args_dict["p"]
|
||||
elif "p" in args_dict:
|
||||
del args_dict["p"]
|
||||
if "rofi" in dmenu_command:
|
||||
lines = "-i -dmenu -lines"
|
||||
# rofi doesn't support 0 length line, it requires at least -lines=1
|
||||
# see https://github.com/DaveDavenport/rofi/issues/252
|
||||
num_lines = num_lines or 1
|
||||
else:
|
||||
lines = "-i -l"
|
||||
if "l" in args_dict:
|
||||
# rofi doesn't support 0 length line, it requires at least -lines=1
|
||||
# see https://github.com/DaveDavenport/rofi/issues/252
|
||||
if "rofi" in dmenu_command:
|
||||
args_dict['l'] = min(num_lines, int(args_dict['l'])) or 1
|
||||
lines = "{} {}".format(lines, args_dict['l'])
|
||||
del args_dict['l']
|
||||
else:
|
||||
lines = "{} {}".format(lines, num_lines)
|
||||
if "pinentry" in args_dict:
|
||||
del args_dict["pinentry"]
|
||||
if "compact" in args_dict:
|
||||
del args_dict["compact"]
|
||||
if "wifi_chars" in args_dict:
|
||||
del args_dict["wifi_chars"]
|
||||
rofi_highlight = CONF.getboolean('dmenu', 'rofi_highlight', fallback=False)
|
||||
if CONF.has_option('dmenu', 'rofi_highlight'):
|
||||
del args_dict["rofi_highlight"]
|
||||
if rofi_highlight is True and "rofi" in dmenu_command:
|
||||
if active_lines:
|
||||
dmenu_args.extend(["-a", ",".join([str(num)
|
||||
for num in active_lines])])
|
||||
if prompt == "Passphrase":
|
||||
if CONF.has_section('dmenu_passphrase'):
|
||||
args = CONF.items('dmenu_passphrase')
|
||||
args_dict.update(args)
|
||||
rofi_obscure = CONF.getboolean('dmenu_passphrase', 'rofi_obscure', fallback=True)
|
||||
if CONF.has_option('dmenu_passphrase', 'rofi_obscure'):
|
||||
del args_dict["rofi_obscure"]
|
||||
if rofi_obscure is True and "rofi" in dmenu_command:
|
||||
dmenu_args.extend(["-password"])
|
||||
dmenu_password = CONF.getboolean('dmenu_passphrase', 'dmenu_password', fallback=False)
|
||||
if CONF.has_option('dmenu_passphrase', 'dmenu_password'):
|
||||
del args_dict["dmenu_password"]
|
||||
if dmenu_password is True:
|
||||
dmenu_args.extend(["-P"])
|
||||
extras = (["-" + str(k), str(v)] for (k, v) in args_dict.items())
|
||||
res = [dmenu_command, "-p", str(prompt)]
|
||||
res.extend(dmenu_args)
|
||||
res += list(itertools.chain.from_iterable(extras))
|
||||
res[1:1] = lines.split()
|
||||
res = list(filter(None, res)) # Remove empty list elements
|
||||
res.extend(sys.argv[1:])
|
||||
return res
|
||||
|
||||
|
||||
def choose_adapter(client):
|
||||
"""If there is more than one wifi adapter installed, ask which one to use
|
||||
|
||||
"""
|
||||
devices = client.get_devices()
|
||||
devices = [i for i in devices if i.get_device_type() == NM.DeviceType.WIFI]
|
||||
if not devices: # pylint: disable=no-else-return
|
||||
return None
|
||||
elif len(devices) == 1:
|
||||
return devices[0]
|
||||
device_names = "\n".join([d.get_iface() for d in devices]).encode(ENC)
|
||||
sel = Popen(dmenu_cmd(len(devices), "CHOOSE ADAPTER:"),
|
||||
stdin=PIPE,
|
||||
stdout=PIPE,
|
||||
env=ENV).communicate(input=device_names)[0].decode(ENC)
|
||||
if not sel.strip():
|
||||
sys.exit()
|
||||
devices = [i for i in devices if i.get_iface() == sel.strip()]
|
||||
assert len(devices) == 1
|
||||
return devices[0]
|
||||
|
||||
|
||||
def is_modemmanager_installed():
|
||||
"""Check if ModemManager is installed"""
|
||||
with open(os.devnull) as devnull:
|
||||
try:
|
||||
Popen(["ModemManager"], stdout=devnull, stderr=devnull).communicate()
|
||||
except OSError:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def bluetooth_get_enabled():
|
||||
"""Check if bluetooth is enabled via rfkill.
|
||||
|
||||
Returns None if no bluetooth device was found.
|
||||
"""
|
||||
# See https://www.kernel.org/doc/Documentation/ABI/stable/sysfs-class-rfkill
|
||||
for path in pathlib.Path('/sys/class/rfkill/').glob('rfkill*'):
|
||||
if (path / 'type').read_text().strip() == 'bluetooth':
|
||||
return (path / 'soft').read_text().strip() == '0'
|
||||
return None
|
||||
|
||||
|
||||
def create_other_actions(client):
|
||||
"""Return list of other actions that can be taken
|
||||
|
||||
"""
|
||||
networking_enabled = client.networking_get_enabled()
|
||||
networking_action = "Disable" if networking_enabled else "Enable"
|
||||
|
||||
wifi_enabled = client.wireless_get_enabled()
|
||||
wifi_action = "Disable" if wifi_enabled else "Enable"
|
||||
|
||||
bluetooth_enabled = bluetooth_get_enabled()
|
||||
bluetooth_action = "Disable" if bluetooth_enabled else "Enable"
|
||||
|
||||
actions = [Action("{} Wifi".format(wifi_action), toggle_wifi,
|
||||
not wifi_enabled),
|
||||
Action("{} Networking".format(networking_action),
|
||||
toggle_networking, not networking_enabled)]
|
||||
if bluetooth_enabled is not None:
|
||||
actions.append(Action("{} Bluetooth".format(bluetooth_action),
|
||||
toggle_bluetooth, not bluetooth_enabled))
|
||||
actions += [Action("Launch Connection Manager", launch_connection_editor),
|
||||
Action("Delete a Connection", delete_connection)]
|
||||
if wifi_enabled:
|
||||
actions.append(Action("Rescan Wifi Networks", rescan_wifi))
|
||||
return actions
|
||||
|
||||
|
||||
def rescan_wifi():
|
||||
"""
|
||||
Rescan Wifi Access Points
|
||||
"""
|
||||
for dev in CLIENT.get_devices():
|
||||
if gi.repository.NM.DeviceWifi == type(dev):
|
||||
try:
|
||||
dev.request_scan_async(None, rescan_cb, None)
|
||||
LOOP.run()
|
||||
except gi.repository.GLib.Error as err:
|
||||
# Too frequent rescan error
|
||||
notify("Wifi rescan failed", urgency="critical")
|
||||
if not err.code == 6: # pylint: disable=no-member
|
||||
raise err
|
||||
|
||||
|
||||
def rescan_cb(dev, res, data):
|
||||
"""Callback for rescan_wifi. Just for notifications
|
||||
|
||||
"""
|
||||
if dev.request_scan_finish(res) is True:
|
||||
notify("Wifi scan complete")
|
||||
else:
|
||||
notify("Wifi scan failed", urgency="critical")
|
||||
LOOP.quit()
|
||||
|
||||
|
||||
def ssid_to_utf8(nm_ap):
|
||||
""" Convert binary ssid to utf-8 """
|
||||
ssid = nm_ap.get_ssid()
|
||||
if not ssid:
|
||||
return ""
|
||||
ret = NM.utils_ssid_to_utf8(ssid.get_data())
|
||||
return ret
|
||||
|
||||
|
||||
def prompt_saved(saved_cons):
|
||||
"""Prompt for a saved connection."""
|
||||
actions = create_saved_actions(saved_cons)
|
||||
sel = get_selection(actions)
|
||||
sel()
|
||||
|
||||
|
||||
def ap_security(nm_ap):
|
||||
"""Parse the security flags to return a string with 'WPA2', etc. """
|
||||
flags = nm_ap.get_flags()
|
||||
wpa_flags = nm_ap.get_wpa_flags()
|
||||
rsn_flags = nm_ap.get_rsn_flags()
|
||||
sec_str = ""
|
||||
if ((flags & getattr(NM, '80211ApFlags').PRIVACY) and
|
||||
(wpa_flags == 0) and (rsn_flags == 0)):
|
||||
sec_str += " WEP"
|
||||
if wpa_flags != 0:
|
||||
sec_str += " WPA1"
|
||||
if rsn_flags != 0:
|
||||
sec_str += " WPA2"
|
||||
if ((wpa_flags & getattr(NM, '80211ApSecurityFlags').KEY_MGMT_802_1X) or
|
||||
(rsn_flags & getattr(NM, '80211ApSecurityFlags').KEY_MGMT_802_1X)):
|
||||
sec_str += " 802.1X"
|
||||
|
||||
# If there is no security use "--"
|
||||
if sec_str == "":
|
||||
sec_str = "--"
|
||||
return sec_str.lstrip()
|
||||
|
||||
|
||||
class Action(): # pylint: disable=too-few-public-methods
|
||||
"""Helper class to execute functions from a string variable"""
|
||||
def __init__(self,
|
||||
name,
|
||||
func,
|
||||
args=None,
|
||||
active=False):
|
||||
self.name = name
|
||||
self.func = func
|
||||
self.is_active = active
|
||||
if args is None:
|
||||
self.args = None
|
||||
elif isinstance(args, list):
|
||||
self.args = args
|
||||
else:
|
||||
self.args = [args]
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def __call__(self):
|
||||
if self.args is None:
|
||||
self.func()
|
||||
else:
|
||||
self.func(*self.args)
|
||||
|
||||
|
||||
def conn_matches_adapter(conn, adapter):
|
||||
"""Return True if the connection is applicable for the given adapter.
|
||||
|
||||
There seem to be two ways for a connection specify what interface it belongs
|
||||
to:
|
||||
|
||||
- By setting 'mac-address' in [wifi] to the adapter's MAC
|
||||
- By setting 'interface-name` in [connection] to the adapter's name.
|
||||
|
||||
Depending on how the connection was added, it seems like either
|
||||
'mac-address', 'interface-name' or neither of both is set.
|
||||
"""
|
||||
# [wifi] mac-address
|
||||
setting_wireless = conn.get_setting_wireless()
|
||||
mac = setting_wireless.get_mac_address()
|
||||
if mac is not None:
|
||||
return mac == adapter.get_permanent_hw_address()
|
||||
|
||||
# [connection] interface-name
|
||||
setting_connection = conn.get_setting_connection()
|
||||
interface = setting_connection.get_interface_name()
|
||||
if interface is not None:
|
||||
return interface == adapter.get_iface()
|
||||
|
||||
# Neither is set, let's assume this connection is for multiple/all adapters.
|
||||
return True
|
||||
|
||||
|
||||
def process_ap(nm_ap, is_active, adapter):
|
||||
"""Activate/Deactivate a connection and get password if required"""
|
||||
if is_active:
|
||||
CLIENT.deactivate_connection_async(nm_ap, None, deactivate_cb, nm_ap)
|
||||
else:
|
||||
conns_cur = [i for i in CONNS if
|
||||
i.get_setting_wireless() is not None and
|
||||
conn_matches_adapter(i, adapter)]
|
||||
con = nm_ap.filter_connections(conns_cur)
|
||||
if len(con) > 1:
|
||||
raise ValueError("There are multiple connections possible")
|
||||
|
||||
if len(con) == 1:
|
||||
CLIENT.activate_connection_async(con[0], adapter, nm_ap.get_path(),
|
||||
None, activate_cb, nm_ap)
|
||||
else:
|
||||
if ap_security(nm_ap) != "--":
|
||||
password = get_passphrase()
|
||||
else:
|
||||
password = ""
|
||||
set_new_connection(nm_ap, password, adapter)
|
||||
LOOP.run()
|
||||
|
||||
|
||||
def activate_cb(dev, res, data):
|
||||
"""Notification if activate connection completed successfully
|
||||
|
||||
"""
|
||||
try:
|
||||
conn = dev.activate_connection_finish(res)
|
||||
except GLib.Error:
|
||||
conn = None
|
||||
if conn is not None:
|
||||
notify("Activated {}".format(conn.get_id()))
|
||||
else:
|
||||
notify("Problem activating {}".format(data.get_id()),
|
||||
urgency="critical")
|
||||
LOOP.quit()
|
||||
|
||||
|
||||
def deactivate_cb(dev, res, data):
|
||||
"""Notification if deactivate connection completed successfully
|
||||
|
||||
"""
|
||||
if dev.deactivate_connection_finish(res) is True:
|
||||
notify("Deactivated {}".format(data.get_id()))
|
||||
else:
|
||||
notify("Problem deactivating {}".format(data.get_id()),
|
||||
urgency="critical")
|
||||
LOOP.quit()
|
||||
|
||||
|
||||
def process_vpngsm(con, activate):
|
||||
"""Activate/deactive VPN or GSM connections"""
|
||||
if activate:
|
||||
CLIENT.activate_connection_async(con, None, None,
|
||||
None, activate_cb, con)
|
||||
else:
|
||||
CLIENT.deactivate_connection_async(con, None, deactivate_cb, con)
|
||||
LOOP.run()
|
||||
|
||||
|
||||
def create_ap_actions(aps, active_ap, active_connection, adapter): # pylint: disable=too-many-locals
|
||||
"""For each AP in a list, create the string and its attached function
|
||||
(activate/deactivate)
|
||||
|
||||
"""
|
||||
active_ap_bssid = active_ap.get_bssid() if active_ap is not None else ""
|
||||
|
||||
names = [ssid_to_utf8(ap) for ap in aps]
|
||||
max_len_name = max([len(name) for name in names]) if names else 0
|
||||
secs = [ap_security(ap) for ap in aps]
|
||||
max_len_sec = max([len(sec) for sec in secs]) if secs else 0
|
||||
|
||||
ap_actions = []
|
||||
|
||||
for nm_ap, name, sec in zip(aps, names, secs):
|
||||
bars = NM.utils_wifi_strength_bars(nm_ap.get_strength())
|
||||
wifi_chars = CONF.get("dmenu", "wifi_chars", fallback=False)
|
||||
if wifi_chars:
|
||||
bars = "".join([wifi_chars[i] for i, j in enumerate(bars) if j == '*'])
|
||||
is_active = nm_ap.get_bssid() == active_ap_bssid
|
||||
compact = CONF.getboolean("dmenu", "compact", fallback=False)
|
||||
if compact:
|
||||
action_name = u"{} {} {}".format(name, sec, bars)
|
||||
else:
|
||||
action_name = u"{:<{}s} {:<{}s} {}".format(name, max_len_name, sec,
|
||||
max_len_sec, bars)
|
||||
if is_active:
|
||||
ap_actions.append(Action(action_name, process_ap,
|
||||
[active_connection, True, adapter],
|
||||
active=True))
|
||||
else:
|
||||
ap_actions.append(Action(action_name, process_ap,
|
||||
[nm_ap, False, adapter]))
|
||||
return ap_actions
|
||||
|
||||
|
||||
def create_vpn_actions(vpns, active):
|
||||
"""Create the list of strings to display with associated function
|
||||
(activate/deactivate) for VPN connections.
|
||||
|
||||
"""
|
||||
active_vpns = [i for i in active if i.get_vpn()]
|
||||
return _create_vpngsm_actions(vpns, active_vpns, "VPN")
|
||||
|
||||
|
||||
def create_wireguard_actions(wgs, active):
|
||||
"""Create the list of strings to display with associated function
|
||||
(activate/deactivate) for Wireguard connections.
|
||||
|
||||
"""
|
||||
active_wgs = [i for i in active if i.get_connection_type() == "wireguard"]
|
||||
return _create_vpngsm_actions(wgs, active_wgs, "Wireguard")
|
||||
|
||||
|
||||
def create_eth_actions(eths, active):
|
||||
"""Create the list of strings to display with associated function
|
||||
(activate/deactivate) for Ethernet connections.
|
||||
|
||||
"""
|
||||
active_eths = [i for i in active if 'ethernet' in i.get_connection_type()]
|
||||
return _create_vpngsm_actions(eths, active_eths, "Eth")
|
||||
|
||||
|
||||
def create_gsm_actions(gsms, active):
|
||||
"""Create the list of strings to display with associated function
|
||||
(activate/deactivate) GSM connections."""
|
||||
active_gsms = [i for i in active if
|
||||
i.get_connection() is not None and
|
||||
i.get_connection().is_type(NM.SETTING_GSM_SETTING_NAME)]
|
||||
return _create_vpngsm_actions(gsms, active_gsms, "GSM")
|
||||
|
||||
|
||||
def create_blue_actions(blues, active):
|
||||
"""Create the list of strings to display with associated function
|
||||
(activate/deactivate) Bluetooth connections."""
|
||||
active_blues = [i for i in active if
|
||||
i.get_connection() is not None and
|
||||
i.get_connection().is_type(NM.SETTING_BLUETOOTH_SETTING_NAME)]
|
||||
return _create_vpngsm_actions(blues, active_blues, "Bluetooth")
|
||||
|
||||
|
||||
def create_saved_actions(saved):
|
||||
"""Create the list of strings to display with associated function
|
||||
(activate/deactivate) for VPN connections.
|
||||
|
||||
"""
|
||||
return _create_vpngsm_actions(saved, [], "SAVED")
|
||||
|
||||
|
||||
def _create_vpngsm_actions(cons, active_cons, label):
|
||||
active_con_ids = [a.get_id() for a in active_cons]
|
||||
actions = []
|
||||
for con in cons:
|
||||
is_active = con.get_id() in active_con_ids
|
||||
action_name = u"{}:{}".format(con.get_id(), label)
|
||||
if is_active:
|
||||
active_connection = [a for a in active_cons
|
||||
if a.get_id() == con.get_id()]
|
||||
if len(active_connection) != 1:
|
||||
raise ValueError(u"Multiple active connections match"
|
||||
" the connection: {}".format(con.get_id()))
|
||||
active_connection = active_connection[0]
|
||||
|
||||
actions.append(Action(action_name, process_vpngsm,
|
||||
[active_connection, False], active=True))
|
||||
else:
|
||||
actions.append(Action(action_name, process_vpngsm,
|
||||
[con, True]))
|
||||
return actions
|
||||
|
||||
|
||||
def create_wwan_actions(client):
|
||||
"""Create WWWAN actions
|
||||
|
||||
"""
|
||||
wwan_enabled = client.wwan_get_enabled()
|
||||
wwan_action = "Disable" if wwan_enabled else "Enable"
|
||||
return [Action("{} WWAN".format(wwan_action), toggle_wwan, not wwan_enabled)]
|
||||
|
||||
|
||||
def combine_actions(eths, aps, vpns, wgs, gsms, blues, wwan, others, saved):
|
||||
"""Combine all given actions into a list of actions.
|
||||
|
||||
Args: args - eths: list of Actions
|
||||
aps: list of Actions
|
||||
vpns: list of Actions
|
||||
gsms: list of Actions
|
||||
blues: list of Actions
|
||||
wwan: list of Actions
|
||||
others: list of Actions
|
||||
"""
|
||||
compact = CONF.getboolean("dmenu", "compact", fallback=False)
|
||||
empty_action = [Action('', None)] if not compact else []
|
||||
all_actions = []
|
||||
all_actions += eths + empty_action if eths else []
|
||||
all_actions += aps + empty_action if aps else []
|
||||
all_actions += vpns + empty_action if vpns else []
|
||||
all_actions += wgs + empty_action if wgs else []
|
||||
all_actions += gsms + empty_action if (gsms and wwan) else []
|
||||
all_actions += blues + empty_action if blues else []
|
||||
all_actions += wwan + empty_action if wwan else []
|
||||
all_actions += others + empty_action if others else []
|
||||
all_actions += saved + empty_action if saved else []
|
||||
return all_actions
|
||||
|
||||
|
||||
def get_selection(all_actions):
|
||||
"""Spawn dmenu for selection and execute the associated action."""
|
||||
rofi_highlight = CONF.getboolean('dmenu', 'rofi_highlight', fallback=False)
|
||||
inp = []
|
||||
|
||||
if rofi_highlight is True:
|
||||
inp = [str(action) for action in all_actions]
|
||||
else:
|
||||
inp = [('== ' if action.is_active else ' ') + str(action)
|
||||
for action in all_actions]
|
||||
active_lines = [index for index, action in enumerate(all_actions)
|
||||
if action.is_active]
|
||||
|
||||
inp_bytes = "\n".join(inp).encode(ENC)
|
||||
command = dmenu_cmd(len(inp), active_lines=active_lines)
|
||||
sel = Popen(command, stdin=PIPE, stdout=PIPE,
|
||||
env=ENV).communicate(input=inp_bytes)[0].decode(ENC)
|
||||
|
||||
if not sel.rstrip():
|
||||
sys.exit()
|
||||
|
||||
if rofi_highlight is False:
|
||||
action = [i for i in all_actions
|
||||
if ((str(i).strip() == str(sel.strip())
|
||||
and not i.is_active) or
|
||||
('== ' + str(i) == str(sel.rstrip('\n'))
|
||||
and i.is_active))]
|
||||
else:
|
||||
action = [i for i in all_actions if str(i).strip() == sel.strip()]
|
||||
assert len(action) == 1, \
|
||||
u"Selection was ambiguous: '{}'".format(str(sel.strip()))
|
||||
return action[0]
|
||||
|
||||
|
||||
def toggle_networking(enable):
|
||||
"""Enable/disable networking
|
||||
|
||||
Args: enable - boolean
|
||||
|
||||
"""
|
||||
toggle = GLib.Variant.new_tuple(GLib.Variant.new_boolean(enable))
|
||||
try:
|
||||
CLIENT.dbus_call(NM.DBUS_PATH, NM.DBUS_INTERFACE, "Enable", toggle,
|
||||
None, -1, None, None, None)
|
||||
except AttributeError:
|
||||
# Workaround for older versions of python-gobject
|
||||
CLIENT.networking_set_enabled(enable)
|
||||
notify("Networking {}".format("enabled" if enable is True else "disabled"))
|
||||
|
||||
|
||||
def toggle_wifi(enable):
|
||||
"""Enable/disable Wifi
|
||||
|
||||
Args: enable - boolean
|
||||
|
||||
"""
|
||||
toggle = GLib.Variant.new_boolean(enable)
|
||||
try:
|
||||
CLIENT.dbus_set_property(NM.DBUS_PATH, NM.DBUS_INTERFACE, "WirelessEnabled", toggle,
|
||||
-1, None, None, None)
|
||||
except AttributeError:
|
||||
# Workaround for older versions of python-gobject
|
||||
CLIENT.wireless_set_enabled(enable)
|
||||
notify("Wifi {}".format("enabled" if enable is True else "disabled"))
|
||||
|
||||
|
||||
def toggle_wwan(enable):
|
||||
"""Enable/disable WWAN
|
||||
|
||||
Args: enable - boolean
|
||||
|
||||
"""
|
||||
toggle = GLib.Variant.new_boolean(enable)
|
||||
try:
|
||||
CLIENT.dbus_set_property(NM.DBUS_PATH, NM.DBUS_INTERFACE, "WwanEnabled", toggle,
|
||||
-1, None, None, None)
|
||||
except AttributeError:
|
||||
# Workaround for older versions of python-gobject
|
||||
CLIENT.wwan_set_enabled(enable)
|
||||
notify("Wwan {}".format("enabled" if enable is True else "disabled"))
|
||||
|
||||
|
||||
def toggle_bluetooth(enable):
|
||||
"""Enable/disable Bluetooth
|
||||
|
||||
Args: enable - boolean
|
||||
|
||||
References:
|
||||
https://github.com/blueman-project/blueman/blob/master/blueman/plugins/mechanism/RfKill.py
|
||||
https://www.kernel.org/doc/html/latest/driver-api/rfkill.html
|
||||
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/include/uapi/linux/rfkill.h?h=v5.8.9
|
||||
|
||||
"""
|
||||
type_bluetooth = 2
|
||||
op_change_all = 3
|
||||
idx = 0
|
||||
soft_state = 0 if enable else 1
|
||||
hard_state = 0
|
||||
|
||||
data = struct.pack("IBBBB", idx, type_bluetooth, op_change_all,
|
||||
soft_state, hard_state)
|
||||
|
||||
try:
|
||||
with open('/dev/rfkill', 'r+b', buffering=0) as rff:
|
||||
rff.write(data)
|
||||
except PermissionError:
|
||||
notify("Lacking permission to write to /dev/rfkill.",
|
||||
"Maybe you need to add your user to the 'rfkill' group?",
|
||||
urgency="critical")
|
||||
else:
|
||||
notify("Bluetooth {}".format("enabled" if enable else "disabled"))
|
||||
|
||||
|
||||
def launch_connection_editor():
|
||||
"""Launch nmtui or the gui nm-connection-editor
|
||||
|
||||
"""
|
||||
terminal = CONF.get("editor", "terminal", fallback="xterm")
|
||||
gui_if_available = CONF.getboolean("editor", "gui_if_available", fallback=True)
|
||||
if gui_if_available is True:
|
||||
try:
|
||||
Popen(["gnome-control-center", "network"]).communicate()
|
||||
except OSError:
|
||||
try:
|
||||
Popen(["nm-connection-editor"]).communicate()
|
||||
except OSError:
|
||||
Popen([terminal, "-e", "nmtui"]).communicate()
|
||||
else:
|
||||
Popen([terminal, "-e", "nmtui"]).communicate()
|
||||
|
||||
|
||||
def get_passphrase():
|
||||
"""Get a password
|
||||
|
||||
Returns: string
|
||||
|
||||
"""
|
||||
pinentry = CONF.get("dmenu", "pinentry", fallback=None)
|
||||
if pinentry:
|
||||
pin = ""
|
||||
out = Popen(pinentry,
|
||||
stdout=PIPE,
|
||||
stdin=PIPE).communicate(input=b'setdesc Get network password\ngetpin\n')[0]
|
||||
if out:
|
||||
res = out.decode(ENC).split("\n")[2]
|
||||
if res.startswith("D "):
|
||||
pin = res.split("D ")[1]
|
||||
return pin
|
||||
return Popen(dmenu_cmd(0, "Passphrase"),
|
||||
stdin=PIPE, stdout=PIPE).communicate()[0].decode(ENC)
|
||||
|
||||
|
||||
def delete_connection():
|
||||
"""Display list of NM connections and delete the selected one
|
||||
|
||||
"""
|
||||
conn_acts = [Action(i.get_id(), i.delete_async, args=[None, delete_cb, None]) for i in CONNS]
|
||||
conn_names = "\n".join([str(i) for i in conn_acts]).encode(ENC)
|
||||
sel = Popen(dmenu_cmd(len(conn_acts), "CHOOSE CONNECTION TO DELETE:"),
|
||||
stdin=PIPE,
|
||||
stdout=PIPE,
|
||||
env=ENV).communicate(input=conn_names)[0].decode(ENC)
|
||||
if not sel.strip():
|
||||
sys.exit()
|
||||
action = [i for i in conn_acts if str(i) == sel.rstrip("\n")]
|
||||
assert len(action) == 1, u"Selection was ambiguous: {}".format(str(sel))
|
||||
action[0]()
|
||||
LOOP.run()
|
||||
|
||||
|
||||
def delete_cb(dev, res, data):
|
||||
"""Notification if delete completed successfully
|
||||
|
||||
"""
|
||||
if dev.delete_finish(res) is True:
|
||||
notify("Deleted {}".format(dev.get_id()))
|
||||
else:
|
||||
notify("Problem deleting {}".format(dev.get_id()), urgency="critical")
|
||||
LOOP.quit()
|
||||
|
||||
|
||||
def set_new_connection(nm_ap, nm_pw, adapter):
|
||||
"""Setup a new NetworkManager connection
|
||||
|
||||
Args: ap - NM.AccessPoint
|
||||
pw - string
|
||||
|
||||
"""
|
||||
nm_pw = str(nm_pw).strip()
|
||||
profile = create_wifi_profile(nm_ap, nm_pw, adapter)
|
||||
CLIENT.add_and_activate_connection_async(profile, adapter, nm_ap.get_path(),
|
||||
None, verify_conn, profile)
|
||||
LOOP.run()
|
||||
|
||||
|
||||
def create_wifi_profile(nm_ap, password, adapter):
|
||||
# pylint: disable=C0301
|
||||
# From https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/examples/python/gi/add_connection.py
|
||||
# and https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/examples/python/dbus/add-wifi-psk-connection.py
|
||||
# pylint: enable=C0301
|
||||
"""Create the NM profile given the AP and passphrase"""
|
||||
ap_sec = ap_security(nm_ap)
|
||||
profile = NM.SimpleConnection.new()
|
||||
|
||||
s_con = NM.SettingConnection.new()
|
||||
s_con.set_property(NM.SETTING_CONNECTION_ID, ssid_to_utf8(nm_ap))
|
||||
s_con.set_property(NM.SETTING_CONNECTION_UUID, str(uuid.uuid4()))
|
||||
s_con.set_property(NM.SETTING_CONNECTION_TYPE, "802-11-wireless")
|
||||
profile.add_setting(s_con)
|
||||
|
||||
s_wifi = NM.SettingWireless.new()
|
||||
s_wifi.set_property(NM.SETTING_WIRELESS_SSID, nm_ap.get_ssid())
|
||||
s_wifi.set_property(NM.SETTING_WIRELESS_MODE, 'infrastructure')
|
||||
s_wifi.set_property(NM.SETTING_WIRELESS_MAC_ADDRESS, adapter.get_permanent_hw_address())
|
||||
profile.add_setting(s_wifi)
|
||||
|
||||
s_ip4 = NM.SettingIP4Config.new()
|
||||
s_ip4.set_property(NM.SETTING_IP_CONFIG_METHOD, "auto")
|
||||
profile.add_setting(s_ip4)
|
||||
|
||||
s_ip6 = NM.SettingIP6Config.new()
|
||||
s_ip6.set_property(NM.SETTING_IP_CONFIG_METHOD, "auto")
|
||||
profile.add_setting(s_ip6)
|
||||
|
||||
if ap_sec != "--":
|
||||
s_wifi_sec = NM.SettingWirelessSecurity.new()
|
||||
if "WPA" in ap_sec:
|
||||
s_wifi_sec.set_property(NM.SETTING_WIRELESS_SECURITY_KEY_MGMT,
|
||||
"wpa-psk")
|
||||
s_wifi_sec.set_property(NM.SETTING_WIRELESS_SECURITY_AUTH_ALG,
|
||||
"open")
|
||||
s_wifi_sec.set_property(NM.SETTING_WIRELESS_SECURITY_PSK, password)
|
||||
elif "WEP" in ap_sec:
|
||||
s_wifi_sec.set_property(NM.SETTING_WIRELESS_SECURITY_KEY_MGMT,
|
||||
"None")
|
||||
s_wifi_sec.set_property(NM.SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE,
|
||||
NM.WepKeyType.PASSPHRASE)
|
||||
s_wifi_sec.set_wep_key(0, password)
|
||||
profile.add_setting(s_wifi_sec)
|
||||
|
||||
return profile
|
||||
|
||||
|
||||
def verify_conn(client, result, data):
|
||||
"""Callback function for add_and_activate_connection_async
|
||||
|
||||
Check if connection completes successfully. Delete the connection if there
|
||||
is an error.
|
||||
|
||||
"""
|
||||
try:
|
||||
act_conn = client.add_and_activate_connection_finish(result)
|
||||
conn = act_conn.get_connection()
|
||||
if not all([conn.verify(),
|
||||
conn.verify_secrets(),
|
||||
data.verify(),
|
||||
data.verify_secrets()]):
|
||||
raise GLib.Error
|
||||
notify("Added {}".format(conn.get_id()))
|
||||
except GLib.Error: # pylint: disable=catching-non-exception
|
||||
try:
|
||||
notify("Connection to {} failed".format(conn.get_id()),
|
||||
urgency="critical")
|
||||
conn.delete_async(None, None, None)
|
||||
except UnboundLocalError:
|
||||
pass
|
||||
finally:
|
||||
LOOP.quit()
|
||||
|
||||
|
||||
def create_ap_list(adapter, active_connections):
|
||||
"""Generate list of access points. Remove duplicate APs , keeping strongest
|
||||
ones and the active AP
|
||||
|
||||
Args: adapter
|
||||
active_connections - list of all active connections
|
||||
Returns: aps - list of access points
|
||||
active_ap - active AP
|
||||
active_ap_con - active Connection
|
||||
adapter
|
||||
|
||||
"""
|
||||
aps = []
|
||||
ap_names = []
|
||||
active_ap = adapter.get_active_access_point()
|
||||
aps_all = sorted(adapter.get_access_points(),
|
||||
key=lambda a: a.get_strength(), reverse=True)
|
||||
conns_cur = [i for i in CONNS if
|
||||
i.get_setting_wireless() is not None and
|
||||
conn_matches_adapter(i, adapter)]
|
||||
try:
|
||||
ap_conns = active_ap.filter_connections(conns_cur)
|
||||
active_ap_name = ssid_to_utf8(active_ap)
|
||||
active_ap_con = [active_conn for active_conn in active_connections
|
||||
if active_conn.get_connection() in ap_conns]
|
||||
except AttributeError:
|
||||
active_ap_name = None
|
||||
active_ap_con = []
|
||||
if len(active_ap_con) > 1:
|
||||
raise ValueError("Multiple connection profiles match"
|
||||
" the wireless AP")
|
||||
active_ap_con = active_ap_con[0] if active_ap_con else None
|
||||
for nm_ap in aps_all:
|
||||
ap_name = ssid_to_utf8(nm_ap)
|
||||
if nm_ap != active_ap and ap_name == active_ap_name:
|
||||
# Skip adding AP if it's not active but same name as active AP
|
||||
continue
|
||||
if ap_name not in ap_names:
|
||||
ap_names.append(ap_name)
|
||||
aps.append(nm_ap)
|
||||
return aps, active_ap, active_ap_con, adapter
|
||||
|
||||
|
||||
def notify(message, details=None, urgency="low"):
|
||||
"""Use notify-send if available for notifications
|
||||
|
||||
"""
|
||||
args = ["-u", urgency, message]
|
||||
if details is not None:
|
||||
args.append(details)
|
||||
|
||||
try:
|
||||
Popen(["notify-send"] + args,
|
||||
stdout=PIPE, stderr=PIPE).communicate()
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
|
||||
def run():
|
||||
"""Main script entrypoint"""
|
||||
active = CLIENT.get_active_connections()
|
||||
adapter = choose_adapter(CLIENT)
|
||||
if adapter:
|
||||
ap_actions = create_ap_actions(*create_ap_list(adapter, active))
|
||||
else:
|
||||
ap_actions = []
|
||||
|
||||
vpns = [i for i in CONNS if i.is_type(NM.SETTING_VPN_SETTING_NAME)]
|
||||
try:
|
||||
wgs = [i for i in CONNS if i.is_type(NM.SETTING_WIREGUARD_SETTING_NAME)]
|
||||
except AttributeError:
|
||||
# Workaround for older versions of python-gobject with no wireguard support
|
||||
wgs = []
|
||||
eths = [i for i in CONNS if i.is_type(NM.SETTING_WIRED_SETTING_NAME)]
|
||||
blues = [i for i in CONNS if i.is_type(NM.SETTING_BLUETOOTH_SETTING_NAME)]
|
||||
|
||||
vpn_actions = create_vpn_actions(vpns, active)
|
||||
wg_actions = create_wireguard_actions(wgs, active)
|
||||
eth_actions = create_eth_actions(eths, active)
|
||||
blue_actions = create_blue_actions(blues, active)
|
||||
other_actions = create_other_actions(CLIENT)
|
||||
wwan_installed = is_modemmanager_installed()
|
||||
if wwan_installed:
|
||||
gsms = [i for i in CONNS if i.is_type(NM.SETTING_GSM_SETTING_NAME)]
|
||||
gsm_actions = create_gsm_actions(gsms, active)
|
||||
wwan_actions = create_wwan_actions(CLIENT)
|
||||
else:
|
||||
gsm_actions = []
|
||||
wwan_actions = []
|
||||
|
||||
list_saved = CONF.getboolean('dmenu', 'list_saved', fallback=False)
|
||||
saved_cons = [i for i in CONNS if i not in vpns + wgs + eths + blues]
|
||||
if list_saved:
|
||||
saved_actions = create_saved_actions(saved_cons)
|
||||
else:
|
||||
saved_actions = [Action("Saved connections", prompt_saved, [saved_cons])]
|
||||
|
||||
actions = combine_actions(eth_actions, ap_actions, vpn_actions, wg_actions,
|
||||
gsm_actions, blue_actions, wwan_actions,
|
||||
other_actions, saved_actions)
|
||||
sel = get_selection(actions)
|
||||
sel()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
||||
|
||||
# vim: set et ts=4 sw=4 :
|
||||
Executable
+70
@@ -0,0 +1,70 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
DIR="$HOME/.config/berry"
|
||||
|
||||
rofi_command="rofi -theme $DIR/rofi/themes/powermenu.rasi"
|
||||
|
||||
uptime=$(uptime -p | sed -e 's/up //g')
|
||||
|
||||
# Options
|
||||
shutdown=""
|
||||
reboot=""
|
||||
lock=""
|
||||
suspend=""
|
||||
logout=""
|
||||
|
||||
# Variable passed to rofi
|
||||
options="$shutdown\n$reboot\n$lock\n$suspend\n$logout"
|
||||
_msg="Options - yes / y / no / n"
|
||||
|
||||
chosen="$(echo -e "$options" | $rofi_command -p "UP - $uptime" -dmenu -selected-row 2)"
|
||||
case $chosen in
|
||||
$shutdown)
|
||||
ans=$($HOME/.config/berry/rofi/bin/confirm &)
|
||||
if [[ $ans == "yes" ]] || [[ $ans == "YES" ]] || [[ $ans == "y" ]]; then
|
||||
systemctl poweroff
|
||||
elif [[ $ans == "no" ]] || [[ $ans == "NO" ]] || [[ $ans == "n" ]]; then
|
||||
exit
|
||||
else
|
||||
rofi -theme ~/.config/berry/rofi/themes/askpass.rasi -e "$_msg"
|
||||
fi
|
||||
;;
|
||||
$reboot)
|
||||
ans=$($HOME/.config/berry/rofi/bin/confirm &)
|
||||
if [[ $ans == "yes" ]] || [[ $ans == "YES" ]] || [[ $ans == "y" ]]; then
|
||||
systemctl reboot
|
||||
elif [[ $ans == "no" ]] || [[ $ans == "NO" ]] || [[ $ans == "n" ]]; then
|
||||
exit
|
||||
else
|
||||
rofi -theme ~/.config/berry/rofi/themes/askpass.rasi -e "$_msg"
|
||||
fi
|
||||
;;
|
||||
$lock)
|
||||
betterlockscreen --lock
|
||||
;;
|
||||
$suspend)
|
||||
ans=$($HOME/.config/berry/rofi/bin/confirm &)
|
||||
if [[ $ans == "yes" ]] || [[ $ans == "YES" ]] || [[ $ans == "y" ]]; then
|
||||
mpc -q pause
|
||||
amixer set Master mute
|
||||
betterlockscreen --suspend
|
||||
elif [[ $ans == "no" ]] || [[ $ans == "NO" ]] || [[ $ans == "n" ]]; then
|
||||
exit
|
||||
else
|
||||
rofi -theme ~/.config/berry/rofi/themes/askpass.rasi -e "$_msg"
|
||||
fi
|
||||
;;
|
||||
$logout)
|
||||
ans=$($HOME/.config/berry/rofi/bin/confirm &)
|
||||
if [[ $ans == "yes" ]] || [[ $ans == "YES" ]] || [[ $ans == "y" ]]; then
|
||||
berryc quit
|
||||
elif [[ $ans == "no" ]] || [[ $ans == "NO" ]] || [[ $ans == "n" ]]; then
|
||||
exit
|
||||
else
|
||||
rofi -theme ~/.config/berry/rofi/themes/askpass.rasi -e "$_msg"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
Executable
+93
@@ -0,0 +1,93 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
DIR="$HOME/.config/berry"
|
||||
rofi_command="rofi -theme $DIR/rofi/themes/screenshot.rasi"
|
||||
|
||||
time=`date +%Y-%m-%d-%H-%M-%S`
|
||||
geometry=`xrandr | head -n1 | cut -d',' -f2 | tr -d '[:blank:],current'`
|
||||
dir="`xdg-user-dir PICTURES`/Screenshots"
|
||||
file="Screenshot_${time}_${geometry}.png"
|
||||
|
||||
# Buttons
|
||||
screen=""
|
||||
area=""
|
||||
window=""
|
||||
infive=""
|
||||
inten=""
|
||||
|
||||
# notify and view screenshot
|
||||
notify_view () {
|
||||
dunstify -u low --replace=699 -i /usr/share/archcraft/icons/dunst/picture.png "Copied to clipboard."
|
||||
viewnior ${dir}/"$file"
|
||||
if [[ -e "$dir/$file" ]]; then
|
||||
dunstify -u low --replace=699 -i /usr/share/archcraft/icons/dunst/picture.png "Screenshot Saved."
|
||||
else
|
||||
dunstify -u low --replace=699 -i /usr/share/archcraft/icons/dunst/picture.png "Screenshot Deleted."
|
||||
fi
|
||||
}
|
||||
|
||||
# countdown
|
||||
countdown () {
|
||||
for sec in `seq $1 -1 1`; do
|
||||
dunstify -t 1000 --replace=699 -i /usr/share/archcraft/icons/dunst/timer.png "Taking shot in : $sec"
|
||||
sleep 1
|
||||
done
|
||||
}
|
||||
|
||||
# take shots
|
||||
shotnow () {
|
||||
cd ${dir} && sleep 0.5 && maim -u -f png | tee "$file" | xclip -selection clipboard -t image/png
|
||||
notify_view
|
||||
}
|
||||
|
||||
shot5 () {
|
||||
countdown '5'
|
||||
sleep 1 && cd ${dir} && maim -u -f png | tee "$file" | xclip -selection clipboard -t image/png
|
||||
notify_view
|
||||
}
|
||||
|
||||
shot10 () {
|
||||
countdown '10'
|
||||
sleep 1 && cd ${dir} && maim -u -f png | tee "$file" | xclip -selection clipboard -t image/png
|
||||
notify_view
|
||||
}
|
||||
|
||||
shotwin () {
|
||||
cd ${dir} && maim -u -f png -i `xdotool getactivewindow` | tee "$file" | xclip -selection clipboard -t image/png
|
||||
notify_view
|
||||
}
|
||||
|
||||
shotarea () {
|
||||
cd ${dir} && maim -u -f png -s -b 2 -c 0.35,0.55,0.85,0.25 -l | tee "$file" | xclip -selection clipboard -t image/png
|
||||
notify_view
|
||||
}
|
||||
|
||||
if [[ ! -d "$dir" ]]; then
|
||||
mkdir -p "$dir"
|
||||
fi
|
||||
|
||||
# Variable passed to rofi
|
||||
options="$screen\n$area\n$window\n$infive\n$inten"
|
||||
|
||||
chosen="$(echo -e "$options" | $rofi_command -p 'Take Screenshot' -dmenu -selected-row 0)"
|
||||
case $chosen in
|
||||
$screen)
|
||||
shotnow
|
||||
;;
|
||||
$area)
|
||||
shotarea
|
||||
;;
|
||||
$window)
|
||||
shotwin
|
||||
;;
|
||||
$infive)
|
||||
shot5
|
||||
;;
|
||||
$inten)
|
||||
shot10
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
/* Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com> */
|
||||
/* Everyone is permitted to copy and distribute copies of this file under GNU-GPL3 */
|
||||
|
||||
@import "colors.rasi"
|
||||
|
||||
* {
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
font: "JetBrains Mono Medium 10";
|
||||
}
|
||||
|
||||
window {
|
||||
width: 300px;
|
||||
padding: 25px;
|
||||
border: 1px;
|
||||
border-radius: 14px;
|
||||
border-color: @selected;
|
||||
location: center;
|
||||
x-offset: 0;
|
||||
y-offset: -4%;
|
||||
}
|
||||
|
||||
entry {
|
||||
expand: true;
|
||||
width: 150px;
|
||||
text-color: @selected;
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
/* Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com> */
|
||||
/* Everyone is permitted to copy and distribute copies of this file under GNU-GPL3 */
|
||||
|
||||
configuration {
|
||||
font: "JetBrains Mono Medium 10";
|
||||
show-icons: false;
|
||||
display-drun: "";
|
||||
drun-display-format: "{icon} {name}";
|
||||
disable-history: false;
|
||||
click-to-exit: true;
|
||||
}
|
||||
|
||||
@import "colors.rasi"
|
||||
|
||||
window {
|
||||
transparency: "real";
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
border: 1px;
|
||||
border-color: @selected;
|
||||
border-radius: 14px;
|
||||
width: 300px;
|
||||
location: center;
|
||||
anchor: center;
|
||||
x-offset: 0;
|
||||
y-offset: 0;
|
||||
}
|
||||
|
||||
prompt {
|
||||
enabled: true;
|
||||
margin: 0px 0px 0px 8px;
|
||||
padding: 6px 0px 6px 0px;
|
||||
background-color: @selected;
|
||||
text-color: @background;
|
||||
border: 0px 0px 0px 0px;
|
||||
border-color: @selected;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
textbox-prompt-colon {
|
||||
expand: false;
|
||||
str: "";
|
||||
border-radius: 100%;
|
||||
background-color: @background-alt;
|
||||
text-color: @foreground;
|
||||
padding: 6px 10px 6px 10px;
|
||||
font: "Iosevka Nerd Font 10";
|
||||
}
|
||||
|
||||
entry {
|
||||
background-color: @selected;
|
||||
text-color: @background;
|
||||
placeholder-color: @background;
|
||||
placeholder: "";
|
||||
expand: true;
|
||||
horizontal-align: 0;
|
||||
blink: false;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
inputbar {
|
||||
children: [ textbox-prompt-colon, prompt ];
|
||||
background-color: @selected;
|
||||
spacing: 0px;
|
||||
text-color: @foreground;
|
||||
border: 0px;
|
||||
border-radius: 100%;
|
||||
border-color: @selected;
|
||||
expand: false;
|
||||
margin: 0px 0px 0px 0px;
|
||||
padding: 2px;
|
||||
position: center;
|
||||
}
|
||||
|
||||
case-indicator {
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
spacing: 0;
|
||||
}
|
||||
|
||||
|
||||
listview {
|
||||
background-color: @background;
|
||||
columns: 1;
|
||||
lines: 5;
|
||||
spacing: 4px;
|
||||
cycle: true;
|
||||
dynamic: true;
|
||||
layout: vertical;
|
||||
}
|
||||
|
||||
mainbox {
|
||||
background-color: @background;
|
||||
children: [ inputbar, listview ];
|
||||
spacing: 15px;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
element {
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
orientation: horizontal;
|
||||
border-radius: 0px;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
element-icon {
|
||||
background-color: inherit;
|
||||
text-color: inherit;
|
||||
horizontal-align: 0.5;
|
||||
vertical-align: 0.5;
|
||||
size: 0px;
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
element-text {
|
||||
background-color: inherit;
|
||||
text-color: inherit;
|
||||
expand: true;
|
||||
horizontal-align: 0;
|
||||
vertical-align: 0.5;
|
||||
margin: 2px 0px 2px 2px;
|
||||
}
|
||||
|
||||
element selected {
|
||||
background-color: @on;
|
||||
text-color: @background;
|
||||
border: 0px;
|
||||
border-radius: 100%;
|
||||
border-color: @selected;
|
||||
}
|
||||
|
||||
element.active,
|
||||
element.selected.urgent {
|
||||
background-color: @on;
|
||||
text-color: @background;
|
||||
border-color: @on;
|
||||
}
|
||||
|
||||
element.selected.urgent {
|
||||
border-color: @selected;
|
||||
}
|
||||
|
||||
element.urgent,
|
||||
element.selected.active {
|
||||
background-color: @off;
|
||||
text-color: @background;
|
||||
border-color: @off;
|
||||
}
|
||||
|
||||
element.selected.active {
|
||||
border-color: @selected;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
/* Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com> */
|
||||
/* Everyone is permitted to copy and distribute copies of this file under GNU-GPL3 */
|
||||
|
||||
* {
|
||||
background: #011826;
|
||||
background-alt: #0A2332;
|
||||
foreground: #EEEEEE;
|
||||
selected: #D97E96;
|
||||
urgent: #635373;
|
||||
on: #496886;
|
||||
off: #A36584;
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
/* Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com> */
|
||||
/* Everyone is permitted to copy and distribute copies of this file under GNU-GPL3 */
|
||||
|
||||
@import "colors.rasi"
|
||||
|
||||
* {
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
font: "JetBrains Mono Medium 10";
|
||||
}
|
||||
|
||||
window {
|
||||
width: 230px;
|
||||
padding: 25px;
|
||||
border: 1px;
|
||||
border-radius: 14px;
|
||||
border-color: @selected;
|
||||
location: center;
|
||||
x-offset: 0;
|
||||
y-offset: -4%;
|
||||
}
|
||||
|
||||
entry {
|
||||
expand: true;
|
||||
width: 150px;
|
||||
text-color: @selected;
|
||||
}
|
||||
@@ -0,0 +1,208 @@
|
||||
/* Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com> */
|
||||
/* Everyone is permitted to copy and distribute copies of this file under GNU-GPL3 */
|
||||
|
||||
configuration {
|
||||
location: 8;
|
||||
fixed-num-lines: true;
|
||||
show-icons: true;
|
||||
sidebar-mode: true;
|
||||
scroll-method: 1;
|
||||
window-format: "[{w}] | {c} | {t}";
|
||||
click-to-exit: true;
|
||||
combi-hide-mode-prefix: false;
|
||||
display-window: "";
|
||||
display-windowcd: "";
|
||||
display-run: "";
|
||||
display-ssh: "";
|
||||
display-drun: "";
|
||||
display-combi: "";
|
||||
}
|
||||
|
||||
@import "colors.rasi"
|
||||
|
||||
* {
|
||||
font: "JetBrains Mono Medium 10";
|
||||
background-color: @background;
|
||||
}
|
||||
|
||||
window {
|
||||
border: 1px;
|
||||
border-color: @selected;
|
||||
border-radius: 14px;
|
||||
width: 420px;
|
||||
height: 90%;
|
||||
x-offset: 20;
|
||||
y-offset: 28;
|
||||
}
|
||||
|
||||
prompt {
|
||||
spacing: 0;
|
||||
border: 0;
|
||||
border-radius: 100%;
|
||||
background-color: @background-alt;
|
||||
text-color: @foreground;
|
||||
padding: 6px 14px 6px 10px;
|
||||
}
|
||||
|
||||
textbox-prompt-colon {
|
||||
background-color: @selected;
|
||||
expand: false;
|
||||
str: "";
|
||||
padding: 6px 4px 6px 4px;
|
||||
text-color: inherit;
|
||||
}
|
||||
|
||||
entry {
|
||||
spacing: 0;
|
||||
expand: true;
|
||||
horizontal-align: 0;
|
||||
background-color: @selected;
|
||||
text-color: @background;
|
||||
placeholder-color: @background;
|
||||
placeholder: "Search...";
|
||||
padding: 6px 2px 6px 2px;
|
||||
border: 0px 0px 0px 0px;
|
||||
border-color: @selected;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
case-indicator {
|
||||
spacing: 0;
|
||||
text-color: @foreground;
|
||||
}
|
||||
|
||||
inputbar {
|
||||
background-color: @selected;
|
||||
spacing: 0px;
|
||||
padding: 2px;
|
||||
text-color: @background;
|
||||
border: 1px;
|
||||
border-color: @selected;
|
||||
border-radius: 100%;
|
||||
children: [ prompt,textbox-prompt-colon,entry ];
|
||||
}
|
||||
|
||||
mainbox {
|
||||
border: 0px;
|
||||
border-color: @selected;
|
||||
spacing: 10px;
|
||||
padding: 25px;
|
||||
}
|
||||
|
||||
listview {
|
||||
lines: 7;
|
||||
columns: 1;
|
||||
fixed-height: 0;
|
||||
border: 0px;
|
||||
border-color: @foreground;
|
||||
spacing: 5px;
|
||||
scrollbar: false;
|
||||
padding: 5px 0px 0px;
|
||||
}
|
||||
|
||||
element-icon {
|
||||
background-color: inherit;
|
||||
text-color: inherit;
|
||||
horizontal-align: 0.5;
|
||||
vertical-align: 0.5;
|
||||
size: 24px;
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
element-text {
|
||||
background-color: inherit;
|
||||
text-color: inherit;
|
||||
expand: true;
|
||||
horizontal-align: 0;
|
||||
vertical-align: 0.5;
|
||||
margin: 2px 0px 2px 10px;
|
||||
}
|
||||
|
||||
|
||||
element {
|
||||
border: 0px;
|
||||
padding: 6px;
|
||||
}
|
||||
element normal.normal {
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
}
|
||||
element normal.urgent {
|
||||
background-color: @background;
|
||||
text-color: @off;
|
||||
}
|
||||
element normal.active {
|
||||
background-color: @background;
|
||||
text-color: @on;
|
||||
}
|
||||
element selected.normal {
|
||||
background-color: @on;
|
||||
text-color: @foreground;
|
||||
border: 0px;
|
||||
border-radius: 100%;
|
||||
border-color: @selected;
|
||||
}
|
||||
element selected.urgent {
|
||||
background-color: @background;
|
||||
text-color: @off;
|
||||
}
|
||||
element selected.active {
|
||||
background-color: @background;
|
||||
text-color: @selected;
|
||||
}
|
||||
element alternate.normal {
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
}
|
||||
element alternate.urgent {
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
}
|
||||
element alternate.active {
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
}
|
||||
|
||||
sidebar {
|
||||
border: 0px;
|
||||
border-color: @selected;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
button {
|
||||
margin: 5px 10px 0px 10px;
|
||||
horizontal-align: 0.5;
|
||||
vertical-align: 0.5;
|
||||
padding: 10px;
|
||||
background-color: @background-alt;
|
||||
text-color: @foreground;
|
||||
border: 0px;
|
||||
border-radius: 100%;
|
||||
border-color: @selected;
|
||||
}
|
||||
|
||||
button selected {
|
||||
background-color: @selected;
|
||||
text-color: @background;
|
||||
border: 0px;
|
||||
border-radius: 100%;
|
||||
border-color: @selected;
|
||||
}
|
||||
|
||||
scrollbar {
|
||||
width: 4px;
|
||||
border: 0px;
|
||||
handle-color: @foreground;
|
||||
handle-width: 8px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
message {
|
||||
border: 0px;
|
||||
border-color: @selected;
|
||||
padding: 1px;
|
||||
}
|
||||
|
||||
textbox {
|
||||
text-color: @foreground;
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
/* Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com> */
|
||||
/* Everyone is permitted to copy and distribute copies of this file under GNU-GPL3 */
|
||||
|
||||
configuration {
|
||||
location: 4;
|
||||
font: "JetBrains Mono Medium 10";
|
||||
show-icons: false;
|
||||
display-drun: "";
|
||||
drun-display-format: "{icon} {name}";
|
||||
disable-history: false;
|
||||
click-to-exit: true;
|
||||
}
|
||||
|
||||
@import "colors.rasi"
|
||||
|
||||
window {
|
||||
transparency: "real";
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
border: 1px;
|
||||
border-color: @selected;
|
||||
border-radius: 14px;
|
||||
width: 100px;
|
||||
x-offset: -20;
|
||||
y-offset: 0;
|
||||
}
|
||||
|
||||
prompt {
|
||||
enabled: true;
|
||||
margin: 0px 0px 0px 8px;
|
||||
padding: 6px 0px 6px 0px;
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
border: 0px 0px 0px 0px;
|
||||
border-color: @selected;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
textbox-prompt-colon {
|
||||
expand: false;
|
||||
str: "ﱘ";
|
||||
border-radius: 8px;
|
||||
background-color: @highlight;
|
||||
text-color: @background;
|
||||
padding: 6px 10px 6px 10px;
|
||||
font: "Iosevka Nerd Font 10";
|
||||
}
|
||||
|
||||
entry {
|
||||
background-color: @background;
|
||||
text-color: @background;
|
||||
placeholder-color: @background;
|
||||
placeholder: "";
|
||||
expand: true;
|
||||
horizontal-align: 0;
|
||||
blink: false;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
inputbar {
|
||||
children: [ textbox-prompt-colon, prompt ];
|
||||
spacing: 0;
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
border: 0px;
|
||||
border-radius: 0px;
|
||||
border-color: @selected;
|
||||
expand: false;
|
||||
margin: 0px 0px 0px 0px;
|
||||
padding: 0px;
|
||||
position: center;
|
||||
}
|
||||
|
||||
case-indicator {
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
spacing: 0;
|
||||
}
|
||||
|
||||
|
||||
listview {
|
||||
background-color: @background;
|
||||
columns: 1;
|
||||
lines: 6;
|
||||
spacing: 10px;
|
||||
cycle: true;
|
||||
dynamic: true;
|
||||
layout: vertical;
|
||||
}
|
||||
|
||||
mainbox {
|
||||
background-color: @background;
|
||||
children: [ listview ];
|
||||
spacing: 10px;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
element {
|
||||
background-color: @background-alt;
|
||||
text-color: @foreground;
|
||||
orientation: horizontal;
|
||||
border-radius: 100%;
|
||||
padding: 14px;
|
||||
}
|
||||
|
||||
element-icon {
|
||||
background-color: inherit;
|
||||
text-color: inherit;
|
||||
horizontal-align: 0.5;
|
||||
vertical-align: 0.5;
|
||||
size: 0px;
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
element-text {
|
||||
background-color: inherit;
|
||||
text-color: inherit;
|
||||
font: "feather 16";
|
||||
expand: true;
|
||||
horizontal-align: 0.5;
|
||||
vertical-align: 0.5;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
element selected {
|
||||
background-color: @selected;
|
||||
text-color: @background;
|
||||
border: 0px;
|
||||
border-radius: 100%;
|
||||
border-color: @selected;
|
||||
}
|
||||
|
||||
element.active,
|
||||
element.selected.urgent {
|
||||
background-color: @on;
|
||||
text-color: @background;
|
||||
border-color: @on;
|
||||
border-radius: 100%;
|
||||
}
|
||||
|
||||
element.selected.urgent {
|
||||
border-color: @selected;
|
||||
}
|
||||
|
||||
element.urgent,
|
||||
element.selected.active {
|
||||
background-color: @off;
|
||||
text-color: @background;
|
||||
border-color: @off;
|
||||
border-radius: 100%;
|
||||
}
|
||||
|
||||
element.selected.active {
|
||||
border-color: @selected;
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
/* Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com> */
|
||||
/* Everyone is permitted to copy and distribute copies of this file under GNU-GPL3 */
|
||||
|
||||
configuration {
|
||||
font: "JetBrains Mono Medium 10";
|
||||
show-icons: false;
|
||||
display-drun: "";
|
||||
drun-display-format: "{icon} {name}";
|
||||
disable-history: false;
|
||||
click-to-exit: true;
|
||||
}
|
||||
|
||||
@import "colors.rasi"
|
||||
|
||||
window {
|
||||
transparency: "real";
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
border: 1px;
|
||||
border-color: @selected;
|
||||
border-radius: 14px;
|
||||
width: 400px;
|
||||
location: center;
|
||||
anchor: center;
|
||||
x-offset: 0;
|
||||
y-offset: 0;
|
||||
}
|
||||
|
||||
prompt {
|
||||
enabled: true;
|
||||
margin: 0px 0px 0px 8px;
|
||||
padding: 6px 0px 6px 0px;
|
||||
background-color: @selected;
|
||||
text-color: @background;
|
||||
border: 0px 0px 0px 0px;
|
||||
border-color: @selected;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
textbox-prompt-colon {
|
||||
expand: false;
|
||||
str: "直";
|
||||
border-radius: 100%;
|
||||
background-color: @background-alt;
|
||||
text-color: @foreground;
|
||||
padding: 6px 10px 6px 10px;
|
||||
font: "Iosevka Nerd Font 10";
|
||||
}
|
||||
|
||||
entry {
|
||||
background-color: @selected;
|
||||
text-color: @background;
|
||||
placeholder-color: @background;
|
||||
placeholder: "";
|
||||
expand: true;
|
||||
horizontal-align: 0;
|
||||
blink: false;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
inputbar {
|
||||
children: [ textbox-prompt-colon, prompt, entry ];
|
||||
background-color: @selected;
|
||||
spacing: 0px;
|
||||
text-color: @foreground;
|
||||
border: 0px;
|
||||
border-radius: 100%;
|
||||
border-color: @selected;
|
||||
expand: false;
|
||||
margin: 0px 0px 0px 0px;
|
||||
padding: 2px;
|
||||
position: center;
|
||||
}
|
||||
|
||||
case-indicator {
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
spacing: 0;
|
||||
}
|
||||
|
||||
|
||||
listview {
|
||||
background-color: @background;
|
||||
columns: 1;
|
||||
lines: 8;
|
||||
spacing: 4px;
|
||||
cycle: true;
|
||||
dynamic: true;
|
||||
layout: vertical;
|
||||
}
|
||||
|
||||
mainbox {
|
||||
background-color: @background;
|
||||
children: [ inputbar, listview ];
|
||||
spacing: 15px;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
element {
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
orientation: horizontal;
|
||||
border-radius: 0px;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
element-icon {
|
||||
background-color: inherit;
|
||||
text-color: inherit;
|
||||
horizontal-align: 0.5;
|
||||
vertical-align: 0.5;
|
||||
size: 0px;
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
element-text {
|
||||
background-color: inherit;
|
||||
text-color: inherit;
|
||||
expand: true;
|
||||
horizontal-align: 0;
|
||||
vertical-align: 0.5;
|
||||
margin: 2px 0px 2px 2px;
|
||||
}
|
||||
|
||||
element selected {
|
||||
background-color: @on;
|
||||
text-color: @background;
|
||||
border: 0px;
|
||||
border-radius: 100%;
|
||||
border-color: @selected;
|
||||
}
|
||||
|
||||
element.active,
|
||||
element.selected.urgent {
|
||||
background-color: @on;
|
||||
text-color: @background;
|
||||
border-color: @on;
|
||||
}
|
||||
|
||||
element.selected.urgent {
|
||||
border-color: @selected;
|
||||
}
|
||||
|
||||
element.urgent,
|
||||
element.selected.active {
|
||||
background-color: @off;
|
||||
text-color: @background;
|
||||
border-color: @off;
|
||||
}
|
||||
|
||||
element.selected.active {
|
||||
border-color: @selected;
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
[dmenu]
|
||||
dmenu_command = rofi -dmenu -theme ~/.config/berry/rofi/themes/networkmenu.rasi
|
||||
# # Note that dmenu_command can contain arguments as well like `rofi -width 30`
|
||||
# # Rofi and dmenu are set to case insensitive by default `-i`
|
||||
# l = number of lines to display, defaults to number of total network options
|
||||
# fn = font string
|
||||
# nb = normal background (name, #RGB, or #RRGGBB)
|
||||
# nf = normal foreground
|
||||
# sb = selected background
|
||||
# sf = selected foreground
|
||||
# b = (just set to empty value and menu will appear at the bottom
|
||||
# m = number of monitor to display on
|
||||
# p = Custom Prompt for the networks menu
|
||||
# pinentry = Pinentry command
|
||||
# rofi_highlight = <True or False> # (Default: False) use rofi highlighting instead of '**'
|
||||
|
||||
# # override normal foreground and background colors (dmenu) or use the
|
||||
# # -password option (rofi) to obscure passphrase entry
|
||||
# [dmenu_passphrase]
|
||||
# nf = #222222
|
||||
# nb = #222222
|
||||
# rofi_obscure = True
|
||||
|
||||
[editor]
|
||||
terminal = alacritty
|
||||
gui_if_available = True
|
||||
# terminal = <name of terminal program>
|
||||
# gui_if_available = <True or False>
|
||||
@@ -0,0 +1,155 @@
|
||||
/* Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com> */
|
||||
/* Everyone is permitted to copy and distribute copies of this file under GNU-GPL3 */
|
||||
|
||||
configuration {
|
||||
location: 4;
|
||||
font: "JetBrains Mono Medium 10";
|
||||
show-icons: false;
|
||||
display-drun: "";
|
||||
drun-display-format: "{icon} {name}";
|
||||
disable-history: false;
|
||||
click-to-exit: true;
|
||||
}
|
||||
|
||||
@import "colors.rasi"
|
||||
|
||||
window {
|
||||
transparency: "real";
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
border: 1px;
|
||||
border-color: @selected;
|
||||
border-radius: 14px;
|
||||
width: 100px;
|
||||
x-offset: -20;
|
||||
y-offset: 0;
|
||||
}
|
||||
|
||||
prompt {
|
||||
enabled: true;
|
||||
margin: 0px 0px 0px 8px;
|
||||
padding: 6px 0px 6px 0px;
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
border: 0px 0px 0px 0px;
|
||||
border-color: @selected;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
textbox-prompt-colon {
|
||||
expand: false;
|
||||
str: "";
|
||||
border-radius: 8px;
|
||||
background-color: @highlight;
|
||||
text-color: @background;
|
||||
padding: 6px 10px 6px 10px;
|
||||
font: "Iosevka Nerd Font 10";
|
||||
}
|
||||
|
||||
entry {
|
||||
background-color: @background;
|
||||
text-color: @background;
|
||||
placeholder-color: @background;
|
||||
placeholder: "";
|
||||
expand: true;
|
||||
horizontal-align: 0;
|
||||
blink: false;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
inputbar {
|
||||
children: [ textbox-prompt-colon, prompt ];
|
||||
spacing: 0;
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
border: 0px;
|
||||
border-radius: 0px;
|
||||
border-color: @selected;
|
||||
expand: false;
|
||||
margin: 0px 0px 0px 0px;
|
||||
padding: 0px;
|
||||
position: center;
|
||||
}
|
||||
|
||||
case-indicator {
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
spacing: 0;
|
||||
}
|
||||
|
||||
|
||||
listview {
|
||||
background-color: @background;
|
||||
columns: 1;
|
||||
lines: 5;
|
||||
spacing: 10px;
|
||||
cycle: true;
|
||||
dynamic: true;
|
||||
layout: vertical;
|
||||
}
|
||||
|
||||
mainbox {
|
||||
background-color: @background;
|
||||
children: [ listview ];
|
||||
spacing: 10px;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
element {
|
||||
background-color: @background-alt;
|
||||
text-color: @foreground;
|
||||
orientation: horizontal;
|
||||
border-radius: 100%;
|
||||
padding: 14px;
|
||||
}
|
||||
|
||||
element-icon {
|
||||
background-color: inherit;
|
||||
text-color: inherit;
|
||||
horizontal-align: 0.5;
|
||||
vertical-align: 0.5;
|
||||
size: 0px;
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
element-text {
|
||||
background-color: inherit;
|
||||
text-color: inherit;
|
||||
font: "feather 16";
|
||||
expand: true;
|
||||
horizontal-align: 0.5;
|
||||
vertical-align: 0.5;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
element selected {
|
||||
background-color: @selected;
|
||||
text-color: @background;
|
||||
border: 0px;
|
||||
border-radius: 100%;
|
||||
border-color: @selected;
|
||||
}
|
||||
|
||||
element.active,
|
||||
element.selected.urgent {
|
||||
background-color: @on;
|
||||
text-color: @background;
|
||||
border-color: @on;
|
||||
border-radius: 100%;
|
||||
}
|
||||
|
||||
element.selected.urgent {
|
||||
border-color: @selected;
|
||||
}
|
||||
|
||||
element.urgent,
|
||||
element.selected.active {
|
||||
background-color: @off;
|
||||
text-color: @background;
|
||||
border-color: @off;
|
||||
border-radius: 100%;
|
||||
}
|
||||
|
||||
element.selected.active {
|
||||
border-color: @selected;
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
/* Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com> */
|
||||
/* Everyone is permitted to copy and distribute copies of this file under GNU-GPL3 */
|
||||
|
||||
configuration {
|
||||
location: 4;
|
||||
font: "JetBrains Mono Medium 10";
|
||||
show-icons: false;
|
||||
display-drun: "";
|
||||
drun-display-format: "{icon} {name}";
|
||||
disable-history: false;
|
||||
click-to-exit: true;
|
||||
}
|
||||
|
||||
@import "colors.rasi"
|
||||
|
||||
window {
|
||||
transparency: "real";
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
border: 1px;
|
||||
border-color: @selected;
|
||||
border-radius: 14px;
|
||||
width: 100px;
|
||||
x-offset: -20;
|
||||
y-offset: 0;
|
||||
}
|
||||
|
||||
prompt {
|
||||
enabled: true;
|
||||
margin: 0px 0px 0px 8px;
|
||||
padding: 6px 0px 6px 0px;
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
border: 0px 0px 0px 0px;
|
||||
border-color: @selected;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
textbox-prompt-colon {
|
||||
expand: false;
|
||||
str: "";
|
||||
border-radius: 8px;
|
||||
background-color: @highlight;
|
||||
text-color: @background;
|
||||
padding: 6px 10px 6px 10px;
|
||||
font: "Iosevka Nerd Font 10";
|
||||
}
|
||||
|
||||
entry {
|
||||
background-color: @background;
|
||||
text-color: @background;
|
||||
placeholder-color: @background;
|
||||
placeholder: "";
|
||||
expand: true;
|
||||
horizontal-align: 0;
|
||||
blink: false;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
inputbar {
|
||||
children: [ textbox-prompt-colon, prompt ];
|
||||
spacing: 0;
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
border: 0px;
|
||||
border-radius: 0px;
|
||||
border-color: @selected;
|
||||
expand: false;
|
||||
margin: 0px 0px 0px 0px;
|
||||
padding: 0px;
|
||||
position: center;
|
||||
}
|
||||
|
||||
case-indicator {
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
spacing: 0;
|
||||
}
|
||||
|
||||
|
||||
listview {
|
||||
background-color: @background;
|
||||
columns: 1;
|
||||
lines: 5;
|
||||
spacing: 10px;
|
||||
cycle: true;
|
||||
dynamic: true;
|
||||
layout: vertical;
|
||||
}
|
||||
|
||||
mainbox {
|
||||
background-color: @background;
|
||||
children: [ listview ];
|
||||
spacing: 10px;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
element {
|
||||
background-color: @background-alt;
|
||||
text-color: @foreground;
|
||||
orientation: horizontal;
|
||||
border-radius: 100%;
|
||||
padding: 14px;
|
||||
}
|
||||
|
||||
element-icon {
|
||||
background-color: inherit;
|
||||
text-color: inherit;
|
||||
horizontal-align: 0.5;
|
||||
vertical-align: 0.5;
|
||||
size: 0px;
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
element-text {
|
||||
background-color: inherit;
|
||||
text-color: inherit;
|
||||
font: "feather 16";
|
||||
expand: true;
|
||||
horizontal-align: 0.5;
|
||||
vertical-align: 0.5;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
element selected {
|
||||
background-color: @selected;
|
||||
text-color: @background;
|
||||
border: 0px;
|
||||
border-radius: 100%;
|
||||
border-color: @selected;
|
||||
}
|
||||
|
||||
element.active,
|
||||
element.selected.urgent {
|
||||
background-color: @on;
|
||||
text-color: @background;
|
||||
border-color: @on;
|
||||
border-radius: 100%;
|
||||
}
|
||||
|
||||
element.selected.urgent {
|
||||
border-color: @selected;
|
||||
}
|
||||
|
||||
element.urgent,
|
||||
element.selected.active {
|
||||
background-color: @off;
|
||||
text-color: @background;
|
||||
border-color: @off;
|
||||
border-radius: 100%;
|
||||
}
|
||||
|
||||
element.selected.active {
|
||||
border-color: @selected;
|
||||
}
|
||||
+132
@@ -0,0 +1,132 @@
|
||||
## Copyright (C) 2020-2022 Aditya Shakya <adi1090x@gmail.com>
|
||||
## Everyone is permitted to copy and distribute copies of this file under GNU-GPL3
|
||||
|
||||
##---------- Keybindings for berry ----------##
|
||||
|
||||
# Terminal (alacritty)
|
||||
super + Return
|
||||
bash ~/.config/berry/bin/berryterm.sh
|
||||
|
||||
# Terminal (floating)
|
||||
super + shift + Return
|
||||
bash ~/.config/berry/bin/berryterm.sh -s
|
||||
|
||||
##---------- Rofi Launcher & Menus ----------##
|
||||
|
||||
# Rofi App Launcher
|
||||
alt + F1
|
||||
bash ~/.config/berry/rofi/bin/launcher
|
||||
|
||||
# Rofi Network Menu
|
||||
super + n
|
||||
~/.config/berry/rofi/bin/network_menu
|
||||
|
||||
# Rofi Menus/Applets
|
||||
super + {r,m,s,x}
|
||||
bash ~/.config/berry/rofi/bin/{asroot,mpd,screenshot,powermenu}
|
||||
|
||||
##---------- Applications ----------##
|
||||
|
||||
# Launch Apps
|
||||
super + {f,w,e}
|
||||
{thunar,firefox,geany}
|
||||
|
||||
# Terminal Apps
|
||||
ctrl + alt + {v,r,h}
|
||||
alacritty --config-file ~/.config/berry/alacritty/alacritty.yml -e {vim,ranger,htop}
|
||||
|
||||
# Lockscreen
|
||||
ctrl + alt + l
|
||||
betterlockscreen --lock
|
||||
|
||||
##---------- System Keys ----------##
|
||||
|
||||
# Take a screenshot
|
||||
Print
|
||||
takeshot --now
|
||||
|
||||
# Take screenshot in 5 second
|
||||
alt + Print
|
||||
takeshot --in5
|
||||
|
||||
# Take screenshot in 10 second
|
||||
shift + Print
|
||||
takeshot --in10
|
||||
|
||||
# Take screenshot of active window
|
||||
ctrl + Print
|
||||
takeshot --win
|
||||
|
||||
# Take screenshot of area
|
||||
ctrl + alt + Print
|
||||
takeshot --area
|
||||
|
||||
# Brighness control
|
||||
XF86MonBrightness{Up,Down}
|
||||
brightness{ --inc, --dec}
|
||||
|
||||
# Volume control
|
||||
XF86Audio{RaiseVolume,LowerVolume}
|
||||
volume{ --inc, --dec}
|
||||
|
||||
XF86AudioMute
|
||||
volume --toggle
|
||||
|
||||
# Music control
|
||||
XF86Audio{Next,Prev,Play,Stop}
|
||||
mpc {next,prev,toggle,stop}
|
||||
|
||||
# Reload sxhkd configuration file
|
||||
super + Escape
|
||||
pkill -USR1 -x sxhkd
|
||||
|
||||
##---------- Berry Hotkeys --------##
|
||||
|
||||
super + shift + {Left, Down, Up, Right}
|
||||
berryc window_resize {-50 0, 0 50, 0 -50, 50 0}
|
||||
|
||||
super + ctrl + {Left, Down, Up, Right}
|
||||
berryc window_move {-50 0, 0 50, 0 -50, 50 0}
|
||||
|
||||
super + Left
|
||||
berryc snap_left
|
||||
|
||||
super + Right
|
||||
berryc snap_right
|
||||
|
||||
super + Up
|
||||
berryc window_monocle
|
||||
|
||||
super + Down
|
||||
berryc window_resize_absolute 1000 650 && berryc window_center
|
||||
|
||||
super + {1-9}
|
||||
berryc switch_workspace {0-9}
|
||||
|
||||
super + shift + {1-9}
|
||||
berryc send_to_workspace {0-9}
|
||||
|
||||
super + space
|
||||
berryc fullscreen
|
||||
|
||||
super + t
|
||||
berryc toggle_decorations
|
||||
|
||||
super + Tab
|
||||
berryc cycle_focus
|
||||
|
||||
super + c
|
||||
berryc window_center
|
||||
|
||||
super + q
|
||||
berryc window_close
|
||||
|
||||
super + shift + c
|
||||
berryc window_close
|
||||
|
||||
super + shift + q
|
||||
berryc quit
|
||||
|
||||
# Mouse Buttons
|
||||
~button1
|
||||
berryc pointer_focus
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 672 KiB |
Reference in New Issue
Block a user