diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml new file mode 100644 index 0000000..06dc541 --- /dev/null +++ b/.github/workflows/docs.yaml @@ -0,0 +1,34 @@ +# by https://github.com/danth/stylix/blob/master/.github/workflows/docs.yml +name: Docs +on: + push: + branches: + - main +jobs: + build: + name: Build + permissions: + contents: read + runs-on: nixos-latest + steps: + - name: Nix Config + run: | + mkdir -p $HOME/.config + mkdir -p $HOME/.config/nix + echo experimental-features = nix-command flakes pipe-operators >> $HOME/.config/nix/nix.conf + echo access-tokens = github.com=${{ secrets.GITHUBTOKEN }} >> $HOME/.config/nix/nix.conf + nix profile install nixpkgs#nodejs + - name: Build docs + run: nix -L build git+https://git.dashie.org/${{ forgejo.repository }}.git?rev=${{ forgejo.sha }}#docs --no-write-lock-file + - name: Prepare docs for upload + run: cp -r --dereference --no-preserve=mode,ownership result/ public/ + # - name: Upload artifact + # uses: https://data.forgejo.org/forgejo/upload-artifact@v4 + # with: + # path: public/ + - name: Publish Page + uses: https://data.forgejo.org/actions/git-pages@v2 + with: + site: https://username.pages.dashie.org/reponame/ + token: ${{ forge.token }} + source: public/ diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml new file mode 100644 index 0000000..e92ddfd --- /dev/null +++ b/.github/workflows/pr.yaml @@ -0,0 +1,35 @@ +# inspired by https://github.com/danth/stylix/blob/master/.github/workflows/docs.yml +name: PR check +on: + pull_request: + branches: ["main"] +jobs: + build: + name: check + permissions: + contents: read + runs-on: ubuntu-latest + steps: + - name: Install Nix + uses: DeterminateSystems/nix-installer-action@main + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + extra-conf: | + extra-experimental-features = nix-command flakes pipe-operators + - name: Set up cache + uses: DeterminateSystems/magic-nix-cache-action@main + - name: action + uses: cachix/install-nix-action@v25 + with: + nix_path: nixpkgs=channel:nixos-unstable + - name: cache + uses: cachix/cachix-action@v16 + with: + name: dashnix + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + - name: Linter check + run: nix run --no-write-lock-file github:${{ github.repository }}/${{ github.sha }}#lint -- check + - name: Format check + run: nix run --no-write-lock-file github:${{ github.repository }}/${{ github.sha }}#format -- --check . + - name: Build docs + run: nix -L build github:${{ github.repository }}/${{ github.sha }}#docs --no-write-lock-file diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..1984fb1 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,29 @@ +# by https://github.com/danth/stylix/blob/master/.github/workflows/docs.yml +name: Release +on: + release: + types: [created] +jobs: + build: + name: Release + permissions: write-all + runs-on: ubuntu-latest + steps: + - name: Install Nix + uses: DeterminateSystems/nix-installer-action@main + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + extra-conf: | + extra-experimental-features = nix-command flakes pipe-operators + - name: Set up cache + uses: DeterminateSystems/magic-nix-cache-action@main + - name: Build ISO + run: nix build github:${{ github.repository }}/${{ github.sha }}#iso --no-write-lock-file + - name: Prepare ISO for upload + run: | + cp -r --dereference --no-preserve=mode,ownership result/iso/DashNix.iso DashNix.iso + - name: upload ISO + uses: softprops/action-gh-release@v1 + with: + files: | + DashNix.iso diff --git a/.gitignore b/.gitignore index e173d3f..f610716 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,3 @@ -/nvim/plugged/* -gtk-3.0/bookmarks -gtk-3.0/servers -gtk-4.0/servers -/fish/fish_variables -fish/fish_variables -fish/*.tmp.* -copyq/copyq.lock -copyq/copyq_geometry.* -copyq/copyq_tab* -nvim/lazy-lock.json -ncspot/*.cbor +result/* +result +flake.lock diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7b6bec5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,841 @@ + GNU LESSER 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. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser 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 +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + + 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/README.md b/README.md deleted file mode 100644 index e9a047a..0000000 --- a/README.md +++ /dev/null @@ -1,12 +0,0 @@ -``` - _____ _ _____ _ - | __ \ | | | __ \ | | - | | | | __ _ ___| |__ | | | | ___ | |_ ___ - | | | |/ _` / __| '_ \| | | |/ _ \| __/ __| - | |__| | (_| \__ \ | | | |__| | (_) | |_\__ \ - |_____/ \__,_|___/_| |_|_____/ \___/ \__|___/ - -``` - -My personal configuration for NixOS/home-manager. -While not intended to be used by someone else, feel free to do so anyway or use it as a template for your configuration if you wish to. diff --git a/README.md b/README.md new file mode 120000 index 0000000..95cf2af --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +docs/src/README.md \ No newline at end of file diff --git a/assets/logo.svg b/assets/logo.svg new file mode 100644 index 0000000..7ca00e2 --- /dev/null +++ b/assets/logo.svg @@ -0,0 +1,228 @@ + + + + diff --git a/assets/logo2.png b/assets/logo2.png new file mode 100644 index 0000000..beeac55 Binary files /dev/null and b/assets/logo2.png differ diff --git a/assets/logo2.svg b/assets/logo2.svg new file mode 100644 index 0000000..08baa43 --- /dev/null +++ b/assets/logo2.svg @@ -0,0 +1,238 @@ + + + +DashNixDashNix diff --git a/assets/logo3.svg b/assets/logo3.svg new file mode 100644 index 0000000..6076a01 --- /dev/null +++ b/assets/logo3.svg @@ -0,0 +1,238 @@ + + + +DashNixDashNix diff --git a/assets/rainbow.svg b/assets/rainbow.svg new file mode 100644 index 0000000..9f59c7c --- /dev/null +++ b/assets/rainbow.svg @@ -0,0 +1,141 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/nix/base/black.jpg b/base/black.jpg similarity index 100% rename from nix/base/black.jpg rename to base/black.jpg diff --git a/base/common_hardware.nix b/base/common_hardware.nix new file mode 100644 index 0000000..9f7ccf1 --- /dev/null +++ b/base/common_hardware.nix @@ -0,0 +1,174 @@ +{ + mkDashDefault, + pkgs, + config, + lib, + hostName, + modulesPath, + ... +}: let + username = config.conf.username; +in { + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + wsl.enable = mkDashDefault config.conf.wsl; + + # Bootloader. + boot = lib.mkIf (!config.conf.wsl) { + consoleLogLevel = mkDashDefault 0; + + lanzaboote = lib.mkIf config.conf.secureBoot { + enable = mkDashDefault true; + pkiBundle = mkDashDefault "/var/lib/sbctl"; + settings.reboot-for-bitlocker = mkDashDefault true; + }; + + loader = { + systemd-boot = { + enable = + if config.conf.secureBoot + then lib.mkForce false + else if config.conf.useSystemdBootloader + then true + else mkDashDefault false; + configurationLimit = 5; + }; + efi.canTouchEfiVariables = mkDashDefault true; + }; + + kernelPackages = mkDashDefault pkgs.linuxPackages_latest; + initrd = { + verbose = mkDashDefault false; + availableKernelModules = [ + "nvme" + "xhci_pci" + "ahci" + "usbhid" + "usb_storage" + "sd_mod" + ]; + }; + kernelParams = + [ + ''resume="PARTLABEL=SWAP"'' + ''quiet'' + ''udev.log_level=3'' + ] + ++ config.conf.bootParams; + }; + + networking = { + useDHCP = mkDashDefault true; + networkmanager.enable = mkDashDefault true; + hostName = mkDashDefault hostName; + }; + + time = { + timeZone = mkDashDefault config.conf.timezone; + hardwareClockInLocalTime = mkDashDefault config.conf.systemLocalTime; + }; + + i18n.defaultLocale = mkDashDefault config.conf.locale; + + services = { + lorri.enable = mkDashDefault true; + xserver.enable = mkDashDefault true; + fstrim.enable = mkDashDefault true; + pulseaudio.enable = mkDashDefault false; + pipewire = { + enable = mkDashDefault true; + alsa = { + enable = mkDashDefault true; + support32Bit = mkDashDefault true; + }; + jack.enable = mkDashDefault true; + pulse.enable = mkDashDefault true; + }; + }; + + nixpkgs.hostPlatform = mkDashDefault config.conf.system; + nix = { + gc = { + automatic = mkDashDefault true; + dates = mkDashDefault "weekly"; + options = mkDashDefault "--delete-older-than 7d --delete-generations +5"; + }; + settings = { + trusted-users = [username]; + auto-optimise-store = mkDashDefault true; + + builders-use-substitutes = mkDashDefault true; + + trusted-substituters = [ + "https://hyprland.cachix.org" + "https://anyrun.cachix.org" + "https://oxipaste.cachix.org" + "https://oxinoti.cachix.org" + "https://oxishut.cachix.org" + "https://oxidash.cachix.org" + "https://oxicalc.cachix.org" + "https://hyprdock.cachix.org" + "https://reset.cachix.org" + "https://dashvim.cachix.org" + ]; + + trusted-public-keys = [ + "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" + "anyrun.cachix.org-1:pqBobmOjI7nKlsUMV25u9QHa9btJK65/C8vnO3p346s=" + "oxipaste.cachix.org-1:n/oA3N3Z+LJP7eIWOwuoLd9QnPyZXqFjLgkahjsdDGc=" + "oxinoti.cachix.org-1:dvSoJl2Pjo5HMaNngdBbSaixK9BSf2N8gzjP2MdGvfc=" + "oxishut.cachix.org-1:axyAGF3XMh1IyMAW4UMbQCdMNovDH0KH6hqLLRJH8jU=" + "oxidash.cachix.org-1:5K2FNHp7AS8VF7LmQkJAUG/dm6UHCz4ngshBVbjFX30=" + "oxicalc.cachix.org-1:qF3krFc20tgSmtR/kt6Ku/T5QiG824z79qU5eRCSBTQ=" + "hyprdock.cachix.org-1:HaROK3fBvFWIMHZau3Vq1TLwUoJE8yRbGLk0lEGzv3Y=" + "reset.cachix.org-1:LfpnUUdG7QM/eOkN7NtA+3+4Ar/UBeYB+3WH+GjP9Xo=" + "dashvim.cachix.org-1:uLRdxp1WOWHnsZZtu3SwUWZRsvC7SXo0Gyk3tIefuL0=" + ]; + + experimental-features = mkDashDefault "nix-command flakes pipe-operators"; + }; + }; + + hardware = { + cpu.${config.conf.cpu}.updateMicrocode = + mkDashDefault + config.hardware.enableRedistributableFirmware; + }; + + security.rtkit.enable = mkDashDefault true; + + environment.variables = { + XDG_CACHE_HOME = mkDashDefault "$HOME/.cache"; + DIRENV_LOG_FORMAT = mkDashDefault ""; + QT_QPA_PLATFORMTHEME = mkDashDefault "qt5ct"; + }; + + # allows user change later on + users = { + mutableUsers = mkDashDefault true; + users.${username} = { + isNormalUser = mkDashDefault true; + description = mkDashDefault username; + extraGroups = [ + "networkmanager" + "wheel" + "gamemode" + "docker" + "vboxusers" + "video" + "audio" + "scanner" + "lp" + ]; + packages = with pkgs; [ + home-manager + xdg-desktop-portal-gtk + ]; + # this password will only last for the first login + # e.g. login, then change to whatever else, this also ensures no public hash is available + password = mkDashDefault "firstlogin"; + }; + }; +} diff --git a/nix/base/default.nix b/base/default.nix similarity index 56% rename from nix/base/default.nix rename to base/default.nix index 6a582dd..eafd8a5 100644 --- a/nix/base/default.nix +++ b/base/default.nix @@ -1,10 +1,7 @@ { imports = [ - ./big_g.nix - ./login_manager.nix ./env.nix ./xkb_layout.nix - ./base_packages.nix ./common_hardware.nix ]; } diff --git a/base/env.nix b/base/env.nix new file mode 100644 index 0000000..0eaf068 --- /dev/null +++ b/base/env.nix @@ -0,0 +1,24 @@ +{ + mkDashDefault, + pkgs, + config, + lib, + ... +}: { + environment = { + variables = { + GSETTINGS_SCHEMA_DIR = mkDashDefault "${pkgs.glib.getSchemaPath pkgs.gsettings-desktop-schemas}"; + NEOVIDE_MAXIMIZED = mkDashDefault "0"; + GPG_TTY = mkDashDefault "$(tty)"; + EDITOR = mkDashDefault "neovide --no-fork"; + SUDO_EDITOR = mkDashDefault "neovide --no-fork"; + SCRIPTS = mkDashDefault "$HOME/.config/scripts"; + }; + sessionVariables = { + NIXOS_OZONE_WL = mkDashDefault "1"; + GOPATH = mkDashDefault "$HOME/.go"; + FLAKE = mkDashDefault config.conf.nixosConfigPath; + NH_FLAKE = mkDashDefault config.conf.nixosConfigPath; + }; + }; +} diff --git a/nix/base/xkb_layout.nix b/base/xkb_layout.nix similarity index 56% rename from nix/base/xkb_layout.nix rename to base/xkb_layout.nix index 8238484..b399693 100644 --- a/nix/base/xkb_layout.nix +++ b/base/xkb_layout.nix @@ -1,7 +1,10 @@ -{ pkgs, ... }: -let - layout = pkgs.writeText "dashie" '' - xkb_symbols "dashie" +{ + mkDashDefault, + pkgs, + ... +}: let + layout = pkgs.writeText "enIntUmlaut" '' + xkb_symbols "enIntUmlaut" { include "us(basic)" include "level3(ralt_switch)" @@ -10,14 +13,11 @@ let key { [ u, U, udiaeresis, Udiaeresis ] }; }; ''; -in -{ - environment.systemPackages = [ pkgs.xorg.xkbcomp ]; - services.xserver.xkb.extraLayouts.dashie = { +in { + environment.systemPackages = mkDashDefault [pkgs.xorg.xkbcomp]; + services.xserver.xkb.extraLayouts.enIntUmlaut = { description = "US layout with 'umlaut'"; - languages = [ "eng" ]; + languages = ["eng"]; symbolsFile = "${layout}"; }; } - - diff --git a/docs/default.nix b/docs/default.nix new file mode 100644 index 0000000..1fd8a1e --- /dev/null +++ b/docs/default.nix @@ -0,0 +1,61 @@ +# with friendly help by stylix: https://github.com/danth/stylix/blob/master/docs/default.nix +{ + pkgs, + buildSystems, + lib, + ... +}: let + makeOptionsDoc = configuration: pkgs.nixosOptionsDoc {options = configuration;}; + generateDocs = obj: '' + touch src/${obj.fst}.md + sed '/*Declared by:*/,/^$/d' <${obj.snd.optionsCommonMark} >> src/${obj.fst}.md + ''; + summaryAppend = name: '' + echo "- [${name}](${name}.md)" >> src/SUMMARY.md + ''; + system = (buildSystems {root = ../example/.;})."example".options; + makeOptionsDocPrograms = names: pkgs.nixosOptionsDoc {options = lib.attrByPath (lib.splitString "." names) null system.mods;}; + conf = makeOptionsDoc system.conf; + basePath = ../modules/programs; + pathToAttrs = path: + lib.attrsets.mapAttrsToList ( + name: meta: { + inherit name; + inherit meta; + } + ) + (builtins.readDir path); + pathToStrings = path: prefix: let + mapFn = attrs: + if attrs.meta == "directory" + then pathToStrings "${basePath}/${attrs.name}" attrs.name + else if prefix != "" + then "${prefix}.${attrs.name}" + else attrs.name; + in + map + mapFn + (pathToAttrs path); + filteredNames = builtins.filter (names: !(lib.strings.hasInfix "default" names)) ( + map (name: lib.strings.removeSuffix ".nix" name) (lib.lists.flatten (pathToStrings basePath "")) + ); + deduplicatedNames = map (name: lib.strings.splitString "." name |> lib.lists.unique |> lib.strings.concatStringsSep ".") filteredNames; + mods = map makeOptionsDocPrograms deduplicatedNames; + docs = lib.strings.concatLines (map generateDocs (lib.lists.zipLists deduplicatedNames mods)); + summary = lib.strings.concatStringsSep " " (map summaryAppend deduplicatedNames); +in + pkgs.stdenvNoCC.mkDerivation { + name = "dashNix-book"; + src = ./.; + + patchPhase = '' + sed '/*Declared by:*/,/^$/d' <${conf.optionsCommonMark} >> src/conf.md + ${docs} + echo "[README](README.md)\n # Options\n - [Base Config](conf.md)" >> src/SUMMARY.md + ${summary} + ''; + + buildPhase = '' + ${pkgs.mdbook}/bin/mdbook build --dest-dir $out + ''; + } diff --git a/docs/src/README.md b/docs/src/README.md new file mode 100644 index 0000000..3658e00 --- /dev/null +++ b/docs/src/README.md @@ -0,0 +1,329 @@ +
+ +![Logo of DashNix](logo.svg) + +
+ +An opinionated flake to bootstrap NixOS systems with default configurations for various programs and services from both NixOS and HomeManager which can be enabled, disabled, configured or replaced at will. + +# Usage + +This flake is intended to be used as an input to your own NixOS configuration: + +```nix +dashNix = { + url = "github:Xetibo/DashNix"; + inputs = { + # ensure these are here to update the packages on your own + nixpkgs.follows = "nixpkgs"; + stable.follows = "stable"; + }; +}; +``` + +You can then configure your systems in your flake outputs with a provided library command: + +Please note that overriding inputs will invalidate the cache configuration, this means you will have to add this manually: + +```nix + builders-use-substitutes = true; + + extra-substituters = [ + "https://hyprland.cachix.org" + "https://anyrun.cachix.org" + "https://cache.garnix.io" + "https://oxipaste.cachix.org" + "https://oxinoti.cachix.org" + "https://oxishut.cachix.org" + "https://oxidash.cachix.org" + "https://oxicalc.cachix.org" + "https://hyprdock.cachix.org" + "https://reset.cachix.org" + "https://dashvim.cachix.org" + ]; + + extra-trusted-public-keys = [ + "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" + "anyrun.cachix.org-1:pqBobmOjI7nKlsUMV25u9QHa9btJK65/C8vnO3p346s=" + "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=" + "oxipaste.cachix.org-1:n/oA3N3Z+LJP7eIWOwuoLd9QnPyZXqFjLgkahjsdDGc=" + "oxinoti.cachix.org-1:dvSoJl2Pjo5HMaNngdBbSaixK9BSf2N8gzjP2MdGvfc=" + "oxishut.cachix.org-1:axyAGF3XMh1IyMAW4UMbQCdMNovDH0KH6hqLLRJH8jU=" + "oxidash.cachix.org-1:5K2FNHp7AS8VF7LmQkJAUG/dm6UHCz4ngshBVbjFX30=" + "oxicalc.cachix.org-1:qF3krFc20tgSmtR/kt6Ku/T5QiG824z79qU5eRCSBTQ=" + "hyprdock.cachix.org-1:HaROK3fBvFWIMHZau3Vq1TLwUoJE8yRbGLk0lEGzv3Y=" + "reset.cachix.org-1:LfpnUUdG7QM/eOkN7NtA+3+4Ar/UBeYB+3WH+GjP9Xo=" + "dashvim.cachix.org-1:uLRdxp1WOWHnsZZtu3SwUWZRsvC7SXo0Gyk3tIefuL0=" + ]; +``` + +```nix +nixosConfigurations = inputs.dashNix.dashNixLib.buildSystems { root = ./.; }; +``` + +This command will build each system that is placed within the hosts/ directory. +In this directory create one directory for each system you want to configure with DashNix. +This will automatically pick up the hostname for the system and look for 3 different files that are explained below. +(Optionally, you can also change the parameter root (./.) to define a different starting directory than hosts/) + +In order for your configuration to work, you are required to at least provide a single config file with a further config file being optional for custom configuration. +The hardware.nix specifies additional NixOS configuration, while home.nix specifies additional home-manager configuration. (both optional) + +|- flake.nix\ +|- flake.lock\ +|- hosts/\ +|--- system1/\ +|------ configuration.nix (required)\ +|------ hardware.nix (optional)\ +|------ home.nix (optional)\ +|--- system2/\ +|------ configuration.nix (required)\ +|------ hardware.nix (optional)\ +|------ home.nix (optional)\ +|--- system3/\ +|------ configuration.nix (required)\ +|------ hardware.nix (optional)\ +|------ home.nix (optional) + +Here is a minimal required configuration.nix (the TODOs mention a required change): + +```nix +{config, ...}: { + # TODO denote important changes + + # variables for system + conf = { + # TODO your username + username = "YOURNAME"; + # TODO only needed when you use intel -> amd is default + # cpu = "intel"; + # TODO your xkb layout + locale = "something.UTF-8"; + # TODO your timezone + timezone = "CONTINENT/CITY"; + }; + + # modules + mods = { + # default disk config has root home boot and swap partition, overwrite if you want something different + sops.enable = false; + nextcloud.enable = false; + wm.monitors = [ + # Example + # { + # name = "DP-1"; + # resolutionX = 3440; + # resolutionY = 1440; + # refreshrate = 180; + # positionX = 2560; + # positionY = 0; + # scale = 1; + # transform = "0"; + # vrr = false; + # } + ]; + gpu.nvidia.enable = true; + kdeConnect.enable = true; + # login manager: + # default is greetd + # greetd = { }; + # sddm = { }; + # gdm = { }; + drives = { + # default assumes ROOT, BOOT, HOME and SWAP labaled drives exist + # for an example without HOME see below + # defaultDrives.enable = false; + # extraDrives = [ + # { + # name = "boot"; + # drive = { + # device = "/dev/disk/by-label/BOOT"; + # fsType = "vfat"; + # options = [ "rw" "fmask=0022" "dmask=0022" "noatime" ]; + # }; + # } + # { + # name = ""; + # drive = { + # device = "/dev/disk/by-label/ROOT"; + # fsType = "ext4"; + # options = [ "noatime" "nodiratime" "discard" ]; + # }; + # } + # ]; + # You can also use disko to format your disks on installation. + # Please refer to the Documentation about the drives module for an example. + }; + }; +} +``` + +## First Login + +After logging in the first time, your password will be set to "firstlogin", please change this to whatever you like. + +## Configuring pkgs + +While DashNix offers a default pkgs config, you may want to permit an unsecure packages, +add additional modules/inputs, or add an overlay to them. +You can configure both stable and unstable pkgs the following way: + +Please note that modules and inputs are merged together to ensure functionality. + +```nix +currentSystem = "x86_64-linux"; +permittedPackages = [ + "some package" +]; +config = { + system = currentSystem; + config = { + allowUnfree = true; + permittedInsecurePackages = permittedPackages; + }; + inputs = { + # Some inputs + } + mods = { + home = [ + # Some home manager module + ]; + nixos = [ + # Some nixos module + ]; +} +}; +unstableBundle = { + pkgs = inputs.unstable; + inherit config mods; +}; +inputs.dashNix.dashNixLib.buildSystems { + root = ./.; + inherit unstableBundle; +} +``` + +With this you could also change your input to something different should you wish to do so. +Note that overriding inputs via the flake still works, +this way however ensures you can also configure the inputs. + +## Stable/Unstable + +Sometimes you want to differentiate between systems that are stable and unstable, e.g. for servers and desktops/laptops. +This can be done with the overridePkgs flag for the lib function: + +(overridePkgs simply inverts the default bundle that is used for the nix standard library as well as NixOS itself) + +```nix +nixosConfigurations = + inputs.dashNix.dashNixLib.buildSystems { + root = ./stable; + inherit stableBundle; + overridePkgs = true; + } + // inputs.dashNix.dashNixLib.buildSystems { + inherit unstableBundle; + root = ./unstable; + }; +``` + +You can now place your systems in the respective directories. +Keep in mind that the hosts directory will still need to exist in each variant. +E.g. stable/hosts/yourserver and unstable/hosts/yourdesktop + +# Installation via ISO + +You can find a custom ISO in the releases: [Link](https://github.com/Xetibo/DashNix/releases). +With this, you will receive the example config in /iso/example alongside the gnome desktop environment, +as well as a few tools like gnome-disks, Neovim, Vscodium, a browser etc. + +Alternatively, you can use whatever NixOS installer and just install your config from there, just make sure to set the drive configuration before. + +## Commands + +First, copy the read-only config from /iso/example-config to a location of your choice. + +```sh +cp /iso/example-config ~/config -r +``` + +Then configure as you please and choose a command below depending on your disk installation variant. + +Installation via manual configuration: + +```sh +sudo nixos-install --flake # --root --option experimental-features "nix-command flakes pipe-operators" +#example +#nixos-install --flake ~/config#globi --root /mnt --option experimental-features "nix-command flakes pipe-operators" +``` + +Installation via disko: + +```sh +sudo disko-install --flake # --disk --option experimental-features "nix-command flakes pipe-operators" +#example +#disko-install -- --flake ~/config#globi --disk main /dev/nvme0n1 --option experimental-features "nix-command flakes pipe-operators" +``` + +# Installation via flake + +If you already have nix installed, you can instead just copy the default config onto your system and install DashNix with it. +To create the example config for a base to start with, you can just run this flake with the mkFlake command: + +```sh +nix run github:Xetibo/DashNix#mkFlake +``` + +This command will put the default configuration into $HOME/gits/nixos + +# Modules + +This configuration features several modules that can be used as preconfigured "recipies". +These modules attempt to combine the home-manager and nixos packages/options to one single configuration file for each new system. +For package lists, please check the individual modules, as the lists can be long. + +- Hyprland: Installs and configures Hyprland with various additional packages +- Niri: Installs and configures Niri with various additional packages +- acpid : Enables the acpid daemon +- base packages : A list of system packages to be installed by default +- bluetooth : Configures/enables bluetooth and installs tools for bluetooth +- coding packages : A list of coding packages to be installed by default +- drives : A drive configuration module +- firefox: Enables and configures firefox (extensions and settings) +- fish: Enables and configures fish shell +- gaming : Configures gaming related features (launchers, gamemode) +- git : Git key and config module +- gnome_services : Gnome services for minimal enviroments -> Window managers etc +- gpu : GPU settings (AMD) +- greetd : Enables and configures the greetd/regreet login manager with Hyprland +- home packages : A list of home packages to be installed by default +- kde_connect : Enables KDE connect and opens its ports +- keepassxc : Configures keepassxc +- kitty: Enables and configures kitty terminal +- layout : Modules to configure keyboard layout system wide +- media packages : A list of media packages to be installed by default +- mime: Mime type configuration +- nextcloud : Handles synchronization via nextcloud cmd. (requires config.sops.secrets.nextcloud) +- oxi: My own programs, can be selectively disabled, or as a whole +- piper : Installs and enables piper alongside its daemon +- plymouth: enable or disable plymouth +- printing : Enables and configures printing services +- scripts: Various preconfigured scripts with the ability to add more +- sops: Enables sops-nix +- starship : Configures the starship prompt +- stylix : Configures system themes, can also be applied to dashvim if used. +- teams: For the poor souls that have to use this.... +- virtualbox : Enables and configures virtualbox +- xkb: Keyboard layout configuration +- xone : Installs the xone driver +- yazi: Installs yazi and sets custom keybinds + +# Credits + +- [Fufexan](https://github.com/fufexan) for the xdg-mime config: +- [Catppuccin](https://github.com/catppuccin) for base16 colors and zen-browser css +- [Danth](https://github.com/danth) for providing a base for the nix docs +- [chermnyx](https://github.com/chermnyx) for providing a base for zen configuration +- [voronind-com](https://github.com/voronind-com) for providing the darkreader configuration +- [Nix-Artwork](https://github.com/NixOS/nixos-artwork/tree/master/logo) for the Nix/NixOS logo (Tim Cuthbertson (@timbertson)) +- [xddxdd](https://github.com/xddxdd) for the CachyOS-Kernel flake diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/src/coding.md b/docs/src/coding.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/src/conf.md b/docs/src/conf.md new file mode 100755 index 0000000..aa51f0b --- /dev/null +++ b/docs/src/conf.md @@ -0,0 +1 @@ +# This file handles the basic configuration for settings like language, timezone, input, cpu etc. diff --git a/docs/src/logo.svg b/docs/src/logo.svg new file mode 100644 index 0000000..08baa43 --- /dev/null +++ b/docs/src/logo.svg @@ -0,0 +1,238 @@ + + + +DashNixDashNix diff --git a/docs/src/mods.md b/docs/src/mods.md new file mode 100755 index 0000000..df7fe4f --- /dev/null +++ b/docs/src/mods.md @@ -0,0 +1 @@ +# This file handles configuration of individual modules. diff --git a/example/flake.nix b/example/flake.nix new file mode 100644 index 0000000..01ec944 --- /dev/null +++ b/example/flake.nix @@ -0,0 +1,51 @@ +{ + description = "some dots"; + + inputs = { + nixpkgs.url = "github:NixOs/nixpkgs/nixos-unstable"; + stable.url = "github:NixOs/nixpkgs/nixos-24.05"; + dashNix = { + url = "github:Xetibo/DashNix"; + inputs = { + nixpkgs.follows = "nixpkgs"; + stable.follows = "stable"; + }; + }; + }; + + outputs = inputs: { + nixosConfigurations = inputs.dashNix.dashNixLib.buildSystems {root = ./.;}; + }; + + nixConfig = { + builders-use-substitutes = true; + + extra-substituters = [ + "https://hyprland.cachix.org" + "https://anyrun.cachix.org" + "https://cache.garnix.io" + "https://oxipaste.cachix.org" + "https://oxinoti.cachix.org" + "https://oxishut.cachix.org" + "https://oxidash.cachix.org" + "https://oxicalc.cachix.org" + "https://hyprdock.cachix.org" + "https://reset.cachix.org" + "https://dashvim.cachix.org" + ]; + + extra-trusted-public-keys = [ + "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" + "anyrun.cachix.org-1:pqBobmOjI7nKlsUMV25u9QHa9btJK65/C8vnO3p346s=" + "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=" + "oxipaste.cachix.org-1:n/oA3N3Z+LJP7eIWOwuoLd9QnPyZXqFjLgkahjsdDGc=" + "oxinoti.cachix.org-1:dvSoJl2Pjo5HMaNngdBbSaixK9BSf2N8gzjP2MdGvfc=" + "oxishut.cachix.org-1:axyAGF3XMh1IyMAW4UMbQCdMNovDH0KH6hqLLRJH8jU=" + "oxidash.cachix.org-1:5K2FNHp7AS8VF7LmQkJAUG/dm6UHCz4ngshBVbjFX30=" + "oxicalc.cachix.org-1:qF3krFc20tgSmtR/kt6Ku/T5QiG824z79qU5eRCSBTQ=" + "hyprdock.cachix.org-1:HaROK3fBvFWIMHZau3Vq1TLwUoJE8yRbGLk0lEGzv3Y=" + "reset.cachix.org-1:LfpnUUdG7QM/eOkN7NtA+3+4Ar/UBeYB+3WH+GjP9Xo=" + "dashvim.cachix.org-1:uLRdxp1WOWHnsZZtu3SwUWZRsvC7SXo0Gyk3tIefuL0=" + ]; + }; +} diff --git a/example/hosts/example/configuration.nix b/example/hosts/example/configuration.nix new file mode 100644 index 0000000..dbe8cd0 --- /dev/null +++ b/example/hosts/example/configuration.nix @@ -0,0 +1,68 @@ +{config, ...}: { + # TODO denote important changes + + # variables for system + conf = { + # TODO your username + username = "exampleName"; + # TODO only needed when you use intel -> amd is default + # cpu = "intel"; + # TODO your xkb layout + locale = "en_US.UTF-8"; + # TODO your timezone + timezone = "Europe/Zurich"; + }; + + # modules + mods = { + # default disk config has root home boot and swap partition, overwrite if you want something different + sops.enable = false; + nextcloud.enable = false; + wm.monitors = [ + # Example + # { + # name = "DP-1"; + # resolutionX = 3440; + # resolutionY = 1440; + # refreshrate = 180; + # positionX = 2560; + # positionY = 0; + # scale = 1; + # transform = "0"; + # vrr = false; + # } + ]; + gpu.nvidia.enable = true; + kdeConnect.enable = true; + # login manager: + # default is greetd + # greetd = { }; + # sddm = { }; + # gdm = { }; + drives = { + # default assumes ROOT, BOOT, HOME and SWAP labaled drives exist + # for an example without HOME see below + # defaultDrives.enable = false; + # extraDrives = [ + # { + # name = "boot"; + # drive = { + # device = "/dev/disk/by-label/BOOT"; + # fsType = "vfat"; + # options = [ "rw" "fmask=0022" "dmask=0022" "noatime" ]; + # }; + # } + # { + # name = ""; + # drive = { + # device = "/dev/disk/by-label/ROOT"; + # fsType = "ext4"; + # options = [ "noatime" "nodiratime" "discard" ]; + # }; + # } + # ]; + # You can also use disko to format your disks on installation. + # Please refer to the Documentation about the drives module for an example. + }; + }; +} diff --git a/example/hosts/example/hardware.nix b/example/hosts/example/hardware.nix new file mode 100644 index 0000000..855cafb --- /dev/null +++ b/example/hosts/example/hardware.nix @@ -0,0 +1,3 @@ +{ + # this file adds custom NixOS configuration +} diff --git a/example/hosts/example/home.nix b/example/hosts/example/home.nix new file mode 100644 index 0000000..e011ea7 --- /dev/null +++ b/example/hosts/example/home.nix @@ -0,0 +1,3 @@ +{ + # this file adds custom home-manager configuration +} diff --git a/example/secrets/secrets.md b/example/secrets/secrets.md new file mode 100644 index 0000000..86d99c6 --- /dev/null +++ b/example/secrets/secrets.md @@ -0,0 +1,3 @@ +# Secrets + +This file is for sops-nix and is also where your keys for various secrets will be stored. diff --git a/example/secrets/secrets.yaml b/example/secrets/secrets.yaml new file mode 100644 index 0000000..e69de29 diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..be1d5c2 --- /dev/null +++ b/flake.nix @@ -0,0 +1,113 @@ +{ + description = "DashNix"; + + inputs = { + unstable.url = "github:NixOs/nixpkgs/nixos-unstable"; + stable.url = "github:NixOs/nixpkgs/nixos-25.05"; + nixos-wsl.url = "github:nix-community/NixOS-WSL/main"; + nur.url = "github:nix-community/NUR"; + lanzaboote = { + url = "github:nix-community/lanzaboote/v0.4.2"; + inputs.nixpkgs.follows = "unstable"; + }; + statix.url = "github:oppiliappan/statix?ref=master"; + # Darkreader requires es20, hence a stable pin + pkgsDarkreader.url = "github:NixOs/nixpkgs/nixos-24.11"; + + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "unstable"; + }; + cachy.url = "github:xddxdd/nix-cachyos-kernel?rev=bb7b8aa687464f24dcd452354d9621331d6b0737"; + + sops-nix.url = "github:Mic92/sops-nix"; + + hyprland.url = "github:hyprwm/Hyprland"; + + ironbar = { + url = "github:JakeStanger/ironbar"; + inputs.nixpkgs.follows = "unstable"; + }; + + zen-browser.url = "github:youwen5/zen-browser-flake"; + + stylix.url = "github:danth/stylix"; + base16.url = "github:SenchoPens/base16.nix"; + disko.url = "github:nix-community/disko/latest"; + + anyrun.url = "github:Kirottu/anyrun"; + oxicalc.url = "github:Xetibo/OxiCalc"; + oxishut.url = "github:Xetibo/OxiShut"; + oxinoti.url = "github:Xetibo/OxiNoti"; + oxidash.url = "github:Xetibo/OxiDash"; + oxipaste.url = "github:Xetibo/OxiPaste"; + oxirun.url = "github:Xetibo/OxiRun"; + dashvim.url = "github:Xetibo/DashVim"; + + hyprdock.url = "github:Xetibo/hyprdock"; + reset.url = "github:Xetibo/ReSet"; + reset-plugins.url = "github:Xetibo/ReSet-Plugins"; + + superfreq.url = "github:NotAShelf/superfreq"; + + compose.url = "github:garnix-io/nixos-compose"; + }; + + outputs = {self, ...} @ inputs: let + currentSystem = "x86_64-linux"; + permittedPackages = [ + "olm-3.2.16" + ]; + importPkgsFn = import ./lib/importPkgs.nix; + defaultConfigureFn = pkgs: + importPkgsFn { + inherit inputs currentSystem permittedPackages pkgs; + }; + stable = defaultConfigureFn inputs.stable; + unstable = defaultConfigureFn inputs.unstable; + pkgsDarkreader = defaultConfigureFn inputs.pkgsDarkreader; + in rec { + dashNixLib = import ./lib { + inherit + self + inputs + unstable + permittedPackages + ; + dashNixAdditionalProps = { + inherit pkgsDarkreader; + }; + system = currentSystem; + }; + docs = import ./docs { + inherit inputs; + pkgs = unstable; + system = currentSystem; + inherit (inputs.unstable) lib; + inherit (dashNixLib) buildSystems; + }; + lint = inputs.statix.packages.${currentSystem}.default; + format = unstable.alejandra; + dashNixInputs = inputs; + stablePkgs = stable; + unstablePkgs = unstable; + modules = ./modules; + iso = dashNixLib.buildIso.config.system.build.isoImage; + nixosConfigurations = dashNixLib.buildSystems {root = ./example/.;}; + + mkFlake = stablePkgs.writeShellApplication { + name = "Create example config"; + text = + /* + bash + */ + '' + mkdir -p ~/gits/nixos + mkdir -p ~/gits/backup_nixos + + mv ~/gits/nixos/* ~/gits/backup_nixos/ + cp -r ${./example}/* ~/gits/nixos/ + ''; + }; + }; +} diff --git a/home/common.nix b/home/common.nix new file mode 100644 index 0000000..fe2fa53 --- /dev/null +++ b/home/common.nix @@ -0,0 +1,42 @@ +{ + mkDashDefault, + config, + lib, + pkgs, + ... +}: let + username = config.conf.username; +in { + manual = { + html.enable = mkDashDefault false; + json.enable = mkDashDefault false; + manpages.enable = mkDashDefault false; + }; + + fonts.fontconfig.enable = mkDashDefault true; + + home = { + username = mkDashDefault username; + homeDirectory = mkDashDefault "/home/${username}"; + sessionPath = ["$HOME/.cargo/bin"]; + + enableNixpkgsReleaseCheck = mkDashDefault false; + sessionVariables = { + GOROOT = mkDashDefault "$HOME/.go"; + QT_QPA_PLATFORMTHEME = mkDashDefault "qt5ct"; + }; + + keyboard = mkDashDefault null; + }; + + programs.nix-index = { + enable = mkDashDefault true; + enableFishIntegration = mkDashDefault true; + }; + + nix = { + extraOptions = lib.mkIf (config ? sops.secrets && config.sops.secrets ? access.path) '' + !include ${config.sops.secrets.access.path} + ''; + }; +} diff --git a/home/default.nix b/home/default.nix new file mode 100644 index 0000000..afc0ab3 --- /dev/null +++ b/home/default.nix @@ -0,0 +1,66 @@ +{ + mkDashDefault, + dashNixAdditionalProps, + config, + homeMods, + inputs, + lib, + additionalHomeConfig, + mod, + pkgs, + root, + alternativePkgs, + system, + stable, + unstable, + ... +}: { + xdg = { + portal.config.common = { + default = mkDashDefault "hyprland;gtk"; + "org.freedesktop.impl.portal.FileChooser" = lib.mkIf (config.mods.media.filePickerPortal != "Default") "shana"; + }; + portal = { + enable = mkDashDefault true; + extraPortals = with pkgs; [ + xdg-desktop-portal-gtk # prob needed either way + (lib.mkIf (config.mods.media.filePickerPortal != "Default") xdg-desktop-portal-shana) + (lib.mkIf (config.mods.media.filePickerPortal == "Kde") kdePackages.xdg-desktop-portal-kde) + # Gnome uses their file manager, kinda cool tbh + (lib.mkIf (config.mods.media.filePickerPortal == "Gnome" && !config.mods.nautilus.enable) nautilus) + (lib.mkIf (config.mods.media.filePickerPortal == "Lxqt") xdg-desktop-portal-lxqt) + (lib.mkIf (config.mods.media.filePickerPortal == "Term") xdg-desktop-portal-termfilechooser) + ]; + }; + }; + home-manager = { + useGlobalPkgs = mkDashDefault true; + useUserPackages = mkDashDefault true; + extraSpecialArgs = { + inherit + inputs + root + alternativePkgs + system + stable + unstable + dashNixAdditionalProps + ; + mkDashDefault = import ../lib/override.nix {inherit lib;}; + }; + + users.${config.conf.username} = { + disabledModules = ["programs/anyrun.nix"]; + imports = + [ + ./common.nix + ./themes + ./sync.nix + ../lib/foxwrappers.nix + ] + ++ homeMods + ++ lib.optional (builtins.pathExists additionalHomeConfig) additionalHomeConfig + ++ lib.optional (builtins.pathExists mod) mod; + }; + }; +} diff --git a/home/sync.nix b/home/sync.nix new file mode 100644 index 0000000..38dceea --- /dev/null +++ b/home/sync.nix @@ -0,0 +1,55 @@ +# derived from NixOS wiki +{ + config, + pkgs, + lib, + ... +}: let + username = config.mods.nextcloud.username; + password = + if (config.sops.secrets ? nextcloud.path) + then config.sops.secrets.nextcloud.path + else ""; + url = config.mods.nextcloud.url; + synclist = config.mods.nextcloud.synclist; +in + lib.mkIf config.mods.nextcloud.enable { + systemd.user = { + services = builtins.listToAttrs ( + map (opts: { + name = "${opts.name}"; + value = { + Unit = { + Description = "Auto sync Nextcloud"; + After = "network-online.target"; + }; + Service = { + Type = "simple"; + ExecStart = "${pkgs.bash}/bin/bash -c '${pkgs.nextcloud-client}/bin/nextcloudcmd -h --path ${opts.remote} ${opts.local} https://${username}:$(bat ${password})@${url}'"; + TimeoutStopSec = "180"; + KillMode = "process"; + KillSignal = "SIGINT"; + }; + Install.WantedBy = ["multi-user.target"]; + }; + }) + synclist + ); + timers = builtins.listToAttrs ( + map (opts: { + name = "${opts.name}"; + value = { + Unit.Description = "Automatic sync files with Nextcloud when booted up after 1 minute then rerun every 60 minutes"; + Timer.OnBootSec = "1min"; + Timer.OnUnitActiveSec = "60min"; + Install.WantedBy = [ + "multi-user.target" + "timers.target" + ]; + }; + }) + synclist + ); + startServices = true; + }; + } diff --git a/home/themes/default.nix b/home/themes/default.nix new file mode 100644 index 0000000..9976455 --- /dev/null +++ b/home/themes/default.nix @@ -0,0 +1,8 @@ +{ + imports = [ + ./qt.nix + ./kdeglobals.nix + ./oxiced.nix + ./firefoxTheme.nix + ]; +} diff --git a/home/themes/firefoxTheme.nix b/home/themes/firefoxTheme.nix new file mode 100644 index 0000000..0de46f6 --- /dev/null +++ b/home/themes/firefoxTheme.nix @@ -0,0 +1,327 @@ +# css from https://github.com/catppuccin/zen-browser/tree/main/themes +{ + config, + inputs, + pkgs, + lib, + ... +}: let + # at time of using this here, stylix might not be evaluated yet + # hence ensure it is by using base16 mkSchemeAttrs + base16 = pkgs.callPackage inputs.base16.lib {}; + scheme = base16.mkSchemeAttrs config.stylix.base16Scheme; + userChrome = + /* + css + */ + '' + /* Catppuccin Mocha Blue userContent.css*/ + + @media (prefers-color-scheme: dark) { + + /* Common variables affecting all pages */ + @-moz-document url-prefix("about:") { + :root { + --in-content-page-color: #${scheme.base05} !important; + --color-accent-primary: #${scheme.base0D} !important; + --color-accent-primary-hover: rgb(163, 197, 251) !important; // TODO + --color-accent-primary-active: rgb(138, 153, 250) !important; // TODO + background-color: #${scheme.base00} !important; + --in-content-page-background: #${scheme.base00} !important; + } + + } + + /* Variables and styles specific to about:newtab and about:home */ + @-moz-document url("about:newtab"), url("about:home") { + + :root { + --newtab-background-color: #${scheme.base00} !important; + --newtab-background-color-secondary: #${scheme.base02} !important; + --newtab-element-hover-color: #${scheme.base02} !important; + --newtab-text-primary-color: #${scheme.base05} !important; + --newtab-wordmark-color: #${scheme.base05} !important; + --newtab-primary-action-background: #${scheme.base0D} !important; + } + + .icon { + color: #${scheme.base0D} !important; + } + + .search-wrapper .logo-and-wordmark .logo { + //background: url("zen-logo-mocha.svg"), url("https://raw.githubusercontent.com/IAmJafeth/zen-browser/main/themes/Mocha/Blue/zen-logo-mocha.svg") no-repeat center !important; // TODO + display: inline-block !important; + height: 82px !important; + width: 82px !important; + background-size: 82px !important; + } + + @media (max-width: 609px) { + .search-wrapper .logo-and-wordmark .logo { + background-size: 64px !important; + height: 64px !important; + width: 64px !important; + } + } + + .card-outer:is(:hover, :focus, .active):not(.placeholder) .card-title { + color: #${scheme.base0D} !important; + } + + .top-site-outer .search-topsite { + background-color: #${scheme.base0D} !important; + } + + .compact-cards .card-outer .card-context .card-context-icon.icon-download { + fill: #${scheme.base0B} !important; + } + } + + /* Variables and styles specific to about:preferences */ + @-moz-document url-prefix("about:preferences") { + :root { + --zen-colors-tertiary: #${scheme.base01} !important; + --in-content-text-color: #${scheme.base05} !important; + --link-color: #${scheme.base0D} !important; + --link-color-hover: rgb(163, 197, 251) !important; // TODO + --zen-colors-primary: #${scheme.base02} !important; + --in-content-box-background: #${scheme.base02} !important; + --zen-primary-color: #${scheme.base0D} !important; + } + + groupbox , moz-card{ + background: #${scheme.base00} !important; + } + + button, + groupbox menulist { + background: #${scheme.base02} !important; + color: #${scheme.base05} !important; + } + + .main-content { + background-color: #${scheme.base01} !important; + } + + .identity-color-blue { + --identity-tab-color: #8aadf4 !important; // TODO + --identity-icon-color: #8aadf4 !important; // TODO + } + + .identity-color-turquoise { + --identity-tab-color: #8bd5ca !important; // TODO + --identity-icon-color: #8bd5ca !important; // TODO + } + + .identity-color-green { + --identity-tab-color: #${scheme.base0B} !important; + --identity-icon-color: #${scheme.base0B} !important; + } + + .identity-color-yellow { + --identity-tab-color: #eed49f !important; // TODO + --identity-icon-color: #eed49f !important; // TODO + } + + .identity-color-orange { + --identity-tab-color: #f5a97f !important; // TODO + --identity-icon-color: #f5a97f !important; // TODO + } + + .identity-color-red { + --identity-tab-color: #ed8796 !important; // TODO + --identity-icon-color: #ed8796 !important; // TODO + } + + .identity-color-pink { + --identity-tab-color: #f5bde6 !important; // TODO + --identity-icon-color: #f5bde6 !important; // TODO + } + + .identity-color-purple { + --identity-tab-color: #c6a0f6 !important; // TODO + --identity-icon-color: #c6a0f6 !important; // TODO + } + } + + /* Variables and styles specific to about:addons */ + @-moz-document url-prefix("about:addons") { + :root { + --zen-dark-color-mix-base: #${scheme.base01} !important; + --background-color-box: #${scheme.base00} !important; + } + } + + /* Variables and styles specific to about:protections */ + @-moz-document url-prefix("about:protections") { + :root { + --zen-primary-color: #${scheme.base00} !important; + --social-color: #${scheme.base0E} !important; + --coockie-color: #${scheme.base08} !important; + --fingerprinter-color: #${scheme.base0A} !important; + --cryptominer-color: #${scheme.base07} !important; + --tracker-color: #${scheme.base0B} !important; + --in-content-primary-button-background-hover: rgb(81, 83, 05) !important; + --in-content-primary-button-text-color-hover: #${scheme.base05} !important; + --in-content-primary-button-background: #${scheme.base03} !important; + --in-content-primary-button-text-color: #${scheme.base05} !important; + } + + + .card { + background-color: #${scheme.base02} !important; + } + } + } + ''; + userContent = + /* + css + */ + '' + /* Catppuccin Mocha Blue userChrome.css*/ + @media (prefers-color-scheme: dark) { + + :root { + --zen-colors-primary: #${scheme.base02} !important; + --zen-primary-color: #${scheme.base0D} !important; + --zen-colors-secondary: #${scheme.base02} !important; + --zen-colors-tertiary: #${scheme.base01} !important; + --zen-colors-border: #${scheme.base0D} !important; + --toolbarbutton-icon-fill: #${scheme.base0D} !important; + --lwt-text-color: #${scheme.base05} !important; + --toolbar-field-color: #${scheme.base05} !important; + --tab-selected-textcolor: rgb(171, 197, 247) !important; // TODO + --toolbar-field-focus-color: #${scheme.base05} !important; + --toolbar-color: #${scheme.base05} !important; + --newtab-text-primary-color: #${scheme.base05} !important; + --arrowpanel-color: #${scheme.base05} !important; + --arrowpanel-background: #${scheme.base00} !important; + --sidebar-text-color: #${scheme.base05} !important; + --lwt-sidebar-text-color: #${scheme.base05} !important; + --lwt-sidebar-background-color: #${scheme.base01} !important; //TODO 11111b !important; + --toolbar-bgcolor: #${scheme.base02} !important; + --newtab-background-color: #${scheme.base00} !important; + --zen-themed-toolbar-bg: #${scheme.base01} !important; + --zen-main-browser-background: #${scheme.base01} !important; + } + + #permissions-granted-icon{ + color: #${scheme.base01} !important; + } + + .sidebar-placesTree { + background-color: #${scheme.base00} !important; + } + + #zen-workspaces-button { + background-color: #${scheme.base00} !important; + } + + #TabsToolbar { + background-color: #${scheme.base01} !important; + } + + #urlbar-background { + background-color: #${scheme.base00} !important; + } + + .content-shortcuts { + background-color: #${scheme.base00} !important; + border-color: #${scheme.base0D} !important; + } + + .urlbarView-url { + color: #${scheme.base0D} !important; + } + + #zenEditBookmarkPanelFaviconContainer { + background: #${scheme.base01} !important; + } + + toolbar .toolbarbutton-1 { + &:not([disabled]) { + &:is([open], [checked]) > :is(.toolbarbutton-icon, .toolbarbutton-text, .toolbarbutton-badge-stack){ + fill: #${scheme.base01}; + } + } + } + + .identity-color-blue { + --identity-tab-color: #${scheme.base0D} !important; + --identity-icon-color: #${scheme.base0D} !important; + } + + .identity-color-turquoise { + --identity-tab-color: #${scheme.base0C} !important; + --identity-icon-color: #${scheme.base0C} !important; + } + + .identity-color-green { + --identity-tab-color: #${scheme.base0B} !important; + --identity-icon-color: #${scheme.base0B} !important; + } + + .identity-color-yellow { + --identity-tab-color: #${scheme.base0A} !important; + --identity-icon-color: #${scheme.base0A} !important; + } + + .identity-color-orange { + --identity-tab-color: #${scheme.base09} !important; + --identity-icon-color: #${scheme.base09} !important; + } + + .identity-color-red { + --identity-tab-color: #${scheme.base08} !important; + --identity-icon-color: #${scheme.base08} !important; + } + + .identity-color-pink { + --identity-tab-color: #${scheme.base0F} !important; + --identity-icon-color: #${scheme.base0F} !important; // TODO f5c2e7 + } + + .identity-color-purple { + --identity-tab-color: #${scheme.base0E} !important; + --identity-icon-color: #${scheme.base0E} !important; + } + } + ''; + browsername = config.mods.homePackages.browser; + profiles = + if config.mods.homePackages.browser == "firefox" + then config.mods.browser.firefox.profiles + else if config.mods.homePackages.browser == "zen" + then config.mods.browser.zen.profiles + else if config.mods.homePackages.browser == "librewolf" + then [ + { + name = "default"; + value = {}; + } + ] + else []; + profileNamesFn = + builtins.catAttrs "name"; + chromesFn = builtins.map ( + name: + if (builtins.isString browsername) + then { + ".${browsername}/${name}/chrome/userContent.css" = { + text = userChrome; + }; + + ".${browsername}/${name}/chrome/userChrome.css" = { + text = userContent; + }; + } + else {} + ); + moduleFn = lib.lists.foldr (attr1: attr2: attr1 // attr2) {}; + mkFirefoxTheme = profiles: + profiles + |> profileNamesFn + |> chromesFn + |> moduleFn; +in {home.file = mkFirefoxTheme profiles;} diff --git a/home/themes/kdeglobals.nix b/home/themes/kdeglobals.nix new file mode 100644 index 0000000..8fa5003 --- /dev/null +++ b/home/themes/kdeglobals.nix @@ -0,0 +1,252 @@ +# This is ABSOLUTE GARGABE, KDE srsly, remove this! +# props to catppuccin mocha for sparing me from doing this manually: https://github.com/catppuccin/kde/blob/main/Resources/Base.colors +{ + pkgs, + config, + lib, + inputs, + ... +}: let + base16 = pkgs.callPackage inputs.base16.lib {}; + + baseScheme = base16.mkSchemeAttrs config.stylix.base16Scheme; + power = number: powerIndex: + if powerIndex == 1 + then number + else if powerIndex == 0 + then 1 + else number * power number (powerIndex - 1); + + lookupTable = powerIndex: { + "0" = 0 * (power 16 powerIndex); + "1" = 1 * (power 16 powerIndex); + "2" = 2 * (power 16 powerIndex); + "3" = 3 * (power 16 powerIndex); + "4" = 4 * (power 16 powerIndex); + "5" = 5 * (power 16 powerIndex); + "6" = 6 * (power 16 powerIndex); + "7" = 7 * (power 16 powerIndex); + "8" = 8 * (power 16 powerIndex); + "9" = 9 * (power 16 powerIndex); + "a" = 10 * (power 16 powerIndex); + "b" = 11 * (power 16 powerIndex); + "c" = 12 * (power 16 powerIndex); + "d" = 13 * (power 16 powerIndex); + "e" = 14 * (power 16 powerIndex); + "f" = 15 * (power 16 powerIndex); + }; + + convertHex = hexChars: + recombineColors [ + (convertColor (lib.lists.take 2 hexChars)) + (convertColor (lib.lists.take 2 (lib.lists.drop 2 hexChars))) + (convertColor (lib.lists.take 2 (lib.lists.drop 4 hexChars))) + ]; + + convertColor = color: (lookupTable 1).${(lib.lists.head color)} + (lookupTable 0).${(lib.lists.last color)}; + recombineColors = colors: lib.lists.foldr (a: b: (toString a) + "," + (toString b)) "end" colors; + + scheme = { + base00 = lib.strings.removeSuffix ",end" ( + convertHex (lib.strings.stringToCharacters baseScheme.base00) + ); + base01 = lib.strings.removeSuffix ",end" ( + convertHex (lib.strings.stringToCharacters baseScheme.base01) + ); + base02 = lib.strings.removeSuffix ",end" ( + convertHex (lib.strings.stringToCharacters baseScheme.base02) + ); + base03 = lib.strings.removeSuffix ",end" ( + convertHex (lib.strings.stringToCharacters baseScheme.base03) + ); + base04 = lib.strings.removeSuffix ",end" ( + convertHex (lib.strings.stringToCharacters baseScheme.base04) + ); + base05 = lib.strings.removeSuffix ",end" ( + convertHex (lib.strings.stringToCharacters baseScheme.base05) + ); + base06 = lib.strings.removeSuffix ",end" ( + convertHex (lib.strings.stringToCharacters baseScheme.base06) + ); + base07 = lib.strings.removeSuffix ",end" ( + convertHex (lib.strings.stringToCharacters baseScheme.base07) + ); + base08 = lib.strings.removeSuffix ",end" ( + convertHex (lib.strings.stringToCharacters baseScheme.base08) + ); + base09 = lib.strings.removeSuffix ",end" ( + convertHex (lib.strings.stringToCharacters baseScheme.base09) + ); + base0A = lib.strings.removeSuffix ",end" ( + convertHex (lib.strings.stringToCharacters baseScheme.base0A) + ); + base0B = lib.strings.removeSuffix ",end" ( + convertHex (lib.strings.stringToCharacters baseScheme.base0B) + ); + base0C = lib.strings.removeSuffix ",end" ( + convertHex (lib.strings.stringToCharacters baseScheme.base0C) + ); + base0D = lib.strings.removeSuffix ",end" ( + convertHex (lib.strings.stringToCharacters baseScheme.base0D) + ); + base0E = lib.strings.removeSuffix ",end" ( + convertHex (lib.strings.stringToCharacters baseScheme.base0E) + ); + base0F = lib.strings.removeSuffix ",end" ( + convertHex (lib.strings.stringToCharacters baseScheme.base0F) + ); + }; +in { + # temp + # crust -> surface1 + # subtext0 -> surface2 + # accentColor -> lavender + xdg.configFile."kdeglobals" = { + text = '' + [ColorEffects:Disabled] + Color=${scheme.base01} + ColorAmount=0.30000000000000004 + ColorEffect=2 + ContrastAmount=0.1 + ContrastEffect=0 + IntensityAmount=-1 + IntensityEffect=0 + + [ColorEffects:Inactive] + ChangeSelectionColor=true + Color=${scheme.base01} + ColorAmount=0.5 + ColorEffect=3 + ContrastAmount=0 + ContrastEffect=0 + Enable=true + IntensityAmount=0 + IntensityEffect=0 + + [Colors:Button] + BackgroundAlternate=${scheme.base07} + BackgroundNormal=${scheme.base02} + DecorationFocus=${scheme.base07} + DecorationHover=${scheme.base02} + ForegroundActive=${scheme.base09} + ForegroundInactive=${scheme.base04} + ForegroundLink=${scheme.base07} + ForegroundNegative=${scheme.base08} + ForegroundNeutral=${scheme.base0A} + ForegroundNormal=${scheme.base05} + ForegroundPositive=${scheme.base0B} + ForegroundVisited=${scheme.base0E} + + + [Colors:Complementary] + BackgroundAlternate=${scheme.base03} + BackgroundNormal=${scheme.base00} + DecorationFocus=${scheme.base07} + DecorationHover=${scheme.base02} + ForegroundActive=${scheme.base09} + ForegroundInactive=${scheme.base04} + ForegroundLink=${scheme.base07} + ForegroundNegative=${scheme.base08} + ForegroundNeutral=${scheme.base0A} + ForegroundNormal=${scheme.base05} + ForegroundPositive=${scheme.base0B} + ForegroundVisited=${scheme.base0E} + + + [Colors:Header] + BackgroundAlternate=${scheme.base03} + BackgroundNormal=${scheme.base00} + DecorationFocus=${scheme.base07} + DecorationHover=${scheme.base02} + ForegroundActive=${scheme.base09} + ForegroundInactive=${scheme.base04} + ForegroundLink=${scheme.base07} + ForegroundNegative=${scheme.base08} + ForegroundNeutral=${scheme.base0A} + ForegroundNormal=${scheme.base05} + ForegroundPositive=${scheme.base0B} + ForegroundVisited=${scheme.base0E} + + + [Colors:Selection] + BackgroundAlternate=${scheme.base07} + BackgroundNormal=${scheme.base07} + DecorationFocus=${scheme.base07} + DecorationHover=${scheme.base02} + ForegroundLink=${scheme.base07} + ForegroundInactive=${scheme.base00} + ForegroundActive=${scheme.base09} + ForegroundLink=${scheme.base07} + ForegroundNegative=${scheme.base08} + ForegroundNeutral=${scheme.base0A} + ForegroundNormal=${scheme.base03} + ForegroundPositive=${scheme.base0B} + ForegroundVisited=${scheme.base0E} + + + [Colors:Tooltip] + BackgroundAlternate=27,25,35 + BackgroundNormal=${scheme.base01} + DecorationFocus=${scheme.base07} + DecorationHover=${scheme.base02} + ForegroundActive=${scheme.base09} + ForegroundInactive=${scheme.base04} + ForegroundLink=${scheme.base07} + ForegroundNegative=${scheme.base08} + ForegroundNeutral=${scheme.base0A} + ForegroundNormal=${scheme.base05} + ForegroundPositive=${scheme.base0B} + ForegroundVisited=${scheme.base0E} + + + [Colors:View] + BackgroundAlternate=${scheme.base00} + BackgroundNormal=${scheme.base01} + DecorationFocus=${scheme.base07} + DecorationHover=${scheme.base02} + ForegroundActive=${scheme.base09} + ForegroundInactive=${scheme.base04} + ForegroundLink=${scheme.base07} + ForegroundNegative=${scheme.base08} + ForegroundNeutral=${scheme.base0A} + ForegroundNormal=${scheme.base05} + ForegroundPositive=${scheme.base0B} + ForegroundVisited=${scheme.base0E} + + + [Colors:Window] + BackgroundAlternate=${scheme.base03} + BackgroundNormal=${scheme.base00} + DecorationFocus=${scheme.base07} + DecorationHover=${scheme.base02} + ForegroundActive=${scheme.base09} + ForegroundInactive=${scheme.base04} + ForegroundLink=${scheme.base07} + ForegroundNegative=${scheme.base08} + ForegroundNeutral=${scheme.base0A} + ForegroundNormal=${scheme.base05} + ForegroundPositive=${scheme.base0B} + ForegroundVisited=${scheme.base0E} + + + [General] + ColorScheme=CustomBase16Nix + Name=CustomBase16Nix + accentActiveTitlebar=false + shadeSortColumn=true + + + [KDE] + contrast=4 + + + [WM] + activeBackground=${scheme.base01} + activeBlend=${scheme.base05} + activeForeground=${scheme.base05} + inactiveBackground=${scheme.base03} + inactiveBlend=${scheme.base04} + inactiveForeground=${scheme.base04} + ''; + }; +} diff --git a/home/themes/oxiced.nix b/home/themes/oxiced.nix new file mode 100644 index 0000000..8a9e7dc --- /dev/null +++ b/home/themes/oxiced.nix @@ -0,0 +1,86 @@ +{ + config, + inputs, + pkgs, + ... +}: let + # at time of using this here, stylix might not be evaluated yet + # hence ensure it is by using base16 mkSchemeAttrs + base16 = pkgs.callPackage inputs.base16.lib {}; + scheme = base16.mkSchemeAttrs config.stylix.base16Scheme; + valueOrDefault = value: fallback: + if (scheme ? oxiced && scheme.oxiced ? ${value}) + then scheme.oxiced.value + else fallback; +in { + xdg.configFile."oxiced/theme.toml" = { + source = (pkgs.formats.toml {}).generate "oxiced" { + base = valueOrDefault "base" scheme.base00; + mantle = valueOrDefault "mantle" scheme.base01; + primary_bg = valueOrDefault "primary_bg" scheme.base02; + secondary_bg = valueOrDefault "secondary_bg" scheme.base03; + tertiary_bg = valueOrDefault "tertiary_bg" scheme.base04; + text = valueOrDefault "text" scheme.base05; + + primary = valueOrDefault "primary" scheme.base0D; + primary_contrast = valueOrDefault "primary_contrast" "FFFFFF"; + secondary = valueOrDefault "primary" scheme.base07; + secondary_contrast = valueOrDefault "secondary_contrast" "FFFFFF"; + + good = valueOrDefault "good" scheme.base0B; + good_contrast = valueOrDefault "good_contrast" "000000"; + bad = valueOrDefault "bad" scheme.base08; + bad_contrast = valueOrDefault "bad_contrast" "FFFFFF"; + warning = valueOrDefault "warning" scheme.base0A; + warning_contrast = valueOrDefault "warning_contrast" "000000"; + info = valueOrDefault "info" scheme.base0C; + info_contrast = valueOrDefault "info_contrast" "FFFFFF"; + + rose = valueOrDefault "rose" scheme.base06; + lavender = valueOrDefault "lavender" scheme.base07; + blue = valueOrDefault "blue" scheme.base0D; + mauve = valueOrDefault "mauve" scheme.base0E; + flamingo = valueOrDefault "flamingo" scheme.base0F; + + border_color_weak = valueOrDefault "border_color_weak" scheme.base05; + border_color_strong = valueOrDefault "border_color_strong" scheme.base0D; + + tint_amount = valueOrDefault "tint_amound" 0.10; + shade_amount = valueOrDefault "shade_amount" 0.05; + + border_radius = valueOrDefault "border_radius" 10; + + padding_xs = valueOrDefault "padding_xs" 4.0; + padding_sm = valueOrDefault "padding_sm" 8.0; + padding_md = valueOrDefault "padding_md" 12.0; + padding_lg = valueOrDefault "padding_lg" 16.0; + padding_xl = valueOrDefault "padding_xl" 24.0; + padding_xxl = valueOrDefault "padding_xxl" 32.0; + + font_sm = valueOrDefault "font_sm" 10.0; + font_md = valueOrDefault "font_md" 14.0; + font_lg = valueOrDefault "font_lg" 18.0; + font_xl = valueOrDefault "font_xl" 24.0; + font_xxl = valueOrDefault "font_xxl" 32.0; + + # legacy compatibility + name = scheme.scheme; + inherit (scheme) base00; + inherit (scheme) base01; + inherit (scheme) base02; + inherit (scheme) base03; + inherit (scheme) base04; + inherit (scheme) base05; + inherit (scheme) base06; + inherit (scheme) base07; + inherit (scheme) base08; + inherit (scheme) base09; + base0a = scheme.base0A; + base0b = scheme.base0B; + base0c = scheme.base0C; + base0d = scheme.base0D; + base0e = scheme.base0E; + base0f = scheme.base0F; + }; + }; +} diff --git a/nix/programs/themes/qt.nix b/home/themes/qt.nix similarity index 83% rename from nix/programs/themes/qt.nix rename to home/themes/qt.nix index 5fb1956..21dc324 100644 --- a/nix/programs/themes/qt.nix +++ b/home/themes/qt.nix @@ -1,20 +1,28 @@ -{ config, inputs, pkgs, ... }: -let +{ + config, + inputs, + pkgs, + lib, + ... +}: let username = config.conf.username; # at time of using this here, stylix might not be evaluated yet # hence ensure it is by using base16 mkSchemeAttrs - base16 = pkgs.callPackage inputs.base16.lib { }; - scheme = (base16.mkSchemeAttrs config.stylix.base16Scheme); + base16 = pkgs.callPackage inputs.base16.lib {}; + scheme = base16.mkSchemeAttrs config.stylix.base16Scheme; # active_colors=#ffc0caf5, #${scheme.base00}, #ff373949, #ff2b2c3b, #ff1a1b26, #ff2b2c3b, #ffc0caf5, #ffc0caf5, #ffc0caf5, #ff1a1b26, #ff1a1b26, #19000000, #ff2b2c3b, #ffc0caf5, #ff3584e4, #ff1b6acb, #ff1a1b26, #ff242530, #ff1a1b26, #ffc0caf5, #ffc0caf5 # disabled_colors=#ff6d728d, #${scheme.base00}, #ff373949, #ff2b2c3b, #ff1a1b26, #ff2b2c3b, #ff6d728d, #ff6d728d, #ff6d728d, #ff1a1b26, #ff1a1b26, #19000000, #ff2b2c3b, #ff6d728d, #ff3584e4, #ff1b6acb, #ff1a1b26, #ff242530, #ff1a1b26, #ff6d728d, #ff6d728d # inactive_colors=#ff6d728d, #${scheme.base00}, #ff373949, #ff2b2c3b, #ff1a1b26, #ff2b2c3b, #ff6d728d, #ff6d728d, #ff6d728d, #ff1a1b26, #ff1a1b26, #19000000, #ff2b2c3b, #ff6d728d, #ff3584e4, #ff1b6acb, #ff1a1b26, #ff242530, #ff1a1b26, #ff6d728d, #ff6d728d color = '' + + [ColorScheme] active_colors=#ff${scheme.base05}, #ff${scheme.base01}, #ff${scheme.base01}, #ff${scheme.base01}, #ff${scheme.base00}, #ff${scheme.base00}, #ff${scheme.base05}, #ff${scheme.base04}, #ff${scheme.base05}, #ff${scheme.base00}, #ff${scheme.base00}, #00${scheme.base01}, #ff${scheme.base02}, #ff${scheme.base04}, #ff${scheme.base08}, #ff${scheme.base04}, #ff${scheme.base01}, #ff${scheme.base00}, #ff${scheme.base01}, #ff${scheme.base05}, #ff${scheme.base04} disabled_colors=#ff${scheme.base05}, #ff${scheme.base01}, #ff${scheme.base01}, #ff${scheme.base01}, #ff${scheme.base00}, #ff${scheme.base00}, #ff${scheme.base05}, #ff${scheme.base04}, #ff${scheme.base05}, #ff${scheme.base00}, #ff${scheme.base00}, #00${scheme.base01}, #ff${scheme.base02}, #ff${scheme.base04}, #ff${scheme.base08}, #ff${scheme.base04}, #ff${scheme.base01}, #ff${scheme.base00}, #ff${scheme.base01}, #ff${scheme.base05}, #ff${scheme.base04} inactive_colors=#ff${scheme.base05}, #ff${scheme.base01}, #ff${scheme.base01}, #ff${scheme.base01}, #ff${scheme.base00}, #ff${scheme.base00}, #ff${scheme.base05}, #ff${scheme.base04}, #ff${scheme.base05}, #ff${scheme.base00}, #ff${scheme.base00}, #00${scheme.base01}, #ff${scheme.base02}, #ff${scheme.base04}, #ff${scheme.base08}, #ff${scheme.base04}, #ff${scheme.base01}, #ff${scheme.base00}, #ff${scheme.base01}, #ff${scheme.base05}, #ff${scheme.base04} ''; qss = '' + QTabBar::tab:selected { color: palette(highlight); } @@ -22,25 +30,34 @@ let border: none; } ''; -in -{ - xdg.configFile."qt5ct/colors/tokyonight.conf" = { - text = "${color}"; +in { + stylix.targets.qt = { + enable = false; }; - xdg.configFile."qt6ct/colors/tokyonight.conf" = { - text = "${color}"; + qt = { + enable = true; + style.package = pkgs.kdePackages.breeze; + style.name = lib.mkForce "breeze-dark"; }; - xdg.configFile."qt5ct/qss/tab.qss" = { - text = "${qss}"; - }; - xdg.configFile."qt5ct/qt5ct.conf" = { - text = - '' + + xdg.configFile = { + "qt5ct/colors/tokyonight.conf" = { + text = "${color}"; + }; + "qt6ct/colors/tokyonight.conf" = { + text = "${color}"; + }; + "qt5ct/qss/tab.qss" = { + text = "${qss}"; + }; + "qt5ct/qt5ct.conf" = { + text = '' + [Appearance] color_scheme_path=/home/${username}/.config/qt5ct/colors/tokyonight.conf custom_palette=true icon_theme=MoreWaita - standard_dialogs=gtk3 + standard_dialogs=xdgdesktopportal style=Breeze [Fonts] @@ -69,15 +86,15 @@ in force_raster_widgets=1 ignored_applications=@Invalid() ''; - }; - xdg.configFile."qt6ct/qt6ct.conf" = { - text = - '' + }; + "qt6ct/qt6ct.conf" = { + text = '' + [Appearance] - color_scheme_path=/home/${username}/.config/qt6ct/colors/toykonight.conf + color_scheme_path=/home/${username}/.config/qt6ct/colors/tokyonight.conf custom_palette=true - standard_dialogs=default - style=Adwaita-Dark + standard_dialogs=xdgdesktopportal + style=Breeze [Fonts] fixed="DejaVu LGC Sans,12,-1,5,400,0,0,0,0,0,0,0,0,0,0,1" @@ -98,15 +115,10 @@ in underline_shortcut=1 wheel_scroll_lines=3 - [PaletteEditor] - geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x2\x30\0\0\x1\xf4\0\0\0\0\0\0\0\0\0\0\x2\x30\0\0\x1\xf4\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\x2\x30\0\0\x1\xf4) - - [SettingsWindow] - geometry="@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x3\xec\0\0\x3,\0\0\0\0\0\0\0\0\0\0\x3\xec\0\0\x3,\0\0\0\0\0\0\0\0\rp\0\0\0\0\0\0\0\0\0\0\x3\xec\0\0\x3,)" - [Troubleshooting] force_raster_widgets=1 ignored_applications=@Invalid() ''; + }; }; } diff --git a/iso/configuration.nix b/iso/configuration.nix new file mode 100644 index 0000000..9272a65 --- /dev/null +++ b/iso/configuration.nix @@ -0,0 +1,86 @@ +{ + pkgs, + modulesPath, + lib, + self, + inputs, + ... +}: let + system = "x86_64-linux"; +in { + imports = ["${modulesPath}/installer/cd-dvd/iso-image.nix"]; + nixpkgs.hostPlatform = { + inherit system; + }; + + environment.systemPackages = with pkgs; [ + inputs.dashvim.packages.${system}.minimal + disko + git + firefox + kitty + gnome-disk-utility + inputs.disko.packages.${system}.disko-install + ]; + + networking = { + wireless.enable = false; + networkmanager.enable = true; + }; + + nix.settings.experimental-features = [ + "nix-command" + "flakes" + "pipe-operators" + ]; + + users.users.nixos = { + isNormalUser = true; + password = "nixos"; + extraGroups = ["wheel"]; + }; + + image.baseName = lib.mkForce "DashNix"; + + programs = { + hyprland = { + enable = true; + withUWSM = true; + xwayland.enable = false; + }; + uwsm.enable = true; + }; + + fonts.packages = [pkgs.adwaita-fonts]; + i18n.defaultLocale = "en_US.UTF-8"; + + services = { + displayManager.autoLogin = { + enable = true; + user = "nixos"; + }; + greetd = { + enable = true; + settings = { + terminal.vt = 1; + default_session = { + command = "${lib.getExe pkgs.hyprland}"; + user = "nixos"; + }; + }; + }; + }; + + isoImage = { + makeEfiBootable = true; + makeUsbBootable = true; + contents = [ + { + source = "${self}/example"; + target = "example-config"; + } + ]; + }; + + system.stateVersion = "25.11"; +} diff --git a/lib/default.nix b/lib/default.nix new file mode 100644 index 0000000..d8a7402 --- /dev/null +++ b/lib/default.nix @@ -0,0 +1,292 @@ +{ + inputs, + unstable, + self, + system, + permittedPackages, + dashNixAdditionalProps ? {}, + ... +}: let + defaultConfig = { + config = { + allowUnfree = true; + permittedInsecurePackages = permittedPackages; + }; + overlays = [ + inputs.cachy.overlays.default + inputs.nur.overlays.default + ]; + inherit system; + }; + mkPkgs = { + pkgs, + config, + }: let + overlays = + if (config ? overlays) + then config.overlays + else []; + comnbinedConfig = config // {overlays = overlays ++ defaultConfig.overlays;}; + in + import pkgs comnbinedConfig; +in rec { + mkNixos = { + root, + inputLib, + lib, + stablePkgs, + unstablePkgs, + stableMods, + unstableMods, + overridePkgs, + ... + }: + builtins.listToAttrs ( + map + (name: { + inherit name; + value = let + mod = root + /hosts/${name}/configuration.nix; + additionalNixosConfig = root + /hosts/${name}/hardware.nix; + additionalHomeConfig = root + /hosts/${name}/home.nix; + args = { + inherit + self + inputs + mod + additionalHomeConfig + system + root + dashNixAdditionalProps + lib + ; + stable = stablePkgs; + unstable = unstablePkgs; + pkgs = lib.mkForce ( + if overridePkgs + then stablePkgs + else unstablePkgs + ); + alternativePkgs = + if overridePkgs + then unstablePkgs + else stablePkgs; + hostName = name; + homeMods = + if overridePkgs + then unstableMods.home + else stableMods.home; + mkDashDefault = import ./override.nix {inherit lib;}; + }; + nixosMods = + if overridePkgs + then unstableMods.nixos + else stableMods.nixos; + in + inputLib.nixosSystem { + modules = + [ + {_module.args = args;} + mod + ] + ++ nixosMods + ++ lib.optional (builtins.pathExists additionalNixosConfig) additionalNixosConfig + ++ lib.optional (builtins.pathExists mod) mod; + }; + }) + ( + lib.lists.remove "" ( + lib.attrsets.mapAttrsToList (name: fType: + if fType == "directory" + then name + else "") ( + builtins.readDir (root + /hosts) + ) + ) + ) + ); + + mkHome = { + root, + lib, + stablePkgs, + unstablePkgs, + stableMods, + unstableMods, + overridePkgs, + ... + }: + builtins.listToAttrs ( + map + (name: { + inherit name; + value = let + mod = root + /homes/${name}/configuration.nix; + additionalHomeConfig = root + /homes/${name}/home.nix; + args = { + inherit + self + inputs + mod + additionalHomeConfig + system + root + dashNixAdditionalProps + lib + ; + stable = stablePkgs; + unstable = unstablePkgs; + pkgs = lib.mkForce ( + if overridePkgs + then stablePkgs + else unstablePkgs + ); + alternativePkgs = + if overridePkgs + then unstablePkgs + else stablePkgs; + userName = name; + mkDashDefault = import ./override.nix {inherit lib;}; + }; + homeMods = + if overridePkgs + then unstableMods.home + else stableMods.home; + in + inputs.home-manager.lib.homeManagerConfiguration + { + inherit (args) pkgs; + modules = + [ + {_module.args = args;} + mod + ] + ++ homeMods + ++ [ + ../home/common.nix + ../home/themes + ../home/sync.nix + ./foxwrappers.nix + ] + ++ lib.optional (builtins.pathExists mod) mod; + }; + }) + ( + lib.lists.remove "" ( + lib.attrsets.mapAttrsToList (name: fType: + if fType == "directory" + then name + else "") ( + builtins.readDir (root + /homes) + ) + ) + ) + ); + + /* + * + # buildSystems + + Builds system given a list of system names which are placed within your hosts/ directory. Note that each system has its own directory in hosts/ as well. + + A minimal configuration requires the file configuration.nix within each system directory, this will be the base config that is used across both NisOS and home-manager, specific optional files can also be added, hardware.nix for NisOS configuration and home.nix for home-manager configuration. + + The second parameter is the root of your configuration, which should be ./. in most cases. + + `root` + + : the root path of your configuration + + # Example usage + :::{.example} + ```nix + nixosConfigurations = buildSystems { root = ./.; }; + ``` + ::: + */ + # let + # paths = builtins.readDir ; + # names = lib.lists.remove "default" ( + # map (name: lib.strings.removeSuffix ".nix" name) (lib.attrsets.mapAttrsToList (name: _: name) paths) + # ); + + # in + buildFunc = func: { + root, + unstableBundle ? {}, + stableBundle ? {}, + overridePkgs ? false, + ... + }: let + defaultNixosMods = inputs: [ + inputs.lanzaboote.nixosModules.lanzaboote + inputs.nixos-wsl.nixosModules.default + inputs.home-manager.nixosModules.home-manager + inputs.stylix.nixosModules.stylix + inputs.disko.nixosModules.disko + inputs.superfreq.nixosModules.default + inputs.sops-nix.nixosModules.sops + ../base + ../home + ../modules + ]; + + defaultHomeMods = inputs: [ + inputs.anyrun.homeManagerModules.default + inputs.ironbar.homeManagerModules.default + inputs.oxicalc.homeManagerModules.default + inputs.oxishut.homeManagerModules.default + inputs.oxinoti.homeManagerModules.default + inputs.oxidash.homeManagerModules.default + inputs.oxipaste.homeManagerModules.default + inputs.oxirun.homeManagerModules.default + inputs.hyprdock.homeManagerModules.default + inputs.hyprland.homeManagerModules.default + inputs.reset.homeManagerModules.default + inputs.sops-nix.homeManagerModules.sops + inputs.dashvim.homeManagerModules.dashvim + ../modules + ]; + + unstableInput = unstableBundle.pkgs or inputs.unstable; + stableInput = stableBundle.pkgs or inputs.stable; + unstableConfig = unstableBundle.config or defaultConfig; + stableConfig = stableBundle.config or defaultConfig; + unstableInputs = (unstableBundle.inputs or {}) // inputs; + stableInputs = (stableBundle.inputs or {}) // inputs; + unstableMods = { + home = (defaultHomeMods unstableInputs) ++ (unstableBundle.mods.home or []); + nixos = (defaultNixosMods unstableInputs) ++ (unstableBundle.mods.nixos or []); + }; + stableMods = { + home = (defaultHomeMods stableInputs) ++ (stableBundle.mods.home or []); + nixos = (defaultNixosMods stableInputs) ++ (stableBundle.mods.nixos or []); + }; + + unstablePkgs = mkPkgs { + pkgs = unstableInput; + config = unstableConfig; + }; + stablePkgs = mkPkgs { + pkgs = stableInput; + config = stableConfig; + }; + inputLib = unstableInput.lib; + inherit (unstablePkgs) lib; + in + func { + inherit lib inputLib stablePkgs unstablePkgs stableMods unstableMods stableInputs unstableInputs root overridePkgs; + }; + + buildSystems = buildFunc mkNixos; + buildHome = buildFunc mkHome; + + buildIso = inputs.unstable.lib.nixosSystem { + specialArgs = { + inherit self inputs unstable; + }; + modules = [ + ../iso/configuration.nix + ]; + }; +} diff --git a/lib/foxextensions.nix b/lib/foxextensions.nix new file mode 100644 index 0000000..d2360ad --- /dev/null +++ b/lib/foxextensions.nix @@ -0,0 +1,59 @@ +{ + lib, + name, + ... +}: let + mkExtension = id: install_url: { + ${id} = { + inherit install_url; + installation_mode = "normal_installed"; + }; + }; +in { + options.mods.browser.${name} = { + darkreader = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Whether to enable darkreader"; + }; + extensions = lib.mkOption { + default = [ + (mkExtension "uBlock0@raymondhill.net" "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi") + (mkExtension "{a6c4a591-f1b2-4f03-b3ff-767e5bedf4e7}" "https://addons.mozilla.org/firefox/downloads/latest/user-agent-string-switcher/latest.xpi") + (mkExtension "{d7742d87-e61d-4b78-b8a1-b469842139fa}" "https://addons.mozilla.org/firefox/downloads/latest/vimium-ff/latest.xpi") + (mkExtension "firefox@ghostery.com" "https://addons.mozilla.org/firefox/downloads/latest/ghostery/latest.xpi") + (mkExtension "CanvasBlocker@kkapsner.de" "https://addons.mozilla.org/firefox/downloads/latest/canvasblocker/latest.xpi") + (mkExtension "jid1-KKzOGWgsW3Ao4Q@jetpack" "https://addons.mozilla.org/firefox/downloads/latest/i-dont-care-about-cookies/latest.xpi") + (mkExtension "keepassxc-browser@keepassxc.org" "https://addons.mozilla.org/firefox/downloads/latest/keepassxc-browser/latest.xpi") + (mkExtension "@react-devtools" "https://addons.mozilla.org/firefox/downloads/latest/react-devtools/latest.xpi") + (mkExtension "extension@redux.devtools" "https://addons.mozilla.org/firefox/downloads/latest/reduxdevtools/latest.xpi") + (mkExtension "{20a9bb38-ed7c-4faf-9aaf-7c5d241fd747}" "https://addons.mozilla.org/firefox/downloads/file/4524699/angular_devtools-1.0.37.xpi") + (mkExtension "private-relay@firefox.com" "https://addons.mozilla.org/firefox/downloads/latest/private-relay/latest.xpi") + ]; + example = [ + { + "78272b6fa58f4a1abaac99321d503a20@proton.me" = { + install_url = "https://addons.mozilla.org/en-US/firefox/downloads/latest/proton-pass/latest.xpi"; + installation_mode = "normal_installed"; + }; + } + ]; + type = with lib.types; listOf anything; + description = '' + List of extensions via attrsets: + ```nix + # id + # figure out the id via: + # nix run github:tupakkatapa/mozid -- 'https://addons.mozilla.org/en/firefox/addon/ublock-origin' + "uBlock0@raymondhill.net" = { + # install url + install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi"; + # method https://mozilla.github.io/policy-templates/#extensionsettings + installation_mode = "force_installed"; + }; + ``` + ''; + }; + }; +} diff --git a/lib/foxwrappers.nix b/lib/foxwrappers.nix new file mode 100644 index 0000000..e5c39a7 --- /dev/null +++ b/lib/foxwrappers.nix @@ -0,0 +1,43 @@ +# https://github.com/0xc000022070/zen-browser-flake/issues/9#issuecomment-2711057434 +{inputs, ...}: let + mkFirefoxModule = import "${inputs.home-manager.outPath}/modules/programs/firefox/mkFirefoxModule.nix"; +in { + imports = [ + (mkFirefoxModule { + modulePath = [ + "programs" + "zen-browser" + ]; + name = "Zen Browser"; + wrappedPackageName = "zen"; + unwrappedPackageName = "zen-unwrapped"; + visible = true; + platforms = { + linux = { + vendorPath = ".zen"; + configPath = ".zen"; + }; + darwin = { + configPath = "Library/Application Support/Zen"; + }; + }; + }) + (mkFirefoxModule { + modulePath = [ + "programs" + "librewolf-dashnix" + ]; + name = "LibreWolf"; + description = "LibreWolf is a privacy enhanced Firefox fork."; + wrappedPackageName = "librewolf"; + unwrappedPackageName = "librewolf-unwrapped"; + + platforms.linux = {configPath = ".librewolf";}; + platforms.darwin = { + configPath = "Library/Application Support/LibreWolf"; + }; + + enableBookmarks = false; + }) + ]; +} diff --git a/lib/importPkgs.nix b/lib/importPkgs.nix new file mode 100644 index 0000000..cfcd413 --- /dev/null +++ b/lib/importPkgs.nix @@ -0,0 +1,17 @@ +{ + inputs, + currentSystem, + permittedPackages, + pkgs, +}: +import pkgs { + system = currentSystem; + config = { + allowUnfree = true; + permittedInsecurePackages = permittedPackages; + }; + overlays = [ + inputs.nur.overlays.default + inputs.cachy.overlays.default + ]; +} diff --git a/lib/override.nix b/lib/override.nix new file mode 100644 index 0000000..4d222f8 --- /dev/null +++ b/lib/override.nix @@ -0,0 +1 @@ +{lib, ...}: value: lib.mkOverride 999 value diff --git a/lib/wm.nix b/lib/wm.nix new file mode 100644 index 0000000..416956a --- /dev/null +++ b/lib/wm.nix @@ -0,0 +1,446 @@ +let + browserName = config: + if (builtins.isString config.mods.homePackages.browser) + then config.mods.homePackages.browser + else if config.mods.homePackages.browser ? meta && config.mods.homePackages.browser.meta ? mainProgram + then config.mods.homePackages.browser.meta.mainProgram + else config.mods.homePackages.browser.pname; + mkSimpleBind = modKeys: key: command: args: { + inherit modKeys key command args; + }; + mkRepeatSimpleBind = modKeys: key: command: args: { + inherit modKeys key command args; + meta.hyprland.repeat = true; + }; + mkSimpleCustomBind = modKeys: key: niri: hyprland: args: { + inherit modKeys key args; + command = { + inherit niri hyprland; + }; + }; + mkRepeatCustomBind = modKeys: key: niri: hyprland: args: { + inherit modKeys key args; + command = { + inherit niri hyprland; + }; + meta.hyprland.repeat = true; + }; + mkBindWithDesc = modKeys: key: command: args: desc: + { + meta.niri.desc = desc; + } + // mkSimpleBind modKeys key command args; +in { + defaultWindowRules = { + niri = [ + '' + match app-id=r#"^org\.keepassxc\.KeePassXC$"# + match app-id=r#"^org\.gnome\.World\.Secrets$"# + + block-out-from "screen-capture" + '' + '' + match app-id=r#"^steam$"# + open-on-workspace "0" + '' + '' + geometry-corner-radius 12 + clip-to-geometry true + '' + ]; + hyprland = [ + # window rules + "match:class OxiCalc, float on" + "match:class winecfg.exe, float on" + "match:class copyq, float on" + "match:class swappy, center on" + "match:class steam, workspace 10 silent" + ]; + }; + + defaultStartup = config: { + all = [ + "systemctl --user import-environment" + "dbus-update-activation-environment --systemd --all" + "hyprctl setcursor ${config.mods.stylix.cursor.name} ${toString config.mods.stylix.cursor.size}" + # ensures the systemd service knows what "hyprctl" is :) + ( + if config.mods.gaming.gamemode + then "systemctl try-restart gamemoded.service --user" + else "" + ) + + # other programs + "${browserName config}" + ( + if config.mods.oxi.hyprdock.enable + then "hyprdock --server" + else "" + ) + ( + if config.mods.hypr.hyprpaper.enable + then "hyprpaper" + else "" + ) + ( + if config.mods.hypr.hyprland.useIronbar + then "ironbar" + else "" + ) + ( + if config.mods.oxi.oxipaste.enable + then "oxipaste_daemon" + else "" + ) + ( + if config.mods.oxi.oxinoti.enable + then "oxinoti" + else "" + ) + ]; + niri = [ + "XDG_CURRENT_DESKTOP=Niri" + "XDG_SESSION_DESKTOP=Niri" + "XDG_SESSION_TYPE=wayland" + ]; + hyprland = [ + "XDG_CURRENT_DESKTOP=Hyprland" + "XDG_SESSION_DESKTOP=Hyprland" + "XDG_SESSION_TYPE=wayland" + ]; + }; + + defaultEnv = config: { + all = { + GTK_CSD = "0"; + TERM = "kitty /bin/fish"; + HYPRCURSOR_THEME = config.mods.stylix.cursor.name; + HYPRCURSOR_SIZE = toString config.mods.stylix.cursor.size; + XCURSOR_THEME = config.mods.stylix.cursor.name; + XCURSOR_SIZE = toString config.mods.stylix.cursor.size; + QT_QPA_PLATFORM = "wayland"; + QT_QPA_PLATFORMTHEME = "qt5ct"; + QT_WAYLAND_FORCE_DPI = "96"; + QT_AUTO_SCREEN_SCALE_FACTOR = "0"; + QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; + QT_SCALE_FACTOR = "1"; + EDITOR = "neovide --novsync --nofork"; + + LIBVA_DRIVER_NAME = + if config.mods.gpu.nvidia.enable + then "nvidia" + else ""; + GBM_BACKEND = + if config.mods.gpu.nvidia.enable + then "nvidia-drm" + else ""; + __GLX_VENDOR_LIBRARY_NAME = + if config.mods.gpu.nvidia.enable + then "nvidia" + else ""; + }; + niri = {}; + hyprland = {}; + }; + + defaultBinds = config: [ + (mkSimpleBind ["Mod"] "1" "focusWorkspace" ["1"]) + (mkSimpleBind ["Mod"] "2" "focusWorkspace" ["2"]) + (mkSimpleBind ["Mod"] "3" "focusWorkspace" ["3"]) + (mkSimpleBind ["Mod"] "4" "focusWorkspace" ["4"]) + (mkSimpleBind ["Mod"] "5" "focusWorkspace" ["5"]) + (mkSimpleBind ["Mod"] "6" "focusWorkspace" ["6"]) + (mkSimpleBind ["Mod"] "7" "focusWorkspace" ["7"]) + (mkSimpleBind ["Mod"] "8" "focusWorkspace" ["8"]) + (mkSimpleBind ["Mod"] "9" "focusWorkspace" ["9"]) + (mkSimpleBind ["Mod"] "0" "focusWorkspace" ["10"]) + (mkSimpleBind ["Mod" "Shift"] "1" "moveToWorkspace" ["1"]) + (mkSimpleBind ["Mod" "Shift"] "2" "moveToWorkspace" ["2"]) + (mkSimpleBind ["Mod" "Shift"] "3" "moveToWorkspace" ["3"]) + (mkSimpleBind ["Mod" "Shift"] "4" "moveToWorkspace" ["4"]) + (mkSimpleBind ["Mod" "Shift"] "5" "moveToWorkspace" ["5"]) + (mkSimpleBind ["Mod" "Shift"] "6" "moveToWorkspace" ["6"]) + (mkSimpleBind ["Mod" "Shift"] "7" "moveToWorkspace" ["7"]) + (mkSimpleBind ["Mod" "Shift"] "8" "moveToWorkspace" ["8"]) + (mkSimpleBind ["Mod" "Shift"] "9" "moveToWorkspace" ["9"]) + (mkSimpleBind ["Mod" "Shift"] "0" "moveToWorkspace" ["10"]) + (mkSimpleBind ["Mod"] "B" "toggleFullscreen" []) + (mkSimpleBind ["Mod"] "V" "toggleFloating" []) + (mkSimpleBind ["Mod" "Shift"] "M" "quit" []) + (mkSimpleBind ["Mod"] "Left" "moveWindowLeft" []) + (mkSimpleBind ["Mod"] "Down" "moveWindowDown" []) + (mkSimpleBind ["Mod"] "Up" "moveWindowUp" []) + (mkSimpleBind ["Mod"] "Right" "moveWindowRight" []) + + (mkRepeatSimpleBind ["Mod"] "J" "moveFocusLeft" []) + (mkRepeatSimpleBind ["Mod"] "K" "moveFocusDown" []) + (mkRepeatSimpleBind ["Mod"] "L" "moveFocusUp" []) + (mkRepeatSimpleBind ["Mod"] "semicolon" "moveFocusRight" []) + + (mkBindWithDesc ["Mod"] "Q" "killActive" [] "Kill active window") + + (mkBindWithDesc ["Mod"] "N" "spawn" ["neovide"] "Open Neovide") + (mkBindWithDesc ["Mod"] "T" "spawn-sh" ["kitty" "-1"] "Open Kitty") + (mkBindWithDesc ["Mod" "Shift"] "L" "spawn" ["hyprlock"] "Lock screen") + + ( + if config.mods.yazi.enable + then mkBindWithDesc ["Mod"] "E" "spawn-sh" ["EDITOR='neovide --no-fork' kitty yazi"] "Open Yazi" + else {} + ) + ( + if config.mods.anyrun.enable + then mkBindWithDesc ["Mod"] "R" "spawn" ["anyrun"] "Open Anyrun" + else {} + ) + ( + if config.mods.oxi.oxirun.enable + then mkBindWithDesc ["Mod"] "R" "spawn" ["oxirun"] "Open OxiRun" + else {} + ) + ( + if config.mods.oxi.oxidash.enable + then mkBindWithDesc ["Mod"] "M" "spawn" ["oxidash"] "Open OxiDash" + else {} + ) + ( + if config.mods.oxi.oxicalc.enable + then mkBindWithDesc ["Mod"] "G" "spawn" ["oxicalc"] "Open Oxicalc" + else {} + ) + ( + if config.mods.oxi.oxishut.enable + then mkBindWithDesc ["Mod"] "D" "spawn" ["oxishut"] "Open OxiShut" + else {} + ) + ( + if config.mods.oxi.oxipaste.enable + then mkBindWithDesc ["Mod"] "A" "spawn" ["oxipaste"] "Open Oxipaste" + else {} + ) + ( + if config.mods.oxi.hyprdock.enable + then mkBindWithDesc ["Mod" "Shift"] "P" "spawn" ["hyprdock --gui"] "Open Hyprdock" + else {} + ) + ( + if config.mods.hypr.hyprlock.enable + then mkBindWithDesc ["Mod" "Shift" "Alt"] "L" "spawn-sh" ["playerctl -a pause & hyprlock & systemctl suspend"] "Lock and suspend" + else {} + ) + ( + if config.mods.hypr.hyprlock.enable + then mkBindWithDesc ["Mod" "Shift" "Alt"] "K" "spawn-sh" ["playerctl -a pause & hyprlock & systemctl hibernate"] "Lock and hibernate" + else {} + ) + + (mkBindWithDesc ["Mod"] "F" "spawn" ["${browserName config}"] "Open Browser") + ( + if + ( + browserName config == "firefox" || browserName config == "zen" + ) + then mkBindWithDesc ["Mod" "Shift"] "F" "spawn" ["${browserName config} -p special"] "Open Browser Special Profile" + else {} + ) + + (mkBindWithDesc ["Mod"] "S" "spawn-sh" [''grim -g "$(slurp)" - | wl-copy''] "Take Screenshot") + (mkBindWithDesc ["Mod" "Shift"] "S" "spawn-sh" [''grim -g "$(slurp)" - | satty -f -''] "Take Screenshot and edit") + + ( + if config.mods.scripts.audioControl + then { + key = "XF86AudioMute"; + command = "spawn-sh"; + args = ["audioControl mute"]; + meta.niri = { + allowWhileLocked = true; + desc = "Mute Audio"; + }; + } + else {} + ) + ( + if config.mods.scripts.audioControl + then { + key = "XF86AudioRaiseVolume"; + command = "spawn-sh"; + args = ["audioControl +5%"]; + meta.niri = { + allowWhileLocked = true; + desc = "Raise Audio Volume"; + }; + } + else {} + ) + ( + if config.mods.scripts.audioControl + then { + key = "XF86AudioLowerVolume"; + command = "spawn-sh"; + args = ["audioControl -5%"]; + meta.niri = { + allowWhileLocked = true; + desc = "Lower Audio Volume"; + }; + } + else {} + ) + { + key = "XF86AudioPlay"; + command = "spawn-sh"; + args = ["playerctl play-pause"]; + meta.niri = { + allowWhileLocked = true; + desc = "Play/Pause"; + }; + } + { + key = "XF86AudioNext"; + command = "spawn-sh"; + args = ["playerctl next"]; + meta.niri = { + allowWhileLocked = true; + desc = "Next Song"; + }; + } + { + key = "XF86AudioPrev"; + command = "spawn-sh"; + args = ["playerctl previous"]; + meta.niri = { + allowWhileLocked = true; + desc = "Previous Song"; + }; + } + ( + if config.mods.scripts.changeBrightness + then { + key = "XF86MonBrightnessDown"; + command = "spawn-sh"; + args = ["changeBrightness -10%"]; + meta.niri = { + allowWhileLocked = true; + desc = "Lower Brigthness"; + }; + } + else {} + ) + ( + if config.mods.scripts.changeBrightness + then { + key = "XF86MonBrightnessUp"; + command = "spawn-sh"; + args = ["changeBrightness +10%"]; + meta.niri = { + allowWhileLocked = true; + desc = "Raise Brigthness"; + }; + } + else {} + ) + + # Niri only keybinds + (mkSimpleCustomBind ["Mod"] "BracketLeft" "consume-or-expel-window-left" null []) + (mkSimpleCustomBind ["Mod"] "BracketRight" "consume-or-expel-window-right" null []) + (mkSimpleCustomBind ["Mod"] "Comma" "consume-window-into-column" null []) + (mkSimpleCustomBind ["Mod"] "Period" "expel-window-from-column" null []) + (mkSimpleCustomBind ["Mod"] "Y" "switch-preset-column-width" null []) + (mkSimpleCustomBind ["Mod"] "Tab" "focus-workspace-previous" null []) + (mkSimpleCustomBind ["Mod" "Shift"] "V" "switch-focus-between-floating-and-tiling" null []) + (mkSimpleCustomBind ["Mod" "Shift"] "B" "expand-column-to-available-width" null []) + (mkSimpleCustomBind ["Mod"] "U" "set-column-width" null ["-10%"]) + (mkSimpleCustomBind ["Mod"] "P" "set-column-width" null ["+10%"]) + (mkSimpleCustomBind ["Mod"] "O" "set-column-width" null ["50%"]) + (mkSimpleCustomBind ["Mod" "Shift"] "Minus" "set-window-height" null ["-10%"]) + (mkSimpleCustomBind ["Mod" "Shift"] "Equal" "set-window-height" null ["+10%"]) + (mkSimpleCustomBind ["Mod" "Ctrl"] "1" "move-column-to-workspace" null ["1"]) + (mkSimpleCustomBind ["Mod" "Ctrl"] "2" "move-column-to-workspace" null ["2"]) + (mkSimpleCustomBind ["Mod" "Ctrl"] "3" "move-column-to-workspace" null ["3"]) + (mkSimpleCustomBind ["Mod" "Ctrl"] "4" "move-column-to-workspace" null ["4"]) + (mkSimpleCustomBind ["Mod" "Ctrl"] "5" "move-column-to-workspace" null ["5"]) + (mkSimpleCustomBind ["Mod" "Ctrl"] "6" "move-column-to-workspace" null ["6"]) + (mkSimpleCustomBind ["Mod" "Ctrl"] "7" "move-column-to-workspace" null ["7"]) + (mkSimpleCustomBind ["Mod" "Ctrl"] "8" "move-column-to-workspace" null ["8"]) + (mkSimpleCustomBind ["Mod" "Ctrl"] "9" "move-column-to-workspace" null ["9"]) + (mkSimpleCustomBind ["Mod" "Ctrl"] "0" "move-column-to-workspace" null ["10"]) + (mkSimpleCustomBind ["Mod" "Shift"] "J" "focus-monitor-left" null []) + (mkSimpleCustomBind ["Mod" "Shift"] "semicolon" "focus-monitor-right" null []) + (mkSimpleCustomBind ["Mod" "Ctrl"] "J" "move-column-to-monitor-left" null []) + (mkSimpleCustomBind ["Mod" "Ctrl"] "semicolon" "move-column-to-monitor-right" null []) + (mkSimpleCustomBind ["Mod" "Shift"] "Slash" "show-hotkey-overlay" null []) + { + modKeys = ["Mod"]; + key = "W"; + command.niri = "toggle-overview"; + meta.niri = { + desc = "Overview"; + repeat = false; + }; + } + { + modKeys = ["Mod"]; + key = "Escape"; + command.niri = "toggle-keyboard-shortcuts-inhibit"; + meta.niri = { + allowInhibit = false; + }; + } + { + modKeys = ["Mod"]; + key = "WheelScrollUp"; + command.niri = "focus-workspace-up"; + meta.niri.cooldown = 150; + } + { + modKeys = ["Mod"]; + key = "WheelScrollDown"; + command.niri = "focus-workspace-down"; + meta.niri.cooldown = 150; + } + { + modKeys = ["Mod"]; + key = "WheelScrollRight"; + command.niri = "focus-column-right"; + meta.niri.cooldown = 150; + } + { + modKeys = ["Mod"]; + key = "WheelScrollLeft"; + command.niri = "focus-column-left"; + meta.niri.cooldown = 150; + } + + # Hyprland only keybinds + (mkSimpleCustomBind ["Mod"] "C" null "togglesplit" []) + (mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "1" null "movetoworkspacesilent" ["1"]) + (mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "2" null "movetoworkspacesilent" ["2"]) + (mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "3" null "movetoworkspacesilent" ["3"]) + (mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "4" null "movetoworkspacesilent" ["4"]) + (mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "5" null "movetoworkspacesilent" ["5"]) + (mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "6" null "movetoworkspacesilent" ["6"]) + (mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "7" null "movetoworkspacesilent" ["7"]) + (mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "8" null "movetoworkspacesilent" ["8"]) + (mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "9" null "movetoworkspacesilent" ["9"]) + (mkSimpleCustomBind ["Mod" "SHIFT" "ALT"] "0" null "movetoworkspacesilent" ["10"]) + (mkRepeatCustomBind ["Mod"] "U" null "resizeactive" ["-20" "0"]) + (mkRepeatCustomBind ["Mod"] "P" null "resizeactive" ["20" "0"]) + (mkRepeatCustomBind ["Mod"] "O" null "resizeactive" ["0" "-20"]) + (mkRepeatCustomBind ["Mod"] "I" null "resizeactive" ["0" "20"]) + (mkSimpleCustomBind ["Mod" "ALT"] "J" null "layoutmsg" ["preselect" "l"]) + (mkSimpleCustomBind ["Mod" "ALT"] "K" null "layoutmsg" ["preselect" "d"]) + (mkSimpleCustomBind ["Mod" "ALT"] "L" null "layoutmsg" ["preselect" "u"]) + (mkSimpleCustomBind ["Mod" "ALT"] "semicolon" null "layoutmsg" ["preselect" "r"]) + (mkSimpleCustomBind ["Mod" "ALT"] "H" null "layoutmsg" ["preselect" "n"]) + ( + if config.mods.hypr.hyprland.hyprspaceEnable + then { + modKeys = ["Mod"]; + key = "W"; + command.hyprland = "overview:toggle"; + args = []; + } + else {} + ) + ]; +} diff --git a/logo.svg b/logo.svg new file mode 100644 index 0000000..8c9526c --- /dev/null +++ b/logo.svg @@ -0,0 +1,293 @@ + + + +DashNixDashNix diff --git a/modules/conf.nix b/modules/conf.nix new file mode 100644 index 0000000..0e3a166 --- /dev/null +++ b/modules/conf.nix @@ -0,0 +1,170 @@ +{ + lib, + config, + options, + ... +}: { + options.conf = { + system = lib.mkOption { + default = "x86_64-linux"; + # no fisherprice unix support + type = with lib.types; (enum [ + "x86_64-linux" + "aarch64-linux" + "aarch64-linux-android" + ]); + example = "aarch64-linux"; + description = '' + System architecture. + ''; + }; + + systemLocalTime = lib.mkOption { + default = false; + example = true; + description = '' + System time for dualbooting + ''; + }; + + wsl = lib.mkOption { + default = false; + example = true; + description = '' + Runs Nix in wsl + ''; + }; + + secureBoot = lib.mkOption { + default = false; + example = true; + description = '' + enables secure boot. + Note: Secure boot is NOT reproducible + Here are the necessary steps: + + create your keys with sbctl -> sudo sbctl create-keys + + build with systemd once -> set this to false and build once + + build with secureBoot true + + verify that your keys are signed (note, only systemd and your generations should now be signed): sudo sbtcl verify + + enroll your keys (microsoft is necessary for windows dualboot support, leave it there): sudo sbctl enroll-keys --microsoft + + reboot with secureboot enabled + Note: Some motherboards have vendor specific keys for secure boot, this may not necessarily work with our self signed keys + You likely have to disable these vendor specific keys (example HP: sure boot) + ''; + }; + + useSystemdBootloader = lib.mkOption { + default = true; + example = false; + description = '' + use systemd bootloader. + ''; + }; + + cpu = lib.mkOption { + # TODO: how to enable arm? + default = "amd"; + type = with lib.types; (enum [ + "amd" + "intel" + ]); + example = "intel"; + description = '' + cpu microcode. + ''; + }; + + additionalBootKernalParams = lib.mkOption { + default = []; + example = []; + type = with lib.types; listOf str; + description = '' + additional kernelParams passed to bootloader + ''; + }; + + bootParams = lib.mkOption { + default = []; + example = ["resume=something"]; + type = with lib.types; listOf str; + description = '' + Boot params + ''; + }; + + kernelOverride = lib.mkOption { + default = null; + type = with lib.types; nullOr package; + description = '' + kernel to be used + Has no examples as doc complains... + #example = pkgs.linuxPackages_xanmod_latest; + ''; + }; + + username = lib.mkOption { + default = "DashNix"; + example = "pingpang"; + type = lib.types.str; + description = '' + The username. + ''; + }; + + timezone = lib.mkOption { + default = "Europe/Zurich"; + example = "Europe/Berlin"; + type = lib.types.str; + description = '' + The timezone. + ''; + }; + + locale = lib.mkOption { + default = "en_US.UTF-8"; + example = "de_DE.UTF-8"; + type = lib.types.str; + description = '' + The locale. + ''; + }; + + nixosConfigPath = lib.mkOption { + default = "/home/${config.conf.username}/gits/nixos/."; + example = "yourpath/."; + type = lib.types.str; + description = '' + The path for your build command, you can then simply type rebuild to switch to a new configuration. + ''; + }; + + systemStateVersion = lib.mkOption { + example = "24.11"; + default = "23.05"; + type = lib.types.str; + description = '' + System state version + ''; + }; + homeStateVersion = lib.mkOption { + default = "24.11"; + example = "23.05"; + type = lib.types.str; + description = '' + Home state version + ''; + }; + }; + + config = + (lib.optionalAttrs (options ? system.stateVersion) { + boot = { + kernelPackages = lib.mkIf (config.conf.kernelOverride != null) config.conf.kernel; + kernelParams = config.conf.additionalBootKernalParams; + }; + system.stateVersion = config.conf.systemStateVersion; + }) + // (lib.optionalAttrs (options ? home.stateVersion) { + home.stateVersion = config.conf.homeStateVersion; + }); +} diff --git a/modules/default.nix b/modules/default.nix new file mode 100644 index 0000000..683596a --- /dev/null +++ b/modules/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./programs + ./conf.nix + ]; +} diff --git a/modules/programs/acpid.nix b/modules/programs/acpid.nix new file mode 100644 index 0000000..228c402 --- /dev/null +++ b/modules/programs/acpid.nix @@ -0,0 +1,21 @@ +{ + lib, + config, + options, + ... +}: { + options.mods = { + acpid.enable = lib.mkOption { + default = false; + type = lib.types.bool; + example = true; + description = '' + Enables acpid. + ''; + }; + }; + + config = lib.mkIf config.mods.acpid.enable ( + lib.optionalAttrs (options ? virtualisation.virtualbox.host) {services.acpid.enable = true;} + ); +} diff --git a/modules/programs/anyrun.nix b/modules/programs/anyrun.nix new file mode 100644 index 0000000..b1b7922 --- /dev/null +++ b/modules/programs/anyrun.nix @@ -0,0 +1,145 @@ +{ + mkDashDefault, + lib, + config, + pkgs, + options, + inputs, + ... +}: { + options.mods.anyrun = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables anyrun"; + }; + useDefaultConfig = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Use preconfigured anyrun config. + ''; + }; + customConfig = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = '' + Custom anyrun configuration. + Will be merged with default configuration if enabled. + ''; + }; + useDefaultCss = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Use preconfigured anyrun css. + ''; + }; + customCss = lib.mkOption { + default = ''''; + example = '' + #window { + border-radius: none; + } + ''; + type = lib.types.lines; + description = '' + Custom anyrun css. + Will be merged with default css if enabled. + ''; + }; + }; + + config = lib.mkIf config.mods.anyrun.enable ( + lib.optionalAttrs (options ? home.packages) { + programs.anyrun = lib.mkForce { + package = pkgs.anyrun; + enable = true; + config = + if config.mods.anyrun.useDefaultConfig + then + lib.mkMerge + [ + { + plugins = [ + inputs.anyrun.packages.${pkgs.system}.applications + inputs.anyrun.packages.${pkgs.system}.rink + inputs.anyrun.packages.${pkgs.system}.translate + inputs.anyrun.packages.${pkgs.system}.websearch + ]; + hideIcons = mkDashDefault false; + width = { + fraction = mkDashDefault 0.3; + }; + y = { + fraction = mkDashDefault 0.5; + }; + layer = mkDashDefault "overlay"; + hidePluginInfo = mkDashDefault true; + closeOnClick = mkDashDefault true; + } + config.mods.anyrun.customConfig + ] + else config.mods.anyrun.customConfig; + + extraCss = + if config.mods.anyrun.useDefaultCss + then + '' + #window { + border-radius: 10px; + background-color: transparent; + } + + box#main { + border-radius: 10px; + } + + list#main { + border-radius: 10px; + margin: 0px 10px 10px 10px; + } + + list#plugin { + border-radius: 10px; + } + + list#match { + border-radius: 10px; + } + + entry#entry { + border: 0; + border-radius: 10px; + margin: 10px 10px 0px 10px; + } + + label#match-desc { + font-size: 12px; + border-radius: 10px; + } + + label#match-title { + font-size: 12px; + border-radius: 10px; + } + + label#plugin { + font-size: 16px; + border-radius: 10px; + } + + * { + border-radius: 10px; + } + '' + + config.mods.anyrun.customCss + else config.mods.anyrun.customCss; + }; + } + ); +} diff --git a/modules/programs/basePackages.nix b/modules/programs/basePackages.nix new file mode 100644 index 0000000..1d1b2b9 --- /dev/null +++ b/modules/programs/basePackages.nix @@ -0,0 +1,132 @@ +{ + mkDashDefault, + config, + lib, + options, + pkgs, + inputs, + system, + ... +}: { + options.mods = { + basePackages = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables default system packages. + ''; + }; + additionalPackages = lib.mkOption { + default = []; + example = [pkgs.openssl]; + type = with lib.types; listOf package; + description = '' + Additional packages to install. + Note that these are installed even if base packages is disabled, e.g. you can also use this as the only packages to install. + ''; + }; + specialPrograms = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = '' + special program configuration to be added which require programs.something notation. + ''; + }; + specialServices = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = '' + special services configuration to be added which require an services.something notation. + ''; + }; + }; + }; + + config = lib.optionalAttrs (options ? environment.systemPackages) { + environment.systemPackages = + if config.mods.basePackages.enable + then + with pkgs; + [ + inputs.statix.packages.${system}.default + adwaita-icon-theme + dbus + dconf + direnv + glib + gnome.nixos-gsettings-overrides + gsettings-desktop-schemas + gtk-layer-shell + gtk3 + gtk4 + gtk4-layer-shell + hicolor-icon-theme + icon-library + kdePackages.breeze-icons + kdePackages.breeze + kdePackages.qtstyleplugin-kvantum + libsForQt5.qtstyleplugin-kvantum + libadwaita + libxkbcommon + alejandra + openssl + seahorse + upower + xorg.xkbutils + sbctl + ] + ++ config.mods.basePackages.additionalPackages + else config.mods.basePackages.additionalPackages; + + gtk.iconCache.enable = mkDashDefault false; + services = + if config.mods.basePackages.enable + then + { + upower.enable = mkDashDefault true; + dbus = { + enable = mkDashDefault true; + }; + avahi = { + enable = mkDashDefault true; + nssmdns4 = mkDashDefault true; + openFirewall = mkDashDefault true; + }; + } + // config.mods.basePackages.specialServices + else config.mods.basePackages.specialServices; + + programs = + if config.mods.basePackages.enable + then + lib.mkMerge + [ + { + nix-ld = { + enable = mkDashDefault true; + libraries = with pkgs; [ + jdk + zlib + ]; + }; + direnv = { + package = mkDashDefault pkgs.direnv; + silent = mkDashDefault false; + loadInNixShell = mkDashDefault true; + direnvrcExtra = mkDashDefault ""; + nix-direnv = { + enable = mkDashDefault true; + package = mkDashDefault pkgs.nix-direnv; + }; + }; + gnupg.agent.enable = mkDashDefault true; + } + config.mods.basePackages.specialPrograms + ] + else config.mods.basePackages.specialPrograms; + }; +} diff --git a/modules/programs/bluetooth.nix b/modules/programs/bluetooth.nix new file mode 100644 index 0000000..f0e2ef1 --- /dev/null +++ b/modules/programs/bluetooth.nix @@ -0,0 +1,27 @@ +{ + mkDashDefault, + lib, + config, + options, + ... +}: { + options.mods = { + bluetooth.enable = lib.mkOption { + default = false; + type = lib.types.bool; + example = true; + description = '' + Enables bluetooth. + ''; + }; + }; + + config = lib.mkIf config.mods.bluetooth.enable ( + lib.optionalAttrs (options ? hardware.bluetooth) { + hardware.bluetooth = { + enable = mkDashDefault true; + powerOnBoot = mkDashDefault true; + }; + } + ); +} diff --git a/modules/programs/browser/brave.nix b/modules/programs/browser/brave.nix new file mode 100644 index 0000000..404fddd --- /dev/null +++ b/modules/programs/browser/brave.nix @@ -0,0 +1,22 @@ +{ + lib, + config, + options, + pkgs, + ... +}: { + options.mods.browser.brave = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables brave"; + }; + # TODO configure brave + }; + config = lib.mkIf (config.mods.browser.brave.enable || config.mods.homePackages.browser == "brave") ( + lib.optionalAttrs (options ? home.packages) { + home.packages = with pkgs; [brave]; + } + ); +} diff --git a/modules/programs/browser/chromium.nix b/modules/programs/browser/chromium.nix new file mode 100644 index 0000000..5d48046 --- /dev/null +++ b/modules/programs/browser/chromium.nix @@ -0,0 +1,22 @@ +{ + lib, + config, + options, + pkgs, + ... +}: { + options.mods.browser.chromium = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables chromium"; + }; + # TODO configure chromium + }; + config = lib.mkIf (config.mods.browser.chromium.enable || config.mods.homePackages.browser == "chromium") ( + lib.optionalAttrs (options ? home.packages) { + home.packages = with pkgs; [chromium]; + } + ); +} diff --git a/modules/programs/browser/default.nix b/modules/programs/browser/default.nix new file mode 100644 index 0000000..ade4ecf --- /dev/null +++ b/modules/programs/browser/default.nix @@ -0,0 +1,9 @@ +{ + imports = [ + ./brave.nix + ./chromium.nix + ./firefox.nix + ./librewolf.nix + ./zen.nix + ]; +} diff --git a/modules/programs/browser/firefox.nix b/modules/programs/browser/firefox.nix new file mode 100644 index 0000000..d93ac58 --- /dev/null +++ b/modules/programs/browser/firefox.nix @@ -0,0 +1,125 @@ +{ + lib, + dashNixAdditionalProps, + config, + options, + pkgs, + ... +}: let + name = "firefox"; +in { + imports = [ + (import ../../../lib/foxextensions.nix + {inherit lib dashNixAdditionalProps pkgs name;}) + ]; + options.mods.browser.${name} = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables firefox"; + }; + configuration = lib.mkOption { + default = { + EnableTrackingProtection = { + Value = true; + Locked = true; + Cryptomining = true; + Fingerprinting = true; + }; + DisablePocket = true; + DisplayBookmarksToolbar = "never"; + DisplayMenuBar = "default-off"; + CaptivePortal = false; + DisableFirefoxStudies = true; + DisableTelemetry = true; + DisableFirefoxAccounts = false; + NoDefaultBookmarks = true; + OfferToSaveLogins = false; + OfferToSaveLoginsDefault = false; + PasswordManagerEnabled = false; + FirefoxHome = { + Search = true; + Pocket = false; + Snippets = false; + TopSites = true; + Highlights = false; + }; + UserMessaging = { + ExtensionRecommendations = false; + SkipOnboarding = true; + }; + }; + example = {}; + type = with lib.types; attrsOf anything; + description = "Firefox policy configuration. See https://mozilla.github.io/policy-templates/ for more information."; + }; + profiles = lib.mkOption { + default = [ + { + name = "${config.conf.username}"; + value = { + isDefault = true; + id = 0; + }; + } + { + name = "special"; + value = { + isDefault = false; + id = 1; + }; + } + ]; + example = [ + { + name = "custom"; + value = { + isDefault = true; + id = 0; + extensions.packages = [pkgs.nur.repos.rycee.firefox-addons.darkreader]; + }; + } + ]; + type = with lib.types; listOf (attrsOf anything); + description = "Firefox profiles"; + }; + }; + config = lib.mkIf (config.mods.browser.firefox.enable || config.mods.homePackages.browser == "firefox") ( + lib.optionalAttrs (options ? programs.firefox.profiles) { + stylix.targets.firefox.profileNames = + map ( + {name, ...}: + name + ) + config.mods.browser.firefox.profiles; + programs.firefox = { + enable = true; + package = + pkgs.wrapFirefox + pkgs.firefox-unwrapped + { + pname = "firefox"; + extraPolicies = + config.mods.browser.firefox.configuration + // { + ExtensionSettings = builtins.foldl' (acc: ext: acc // ext) {} (config.mods.browser.firefox.extensions + ++ ( + if config.mods.browser.firefox.darkreader + then [ + { + "addon@darkreader.org" = { + install_url = "file://${pkgs.callPackage ../../../patches/darkreader.nix {inherit lib dashNixAdditionalProps;}}/latest.xpi"; + installation_mode = "normal_installed"; + }; + } + ] + else [] + )); + }; + }; + profiles = builtins.listToAttrs config.mods.browser.firefox.profiles; + }; + } + ); +} diff --git a/modules/programs/browser/librewolf.nix b/modules/programs/browser/librewolf.nix new file mode 100644 index 0000000..fc74bf3 --- /dev/null +++ b/modules/programs/browser/librewolf.nix @@ -0,0 +1,119 @@ +{ + lib, + dashNixAdditionalProps, + config, + options, + pkgs, + ... +}: let + name = "librewolf"; +in { + imports = [ + (import ../../../lib/foxextensions.nix + {inherit lib dashNixAdditionalProps pkgs name;}) + ]; + options.mods.browser.${name} = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables the librwolf browser"; + }; + configuration = lib.mkOption { + default = { + EnableTrackingProtection = { + Value = true; + Locked = true; + Cryptomining = true; + Fingerprinting = true; + }; + DisablePocket = true; + DisplayBookmarksToolbar = "never"; + DisplayMenuBar = "default-off"; + CaptivePortal = false; + DisableFirefoxStudies = true; + DisableTelemetry = true; + DisableFirefoxAccounts = false; + NoDefaultBookmarks = true; + OfferToSaveLogins = false; + OfferToSaveLoginsDefault = false; + PasswordManagerEnabled = false; + FirefoxHome = { + Search = true; + Pocket = false; + Snippets = false; + TopSites = true; + Highlights = false; + }; + UserMessaging = { + ExtensionRecommendations = false; + SkipOnboarding = true; + }; + }; + example = {}; + type = with lib.types; attrsOf anything; + description = "Librewolf policy configuration. See https://mozilla.github.io/policy-templates/ for more information."; + }; + profiles = lib.mkOption { + default = [ + { + name = "${config.conf.username}"; + value = { + isDefault = true; + id = 0; + }; + } + { + name = "special"; + value = { + isDefault = false; + id = 1; + }; + } + ]; + example = [ + { + name = "custom"; + value = { + isDefault = true; + id = 0; + extensions.packages = [pkgs.nur.repos.rycee.firefox-addons.darkreader]; + }; + } + ]; + type = with lib.types; listOf (attrsOf anything); + description = "Librewolf profiles"; + }; + }; + config = lib.mkIf (config.mods.browser.librewolf.enable || config.mods.homePackages.browser == "librewolf") ( + lib.optionalAttrs (options ? home.packages) { + programs.librewolf-dashnix = { + enable = true; + package = + pkgs.wrapFirefox + pkgs.librewolf-unwrapped + { + pname = "librewolf"; + extraPolicies = + config.mods.browser.librewolf.configuration + // { + ExtensionSettings = builtins.foldl' (acc: ext: acc // ext) {} (config.mods.browser.librewolf.extensions + ++ ( + if config.mods.browser.firefox.darkreader + then [ + { + "addon@darkreader.org" = { + install_url = "file://${pkgs.callPackage ../../../patches/darkreader.nix {inherit lib dashNixAdditionalProps;}}/latest.xpi"; + installation_mode = "normal_installed"; + }; + } + ] + else [] + )); + }; + }; + profiles = builtins.listToAttrs config.mods.browser.librewolf.profiles; + }; + } + ); +} diff --git a/modules/programs/browser/zen.nix b/modules/programs/browser/zen.nix new file mode 100644 index 0000000..db32900 --- /dev/null +++ b/modules/programs/browser/zen.nix @@ -0,0 +1,157 @@ +# credits to Voronind for darkreader config https://github.com/voronind-com/nix/blob/main/home/program/firefox/default.nix +{ + lib, + dashNixAdditionalProps, + config, + options, + inputs, + system, + pkgs, + ... +}: let + # at time of using this here, stylix might not be evaluated yet + # hence ensure it is by using base16 mkSchemeAttrs + base16 = pkgs.callPackage inputs.base16.lib {}; + scheme = base16.mkSchemeAttrs config.stylix.base16Scheme; + name = "zen"; +in { + imports = [ + (import ../../../lib/foxextensions.nix + {inherit lib dashNixAdditionalProps pkgs name;}) + ]; + options.mods.browser.${name} = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables the zen browser"; + }; + configuration = lib.mkOption { + default = { + EnableTrackingProtection = { + Value = true; + Locked = true; + Cryptomining = true; + Fingerprinting = true; + }; + DisablePocket = true; + CaptivePortal = false; + DisableFirefoxStudies = true; + DisableTelemetry = true; + NoDefaultBookmarks = true; + PasswordManagerEnabled = false; + FirefoxHome = { + Search = true; + Pocket = false; + Snippets = false; + TopSites = true; + Highlights = false; + }; + UserMessaging = { + ExtensionRecommendations = false; + SkipOnboarding = true; + }; + "3rdparty".Extensions = { + "addon@darkreader.org" = { + theme = { + darkSchemeBackgroundColor = "#${scheme.base00}"; + darkSchemeTextColor = "#${scheme.base05}"; + }; + previewNewDesign = true; + }; + }; + }; + example = {}; + type = with lib.types; attrsOf anything; + description = "Zen policy configuration. See https://mozilla.github.io/policy-templates for more information."; + }; + profiles = lib.mkOption { + default = [ + { + name = "${config.conf.username}"; + value = { + settings = { + "zen.view.compact.hide-tabbar" = false; + "zen.view.compact.hide-toolbar" = true; + "zen.view.sidebar-expanded" = false; + "zen.view.use-single-toolbar" = false; + "zen.view.welcome-screen.seen" = true; + "zen.theme.accent-color" = "#b4bbff"; + "extensions.autoDisableScopes" = 0; + "cookiebanners.service.mode" = 2; + "widget.use-xdg-desktop-portal.file-picker" = 1; + }; + isDefault = true; + id = 0; + }; + } + { + name = "special"; + value = { + settings = { + "zen.view.compact.hide-tabbar" = false; + "zen.view.compact.hide-toolbar" = true; + "zen.view.sidebar-expanded" = false; + "zen.view.use-single-toolbar" = false; + "zen.view.welcome-screen.seen" = true; + "zen.theme.accent-color" = "#b4bbff"; + "extensions.autoDisableScopes" = 0; + "widget.use-xdg-desktop-portal.file-picker" = 1; + }; + isDefault = false; + id = 1; + }; + } + ]; + example = [ + { + name = "custom"; + value = { + settings = { + extensions.autoDisableScopes = 0; + }; + extensions.packages = [pkgs.nur.repos.rycee.firefox-addons.darkreader]; + isDefault = true; + id = 0; + }; + } + ]; + type = with lib.types; listOf (attrsOf anything); + description = "Zen profiles"; + }; + }; + config = lib.mkIf (config.mods.browser.zen.enable || config.mods.homePackages.browser == "zen") ( + (lib.optionalAttrs (options ? home.packages) { + programs.zen-browser = { + enable = true; + package = + pkgs.wrapFirefox + inputs.zen-browser.packages.${system}.zen-browser-unwrapped + { + pname = "zen-browser"; + extraPolicies = + config.mods.browser.zen.configuration + // { + ExtensionSettings = builtins.foldl' (acc: ext: acc // ext) {} (config.mods.browser.zen.extensions + ++ ( + if config.mods.browser.firefox.darkreader + then [ + { + "addon@darkreader.org" = { + install_url = "file://${pkgs.callPackage ../../../patches/darkreader.nix {inherit lib dashNixAdditionalProps;}}/latest.xpi"; + installation_mode = "normal_installed"; + }; + } + ] + else [] + )); + }; + }; + profiles = builtins.listToAttrs config.mods.browser.zen.profiles; + }; + }) + // (lib.optionalAttrs (options ? stylix.targets.zen-browser) { + stylix.targets.zen-browser.profileNames = lib.map (profile: profile.name) config.mods.browser.zen.profiles; + }) + ); +} diff --git a/modules/programs/clam.nix b/modules/programs/clam.nix new file mode 100644 index 0000000..e212529 --- /dev/null +++ b/modules/programs/clam.nix @@ -0,0 +1,60 @@ +{ + lib, + config, + options, + pkgs, + ... +}: { + options.mods.clam = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables the clamav program and its daemon"; + }; + scanner = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables the clamav scanner"; + }; + interval = lib.mkOption { + type = lib.types.str; + default = "*-*-* 04:00:00"; + description = '' + How often clamdscan is invoked. + By default this runs using 10 cores at most, be sure to run it at a time of low traffic. + ''; + }; + scanDirectories = lib.mkOption { + type = with lib.types; listOf str; + default = [ + "/home" + "/var/lib" + "/tmp" + "/etc" + "/var/tmp" + ]; + description = ''List of directories to scan''; + }; + }; + }; + config = lib.mkIf config.mods.clam.enable ( + lib.optionalAttrs (options ? services.clamav) { + services.clamav = { + daemon.enable = true; + updater.enable = true; + scanner = { + inherit (config.mods.clam.scanner) enable; + inherit (config.mods.clam.scanner) interval; + inherit (config.mods.clam.scanner) scanDirectories; + }; + }; + environment.systemPackages = [ + pkgs.clamav + ]; + } + // lib.optionalAttrs (options ? home.packages) {home.packages = with pkgs; [clamtk];} + ); +} diff --git a/modules/programs/coding.nix b/modules/programs/coding.nix new file mode 100644 index 0000000..5a22205 --- /dev/null +++ b/modules/programs/coding.nix @@ -0,0 +1,575 @@ +{ + mkDashDefault, + lib, + config, + pkgs, + options, + inputs, + system, + ... +}: let + font_family = "${config.mods.stylix.fonts.monospace.name}"; +in { + options.mods = { + coding = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables coding packages. + ''; + }; + dashvim = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables dashvim package. + ''; + }; + jetbrains = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = '' + Enables jetbrains toolbox. + ''; + }; + vscodium = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = '' + Enables vscodium. + ''; + }; + extensions = lib.mkOption { + default = []; + example = []; + type = with lib.types; listOf package; + description = "Extensions to be installed"; + }; + }; + penpot = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables penpot"; + }; + neovide = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables neovide"; + }; + config = lib.mkOption { + default = { + font = { + size = 12; + normal = { + family = font_family; + style = ""; + }; + bold = { + family = font_family; + style = "ExtraBold"; + }; + italic = { + family = font_family; + style = "Italic"; + }; + bold_italic = { + family = font_family; + style = "Bold Italic"; + }; + }; + }; + example = {}; + type = with lib.types; attrsOf anything; + description = "Config for neovide"; + }; + }; + gh = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables and configures gh"; + }; + config = lib.mkOption { + default = { + version = 1; + git_protocol = "ssh"; + editor = ""; + prompt = "enabled"; + prefer_editor_prompt = "disabled"; + pager = ""; + aliases = { + co = "pr checkout"; + }; + http_unix_socket = ""; + browser = ""; + }; + example = {}; + type = with lib.types; attrsOf anything; + description = "config for gh. Keep in mind, empty values refer to using environment variables"; + }; + hosts = lib.mkOption { + default = { + "github.com" = { + git_protocol = "ssh"; + users = { + ${config.mods.git.username} = ""; + }; + user = "${config.mods.git.username}"; + }; + }; + example = {}; + type = with lib.types; attrsOf anything; + description = "hosts for gh"; + }; + }; + useDefaultPackages = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Use default base packages (only additionalPackages are installed if false)"; + }; + additionalPackages = lib.mkOption { + default = []; + example = []; + type = with lib.types; listOf package; + description = "Additional packages to be installed"; + }; + languages = { + haskell = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables haskell. + ''; + }; + packages = lib.mkOption { + default = with pkgs; [ + haskellPackages.cabal-install + ghc + haskellPackages.haskell-language-server + ]; + example = []; + type = with lib.types; listOf package; + description = '' + haskell packages + ''; + }; + }; + typst = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables typst. + ''; + }; + packages = lib.mkOption { + default = with pkgs; [ + typst + tinymist + ]; + example = []; + type = with lib.types; listOf package; + description = '' + typst packages + ''; + }; + }; + go = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables go. + ''; + }; + packages = lib.mkOption { + default = with pkgs; [ + go + gopls + ]; + example = []; + type = with lib.types; listOf package; + description = '' + Go packages + ''; + }; + }; + rust = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables rust. + ''; + }; + packages = lib.mkOption { + default = with pkgs; [rustup]; + example = []; + type = with lib.types; listOf package; + description = '' + Rust packages + ''; + }; + }; + ts-js = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables TS/JS. + ''; + }; + packages = lib.mkOption { + default = with pkgs; [ + nodejs_20 + deno + typescript + nodePackages.typescript-language-server + nodePackages.prettier + ]; + example = []; + type = with lib.types; listOf package; + description = '' + TS/JS packages + ''; + }; + }; + zig = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables zig. + ''; + }; + packages = lib.mkOption { + default = with pkgs; [ + zig + zls + ]; + example = []; + type = with lib.types; listOf package; + description = '' + zig packages + ''; + }; + }; + java = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables java. + ''; + }; + packages = lib.mkOption { + default = with pkgs; [ + gradle + maven + jdt-language-server + temurin-jre-bin + ]; + example = []; + type = with lib.types; listOf package; + description = '' + Java packages + ''; + }; + }; + dotnet = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables C#/F#. + ''; + }; + packages = lib.mkOption { + default = with pkgs; [ + #.! + (with dotnetCorePackages; + combinePackages [ + sdk_8_0 + sdk_9_0 + ]) + csharpier + netcoredbg + fsharp + fsautocomplete + ]; + example = []; + type = with lib.types; listOf package; + description = '' + C#/F# packages + ''; + }; + }; + C-CPP = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables C/C++. + ''; + }; + packages = lib.mkOption { + default = with pkgs; [ + bear + gdb + gcc + clang-tools + ]; + example = []; + type = with lib.types; listOf package; + description = '' + C/C++ packages + ''; + }; + }; + python = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables python. + ''; + }; + packages = lib.mkOption { + default = with pkgs; [ + python3 + python312Packages.python-lsp-server + python312Packages.python-lsp-ruff + python312Packages.python-lsp-black + ]; + example = []; + type = with lib.types; listOf package; + description = '' + python packages + ''; + }; + }; + configFiles = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables Json/toml/yaml etc. + ''; + }; + packages = lib.mkOption { + default = with pkgs; [ + #yaml + yamlfmt + yamllint + yaml-language-server + + #json + jq + ]; + example = []; + type = with lib.types; listOf package; + description = '' + packages for said filetypes + ''; + }; + }; + bash = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables bash. + ''; + }; + packages = lib.mkOption { + default = with pkgs; [ + bash-language-server + shfmt + ]; + example = []; + type = with lib.types; listOf package; + description = '' + bash packages + ''; + }; + }; + html-css = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables html/css. + ''; + }; + packages = lib.mkOption { + default = with pkgs; [ + tailwindcss + tailwindcss-language-server + # html-tidy + ]; + example = []; + type = with lib.types; listOf package; + description = '' + html/css packages + ''; + }; + }; + sql = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables sql. + ''; + }; + packages = lib.mkOption { + default = with pkgs; [ + nodePackages.sql-formatter + sqls + ]; + example = []; + type = with lib.types; listOf package; + description = '' + sql packages + ''; + }; + }; + gleam = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables gleam. + ''; + }; + packages = lib.mkOption { + default = with pkgs; [gleam]; + example = []; + type = with lib.types; listOf package; + description = '' + gleam packages + ''; + }; + }; + asm = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables assembly. + ''; + }; + packages = lib.mkOption { + default = with pkgs; [asm-lsp]; + example = []; + type = with lib.types; listOf package; + description = '' + assembly packages + ''; + }; + }; + }; + }; + }; + + config = let + basePackages = with pkgs; [ + gitui + meson + ninja + tree-sitter + unzip + pkg-config + sqlite + plantuml + d-spy + tmux + tmate + inputs.compose.packages.${system}.default + ]; + in + lib.mkIf config.mods.coding.enable ( + lib.optionalAttrs (options ? home.packages) { + programs.dashvim = lib.mkIf config.mods.coding.dashvim { + enable = true; + inherit (config.mods.stylix) colorscheme; + }; + programs.vscode = lib.mkIf config.mods.coding.vscodium.enable { + enable = true; + package = mkDashDefault pkgs.vscodium; + profiles.default.extensions = config.mods.coding.vscodium.extensions; + }; + xdg.configFile = { + "neovide/config.toml" = lib.mkIf (config.mods.coding.dashvim || config.mods.coding.neovide.enable) { + source = + (pkgs.formats.toml {}).generate "neovide" + config.mods.coding.neovide.config; + }; + + "gh/config.yml" = lib.mkIf config.mods.coding.gh.enable { + source = + (pkgs.formats.yaml {}).generate "config" + config.mods.coding.gh.config; + }; + "gh/hosts.yml" = lib.mkIf config.mods.coding.gh.enable { + source = + (pkgs.formats.yaml {}).generate "hosts" + config.mods.coding.gh.hosts; + }; + }; + + home.packages = with pkgs; + [ + (lib.mkIf (config.mods.coding.dashvim || config.mods.coding.neovide.enable) neovide) + (lib.mkIf config.mods.coding.jetbrains jetbrains-toolbox) + (lib.mkIf config.mods.coding.penpot pkgs.penpot-desktop) + (lib.mkIf config.mods.coding.gh.enable gh) + ] + ++ config.mods.coding.additionalPackages + ++ (lib.lists.optionals config.mods.coding.useDefaultPackages basePackages) + ++ (lib.lists.optionals config.mods.coding.languages.haskell.enable config.mods.coding.languages.haskell.packages) + ++ (lib.lists.optionals config.mods.coding.languages.rust.enable config.mods.coding.languages.rust.packages) + ++ (lib.lists.optionals config.mods.coding.languages.go.enable config.mods.coding.languages.go.packages) + ++ (lib.lists.optionals config.mods.coding.languages.java.enable config.mods.coding.languages.java.packages) + ++ (lib.lists.optionals config.mods.coding.languages.dotnet.enable config.mods.coding.languages.dotnet.packages) + ++ (lib.lists.optionals config.mods.coding.languages.bash.enable config.mods.coding.languages.bash.packages) + ++ (lib.lists.optionals config.mods.coding.languages.C-CPP.enable config.mods.coding.languages.C-CPP.packages) + ++ (lib.lists.optionals config.mods.coding.languages.asm.enable config.mods.coding.languages.asm.packages) + ++ (lib.lists.optionals config.mods.coding.languages.sql.enable config.mods.coding.languages.sql.packages) + ++ (lib.lists.optionals config.mods.coding.languages.html-css.enable config.mods.coding.languages.html-css.packages) + ++ (lib.lists.optionals config.mods.coding.languages.configFiles.enable config.mods.coding.languages.configFiles.packages) + ++ (lib.lists.optionals config.mods.coding.languages.ts-js.enable config.mods.coding.languages.ts-js.packages) + ++ (lib.lists.optionals config.mods.coding.languages.typst.enable config.mods.coding.languages.typst.packages) + ++ (lib.lists.optionals config.mods.coding.languages.zig.enable config.mods.coding.languages.zig.packages) + ++ (lib.lists.optionals config.mods.coding.languages.gleam.enable config.mods.coding.languages.gleam.packages); + } + ); +} diff --git a/modules/programs/containers.nix b/modules/programs/containers.nix new file mode 100644 index 0000000..b62ee25 --- /dev/null +++ b/modules/programs/containers.nix @@ -0,0 +1,79 @@ +{ + mkDashDefault, + lib, + config, + options, + pkgs, + ... +}: { + options.mods.containers = { + variant = lib.mkOption { + default = ""; + example = "podman"; + type = lib.types.enum [ + "" + "podman" + "docker" + ]; + description = "Enables and configures a containerization solution: podman/docker"; + }; + podmanPackages = lib.mkOption { + default = with pkgs; [ + podman-tui + podman-compose + ]; + example = []; + type = with lib.types; listOf package; + description = "Podman packages"; + }; + dockerPackages = lib.mkOption { + default = with pkgs; [ + docker-compose + ]; + example = []; + type = with lib.types; listOf package; + description = "Docker packages"; + }; + combinedPackages = lib.mkOption { + default = with pkgs; [ + dive + ]; + example = []; + type = with lib.types; listOf package; + description = "Container packages"; + }; + }; + config = lib.optionalAttrs (options ? environment.systemPackages) { + environment.systemPackages = + (lib.lists.optionals ( + config.mods.containers.variant == "podman" + ) + config.mods.containers.podmanPackages) + ++ (lib.lists.optionals ( + config.mods.containers.variant == "docker" + ) + config.mods.containers.dockerPackages) + ++ (lib.lists.optionals ( + config.mods.containers.variant == "podman" || config.mods.containers.variant == "docker" + ) + config.mods.containers.combinedPackages); + virtualisation = + if (config.mods.containers.variant == "podman") + then { + containers.enable = true; + podman = { + enable = true; + dockerCompat = mkDashDefault true; + defaultNetwork.settings.dns_enabled = mkDashDefault true; + }; + } + else if (config.mods.containers.variant == "docker") + then { + containers.enable = true; + docker = { + enable = true; + }; + } + else {}; + }; +} diff --git a/modules/programs/default.nix b/modules/programs/default.nix new file mode 100644 index 0000000..08a4a2d --- /dev/null +++ b/modules/programs/default.nix @@ -0,0 +1,56 @@ +{ + imports = [ + ./acpid.nix + ./anyrun.nix + ./basePackages.nix + ./bluetooth.nix + ./browser + ./clam.nix + ./coding.nix + ./containers.nix + ./drives.nix + ./fancontrol.nix + ./fastfetch.nix + ./fish.nix + ./flatpak.nix + ./gaming.nix + ./gdm.nix + ./git.nix + ./gnome.nix + ./gnomeServices.nix + ./gpu.nix + ./greetd.nix + ./homePackages.nix + ./hypr + ./ironbar.nix + ./kde.nix + ./kdeConnect.nix + ./keepassxc.nix + ./kitty.nix + ./media.nix + ./mime.nix + ./ncspot.nix + ./nextcloud.nix + ./niri.nix + ./onedrive.nix + ./oxi + ./piper.nix + ./plymouth.nix + ./printing.nix + ./scripts.nix + ./sddm.nix + ./sops.nix + ./starship.nix + ./streamcontroller.nix + ./stylix.nix + ./superfreq.nix + ./supersonic.nix + ./sway.nix + ./teams.nix + ./virtmanager.nix + ./wm.nix + ./xkb.nix + ./xone.nix + ./yazi + ]; +} diff --git a/modules/programs/drives.nix b/modules/programs/drives.nix new file mode 100644 index 0000000..a631802 --- /dev/null +++ b/modules/programs/drives.nix @@ -0,0 +1,312 @@ +{ + lib, + config, + options, + ... +}: { + options.mods.drives = { + variant = lib.mkOption { + default = "manual"; + example = "disko"; + type = with lib.types; (enum [ + "manual" + "disko" + ]); + description = '' + Disk configuration type, either "manual" for regular NixOS disk configuration, + or "disko" for using disko to automatically format your drives. + ''; + }; + useSwap = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Use swap in drive. + ''; + }; + useEncryption = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = '' + Enables encryption. + !WARNING! + You need your root drive to be named root exactly! + Otherwise there will not be a root crypt! + !WARNING! + ''; + }; + homeAndRootFsTypes = lib.mkOption { + default = "ext4"; + example = "btrfs"; + type = with lib.types; (enum [ + "btrfs" + "ext2" + "ext3" + "ext4" + "exfat" + "f2fs" + "fat8" + "fat16" + "fat32" + "ntfs" + "xfs" + "zfs" + ]); + description = '' + Filesystem for the home and root partitions. + ''; + }; + defaultDrives = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Use default drive config. + + - Manual variant + This config expects 4 different partitions on a single drive: + - boot partition with BOOT label and vfat format (filesystem configurable) + - swap partition with SWAP label + - root partition with ROOT label and ext4 format (filesystem configurable) + - home partition with HOME label and ext4 format (filesystem configurable) + - gpt disk format + + NOTE: Any different configuration must be done manually with this turned off. + + - Disko variant + This config creates 4 different partitions on a single drive: + - boot partition with 1GB size and vfat format + - swap partition with 32GB (size configurable) + - root partition with 30% size and ext4 format (size and filesystem configurable) + - home partition with 70%~ size and ext4 format (size and filesystem configurable) + - gpt disk format + + NOTE: Any different configuration must be done manually with this turned off. + ''; + }; + }; + extraDrives = lib.mkOption { + default = [ + ]; + example = [ + { + name = "drive2"; + drive = { + device = "/dev/disk/by-label/DRIVE2"; + fsType = "ext4"; + options = [ + "noatime" + "nodiratime" + "discard" + ]; + }; + } + ]; + type = with lib.types; listOf (attrsOf anything); + description = '' + Extra drives to add. + Please ensure to add variant compliant attrsets (manual/disko). + (The example is for manual variant, here an example for disko): + ```nix + drive2 = (lib.optionalAttrs config.mods.drives.defaultDrives.enable) { + device = "/dev/nvme1n1" + type = "disk"; + content = { + type = "gpt"; + partitions = { + drive2 = { + start = "0%"; + end = "100%"; + content = { + type = "filesystem"; + format = "ext4"; + mountpoint = "/drive2"; + mountOptions = [ + "noatime" + "nodiratime" + "discard" + ]; + }; + }; + }; + }; + }; + ``` + ''; + }; + disko = { + defaultDiskId = lib.mkOption { + default = "TODO"; + example = "/dev/nvme0n1"; + type = lib.types.str; + description = "The name, ID, UUID or similar for the default drive."; + }; + rootAmount = lib.mkOption { + default = 30; + example = 40; + type = lib.types.number; + description = "The percentage of the disk for root. (Home will take up the rest) (Only for disko)"; + }; + swapAmount = lib.mkOption { + default = 32; + example = 64; + type = lib.types.number; + description = "The amount of swap to use. (Only for disko)"; + }; + }; + }; + + config = lib.optionalAttrs (options ? fileSystems) { + boot.initrd.luks.devices = lib.mkIf (config.mods.drives.variant == "manual" && config.mods.drives.useEncryption) ( + builtins.listToAttrs ( + map ( + { + name, + drive, + }: { + cryptstorage.device = lib.mkIf (name != "root") drive?device; + cryptoroot.device = lib.mkIf (name == "root") drive?device; + } + ) + config.mods.drives.extraDrives + ) + ); + + fileSystems = lib.mkIf (config.mods.drives.variant == "manual" && !config.conf.wsl) ( + builtins.listToAttrs ( + map ( + { + name, + drive, + }: { + name = "/" + name; + value = drive; + } + ) + config.mods.drives.extraDrives + ) + // (lib.optionalAttrs config.mods.drives.defaultDrives.enable) { + "/" = { + device = "/dev/disk/by-label/ROOT"; + fsType = config.mods.drives.homeAndRootFsTypes; + options = [ + "noatime" + "nodiratime" + "discard" + ]; + }; + + "/boot" = { + device = "/dev/disk/by-label/BOOT"; + fsType = "vfat"; + options = [ + "rw" + "fmask=0022" + "dmask=0022" + "noatime" + ]; + }; + + "/home" = { + device = "/dev/disk/by-label/HOME"; + fsType = config.mods.drives.homeAndRootFsTypes; + options = [ + "noatime" + "nodiratime" + "discard" + ]; + }; + } + ); + + swapDevices = lib.mkIf (config.mods.drives.useSwap && config.mods.drives.variant == "manual" && !config.conf.wsl) [ + {device = "/dev/disk/by-label/SWAP";} + ]; + + disko.devices = lib.mkIf (config.mods.drives.variant == "disko") { + disk = + { + main = (lib.optionalAttrs config.mods.drives.defaultDrives.enable) { + device = "${config.mods.drives.disko.defaultDiskId}"; + type = "disk"; + content = { + type = "gpt"; + partitions = { + root = { + start = "${ + if config.mods.drives.useSwap + then builtins.toString config.mods.drives.disko.swapAmount + else builtins.toString 1 + }G"; + end = "${builtins.toString config.mods.drives.disko.rootAmount}%"; + content = { + type = "filesystem"; + format = config.mods.drives.homeAndRootFsTypes; + mountpoint = "/"; + mountOptions = [ + "noatime" + "nodiratime" + "discard" + ]; + }; + }; + plainSwap = { + start = "1G"; + end = "33G"; + content = { + type = "swap"; + discardPolicy = "both"; + resumeDevice = true; + }; + }; + boot = { + start = "0G"; + end = "1G"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + mountOptions = [ + "rw" + "fmask=0022" + "dmask=0022" + "noatime" + ]; + }; + }; + home = { + start = "${builtins.toString config.mods.drives.disko.rootAmount}%"; + end = "100%"; + content = { + type = "filesystem"; + format = config.mods.drives.homeAndRootFsTypes; + mountpoint = "/home"; + mountOptions = [ + "noatime" + "nodiratime" + "discard" + ]; + }; + }; + }; + }; + }; + } + // builtins.listToAttrs ( + map ( + { + name, + drive, + }: { + name = "/" + name; + value = drive; + } + ) + config.mods.drives.extraDrives + ); + }; + }; +} diff --git a/modules/programs/fancontrol.nix b/modules/programs/fancontrol.nix new file mode 100644 index 0000000..8abf24d --- /dev/null +++ b/modules/programs/fancontrol.nix @@ -0,0 +1,37 @@ +{ + lib, + pkgs, + config, + options, + ... +}: { + options.mods.fancontrol = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables fancontrol-gui with needed drivers"; + }; + forceId = lib.mkOption { + default = null; + example = "force_id=0x8628"; + type = with lib.types; nullOr str; + description = "Modprobe options for the it87 driver. Information at: https://wiki.archlinux.org/title/Lm_sensors#Gigabyte_B250/Z370/B450M/B560M/B660M/Z690/B550_motherboards"; + }; + }; + config = lib.mkIf config.mods.fancontrol.enable ( + lib.optionalAttrs (options ? home.packages) { + home.packages = [pkgs.fancontrol-gui]; + } + // (lib.optionalAttrs (options ? boot.kernelModules) { + boot = { + kernelParams = ["acpi_enforce_resources=lax"]; + extraModulePackages = with config.boot.kernelPackages; [liquidtux it87]; + kernelModules = ["v4l2loopback" "it87"]; + extraModprobeConfig = lib.mkIf (config.mods.fancontrol.forceId != null) '' + options it87 ${config.mods.fancontrol.forceId} + ''; + }; + }) + ); +} diff --git a/modules/programs/fastfetch.nix b/modules/programs/fastfetch.nix new file mode 100644 index 0000000..9953d84 --- /dev/null +++ b/modules/programs/fastfetch.nix @@ -0,0 +1,75 @@ +{ + pkgs, + lib, + options, + config, + ... +}: { + options.mods.dashfetch = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "A custom configuration for fastfetch"; + }; + modules = lib.mkOption { + default = [ + "title" + "separator" + { + type = "os"; + key = "OS"; + format = "DashNix ({name} {version})"; + } + "host" + "kernel" + "uptime" + "packages" + "shell" + "display" + "de" + "wm" + "wmtheme" + "theme" + "icons" + "font" + "cursor" + "terminal" + "terminalfont" + "cpu" + "gpu" + "memory" + "swap" + "disk" + "localip" + "battery" + "poweradapter" + "locale" + "break" + "colors" + ]; + example = []; + type = with lib.types; listOf anything; + description = "modules for fastfetch"; + }; + }; + + config = lib.optionalAttrs (options ? home.packages) { + xdg.configFile."fastfetch/config.jsonc" = lib.mkIf config.mods.dashfetch.enable { + source = + (pkgs.formats.json {}).generate "config.jsonc" + { + "$schema" = "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json"; + logo = { + type = "kitty"; + source = ../../assets/logo2.png; + width = 35; + padding = { + top = 1; + }; + }; + modules = config.mods.dashfetch.modules; + }; + }; + }; +} diff --git a/modules/programs/fish.nix b/modules/programs/fish.nix new file mode 100644 index 0000000..1d8c8c8 --- /dev/null +++ b/modules/programs/fish.nix @@ -0,0 +1,190 @@ +{ + lib, + pkgs, + inputs, + config, + options, + ... +}: let + base16 = pkgs.callPackage inputs.base16.lib {}; + scheme = base16.mkSchemeAttrs config.stylix.base16Scheme; +in { + options.mods.fish = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables fish"; + }; + additionalConfig = lib.mkOption { + default = ''''; + example = ''''; + type = lib.types.lines; + description = "Additional fish config"; + }; + useDefaultConfig = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Use default fish config"; + }; + }; + config = lib.mkIf config.mods.fish.enable ( + lib.optionalAttrs (options ? programs.fish) { + programs.fish = { + enable = true; + shellInit = + if config.mods.fish.useDefaultConfig + then + '' + if status is-interactive + # Commands to run in interactive sessions can go here + end + + # ============================================================================= + # + # Utility functions for zoxide. + # + + export NIX_PATH="$NIX_PATH:${config.conf.nixosConfigPath}" + + set EDITOR "neovide --no-fork" + + alias rebuild='nh os switch -- --accept-flake-config' + alias update='nix flake update --flake $FLAKE --accept-flake-config' + alias gcli='gh' + abbr --add ls 'lsd' + abbr --add :q 'exit' + abbr --add gh 'git push origin' + abbr --add gu 'git push upstream' + abbr --add gl 'git pull origin' + abbr --add gm 'git commit -m' + abbr --add ga "git add -A" + abbr --add gc "git commit --amend --no-edit" + abbr --add g+ 'bear -- g++ -Wextra -Werror -std=c++20' + abbr --add s "kitty +kitten ssh" + abbr --add zl 'z "" ' + abbr --add nv 'neovide' + abbr --add cr 'cargo run' + abbr --add grep 'rg' + abbr --add cat 'bat' + abbr --add find 'fd' + abbr --add rm 'rip' + abbr --add cp 'cpz' + abbr --add cd 'z' + abbr --add y 'yazi' + + set fish_color_autosuggestion '${scheme.base07}' + set fish_color_param '${scheme.base06}' + set fish_color_operator '${scheme.base0E}' + + set fish_greeting + # pwd based on the value of _ZO_RESOLVE_SYMLINKS. + function __zoxide_pwd + builtin pwd -L + end + + # A copy of fish's internal cd function. This makes it possible to use + # `alias cd=z` without causing an infinite loop. + if ! builtin functions --query __zoxide_cd_internal + if builtin functions --query cd + builtin functions --copy cd __zoxide_cd_internal + else + alias __zoxide_cd_internal='builtin cd' + end + end + + # cd + custom logic based on the value of _ZO_ECHO. + function __zoxide_cd + __zoxide_cd_internal $argv + end + + # ============================================================================= + # + # Hook configuration for zoxide. + # + + # Initialize hook to add new entries to the database. + function __zoxide_hook --on-variable PWD + test -z "$fish_private_mode" + and command zoxide add -- (__zoxide_pwd) + end + + # ============================================================================= + # + # When using zoxide with --no-cmd, alias these internal functions as desired. + # + + if test -z $__zoxide_z_prefix + set __zoxide_z_prefix 'z!' + end + set __zoxide_z_prefix_regex ^(string escape --style=regex $__zoxide_z_prefix) + + # Jump to a directory using only keywords. + function __zoxide_z + set -l argc (count $argv) + if test $argc -eq 0 + __zoxide_cd $HOME + else if test "$argv" = - + __zoxide_cd - + else if test $argc -eq 1 -a -d $argv[1] + __zoxide_cd $argv[1] + else if set -l result (string replace --regex $__zoxide_z_prefix_regex \'\' $argv[-1]); and test -n $result + __zoxide_cd $result + else + set -l result (command zoxide query --exclude (__zoxide_pwd) -- $argv) + and __zoxide_cd $result + end + end + + # Completions. + function __zoxide_z_complete + set -l tokens (commandline --current-process --tokenize) + set -l curr_tokens (commandline --cut-at-cursor --current-process --tokenize) + + if test (count $tokens) -le 2 -a (count $curr_tokens) -eq 1 + # If there are < 2 arguments, use `cd` completions. + complete --do-complete "\'\' "(commandline --cut-at-cursor --current-token) | string match --regex '.*/$' + else if test (count $tokens) -eq (count $curr_tokens); and ! string match --quiet --regex $__zoxide_z_prefix_regex. $tokens[-1] + # If the last argument is empty and the one before doesn't start with + # $__zoxide_z_prefix, use interactive selection. + set -l query $tokens[2..-1] + set -l result (zoxide query --exclude (__zoxide_pwd) --interactive -- $query) + and echo $__zoxide_z_prefix$result + commandline --function repaint + end + end + complete --command __zoxide_z --no-files --arguments '(__zoxide_z_complete)' + + # Jump to a directory using interactive search. + function __zoxide_zi + set -l result (command zoxide query --interactive -- $argv) + and __zoxide_cd $result + end + + # ============================================================================= + # + # Commands for zoxide. Disable these using --no-cmd. + # + + abbr --erase z &>/dev/null + alias z=__zoxide_z + + abbr --erase zi &>/dev/null + alias zi=__zoxide_zi + + # ============================================================================= + # + # To initialize zoxide, add this to your configuration (usually + # ~/.config/fish/config.fish): + # + # zoxide init fish | source + + direnv hook fish | source + '' + + config.mods.fish.additionalConfig + else config.mods.fish.additionalConfig; + }; + } + ); +} diff --git a/modules/programs/flatpak.nix b/modules/programs/flatpak.nix new file mode 100644 index 0000000..68ec2da --- /dev/null +++ b/modules/programs/flatpak.nix @@ -0,0 +1,21 @@ +{ + lib, + config, + options, + pkgs, + ... +}: { + options.mods.flatpak = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables the flatpak package manager"; + }; + }; + config = lib.mkIf config.mods.flatpak.enable ( + lib.optionalAttrs (options ? environment.systemPackages) { + environment.systemPackages = [pkgs.flatpak]; + } + ); +} diff --git a/modules/programs/gaming.nix b/modules/programs/gaming.nix new file mode 100644 index 0000000..6c3eb0a --- /dev/null +++ b/modules/programs/gaming.nix @@ -0,0 +1,149 @@ +{ + mkDashDefault, + lib, + config, + options, + pkgs, + ... +}: { + options.mods.gaming = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enabled gaming related features."; + }; + tools = lib.mkOption { + default = with pkgs; [ + protonplus + gamescope + gamemode + steam + # TODO broken + # lutris + wineWowPackages.stable + adwsteamgtk + heroic + mangohud + nexusmods-app + steamtinkerlaunch + winetricks + ]; + example = []; + type = with lib.types; listOf package; + description = "Install gaming related packages"; + }; + kernel = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = '' + Whether to use the CachyOS kernel. + WARNING: This is a manual compiled kernel! + (Please also ensure you use your own input hash for the source as the compilation can often fail due to temporary broken changes.) + ''; + }; + steam = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Whether to use steam"; + }; + gamemode = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Whether to use gamemode"; + }; + pinCores = lib.mkOption { + default = "false"; + example = "true"; + type = lib.types.str; + description = "Pin Cores gamemode config"; + }; + parkCores = lib.mkOption { + default = "false"; + example = "true"; + type = lib.types.str; + description = "Park Cores gamemode config"; + }; + gpuOptimization = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Whether to use GPU performance setting. NOTE: this is at your own risk!"; + }; + gpuDevice = lib.mkOption { + default = 0; + example = 1; + type = lib.types.int; + description = "Your gpu device.(Physical id of lshw)"; + }; + scheduler = lib.mkOption { + default = "scx_rustland"; + example = "scx_rusty"; + type = with lib.types; + nullOr (enum [ + "scx_bpfland" + "scx_chaos" + "scx_cosmos" + "scx_central" + "scx_flash" + "scx_flatcg" + "scx_lavd" + "scx_layered" + "scx_mitosis" + "scx_nest" + "scx_p2dq" + "scx_pair" + "scx_prev" + "scx_qmap" + "scx_rlfifo" + "scx_rustland" + "scx_rusty" + "scx_sdt" + "scx_simple" + "scx_tickless" + "scx_userland" + "scx_wd40" + ]); + description = "Scheduler to use, null disables this"; + }; + }; + config = lib.mkIf config.mods.gaming.enable ( + lib.optionalAttrs (options ? environment.systemPackages) { + environment.systemPackages = config.mods.gaming.tools; + boot.kernelPackages = lib.mkForce pkgs.cachyosKernels.linuxPackages-cachyos-latest; + services.scx = lib.mkIf (config.mods.gaming.scheduler != null) { + enable = true; + inherit (config.mods.gaming) scheduler; + }; + + programs = { + steam.enable = mkDashDefault config.mods.gaming.steam; + gamemode.enable = true; + gamemode = { + settings = { + general = { + desiredgov = mkDashDefault "performance"; + }; + cpu = { + pin_cores = mkDashDefault config.mods.gaming.pinCores; + park_cores = mkDashDefault config.mods.gaming.parkCores; + }; + gpu = lib.mkIf config.mods.gaming.gpuOptimization { + apply_gpu_optimisations = mkDashDefault "accept-responsibility"; + gpu_device = mkDashDefault config.mods.gaming.gpuDevice; + amd_performance_level = mkDashDefault "high"; + nv_powermizer_mode = mkDashDefault 1; + }; + custom = { + start = mkDashDefault "notify-send -a 'Gamemode' 'Optimizations activated'"; + end = mkDashDefault "notify-send -a 'Gamemode' 'Optimizations deactivated'"; + }; + }; + }; + }; + } + ); +} diff --git a/modules/programs/gdm.nix b/modules/programs/gdm.nix new file mode 100644 index 0000000..343c6cd --- /dev/null +++ b/modules/programs/gdm.nix @@ -0,0 +1,33 @@ +{ + lib, + options, + config, + ... +}: { + options.mods.gdm = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables the gdm displayManager"; + }; + extraOptions = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = "Extra options to be applied to the gnome config"; + }; + }; + + config = lib.mkIf config.mods.gdm.enable ( + lib.optionalAttrs (options ? services.xserver.displayManager.gdm) ( + { + services.xserver.enable = true; + services.xserver.displayManager.gdm.enable = true; + } + // { + services.xserver.displayManager.gdm = config.mods.gdm.extraOptions; + } + ) + ); +} diff --git a/modules/programs/git.nix b/modules/programs/git.nix new file mode 100644 index 0000000..57c1623 --- /dev/null +++ b/modules/programs/git.nix @@ -0,0 +1,64 @@ +{ + lib, + config, + options, + ... +}: { + options.mods.git = { + username = lib.mkOption { + default = ""; + example = "globi"; + type = lib.types.str; + description = "Git user name"; + }; + email = lib.mkOption { + default = ""; + example = "globi@globus.glob"; + type = lib.types.str; + description = "Git email"; + }; + additionalConfig = lib.mkOption { + default = { + merge = { + tool = "nvimdiff"; + }; + diff = { + tool = "nvimdiff"; + }; + pull.rebase = true; + }; + example = { + pull.rebase = false; + }; + type = with lib.types; attrsOf anything; + description = "Additional git config"; + }; + sshConfig = lib.mkOption { + default = ""; + example = '' + Host github.com + ${ + if (config ? sops.secrets && config.sops.secrets ? hub.path) + then "IdentityFile ${config.sops.secrets.hub.path}" + else "" + } + ''; + type = lib.types.lines; + description = "ssh configuration (keys for git)"; + }; + }; + config = lib.optionalAttrs (options ? programs.git && options ? home.file) { + programs.git = { + enable = true; + settings = + { + user = { + name = config.mods.git.username; + inherit (config.mods.git) email; + }; + } + // config.mods.git.additionalConfig; + }; + home.file.".ssh/config".text = config.mods.git.sshConfig; + }; +} diff --git a/modules/programs/gnome.nix b/modules/programs/gnome.nix new file mode 100644 index 0000000..faf2b1e --- /dev/null +++ b/modules/programs/gnome.nix @@ -0,0 +1,77 @@ +{ + lib, + options, + config, + pkgs, + ... +}: { + options.mods.gnome = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables the Gnome desktop environment"; + }; + useDefaultOptions = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Use default options provided by module. If disabled, will only apply extraOptions."; + }; + extraOptions = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = "Extra options to be applied to the gnome config"; + }; + extraDconf = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = "Extra options to be applied to the dconf config"; + }; + }; + + config = let + defaultExtensions = with pkgs.gnomeExtensions; [ + blur-my-shell + dash-to-dock + tray-icons-reloaded + ]; + in + lib.mkIf config.mods.gnome.enable ( + lib.optionalAttrs (options ? services.xserver.desktopManager.gnome) ( + { + services.xserver = { + enable = true; + desktopManager.gnome.enable = true; + }; + } + // lib.mkIf config.mods.gnome.useDefaultOptions {environment.systemPackages = defaultExtensions;} + // { + services.xserver.desktopManager.gnome = config.mods.gnome.extraOptions; + } + ) + // lib.optionalAttrs (options ? dconf) ( + lib.mkIf config.mods.gnome.useDefaultOptions { + dconf = { + enable = true; + settings = { + "org/gnome/shell" = { + disable-user-extensions = false; + enabled-extensions = map (extension: extension.extensionUuid) defaultExtensions; + }; + "org/gnome/desktop/interface" = { + cursor-theme = config.mods.stylix.cursor.name; + cursor-size = config.mods.stylix.cursor.size; + color-scheme = "prefer-dark"; + }; + }; + }; + } + // { + dconf = config.mods.gnome.extraDconf; + } + ) + ); +} diff --git a/modules/programs/gnomeServices.nix b/modules/programs/gnomeServices.nix new file mode 100644 index 0000000..29bdea8 --- /dev/null +++ b/modules/programs/gnomeServices.nix @@ -0,0 +1,81 @@ +{ + lib, + config, + options, + pkgs, + ... +}: { + options.mods = { + gnomeServices.enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables gnome services: keyring and settings daemon. + Note: Do not use these for environments which ship these functionalities by default: GNOME, KDE + ''; + }; + nautilus.enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables and configures Nautilus + ''; + }; + }; + + config = lib.mkIf config.mods.gnomeServices.enable ( + lib.optionalAttrs (options ? services.gnome.gnome-keyring) { + programs.dconf = { + enable = true; + profiles.user.databases = [ + { + settings = { + "org/gnome/desktop/interface" = { + cursor-theme = config.mods.stylix.cursor.name; + cursor-size = lib.gvariant.mkInt32 config.mods.stylix.cursor.size; + color-scheme = "prefer-dark"; + }; + }; + } + ]; + }; + environment.extraInit = '' + export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/keyring/ssh" + ''; + services = { + # needed for GNOME services outside of GNOME Desktop + dbus.packages = with pkgs; [ + gcr + gnome-settings-daemon + ]; + + gnome.gnome-keyring.enable = true; + gvfs.enable = true; + }; + } + // lib.optionalAttrs (options ? home.packages) { + services.gnome-keyring.enable = true; + dconf.settings = { + "org/gnome/desktop/interface" = { + cursor-theme = config.mods.stylix.cursor.name; + cursor-size = config.mods.stylix.cursor.size; + color-scheme = "prefer-dark"; + }; + }; + home = { + packages = let + packages = with pkgs; [ + gcr + nautilus + sushi + nautilus-python + nautilus-open-any-terminal + ]; + in + lib.mkIf config.mods.nautilus.enable packages; + }; + } + ); +} diff --git a/modules/programs/gpu.nix b/modules/programs/gpu.nix new file mode 100644 index 0000000..023b462 --- /dev/null +++ b/modules/programs/gpu.nix @@ -0,0 +1,111 @@ +{ + mkDashDefault, + lib, + config, + options, + pkgs, + ... +}: { + options.mods.gpu = { + nvidia.enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = '' + Enables nvidia support. + ''; + }; + amdgpu.enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = '' + Enables amdgpu support. + ''; + }; + intelgpu.enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = '' + Enables intel support. + ''; + }; + vapi = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables vapi. + ''; + }; + rocm.enable = lib.mkOption { + default = false; + type = lib.types.bool; + example = true; + description = '' + Enables rocm support. + ''; + }; + }; + }; + + config = lib.optionalAttrs (options ? boot) { + boot = lib.mkIf config.mods.gpu.amdgpu.enable { + kernelModules = ["kvm-amd"]; + initrd.kernelModules = ["amdgpu"]; + kernelParams = ["amdgpu.ppfeaturemask=0xffffffff"]; + }; + services.xserver.videoDrivers = + if config.mods.gpu.amdgpu.enable + then ["amdgpu"] + else if config.mods.gpu.nvidia.enable + then ["nvidia"] + else []; + + environment.variables = + if (config.mods.gpu.amdgpu.enable && config.mods.gpu.vapi.rocm.enable) + then { + RUSTICL_ENABLE = mkDashDefault "radeonsi"; + } + else {}; + + hardware = { + nvidia = lib.mkIf config.mods.gpu.nvidia.enable { + modesetting.enable = mkDashDefault true; + open = mkDashDefault true; + nvidiaSettings = mkDashDefault true; + package = mkDashDefault config.boot.kernelPackages.nvidiaPackages.beta; + }; + graphics = let + amdPackages = [ + (lib.mkIf (config.mods.gpu.intelgpu.enable && lib.mkIf config.mods.gpu.vapi.enable) pkgs.vpl-gpu-rt) + (lib.mkIf ( + config.mods.gpu.intelgpu.enable && lib.mkIf config.mods.gpu.vapi.enable + ) + pkgs.intel-media-driver) + (lib.mkIf config.mods.gpu.vapi.enable pkgs.libvdpau-va-gl) + (lib.mkIf config.mods.gpu.vapi.enable pkgs.libva) + (lib.mkIf config.mods.gpu.vapi.enable pkgs.libva-vdpau-driver) + (lib.mkIf (config.mods.gpu.intelgpu.enable || config.mods.gpu.amdgpu.enable) pkgs.mesa) + ]; + rocmPackages = [ + pkgs.rocmPackages.clr.icd + pkgs.mesa + pkgs.mesa.opencl + pkgs.vulkan-loader + pkgs.vulkan-validation-layers + pkgs.vulkan-tools + pkgs.clinfo + ]; + in { + enable = true; + enable32Bit = mkDashDefault true; + extraPackages = + amdPackages + ++ (lib.lists.optionals (config.mods.gpu.vapi.rocm.enable && config.mods.gpu.amdgpu.enable) rocmPackages); + }; + }; + }; +} diff --git a/modules/programs/greetd.nix b/modules/programs/greetd.nix new file mode 100644 index 0000000..fe3e455 --- /dev/null +++ b/modules/programs/greetd.nix @@ -0,0 +1,164 @@ +{ + mkDashDefault, + config, + lib, + inputs, + pkgs, + options, + system, + ... +}: { + options.mods = { + greetd = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables the greetd login manager. + ''; + }; + monitor = lib.mkOption { + default = + if config.mods.wm.monitors != [] + then (builtins.elemAt config.mods.wm.monitors 0).name + else ""; + example = "eDP-1"; + type = lib.types.str; + description = '' + main monitor for the login screen. + By default the main monitor is used. + ''; + }; + scale = lib.mkOption { + default = + if config.mods.wm.monitors != [] + then builtins.toString (builtins.elemAt config.mods.wm.monitors 0).scale + else ""; + example = "1.5"; + type = lib.types.str; + description = '' + Scale used by the monitor in the login screen. + By default the scale of the main monitor is used. + ''; + }; + greeterCommand = lib.mkOption { + default = "${ + lib.getExe inputs.hyprland.packages.${system}.hyprland + } --config /etc/greetd/hyprgreet.conf"; + example = "${ + lib.getExe pkgs.cage + } -s -- ${lib.getExe pkgs.regreet}"; + type = lib.types.str; + description = "The compositor/greeter command to run"; + }; + resolution = lib.mkOption { + default = + if config.mods.wm.monitors != [] + then let + resX = builtins.toString (builtins.elemAt config.mods.wm.monitors 0).resolutionX; + resY = builtins.toString (builtins.elemAt config.mods.wm.monitors 0).resolutionY; + refresh = builtins.toString (builtins.elemAt config.mods.wm.monitors 0).refreshrate; + in "${resX}x${resY}@${refresh}" + else ""; + example = "3440x1440@180"; + type = lib.types.str; + description = '' + Resolution/refreshrate used by the monitor in the login screen. + ''; + }; + environments = lib.mkOption { + default = [ + (lib.mkIf config.mods.hypr.hyprland.enable inputs.hyprland.packages.${config.conf.system}.hyprland) + (lib.mkIf config.mods.niri.enable pkgs.niri) + ]; + # no idea if these are written correctly + example = [ + pkgs.niri + pkgs.river-classic + pkgs.swayfx + ]; + type = with lib.types; listOf package; + description = '' + List of environments that should be available in the login prompt. + ''; + }; + regreet = { + customSettings = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = '' + Custom regret settings. See https://github.com/rharish101/ReGreet/blob/main/regreet.sample.toml for more information. + ''; + }; + }; + }; + }; + + config = let + inherit (config.conf) username; + in + lib.mkIf config.mods.greetd.enable ( + lib.optionalAttrs (options ? environment) { + # greetd display manager + programs.hyprland.enable = mkDashDefault true; + services = { + displayManager.sessionPackages = config.mods.greetd.environments; + greetd = { + enable = true; + settings = { + terminal.vt = mkDashDefault 1; + default_session = { + command = mkDashDefault config.mods.greetd.greeterCommand; + user = mkDashDefault username; + }; + }; + }; + }; + + # should technically be the same, but this is configured instead in order to provide a decent out of the box login experience. + environment.etc."greetd/hyprgreet.conf".text = '' + monitor=${config.mods.greetd.monitor},${config.mods.greetd.resolution},0x0,${config.mods.greetd.scale} + monitor=,disable + + input { + kb_layout = ${config.mods.xkb.layout} + kb_variant = ${config.mods.xkb.variant} + force_no_accel = true + } + + misc { + disable_splash_rendering = false + disable_hyprland_logo = true + disable_xdg_env_checks = true + disable_scale_notification = true + } + + env=STATE_DIR,var/cache/regreet + env=CACHE_DIR,var/cache/regreet + env=HYPRCURSOR_THEME,${config.mods.stylix.cursor.name} + env=HYPRCURSOR_SIZE,${toString config.mods.stylix.cursor.size} + env=XCURSOR_THEME,${config.mods.stylix.cursor.name} + env=XCURSOR_SIZE,${toString config.mods.stylix.cursor.size} + env=QT_QPA_PLATFORMTHEME,qt5ct + + exec-once=regreet --style /home/${username}/.config/gtk-3.0/gtk.css --config /home/${username}/.config/regreet/regreet.toml; hyprctl dispatch exit + ''; + + # unlock GPG keyring on login + security.pam = { + services.greetd = { + enableGnomeKeyring = mkDashDefault true; + sshAgentAuth = mkDashDefault true; + }; + sshAgentAuth.enable = mkDashDefault true; + }; + } + // lib.optionalAttrs (options ? home) { + xdg.configFile."regreet/regreet.toml".source = + (pkgs.formats.toml {}).generate "regreet" + config.mods.greetd.regreet.customSettings; + } + ); +} diff --git a/modules/programs/homePackages.nix b/modules/programs/homePackages.nix new file mode 100644 index 0000000..6a995f0 --- /dev/null +++ b/modules/programs/homePackages.nix @@ -0,0 +1,154 @@ +{ + lib, + options, + config, + pkgs, + ... +} +: { + options.mods.homePackages = { + useDefaultPackages = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Use default packages (will use additional_packages only if disabled)"; + }; + additionalPackages = lib.mkOption { + default = []; + example = [pkgs.flatpak]; + type = with lib.types; listOf package; + description = '' + Additional Home manager packages. + Will be installed regardless of default home manager packages are installed. + ''; + }; + specialPrograms = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = '' + special program configuration to be added which require programs.something notation. + ''; + }; + specialServices = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = '' + special services configuration to be added which require an services.something notation. + ''; + }; + matrixClient = lib.mkOption { + default = pkgs.nheko; + example = null; + type = with lib.types; nullOr package; + description = "The matrix client"; + }; + vesktop = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Adds the vesktop discord client"; + }; + ncspot = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Adds the ncspot spotify client"; + }; + orcaSlicer = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables orca slicer"; + }; + nextcloudClient = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Adds the full desktop nextcloud client (the nextcloud module in dashnix only provides the cli tool)"; + }; + mailClient = lib.mkOption { + default = pkgs.thunderbird; + example = null; + type = with lib.types; nullOr package; + description = "The email client"; + }; + browser = lib.mkOption { + default = "zen"; + example = "firefox"; + type = with lib.types; + nullOr ( + either (enum [ + "firefox" + "zen" + "librewolf" + "chromium" + "brave" + ]) + package + ); + description = "The browser (the enum variants have preconfigured modules)"; + }; + }; + + config = lib.optionalAttrs (options ? home.packages) { + home.packages = + if config.mods.homePackages.useDefaultPackages + then + with pkgs; + [ + (lib.mkIf config.mods.homePackages.ncspot ncspot) + (lib.mkIf config.mods.homePackages.orcaSlicer orca-slicer) + (lib.mkIf config.mods.homePackages.vesktop vesktop) + (lib.mkIf config.mods.homePackages.nextcloudClient nextcloud-client) + (lib.mkIf (config.mods.homePackages.matrixClient != null) config.mods.homePackages.matrixClient) + (lib.mkIf (config.mods.homePackages.mailClient != null) config.mods.homePackages.mailClient) + (lib.mkIf ( + # NOTE: This should be package, but nix doesn't have that.... + builtins.isAttrs config.mods.homePackages.browser && config.mods.homePackages.browser != null + ) + config.mods.homePackages.browser) + adw-gtk3 + bat + brightnessctl + dbus + fastfetch + fd + ffmpeg + flake-checker + gnome-keyring + gnutar + regreet + killall + kitty + libnotify + lsd + networkmanager + nh + nix-index + playerctl + poppler-utils + pulseaudio + libsForQt5.qt5ct + qt6Packages.qt6ct + fuc + ripgrep + rm-improved + system-config-printer + xournalpp + zenith + zoxide + ] + ++ config.mods.homePackages.additionalPackages + else config.mods.homePackages.additionalPackages; + + xdg.configFile."direnv/direnv.toml".source = (pkgs.formats.toml {}).generate "direnv" { + global = { + warn_timeout = "-1s"; + }; + }; + programs = config.mods.homePackages.specialPrograms; + services = config.mods.homePackages.specialServices; + }; +} diff --git a/modules/programs/hypr/default.nix b/modules/programs/hypr/default.nix new file mode 100644 index 0000000..68b88ea --- /dev/null +++ b/modules/programs/hypr/default.nix @@ -0,0 +1,7 @@ +{ + imports = [ + ./hyprland.nix + ./hyprlock.nix + ./hyprpaper.nix + ]; +} diff --git a/modules/programs/hypr/hyprland.nix b/modules/programs/hypr/hyprland.nix new file mode 100644 index 0000000..442b964 --- /dev/null +++ b/modules/programs/hypr/hyprland.nix @@ -0,0 +1,357 @@ +{ + mkDashDefault, + config, + lib, + options, + pkgs, + ... +}: let + defaultWmConf = import ../../../lib/wm.nix; +in { + options.mods.hypr.hyprland = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enable Hyprland + ''; + }; + noAtomic = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = '' + Use tearing (Warning, can be buggy) + ''; + }; + useIronbar = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Whether to use ironbar in hyprland. + ''; + }; + useDefaultConfig = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Use preconfigured Hyprland config. + ''; + }; + customConfig = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = '' + Custom Hyprland configuration. + Will be merged with default configuration if enabled. + ''; + }; + plugins = lib.mkOption { + default = []; + example = []; + type = with lib.types; listOf package; + description = '' + Plugins to be added to Hyprland. + ''; + }; + pluginConfig = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = '' + Plugin configuration to be added to Hyprland. + ''; + }; + hyprspaceEnable = lib.mkOption { + default = false; + type = lib.types.bool; + example = true; + description = '' + Enables Hyprspace plugin for hyprland. + Please note, plugins tend to break VERY often. + ''; + }; + }; + + config = lib.mkIf config.mods.hypr.hyprland.enable ( + lib.optionalAttrs (options ? wayland.windowManager.hyprland) { + # install Hyprland related packages + home.packages = with pkgs; [ + xorg.xprop + grim + slurp + satty + xdg-desktop-portal-gtk + xdg-desktop-portal-gnome + kdePackages.xdg-desktop-portal-kde + xdg-desktop-portal-shana + copyq + wl-clipboard + hyprcursor + hyprpicker + ]; + + wayland.windowManager.hyprland = let + mkWorkspace = workspaces: + builtins.map (workspace: let + default = + if workspace.default + then ",default:true" + else ""; + in "${workspace.name},monitor:${workspace.monitor}${default}") + workspaces; + mkTransform = transform: + if transform == "0" + then 0 + else if transform == "90" + then 1 + else if transform == "180" + then 2 + else if transform == "270" + then 3 + else 4; + mkVrr = vrr: + if vrr + then "1" + else "0"; + mkMonitors = monitors: + builtins.map ( + monitor: "${monitor.name},${builtins.toString monitor.resolutionX}x${builtins.toString monitor.resolutionY}@${builtins.toString monitor.refreshrate},${builtins.toString monitor.positionX}x${builtins.toString monitor.positionY},${builtins.toString monitor.scale}, transform,${builtins.toString (mkTransform monitor.transform)}, vrr,${mkVrr monitor.vrr}" + ) + monitors; + + mkMods = bind: let + mods = bind.modKeys or []; + in + builtins.map (mod: + if mod == "Mod" + then (lib.strings.toUpper config.mods.wm.modKey) + " " + else lib.strings.toUpper mod) + mods + |> lib.strings.concatStringsSep ""; + mkArgs = args: + if args != [] + then (lib.strings.concatStringsSep " " args) + else ""; + shouldRepeat = bind: bind ? meta && bind.meta ? hyprland && bind.meta.hyprland ? repeat && bind.meta.hyprland.repeat == true; + + defaultBinds = cfg: + if cfg.mods.wm.useDefaultBinds + then defaultWmConf.defaultBinds cfg + else []; + + mkEBinds = cfg: let + binds = cfg.mods.wm.binds ++ defaultBinds cfg; + in + binds + |> builtins.filter (bind: bind ? command && shouldRepeat bind && !(hasInvalidCustomCommand bind)) + |> builtins.map ( + bind: "${mkMods bind},${bind.key},${mkCommand bind}" + ); + mkBinds = cfg: let + binds = cfg.mods.wm.binds ++ defaultBinds cfg; + in + binds + |> builtins.filter (bind: bind ? command && !(shouldRepeat bind) && !(hasInvalidCustomCommand bind)) + |> builtins.map ( + bind: "${mkMods bind},${bind.key},${mkCommand bind}" + ); + mkCommand = bind: let + args = bind.args or []; + in + if bind.command == "quit" + then "exit" + else if bind.command == "killActive" + then "killactive" + else if bind.command == "moveWindowRight" + then "movewindow,r" + else if bind.command == "moveWindowDown" + then "movewindow,d" + else if bind.command == "moveWindowLeft" + then "movewindow,l" + else if bind.command == "moveWindowUp" + then "movewindow,u" + else if bind.command == "moveFocusUp" + then "movefocus,u" + else if bind.command == "moveFocusRight" + then "movefocus,r" + else if bind.command == "moveFocusDown" + then "movefocus,d" + else if bind.command == "moveFocusLeft" + then "movefocus,l" + else if bind.command == "toggleFloating" + then "togglefloating" + else if bind.command == "toggleFullscreen" + then "fullscreen" + else if bind.command == "focusWorkspace" + then "workspace" + "," + mkArgs args + else if bind.command == "moveToWorkspace" + then "movetoworkspace" + "," + mkArgs args + else if bind.command == "spawn" + then "exec" + "," + mkArgs args + else if bind.command == "spawn-sh" + then "exec" + "," + mkArgs args + else bind.command.hyprland + "," + mkArgs args; + hasInvalidCustomCommand = bind: !(builtins.isString bind.command) && bind.command.hyprland or null == null; + + mkEnv = config: let + defaultEnv = + if config.mods.wm.useDefaultEnv + then defaultWmConf.defaultEnv config + else { + all = {}; + hyprland = {}; + }; + userEnv = + if config.mods.wm.env ? all + then config.mods.wm.env.all // config.mods.wm.env.hyprland + else config.mods.wm.env; + env = userEnv // defaultEnv.all // defaultEnv.hyprland; + in + lib.attrsets.mapAttrsToList ( + name: value: "${name},${value}" + ) + env; + mkAutoStart = config: let + defaultStartup = + if config.mods.wm.useDefaultStartup + then defaultWmConf.defaultStartup config + else { + all = []; + hyprland = []; + }; + userStartup = + if config.mods.wm.startup ? all + then config.mods.wm.startup.all ++ config.mods.wm.startup.hyprland + else config.mods.wm.startup; + autoStart = userStartup ++ defaultStartup.all ++ defaultStartup.hyprland; + in + autoStart; + mkWindowRule = config: let + defaultWindowRules = + if config.mods.wm.useDefaultWindowRules + then defaultWmConf.defaultWindowRules.hyprland + else []; + in + # defaultWindowRules ++ config.mods.wm.windowRules.hyprland; + defaultWindowRules; + in { + enable = true; + plugins = + [ + (lib.mkIf config.mods.hypr.hyprland.hyprspaceEnable pkgs.hyprlandPlugins.hyprspace) + ] + ++ config.mods.hypr.hyprland.plugins; + settings = + if config.mods.hypr.hyprland.useDefaultConfig + then + lib.mkMerge + [ + { + "$mod" = mkDashDefault config.mods.wm.modKey; + + bindm = [ + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizeactive" + ]; + + general = { + gaps_out = mkDashDefault "3,5,5,5"; + border_size = mkDashDefault 3; + "col.active_border" = lib.mkOverride 51 "0xFFFF0000 0xFF00FF00 0xFF0000FF 45deg"; + allow_tearing = lib.mkIf config.mods.hypr.hyprland.noAtomic true; + }; + + decoration = { + rounding = mkDashDefault 4; + }; + + render = { + direct_scanout = mkDashDefault config.mods.gaming.enable; + }; + + animations = { + bezier = mkDashDefault "overshot, 0.05, 0.9, 0.1, 1.2"; + animation = [ + "windowsMove,1,4,default" + "windows,1,3,overshot,slide bottom" + "windowsOut,1,7,default,popin 70%" + "border,1,4,default" + "fade,1,7,default" + "workspaces,1,4,default" + "layers,1,2,default,slide" + ]; + }; + + dwindle = { + preserve_split = mkDashDefault true; + pseudotile = mkDashDefault 0; + permanent_direction_override = mkDashDefault false; + }; + + input = { + kb_layout = mkDashDefault "${config.mods.xkb.layout}"; + kb_variant = mkDashDefault "${config.mods.xkb.variant}"; + repeat_delay = mkDashDefault 200; + force_no_accel = mkDashDefault true; + touchpad = { + natural_scroll = mkDashDefault true; + tap-to-click = mkDashDefault true; + tap-and-drag = mkDashDefault true; + }; + }; + + misc = { + animate_manual_resizes = mkDashDefault 1; + enable_swallow = mkDashDefault true; + disable_splash_rendering = mkDashDefault true; + disable_hyprland_logo = mkDashDefault true; + disable_xdg_env_checks = mkDashDefault true; + disable_scale_notification = mkDashDefault true; + swallow_regex = mkDashDefault "^(.*)(kitty)(.*)$"; + initial_workspace_tracking = mkDashDefault 1; + # just doesn't work + enable_anr_dialog = false; + }; + + cursor = { + enable_hyprcursor = mkDashDefault true; + no_hardware_cursors = mkDashDefault ( + if config.mods.gpu.nvidia.enable + then 2 + else 0 + ); + # done with nix, this would break the current setup otherwise + sync_gsettings_theme = mkDashDefault false; + }; + + gesture = [ + "3, horizontal, workspace" + ]; + + layerrule = [ + # layer rules + # mainly to disable animations within slurp and grim + "match:namespace selection, no_anim on" + ]; + + workspace = mkWorkspace config.mods.wm.workspaces; + monitor = mkMonitors config.mods.wm.monitors; + env = mkEnv config; + bind = mkBinds config; + binde = mkEBinds config; + windowrule = mkWindowRule config; + exec-once = mkAutoStart config; + plugin = config.mods.hypr.hyprland.pluginConfig; + } + config.mods.hypr.hyprland.customConfig + ] + else lib.mkForce config.mods.hypr.hyprland.customConfig; + }; + } + ); +} diff --git a/modules/programs/hypr/hyprlock.nix b/modules/programs/hypr/hyprlock.nix new file mode 100644 index 0000000..c152b22 --- /dev/null +++ b/modules/programs/hypr/hyprlock.nix @@ -0,0 +1,69 @@ +{ + config, + lib, + options, + pkgs, + ... +}: { + options.mods.hypr.hyprlock = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables Hyprlock"; + }; + config = lib.mkOption { + default = { + background = [ + { + monitor = ""; + path = ""; + color = "rgba(26, 27, 38, 1.0)"; + } + ]; + + input-field = [ + { + monitor = "${ + if config.mods.wm.monitors != [] + then (builtins.elemAt config.mods.wm.monitors 0).name + else "" + }"; + placeholder_text = "password or something"; + } + ]; + + label = [ + { + monitor = "${ + if config.mods.wm.monitors != [] + then (builtins.elemAt config.mods.wm.monitors 0).name + else "" + }"; + text = "$TIME"; + font_size = 50; + position = "0, 200"; + valign = "center"; + halign = "center"; + } + ]; + }; + example = {}; + type = with lib.types; attrsOf anything; + description = "config"; + }; + }; + + config = lib.mkIf config.mods.hypr.hyprlock.enable ( + lib.optionalAttrs (options ? xdg.configFile) { + stylix.targets.hyprlock = { + enable = false; + }; + home.packages = with pkgs; [hyprlock]; + programs.hyprlock = lib.mkIf config.mods.hypr.hyprlock.enable { + enable = true; + settings = config.mods.hypr.hyprlock.config; + }; + } + ); +} diff --git a/modules/programs/hypr/hyprpaper.nix b/modules/programs/hypr/hyprpaper.nix new file mode 100644 index 0000000..b392b54 --- /dev/null +++ b/modules/programs/hypr/hyprpaper.nix @@ -0,0 +1,36 @@ +{ + config, + lib, + options, + pkgs, + ... +}: { + options.mods.hypr.hyprpaper = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables Hyprpaper"; + }; + config = lib.mkOption { + default = ""; + example = '' + preload = path/to/wallpaper + wallpaper = YOURMONITOR,path/to/wallpaper + ''; + type = lib.types.lines; + description = '' + Hyprpaper config + ''; + }; + }; + + config = lib.mkIf config.mods.hypr.hyprpaper.enable ( + lib.optionalAttrs (options ? xdg.configFile) { + home.packages = with pkgs; [hyprpaper]; + xdg.configFile."hypr/hyprpaper.conf" = lib.mkIf config.mods.hypr.hyprpaper.enable { + text = config.mods.hypr.hyprpaper.config; + }; + } + ); +} diff --git a/modules/programs/ironbar.nix b/modules/programs/ironbar.nix new file mode 100644 index 0000000..b955d51 --- /dev/null +++ b/modules/programs/ironbar.nix @@ -0,0 +1,552 @@ +{ + lib, + config, + pkgs, + inputs, + options, + mkDashDefault, + ... +}: let + inherit (config.conf) username; + base16 = pkgs.callPackage inputs.base16.lib {}; + scheme = base16.mkSchemeAttrs config.stylix.base16Scheme; + ironbarDefaultConfig = useBatteryModule: { + end = [ + (lib.mkIf useBatteryModule + { + type = "battery"; + class = "battery"; + icon_size = 0; + format = "{percentage}%"; + thresholds = { + warning = 20; + critical = 5; + }; + }) + { + class = "music"; + type = "music"; + format = ""; + truncate = { + mode = "end"; + max_length = 0; + }; + icons = { + play = ""; + pause = ""; + }; + truncate_popup_title = { + mode = "end"; + max_length = 15; + }; + truncate_popup_album = { + mode = "end"; + max_length = 15; + }; + truncate_popup_artist = { + mode = "end"; + max_length = 15; + }; + } + { + bar = [ + { + class = "popup-button"; + label = ""; + on_click = "popup:toggle"; + type = "button"; + } + ]; + class = "popup-button-box"; + popup = [ + { + class = "audio-box"; + orientation = "vertical"; + type = "box"; + widgets = [ + { + class = "audio-button-box"; + orientation = "horizontal"; + type = "box"; + widgets = [ + { + class = "audio-button"; + label = ""; + on_click = "!audioControl bluetooth"; + type = "button"; + } + { + class = "audio-button"; + label = "󰋋"; + on_click = "!audioControl internal"; + type = "button"; + } + ]; + } + { + class = "audio-label"; + label = "Output"; + type = "label"; + } + { + class = "audio-slider"; + length = 200; + on_change = "!pactl set-sink-volume @DEFAULT_SINK@ $0%"; + step = 1.0; + type = "slider"; + value = "pactl get-sink-volume @DEFAULT_SINK@ | awk -F'/' '{ print $2 }' | tr -d ' %'"; + label = "{{pactl get-sink-volume @DEFAULT_SINK@ | awk -F'/' '{ print $2 }'}}"; + } + { + class = "audio-label"; + label = "Input"; + type = "label"; + } + { + class = "audio-slider"; + length = 200; + on_change = "!pactl set-source-volume @DEFAULT_SOURCE@ $0%"; + step = 1.0; + type = "slider"; + value = "pactl get-source-volume @DEFAULT_SOURCE@ | awk -F'/' '{ print $2 }' | tr -d ' %'"; + } + ]; + } + ]; + type = "custom"; + } + { + bar = [ + { + class = "popup-button"; + label = ""; + on_click = "!oxidash"; + type = "button"; + } + ]; + class = "popup-button-box"; + type = "custom"; + } + { + bar = [ + { + class = "popup-button"; + label = ""; + on_click = "popup:toggle"; + type = "button"; + } + ]; + type = "custom"; + class = "popup-button-box"; + popup = [ + { + class = "system-box"; + type = "box"; + widgets = [ + { + class = "memory-usage"; + format = [ + " {cpu_percent}%" + " {memory_used} / {memory_total} GB ({memory_percent}%)" + " {swap_used} / {swap_total} GB ({swap_free} | {swap_percent}%)" + "󰥔 {uptime}" + ]; + direction = "vertical"; + interval = { + memory = 30; + cpu = 5; + temps = 5; + disks = 5; + network = 5; + }; + type = "sys_info"; + } + ]; + } + ]; + } + { + type = "tray"; + } + ]; + position = "top"; + height = 10; + anchor_to_edges = true; + start = [ + { + type = "workspaces"; + all_monitors = true; + } + ]; + center = [ + { + format = "%I:%M"; + format_popup = "%a %d:%m/%I:%M %p"; + locale = "en_US"; + type = "clock"; + } + ]; + }; + monitorConfig = useBatteryModule: + if config.mods.ironbar.ironbarSingleMonitor + then { + monitors.${ + if config.mods.wm.monitors != [] + then (builtins.elemAt config.mods.wm.monitors 0).name + else "" + } = + ironbarDefaultConfig useBatteryModule; + } + else ironbarDefaultConfig useBatteryModule; +in { + options.mods = { + ironbar = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables ironbar"; + }; + ironbarSingleMonitor = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Whether to use ironbar on a single monitor. + ''; + }; + useDefaultConfig = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Use preconfigured ironbar config. + ''; + }; + useBatteryModule = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Whether to use the preconfigured battery module."; + }; + customConfig = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = '' + Custom ironbar configuration. + Will be merged with default configuration if enabled. + ''; + }; + useDefaultCss = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Use preconfigured ironbar css. + ''; + }; + customCss = lib.mkOption { + default = ''''; + example = '' + #window { + border-radius: none; + } + ''; + type = lib.types.lines; + description = '' + Custom ironbar css. + Will be merged with default css if enabled. + ''; + }; + }; + }; + config = lib.mkIf (config.mods.ironbar.enable || config.mods.hypr.hyprland.useIronbar) ( + lib.optionalAttrs (options ? programs.ironbar) { + programs.ironbar = { + package = mkDashDefault pkgs.ironbar; + enable = true; + style = + if config.mods.ironbar.useDefaultCss + then + /* + css + */ + '' + @import url("/home/${username}/.config/gtk-3.0/gtk.css"); + + @define-color primary #${scheme.base0D}; + @define-color warning #${scheme.base0F}; + @define-color muted-text #${scheme.base05}; + @define-color background #${scheme.base00}; + @define-color secondary-background #${scheme.base02}; + + * slider { + background-color: @muted-text; + } + + * { + transition: + background-color 0.15s ease-in-out, + color 0.15s ease-in-out, + border-color 0.15s ease-in-out; + } + + .background { + background-color: rgba(0, 0, 0, 0); + padding: 0px; + margin: 0px; + } + + .focused { + padding: 0px 5px; + background-color: @background; + font-size: 17px; + border-radius: 10px; + } + + #bar #end { + margin: 0px 5px; + padding: 0px 5px; + background-color: @background; + border-radius: 10px; + } + + .popup-button { + padding: 0px 5px 0px 2px; + border-radius: 100%; + font-size: 13px; + background-color: @background; + } + + .popup-button-box { + padding: 2px 0px; + margin-right: 4px; + } + + .custom button { + background-color: @background; + color: @primary; + } + + .custom button:hover { + background-color: @secondary-background; + } + + /* audio */ + .audio-box * { + color: @primary; + } + + .audio-box { + padding: 2em; + background-color: @background; + border-radius: 5px; + border: 1px solid @primary; + } + + .audio-slider { + padding: 5px; + margin: 5px 5px 15px; + } + + .audio-label { + font-size: 19px; + } + + .audio-button { + padding: 10px 10px 10px 8px; + min-height: 35px; + min-width: 35px; + margin: 0px 1em; + border-radius: 50%; + font-size: 25px; + } + + .audio-button-box { + padding: 0px 2.5em 0px 2.5em; + margin: 0em 0em 1.5em; + } + + /* clock */ + .clock { + padding: 0px 5px; + font-size: 20px; + border-radius: 5px; + background-color: @background; + color: @primary; + } + + .clock:hover { + background-color: @secondary-background; + } + + .popup-clock { + font-size: 2.5em; + background-color: @background; + border: 1px solid @primary; + padding: 0.5em; + border-radius: 8px; + color: @primary; + } + + .popup-clock .calendar-clock { + margin: 0.25em 0em 0.75em; + color: @primary; + } + + .popup-clock .calendar { + font-size: 24px; + color: @primary; + } + + .popup-clock .calendar:selected { + background-color: @secondary-background; + } + + /* workspaces */ + .workspaces { + margin: 0px 0px 0px 5px; + border-radius: 10px; + background-color: @background; + padding: 2px 5px; + } + + .workspaces .item { + margin: 0px 3px; + font-size: 13px; + border-radius: 100%; + padding: 0px 3px 0px 3px; + background-color: rgba(0, 0, 0, 0); + color: @primary; + } + + .workspaces .item:hover { + background-color: @secondary-background; + color: @primary; + } + + .workspaces .item:not(.visible) { + color: @warning; + } + + .workspaces .item.focused { + background-color: @primary; + color: @background; + } + + /* battery */ + .battery { + font-size: 13px; + padding: 0px 4px 0px 0px; + margin: 2px 0px 2px 0px; + background-color: @background; + color: @primary; + } + + .battery .icon { + opacity: 0.0; + } + + .battery .label { + margin: 2px 0px 0px -8px; + color: @primary; + } + + .battery:hover { + background-color: @secondary-background; + border-radius: 5px; + } + + .popup-battery { + background-color: @background; + color: @primary; + border-radius: 8px; + border: 1px solid @primary; + padding: 16px; + font-size: 20px; + } + + /* music */ + .music { + font-size: 13px; + padding: 0px 4px 0px 3px; + margin: 2px 0px 2px 0px; + background-color: @background; + color: @primary; + } + + .music:hover { + background-color: @secondary-background; + border-radius: 100%; + } + + .music .contents .icon { + margin: 0px 0px 0px 5px; + } + + .popup-music { + background-color: @background; + color: @primary; + border-radius: 8px; + border: 1px solid @primary; + padding: 16px; + font-size: 20px; + } + + .popup-music .controls .btn-prev { + color: @primary; + margin-right: 16px; + } + + .popup-music .controls .btn-next { + color: @primary; + margin-right: 16px; + } + + .popup-music .controls .btn-play { + color: @primary; + margin-right: 16px; + } + + .popup-music .controls .btn-pause { + color: @primary; + margin-right: 16px; + } + + /* system */ + .system-box { + padding: 16px; + color: @primary; + border: 1px solid @primary; + background-color: @background; + border-radius: 8px; + } + + .memory-usage { + font-size: 15px; + color: @primary; + } + + .memory-usage:hover { + background-color: @secondary-background; + } + '' + + config.mods.ironbar.customCss + else config.mods.ironbar.customCss; + features = [ + #"another_feature" + ]; + config = + if config.mods.ironbar.useDefaultConfig + then + lib.mkMerge + [ + (monitorConfig config.mods.ironbar.useBatteryModule) + config.mods.ironbar.customConfig + ] + else config.mods.ironbar.customConfig; + }; + } + ); +} diff --git a/modules/programs/kde.nix b/modules/programs/kde.nix new file mode 100644 index 0000000..f81194d --- /dev/null +++ b/modules/programs/kde.nix @@ -0,0 +1,22 @@ +{ + lib, + options, + config, + ... +}: { + options.mods.kde = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables the KDE desktop environment"; + }; + }; + + config = lib.mkIf config.mods.kde.enable ( + lib.optionalAttrs (options ? services.desktopManager.plasma6) { + # apparently kde integration is bad -> kdeconfig is too much even for nix, can't blame them :) + services.desktopManager.plasma6.enable = true; + } + ); +} diff --git a/modules/programs/kdeConnect.nix b/modules/programs/kdeConnect.nix new file mode 100644 index 0000000..46b12e8 --- /dev/null +++ b/modules/programs/kdeConnect.nix @@ -0,0 +1,42 @@ +{ + lib, + config, + options, + pkgs, + ... +}: { + options.mods = { + kdeConnect.enable = lib.mkOption { + default = false; + type = lib.types.bool; + example = true; + description = '' + Enables kde_connect. + ''; + }; + }; + + config = lib.mkIf config.mods.kdeConnect.enable ( + lib.optionalAttrs (options ? networking.firewall) { + networking.firewall = { + allowedTCPPortRanges = [ + { + from = 1714; + to = 1764; + } + # KDE Connect + ]; + allowedUDPPortRanges = [ + { + from = 1714; + to = 1764; + } + # KDE Connect + ]; + }; + } + // lib.optionalAttrs (options ? home.packages) { + home.packages = with pkgs; [kdePackages.kdeconnect-kde]; + } + ); +} diff --git a/modules/programs/keepassxc.nix b/modules/programs/keepassxc.nix new file mode 100644 index 0000000..d8c0c6a --- /dev/null +++ b/modules/programs/keepassxc.nix @@ -0,0 +1,75 @@ +{ + lib, + config, + options, + pkgs, + ... +}: { + options.mods.keepassxc = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables the piper program and its daemon"; + }; + useConfig = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Whether to overwrite the config of keepassxc. Note, this means that changes can't be applied via the program anymore!"; + }; + config = lib.mkOption { + default = '' + [General] + ConfigVersion=2 + + [Browser] + Enabled=true + + [GUI] + ApplicationTheme=classic + HidePasswords=true + MinimizeOnClose=true + MinimizeToTray=true + ShowTrayIcon=true + TrayIconAppearance=monochrome-light + + [PasswordGenerator] + Length=30 + + [Security] + EnableCopyOnDoubleClick=true + ''; + example = ""; + type = lib.types.lines; + description = "Cache config to be used."; + }; + useCacheConfig = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Whether to overwrite the cache config of keepassxc. Note, this means that changes can't be applied via the program anymore!"; + }; + cacheConfig = lib.mkOption { + default = ''''; + example = '' + [General] + LastDatabases=/path/to/database + ''; + type = lib.types.lines; + description = "Cache config to be used."; + }; + }; + config = lib.mkIf config.mods.keepassxc.enable ( + lib.optionalAttrs (options ? home.file) { + home.packages = [pkgs.keepassxc]; + xdg.configFile."keepassxc/keepassxc.ini" = lib.mkIf config.mods.keepassxc.useConfig { + text = config.mods.keepassxc.config; + }; + + home.file.".cache/keepassxc/keepassxc.ini" = lib.mkIf config.mods.keepassxc.useCacheConfig { + text = config.mods.keepassxc.cacheConfig; + }; + } + ); +} diff --git a/modules/programs/kitty.nix b/modules/programs/kitty.nix new file mode 100644 index 0000000..ab2ae5a --- /dev/null +++ b/modules/programs/kitty.nix @@ -0,0 +1,129 @@ +{ + lib, + config, + options, + pkgs, + inputs, + ... +}: let + base16 = pkgs.callPackage inputs.base16.lib {}; + scheme = base16.mkSchemeAttrs config.stylix.base16Scheme; + hexTable = { + "0" = "1"; + "1" = "0"; + "2" = "1"; + "3" = "2"; + "4" = "3"; + "5" = "4"; + "6" = "5"; + "7" = "6"; + "8" = "7"; + "9" = "8"; + "a" = "9"; + "b" = "a"; + "c" = "b"; + "d" = "c"; + "e" = "d"; + "f" = "e"; + }; + # don't ask :) + base = + "#" + + lib.strings.concatStrings ( + (lib.lists.take 5 (lib.strings.stringToCharacters scheme.base00)) + ++ [hexTable."${(lib.lists.last (lib.strings.stringToCharacters scheme.base00))}"] + ); +in { + options.mods.kitty = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables kitty"; + }; + useDefaultConfig = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enable default config for kitty"; + }; + additionalConfig = lib.mkOption { + default = {}; + example = { + # for the insane people out there :P + enable_audio_bell = "yes"; + }; + type = with lib.types; attrsOf anything; + description = "Additional kitty configuration. Will be the only configuration if useDefaultConfig is disabled."; + }; + }; + config = lib.mkIf config.mods.kitty.enable ( + lib.optionalAttrs (options ? home.packages) { + stylix.targets.kitty = { + enable = false; + }; + programs.kitty = { + enable = true; + settings = + if config.mods.kitty.useDefaultConfig + then + { + enable_audio_bell = "no"; + window_alert_on_bell = "no"; + cursor_blink_interval = "0"; + window_padding_width = "1"; + shell_integration = "yes"; + sync_with_monitor = "no"; + background_opacity = "0.8"; + + font_family = "${config.mods.stylix.fonts.monospace.name}"; + bold_font = "${config.mods.stylix.fonts.monospace.name} Extra Bold"; + italic_font = "${config.mods.stylix.fonts.monospace.name} Extra Italic"; + bold_italic_font = "${config.mods.stylix.fonts.monospace.name} Extra Bold Italic"; + + background = base; + foreground = "#" + scheme.base05; + selection_foreground = "#" + scheme.base05; + selection_background = base; + url_color = "#" + scheme.base04; + cursor = "#" + scheme.base05; + active_border_color = "#" + scheme.base03; + inactive_border_color = "#" + scheme.base01; + active_tab_background = base; + active_tab_foreground = "#" + scheme.base05; + inactive_tab_background = "#" + scheme.base01; + inactive_tab_foreground = "#" + scheme.base04; + tab_bar_background = "#" + scheme.base01; + + mark1_foreground = "#" + scheme.base00; + mark1_background = "#" + scheme.base07; + mark2_foreground = "#" + scheme.base00; + mark2_background = "#" + scheme.base0E; + mark3_foreground = "#" + scheme.base00; + mark3_background = "#" + scheme.base08; + + color0 = "#" + scheme.base03; + color1 = "#" + scheme.base08; + color2 = "#" + scheme.base0B; + color3 = "#" + scheme.base0A; + color4 = "#" + scheme.base0D; + color5 = "#" + scheme.base06; + color6 = "#" + scheme.base0C; + color7 = "#" + scheme.base07; + + color8 = "#" + scheme.base04; + color9 = "#" + scheme.base08; + color10 = "#" + scheme.base0B; + color11 = "#" + scheme.base0A; + color12 = "#" + scheme.base0D; + color13 = "#" + scheme.base06; + color14 = "#" + scheme.base0C; + color15 = "#" + scheme.base0B; + shell = lib.mkIf config.mods.fish.enable "fish"; + } + // config.mods.kitty.additionalConfig + else config.mods.kitty.additionalConfig; + }; + } + ); +} diff --git a/modules/programs/media.nix b/modules/programs/media.nix new file mode 100644 index 0000000..c37d62b --- /dev/null +++ b/modules/programs/media.nix @@ -0,0 +1,123 @@ +{ + lib, + options, + config, + pkgs, + ... +}: { + options.mods.media = { + useBasePackages = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Default media packages (If disabled, only the additional packages will be installed)"; + }; + additionalPackages = lib.mkOption { + default = []; + example = [pkgs.flatpak]; + type = with lib.types; listOf package; + description = '' + Additional media packages. + ''; + }; + specialPrograms = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = '' + special program configuration to be added which require programs.something notation. + ''; + }; + specialServices = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = '' + special services configuration to be added which require an services.something notation. + ''; + }; + filePickerPortal = lib.mkOption { + default = "Term"; + example = "Gnome"; + type = with lib.types; oneOf [(enum ["Gnome" "Kde" "Lxqt" "Gtk" "Term" "Default"]) str]; + description = '' + The file picker portal to use (set with shana). + Default removes the config, allowing you to set it yourself. + ''; + }; + termFileChooserConfig = lib.mkOption { + default = { + cmd = "${pkgs.xdg-desktop-portal-termfilechooser}/share/xdg-desktop-portal-termfilechooser/yazi-wrapper.sh"; + default_dir = "$HOME"; + }; + example = {}; + type = with lib.types; attrsOf anything; + description = '' + Termfilechooser config + ''; + }; + }; + config = lib.optionalAttrs (options ? home.packages) { + xdg.configFile."xdg-desktop-portal-termfilechooser/config" = lib.mkIf (config.mods.media.filePickerPortal != "Term") { + source = (pkgs.formats.ini {}).generate "termchooser" { + filechooser = config.mods.media.termFileChooserConfig; + }; + }; + xdg.configFile."xdg-desktop-portal-shana/config.toml" = lib.mkIf (config.mods.media.filePickerPortal != "Default") { + source = let + name = + if (config.mods.media.filePickerPortal == "Term") + then "org.freedesktop.impl.portal.desktop.termfilechooser" + else config.mods.media.filePickerPortal; + in + (pkgs.formats.toml {}).generate "shana" { + open_file = name; + save_file = name; + save_files = name; + }; + }; + home.packages = + if config.mods.media.useBasePackages + then + with pkgs; + [ + # base audio + pipewire + wireplumber + # audio control + playerctl + # images + eog + # videos + mpv + # pdf + zathura + evince + libreoffice-fresh + onlyoffice-desktopeditors + pdftk + pdfpc + polylux2pdfpc + # spotify + # video editing + kdePackages.kdenlive + # image creation + inkscape + gimp + krita + yt-dlp + ] + ++ config.mods.media.additionalPackages + else config.mods.media.additionalPackages; + programs = + if config.mods.media.useBasePackages + then + { + obs-studio.enable = true; + obs-studio.plugins = with pkgs; [obs-studio-plugins.obs-vaapi]; + } + // config.mods.media.specialPrograms + else config.mods.media.specialPrograms; + services = config.mods.media.specialServices; + }; +} diff --git a/modules/programs/mime.nix b/modules/programs/mime.nix new file mode 100644 index 0000000..4da7aff --- /dev/null +++ b/modules/programs/mime.nix @@ -0,0 +1,161 @@ +# Copyright (c) 2020-2021 Mihai Fufezan +# credits to fufexan https://github.com/fufexan/dotfiles/blob/main/home/terminal/programs/xdg.nix +{ + mkDashDefault, + config, + lib, + options, + ... +}: let + browserName = + if (builtins.isString config.mods.homePackages.browser) + then config.mods.homePackages.browser + else if config.mods.homePackages.browser ? meta && config.mods.homePackages.browser.meta ? mainProgram + then config.mods.homePackages.browser.meta.mainProgram + else config.mods.homePackages.browser.pname; +in { + options.mods.mime = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables mime handling with nix"; + }; + imageTypes = lib.mkOption { + default = [ + "png" + "svg" + "jpeg" + "gif" + ]; + example = []; + type = with lib.types; listOf str; + description = "Image mime handlers"; + }; + videoTypes = lib.mkOption { + default = [ + "mp4" + "avi" + "mkv" + ]; + example = []; + type = with lib.types; listOf str; + description = "Video mime handlers"; + }; + audioTypes = lib.mkOption { + default = [ + "mp3" + "flac" + "wav" + "aac" + ]; + example = []; + type = with lib.types; listOf str; + description = "Audio mime handlers"; + }; + browserTypes = lib.mkOption { + default = [ + "json" + "x-extension-htm" + "x-extension-html" + "x-extension-shtml" + "x-extension-xht" + "x-extension-xhtml" + ]; + example = []; + type = with lib.types; listOf str; + description = "Browser mime handlers"; + }; + browserXTypes = lib.mkOption { + default = [ + "about" + "ftp" + "http" + "https" + "unknown" + ]; + example = []; + type = with lib.types; listOf str; + description = "Browser X mime handlers"; + }; + browserApplications = lib.mkOption { + default = ["${browserName}"]; + example = []; + type = with lib.types; listOf str; + description = "Applications used for handling browser mime types"; + }; + imageApplications = lib.mkOption { + default = ["eog"]; + example = []; + type = with lib.types; listOf str; + description = "Applications used for handling image mime types"; + }; + videoApplications = lib.mkOption { + default = ["mpv"]; + example = []; + type = with lib.types; listOf str; + description = "Applications used for handling video mime types"; + }; + audioApplications = lib.mkOption { + default = ["io.bassi.Amberol"]; + example = []; + type = with lib.types; listOf str; + description = "Applications used for handling audio mime types"; + }; + # TODO additional config + }; + config = lib.optionalAttrs (options ? home) { + xdg = let + xdgAssociations = type: program: list: + builtins.listToAttrs ( + map (e: { + name = "${type}/${e}"; + value = program; + }) + list + ); + + imageAc = xdgAssociations "image" config.mods.mime.imageApplications config.mods.mime.imageTypes; + videoAc = xdgAssociations "video" config.mods.mime.videoApplications config.mods.mime.videoTypes; + audioAc = xdgAssociations "audio" config.mods.mime.audioApplications config.mods.mime.audioTypes; + browserAc = + (xdgAssociations "application" config.mods.mime.browserApplications config.mods.mime.browserTypes) + // ( + xdgAssociations "x-scheme-handler" config.mods.mime.browserApplications + config.mods.mime.browserXTypes + ); + associations = builtins.mapAttrs (_: v: (map (e: "${e}.desktop") v)) ( + # TODO make configurable + { + "application/pdf" = ["org.pwmt.zathura-pdf-mupdf"]; + "text/html" = config.mods.mime.browserApplications; + "text/plain" = ["neovide"]; + "x-scheme-handler/chrome" = ["com.brave.browser"]; + "inode/directory" = ["yazi"]; + } + // imageAc + // audioAc + // videoAc + // browserAc + ); + in + lib.mkIf config.mods.mime.enable { + enable = true; + cacheHome = config.home.homeDirectory + "/.local/cache"; + + mimeApps = { + enable = true; + defaultApplications = associations; + }; + + userDirs = { + enable = mkDashDefault true; + createDirectories = mkDashDefault true; + extraConfig = { + XDG_SCREENSHOTS_DIR = mkDashDefault "${config.xdg.userDirs.pictures}/Screenshots"; + pws = mkDashDefault "${config.home.homeDirectory}/pws"; + }; + }; + }; + }; +} diff --git a/modules/programs/ncspot.nix b/modules/programs/ncspot.nix new file mode 100644 index 0000000..b998942 --- /dev/null +++ b/modules/programs/ncspot.nix @@ -0,0 +1,64 @@ +{ + lib, + config, + options, + pkgs, + ... +}: { + options.mods.ncspot = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables ncspot with a config"; + }; + config = lib.mkOption { + default = { + notify = true; + shuffle = true; + cover_max_scale = 2; + initial_screen = "library"; + library_tabs = ["playlists"]; + theme = { + background = "#1a1b26"; + primary = "#9aa5ce"; + secondary = "#414868"; + title = "#9ece6a"; + playing = "#7aa2f7"; + playing_selected = "#bb9af7"; + playing_bg = "#24283b"; + highlight = "#c0caf5"; + highlight_bg = "#24283b"; + error = "#414868"; + error_bg = "#f7768e"; + statusbar = "#ff9e64"; + statusbar_progress = "#7aa2f7"; + statusbar_bg = "#1a1b26"; + cmdline = "#c0caf5"; + cmdline_bg = "#24283b"; + search_match = "#f7768e"; + }; + keybindings = { + "j" = "move left 1"; + "k" = "move down 1"; + "l" = "move up 1"; + ";" = "move right 1"; + }; + notification_format = { + title = "%artists"; + body = "%title"; + }; + }; + example = {}; + type = with lib.types; attrsOf anything; + description = "config"; + }; + }; + config = lib.mkIf config.mods.ncspot.enable ( + lib.optionalAttrs (options ? home.packages) { + home.packages = with pkgs; [ncspot]; + xdg.configFile."ncspot/config.toml".source = + lib.mkIf config.mods.ncspot.useConfig (pkgs.formats.toml {}).generate "ncspot" config.mods.ncspot.config; + } + ); +} diff --git a/modules/programs/nextcloud.nix b/modules/programs/nextcloud.nix new file mode 100644 index 0000000..31216ee --- /dev/null +++ b/modules/programs/nextcloud.nix @@ -0,0 +1,38 @@ +{lib, ...}: { + options.mods = { + nextcloud = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enable nextcloud"; + }; + username = lib.mkOption { + default = ""; + example = "globi"; + type = lib.types.str; + description = "Your username"; + }; + url = lib.mkOption { + default = ""; + example = "cloud.globi.org"; + type = lib.types.str; + description = "Your url"; + }; + synclist = lib.mkOption { + default = []; + example = [ + { + name = "sync globi folder"; + remote = "globi"; + local = "/home/globi"; + } + ]; + description = '' + A list of folders to synchronize. + This has to be an attribute list with the name, remote and local field (all strings). + ''; + }; + }; + }; +} diff --git a/modules/programs/niri.nix b/modules/programs/niri.nix new file mode 100644 index 0000000..0531829 --- /dev/null +++ b/modules/programs/niri.nix @@ -0,0 +1,392 @@ +{ + mkDashDefault, + config, + lib, + options, + pkgs, + ... +}: let + defaultWmConf = import ../../lib/wm.nix; +in { + options.mods.niri = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enable Niri + ''; + }; + useDefaultConfig = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Use preconfigured Niri config. + ''; + }; + customConfig = lib.mkOption { + default = ''''; + example = ''''; + type = lib.types.lines; + description = '' + Custom Niri configuration. + Will be merged with default configuration if enabled. + ''; + }; + }; + + config = lib.mkIf config.mods.niri.enable ( + lib.optionalAttrs (options ? wayland.windowManager.hyprland) { + # TODO deduplicate and abstract away base window management config + # install Niri related packages + home.packages = with pkgs; [ + xorg.xprop + grim + slurp + satty + xdg-desktop-portal-gtk + xdg-desktop-portal-gnome + kdePackages.xdg-desktop-portal-kde + xdg-desktop-portal-shana + copyq + wl-clipboard + + niri + xwayland-satellite + ]; + + xdg.configFile."niri/config.kdl" = let + mkNiriMod = mods: + builtins.map (mod: + if mod == "Mod" + then config.mods.wm.modKey + "+" + else "${mod}" + "+") + mods + |> lib.strings.concatStringsSep ""; + mkNiriArg = args: + if args != [] + then let + concatCommand = lib.strings.concatStringsSep " " args; + validCommand = builtins.replaceStrings [''"''] [''\"''] concatCommand; + in "\"${validCommand}\"" + else ""; + mkNiriCommand = bind: let + args = bind.args or []; + in + if bind.command == "quit" + then "quit;" + else if bind.command == "killActive" + then "close-window;" + else if bind.command == "moveFocusTop" + then "focus-window-up;" + else if bind.command == "focusWorkspace" + then "focus-workspace" + " " + mkNiriArg args + ";" + else if bind.command == "moveWindowRight" + then "move-column-right-or-to-monitor-right;" + else if bind.command == "moveWindowDown" + then "move-window-down;" + else if bind.command == "moveWindowLeft" + then "move-column-left-or-to-monitor-left;" + else if bind.command == "moveWindowUp" + then "move-window-up;" + else if bind.command == "moveFocusUp" + then "focus-window-up;" + else if bind.command == "moveFocusRight" + then "focus-column-or-monitor-right;" + else if bind.command == "moveFocusDown" + then "focus-window-down;" + else if bind.command == "moveFocusLeft" + then "focus-column-or-monitor-left;" + else if bind.command == "toggleFloating" + then "toggle-window-floating;" + else if bind.command == "toggleFullscreen" + then "fullscreen-window;" + else if bind.command == "moveToWorkspace" + then "move-window-to-workspace" + " " + mkNiriArg args + ";" + else if bind.command == "spawn" + then "spawn" + " " + mkNiriArg args + ";" + else if bind.command == "spawn-sh" + then "spawn-sh" + " " + mkNiriArg args + ";" + else if bind.command.niri != null + then bind.command.niri + " " + mkNiriArg args + ";" + else ""; + + mkNiriBinds = cfg: + '' binds { + '' + + ( + ( + builtins.map ( + bind: + /* + kdl + */ + if bind ? key && bind ? command + then '' + ${mkNiriMod (bind.modKeys or [])}${bind.key} ${ + if + bind ? meta + && bind.meta ? niri + then + ( + if + bind.meta.niri ? desc + && bind.meta.niri.desc != "" + then "hotkey-overlay-title=\"" + bind.meta.niri.desc + "\"" + else "" + ) + + " " + + ( + if + bind.meta.niri ? repeat + && bind.meta.niri.repeat + then "repeat=true" + else "repeat=false" + ) + + " " + + ( + if + bind.meta.niri ? allowWhileLocked + && bind.meta.niri.allowWhileLocked + then "allow-when-locked=true" + else "" + ) + + " " + + ( + if + bind.meta.niri ? allowInhibit + && bind.meta.niri.allowInhibit + then "allow-inhibiting=true" + else "allow-inhibiting=false" + ) + else "" + } { ${ + mkNiriCommand bind + } } + '' + else '''' + ) + (( + cfg.mods.wm.binds + ++ ( + if cfg.mods.wm.useDefaultBinds + then defaultWmConf.defaultBinds cfg + else [] + ) + ) + |> builtins.filter (bind: !(hasInvalidCustomCommand bind))) + ) + |> lib.strings.concatLines + ) + + '' + } + ''; + mkVrr = vrr: + if vrr + then "true" + else "false"; + mkNiriMonitors = cfg: + (builtins.map ( + monitor: + # TODO vrr + /* + kdl + */ + '' + output "${monitor.name}" { + variable-refresh-rate on-demand=${mkVrr monitor.vrr} + mode "${builtins.toString monitor.resolutionX}x${builtins.toString monitor.resolutionY}@${builtins.toString monitor.refreshrate}" + scale ${builtins.toString monitor.scale} + transform "${ + if (monitor.transform == "0") + then "normal" + else monitor.transform + }" + position x=${builtins.toString monitor.positionX} y=${builtins.toString monitor.positionY} + } + '' + ) + cfg.mods.wm.monitors) + |> lib.strings.concatLines; + mkNiriWorkspaces = cfg: + (builtins.map ( + workspace: + /* + kdl + */ + '' + workspace "${workspace.name}" { + open-on-output "${workspace.monitor}" + } + '' + ) + cfg.mods.wm.workspaces) + |> lib.strings.concatLines; + mkNiriWindowRules = cfg: ( + ( + builtins.map ( + rule: + /* + kdl + */ + '' + window-rule { + ${rule} + } + '' + ) + ( + cfg.mods.wm.windowRules.niri + ++ ( + if cfg.mods.wm.useDefaultWindowRules + then defaultWmConf.defaultWindowRules.niri + else [] + ) + ) + ) + |> lib.strings.concatLines + ); + hasInvalidCustomCommand = bind: !(bind ? command) || (!(builtins.isString bind.command) && bind.command.niri or null == null); + mkNiriEnv = config: let + defaultEnv = + if config.mods.wm.useDefaultEnv + then defaultWmConf.defaultEnv config + else { + all = {}; + niri = {}; + }; + userEnv = + if config.mods.wm.env ? all + then config.mods.wm.env.all // config.mods.wm.env.niri + else config.mods.wm.env; + env = + userEnv + // defaultEnv.all + // defaultEnv.niri; + in + '' + environment { + '' + + ( + lib.attrsets.mapAttrsToList ( + name: value: "${name} \"${value}\"" + ) + env + |> lib.strings.concatLines + ) + + '' + } + ''; + mkNiriAutoStart = config: let + defaultStartup = + if config.mods.wm.useDefaultStartup + then defaultWmConf.defaultStartup config + else { + all = {}; + niri = {}; + }; + userStartup = + if config.mods.wm.startup ? all + then config.mods.wm.startup.all ++ config.mods.wm.startup.niri + else config.mods.wm.startup; + autoStart = userStartup ++ defaultStartup.all ++ defaultStartup.niri; + in + (builtins.map (value: "spawn-at-startup \"${value}\"") + autoStart) + |> lib.strings.concatLines; + defaultConfig = + /* + kdl + */ + '' + input { + keyboard { + xkb { + layout "enIntUmlaut" + } + repeat-delay 200 + repeat-rate 25 + numlock + } + + touchpad { + tap + natural-scroll + } + + mouse { + accel-speed 0.2 + accel-profile "flat" + } + + focus-follows-mouse max-scroll-amount="25%" + } + + layout { + // Set gaps around windows in logical pixels. + gaps 10 + center-focused-column "never" + always-center-single-column + + preset-column-widths { + proportion 0.33333 + proportion 0.5 + proportion 1.0 + } + + default-column-width { proportion 0.5; } + focus-ring { + width 3 + inactive-color "#505050" + active-gradient from="#ff0000" to="#00ff00" angle=45 + } + + border { + off + } + + // You can enable drop shadows for windows. + shadow { + on + softness 30 + spread 5 + offset x=0 y=5 + color "#0007" + } + } + + ${ + if config.mods.gpu.nvidia.enable + then '' + debug { + wait-for-frame-completion-before-queueing + } + '' + else '''' + } + + // Autostart + + hotkey-overlay { + skip-at-startup + } + + prefer-no-csd + '' + + mkNiriMonitors config + + mkNiriBinds config + + mkNiriWorkspaces config + + mkNiriWindowRules config + + mkNiriEnv config + + mkNiriAutoStart config; + in + mkDashDefault { + text = + if config.mods.niri.useDefaultConfig + then defaultConfig + config.mods.niri.customConfig + else config.mods.niri.customConfig; + }; + } + ); +} diff --git a/modules/programs/onedrive.nix b/modules/programs/onedrive.nix new file mode 100644 index 0000000..56bd79d --- /dev/null +++ b/modules/programs/onedrive.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + options, + pkgs, + ... +}: { + options.mods = { + onedrive = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enable onedrive program and service"; + }; + }; + }; + config = lib.mkIf config.mods.onedrive.enable ( + lib.optionalAttrs (options ? environment) { + services.onedrive.enable = true; + environment.systemPackages = [pkgs.onedrive]; + } + ); +} diff --git a/modules/programs/oxi/default.nix b/modules/programs/oxi/default.nix new file mode 100644 index 0000000..83c4f23 --- /dev/null +++ b/modules/programs/oxi/default.nix @@ -0,0 +1,81 @@ +{ + lib, + config, + options, + inputs, + ... +}: { + imports = [ + ./oxidash.nix + ./oxinoti.nix + ./oxipaste.nix + ./oxirun.nix + ./oxishut.nix + ]; + options.mods.oxi = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables oxi programs"; + }; + ReSet = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables and configures ReSet"; + }; + }; + hyprdock = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables hyprdock"; + }; + settings = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = "settings for hyprdock"; + }; + }; + oxicalc = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables hyprdock"; + }; + }; + }; + config = lib.mkIf config.mods.oxi.enable ( + lib.optionalAttrs (options ? home.packages) { + programs = { + hyprdock = { + inherit (config.mods.oxi.hyprdock) enable; + inherit (config.mods.oxi.hyprdock) settings; + }; + oxicalc.enable = lib.mkIf config.mods.oxi.oxicalc.enable true; + ReSet = lib.mkIf config.mods.oxi.ReSet.enable { + enable = true; + config = { + plugins = [ + inputs.reset-plugins.packages."x86_64-linux".monitor + inputs.reset-plugins.packages."x86_64-linux".keyboard + ]; + plugin_config = { + Keyboard = { + path = "/home/${config.conf.username}/.config/reset/keyboard.conf"; + }; + }; + }; + }; + }; + } + // lib.optionalAttrs (options ? services.logind && options ? services.logind.settings) { + services.logind.settings.Login.HandleLidSwitchExternalPower = "ignore"; + } + ); +} diff --git a/modules/programs/oxi/oxidash.nix b/modules/programs/oxi/oxidash.nix new file mode 100644 index 0000000..9ea519e --- /dev/null +++ b/modules/programs/oxi/oxidash.nix @@ -0,0 +1,79 @@ +{ + lib, + config, + options, + pkgs, + inputs, + ... +}: let + # at time of using this here, stylix might not be evaluated yet + # hence ensure it is by using base16 mkSchemeAttrs + base16 = pkgs.callPackage inputs.base16.lib {}; + scheme = base16.mkSchemeAttrs config.stylix.base16Scheme; +in { + options.mods.oxi.oxidash = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables and configures oxidash"; + }; + }; + config = lib.mkIf (config.mods.oxi.oxidash.enable && config.mods.oxi.enable) ( + lib.optionalAttrs (options ? xdg.configFile) { + programs.oxidash.enable = true; + xdg.configFile."oxidash/style.css" = { + text = '' + @define-color bg #${scheme.base00}; + @define-color primary #${scheme.base0D}; + + #MainWindow { + border-radius: 10px; + background-color: transparent; + } + + #MainBox { + border-radius: 10px; + border: 1px solid @primary; + background-color: @bg; + } + + #MainButtonBox { + padding: 10px; + margin: 5px 0px 5px 0px; + border-radius: 5px; + border: solid 1px @primary; + } + + #DoNotDisturbButton {} + + #ExitButton {} + + #ClearNotificationsButton {} + + #NotificationsWindow {} + + .debugimage { + border: solid 3px @primary; + } + + .Notification { + padding: 10px; + margin: 5px 0px 5px 0px; + border: solid 1px @primary; + border-radius: 5px; + } + + .CloseNotificationButton { + margin: 0px 5px 0px 10px; + } + + .PictureButtonBox {} + + .BaseBox {} + } + ''; + }; + } + ); +} diff --git a/modules/programs/oxi/oxinoti.nix b/modules/programs/oxi/oxinoti.nix new file mode 100644 index 0000000..d265af3 --- /dev/null +++ b/modules/programs/oxi/oxinoti.nix @@ -0,0 +1,129 @@ +{ + lib, + config, + options, + pkgs, + inputs, + ... +}: let + # at time of using this here, stylix might not be evaluated yet + # hence ensure it is by using base16 mkSchemeAttrs + base16 = pkgs.callPackage inputs.base16.lib {}; + scheme = base16.mkSchemeAttrs config.stylix.base16Scheme; +in { + options.mods.oxi.oxinoti = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables and configures oxinoti"; + }; + }; + config = lib.mkIf (config.mods.oxi.oxinoti.enable && config.mods.oxi.enable) ( + lib.optionalAttrs (options ? xdg.configFile) { + programs.oxinoti.enable = true; + xdg.configFile."oxinoti/style.css" = { + text = + # css + '' + @import url("/home/dashie/.config/gtk-3.0/gtk.css"); + + @define-color bg #${scheme.base00}; + @define-color bghover #${scheme.base02}; + @define-color primary #${scheme.base0D}; + @define-color red #${scheme.base08}; + @define-color green #${scheme.base0B}; + + #MainWindow { + background-color: transparent; + padding: 0px; + /* opacity: 0; */ + } + + .MainBox { + background-color: transparent; + padding: 0px; + /* opacity: 0; */ + } + + .NotificationBox { + background-color: @bg; + border-radius: 5px; + border: solid 1px; + margin: 0px; + } + + .NotificationBox button { + background-color: @bg; + } + + .NotificationBox button:hover { + background-color: @bghover; + } + + .NotificationLow { + border-color: @green; + } + + .NotificationNormal { + border-color: @primary; + } + + .NotificationUrgent { + border-color: @red; + } + + .miscbox { + margin: 0px 10px 0px 0px; + } + + .bodybox {} + + .imagebox { + margin: 0px 0px 0px 10px; + } + + .appname { + font-size: 0.8rem; + } + + .timestamp { + font-size: 0.8rem; + } + + .summary { + font-size: 0.8rem; + } + + .body { + font-size: 1.2rem; + } + + .icon { + font-size: 2rem; + } + + .image {} + + .bold { + font-weight: bold; + } + + .italic { + font-style: italic; + } + + .underline { + text-decoration-line: underline; + } + ''; + }; + xdg.configFile."oxinoti/oxinoti.toml" = { + text = '' + timeout = 3 + dnd_override = 2 + ''; + }; + } + ); +} diff --git a/modules/programs/oxi/oxipaste.nix b/modules/programs/oxi/oxipaste.nix new file mode 100644 index 0000000..4ec7b1d --- /dev/null +++ b/modules/programs/oxi/oxipaste.nix @@ -0,0 +1,48 @@ +{ + lib, + config, + options, + ... +}: { + options.mods.oxi.oxipaste = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables and configures oxipaste"; + }; + }; + config = lib.mkIf (config.mods.oxi.oxipaste.enable && config.mods.oxi.enable) ( + lib.optionalAttrs (options ? xdg.configFile) { + programs.oxipaste.enable = true; + xdg.configFile."oxipaste/style.css" = { + text = '' + .main-window { + padding: 10px; + border-radius: 10px; + border: 2px solid #2AC3DE; + } + + .item-window { + padding: 10px; + border-radius: 10px; + border: 2px solid #C0CAF5; + } + + .item-button { + background-color: #1A1B26; + border-radius: 5px; + border: 1px solid #6D728D; + } + + .delete-button { + margin: 5px 25px 5px 5px; + } + + .item-box { + } + ''; + }; + } + ); +} diff --git a/modules/programs/oxi/oxirun.nix b/modules/programs/oxi/oxirun.nix new file mode 100644 index 0000000..55f4d75 --- /dev/null +++ b/modules/programs/oxi/oxirun.nix @@ -0,0 +1,20 @@ +{ + lib, + config, + options, + ... +}: { + options.mods.oxi.oxirun = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables OxiRun"; + }; + }; + config = lib.mkIf (config.mods.oxi.oxirun.enable && config.mods.oxi.enable) ( + lib.optionalAttrs (options ? xdg.configFile) { + programs.oxirun.enable = true; + } + ); +} diff --git a/modules/programs/oxi/oxishut.nix b/modules/programs/oxi/oxishut.nix new file mode 100644 index 0000000..25ebe0b --- /dev/null +++ b/modules/programs/oxi/oxishut.nix @@ -0,0 +1,42 @@ +{ + lib, + config, + options, + ... +}: { + options.mods.oxi.oxishut = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables and configures oxishut"; + }; + }; + config = lib.mkIf (config.mods.oxi.oxishut.enable && config.mods.oxi.enable) ( + lib.optionalAttrs (options ? xdg.configFile) { + programs.oxishut.enable = true; + xdg.configFile."oxishut/style.css" = { + text = '' + #mainwindow { + border-radius: 10px; + } + + .mainbox { + border-radius: 5px; + padding: 20px; + } + + .button { + margin: 5px; + background-color: #2b2c3b; + -gtk-icon-size: 5rem; + } + + .button:hover { + background-color: #3e4152; + } + ''; + }; + } + ); +} diff --git a/modules/programs/piper.nix b/modules/programs/piper.nix new file mode 100644 index 0000000..24beced --- /dev/null +++ b/modules/programs/piper.nix @@ -0,0 +1,20 @@ +{ + lib, + config, + options, + pkgs, + ... +}: { + options.mods.piper = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables the piper program and its daemon"; + }; + }; + config = lib.mkIf config.mods.piper.enable ( + lib.optionalAttrs (options ? services.ratbagd) {services.ratbagd.enable = true;} + // lib.optionalAttrs (options ? home.packages) {home.packages = with pkgs; [piper];} + ); +} diff --git a/modules/programs/plymouth.nix b/modules/programs/plymouth.nix new file mode 100644 index 0000000..af9c615 --- /dev/null +++ b/modules/programs/plymouth.nix @@ -0,0 +1,18 @@ +{ + lib, + config, + options, + ... +}: { + options.mods.plymouth = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables the plymouth"; + }; + }; + config = lib.mkIf config.mods.plymouth.enable ( + lib.optionalAttrs (options ? boot.plymouth) {boot.plymouth.enable = true;} + ); +} diff --git a/modules/programs/printing.nix b/modules/programs/printing.nix new file mode 100644 index 0000000..98bbe4f --- /dev/null +++ b/modules/programs/printing.nix @@ -0,0 +1,38 @@ +{ + lib, + config, + options, + pkgs, + ... +}: { + options.mods.printing = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables the piper program and its daemon"; + }; + }; + config = lib.mkIf config.mods.printing.enable ( + lib.optionalAttrs (options ? services.printing) { + # Enable CUPS to print documents. + environment.systemPackages = with pkgs; [ + simple-scan + ]; + hardware.sane.enable = true; + services = { + printing = { + enable = true; + browsing = true; + drivers = [pkgs.hplip]; + startWhenNeeded = true; # optional + }; + avahi = { + enable = true; + nssmdns4 = true; + openFirewall = true; + }; + }; + } + ); +} diff --git a/modules/programs/scripts.nix b/modules/programs/scripts.nix new file mode 100644 index 0000000..98eb26b --- /dev/null +++ b/modules/programs/scripts.nix @@ -0,0 +1,123 @@ +{ + lib, + config, + options, + pkgs, + ... +}: { + options.mods.scripts = { + changeBrightness = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables the change-brightness script"; + }; + audioControl = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables the audioControl script"; + }; + scripts = lib.mkOption { + default = []; + example = []; + description = "More scripts to be passed. (check existing ones for types and examples)"; + }; + }; + config = lib.optionalAttrs (options ? home.packages) { + home.packages = + [ + (lib.mkIf config.mods.scripts.changeBrightness ( + pkgs.writeShellScriptBin "changeBrightness" '' + brightnessctl set "$1" + CURRENT=$(brightnessctl -m -d intel_backlight | awk -F, '{print substr($4, 0, length($4)-1)}') + notify-send -a "changeBrightness" -r 3 -u low -i brightness-high -h int:value:"$CURRENT" "Brightness: ''${CURRENT}%" + '' + )) + (lib.mkIf config.mods.scripts.audioControl ( + pkgs.writeShellScriptBin "audioControl" '' + ncspot() { + NUM=$(pactl list clients short | rg "ncspot" | awk -F 'PipeWire' ' { print $1 } ' | tr -d ' \t\n') + CHANGE=$(pactl list sink-inputs short | rg "$NUM" | awk -F ' ' ' { print $1 }' | tr -d ' \t\n') + pactl set-sink-input-volume "$CHANGE" "$1" + VOLUME=$(pactl list sink-inputs | rg "$NUM" -A7 | rg "Volume:" | awk -F ' ' ' { print $5 }' | tr -d '%') + notify-send -a "ncspot" -r 990 -u low -i audio-volume-high -h int:progress:"$VOLUME" "Spotify Volume: ''${VOLUME}%" + } + + firefox() { + STRING=$(pactl list clients short | rg "firefox" | awk -F 'PipeWire' ' { print $1 "," } ' | tr -d ' \t\n') + # NUMS=',' read -r -a array <<< "$STRING" + readarray -td, NUMS <<<"$STRING" + declare -p NUMS + for index in "''${!NUMS[@]}"; do #"''${!array[@]}" + NUM=$(echo "''${NUMS[index]}" | tr -d ' \t\n') + CHANGE=$(pactl list sink-inputs short | rg "$NUM" | awk -F ' ' ' { print $1 }' | tr -d ' \t\n') + pactl set-sink-input-volume "$CHANGE" "$1" + done + VOLUME=$(pactl list sink-inputs | rg "''${NUMS[0]}" -A7 | rg "Volume:" | awk -F ' ' ' { print $5 }' | tr -d '%') + notify-send -a "Firefox" -r 991 -u low -i audio-volume-high -h int:progress:"$VOLUME" "Firefox Volume: ''${VOLUME}%" + } + + internal() { + SPEAKER=$(pactl list sinks | grep "Name" | grep "alsa" | awk -F ': ' '{ print $2 }') + if [ "$SPEAKER" != "" ]; then + pactl set-default-sink "$SPEAKER" + pactl set-sink-mute "$SPEAKER" false + DEVICE=$(echo "$SPEAKER" | awk -F '.' ' { print $4 } ') + notify-send "changed audio to "$DEVICE" " + else + notify-send "failed, not available!" + fi + } + + set_volume_sink() { + pactl set-sink-volume @DEFAULT_SINK@ "$1" + CURRENT=$(pactl get-sink-volume @DEFAULT_SINK@ | awk -F'/' '{ print $2 }' | tr -d ' %') + notify-send -a "System Volume" -r 1001 -u low -i audio-volume-high -h int:progress:"$CURRENT" "Output Volume: ''${CURRENT}%" + } + + set_volume_source() { + pactl set-source-volume @DEFAULT_SOURCE@ "$1" + CURRENT=$(pactl get-source-volume @DEFAULT_SOURCE@ | awk -F'/' '{ print $2 }' | tr -d ' %') + notify-send -a "System Volume" -r 1001 -u low -i audio-volume-high -h int:progress:"$CURRENT" "Input Volume: ''${CURRENT}%" + } + + bluetooth() { + SPEAKER=$(pactl list sinks | grep "Name" | grep "blue" | awk -F ': ' '{ print $2 }') + if [ "$SPEAKER" != "" ]; then + pactl set-default-sink "$SPEAKER" + pactl set-sink-mute "$SPEAKER" false + DEVICE=$(echo "$SPEAKER" | awk -F '.' ' { print $4 } ') + notify-send "changed audio to "$DEVICE" " + else + notify-send "failed, not available!" + fi + } + + mute() { + pactl set-sink-mute @DEFAULT_SINK@ toggle + MUTE=$(pactl get-sink-mute @DEFAULT_SINK@) + notify-send -a "Audio" -r 994 -u low -i audio-volume-high "Audio: $MUTE" + } + + if [ "$1" == "internal" ]; then + internal + elif [ "$1" == "bluetooth" ]; then + bluetooth + elif [ "$1" == "firefox" ]; then + firefox "$2" + elif [ "$1" == "ncspot" ]; then + ncspot "$2" + elif [ "$1" == "mute" ]; then + mute + elif [ "$1" == "sink" ]; then + set_volume_sink "$2" + elif [ "$1" == "source" ]; then + set_volume_source "$2" + fi + '' + )) + ] + ++ config.mods.scripts.scripts; + }; +} diff --git a/modules/programs/sddm.nix b/modules/programs/sddm.nix new file mode 100644 index 0000000..57328d4 --- /dev/null +++ b/modules/programs/sddm.nix @@ -0,0 +1,43 @@ +{ + lib, + options, + config, + ... +}: { + options.mods.sddm = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables the sddm displayManager"; + }; + useDefaultOptions = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Use default options provided by module. If disabled, will only apply extraOptions."; + }; + extraOptions = lib.mkOption { + default = {}; + example = { + wayland.enable = false; + }; + type = with lib.types; attrsOf anything; + description = "Extra options to be applied to the sddm config"; + }; + }; + + config = lib.mkIf config.mods.sddm.enable ( + lib.optionalAttrs (options ? services.displayManager.sddm) ( + { + services.displayManager.sddm.enable = true; + } + // lib.mkIf config.mods.sddm.useDefaultOptions { + services.displayManager.sddm.wayland.enable = true; + } + // { + services.displayManager.sddm = config.mods.sddm.extraOptions; + } + ) + ); +} diff --git a/modules/programs/sops.nix b/modules/programs/sops.nix new file mode 100644 index 0000000..5897eaa --- /dev/null +++ b/modules/programs/sops.nix @@ -0,0 +1,61 @@ +{ + lib, + pkgs, + config, + options, + root, + ... +}: { + options.mods.sops = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enable sops secrets"; + }; + secrets = lib.mkOption { + default = {}; + example = { + hub = {}; + lab = {}; + ${config.conf.username} = {}; + nextcloud = {}; + access = {}; + }; + type = with lib.types; attrsOf anything; + description = "secrets for sops"; + }; + sopsPath = lib.mkOption { + default = root + /secrets/secrets.yaml; + example = "/your/path"; + type = with lib.types; + oneOf [ + str + path + ]; + description = "sops secrets path"; + }; + validateSopsFile = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Whether to validate the sops file -> set this to false when using full paths"; + }; + }; + config = lib.mkIf config.mods.sops.enable ( + lib.optionalAttrs (options ? home.packages) { + home.packages = with pkgs; [sops]; + sops = { + gnupg = { + home = "~/.gnupg"; + sshKeyPaths = []; + }; + defaultSopsFile = config.mods.sops.sopsPath; + validateSopsFiles = config.mods.sops.validateSopsFile; + secrets = config.mods.sops.secrets; + }; + + systemd.user.services.mbsync.Unit.After = ["sops-nix.service"]; + } + ); +} diff --git a/modules/programs/starship.nix b/modules/programs/starship.nix new file mode 100644 index 0000000..de86504 --- /dev/null +++ b/modules/programs/starship.nix @@ -0,0 +1,175 @@ +{ + mkDashDefault, + lib, + config, + options, + pkgs, + inputs, + ... +}: { + options.mods = { + starship = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables starship prompt + ''; + }; + useDefaultPrompt = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = '' + Enables preconfigured prompt + ''; + }; + customPrompt = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = '' + Custom configuration for prompt. + Will be merged with preconfigured prompt if that is used. + ''; + }; + }; + }; + + # environment.systemPackages needed in order to configure systemwide + config = lib.mkIf config.mods.starship.enable ( + lib.optionalAttrs (options ? environment.systemPackages) { + programs.starship = let + base16 = pkgs.callPackage inputs.base16.lib {}; + scheme = base16.mkSchemeAttrs config.stylix.base16Scheme; + code_format = "[](bg:prev_bg fg:#5256c3)[ $symbol ($version)](bg:#5256c3)"; + in { + enable = true; + interactiveOnly = mkDashDefault true; + presets = lib.mkIf config.mods.starship.useDefaultPrompt ["pastel-powerline"]; + settings = + lib.mkIf config.mods.starship.useDefaultPrompt { + # derived from https://starship.rs/presets/pastel-powerline + format = "$username$directory$git_branch$git_status$git_metrics[ ](bg:none fg:prev_bg)"; + right_format = "$c$elixir$elm$golang$gradle$haskell$java$julia$nodejs$nim$rust$scala$python$ocaml$opa$perl$zig$dart$dotnet$nix_shell$shell$solidity[](bg:prev_bg fg:#3465A4)$time$os"; + username = { + show_always = false; + style_user = "bg:#5277C3 fg:#${scheme.base05}"; + style_root = "bg:#5277C3 fg:#${scheme.base05}"; + format = "[ $user ]($style)[](bg:#3465A4 fg:#5277C3)"; + disabled = false; + }; + os = { + symbols = { + NixOS = "  "; + }; + style = "bg:#3465A4 fg:#${scheme.base05}"; + disabled = false; + }; + directory = { + style = "bg:#3465A4 fg:#${scheme.base05}"; + format = "[ $path ]($style)"; + truncation_length = 3; + truncation_symbol = "…/"; + }; + git_branch = { + always_show_remote = true; + symbol = ""; + style = "bg:#5256c3 fg:#${scheme.base05}"; + format = "[ ](bg:#5256c3 fg:prev_bg)[$symbol ($remote_name )$branch ]($style)"; + }; + git_status = { + staged = "+\${count} (fg:#C4A000)"; + ahead = "⇡\${count} (fg:#C4A000)"; + diverged = "⇕⇡\${count} (fg:#C4A000)"; + behind = "⇣\${count} (fg:#C4A000)"; + stashed = " "; + untracked = "?\${count} (fg:#C4A000)"; + modified = "!\${count} (fg:#C4A000)"; + deleted = "✘\${count} (fg:#C4A000)"; + conflicted = "=\${count} (fg:#C4A000)"; + renamed = "»\${count} (fg:#C4A000)"; + style = "bg:#5256c3 fg:fg:#C4A000"; + format = "[$all_status$ahead_behind]($style)"; + }; + git_metrics = { + disabled = false; + format = "([| ](bg:#5256c3)[+$added]($added_style bg:#5256c3)[ -$deleted]($deleted_style bg:#5256c3))"; + }; + c = { + format = code_format; + }; + elixir = { + format = code_format; + }; + elm = { + format = code_format; + }; + golang = { + format = code_format; + }; + gradle = { + format = code_format; + }; + haskell = { + format = code_format; + }; + java = { + format = code_format; + }; + julia = { + format = code_format; + }; + nodejs = { + format = code_format; + }; + nim = { + format = code_format; + }; + nix_shell = { + symbol = ""; + format = code_format; + }; + rust = { + format = code_format; + }; + scala = { + format = code_format; + }; + typst = { + format = code_format; + }; + python = { + format = code_format; + }; + ocaml = { + format = code_format; + }; + opa = { + format = code_format; + }; + perl = { + format = code_format; + }; + zig = { + format = code_format; + }; + dart = { + format = code_format; + }; + dotnet = { + format = code_format; + }; + time = { + disabled = false; + time_format = "%R"; # Hour:Minute Format + style = "bg:#3465A4 fg:#${scheme.base05}"; + format = "[ $time ]($style)"; + }; + } + // config.mods.starship.customPrompt; + }; + } + ); +} diff --git a/modules/programs/streamcontroller.nix b/modules/programs/streamcontroller.nix new file mode 100644 index 0000000..544367f --- /dev/null +++ b/modules/programs/streamcontroller.nix @@ -0,0 +1,39 @@ +{ + lib, + config, + options, + ... +}: { + options.mods = { + streamcontroller = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = '' + Enables streamcontroller + ''; + }; + configFilePath = lib.mkOption { + default = null; + type = with lib.types; nullOr path; + description = '' + Path to the config json for the streamcontroller. + -> ./something.json + ''; + }; + }; + }; + + config = lib.mkIf config.mods.streamcontroller.enable ( + lib.optionalAttrs (options ? environment.systemPackages) { + programs.streamcontroller.enable = true; + } + // (lib.optionalAttrs (options ? home.file) { + home.file.".var/app/com.core447.StreamController/data/pages/defaultpage.json" = + lib.mkIf + (!isNull config.mods.streamcontroller.configFilePath) + {source = config.mods.streamcontroller.configFilePath;}; + }) + ); +} diff --git a/modules/programs/stylix.nix b/modules/programs/stylix.nix new file mode 100644 index 0000000..dd11e8c --- /dev/null +++ b/modules/programs/stylix.nix @@ -0,0 +1,131 @@ +{ + mkDashDefault, + lib, + config, + options, + unstable, + inputs, + pkgs, + ... +}: let + svg = ../../assets/rainbow.svg; + sd = lib.getExe pkgs.sd; + base16 = pkgs.callPackage inputs.base16.lib {}; + mkWallpaper = schemeStr: let + scheme = base16.mkSchemeAttrs schemeStr; + in + pkgs.runCommand "rainbow.png" {} '' + cat ${svg} \ + | ${sd} '#f9e2af' '#${scheme.base0A}' \ + | ${sd} '#fab387' '#${scheme.base09}' \ + | ${sd} '#f38ba8' '#${scheme.base08}' \ + | ${sd} '#89b4fa' '#${scheme.base0D}' \ + | ${sd} '#cba6f7' '#${scheme.base0E}' \ + | ${sd} '#a6e3a1' '#${scheme.base0B}' \ + | ${sd} '#1e1e2e' '#${scheme.base00}' \ + | ${lib.getExe pkgs.imagemagick} svg:- png:$out + ''; +in { + options.mods.stylix = { + colorscheme = lib.mkOption { + default = "catppuccin-mocha"; + example = { + # custom tokyo night + base00 = "1A1B26"; + base01 = "191a25"; + base02 = "2F3549"; + base03 = "444B6A"; + base04 = "787C99"; + base05 = "A9B1D6"; + base06 = "CBCCD1"; + base07 = "D5D6DB"; + base08 = "C0CAF5"; + base09 = "A9B1D7"; + base0A = "0DB9D7"; + base0B = "9ECE6A"; + base0C = "B4F9F8"; + base0D = "366fea"; + base0E = "BB9AF7"; + base0F = "F7768E"; + }; + type = with lib.types; + oneOf [ + str + attrs + path + ]; + description = '' + Base16 colorscheme. + Can be an attribute set with base00 to base0F, + a string that leads to a yaml file in base16-schemes path, + or a path to a custom yaml file. + + Also supports the oxiced theme in an oxiced attrset. + ''; + }; + cursor = lib.mkOption { + default = { + package = pkgs.bibata-cursors; + name = "Bibata-Modern-Classic"; + size = 24; + }; + example = {}; + type = with lib.types; attrsOf anything; + description = "Xcursor config"; + }; + fonts = lib.mkOption { + default = { + serif = { + package = unstable.adwaita-fonts; + name = "Adwaita Sans"; + }; + + sansSerif = { + package = unstable.adwaita-fonts; + name = "Adwaita Sans"; + }; + + monospace = { + package = unstable.nerd-fonts.jetbrains-mono; + name = "JetBrainsMono Nerd Font Mono"; + }; + + emoji = { + package = pkgs.noto-fonts-color-emoji; + name = "Noto Color Emoji"; + }; + }; + example = {}; + type = with lib.types; attrsOf anything; + description = "font config"; + }; + }; + config = let + scheme = + if builtins.isAttrs config.mods.stylix.colorscheme + then config.mods.stylix.colorscheme + else "${pkgs.base16-schemes}/share/themes/${config.mods.stylix.colorscheme}.yaml"; + in + (lib.optionalAttrs (options ? stylix) { + stylix = { + enable = true; + image = mkDashDefault (mkWallpaper scheme); + polarity = mkDashDefault "dark"; + targets = { + nixvim.enable = mkDashDefault false; + fish.enable = mkDashDefault false; + }; + fonts = config.mods.stylix.fonts; + cursor = config.mods.stylix.cursor; + base16Scheme = scheme; + }; + }) + // lib.optionalAttrs (options ? environment.systemPackages) { + environment.systemPackages = [ + config.mods.stylix.fonts.serif.package + config.mods.stylix.fonts.sansSerif.package + config.mods.stylix.fonts.monospace.package + config.mods.stylix.fonts.emoji.package + ]; + }; +} diff --git a/modules/programs/superfreq.nix b/modules/programs/superfreq.nix new file mode 100644 index 0000000..f031e2f --- /dev/null +++ b/modules/programs/superfreq.nix @@ -0,0 +1,28 @@ +{ + lib, + options, + config, + ... +}: { + options.mods.superfreq = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = ''Enables superfreq''; + }; + settings = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = ''Superfreq config''; + }; + }; + + config = lib.optionalAttrs (options ? services.superfreq) { + services.superfreq = { + enable = config.mods.superfreq.enable; + settings = config.mods.superfreq.settings; + }; + }; +} diff --git a/modules/programs/supersonic.nix b/modules/programs/supersonic.nix new file mode 100644 index 0000000..3b732df --- /dev/null +++ b/modules/programs/supersonic.nix @@ -0,0 +1,73 @@ +{ + lib, + config, + options, + pkgs, + inputs, + ... +}: let + base16 = pkgs.callPackage inputs.base16.lib {}; + scheme = base16.mkSchemeAttrs config.stylix.base16Scheme; +in { + options.mods.supersonic = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables and configures supersonic"; + }; + variant = lib.mkOption { + default = "wayland"; + example = "x11"; + type = lib.types.enum [ + "wayland" + "x11" + ]; + description = "The variant of supersonic"; + }; + }; + config = lib.mkIf config.mods.supersonic.enable ( + lib.optionalAttrs (options ? home.packages) { + home.packages = with pkgs; [ + ( + if config.mods.supersonic.variant == "wayland" + then supersonic-wayland + else supersonic + ) + ]; + xdg.configFile."supersonic/themes/custom.toml".source = + (pkgs.formats.toml {}).generate "customTheme" + { + SupersonicTheme = { + Name = "Custom"; + Version = "0.2"; + SupportsDark = true; + SupportsLight = true; + }; + + DarkColors = { + PageBackground = "#${scheme.base00}"; + ListHeader = "#${scheme.base02}"; + PageHeader = "#${scheme.base02}"; + Background = "#${scheme.base01}"; + ScrollBar = "#${scheme.base02}"; + Button = "#${scheme.base02}"; + Foreground = "#${scheme.base04}"; + InputBackground = "#${scheme.base02}"; + }; + + # just define the same as base 16 doesn't define if it is light or not + LightColors = { + PageBackground = "#${scheme.base00}"; + ListHeader = "#${scheme.base02}"; + PageHeader = "#${scheme.base02}"; + Background = "#${scheme.base01}"; + ScrollBar = "#${scheme.base02}"; + Button = "#${scheme.base02}"; + Foreground = "#${scheme.base04}"; + InputBackground = "#${scheme.base02}"; + }; + }; + } + ); +} diff --git a/modules/programs/sway.nix b/modules/programs/sway.nix new file mode 100644 index 0000000..eef6025 --- /dev/null +++ b/modules/programs/sway.nix @@ -0,0 +1,30 @@ +{ + lib, + config, + options, + ... +}: { + options.mods.sway = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables sway"; + }; + config = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = "sway config"; + }; + }; + config = lib.mkIf config.mods.sway.enable ( + lib.optionalAttrs (options ? wayland.windowManger.sway) { + wayland.windowManager.sway = + { + enable = true; + } + // config.mods.sway.config; + } + ); +} diff --git a/modules/programs/teams.nix b/modules/programs/teams.nix new file mode 100644 index 0000000..e9d843a --- /dev/null +++ b/modules/programs/teams.nix @@ -0,0 +1,38 @@ +{ + lib, + config, + options, + pkgs, + ... +}: let + callPackage = lib.callPackageWith pkgs; +in { + options.mods.teams = { + enable = lib.mkOption { + default = false; + example = true; + type = lib.types.bool; + description = "Enables teams via a chromium pwa (for the poor souls that have to use this for work)"; + }; + loopback = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables loopback for screensharing -> teams sucks :)"; + }; + }; + config = lib.mkIf config.mods.teams.enable ( + lib.optionalAttrs (options ? home.packages) { + home.packages = [(callPackage ../../override/teams.nix {inherit (pkgs) chromium;})]; + } + // (lib.optionalAttrs (options ? boot.kernelModules) { + boot = { + extraModulePackages = with config.boot.kernelPackages; [v4l2loopback]; + kernelModules = ["v4l2loopback"]; + extraModprobeConfig = '' + options v4l2loopback exclusive_caps=1 card_label="Virtual Camera" + ''; + }; + }) + ); +} diff --git a/modules/programs/virtmanager.nix b/modules/programs/virtmanager.nix new file mode 100644 index 0000000..de38848 --- /dev/null +++ b/modules/programs/virtmanager.nix @@ -0,0 +1,67 @@ +{ + mkDashDefault, + lib, + config, + options, + pkgs, + ... +}: let + module = + if config.conf.cpu == "intel" + then "kvm-intel" + else if config.conf.cpu == "amd" + then "kvm-amd" + else ""; +in { + options.mods = { + virtmanager.enable = lib.mkOption { + default = false; + type = lib.types.bool; + example = true; + description = '' + + + Enables virt-manager kvm. + ''; + }; + }; + + config = + lib.optionalAttrs (options ? virtualisation.libvirtd) { + boot.kernelModules = [ + module + ]; + programs.virt-manager.enable = true; + environment.systemPackages = with pkgs; [ + spice + spice-gtk + spice-protocol + virt-viewer + ]; + virtualisation = { + libvirtd = { + enable = true; + qemu = { + package = mkDashDefault pkgs.qemu_kvm; + swtpm.enable = mkDashDefault true; + }; + }; + spiceUSBRedirection.enable = mkDashDefault true; + }; + services.spice-vdagentd.enable = mkDashDefault true; + + users.users.${config.conf.username}.extraGroups = [ + "libvirtd" + "kvm" + "qemu-libvirtd" + ]; + } + // lib.optionalAttrs (options ? dconf.settings) { + dconf.settings = { + "org/virt-manager/virt-manager/connections" = { + autoconnect = ["qemu:///system"]; + uris = ["qemu:///system"]; + }; + }; + }; +} diff --git a/modules/programs/wm.nix b/modules/programs/wm.nix new file mode 100644 index 0000000..0f794d3 --- /dev/null +++ b/modules/programs/wm.nix @@ -0,0 +1,403 @@ +{lib, ...}: let + wmWorkspace = with lib.types; { + options = { + name = lib.mkOption { + default = ""; + example = "1"; + type = str; + description = "Name of the workspace"; + }; + default = lib.mkOption { + default = false; + example = true; + type = bool; + description = "Whether the workspace is the default workspace. (Currently doesn't do anything on niri)"; + }; + monitor = lib.mkOption { + default = ""; + example = "DP-1"; + type = str; + description = "Name of the monitor to bind the workspace to"; + }; + }; + }; + + wmOptions = with lib.types; { + options = { + name = lib.mkOption { + default = "DP-1"; + example = "DP-1"; + type = str; + description = "Name of the monitor"; + }; + resolutionX = lib.mkOption { + default = 1920; + example = 2560; + type = number; + description = "ResolutionX of the monitor"; + }; + resolutionY = lib.mkOption { + default = 1080; + example = 1440; + type = number; + description = "ResolutionY of the monitor"; + }; + refreshrate = lib.mkOption { + default = 60; + example = 144; + type = number; + description = "Refreshrate of the monitor"; + }; + positionX = lib.mkOption { + default = 0; + example = 1920; + type = number; + description = "PositionX of the monitor"; + }; + positionY = lib.mkOption { + default = 0; + example = 1080; + type = number; + description = "PositionY of the monitor"; + }; + scale = lib.mkOption { + default = 1; + example = 2; + type = number; + description = "Scale of the monitor"; + }; + transform = lib.mkOption { + default = "0"; + example = "90"; + type = enum ["0" "90" "180" "270" "360"]; + description = "Transform of the monitor"; + }; + vrr = lib.mkOption { + default = false; + example = true; + type = bool; + description = "VRR status of the monitor"; + }; + }; + }; + + modKeys = lib.types.enum ["Mod" "Super" "Alt" "Shift" "Ctrl"]; + + customCommand = with lib.types; { + options = { + niri = lib.mkOption { + default = null; + example = "kitty"; + type = either null str; + description = "Command to use in niri"; + }; + hyprland = lib.mkOption { + default = null; + example = "kitty"; + type = either null str; + description = "Command to use in hyprland"; + }; + }; + }; + + envOptions = with lib.types; { + options = { + all = lib.mkOption { + default = {}; + example = {}; + type = attrsOf str; + description = "General Env"; + }; + niri = lib.mkOption { + default = {}; + example = {}; + type = attrsOf str; + description = "Niri Env"; + }; + hyprland = lib.mkOption { + default = {}; + example = {}; + type = attrsOf str; + description = "Hyprland Env"; + }; + }; + }; + + startupOptions = with lib.types; { + options = { + all = lib.mkOption { + default = []; + example = []; + type = listOf str; + description = "General Startup commands"; + }; + niri = lib.mkOption { + default = []; + example = []; + type = listOf str; + description = "Niri Startup commands"; + }; + hyprland = lib.mkOption { + default = []; + example = []; + type = listOf str; + description = "Hyprland Startup commands"; + }; + }; + }; + + windowRuleOptions = with lib.types; { + options = { + niri = lib.mkOption { + default = []; + example = []; + type = listOf lines; + description = "Niri window rules"; + }; + hyprland = lib.mkOption { + default = []; + example = []; + type = listOf str; + description = "Hyprland window rules"; + }; + }; + }; + + bindOptions = with lib.types; { + options = { + modKeys = lib.mkOption { + default = []; + example = ["Mod"]; + type = listOf modKeys; + description = "List of modifier keys"; + }; + key = lib.mkOption { + default = ""; + example = "Q"; + type = str; + description = "Key to bind"; + }; + command = lib.mkOption { + default = ""; + example = "killActive"; + type = either (submodule customCommand) (enum [ + "spawn" + "spawn-sh" + "quit" + "killActive" + "moveFocusUp" + "moveFocusRight" + "moveFocusDown" + "moveFocusLeft" + "moveWindowUp" + "moveWindowRight" + "moveWindowDown" + "moveWindowLeft" + "focusWorkspace" + "moveToWorkspace" + "toggleFloating" + "toggleFullscreen" + ]); + description = "Command to execute"; + }; + args = lib.mkOption { + default = []; + example = []; + type = listOf str; + description = "Additional arguments for the command"; + }; + meta = lib.mkOption { + default = {}; + example = {}; + type = submodule { + options = { + niri = lib.mkOption { + default = {}; + type = submodule { + options = { + desc = lib.mkOption { + default = ""; + type = str; + description = "Description for Hotkey overview"; + }; + repeat = lib.mkOption { + type = bool; + default = true; + description = "Whether to repeat the keybind on hold"; + }; + allowInhibit = lib.mkOption { + type = bool; + default = true; + description = "Whether to allow inhibiting"; + }; + allowWhileLocked = lib.mkOption { + type = bool; + default = false; + description = "Whether to allow while locked"; + }; + cooldown = lib.mkOption { + type = number; + default = 0; + description = "Cooldown on bind"; + }; + }; + }; + description = "Niri meta for keybinds"; + }; + hyprland = lib.mkOption { + default = {}; + type = submodule { + options = { + repeat = lib.mkOption { + type = bool; + default = true; + description = "Whether to repeat the keybind on hold"; + }; + }; + }; + description = "Niri meta for keybinds"; + }; + }; + }; + description = "Custom metadata per bind. Note, only supported environments are taken into account."; + }; + }; + }; +in { + options.mods.wm = { + modKey = lib.mkOption { + default = "Super"; + example = "Alt"; + type = modKeys; + description = "Mod key"; + }; + + env = lib.mkOption { + default = {}; + example = { + all = { + EDITOR = "Neovim"; + }; + niri = { + EDITOR = "Emacs"; + }; + }; + type = with lib.types; either (submodule envOptions) (attrsOf str); + description = "Environment configuration"; + }; + + useDefaultEnv = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Whether to use default env variables"; + }; + + startup = lib.mkOption { + default = []; + example = { + all = ["oxinoti"]; + niri = ["someniricommand"]; + hyprland = ["somehyprlandcommand"]; + }; + type = with lib.types; either (submodule startupOptions) (listOf str); + description = "Start commands"; + }; + + useDefaultStartup = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Whether to use default autostart commands"; + }; + + useDefaultWindowRules = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Whether to use default window rules"; + }; + + windowRules = lib.mkOption { + default = {}; + example = { + niri = [ + '' + match app-id=r#"^org\.keepassxc\.KeePassXC$"# + match app-id=r#"^org\.gnome\.World\.Secrets$"# + + block-out-from "screen-capture" + '' + '' + match app-id=r#"^steam$"# + open-on-workspace "0" + '' + ]; + }; + type = lib.types.submodule windowRuleOptions; + description = "Window rules"; + }; + + workspaces = lib.mkOption { + default = []; + example = [ + { + name = "chat"; + monitor = "DP-1"; + } + ]; + type = + lib.types.listOf (lib.types.submodule wmWorkspace); + description = "Workspace configuration"; + }; + + monitors = lib.mkOption { + default = []; + example = [ + { + name = "DP-1"; + resolutionX = 1920; + resolutionY = 1080; + refreshrate = 144; + positionX = 0; + positionY = 0; + scale = 1; + transform = "0"; + vrr = false; + } + ]; + type = + lib.types.listOf (lib.types.submodule wmOptions); + description = "Monitor configuration"; + }; + + useDefaultBinds = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Whether to use default keybinds"; + }; + + binds = lib.mkOption { + default = []; + example = [ + { + modKeys = ["Mod"]; + key = "Q"; + command = "killActive"; + args = []; + meta = { + niri = { + desc = "Kill the active window"; + repeat = false; + }; + hyprland = {}; + }; + } + ]; + type = + lib.types.listOf (lib.types.submodule bindOptions); + description = "Bind configuration"; + }; + }; +} diff --git a/modules/programs/xkb.nix b/modules/programs/xkb.nix new file mode 100644 index 0000000..ebb1bda --- /dev/null +++ b/modules/programs/xkb.nix @@ -0,0 +1,28 @@ +{ + lib, + options, + config, + ... +}: { + options.mods.xkb = { + layout = lib.mkOption { + default = "enIntUmlaut"; + example = "us"; + type = lib.types.str; + description = "Your layout"; + }; + variant = lib.mkOption { + default = ""; + example = ""; + type = lib.types.str; + description = "Your variant"; + }; + }; + config = lib.optionalAttrs (options ? services.xserver) { + # Configure keymap in X11 + services.xserver = { + xkb.layout = "${config.mods.xkb.layout}"; + xkb.variant = "${config.mods.xkb.variant}"; + }; + }; +} diff --git a/modules/programs/xone.nix b/modules/programs/xone.nix new file mode 100644 index 0000000..84ecd48 --- /dev/null +++ b/modules/programs/xone.nix @@ -0,0 +1,19 @@ +{ + lib, + config, + options, + ... +}: { + options.mods = { + xone.enable = lib.mkOption { + default = false; + type = lib.types.bool; + example = true; + description = '' + Enables the xone driver for xbox controllers. + ''; + }; + }; + + config = lib.optionalAttrs (options ? hardware) {hardware.xone.enable = config.mods.xone.enable;}; +} diff --git a/modules/programs/yazi/default.nix b/modules/programs/yazi/default.nix new file mode 100644 index 0000000..d890a81 --- /dev/null +++ b/modules/programs/yazi/default.nix @@ -0,0 +1,62 @@ +{ + pkgs, + lib, + config, + options, + ... +}: { + options.mods.yazi = { + enable = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Enables yazi"; + }; + useDefaultConfig = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Use default yazi config (if disabled only additionalConfig is used)"; + }; + additionalConfig = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = "Additional config for yazi"; + }; + useDefaultKeymap = lib.mkOption { + default = true; + example = false; + type = lib.types.bool; + description = "Use default yazi keymap (if disabled only additionalKeymap is used)"; + }; + additionalKeymap = lib.mkOption { + default = {}; + example = {}; + type = with lib.types; attrsOf anything; + description = "Additional keymap for yazi"; + }; + plugins = lib.mkOption { + default = { + inherit (pkgs.yaziPlugins) piper diff gitui wl-clipboard; + }; + example = {}; + type = with lib.types; attrsOf anything; + description = "Additional keymap for yazi"; + }; + }; + config = let + conf = import ./yazi.nix; + in + lib.optionalAttrs (options ? home.packages) ( + lib.mkIf config.mods.yazi.enable { + home.packages = [pkgs.glow]; + programs.yazi = { + inherit (conf) enable; + settings = conf.settings // config.mods.yazi.additionalKeymap; + keymap = conf.keymap // config.mods.yazi.additionalConfig; + inherit (config.mods.yazi) plugins; + }; + } + ); +} diff --git a/modules/programs/yazi/yazi.nix b/modules/programs/yazi/yazi.nix new file mode 100644 index 0000000..22e3169 --- /dev/null +++ b/modules/programs/yazi/yazi.nix @@ -0,0 +1,1016 @@ +{ + # don't ask.... + enable = true; + settings = { + log = { + enabled = false; + }; + opener = { + folder = [ + { + run = ''open - R "$@"''; + orphan = true; + display_name = "Reveal in Finder"; + } + { + run = ''$EDITOR "$@"''; + orphan = true; + } + ]; + archive = [ + { + run = ''unar "$1"''; + display_name = "Extract here"; + } + ]; + text = [ + { + run = ''$EDITOR "$@"''; + orphan = true; + } + ]; + image = [ + { + run = ''eog "$@"''; + orphan = true; + display_name = "Open"; + } + { + run = ''exiftool "$1"; echo "Press enter to exit"; read''; + block = true; + display_name = "Show EXIF"; + } + ]; + pdf = [ + { + run = ''zathura "$@"''; + orphan = true; + display_name = "Open"; + } + ]; + video = [ + { + run = ''mpv "$@"''; + orphan = true; + } + { + run = ''mediainfo "$1"; echo "Press enter to exit"; read''; + block = true; + display_name = "Show media info"; + } + ]; + audio = [ + { + run = ''xdg-open "$@"''; + orphan = true; + } + { + run = ''mediainfo "$1"; echo "Press enter to exit"; read''; + block = true; + display_name = "Show media info"; + } + ]; + fallback = [ + { + run = ''xdg-open "$@"''; + orphan = true; + display_name = "Open"; + } + { + run = ''xdg-open - R "$@"''; + orphan = true; + display_name = "Reveal in Finder"; + } + ]; + }; + plugin = { + prepend_previewers = [ + { + name = "*.tar"; + run = ''piper --format=url -- tar tf "$1"''; + } + { + name = "*.md"; + run = ''piper -- CLICOLOR_FORCE=1 glow -w=$w -s=dark "$1"''; + } + { + mime = "text/csv"; + run = ''piper -- bat -p --color=always "$1"''; + } + ]; + }; + }; + keymap = { + mgr.keymap = [ + { + on = ""; + run = "backspace"; + desc = "Delete the character before the cursor"; + } + { + on = [""]; + run = "escape"; + desc = "Exit visual mode clear selected or cancel search"; + } + { + on = ["q"]; + run = "quit"; + desc = "Exit the process"; + } + { + on = ["Q"]; + run = "quit --no-cwd-file"; + desc = "Exit the process without writing cwd-file"; + } + { + on = [""]; + run = "close"; + desc = "Close the current tab or quit if it is last tab"; + } + { + on = [""]; + run = "suspend"; + desc = "Suspend the process"; + } + + # Navigation + { + on = ["l"]; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = ["k"]; + run = "arrow 1"; + desc = "Move cursor down"; + } + + { + on = ["L"]; + run = "arrow -5"; + desc = "Move cursor up 5 lines"; + } + { + on = ["K"]; + run = "arrow 5"; + desc = "Move cursor down 5 lines"; + } + + { + on = [""]; + run = "arrow -50%"; + desc = "Move cursor up half page"; + } + { + on = [""]; + run = "arrow 50%"; + desc = "Move cursor down half page"; + } + { + on = [""]; + run = "arrow -100%"; + desc = "Move cursor up one page"; + } + { + on = [""]; + run = "arrow 100%"; + desc = "Move cursor down one page"; + } + + { + on = ["j"]; + run = "leave"; + desc = "Go back to the parent directory"; + } + { + on = [";"]; + run = "enter"; + desc = "Enter the child directory"; + } + + { + on = ["J"]; + run = "back"; + desc = "Go back to the previous directory"; + } + { + on = ["P"]; + run = "forward"; + desc = "Go forward to the next directory"; + } + + { + on = [""]; + run = "peek -5"; + desc = "Peek up 5 units in the preview"; + } + { + on = [""]; + run = "peek 5"; + desc = "Peek down 5 units in the preview"; + } + + { + on = [""]; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = [""]; + run = "arrow 1"; + desc = "Move cursor down"; + } + { + on = [""]; + run = "leave"; + desc = "Go back to the parent directory"; + } + { + on = [""]; + run = "enter"; + desc = "Enter the child directory"; + } + + { + on = [ + "g" + "g" + ]; + run = "arrow -99999999"; + desc = "Move cursor to the top"; + } + { + on = ["G"]; + run = "arrow 99999999"; + desc = "Move cursor to the bottom"; + } + + # Selection + { + on = ["v"]; + run = "visual_mode"; + desc = "Enter visual mode (selection mode)"; + } + { + on = ["V"]; + run = "visual_mode --unset"; + desc = "Enter visual mode (unset mode)"; + } + { + on = [""]; + run = "select_all --state=true"; + desc = "Select all files"; + } + { + on = [""]; + run = "select_all --state=none"; + desc = "Inverse selection of all files"; + } + + # Operation + { + on = ["o"]; + run = "open"; + desc = "Open the selected files"; + } + { + on = ["O"]; + run = "open --interactive"; + desc = "Open the selected files interactively"; + } + { + on = [""]; + run = "open"; + desc = "Open the selected files"; + } + { + on = [""]; + run = "open --interactive"; + desc = "Open the selected files interactively"; + } # It's cool if you're using a terminal that supports CSI u + { + on = ["y"]; + run = "yank"; + desc = "Copy the selected files"; + } + { + on = ["x"]; + run = "yank --cut"; + desc = "Cut the selected files"; + } + { + on = ["p"]; + run = "paste"; + desc = "Paste the files"; + } + { + on = ["P"]; + run = "paste --force"; + desc = "Paste the files (overwrite if the destination exists)"; + } + { + on = ["-"]; + run = "link"; + desc = "Symlink the absolute path of files"; + } + { + on = ["_"]; + run = "link --relative"; + desc = "Symlink the relative path of files"; + } + { + on = ["d"]; + run = "remove"; + desc = "Move the files to the trash"; + } + { + on = ["D"]; + run = "remove --permanently"; + desc = "Permanently delete the files"; + } + { + on = ["a"]; + run = "create"; + desc = "Create a file or directory (ends with / for directories)"; + } + { + on = ["r"]; + run = "rename"; + desc = "Rename a file or directory"; + } + { + on = [";"]; + run = "shell"; + desc = "Run a shell command"; + } + { + on = [":"]; + run = "shell --block"; + desc = "Run a shell command (block the UI until the command finishes)"; + } + { + on = ["."]; + run = "hidden toggle"; + desc = "Toggle the visibility of hidden files"; + } + { + on = [ + "" + "f" + "g>" + ]; + run = "search fd"; + desc = "Search files by name using fd"; + } + { + on = [ + "" + "f" + "G>" + ]; + run = "search rg"; + desc = "Search files by content using ripgrep"; + } + { + on = [""]; + run = "search none"; + desc = "Cancel the ongoing search"; + } + { + on = ["Z"]; + run = "plugin zoxide"; + desc = "Jump to a directory using zoxide"; + } + { + on = ["z"]; + run = "plugin fzf"; + desc = "Jump to a directory or reveal a file using fzf"; + } + + # Copy + { + on = [ + "c" + "c" + ]; + run = "copy path"; + desc = "Copy the absolute path"; + } + { + on = [ + "c" + "d" + ]; + run = "copy dirname"; + desc = "Copy the path of the parent directory"; + } + { + on = [ + "c" + "f" + ]; + run = "copy filename"; + desc = "Copy the name of the file"; + } + { + on = [ + "c" + "n" + ]; + run = "copy name_without_ext"; + desc = "Copy the name of the file without the extension"; + } + + # Find + { + on = ["/"]; + run = "find --smart"; + } + { + on = ["?"]; + run = "find --previous --smart"; + } + { + on = ["n"]; + run = "find_arrow"; + } + { + on = ["N"]; + run = "find_arrow --previous"; + } + + # Sorting + { + on = [ + "," + "a" + ]; + run = "sort alphabetical --dir_first"; + desc = "Sort alphabetically"; + } + { + on = [ + "," + "A" + ]; + run = "sort alphabetical --reverse --dir_first"; + desc = "Sort alphabetically (reverse)"; + } + { + on = [ + "," + "c" + ]; + run = "sort created --dir_first"; + desc = "Sort by creation time"; + } + { + on = [ + "," + "C" + ]; + run = "sort created --reverse --dir_first"; + desc = "Sort by creation time (reverse)"; + } + { + on = [ + "," + "m" + ]; + run = "sort modified --dir_first"; + desc = "Sort by modified time"; + } + { + on = [ + "," + "M" + ]; + run = "sort modified --reverse --dir_first"; + desc = "Sort by modified time (reverse)"; + } + { + on = [ + "," + "n" + ]; + run = "sort natural --dir_first"; + desc = "Sort naturally"; + } + { + on = [ + "," + "N" + ]; + run = "sort natural --reverse --dir_first"; + desc = "Sort naturally (reverse)"; + } + { + on = [ + "," + "s" + ]; + run = "sort size --dir_first"; + desc = "Sort by size"; + } + { + on = [ + "," + "S" + ]; + run = "sort size --reverse --dir_first"; + desc = "Sort by size (reverse)"; + } + + # Tabs + { + on = ["t"]; + run = "tab_create --current"; + desc = "Create a new tab using the current path"; + } + + { + on = ["1"]; + run = "tab_switch 0"; + desc = "Switch to the first tab"; + } + { + on = ["2"]; + run = "tab_switch 1"; + desc = "Switch to the second tab"; + } + { + on = ["3"]; + run = "tab_switch 2"; + desc = "Switch to the third tab"; + } + { + on = ["4"]; + run = "tab_switch 3"; + desc = "Switch to the fourth tab"; + } + { + on = ["5"]; + run = "tab_switch 4"; + desc = "Switch to the fifth tab"; + } + { + on = ["6"]; + run = "tab_switch 5"; + desc = "Switch to the sixth tab"; + } + { + on = ["7"]; + run = "tab_switch 6"; + desc = "Switch to the seventh tab"; + } + { + on = ["8"]; + run = "tab_switch 7"; + desc = "Switch to the eighth tab"; + } + { + on = ["9"]; + run = "tab_switch 8"; + desc = "Switch to the ninth tab"; + } + + { + on = ["["]; + run = "tab_switch -1 --relative"; + desc = "Switch to the previous tab"; + } + { + on = ["]"]; + run = "tab_switch 1 --relative"; + desc = "Switch to the next tab"; + } + + { + on = ["{"]; + run = "tab_swap -1"; + desc = "Swap the current tab with the previous tab"; + } + { + on = ["}"]; + run = "tab_swap 1"; + desc = "Swap the current tab with the next tab"; + } + + # Tasks + { + on = ["w"]; + run = "tasks_show"; + desc = "Show the tasks manager"; + } + + # Goto + { + on = [ + "g" + "h" + ]; + run = "cd ~"; + desc = "Go to the home directory"; + } + { + on = [ + "g" + "c" + ]; + run = "cd ~/.config"; + desc = "Go to the config directory"; + } + { + on = [ + "g" + "d" + ]; + run = "cd ~/Downloads"; + desc = "Go to the downloads directory"; + } + { + on = [ + "g" + "t" + ]; + run = "cd /tmp"; + desc = "Go to the temporary directory"; + } + { + on = [ + "g" + "" + ]; + run = "cd --interactive"; + desc = "Go to a directory interactively"; + } + + # Help + { + on = ["~"]; + run = "help"; + desc = "Open help"; + } + ]; + + tasks.keymap = [ + { + on = [""]; + run = "close"; + desc = "Hide the task manager"; + } + { + on = [""]; + run = "close"; + desc = "Hide the task manager"; + } + { + on = ["w"]; + run = "close"; + desc = "Hide the task manager"; + } + + { + on = ["k"]; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = ["j"]; + run = "arrow 1"; + desc = "Move cursor down"; + } + + { + on = [""]; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = [""]; + run = "arrow 1"; + desc = "Move cursor down"; + } + + { + on = [""]; + run = "inspect"; + desc = "Inspect the task"; + } + { + on = ["x"]; + run = "cancel"; + desc = "Cancel the task"; + } + + { + on = ["~"]; + run = "help"; + desc = "Open help"; + } + ]; + + select.keymap = [ + { + on = [""]; + run = "close"; + desc = "Cancel selection"; + } + { + on = [""]; + run = "close"; + desc = "Cancel selection"; + } + { + on = [""]; + run = "close --submit"; + desc = "Submit the selection"; + } + + { + on = ["k"]; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = ["j"]; + run = "arrow 1"; + desc = "Move cursor down"; + } + + { + on = ["K"]; + run = "arrow -5"; + desc = "Move cursor up 5 lines"; + } + { + on = ["J"]; + run = "arrow 5"; + desc = "Move cursor down 5 lines"; + } + + { + on = [""]; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = [""]; + run = "arrow 1"; + desc = "Move cursor down"; + } + + { + on = ["~"]; + run = "help"; + desc = "Open help"; + } + ]; + + input.keymap = [ + { + on = ""; + run = "backspace"; + desc = "Delete the character before the cursor"; + } + { + on = [""]; + run = "close"; + desc = "Cancel input"; + } + { + on = [""]; + run = "close --submit"; + desc = "Submit the input"; + } + { + on = [""]; + run = "escape"; + desc = "Go back the normal mode or cancel input"; + } + + # Mode + { + on = ["i"]; + run = "insert"; + desc = "Enter insert mode"; + } + { + on = ["a"]; + run = "insert --append"; + desc = "Enter append mode"; + } + { + on = ["v"]; + run = "visual"; + desc = "Enter visual mode"; + } + { + on = ["V"]; + run = [ + "move -999" + "visual" + "move 999" + ]; + desc = "Enter visual mode and select all"; + } + + # Navigation + { + on = ["h"]; + run = "move -1"; + desc = "Move cursor left"; + } + { + on = ["l"]; + run = "move 1"; + desc = "Move cursor right"; + } + + { + on = ["0"]; + run = "move -999"; + desc = "Move to the BOL"; + } + { + on = ["$"]; + run = "move 999"; + desc = "Move to the EOL"; + } + { + on = ["I"]; + run = [ + "move -999" + "insert" + ]; + desc = "Move to the BOL and enter insert mode"; + } + { + on = ["A"]; + run = [ + "move 999" + "insert --append" + ]; + desc = "Move to the EOL and enter append mode"; + } + + { + on = [""]; + run = "move -1"; + desc = "Move cursor left"; + } + { + on = [""]; + run = "move 1"; + desc = "Move cursor right"; + } + + { + on = ["b"]; + run = "backward"; + desc = "Move to the beginning of the previous word"; + } + { + on = ["w"]; + run = "forward"; + desc = "Move to the beginning of the next word"; + } + { + on = ["e"]; + run = "forward --end-of-word"; + desc = "Move to the end of the next word"; + } + + # Deletion + { + on = ["d"]; + run = "delete --cut"; + desc = "Cut the selected characters"; + } + { + on = ["D"]; + run = [ + "delete --cut" + "move 999" + ]; + desc = "Cut until the EOL"; + } + { + on = ["c"]; + run = "delete --cut --insert"; + desc = "Cut the selected characters and enter insert mode"; + } + { + on = ["C"]; + run = [ + "delete --cut --insert" + "move 999" + ]; + desc = "Cut until the EOL and enter insert mode"; + } + { + on = ["x"]; + run = [ + "delete --cut" + "move 1 --in-operating" + ]; + desc = "Cut the current character"; + } + + # Yank/Paste + { + on = ["y"]; + run = "yank"; + desc = "Copy the selected characters"; + } + { + on = ["p"]; + run = "paste"; + desc = "Paste the copied characters after the cursor"; + } + { + on = ["P"]; + run = "paste --before"; + desc = "Paste the copied characters before the cursor"; + } + + # Undo/Redo + { + on = ["u"]; + run = "undo"; + desc = "Undo the last operation"; + } + { + on = [""]; + run = "redo"; + desc = "Redo the last operation"; + } + + # Help + { + on = ["~"]; + run = "help"; + desc = "Open help"; + } + ]; + + help.keymap = [ + { + on = [""]; + run = "escape"; + desc = "Clear the filter or hide the help"; + } + { + on = ["q"]; + run = "close"; + desc = "Exit the process"; + } + { + on = [""]; + run = "close"; + desc = "Hide the help"; + } + + # Navigation + { + on = ["k"]; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = ["j"]; + run = "arrow 1"; + desc = "Move cursor down"; + } + + { + on = ["K"]; + run = "arrow -5"; + desc = "Move cursor up 5 lines"; + } + { + on = ["J"]; + run = "arrow 5"; + desc = "Move cursor down 5 lines"; + } + + { + on = [""]; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = [""]; + run = "arrow 1"; + desc = "Move cursor down"; + } + + # Filtering + { + on = ["/"]; + run = "filter"; + desc = "Apply a filter for the help items"; + } + ]; + }; +} diff --git a/nix/.sops.yaml b/nix/.sops.yaml deleted file mode 100644 index 57234fa..0000000 --- a/nix/.sops.yaml +++ /dev/null @@ -1,7 +0,0 @@ -keys: - - &dashie 92D29D420B5D95FCA46A12FE778CFA7A623614F3 -creation_rules: - - path_regex: secrets/[^/]+\.(yaml|json|env|ini)$ - key_groups: - - pgp: - - *dashie diff --git a/nix/base/base_packages.nix b/nix/base/base_packages.nix deleted file mode 100644 index 4175297..0000000 --- a/nix/base/base_packages.nix +++ /dev/null @@ -1,82 +0,0 @@ -{ pkgs, config, ... }: -{ - imports = [ - # is wrapped in if statement to enable when needed - ../programs/gaming/default.nix - ../programs/themes/stylix.nix - ]; - - environment.systemPackages = with pkgs; [ - openssl - dbus - glib - gtk4 - gtk3 - libadwaita - gtk-layer-shell - gtk4-layer-shell - direnv - dconf - gsettings-desktop-schemas - gnome.nixos-gsettings-overrides - bibata-cursors - xorg.xkbutils - libxkbcommon - icon-library - adwaita-icon-theme - hicolor-icon-theme - morewaita-icon-theme - kdePackages.breeze-icons - seahorse - upower - (lib.mkIf config.conf.streamdeck.enable (callPackage - ../override/streamdeck.nix - { })) - ]; - - gtk.iconCache.enable = false; - - fonts.packages = with pkgs; [ - cantarell-fonts - ]; - - nix.settings.experimental-features = "nix-command flakes"; - - virtualisation.docker.enable = true; - - services.upower.enable = true; - services.printing.enable = true; - services.dbus.enable = true; - services.dbus.packages = with pkgs; [ - gnome2.GConf - ]; - services.avahi = { - enable = true; - nssmdns4 = true; - openFirewall = true; - }; - - programs.fish.enable = true; - programs.fish.promptInit = '' - ${pkgs.any-nix-shell}/bin/any-nix-shell fish --info-right | source - ''; - programs.nix-ld.enable = true; - programs.nix-ld.libraries = with pkgs; [ - jdk - zlib - ]; - programs.dconf.enable = true; - programs.direnv = { - package = pkgs.direnv; - silent = false; - loadInNixShell = true; - direnvrcExtra = ""; - nix-direnv = { - enable = true; - package = pkgs.nix-direnv; - }; - }; - programs.ssh.startAgent = true; - programs.gnupg.agent.enable = true; - -} diff --git a/nix/base/big_g.nix b/nix/base/big_g.nix deleted file mode 100644 index 0b1fe1d..0000000 --- a/nix/base/big_g.nix +++ /dev/null @@ -1,12 +0,0 @@ -{ pkgs, ... }: { - services = { - # needed for GNOME services outside of GNOME Desktop - dbus.packages = with pkgs; [ - gcr - gnome.gnome-settings-daemon - ]; - - gnome.gnome-keyring.enable = true; - gvfs.enable = true; - }; -} diff --git a/nix/base/common_hardware.nix b/nix/base/common_hardware.nix deleted file mode 100644 index 2cd48a9..0000000 --- a/nix/base/common_hardware.nix +++ /dev/null @@ -1,124 +0,0 @@ -{ pkgs, config, lib, modulesPath, ... }: -let - username = config.conf.username; -in -{ - imports = [ - (modulesPath + "/installer/scan/not-detected.nix") - ]; - # Bootloader. - boot.loader.systemd-boot.enable = true; - boot.loader.efi.canTouchEfiVariables = true; - - # Enable networking - networking.networkmanager.enable = true; - services.flatpak.enable = true; - - # Set your time zone. - time.timeZone = "Europe/Zurich"; - - # Select internationalisation properties. - i18n.defaultLocale = "en_US.UTF-8"; - - # Enable the X11 windowing system. - services.xserver.enable = true; - - # Configure keymap in X11 - services.xserver = { - xkb.layout = "us"; - xkb.variant = ""; - }; - - # Enable CUPS to print documents. - services.printing.enable = true; - services.printing.browsing = true; - services.printing.drivers = [ pkgs.hplip ]; - services.printing.startWhenNeeded = true; # optional - services.avahi = { - enable = true; - nssmdns4 = true; - openFirewall = true; - }; - - # Enable sound with pipewire. - hardware.pulseaudio.enable = false; - security.rtkit.enable = true; - services.pipewire = { - enable = true; - alsa.enable = true; - alsa.support32Bit = true; - pulse.enable = true; - }; - - environment.variables = { - XDG_CACHE_HOME = "$HOME/.cache"; - DIRENV_LOG_FORMAT = ""; - }; - - nix.settings.trusted-users = [ - username - ]; - - boot.kernelPackages = config.conf.kernel; - boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ]; - boot.kernelParams = [ - "resume=\"PARTLABEL=SWAP\"" - ] ++ config.conf.boot_params; - - networking.hostName = config.conf.hostname; - - # allows user change later on - users.mutableUsers = true; - users.users.${username} = { - isNormalUser = true; - description = username; - extraGroups = [ "networkmanager" "wheel" "gamemode" "docker" "vboxusers" ]; - packages = with pkgs; [ - home-manager - xdg-desktop-portal-gtk - ]; - # this password will only last for the first login - # e.g. login, then change to whatever else, this also ensures no public hash is available - password = "firstlogin"; - }; - - system.stateVersion = "unstable"; - - fileSystems."/" = - { - device = "/dev/disk/by-label/ROOT"; - fsType = "btrfs"; - options = [ - "noatime" - "nodiratime" - "discard" - ]; - }; - - fileSystems."/boot" = - { - device = "/dev/disk/by-label/BOOT"; - fsType = "vfat"; - options = [ "rw" "fmask=0022" "dmask=0022" "noatime" ]; - }; - - fileSystems."/home" = - { - device = "/dev/disk/by-label/HOME"; - fsType = "btrfs"; - options = [ - "noatime" - "nodiratime" - "discard" - ]; - }; - - swapDevices = - [{ device = "/dev/disk/by-label/SWAP"; }]; - - nixpkgs.hostPlatform = lib.mkDefault config.conf.system; - hardware.cpu.${config.conf.cpu}.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; - services.fstrim.enable = lib.mkDefault true; - nix.settings.auto-optimise-store = true; - networking.useDHCP = lib.mkDefault true; -} diff --git a/nix/base/env.nix b/nix/base/env.nix deleted file mode 100644 index 0591a20..0000000 --- a/nix/base/env.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ pkgs -, config -, ... -}: { - environment.variables = { - GSETTINGS_SCHEMA_DIR = "${pkgs.glib.getSchemaPath pkgs.gsettings-desktop-schemas}"; - NEOVIDE_MAXIMIZED = "0"; - GPG_TTY = "$(tty)"; - EDITOR = "neovide --no-fork"; - SUDO_EDITOR = "neovide --no-fork"; - SCRIPTS = "$HOME/.config/scripts"; - }; - environment.sessionVariables = { - NIXOS_OZONE_WL = "1"; - GOPATH = "$HOME/.go"; - FLAKE = "home/${config.conf.username}/gits/dotFiles/nix"; - # don't ask... marksman somehow requires this - DOTNET_SYSTEM_GLOBALIZATION_INVARIANT = 1; - }; -} diff --git a/nix/base/login_manager.nix b/nix/base/login_manager.nix deleted file mode 100644 index 1ea4ab6..0000000 --- a/nix/base/login_manager.nix +++ /dev/null @@ -1,59 +0,0 @@ -{ lib -, config -, pkgs -, inputs -, ... -}: -let - username = config.conf.username; - session = { - command = "${lib.getExe inputs.hyprland.packages.${config.conf.system}.hyprland} --config /etc/greetd/hyprgreet.conf"; - user = username; - }; -in -{ - services.xserver.displayManager.session = [ - { - manage = "desktop"; - name = "Hyprland"; - start = '' - ${lib.getExe pkgs.hyprland} & waitPID=$! - ''; - } - ]; - - # greetd display manager - programs.hyprland.enable = true; - services.greetd = { - enable = true; - settings = { - terminal.vt = 1; - default_session = session; - }; - }; - - environment.etc."greetd/environments".text = '' - Hyprland - ''; - - environment.etc."greetd/hyprgreet.conf".text = '' - exec-once=gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark' - - monitor=${config.conf.monitor},3440x1440@180,0x0,${config.conf.scale} - monitor=_,disable - - input { - force_no_accel = true - } - - misc { - disable_splash_rendering = true - disable_hyprland_logo = true - } - - exec-once=regreet --style /home/${username}/.config/gtk-3.0/gtk.css; hyprctl dispatch exit - ''; - - # unlock GPG keyring on login - security.pam.services.greetd.enableGnomeKeyring = true; -} diff --git a/nix/flake.lock b/nix/flake.lock deleted file mode 100644 index 1ef4295..0000000 --- a/nix/flake.lock +++ /dev/null @@ -1,2019 +0,0 @@ -{ - "nodes": { - "anyrun": { - "inputs": { - "flake-parts": "flake-parts", - "nixpkgs": "nixpkgs", - "systems": "systems" - }, - "locked": { - "lastModified": 1721135360, - "narHash": "sha256-ZhSA0e45UxiOAjEVqkym/aULh0Dt+KHJLNda7bjx9UI=", - "owner": "Kirottu", - "repo": "anyrun", - "rev": "c6101a31a80b51e32e96f6a77616b609770172e0", - "type": "github" - }, - "original": { - "owner": "Kirottu", - "repo": "anyrun", - "type": "github" - } - }, - "base16": { - "inputs": { - "fromYaml": "fromYaml" - }, - "locked": { - "lastModified": 1721224776, - "narHash": "sha256-iakVQHg2DSmdOc5dNBwrDt9JLRxX5MT+IIbxfZEpGdo=", - "owner": "SenchoPens", - "repo": "base16.nix", - "rev": "c89c8123310257f3ddc04cc59aa4b5573c6d515f", - "type": "github" - }, - "original": { - "owner": "SenchoPens", - "repo": "base16.nix", - "type": "github" - } - }, - "base16-fish": { - "flake": false, - "locked": { - "lastModified": 1622559957, - "narHash": "sha256-PebymhVYbL8trDVVXxCvZgc0S5VxI7I1Hv4RMSquTpA=", - "owner": "tomyun", - "repo": "base16-fish", - "rev": "2f6dd973a9075dabccd26f1cded09508180bf5fe", - "type": "github" - }, - "original": { - "owner": "tomyun", - "repo": "base16-fish", - "type": "github" - } - }, - "base16-foot": { - "flake": false, - "locked": { - "lastModified": 1696725948, - "narHash": "sha256-65bz2bUL/yzZ1c8/GQASnoiGwaF8DczlxJtzik1c0AU=", - "owner": "tinted-theming", - "repo": "base16-foot", - "rev": "eedbcfa30de0a4baa03e99f5e3ceb5535c2755ce", - "type": "github" - }, - "original": { - "owner": "tinted-theming", - "repo": "base16-foot", - "type": "github" - } - }, - "base16-helix": { - "flake": false, - "locked": { - "lastModified": 1720809814, - "narHash": "sha256-numb3xigRGnr/deF7wdjBwVg7fpbTH7reFDkJ75AJkY=", - "owner": "tinted-theming", - "repo": "base16-helix", - "rev": "34f41987bec14c0f3f6b2155c19787b1f6489625", - "type": "github" - }, - "original": { - "owner": "tinted-theming", - "repo": "base16-helix", - "type": "github" - } - }, - "base16-kitty": { - "flake": false, - "locked": { - "lastModified": 1665001328, - "narHash": "sha256-aRaizTYPpuWEcvoYE9U+YRX+Wsc8+iG0guQJbvxEdJY=", - "owner": "kdrag0n", - "repo": "base16-kitty", - "rev": "06bb401fa9a0ffb84365905ffbb959ae5bf40805", - "type": "github" - }, - "original": { - "owner": "kdrag0n", - "repo": "base16-kitty", - "type": "github" - } - }, - "base16-tmux": { - "flake": false, - "locked": { - "lastModified": 1696725902, - "narHash": "sha256-wDPg5elZPcQpu7Df0lI5O8Jv4A3T6jUQIVg63KDU+3Q=", - "owner": "tinted-theming", - "repo": "base16-tmux", - "rev": "c02050bebb60dbb20cb433cd4d8ce668ecc11ba7", - "type": "github" - }, - "original": { - "owner": "tinted-theming", - "repo": "base16-tmux", - "type": "github" - } - }, - "base16-vim": { - "flake": false, - "locked": { - "lastModified": 1716150083, - "narHash": "sha256-ZMhnNmw34ogE5rJZrjRv5MtG3WaqKd60ds2VXvT6hEc=", - "owner": "tinted-theming", - "repo": "base16-vim", - "rev": "6e955d704d046b0dc3e5c2d68a2a6eeffd2b5d3d", - "type": "github" - }, - "original": { - "owner": "tinted-theming", - "repo": "base16-vim", - "type": "github" - } - }, - "base16_2": { - "inputs": { - "fromYaml": "fromYaml_2" - }, - "locked": { - "lastModified": 1708890466, - "narHash": "sha256-LlrC09LoPi8OPYOGPXegD72v+//VapgAqhbOFS3i8sc=", - "owner": "SenchoPens", - "repo": "base16.nix", - "rev": "665b3c6748534eb766c777298721cece9453fdae", - "type": "github" - }, - "original": { - "owner": "SenchoPens", - "repo": "base16.nix", - "type": "github" - } - }, - "crane": { - "inputs": { - "nixpkgs": [ - "ironbar", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1717025063, - "narHash": "sha256-dIubLa56W9sNNz0e8jGxrX3CAkPXsq7snuFA/Ie6dn8=", - "owner": "ipetkov", - "repo": "crane", - "rev": "480dff0be03dac0e51a8dfc26e882b0d123a450e", - "type": "github" - }, - "original": { - "owner": "ipetkov", - "repo": "crane", - "type": "github" - } - }, - "dashvim": { - "inputs": { - "base16": [ - "base16" - ], - "flake-parts": "flake-parts_2", - "nixpkgs": [ - "nixpkgs" - ], - "nixvim": "nixvim" - }, - "locked": { - "lastModified": 1721250623, - "narHash": "sha256-w80Q5dvELC7W5rGx0gu9Jp+B2qxUA7irGIN3zAZcbiI=", - "owner": "DashieTM", - "repo": "DashVim", - "rev": "f4da99286b729a4300697c53c3a4b9ab9f8979aa", - "type": "github" - }, - "original": { - "owner": "DashieTM", - "repo": "DashVim", - "type": "github" - } - }, - "devshell": { - "inputs": { - "flake-utils": "flake-utils", - "nixpkgs": [ - "dashvim", - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1717408969, - "narHash": "sha256-Q0OEFqe35fZbbRPPRdrjTUUChKVhhWXz3T9ZSKmaoVY=", - "owner": "numtide", - "repo": "devshell", - "rev": "1ebbe68d57457c8cae98145410b164b5477761f4", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "devshell", - "type": "github" - } - }, - "flake-compat": { - "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "revCount": 57, - "type": "tarball", - "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.0.1/018afb31-abd1-7bff-a5e4-cff7e18efb7a/source.tar.gz" - }, - "original": { - "type": "tarball", - "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz" - } - }, - "flake-compat_2": { - "flake": false, - "locked": { - "lastModified": 1673956053, - "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-parts": { - "inputs": { - "nixpkgs-lib": [ - "anyrun", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1717285511, - "narHash": "sha256-iKzJcpdXih14qYVcZ9QC9XuZYnPc6T8YImb6dX166kw=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "2a55567fcf15b1b1c7ed712a2c6fadaec7412ea8", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-parts_10": { - "inputs": { - "nixpkgs-lib": [ - "reset", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1715865404, - "narHash": "sha256-/GJvTdTpuDjNn84j82cU6bXztE0MSkdnTWClUCRub78=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "8dc45382d5206bd292f9c2768b8058a8fd8311d9", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-parts_11": { - "inputs": { - "nixpkgs-lib": [ - "reset-plugins", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1715865404, - "narHash": "sha256-/GJvTdTpuDjNn84j82cU6bXztE0MSkdnTWClUCRub78=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "8dc45382d5206bd292f9c2768b8058a8fd8311d9", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-parts_2": { - "inputs": { - "nixpkgs-lib": "nixpkgs-lib" - }, - "locked": { - "lastModified": 1719994518, - "narHash": "sha256-pQMhCCHyQGRzdfAkdJ4cIWiw+JNuWsTX7f0ZYSyz0VY=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "9227223f6d922fee3c7b190b2cc238a99527bbb7", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-parts_3": { - "inputs": { - "nixpkgs-lib": [ - "dashvim", - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1719877454, - "narHash": "sha256-g5N1yyOSsPNiOlFfkuI/wcUjmtah+nxdImJqrSATjOU=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "4e3583423212f9303aa1a6337f8dffb415920e4f", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-parts_4": { - "inputs": { - "nixpkgs-lib": [ - "hyprdock", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1715865404, - "narHash": "sha256-/GJvTdTpuDjNn84j82cU6bXztE0MSkdnTWClUCRub78=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "8dc45382d5206bd292f9c2768b8058a8fd8311d9", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-parts_5": { - "inputs": { - "nixpkgs-lib": [ - "oxicalc", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1715865404, - "narHash": "sha256-/GJvTdTpuDjNn84j82cU6bXztE0MSkdnTWClUCRub78=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "8dc45382d5206bd292f9c2768b8058a8fd8311d9", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-parts_6": { - "inputs": { - "nixpkgs-lib": [ - "oxidash", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1715865404, - "narHash": "sha256-/GJvTdTpuDjNn84j82cU6bXztE0MSkdnTWClUCRub78=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "8dc45382d5206bd292f9c2768b8058a8fd8311d9", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-parts_7": { - "inputs": { - "nixpkgs-lib": [ - "oxinoti", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1715865404, - "narHash": "sha256-/GJvTdTpuDjNn84j82cU6bXztE0MSkdnTWClUCRub78=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "8dc45382d5206bd292f9c2768b8058a8fd8311d9", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-parts_8": { - "inputs": { - "nixpkgs-lib": [ - "oxipaste", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1715865404, - "narHash": "sha256-/GJvTdTpuDjNn84j82cU6bXztE0MSkdnTWClUCRub78=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "8dc45382d5206bd292f9c2768b8058a8fd8311d9", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-parts_9": { - "inputs": { - "nixpkgs-lib": [ - "oxishut", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1715865404, - "narHash": "sha256-/GJvTdTpuDjNn84j82cU6bXztE0MSkdnTWClUCRub78=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "8dc45382d5206bd292f9c2768b8058a8fd8311d9", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-utils": { - "inputs": { - "systems": "systems_2" - }, - "locked": { - "lastModified": 1701680307, - "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_2": { - "inputs": { - "systems": "systems_4" - }, - "locked": { - "lastModified": 1705309234, - "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_3": { - "inputs": { - "systems": "systems_5" - }, - "locked": { - "lastModified": 1705309234, - "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_4": { - "inputs": { - "systems": "systems_6" - }, - "locked": { - "lastModified": 1705309234, - "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_5": { - "inputs": { - "systems": "systems_7" - }, - "locked": { - "lastModified": 1705309234, - "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_6": { - "inputs": { - "systems": "systems_8" - }, - "locked": { - "lastModified": 1705309234, - "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_7": { - "inputs": { - "systems": "systems_9" - }, - "locked": { - "lastModified": 1705309234, - "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_8": { - "inputs": { - "systems": "systems_10" - }, - "locked": { - "lastModified": 1705309234, - "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "fromYaml": { - "flake": false, - "locked": { - "lastModified": 1721222302, - "narHash": "sha256-5vL4w9+tS9yd8WpIiDUtxN1IuxCVK2nebZMs/hCXXis=", - "owner": "SenchoPens", - "repo": "fromYaml", - "rev": "93bad85d1633b8b27287b438c0bd394094c24d06", - "type": "github" - }, - "original": { - "owner": "SenchoPens", - "repo": "fromYaml", - "type": "github" - } - }, - "fromYaml_2": { - "flake": false, - "locked": { - "lastModified": 1689549921, - "narHash": "sha256-iX0pk/uB019TdBGlaJEWvBCfydT6sRq+eDcGPifVsCM=", - "owner": "SenchoPens", - "repo": "fromYaml", - "rev": "11fbbbfb32e3289d3c631e0134a23854e7865c84", - "type": "github" - }, - "original": { - "owner": "SenchoPens", - "repo": "fromYaml", - "type": "github" - } - }, - "git-hooks": { - "inputs": { - "flake-compat": [ - "dashvim", - "nixvim", - "flake-compat" - ], - "gitignore": "gitignore", - "nixpkgs": [ - "dashvim", - "nixvim", - "nixpkgs" - ], - "nixpkgs-stable": [ - "dashvim", - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1719259945, - "narHash": "sha256-F1h+XIsGKT9TkGO3omxDLEb/9jOOsI6NnzsXFsZhry4=", - "owner": "cachix", - "repo": "git-hooks.nix", - "rev": "0ff4381bbb8f7a52ca4a851660fc7a437a4c6e07", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "git-hooks.nix", - "type": "github" - } - }, - "gitignore": { - "inputs": { - "nixpkgs": [ - "dashvim", - "nixvim", - "git-hooks", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1709087332, - "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, - "gnome-shell": { - "flake": false, - "locked": { - "lastModified": 1713702291, - "narHash": "sha256-zYP1ehjtcV8fo+c+JFfkAqktZ384Y+y779fzmR9lQAU=", - "owner": "GNOME", - "repo": "gnome-shell", - "rev": "0d0aadf013f78a7f7f1dc984d0d812971864b934", - "type": "github" - }, - "original": { - "owner": "GNOME", - "ref": "46.1", - "repo": "gnome-shell", - "type": "github" - } - }, - "home-manager": { - "inputs": { - "nixpkgs": [ - "dashvim", - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1719827439, - "narHash": "sha256-tneHOIv1lEavZ0vQ+rgz67LPNCgOZVByYki3OkSshFU=", - "owner": "nix-community", - "repo": "home-manager", - "rev": "59ce796b2563e19821361abbe2067c3bb4143a7d", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "home-manager", - "type": "github" - } - }, - "home-manager_2": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1721135958, - "narHash": "sha256-H548rpPMsn25LDKn1PCFmPxmWlClJJGnvdzImHkqjuY=", - "owner": "nix-community", - "repo": "home-manager", - "rev": "afd2021bedff2de92dfce0e257a3d03ae65c603d", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "home-manager", - "type": "github" - } - }, - "home-manager_3": { - "inputs": { - "nixpkgs": [ - "stylix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1715930644, - "narHash": "sha256-W9pyM3/vePxrffHtzlJI6lDS3seANQ+Nqp+i58O46LI=", - "owner": "nix-community", - "repo": "home-manager", - "rev": "e3ad5108f54177e6520535768ddbf1e6af54b59d", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "home-manager", - "type": "github" - } - }, - "hyprcursor": { - "inputs": { - "hyprlang": [ - "hyprland", - "hyprlang" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1720108799, - "narHash": "sha256-AxRkTJlbB8r7aG6gvc7IaLhc2T9TO4/8uqanKRxukBQ=", - "owner": "hyprwm", - "repo": "hyprcursor", - "rev": "a5c0d57325c5f0814c39110a70ca19c070ae9486", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprcursor", - "type": "github" - } - }, - "hyprdock": { - "inputs": { - "flake-parts": "flake-parts_4", - "nixpkgs": "nixpkgs_3" - }, - "locked": { - "lastModified": 1716453478, - "narHash": "sha256-EoKGnKvYKoe9geFoK0wyEAMTPGOfRtjXibt4GUCfvBA=", - "owner": "DashieTM", - "repo": "hyprdock", - "rev": "8d07dbdf446e6b21528cc994547cc8f173a70330", - "type": "github" - }, - "original": { - "owner": "DashieTM", - "repo": "hyprdock", - "type": "github" - } - }, - "hyprland": { - "inputs": { - "hyprcursor": "hyprcursor", - "hyprlang": "hyprlang", - "hyprutils": "hyprutils", - "hyprwayland-scanner": "hyprwayland-scanner", - "nixpkgs": "nixpkgs_4", - "systems": "systems_3", - "xdph": "xdph" - }, - "locked": { - "lastModified": 1721248202, - "narHash": "sha256-VAhuQQ4EKbw/6z7K2IoR83+gXUdMksLWFQOhJNhSvQE=", - "ref": "refs/heads/main", - "rev": "300228b503b36e5977b0d58713c5b4cf1f07b8a9", - "revCount": 4930, - "submodules": true, - "type": "git", - "url": "https://github.com/hyprwm/Hyprland" - }, - "original": { - "submodules": true, - "type": "git", - "url": "https://github.com/hyprwm/Hyprland" - } - }, - "hyprland-protocols": { - "inputs": { - "nixpkgs": [ - "hyprland", - "xdph", - "nixpkgs" - ], - "systems": [ - "hyprland", - "xdph", - "systems" - ] - }, - "locked": { - "lastModified": 1718746314, - "narHash": "sha256-HUklK5u86w2Yh9dOkk4FdsL8eehcOZ95jPhLixGDRQY=", - "owner": "hyprwm", - "repo": "hyprland-protocols", - "rev": "1b61f0093afff20ab44d88ad707aed8bf2215290", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprland-protocols", - "type": "github" - } - }, - "hyprlang": { - "inputs": { - "hyprutils": [ - "hyprland", - "hyprutils" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1720381373, - "narHash": "sha256-lyC/EZdHULsaAKVryK11lgHY9u6pXr7qR4irnxNWC7k=", - "owner": "hyprwm", - "repo": "hyprlang", - "rev": "5df0174fd09de4ac5475233d65ffc703e89b82eb", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprlang", - "type": "github" - } - }, - "hyprutils": { - "inputs": { - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1721071737, - "narHash": "sha256-qmC9jGfbE4+EIBbbSAkrfR/p49wShjpv4/KztgE/P54=", - "owner": "hyprwm", - "repo": "hyprutils", - "rev": "eb1ceff2b87f6820789249f63faa8e9dcb54d05f", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprutils", - "type": "github" - } - }, - "hyprwayland-scanner": { - "inputs": { - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1720215857, - "narHash": "sha256-JPdL+Qul+jEueAn8CARfcWP83eJgwkhMejQYfDvrgvU=", - "owner": "hyprwm", - "repo": "hyprwayland-scanner", - "rev": "d5fa094ca27e0039be5e94c0a80ae433145af8bb", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprwayland-scanner", - "type": "github" - } - }, - "ironbar": { - "inputs": { - "crane": "crane", - "naersk": "naersk", - "nixpkgs": "nixpkgs_6", - "rust-overlay": "rust-overlay" - }, - "locked": { - "lastModified": 1720904669, - "narHash": "sha256-Se+Pg81W8R+SFGFlhF1dU+NnMWSdLo3nC9TdPHa2IL4=", - "owner": "JakeStanger", - "repo": "ironbar", - "rev": "58190ab079d00dd53babb72346f1da6e1cc9ac72", - "type": "github" - }, - "original": { - "owner": "JakeStanger", - "repo": "ironbar", - "type": "github" - } - }, - "naersk": { - "inputs": { - "nixpkgs": "nixpkgs_5" - }, - "locked": { - "lastModified": 1717067539, - "narHash": "sha256-oIs5EF+6VpHJRvvpVWuqCYJMMVW/6h59aYUv9lABLtY=", - "owner": "nix-community", - "repo": "naersk", - "rev": "fa19d8c135e776dc97f4dcca08656a0eeb28d5c0", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "naersk", - "type": "github" - } - }, - "nix-darwin": { - "inputs": { - "nixpkgs": [ - "dashvim", - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1719845423, - "narHash": "sha256-ZLHDmWAsHQQKnmfyhYSHJDlt8Wfjv6SQhl2qek42O7A=", - "owner": "lnl7", - "repo": "nix-darwin", - "rev": "ec12b88104d6c117871fad55e931addac4626756", - "type": "github" - }, - "original": { - "owner": "lnl7", - "repo": "nix-darwin", - "type": "github" - } - }, - "nix-flatpak": { - "locked": { - "lastModified": 1711997375, - "narHash": "sha256-KvU4gOtuFMS9Il67glRGtdNfguAINT9pCaXtvCL8uI8=", - "owner": "gmodena", - "repo": "nix-flatpak", - "rev": "45bf66f7068db79b552da864c0e87452be624d6c", - "type": "github" - }, - "original": { - "owner": "gmodena", - "repo": "nix-flatpak", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1717196966, - "narHash": "sha256-yZKhxVIKd2lsbOqYd5iDoUIwsRZFqE87smE2Vzf6Ck0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "57610d2f8f0937f39dbd72251e9614b1561942d8", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-lib": { - "locked": { - "lastModified": 1719876945, - "narHash": "sha256-Fm2rDDs86sHy0/1jxTOKB1118Q0O3Uc7EC0iXvXKpbI=", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/5daf0514482af3f97abaefc78a6606365c9108e2.tar.gz" - }, - "original": { - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/5daf0514482af3f97abaefc78a6606365c9108e2.tar.gz" - } - }, - "nixpkgs-stable": { - "locked": { - "lastModified": 1720915306, - "narHash": "sha256-6vuViC56+KSr+945bCV8akHK+7J5k6n/epYg/W3I5eQ=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "74348da2f3a312ee25cea09b98cdba4cb9fa5d5d", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "release-24.05", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_10": { - "locked": { - "lastModified": 1706487304, - "narHash": "sha256-LE8lVX28MV2jWJsidW13D2qrHU/RUUONendL2Q/WlJg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "90f456026d284c22b3e3497be980b2e47d0b28ac", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_11": { - "locked": { - "lastModified": 1716137900, - "narHash": "sha256-sowPU+tLQv8GlqtVtsXioTKeaQvlMz/pefcdwg8MvfM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "6c0b7a92c30122196a761b440ac0d46d3d9954f1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_12": { - "locked": { - "lastModified": 1706487304, - "narHash": "sha256-LE8lVX28MV2jWJsidW13D2qrHU/RUUONendL2Q/WlJg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "90f456026d284c22b3e3497be980b2e47d0b28ac", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_13": { - "locked": { - "lastModified": 1716137900, - "narHash": "sha256-sowPU+tLQv8GlqtVtsXioTKeaQvlMz/pefcdwg8MvfM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "6c0b7a92c30122196a761b440ac0d46d3d9954f1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_14": { - "locked": { - "lastModified": 1716190602, - "narHash": "sha256-xYRimrR0duWvokWQEvB87bSsICeCvvX9DxpUOzCfsDE=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "5a5ac83292c7842072318f57d68a48474f8bd34d", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_15": { - "locked": { - "lastModified": 1716137900, - "narHash": "sha256-sowPU+tLQv8GlqtVtsXioTKeaQvlMz/pefcdwg8MvfM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "6c0b7a92c30122196a761b440ac0d46d3d9954f1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_16": { - "locked": { - "lastModified": 1706487304, - "narHash": "sha256-LE8lVX28MV2jWJsidW13D2qrHU/RUUONendL2Q/WlJg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "90f456026d284c22b3e3497be980b2e47d0b28ac", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_17": { - "locked": { - "lastModified": 1716137900, - "narHash": "sha256-sowPU+tLQv8GlqtVtsXioTKeaQvlMz/pefcdwg8MvfM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "6c0b7a92c30122196a761b440ac0d46d3d9954f1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_18": { - "locked": { - "lastModified": 1706487304, - "narHash": "sha256-LE8lVX28MV2jWJsidW13D2qrHU/RUUONendL2Q/WlJg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "90f456026d284c22b3e3497be980b2e47d0b28ac", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_19": { - "locked": { - "lastModified": 1716948383, - "narHash": "sha256-SzDKxseEcHR5KzPXLwsemyTR/kaM9whxeiJohbL04rs=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "ad57eef4ef0659193044870c731987a6df5cf56b", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_2": { - "locked": { - "lastModified": 1719848872, - "narHash": "sha256-H3+EC5cYuq+gQW8y0lSrrDZfH71LB4DAf+TDFyvwCNA=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "00d80d13810dbfea8ab4ed1009b09100cca86ba8", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_20": { - "locked": { - "lastModified": 1706487304, - "narHash": "sha256-LE8lVX28MV2jWJsidW13D2qrHU/RUUONendL2Q/WlJg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "90f456026d284c22b3e3497be980b2e47d0b28ac", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_21": { - "locked": { - "lastModified": 1720781449, - "narHash": "sha256-po3TZO9kcZwzvkyMJKb0WCzzDtiHWD34XeRaX1lWXp0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "8b5a3d5a1d951344d683b442c0739010b80039db", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_22": { - "locked": { - "lastModified": 1714912032, - "narHash": "sha256-clkcOIkg8G4xuJh+1onLG4HPMpbtzdLv4rHxFzgsH9c=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "ee4a6e0f566fe5ec79968c57a9c2c3c25f2cf41d", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_3": { - "locked": { - "lastModified": 1716330097, - "narHash": "sha256-8BO3B7e3BiyIDsaKA0tY8O88rClYRTjvAp66y+VBUeU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "5710852ba686cc1fd0d3b8e22b3117d43ba374c2", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_4": { - "locked": { - "lastModified": 1720957393, - "narHash": "sha256-oedh2RwpjEa+TNxhg5Je9Ch6d3W1NKi7DbRO1ziHemA=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "693bc46d169f5af9c992095736e82c3488bf7dbb", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_5": { - "locked": { - "lastModified": 1717112898, - "narHash": "sha256-7R2ZvOnvd9h8fDd65p0JnB7wXfUvreox3xFdYWd1BnY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "6132b0f6e344ce2fe34fc051b72fb46e34f668e0", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "nixpkgs_6": { - "locked": { - "lastModified": 1716948383, - "narHash": "sha256-SzDKxseEcHR5KzPXLwsemyTR/kaM9whxeiJohbL04rs=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "ad57eef4ef0659193044870c731987a6df5cf56b", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_7": { - "locked": { - "lastModified": 1720957393, - "narHash": "sha256-oedh2RwpjEa+TNxhg5Je9Ch6d3W1NKi7DbRO1ziHemA=", - "owner": "NixOs", - "repo": "nixpkgs", - "rev": "693bc46d169f5af9c992095736e82c3488bf7dbb", - "type": "github" - }, - "original": { - "owner": "NixOs", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_8": { - "locked": { - "lastModified": 1716137900, - "narHash": "sha256-sowPU+tLQv8GlqtVtsXioTKeaQvlMz/pefcdwg8MvfM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "6c0b7a92c30122196a761b440ac0d46d3d9954f1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_9": { - "locked": { - "lastModified": 1716137900, - "narHash": "sha256-sowPU+tLQv8GlqtVtsXioTKeaQvlMz/pefcdwg8MvfM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "6c0b7a92c30122196a761b440ac0d46d3d9954f1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixvim": { - "inputs": { - "devshell": "devshell", - "flake-compat": "flake-compat", - "flake-parts": "flake-parts_3", - "git-hooks": "git-hooks", - "home-manager": "home-manager", - "nix-darwin": "nix-darwin", - "nixpkgs": "nixpkgs_2", - "treefmt-nix": "treefmt-nix" - }, - "locked": { - "lastModified": 1720898451, - "narHash": "sha256-T7JAUYx7WZrEEItqRb9Bh6rj0Njffir4XHJUNwhQMiY=", - "owner": "nix-community", - "repo": "nixvim", - "rev": "06a44e9e8814ab13ea013e222637a497a50e96e4", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "nixvim", - "type": "github" - } - }, - "nur": { - "locked": { - "lastModified": 1721241063, - "narHash": "sha256-jBAuwmtJmSNT6xwjtGINslFK0m3R3+Ydw+xrd+a3tSE=", - "owner": "nix-community", - "repo": "nur", - "rev": "f33f46c1e38b07b20a978ac39208058ab9ddedb1", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "nur", - "type": "github" - } - }, - "oxicalc": { - "inputs": { - "flake-parts": "flake-parts_5", - "nixpkgs": "nixpkgs_8" - }, - "locked": { - "lastModified": 1716225554, - "narHash": "sha256-IenHIQgKdKJTt02VJLQ+q8EunIkMwQ57XFWyKO+rb7s=", - "owner": "DashieTM", - "repo": "OxiCalc", - "rev": "a3fa5d76941278fd0f586817dcd04be134159bd8", - "type": "github" - }, - "original": { - "owner": "DashieTM", - "repo": "OxiCalc", - "type": "github" - } - }, - "oxidash": { - "inputs": { - "flake-parts": "flake-parts_6", - "nixpkgs": "nixpkgs_9", - "rust-overlay": "rust-overlay_2" - }, - "locked": { - "lastModified": 1716235599, - "narHash": "sha256-6LDrLEfPzwbd5nEcis8us4BA18YhoWkzMVwafCJ5N/A=", - "owner": "DashieTM", - "repo": "OxiDash", - "rev": "fe6984abc73f75a64b0a03231068c20f53ec4f76", - "type": "github" - }, - "original": { - "owner": "DashieTM", - "repo": "OxiDash", - "type": "github" - } - }, - "oxinoti": { - "inputs": { - "flake-parts": "flake-parts_7", - "nixpkgs": "nixpkgs_11", - "rust-overlay": "rust-overlay_3" - }, - "locked": { - "lastModified": 1716235566, - "narHash": "sha256-1U4/h0YyuoOERjQE68yQZVsDdIGl43OprDplSGBMhYY=", - "owner": "DashieTM", - "repo": "OxiNoti", - "rev": "c52c330d59a3b066e94618adbe9a7be5b9cfde24", - "type": "github" - }, - "original": { - "owner": "DashieTM", - "repo": "OxiNoti", - "type": "github" - } - }, - "oxipaste": { - "inputs": { - "flake-parts": "flake-parts_8", - "nixpkgs": "nixpkgs_13", - "rust-overlay": "rust-overlay_4" - }, - "locked": { - "lastModified": 1716235097, - "narHash": "sha256-kTsSNciMnp3y/QOPseB/QlhRqVxrm7teRCMl05OIiBs=", - "owner": "DashieTM", - "repo": "OxiPaste", - "rev": "3f494c1a3dd093e3c5761520554977a9dec33a3a", - "type": "github" - }, - "original": { - "owner": "DashieTM", - "repo": "OxiPaste", - "type": "github" - } - }, - "oxishut": { - "inputs": { - "flake-parts": "flake-parts_9", - "nixpkgs": "nixpkgs_15", - "rust-overlay": "rust-overlay_5" - }, - "locked": { - "lastModified": 1716235696, - "narHash": "sha256-qqN2ev97ff1Yftr+8YS7Pm2/kk8SpQU8uxplbQYJGho=", - "owner": "DashieTM", - "repo": "OxiShut", - "rev": "d38d5c892b7ae2420715cbb6b4944abb76b49f9d", - "type": "github" - }, - "original": { - "owner": "DashieTM", - "repo": "OxiShut", - "type": "github" - } - }, - "reset": { - "inputs": { - "flake-parts": "flake-parts_10", - "nixpkgs": "nixpkgs_17", - "rust-overlay": "rust-overlay_6" - }, - "locked": { - "lastModified": 1718284469, - "narHash": "sha256-6cZjFyjhGTOj9r8eprCWZy1v2o1Tqcl6H6g/LTgHhp4=", - "owner": "Xetibo", - "repo": "ReSet", - "rev": "6c1291bd19383ea45d0610dcdc17e8491b8e20ea", - "type": "github" - }, - "original": { - "owner": "Xetibo", - "repo": "ReSet", - "type": "github" - } - }, - "reset-plugins": { - "inputs": { - "flake-parts": "flake-parts_11", - "nixpkgs": "nixpkgs_19", - "rust-overlay": "rust-overlay_7" - }, - "locked": { - "lastModified": 1718300175, - "narHash": "sha256-kPeJJ/au+jV4jhyAhkLI3uwqK7pEDjdVJvwDmtQq8/k=", - "owner": "Xetibo", - "repo": "ReSet-Plugins", - "rev": "8d3af2fab9425f8b89fb7b82b4e23eba12a42f85", - "type": "github" - }, - "original": { - "owner": "Xetibo", - "repo": "ReSet-Plugins", - "type": "github" - } - }, - "root": { - "inputs": { - "anyrun": "anyrun", - "base16": "base16", - "dashvim": "dashvim", - "home-manager": "home-manager_2", - "hyprdock": "hyprdock", - "hyprland": "hyprland", - "ironbar": "ironbar", - "nix-flatpak": "nix-flatpak", - "nixpkgs": "nixpkgs_7", - "nur": "nur", - "oxicalc": "oxicalc", - "oxidash": "oxidash", - "oxinoti": "oxinoti", - "oxipaste": "oxipaste", - "oxishut": "oxishut", - "reset": "reset", - "reset-plugins": "reset-plugins", - "sops-nix": "sops-nix", - "stylix": "stylix" - } - }, - "rust-overlay": { - "inputs": { - "flake-utils": "flake-utils_2", - "nixpkgs": [ - "ironbar", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1717121863, - "narHash": "sha256-/3sxIe7MZqF/jw1RTQCSmgTjwVod43mmrk84m50MJQ4=", - "owner": "oxalica", - "repo": "rust-overlay", - "rev": "2a7b53172ed08f856b8382d7dcfd36a4e0cbd866", - "type": "github" - }, - "original": { - "owner": "oxalica", - "repo": "rust-overlay", - "type": "github" - } - }, - "rust-overlay_2": { - "inputs": { - "flake-utils": "flake-utils_3", - "nixpkgs": "nixpkgs_10" - }, - "locked": { - "lastModified": 1716171463, - "narHash": "sha256-lc7wOh5BjYUoxdhcPkeUY8BmuL2qtRaHlW1403RW48E=", - "owner": "oxalica", - "repo": "rust-overlay", - "rev": "04d61d14803854fd8453ec43c5c53a471e5407a8", - "type": "github" - }, - "original": { - "owner": "oxalica", - "repo": "rust-overlay", - "type": "github" - } - }, - "rust-overlay_3": { - "inputs": { - "flake-utils": "flake-utils_4", - "nixpkgs": "nixpkgs_12" - }, - "locked": { - "lastModified": 1716171463, - "narHash": "sha256-lc7wOh5BjYUoxdhcPkeUY8BmuL2qtRaHlW1403RW48E=", - "owner": "oxalica", - "repo": "rust-overlay", - "rev": "04d61d14803854fd8453ec43c5c53a471e5407a8", - "type": "github" - }, - "original": { - "owner": "oxalica", - "repo": "rust-overlay", - "type": "github" - } - }, - "rust-overlay_4": { - "inputs": { - "flake-utils": "flake-utils_5", - "nixpkgs": "nixpkgs_14" - }, - "locked": { - "lastModified": 1716171463, - "narHash": "sha256-lc7wOh5BjYUoxdhcPkeUY8BmuL2qtRaHlW1403RW48E=", - "owner": "oxalica", - "repo": "rust-overlay", - "rev": "04d61d14803854fd8453ec43c5c53a471e5407a8", - "type": "github" - }, - "original": { - "owner": "oxalica", - "repo": "rust-overlay", - "type": "github" - } - }, - "rust-overlay_5": { - "inputs": { - "flake-utils": "flake-utils_6", - "nixpkgs": "nixpkgs_16" - }, - "locked": { - "lastModified": 1716171463, - "narHash": "sha256-lc7wOh5BjYUoxdhcPkeUY8BmuL2qtRaHlW1403RW48E=", - "owner": "oxalica", - "repo": "rust-overlay", - "rev": "04d61d14803854fd8453ec43c5c53a471e5407a8", - "type": "github" - }, - "original": { - "owner": "oxalica", - "repo": "rust-overlay", - "type": "github" - } - }, - "rust-overlay_6": { - "inputs": { - "flake-utils": "flake-utils_7", - "nixpkgs": "nixpkgs_18" - }, - "locked": { - "lastModified": 1716171463, - "narHash": "sha256-lc7wOh5BjYUoxdhcPkeUY8BmuL2qtRaHlW1403RW48E=", - "owner": "oxalica", - "repo": "rust-overlay", - "rev": "04d61d14803854fd8453ec43c5c53a471e5407a8", - "type": "github" - }, - "original": { - "owner": "oxalica", - "repo": "rust-overlay", - "type": "github" - } - }, - "rust-overlay_7": { - "inputs": { - "flake-utils": "flake-utils_8", - "nixpkgs": "nixpkgs_20" - }, - "locked": { - "lastModified": 1717035469, - "narHash": "sha256-MzH+yjKULH3HCRj9QCTwBvqq4LZkR0ZqRE/QfGOGC2E=", - "owner": "oxalica", - "repo": "rust-overlay", - "rev": "095702e63a40e86f339d11864da9dc965b70a01e", - "type": "github" - }, - "original": { - "owner": "oxalica", - "repo": "rust-overlay", - "type": "github" - } - }, - "sops-nix": { - "inputs": { - "nixpkgs": "nixpkgs_21", - "nixpkgs-stable": "nixpkgs-stable" - }, - "locked": { - "lastModified": 1720926522, - "narHash": "sha256-eTpnrT6yu1vp8C0B5fxHXhgKxHoYMoYTEikQx///jxY=", - "owner": "Mic92", - "repo": "sops-nix", - "rev": "0703ba03fd9c1665f8ab68cc3487302475164617", - "type": "github" - }, - "original": { - "owner": "Mic92", - "repo": "sops-nix", - "type": "github" - } - }, - "stylix": { - "inputs": { - "base16": "base16_2", - "base16-fish": "base16-fish", - "base16-foot": "base16-foot", - "base16-helix": "base16-helix", - "base16-kitty": "base16-kitty", - "base16-tmux": "base16-tmux", - "base16-vim": "base16-vim", - "flake-compat": "flake-compat_2", - "gnome-shell": "gnome-shell", - "home-manager": "home-manager_3", - "nixpkgs": "nixpkgs_22" - }, - "locked": { - "lastModified": 1720818679, - "narHash": "sha256-u9PqY7O6TN42SLeb0e6mnYAgQOoQmclaVSHfLKMpmu0=", - "owner": "danth", - "repo": "stylix", - "rev": "29148118cc33f08b71058e1cda7ca017f5300b51", - "type": "github" - }, - "original": { - "owner": "danth", - "repo": "stylix", - "type": "github" - } - }, - "systems": { - "locked": { - "lastModified": 1689347949, - "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", - "owner": "nix-systems", - "repo": "default-linux", - "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default-linux", - "type": "github" - } - }, - "systems_10": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "systems_2": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "systems_3": { - "locked": { - "lastModified": 1689347949, - "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", - "owner": "nix-systems", - "repo": "default-linux", - "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default-linux", - "type": "github" - } - }, - "systems_4": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "systems_5": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "systems_6": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "systems_7": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "systems_8": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "systems_9": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "treefmt-nix": { - "inputs": { - "nixpkgs": [ - "dashvim", - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1719887753, - "narHash": "sha256-p0B2r98UtZzRDM5miGRafL4h7TwGRC4DII+XXHDHqek=", - "owner": "numtide", - "repo": "treefmt-nix", - "rev": "bdb6355009562d8f9313d9460c0d3860f525bc6c", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "treefmt-nix", - "type": "github" - } - }, - "xdph": { - "inputs": { - "hyprland-protocols": "hyprland-protocols", - "hyprlang": [ - "hyprland", - "hyprlang" - ], - "nixpkgs": [ - "hyprland", - "nixpkgs" - ], - "systems": [ - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1720194466, - "narHash": "sha256-Rizg9efi6ue95zOp0MeIV2ZedNo+5U9G2l6yirgBUnA=", - "owner": "hyprwm", - "repo": "xdg-desktop-portal-hyprland", - "rev": "b9b97e5ba23fe7bd5fa4df54696102e8aa863cf6", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "xdg-desktop-portal-hyprland", - "type": "github" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/nix/flake.nix b/nix/flake.nix deleted file mode 100644 index 2793a63..0000000 --- a/nix/flake.nix +++ /dev/null @@ -1,81 +0,0 @@ -{ - description = "Dashie dots"; - - inputs = - { - nixpkgs.url = "github:NixOs/nixpkgs/nixos-unstable"; - - nix-flatpak = { - url = "github:gmodena/nix-flatpak"; - }; - - home-manager = { - url = "github:nix-community/home-manager"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - - sops-nix.url = "github:Mic92/sops-nix"; - - # Hyprspace = { - # url = "github:KZDKM/Hyprspace"; - # inputs.hyprland.follows = "nixpkgs"; - # }; - - nur.url = "github:nix-community/nur"; - hyprland.url = "git+https://github.com/hyprwm/Hyprland?submodules=1"; - - ironbar = { - url = "github:JakeStanger/ironbar"; - }; - - stylix.url = "github:danth/stylix"; - base16.url = "github:SenchoPens/base16.nix"; - - anyrun.url = "github:Kirottu/anyrun"; - oxicalc.url = "github:DashieTM/OxiCalc"; - oxishut.url = "github:DashieTM/OxiShut"; - oxinoti.url = "github:DashieTM/OxiNoti"; - oxidash.url = "github:DashieTM/OxiDash"; - oxipaste.url = "github:DashieTM/OxiPaste"; - hyprdock.url = "github:DashieTM/hyprdock"; - reset.url = "github:Xetibo/ReSet"; - reset-plugins.url = "github:Xetibo/ReSet-Plugins"; - # nixvim.url = "github:nix-community/nixvim"; - dashvim = { - url = "github:DashieTM/DashVim"; - inputs.nixpkgs.follows = "nixpkgs"; - inputs.base16.follows = "base16"; - }; - }; - - outputs = { ... }@inputs: - let - pkgs = import inputs.nixpkgs { - system = "x86_64-linux"; - overlays = [ - inputs.nur.overlay - ]; - config = { - allowUnfree = true; - }; - }; - dashielib = import ./lib { inherit inputs pkgs; }; - in - { - nixosConfigurations = (dashielib.build_systems [ "marmo" "overheating" "spaceship" ]); - }; - - nixConfig = { - builders-use-substitutes = true; - - extra-substituters = [ - "https://hyprland.cachix.org" - "https://anyrun.cachix.org" - ]; - - extra-trusted-public-keys = [ - "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" - "anyrun.cachix.org-1:pqBobmOjI7nKlsUMV25u9QHa9btJK65/C8vnO3p346s=" - ]; - }; -} diff --git a/nix/hardware/marmo/configuration.nix b/nix/hardware/marmo/configuration.nix deleted file mode 100644 index d8de5cb..0000000 --- a/nix/hardware/marmo/configuration.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ - imports = [ - ../../modules/conf.nix - ]; - # variables for system - conf = { - monitor = "DP-1"; - gaming = { - enable = true; - device = 1; - }; - hostname = "marmo"; - hyprland.monitor = [ - # default - "DP-1,1920x1080@144,0x0,1" - # all others - ",highrr,auto,1" - ]; - colorscheme="catppuccin-mocha"; - }; -} diff --git a/nix/hardware/overheating/configuration.nix b/nix/hardware/overheating/configuration.nix deleted file mode 100644 index 70d4cc7..0000000 --- a/nix/hardware/overheating/configuration.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ - imports = [ - ../../modules/conf.nix - ]; - conf = { - monitor = "eDP-1"; - scale = "2.0"; - hostname = "overheating"; - boot_params = [ "rtc_cmos.use_acpi_alarm=1" ]; - ironbar.modules = [ - { type = "upower"; class = "memory-usage"; } - ]; - hyprland = { - monitor = [ - # default - "eDP-1,2944x1840@90,0x0,2" - - # all others - ",highres,auto,1" - ]; - extra_autostart = [ "hyprdock --server" ]; - }; - colorscheme = "catppuccin-mocha"; - }; -} diff --git a/nix/hardware/overheating/dsdt.nix b/nix/hardware/overheating/dsdt.nix deleted file mode 100644 index 285cb33..0000000 --- a/nix/hardware/overheating/dsdt.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ pkgs, ... }: -let - # credit to benley: https://github.com/benley/dotfiles/commit/325748c3a8553d55c9fab08654a77b252aa0fde7 - patched_ssdt = pkgs.stdenv.mkDerivation { - name = "patched_ssdt"; - src = ./.; - buildInputs = [ pkgs.libarchive ]; - installPhase = '' - mkdir -p kernel/firmware/acpi - cp ${./ssdt6.aml} kernel/firmware/acpi/ssdt6.aml - mkdir -p $out - echo kernel/firmware/acpi/ssdt6.aml | bsdcpio -v -o -H newc -R 0:0 > $out/lenotrolli-ssdt.img - ''; - }; -in - -{ - boot.kernelParams = [ "mem_sleep_default=deep" ]; - boot.initrd.prepend = [ "${patched_ssdt}/lenotrolli-ssdt.img" ]; -} diff --git a/nix/hardware/overheating/firmware.nix b/nix/hardware/overheating/firmware.nix deleted file mode 100644 index d46f8b4..0000000 --- a/nix/hardware/overheating/firmware.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ pkgs, ... }: -{ - hardware.firmware = [ - ( - # lenovo is such a good manufacturer!!1!11! - # credit for the binary files: https://github.com/darinpp/yoga-slim-7 - pkgs.stdenv.mkDerivation { - name = "firmware-lenotrolli"; - src = ./firmware; - installPhase = '' - mkdir -p $out/lib/firmware - cp ${./firmware/TAS2XXX38BB.bin} $out/lib/firmware/TAS2XXX38BB.bin - cp ${./firmware/TIAS2781RCA4.bin} $out/lib/firmware/TIAS2781RCA4.bin - ''; - } - ) - ]; -} diff --git a/nix/hardware/overheating/firmware/TAS2XXX38BB.bin b/nix/hardware/overheating/firmware/TAS2XXX38BB.bin deleted file mode 100644 index d729b97..0000000 Binary files a/nix/hardware/overheating/firmware/TAS2XXX38BB.bin and /dev/null differ diff --git a/nix/hardware/overheating/firmware/TIAS2781RCA4.bin b/nix/hardware/overheating/firmware/TIAS2781RCA4.bin deleted file mode 100644 index 481d133..0000000 Binary files a/nix/hardware/overheating/firmware/TIAS2781RCA4.bin and /dev/null differ diff --git a/nix/hardware/overheating/firmware/TIAS2781RCA4.bin.orig b/nix/hardware/overheating/firmware/TIAS2781RCA4.bin.orig deleted file mode 100644 index 8698e92..0000000 Binary files a/nix/hardware/overheating/firmware/TIAS2781RCA4.bin.orig and /dev/null differ diff --git a/nix/hardware/overheating/overheating.nix b/nix/hardware/overheating/overheating.nix deleted file mode 100644 index 0ca9ea1..0000000 --- a/nix/hardware/overheating/overheating.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ - imports = - [ - ./dsdt.nix - ./firmware.nix - ]; - # special hardware modules - # TODO: needed? - boot.kernelModules = [ "kvm-amd" ]; - - hardware.bluetooth.enable = true; - hardware.bluetooth.powerOnBoot = true; - # for hyprdock - services.acpid.enable = true; -} diff --git a/nix/hardware/overheating/ssdt6.aml b/nix/hardware/overheating/ssdt6.aml deleted file mode 100644 index d8cbadd..0000000 Binary files a/nix/hardware/overheating/ssdt6.aml and /dev/null differ diff --git a/nix/hardware/spaceship/configuration.nix b/nix/hardware/spaceship/configuration.nix deleted file mode 100644 index 348eb9f..0000000 --- a/nix/hardware/spaceship/configuration.nix +++ /dev/null @@ -1,63 +0,0 @@ -{ config, ... }: -let - username = config.conf.username; -in -{ - imports = [ - ../../modules/conf.nix - ]; - - # config variables - conf = { - monitor = "DP-1"; - gaming = { - enable = true; - }; - streamdeck.enable = true; - hostname = "spaceship"; - hyprland = { - monitor = [ - # default - "DP-2,2560x1440@165,0x0,1" - "DP-1,3440x1440@180,2560x0,1,vrr,1" - "HDMI-A-1,1920x1200@60,6000x0,1" - "HDMI-A-1,transform,1" - - # all others - ",highrr,auto,1" - ]; - workspace = [ - # workspaces - # monitor middle - "2,monitor:DP-1, default:true" - "4,monitor:DP-1" - "6,monitor:DP-1" - "8,monitor:DP-1" - "9,monitor:DP-1" - "10,monitor:DP-1" - - # monitor left - "1,monitor:DP-2, default:true" - "5,monitor:DP-2" - "7,monitor:DP-2" - - # monitor right - "3,monitor:HDMI-A-1, default:true" - ]; - hyprpaper = '' - #load - preload = /home/${username}/Pictures/backgrounds/shinobu_2k.jpg - preload = /home/${username}/Pictures/backgrounds/shino_wide.png - preload = /home/${username}/Pictures/backgrounds/shinobu_1200.jpg - - #set - wallpaper = DP-2,/home/${username}/Pictures/backgrounds/shinobu_2k.jpg - wallpaper = DP-1,/home/${username}/Pictures/backgrounds/shino_wide.png - wallpaper = HDMI-A-1,/home/${username}/Pictures/backgrounds/shinobu_1200.jpg - splash = true - ''; - extra_autostart = [ "streamdeck -n" ]; - }; - colorscheme = "catppuccin-mocha"; - }; -} diff --git a/nix/hardware/spaceship/spaceship.nix b/nix/hardware/spaceship/spaceship.nix deleted file mode 100644 index 482de77..0000000 --- a/nix/hardware/spaceship/spaceship.nix +++ /dev/null @@ -1,40 +0,0 @@ -{ pkgs, lib, ... }: -{ - # TODO: needed? - boot.kernelModules = [ "kvm-amd" ]; - boot.initrd.kernelModules = [ "amdgpu" ]; - - fileSystems."/drive2" = - { - device = "/dev/disk/by-label/DRIVE2"; - fsType = "ext4"; - options = [ - "noatime" - "nodiratime" - "discard" - ]; - }; - - virtualisation.virtualbox.host.enable = true; - - # enable hardware acceleration and rocm - hardware.xone.enable = true; - hardware.graphics.extraPackages = with pkgs; [ - libvdpau-va-gl - vaapiVdpau - rocmPackages.clr.icd - rocm-opencl-runtime - ]; - hardware.graphics = { - enable = true; - enable32Bit = lib.mkDefault true; - }; - networking.firewall = { - allowedTCPPortRanges = [ - { from = 1714; to = 1764; } # KDE Connect - ]; - allowedUDPPortRanges = [ - { from = 1714; to = 1764; } # KDE Connect - ]; - }; -} diff --git a/nix/lib/default.nix b/nix/lib/default.nix deleted file mode 100644 index 91b3acc..0000000 --- a/nix/lib/default.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ inputs, pkgs, ... }: { - build_systems = systems: builtins.listToAttrs (map (name: { - name = name; - value = - let - mod = ../hardware/${name}/configuration.nix; - in - inputs.nixpkgs.lib.nixosSystem { - specialArgs = { - inherit inputs pkgs mod; - }; - modules = [ - inputs.home-manager.nixosModules.home-manager - inputs.stylix.nixosModules.stylix - ../base - ../programs - mod - ] ++ inputs.nixpkgs.lib.optional (builtins.pathExists ../hardware/${name}/${name}.nix) ../hardware/${name}/${name}.nix - ++ inputs.nixpkgs.lib.optional (builtins.pathExists mod) mod; - }; - } )systems); -} diff --git a/nix/modules/conf.nix b/nix/modules/conf.nix deleted file mode 100644 index 27a99fd..0000000 --- a/nix/modules/conf.nix +++ /dev/null @@ -1,225 +0,0 @@ -{ lib, config, pkgs, ... }: { - options.conf = { - - system = lib.mkOption { - default = "x86_64-linux"; - # no fisherprice unix support - type = with lib.types; (enum [ "x86_64-linux" "aarch64-linux" "aarch64-linux-android" ]); - example = "aarch64-linux"; - description = '' - System architecture. - ''; - }; - - cpu = lib.mkOption { - # TODO: how to enable arm? - default = "amd"; - type = with lib.types; (enum [ "amd" "intel" ]); - example = "intel"; - description = '' - cpu microcode. - ''; - }; - - monitor = lib.mkOption { - default = ""; - example = "eDP-1"; - type = lib.types.str; - description = '' - main monitor - ''; - }; - - scale = lib.mkOption { - default = "1.0"; - example = "1.0"; - type = lib.types.str; - description = '' - Scale for the monitor - ''; - }; - - ironbar = { - modules = lib.mkOption { - default = [ ]; - example = [ - { type = "upower"; class = "memory-usage"; } - ]; - type = with lib.types; listOf attrs; - description = '' - Adds modules to ironbar. - ''; - }; - }; - - amdGpu = lib.mkOption { - default = false; - example = true; - type = lib.types.bool; - description = '' - Enables drivers, optimizations and kernel parameters for AMD gpus. - ''; - }; - - boot_params = lib.mkOption { - default = [ ]; - example = [ "resume=something" ]; - type = with lib.types; listOf str; - description = '' - Boot params - ''; - }; - - gaming = { - enable = lib.mkOption { - default = false; - example = true; - type = lib.types.bool; - description = '' - Install gaming related programs such as steam, gamemode, and more - ''; - }; - - device = lib.mkOption { - default = 0; - example = 0; - type = lib.types.int; - description = '' - GPU device number - ''; - }; - }; - - streamdeck = { - enable = lib.mkOption { - default = false; - example = true; - type = lib.types.bool; - description = '' - Install streamdeck configuration program. - ''; - }; - }; - - kernel = lib.mkOption { - default = pkgs.linuxPackages_latest; - example = pkgs.linuxPackages_xanmod_latest; - type = with lib.types; nullOr attrs; - description = '' - kernel to be used - ''; - }; - - hostname = lib.mkOption { - default = "nixos"; - example = "spaceship"; - type = lib.types.str; - description = '' - The name of the system - ''; - }; - - username = lib.mkOption { - default = "dashie"; - example = "pingpang"; - type = lib.types.str; - description = '' - The username. - ''; - }; - - hyprland = { - monitor = lib.mkOption { - default = [ ]; - example = [ - "DP-1,3440x1440@180,2560x0,1,vrr,1" - ]; - type = with lib.types; listOf str; - description = '' - The monitor configuration for hyprland. - ''; - }; - workspace = lib.mkOption { - default = [ ]; - example = [ - "2,monitor:DP-1, default:true" - ]; - type = with lib.types; listOf str; - description = '' - The workspace configuration for hyprland. - ''; - }; - hyprpaper = lib.mkOption { - default = ''''; - example = '' - hyprpaper stuff - ''; - type = lib.types.lines; - description = '' - hyprpaper - ''; - }; - extra_autostart = lib.mkOption { - default = [ ]; - example = [ "your application" ]; - type = lib.types.listOf lib.types.str; - description = '' - Extra exec_once. - ''; - }; - }; - - nvim-colorscheme = lib.mkOption { - default = { tokyonight = { enable = true; }; }; - example = { catppuccin = { enable = true; }; }; - type = lib.types.attrs; - description = '' - nixvim colorscheme. - ''; - }; - - colorscheme = lib.mkOption { - default = { - # custom tokyo night - base00 = "1A1B26"; - # base01 = "16161E"; - # base01 = "15161e"; - base01 = "191a25"; - base02 = "2F3549"; - base03 = "444B6A"; - base04 = "787C99"; - base05 = "A9B1D6"; - base06 = "CBCCD1"; - base07 = "D5D6DB"; - base08 = "C0CAF5"; - base09 = "A9B1D6"; - base0A = "0DB9D7"; - base0B = "9ECE6A"; - base0C = "B4F9F8"; - # base0D = "2AC3DE"; - # base0D = "A9B1D6"; - # base0D = "62A0EA"; - # base0D = "779EF1"; - base0D = "366fea"; - base0E = "BB9AF7"; - base0F = "F7768E"; - }; - example = "catppuccin-mocha"; - type = with lib.types; oneOf [ str attrs path ]; - description = '' - Base16 colorscheme. - Can be an attribute set with base00 to base0F, - a string that leads to a yaml file in base16-schemes path, - or a path to a custom yaml file. - ''; - }; - }; - - config = { - conf.boot_params = lib.mkIf config.conf.amdGpu [ - "amdgpu.ppfeaturemask=0xffffffff" - ]; - - conf.kernel = lib.mkIf config.conf.gaming.enable pkgs.linuxPackages_xanmod_latest; - }; -} diff --git a/nix/override/cambalache.nix b/nix/override/cambalache.nix deleted file mode 100644 index 7b119fb..0000000 --- a/nix/override/cambalache.nix +++ /dev/null @@ -1,92 +0,0 @@ -{ stdenv -, lib -, pkgs -, fetchFromGitLab -, nix-update-script -}: - -pkgs.python3.pkgs.buildPythonApplication rec { - pname = "cambalache"; - version = "0.90.1"; - - format = "other"; - - # Did not fetch submodule since it is only for tests we don't run. - src = fetchFromGitLab { - domain = "gitlab.gnome.org"; - owner = "jpu"; - repo = pname; - rev = version; - sha256 = "sha256-YuRxqrGJvhMMZApD/tQSWkUg/nZnp/xryBJSjXCXO4w="; - }; - - nativeBuildInputs = with pkgs; [ - meson - ninja - pkg-config - gobject-introspection # for setup hook - desktop-file-utils # for update-desktop-database - shared-mime-info # for update-mime-database - wrapGAppsHook - ]; - - pythonPath = with pkgs.python3.pkgs; [ - pygobject3 - lxml - ]; - - buildInputs = with pkgs; [ - glib - gtk3 - gtk4 - gtksourceview4 - gtksourceview5 - webkitgtk_4_1 - webkitgtk_6_0 - # For extra widgets support. - libadwaita - libhandy - ]; - - # Prevent double wrapping. - dontWrapGApps = true; - - postPatch = '' - patchShebangs postinstall.py - # those programs are used at runtime not build time - # https://gitlab.gnome.org/jpu/cambalache/-/blob/0.12.1/meson.build#L79-80 - substituteInPlace ./meson.build \ - --replace "find_program('broadwayd', required: true)" "" \ - --replace "find_program('gtk4-broadwayd', required: true)" "" - ''; - - preFixup = '' - # Let python wrapper use GNOME flags. - makeWrapperArgs+=( - # For broadway daemons - --prefix PATH : "${lib.makeBinPath [ pkgs.gtk3 pkgs.gtk4 ]}" - "''${gappsWrapperArgs[@]}" - ) - ''; - - postFixup = '' - # Wrap a helper script in an unusual location. - wrapPythonProgramsIn "$out/${pkgs.python3.sitePackages}/cambalache/priv/merengue" "$out $pythonPath" - ''; - - passthru = { - updateScript = nix-update-script { }; - }; - - meta = with lib; { - homepage = "https://gitlab.gnome.org/jpu/cambalache"; - description = "RAD tool for GTK 4 and 3 with data model first philosophy"; - mainProgram = "cambalache"; - maintainers = teams.gnome.members; - license = with licenses; [ - lgpl21Only # Cambalache - gpl2Only # tools - ]; - platforms = platforms.unix; - }; -} diff --git a/nix/override/streamdeck.nix b/nix/override/streamdeck.nix deleted file mode 100644 index 705155f..0000000 --- a/nix/override/streamdeck.nix +++ /dev/null @@ -1,106 +0,0 @@ -{ lib -, pkgs -, python3Packages -, fetchFromGitHub -, writeText -, makeDesktopItem -}: - -python3Packages.buildPythonApplication rec { - pname = "streamdeck-ui"; - version = "4.1.2"; - - src = fetchFromGitHub { - repo = "streamdeck-linux-gui"; - owner = "streamdeck-linux-gui"; - rev = "v${version}"; - sha256 = "sha256-CSsFPGnKVQUCND6YOA9kfO41KS85C57YL9LcrWlQRKo="; - }; - - patches = [ - # nixpkgs has a newer pillow version - ./streamdeck.patch - ]; - - desktopItems = - let - common = { - name = "streamdeck-ui"; - desktopName = "Stream Deck UI"; - icon = "streamdeck-ui"; - exec = "streamdeck"; - comment = "UI for the Elgato Stream Deck"; - categories = [ "Utility" ]; - }; - in - builtins.map makeDesktopItem [ - common - (common // { - name = "${common.name}-noui"; - exec = "${common.exec} --no-ui"; - noDisplay = true; - }) - ]; - - postInstall = - let - udevRules = '' - SUBSYSTEM=="usb", ATTRS{idVendor}=="0fd9", TAG+="uaccess" - ''; - in - '' - mkdir -p $out/lib/systemd/user - substitute scripts/streamdeck.service $out/lib/systemd/user/streamdeck.service \ - --replace '' $out/bin/streamdeck - - mkdir -p "$out/etc/udev/rules.d" - cp ${writeText "70-streamdeck.rules" udevRules} $out/etc/udev/rules.d/70-streamdeck.rules - - mkdir -p "$out/share/pixmaps" - cp streamdeck_ui/logo.png $out/share/pixmaps/streamdeck-ui.png - ''; - - dontWrapQtApps = true; - dontWrapGApps = true; - makeWrapperArgs = [ "\${qtWrapperArgs[@]}" "\${gappsWrapperArgs[@]}" ]; - - format = "pyproject"; - - nativeBuildInputs = [ - pkgs.python3Packages.poetry-core - pkgs.copyDesktopItems - pkgs.qt6.wrapQtAppsHook - pkgs.wrapGAppsHook - ]; - - propagatedBuildInputs = with pkgs.python3Packages; [ - importlib-metadata - setuptools - filetype - cairosvg - pillow - pynput - pyside6 - streamdeck - xlib - ] ++ lib.optionals stdenv.isLinux [ - pkgs.qt6.qtwayland - ]; - - nativeCheckInputs = [ - pkgs.xvfb-run - pkgs.python3Packages.pytest - ]; - - # checkPhase = '' - # xvfb-run pytest tests - # ''; - - meta = with lib; { - description = "Linux compatible UI for the Elgato Stream Deck"; - homepage = "https://streamdeck-linux-gui.github.io/streamdeck-linux-gui/"; - license = licenses.mit; - mainProgram = "streamdeck"; - maintainers = with maintainers; [ majiir ]; - }; -} diff --git a/nix/override/streamdeck.patch b/nix/override/streamdeck.patch deleted file mode 100644 index 3c8cf05..0000000 --- a/nix/override/streamdeck.patch +++ /dev/null @@ -1,18 +0,0 @@ -diff --git a/pyproject.toml b/pyproject.toml -index 54a8c19..0b95fb3 100644 ---- a/pyproject.toml -+++ b/pyproject.toml -@@ -14,11 +14,11 @@ packages = [ - [tool.poetry.dependencies] - python = ">=3.8,<3.13" - streamdeck = "^0.9.5" --pillow = "10.2.0" -+pillow = "^10.2.0" - pyside6 = "^6.4.2" - CairoSVG = "^2.5.2" - filetype = "^1.0.10" --importlib-metadata = "^6.8.0" -+importlib-metadata = "^7.0.0" - evdev = "^1.6.1" - - [tool.poetry.group.docs.dependencies] diff --git a/nix/programs/coding.nix b/nix/programs/coding.nix deleted file mode 100644 index 305439d..0000000 --- a/nix/programs/coding.nix +++ /dev/null @@ -1,121 +0,0 @@ -{ pkgs -, lib -, config -, ... -}: -{ - imports = [ - # old neovim config - # (import ./nvim/default.nix { inherit lib pkgs; colorscheme = config.conf.colorscheme; }) - ]; - - programs.dashvim = { - enable = true; - colorscheme = config.conf.colorscheme; - }; - - home.packages = with pkgs; [ - #basics - gitui - gcc - meson - ninja - tree-sitter - unzip - pkg-config - sqlite - plantuml - d-spy - - # cpp - bear - clang-tools - - #sql - nodePackages.sql-formatter - sqls - - #assembly - asm-lsp - - #yaml - yamlfmt - yamllint - yaml-language-server - - #markdown - marksman - mdformat - - #bash - bash-language-server - shfmt - - #fsharp - fsharp - fsautocomplete - - #haskell - haskellPackages.cabal-install - ghc - haskellPackages.haskell-language-server - - #html - html-tidy - - #json - jq - nodePackages.vscode-json-languageserver - - #css - tailwindcss - tailwindcss-language-server - vscode-langservers-extracted - - #editors - neovide - ##fallback - vscodium - - #rust - rustup - - #python - python3 - python312Packages.python-lsp-server - python312Packages.python-lsp-ruff - python312Packages.python-lsp-black - - #ts/js - nodejs_20 - deno - typescript - nodePackages.typescript-language-server - nodePackages.prettier - - #go - go - gopls - - #typst - typst - tinymist - ltex-ls - - #java - gradle - maven - jdt-language-server - adoptopenjdk-jre-bin - - #.! - dotnet-sdk_8 - omnisharp-roslyn - csharpier - netcoredbg - - #zig - zig - zls - ]; -} diff --git a/nix/programs/common.nix b/nix/programs/common.nix deleted file mode 100644 index 49f0074..0000000 --- a/nix/programs/common.nix +++ /dev/null @@ -1,128 +0,0 @@ -{ pkgs -, inputs -, lib -, config -, ... -}: -let - callPackage = lib.callPackageWith (pkgs); - username = config.conf.username; -in -{ - manual = { - html.enable = false; - json.enable = false; - manpages.enable = false; - }; - - fonts.fontconfig.enable = true; - home.packages = with pkgs; [ - vesktop - kitty - fish - ripgrep - rm-improved - bat - fd - lsd - (pkgs.nerdfonts.override { fonts = [ "JetBrainsMono" ]; }) - noto-fonts - flatpak - networkmanager - zoxide - fastfetch - pkgs.gnome-keyring - dbus - killall - adw-gtk3 - qt5ct - qt6ct - gnutar - fishPlugins.tide - nix-index - libnotify - zenith - nh - amberol - pulseaudio - playerctl - ncspot - poppler_utils - brave - greetd.regreet - sops - flake-checker - ffmpeg - system-config-printer - brightnessctl - (callPackage - ../override/cambalache.nix - { }) - ]; - - #my own programs - programs.oxicalc.enable = true; - programs.oxinoti.enable = true; - programs.oxidash.enable = true; - programs.oxishut.enable = true; - programs.oxipaste.enable = true; - programs.hyprdock.enable = true; - programs.ReSet.enable = true; - programs.ReSet.config.plugins = [ - inputs.reset-plugins.packages."x86_64-linux".monitor - inputs.reset-plugins.packages."x86_64-linux".keyboard - ]; - programs.ReSet.config.plugin_config = { - Keyboard = { - path = "/home/${username}/.config/reset/keyboard.conf"; - }; - }; - - nixpkgs.config.allowUnfree = true; - - home.username = username; - home.homeDirectory = "/home/${username}"; - home.stateVersion = "24.05"; - - home.sessionPath = [ - "$HOME/.cargo/bin" - ]; - - home.sessionVariables = { - GOROOT = "$HOME/.go"; - }; - - home.keyboard = null; - - home.file.".local/share/flatpak/overrides/global".text = '' - [Context] - filesystems=xdg-config/gtk-3.0;xdg-config/gtk-4.0 - ''; - # - # dconf.settings = { - # "org/gnome/desktop/interface" = { - # gtk-theme = "adw-gtk3"; - # cursor-theme = "Bibata-Modern-Classic"; - # cursor-size = 24; - # icon-theme = "MoreWaita"; - # }; - # }; - - programs.nix-index = - { - enable = true; - enableFishIntegration = true; - }; - - sops = { - gnupg = { - home = "~/.gnupg"; - sshKeyPaths = [ ]; - }; - defaultSopsFile = ../secrets/secrets.yaml; - secrets.hub = { }; - secrets.lab = { }; - secrets.${username} = { }; - }; - systemd.user.services.mbsync.Unit.After = [ "sops-nix.service" ]; -} diff --git a/nix/programs/default.nix b/nix/programs/default.nix deleted file mode 100644 index a0e4b2f..0000000 --- a/nix/programs/default.nix +++ /dev/null @@ -1,48 +0,0 @@ -{ inputs, pkgs, config, lib, mod, ... }: -let - base_imports = [ - inputs.anyrun.homeManagerModules.default - inputs.ironbar.homeManagerModules.default - inputs.oxicalc.homeManagerModules.default - inputs.oxishut.homeManagerModules.default - inputs.oxinoti.homeManagerModules.default - inputs.oxidash.homeManagerModules.default - inputs.oxipaste.homeManagerModules.default - inputs.hyprdock.homeManagerModules.default - inputs.hyprland.homeManagerModules.default - inputs.reset.homeManagerModules.default - inputs.nix-flatpak.homeManagerModules.nix-flatpak - inputs.sops-nix.homeManagerModules.sops - inputs.dashvim.homeManagerModules.dashvim - ]; -in -{ - xdg.portal.config.common.default = "*"; - xdg.portal = { - enable = true; - extraPortals = [ - pkgs.xdg-desktop-portal-gtk - ]; - }; - home-manager.useGlobalPkgs = true; - home-manager.useUserPackages = true; - home-manager.extraSpecialArgs = { - inherit inputs; - }; - - home-manager.users.${config.conf.username} = { - imports = [ - ./hyprland/default.nix - ./flatpak.nix - ./common.nix - ./coding.nix - ./xdg.nix - ./media.nix - ./utils.nix - ./oxi/default.nix - ./themes/default.nix - ./individual_configs/default.nix - ] ++ base_imports - ++ lib.optional (builtins.pathExists mod) mod; - }; -} diff --git a/nix/programs/flatpak.nix b/nix/programs/flatpak.nix deleted file mode 100644 index 4abc89d..0000000 --- a/nix/programs/flatpak.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ lib, ... }: { - - services.flatpak.remotes = lib.mkOptionDefault [{ - name = "flathub-stable"; - location = "https://dl.flathub.org/repo/flathub.flatpakrepo"; - }]; - services.flatpak.uninstallUnmanaged = true; - services.flatpak.packages = [ - # fallback if necessary, but generally avoided as nix is superior :) - "com.github.tchx84.Flatseal" - "io.github.Foldex.AdwSteamGtk" - ]; -} - diff --git a/nix/programs/gaming/default.nix b/nix/programs/gaming/default.nix deleted file mode 100644 index fa34c60..0000000 --- a/nix/programs/gaming/default.nix +++ /dev/null @@ -1,33 +0,0 @@ -{ pkgs -, lib -, config -, ... -}: lib.mkIf config.conf.gaming.enable { - environment.systemPackages = with pkgs; [ - gamemode - steam - lutris - wine - adwsteamgtk - ]; - - programs.steam.enable = true; - programs.gamemode.enable = true; - programs.gamemode = { - enableRenice = true; - settings = { - general = { - governor = "performance"; - }; - gpu = { - apply_gpu_optimisations = "accept-responsibility"; - gpu_device = config.conf.gaming.device; - amd_performance_level = "high"; - }; - custom = { - start = "notify-send -a 'Gamemode' 'Optimizations activated'"; - end = "notify-send -a 'Gamemode' 'Optimizations deactivated'"; - }; - }; - }; -} diff --git a/nix/programs/hyprland/anyrun.nix b/nix/programs/hyprland/anyrun.nix deleted file mode 100644 index 08d78dc..0000000 --- a/nix/programs/hyprland/anyrun.nix +++ /dev/null @@ -1,69 +0,0 @@ -{ inputs, pkgs, ... }: { - programs.anyrun = { - enable = true; - config = { - plugins = [ - inputs.anyrun.packages.${pkgs.system}.applications - inputs.anyrun.packages.${pkgs.system}.rink - inputs.anyrun.packages.${pkgs.system}.translate - inputs.anyrun.packages.${pkgs.system}.websearch - ]; - #position = "center"; - hideIcons = false; - width = { fraction = 0.3; }; - y = { fraction = 0.5; }; - layer = "overlay"; - hidePluginInfo = true; - closeOnClick = true; - }; - - extraCss = '' - #window { - border-radius: 10px; - background-color: none; - } - - box#main { - border-radius: 10px; - } - - list#main { - border-radius: 10px; - margin: 0px 10px 10px 10px; - } - - list#plugin { - border-radius: 10px; - } - - list#match { - border-radius: 10px; - } - - entry#entry { - border: none; - border-radius: 10px; - margin: 10px 10px 0px 10px; - } - - label#match-desc { - font-size: 12px; - border-radius: 10px; - } - - label#match-title { - font-size: 12px; - border-radius: 10px; - } - - label#plugin { - font-size: 16px; - border-radius: 10px; - } - - * { - border-radius: 10px; - } - ''; - }; -} diff --git a/nix/programs/hyprland/config.nix b/nix/programs/hyprland/config.nix deleted file mode 100644 index 4673dd6..0000000 --- a/nix/programs/hyprland/config.nix +++ /dev/null @@ -1,261 +0,0 @@ -{ config -, lib -, ... -}: -{ - wayland.windowManager.hyprland.enable = true; - wayland.windowManager.hyprland.settings = { - "$mod" = "SUPER"; - "source" = "/home/${config.conf.username}/.config/reset/keyboard.conf"; - - bindm = [ - "$mod, mouse:272, movewindow" - "$mod, mouse:273, resizewindow" - ]; - - bind = [ - # screenshots - "$mod SUPER,S,exec,grim -g \"$(slurp)\" - | wl-copy" - "$mod SUPERSHIFTALT,S,exec, grim -g \"$(slurp)\" $HOME/gits/ost-5semester/Screenshots/$(date +'%Y_%m_%d_%I_%M_%S.png') && (date +'%Y_%m_%d_%I_%M_%S.png') | wl-copy" - "$mod SUPERSHIFT,S,exec,grim -g \"$(slurp)\" - | satty -f -" - "$mod SUPERCONTROLSHIFT,S,exec,grim -c -g \"2560,0 3440x1440\" - | wl-copy" - - # regular programs - "$mod SUPER,F,exec,firefox" - "$mod SUPER,T,exec,kitty -1" - "$mod SUPER,E,exec,nautilus -w" - "$mod SUPER,N,exec,neovide" - "$mod SUPER,M,exec,oxidash" - "$mod SUPER,R,exec,anyrun" - "$mod SUPER,G,exec,oxicalc" - "$mod SUPER,D,exec,oxishut" - "$mod SUPER,A,exec,oxipaste" - "$mod SUPERSHIFT,P,exec,hyprdock --gui" - "$mod SUPERSHIFT,L,exec, playerctl -a pause & hyprlock & systemctl suspend" - "$mod SUPERSHIFT,K,exec, playerctl -a pause & hyprlock & systemctl hibernate" - - # media keys - ",XF86AudioMute,exec, $HOME/.config/scripts/audio_control.sh mute" - ",XF86AudioLowerVolume,exec, $HOME/.config/scripts/audio_control.sh sink -5%" - ",XF86AudioRaiseVolume,exec, $HOME/.config/scripts/audio_control.sh sink +5%" - ",XF86AudioPlay,exec, playerctl play-pause" - ",XF86AudioNext,exec, playerctl next" - ",XF86AudioPrev,exec, playerctl previous" - ",XF86MonBrightnessDown,exec, $HOME/.config/scripts/change-brightness brightness 10%-" - ",XF86MonBrightnessUp,exec, $HOME/.config/scripts/change-brightness brightness +10%" - - # hyprland keybinds - # misc - "$mod SUPER,V,togglefloating," - "$mod SUPER,B,fullscreen," - "$mod SUPER,C,togglesplit" - "$mod SUPER,Q,killactive," - "$mod SUPERSHIFTALT,M,exit," - "$mod SUPERSHIFT,W,togglespecialworkspace" - - # move - "$mod SUPER,left,movewindow,l" - "$mod SUPER,right,movewindow,r" - "$mod SUPER,up,movewindow,u" - "$mod SUPER,down,movewindow,d" - - # workspaces - "$mod SUPER,1,workspace,1" - "$mod SUPER,2,workspace,2" - "$mod SUPER,3,workspace,3" - "$mod SUPER,4,workspace,4" - "$mod SUPER,5,workspace,5" - "$mod SUPER,6,workspace,6" - "$mod SUPER,7,workspace,7" - "$mod SUPER,8,workspace,8" - "$mod SUPER,9,workspace,9" - "$mod SUPER,0,workspace,10" - - # move to workspace - "$mod SUPERSHIFT,1,movetoworkspace,1" - "$mod SUPERSHIFT,2,movetoworkspace,2" - "$mod SUPERSHIFT,3,movetoworkspace,3" - "$mod SUPERSHIFT,4,movetoworkspace,4" - "$mod SUPERSHIFT,5,movetoworkspace,5" - "$mod SUPERSHIFT,6,movetoworkspace,6" - "$mod SUPERSHIFT,7,movetoworkspace,7" - "$mod SUPERSHIFT,8,movetoworkspace,8" - "$mod SUPERSHIFT,9,movetoworkspace,9" - "$mod SUPERSHIFT,0,movetoworkspace,10" - - - # move to workspace silent - "$mod SUPERSHIFTALT,1,movetoworkspacesilent,1" - "$mod SUPERSHIFTALT,2,movetoworkspacesilent,2" - "$mod SUPERSHIFTALT,3,movetoworkspacesilent,3" - "$mod SUPERSHIFTALT,4,movetoworkspacesilent,4" - "$mod SUPERSHIFTALT,5,movetoworkspacesilent,5" - "$mod SUPERSHIFTALT,6,movetoworkspacesilent,6" - "$mod SUPERSHIFTALT,7,movetoworkspacesilent,7" - "$mod SUPERSHIFTALT,8,movetoworkspacesilent,8" - "$mod SUPERSHIFTALT,9,movetoworkspacesilent,9" - "$mod SUPERSHIFTALT,0,movetoworkspacesilent,10" - - # preselection - "$mod SUPERALT,j,layoutmsg,preselect l" - "$mod SUPERALT,k,layoutmsg,preselect d" - "$mod SUPERALT,l,layoutmsg,preselect u" - "$mod SUPERALT,semicolon,layoutmsg,preselect r" - "$mod SUPERALT,h,layoutmsg,preselect n" - ]; - - binde = [ - # hyprland keybinds - # focus - "$mod SUPER,J,movefocus,l" - "$mod SUPER,semicolon,movefocus,r" - "$mod SUPER,L,movefocus,u" - "$mod SUPER,K,movefocus,d" - - # resize - "$mod SUPER,U,resizeactive,-20 0" - "$mod SUPER,P,resizeactive,20 0" - "$mod SUPER,O,resizeactive,0 -20" - "$mod SUPER,I,resizeactive,0 20" - ]; - - general = { - gaps_out = "3,5,5,5"; - border_size = 3; - "col.active_border" = lib.mkForce "0xFFFF0000 0xFF00FF00 0xFF0000FF 45deg"; - # "col.inactive_border" = "0x66333333"; - allow_tearing = true; - }; - - decoration = { - rounding = 4; - }; - - animations = { - bezier = "penguin,0.05,0.9,0.1,1.0"; - animation = [ - "windowsMove,1,4,default" - "windows,1,7,default,popin 70%" - "windowsOut,1,7,default,popin 70%" - "border,1,10,default" - "fade,1,7,default" - "workspaces,1,6,default" - "layers,1,3,default,popin" - ]; - }; - - dwindle = { - preserve_split = true; - pseudotile = 0; - permanent_direction_override = false; - }; - - input = { - #kb_layout = "dashie"; - repeat_delay = 200; - force_no_accel = true; - touchpad = { - natural_scroll = true; - tap-to-click = true; - tap-and-drag = true; - }; - }; - - misc = { - animate_manual_resizes = 1; - enable_swallow = true; - disable_splash_rendering = true; - disable_hyprland_logo = true; - swallow_regex = "^(.*)(kitty)(.*)$"; - initial_workspace_tracking = 1; - }; - - cursor = { - # conversion seems to be borked right now, i want a smooth bibata :( - enable_hyprcursor = false; - }; - - gestures = { - workspace_swipe = true; - }; - - monitor = config.conf.hyprland.monitor; - workspace = config.conf.hyprland.workspace; - - env = [ - "GTK_CSD,0" - "TERM,\"kitty /bin/fish\"" - "XDG_CURRENT_DESKTOP=Hyprland" - "XDG_SESSION_TYPE=wayland" - "XDG_SESSION_DESKTOP=Hyprland" - "HYPRCURSOR_THEME,Bibata-Modern-Classic" - "HYPRCURSOR_SIZE,24" - "XCURSOR_THEME,Bibata-Modern-Classic" - "XCURSOR_SIZE,24" - "QT_QPA_PLATFORM,wayland" - "QT_QPA_PLATFORMTHEME,qt5ct" - "QT_WAYLAND_FORCE_DPI,96" - "QT_AUTO_SCREEN_SCALE_FACTOR,0" - "QT_WAYLAND_DISABLE_WINDOWDECORATION,1" - "QT_SCALE_FACTOR,1" - "EDITOR,\"neovide --novsync --nofork\"" - "WLR_DRM_NO_ATOMIC,1" - "GTK_USE_PORTAL, 1" - ]; - - layerrule = [ - # layer rules - # mainly to disable animations within slurp and grim - "noanim, selection" - ]; - - windowrule = [ - # window rules - "tile,^(.*)(Spotify)(.*)$" - "float,^(.*)(OxiCalc)(.*)$" - "float,^(.*)(winecfg.exe)(.*)$" - "float,^(.*)(speed.exe)(.*)$" - "float,^(.*)(copyq)(.*)$" - "center,^(.*)(swappy)(.*)$" - "float,title:^(.*)(Spirit)(.*)$" - "float,title:^(.*)(reset)(.*)$" - "workspace 10 silent,^(.*)(steam)(.*)$" - "workspace 9 silent,^(.*)(dota)(.*)$" - "workspace 9 silent,^(.*)(battlebits)(.*)$" - "workspace 9 silent,^(.*)(aoe)(.*)$" - "suppressevent fullscreen maximize,^(.*)(neovide)(.*)$" - ]; - - windowrulev2 = [ - "immediate,class:^(.*)(Pal)$" - "immediate,class:^(.*)(dota2)$" - "immediate,class:^(.*)(needforspeedheat.exe)$" - ]; - - exec-once = [ - # environment - "systemctl --user import-environment" - "dbus-update-activation-environment --systemd --all" - "hyprctl setcursor Bibata-Modern-Classic 24" - - # other programs - "hyprpaper" - "ironbar" - "firefox" - "oxipaste_daemon" - "nextcloud --background" - "oxinoti" - ] ++ config.conf.hyprland.extra_autostart; - - # plugin = { - # hyprspace = { - # bind = [ - # "SUPER, W, overview:toggle, toggle" - # ]; - # }; - # }; - }; - # wayland.windowManager.hyprland.plugins = [ - # inputs.Hyprspace.packages.${pkgs.system}.Hyprspace - # ]; -} diff --git a/nix/programs/hyprland/default.nix b/nix/programs/hyprland/default.nix deleted file mode 100644 index c0873de..0000000 --- a/nix/programs/hyprland/default.nix +++ /dev/null @@ -1,28 +0,0 @@ -{ pkgs -, ... -}: { - imports = [ - ./anyrun.nix - ./config.nix - ./ironbar.nix - ./hyprpaper.nix - ./hyprlock.nix - ]; - - home.packages = with pkgs; [ - xorg.xprop - grim - slurp - satty - xdg-desktop-portal-gtk - # xdg-desktop-portal-hyprland - copyq - nautilus - sushi - nautilus-python - wl-clipboard - hyprcursor - hyprpaper - hyprpicker - ]; -} diff --git a/nix/programs/hyprland/hyprlock.nix b/nix/programs/hyprland/hyprlock.nix deleted file mode 100644 index 70e01b7..0000000 --- a/nix/programs/hyprland/hyprlock.nix +++ /dev/null @@ -1,36 +0,0 @@ -{ config -, ... -}: -{ - programs.hyprlock = { - enable = true; - settings = { - background = [ - { - monitor = ""; - path = ""; - color = "rgba(26, 27, 38, 1.0)"; - } - ]; - - input-field = [ - { - monitor = "${config.conf.monitor}"; - - placeholder_text = "password or something"; - } - ]; - - label = [ - { - monitor = "${config.conf.monitor}"; - text = "$TIME"; - font_size = 50; - position = "0, 200"; - valign = "center"; - halign = "center"; - } - ]; - }; - }; -} diff --git a/nix/programs/hyprland/hyprpaper.nix b/nix/programs/hyprland/hyprpaper.nix deleted file mode 100644 index 802a963..0000000 --- a/nix/programs/hyprland/hyprpaper.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ config, ... }: { - xdg.configFile."hypr/hyprpaper.conf" = { - text = config.conf.hyprland.hyprpaper; - }; -} diff --git a/nix/programs/hyprland/ironbar.nix b/nix/programs/hyprland/ironbar.nix deleted file mode 100644 index 0b8a070..0000000 --- a/nix/programs/hyprland/ironbar.nix +++ /dev/null @@ -1,261 +0,0 @@ -{ config, ... }: -let - username = config.conf.username; -in -{ - - programs.ironbar = - { - enable = true; - style = '' - @import url("/home/${username}/.config/gtk-3.0/gtk.css"); - - * { - color: #71bbe6; - padding: 0px; - margin: 0px; - } - - .background { - background-color: rgba(0, 0, 0, 0); - } - - .workspaces { - margin: 2px 0px 0px 5px; - border-radius: 10px; - /* background-color: #2b2c3b; */ - background-color: #1E1E2E; - padding: 2px 5px 2px 5px; - } - - .workspaces .item { - margin: 0px 3px 0px 3px; - font-size: 13px; - border-radius: 100%; - padding: 0px 2px 0px 3px; - background-color: rgba(0, 0, 0, 0); - } - - .workspaces .item:hover { - background-color: #3e4152; - } - - .workspaces .item.focused { - background-color: #3e4152; - } - - .audio-box { - padding: 2em; - background-color: #1E1E2E; - border-radius: 5px; - } - - .audio-slider { - padding: 5px; - margin: 5px; - } - - .audio-button { - padding: 5px 10px 5px 10px; - margin: 0px 1em 20px 1em; - border-radius: 100%; - font-size: 17px; - } - - .audio-button-box { - padding: 0px 2.5em 0px 2.5em; - } - - .focused { - /* margin: 2px 0px 0px 0px; */ - padding: 0px 5px 0px 5px; - /* background-color: 1a1b26; */ - background-color: #1E1E2E; - font-size: 17px; - border-radius: 10px; - } - - #bar #end { - margin: 0px 5px 0px 0px; - padding: 0px 5px 0px 5px; - background-color: #1E1E2E; - border-radius: 10px; - } - - .popup-button { - padding: 0px 5px 0px 3px; - margin: 0em 3px; - border-radius: 100%; - font-size: 13px; - background-color: #1E1E2E; - } - - .popup-button-box { - padding: 2px 0px 2px 0px; - } - - .clock { - padding: 0px 5px 0px 5px; - font-size: 17px; - background-color: #1E1E2E; - } - - .clock:hover { - background-color: #3e4152; - } - - .custom button { - background-color: #1E1E2E; - } - - .custom button:hover { - background-color: #3e4152; - } - - .memory-usage { - font-size: 15px; - margin: 0px 5px 0px 0px; - } - - .memory-usage:hover { - background-color: #3e4152; - } - - .popup-clock { - background-color: #1E1E2E; - border-radius: 5px; - padding: 2px 8px 10px 8px; - } - - .popup-clock .calendar-clock { - font-size: 2.5em; - padding-bottom: 0.1em; - } - - .popup-clock .calendar { - border-radius: 5px; - font-size: 1.05em; - } - - .popup-clock .calendar:selected { - background-color: #3e4152; - } - ''; - features = [ - #"another_feature" - ]; - config = { - monitors."${config.conf.monitor}" = { - end = config.conf.ironbar.modules ++ [ - { - type = "sys_info"; - format = [ - " {memory_percent}" - ]; - interval.memory = 30; - class = "memory-usage"; - } - { - type = "custom"; - bar = [ - { - type = "button"; - class = "popup-button"; - label = ""; - on_click = "popup:toggle"; - } - ]; - class = "popup-button-box"; - popup = [ - { - type = "box"; - orientation = "vertical"; - class = "audio-box"; - widgets = [ - { - type = "box"; - orientation = "horizontal"; - widgets = [ - { - type = "button"; - class = "audio-button"; - label = ""; - on_click = "!/home/${username}/.config/eww/scripts/audio_control.sh bluetooth"; - } - { - type = "button"; - class = "audio-button"; - label = "󰋋"; - on_click = "!/home/${username}/.config/eww/scripts/audio_control.sh internal"; - } - ]; - class = "audio-button-box"; - } - { - type = "label"; - label = "Output"; - } - { - type = "slider"; - class = "audio-slider"; - step = 1.0; - length = 200; - value = "pactl get-sink-volume @DEFAULT_SINK@ | awk -F'/' '{ print $2 }' | tr -d ' %'"; - on_change = "!pactl set-sink-volume @DEFAULT_SINK@ $0%"; - } - { - type = "label"; - label = "Input"; - } - { - type = "slider"; - class = "audio-slider"; - step = 1.0; - length = 200; - value = "pactl get-source-volume @DEFAULT_SOURCE@ | awk -F'/' '{ print $2 }' | tr -d ' %'"; - on_change = "!pactl set-source-volume @DEFAULT_SOURCE@ $0%"; - } - ]; - } - ]; - } - { - type = "custom"; - bar = [ - { - type = "button"; - class = "popup-button"; - label = ""; - on_click = "!oxidash --css /home/${username}/gits/oxidash/style.css"; - } - ]; - class = "popup-button-box"; - } - { - type = "clock"; - format = "%I:%M"; - format_popup = "%I:%M:%S"; - locale = "en_US"; - } - { type = "tray"; } - ]; - position = "top"; - height = 10; - anchor_to_edges = true; - start = [{ - type = "workspaces"; - all_monitors = true; - }]; - center = [ - { - type = "focused"; - show_icon = true; - show_title = true; - icon_size = 20; - truncate = "end"; - } - ]; - }; - }; - }; -} diff --git a/nix/programs/individual_configs/default.nix b/nix/programs/individual_configs/default.nix deleted file mode 100644 index f705a7b..0000000 --- a/nix/programs/individual_configs/default.nix +++ /dev/null @@ -1,13 +0,0 @@ -{ - imports = [ - ./kitty.nix - ./yazi.nix - ./fish.nix - ./ssh.nix - ./direnv.nix - ./git.nix - ./firefox.nix - ./keepass.nix - ./neovide.nix - ]; -} diff --git a/nix/programs/individual_configs/direnv.nix b/nix/programs/individual_configs/direnv.nix deleted file mode 100644 index 615b570..0000000 --- a/nix/programs/individual_configs/direnv.nix +++ /dev/null @@ -1,7 +0,0 @@ -{ pkgs, ... }: { - xdg.configFile."direnv/direnv.toml".source = (pkgs.formats.toml { }).generate "direnv" { - global = { - warn_timeout = "-1s"; - }; - }; -} diff --git a/nix/programs/individual_configs/firefox.nix b/nix/programs/individual_configs/firefox.nix deleted file mode 100644 index 6457c05..0000000 --- a/nix/programs/individual_configs/firefox.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ pkgs, config, ... }: { - programs.firefox = { - enable = true; - - policies = { - EnableTrackingProtection = { - Value = true; - Locked = true; - Cryptomining = true; - Fingerprinting = true; - }; - DisablePocket = true; - DisplayBookmarksToolbar = "never"; - DisplayMenuBar = "default-off"; - }; - profiles.${config.conf.username} = { - extensions = with pkgs.nur.repos.rycee.firefox-addons; [ - ublock-origin - darkreader - privacy-badger - vimium - keepassxc-browser - i-dont-care-about-cookies - tokyo-night-v2 - - ]; - }; - }; -} diff --git a/nix/programs/individual_configs/fish.nix b/nix/programs/individual_configs/fish.nix deleted file mode 100644 index 2c955e7..0000000 --- a/nix/programs/individual_configs/fish.nix +++ /dev/null @@ -1,140 +0,0 @@ -{ config, ... }: { - xdg.configFile."fish/config.fish" = { - text = - '' - if status is-interactive - # Commands to run in interactive sessions can go here - end - - # ============================================================================= - # - # Utility functions for zoxide. - # - - export NIX_PATH="$NIX_PATH:$HOME/gits/dotFiles/nix/." - - set EDITOR "neovide --no-fork" - - alias rebuild='sudo nixos-rebuild switch --flake /home/${config.conf.username}/gits/dotFiles/nix/.' - abbr --add ls 'lsd' - abbr --add :q 'exit' - abbr --add gh 'git push origin' - abbr --add gl 'git pull origin' - abbr --add gm 'git commit -m' - abbr --add ga "git add -A" - abbr --add g+ 'bear -- g++ -Wextra -Werror -std=c++20' - abbr --add s "kitty +kitten ssh" - abbr --add zl 'z "" ' - abbr --add nv 'neovide' - abbr --add cr 'cargo run' - abbr --add grep 'rg' - abbr --add cat 'bat' - abbr --add find 'fd' - abbr --add rm 'rip' - - set fish_greeting - # pwd based on the value of _ZO_RESOLVE_SYMLINKS. - function __zoxide_pwd - builtin pwd -L - end - - # A copy of fish's internal cd function. This makes it possible to use - # `alias cd=z` without causing an infinite loop. - if ! builtin functions --query __zoxide_cd_internal - if builtin functions --query cd - builtin functions --copy cd __zoxide_cd_internal - else - alias __zoxide_cd_internal='builtin cd' - end - end - - # cd + custom logic based on the value of _ZO_ECHO. - function __zoxide_cd - __zoxide_cd_internal $argv - end - - # ============================================================================= - # - # Hook configuration for zoxide. - # - - # Initialize hook to add new entries to the database. - function __zoxide_hook --on-variable PWD - test -z "$fish_private_mode" - and command zoxide add -- (__zoxide_pwd) - end - - # ============================================================================= - # - # When using zoxide with --no-cmd, alias these internal functions as desired. - # - - if test -z $__zoxide_z_prefix - set __zoxide_z_prefix 'z!' - end - set __zoxide_z_prefix_regex ^(string escape --style=regex $__zoxide_z_prefix) - - # Jump to a directory using only keywords. - function __zoxide_z - set -l argc (count $argv) - if test $argc -eq 0 - __zoxide_cd $HOME - else if test "$argv" = - - __zoxide_cd - - else if test $argc -eq 1 -a -d $argv[1] - __zoxide_cd $argv[1] - else if set -l result (string replace --regex $__zoxide_z_prefix_regex \'\' $argv[-1]); and test -n $result - __zoxide_cd $result - else - set -l result (command zoxide query --exclude (__zoxide_pwd) -- $argv) - and __zoxide_cd $result - end - end - - # Completions. - function __zoxide_z_complete - set -l tokens (commandline --current-process --tokenize) - set -l curr_tokens (commandline --cut-at-cursor --current-process --tokenize) - - if test (count $tokens) -le 2 -a (count $curr_tokens) -eq 1 - # If there are < 2 arguments, use `cd` completions. - complete --do-complete "\'\' "(commandline --cut-at-cursor --current-token) | string match --regex '.*/$' - else if test (count $tokens) -eq (count $curr_tokens); and ! string match --quiet --regex $__zoxide_z_prefix_regex. $tokens[-1] - # If the last argument is empty and the one before doesn't start with - # $__zoxide_z_prefix, use interactive selection. - set -l query $tokens[2..-1] - set -l result (zoxide query --exclude (__zoxide_pwd) --interactive -- $query) - and echo $__zoxide_z_prefix$result - commandline --function repaint - end - end - complete --command __zoxide_z --no-files --arguments '(__zoxide_z_complete)' - - # Jump to a directory using interactive search. - function __zoxide_zi - set -l result (command zoxide query --interactive -- $argv) - and __zoxide_cd $result - end - - # ============================================================================= - # - # Commands for zoxide. Disable these using --no-cmd. - # - - abbr --erase z &>/dev/null - alias z=__zoxide_z - - abbr --erase zi &>/dev/null - alias zi=__zoxide_zi - - # ============================================================================= - # - # To initialize zoxide, add this to your configuration (usually - # ~/.config/fish/config.fish): - # - # zoxide init fish | source - - direnv hook fish | source - ''; - }; -} diff --git a/nix/programs/individual_configs/git.nix b/nix/programs/individual_configs/git.nix deleted file mode 100644 index 36fd9e0..0000000 --- a/nix/programs/individual_configs/git.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ - programs.git = { - enable = true; - userName = "DashieTM"; - userEmail = "fabio.lenherr@gmail.com"; - extraConfig = { - merge = { - tool = "nvimdiff"; - }; - diff = { - tool = "nvimdiff"; - }; - }; - }; - -} diff --git a/nix/programs/individual_configs/keepass.nix b/nix/programs/individual_configs/keepass.nix deleted file mode 100644 index 58ffdb3..0000000 --- a/nix/programs/individual_configs/keepass.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ - xdg.configFile."keepassxc/keepassxc.ini" = { - text = - '' - [General] - ConfigVersion=2 - - [Browser] - CustomProxyLocation= - Enabled=true - - [GUI] - ApplicationTheme=classic - HidePasswords=true - TrayIconAppearance=monochrome-light - - [PasswordGenerator] - AdditionalChars= - ExcludedChars= - Length=18 - - [Security] - EnableCopyOnDoubleClick=true - ''; - }; -} diff --git a/nix/programs/individual_configs/kitty.nix b/nix/programs/individual_configs/kitty.nix deleted file mode 100644 index 4bdaf35..0000000 --- a/nix/programs/individual_configs/kitty.nix +++ /dev/null @@ -1,83 +0,0 @@ -{ lib, config, inputs, pkgs, ... }: -let - base16 = pkgs.callPackage inputs.base16.lib { }; - scheme = (base16.mkSchemeAttrs config.stylix.base16Scheme); - hexTable = { - "0" = "1"; - "1" = "0"; - "2" = "1"; - "3" = "2"; - "4" = "3"; - "5" = "4"; - "6" = "5"; - "7" = "6"; - "8" = "7"; - "9" = "8"; - "a" = "9"; - "b" = "a"; - "c" = "b"; - "d" = "c"; - "e" = "d"; - "f" = "e"; - }; - base = "#" + lib.strings.concatStrings ((lib.lists.take 5 (lib.strings.stringToCharacters scheme.base00)) ++ [ hexTable."${(lib.lists.last (lib.strings.stringToCharacters scheme.base00))}" ]); -in -{ - - stylix.targets.kitty = { - enable = false; - }; - programs.kitty = { - enable = true; - - settings = { - enable_audio_bell = "no"; - window_alert_on_bell = "no"; - cursor_blink_interval = "0"; - window_padding_width = "1"; - shell_integration = "yes"; - sync_with_monitor = "no"; - background_opacity = "0.8"; - - font_family = "JetBrainsMono Nerd Font Mono"; - bold_font = "JetBrainsMono Nerd Font Mono Extra Bold"; - italic_font = "JetBrainsMono Nerd Font Mono Extra Italic"; - bold_italic_font = "JetBrainsMono Nerd Font Mono Extra Bold Italic"; - - background = base; - foreground = "#" + scheme.base05; - selection_foreground = "#" + scheme.base05; - selection_background = base; - url_color = "#" + scheme.base04; - cursor = "#" + scheme.base05; - active_border_color = "#" + scheme.base03; - inactive_border_color = "#" + scheme.base01; - active_tab_background = base; - active_tab_foreground = "#" + scheme.base05; - inactive_tab_background = "#" + scheme.base01; - inactive_tab_foreground = "#" + scheme.base04; - tab_bar_background = "#" + scheme.base01; - - color0 = base; - color1 = "#" + scheme.base08; - color2 = "#" + scheme.base0B; - color3 = "#" + scheme.base0A; - color4 = "#" + scheme.base0D; - color5 = "#" + scheme.base0E; - color6 = "#" + scheme.base0C; - color7 = "#" + scheme.base05; - - color8 = "#" + scheme.base03; - color9 = "#" + scheme.base08; - color10 = "#" + scheme.base0B; - color11 = "#" + scheme.base0A; - color12 = "#" + scheme.base0D; - color13 = "#" + scheme.base0E; - color14 = "#" + scheme.base0C; - color15 = "#" + scheme.base07; - - shell = "fish"; - }; - - }; -} diff --git a/nix/programs/individual_configs/ncspot.nix b/nix/programs/individual_configs/ncspot.nix deleted file mode 100644 index 931535b..0000000 --- a/nix/programs/individual_configs/ncspot.nix +++ /dev/null @@ -1,38 +0,0 @@ -{ pkgs, ... }: { - xdg.configFile."ncspot/config.toml".source = (pkgs.formats.toml { }).generate "ncspot" { - notify = true; - shuffle = true; - cover_max_scale = 2; - initial_screen = "library"; - library_tabs = [ "playlists" ]; - theme = { - background = "#1a1b26"; - primary = "#9aa5ce"; - secondary = "#414868"; - title = "#9ece6a"; - playing = "#7aa2f7"; - playing_selected = "#bb9af7"; - playing_bg = "#24283b"; - highlight = "#c0caf5"; - highlight_bg = "#24283b"; - error = "#414868"; - error_bg = "#f7768e"; - statusbar = "#ff9e64"; - statusbar_progress = "#7aa2f7"; - statusbar_bg = "#1a1b26"; - cmdline = "#c0caf5"; - cmdline_bg = "#24283b"; - search_match = "#f7768e"; - }; - keybindings = { - "j" = "move left 1"; - "k" = "move down 1"; - "l" = "move up 1"; - ";" = "move right 1"; - }; - notification_format = { - title = "%artists"; - body = "%title"; - }; - }; -} diff --git a/nix/programs/individual_configs/neovide.nix b/nix/programs/individual_configs/neovide.nix deleted file mode 100644 index c9125e7..0000000 --- a/nix/programs/individual_configs/neovide.nix +++ /dev/null @@ -1,3 +0,0 @@ -{ pkgs, ... }: { - xdg.configFile."neovide/config.toml".source = (pkgs.formats.toml { }).generate "neovide" { }; -} diff --git a/nix/programs/individual_configs/ssh.nix b/nix/programs/individual_configs/ssh.nix deleted file mode 100644 index 68bdb00..0000000 --- a/nix/programs/individual_configs/ssh.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ config, ... }: { - home.file.".ssh/config".text = '' - Host github.com - IdentityFile ${config.sops.secrets.hub.path} - Host gitlab.com - IdentityFile ${config.sops.secrets.lab.path} - Host dashie.org - IdentityFile ${config.sops.secrets.dashie.path} - ''; -} diff --git a/nix/programs/individual_configs/yazi.nix b/nix/programs/individual_configs/yazi.nix deleted file mode 100644 index b04a7a7..0000000 --- a/nix/programs/individual_configs/yazi.nix +++ /dev/null @@ -1,1494 +0,0 @@ -{ - # don't ask.... - programs.yazi = - { - enable = true; - settings = { - log = { - enabled = false; - }; - opener = { - - folder = [ - { - run = "open - R \"$@\""; - orphan = true; - display_name = "Reveal in Finder"; - } - { - run = "$EDITOR \"$@\""; - orphan = true; - } - ]; - archive = [ - { - run = "unar \"$1\""; - display_name = "Extract here"; - } - ]; - text = [ - { - run = "$EDITOR \"$@\""; - orphan = true; - } - ]; - image = [ - { - run = "imv \"$@\""; - orphan = true; - display_name = "Open"; - } - { - run = "exiftool \"$1\"; echo \"Press enter to exit\"; read"; - block = true; - display_name = "Show EXIF"; - } - ]; - pdf = [{ - run = "zathura \"$@\""; - orphan = true; - display_name = "Open"; - }]; - video = [ - { - run = "mpv \"$@\""; - orphan = true; - } - { - run = "mediainfo \"$1\"; echo \"Press enter to exit\"; read"; - block = true; - display_name = "Show media info"; - } - ]; - audio = [ - { - run = "xdg-open \"$@\""; - orphan = true; - } - { run = "mediainfo \"$1\"; echo \"Press enter to exit\"; read"; block = true; display_name = "Show media info"; } - ]; - fallback = [ - { - run = "xdg-open \"$@\""; - orphan = true; - display_name = "Open"; - } - { - run = "xdg-open - R \"$@\""; - orphan = true; - display_name = "Reveal in Finder"; - } - ]; - }; - plugin = { - prepend_previewers = [ - { - name = "*.md"; - run = "glow"; - } - { mime = "text/csv"; run = "miller"; } - ]; - }; - }; - keymap = - { - manager.keymap = [ - { - on = [ - "" - ]; - run = "escape"; - desc = "Exit visual mode clear selected or cancel search"; - } - { - on = [ - "q" - ]; - run = "quit"; - desc = "Exit the process"; - } - { - on = [ - "Q" - ]; - run = "quit --no-cwd-file"; - desc = "Exit the process without writing cwd-file"; - } - { - on = [ - "" - ]; - run = "close"; - desc = "Close the current tab or quit if it is last tab"; - } - { - on = [ - "" - ]; - run = "suspend"; - desc = "Suspend the process"; - } - - # Navigation - { - on = [ - "l" - ]; - run = "arrow -1"; - desc = "Move cursor up"; - } - { - on = [ - "k" - ]; - run = "arrow 1"; - desc = "Move cursor down"; - } - - { - on = [ - "L" - ]; - run = "arrow -5"; - desc = "Move cursor up 5 lines"; - } - { - on = [ - "K" - ]; - run = "arrow 5"; - desc = "Move cursor down 5 lines"; - } - - { - on = [ - "" - ]; - run = "arrow -50%"; - desc = "Move cursor up half page"; - } - { - on = [ - "" - ]; - run = "arrow 50%"; - desc = "Move cursor down half page"; - } - { - on = [ - "" - ]; - run = "arrow -100%"; - desc = "Move cursor up one page"; - } - { - on = [ - "" - ]; - run = "arrow 100%"; - desc = "Move cursor down one page"; - } - - { - on = [ - "j" - ]; - run = "leave"; - desc = "Go back to the parent directory"; - } - { - on = [ - ";" - ]; - run = "enter"; - desc = "Enter the child directory"; - } - - { - on = [ - "J" - ]; - run = "back"; - desc = "Go back to the previous directory"; - } - { - on = [ - "P" - ]; - run = "forward"; - desc = "Go forward to the next directory"; - } - - { - on = [ - "" - ]; - run = "peek -5"; - desc = "Peek up 5 units in the preview"; - } - { - on = [ - "" - ]; - run = "peek 5"; - desc = "Peek down 5 units in the preview"; - } - - { - on = [ - "" - ]; - run = "arrow -1"; - desc = "Move cursor up"; - } - { - on = [ - "" - ]; - run = "arrow 1"; - desc = "Move cursor down"; - } - { - on = [ - "" - ]; - run = "leave"; - desc = "Go back to the parent directory"; - } - { - on = [ - "" - ]; - run = "enter"; - desc = "Enter the child directory"; - } - - { - on = [ - "g" - "g" - ]; - run = "arrow -99999999"; - desc = "Move cursor to the top"; - } - { - on = [ - "G" - ]; - run = "arrow 99999999"; - desc = "Move cursor to the bottom"; - } - - # Selection - { - on = [ - "v" - ]; - run = "visual_mode"; - desc = "Enter visual mode (selection mode)"; - } - { - on = [ - "V" - ]; - run = "visual_mode --unset"; - desc = "Enter visual mode (unset mode)"; - } - { - on = [ - "" - ]; - run = "select_all --state=true"; - desc = "Select all files"; - } - { - on = [ - "" - ]; - run = "select_all --state=none"; - desc = "Inverse selection of all files"; - } - - # Operation - { - on = [ - "o" - ]; - run = "open"; - desc = "Open the selected files"; - } - { - on = [ - "O" - ]; - run = "open --interactive"; - desc = "Open the selected files interactively"; - } - { - on = [ - "" - ]; - run = "open"; - desc = "Open the selected files"; - } - { - on = [ - "" - ]; - run = "open --interactive"; - desc = "Open the selected files interactively"; - } # It's cool if you're using a terminal that supports CSI u - { - on = [ - "y" - ]; - run = "yank"; - desc = "Copy the selected files"; - } - { - on = [ - "x" - ]; - run = "yank --cut"; - desc = "Cut the selected files"; - } - { - on = [ - "p" - ]; - run = "paste"; - desc = "Paste the files"; - } - { - on = [ - "P" - ]; - run = "paste --force"; - desc = "Paste the files (overwrite if the destination exists)"; - } - { - on = [ - "-" - ]; - run = "link"; - desc = "Symlink the absolute path of files"; - } - { - on = [ - "_" - ]; - run = "link --relative"; - desc = "Symlink the relative path of files"; - } - { - on = [ - "d" - ]; - run = "remove"; - desc = "Move the files to the trash"; - } - { - on = [ - "D" - ]; - run = "remove --permanently"; - desc = "Permanently delete the files"; - } - { - on = [ - "a" - ]; - run = "create"; - desc = "Create a file or directory (ends with / for directories)"; - } - { - on = [ - "r" - ]; - run = "rename"; - desc = "Rename a file or directory"; - } - { - on = [ - ";" - ]; - run = "shell"; - desc = "Run a shell command"; - } - { - on = [ - ":" - ]; - run = "shell --block"; - desc = "Run a shell command (block the UI until the command finishes)"; - } - { - on = [ - "." - ]; - run = "hidden toggle"; - desc = "Toggle the visibility of hidden files"; - } - { - on = [ - "" - "f" - "g>" - ]; - run = "search fd"; - desc = "Search files by name using fd"; - } - { - on = [ - "" - "f" - "G>" - ]; - run = "search rg"; - desc = "Search files by content using ripgrep"; - } - { - on = [ - "" - ]; - run = "search none"; - desc = "Cancel the ongoing search"; - } - { - on = [ - "z" - ]; - run = "jump zoxide"; - desc = "Jump to a directory using zoxide"; - } - { - on = [ - "Z" - ]; - run = "jump fzf"; - desc = "Jump to a directory or reveal a file using fzf"; - } - - # Copy - { - on = [ - "c" - "c" - ]; - run = "copy path"; - desc = "Copy the absolute path"; - } - { - on = [ - "c" - "d" - ]; - run = "copy dirname"; - desc = "Copy the path of the parent directory"; - } - { - on = [ - "c" - "f" - ]; - run = "copy filename"; - desc = "Copy the name of the file"; - } - { - on = [ - "c" - "n" - ]; - run = "copy name_without_ext"; - desc = "Copy the name of the file without the extension"; - } - - # Find - { - on = [ - "/" - ]; - run = "find --smart"; - } - { - on = [ - "?" - ]; - run = "find --previous --smart"; - } - { - on = [ - "n" - ]; - run = "find_arrow"; - } - { - on = [ - "N" - ]; - run = "find_arrow --previous"; - } - - # Sorting - { - on = [ - "," - "a" - ]; - run = "sort alphabetical --dir_first"; - desc = "Sort alphabetically"; - } - { - on = [ - "," - "A" - ]; - run = "sort alphabetical --reverse --dir_first"; - desc = "Sort alphabetically (reverse)"; - } - { - on = [ - "," - "c" - ]; - run = "sort created --dir_first"; - desc = "Sort by creation time"; - } - { - on = [ - "," - "C" - ]; - run = "sort created --reverse --dir_first"; - desc = "Sort by creation time (reverse)"; - } - { - on = [ - "," - "m" - ]; - run = "sort modified --dir_first"; - desc = "Sort by modified time"; - } - { - on = [ - "," - "M" - ]; - run = "sort modified --reverse --dir_first"; - desc = "Sort by modified time (reverse)"; - } - { - on = [ - "," - "n" - ]; - run = "sort natural --dir_first"; - desc = "Sort naturally"; - } - { - on = [ - "," - "N" - ]; - run = "sort natural --reverse --dir_first"; - desc = "Sort naturally (reverse)"; - } - { - on = [ - "," - "s" - ]; - run = "sort size --dir_first"; - desc = "Sort by size"; - } - { - on = [ - "," - "S" - ]; - run = "sort size --reverse --dir_first"; - desc = "Sort by size (reverse)"; - } - - # Tabs - { - on = [ - "t" - ]; - run = "tab_create --current"; - desc = "Create a new tab using the current path"; - } - - { - on = [ - "1" - ]; - run = "tab_switch 0"; - desc = "Switch to the first tab"; - } - { - on = [ - "2" - ]; - run = "tab_switch 1"; - desc = "Switch to the second tab"; - } - { - on = [ - "3" - ]; - run = "tab_switch 2"; - desc = "Switch to the third tab"; - } - { - on = [ - "4" - ]; - run = "tab_switch 3"; - desc = "Switch to the fourth tab"; - } - { - on = [ - "5" - ]; - run = "tab_switch 4"; - desc = "Switch to the fifth tab"; - } - { - on = [ - "6" - ]; - run = "tab_switch 5"; - desc = "Switch to the sixth tab"; - } - { - on = [ - "7" - ]; - run = "tab_switch 6"; - desc = "Switch to the seventh tab"; - } - { - on = [ - "8" - ]; - run = "tab_switch 7"; - desc = "Switch to the eighth tab"; - } - { - on = [ - "9" - ]; - run = "tab_switch 8"; - desc = "Switch to the ninth tab"; - } - - { - on = [ - "[" - ]; - run = "tab_switch -1 --relative"; - desc = "Switch to the previous tab"; - } - { - on = [ - "]" - ]; - run = "tab_switch 1 --relative"; - desc = "Switch to the next tab"; - } - - { - on = [ - "{" - ]; - run = "tab_swap -1"; - desc = "Swap the current tab with the previous tab"; - } - { - on = [ - "}" - ]; - run = "tab_swap 1"; - desc = "Swap the current tab with the next tab"; - } - - # Tasks - { - on = [ - "w" - ]; - run = "tasks_show"; - desc = "Show the tasks manager"; - } - - # Goto - { - on = [ - "g" - "h" - ]; - run = "cd ~"; - desc = "Go to the home directory"; - } - { - on = [ - "g" - "c" - ]; - run = "cd ~/.config"; - desc = "Go to the config directory"; - } - { - on = [ - "g" - "d" - ]; - run = "cd ~/Downloads"; - desc = "Go to the downloads directory"; - } - { - on = [ - "g" - "t" - ]; - run = "cd /tmp"; - desc = "Go to the temporary directory"; - } - { - on = [ - "g" - "" - ]; - run = "cd --interactive"; - desc = "Go to a directory interactively"; - } - - # Help - { - on = [ - "~" - ]; - run = "help"; - desc = "Open help"; - } - ]; - - tasks.keymap = [ - { - on = [ - "" - ]; - run = "close"; - desc = "Hide the task manager"; - } - { - on = [ - "" - ]; - run = "close"; - desc = "Hide the task manager"; - } - { - on = [ - "w" - ]; - run = "close"; - desc = "Hide the task manager"; - } - - { - on = [ - "k" - ]; - run = "arrow -1"; - desc = "Move cursor up"; - } - { - on = [ - "j" - ]; - run = "arrow 1"; - desc = "Move cursor down"; - } - - { - on = [ - "" - ]; - run = "arrow -1"; - desc = "Move cursor up"; - } - { - on = [ - "" - ]; - run = "arrow 1"; - desc = "Move cursor down"; - } - - { - on = [ - "" - ]; - run = "inspect"; - desc = "Inspect the task"; - } - { - on = [ - "x" - ]; - run = "cancel"; - desc = "Cancel the task"; - } - - { - on = [ - "~" - ]; - run = "help"; - desc = "Open help"; - } - ]; - - - select.keymap = [ - { - on = [ - "" - ]; - run = "close"; - desc = "Cancel selection"; - } - { - on = [ - "" - ]; - run = "close"; - desc = "Cancel selection"; - } - { - on = [ - "" - ]; - run = "close --submit"; - desc = "Submit the selection"; - } - - { - on = [ - "k" - ]; - run = "arrow -1"; - desc = "Move cursor up"; - } - { - on = [ - "j" - ]; - run = "arrow 1"; - desc = "Move cursor down"; - } - - { - on = [ - "K" - ]; - run = "arrow -5"; - desc = "Move cursor up 5 lines"; - } - { - on = [ - "J" - ]; - run = "arrow 5"; - desc = "Move cursor down 5 lines"; - } - - { - on = [ - "" - ]; - run = "arrow -1"; - desc = "Move cursor up"; - } - { - on = [ - "" - ]; - run = "arrow 1"; - desc = "Move cursor down"; - } - - { - on = [ - "~" - ]; - run = "help"; - desc = "Open help"; - } - ]; - - - input.keymap = [ - { - on = [ - "" - ]; - run = "close"; - desc = "Cancel input"; - } - { - on = [ - "" - ]; - run = "close --submit"; - desc = "Submit the input"; - } - { - on = [ - "" - ]; - run = "escape"; - desc = "Go back the normal mode or cancel input"; - } - - # Mode - { - on = [ - "i" - ]; - run = "insert"; - desc = "Enter insert mode"; - } - { - on = [ - "a" - ]; - run = "insert --append"; - desc = "Enter append mode"; - } - { - on = [ - "v" - ]; - run = "visual"; - desc = "Enter visual mode"; - } - { - on = [ - "V" - ]; - run = [ - "move -999" - "visual" - "move 999" - ]; - desc = "Enter visual mode and select all"; - } - - # Navigation - { - on = [ - "h" - ]; - run = "move -1"; - desc = "Move cursor left"; - } - { - on = [ - "l" - ]; - run = "move 1"; - desc = "Move cursor right"; - } - - { - on = [ - "0" - ]; - run = "move -999"; - desc = "Move to the BOL"; - } - { - on = [ - "$" - ]; - run = "move 999"; - desc = "Move to the EOL"; - } - { - on = [ - "I" - ]; - run = [ - "move -999" - "insert" - ]; - desc = "Move to the BOL and enter insert mode"; - } - { - on = [ - "A" - ]; - run = [ - "move 999" - "insert --append" - ]; - desc = "Move to the EOL and enter append mode"; - } - - { - on = [ - "" - ]; - run = "move -1"; - desc = "Move cursor left"; - } - { - on = [ - "" - ]; - run = "move 1"; - desc = "Move cursor right"; - } - - { - on = [ - "b" - ]; - run = "backward"; - desc = "Move to the beginning of the previous word"; - } - { - on = [ - "w" - ]; - run = "forward"; - desc = "Move to the beginning of the next word"; - } - { - on = [ - "e" - ]; - run = "forward --end-of-word"; - desc = "Move to the end of the next word"; - } - - # Deletion - { - on = [ - "d" - ]; - run = "delete --cut"; - desc = "Cut the selected characters"; - } - { - on = [ - "D" - ]; - run = [ - "delete --cut" - "move 999" - ]; - desc = "Cut until the EOL"; - } - { - on = [ - "c" - ]; - run = "delete --cut --insert"; - desc = "Cut the selected characters and enter insert mode"; - } - { - on = [ - "C" - ]; - run = [ - "delete --cut --insert" - "move 999" - ]; - desc = "Cut until the EOL and enter insert mode"; - } - { - on = [ - "x" - ]; - run = [ - "delete --cut" - "move 1 --in-operating" - ]; - desc = "Cut the current character"; - } - - # Yank/Paste - { - on = [ - "y" - ]; - run = "yank"; - desc = "Copy the selected characters"; - } - { - on = [ - "p" - ]; - run = "paste"; - desc = "Paste the copied characters after the cursor"; - } - { - on = [ - "P" - ]; - run = "paste --before"; - desc = "Paste the copied characters before the cursor"; - } - - # Undo/Redo - { - on = [ - "u" - ]; - run = "undo"; - desc = "Undo the last operation"; - } - { - on = [ - "" - ]; - run = "redo"; - desc = "Redo the last operation"; - } - - # Help - { - on = [ - "~" - ]; - run = "help"; - desc = "Open help"; - } - ]; - - help.keymap = [ - { - on = [ - "" - ]; - run = "escape"; - desc = "Clear the filter or hide the help"; - } - { - on = [ - "q" - ]; - run = "close"; - desc = "Exit the process"; - } - { - on = [ - "" - ]; - run = "close"; - desc = "Hide the help"; - } - - # Navigation - { - on = [ - "k" - ]; - run = "arrow -1"; - desc = "Move cursor up"; - } - { - on = [ - "j" - ]; - run = "arrow 1"; - desc = "Move cursor down"; - } - - { - on = [ - "K" - ]; - run = "arrow -5"; - desc = "Move cursor up 5 lines"; - } - { - on = [ - "J" - ]; - run = "arrow 5"; - desc = "Move cursor down 5 lines"; - } - - { - on = [ - "" - ]; - run = "arrow -1"; - desc = "Move cursor up"; - } - { - on = [ - "" - ]; - run = "arrow 1"; - desc = "Move cursor down"; - } - - # Filtering - { - on = [ - "/" - ]; - run = "filter"; - desc = "Apply a filter for the help items"; - } - ]; - }; - # theme = { - # manager = { - # cwd = { - # fg = "#94e2d5"; - # }; - # - # # Hovered - # hovered = { - # reversed = true; - # }; - # preview_hovered = { underline = true; }; - # - # # Find - # find_keyword = { - # fg = "#f9e2af"; - # bold = true; - # italic = true; - # underline = true; - # }; - # find_position = { - # fg = "#f5c2e7"; - # bg = "reset"; - # bold = true; - # italic = true; - # }; - # - # # Marker - # marker_copied = { - # fg = "#a6e3a1"; - # bg = "#a6e3a1"; - # }; - # marker_cut = { - # fg = "#f38ba8"; - # bg = "#f38ba8"; - # }; - # marker_marked = { - # fg = "#f9e2af"; - # bg = "#f9e2af"; - # }; - # marker_selected = { - # fg = "#779EF0"; - # bg = "#89b4fa"; - # }; - # - # # Tab - # tab_active = { - # fg = "#1e1e2e"; - # bg = "#cdd6f4"; - # }; - # tab_inactive = { - # fg = "#cdd6f4"; - # bg = "#45475a"; - # }; - # tab_width = 1; - # - # # Count - # count_copied = { - # fg = "#1e1e2e"; - # bg = "#a6e3a1"; - # }; - # count_cut = { - # fg = "#1e1e2e"; - # bg = "#f38ba8"; - # }; - # count_selected = { - # fg = "#1e1e2e"; - # bg = "#89b4fa"; - # }; - # - # # Border - # border_symbol = "│"; - # border_style = { fg = "#7f849c"; }; - # - # }; - # status = { - # separator_open = ""; - # separator_close = ""; - # separator_style = { - # fg = "#45475a"; - # bg = "#45475a"; - # }; - # - # # Mode - # mode_normal = { - # fg = "#1e1e2e"; - # bg = "#89b4fa"; - # bold = true; - # }; - # mode_select = { - # fg = "#1e1e2e"; - # bg = "#a6e3a1"; - # bold = true; - # }; - # mode_unset = { - # fg = "#1e1e2e"; - # bg = "#f2cdcd"; - # bold = true; - # }; - # - # # Progress - # progress_label = { - # fg = "#ffffff"; - # bold = true; - # }; - # progress_normal = { - # fg = "#89b4fa"; - # bg = "#45475a"; - # }; - # progress_error = { - # fg = "#f38ba8"; - # bg = "#45475a"; - # }; - # - # # Permissions - # permissions_t = { fg = "#89b4fa"; }; - # permissions_r = { fg = "#f9e2af"; }; - # permissions_w = { fg = "#f38ba8"; }; - # permissions_x = { fg = "#a6e3a1"; }; - # permissions_s = { fg = "#7f849c"; }; - # }; - # - # input = { - # border = { - # fg = "#89b4fa"; - # }; - # title = { }; - # value = { }; - # selected = { reversed = true; }; - # }; - # select = { - # border = { - # fg = "#89b4fa"; - # }; - # active = { fg = "#f5c2e7"; }; - # inactive = { }; - # }; - # tasks = { - # border = { - # fg = "#89b4fa"; - # }; - # title = { }; - # hovered = { - # underline = true; - # }; - # }; - # which = { - # mask = { - # bg = "#313244"; - # }; - # cand = { fg = "#94e2d5"; }; - # rest = { fg = "#9399b2"; }; - # desc = { fg = "#f5c2e7"; }; - # separator = "  "; - # separator_style = { fg = "#585b70"; }; - # }; - # help = { - # on = { - # fg = "#f5c2e7"; - # }; - # exec = { fg = "#94e2d5"; }; - # desc = { fg = "#9399b2"; }; - # hovered = { - # bg = "#585b70"; - # bold = true; - # }; - # footer = { - # fg = "#45475a"; - # bg = "#cdd6f4"; - # }; - # }; - # filetype = { - # rules = [ - # # Images - # { - # mime = "image/*"; - # fg = "#94e2d5"; - # } - # - # # Videos - # { - # mime = "video/*"; - # fg = "#f9e2af"; - # } - # { - # mime = "audio/*"; - # fg = "#f9e2af"; - # } - # - # # Archives - # { - # mime = "application/zip"; - # fg = "#f5c2e7"; - # } - # { - # mime = "application/gzip"; - # fg = "#f5c2e7"; - # } - # { - # mime = "application/x-tar"; - # fg = "#f5c2e7"; - # } - # { - # mime = "application/x-bzip"; - # fg = "#f5c2e7"; - # } - # { - # mime = "application/x-bzip2"; - # fg = "#f5c2e7"; - # } - # { - # mime = "application/x-7z-compressed"; - # fg = "#f5c2e7"; - # } - # { - # mime = "application/x-rar"; - # fg = "#f5c2e7"; - # } - # - # # Fallback - # { - # name = "*"; - # fg = "#cdd6f4"; - # } - # { - # name = "*/"; - # fg = "#89b4fa"; - # } - # ]; - # }; - # }; - }; -} - - - - - - - - - - diff --git a/nix/programs/media.nix b/nix/programs/media.nix deleted file mode 100644 index cf205c6..0000000 --- a/nix/programs/media.nix +++ /dev/null @@ -1,34 +0,0 @@ -{ pkgs, ... }: -{ - home.packages = with pkgs; [ - # base audio - pipewire - wireplumber - # audio control - playerctl - # images - imv - # videos - mpv - # pdf - zathura - evince - libreoffice-fresh - onlyoffice-bin - pdftk - pdfpc - polylux2pdfpc - # spotify - # video editing - kdenlive - # image creation - inkscape - gimp - krita - yt-dlp - ]; - programs.obs-studio.enable = true; - programs.obs-studio.plugins = with pkgs; [ - obs-studio-plugins.obs-vaapi - ]; -} diff --git a/nix/programs/nvim/default.nix b/nix/programs/nvim/default.nix deleted file mode 100644 index 43fdc23..0000000 --- a/nix/programs/nvim/default.nix +++ /dev/null @@ -1,212 +0,0 @@ -# please nixvim enable lazyloading -{ lib, pkgs, colorscheme, ... }: -{ - programs.neovim = { - enable = true; - extraPackages = with pkgs; [ - # Telescope - ripgrep - # lua - lua-language-server - stylua - # nix - nixd - # go - gopls - # jafuck - jdt-language-server - taplo - typst-lsp - sqls - shfmt - texlab - nixpkgs-fmt - crate2nix - ruff-lsp - pyright - lemminx - marksman - clang-tools_18 - ]; - - plugins = with pkgs.vimPlugins; [ - lazy-nvim - ]; - - extraLuaConfig = - let - plugins = with pkgs.vimPlugins; [ - # LazyVim - LazyVim - bufferline-nvim - cmp-buffer - cmp-nvim-lsp - cmp-path - cmp_luasnip - cmp-async-path - conform-nvim - dashboard-nvim - dressing-nvim - flash-nvim - friendly-snippets - gitsigns-nvim - git-conflict-nvim - ltex_extra-nvim - indent-blankline-nvim - lualine-nvim - neo-tree-nvim - neoconf-nvim - neodev-nvim - noice-nvim - nui-nvim - nvim-cmp - nvim-dap - nvim-dap-ui - nvim-dap-python - nvim-dap-go - nvim-dap-virtual-text - nvim-nio - nvim-lint - nvim-lspconfig - nvim-notify - #nvim-spectre - nvim-treesitter.withAllGrammars - nvim-treesitter-context - nvim-treesitter-textobjects - nvim-ts-autotag - nvim-ts-context-commentstring - nvim-web-devicons - nvim-jdtls - rustaceanvim - typst-vim - instant-nvim - git-blame-nvim - neoscroll-nvim - mason-nvim - neotest - neotest-zig - neotest-python - neotest-rust - neotest-java - neotest-haskell - neotest-go - neotest-dotnet - neotest-bash - neotest-dart - omnisharp-extended-lsp-nvim - neotest - neotest-java - neotest-rust - persistence-nvim - plenary-nvim - telescope-fzf-native-nvim - telescope-nvim - telescope-zoxide - telescope-file-browser-nvim - telescope-project-nvim - todo-comments-nvim - vimtex - inc-rename-nvim - headlines-nvim - diffview-nvim - crates-nvim - cmake-tools-nvim - clangd_extensions-nvim - alpha-nvim - vim-visual-multi - ts-comments-nvim - nvim-tree-lua - nvim-snippets - markdown-preview-nvim - tokyonight-nvim - trouble-nvim - vim-illuminate - vim-startuptime - which-key-nvim - haskell-tools-nvim - Ionide-vim - { name = "LuaSnip"; path = luasnip; } - { name = "mini.ai"; path = mini-nvim; } - { name = "mini.bufremove"; path = mini-nvim; } - { name = "mini.comment"; path = mini-nvim; } - { name = "mini.indentscope"; path = mini-nvim; } - { name = "mini.pairs"; path = mini-nvim; } - { name = "mini.surround"; path = mini-nvim; } - ]; - mkEntryFromDrv = drv: - if lib.isDerivation drv then - { name = "${lib.getName drv}"; path = drv; } - else - drv; - lazyPath = pkgs.linkFarm "lazy-plugins" (builtins.map mkEntryFromDrv plugins); - in - '' - require("lazy").setup({ - defaults = { - lazy = true, - }, - performance = { - rtp = { - disabled_plugins = { - "gzip", - "netrw", - "tarPlugin", - "tohtml", - "tutor", - "zipPlugin", - }, - }, - }, - dev = { - -- reuse files from pkgs.vimPlugins.* - path = "${lazyPath}", - patterns = { "." }, - -- fallback to download - fallback = true, - }, - spec = { - { "LazyVim/LazyVim", - opts = { - ${if colorscheme != "" then "colorscheme = '${colorscheme}'," else ""} - }, - import = "lazyvim.plugins" }, - { import = "lazyvim.plugins.extras.ui.alpha" }, - { import = "lazyvim.plugins.extras.lang.rust" }, - { import = "lazyvim.plugins.extras.lang.tailwind" }, - { import = "lazyvim.plugins.extras.lang.java" }, - { import = "lazyvim.plugins.extras.lang.go" }, - { import = "lazyvim.plugins.extras.lang.clangd" }, - { import = "lazyvim.plugins.extras.lang.markdown" }, - { import = "lazyvim.plugins.extras.lang.cmake" }, - { import = "lazyvim.plugins.extras.lang.omnisharp" }, - { import = "lazyvim.plugins.extras.lang.tex" }, - { import = "lazyvim.plugins.extras.util.dot" }, - { import = "lazyvim.plugins.extras.dap.core" }, - { import = "lazyvim.plugins.extras.test.core" }, - { "nvim-telescope/telescope-fzf-native.nvim", enabled = true }, - { "williamboman/mason-lspconfig.nvim", enabled = false }, - { import = "plugins" }, - { import = "plugins.plugins" }, - }, - - ${if colorscheme != "" then "install = { colorscheme = { '${colorscheme}' } }," else ""} - checker = { enabled = true, notify = false }, - change_detection = { enabled = true, notify = false }, - }) - ''; - }; - - # https://github.com/nvim-treesitter/nvim-treesitter#i-get-query-error-invalid-node-type-at-position - xdg.configFile."nvim/parser".source = - let - parsers = pkgs.symlinkJoin { - name = "treesitter-parsers"; - paths = (pkgs.vimPlugins.nvim-treesitter.withAllGrammars).dependencies; - }; - in - "${parsers}/parser"; - - # Normal LazyVim config here, see https://github.com/LazyVim/starter/tree/main/lua - xdg.configFile."nvim/lua".source = ./lua; - xdg.configFile."nvim/ftplugin".source = ./ftplugin; -} diff --git a/nix/programs/nvim/flake.lock b/nix/programs/nvim/flake.lock deleted file mode 100644 index 01dcb75..0000000 --- a/nix/programs/nvim/flake.lock +++ /dev/null @@ -1,58 +0,0 @@ -{ - "nodes": { - "flake-parts": { - "inputs": { - "nixpkgs-lib": "nixpkgs-lib" - }, - "locked": { - "lastModified": 1719994518, - "narHash": "sha256-pQMhCCHyQGRzdfAkdJ4cIWiw+JNuWsTX7f0ZYSyz0VY=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "9227223f6d922fee3c7b190b2cc238a99527bbb7", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1720542800, - "narHash": "sha256-ZgnNHuKV6h2+fQ5LuqnUaqZey1Lqqt5dTUAiAnqH0QQ=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "feb2849fdeb70028c70d73b848214b00d324a497", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-lib": { - "locked": { - "lastModified": 1719876945, - "narHash": "sha256-Fm2rDDs86sHy0/1jxTOKB1118Q0O3Uc7EC0iXvXKpbI=", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/5daf0514482af3f97abaefc78a6606365c9108e2.tar.gz" - }, - "original": { - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/5daf0514482af3f97abaefc78a6606365c9108e2.tar.gz" - } - }, - "root": { - "inputs": { - "flake-parts": "flake-parts", - "nixpkgs": "nixpkgs" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/nix/programs/nvim/flake.nix b/nix/programs/nvim/flake.nix deleted file mode 100644 index 6b79831..0000000 --- a/nix/programs/nvim/flake.nix +++ /dev/null @@ -1,35 +0,0 @@ -{ - description = "A lazyvim configuration"; - - inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; - flake-parts.url = "github:hercules-ci/flake-parts"; - }; - - outputs = - { flake-parts, ... }@inputs: - flake-parts.lib.mkFlake { inherit inputs; } { - systems = [ - "x86_64-linux" - "aarch64-linux" - "x86_64-darwin" - "aarch64-darwin" - ]; - - perSystem = - { pkgs, ... }: - let - colorscheme = "catppuccin-mocha"; - dashieVimModule = { - inherit pkgs colorscheme; - module = import ./default.nix; - nvim = pkgs.neovim; - }; - in - { - packages = { - default = dashieVimModule.nvim; - }; - }; - }; -} diff --git a/nix/programs/nvim/ftplugin/java.lua b/nix/programs/nvim/ftplugin/java.lua deleted file mode 100644 index 1a4f22e..0000000 --- a/nix/programs/nvim/ftplugin/java.lua +++ /dev/null @@ -1,5 +0,0 @@ -local config = { - cmd = { "jdtls" }, - root_dir = vim.fs.dirname(vim.fs.find({ "gradlew", ".git", "mvnw" }, { upward = true })[1]), -} -require("jdtls").start_or_attach(config) diff --git a/nix/programs/nvim/lua/config/autocmds.lua b/nix/programs/nvim/lua/config/autocmds.lua deleted file mode 100644 index e8da00f..0000000 --- a/nix/programs/nvim/lua/config/autocmds.lua +++ /dev/null @@ -1,15 +0,0 @@ --- nvimtree -local function open_nvim_tree(data) - local directory = vim.fn.isdirectory(data.file) == 1 - - if not directory then - return - end - -- change to the directory - vim.cmd.cd(data.file) - - -- open the tree - require("nvim-tree.api").tree.open() -end - -vim.api.nvim_create_autocmd({ "VimEnter" }, { callback = open_nvim_tree }) diff --git a/nix/programs/nvim/lua/config/keymaps.lua b/nix/programs/nvim/lua/config/keymaps.lua deleted file mode 100644 index b325537..0000000 --- a/nix/programs/nvim/lua/config/keymaps.lua +++ /dev/null @@ -1,202 +0,0 @@ -local Util = require("lazyvim.util") - -local function map(mode, lhs, rhs, opts) - local keys = require("lazy.core.handler").handlers.keys - ---@cast keys LazyKeysHandler - -- do not create the map if a lazy keys handler exists - if not keys.active[keys.parse({ lhs, mode = mode }).id] then - opts = opts or {} - opts.silent = opts.silent ~= false - vim.keymap.set(mode, lhs, rhs, opts) - end -end -local opts = { noremap = true, silent = true } -local term_opts = { silent = true } - --- crimes against humanity, but I don't care -map("n", "j", "h", opts) -map("n", "l", "k", opts) -map("n", "k", "j", opts) -map("n", ";", "l", opts) -map("v", "j", "h", opts) -map("v", "k", "j", opts) -map("v", "l", "k", opts) -map("v", ";", "l", opts) - --- test plugin -map("n", "OO", ':lua require("test_plugin").test()', { desc = "Toggle breakpoint" }) - --- debug -map("n", "db", ':lua require("dap").toggle_breakpoint()', { desc = "Toggle breakpoint" }) -map("n", "do", ':lua require("dap").step_over()', { desc = "Step over" }) -map("n", "di", ':lua require("dap").step_into()', { desc = "Step into" }) -map("n", "dc", ':lua require("dap").continue()', { desc = "Continue" }) -map("n", "du", function() - require("dapui").toggle() -end, { desc = "Toggle DAP UI" }) -map("n", "de", function() - require("dapui").eval() -end, { desc = "DAP Eval" }) - --- window movement -map("n", "", [[wincmd h]], opts) -map("n", "", [[wincmd l]], opts) -map("n", "", [[wincmd j]], opts) -map("i", "", [[wincmd h]], opts) -map("i", "", [[wincmd l]], opts) -map("i", "", [[wincmd j]], opts) - --- toggle terminal -local lazyterm = function() - Util.terminal(nil, { cwd = Util.root(), esc_esc = false, ctrl_hjkl = false }) -end -map("n", "", lazyterm, { desc = "Terminal (root dir)" }) -map("t", "", "close", { desc = "Hide Terminal" }) - --- semicolon thing --- map("i","" ,"A;", {desc = "add semi and newline"}) --- map("i","" ,"A;", {desc = "add semi"}) -map("n", "m", "$a;", { desc = "add semi and newline" }) -map("n", "n", "$a;", { desc = "add semi" }) - --- tab switching -map("n", "", ":BufferLineCyclePrev", opts) -map("n", "", ":BufferLineCycleNext", opts) - --- git -map("n", "gq", function() - require("telescope.builtin").git_commits() -end, { desc = "Commits" }) -map("n", "gw", function() - require("telescope.builtin").git_bcommits() -end, { desc = "Commits in branch" }) -map("n", "gb", function() - require("telescope.builtin").git_branches() -end, { desc = "Branches" }) -map("n", "gr", function() - require("telescope.builtin").git_status() -end, { desc = "Git status" }) -map("n", "ga", function() - require("telescope.builtin").git_stash() -end, { desc = "Git stash" }) -map("n", "gg", function() - Util.terminal({ "gitui" }, { cwd = Util.root() }) -end, { desc = "gitui (root dir)" }) -map("n", "gG", function() - Util.terminal({ "gitui" }) -end, { desc = "gitui (cwd)" }) -map("n", "gB", function() - require("gitblame") - vim.cmd(":GitBlameToggle") -end, { desc = "git blame" }) - --- harpoon man -map("n", "h1", function() - require("harpoon.ui").nav_file(1) -end, { desc = "First Harpoon File" }) -map("n", "h2", function() - require("harpoon.ui").nav_file(2) -end, { desc = "Second Harpoon File" }) -map("n", "h3", function() - require("harpoon.ui").nav_file(3) -end, { desc = "First Harpoon File" }) -map("n", "ha", function() - require("harpoon.mark").add_file() -end, { desc = "First Harpoon File" }) -map("n", "hd", function() - require("harpoon.mark").remove_file() -end, { desc = "First Harpoon File" }) -map("n", "hm", ":Telescope harpoon marks", { noremap = true, silent = true, desc = "Show harpoon marks" }) - --- telescope -map("n", "fb", function() - require("telescope").extensions.file_browser.file_browser({}) -end, { desc = "File Browser" }) -map("n", "ff", function() - require("telescope.builtin").find_files() -end, { desc = "Find Files" }) -map("n", "fg", function() - Live_grep_from_project_git_root() -end, { desc = "Live Grep (root)" }) -map("n", "fG", function() - require("telescope.builtin").live_grep() -end, { desc = "Live Grep (cwd)" }) -map("n", "fh", function() - require("telescope.builtin").help_tags() -end, { desc = "Help" }) -map("n", "fp", function() - require("telescope").extensions.project.project({}) -end, { noremap = true, silent = true, desc = "Projects" }) -map("n", "z", function() - require("telescope").extensions.zoxide.list({}) -end, { desc = "Zoxide" }) - --- neoscroll -local t = {} -t[""] = { "scroll", { "-vim.wo.scroll", "true", "250" } } -t[""] = { "scroll", { "vim.wo.scroll", "true", "250" } } -require("neoscroll.config").set_mappings(t) - --- trouble -map("n", "t", "TroubleToggle", term_opts) - --- format -map({ "n", "v" }, "", function() - Util.format({ force = true }) -end, { desc = "Format" }) - --- better yank -function Better_yank(opts) - local current_line = unpack(vim.api.nvim_win_get_cursor(0)) - vim.api.nvim_command(current_line .. "," .. (opts.count - (current_line - 1)) .. "y") -end - -vim.api.nvim_create_user_command("BetterYank", Better_yank, { count = 1 }) -map("n", "by", ":BetterYank", term_opts) - --- better delete -function Better_delete(opts) - local current_line = unpack(vim.api.nvim_win_get_cursor(0)) - vim.api.nvim_command(current_line .. "," .. (opts.count - (current_line - 1)) .. "d") -end - -vim.api.nvim_create_user_command("BetterDelete", Better_delete, { count = 1 }) -map("n", "bd", ":BetterDelete", term_opts) - --- neovide zoom -local change_scale_factor = function(delta) - vim.g.neovide_scale_factor = vim.g.neovide_scale_factor * delta -end -vim.keymap.set("n", "", function() - change_scale_factor(1.25) -end) -vim.keymap.set("n", "", function() - change_scale_factor(1 / 1.25) -end) - --- neovide paste -vim.g.neovide_input_use_logo = 1 -vim.api.nvim_set_keymap("i", "", "pI", { noremap = true, silent = true }) - -function Get_git_root() - local opts = {} - local function is_git_repo() - vim.fn.system("git rev-parse --is-inside-work-tree") - - return vim.v.shell_error == 0 - end - if is_git_repo() then - local dot_git_path = vim.fn.finddir(".git", ".;") - local root = vim.fn.fnamemodify(dot_git_path, ":h") - opts = { - cwd = root, - } - end - return opts -end - -function Live_grep_from_project_git_root() - local opts = Get_git_root() - require("telescope.builtin").live_grep(opts) -end - diff --git a/nix/programs/nvim/lua/config/lazy.lua b/nix/programs/nvim/lua/config/lazy.lua deleted file mode 100644 index de32dd1..0000000 --- a/nix/programs/nvim/lua/config/lazy.lua +++ /dev/null @@ -1,55 +0,0 @@ -local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" -if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ - "git", - "clone", - "--filter=blob:none", - "https://github.com/folke/lazy.nvim.git", - "--branch=stable", - lazypath, - }) -end -vim.opt.rtp:prepend(vim.env.LAZY or lazypath) - -require("lazy").setup({ - spec = { - { "LazyVim/LazyVim", import = "lazyvim.plugins" }, - { import = "lazyvim.plugins.extras.ui.alpha" }, - -- { import = "lazyvim.plugins.extras.ui.edgy" }, - { import = "plugins" }, - { import = "plugins.plugins" }, - { import = "lazyvim.plugins.extras.lang.rust" }, - { import = "lazyvim.plugins.extras.lang.tailwind" }, - { import = "lazyvim.plugins.extras.lang.java" }, - { import = "lazyvim.plugins.extras.lang.go" }, - { import = "lazyvim.plugins.extras.lang.clangd" }, - { import = "lazyvim.plugins.extras.lang.typescript" }, - { import = "lazyvim.plugins.extras.lang.python" }, - { import = "lazyvim.plugins.extras.lang.markdown" }, - { import = "lazyvim.plugins.extras.lang.cmake" }, - { import = "lazyvim.plugins.extras.lang.omnisharp" }, - { import = "lazyvim.plugins.extras.lang.json" }, - { import = "lazyvim.plugins.extras.lang.tex" }, - { import = "lazyvim.plugins.extras.util.dot" }, - { import = "lazyvim.plugins.extras.dap.core" }, - { import = "lazyvim.plugins.extras.test.core" }, - }, - defaults = { - lazy = true, - version = false, - }, - checker = { enabled = true, notify = false }, - change_detection = { enabled = true, notify = false }, - performance = { - rtp = { - disabled_plugins = { - "gzip", - "netrw", - "tarPlugin", - "tohtml", - "tutor", - "zipPlugin", - }, - }, - }, -}) diff --git a/nix/programs/nvim/lua/config/lsp-keymap.lua b/nix/programs/nvim/lua/config/lsp-keymap.lua deleted file mode 100644 index df316e9..0000000 --- a/nix/programs/nvim/lua/config/lsp-keymap.lua +++ /dev/null @@ -1,126 +0,0 @@ -local M = {} - ----@type PluginLspKeys -M._keys = nil - ----@return (LazyKeys|{has?:string})[] -function M.get() - local format = function() - require("lazyvim.util").format({ force = true }) - end - if not M._keys then - ---@class PluginLspKeys - M._keys = { - { "cld", vim.diagnostic.open_float, desc = "Line Diagnostics" }, - { "cl", "LspInfo", desc = "Lsp Info" }, - { "ca", "Telescope lsp_definitions", desc = "Goto Definition", has = "definition" }, - { "cs", "Telescope lsp_references", desc = "References" }, - { "cA", vim.lsp.buf.declaration, desc = "Goto Declaration" }, - { "cf", "Telescope lsp_implementations", desc = "Goto Implementation" }, - { "cd", "Telescope lsp_type_definitions", desc = "Goto Type Definition" }, - { "ce", vim.lsp.buf.hover, desc = "Hover" }, - { "cw", vim.lsp.buf.signature_help, desc = "Signature Help", has = "signatureHelp" }, - { "", vim.lsp.buf.signature_help, mode = "i", desc = "Signature Help", has = "signatureHelp" }, - { "]d", M.diagnostic_goto(true), desc = "Next Diagnostic" }, - { "[d", M.diagnostic_goto(false), desc = "Prev Diagnostic" }, - { "]e", M.diagnostic_goto(true, "ERROR"), desc = "Next Error" }, - { "[e", M.diagnostic_goto(false, "ERROR"), desc = "Prev Error" }, - { "]w", M.diagnostic_goto(true, "WARN"), desc = "Next Warning" }, - { "[w", M.diagnostic_goto(false, "WARN"), desc = "Prev Warning" }, - { "", format, desc = "Format Range", mode = "v", has = "documentRangeFormatting" }, - { "cr", ":IncRename ", desc = "Rename", has = "rename" }, - { - "cq", - function() - vim.lsp.buf.code_action({ - context = { - only = { - "quickfix", - "quickfix.ltex", - "source", - "source.fixAll", - "source.organizeImports", - "", - }, - }, - }) - end, - desc = "Fix", - mode = { "n", "v" }, - has = "codeAction", - }, - { - "cQ", - function() - vim.lsp.buf.code_action({ - context = { - only = { - "refactor", - "refactor.inline", - "refactor.extract", - "refactor.rewrite", - }, - }, - }) - end, - desc = "Refactor", - mode = { "n", "v" }, - has = "codeAction", - }, - } - end - return M._keys -end - ----@param method string -function M.has(buffer, method) - method = method:find("/") and method or "textDocument/" .. method - local clients = require("lazyvim.util").lsp.get_clients({ bufnr = buffer }) - for _, client in ipairs(clients) do - if client.supports_method(method) then - return true - end - end - return false -end - ----@return (LazyKeys|{has?:string})[] -function M.resolve(buffer) - local Keys = require("lazy.core.handler.keys") - if not Keys.resolve then - return {} - end - local spec = M.get() - local opts = require("lazyvim.util").opts("nvim-lspconfig") - local clients = require("lazyvim.util").lsp.get_clients({ bufnr = buffer }) - for _, client in ipairs(clients) do - local maps = opts.servers[client.name] and opts.servers[client.name].keys or {} - vim.list_extend(spec, maps) - end - return Keys.resolve(spec) -end - -function M.on_attach(_, buffer) - local Keys = require("lazy.core.handler.keys") - local keymaps = M.resolve(buffer) - - for _, keys in pairs(keymaps) do - if not keys.has or M.has(buffer, keys.has) then - local opts = Keys.opts(keys) - opts.has = nil - opts.silent = opts.silent ~= false - opts.buffer = buffer - vim.keymap.set(keys.mode or "n", keys.lhs, keys.rhs, opts) - end - end -end - -function M.diagnostic_goto(next, severity) - local go = next and vim.diagnostic.goto_next or vim.diagnostic.goto_prev - severity = severity and vim.diagnostic.severity[severity] or nil - return function() - go({ severity = severity }) - end -end - -return M diff --git a/nix/programs/nvim/lua/config/options.lua b/nix/programs/nvim/lua/config/options.lua deleted file mode 100644 index 7f5ec59..0000000 --- a/nix/programs/nvim/lua/config/options.lua +++ /dev/null @@ -1,34 +0,0 @@ --- Options are automatically loaded before lazy.nvim startup --- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua --- Add any additional options here -local options = { - fileencoding = "utf-8", - number = true, - showmode = true, - termguicolors = true, - spelllang = "en_us", - shell = "fish", - relativenumber = false, - scrolloff = 5, - scrolljump = 5, - wrap = false, -} -vim.filetype.add({ - extension = { - typst = "typst", - typ = "typst", - }, -}) -vim.o.guifont = "JetBrainsMono Nerd Font:h14" -vim.g.neovide_refresh_rate_idle = 180 -vim.g.neovide_refresh_rate_idle = 5 -vim.g.neovide_hide_mouse_when_typing = true -vim.g.mkdp_browser = "/usr/bin/firefox" -vim.g.mkdp_auto_start = 1 -vim.g.loaded_netrw = 1 -vim.g.loaded_netrwPlugin = 1 -vim.g.autoformat = false - -for k, v in pairs(options) do - vim.opt[k] = v -end diff --git a/nix/programs/nvim/lua/plugins/cmp.lua b/nix/programs/nvim/lua/plugins/cmp.lua deleted file mode 100644 index 4b4d467..0000000 --- a/nix/programs/nvim/lua/plugins/cmp.lua +++ /dev/null @@ -1,143 +0,0 @@ -return { - { - "L3MON4D3/LuaSnip", - build = (not jit.os:find("Windows")) - and "echo -e 'NOTE: jsregexp is optional, so not a big deal if it fails to build\n'; make install_jsregexp" - or nil, - dependencies = { - "rafamadriz/friendly-snippets", - config = function() - require("luasnip.loaders.from_vscode").lazy_load() - end, - }, - opts = { - history = true, - delete_check_events = "TextChanged", - updateevents = "TextChanged,TextChangedI", - enable_autosnippets = true, - }, - keys = function() - return {} - end, - config = function(_, opts) - require("luasnip").setup(opts) - end, - }, - { - "hrsh7th/nvim-cmp", - version = false, - event = "InsertEnter", - dependencies = { - "hrsh7th/cmp-nvim-lsp", - "hrsh7th/cmp-buffer", - "FelipeLema/cmp-async-path", - "saadparwaiz1/cmp_luasnip", - "Saecki/crates.nvim", - }, - opts = function() - vim.api.nvim_set_hl(0, "CmpGhostText", { link = "Comment", default = true }) - local cmp = require("cmp") - local defaults = require("cmp.config.default")() - local luasnip = require("luasnip") - local compare = require("cmp.config.compare") - return { - preselect = cmp.PreselectMode.None, - completion = { - -- completeopt = "menu,menuone,noinsert", - }, - snippet = { - expand = function(args) - luasnip.lsp_expand(args.body) - end, - }, - mapping = { - [""] = cmp.mapping.scroll_docs(-4), - [""] = cmp.mapping.scroll_docs(4), - [""] = cmp.mapping.complete(), - [""] = cmp.mapping.abort(), - [""] = cmp.mapping.confirm({ select = false }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. - [""] = cmp.mapping.confirm({ - behavior = cmp.ConfirmBehavior.Replace, - select = false, - }), -- Accept cur - [""] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_next_item({ behavior = cmp.SelectBehavior.Insert }) - else - fallback() - end - end, { "i", "s" }), - [""] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_prev_item({ behavior = cmp.SelectBehavior.Insert }) - else - fallback() - end - end, { - "i", - "s", - }), - [""] = cmp.mapping(function(fallback) - if luasnip.expandable() then - luasnip.expand() - elseif luasnip.expand_or_jumpable() then - luasnip.expand_or_jump() - else - fallback() - end - end, { - "i", - "s", - }), - [""] = cmp.mapping(function(fallback) - if luasnip.expand_or_jumpable(-1) then - luasnip.jump(-1) - else - fallback() - end - end, { - "i", - "s", - }), - }, - sources = cmp.config.sources({ - { name = "nvim_lsp", priority = 99 }, - { name = "luasnip", priority = 3, max_item_count = 3 }, - { name = "buffer", priority = 2, max_item_count = 2, keyword_length = 5 }, - { name = "async_path", priority = 1, max_item_count = 2, keyword_length = 3, trigger_characters = {} }, - { name = "crates" }, - }), - sorting = { - priority_weight = 90, - comparators = { - compare.exact, - compare.score, - compare.offset, - compare.kind, - }, - }, - formatting = { - preselect = cmp.PreselectMode.None, - format = function(entry, item) - local icons = require("lazyvim.config").icons.kinds - if icons[item.kind] then - item.kind = icons[item.kind] .. item.kind - end - return require("tailwindcss-colorizer-cmp").formatter(entry, item) - end, - }, - experimental = { - ghost_text = { - hl_group = "CmpGhostText", - }, - }, - } - end, - config = function(_, opts) - local cmp = require("cmp") - require("luasnip.loaders.from_lua").load({ paths = "~/.config/nvim/snippets" }) - cmp.setup(opts) - end, - }, -} - diff --git a/nix/programs/nvim/lua/plugins/dashboard.lua b/nix/programs/nvim/lua/plugins/dashboard.lua deleted file mode 100644 index 82715ad..0000000 --- a/nix/programs/nvim/lua/plugins/dashboard.lua +++ /dev/null @@ -1,100 +0,0 @@ -return { - { - "goolord/alpha-nvim", - event = "VimEnter", - opts = function() - local alpha = require("alpha") - local dashboard = require("alpha.themes.dashboard") - dashboard.section.header.val = { - [[ _______ ___ _______. __ __ __ _______ ]], - [[| \ / \ / || | | | | | | ____|]], - [[| .--. | / ^ \ | (----`| |__| | | | | |__ ]], - [[| | | | / /_\ \ \ \ | __ | | | | __| ]], - [[| '--' | / _____ \ .----) | | | | | | | | |____ ]], - [[|_______/ /__/ \__\ |_______/ |__| |__| |__| |_______|]], - [[ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⢤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ]], - [[ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠪⣍⣒⠒⠦⠤⠤⠤⠄⠠⡜⡐⠁⠪⡢⡀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠤⢄⠀⠀⠀⠀⠀⠀⠀ ]], - [[ ⠀⠀⠀⠈⠛⠯⣉⠁⣐⣂⠐⠮⠥⠟⣓⣲⣾⣿⣿⣿⣶⡃⠀⠀⠈⢞⢆⠀⠀⠀⠀⠀⠀⡰⢁⠂⠄⣇⠀⠀⠀⠀⠀⠀ ]], - [[ ⠀⠀⠀⠀⣠⠤⠤⠭⠷⠎⡡⠔⠒⠘⠀⢹⣿⣿⣿⣿⣿⠀⠈⠀⠀⠀⢢⢣⠀⠀⠀⠀⢀⡇⠈⠀⢰⢰⠀⠀⠀⠀⠀⠀ ]], - [[ ⠀⠀⠀⢸⢰⠀⠀⠀⡩⢋⣀⣤⣤⣤⣤⣤⣿⣿⠟⠿⣿⡀⠀⠀⠀⠀⠀⠆⢳⠀⠀⠀⢸⠀⠂⠀⠀⡈⡆⠀⠀⠀⠀⠀ ]], - [[ ⠀⠀⠀⠀⢣⢂⠀⠮⡪⠛⠉⢋⠝⠻⢿⢿⡿⢁⠔⢋⣸⠇⠀⠀⠀⠀⠀⡘⣆⢣⠀⠀⡼⠀⠀⠀⠀⡇⣇⠀⠀⠀⠀⠀ ]], - [[ ⠀⠀⠀⠀⠀⡣⢲⡊⠀⠀⠀⠀⠀⡴⠃⣼⠡⢪⠔⠋⠀⠀⠀⢀⠀⠀⠀⢸⣿⡄⢆⠀⡇⠀⠀⠀⠀⠁⢸⠀⠀⠀⠀⠀ ]], - [[ ⠀⠀⠀⠀⢰⢡⡇⠀⠀⢀⠔⠠⠊⣰⠞⡇⢠⠃⠀⣠⣶⣿⣷⣷⣷⠄⠀⠈⡟⣷⡸⡄⡇⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀ ]], - [[ ⠀⠀⠀⠀⡇⣾⠀⣀⠔⣁⣤⣦⢺⣿⡆⡆⡃⠀⢨⠃⢸⣿⣿⣿⠏⠀⠠⢀⢠⣿⡇⣧⡇⠀⠀⠀⠀⠀⢸⣆⢔⡲⡆⠀ ]], - [[ ⠀⠀⣠⠞⠼⠧⢙⡒⣾⣿⣿⡷⡘⣟⣷⣜⡃⠀⡼⠀⠀⠷⠗⠋⠀⠀⠀⢀⡟⣿⣿⢀⠓⠀⠀⠀⠀⠀⢸⢋⠊⠀⡇⠀ ]], - [[ ⠘⠛⠒⠒⠉⠉⠁⡇⣿⣽⣿⡇⠈⢹⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⣠⠟⠀⣷⣿⣇⠱⡀⠀⠀⠀⡄⢀⠃⠀⡄⡇⠀ ]], - [[ ⠀⠀⠀⠀⠀⠀⠀⡇⢸⣏⢀⣧⠀⠈⠆⠀⠀⠀⠀⠀⠀⠀⠀⡠⢊⡴⡟⠀⡼⢁⢸⡙⣠⠁⠀⠀⠀⢇⠆⠀⢀⢳⡇⠀ ]], - [[ ⠀⠀⠀⠀⠀⠀⠀⢳⢀⣵⢸⣯⣷⣤⣀⠀⠀⠀⠀⠀⢀⣐⠮⠔⡎⠘⠀⠈⢀⢮⣿⣷⠁⠇⠠⠀⢰⠎⠀⠀⡘⣸⠀⠀ ]], - [[ ⠀⠀⠀⠀⠀⠀⢀⠎⢬⢘⣯⠛⢻⠏⣿⣿⣶⣶⡶⠋⠉⠀⠀⢸⠀⠀⡔⠀⣪⣿⣿⢻⠀⠸⠈⡇⠛⠀⠠⢀⢃⡇⠀⠀ ]], - [[ ⠀⠀⠀⠀⠀⠈⡹⡡⣪⡏⠛⠀⠀⢠⡟⢻⣿⣿⡇⠀⠀⠀⠀⢼⡆⠠⡇⢰⣿⣿⣿⣻⡄⠀⡆⠁⠀⣠⠃⠌⠼⠤⠤⡀ ]], - [[ ⠀⠀⠀⣀⡠⢞⣳⣽⢸⡇⠀⡇⠀⠸⠀⣼⣿⣿⡇⠀⠀⠀⠀⠈⡇⣰⠃⣶⡍⣼⣿⣏⠃⠀⠁⢠⠊⣀⣜⠤⠐⢂⢆⠇ ]], - [[ ⠀⠀⠈⠉⠉⠁⠀⢇⢸⡟⠀⡇⠀⡇⢸⢷⣹⣿⡇⠀⠀⠀⠀⠀⢳⡽⠃⡞⣇⣿⣧⣿⠀⠀⢸⠃⢠⠃⠀⢀⠤⢢⠞⠀ ]], - [[ ⠀⠀⠀⠀⠀⠀⠀⢸⡀⡇⠀⠁⢠⠁⣿⠈⣿⣿⠇⠀⠀⠀⠀⠀⠀⠁⡆⡇⣾⠿⣹⣿⠀⠀⠃⡰⠃⡰⢔⣡⠞⠁⠀⠀ ]], - [[ ⠀⠀⠀⠀⠀⠀⠀⠀⢇⢠⠀⠂⡌⠀⢽⠁⣟⡟⠀⠀⠀⠀⠀⠀⠀⠀⣇⢶⢹⣤⣿⠇⠀⣀⣈⠝⡱⠒⠉⠀⠀⠀⠀⠀ ]], - [[ ⠀⠀⠀⠀⠀⠀⠀⠀⠈⣎⡄⠀⡷⠀⢸⠀⢹⠇⠀⠀⠀⠀⠀⠀⠀⠀⠫⣼⣾⣿⢋⠤⠤⠥⢆⡞⠀⠀⠀⠀⠀⠀⠀⠀ ]], - [[ ⠀⠀⠀⠀⠀⠀⠀⠀⢀⢫⣡⢸⠎⢃⢘⠀⢈⡄⠀⠀⠀⠀⠀⠀⠀⠀⢀⡽⣽⢀⡋⠉⠑⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀ ]], - [[ ⠀⠀⠀⠀⠀⠀⠀⠀⠘⠉⠳⡯⣇⢆⠻⣆⠈⣤⠀⠀⠀⠀⣀⡀⠤⢚⡨⠷⣝⠗⠑⢄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ]], - [[ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠫⣗⠳⡜⠵⠀⡍⡥⠤⠤⠤⠄⠒⠉⠀⠀⠀⠉⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ]], - [[ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠫⡆⣇⠇⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ]], - [[ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⡙⡰⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ]], - [[ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣦⠞⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ]], - } - dashboard.section.buttons.val = { - dashboard.button("f", " Find file", ":lua require('telescope.builtin').find_files()"), - dashboard.button("y", " Yazi", ":lua require('yazi').yazi()"), - dashboard.button("p", " Find project", ":lua require('telescope').extensions.project.project{}"), - dashboard.button("t", " Zoxide", ":lua require('telescope').extensions.zoxide.list{}"), - dashboard.button("c", " Configuration", ":e ~/.config/nvim/init.lua "), - dashboard.button("q", " Quit Neovim", ":qa"), - } - - local function footer() - return "dashie@dashie.org" - end - - dashboard.section.footer.val = footer() - - dashboard.section.footer.opts.hl = "Type" - dashboard.section.header.opts.hl = "Include" - dashboard.section.buttons.opts.hl = "Keyword" - - dashboard.opts.opts.noautocmd = true - - -- alpha.pad_margin(dashboard.section.header.val, dashboard.opts , 0, 0) - alpha.setup(dashboard.opts) - end, - config = function(_, dashboard) - -- close Lazy and re-open when the dashboard is ready - if vim.o.filetype == "lazy" then - vim.cmd.close() - vim.api.nvim_create_autocmd("User", { - pattern = "AlphaReady", - callback = function() - require("lazy").show() - end, - }) - end - - require("alpha").setup({ - layout = { - { type = "padding", val = 1 }, - dashboard.section.header, - { type = "padding", val = 1 }, - dashboard.section.buttons, - { type = "padding", val = 1 }, - dashboard.section.footer, - }, - }) - - vim.api.nvim_create_autocmd("User", { - pattern = "LazyVimStarted", - callback = function() - local stats = require("lazy").stats() - local ms = (math.floor(stats.startuptime * 100 + 0.5) / 100) - dashboard.section.footer.val = "⚡ Neovim loaded " .. stats.count .. " plugins in " .. ms .. "ms" - pcall(vim.cmd.AlphaRedraw) - end, - }) - end, - }, -} diff --git a/nix/programs/nvim/lua/plugins/disabled.lua b/nix/programs/nvim/lua/plugins/disabled.lua deleted file mode 100644 index 76dc307..0000000 --- a/nix/programs/nvim/lua/plugins/disabled.lua +++ /dev/null @@ -1,9 +0,0 @@ -return { - { - { "rcarriga/nvim-notify", enabled = false }, - }, - { { "folke/noice.nvim", enabled = false } }, - { { "nvimtools/none-ls.nvim", enabled = false } }, - { { "nvimdev/dashboard-nvim", enabled = false } }, - { { "nvim-neo-tree/neo-tree.nvim", enabled = false } }, -} diff --git a/nix/programs/nvim/lua/plugins/lsp.lua b/nix/programs/nvim/lua/plugins/lsp.lua deleted file mode 100644 index 984fdd1..0000000 --- a/nix/programs/nvim/lua/plugins/lsp.lua +++ /dev/null @@ -1,239 +0,0 @@ -return { - { - "williamboman/mason.nvim", - }, - { - "neovim/nvim-lspconfig", - ---@class PluginLspOpts - opts = function(_, opts) - local path = vim.fn.stdpath("config") .. "/spell/ltex.dictionary.en-US.txt" - local words = {} - - local file, err = io.open(path, "r") - if err ~= nil then - os.execute("mkdir " .. vim.fn.stdpath("config") .. "/spell") - file = io.open(path, "w") - file:write("") - file:close() - file = io.open(path, "r") - end - for word in file:lines() do - table.insert(words, word) - end - local new_opts = { - format_notify = false, - -- LSP Server Settings - ---@type lspconfig.options - servers = { - marksman = { - mason = false, - }, - clangd = { - mason = false, - }, - jdtls = { - mason = false, - }, - gopls = { - mason = false, - }, - pyright = { - mason = false, - }, - ruff_lsp = { - mason = false, - }, - texlab = { - mason = false, - }, - taplo = { - keys = { - { - "K", - function() - if vim.fn.expand("%:t") == "Cargo.toml" and require("crates").popup_available() then - require("crates").show_popup() - else - vim.lsp.buf.hover() - end - end, - desc = "Show Crate Documentation", - }, - }, - mason = false, - }, - bashls = { - mason = false, - }, - ansiblels = { - mason = false, - }, - omnisharp = { - mason = false, - handlers = { - ["textDocument/definition"] = function(...) - return require("omnisharp_extended").handler(...) - end, - }, - keys = { - { - "oe", - function() - require("omnisharp_extended").telescope_lsp_definitions() - end, - desc = "Goto Definition", - }, - }, - cmd = { - -- no comment - "OmniSharp", - "-z", - "--hostPID", - tostring(vim.fn.getpid()), - "DotNet:enablePackageRestore=false", - "--encoding", - "utf-8", - "--languageserver", - "FormattingOptions:EnableEditorConfigSupport=true", - "FormattingOptions:OrganizeImports=true", - "RoslynExtensionsOptions:EnableAnalyzersSupport=true", - "RoslynExtensionsOptions:EnableImportCompletion=true", - -- inlay hints are bugged until next release..... - -- "RoslynExtensionsOptions:InlayHintsOptions:EnableForParameters=true", - -- "RoslynExtensionsOptions:InlayHintsOptions:ForLiteralParameters=true", - -- "RoslynExtensionsOptions:InlayHintsOptions:ForIndexerParameters=true", - -- "RoslynExtensionsOptions:InlayHintsOptions:ForObjectCreationParameters=true", - -- "RoslynExtensionsOptions:InlayHintsOptions:ForOtherParameters=true", - -- "RoslynExtensionsOptions:InlayHintsOptions:SuppressForParametersThatDifferOnlyBySuffix=false", - -- "RoslynExtensionsOptions:InlayHintsOptions:SuppressForParametersThatMatchMethodIntent=false", - -- "RoslynExtensionsOptions:InlayHintsOptions:SuppressForParametersThatMatchArgumentName=false", - -- "RoslynExtensionsOptions:InlayHintsOptions:EnableForTypes=true", - -- "RoslynExtensionsOptions:InlayHintsOptions:ForImplicitVariableTypes=true", - -- "RoslynExtensionsOptions:InlayHintsOptions:ForLambdaParameterTypes=true", - -- "RoslynExtensionsOptions:InlayHintsOptions:ForImplicitObjectCreation=true", - "Sdk:IncludePrereleases=true", - }, - }, - tinymist = { - settings = { - formatterMode = "typstyle", - exportPdf = "onSave", - }, - mason = false, - }, - nixd = { - settings = { - ["nixd"] = { - formatting = { - command = { "nixpkgs-fmt" }, - }, - }, - }, - mason = false, - }, - ltex = { - settings = { - ltex = { - checkFrequency = "save", - dictionary = { - ["en-US"] = words, - }, - }, - }, - filetypes = { - "bib", - "gitcommit", - "markdown", - "org", - "plaintex", - "rst", - "rnoweb", - "tex", - "pandoc", - "typst", - "typ", - "text", - }, - mason = false, - }, - sqls = { - mason = false, - }, - lemminx = { - mason = false, - }, - opencl_ls = { - mason = false, - }, - yamlls = { - mason = false, - }, - zls = { - mason = false, - }, - jsonls = { - mason = false, - cmd = { "vscode-json-languageserver", "--stdio" }, - }, - cssls = { - mason = false, - cmd = { "css-languageserver", "--stdio" }, - }, - lua_ls = { - mason = false, - { - Lua = { - workspace = { - checkThirdParty = false, - }, - completion = { - callSnippet = "Replace", - }, - }, - }, - }, - }, - } - return vim.tbl_deep_extend("keep", new_opts, opts) - end, - init = function() - local keys = require("lazyvim.plugins.lsp.keymaps").get() - local my_keys = require("config.lsp-keymap").get() - local count = 0 - for _ in pairs(my_keys) do - keys[#keys + 1] = my_keys[count] - count = count + 1 - end - end, - }, - { - "stevearc/conform.nvim", - opts = { - keys = { - { - "cF", - function() - require("conform").format({ async = true, lsp_fallback = true }) - end, - mode = "", - numberdesc = "Format buffer", - }, - }, - formatters = { - mdformat = { - prepend_args = { "--number" }, - }, - }, - formatters_by_ft = { - nix = { "nixpkgs-fmt" }, - lua = { "stylua" }, - sh = { "shfmt" }, - cs = { "dotnet-csharpier" }, - markdown = { "mdformat" }, - sql = { "sql-formatter" }, - json = { "jq" }, - yaml = { "yamlfmt" }, - }, - }, - }, -} diff --git a/nix/programs/nvim/lua/plugins/plugins.lua b/nix/programs/nvim/lua/plugins/plugins.lua deleted file mode 100644 index 833d72f..0000000 --- a/nix/programs/nvim/lua/plugins/plugins.lua +++ /dev/null @@ -1,292 +0,0 @@ -return { - { - "nvim-telescope/telescope.nvim", - cmd = "Telescope", - keys = function() - return {} - end, - opts = { - defaults = { - layout_strategy = "flex", - layout_config = { - flex = { - height = 0.95, - width = 0.95, - flip_columns = 100, - }, - vertical = { preview_height = 0.5, preview_cutoff = 5 }, - horizontal = { preview_width = 0.7, preview_cutoff = 99 }, - }, - }, - }, - }, - { - "nvim-telescope/telescope-project.nvim", - lazy = true, - }, - { - "nvim-telescope/telescope-file-browser.nvim", - lazy = true, - config = function() - require("telescope").load_extension("file_browser") - end, - }, - { - "jvgrootveld/telescope-zoxide", - lazy = true, - config = function() - local z_utils = require("telescope._extensions.zoxide.utils") - local t = require("telescope") - -- Configure the extension - t.setup({ - extensions = { - zoxide = { - prompt_title = "[ Queries ]", - mappings = { - default = { - after_action = function(selection) - print("Update to (" .. selection.z_score .. ") " .. selection.path) - end, - }, - [""] = { - before_action = function(selection) - print("before C-s") - end, - action = function(selection) - vim.cmd("edit " .. selection.path) - end, - }, - [""] = { action = z_utils.create_basic_command("split") }, - }, - }, - }, - }) - - -- Load the extension - t.load_extension("zoxide") - end, - }, - { - "lervag/vimtex", - config = function() - vim.cmd("let g:vimtex_quickfix_mode=0") - vim.cmd("let g:vimtex_view_general_viewer = 'evince'") - vim.cmd("let g:vimtex_compiler_method = 'latexmk'") - vim.cmd( - "let g:vimtex_compiler_latexmk = {'options': ['-pdf', '-shell-escape', '-file-line-error', '--extra-mem-bot=10000000', '-synctex=1', '-interaction=nonstopmode',],}" - ) - end, - }, - { - "jbyuki/instant.nvim", - config = function() - vim.cmd("let g:instant_username = 'dashie'") - end, - }, - { - "nvim-treesitter/nvim-treesitter", - config = function(_, _) - local opts = { - ensure_installed = {}, - -- parser_install_dir = "~/.config/nvim", - textobjects = { - select = { - enable = true, - lookahead = true, - keymaps = { - -- You can use the capture groups defined in textobjects.scm - ["af"] = "@function.outer", - ["if"] = "@function.inner", - ["ac"] = "@class.outer", - ["ic"] = "@class.inner", - }, - }, - }, - } - require("nvim-treesitter.configs").setup(opts) - end, - }, - { - "karb94/neoscroll.nvim", - config = function() - require("neoscroll").setup() - end, - }, - { - "kaarmu/typst.vim", - lazy = true, - event = "FileType typst", - }, - { - "folke/which-key.nvim", - event = "VeryLazy", - opts = { - plugins = { spelling = true }, - defaults = { - mode = { "n", "v" }, - ["g"] = { name = "+goto" }, - ["gz"] = { name = "+surround" }, - ["]"] = { name = "+next" }, - ["["] = { name = "+prev" }, - [""] = { name = "+tabs" }, - ["b"] = { name = "+buffer" }, - ["c"] = { name = "+code" }, - ["f"] = { name = "+file/find" }, - ["g"] = { name = "+git" }, - ["gh"] = { name = "+hunks" }, - ["q"] = { name = "+quit/session" }, - ["s"] = { name = "+search" }, - ["u"] = { name = "+ui" }, - ["w"] = { name = "+windows" }, - ["x"] = { name = "+diagnostics/quickfix" }, - ["h"] = { name = "+harpoon" }, - ["d"] = { name = "+DAP" }, - }, - }, - config = function(_, opts) - local wk = require("which-key") - wk.setup(opts) - wk.register(opts.defaults) - end, - }, - { - "f-person/git-blame.nvim", - lazy = true, - }, - { - "mg979/vim-visual-multi", - }, - { - "barreiroleo/ltex_extra.nvim", - ft = { "tex", "typst", "typ" }, - lazy = true, - }, - { - "smjonas/inc-rename.nvim", - lazy = true, - event = "BufEnter", - config = function() - require("inc_rename").setup({ - cmd_name = "IncRename", -- the name of the command - hl_group = "Substitute", -- the highlight group used for highlighting the identifier's new name - preview_empty_name = true, -- whether an empty new name should be previewed; if false the command preview will be cancelled instead - show_message = true, -- whether to display a `Renamed m instances in n files` message after a rename operation - input_buffer_type = nil, -- the type of the external input buffer to use (the only supported value is currently "dressing") - post_hook = nil, -- callback to run after renaming, receives the result table (from LSP handler) as an argument - }) - end, - }, - { - "nvim-tree/nvim-tree.lua", - dependencies = { "nvim-tree/nvim-web-devicons" }, - config = function() - require("nvim-tree").setup({ - renderer = { - group_empty = true, - }, - view = { - side = "right", - }, - diagnostics = { - enable = true, - }, - }) - end, - keys = { - { - "fe", - function() - require("nvim-tree.api").tree.toggle() - end, - desc = "Explorer NvimTree (root dir)", - }, - { - "fE", - function() - require("nvim-tree.api").tree.toggle() - end, - desc = "Explorer NvimTree (cwd)", - }, - { "", "fe", desc = "Explorer NvimTree (root dir)", remap = true }, - { "", "fE", desc = "Explorer NvimTree (cwd)", remap = true }, - }, - }, - { - "rcarriga/nvim-dap-ui", - keys = { - { - "dk", - function() - require("dap").down() - end, - desc = "Down", - }, - { - "dl", - function() - require("dap").up() - end, - desc = "Up", - }, - { - "d;", - function() - require("dap").run_last() - end, - desc = "Run Last", - }, - }, - }, - { - "nvim-neotest/neotest", - dependencies = { - "rcasia/neotest-java", - }, - opts = { - adapters = { - ["neotest-java"] = { - ignore_wrapper = false, -- whether to ignore maven/gradle wrapper - junit_jar = "/home/dashie/.local/share/nvim/mason/bin/junit-standalone.jar", - -- default: .local/share/nvim/neotest-java/junit-platform-console-standalone-[version].jar - }, - }, - }, - }, - { - "DreamMaoMao/yazi.nvim", - dependencies = { - "nvim-telescope/telescope.nvim", - "nvim-lua/plenary.nvim", - }, - keys = { - { "fy", "Yazi", desc = "Toggle Yazi" }, - }, - }, - { - "sindrets/diffview.nvim", - keys = { - { "gd", "DiffviewOpen", desc = "Toggle Difftool" }, - }, - }, - { "akinsho/git-conflict.nvim", version = "*", config = true }, - { "Hoffs/omnisharp-extended-lsp.nvim" }, - { - "barreiroleo/ltex_extra.nvim", - branch = "dev", - ft = { "tex", "typst", "text" }, - -- this causes an error with fsharp since - -- they use markdown to show lsp messages - config = function() - require("ltex_extra").setup({ - load_langs = { "en-US" }, - path = vim.fn.stdpath("config") .. "/spell", - }) - end, - }, - { "ionide/Ionide-vim", ft = "fsharp" }, - { - "mrcjkb/haskell-tools.nvim", - version = "^3", - lazy = false, - }, -} diff --git a/nix/programs/oxi/default.nix b/nix/programs/oxi/default.nix deleted file mode 100644 index 916d3b5..0000000 --- a/nix/programs/oxi/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ - imports = [ - ./oxipaste.nix - ./oxinoti.nix - ./oxishut.nix - ./oxidash.nix - ]; -} - diff --git a/nix/programs/oxi/oxidash.nix b/nix/programs/oxi/oxidash.nix deleted file mode 100644 index 09cb235..0000000 --- a/nix/programs/oxi/oxidash.nix +++ /dev/null @@ -1,53 +0,0 @@ -{ - xdg.configFile."oxidash/style.css" = { - text = - '' - #MainWindow { - border-radius: 10px; - } - - #MainBox { - border-radius: 10px; - } - - #MainButtonBox { - padding: 10px; - margin: 5px 0px 5px 0px; - border-radius: 5px; - border: solid 2px #327cd5; - } - - #DoNotDisturbButton { - } - - #ExitButton { - } - - #ClearNotificationsButton { - } - - #NotificationsWindow { - } - - .debugimage { - border: solid 3px blue; - } - - .Notification { - padding: 10px; - margin: 5px 0px 5px 0px; - border: solid 2px #327cd5; - border-radius: 5px; - } - - .CloseNotificationButton { - margin: 0px 5px 0px 10px; - } - .PictureButtonBox { - } - .BaseBox { - } - } - ''; - }; -} diff --git a/nix/programs/oxi/oxinoti.nix b/nix/programs/oxi/oxinoti.nix deleted file mode 100644 index f6b91b9..0000000 --- a/nix/programs/oxi/oxinoti.nix +++ /dev/null @@ -1,92 +0,0 @@ -{ config, ... }: { - xdg.configFile."oxinoti/style.css" = { - text = /*css*/ - '' - @import url("/home/${config.conf.username}/.config/gtk-3.0/gtk.css"); - - #MainWindow { - background-color: transparent; - padding: 0px; - /* opacity: 0; */ - } - - .MainBox { - background-color: transparent; - padding: 0px; - /* opacity: 0; */ - } - - .NotificationBox { - background-color: #353747; - border-radius: 5px; - border: solid 1px; - margin: 0px; - padding: 5px; - } - - .NotificationLow { - border-color: green; - } - - .NotificationNormal { - border-color: purple; - } - - .NotificationUrgent { - border-color: red; - } - - .miscbox { - margin: 0px 10px 0px 0px; - } - - .bodybox { - } - - .imagebox { - margin: 0px 0px 0px 10px; - } - - .appname { - font-size: 0.8rem; - } - - .timestamp { - font-size: 0.8rem; - } - - .summary { - font-size: 0.8rem; - } - - .body { - font-size: 1.2rem; - } - - .icon { - font-size: 2rem; - } - - .image { - } - - .bold { - font-weight: bold; - } - - .italic { - font-style: italic; - } - - .underline { - text-decoration-line: underline; - } - ''; - }; - xdg.configFile."oxinoti/oxinoti.toml" = { - text = '' - timeout = 3 - dnd_override = 2 - ''; - }; -} diff --git a/nix/programs/oxi/oxipaste.nix b/nix/programs/oxi/oxipaste.nix deleted file mode 100644 index 03a269f..0000000 --- a/nix/programs/oxi/oxipaste.nix +++ /dev/null @@ -1,31 +0,0 @@ -{ - xdg.configFile."oxipaste/style.css" = { - text = - '' - .main-window { - padding: 10px; - border-radius: 10px; - border: 2px solid #2AC3DE; - } - - .item-window { - padding: 10px; - border-radius: 10px; - border: 2px solid #C0CAF5; - } - - .item-button { - background-color: #1A1B26; - border-radius: 5px; - border: 1px solid #6D728D; - } - - .delete-button { - margin: 5px 25px 5px 5px; - } - - .item-box { - } - ''; - }; -} diff --git a/nix/programs/oxi/oxishut.nix b/nix/programs/oxi/oxishut.nix deleted file mode 100644 index ec070a1..0000000 --- a/nix/programs/oxi/oxishut.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ - xdg.configFile."oxishut/style.css" = { - text = - '' - #mainwindow { - border-radius: 10px; - } - - .mainbox { - border-radius: 5px; - padding: 20px; - } - - .button { - margin: 5px; - background-color: #2b2c3b; - -gtk-icon-size: 5rem; - } - - .button:hover { - background-color: #3e4152; - } - ''; - }; -} diff --git a/nix/programs/themes/default.nix b/nix/programs/themes/default.nix deleted file mode 100644 index 331246a..0000000 --- a/nix/programs/themes/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ - imports = [ - ./qt.nix - ./stylix.nix - # ./gtk3.nix - # ./gtk4.nix - ]; -} - diff --git a/nix/programs/themes/stylix.nix b/nix/programs/themes/stylix.nix deleted file mode 100644 index fcb04ce..0000000 --- a/nix/programs/themes/stylix.nix +++ /dev/null @@ -1,44 +0,0 @@ -{ pkgs, config, ... }: -{ - stylix = { - enable = true; - image = ../../base/black.jpg; - polarity = "dark"; - targets = { - nixvim.enable = false; - fish.enable = false; - }; - - fonts = { - serif = { - package = pkgs.cantarell-fonts; - name = "Cantarell"; - }; - - sansSerif = { - package = pkgs.cantarell-fonts; - name = "Cantarell"; - }; - - monospace = { - package = (pkgs.nerdfonts.override { fonts = [ "JetBrainsMono" ]; }); - # name = "JetBrains Mono Nerd"; - name = "JetBrainsMono Nerd Font Mono"; - }; - - emoji = { - package = pkgs.noto-fonts-emoji; - name = "Noto Color Emoji"; - }; - }; - - cursor = { - package = pkgs.bibata-cursors; - name = "Bibata-Modern-Classic"; - size = 24; - }; - - base16Scheme = - (if builtins.isAttrs config.conf.colorscheme then config.conf.colorscheme else "${pkgs.base16-schemes}/share/themes/${config.conf.colorscheme}.yaml"); - }; -} diff --git a/nix/programs/utils.nix b/nix/programs/utils.nix deleted file mode 100644 index e2ef138..0000000 --- a/nix/programs/utils.nix +++ /dev/null @@ -1,12 +0,0 @@ -{ pkgs -, ... -}: -{ - home.packages = with pkgs; [ - keepassxc - nheko - kdeconnect - nextcloud-client - xournalpp - ]; -} diff --git a/nix/programs/xdg.nix b/nix/programs/xdg.nix deleted file mode 100644 index 9433496..0000000 --- a/nix/programs/xdg.nix +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright (c) 2020-2021 Mihai Fufezan -# credits to fufexan https://github.com/fufexan/dotfiles/blob/main/home/terminal/programs/xdg.nix -{ config -, ... -}: -let - browser = [ "firefox" ]; - imageViewer = [ "imv" ]; - videoPlayer = [ "mpv" ]; - audioPlayer = [ "io.bassi.Amberol" ]; - - xdgAssociations = type: program: list: - builtins.listToAttrs (map - (e: { - name = "${type}/${e}"; - value = program; - }) - list); - - image = xdgAssociations "image" imageViewer [ "png" "svg" "jpeg" "gif" ]; - video = xdgAssociations "video" videoPlayer [ "mp4" "avi" "mkv" ]; - audio = xdgAssociations "audio" audioPlayer [ "mp3" "flac" "wav" "aac" ]; - browserTypes = - (xdgAssociations "application" browser [ - "json" - "x-extension-htm" - "x-extension-html" - "x-extension-shtml" - "x-extension-xht" - "x-extension-xhtml" - ]) - // (xdgAssociations "x-scheme-handler" browser [ - "about" - "ftp" - "http" - "https" - "unknown" - ]); - - # XDG MIME types - associations = builtins.mapAttrs (_: v: (map (e: "${e}.desktop") v)) ({ - "application/pdf" = [ "org.pwmt.zathura-pdf-mupdf" ]; - "text/html" = browser; - "text/plain" = [ "neovide" ]; - "x-scheme-handler/chrome" = [ "com.brave.browser" ]; - "inode/directory" = [ "yazi" ]; - } - // image - // video - // audio - // browserTypes); -in -{ - xdg = { - enable = true; - cacheHome = config.home.homeDirectory + "/.local/cache"; - - mimeApps = { - enable = true; - defaultApplications = associations; - }; - - userDirs = { - enable = true; - createDirectories = true; - extraConfig = { - XDG_SCREENSHOTS_DIR = "${config.xdg.userDirs.pictures}/Screenshots"; - }; - }; - }; -} diff --git a/nix/secrets/secrets.yaml b/nix/secrets/secrets.yaml deleted file mode 100644 index 6be4816..0000000 --- a/nix/secrets/secrets.yaml +++ /dev/null @@ -1,30 +0,0 @@ -hub: ENC[AES256_GCM,data:69czN3kqTYCbiwXPPUpaThm7lrpM/43nUcE0Ee3m1AscB0Huqp1LzmgVBVZ6X/NVamNipfRzN4KePmFqkGBT7V6qIewX0L6vYpLBJ7pwdv1xRF+FEkrfikqfdec28AwNCOXIOQZq3oknPpGoAVAQAsQo+SxwPaP4vZKbYpS9EA727E9REd4dVcBRW2GN3ystiX+L/Rz+mizHQfVGb6LHhj6AZWB/SGhcfGJZCfoKgwIFekjiSJhdSQemmtX1x+b7yxUwQqsUBPVtSf73zUCIYVjLwx4bdZ5OF8kITRF8ZIfp+YLN24Lt5Qeatd4FBO5AJTFOgjRjU38z6Xy3CwZMv0hp3IwqfXUd+47wiGSXSs2lygntWodcG96/KUubrChWQQxfE0vNIAu/l2sjwwre32E9mXBYn6uHFD+/kroL531KscdKdnpAACnwsomMSiJIWz3JQa6aljDeUd90VFH2kOf8VtGbqkFL9VfTrtx/dnTMaK2VJmO+bZTge+evIBgtH0Y2DP/GmaempeZIyJydx03uVCFDi+uEfGx10HMty0sUS0k=,iv:1/+m6CmUojTS4d7B76zzrwC3k5M18qkQ6q1458kG1QI=,tag:463IcCP3Tfb4JWS5K7hCjw==,type:str] -lab: ENC[AES256_GCM,data:IbIHYKp7kAP09r2t6bppLZraRIxjEsIXbfIG/R5QTGzy1uVk5LZivzepkJP6kOf3qWt/wZiBb5qLcNyL/+RZMfaV5KvlvtKhCVQ/D5qS3qB/4wKvPTdMiMzc9VTnLzUaDExMAtiYV/tcJGC/xgpkrwizJwy5WEA/d8EKUDs1p//vpv8b6035k1oV/49sw3cJ/eMGgvnuJ3sKMKpkXbUJ4zyyHKPCFoaCGdplCJDn5hZloaqxBjdZctAEgsVvKiq2HyIMNqH3YaKEJZhwMrwQMSioHA1WnBQMc0tnqWAi9rhpm8pY553HaQe0U/lpS1W5IvLj7MVxat3911WK/s95oEVLY7b7dZAzmdMau4IF/ozhxC6i2oSELw+VNqiZ/yJwfqJ7e+89UnxZdi7xMJpikOfE1qzGIPaEHj2caSf+U2sldqsRyqdf+oJK9Sof4djn5diEPkhTyLkqFCGC6QakEbprcbstBcjwu65G4BTTDy/3FJYUt0NZTHy7HDjsn/7b2Sxa1XgWbWOGBwbmMqpsSE6eJC2WmWDWtrjgO7rV6XWwzm8=,iv:uVkMdjENhj2OnHnmCyfpQAdQeXwnvTIdExDxxWVIRKc=,tag:+3lf+T2Gpa4fLC3FhbLa6A==,type:str] -dashie: ENC[AES256_GCM,data:P/+ZEelpLFrcsk8hx7CF999Wlv5OWiybjPVT1ULogCECpBAxYJglisINyJGGBSBLnp4FF45kCpFb/xsuLZGwe/o4LK6Lbf6/uwE2HSXNMMXjkD8lk3zINNXfWls6s9f/XnHsKjwp0gDGhcfMM+mbg8EAyCfkdLUWYapNQc+CIr1ilAvjzDpGhrjYw2j7FEEKiteUxPTg34DY6iKlxkuGuon4Yb2r1d5+KMiHKouomjRkvS3cAgCyTKIVybYEhCQthHJh0j76Z7O5wvfXeOkLFWE68arvOci2MC7ecx6bVUrJQDTyUSpyO9TqJneIh36STZQs9Zk24sSY8jdt59roaJPylfRmbSRnlH0Wg5vzbuu4zM/ffTaiYRZkKBYbX9wmyNh4nW7EJOD9i4lE+65VxWYI4M0EuJXqI4vaIEo2PexAWci9cp0Ui6BmY2G4PoEz0P48p2WXPnQOwSSBYY9HfeAs+oXhB4Bi+I1VUAR/BkzihBvb+d9AWcbZIurMc2h7Vlz58/2E8+QVzljHfN+pakU/FhWCt2VRhhimyF8h3Nacbk0=,iv:kmFBTzx9BNHRGv+FzdwrIvVMORprhilG8tN2C3J4BRY=,tag:jRvRDkvUE14JZZem13/5Vw==,type:str] -hub_pub: ENC[AES256_GCM,data:6vIAQWFMIR+HnERg+A4jKu/MW+e7eLQplmdJyBeuBL9tvxH1idT8C6zvMEyIPhelU6+ZYQghAlvuC4MtktI/Te0f40XvdK3Gq/DmfBrLRUgLdSjUvMeGuuKnpRX0mjCaw77YW5ES4ptZ,iv:PC9hELA0234JCk2rx6FJhMlKKaKO8WrIezJ2Q2nv6EE=,tag:R8oPaH3Sbr23oRX++OP/qg==,type:str] -lab_pub: ENC[AES256_GCM,data:rlHCiqGnoaPiQBaZQRT+bEjfNF7jNO4CGPoCOKJ1o7nv7i2jPy6Bq9OMBHXsMHI9oGfEhyKCDHdpJ65aI07KJC/fMoMoAyiNmalwNOn26jbgj84mfENS3IYbfKxQVXAUCJHE5m1cFsm7,iv:8SLdHLYq2tlfHBjdeDoByEzGuu3TURj4+KJvQfPuaWA=,tag:mmGXlRwQ0UoVIAJE6d1OUQ==,type:str] -dashie_pub: ENC[AES256_GCM,data:k6JIJOKDJcGSW47Z8y0EYxNl/vaPRVbIn35CSA57snEzYnk5GpU+1NfPDniWoAGRkpIwicgN6kpzssRlKOmVudvwMejSLv4VkLRBjrsApVFECwoIBLUNGUSDaMcIwC/BYu4jfjGaozBj,iv:0EZ0rptLdmcuTU1BGOILaaDTrc7aZGJCCxgjUESqi0M=,tag:dlQs/ugBGxnSrNj/bRSJSw==,type:str] -server_pub: ENC[AES256_GCM,data:87nTYzA8CykOPjfZS2As8+JB/ysJvHXFYbPIBA8Nus8Y3nI3Tl2F/f7mUVFBT+4mmOFTTwxghEnkpgTg/vzUm6W4wb19rIcv11eM7HYaGl5oI44a44rBJn2+PKlfIgXVgaY=,iv:O7I7kkZ44McXzCt3wH1cM3MJCShxu2O+0U0+Y6rwePo=,tag:q5D5AGMmFyiNhQNR8dRB+g==,type:str] -sops: - kms: [] - gcp_kms: [] - azure_kv: [] - hc_vault: [] - age: [] - lastmodified: "2024-07-08T18:00:49Z" - mac: ENC[AES256_GCM,data:66P0uEUhQit+EjBEhAoQP3yVAt988eYwwxnOPGahPfKDw5ud+b8atc9mT6vGK3TfQFoZfjwhRxEOmc/Wx/PA+L01S7gAFctKrnbADAfRn7HJmtX3pXunhDxI6hGyJW+CrFNiLhViMJSXHljhj/QfDmxkJ/6TSSi8uMr2iNlLA3I=,iv:AJ4RB0CV0QAumZ6o36loeR51GUxQKnEsUklIGJnn5qI=,tag:or1MamtafGlwBRr/JsL9Eg==,type:str] - pgp: - - created_at: "2024-05-14T14:35:02Z" - enc: |- - -----BEGIN PGP MESSAGE----- - - hF4DnA7H9LSNcZ4SAQdAJZzOF6GZ1VTNt2rccso305pkL5AGeeAPV0LtfpZkkVEw - 2GTK/N4MmE0YyjUAP+W3fkGawgzQDRsjSF+AB936DcL3BtfGktChl3agFBfWqprs - 1GgBCQIQ7rj9kooZpsYX93x5TSz2ZN3aeu/dcx3lHYwyqtTxdTMjK44LngfhO0qZ - zc/951nhmt6Vkj0PJY4QRkKiLPoVo/lgG4+1dv9hSJULRuZwvFQfv/7UXzq0tKrl - /xqggA6uP/rogA== - =zJOX - -----END PGP MESSAGE----- - fp: 92D29D420B5D95FCA46A12FE778CFA7A623614F3 - unencrypted_suffix: _unencrypted - version: 3.8.1 diff --git a/override/teams.nix b/override/teams.nix new file mode 100644 index 0000000..7d4f454 --- /dev/null +++ b/override/teams.nix @@ -0,0 +1,35 @@ +{ + stdenv, + lib, + copyDesktopItems, + makeDesktopItem, + chromium, + ... +}: +stdenv.mkDerivation (final: { + pname = "teams-pwa"; + name = final.pname; + nativeBuildInputs = [copyDesktopItems]; + dontUnpack = true; + + desktopItems = [ + (makeDesktopItem { + name = final.pname; + icon = final.pname; + exec = "${chromium}/bin/${ + chromium.meta.mainProgram or chromium.pname + } --app=https://teams.microsoft.com"; + desktopName = "Microsoft Teams PWA"; + genericName = "Progressive Web App for Microsoft Teams"; + categories = ["Network"]; + mimeTypes = ["x-scheme-handler/msteams"]; + }) + ]; + + meta = with lib; { + description = "Microsoft Teams PWA"; + homepage = "https://teams.microsoft.com"; + maintainers = with maintainers; [ners]; + platforms = chromium.meta.platforms; + }; +}) diff --git a/patches/darkeader.patch b/patches/darkeader.patch new file mode 100644 index 0000000..f1663df --- /dev/null +++ b/patches/darkeader.patch @@ -0,0 +1,456 @@ +diff --git a/src/background/user-storage.ts b/src/background/user-storage.ts +index 54612fb3b1f6..298e5032fc94 100644 +--- a/src/background/user-storage.ts ++++ b/src/background/user-storage.ts +@@ -5,7 +5,7 @@ import {PromiseBarrier} from '../utils/promise-barrier'; + import {isURLMatched} from '../utils/url'; + import {validateSettings} from '../utils/validation'; + +-import {readSyncStorage, readLocalStorage, writeSyncStorage, writeLocalStorage, removeSyncStorage, removeLocalStorage} from './utils/extension-api'; ++import {readManagedStorage, readSyncStorage, readLocalStorage, writeSyncStorage, writeLocalStorage, removeSyncStorage, removeLocalStorage} from './utils/extension-api'; + import {logWarn} from './utils/log'; + + +@@ -78,12 +78,7 @@ export default class UserStorage { + return settings; + } + +- private static async loadSettingsFromStorage(): Promise { +- if (UserStorage.loadBarrier) { +- return await UserStorage.loadBarrier.entry(); +- } +- UserStorage.loadBarrier = new PromiseBarrier(); +- ++ private static async loadSettingsFromStorageWithoutManaged(): Promise { + let local = await readLocalStorage(DEFAULT_SETTINGS); + + if (local.schemeVersion < 2) { +@@ -113,10 +108,8 @@ export default class UserStorage { + if (local.syncSettings == null) { + local.syncSettings = DEFAULT_SETTINGS.syncSettings; + } ++ + if (!local.syncSettings) { +- UserStorage.migrateAutomationSettings(local); +- UserStorage.fillDefaults(local); +- UserStorage.loadBarrier.resolve(local); + return local; + } + +@@ -126,18 +119,34 @@ export default class UserStorage { + local.syncSettings = false; + UserStorage.set({syncSettings: false}); + UserStorage.saveSyncSetting(false); +- UserStorage.loadBarrier.resolve(local); + return local; + } + + const {errors: syncCfgErrors} = validateSettings($sync); + syncCfgErrors.forEach((err) => logWarn(err)); ++ return $sync; ++ } ++ ++ private static async loadSettingsFromStorage(): Promise { ++ if (UserStorage.loadBarrier) { ++ return await UserStorage.loadBarrier.entry(); ++ } ++ UserStorage.loadBarrier = new PromiseBarrier(); + +- UserStorage.migrateAutomationSettings($sync); +- UserStorage.fillDefaults($sync); ++ let settings = await UserStorage.loadSettingsFromStorageWithoutManaged(); + +- UserStorage.loadBarrier.resolve($sync); +- return $sync; ++ const managed = await readManagedStorage(settings); ++ const {errors: managedCfgErrors} = validateSettings(managed); ++ if (managedCfgErrors.length === 0) { ++ settings = managed; ++ } else { ++ managedCfgErrors.forEach((err) => logWarn(err)); ++ } ++ ++ UserStorage.migrateAutomationSettings(settings); ++ UserStorage.fillDefaults(settings); ++ UserStorage.loadBarrier.resolve(settings); ++ return settings; + } + + static async saveSettings(): Promise { +diff --git a/src/background/utils/extension-api.ts b/src/background/utils/extension-api.ts +index 6d18fc0919df..6812ac2e4224 100644 +--- a/src/background/utils/extension-api.ts ++++ b/src/background/utils/extension-api.ts +@@ -97,6 +97,19 @@ export async function readLocalStorage(defaults: + }); + } + ++export async function readManagedStorage(defaults: T): Promise { ++ return new Promise((resolve) => { ++ chrome.storage.managed.get(defaults, (managed: T) => { ++ if (chrome.runtime.lastError) { ++ console.error(chrome.runtime.lastError.message); ++ resolve(defaults); ++ return; ++ } ++ resolve(managed); ++ }); ++ }); ++} ++ + function prepareSyncStorage(values: T): {[key: string]: any} { + for (const key in values) { + const value = values[key]; +diff --git a/src/managed-storage.json b/src/managed-storage.json +new file mode 100644 +index 000000000000..e394d0f1ff60 +--- /dev/null ++++ b/src/managed-storage.json +@@ -0,0 +1,304 @@ ++{ ++ ++ "$schema": "http://json-schema.org/draft-07/schema#", ++ "type": "object", ++ "properties": { ++ "schemeVersion": { ++ "type": "integer" ++ }, ++ "enabled": { ++ "type": "boolean" ++ }, ++ "fetchNews": { ++ "type": "boolean" ++ }, ++ "theme": { ++ "$ref": "Theme" ++ }, ++ "presets": { ++ "type": "array", ++ "items": { ++ "$ref": "ThemePreset" ++ } ++ }, ++ "customThemes": { ++ "type": "array", ++ "items": { ++ "$ref": "CustomSiteConfig" ++ } ++ }, ++ "enabledByDefault": { ++ "type": "boolean" ++ }, ++ "enabledFor": { ++ "type": "array", ++ "items": { ++ "type": "string", ++ "minLength": 1 ++ } ++ }, ++ "disabledFor": { ++ "type": "array", ++ "items": { ++ "type": "string", ++ "minLength": 1 ++ } ++ }, ++ "changeBrowserTheme": { ++ "type": "boolean" ++ }, ++ "syncSettings": { ++ "type": "boolean" ++ }, ++ "syncSitesFixes": { ++ "type": "boolean" ++ }, ++ "automation": { ++ "$ref": "Automation" ++ }, ++ "time": { ++ "$ref": "TimeSettings" ++ }, ++ "location": { ++ "$ref": "LocationSettings" ++ }, ++ "previewNewDesign": { ++ "type": "boolean" ++ }, ++ "previewNewestDesign": { ++ "type": "boolean" ++ }, ++ "enableForPDF": { ++ "type": "boolean" ++ }, ++ "enableForProtectedPages": { ++ "type": "boolean" ++ }, ++ "enableContextMenus": { ++ "type": "boolean" ++ }, ++ "detectDarkTheme": { ++ "type": "boolean" ++ }, ++ // Chrome's JSON schema format is weird and doesn't support `definitions` property and thus `#/definitions` references ++ // https://datatracker.ietf.org/doc/html/draft-zyp-json-schema-03 ++ // This "property" mimics it ++ "definitions": { ++ "type": "object", ++ "properties": { ++ "Theme": { ++ "id": "Theme", ++ "type": "object", ++ "properties": { ++ "mode": { ++ "$ref": "FilterMode" ++ }, ++ "brightness": { ++ "type": "integer", ++ "minimum": 0, ++ "maximum": 200 ++ }, ++ "contrast": { ++ "type": "integer", ++ "minimum": 0, ++ "maximum": 200 ++ }, ++ "grayscale": { ++ "type": "integer", ++ "minimum": 0, ++ "maximum": 100 ++ }, ++ "sepia": { ++ "type": "integer", ++ "minimum": 0, ++ "maximum": 100 ++ }, ++ "useFont": { ++ "type": "boolean" ++ }, ++ "fontFamily": { ++ "type": "string", ++ "minLength": 1 ++ }, ++ "textStroke": { ++ "type": "number" ++ }, ++ "engine": { ++ "type": "string", ++ "enum": [ ++ "cssFilter", ++ "svgFilter", ++ "staticTheme", ++ "dynamicTheme" ++ ] ++ }, ++ "stylesheet": { ++ "type": "string" ++ }, ++ "darkSchemeBackgroundColor": { ++ "$ref": "HexColor" ++ }, ++ "darkSchemeTextColor": { ++ "$ref": "HexColor" ++ }, ++ "lightSchemeBackgroundColor": { ++ "$ref": "HexColor" ++ }, ++ "lightSchemeTextColor": { ++ "$ref": "HexColor" ++ }, ++ "scrollbarColor": { ++ "$ref": "HexColorOrAuto" ++ }, ++ "selectionColor": { ++ "$ref": "HexColorOrAuto" ++ }, ++ "styleSystemControls": { ++ "type": "boolean" ++ }, ++ "lightColorScheme": { ++ "type": "string", ++ "minLength": 1 ++ }, ++ "darkColorScheme": { ++ "type": "string", ++ "minLength": 1 ++ }, ++ "immediateModify": { ++ "type": "boolean" ++ } ++ } ++ }, ++ "HexColor": { ++ "id": "HexColor", ++ "type": "string", ++ "pattern": "^[0-9a-f]{6}$" ++ }, ++ "HexColorOrAuto": { ++ "id": "HexColorOrAuto", ++ "type": "string", ++ "pattern": "^([0-9a-f]{6}|auto)$" ++ }, ++ "FilterMode": { ++ "id": "FilterMode", ++ "type": "integer", ++ "enum": [ ++ 0, ++ 1 ++ ] ++ }, ++ "ThemePreset": { ++ "id": "ThemePreset", ++ "type": "object", ++ "properties": { ++ "id": { ++ "type": "string", ++ "minLength": 1 ++ }, ++ "name": { ++ "type": "string", ++ "minLength": 1 ++ }, ++ "urls": { ++ "type": "array", ++ "items": { ++ "type": "string", ++ "minLength": 1 ++ } ++ }, ++ "theme": { ++ "$ref": "Theme" ++ } ++ }, ++ "required": [ ++ "id", ++ "name", ++ "urls", ++ "theme" ++ ] ++ }, ++ "CustomSiteConfig": { ++ "id": "CustomSiteConfig", ++ "type": "object", ++ "properties": { ++ "url": { ++ "type": "array", ++ "items": { ++ "type": "string", ++ "minLength": 1 ++ } ++ }, ++ "theme": { ++ "$ref": "Theme" ++ }, ++ "builtin": { ++ "type": "boolean" ++ } ++ }, ++ "required": [ ++ "url", ++ "theme" ++ ] ++ }, ++ "Automation": { ++ "id": "Automation", ++ "type": "object", ++ "properties": { ++ "enabled": { ++ "type": "boolean" ++ }, ++ "mode": { ++ "$ref": "AutomationMode" ++ }, ++ "behavior": { ++ "type": "string", ++ "enum": [ ++ "OnOff", ++ "Scheme" ++ ] ++ } ++ } ++ }, ++ "AutomationMode": { ++ "id": "AutomationMode", ++ "type": "string", ++ "enum": [ ++ "", ++ "time", ++ "system", ++ "location" ++ ] ++ }, ++ "TimeSettings": { ++ "id": "TimeSettings", ++ "type": "object", ++ "properties": { ++ "activation": { ++ "$ref": "Time" ++ }, ++ "deactivation": { ++ "$ref": "Time" ++ } ++ } ++ }, ++ "Time": { ++ "id": "Time", ++ "type": "string", ++ "pattern": "^((0?[0-9])|(1[0-9])|(2[0-3])):([0-5][0-9])$" ++ }, ++ "LocationSettings": { ++ "id": "LocationSettings", ++ "type": "object", ++ "properties": { ++ "latitude": { ++ "type": "number" ++ }, ++ "longitude": { ++ "type": "number" ++ } ++ } ++ } ++ } ++ } ++ } ++} +diff --git a/tasks/bundle-manifest.js b/tasks/bundle-manifest.js +index ae29531e67b7..f4058a129f52 100644 +--- a/tasks/bundle-manifest.js ++++ b/tasks/bundle-manifest.js +@@ -4,6 +4,7 @@ import {PLATFORM} from './platform.js'; + import * as reload from './reload.js'; + import {createTask} from './task.js'; + import {readJSON, writeJSON} from './utils.js'; ++import {copyFile} from 'node:fs/promises'; + + async function patchManifest(platform, debug, watch, test) { + const manifest = await readJSON(absolutePath('src/manifest.json')); +@@ -16,6 +17,11 @@ async function patchManifest(platform, debug, watch, test) { + if (platform === PLATFORM.CHROMIUM_MV3) { + patched.browser_action = undefined; + } ++ if (platform === PLATFORM.CHROMIUM_MV2 || platform === PLATFORM.CHROMIUM_MV3) { ++ patched.storage = { ++ managed_schema: 'managed-storage.json', ++ }; ++ } + if (debug) { + patched.version = '1'; + patched.description = `Debug build, platform: ${platform}, watch: ${watch ? 'yes' : 'no'}.`; +@@ -42,6 +48,9 @@ async function manifests({platforms, debug, watch, test}) { + const manifest = await patchManifest(platform, debug, watch, test); + const destDir = getDestDir({debug, platform}); + await writeJSON(`${destDir}/manifest.json`, manifest); ++ if (platform === PLATFORM.CHROMIUM_MV2 || platform === PLATFORM.CHROMIUM_MV3) { ++ await copyFile(absolutePath('src/managed-storage.json'), `${destDir}/managed-storage.json`); ++ } + } + } + +@@ -49,7 +58,7 @@ const bundleManifestTask = createTask( + 'bundle-manifest', + manifests, + ).addWatcher( +- ['src/manifest*.json'], ++ ['src/manifest*.json', 'src/managed-storage.json'], + async (changedFiles, _, buildPlatforms) => { + const chrome = changedFiles.some((file) => file.endsWith('manifest.json')); + const platforms = {}; diff --git a/patches/darkreader.nix b/patches/darkreader.nix new file mode 100644 index 0000000..ef2c19f --- /dev/null +++ b/patches/darkreader.nix @@ -0,0 +1,25 @@ +# credits to Voronind for darkreader config https://github.com/voronind-com/nix/blob/main/home/program/firefox/default.nix +{ + lib, + dashNixAdditionalProps, + ... +}: let + stable = dashNixAdditionalProps.pkgsDarkreader; +in + stable.buildNpmPackage rec { + version = "4.9.99"; + pname = "dark-reader"; + npmDepsHash = "sha256-m41HkwgbeRRmxJALQFJl/grYjjIqFOc47ltaesob1FA="; + env.ESBUILD_BINARY_PATH = lib.getExe stable.esbuild; + patches = [./darkeader.patch]; + src = stable.fetchFromGitHub { + hash = "sha256-K375/4qOyE1Tp/T5V5uCGcNd1IVVbT1Pjdnq/8oRHj0="; + owner = "darkreader"; + repo = "darkreader"; + rev = "v${version}"; + }; + installPhase = '' + mkdir -p $out + cp build/release/darkreader-firefox.xpi $out/latest.xpi + ''; + } diff --git a/scripts/audio_control.sh b/scripts/audio_control.sh deleted file mode 100755 index 33cc652..0000000 --- a/scripts/audio_control.sh +++ /dev/null @@ -1,80 +0,0 @@ - -ncspot() { - NUM=$(pactl list clients short | rg "ncspot" | awk -F 'PipeWire' ' { print $1 } ' | tr -d ' \t\n') - CHANGE=$(pactl list sink-inputs short | rg "$NUM" | awk -F ' ' ' { print $1 }' | tr -d ' \t\n') - pactl set-sink-input-volume "$CHANGE" "$1" - VOLUME=$(pactl list sink-inputs | rg "$NUM" -A7 | rg "Volume:" | awk -F ' ' ' { print $5 }' | tr -d '%') - notify-send -a "ncspot" -r 990 -u low -i audio-volume-high -h int:progress:"$VOLUME" "Spotify Volume: ${VOLUME}%" -} - -firefox() { - STRING=$(pactl list clients short | rg "firefox" | awk -F 'PipeWire' ' { print $1 "," } ' | tr -d ' \t\n') - # NUMS=',' read -r -a array <<< "$STRING" - readarray -td, NUMS <<<"$STRING" - declare -p NUMS - for index in "${!NUMS[@]}"; do #"${!array[@]}" - NUM=$(echo "${NUMS[index]}" | tr -d ' \t\n') - CHANGE=$(pactl list sink-inputs short | rg "$NUM" | awk -F ' ' ' { print $1 }' | tr -d ' \t\n') - pactl set-sink-input-volume "$CHANGE" "$1" - done - VOLUME=$(pactl list sink-inputs | rg "${NUMS[0]}" -A7 | rg "Volume:" | awk -F ' ' ' { print $5 }' | tr -d '%') - notify-send -a "Firefox" -r 991 -u low -i audio-volume-high -h int:progress:"$VOLUME" "Firefox Volume: ${VOLUME}%" -} - -internal() { - SPEAKER=$(pactl list sinks | grep "Name" | grep "alsa" | awk -F ': ' '{ print $2 }') - if [ "$SPEAKER" != "" ]; then - pactl set-default-sink "$SPEAKER" - pactl set-sink-mute "$SPEAKER" false - DEVICE=$(echo "$SPEAKER" | awk -F '.' ' { print $4 } ') - notify-send "changed audio to "$DEVICE" " - else - notify-send "failed, not available!" - fi -} - -set_volume_sink() { - pactl set-sink-volume @DEFAULT_SINK@ "$1" - CURRENT=$(pactl get-sink-volume @DEFAULT_SINK@ | awk -F'/' '{ print $2 }' | tr -d ' %') - notify-send -a "System Volume" -r 1001 -u low -i audio-volume-high -h int:progress:"$CURRENT" "Output Volume: ${CURRENT}%" -} - -set_volume_source() { - pactl set-source-volume @DEFAULT_SOURCE@ "$1" - CURRENT=$(pactl get-source-volume @DEFAULT_SOURCE@ | awk -F'/' '{ print $2 }' | tr -d ' %') - notify-send -a "System Volume" -r 1001 -u low -i audio-volume-high -h int:progress:"$CURRENT" "Input Volume: ${CURRENT}%" -} - -bluetooth() { - SPEAKER=$(pactl list sinks | grep "Name" | grep "blue" | awk -F ': ' '{ print $2 }') - if [ "$SPEAKER" != "" ]; then - pactl set-default-sink "$SPEAKER" - pactl set-sink-mute "$SPEAKER" false - DEVICE=$(echo "$SPEAKER" | awk -F '.' ' { print $4 } ') - notify-send "changed audio to "$DEVICE" " - else - notify-send "failed, not available!" - fi -} - -mute() { - pactl set-sink-mute @DEFAULT_SINK@ toggle - MUTE=$(pactl get-sink-mute @DEFAULT_SINK@) - notify-send -a "Audio" -r 994 -u low -i audio-volume-high "Audio: $MUTE" -} - -if [ "$1" == "internal" ]; then - internal -elif [ "$1" == "bluetooth" ]; then - bluetooth -elif [ "$1" == "firefox" ]; then - firefox "$2" -elif [ "$1" == "ncspot" ]; then - ncspot "$2" -elif [ "$1" == "mute" ]; then - mute -elif [ "$1" == "sink" ]; then - set_volume_sink "$2" -elif [ "$1" == "source" ]; then - set_volume_source "$2" -fi diff --git a/scripts/change-brightness b/scripts/change-brightness deleted file mode 100755 index 198dc44..0000000 --- a/scripts/change-brightness +++ /dev/null @@ -1,12 +0,0 @@ -#! /bin/bash - -set_brightness() { -brightnessctl set "$1" -CURRENT=$(brightnessctl -m -d intel_backlight | awk -F, '{print substr($4, 0, length($4)-1)}') -dunstify -a "changeBrightness" -r 3 -u low -i brightness-high -h int:value:"$CURRENT" "Brightness: ${CURRENT}%" -} - -if [ "$1" == "brightness" ]; then - set_brightness "$2" -fi - diff --git a/scripts/part.sh b/scripts/part.sh deleted file mode 100755 index ee9d5c3..0000000 --- a/scripts/part.sh +++ /dev/null @@ -1,23 +0,0 @@ -read -p "formatting disk $1 with hostname $2 is this correct? " IN -read -p "is the disk an nvme drive? " NVME -if [ "$IN" == "y" ]; then - echo "commencing" - #format disk - parted $1 mklabel gpt mkpart primary fat32 1MiB 512MiB mkpart primary linux-swap 512MiB 31029MiB mkpart primary btrfs 31029MiB 40% mkpart primary btrfs 40% 100% - if [ "$NVME" == "y" ]; then - e2label $1p1 BOOT - e2label $1p2 SWAP - e2label $1p3 ROOT - e2label $1p4 HOME - else - e2label "$1"1 BOOT - e2label "$1"2 SWAP - e2label "$1"3 ROOT - e2label "$1"4 HOME - fi - # install nixos - echo "formatting finished, continuing to install system" - nixos-install --flake ./nix/.#$2 --no-root-passwd -else - echo "aborting" -fi diff --git a/scripts/penguin1.sh b/scripts/penguin1.sh deleted file mode 100644 index 87dcf8e..0000000 --- a/scripts/penguin1.sh +++ /dev/null @@ -1 +0,0 @@ -echo "Do you have time to talk about the lord and savior PenguinOS?" | wl-copy diff --git a/scripts/penguin2.sh b/scripts/penguin2.sh deleted file mode 100644 index c256142..0000000 --- a/scripts/penguin2.sh +++ /dev/null @@ -1,3 +0,0 @@ -echo "Are you tired about ads on your operating system? About forced telemetry? About arbitrary intallation requirements like online accounts or forced hardware upgrades? -Fear not penguin is for you, free of charge and free to change. Penguin does not control you, you control penguin. -Don't delay, install penguin today: https://distrochooser.de/" | wl-copy diff --git a/streamdeck_ui_export.json b/streamdeck_ui_export.json deleted file mode 100644 index 5ef6493..0000000 --- a/streamdeck_ui_export.json +++ /dev/null @@ -1,3184 +0,0 @@ -{ - "state": { - "AL01H1A05148": { - "buttons": { - "0": { - "0": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "/home/dashie/Downloads/volume-1.svg", - "keys": "", - "write": "", - "command": "sh /home/dashie/.config/scripts/audio_control.sh ncspot -5%", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "1": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "/home/dashie/Downloads/volume-2.svg", - "keys": "", - "write": "", - "command": "sh /home/dashie/.config/scripts/audio_control.sh ncspot +5%", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "2": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "/home/dashie/Downloads/skip-back.svg", - "keys": "", - "write": "", - "command": "playerctl previous --player=ncspot", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "3": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "/home/dashie/Downloads/play.svg", - "keys": "", - "write": "", - "command": "playerctl play-pause --player=ncspot", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "4": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "/home/dashie/Downloads/skip-forward.svg", - "keys": "", - "write": "", - "command": "playerctl next --player=ncspot", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "5": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "/home/dashie/Downloads/volume-1.svg", - "keys": "", - "write": "", - "command": "sh /home/dashie/.config/scripts/audio_control.sh firefox -5%", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "6": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "/home/dashie/Downloads/volume-2.svg", - "keys": "", - "write": "", - "command": "sh /home/dashie/.config/scripts/audio_control.sh firefox +5%", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "7": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "/home/dashie/Downloads/skip-back.svg", - "keys": "", - "write": "", - "command": "playerctl previous --player=firefox", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "8": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "/home/dashie/Downloads/play.svg", - "keys": "", - "write": "", - "command": "playerctl play-pause --player=firefox", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "9": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "/home/dashie/Downloads/skip-forward.svg", - "keys": "", - "write": "", - "command": "playerctl next --player=firefox", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "10": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "/home/dashie/Downloads/volume-x.svg", - "keys": "", - "write": "", - "command": "sh /home/dashie/.config/scripts/audio_control.sh mute", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "11": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "/home/dashie/Downloads/volume-1.svg", - "keys": "", - "write": "", - "command": "sh /home/dashie/.config/scripts/audio_control.sh sink -5%", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "12": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "/home/dashie/Downloads/volume-2.svg", - "keys": "", - "write": "", - "command": "sh /home/dashie/.config/scripts/audio_control.sh sink +5%", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "13": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "/home/dashie/Pictures/random/Birblux/SmartSelect_20220307-191307_Samsung Internet.jpg", - "keys": "", - "write": "", - "command": "sh /home/dashie/.config/scripts/penguin1.sh", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "14": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "/home/dashie/Pictures/random/Birblux/SmartSelect_20220307-191307_Samsung Internet.jpg", - "keys": "", - "write": "", - "command": "sh /home/dashie/.config/scripts/penguin2.sh", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - } - }, - "1": { - "0": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "1": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "2": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "3": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "4": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "5": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "6": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "7": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "8": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "9": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "10": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "11": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "12": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "13": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "14": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - } - }, - "2": { - "0": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "1": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "2": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "3": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "4": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "5": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "6": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "7": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "8": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "9": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "10": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "11": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "12": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "13": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "14": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - } - }, - "3": { - "0": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "1": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "2": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "3": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "4": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "5": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "6": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "7": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "8": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "9": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "10": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "11": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "12": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "13": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "14": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - } - }, - "4": { - "0": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "1": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "2": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "3": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "4": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "5": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "6": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "7": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "8": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "9": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "10": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "11": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "12": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "13": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "14": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - } - }, - "5": { - "0": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "1": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "2": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "3": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "4": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "5": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "6": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "7": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "8": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "9": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "10": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "11": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "12": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "13": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "14": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - } - }, - "6": { - "0": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "1": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "2": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "3": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "4": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "5": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "6": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "7": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "8": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "9": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "10": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "11": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "12": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "13": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "14": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - } - }, - "7": { - "0": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "1": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "2": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "3": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "4": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "5": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "6": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "7": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "8": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "9": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "10": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "11": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "12": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "13": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "14": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - } - }, - "8": { - "0": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "1": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "2": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "3": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "4": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "5": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "6": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "7": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "8": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "9": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "10": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "11": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "12": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "13": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "14": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - } - }, - "9": { - "0": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "1": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "2": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "3": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "4": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "5": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "6": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "7": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "8": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "9": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "10": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "11": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "12": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "13": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - }, - "14": { - "state": 0, - "states": { - "0": { - "text": "", - "icon": "", - "keys": "", - "write": "", - "command": "", - "brightness_change": 0, - "switch_page": 0, - "switch_state": 0, - "text_vertical_align": "", - "text_horizontal_align": "", - "font": "", - "font_color": "", - "font_size": 0, - "background_color": "" - } - } - } - } - }, - "display_timeout": 0, - "brightness": 99, - "brightness_dimmed": 0, - "rotation": 0, - "page": 0 - } - }, - "streamdeck_ui_version": 2 -} \ No newline at end of file