diff --git a/Makefile b/Makefile index 93056a3..ecb72d1 100644 --- a/Makefile +++ b/Makefile @@ -5,16 +5,19 @@ SYSCONFDIR ?= /etc BINDIR ?= $(PREFIX)/bin DATADIR ?= $(PREFIX)/share LIBEXECDIR ?= $(PREFIX)/libexec +BACKGROUND ?= $(DATADIR)/backgrounds/default.png .PHONY: build clean install check requires .DEFAULT: build -GENERATED := $(patsubst %.in,%,$(wildcard sway/*.in sway/*/*.in )) -VARIABLES := PREFIX SYSCONFDIR DATADIR LIBEXECDIR +TEMPLATES := sway/*.in sway/*/*.in swaylock/*.in sddm/03-sway-fedora/theme.conf.in +GENERATED := $(patsubst %.in,%,$(wildcard $(TEMPLATES))) +VARIABLES := PREFIX SYSCONFDIR DATADIR LIBEXECDIR BACKGROUND -sway/%: sway/%.in - sed "$(foreach var,$(VARIABLES),s^@$(var)@^$($(var))^i;)" $^ > $@ - sed '$(foreach var,$(VARIABLES),s^$$$(var)\b^$($(var))^i;)' $^ > $@ +%: %.in + sed -e "$(foreach var,$(VARIABLES),s^@$(var)@^$($(var))^i;)" \ + -e '$(foreach var,$(VARIABLES),s^$$$(var)\b^$($(var))^i;)' \ + $^ > $@ build: $(GENERATED) @@ -22,10 +25,14 @@ clean: rm -f $(GENERATED) rm -rf test/ +install-initialsetup: + install -D -m 0755 -pv -t $(DESTDIR)$(LIBEXECDIR)/initial-setup initial-setup/run-gui-backend + install-sddm: install -D -m 0755 -pv -t $(DESTDIR)$(LIBEXECDIR) sddm/sddm-compositor-sway install -D -m 0644 -pv -t $(DESTDIR)$(SYSCONFDIR)/sway sddm/sddm-greeter.config install -D -m 0644 -pv -t $(DESTDIR)$(PREFIX)/lib/sddm/sddm.conf.d sddm/wayland-sway.conf + install -D -m 0644 -pv -t $(DESTDIR)$(DATADIR)/sddm/themes/03-sway-fedora sddm/03-sway-fedora/* install-sway: build install -D -m 0644 -pv -t $(DESTDIR)$(SYSCONFDIR)/sway sway/config @@ -34,12 +41,17 @@ install-sway: build install -D -m 0644 -pv -t $(DESTDIR)$(DATADIR)/wayland-sessions sway/sway.desktop install -D -m 0644 -pv -t $(DESTDIR)$(DATADIR)/sway/config.d sway/config.d/*.conf install -D -m 0644 -pv -t $(DESTDIR)$(DATADIR)/sway/config.live.d sway/config.live.d/*.conf + install -D -m 0644 -pv -t $(DESTDIR)$(DATADIR)/sway/live sway/live/* install -D -m 0755 -pv -t $(DESTDIR)$(LIBEXECDIR)/sway scripts/sway/* install-swaylock: install -D -m 0644 -pv -t $(DESTDIR)$(SYSCONFDIR)/swaylock swaylock/config -.PHONY: install-sddm install-sway install-swaylock +.PHONY: install-initialsetup install-sddm install-sway install-swaylock + +ifeq ($(WITH_INITIALSETUP),yes) +install: install-initialsetup +endif ifeq ($(WITH_SDDM),yes) install: install-sddm diff --git a/doc/configuration.adoc b/doc/configuration.adoc deleted file mode 100644 index 1eaf998..0000000 --- a/doc/configuration.adoc +++ /dev/null @@ -1,159 +0,0 @@ -= Configuration guide -Fedora Sway SIG -:source-highlighter: rouge -:sway-package: https://packages.fedoraproject.org/pkgs/sway/ -:config-package: https://packages.fedoraproject.org/pkgs/sway-config-fedora/ -:toc: - -An overview of the custom Sway configuration shipped in Fedora. - -== Configuration profiles - -The Sway package in Fedora defers most of the dependencies and the config file -ownership to the `+sway-config-*+` subpackages. -This allows us to ship different configuration profiles with different sets of -runtime dependencies. -This also allows anyone to create a package with their preferred system-wide -configuration defaults and use it instead of the default Fedora profiles. - -The following profiles are currently defined in the {sway-package}[`sway`] -source package: - - * **sway-config-minimal** - minimal configuration with any optional - dependencies omitted. - Suitable for headless servers, containers and buildroot usage. - Also suitable for building a very minimal installation from scratch. - - * **sway-config-upstream** - the upstream configuration. - The only permitted modifications to the config file are adjustments for - dependencies currently unavailable in Fedora. - -The profiles defined in the {config-package}[`sway-config-fedora`] source -package: - - * **sway-config-fedora** - customized configuration for Fedora Sway Spin. - -The config packages are mutually exclusive, and one of these will always be -installed. -The one selected by default is **sway-config-upstream** and the one that will -be installed with Sway Spin/Sway Desktop Environment group is -**sway-config-fedora**. - -At any moment, you can switch the installed configuration with one of the -following commands: - -[source,shell] ----- -dnf swap sway-config sway-config-upstream -dnf swap sway-config sway-config-minimal -dnf swap sway-config sway-config-fedora ----- - -The command will replace the default `+/etc/sway/config+` file and apply the new -set of dependencies. -Packages unused by the new profile will be autoremoved. - -NOTE: The command will be different for OSTree-based installations, such as Sericea. - -== Fedora configuration - -**sway-config-fedora** contains the default configuration for Fedora Sway Spin. -It is built on top of the default Sway config with a few quality of life -improvements and opinionated changes. - -Most of the additions are implemented as a standalone configuration snippets -stored at `+/usr/share/sway/config.d/+` and automatically loaded from the main -configuration file. - -=== Sections - -The configuration snippets we provide are grouped into the following sections: - -50-59 (`+50-rules-*.conf+`):: -Window rules (`+for_window+`, `+assign+` and related configuration). - -60-69 (`+60-bindings-*.conf+`, `+65-mode-*.conf+`):: -Key bindings and binding modes - -90-94 (`+90-*.conf+`):: -System applications: bars, idle daemons and other components. - -95-99 (`+95-*.conf+`):: -Autostart applications - -=== Overrides and load precedence - -Fedora configuration uses the implementation details of the Sway config loading -(https://man7.org/linux/man-pages/man3/wordexp.3p.html[`wordexp(3p)`]) to -implement a configuration overrides mechanism for the snippets. - -The priority increases from the packaged configuration to a system-wide -configuration and an user configuration directories: - - * `+/usr/share/sway/config.d/*.conf+` - * `+/etc/sway/config.d/*.conf+` - * `+${XDG_CONFIG_HOME:-$HOME/.config}/sway/config.d/*.conf+` - (defaults to `+~/.config/sway/config.d/*.conf+`) - -The includes are also sorted by a file name across all the directories. - -By creating a file with the same name in `+/etc/sway/config.d+` you'll force -Sway to ignore the corresponding snippet from `+/usr+` and load the one from -`+/etc+`. -Similarly, the configuration snippet from a home directory wins over the earlier -locations. - -To put it even more simple: imagine the distribution configuration file -`+/usr/share/sway/config.d/90-bar.conf+` that sets waybar as a status bar. -If you want to prevent waybar from starting, you could create an empty file -in your home directory: - -[source,shell] ----- -mkdir -p ~/.config/sway/config.d -touch ~/.config/sway/config.d/90-bar.conf ----- - -If you want to set another bar, you just need to add some contents to the file. -For example, copy the default bar section from the upstream Sway config: - -[source,shell] ----- -mkdir -p ~/.config/sway/config.d -cat >~/.config/sway/config.d/90-bar.conf < ${CONFIG_FILE} << EOF +# Sway configuration for Anaconda initial setup. +xwayland force +swaybg_command - + +bindsym Mod4+shift+e exec swaynag \ + -t warning \ + -m 'What do you want to do?' \ + -b 'Poweroff' 'systemctl poweroff' \ + -b 'Reboot' 'systemctl reboot' + +# Disable displays on idle +exec command -v swayidle >/dev/null && swayidle -w \ + timeout 300 'swaymsg "output * power off"' \ + resume 'swaymsg "output * power on"' + +# Apply system keyboard configuration +exec /usr/libexec/sway-systemd/locale1-xkb-config + +# Show initial-setup-gui as fullscreen +for_window [class="[Ii]nitial-setup-graphical"] fullscreen enable +exec ${RUN_SCRIPT} +EOF + +cat > ${RUN_SCRIPT} << EOF +#!/bin/sh +$@ +echo $? > ${EXIT_CODE_SAVE} +sway exit +EOF + +chmod +x ${RUN_SCRIPT} + + +# Set some compatibility variables if we're in a VM +case $(systemd-detect-virt --vm) in + "none"|"") + ;; + "kvm") + # WLR_NO_HARDWARE_CURSORS=1 is not needed with legacy DRM interface + export WLR_RENDERER=pixman + export WLR_DRM_NO_ATOMIC=1 + ;; + *) + # https://github.com/swaywm/sway/issues/6581 + export WLR_NO_HARDWARE_CURSORS=1 + ;; +esac + +sway --config=${CONFIG_FILE} +exit_code=$(< ${EXIT_CODE_SAVE}) + +rm ${CONFIG_FILE} ${RUN_SCRIPT} ${EXIT_CODE_SAVE} +exit $exit_code diff --git a/scripts/sway/notify-volume b/scripts/sway/notify-volume deleted file mode 100755 index 3416c2b..0000000 --- a/scripts/sway/notify-volume +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh - -if ! command -v notify-send >/dev/null || ! command -v pactl > /dev/null; then - exit 0; -fi - -# pactl output depends on the current locale -export LANG=C.UTF-8 LC_ALL=C.UTF-8 - -SINK=${1:-@DEFAULT_SINK@} -VOLUME=$(pactl get-sink-volume "$SINK") -# get first percent value -VOLUME=${VOLUME%%%*} -VOLUME=${VOLUME##* } - -TEXT="Volume: ${VOLUME}%" -case $(pactl get-sink-mute "$SINK") in - *yes) - TEXT="Volume: muted" - VOLUME=0 - ;; -esac - -notify-send \ - --app-name sway \ - --expire-time 800 \ - --hint string:x-canonical-private-synchronous:volume \ - --hint "int:value:$VOLUME" \ - --transient \ - "${TEXT}" diff --git a/scripts/sway/volume-helper b/scripts/sway/volume-helper new file mode 100755 index 0000000..ed6989e --- /dev/null +++ b/scripts/sway/volume-helper @@ -0,0 +1,89 @@ +#!/bin/sh + +if ! command -v pactl >/dev/null; then + exit 0; +fi + +# pactl output depends on the current locale +export LANG=C.UTF-8 LC_ALL=C.UTF-8 + +DEFAULT_STEP=5 +LIMIT=${LIMIT:-100} +SINK="@DEFAULT_SINK@" + +clamp() { + if [ "$1" -lt 0 ]; then + echo "0" + elif [ "$1" -gt "$LIMIT" ]; then + echo "$LIMIT" + else + echo "$1" + fi +} + +get_sink_volume() { # sink + ret=$(pactl get-sink-volume "$1") + # get first percent value + ret=${ret%%%*} + ret=${ret##* } + echo "$ret" + unset ret +} + +CHANGE=0 +VOLUME=-1 + +while true; do + case $1 in + --sink) + SINK=${2:-$SINK} + shift;; + -l|--limit) + LIMIT=$((${2:-$LIMIT})) + shift;; + --set-volume) + VOLUME=$(($2)) + shift;; + -i|--increase) + CHANGE=$((${2:-$DEFAULT_STEP})) + shift;; + -d|--decrease) + CHANGE=$((-${2:-$DEFAULT_STEP})) + shift;; + *) + break + ;; + esac + shift +done + +if [ "$CHANGE" -ne 0 ]; then + VOLUME=$(get_sink_volume "$SINK") + VOLUME=$(( VOLUME + CHANGE )) + pactl set-sink-volume "$SINK" "$(clamp "$VOLUME")%" +elif [ "$VOLUME" -ge 0 ]; then + pactl set-sink-volume "$SINK" "$(clamp "$VOLUME")%" +fi + +# Display desktop notification + +if ! command -v notify-send >/dev/null; then + exit 0; +fi + +VOLUME=$(get_sink_volume "$SINK") +TEXT="Volume: ${VOLUME}%" +case $(pactl get-sink-mute "$SINK") in + *yes) + TEXT="Volume: muted" + VOLUME=0 + ;; +esac + +notify-send \ + --app-name sway \ + --expire-time 800 \ + --hint string:x-canonical-private-synchronous:volume \ + --hint "int:value:$VOLUME" \ + --transient \ + "${TEXT}" diff --git a/sddm/03-sway-fedora/03-sway-fedora.jpg b/sddm/03-sway-fedora/03-sway-fedora.jpg new file mode 100644 index 0000000..5873105 Binary files /dev/null and b/sddm/03-sway-fedora/03-sway-fedora.jpg differ diff --git a/sddm/03-sway-fedora/LICENSE b/sddm/03-sway-fedora/LICENSE new file mode 100644 index 0000000..6b67935 --- /dev/null +++ b/sddm/03-sway-fedora/LICENSE @@ -0,0 +1,337 @@ +Creative Commons Legal Code + +Attribution-ShareAlike 3.0 Unported + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL + SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT + RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" + BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION + PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE +BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE +CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE +IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and other + pre-existing works, such as a translation, adaptation, derivative work, + arrangement of music or other alterations of a literary or artistic work, + or phonogram or performance and includes cinematographic adaptations or any + other form in which the Work may be recast, transformed, or adapted + including in any form recognizably derived from the original, except that a + work that constitutes a Collection will not be considered an Adaptation for + the purpose of this License. For the avoidance of doubt, where the Work is + a musical work, performance or phonogram, the synchronization of the Work + in timed-relation with a moving image ("synching") will be considered an + Adaptation for the purpose of this License. + b. "Collection" means a collection of literary or artistic works, such as + encyclopedias and anthologies, or performances, phonograms or broadcasts, + or other works or subject matter other than works listed in Section 1(f) + below, which, by reason of the selection and arrangement of their contents, + constitute intellectual creations, in which the Work is included in its + entirety in unmodified form along with one or more other contributions, + each constituting separate and independent works in themselves, which + together are assembled into a collective whole. A work that constitutes a + Collection will not be considered an Adaptation (as defined below) for the + purposes of this License. + c. "Creative Commons Compatible License" means a license that is listed at + http://creativecommons.org/compatiblelicenses that has been approved by + Creative Commons as being essentially equivalent to this License, + including, at a minimum, because that license: (i) contains terms that have + the same purpose, meaning and effect as the License Elements of this + License; and, (ii) explicitly permits the relicensing of adaptations of + works made available under that license under this License or a Creative + Commons jurisdiction license with the same License Elements as this + License. + d. "Distribute" means to make available to the public the original and copies + of the Work or Adaptation, as appropriate, through sale or other transfer + of ownership. + e. "License Elements" means the following high-level license attributes as + selected by Licensor and indicated in the title of this License: + Attribution, ShareAlike. + f. "Licensor" means the individual, individuals, entity or entities that offer + (s) the Work under the terms of this License. + g. "Original Author" means, in the case of a literary or artistic work, the + individual, individuals, entity or entities who created the Work or if no + individual or entity can be identified, the publisher; and in addition (i) + in the case of a performance the actors, singers, musicians, dancers, and + other persons who act, sing, deliver, declaim, play in, interpret or + otherwise perform literary or artistic works or expressions of folklore; + (ii) in the case of a phonogram the producer being the person or legal + entity who first fixes the sounds of a performance or other sounds; and, + (iii) in the case of broadcasts, the organization that transmits the + broadcast. + h. "Work" means the literary and/or artistic work offered under the terms of + this License including without limitation any production in the literary, + scientific and artistic domain, whatever may be the mode or form of its + expression including digital form, such as a book, pamphlet and other + writing; a lecture, address, sermon or other work of the same nature; a + dramatic or dramatico-musical work; a choreographic work or entertainment + in dumb show; a musical composition with or without words; a + cinematographic work to which are assimilated works expressed by a process + analogous to cinematography; a work of drawing, painting, architecture, + sculpture, engraving or lithography; a photographic work to which are + assimilated works expressed by a process analogous to photography; a work + of applied art; an illustration, map, plan, sketch or three-dimensional + work relative to geography, topography, architecture or science; a + performance; a broadcast; a phonogram; a compilation of data to the extent + it is protected as a copyrightable work; or a work performed by a variety + or circus performer to the extent it is not otherwise considered a literary + or artistic work. + i. "You" means an individual or entity exercising rights under this License + who has not previously violated the terms of this License with respect to + the Work, or who has received express permission from the Licensor to + exercise rights under this License despite a previous violation. + j. "Publicly Perform" means to perform public recitations of the Work and to + communicate to the public those public recitations, by any means or + process, including by wire or wireless means or public digital + performances; to make available to the public Works in such a way that + members of the public may access these Works from a place and at a place + individually chosen by them; to perform the Work to the public by any means + or process and the communication to the public of the performances of the + Work, including by public digital performance; to broadcast and rebroadcast + the Work by any means including signs, sounds or images. + k. "Reproduce" means to make copies of the Work by any means including without + limitation by sound or visual recordings and the right of fixation and + reproducing fixations of the Work, including storage of a protected + performance or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, +or restrict any uses free from copyright or rights arising from limitations or +exceptions that are provided for in connection with the copyright protection +under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor +hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the +duration of the applicable copyright) license to exercise the rights in the +Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more + Collections, and to Reproduce the Work as incorporated in the Collections; + b. to create and Reproduce Adaptations provided that any such Adaptation, + including any translation in any medium, takes reasonable steps to clearly + label, demarcate or otherwise identify that changes were made to the + original Work. For example, a translation could be marked "The original + work was translated from English to Spanish," or a modification could + indicate "The original work has been modified."; + c. to Distribute and Publicly Perform the Work including as incorporated in + Collections; and, + d. to Distribute and Publicly Perform Adaptations. + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme cannot be waived, the Licensor reserves the + exclusive right to collect such royalties for any exercise by You of + the rights granted under this License; + ii. Waivable Compulsory License Schemes. In those jurisdictions in which + the right to collect royalties through any statutory or compulsory + licensing scheme can be waived, the Licensor waives the exclusive right + to collect such royalties for any exercise by You of the rights granted + under this License; and, + iii. Voluntary License Schemes. The Licensor waives the right to collect + royalties, whether individually or, in the event that the Licensor is a + member of a collecting society that administers voluntary licensing + schemes, via that society, from any exercise by You of the rights + granted under this License. + +The above rights may be exercised in all media and formats whether now known or +hereafter devised. The above rights include the right to make such +modifications as are technically necessary to exercise the rights in other +media and formats. Subject to Section 8(f), all rights not expressly granted by +Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made +subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms of + this License. You must include a copy of, or the Uniform Resource + Identifier (URI) for, this License with every copy of the Work You + Distribute or Publicly Perform. You may not offer or impose any terms on + the Work that restrict the terms of this License or the ability of the + recipient of the Work to exercise the rights granted to that recipient + under the terms of the License. You may not sublicense the Work. You must + keep intact all notices that refer to this License and to the disclaimer of + warranties with every copy of the Work You Distribute or Publicly Perform. + When You Distribute or Publicly Perform the Work, You may not impose any + effective technological measures on the Work that restrict the ability of a + recipient of the Work from You to exercise the rights granted to that + recipient under the terms of the License. This Section 4(a) applies to the + Work as incorporated in a Collection, but this does not require the + Collection apart from the Work itself to be made subject to the terms of + this License. If You create a Collection, upon notice from any Licensor You + must, to the extent practicable, remove from the Collection any credit as + required by Section 4(c), as requested. If You create an Adaptation, upon + notice from any Licensor You must, to the extent practicable, remove from + the Adaptation any credit as required by Section 4(c), as requested. + b. You may Distribute or Publicly Perform an Adaptation only under the terms + of: (i) this License; (ii) a later version of this License with the same + License Elements as this License; (iii) a Creative Commons jurisdiction + license (either this or a later license version) that contains the same + License Elements as this License (e.g., Attribution-ShareAlike 3.0 US)); + (iv) a Creative Commons Compatible License. If you license the Adaptation + under one of the licenses mentioned in (iv), you must comply with the terms + of that license. If you license the Adaptation under the terms of any of + the licenses mentioned in (i), (ii) or (iii) (the "Applicable License"), + you must comply with the terms of the Applicable License generally and the + following provisions: (I) You must include a copy of, or the URI for, the + Applicable License with every copy of each Adaptation You Distribute or + Publicly Perform; (II) You may not offer or impose any terms on the + Adaptation that restrict the terms of the Applicable License or the ability + of the recipient of the Adaptation to exercise the rights granted to that + recipient under the terms of the Applicable License; (III) You must keep + intact all notices that refer to the Applicable License and to the + disclaimer of warranties with every copy of the Work as included in the + Adaptation You Distribute or Publicly Perform; (IV) when You Distribute or + Publicly Perform the Adaptation, You may not impose any effective + technological measures on the Adaptation that restrict the ability of a + recipient of the Adaptation from You to exercise the rights granted to that + recipient under the terms of the Applicable License. This Section 4(b) + applies to the Adaptation as incorporated in a Collection, but this does + not require the Collection apart from the Adaptation itself to be made + subject to the terms of the Applicable License. + c. If You Distribute, or Publicly Perform the Work or any Adaptations or + Collections, You must, unless a request has been made pursuant to Section 4 + (a), keep intact all copyright notices for the Work and provide, reasonable + to the medium or means You are utilizing: (i) the name of the Original + Author (or pseudonym, if applicable) if supplied, and/or if the Original + Author and/or Licensor designate another party or parties (e.g., a sponsor + institute, publishing entity, journal) for attribution ("Attribution + Parties") in Licensor's copyright notice, terms of service or by other + reasonable means, the name of such party or parties; (ii) the title of the + Work if supplied; (iii) to the extent reasonably practicable, the URI, if + any, that Licensor specifies to be associated with the Work, unless such + URI does not refer to the copyright notice or licensing information for the + Work; and (iv) , consistent with Ssection 3(b), in the case of an + Adaptation, a credit identifying the use of the Work in the Adaptation + (e.g., "French translation of the Work by Original Author," or "Screenplay + based on original Work by Original Author"). The credit required by this + Section 4(c) may be implemented in any reasonable manner; provided, + however, that in the case of a Adaptation or Collection, at a minimum such + credit will appear, if a credit for all contributing authors of the + Adaptation or Collection appears, then as part of these credits and in a + manner at least as prominent as the credits for the other contributing + authors. For the avoidance of doubt, You may only use the credit required + by this Section for the purpose of attribution in the manner set out above + and, by exercising Your rights under this License, You may not implicitly + or explicitly assert or imply any connection with, sponsorship or + endorsement by the Original Author, Licensor and/or Attribution Parties, as + appropriate, of You or Your use of the Work, without the separate, express + prior written permission of the Original Author, Licensor and/or + Attribution Parties. + d. Except as otherwise agreed in writing by the Licensor or as may be + otherwise permitted by applicable law, if You Reproduce, Distribute or + Publicly Perform the Work either by itself or as part of any Adaptations or + Collections, You must not distort, mutilate, modify or take other + derogatory action in relation to the Work which would be prejudicial to the + Original Author's honor or reputation. Licensor agrees that in those + jurisdictions (e.g. Japan), in which any exercise of the right granted in + Section 3(b) of this License (the right to make Adaptations) would be + deemed to be a distortion, mutilation, modification or other derogatory + action prejudicial to the Original Author's honor and reputation, the + Licensor will waive or not assert, as appropriate, this Section, to the + fullest extent permitted by the applicable national law, to enable You to + reasonably exercise Your right under Section 3(b) of this License (right to + make Adaptations) but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS +THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND +CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, +WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A +PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, +ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. +SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH +EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN +NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, +INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS +LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically + upon any breach by You of the terms of this License. Individuals or + entities who have received Adaptations or Collections from You under this + License, however, will not have their licenses terminated provided such + individuals or entities remain in full compliance with those licenses. + Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + b. Subject to the above terms and conditions, the license granted here is + perpetual (for the duration of the applicable copyright in the Work). + Notwithstanding the above, Licensor reserves the right to release the Work + under different license terms or to stop distributing the Work at any time; + provided, however that any such election will not serve to withdraw this + License (or any other license that has been, or is required to be, granted + under the terms of this License), and this License will continue in full + force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, the + Licensor offers to the recipient a license to the Work on the same terms + and conditions as the license granted to You under this License. + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers + to the recipient a license to the original Work on the same terms and + conditions as the license granted to You under this License. + c. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of the + remainder of the terms of this License, and without further action by the + parties to this agreement, such provision shall be reformed to the minimum + extent necessary to make such provision valid and enforceable. + d. No term or provision of this License shall be deemed waived and no breach + consented to unless such waiver or consent shall be in writing and signed + by the party to be charged with such waiver or consent. + e. This License constitutes the entire agreement between the parties with + respect to the Work licensed here. There are no understandings, agreements + or representations with respect to the Work not specified here. Licensor + shall not be bound by any additional provisions that may appear in any + communication from You. This License may not be modified without the mutual + written agreement of the Licensor and You. + f. The rights granted under, and the subject matter referenced, in this + License were drafted utilizing the terminology of the Berne Convention for + the Protection of Literary and Artistic Works (as amended on September 28, + 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the + WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright + Convention (as revised on July 24, 1971). These rights and subject matter + take effect in the relevant jurisdiction in which the License terms are + sought to be enforced according to the corresponding provisions of the + implementation of those treaty provisions in the applicable national law. + If the standard suite of rights granted under applicable copyright law + includes additional rights not granted under this License, such additional + rights are deemed to be included in the License; this License is not + intended to restrict the license of any rights under applicable law. + + Creative Commons Notice + + Creative Commons is not a party to this License, and makes no warranty + whatsoever in connection with the Work. Creative Commons will not be liable + to You or any party on any legal theory for any damages whatsoever, + including without limitation any general, special, incidental or + consequential damages arising in connection to this license. + Notwithstanding the foregoing two (2) sentences, if Creative Commons has + expressly identified itself as the Licensor hereunder, it shall have all + rights and obligations of Licensor. + + Except for the limited purpose of indicating to the public that the Work is + licensed under the CCPL, Creative Commons does not authorize the use by + either party of the trademark "Creative Commons" or any related trademark + or logo of Creative Commons without the prior written consent of Creative + Commons. Any permitted use will be in compliance with Creative Commons' + then-current trademark usage guidelines, as may be published on its website + or otherwise made available upon request from time to time. For the + avoidance of doubt, this trademark restriction does not form part of the + License. + + Creative Commons may be contacted at https://creativecommons.org/. diff --git a/sddm/03-sway-fedora/Main.qml b/sddm/03-sway-fedora/Main.qml new file mode 100644 index 0000000..64e0231 --- /dev/null +++ b/sddm/03-sway-fedora/Main.qml @@ -0,0 +1,284 @@ +/*************************************************************************** +* Copyright (c) 2013 Abdurrahman AVCI +* Copyright (c) 2024 Aleksei Bavshin +* +* Permission is hereby granted, free of charge, to any person +* obtaining a copy of this software and associated documentation +* files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, +* and to permit persons to whom the Software is furnished to do so, +* subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +* OR OTHER DEALINGS IN THE SOFTWARE. +* +***************************************************************************/ + +import QtQuick 2.0 +import SddmComponents 2.0 + +Rectangle { + id: container + width: 640 + height: 480 + + LayoutMirroring.enabled: Qt.locale().textDirection == Qt.RightToLeft + LayoutMirroring.childrenInherit: true + + property int sessionIndex: session.index + + TextConstants { id: textConstants } + + Connections { + target: sddm + + function onLoginSucceeded() { + errorMessage.color = "steelblue" + errorMessage.text = textConstants.loginSucceeded + } + function onLoginFailed() { + password.text = "" + errorMessage.color = "red" + errorMessage.text = textConstants.loginFailed + } + function onInformationMessage(message) { + errorMessage.color = "red" + errorMessage.text = message + } + } + + Background { + anchors.fill: parent + source: Qt.resolvedUrl(config.background) + fillMode: Image.PreserveAspectCrop + onStatusChanged: { + var defaultBackground = Qt.resolvedUrl(config.defaultBackground) + if (status == Image.Error && source != defaultBackground) { + source = defaultBackground + } + } + } + + Rectangle { + anchors.fill: parent + color: "transparent" + //visible: primaryScreen + + Clock { + id: clock + anchors.margins: 5 + anchors.top: parent.top; anchors.right: parent.right + + color: "white" + timeFont.family: "Oxygen" + } + + Image { + id: rectangle + anchors.centerIn: parent + width: Math.max(320, mainColumn.implicitWidth + 50) + height: Math.max(320, mainColumn.implicitHeight + 50) + + source: Qt.resolvedUrl("rectangle.png") + + Column { + id: mainColumn + anchors.centerIn: parent + spacing: 12 + Text { + anchors.horizontalCenter: parent.horizontalCenter + color: "black" + verticalAlignment: Text.AlignVCenter + height: text.implicitHeight + width: parent.width + text: textConstants.welcomeText.arg(sddm.hostName) + wrapMode: Text.WordWrap + font.pixelSize: 24 + elide: Text.ElideRight + horizontalAlignment: Text.AlignHCenter + } + + Column { + width: parent.width + spacing: 4 + Text { + id: lblName + width: parent.width + text: textConstants.userName + font.bold: true + font.pixelSize: 12 + } + + TextBox { + id: name + width: parent.width; height: 30 + text: userModel.lastUser + font.pixelSize: 14 + + KeyNavigation.backtab: rebootButton; KeyNavigation.tab: password + + Keys.onPressed: function (event) { + if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { + sddm.login(name.text, password.text, sessionIndex) + event.accepted = true + } + } + } + } + + Column { + width: parent.width + spacing : 4 + Text { + id: lblPassword + width: parent.width + text: textConstants.password + font.bold: true + font.pixelSize: 12 + } + + PasswordBox { + id: password + width: parent.width; height: 30 + font.pixelSize: 14 + + KeyNavigation.backtab: name; KeyNavigation.tab: session + + Keys.onPressed: function (event) { + if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { + sddm.login(name.text, password.text, sessionIndex) + event.accepted = true + } + } + } + } + + Row { + spacing: 4 + width: parent.width / 2 + z: 100 + + Column { + z: 100 + width: parent.width * (layoutBox.visible ? 1.3 : 2) + spacing : 4 + anchors.bottom: parent.bottom + + Text { + id: lblSession + width: parent.width + text: textConstants.session + wrapMode: TextEdit.WordWrap + font.bold: true + font.pixelSize: 12 + } + + ComboBox { + id: session + width: parent.width; height: 30 + font.pixelSize: 14 + + arrowIcon: Qt.resolvedUrl("angle-down.png") + + model: sessionModel + index: sessionModel.lastIndex + + KeyNavigation.backtab: password; KeyNavigation.tab: layoutBox + } + } + + Column { + z: 101 + width: parent.width * 0.7 + spacing : 4 + anchors.bottom: parent.bottom + + visible: keyboard.enabled && keyboard.layouts.length > 0 + + Text { + id: lblLayout + width: parent.width + text: textConstants.layout + wrapMode: TextEdit.WordWrap + font.bold: true + font.pixelSize: 12 + } + + LayoutBox { + id: layoutBox + width: parent.width; height: 30 + font.pixelSize: 14 + + arrowIcon: Qt.resolvedUrl("angle-down.png") + + KeyNavigation.backtab: session; KeyNavigation.tab: loginButton + } + } + } + + Column { + width: parent.width + Text { + id: errorMessage + anchors.horizontalCenter: parent.horizontalCenter + text: textConstants.prompt + font.pixelSize: 10 + } + } + + Row { + spacing: 4 + anchors.horizontalCenter: parent.horizontalCenter + property int btnWidth: Math.max(loginButton.implicitWidth, + shutdownButton.implicitWidth, + rebootButton.implicitWidth, 80) + 8 + Button { + id: loginButton + text: textConstants.login + width: parent.btnWidth + + onClicked: sddm.login(name.text, password.text, sessionIndex) + + KeyNavigation.backtab: layoutBox; KeyNavigation.tab: shutdownButton + } + + Button { + id: shutdownButton + text: textConstants.shutdown + width: parent.btnWidth + + onClicked: sddm.powerOff() + + KeyNavigation.backtab: loginButton; KeyNavigation.tab: rebootButton + } + + Button { + id: rebootButton + text: textConstants.reboot + width: parent.btnWidth + + onClicked: sddm.reboot() + + KeyNavigation.backtab: shutdownButton; KeyNavigation.tab: name + } + } + } + } + } + + Component.onCompleted: { + if (name.text == "") + name.focus = true + else + password.focus = true + } +} diff --git a/sddm/03-sway-fedora/README b/sddm/03-sway-fedora/README new file mode 100644 index 0000000..2ebbd7a --- /dev/null +++ b/sddm/03-sway-fedora/README @@ -0,0 +1,7 @@ +Based on the Maldives SDDM theme by Abdurrahman AVCI and other SDDM contributors. + +chevron icons are extracted from Font Awesome by Dave Gandy - http://fortawesome.github.com/Font-Awesome. + +rectangle.png is from KDM ariya theme. + +QML files contain license headers. diff --git a/sddm/03-sway-fedora/angle-down.png b/sddm/03-sway-fedora/angle-down.png new file mode 100644 index 0000000..4e9aeb0 Binary files /dev/null and b/sddm/03-sway-fedora/angle-down.png differ diff --git a/sddm/03-sway-fedora/metadata.desktop b/sddm/03-sway-fedora/metadata.desktop new file mode 100644 index 0000000..c9d5cf6 --- /dev/null +++ b/sddm/03-sway-fedora/metadata.desktop @@ -0,0 +1,17 @@ +[SddmGreeterTheme] +Name=Sway-Fedora +Description=Fedora Sway Theme +Author=Fedora Sway SIG +Copyright=(c) 2024, Fedora Sway SIG +License=CC-BY-SA-3.0 AND MIT +Type=sddm-theme +Version=0.1 +Website=https://gitlab.com/fedora/sigs/sway/sway-config-fedora +Screenshot=03-sway-fedora.jpg +MainScript=Main.qml +ConfigFile=theme.conf +TranslationsDirectory=translations +Email=sway@lists.fedoraproject.org +Theme-Id=03-sway-fedora +Theme-API=2.0 +QtVersion=6 diff --git a/sddm/03-sway-fedora/rectangle.png b/sddm/03-sway-fedora/rectangle.png new file mode 100644 index 0000000..791b26c Binary files /dev/null and b/sddm/03-sway-fedora/rectangle.png differ diff --git a/sddm/03-sway-fedora/theme.conf.in b/sddm/03-sway-fedora/theme.conf.in new file mode 100644 index 0000000..757799e --- /dev/null +++ b/sddm/03-sway-fedora/theme.conf.in @@ -0,0 +1,2 @@ +[General] +background=@BACKGROUND@ diff --git a/sddm/sddm-compositor-sway b/sddm/sddm-compositor-sway index d72c621..409c2ac 100755 --- a/sddm/sddm-compositor-sway +++ b/sddm/sddm-compositor-sway @@ -12,9 +12,18 @@ if [ -x /usr/bin/start-sway ]; then fi # Set some compatibility variables in case if sway-config-fedora is not present -if systemd-detect-virt --quiet --vm; then - export WLR_NO_HARDWARE_CURSORS=1 - export WLR_RENDERER=pixman -fi +case $(systemd-detect-virt --vm) in + "none"|"") + ;; + "kvm") + # WLR_NO_HARDWARE_CURSORS=1 is not needed with legacy DRM interface + export WLR_RENDERER=pixman + export WLR_DRM_NO_ATOMIC=1 + ;; + *) + # https://github.com/swaywm/sway/issues/6581 + export WLR_NO_HARDWARE_CURSORS=1 + ;; +esac exec /usr/bin/sway "$@" diff --git a/sddm/sddm-greeter.config b/sddm/sddm-greeter.config index b1db76d..92fc43a 100644 --- a/sddm/sddm-greeter.config +++ b/sddm/sddm-greeter.config @@ -10,8 +10,11 @@ bindsym Mod4+shift+e exec swaynag \ # Disable displays on idle exec command -v swayidle >/dev/null && swayidle -w \ - timeout 300 'swaymsg "output * dpms off"' \ - resume 'swaymsg "output * dpms on"' + timeout 300 'swaymsg "output * power off"' \ + resume 'swaymsg "output * power on"' + +# Apply system keyboard configuration +exec /usr/libexec/sway-systemd/locale1-xkb-config # Show sddm-greeter as fullscreen -for_window [app_id="sddm-greeter"] fullscreen +for_window [app_id="sddm-greeter"] fullscreen enable diff --git a/sddm/wayland-sway.conf b/sddm/wayland-sway.conf index a2dd9c3..5db927e 100644 --- a/sddm/wayland-sway.conf +++ b/sddm/wayland-sway.conf @@ -4,7 +4,7 @@ GreeterEnvironment=QT_WAYLAND_SHELL_INTEGRATION=xdg-shell InputMethod= [Theme] -Current=02-lxqt-fedora +Current=03-sway-fedora [Wayland] CompositorCommand=/usr/libexec/sddm-compositor-sway diff --git a/sway-config-fedora.spec.rpkg b/sway-config-fedora.spec.rpkg index 50e9ff3..35f5ce8 100644 --- a/sway-config-fedora.spec.rpkg +++ b/sway-config-fedora.spec.rpkg @@ -1,12 +1,15 @@ # vim: ft=spec -%bcond_without sddm -%global sway_ver 1.7 +%bcond initialsetup %[0%{?fedora} >= 40 || 0%{?rhel} >= 10] +%bcond sddm 1 +%global sway_ver 1.8 +%global bg_format %[ 0%{?fedora} >= 42 ? "jxl" : "png" ] Name: {{{ git_name }}} Version: {{{ git_version }}} Release: {{{ git_release }}}%{?dist} Summary: Fedora Sway Spin configuration for Sway +SourceLicense: MIT AND CC-BY-SA-3.0 License: MIT URL: https://gitlab.com/fedora/sigs/sway/{{{ git_name }}} Source0: {{{ git_pack path=$(git rev-parse --show-toplevel) }}} @@ -27,7 +30,7 @@ Requires: polkit Requires: xorg-x11-server-Xwayland # Install configs and scripts for better integration with systemd user session -Recommends: sway-systemd +Recommends: sway-systemd >= 0.3.0 # Minimal installation doesn't include Qt Wayland backend Recommends: (qt5-qtwayland if qt5-qtbase-gui) Recommends: (qt6-qtwayland if qt6-qtbase-gui) @@ -36,11 +39,15 @@ Recommends: (qt6-qtwayland if qt6-qtbase-gui) Recommends: foot Recommends: libnotify Recommends: rofi-wayland +Recommends: xdg-user-dirs Requires: /usr/bin/pgrep Requires: /usr/bin/pkill +Requires: brightnessctl >= 0.5.1-11 Requires: desktop-backgrounds-compat Requires: grimshot -Requires: light +%if "%{bg_format}" == "jxl" +Requires: jxl-pixbuf-loader +%endif Requires: lxqt-policykit Requires: playerctl Requires: pulseaudio-utils @@ -52,15 +59,36 @@ Requires: waybar %description %{summary}. +%if %{with initialsetup} +%package -n initial-setup-gui-wayland-sway +Summary: Sway Wayland Initial Setup GUI configuration +Provides: firstboot(gui-backend) +Conflicts: firstboot(gui-backend) + +Requires: xorg-x11-server-Xwayland +Requires: initial-setup-gui >= 0.3.99 +Requires: sway >= %{sway_ver} +Supplements: (initial-setup-gui and sway) + +%description -n initial-setup-gui-wayland-sway +This package contains configuration and dependencies for +Anaconda Initial Setup to use Sway for the display server. +%endif + %if %{with sddm} %package -n sddm-wayland-sway Summary: Sway Wayland SDDM greeter configuration +License: MIT AND CC-BY-SA-3.0 + Provides: sddm-greeter-displayserver Conflicts: sddm-greeter-displayserver -Requires: lxqt-themes-fedora -Requires: sddm >= 0.19.0^git20221123.3e48649 -Requires: sway +Requires: desktop-backgrounds-compat +%if "%{bg_format}" == "jxl" +Requires: kf6-kimageformats +%endif +Requires: sddm >= 0.20.0 +Requires: sway >= %{sway_ver} %description -n sddm-wayland-sway This package contains configuration and dependencies for SDDM @@ -73,11 +101,16 @@ to use Sway for the greeter display server. %build -%make_build +%make_build \ + PREFIX='%{_prefix}' \ + BACKGROUND='%{_datadir}/backgrounds/default.%{bg_format}' %install -%make_install PREFIX='%{_prefix}' WITH_SDDM='%[%{with sddm}?"yes":"no"]' +%make_install \ + PREFIX='%{_prefix}' \ + WITH_INITIALSETUP='%[%{with initialsetup}?"yes":"no"]' \ + WITH_SDDM='%[%{with sddm}?"yes":"no"]' %files @@ -89,15 +122,24 @@ to use Sway for the greeter display server. %{_bindir}/start-sway %{_datadir}/sway/config.d %{_datadir}/sway/config.live.d +%{_datadir}/sway/live %{_datadir}/wayland-sessions/sway.desktop %{_libexecdir}/sway +%if %{with initialsetup} +%files -n initial-setup-gui-wayland-sway +%license LICENSE +%{_libexecdir}/initial-setup/run-gui-backend +%endif + %if %{with sddm} %files -n sddm-wayland-sway %license LICENSE +%license %{_datadir}/sddm/themes/03-sway-fedora/LICENSE %config(noreplace) %{_sysconfdir}/sway/sddm-greeter.config -%{_prefix}/lib/sddm/sddm.conf.d/wayland-sway.conf +%{_datadir}/sddm/themes/03-sway-fedora/ %{_libexecdir}/sddm-compositor-sway +%{_prefix}/lib/sddm/sddm.conf.d/wayland-sway.conf %endif %changelog diff --git a/sway/config.d/50-rules-pavucontrol.conf b/sway/config.d/50-rules-pavucontrol.conf new file mode 100644 index 0000000..cb2ea43 --- /dev/null +++ b/sway/config.d/50-rules-pavucontrol.conf @@ -0,0 +1,12 @@ +# Display PulseAudio volume control application (both GTK and Qt varieties) +# as a floating window. + +for_window [app_id="pavucontrol"] { + floating enable + move position center +} + +for_window [app_id="pavucontrol-qt"] { + floating enable + move position center +} diff --git a/sway/config.d/60-bindings-brightness.conf b/sway/config.d/60-bindings-brightness.conf index 0e53ec2..5c1e808 100644 --- a/sway/config.d/60-bindings-brightness.conf +++ b/sway/config.d/60-bindings-brightness.conf @@ -1,18 +1,18 @@ -# Key bindings for brightness control using `light`. +# Key bindings for brightness control using `brightnessctl`. # Displays a notification with the current value if /usr/bin/notify-send is available # # Brightness increase/decrease step can be customized by setting the `$brightness_step` # variable to a numeric value before including the file. # -# Requires: light +# Requires: brightnessctl >= 0.5.1-11 # Recommends: libnotify set $brightness_notification_cmd command -v notify-send >/dev/null && \ - VALUE=$(light) && VALUE=${VALUE%%.*} && \ + VALUE=$(brightnessctl --percentage get) && \ notify-send -e -h string:x-canonical-private-synchronous:brightness \ -h "int:value:$VALUE" -t 800 "Brightness: ${VALUE}%" bindsym XF86MonBrightnessDown exec \ - 'STEP="$brightness_step" && light -U ${STEP:-5} && $brightness_notification_cmd' + 'STEP="$brightness_step" && brightnessctl -q set ${STEP:-5}%- && $brightness_notification_cmd' bindsym XF86MonBrightnessUp exec \ - 'STEP="$brightness_step" && light -A ${STEP:-5} && $brightness_notification_cmd' + 'STEP="$brightness_step" && brightnessctl -q set +${STEP:-5}% && $brightness_notification_cmd' diff --git a/sway/config.d/60-bindings-screenshot.conf b/sway/config.d/60-bindings-screenshot.conf index c462cfc..16b1cd9 100644 --- a/sway/config.d/60-bindings-screenshot.conf +++ b/sway/config.d/60-bindings-screenshot.conf @@ -3,6 +3,11 @@ # The image files will be written to XDG_SCREENSHOTS_DIR if this is set # or defined in user-dirs.dir, or to a fallback location XDG_PICTURES_DIR. # +# Copy the file to ~/.config/sway/config.d/60-bindings-screenshot.conf (or to +# your $XDG_CONFIG_HOME location if set differently) to be able to overwrite +# existing shortcuts. +# Check 'man grimshot' for additional commands that you may find useful. +# # Requires: grimshot bindsym { @@ -12,6 +17,4 @@ bindsym { Alt+Print exec grimshot save active # Select and capture a custom rectangular area Ctrl+Print exec grimshot save area - # Select and capture a single window - $mod+Print exec grimshot save window } diff --git a/sway/config.d/60-bindings-volume.conf b/sway/config.d/60-bindings-volume.conf index 4415304..85575f2 100644 --- a/sway/config.d/60-bindings-volume.conf +++ b/sway/config.d/60-bindings-volume.conf @@ -3,18 +3,19 @@ # # Volume increase/decrease step can be customized by setting the `$volume_step` # variable to a numeric value before including the file. +# Maximum volume boost level can be set with the `$volume_limit` variable. # # Requires: pulseaudio-utils # Recommends: libnotify -set $volume_notification_cmd /usr/libexec/sway/notify-volume +set $volume_helper_cmd /usr/libexec/sway/volume-helper # Allow volume controls even if the screen is locked bindsym --locked { XF86AudioRaiseVolume exec \ - 'STEP="$volume_step" && pactl set-sink-volume @DEFAULT_SINK@ +${STEP:-5}% && $volume_notification_cmd' + $volume_helper_cmd --limit "$volume_limit" --increase "$volume_step" XF86AudioLowerVolume exec \ - 'STEP="$volume_step" && pactl set-sink-volume @DEFAULT_SINK@ -${STEP:-5}% && $volume_notification_cmd' - XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle && $volume_notification_cmd + $volume_helper_cmd --limit "$volume_limit" --decrease "$volume_step" + XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle && $volume_helper_cmd XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle } diff --git a/sway/config.d/90-bar.conf b/sway/config.d/90-bar.conf index 0b2f71f..b22145c 100644 --- a/sway/config.d/90-bar.conf +++ b/sway/config.d/90-bar.conf @@ -1,10 +1,10 @@ # Status Bar: waybar # # Read `man 5 sway-bar` for more information about this section. +# Read `man 5 waybar` for more information about the waybar instance style and layout configuration # # Requires: waybar bar { - position top swaybar_command waybar } diff --git a/sway/config.d/90-swayidle.conf b/sway/config.d/90-swayidle.conf index 3861073..2f37112 100644 --- a/sway/config.d/90-swayidle.conf +++ b/sway/config.d/90-swayidle.conf @@ -21,10 +21,10 @@ exec LT="$lock_timeout" ST="$screen_timeout" LT=${LT:-300} ST=${ST:-60} && \ swayidle -w \ timeout $LT 'swaylock -f' \ - timeout $((LT + ST)) 'swaymsg "output * dpms off"' \ - resume 'swaymsg "output * dpms on"' \ - timeout $ST 'pgrep -xu "$USER" swaylock >/dev/null && swaymsg "output * dpms off"' \ - resume 'pgrep -xu "$USER" swaylock >/dev/null && swaymsg "output * dpms on"' \ + timeout $((LT + ST)) 'swaymsg "output * power off"' \ + resume 'swaymsg "output * power on"' \ + timeout $ST 'pgrep -xu "$USER" swaylock >/dev/null && swaymsg "output * power off"' \ + resume 'pgrep -xu "$USER" swaylock >/dev/null && swaymsg "output * power on"' \ before-sleep 'swaylock -f' \ lock 'swaylock -f' \ unlock 'pkill -xu "$USER" -SIGUSR1 swaylock' diff --git a/sway/config.d/95-xdg-desktop-autostart.conf b/sway/config.d/95-xdg-desktop-autostart.conf new file mode 100644 index 0000000..56cc4fb --- /dev/null +++ b/sway/config.d/95-xdg-desktop-autostart.conf @@ -0,0 +1,14 @@ +# Wait until a StatusNotifierItem tray implementation is available and +# process XDG autostart entries. +# +# This horror has to exist because +# +# - SNI spec mandates that if `IsStatusNotifierHostRegistered` is not set, +# the client should fall back to the Freedesktop System Tray specification +# (XEmbed). +# - There are actual implementations that take this seriously and implement +# a fallback *even if* StatusNotifierWatcher is already DBus-activated. +# - https://github.com/systemd/systemd/issues/3750 +# +exec /usr/libexec/sway-systemd/wait-sni-ready && \ + systemctl --user start sway-xdg-autostart.target diff --git a/sway/config.d/95-xdg-user-dirs.conf b/sway/config.d/95-xdg-user-dirs.conf new file mode 100644 index 0000000..e7d5beb --- /dev/null +++ b/sway/config.d/95-xdg-user-dirs.conf @@ -0,0 +1,9 @@ +# Create or update XDG user dir configuration +# +# See also: +# - /etc/xdg/autostart/xdg-user-dirs.desktop +# - https://github.com/systemd/systemd/issues/18791 +# +# Recommends: xdg-user-dirs + +exec /usr/bin/xdg-user-dirs-update diff --git a/sway/config.in b/sway/config.in index 7bf9b3f..53b8844 100644 --- a/sway/config.in +++ b/sway/config.in @@ -21,21 +21,17 @@ set $term foot # on the original workspace that the command was run on. # Recommends: rofi-wayland set $rofi_cmd rofi \ - -run-command 'swaymsg exec -- {cmd}' \ - -run-shell-command 'swaymsg exec -- {terminal} -e {cmd}' \ -terminal '$term' -# Shows a list of the executables from PATH -set $menu $rofi_cmd -show run -# Shows a list of the applications with desktop files installed -set $app_menu $rofi_cmd -show drun -# Both of the above in a single list -# set $menu $rofi_cmd -show combi -combi-modes run#drun +# Shows a combined list of the applications with desktop files and +# executables from PATH. +# TODO: add window with the next release of rofi-wayland +set $menu $rofi_cmd -show combi -combi-modes drun#run -modes combi ### Output configuration # # Default wallpaper (more resolutions are available in /usr/share/backgrounds/sway/) -# Requires: desktop-backgrounds-compat, swaybg -output * bg /usr/share/backgrounds/default.png fill +# Requires: desktop-backgrounds-compat, swaybg, jxl-pixbuf-loader +output * bg @BACKGROUND@ fill # # Example configuration: # @@ -82,7 +78,6 @@ output * bg /usr/share/backgrounds/default.png fill # Start your launcher bindsym $mod+d exec $menu - bindsym $mod+Shift+d exec $app_menu # Drag floating windows by holding down $mod and left mouse button. # Resize them with right mouse button + $mod. diff --git a/sway/config.live.d/90-swayidle.conf b/sway/config.live.d/90-swayidle.conf index 32304b4..c4ff459 100644 --- a/sway/config.live.d/90-swayidle.conf +++ b/sway/config.live.d/90-swayidle.conf @@ -11,5 +11,5 @@ exec LT="$lock_timeout" ST="$screen_timeout" LT=${LT:-300} ST=${ST:-60} && \ swayidle -w \ - timeout $((LT + ST)) 'swaymsg "output * dpms off"' \ - resume 'swaymsg "output * dpms on"' \ + timeout $((LT + ST)) 'swaymsg "output * power off"' \ + resume 'swaymsg "output * power on"' diff --git a/sway/config.live.d/99-bg-installation-instructions.conf b/sway/config.live.d/99-bg-installation-instructions.conf new file mode 100644 index 0000000..7a45217 --- /dev/null +++ b/sway/config.live.d/99-bg-installation-instructions.conf @@ -0,0 +1,11 @@ +# Show installation instructions on the background +# +# Use nwg-wrapper to get installation instructions on the Live media background. +# The intention is to help first time user to start the Sway system +# installation easily. +# +# Requires: nwg-wrapper + +set $live_scripts_path /usr/share/sway/live/ + +exec nwg-wrapper -t $live_scripts_path/live-install-instructions.pango -c $live_scripts_path/live-install-style.css -p left -ml 50 -mt 50 -a start diff --git a/sway/config.live.d/99-system-keyboard-config.conf b/sway/config.live.d/99-system-keyboard-config.conf new file mode 100644 index 0000000..c2c65eb --- /dev/null +++ b/sway/config.live.d/99-system-keyboard-config.conf @@ -0,0 +1,9 @@ +# Apply system-wide XKB configuration stored in systemd-localed. +# +# The configuration can be viewed with `localectl` and modified +# with `localectl set-x11-keymap`. +# +# In the live installer environment, Anaconda relies on the localed +# D-Bus API to update the keyboard configuration. + +exec /usr/libexec/sway-systemd/locale1-xkb-config diff --git a/sway/config.live.d/99-xhost-allow-liveinst.conf b/sway/config.live.d/99-xhost-allow-liveinst.conf new file mode 100644 index 0000000..d08aca6 --- /dev/null +++ b/sway/config.live.d/99-xhost-allow-liveinst.conf @@ -0,0 +1,7 @@ +# Allow local root to connect to Xwayland. +# Anaconda runs elevated and will fail to start without that. + +# +# Requires: xhost + +exec xhost si:localuser:root diff --git a/sway/live/live-install-instructions.pango b/sway/live/live-install-instructions.pango new file mode 100644 index 0000000..c58dc54 --- /dev/null +++ b/sway/live/live-install-instructions.pango @@ -0,0 +1,5 @@ +Installation instructions: + +- Press `Win+d` +- Type `liveinst` and press enter to start installer +- Use Anaconda installer to install the system diff --git a/sway/live/live-install-style.css b/sway/live/live-install-style.css new file mode 100644 index 0000000..74b7d37 --- /dev/null +++ b/sway/live/live-install-style.css @@ -0,0 +1,18 @@ +window { + background-color: rgba (0, 0, 0, 0.0); +} + +#box-outer { + /* Define attributes of the box surrounding icons here */ + background-color: rgba (255, 255, 255, 0.0) +} + +#box-inner { + background-color: rgba (0, 0, 0, 0.8); + color: rgba (60, 110, 180, 1.0); + border-radius: 5px; + border-style: dotted; + border-width: 1px; + border-color: rgba (255, 255, 255, 0.7); + padding: 10px +} diff --git a/sway/start-sway b/sway/start-sway index fa039e7..a28c059 100755 --- a/sway/start-sway +++ b/sway/start-sway @@ -1,6 +1,7 @@ #!/bin/sh ## Internal variables +readonly _SWAY_COMMAND="/usr/bin/sway" SWAY_EXTRA_ARGS="" ## General exports @@ -10,16 +11,45 @@ export XDG_SESSION_TYPE=wayland ## Hardware compatibility # We can't be sure that the virtual GPU is compatible with Sway. -if systemd-detect-virt --quiet --vm; then - # https://github.com/swaywm/sway/issues/6581 - export WLR_NO_HARDWARE_CURSORS=1 - # Fallback to the pixman renderer as it has a higher chance to work - # and will be faster than llvmpipe anyways. - # See https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/2871 - export WLR_RENDERER=pixman -fi +# We should be attempting to detect an EGL driver instead, but that appears +# to be a bit more complicated. +case $(systemd-detect-virt --vm) in + "none"|"") + ;; + "kvm") + # There's two drivers we can get here, depending on the 3D acceleration + # flag state: either virtio_gpu/virgl or kms_swrast/llvmpipe. + # + # The former one causes graphical glitches in OpenGL apps when using + # 'pixman' renderer. The latter will crash 'gles2' renderer outright. + # Neither of those support 'vulkan'. + # + # The choice is obvious, at least until we learn to detect the driver + # instead of abusing the virtualization technology identifier. + # + # See also: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/2871 + export WLR_RENDERER=pixman + # 'pixman' on virtio_gpu with recent kernels is glitchy. Appears that + # it only affects atomic KMS, and legacy interface works. + export WLR_DRM_NO_ATOMIC=1 + # WLR_NO_HARDWARE_CURSORS=1 is not needed with legacy DRM interface + ;; + *) + # https://github.com/swaywm/sway/issues/6581 + export WLR_NO_HARDWARE_CURSORS=1 + ;; +esac -## Load system environment customizations +## Apply `environment.d(5)` customizations +# This can be used to share the custom environment configs with systemd --user. +# Importing `systemd --user show-environment` here may have unexpected +# consequences, such as getting a leftover `WAYLAND_DISPLAY` or `DISPLAY` +# and breaking Sway startup. Thus, the direct call to a systemd generator. +set -o allexport +eval "$(/usr/lib/systemd/user-environment-generators/30-systemd-environment-d-generator)" +set +o allexport + +## Load Sway-specific system environment customizations if [ -f /etc/sway/environment ]; then set -o allexport # shellcheck source=/dev/null @@ -27,7 +57,7 @@ if [ -f /etc/sway/environment ]; then set +o allexport fi -## Load user environment customizations +## Load Sway-specific user environment customizations if [ -f "${XDG_CONFIG_HOME:-$HOME/.config}/sway/environment" ]; then set -o allexport # shellcheck source=/dev/null @@ -40,6 +70,13 @@ fi _SWAY_EXTRA_ARGS="$SWAY_EXTRA_ARGS" unset SWAY_EXTRA_ARGS +## Log all exported WLR_ variables +if _WLR_VARS=$(env | grep '^WLR_'); then + printf 'environment variables for wlroots: %s' "$_WLR_VARS" | + tr '\n' ' ' | + systemd-cat -p notice -t "${_SWAY_COMMAND##*/}" +fi + # Start sway with extra arguments and send output to the journal # shellcheck disable=SC2086 # quoted expansion of EXTRA_ARGS can produce empty field -exec systemd-cat -- /usr/bin/sway $_SWAY_EXTRA_ARGS "$@" +exec systemd-cat -- $_SWAY_COMMAND $_SWAY_EXTRA_ARGS "$@" diff --git a/swaylock/config b/swaylock/config.in similarity index 84% rename from swaylock/config rename to swaylock/config.in index ec2afc7..607bcf2 100644 --- a/swaylock/config +++ b/swaylock/config.in @@ -3,5 +3,5 @@ # # Image path supports environment variables and shell expansions, # e.g. image=$HOME/Pictures/default.png -image=/usr/share/backgrounds/default.png +image=@BACKGROUND@ scaling=fill diff --git a/waybar/config b/waybar/config index ad76e93..daad8ab 100644 --- a/waybar/config +++ b/waybar/config @@ -12,6 +12,7 @@ // "sway/workspaces": { // "disable-scroll": true, // "all-outputs": true, + // "warp-on-scroll": false, // "format": "{name}: {icon}", // "format-icons": { // "1": "",