diff --git a/Makefile b/Makefile index ecb72d1..617e100 100644 --- a/Makefile +++ b/Makefile @@ -5,19 +5,16 @@ SYSCONFDIR ?= /etc BINDIR ?= $(PREFIX)/bin DATADIR ?= $(PREFIX)/share LIBEXECDIR ?= $(PREFIX)/libexec -BACKGROUND ?= $(DATADIR)/backgrounds/default.png .PHONY: build clean install check requires .DEFAULT: build -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 +GENERATED := $(patsubst %.in,%,$(wildcard sway/*.in sway/*/*.in )) +VARIABLES := PREFIX SYSCONFDIR DATADIR LIBEXECDIR -%: %.in - sed -e "$(foreach var,$(VARIABLES),s^@$(var)@^$($(var))^i;)" \ - -e '$(foreach var,$(VARIABLES),s^$$$(var)\b^$($(var))^i;)' \ - $^ > $@ +sway/%: sway/%.in + sed "$(foreach var,$(VARIABLES),s^@$(var)@^$($(var))^i;)" $^ > $@ + sed '$(foreach var,$(VARIABLES),s^$$$(var)\b^$($(var))^i;)' $^ > $@ build: $(GENERATED) @@ -25,14 +22,10 @@ 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 @@ -47,11 +40,7 @@ install-sway: build install-swaylock: install -D -m 0644 -pv -t $(DESTDIR)$(SYSCONFDIR)/swaylock swaylock/config -.PHONY: install-initialsetup install-sddm install-sway install-swaylock - -ifeq ($(WITH_INITIALSETUP),yes) -install: install-initialsetup -endif +.PHONY: install-sddm install-sway install-swaylock ifeq ($(WITH_SDDM),yes) install: install-sddm diff --git a/initial-setup/run-gui-backend b/initial-setup/run-gui-backend deleted file mode 100755 index 593e618..0000000 --- a/initial-setup/run-gui-backend +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/sh - -## Runs the GUI program from $@ in Sway - -CONFIG_FILE=$(mktemp --suffix="-wl-sway-firstboot-config") -RUN_SCRIPT=$(mktemp --suffix="-wl-sway-firstboot-run") -EXIT_CODE_SAVE=$(mktemp --suffix="-wl-sway-firstboot-exit") - -cat > ${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/sway-ipc-exec b/scripts/sway/sway-ipc-exec new file mode 100755 index 0000000..b628a18 --- /dev/null +++ b/scripts/sway/sway-ipc-exec @@ -0,0 +1,61 @@ +#!/usr/bin/python3 +""" +Pass the arguments to the `exec` i3 IPC command with proper escaping. +The script could be used as a replacement for `swaymsg exec --`. + +See also: https://github.com/swaywm/sway/issues/5931 +Usage: rofi -run-command "this-script {cmd}" +""" + +import json +import os +import socket +import struct +import sys + + +IPC_COMMAND = 0x0 +MAGIC = "i3-ipc".encode("utf-8") +# IPC message format: in native byte order +IPC_HEADER = f"={len(MAGIC)}sII" +IPC_HEADER_SIZE = struct.calcsize(IPC_HEADER) + +SWAYSOCK = os.environ.get("SWAYSOCK", os.environ.get("I3SOCK", None)) +TABLE = str.maketrans({c: "\\" + c for c in " $'\"\\(),;\t"}) + + +def quote(field: str): + return field.translate(TABLE) + + +def ipc_send(sock: socket.socket, msg: int, payload: str): + data = payload.encode("utf-8") + data = struct.pack(IPC_HEADER, MAGIC, len(data), msg) + data + + sock.sendall(data) + + data = sock.recv(IPC_HEADER_SIZE) + if len(data) != IPC_HEADER_SIZE: + return False + + magic, msg_len, msg_type = struct.unpack(IPC_HEADER, data) + if magic != MAGIC or msg_type != msg: + return False + + data = sock.recv(msg_len) + if len(data) != msg_len: + return False + + result = json.loads(data) + return result[0].get("success", False) + + +if SWAYSOCK is None: + sys.exit(1) + +with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + sock.connect(SWAYSOCK) + args = map(quote, sys.argv[1:]) + if not ipc_send(sock, IPC_COMMAND, "exec " + " ".join(args)): + sys.exit(1) + sock.shutdown(socket.SHUT_RDWR) diff --git a/sddm/03-sway-fedora/03-sway-fedora.jpg b/sddm/03-sway-fedora/03-sway-fedora.jpg deleted file mode 100644 index 5873105..0000000 Binary files a/sddm/03-sway-fedora/03-sway-fedora.jpg and /dev/null differ diff --git a/sddm/03-sway-fedora/LICENSE b/sddm/03-sway-fedora/LICENSE deleted file mode 100644 index 6b67935..0000000 --- a/sddm/03-sway-fedora/LICENSE +++ /dev/null @@ -1,337 +0,0 @@ -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 deleted file mode 100644 index 64e0231..0000000 --- a/sddm/03-sway-fedora/Main.qml +++ /dev/null @@ -1,284 +0,0 @@ -/*************************************************************************** -* 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 deleted file mode 100644 index 2ebbd7a..0000000 --- a/sddm/03-sway-fedora/README +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index 4e9aeb0..0000000 Binary files a/sddm/03-sway-fedora/angle-down.png and /dev/null differ diff --git a/sddm/03-sway-fedora/metadata.desktop b/sddm/03-sway-fedora/metadata.desktop deleted file mode 100644 index c9d5cf6..0000000 --- a/sddm/03-sway-fedora/metadata.desktop +++ /dev/null @@ -1,17 +0,0 @@ -[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 deleted file mode 100644 index 791b26c..0000000 Binary files a/sddm/03-sway-fedora/rectangle.png and /dev/null differ diff --git a/sddm/03-sway-fedora/theme.conf.in b/sddm/03-sway-fedora/theme.conf.in deleted file mode 100644 index 757799e..0000000 --- a/sddm/03-sway-fedora/theme.conf.in +++ /dev/null @@ -1,2 +0,0 @@ -[General] -background=@BACKGROUND@ diff --git a/sddm/sddm-compositor-sway b/sddm/sddm-compositor-sway index 409c2ac..d72c621 100755 --- a/sddm/sddm-compositor-sway +++ b/sddm/sddm-compositor-sway @@ -12,18 +12,9 @@ if [ -x /usr/bin/start-sway ]; then fi # Set some compatibility variables in case if sway-config-fedora is not present -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 +if systemd-detect-virt --quiet --vm; then + export WLR_NO_HARDWARE_CURSORS=1 + export WLR_RENDERER=pixman +fi exec /usr/bin/sway "$@" diff --git a/sddm/wayland-sway.conf b/sddm/wayland-sway.conf index 5db927e..a2dd9c3 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=03-sway-fedora +Current=02-lxqt-fedora [Wayland] CompositorCommand=/usr/libexec/sddm-compositor-sway diff --git a/sway-config-fedora.spec.rpkg b/sway-config-fedora.spec.rpkg index 35f5ce8..f8c903a 100644 --- a/sway-config-fedora.spec.rpkg +++ b/sway-config-fedora.spec.rpkg @@ -1,15 +1,12 @@ # vim: ft=spec -%bcond initialsetup %[0%{?fedora} >= 40 || 0%{?rhel} >= 10] -%bcond sddm 1 +%bcond_without sddm %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) }}} @@ -42,12 +39,9 @@ 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 -%if "%{bg_format}" == "jxl" -Requires: jxl-pixbuf-loader -%endif +Requires: light Requires: lxqt-policykit Requires: playerctl Requires: pulseaudio-utils @@ -59,35 +53,14 @@ 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: desktop-backgrounds-compat -%if "%{bg_format}" == "jxl" -Requires: kf6-kimageformats -%endif -Requires: sddm >= 0.20.0 +Requires: lxqt-themes-fedora +Requires: sddm >= 0.19.0^git20221123.3e48649 Requires: sway >= %{sway_ver} %description -n sddm-wayland-sway @@ -101,16 +74,11 @@ to use Sway for the greeter display server. %build -%make_build \ - PREFIX='%{_prefix}' \ - BACKGROUND='%{_datadir}/backgrounds/default.%{bg_format}' +%make_build %install -%make_install \ - PREFIX='%{_prefix}' \ - WITH_INITIALSETUP='%[%{with initialsetup}?"yes":"no"]' \ - WITH_SDDM='%[%{with sddm}?"yes":"no"]' +%make_install PREFIX='%{_prefix}' WITH_SDDM='%[%{with sddm}?"yes":"no"]' %files @@ -126,20 +94,12 @@ to use Sway for the greeter display server. %{_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 -%{_datadir}/sddm/themes/03-sway-fedora/ -%{_libexecdir}/sddm-compositor-sway %{_prefix}/lib/sddm/sddm.conf.d/wayland-sway.conf +%{_libexecdir}/sddm-compositor-sway %endif %changelog diff --git a/sway/config.d/60-bindings-brightness.conf b/sway/config.d/60-bindings-brightness.conf index 5c1e808..0e53ec2 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 `brightnessctl`. +# Key bindings for brightness control using `light`. # 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: brightnessctl >= 0.5.1-11 +# Requires: light # Recommends: libnotify set $brightness_notification_cmd command -v notify-send >/dev/null && \ - VALUE=$(brightnessctl --percentage get) && \ + VALUE=$(light) && VALUE=${VALUE%%.*} && \ notify-send -e -h string:x-canonical-private-synchronous:brightness \ -h "int:value:$VALUE" -t 800 "Brightness: ${VALUE}%" bindsym XF86MonBrightnessDown exec \ - 'STEP="$brightness_step" && brightnessctl -q set ${STEP:-5}%- && $brightness_notification_cmd' + 'STEP="$brightness_step" && light -U ${STEP:-5} && $brightness_notification_cmd' bindsym XF86MonBrightnessUp exec \ - 'STEP="$brightness_step" && brightnessctl -q set +${STEP:-5}% && $brightness_notification_cmd' + 'STEP="$brightness_step" && light -A ${STEP:-5} && $brightness_notification_cmd' diff --git a/sway/config.d/90-bar.conf b/sway/config.d/90-bar.conf index b22145c..0b2f71f 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.in b/sway/config.in index 53b8844..c320c4f 100644 --- a/sway/config.in +++ b/sway/config.in @@ -21,6 +21,8 @@ set $term foot # on the original workspace that the command was run on. # Recommends: rofi-wayland set $rofi_cmd rofi \ + -run-command '$LIBEXECDIR/sway/sway-ipc-exec {cmd}' \ + -run-shell-command '$LIBEXECDIR/sway/sway-ipc-exec {terminal} -e {cmd}' \ -terminal '$term' # Shows a combined list of the applications with desktop files and # executables from PATH. @@ -30,8 +32,8 @@ 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, jxl-pixbuf-loader -output * bg @BACKGROUND@ fill +# Requires: desktop-backgrounds-compat, swaybg +output * bg /usr/share/backgrounds/default.png fill # # Example configuration: # diff --git a/sway/config.live.d/90-swayidle.conf b/sway/config.live.d/90-swayidle.conf index c4ff459..c6d427a 100644 --- a/sway/config.live.d/90-swayidle.conf +++ b/sway/config.live.d/90-swayidle.conf @@ -12,4 +12,4 @@ exec LT="$lock_timeout" ST="$screen_timeout" LT=${LT:-300} ST=${ST:-60} && \ swayidle -w \ timeout $((LT + ST)) 'swaymsg "output * power off"' \ - resume 'swaymsg "output * power on"' + resume 'swaymsg "output * power on"' \ diff --git a/sway/config.live.d/99-system-keyboard-config.conf b/sway/config.live.d/99-system-keyboard-config.conf deleted file mode 100644 index c2c65eb..0000000 --- a/sway/config.live.d/99-system-keyboard-config.conf +++ /dev/null @@ -1,9 +0,0 @@ -# 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/start-sway b/sway/start-sway index a28c059..38300d2 100755 --- a/sway/start-sway +++ b/sway/start-sway @@ -1,7 +1,6 @@ #!/bin/sh ## Internal variables -readonly _SWAY_COMMAND="/usr/bin/sway" SWAY_EXTRA_ARGS="" ## General exports @@ -17,6 +16,8 @@ case $(systemd-detect-virt --vm) in "none"|"") ;; "kvm") + # https://github.com/swaywm/sway/issues/6581 + export WLR_NO_HARDWARE_CURSORS=1 # There's two drivers we can get here, depending on the 3D acceleration # flag state: either virtio_gpu/virgl or kms_swrast/llvmpipe. # @@ -29,10 +30,6 @@ case $(systemd-detect-virt --vm) in # # 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 @@ -40,16 +37,7 @@ case $(systemd-detect-virt --vm) in ;; esac -## 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 +## Load system environment customizations if [ -f /etc/sway/environment ]; then set -o allexport # shellcheck source=/dev/null @@ -57,7 +45,7 @@ if [ -f /etc/sway/environment ]; then set +o allexport fi -## Load Sway-specific user environment customizations +## Load user environment customizations if [ -f "${XDG_CONFIG_HOME:-$HOME/.config}/sway/environment" ]; then set -o allexport # shellcheck source=/dev/null @@ -70,13 +58,6 @@ 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 -- $_SWAY_COMMAND $_SWAY_EXTRA_ARGS "$@" +exec systemd-cat -- /usr/bin/sway $_SWAY_EXTRA_ARGS "$@" diff --git a/swaylock/config.in b/swaylock/config similarity index 84% rename from swaylock/config.in rename to swaylock/config index 607bcf2..ec2afc7 100644 --- a/swaylock/config.in +++ b/swaylock/config @@ -3,5 +3,5 @@ # # Image path supports environment variables and shell expansions, # e.g. image=$HOME/Pictures/default.png -image=@BACKGROUND@ +image=/usr/share/backgrounds/default.png scaling=fill diff --git a/tests/run-test-exec b/tests/run-test-exec new file mode 100755 index 0000000..bafd694 --- /dev/null +++ b/tests/run-test-exec @@ -0,0 +1,15 @@ +#!/bin/sh +# Entrypoint for exec wrapper tests + +DIRNAME=$(realpath "$0") +DIRNAME=$(dirname "$DIRNAME") +DIRNAME=$(dirname "$DIRNAME") + +for WRAPPER in "" "$DIRNAME/scripts/sway/sway-ipc-exec"; do + $WRAPPER "$DIRNAME/tests/test helper" --lor\'em \ + 'ipsum $dolor sit" amet;' \ + "consectetur adipiscing\' elit," \ + "(sed do eiusmod tempor) [incididunt ut labore]" \ + et\ dolore\ magna\[\ aliqua. +done +echo "Check the second test result in Sway output (journal or stdout)" diff --git a/tests/test helper b/tests/test helper new file mode 100755 index 0000000..04953ee --- /dev/null +++ b/tests/test helper @@ -0,0 +1,24 @@ +#!/usr/bin/python3 + +import sys + +TEST = [ + "--lor'em", + 'ipsum $dolor sit" amet;', + "consectetur\tadipiscing\\' elit,", + "(sed do eiusmod tempor) [incididunt ut labore]", + "et dolore magna[ aliqua.", +] + +status = "passed" + +if len(sys.argv) != len(TEST) + 1: + status = "failed" + +for left, right in zip(sys.argv[1:], TEST): + if left != right: + print(f"'{left}' != '{right}'") + status = "failed" + +print(f"Test status: {status}") +sys.exit(0 if status == "passed" else 1) diff --git a/waybar/config b/waybar/config index daad8ab..ad76e93 100644 --- a/waybar/config +++ b/waybar/config @@ -12,7 +12,6 @@ // "sway/workspaces": { // "disable-scroll": true, // "all-outputs": true, - // "warp-on-scroll": false, // "format": "{name}: {icon}", // "format-icons": { // "1": "",