diff --git a/.Xresources b/.Xresources
index 4bff6266..449815cf 100644
--- a/.Xresources
+++ b/.Xresources
@@ -5,3 +5,19 @@ Xft.hintstyle: hintslight
Xft.rgba: none
Xft.lcdfilter: lcddefault
Xcursor.theme: Remus-Black
+
+st.font: VictorMono Nerd Font Mono:size=12:antialias=true:autohint=true
+st.alpha: 0.88
+st.borderpx: 2
+st.shell: /bin/sh
+st.bellvolume: 0
+st.blinktimeout: 0
+st.tabspaces: 4
+st.cursorColor: #ebdbb2
+st.termname: st-256color
+st.chscale: 0.877
+st.cwscale: 1
+
+Nsxiv.window.background: #000000
+Nsxiv.bar.background: #1c1c1c
+Nsxiv.bar.foreground: #d4d4d4
diff --git a/.config/Kvantum/MateriaBlur/AUTHORS b/.config/Kvantum/MateriaBlur/AUTHORS
new file mode 100644
index 00000000..fd548843
--- /dev/null
+++ b/.config/Kvantum/MateriaBlur/AUTHORS
@@ -0,0 +1,2 @@
+------------------------ MATERIA BLUR KVANTUM THEME ------------------------
+Alexey Varfolomeev - https://github.com/PapirusDevelopmentTeam/materia-kde
diff --git a/.config/Kvantum/MateriaBlur/LICENSE b/.config/Kvantum/MateriaBlur/LICENSE
new file mode 100644
index 00000000..729f5d7f
--- /dev/null
+++ b/.config/Kvantum/MateriaBlur/LICENSE
@@ -0,0 +1,675 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ 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.
+
+
+ Copyright (C)
+
+ 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 .
+
+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:
+
+ Copyright (C)
+ 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
+.
+
+ 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
+.
+
diff --git a/.config/Kvantum/MateriaBlur/MateriaBlur.kvconfig b/.config/Kvantum/MateriaBlur/MateriaBlur.kvconfig
new file mode 100644
index 00000000..bfaae2aa
--- /dev/null
+++ b/.config/Kvantum/MateriaBlur/MateriaBlur.kvconfig
@@ -0,0 +1,534 @@
+[%General]
+author=Alexey Varfolomeev, based on KvAdaptaDark by Tsu Jan
+comment=The dark varianl of Materia
+x11drag=menubar_and_primary_toolbar
+alt_mnemonic=true
+left_tabs=true
+attach_active_tab=false
+mirror_doc_tabs=true
+group_toolbar_buttons=false
+toolbar_item_spacing=0
+toolbar_interior_spacing=2
+spread_progressbar=true
+composite=true
+menu_shadow_depth=5
+tooltip_shadow_depth=2
+splitter_width=4
+scroll_width=9
+scroll_arrows=false
+scroll_min_extent=60
+slider_width=2
+slider_handle_width=23
+slider_handle_length=22
+tickless_slider_handle_size=22
+center_toolbar_handle=true
+check_size=16
+textless_progressbar=false
+progressbar_thickness=2
+menubar_mouse_tracking=true
+toolbutton_style=1
+double_click=false
+translucent_windows=true
+blurring=true
+popup_blurring=true
+vertical_spin_indicators=false
+spin_button_width=24
+fill_rubberband=false
+merge_menubar_with_toolbar=true
+small_icon_size=16
+large_icon_size=32
+button_icon_size=16
+toolbar_icon_size=16
+combo_as_lineedit=true
+animate_states=true
+button_contents_shift=false
+combo_menu=true
+hide_combo_checkboxes=true
+combo_focus_rect=false
+groupbox_top_label=true
+inline_spin_indicators=true
+joined_inactive_tabs=true
+layout_spacing=6
+layout_margin=9
+scrollbar_in_view=true
+transient_scrollbar=true
+transient_groove=true
+submenu_overlap=0
+tooltip_delay=-1
+tree_branch_line=true
+no_window_pattern=false
+opaque=QMPlay2,kaffeine,kmplayer,subtitlecomposer,kdenlive,vlc,avidemux,avidemux2_qt4,avidemux3_qt4,avidemux3_qt5,kamoso,QtCreator,VirtualBox,trojita,dragon,digikam
+reduce_window_opacity=10
+respect_DE=true
+scrollable_menu=false
+submenu_delay=250
+no_inactiveness=false
+reduce_menu_opacity=0
+
+[GeneralColors]
+window.color=#282828
+base.color=#30303082
+alt.base.color=#30303082
+button.color=#424242
+light.color=#47535a
+mid.light.color=#313131
+dark.color=black
+mid.color=#191919
+highlight.color=#4285f452
+inactive.highlight.color=#4285f474
+text.color=#dfdfdf
+window.text.color=#dfdfdf
+button.text.color=#dfdfdf
+disabled.text.color=#696969
+tooltip.text.color=#eefcff
+highlight.text.color=white
+link.color=#009DFF
+link.visited.color=#9E4FFF
+progress.indicator.text.color=#dfdfdf
+
+[Hacks]
+transparent_ktitle_label=true
+transparent_dolphin_view=false
+transparent_pcmanfm_sidepane=true
+blur_translucent=true
+transparent_menutitle=true
+respect_darkness=true
+kcapacitybar_as_progressbar=true
+force_size_grip=true
+iconless_pushbutton=true
+iconless_menu=false
+disabled_icon_opacity=70
+lxqtmainmenu_iconsize=16
+normal_default_pushbutton=true
+single_top_toolbar=true
+tint_on_mouseover=0
+transparent_pcmanfm_view=false
+no_selection_tint=true
+transparent_arrow_button=true
+middle_click_scroll=false
+opaque_colors=false
+
+[PanelButtonCommand]
+frame=true
+frame.element=button
+frame.top=8
+frame.bottom=8
+frame.left=8
+frame.right=8
+interior=true
+interior.element=button
+indicator.size=8
+text.normal.color=#dfdfdf
+text.focus.color=white
+text.press.color=#dfdfdf
+text.toggle.color=white
+text.shadow=0
+text.margin=1
+text.iconspacing=4
+indicator.element=arrow
+text.margin.top=2
+text.margin.bottom=3
+text.margin.left=2
+text.margin.right=2
+frame.expansion=0
+
+[PanelButtonTool]
+inherits=PanelButtonCommand
+text.normal.color=#dfdfdf
+text.bold=false
+indicator.element=arrow
+indicator.size=8
+frame.expansion=34
+
+[ToolbarButton]
+frame.element=tbutton
+interior.element=tbutton
+indicator.element=tarrow
+text.normal.color=#dfdfdf
+text.focus.color=white
+text.press.color=white
+text.toggle.color=white
+text.bold=false
+frame.expansion=34
+
+[Dock]
+inherits=PanelButtonCommand
+interior.element=dock
+frame.element=dock
+frame.top=1
+frame.bottom=1
+frame.left=1
+frame.right=1
+text.normal.color=#dfdfdf
+
+[DockTitle]
+inherits=PanelButtonCommand
+frame=false
+interior=false
+text.normal.color=#dfdfdf
+text.focus.color=white
+text.bold=false
+
+[IndicatorSpinBox]
+inherits=PanelButtonCommand
+frame=true
+interior=true
+frame.top=2
+frame.bottom=2
+frame.left=2
+frame.right=2
+indicator.element=spin
+indicator.size=8
+text.normal.color=#dfdfdf
+text.margin.top=2
+text.margin.bottom=2
+text.margin.left=2
+text.margin.right=2
+
+[RadioButton]
+inherits=PanelButtonCommand
+frame=false
+interior.element=radio
+text.normal.color=#dfdfdf
+text.focus.color=white
+min_width=+0.3font
+min_height=+0.3font
+
+[CheckBox]
+inherits=PanelButtonCommand
+frame=false
+interior.element=checkbox
+text.normal.color=#dfdfdf
+text.focus.color=white
+min_width=+0.3font
+min_height=+0.3font
+
+[Focus]
+inherits=PanelButtonCommand
+frame=true
+frame.element=focus
+frame.top=2
+frame.bottom=2
+frame.left=2
+frame.right=2
+frame.patternsize=14
+
+[GenericFrame]
+inherits=PanelButtonCommand
+frame=true
+interior=false
+frame.element=common
+interior.element=common
+frame.top=1
+frame.bottom=1
+frame.left=1
+frame.right=1
+
+[LineEdit]
+inherits=PanelButtonCommand
+frame.element=lineedit
+interior.element=lineedit
+interior=false
+frame.top=2
+frame.bottom=2
+frame.left=2
+frame.right=2
+text.margin.top=2
+text.margin.bottom=2
+text.margin.left=2
+text.margin.right=2
+frame.expansion=0
+
+[DropDownButton]
+inherits=PanelButtonCommand
+indicator.element=arrow-down
+
+[IndicatorArrow]
+indicator.element=arrow
+indicator.size=8
+
+[ToolboxTab]
+inherits=PanelButtonCommand
+text.normal.color=#dfdfdf
+text.press.color=#dfdfdf
+text.focus.color=white
+
+[Tab]
+inherits=PanelButtonCommand
+interior.element=tab
+text.margin.left=8
+text.margin.right=8
+text.margin.top=2
+text.margin.bottom=2
+frame.element=tab
+indicator.element=tab
+indicator.size=22
+frame.top=2
+frame.bottom=2
+frame.left=2
+frame.right=2
+text.normal.color=#dfdfdf
+text.focus.color=#dfdfdf
+text.toggle.color=#dfdfdf
+frame.expansion=0
+text.bold=false
+
+[TabFrame]
+inherits=PanelButtonCommand
+frame.element=tabframe
+interior.element=tabframe
+frame.top=2
+frame.bottom=2
+frame.left=2
+frame.right=2
+
+[TreeExpander]
+inherits=PanelButtonCommand
+indicator.size=8
+indicator.element=tree
+
+[HeaderSection]
+inherits=PanelButtonCommand
+interior.element=header
+frame.element=header
+frame.top=0
+frame.bottom=1
+frame.left=1
+frame.right=1
+text.normal.color=#dfdfdf
+text.focus.color=white
+text.press.color=white
+text.toggle.color=white
+frame.expansion=0
+
+[SizeGrip]
+indicator.element=resize-grip
+
+[Toolbar]
+inherits=PanelButtonCommand
+indicator.element=toolbar
+indicator.size=5
+text.margin=0
+interior.element=menubar
+frame.element=menubar
+text.normal.color=#dfdfdf
+text.focus.color=white
+frame.left=0
+frame.right=0
+frame.top=0
+frame.bottom=4
+frame.expansion=0
+
+[Slider]
+inherits=PanelButtonCommand
+frame.element=slider
+focusFrame=true
+interior.element=slider
+frame.top=3
+frame.bottom=3
+frame.left=3
+frame.right=3
+
+[SliderCursor]
+inherits=PanelButtonCommand
+frame=false
+interior.element=slidercursor
+
+[Progressbar]
+inherits=PanelButtonCommand
+frame.element=progress
+interior.element=progress
+text.margin=0
+text.normal.color=#dfdfdf
+text.focus.color=#dfdfdf
+text.press.color=#dfdfdf
+text.toggle.color=#dfdfdf
+text.bold=false
+frame.expansion=8
+
+[ProgressbarContents]
+inherits=PanelButtonCommand
+frame=true
+frame.element=progress-pattern
+interior.element=progress-pattern
+
+[ItemView]
+inherits=PanelButtonCommand
+text.margin=0
+frame.element=itemview
+interior.element=itemview
+frame.top=2
+frame.bottom=2
+frame.left=2
+frame.right=2
+text.margin.top=2
+text.margin.bottom=2
+text.margin.left=4
+text.margin.right=4
+text.normal.color=#dfdfdf
+text.focus.color=white
+text.press.color=white
+text.toggle.color=white
+min_width=+0.3font
+min_height=+0.3font
+frame.expansion=0
+
+[Splitter]
+indicator.size=48
+
+[Scrollbar]
+inherits=PanelButtonCommand
+indicator.element=arrow
+indicator.size=12
+
+[ScrollbarSlider]
+inherits=PanelButtonCommand
+frame.element=scrollbarslider
+interior=false
+frame.left=5
+frame.right=5
+frame.top=5
+frame.bottom=5
+indicator.element=grip
+indicator.size=12
+
+[ScrollbarGroove]
+inherits=PanelButtonCommand
+interior=false
+frame=false
+
+[MenuItem]
+inherits=PanelButtonCommand
+frame=true
+frame.element=menuitem
+interior.element=menuitem
+indicator.element=menuitem
+text.normal.color=#dfdfdf
+text.focus.color=white
+text.margin.top=1
+text.margin.bottom=1
+text.margin.left=5
+text.margin.right=5
+frame.top=0
+frame.bottom=0
+frame.left=0
+frame.right=0
+text.bold=false
+frame.expansion=0
+
+[MenuBar]
+inherits=PanelButtonCommand
+frame.element=menubar
+interior.element=menubar
+frame.bottom=0
+text.normal.color=#dfdfdf
+frame.expansion=0
+text.bold=false
+
+[MenuBarItem]
+inherits=PanelButtonCommand
+interior=true
+interior.element=menubaritem
+frame.element=menubaritem
+frame.top=2
+frame.bottom=2
+frame.left=2
+frame.right=2
+text.margin.left=4
+text.margin.right=4
+text.margin.top=0
+text.margin.bottom=0
+text.normal.color=#dfdfdf
+text.focus.color=white
+text.bold=false
+min_width=+0.3font
+min_height=+0.3font
+frame.expansion=0
+
+[TitleBar]
+inherits=PanelButtonCommand
+frame=false
+text.margin.top=2
+text.margin.bottom=2
+text.margin.left=2
+text.margin.right=2
+interior.element=titlebar
+indicator.size=16
+indicator.element=mdi
+text.normal.color=#787878
+text.focus.color=#dfdfdf
+text.bold=false
+text.italic=true
+frame.expansion=0
+
+[ComboBox]
+inherits=PanelButtonCommand
+frame.element=combo
+interior.element=combo
+interior=false
+frame.top=2
+frame.bottom=2
+frame.left=2
+frame.right=2
+text.margin.top=2
+text.margin.bottom=2
+text.margin.left=2
+text.margin.right=2
+text.focus.color=white
+text.press.color=#dfdfdf
+text.toggle.color=white
+frame.expansion=0
+
+[Menu]
+inherits=PanelButtonCommand
+frame.top=1
+frame.bottom=1
+frame.left=1
+frame.right=1
+frame.element=menu
+interior.element=menu
+text.normal.color=#dfdfdf
+text.shadow=false
+frame.expansion=0
+
+[GroupBox]
+inherits=GenericFrame
+frame=false
+text.shadow=0
+text.margin=0
+text.normal.color=#dfdfdf
+text.focus.color=white
+text.bold=false
+frame.expansion=0
+
+[TabBarFrame]
+inherits=GenericFrame
+frame=true
+frame.element=tabBarFrame
+interior=false
+frame.top=2
+frame.bottom=2
+frame.left=2
+frame.right=2
+
+[ToolTip]
+inherits=GenericFrame
+frame.top=3
+frame.bottom=3
+frame.left=3
+frame.right=3
+interior=true
+text.shadow=0
+text.margin=0
+interior.element=tooltip
+frame.element=tooltip
+frame.expansion=0
+
+[StatusBar]
+inherits=GenericFrame
+frame=false
+interior=false
+
+[Window]
+interior=true
+interior.element=window
diff --git a/.config/Kvantum/MateriaBlur/MateriaBlur.svg b/.config/Kvantum/MateriaBlur/MateriaBlur.svg
new file mode 100644
index 00000000..3169bf40
--- /dev/null
+++ b/.config/Kvantum/MateriaBlur/MateriaBlur.svg
@@ -0,0 +1,1370 @@
+
diff --git a/.config/Kvantum/kvantum.kvconfig b/.config/Kvantum/kvantum.kvconfig
new file mode 100644
index 00000000..bac51429
--- /dev/null
+++ b/.config/Kvantum/kvantum.kvconfig
@@ -0,0 +1,2 @@
+[General]
+theme=MateriaBlur
diff --git a/.config/awesome/asusctl/asusctl_button.lua b/.config/awesome/asusctl/asusctl_button.lua
new file mode 100644
index 00000000..54afef6c
--- /dev/null
+++ b/.config/awesome/asusctl/asusctl_button.lua
@@ -0,0 +1,34 @@
+local buttonTooltip = require("common.button_tooltip")
+local notif = require("common.notification")
+
+-- scripts
+local getProfileScript = "asusctl profile get"
+local nextProfileScript = "asusctl profile next && " .. getProfileScript
+local iconScript = os.getenv("HOME") .. "/scripts/wm_common/asusctl/asusctl-profile-icon.sh"
+local notifIcon = os.getenv("HOME") .. "/.config/awesome/themes/icons-global/armorpaint.svg"
+
+local function getButton(args)
+ local naughty = args.naughty
+ local beautiful = args.beautiful
+ local button = buttonTooltip(args, {
+ tooltipScript = getProfileScript,
+ btnDefaultText = "",
+ tooltipDefaultText = "Getting Profile ...",
+ buttonClickScript = nextProfileScript,
+ buttonIconScript = iconScript,
+ buttonClickCallback = function (button, icon, text)
+ notif.send(naughty, beautiful, {
+ title = "Profile Changed",
+ text = text,
+ icon = notifIcon,
+ timeout = 5,
+ position = notif.POSITION.TOP_MIDDLE,
+ preset = notif.PRESET.NORMAL,
+ })
+ end
+ })
+ return button
+end
+
+return getButton
+
diff --git a/.config/awesome/awesome_bar.lua b/.config/awesome/awesome_bar.lua
index f7fd732a..b0a38f22 100644
--- a/.config/awesome/awesome_bar.lua
+++ b/.config/awesome/awesome_bar.lua
@@ -122,7 +122,7 @@ local function getSystemTray(wibox, beautiful, gears, dpi)
gears.shape.rounded_rect(cr, dpi(width), dpi(height), 0) --dpi(beautiful.rect_radius))
end
local trayMargin = beautiful.systray_margin
- luciSysTrayColour:set_widget(wibox.layout.margin(systray, trayMargin, trayMargin, trayMargin, trayMargin))
+ luciSysTrayColour:set_widget(wibox.container.margin(systray, trayMargin, trayMargin, trayMargin, trayMargin))
return luciSysTrayColour
end
@@ -210,6 +210,8 @@ local function createAwesomeBar(args, s, lockScreenCommand)
local toggleMicButton = require("pipewire.toggle_mic_button")(args)
-- updates
local updatesButton = require("updates_widget.update_button")(args)
+ -- asus profile
+ local profileButton = require("asusctl.asusctl_button")(args)
-- Sports widget
local sportsWidget = require("sports.sports_widget")(args)
@@ -262,7 +264,7 @@ local function createAwesomeBar(args, s, lockScreenCommand)
-- show all tags regardless of the window
-- source = function() return root.tags() end
}
- local luciTagListColour = wibox.widget.background()
+ local luciTagListColour = wibox.container.background()
luciTagListColour:set_widget(luciTagList)
--luciTagListColour:set_fg(beautiful.fg_systray)
--luciTagListColour:set_bg(beautiful.bg_normal)
@@ -287,7 +289,7 @@ local function createAwesomeBar(args, s, lockScreenCommand)
-- Create the wibox
-- Luci4 bar customization
- s.mywibox = awful.wibox({
+ s.mywibox = awful.wibar({
screen = s,
fg = beautiful.fg_normal,
height = dpi(beautiful.topBar_height),
@@ -327,7 +329,8 @@ local function createAwesomeBar(args, s, lockScreenCommand)
wifiButton,
toggleVpnButton,
vpnReconnectButton,
- separator(beautiful, wibox, { showSeparator = true, margins = { left = dpi(1), right = dpi(5) } }),
+ separator(beautiful, wibox, { showSeparator = true, margins = { left = dpi(1), right = dpi(1) } }),
+ profileButton,
batteryWidget(args),
separator(beautiful, wibox, { margins = { left = dpi(2) } }),
redshiftButton,
diff --git a/.config/awesome/docker-widget/docker.lua b/.config/awesome/docker-widget/docker.lua
index 6503e806..ca3107ba 100644
--- a/.config/awesome/docker-widget/docker.lua
+++ b/.config/awesome/docker-widget/docker.lua
@@ -125,10 +125,10 @@ local function worker(user_args)
local icon = args.icon or ICONS_DIR .. 'docker.svg'
local number_of_containers = args.number_of_containers or -1
- local executable_name = args.executable_name or 'docker'
+ local executable_name = args.executable_name or 'docker'
-- 180 is the default width of the container details part of the widget and
-- 90 is the default width of the control buttons
- local max_widget_width = args.max_widget_width or 180 + 90
+ local max_widget_width = args.max_widget_width or 666 + 360
docker_widget:set_icon(icon)
diff --git a/.config/awesome/rc.lua b/.config/awesome/rc.lua
index 8a9516eb..c2912beb 100644
--- a/.config/awesome/rc.lua
+++ b/.config/awesome/rc.lua
@@ -37,6 +37,7 @@ beautiful.init(gears.filesystem.get_configuration_dir() .. config.chosenThemePat
-- Collision
require("collision")()
+local ruled = require("ruled")
local wibox = require("wibox")
-- Notification library
@@ -218,7 +219,12 @@ root.keys(globalkeys)
-- {{{ Rules
-- Rules to apply to new clients (through the "manage" signal).
-awful.rules.rules = require("awesome_rules").awesomeRules(awesomeArgs, awesomeApplications, clientkeys, clientbuttons)
+ruled.client.connect_signal("request::rules", function()
+ ruled.client.append_rules(
+ require("awesome_rules").awesomeRules(awesomeArgs, awesomeApplications, clientkeys, clientbuttons)
+ )
+end)
+-- awful.rules.rules = require("awesome_rules").awesomeRules(awesomeArgs, awesomeApplications, clientkeys, clientbuttons)
-- }}}
-- {{{ Signals
@@ -276,9 +282,14 @@ client.connect_signal("request::titlebars", function(c)
}
end)
+-- this is called for each screen when xrandr is called
+screen.connect_signal("property::outputs", function(s)
+ awful.spawn.with_shell("echo property_outputs_called")
+end)
+
-- Enable sloppy focus, so that focus follows mouse.
client.connect_signal("mouse::enter", function(c)
- c:emit_signal("request::activate", "mouse_enter", {raise = false})
+ c:emit_signal("request::activate", "mouse_enter", { raise = false })
end)
client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end)
diff --git a/.config/awesome/themes/luci4/application_icons.lua b/.config/awesome/themes/luci4/application_icons.lua
index 05f1fa5d..ed66d9ea 100644
--- a/.config/awesome/themes/luci4/application_icons.lua
+++ b/.config/awesome/themes/luci4/application_icons.lua
@@ -53,6 +53,8 @@ local cakeWallet_icon = baseDir .. "cake_wallet.svg"
local koreader_icon = baseDir .. "koreader.svg"
local sonobus_icon = baseDir .. "sonobus.svg"
local deltaChat_icon = baseDir .. "delta-chat.svg"
+local luakit_icon = baseDir .. "luakit.svg"
+local thorium_browser = baseDir .. "thorium-browser.svg"
-- LUCI4 ICON THEME
local icons = {
@@ -91,7 +93,9 @@ local icons = {
cakeWallet = cakeWallet_icon,
koreader = koreader_icon,
sonobus = sonobus_icon,
- deltaChat = deltaChat_icon
+ luakit = luakit_icon,
+ deltaChat = deltaChat_icon,
+ thoriumBrowser = thorium_browser
}
-- END LUCI4 Icon Theme
return icons
diff --git a/.config/awesome/themes/luci4/icons/luakit.svg b/.config/awesome/themes/luci4/icons/luakit.svg
new file mode 100644
index 00000000..1cf041e1
--- /dev/null
+++ b/.config/awesome/themes/luci4/icons/luakit.svg
@@ -0,0 +1,7 @@
+
+
\ No newline at end of file
diff --git a/.config/awesome/updates_widget/update_button.lua b/.config/awesome/updates_widget/update_button.lua
index 13089abf..da77a36e 100644
--- a/.config/awesome/updates_widget/update_button.lua
+++ b/.config/awesome/updates_widget/update_button.lua
@@ -12,7 +12,7 @@ local function getButton(args)
local naughty = args.naughty
local beautiful = args.beautiful
local button = buttonTooltip(args, {
- -- tooltipScript = statusScript,
+ tooltipScript = "checkupdates",
btnDefaultText = placeholderIcon,
tooltipDefaultText = "Update System",
buttonClickScript = toggleScript,
diff --git a/.config/awesome/vpn-buttons/vpn_common.lua b/.config/awesome/vpn-buttons/vpn_common.lua
index a63338cc..21f46332 100644
--- a/.config/awesome/vpn-buttons/vpn_common.lua
+++ b/.config/awesome/vpn-buttons/vpn_common.lua
@@ -3,7 +3,7 @@ local home = os.getenv("HOME")
config.toggleScript = home .. "/scripts/toggle-wifi-profile.sh toggle"
config.getScript = home .. "/scripts/toggle-wifi-profile.sh get"
-config.statusScript = home .. "/scripts/toggle-wifi-profile.sh status"
+config.statusScript = home .. "/scripts/toggle-wifi-profile.sh status" .. " && echo '' && " .. home .. "/scripts/mullvad_status.sh"
config.reconnectScript = home .. "/scripts/toggle-wifi-profile.sh reconnect"
config.wifiIconScript = home .. "/scripts/wm_common/wifi-status.sh -i"
config.wifiStatusScript = home .. "/scripts/wm_common/wifi-status.sh -s"
diff --git a/.config/awesome/wm_applications.lua b/.config/awesome/wm_applications.lua
index 6d647579..580a5063 100644
--- a/.config/awesome/wm_applications.lua
+++ b/.config/awesome/wm_applications.lua
@@ -25,11 +25,12 @@ local groupLuci4 = "luci4"
local groupLauncher = "launcher"
local browserCmd = "librewolf"
-local terminalCmd = "kitty"
+local terminalCmd = HomeEnv.TERMINAL_CMD -- or "st" --"kitty --single-instance"
local editorCmd = terminalCmd .. " -e " .. (os.getenv("EDITOR") or "nvim")
local modkey = "Mod4"
local homeDir = os.getenv("HOME")
+local appImageDir = homeDir .. "/apps/"
local browser = {
command = browserCmd,
@@ -194,7 +195,7 @@ local muteVolume = {
}
}
local brightnessUp = {
- command = homeDir .. "/scripts/shell_common/brightnessctl.sh --inc",
+ command = homeDir .. "/scripts/wm_common/brightnessctl.sh --inc",
description = "Increase screen brightness",
group = groupLuci4,
shell = false,
@@ -204,7 +205,7 @@ local brightnessUp = {
}
}
local brightnessDown = {
- command = homeDir .. "/scripts/shell_common/brightnessctl.sh --dec",
+ command = homeDir .. "/scripts/wm_common/brightnessctl.sh --dec",
description = "Decrease screen brightness",
group = groupLuci4,
shell = false,
@@ -264,7 +265,7 @@ local shareMenu = {
}
}
local shareMenuEncrypted = {
- -- launching with kitty is not a good idea, switch to something more compatible like bash
+ -- launching with terminalCmd is not a good idea, switch to something more compatible like bash
command = terminalCmd .. " " .. homeDir .. "/scripts/wm_common/launch_share_encrypted.sh",
description = "Zip, encrypt, get a share link and copy to clipboard",
group = groupLuci4,
@@ -301,11 +302,20 @@ local resetTor = {
group = groupLuci4,
shell = true,
keyBinding = {
- key1 = { modkey },
+ key1 = { modkey, "Mod1" },
key2 = "i"
}
}
-
+local resetPicom = {
+ command = homeDir .. "/scripts/reset-picom.sh",
+ description = "Reset picom",
+ group = groupLuci4,
+ shell = true,
+ keyBinding = {
+ key1 = { modkey, "Mod1" },
+ key2 = "p"
+ }
+}
local placement = {
centered = "centered",
bottom_right = "bottom_right",
@@ -345,6 +355,11 @@ local propertiesFloatingCentered = {
-- add properties to make the application follow defined window rules.
-- set favourite to true to add the application to the favourite menu.
local applications = {
+ luci4gtkwindow = {
+ command = { },
+ class = "Luci4GTKviewer",
+ properties = propertiesFloatingCentered
+ },
playPauseMedia = {
command = playPauseMedia
},
@@ -405,14 +420,47 @@ local applications = {
askOllama = {
command = askOllama
},
+ resetPicom = {
+ command = resetPicom
+ },
resetTor = {
command = resetTor
},
terminal = {
- label = "Kitty terminal",
- class = "kitty",
+ label = "Default Terminal",
+ class = "xterm-256color",
command = terminal,
subGroup = subGroup.terminals,
+ -- icon = icons.kitty,
+ favourite = true
+ },
+ kitty = {
+ label = "Kitty Terminal",
+ class = "kitty",
+ command = {
+ command = "kitty --single-instance",
+ description = "Open Kitty terminal",
+ group = groupLauncher,
+ shell = false,
+ },
+ subGroup = subGroup.terminals,
+ icon = icons.kitty,
+ favourite = true
+ },
+ terminalQuake = {
+ label = "Kitty Quake Terminal",
+ class = "kitty-quick-access",
+ command = {
+ command = "kitten quick-access-terminal",
+ description = "Open a Quake-style terminal",
+ group = groupLauncher,
+ shell = false,
+ keyBinding = {
+ key1 = { modkey, "Shift" },
+ key2 = "Return"
+ }
+ },
+ subGroup = subGroup.terminals,
icon = icons.kitty,
favourite = true
},
@@ -555,8 +603,12 @@ local applications = {
command = {
command = "keepassxc",
description = "Password manager",
- group = "",
- shell = false
+ group = groupLuci4,
+ shell = false,
+ keyBinding = {
+ key1 = { modkey, "Shift" },
+ key2 = "x"
+ }
},
subGroup = subGroup.utils,
-- icon = icons.keePass,
@@ -628,18 +680,18 @@ local applications = {
windowPlacement = placement.centered
}
},
- vivaldi = {
- label = "Vivaldi Browser",
- class = "Vivaldi-stable",
+ thorium = {
+ label = "Thorium Browser",
+ class = "",
favourite = true,
command = {
- command = "vivaldi",
- description = "Vivaldi web browser",
+ command = appImageDir .. "Thorium_Browser.AppImage",
+ description = "Thorium (Chromium based) web browser",
group = "",
shell = false
},
subGroup = subGroup.internet,
- icon = icons.vivaldi,
+ icon = icons.thoriumBrowser,
properties = {
-- tag = "2",
opacity = 1,
@@ -712,15 +764,19 @@ local applications = {
label = "Nheko",
favourite = true,
command = {
- command = "flatpak run im.nheko.Nheko",
+ command = "nheko",
description = "Nheko messenger",
- group = "",
- shell = false
+ group = groupLuci4,
+ shell = false,
+ keyBinding = {
+ key1 = { modkey },
+ key2 = "z"
+ }
},
subGroup = subGroup.messaging,
-- icon = icons.telegram,
properties = {
- tag = "8",
+ -- tag = "8",
floating = true,
width = 1100,
height = 800,
@@ -833,7 +889,7 @@ local applications = {
class = "",
favourite = true,
command = {
- command = homeDir .. "/apps/FreeTube.AppImage",
+ command = "freetube",
description = "Freetube YouTube Invidious client",
group = "",
shell = false
@@ -885,7 +941,7 @@ local applications = {
class = "",
favourite = false,
command = {
- command = homeDir .. "/apps/Inkscape.AppImage",
+ command = appImageDir .. "Inkscape.AppImage",
description = "Inkscape vector image editor",
group = "",
shell = false
@@ -911,7 +967,7 @@ local applications = {
class = "",
favourite = true,
command = {
- command = homeDir .. "/apps/Gimp.AppImage",
+ command = appImageDir .. "Gimp.AppImage",
description = "Gimp image editor",
group = "",
shell = false
@@ -946,6 +1002,23 @@ local applications = {
subGroup = subGroup.internet,
properties = propertiesFloatingCentered
},
+ luakit = {
+ label = "Luakit",
+ class = "Luakit",
+ favourite = true,
+ command = {
+ command = homeDir .. "/apps/Luakit",
+ description = "Luakit browser",
+ group = groupLuci4,
+ shell = false,
+ keyBinding = {
+ key1 = { modkey, "Shift" },
+ key2 = "b"
+ }
+ },
+ icon = icons.luakit,
+ subGroup = subGroup.internet
+ },
steam = {
label = "Steam",
class = "",
@@ -1000,7 +1073,7 @@ local applications = {
-- icon = icons.,
subGroup = subGroup.multimedia,
properties = {
- floating = true,
+ floating = true,
-- windowPlacement = placement.centered,
width = 800,
height = 800
@@ -1025,7 +1098,7 @@ local applications = {
class = "Vncviewer",
favourite = true,
command = {
- command = "flatpak run org.tigervnc.vncviewer",
+ command = "vncviewer",
description = "VNC viewer",
group = "",
shell = false
@@ -1052,7 +1125,7 @@ local applications = {
class = "Nextcloud",
favourite = false,
command = {
- command = homeDir .. "/apps/Nextcloud.AppImage",
+ command = appImageDir .. "Nextcloud.AppImage",
description = "Nextcloud cloud",
group = "",
shell = false
@@ -1156,7 +1229,7 @@ local applications = {
class = "",
favourite = true,
command = {
- command = homeDir .. "/apps/Picard",
+ command = "picard",
description = "MusicBrainz Picard, music tagging and organization",
group = "",
shell = false
@@ -1212,8 +1285,8 @@ local applications = {
class = "",
favourite = false,
command = {
- command = homeDir .. "/apps/Audacity.AppImage",
- description = "Audacity audio editor",
+ command = homeDir .. "/apps/Tenacity.AppImage",
+ description = "Tenacity audio editor",
group = "",
shell = false
},
diff --git a/.config/containers/systemd/ollama-cloud.container b/.config/containers/systemd/ollama-cloud.container
new file mode 100644
index 00000000..ac1c00aa
--- /dev/null
+++ b/.config/containers/systemd/ollama-cloud.container
@@ -0,0 +1,23 @@
+[Unit]
+Description=Ollama Cloud (on-demand, prompts leave this machine!)
+AssertPathIsMountPoint=/opt/ollama
+
+[Container]
+Image=docker.io/ollama/ollama:0.32.15
+ContainerName=ollama-cloud
+PublishPort=127.0.0.1:11435:11434
+# lives inside the @ollama subvol mounted at /opt/ollama
+Volume=/opt/ollama/cloud:/root/.ollama:U
+
+Environment=OLLAMA_HOST=0.0.0.0:11434
+Environment=OLLAMA_MODELS=/root/.ollama/models
+Environment=OLLAMA_NO_CLOUD=0
+
+[Service]
+Restart=on-failure
+RestartSec=10
+TimeoutStartSec=300
+
+# intentionally no [Install]: start on demand only
+# systemctl --user start ollama-cloud.service # summon
+# systemctl --user stop ollama-cloud.service # banish
diff --git a/.config/containers/systemd/ollama.container b/.config/containers/systemd/ollama.container
new file mode 100644
index 00000000..1f5ff90c
--- /dev/null
+++ b/.config/containers/systemd/ollama.container
@@ -0,0 +1,41 @@
+[Unit]
+Description=Ollama LLM Server (Flow Z13 Strix Halo, Vulkan)
+AssertPathIsMountPoint=/opt/ollama
+#After=network-online.target
+#RequiresMountsFor=/mnt/hd1
+
+[Container]
+Image=docker.io/ollama/ollama:0.32.15
+ContainerName=ollama
+PublishPort=127.0.0.1:11434:11434
+Volume=/opt/ollama/local:/root/.ollama:U
+#Volume=/mnt/hd1/llm/ollama:/root/.ollama:U
+
+AddDevice=/dev/dri
+AddDevice=/dev/kfd
+PodmanArgs=--group-add keep-groups --ipc=host
+
+Environment=OLLAMA_HOST=0.0.0.0:11434
+Environment=OLLAMA_MODELS=/root/.ollama/models
+Environment=OLLAMA_NO_CLOUD=1
+Environment=OLLAMA_TELEMETRY=0
+
+# Strix Halo verified path (issue #16462): Vulkan + iGPU enable
+Environment=OLLAMA_VULKAN=1
+Environment=OLLAMA_IGPU_ENABLE=1
+
+# Performance
+Environment=OLLAMA_FLASH_ATTENTION=1
+Environment=OLLAMA_KV_CACHE_TYPE=q8_0
+Environment=OLLAMA_KEEP_ALIVE=30m
+Environment=OLLAMA_NUM_PARALLEL=2
+#Environment=OLLAMA_CONTEXT_LENGTH=16384
+
+[Service]
+Restart=on-failure
+RestartSec=10
+TimeoutStartSec=1500
+
+[Install]
+WantedBy=default.target
+
diff --git a/.config/distrobox/distrobox.ini b/.config/distrobox/distrobox.ini
new file mode 100644
index 00000000..5c383359
--- /dev/null
+++ b/.config/distrobox/distrobox.ini
@@ -0,0 +1,84 @@
+# =====================================================================
+# distrobox.ini - manifest consumed by `distrobox assemble`
+#
+# create all:
+# distrobox assemble create --file distrobox.ini
+# preview the generated commands, nothing is executed:
+# distrobox assemble create --file distrobox.ini --dry-run
+# (RECOMMENDED) one entry only:
+# distrobox assemble create --file distrobox.ini -n android-dev
+# destroy and rebuild every entry below:
+# distrobox assemble create --file distrobox.ini --replace
+# destroy every entry below:
+# distrobox assemble rm --file distrobox.ini
+#
+# format facts:
+# * [section] IS the container name, keys map 1:1 to create flags
+# * list keys (additional_packages, additional_flags, volume,
+# init_hooks) take space-separated values and stack across lines
+# * an existing box is skipped unless --replace or replace=true on
+# its entry; NOTE: replace=true also leaks onto every entry listed
+# AFTER it, keep such entries at the bottom of the file
+# * ./distrobox.ini in the cwd is picked up without --file
+#
+# operational fact: package names are NOT resolved by assemble. They
+# install at the FIRST `distrobox enter` after creation, in ONE
+# all-or-nothing pacman/apt transaction; --dry-run validates nothing
+# about package names, so verify names before a --replace.
+#
+# docs: https://distrobox.it/usage/distrobox-assemble/
+# =====================================================================
+
+[android-dev]
+image=quay.io/toolbx/arch-toolbox:latest
+home=/mnt/lucie/distrobox-home/android-dev
+additional_packages="git curl fish neovim android-tools qemu-base"
+additional_flags="--device=/dev/dri/renderD128"
+additional_flags="--device=/dev/kvm"
+additional_flags="--group-add=kvm"
+pull=true
+replace=true
+# distrobox create -i quay.io/toolbx/arch-toolbox:latest -n android-dev --home /mnt/lucie/distrobox-home/android-dev --additional-packages "git curl fish neovim adb qemu-headless" y--additional-flags '--device=/dev/dri/renderD128 --device=/dev/kvm --group-add=kvm'
+
+[isol-arch]
+image=quay.io/toolbx/arch-toolbox:latest
+home=/mnt/lucie/distrobox-home/arch
+additional_packages="git curl fish neovim lua luarocks bat qt5ct qt6ct eza rsync freetype2 fontconfig gtk3"
+# GL/Vulkan diagnostics; mesa, vulkan-intel, vulkan-radeon already come from distrobox-init
+additional_packages="mesa-utils"
+# audio: client libs against the host's pipewire sockets, no servers in the box
+additional_packages="libpulse libpipewire alsa-utils alsa-plugins pamixer"
+# gstreamer core + codecs (gst-libav drags in ffmpeg + CLI)
+additional_packages="gst-plugins-base gst-plugins-good gst-libav"
+additional_packages="base-devel"
+pull=true
+replace=true
+# other possible additional packages: luakit, forkgram-bin
+# distrobox create -i quay.io/toolbx/arch-toolbox:latest -n isol-arch --home /mnt/lucie/distrobox-home/arch --additional-packages "git curl fish neovim"
+
+[ubuntu]
+image=quay.io/toolbx/ubuntu-toolbox:latest
+home=/mnt/lucie/distrobox-home/ubuntu
+additional_packages="git curl wget neovim"
+pull=true
+replace=true
+# distrobox create -i quay.io/toolbx/ubuntu-toolbox:latest -n ubuntu --home /mnt/distrobox-home/ubuntu --additional-packages "git curl wget neovim"
+
+[music-arch]
+image="quay.io/toolbx/arch-toolbox:latest"
+home="/mnt/lucie/distrobox-home/music"
+additional_packages="picard pipewire pipewire-pulse pipewire-alsa libpulse git curl fish neovim lua luarocks bat qt5ct qt6ct eza "
+pre_init_hooks="export SHELL=/usr/bin/fish;"
+# mnt volumes are already mounted by default
+pull=true
+replace=false
+
+[aider-box]
+image=quay.io/toolbx/arch-toolbox:latest
+home="/mnt/lucie/distrobox-home/aider"
+additional_packages="python python-pipx python-pip python-pytest ruff git openssh curl fish neovim ripgrep lua luarocks eza rsync bat"
+init_hooks="curl -LsSf https://aider.chat/install.sh | sh"
+pull=true
+root=false
+replace=true
+
diff --git a/.config/distrobox/link_configs.sh b/.config/distrobox/link_configs.sh
new file mode 100644
index 00000000..672b3845
--- /dev/null
+++ b/.config/distrobox/link_configs.sh
@@ -0,0 +1,45 @@
+#!/usr/bin/env bash
+#
+# link_configs.sh - Symlink dotfiles from source to destination home directory
+#
+# Usage:
+# ./link_configs.sh /home/lucie/dotfiles /home/lucie
+#
+# Arguments:
+# homeDirSource - Directory containing the original config files/dirs
+# homeDirDest - Destination home directory where symlinks will be created
+#
+# Notes:
+# - Edit the 'paths' array below to add/remove configurations
+# - Handles both files and directories (e.g. .config/fish/config.fish)
+# - Parent directories are created automatically in the destination
+# - Existing symlinks are overwritten (-f flag)
+
+homeDirSource="$1"
+homeDirDest="$2"
+
+paths=(
+ ".config/fontconfig"
+ ".local/share"
+ ".config/gtk-3.0"
+ ".config/gtk-4.0"
+ ".config/qt5ct"
+ ".config/qt6ct"
+ ".config/Kvantum"
+ ".config/fish/config.fish"
+ ".config/fish/conf.d"
+ ".config/fish/functions"
+ ".config/kitty"
+ ".config/nvim"
+ ".local/share/themes"
+ ".local/share/icons"
+ ".local/share/fonts"
+ "scripts"
+ ".shell_env"
+)
+
+for p in "${paths[@]}"; do
+ mkdir -p "${homeDirDest}/$(dirname "${p}")"
+ ln -sf "${homeDirSource}/${p}" "${homeDirDest}/${p}"
+done
+
diff --git a/.config/fish/config.fish b/.config/fish/config.fish
index 350c7391..a0eb16fa 100644
--- a/.config/fish/config.fish
+++ b/.config/fish/config.fish
@@ -150,10 +150,13 @@ if status is-interactive
### OS SPECIFIC ###
if test (uname -s) = "Darwin"
- set OS_NAME (sw_vers -productName)
+ set -g OS_NAME macos
else
- set OS_NAME (lsb_release -is)
- end
+ set -g OS_NAME linux
+ if test -e /etc/os-release
+ set -g OS_NAME (grep '^ID=' /etc/os-release | string replace -r '^ID="?(.+)"?$' '$1')
+ end
+ end
# if the variable $CONTAINER_ID exists, the sessions is in a distrobox container
if test -n "$CONTAINER_ID"
@@ -163,11 +166,11 @@ if status is-interactive
end
switch $OS_NAME
- case "Ubuntu"
+ case "ubuntu"
abbr --add ca batcat --color=always
alias cat='batcat -p --color=always'
abbr --add upd "sudo apt update && sudo apt upgrade -y"
- case "Arch"
+ case "arch"
abbr --add ca bat --color=always
alias cat='bat -p --color=always'
# pacman and yay
@@ -184,7 +187,7 @@ if status is-interactive
alias mirrors="sudo reflector --latest 50 --number 20 --sort score --save /etc/pacman.d/mirrorlist"
alias mirrora="sudo reflector --latest 50 --number 20 --sort age --save /etc/pacman.d/mirrorlist"
- case "Fedora"
+ case "fedora"
alias dmenu='wofi --dmenu'
abbr --add vi "nvim"
abbr --add upd "sudo dnf upgrade"
@@ -194,10 +197,10 @@ if status is-interactive
exec Hyprland
end
- case "macOS"
+ case "macos"
abbr --add ca bat --color=always
alias cat='bat -p --color=always'
- case "Linuxmint"
+ case "linuxmint"
abbr --add ca batcat --color=always
alias cat='batcat -p --color=always'
abbr --add upd "sudo apt update && sudo apt upgrade -y"
diff --git a/.config/gtk-4.0/settings.ini b/.config/gtk-4.0/settings.ini
index 56ec8add..11a959a6 100644
--- a/.config/gtk-4.0/settings.ini
+++ b/.config/gtk-4.0/settings.ini
@@ -6,10 +6,6 @@ gtk-theme-name=Material-Black-Pistachio
gtk-icon-theme-name=BeautyLine
gtk-font-name=Inter 10.5
gtk-cursor-theme-name=Remus-Black
-gtk-toolbar-style=GTK_TOOLBAR_BOTH
-gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
-gtk-button-images=1
-gtk-menu-images=1
gtk-enable-event-sounds=1
gtk-enable-input-feedback-sounds=1
gtk-xft-antialias=1
diff --git a/.config/kitty/quick-access-terminal.conf b/.config/kitty/quick-access-terminal.conf
new file mode 100644
index 00000000..ba2af3c9
--- /dev/null
+++ b/.config/kitty/quick-access-terminal.conf
@@ -0,0 +1,8 @@
+edge none
+# 50% width on a 2560 wide screen = 1280px
+columns 1100px
+# 66% height on a 1600 tall screen = 1056px
+lines 628px
+
+background_opacity 0.75
+kitty_override window_border_width=0
diff --git a/.config/kitty/ssh.conf b/.config/kitty/ssh.conf
new file mode 100644
index 00000000..203407f8
--- /dev/null
+++ b/.config/kitty/ssh.conf
@@ -0,0 +1,3 @@
+hostname *
+forward_remote_control yes
+
diff --git a/.config/luakit/luci_search.lua b/.config/luakit/luci_search.lua
new file mode 100644
index 00000000..1a00d915
--- /dev/null
+++ b/.config/luakit/luci_search.lua
@@ -0,0 +1,20 @@
+local settings = require("settings")
+
+local midoriUrl = os.getenv("SEARCH_AI_URL")
+local default = os.getenv("SEARCH_URL")
+local duckUrl = "https://duckduckgo.com/?q=%s"
+local duckAiUrl = "https://duck.ai/?q=%s"
+
+settings.window.search_engines = {
+ aur = "https://aur.archlinux.org/packages?K=%s",
+ midori = midoriUrl,
+ m = midoriUrl,
+ duck = duckUrl,
+ d = duckUrl,
+ ai = duckAiUrl,
+ searxng = default,
+ default = default,
+}
+
+settings.window.default_search_engine = "default"
+
diff --git a/.config/luakit/luci_session.lua b/.config/luakit/luci_session.lua
new file mode 100644
index 00000000..88fbc523
--- /dev/null
+++ b/.config/luakit/luci_session.lua
@@ -0,0 +1,35 @@
+local modes = require("modes")
+local session = require("session")
+
+-- :wsave — save current session to a file (like :w in vim)
+-- :wload — restore session from a file (like :source in vim)
+modes.add_cmds({
+ { ":wsave", "Save session to file.", function (w, o)
+ local file = o.arg
+ if not file or file == "" then
+ w:error("Usage: :wsave ")
+ return
+ end
+ session.save(file)
+ w:notify("Session saved to " .. file)
+ end, format = "{file}" },
+
+ { ":wload", "Load session from file.", function (w, o)
+ local file = o.arg
+ if not file or file == "" then
+ w:error("Usage: :wload ")
+ return
+ end
+ if not os.exists(file) then
+ w:error("File not found: " .. file)
+ return
+ end
+ -- Temporarily swap the session file path so restore() picks it up
+ local original = session.session_file
+ session.session_file = file
+ session.restore(false) -- false = don't delete the file
+ session.session_file = original
+ w:notify("Session loaded from " .. file)
+ end, format = "{file}" },
+})
+
diff --git a/.config/luakit/theme.lua b/.config/luakit/theme.lua
new file mode 100644
index 00000000..95198bf3
--- /dev/null
+++ b/.config/luakit/theme.lua
@@ -0,0 +1,101 @@
+--------------------------
+-- Default luakit theme --
+--------------------------
+
+local theme = {}
+
+-- Default settings
+theme.font = "12pt IosevkaTerm Nerd Font"
+theme.fg = "#fff"
+theme.bg = "#000"
+
+-- General colours
+theme.success_fg = "#0f0"
+theme.loaded_fg = "#33AADD"
+theme.error_fg = "#FFF"
+theme.error_bg = "#F00"
+
+-- Warning colours
+theme.warning_fg = "#F00"
+theme.warning_bg = "#FFF"
+
+-- Notification colours
+theme.notif_fg = "#444"
+theme.notif_bg = "#FFF"
+
+-- Menu colours
+theme.menu_fg = "#fff"
+theme.menu_bg = "#000"
+theme.menu_selected_fg = "#FF0"
+theme.menu_selected_bg = "#000"
+theme.menu_title_bg = "#fff"
+theme.menu_primary_title_fg = "#f00"
+theme.menu_secondary_title_fg = "#666"
+
+theme.menu_disabled_fg = "#999"
+theme.menu_disabled_bg = theme.menu_bg
+theme.menu_enabled_fg = theme.menu_fg
+theme.menu_enabled_bg = theme.menu_bg
+theme.menu_active_fg = "#060"
+theme.menu_active_bg = theme.menu_bg
+
+-- Proxy manager
+theme.proxy_active_menu_fg = '#000'
+theme.proxy_active_menu_bg = '#FFF'
+theme.proxy_inactive_menu_fg = '#888'
+theme.proxy_inactive_menu_bg = '#FFF'
+
+-- Statusbar specific
+theme.sbar_fg = "#fff"
+theme.sbar_bg = "#000"
+
+-- Downloadbar specific
+theme.dbar_fg = "#fff"
+theme.dbar_bg = "#000"
+theme.dbar_error_fg = "#F00"
+
+-- Input bar specific
+theme.ibar_fg = "#6f6" --"rgba(0,0,0,0)"
+theme.ibar_bg = "#000"
+
+-- Tab label
+theme.tab_fg = "#888"
+theme.tab_bg = "#222"
+theme.tab_hover_bg = "#292929"
+theme.tab_ntheme = "#ddd"
+theme.selected_fg = "#fff"
+theme.selected_bg = "#000"
+theme.selected_ntheme = "#ddd"
+theme.loading_fg = "#33AADD"
+theme.loading_bg = "#000"
+
+theme.selected_private_tab_bg = "#3d295b"
+theme.private_tab_bg = "#22254a"
+
+-- Trusted/untrusted ssl colours
+theme.trust_fg = "#0F0"
+theme.notrust_fg = "#F00"
+
+-- Follow mode hints
+theme.hint_font = "10px monospace, courier, sans-serif"
+theme.hint_fg = "#fff"
+theme.hint_bg = "#000088"
+theme.hint_border = "1px dashed #000"
+theme.hint_opacity = "0.3"
+theme.hint_overlay_bg = "rgba(255,255,153,0.3)"
+theme.hint_overlay_border = "1px dotted #000"
+theme.hint_overlay_selected_bg = "rgba(0,255,0,0.3)"
+theme.hint_overlay_selected_border = theme.hint_overlay_border
+
+-- General colour pairings
+theme.ok = { fg = "#000", bg = "#FFF" }
+theme.warn = { fg = "#F00", bg = "#FFF" }
+theme.error = { fg = "#FFF", bg = "#F00" }
+
+-- Gopher page style (override defaults)
+theme.gopher_light = { bg = "#E8E8E8", fg = "#17181C", link = "#03678D" }
+theme.gopher_dark = { bg = "#17181C", fg = "#E8E8E8", link = "#f90" }
+
+return theme
+
+-- vim: et:sw=4:ts=8:sts=4:tw=80
diff --git a/.config/luakit/userconf.lua b/.config/luakit/userconf.lua
new file mode 100644
index 00000000..f2906fb4
--- /dev/null
+++ b/.config/luakit/userconf.lua
@@ -0,0 +1,36 @@
+require("luci_session")
+require("luci_search")
+local settings = require("settings")
+
+settings.set_setting("session.always_save", true)
+settings.set_setting("application.prefer_dark_mode", true)
+settings.set_setting("window.close_with_last_tab", true)
+
+-- --------- --
+-- HARDENING --
+-- --------- --
+local fakeUserAgent = "Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0"
+local privacySettings = {
+ -- UserAgent
+ ["webview.user_agent"] = fakeUserAgent,
+ -- Disable DNS prefetching (reduces tracking via speculative DNS)
+ ["webview.enable_dns_prefetching"] = false,
+ -- Disable hyperlink auditing (used for ping-based tracking)
+ ["webview.enable_hyperlink_auditing"] = false,
+ -- Disable WebGL (reduces fingerprinting surface)
+ ["webview.enable_webgl"] = false,
+ -- Disable media stream access
+ ["webview.enable_media_stream"] = false,
+ -- Disable WebAudio fingerprinting
+ ["webview.enable_webaudio"] = false,
+}
+
+for key, value in pairs(privacySettings) do
+ settings.set_setting(key, value)
+end
+
+-- EXAMPLE override for a specific site that needs a different UA
+settings.set_setting("webview.user_agent",
+ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
+ { domain = "example.com" })
+
diff --git a/.config/mpv/input.conf b/.config/mpv/input.conf
new file mode 100644
index 00000000..9828d09d
--- /dev/null
+++ b/.config/mpv/input.conf
@@ -0,0 +1,2 @@
+Ctrl+Alt+r playlist-shuffle
+
diff --git a/.config/nsxiv/exec/key-handler b/.config/nsxiv/exec/key-handler
new file mode 100755
index 00000000..c7b8bb3d
--- /dev/null
+++ b/.config/nsxiv/exec/key-handler
@@ -0,0 +1,48 @@
+#!/bin/sh
+# nsxiv pipes the file(s) to act on to stdin: one path per line normally,
+# NUL-separated when nsxiv runs with -0 (NSXIV_USING_NULL=1). tr converts
+# either layout to plain lines; a NUL byte can never occur inside a real
+# filename, so it's a no-op in non-(-0) mode.
+
+dest="$HOME/Downloads/pictures"
+
+case "$1" in
+"c")
+ mkdir -p "$dest"
+ failed=$(tr '\0' '\n' | while IFS= read -r file; do
+ cp -- "$file" "$dest" || printf '%s\n' "$file"
+ done)
+ if [ -n "$failed" ]; then
+ notify-send -u critical "Copy failed: $failed"
+ else
+ notify-send "Copied to ~/Downloads/pictures"
+ fi
+ ;;
+"m")
+ mkdir -p "$dest"
+ failed=$(tr '\0' '\n' | while IFS= read -r file; do
+ mv -- "$file" "$dest" || printf '%s\n' "$file"
+ done)
+ if [ -n "$failed" ]; then
+ notify-send -u critical "Move failed: $failed"
+ else
+ notify-send "Moved to ~/Downloads/pictures"
+ fi
+ ;;
+"y")
+ tr '\0' '\n' | while IFS= read -r file; do
+ case "$file" in
+ *.png) t=image/png ;;
+ *.jpg|*.jpeg) t=image/jpeg ;;
+ *) t=$(file -b --mime-type -- "$file") ;;
+ esac
+ xclip -selection clipboard -t "$t" -i "$file" &
+ done
+ notify-send "Copied image to clipboard"
+ ;;
+"e")
+ tr '\0' '\n' | while IFS= read -r file; do
+ "$HOME/apps/Gimp.AppImage" "$file" &
+ done
+ ;;
+esac
diff --git a/.config/picom.conf b/.config/picom.conf
index 8953ce71..8503d615 100644
--- a/.config/picom.conf
+++ b/.config/picom.conf
@@ -76,7 +76,7 @@ shadow-exclude = [
# Fade windows in/out when opening/closing and when opacity changes,
# unless no-fading-openclose is used.
# fading = false
-fading = true;
+fading = false;
# Opacity change between steps while fading in. (0.01 - 1.0, defaults to 0.028)
# fade-in-step = 0.028
@@ -90,7 +90,7 @@ fade-out-step = 0.03;
fade-delta = 4;
# Specify a list of conditions of windows that should not be faded.
-fade-exclude = [ "class_g = 'guitarpro.exe'" ];
+fade-exclude = [ "class_g = 'guitarpro.exe'", "class_g = 'ForkgramDesktop'" ];
# Do not fade on window open/close.
no-fading-openclose = false;
@@ -166,7 +166,9 @@ rounded-corners-exclude = [
# Parameters for background blurring, see the *BLUR* section for more information.
-blur-method = "dual_kawase";
+blur-method = "none";
+#"dual_kawase";
+
# blur-size = 12
#
# blur-deviation = false
@@ -207,7 +209,8 @@ blur-background-exclude = [
"window_type = 'desktop'",
"class_g = 'guitarpro.exe'",
"class_g = 'librewolf'",
- "_GTK_FRAME_EXTENTS@"
+ "_GTK_FRAME_EXTENTS@",
+ "class_g = 'ForkgramDesktop'"
];
#################################
@@ -223,8 +226,7 @@ blur-background-exclude = [
# Specify the backend to use: `xrender`, `glx`, `egl` or `xr_glx_hybrid`.
# `xrender` is the default one.
#
-backend = "egl"; #"glx"
-#backend = "xrender";
+backend = "egl";
# Use higher precision during rendering, and apply dither when presenting the
# rendered screen. Reduces banding artifacts, but might cause performance
@@ -382,7 +384,7 @@ use-damage = true;
# clipping applied. Useful for screenshot tools, where you need to be able to
# see through transparent parts of the window.
#
-transparent-clipping-exclude = [ "class_g = 'guitarpro.exe'" ]
+transparent-clipping-exclude = [ "class_g = 'guitarpro.exe'", "class_g = 'ForkgramDesktop'" ]
# Set the log level. Possible values are:
# "trace", "debug", "info", "warn", "error"
diff --git a/.config/tmux/tmux.conf b/.config/tmux/tmux.conf
new file mode 100644
index 00000000..fdfc4550
--- /dev/null
+++ b/.config/tmux/tmux.conf
@@ -0,0 +1,83 @@
+# ── Prefix ──────────────────────────────────────
+#unbind C-b
+#set -g prefix C-a
+#bind C-a send-prefix
+set -g prefix C-b
+
+# ── Terminal / General ──────────────────────────
+set -g default-terminal "tmux-256color"
+set -ga terminal-overrides ",st-256color:Tc"
+set -g history-limit 50000
+set -g escape-time 0
+set -g mouse on
+set -g base-index 1
+set -g pane-base-index 1
+set -g renumber-windows on
+set -g set-titles on
+set -g focus-events on
+setw -g automatic-rename on
+
+# ── Vi Mode ─────────────────────────────────────
+setw -g mode-keys vi
+bind-key -T copy-mode-vi 'v' send-keys -X begin-selection
+bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel "xclip -selection clipboard"
+bind-key -T copy-mode-vi 'Y' send-keys -X copy-pipe "xclip -selection clipboard"
+bind-key -T copy-mode-vi 'r' send-keys -X rectangle-toggle
+
+# ── Splits ──────────────────────────────────────
+bind | split-window -h -c "#{pane_current_path}"
+bind - split-window -v -c "#{pane_current_path}"
+unbind '"'
+unbind %
+
+# ── Pane Navigation (vim-style) ────────────────
+bind h select-pane -L
+bind j select-pane -D
+bind k select-pane -U
+bind l select-pane -R
+
+# ── Pane Resizing (repeatable) ─────────────────
+bind -r H resize-pane -L 5
+bind -r J resize-pane -D 5
+bind -r K resize-pane -U 5
+bind -r L resize-pane -R 5
+
+# ── Windows ────────────────────────────────────
+bind -r C-h previous-window
+bind -r C-l next-window
+bind Tab last-window
+
+# ── Reload Config ──────────────────────────────
+bind r source-file ~/.tmux.conf \; display-message "Config reloaded!"
+
+# ── Dark Theme ─────────────────────────────────
+# Palette: near-black bg, muted gray fg, dim accent
+set -g status-position bottom
+set -g status-justify left
+set -g status-bg "#0a0a0a"
+set -g status-fg "#555555"
+set -g status-left-length 40
+set -g status-right-length 60
+set -g status-left "#[fg=#3a3a4a,bold] #S "
+set -g status-right "#[fg=#3a3a4a] %Y-%m-%d %H:%M "
+setw -g window-status-format "#[fg=#333333] #I:#W "
+setw -g window-status-current-format "#[fg=#5a5a6a,bold] #I:#W "
+setw -g window-status-separator ""
+set -g pane-border-style fg="#1a1a1a"
+set -g pane-active-border-style fg="#2a2a3a"
+set -g message-style bg="#0a0a0a",fg="#5a5a6a"
+set -g display-panes-colour "#2a2a3a"
+set -g display-panes-active-colour "#4a4a5a"
+
+
+
+# ── Plugins (via TPM) ───────────────────────────
+set -g @plugin 'tmux-plugins/tpm'
+set -g @plugin 'tmux-plugins/tmux-resurrect'
+set -g @plugin 'tmux-plugins/tmux-continuum'
+set -g @resurrect-capture-pane-contents 'on'
+set -g @continuum-restore 'on'
+set -g @continuum-save-interval '15'
+
+set-environment -g TMUX_PLUGIN_MANAGER_PATH '~/.config/tmux/plugins'
+run '~/.config/tmux/plugins/tpm/tpm'
diff --git a/.config/xonsh/rc.d/00_rc.py b/.config/xonsh/rc.d/00_rc.py
index c8c024a0..00d07e72 100644
--- a/.config/xonsh/rc.d/00_rc.py
+++ b/.config/xonsh/rc.d/00_rc.py
@@ -128,17 +128,19 @@ def isDistrobox():
system = platform.system()
if system == "Darwin":
- OS_NAME = subprocess.check_output(
- ["sw_vers", "-productName"], text=True
- ).strip()
+ OS_NAME = "macos"
else:
+ OS_NAME = system.lower()
try:
- OS_NAME = subprocess.check_output(
- ["lsb_release", "-is"], text=True
- ).strip()
- except Exception:
- OS_NAME = system
-
+ with open("/etc/os-release", "r") as f:
+ for line in f:
+ if line.startswith("ID="):
+ # Strip 'ID=', then strip quotes and whitespace
+ OS_NAME = line.split("=", 1)[1].strip().strip('"').strip("'").lower()
+ break
+ except FileNotFoundError:
+ pass
+
__xonsh__.env['OS_NAME'] = OS_NAME
# --------------------------------------------------------
diff --git a/.config/xonsh/rc.d/20_aliases.py b/.config/xonsh/rc.d/20_aliases.py
index d61781da..e191c364 100644
--- a/.config/xonsh/rc.d/20_aliases.py
+++ b/.config/xonsh/rc.d/20_aliases.py
@@ -147,6 +147,7 @@
# --------------------------------------------------------
aliases.update({
":q": "exit",
+ ":s": "exec startx",
"df": "df -h",
"free": "free -m",
})
@@ -179,4 +180,9 @@
})
abbrevs["l"] = "exa -al --color=always --group-directories-first --icons"
+ # --------------------------------------------------------
+ # Distrobox
+ # --------------------------------------------------------
+ #aliases["aider-box"] = ["distrobox", "enter", "aider-box", "--", "fish"]
+ aliases["aider-box"] = ["distrobox", "enter", "aider-box"]
diff --git a/.config/xonsh/rc.d/21_aliases_os.py b/.config/xonsh/rc.d/21_aliases_os.py
index 946d31ca..3946badf 100644
--- a/.config/xonsh/rc.d/21_aliases_os.py
+++ b/.config/xonsh/rc.d/21_aliases_os.py
@@ -27,7 +27,7 @@
archUpdateCmd += " && sudo flatpak update --assumeyes"
- if OS_NAME == "Arch":
+ if OS_NAME == "arch":
abbrevs["ca"] = "bat --color=always"
abbrevs["upd"] = archUpdateCmd
aliases["cat"] = "bat -p --color=always"
@@ -45,12 +45,12 @@
"mirrora": "sudo reflector --latest 50 --number 20 --sort age --save /etc/pacman.d/mirrorlist",
})
- elif OS_NAME == "Ubuntu":
+ elif OS_NAME == "ubuntu":
abbrevs["ca"] = "batcat --color=always"
abbrevs["upd"] = debUpdateCmd
aliases["cat"] = "batcat -p --color=always"
- elif OS_NAME == "Fedora":
+ elif OS_NAME == "fedora":
abbrevs["vi"] = "nvim"
abbrevs["upd"] = "sudo dnf upgrade"
@@ -61,11 +61,11 @@
except Exception:
pass
- elif OS_NAME == "macOS":
+ elif OS_NAME == "macos":
abbrevs["ca"] = "bat --color=always"
aliases["cat"] = "bat -p --color=always"
- elif OS_NAME == "Linuxmint":
+ elif OS_NAME == "linuxmint":
abbrevs["ca"] = "batcat --color=always"
abbrevs["upd"] = debUpdateCmd
aliases["cat"] = "batcat -p --color=always"
diff --git a/.config/xonsh/rc.d/65_prompt.py b/.config/xonsh/rc.d/65_prompt.py
index b8fc74ef..3bf23b61 100644
--- a/.config/xonsh/rc.d/65_prompt.py
+++ b/.config/xonsh/rc.d/65_prompt.py
@@ -24,7 +24,10 @@ def my_prompt():
cwdCol = ColourAnsi.CYAN.value
branchCol = ColourAnsi.MAGENTA.value
promptCol = ColourAnsi.DARK_GREEN.value
+ separatorCol = ColourAnsi.BRIGHT_BLACK.value
+ atSeparator = f"{separatorCol}{RESET}"
+ colSeparator = f"{separatorCol}:{RESET}"
user = os.environ.get("USER", "user")
host = socket.gethostname().split(".")[0]
cwd = os.getcwd()
@@ -35,10 +38,11 @@ def my_prompt():
spacing = ""
return (
- f"{userCol}{user}{RESET}@{hostCol}{host}{RESET}:"
+ f"{userCol}{user}{RESET}{atSeparator}{hostCol}{host}{RESET}{colSeparator}"
f"{cwdCol}{cwd}{RESET}"
f"{branchCol}{branch}{RESET}{spacing}"
- f"{promptCol} {RESET}"
+ # f"{promptCol} {RESET}"
+ f"{promptCol} {RESET}"
)
__xonsh__.env['PROMPT'] = my_prompt
diff --git a/.config/xonsh/rc.d/70-ampache.py b/.config/xonsh/rc.d/70-ampache.py
new file mode 100644
index 00000000..bc0cd5a4
--- /dev/null
+++ b/.config/xonsh/rc.d/70-ampache.py
@@ -0,0 +1,15 @@
+# ~/.config/xonsh/rc.d/70-ampache.py
+# Interactive guard
+if not XSH.env.get("XONSH_INTERACTIVE", False):
+ # aliases specific to non interactive shell
+ pass
+else:
+ import os
+ _amp = os.environ.get("AMPACHE_XONSH_PATH", os.path.expanduser("~/Code/Python/ampache-data-xonsh"))
+ _glue = os.path.join(_amp, "ampache.xsh")
+ if not os.path.isfile(_glue):
+ print("[ampache] not loaded - " + _glue + " not found")
+ print("[ampache] clone the repo or fix AMPACHE_XONSH_PATH")
+ else:
+ exec(compile(open(_glue).read(), _glue, "exec"))
+
diff --git a/.gitmodules b/.gitmodules
index 482071c9..e1cdb72f 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -16,3 +16,6 @@
[submodule "scripts/shell_common/SportsFetch"]
path = scripts/shell_common/SportsFetch
url = https://github.com/icefields/SportsFetchLibrary.git
+[submodule "scripts/wm_common/Luci4-GTK-Window"]
+ path = scripts/wm_common/Luci4-GTK-Window
+ url = https://github.com/icefields/Luci4-GTK-Window.git
diff --git a/.local/bin/distrobox-app-example b/.local/bin/distrobox-app-example
index 9efaf675..4b2f7d69 100755
--- a/.local/bin/distrobox-app-example
+++ b/.local/bin/distrobox-app-example
@@ -1,7 +1,15 @@
-#!/bin/bash
+#!/usr/bin/env bash
+
+# Sometime, when the condition has multiple branches, it might be necessary to
+# add a container guard. "If in a container just execute the application".
+# if [ -n "$CONTAINER_ID" ]; then
+# exec /bin/full/path/of/executable "$@"
+# # no exit necessary: exec replaces the process and does not return here.
+# fi
+
if [ -x "/bin/full/path/of/executable" ]; then
- . /bin/full/path/of/executable
+ exec /bin/full/path/of/executable "$@"
else
- /usr/bin/distrobox enter container-name -- application "$@"
+ exec /usr/bin/distrobox enter container-name -- application "$@"
fi
diff --git a/.local/bin/freetube b/.local/bin/freetube
new file mode 100755
index 00000000..a07e6a62
--- /dev/null
+++ b/.local/bin/freetube
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+
+# find the latest version of the AppImage
+appimage="$(find "$HOME/apps" -maxdepth 1 -type f -iname 'freetube*.AppImage' -executable | sort -V | tail -n 1)"
+# check first local installation, then appimage, lastly distrobox
+if [ -x "/usr/bin/freetube" ]; then
+ exec /usr/bin/freetube
+elif [ -n "$appimage" ]; then
+ exec "$appimage"
+else
+ exec distrobox enter ubuntu -- freetube
+fi
+
diff --git a/.local/bin/nsxiv-dir b/.local/bin/nsxiv-dir
new file mode 100755
index 00000000..7061e19c
--- /dev/null
+++ b/.local/bin/nsxiv-dir
@@ -0,0 +1,49 @@
+#!/bin/sh
+set -u
+
+# Graceful failure if no arguments are provided
+if [ "$#" -eq 0 ]; then
+ printf "Usage: %s \n" "$0" >&2
+ exit 1
+fi
+
+if [ -f "$1" ]; then
+ dir="$(cd "$(dirname "$1")" && pwd)"
+ target="$dir/$(basename "$1")"
+
+ # Include regular files AND symlinks; null-separated for safety.
+ # Pipe directly to nsxiv -i -0 (stdin + null separator) to avoid xargs ARG_MAX limits.
+ find "$dir" -maxdepth 1 \( -type f -o -type l \) -print0 | sort -z | \
+ awk -v RS='\0' -v ORS='\0' -v file="$target" '
+ $0 == file { print; found = 1; next }
+ found { print }
+ { before[++count] = $0 }
+ END {
+ # Fallback: if find missed the target, print it first anyway
+ if (!found) print file
+ for (i = 1; i <= count; i++) print before[i]
+ }
+ ' | nsxiv -i -0
+
+elif [ -d "$1" ]; then
+ # Replace shell process with nsxiv
+ exec nsxiv "$1"
+else
+ # Fallback for direct arguments or weird paths
+ exec nsxiv "$@"
+fi
+
+
+# SIMPLE:
+# #!/bin/sh
+#
+# if [ -f "$1" ]; then
+# dir="$(dirname "$1")"
+# exec nsxiv "$1" "$dir"
+# elif [ -d "$1" ]; then
+# # If it's already a directory, just open it
+# exec nsxiv "$1"
+# else
+# exec nsxiv "$@"
+# fi
+
diff --git a/.local/bin/picard b/.local/bin/picard
new file mode 100755
index 00000000..b079f88e
--- /dev/null
+++ b/.local/bin/picard
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+if [ -x "/usr/bin/picard" ]; then
+ exec /usr/bin/picard "$@"
+else
+ exec /usr/bin/distrobox enter music-arch -- picard "$@"
+fi
+
diff --git a/.local/bin/vncviewer b/.local/bin/vncviewer
new file mode 100755
index 00000000..0488a566
--- /dev/null
+++ b/.local/bin/vncviewer
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+
+if [ -x "/usr/bin/vncviewer" ]; then
+ exec /usr/bin/vncviewer "$@"
+elif command -v flatpak >/dev/null 2>&1 && flatpak info org.tigervnc.vncviewer >/dev/null 2>&1; then
+ exec flatpak run org.tigervnc.vncviewer "$@"
+else
+ exec /usr/bin/distrobox enter isol-arch -- vncviewer "$@"
+fi
+
diff --git a/.local/share/applications/thorium-browser.desktop b/.local/share/applications/thorium-browser.desktop
new file mode 100644
index 00000000..cabdccf1
--- /dev/null
+++ b/.local/share/applications/thorium-browser.desktop
@@ -0,0 +1,80 @@
+[Desktop Entry]
+Version=1.0
+Name=Thorium Browser
+# Only KDE 4 seems to use GenericName, so we reuse the KDE strings. (on isol-arch)
+# From Ubuntu's language-pack-kde-XX-base packages, version 9.04-20090413.
+GenericName=Web Browser (Thorium)
+GenericName[en_GB]=Web Browser (Thorium)
+# Gnome and KDE 3 uses Comment.
+Comment=Access the Internet
+Comment[ar]=الدخول إلى الإنترنت
+Comment[bg]=Достъп до интернет
+Comment[bn]=ইন্টারনেটটি অ্যাক্সেস করুন
+Comment[ca]=Accedeix a Internet
+Comment[cs]=Přístup k internetu
+Comment[da]=Få adgang til internettet
+Comment[de]=Internetzugriff
+Comment[el]=Πρόσβαση στο Διαδίκτυο
+Comment[en_GB]=Access the Internet
+Comment[es]=Accede a Internet.
+Comment[et]=Pääs Internetti
+Comment[fi]=Käytä internetiä
+Comment[fil]=I-access ang Internet
+Comment[fr]=Accéder à Internet
+Comment[gu]=ઇંટરનેટ ઍક્સેસ કરો
+Comment[he]=גישה אל האינטרנט
+Comment[hi]=इंटरनेट तक पहुंच स्थापित करें
+Comment[hr]=Pristup Internetu
+Comment[hu]=Internetelérés
+Comment[id]=Akses Internet
+Comment[it]=Accesso a Internet
+Comment[ja]=インターネットにアクセス
+Comment[kn]=ಇಂಟರ್ನೆಟ್ ಅನ್ನು ಪ್ರವೇಶಿಸಿ
+Comment[ko]=인터넷 연결
+Comment[lt]=Interneto prieiga
+Comment[lv]=Piekļūt internetam
+Comment[ml]=ഇന്റര്നെറ്റ് ആക്സസ് ചെയ്യുക
+Comment[mr]=इंटरनेटमध्ये प्रवेश करा
+Comment[nb]=Gå til Internett
+Comment[nl]=Verbinding maken met internet
+Comment[or]=ଇଣ୍ଟର୍ନେଟ୍ ପ୍ରବେଶ କରନ୍ତୁ
+Comment[pl]=Skorzystaj z internetu
+Comment[pt]=Aceder à Internet
+Comment[pt_BR]=Acessar a internet
+Comment[ro]=Accesaţi Internetul
+Comment[ru]=Доступ в Интернет
+Comment[sk]=Prístup do siete Internet
+Comment[sl]=Dostop do interneta
+Comment[sr]=Приступите Интернету
+Comment[sv]=Gå ut på Internet
+Comment[ta]=இணையத்தை அணுகுதல்
+Comment[te]=ఇంటర్నెట్ను ఆక్సెస్ చెయ్యండి
+Comment[th]=เข้าถึงอินเทอร์เน็ต
+Comment[tr]=İnternet'e erişin
+Comment[uk]=Доступ до Інтернету
+Comment[vi]=Truy cập Internet
+Comment[zh_CN]=访问互联网
+Comment[zh_HK]=連線到網際網路
+Comment[zh_TW]=連線到網際網路
+Exec=/home/lucie/apps/Thorium_Browser.AppImage %U
+StartupNotify=true
+Terminal=false
+Icon=chromium
+Type=Application
+Categories=Network;WebBrowser;
+# very invasive, do not register MimeTypes ever!
+# MimeType=application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/chromium;
+Actions=new-window;new-private-window;
+
+
+[Desktop Action new-window]
+Name=New Window (Thorium)
+Name[en_GB]=New Window (Thorium)
+Exec=/home/lucie/apps/Thorium_Browser.AppImage
+
+[Desktop Action new-private-window]
+Name=New Incognito Window (Thorium)
+Name[en_GB]=New Incognito window (Thorium)
+Exec=/home/lucie/apps/Thorium_Browser.AppImage --incognito
+StartupWMClass=chromium
+
diff --git a/.local/share/fonts/Victor/LICENSE.txt b/.local/share/fonts/Victor/LICENSE.txt
new file mode 100755
index 00000000..6dd3d05b
--- /dev/null
+++ b/.local/share/fonts/Victor/LICENSE.txt
@@ -0,0 +1,93 @@
+Copyright (c) 2024, Rune Bjørnerås (https://github.com/rubjo)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
\ No newline at end of file
diff --git a/.local/share/fonts/Victor/README.md b/.local/share/fonts/Victor/README.md
new file mode 100644
index 00000000..e88ce2e0
--- /dev/null
+++ b/.local/share/fonts/Victor/README.md
@@ -0,0 +1,48 @@
+# Nerd Fonts
+
+This is an archived font from the Nerd Fonts release v3.4.0.
+
+For more information see:
+* https://github.com/ryanoasis/nerd-fonts/
+* https://github.com/ryanoasis/nerd-fonts/releases/latest/
+
+# Victor Mono
+
+**Victor Mono** is programming font with semi-connected cursive italics and symbol ligatures.
+
+For more information have a look at the upstream website: https://rubjo.github.io/victor-mono
+
+Version: 1.5.6
+
+## Which font?
+
+### TL;DR
+
+* Pick your font family:
+ * If you are limited to monospaced fonts (because of your terminal, etc) then pick a font with `Nerd Font Mono` (or `NFM`).
+ * If you want to have bigger icons (usually around 1.5 normal letters wide) pick a font without `Mono` i.e. `Nerd Font` (or `NF`). Most terminals support this, but ymmv.
+ * If you work in a proportional context (GUI elements or edit a presentation etc) pick a font with `Nerd Font Propo` (or `NFP`).
+
+### Ligatures
+
+Ligatures are generally preserved in the patched fonts.
+Nerd Fonts `v2.0.0` had no ligatures in the `Nerd Font Mono` fonts, this has been dropped with `v2.1.0`.
+If you have a ligature-aware terminal and don't want ligatures you can (usually) disable them in the terminal settings.
+
+### Explanation
+
+Once you narrow down your font choice of family (`Droid Sans`, `Inconsolata`, etc) and style (`bold`, `italic`, etc) you have 2 main choices:
+
+#### `Option 1: Download already patched font`
+
+ * For a stable version download a font package from the [release page](https://github.com/ryanoasis/nerd-fonts/releases)
+ * Or download the development version from the folders here
+
+#### `Option 2: Patch your own font`
+
+ * Patch your own variations with the various options provided by the font patcher (i.e. not include all symbols for smaller font size)
+
+For more information see: [The FAQ](https://github.com/ryanoasis/nerd-fonts/wiki/FAQ-and-Troubleshooting#which-font)
+
+[SIL-RFN]:http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web_fonts_and_RFNs#14cbfd4a
+
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-Bold.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-Bold.ttf
new file mode 100644
index 00000000..037ba466
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-Bold.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-BoldItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-BoldItalic.ttf
new file mode 100644
index 00000000..7cff7b56
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-BoldItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-BoldOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-BoldOblique.ttf
new file mode 100644
index 00000000..a65b8d11
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-BoldOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-ExtraLight.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-ExtraLight.ttf
new file mode 100644
index 00000000..b92bc918
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-ExtraLight.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-ExtraLightItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-ExtraLightItalic.ttf
new file mode 100644
index 00000000..fb274228
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-ExtraLightItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-ExtraLightOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-ExtraLightOblique.ttf
new file mode 100644
index 00000000..f11f799f
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-ExtraLightOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-Italic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-Italic.ttf
new file mode 100644
index 00000000..681566b3
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-Italic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-Light.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-Light.ttf
new file mode 100644
index 00000000..9eec4d08
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-Light.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-LightItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-LightItalic.ttf
new file mode 100644
index 00000000..583b9f7b
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-LightItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-LightOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-LightOblique.ttf
new file mode 100644
index 00000000..e72a169d
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-LightOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-Medium.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-Medium.ttf
new file mode 100644
index 00000000..8a50d365
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-Medium.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-MediumItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-MediumItalic.ttf
new file mode 100644
index 00000000..3178e4c5
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-MediumItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-MediumOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-MediumOblique.ttf
new file mode 100644
index 00000000..582306a4
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-MediumOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-Oblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-Oblique.ttf
new file mode 100644
index 00000000..0e182a9c
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-Oblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-Regular.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-Regular.ttf
new file mode 100644
index 00000000..fadf8de7
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-Regular.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-SemiBold.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-SemiBold.ttf
new file mode 100644
index 00000000..f786d0fc
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-SemiBold.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-SemiBoldItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-SemiBoldItalic.ttf
new file mode 100644
index 00000000..d6a78bee
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-SemiBoldItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-SemiBoldOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-SemiBoldOblique.ttf
new file mode 100644
index 00000000..4076718d
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-SemiBoldOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-Thin.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-Thin.ttf
new file mode 100644
index 00000000..a38f99e7
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-Thin.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-ThinItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-ThinItalic.ttf
new file mode 100644
index 00000000..1320e90b
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-ThinItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFont-ThinOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFont-ThinOblique.ttf
new file mode 100644
index 00000000..f1158688
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFont-ThinOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-Bold.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-Bold.ttf
new file mode 100644
index 00000000..eafd1942
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-Bold.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-BoldItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-BoldItalic.ttf
new file mode 100644
index 00000000..158b220e
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-BoldItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-BoldOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-BoldOblique.ttf
new file mode 100644
index 00000000..2b3d41b1
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-BoldOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-ExtraLight.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-ExtraLight.ttf
new file mode 100644
index 00000000..c11c5aea
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-ExtraLight.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-ExtraLightItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-ExtraLightItalic.ttf
new file mode 100644
index 00000000..a70ec7cb
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-ExtraLightItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-ExtraLightOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-ExtraLightOblique.ttf
new file mode 100644
index 00000000..5304793b
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-ExtraLightOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-Italic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-Italic.ttf
new file mode 100644
index 00000000..3e6362b9
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-Italic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-Light.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-Light.ttf
new file mode 100644
index 00000000..4a7c4da6
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-Light.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-LightItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-LightItalic.ttf
new file mode 100644
index 00000000..71a264df
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-LightItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-LightOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-LightOblique.ttf
new file mode 100644
index 00000000..2537a54b
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-LightOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-Medium.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-Medium.ttf
new file mode 100644
index 00000000..af77b03c
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-Medium.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-MediumItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-MediumItalic.ttf
new file mode 100644
index 00000000..549cc733
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-MediumItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-MediumOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-MediumOblique.ttf
new file mode 100644
index 00000000..cad46b85
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-MediumOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-Oblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-Oblique.ttf
new file mode 100644
index 00000000..20c7b763
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-Oblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-Regular.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-Regular.ttf
new file mode 100644
index 00000000..c60815b5
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-Regular.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-SemiBold.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-SemiBold.ttf
new file mode 100644
index 00000000..36e9528a
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-SemiBold.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-SemiBoldItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-SemiBoldItalic.ttf
new file mode 100644
index 00000000..373bff61
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-SemiBoldItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-SemiBoldOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-SemiBoldOblique.ttf
new file mode 100644
index 00000000..9b427fb7
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-SemiBoldOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-Thin.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-Thin.ttf
new file mode 100644
index 00000000..706ff183
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-Thin.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-ThinItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-ThinItalic.ttf
new file mode 100644
index 00000000..b1109745
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-ThinItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontMono-ThinOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontMono-ThinOblique.ttf
new file mode 100644
index 00000000..ce1e6e2a
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontMono-ThinOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Bold.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Bold.ttf
new file mode 100644
index 00000000..d7aa85b9
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Bold.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-BoldItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-BoldItalic.ttf
new file mode 100644
index 00000000..5b7ba32b
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-BoldItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-BoldOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-BoldOblique.ttf
new file mode 100644
index 00000000..c15e787e
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-BoldOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-ExtraLight.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-ExtraLight.ttf
new file mode 100644
index 00000000..4c789d6d
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-ExtraLight.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-ExtraLightItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-ExtraLightItalic.ttf
new file mode 100644
index 00000000..c7b40b01
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-ExtraLightItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-ExtraLightOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-ExtraLightOblique.ttf
new file mode 100644
index 00000000..6bfe4499
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-ExtraLightOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Italic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Italic.ttf
new file mode 100644
index 00000000..ffcd732b
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Italic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Light.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Light.ttf
new file mode 100644
index 00000000..e0ca612e
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Light.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-LightItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-LightItalic.ttf
new file mode 100644
index 00000000..5afd9327
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-LightItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-LightOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-LightOblique.ttf
new file mode 100644
index 00000000..44e70d68
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-LightOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Medium.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Medium.ttf
new file mode 100644
index 00000000..ed6730fd
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Medium.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-MediumItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-MediumItalic.ttf
new file mode 100644
index 00000000..9a86bdf7
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-MediumItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-MediumOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-MediumOblique.ttf
new file mode 100644
index 00000000..ac9bb54d
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-MediumOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Oblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Oblique.ttf
new file mode 100644
index 00000000..02582712
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Oblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Regular.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Regular.ttf
new file mode 100644
index 00000000..add7aae6
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Regular.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-SemiBold.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-SemiBold.ttf
new file mode 100644
index 00000000..5230bcfa
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-SemiBold.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-SemiBoldItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-SemiBoldItalic.ttf
new file mode 100644
index 00000000..e4a7ef67
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-SemiBoldItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-SemiBoldOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-SemiBoldOblique.ttf
new file mode 100644
index 00000000..ed496c41
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-SemiBoldOblique.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Thin.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Thin.ttf
new file mode 100644
index 00000000..ae5c2652
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-Thin.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-ThinItalic.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-ThinItalic.ttf
new file mode 100644
index 00000000..b557188f
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-ThinItalic.ttf differ
diff --git a/.local/share/fonts/Victor/VictorMonoNerdFontPropo-ThinOblique.ttf b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-ThinOblique.ttf
new file mode 100644
index 00000000..65ff3880
Binary files /dev/null and b/.local/share/fonts/Victor/VictorMonoNerdFontPropo-ThinOblique.ttf differ
diff --git a/.local/share/nemo/actions/compress-7z.nemo_action b/.local/share/nemo/actions/compress-7z.nemo_action
new file mode 100644
index 00000000..f5929cda
--- /dev/null
+++ b/.local/share/nemo/actions/compress-7z.nemo_action
@@ -0,0 +1,9 @@
+[Nemo Action]
+Name=Compress to 7z
+Comment=Compress the selection to .7z using 7-Zip
+Exec=/home/lucie/scripts/shell_common/compress-7z.sh 7z %F
+Icon-Name=package-x-generic
+Selection=notnone
+Extensions=any
+Quote=double
+
diff --git a/.local/share/nemo/actions/compress-tar_gz.nemo_action b/.local/share/nemo/actions/compress-tar_gz.nemo_action
new file mode 100644
index 00000000..f23a22b1
--- /dev/null
+++ b/.local/share/nemo/actions/compress-tar_gz.nemo_action
@@ -0,0 +1,9 @@
+[Nemo Action]
+Name=Compress to .tar.gz
+Comment=Compress the selection to .tar.gz using 7-Zip
+Exec=/home/lucie/scripts/shell_common/compress-7z.sh tar.gz %F
+Icon-Name=package-x-generic
+Selection=notnone
+Extensions=any
+Quote=double
+
diff --git a/.local/share/nemo/actions/compress-tar_xz.nemo_action b/.local/share/nemo/actions/compress-tar_xz.nemo_action
new file mode 100644
index 00000000..072fe014
--- /dev/null
+++ b/.local/share/nemo/actions/compress-tar_xz.nemo_action
@@ -0,0 +1,9 @@
+[Nemo Action]
+Name=Compress to .tar.xz
+Comment=Compress the selection to .tar.xz using 7-Zip
+Exec=/home/lucie/scripts/shell_common/compress-7z.sh tar.xz %F
+Icon-Name=package-x-generic
+Selection=notnone
+Extensions=any
+Quote=double
+
diff --git a/.local/share/nemo/actions/extract-7z.nemo_action b/.local/share/nemo/actions/extract-7z.nemo_action
new file mode 100644
index 00000000..ae8f0081
--- /dev/null
+++ b/.local/share/nemo/actions/extract-7z.nemo_action
@@ -0,0 +1,11 @@
+# ~/.local/share/nemo/actions/extract-7z.nemo_action
+[Nemo Action]
+Active=true
+Name=Extract to EXTRACTED (7z)
+Comment=Silently extract archive into 0_EXTRACTED subdirectory
+Exec=/home/lucie/scripts/shell_common/extract-7z.sh %F
+Icon-Name=archive-extract
+Selection=Any
+Extensions=7z;zip;rar;tar;gz;bz2;xz;zst;iso;deb;arj;ace;cab;
+Quote=double
+
diff --git a/Pictures/wallpapers/2b4e6784.jpg b/Pictures/wallpapers/2b4e6784.jpg
new file mode 100644
index 00000000..1fabeadf
Binary files /dev/null and b/Pictures/wallpapers/2b4e6784.jpg differ
diff --git a/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_01_Enemy_Lookout_4K.jpg b/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_01_Enemy_Lookout_4K.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_04_Sickness_4K.jpg b/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_04_Sickness_4K.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_05_We_Are_Soldiers_4K.jpg b/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_05_We_Are_Soldiers_4K.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_07_Journey_4K.jpg b/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_07_Journey_4K.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_08_Flags_4K.jpg b/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_08_Flags_4K.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_09_Opportunity_4K.jpg b/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_09_Opportunity_4K.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_10_Obstacle_4K.jpg b/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_10_Obstacle_4K.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_12_Mission_4K.jpg b/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_12_Mission_4K.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_13_Baikal_4K.jpg b/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_13_Baikal_4K.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_14_Fields_4K.jpg b/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_14_Fields_4K.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_15_Fire_4K.jpg b/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_15_Fire_4K.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_16_Flare_4K.jpg b/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_16_Flare_4K.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_Keyart_4K.jpg b/Pictures/wallpapers/Last Train Home/LTH_Wallpaper_Keyart_4K.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/cryptopsy-wallpaper-tra.png b/Pictures/wallpapers/cryptopsy-wallpaper-tra.png
new file mode 100644
index 00000000..01cdf5d1
Binary files /dev/null and b/Pictures/wallpapers/cryptopsy-wallpaper-tra.png differ
diff --git a/Pictures/wallpapers/cryptopsy-wallpaper.jpg b/Pictures/wallpapers/cryptopsy-wallpaper.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/death-spiritural_healing-anime.jpg b/Pictures/wallpapers/death-spiritural_healing-anime.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/dylan dog scopo vita - wallpaper.jpg b/Pictures/wallpapers/dylan dog scopo vita - wallpaper.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/eggcat.png b/Pictures/wallpapers/eggcat.png
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/frank_reynolds01-x4plus-anime.jpg b/Pictures/wallpapers/frank_reynolds01-x4plus-anime.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/frankreynolds01_upscayl_6x_realesrgan-x4plus-anime.jpg b/Pictures/wallpapers/frankreynolds01_upscayl_6x_realesrgan-x4plus-anime.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/lasttrainhome01.png b/Pictures/wallpapers/lasttrainhome01.png
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/necrophagist-water.jpg b/Pictures/wallpapers/necrophagist-water.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/shroom-wallpaper.jpeg b/Pictures/wallpapers/shroom-wallpaper.jpeg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/stray03.png b/Pictures/wallpapers/stray03.png
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/stray06.png b/Pictures/wallpapers/stray06.png
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/stray09.png b/Pictures/wallpapers/stray09.png
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/stray10.png b/Pictures/wallpapers/stray10.png
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/wallhalla-28-2560x1440.jpg b/Pictures/wallpapers/wallhalla-28-2560x1440.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/wallhalla-50-3840x2160.jpg b/Pictures/wallpapers/wallhalla-50-3840x2160.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/wallhalla-56-2560x1440.jpg b/Pictures/wallpapers/wallhalla-56-2560x1440.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/wallhalla-57-2560x1440.jpg b/Pictures/wallpapers/wallhalla-57-2560x1440.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/wallhalla-63-2560x1440.jpg b/Pictures/wallpapers/wallhalla-63-2560x1440.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/wallhalla-65-2560x1440.jpg b/Pictures/wallpapers/wallhalla-65-2560x1440.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/wallhalla-76-2560x1440.jpg b/Pictures/wallpapers/wallhalla-76-2560x1440.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/wallhalla-77-2560x1440.jpg b/Pictures/wallpapers/wallhalla-77-2560x1440.jpg
old mode 100755
new mode 100644
diff --git a/Pictures/wallpapers/wallhalla-8-2560x1536.jpg b/Pictures/wallpapers/wallhalla-8-2560x1536.jpg
old mode 100755
new mode 100644
diff --git a/README.md b/README.md
index d505c719..5db695b6 100644
--- a/README.md
+++ b/README.md
@@ -131,6 +131,8 @@ Create `~/.shell_env`, and add the following variables.
```
# variable used to determine if the system is in dev. ie. xonsh errors will be more verbose
IS_DEV_MODE="false"
+# terminal to be used everywhere. "st" or "kitty --single-instance"
+TERMINAL_CMD="st"
TOR_PASSWORD="torPasswordForTheResetTorScript"
GOOGLE_API_KEY="yourGoogleApiKey"
@@ -145,9 +147,25 @@ VPN_HOME_USER="user"
VPN_HOME_PASS="pass"
OVPN_HOME_CONFIG="/ovpn/config/location/on/disk/home.ovpn"
+# search
+SEARCH_URL="https://searx.instance.org/search?q=%s"
+SEARCH_AI_URL="https://ai.search.org/?q=%s"
+
+# shlink
+SHLINK_BASE_URL="https://sl.chmod666.ca"
+SHLINK_API_KEY="3de3c045-ba9f-4cbc-9354-55ce89d834b0"
+
# currency conversion API
CURRENCY_API = "https://currency.api.url"
+# cheat sheet self hosted url
+CHTSH_URL="https://cheat.chmod666.ca"
+
+# NPB fetcher library location (clone from github.com/icefields)
+NPB_FETCH_PATH="/home/user/Code/Python/BaseballNpbFetch"
+# Xonsh-Ampache integration (https://github.com/icefields/ampache-data-xonsh)
+AMPACHE_XONSH_INTEGRATION_PATH="/home/user/Code/Python/ampache-data-xonsh"
+
# location variables, for weather, red filter, etc...
LOCATION_COORDINATES="43.6426,-79.3871"
@@ -166,6 +184,9 @@ KEEPASS_SECRET_KEYFILE="/file/to/unlock/secred-db/secrets.keyfile"
ANDROID_SDK_ROOT="/opt/android-sdk"
ANDROID_HOME="/opt/android-sdk"
+# Ubuntu Touch development, set this in case both Docker and Podman are installed
+CLICKABLE_DOCKER_COMMAND="podman"
+
# UI related variables moved to .xprofile
```
diff --git a/scripts/mullvad_status.sh b/scripts/mullvad_status.sh
new file mode 100755
index 00000000..e83f8af4
--- /dev/null
+++ b/scripts/mullvad_status.sh
@@ -0,0 +1,73 @@
+#!/usr/bin/env bash
+#
+# mullvad-status.sh — query Mullvad's connection check API
+# deps: curl, jq
+
+set -euo pipefail
+
+readonly API_URL="https://am.i.mullvad.net/json"
+readonly TIMEOUT=10
+
+requireDeps() {
+ local dep
+ for dep in curl jq; do
+ if ! command -v "$dep" >/dev/null 2>&1; then
+ printf 'error: required dependency %s not found in PATH\n' "$dep" >&2
+ exit 1
+ fi
+ done
+}
+
+fetchStatus() {
+ # --proto '=https' blocks redirect-based protocol downgrades
+ curl -fsSL --proto '=https' --max-time "$TIMEOUT" "$API_URL"
+}
+
+printStatus() {
+ jq -r '
+ def yesNo:
+ if . == true then "Yes"
+ elif . == false then "No"
+ else "Unknown" end;
+
+ "IP: \(.ip // "N/A")",
+ "Country: \(.country // "N/A")",
+ "City: \(.city // "N/A")",
+ "Longitude: \(.longitude // "N/A")",
+ "Latitude: \(.latitude // "N/A")",
+ "Mullvad Exit IP: \(.mullvad_exit_ip | yesNo)",
+ "Mullvad Exit IP Hostname: \(.mullvad_exit_ip_hostname // "N/A")",
+ "Mullvad Server Type: \(.mullvad_server_type // "N/A")",
+ "Organization: \(.organization // "N/A")",
+ "Blacklisted: \(.blacklisted.blacklisted | yesNo)",
+ (if .blacklisted.blacklisted == true
+ and (.blacklisted.results | type) == "array"
+ and (.blacklisted.results | length) > 0
+ then
+ "Blacklisted On:",
+ (.blacklisted.results[]
+ | " - \(if type == "object"
+ then "\(.name // "?") (\(.link // "no link"))"
+ else tostring end)")
+ else empty end)
+ '
+}
+
+main() {
+ requireDeps
+
+ local response
+ if ! response="$(fetchStatus)"; then
+ printf 'error: failed to reach Mullvad API (%s)\n' "$API_URL" >&2
+ exit 1
+ fi
+ if [[ -z "$response" ]]; then
+ echo "error: empty response from API" >&2
+ exit 1
+ fi
+
+ printStatus <<< "$response"
+}
+
+main "$@"
+
diff --git a/scripts/share_find.sh b/scripts/share_find.sh
index cee947e4..f7da59b5 100755
--- a/scripts/share_find.sh
+++ b/scripts/share_find.sh
@@ -40,7 +40,9 @@ findArgs+=(-o -iname "*.webp")
findArgs+=(-o -iname "*.pdf")
findArgs+=(-o -iname "*.jpeg")
findArgs+=(-o -iname "*.zip")
+findArgs+=(-o -iname "*.7z")
findArgs+=(-o -iname "*.txt")
+findArgs+=(-o -iname "*.md")
findArgs+=(-o -iname "*.mp3")
findArgs+=(-o -iname "*.flac")
findArgs+=(-o -iname "*.wav")
diff --git a/scripts/shell_common/compress-7z.sh b/scripts/shell_common/compress-7z.sh
new file mode 100755
index 00000000..7cacda58
--- /dev/null
+++ b/scripts/shell_common/compress-7z.sh
@@ -0,0 +1,89 @@
+#!/usr/bin/env bash
+# compress7z.sh: helper for Nemo actions, compress selection with 7-Zip
+# usage: compress7z.sh [path ...]
+set -u
+
+usage() { echo "usage: $0 " >&2; exit 2; }
+
+fmt="${1:-}"
+[ "$#" -gt 0 ] && shift
+case "$fmt" in tar.gz|tar.xz|7z) ;; *) usage ;; esac
+[ "$#" -gt 0 ] || usage
+
+notify() {
+ command -v notify-send >/dev/null 2>&1 && notify-send -u "$1" -a "Nemo 7-Zip" "$2" "$3"
+}
+
+szBin=""
+for candidate in 7zz 7z 7za; do
+ if command -v "$candidate" >/dev/null 2>&1; then
+ szBin="$candidate"
+ break
+ fi
+done
+if [ -z "$szBin" ]; then
+ notify critical "7-Zip not found" "Arch: sudo pacman -S 7zip"
+ exit 1
+fi
+
+firstPath="$1"
+targetDir="$(dirname -- "$firstPath")"
+
+if [ "$#" -eq 1 ]; then
+ baseName="$(basename -- "$firstPath")"
+ # strip the extension of plain files, keep hidden files and dirs intact
+ if [ -f "$firstPath" ] && [[ "$baseName" == *.* && "$baseName" != .* ]]; then
+ baseName="${baseName%.*}"
+ fi
+else
+ baseName="$(basename -- "$targetDir")"
+fi
+
+# never overwrite anything: name.tar.gz, name (1).tar.gz, ...
+outPath="$targetDir/$baseName.$fmt"
+count=1
+while [ -e "$outPath" ]; do
+ outPath="$targetDir/$baseName ($count).$fmt"
+ count=$((count + 1))
+done
+
+# 7-Zip stores entry paths exactly as typed, so run it from the parent dir
+relPaths=()
+for p in "$@"; do
+ relPaths+=("${p#"$targetDir"/}")
+done
+
+runInTarget() { ( cd "$targetDir" && "$szBin" "$@" ); }
+
+# scratch dir on the same filesystem (/tmp is tmpfs on Arch, big payloads would eat RAM)
+tmpDir="$targetDir/.compress7z.$$"
+if ! mkdir "$tmpDir" 2>/dev/null; then
+ tmpDir="$(mktemp -d "${TMPDIR:-/tmp}/compress7z.XXXXXX")"
+fi
+logFile="$(mktemp "${TMPDIR:-/tmp}/compress7z.log.XXXXXX")"
+trap 'rm -rf "$tmpDir" "$logFile"' EXIT
+
+fail() {
+ rm -f -- "$outPath" # never leave a half-written archive behind
+ errMsg="$(tail -n 5 "$logFile" | tr '\n' ' ' | cut -c1-250)"
+ notify critical "7-Zip compression failed" "$errMsg"
+ exit 1
+}
+
+case "$fmt" in
+ 7z)
+ runInTarget a -t7z -mx=9 "$outPath" -- "${relPaths[@]}" >"$logFile" 2>&1 || fail
+ ;;
+ tar.gz)
+ runInTarget a -ttar "$tmpDir/$baseName.tar" -- "${relPaths[@]}" >"$logFile" 2>&1 || fail
+ ( cd "$tmpDir" && "$szBin" a -tgzip "$outPath" -- "$baseName.tar" ) >>"$logFile" 2>&1 || fail
+ ;;
+ tar.xz)
+ runInTarget a -ttar "$tmpDir/$baseName.tar" -- "${relPaths[@]}" >"$logFile" 2>&1 || fail
+ ( cd "$tmpDir" && "$szBin" a -txz "$outPath" -- "$baseName.tar" ) >>"$logFile" 2>&1 || fail
+ ;;
+esac
+
+notify normal "Compressed with $szBin" "Created $(basename -- "$outPath")"
+exit 0
+
diff --git a/scripts/shell_common/midori-fetch b/scripts/shell_common/midori-fetch
index 67b9bba5..b593606b 160000
--- a/scripts/shell_common/midori-fetch
+++ b/scripts/shell_common/midori-fetch
@@ -1 +1 @@
-Subproject commit 67b9bba5e137028f73c0889bdb29eb9b3ace8830
+Subproject commit b593606bf9c003f889f5bc9d78688ea55cf1a342
diff --git a/scripts/wm_common/Luci4-GTK-Window b/scripts/wm_common/Luci4-GTK-Window
new file mode 160000
index 00000000..e887d322
--- /dev/null
+++ b/scripts/wm_common/Luci4-GTK-Window
@@ -0,0 +1 @@
+Subproject commit e887d32288a52602bb2c9d555058873b981e2972
diff --git a/scripts/wm_common/asusctl/asusctl-profile-icon.sh b/scripts/wm_common/asusctl/asusctl-profile-icon.sh
new file mode 100755
index 00000000..298cf51f
--- /dev/null
+++ b/scripts/wm_common/asusctl/asusctl-profile-icon.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+# asusctl-profile-icon.sh
+# Returns a Nerd Font symbol for the active asusctl power profile.
+# Codepoints verified from Nerd Fonts v3.5.1 glyphnames.json [16]
+
+profile=$(asusctl profile get | awk '/^Active profile:/ {print $3}')
+
+case "$profile" in
+ "Quiet")
+ printf '\uf186' # fa-moon U+F186
+ ;;
+ "Performance")
+ printf '\uf0e7' # fa-bolt U+F0E7
+ ;;
+ "Balanced")
+ printf '\uf24e' # fa-balance_scale U+F24E
+ ;;
+ *)
+ printf '\uf013' # fa-cog U+F013 (fallback)
+ ;;
+esac
+
diff --git a/scripts/shell_common/brightnessctl.sh b/scripts/wm_common/brightnessctl.sh
similarity index 80%
rename from scripts/shell_common/brightnessctl.sh
rename to scripts/wm_common/brightnessctl.sh
index 2b780dc3..0fa82905 100755
--- a/scripts/shell_common/brightnessctl.sh
+++ b/scripts/wm_common/brightnessctl.sh
@@ -1,5 +1,8 @@
#!/usr/bin/env bash
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+source "$SCRIPT_DIR/notify-debounced.sh"
+
iDIR="$HOME/scripts/wm_common/icons/notifications" # /.config/mako/icons"
# Detect notification method
@@ -53,10 +56,12 @@ notify_user() {
-i "$icon" \
"Brightness: ${current}%"
else
- notify-send -h string:x-canonical-private-synchronous:sys-notify \
- -u low \
- -i "$icon" \
- "Brightness: ${current}%"
+ debounce_notify 0.3 "notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i \"\$icon\" \"Brightness : \${current}%\""
+
+ #notify-send -h string:x-canonical-private-synchronous:sys-notify \
+ # -u low \
+ # -i "$icon" \
+ # "Brightness: ${current}%"
fi
}
diff --git a/scripts/wm_common/lockscreen.sh b/scripts/wm_common/lockscreen.sh
index 7efff9df..e2a56c2f 100755
--- a/scripts/wm_common/lockscreen.sh
+++ b/scripts/wm_common/lockscreen.sh
@@ -1,6 +1,6 @@
#!/bin/sh
# Auto-generated by i3lock_theme_generator.lua
-# Generated: 2026-05-12T00:04:37Z
+# Generated: 2026-07-23T17:44:02Z
# Themed for i3lock-color (AUR: i3lock-color)
# DO NOT EDIT — regenerate via: require("themes.i3lock_theme_generator").generate()
#
diff --git a/scripts/wm_common/notify-debounced.sh b/scripts/wm_common/notify-debounced.sh
new file mode 100755
index 00000000..d44c73ce
--- /dev/null
+++ b/scripts/wm_common/notify-debounced.sh
@@ -0,0 +1,46 @@
+#!/usr/bin/env bash
+
+# Use /run/user/$UID for PID files instead of /tmp
+PID_DIR="/run/user/$(id -u)"
+if [[ ! -d "$PID_DIR" ]]; then
+ # Fallback to ~/.local/run if /run/user is not available
+ PID_DIR="$HOME/.local/run"
+ mkdir -p "$PID_DIR"
+fi
+DEBOUNCE_PID_FILE="$PID_DIR/debounce_notify.pid"
+
+# Usage: debounce_notify ""
+# WARNING: Uses eval. Ensure is strictly controlled,
+# as eval with untrusted input leads to command injection.
+debounce_notify() {
+ local delay="$1"
+ local cmdString="$2"
+
+ # Kill any pending notification process
+ if [[ -f "$DEBOUNCE_PID_FILE" ]]; then
+ local prevPid
+ prevPid=$(cat "$DEBOUNCE_PID_FILE" 2>/dev/null)
+ if [[ -n "$prevPid" ]] && kill -0 "$prevPid" 2>/dev/null; then
+ kill "$prevPid" 2>/dev/null
+ # No wait needed. The previous script has already exited,
+ # so the subshell was reparented to init, which reaps it.
+ fi
+ fi
+
+ # Fork a background subshell that waits, evals the command, and cleans up
+ (
+ sleep "$delay"
+ eval "$cmdString"
+ rm -f "$DEBOUNCE_PID_FILE" # Clean up PID file after execution
+ ) &
+
+ local subPid=$!
+
+ # Detach the background job so it doesn't receive SIGHUP
+ # when the parent script exits.
+ disown "$subPid" 2>/dev/null
+
+ # Store the PID of the subshell
+ echo "$subPid" > "$DEBOUNCE_PID_FILE"
+}
+
diff --git a/scripts/wm_common/start_picom_delayed.sh b/scripts/wm_common/start_picom_delayed.sh
index d5f344ed..4c941915 100755
--- a/scripts/wm_common/start_picom_delayed.sh
+++ b/scripts/wm_common/start_picom_delayed.sh
@@ -3,5 +3,7 @@
#if ! pgrep -f "picom" ;
# then
# sleep 3
- picom -b
+ picom -b --no-frame-pacing --log-level warn --log-file /tmp/picom.log
+ # picom -b --log-level warn --log-file /tmp/picom.log
+ #picom -b
#fi
diff --git a/scripts/wm_common/update-sys.sh b/scripts/wm_common/update-sys.sh
index f4722114..8d594e5e 100755
--- a/scripts/wm_common/update-sys.sh
+++ b/scripts/wm_common/update-sys.sh
@@ -10,6 +10,14 @@ command_exists() {
command -v "$1" &> /dev/null
}
+sysTerm() {
+ case "$TERMINAL_CMD" in
+ st*) $TERMINAL_CMD -t "$1" -e sh -c "$2" ;;
+ kitty*) $TERMINAL_CMD --title "$1" sh -c "$2" ;;
+ *) $TERMINAL_CMD -e sh -c "$2" ;;
+ esac
+}
+
# Calculate updates for each service
AUR=$(yay -Qua | wc -l)
OFFICIAL=$(checkupdates | wc -l)
@@ -41,7 +49,8 @@ if [ "$1" = "update" ]; then
UPDATE_CMD="$UPDATE_CMD && distrobox upgrade --all"
fi
- kitty --title update-sys sh -c "$UPDATE_CMD"
+ sysTerm update-sys "$UPDATE_CMD"
+ # kitty --title update-sys sh -c "$UPDATE_CMD"
fi
# If there aren't any parameters, return the total number of updates
diff --git a/scripts/wm_common/volume.sh b/scripts/wm_common/volume.sh
index be240175..08093306 100755
--- a/scripts/wm_common/volume.sh
+++ b/scripts/wm_common/volume.sh
@@ -1,5 +1,8 @@
#!/bin/bash
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+source "$SCRIPT_DIR/notify-debounced.sh"
+
#iDIR="$HOME/.config/mako/icons"
iDIR="$HOME/scripts/wm_common/icons/notifications"
@@ -35,14 +38,15 @@ notify_user() {
if [[ "$NOTIFY_CMD" == "dunstify" ]]; then
dunstify -r 9991 -u low -i "$(get_icon)" "Volume : $(get_volume) %"
else
- notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$(get_icon)" "Volume : $(get_volume) %"
+ debounce_notify 0.3 "notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i \"\$(get_icon)\" \"Volume : \$(get_volume) %\""
+ #notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$(get_icon)" "Volume : $(get_volume) %"
fi
}
# Increase Volume
inc_volume() {
if command -v pamixer &>/dev/null; then
- pamixer --increase 1 && notify_user
+ pamixer --increase 4 && notify_user
elif command -v amixer &>/dev/null; then
amixer -D pulse sset Master 2%+ && notify_user
else
@@ -55,7 +59,7 @@ inc_volume() {
# Decrease Volume
dec_volume() {
if command -v pamixer &>/dev/null; then
- pamixer --decrease 1 && notify_user
+ pamixer --decrease 4 && notify_user
elif command -v amixer &>/dev/null; then
amixer -D pulse sset Master 2%- && notify_user
else