diff --git a/README.md b/README.md new file mode 100644 index 0000000..21c8937 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# dotfiles + +This repository contains dotfiles for two separate systems. Based on the hostname the appropriate configuration is applied. (When no hostname matches, nix is not buildable and yolk uses a minimal shared configurations). + +**Hostnames** +- nixMain (Hyprland, desktop optimised) +- nixLap (KDE, 2-in-1 Notebook optimised) + +Deployment: +*assuming a valid hostname is used* +1. Clone the Repository +2. Build the system: `bash use_nix.sh --first-run --rebuild` +3. Setup user config: `yolk sync -v` + +### Notes: + +Used as kde config finder, in `~./config` and `~./local/share`: +- `find . -type f -regex '.*\(k\|rc\|pulse\|session\|gtk\|autostart\|xbel\).*'` + diff --git a/eggs/dconf/user b/eggs/dconf/user deleted file mode 100644 index f31a682..0000000 Binary files a/eggs/dconf/user and /dev/null differ diff --git a/eggs/dconfNixMain/user b/eggs/dconfNixMain/user new file mode 100644 index 0000000..82ff4ba Binary files /dev/null and b/eggs/dconfNixMain/user differ diff --git a/eggs/git/.gitconfig b/eggs/git/.gitconfig new file mode 100644 index 0000000..08cf837 --- /dev/null +++ b/eggs/git/.gitconfig @@ -0,0 +1,3 @@ +[user] + name = Kyattsukuro + email = nikl.free44@gmail.com diff --git a/eggs/kde_config/autostart/Nextcloud.desktop b/eggs/kde_config/autostart/Nextcloud.desktop new file mode 100644 index 0000000..9373d00 --- /dev/null +++ b/eggs/kde_config/autostart/Nextcloud.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Name=Nextcloud +GenericName=File Synchronizer +Exec=nextcloud --background +Terminal=false +Icon=Nextcloud +Categories=Network +Type=Application +StartupNotify=false +X-GNOME-Autostart-enabled=true +X-GNOME-Autostart-Delay=10 diff --git a/eggs/kde_config/kactivitymanagerd-switcher b/eggs/kde_config/kactivitymanagerd-switcher new file mode 100644 index 0000000..e69de29 diff --git a/eggs/kde_config/kde.org/UserFeedback.org.kde.discover.conf b/eggs/kde_config/kde.org/UserFeedback.org.kde.discover.conf new file mode 100644 index 0000000..7311063 --- /dev/null +++ b/eggs/kde_config/kde.org/UserFeedback.org.kde.discover.conf @@ -0,0 +1,31 @@ +[Source-applicationSourceName] +dataSourceCommonSettings\activeState=true + +[Source-applicationVersion] +dataSourceCommonSettings\activeState=true + +[Source-locale] +dataSourceCommonSettings\activeState=true + +[Source-opengl] +dataSourceCommonSettings\activeState=true + +[Source-platform] +dataSourceCommonSettings\activeState=true + +[Source-qtVersion] +dataSourceCommonSettings\activeState=true + +[Source-screens] +dataSourceCommonSettings\activeState=true + +[Source-startCount] +dataSourceCommonSettings\activeState=true + +[Source-usageTime] +dataSourceCommonSettings\activeState=true + +[UserFeedback] +ApplicationStartCount=61 +ApplicationTime=53384 +LastEncouragement=@DateTime(\0\0\0\x10\0\0\0\0\0\0%\x8c\x93\x4\xe2\b\xba\0) diff --git a/eggs/kde_config/kde.org/UserFeedback.org.kde.dolphin.conf b/eggs/kde_config/kde.org/UserFeedback.org.kde.dolphin.conf new file mode 100644 index 0000000..97cb9da --- /dev/null +++ b/eggs/kde_config/kde.org/UserFeedback.org.kde.dolphin.conf @@ -0,0 +1,30 @@ +[Source-applicationVersion] +dataSourceCommonSettings\activeState=true + +[Source-locale] +dataSourceCommonSettings\activeState=true + +[Source-places] +dataSourceCommonSettings\activeState=true + +[Source-platform] +dataSourceCommonSettings\activeState=true + +[Source-qtVersion] +dataSourceCommonSettings\activeState=true + +[Source-screens] +dataSourceCommonSettings\activeState=true + +[Source-settings] +dataSourceCommonSettings\activeState=true + +[Source-startCount] +dataSourceCommonSettings\activeState=true + +[Source-usageTime] +dataSourceCommonSettings\activeState=true + +[UserFeedback] +ApplicationStartCount=289 +ApplicationTime=761794 diff --git a/eggs/kde_config/kde.org/UserFeedback.org.kde.kate.conf b/eggs/kde_config/kde.org/UserFeedback.org.kde.kate.conf new file mode 100644 index 0000000..5aef55a --- /dev/null +++ b/eggs/kde_config/kde.org/UserFeedback.org.kde.kate.conf @@ -0,0 +1,21 @@ +[Source-applicationVersion] +dataSourceCommonSettings\activeState=true + +[Source-platform] +dataSourceCommonSettings\activeState=true + +[Source-qtVersion] +dataSourceCommonSettings\activeState=true + +[Source-screens] +dataSourceCommonSettings\activeState=true + +[Source-startCount] +dataSourceCommonSettings\activeState=true + +[Source-usageTime] +dataSourceCommonSettings\activeState=true + +[UserFeedback] +ApplicationStartCount=1 +ApplicationTime=13 diff --git a/eggs/kde_config/kde.org/UserFeedback.org.kde.kwrite.conf b/eggs/kde_config/kde.org/UserFeedback.org.kde.kwrite.conf new file mode 100644 index 0000000..eaea20d --- /dev/null +++ b/eggs/kde_config/kde.org/UserFeedback.org.kde.kwrite.conf @@ -0,0 +1,21 @@ +[Source-applicationVersion] +dataSourceCommonSettings\activeState=true + +[Source-platform] +dataSourceCommonSettings\activeState=true + +[Source-qtVersion] +dataSourceCommonSettings\activeState=true + +[Source-screens] +dataSourceCommonSettings\activeState=true + +[Source-startCount] +dataSourceCommonSettings\activeState=true + +[Source-usageTime] +dataSourceCommonSettings\activeState=true + +[UserFeedback] +ApplicationStartCount=59 +ApplicationTime=54302 diff --git a/eggs/kde_config/kde.org/UserFeedback.org.kde.plasmashell.conf b/eggs/kde_config/kde.org/UserFeedback.org.kde.plasmashell.conf new file mode 100644 index 0000000..899d919 --- /dev/null +++ b/eggs/kde_config/kde.org/UserFeedback.org.kde.plasmashell.conf @@ -0,0 +1,31 @@ +[Source-applicationVersion] +dataSourceCommonSettings\activeState=true + +[Source-compiler] +dataSourceCommonSettings\activeState=true + +[Source-opengl] +dataSourceCommonSettings\activeState=true + +[Source-panelCount] +dataSourceCommonSettings\activeState=true + +[Source-platform] +dataSourceCommonSettings\activeState=true + +[Source-qpa] +dataSourceCommonSettings\activeState=true + +[Source-qtVersion] +dataSourceCommonSettings\activeState=true + +[Source-screens] +dataSourceCommonSettings\activeState=true + +[Source-usageTime] +dataSourceCommonSettings\activeState=true + +[UserFeedback] +ApplicationStartCount=187 +ApplicationTime=2035925 +LastEncouragement=@DateTime(\0\0\0\x10\0\0\0\0\0\0%\x8c\x9b\0tW\x8a\0) diff --git a/eggs/kde_config/kde.org/UserFeedback.org.kde.systemsettings.conf b/eggs/kde_config/kde.org/UserFeedback.org.kde.systemsettings.conf new file mode 100644 index 0000000..e536f93 --- /dev/null +++ b/eggs/kde_config/kde.org/UserFeedback.org.kde.systemsettings.conf @@ -0,0 +1,2 @@ +[UserFeedback] +ApplicationStartCount=2 diff --git a/eggs/kde_config/kdeconnect/certificate.pem b/eggs/kde_config/kdeconnect/certificate.pem new file mode 100644 index 0000000..19b3806 --- /dev/null +++ b/eggs/kde_config/kdeconnect/certificate.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBqzCCAVGgAwIBAgIVAP/nrFkwDSQ+FpsVDDi+GFt48IvqMAoGCCqGSM49BAME +MFUxLzAtBgNVBAMMJl9mZTg5ZjhhMl80ZWQ2XzRiNThfYTU1NV84NGQ5OTAyMTUx +MTdfMQwwCgYDVQQKDANLREUxFDASBgNVBAsMC0tERSBDb25uZWN0MB4XDTI0MDMy +MDE3NDMwMloXDTM0MTIwOTE3NDMwMlowVTEvMC0GA1UEAwwmX2ZlODlmOGEyXzRl +ZDZfNGI1OF9hNTU1Xzg0ZDk5MDIxNTExN18xDDAKBgNVBAoMA0tERTEUMBIGA1UE +CwwLS0RFIENvbm5lY3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQ3VpD2iYzO +zgMU2R1pWbfAiK5lmpYZMFk1EN7ZUqPvbOPWjTqG+ux+87Zzu3XQeFbZEWCfL2EZ +pi446pp3CfXTMAoGCCqGSM49BAMEA0gAMEUCIDkGFUFjc+8m7VMDEJB5HHQDi7i8 +PaTMBSDP86Su/GCAAiEAr8wHtm08hHafTCLtJnIBXma9J9PIPFMRweqDlDHovQw= +-----END CERTIFICATE----- diff --git a/eggs/kde_config/kdeconnect/config b/eggs/kde_config/kdeconnect/config new file mode 100644 index 0000000..a3c7dc7 --- /dev/null +++ b/eggs/kde_config/kdeconnect/config @@ -0,0 +1,3 @@ +[General] +keyAlgorithm=EC +name=kinoiteLap diff --git a/eggs/kde_config/kdeconnect/privateKey.pem b/eggs/kde_config/kdeconnect/privateKey.pem new file mode 100644 index 0000000..61c6088 --- /dev/null +++ b/eggs/kde_config/kdeconnect/privateKey.pem @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEID3sKDIccwZks0gS/XtjLH13LSUV+SRPQr+R3W86y1jaoAoGCCqGSM49 +AwEHoUQDQgAEN1aQ9omMzs4DFNkdaVm3wIiuZZqWGTBZNRDe2VKj72zj1o06hvrs +fvO2c7t10HhW2RFgny9hGaYuOOqadwn10w== +-----END EC PRIVATE KEY----- diff --git a/eggs/kde_config/kdedefaults/kdeglobals b/eggs/kde_config/kdedefaults/kdeglobals new file mode 100644 index 0000000..744b2d6 --- /dev/null +++ b/eggs/kde_config/kdedefaults/kdeglobals @@ -0,0 +1,8 @@ +[General] +ColorScheme=CatppuccinFrappeBlue + +[Icons] +Theme=breeze-dark + +[KDE] +widgetStyle=Breeze diff --git a/eggs/kde_config/kdedefaults/package b/eggs/kde_config/kdedefaults/package new file mode 100644 index 0000000..b5d54c5 --- /dev/null +++ b/eggs/kde_config/kdedefaults/package @@ -0,0 +1 @@ +Catppuccin-Frappe-Blue \ No newline at end of file diff --git a/eggs/kde_config/kdeglobals b/eggs/kde_config/kdeglobals new file mode 100644 index 0000000..0b76868 --- /dev/null +++ b/eggs/kde_config/kdeglobals @@ -0,0 +1,163 @@ +[ColorEffects:Disabled] +ChangeSelectionColor= +Color=48, 52, 70 +ColorAmount=0.30000000000000004 +ColorEffect=2 +ContrastAmount=0.1 +ContrastEffect=0 +Enable= +IntensityAmount=-1 +IntensityEffect=0 + +[ColorEffects:Inactive] +ChangeSelectionColor=true +Color=48, 52, 70 +ColorAmount=0.5 +ColorEffect=3 +ContrastAmount=0 +ContrastEffect=0 +Enable=true +IntensityAmount=0 +IntensityEffect=0 + +[Colors:Button] +BackgroundAlternate=140,170,238 +BackgroundNormal=65, 69, 89 +DecorationFocus=140,170,238 +DecorationHover=65, 69, 89 +ForegroundActive=239, 159, 118 +ForegroundInactive=165, 173, 206 +ForegroundLink=140,170,238 +ForegroundNegative=231, 130, 132 +ForegroundNeutral=229, 200, 144 +ForegroundNormal=198, 208, 245 +ForegroundPositive=166, 209, 137 +ForegroundVisited=202, 158, 230 + +[Colors:Complementary] +BackgroundAlternate=35, 38, 52 +BackgroundNormal=41, 44, 60 +DecorationFocus=140,170,238 +DecorationHover=65, 69, 89 +ForegroundActive=239, 159, 118 +ForegroundInactive=165, 173, 206 +ForegroundLink=140,170,238 +ForegroundNegative=231, 130, 132 +ForegroundNeutral=229, 200, 144 +ForegroundNormal=198, 208, 245 +ForegroundPositive=166, 209, 137 +ForegroundVisited=202, 158, 230 + +[Colors:Header] +BackgroundAlternate=35, 38, 52 +BackgroundNormal=41, 44, 60 +DecorationFocus=140,170,238 +DecorationHover=65, 69, 89 +ForegroundActive=239, 159, 118 +ForegroundInactive=165, 173, 206 +ForegroundLink=140,170,238 +ForegroundNegative=231, 130, 132 +ForegroundNeutral=229, 200, 144 +ForegroundNormal=198, 208, 245 +ForegroundPositive=166, 209, 137 +ForegroundVisited=202, 158, 230 + +[Colors:Selection] +BackgroundAlternate=140,170,238 +BackgroundNormal=140,170,238 +DecorationFocus=140,170,238 +DecorationHover=65, 69, 89 +ForegroundActive=239, 159, 118 +ForegroundInactive=41, 44, 60 +ForegroundLink=140,170,238 +ForegroundNegative=231, 130, 132 +ForegroundNeutral=229, 200, 144 +ForegroundNormal=35, 38, 52 +ForegroundPositive=166, 209, 137 +ForegroundVisited=202, 158, 230 + +[Colors:Tooltip] +BackgroundAlternate=27,25,35 +BackgroundNormal=48, 52, 70 +DecorationFocus=140,170,238 +DecorationHover=65, 69, 89 +ForegroundActive=239, 159, 118 +ForegroundInactive=165, 173, 206 +ForegroundLink=140,170,238 +ForegroundNegative=231, 130, 132 +ForegroundNeutral=229, 200, 144 +ForegroundNormal=198, 208, 245 +ForegroundPositive=166, 209, 137 +ForegroundVisited=202, 158, 230 + +[Colors:View] +BackgroundAlternate=41, 44, 60 +BackgroundNormal=48, 52, 70 +DecorationFocus=140,170,238 +DecorationHover=65, 69, 89 +ForegroundActive=239, 159, 118 +ForegroundInactive=165, 173, 206 +ForegroundLink=140,170,238 +ForegroundNegative=231, 130, 132 +ForegroundNeutral=229, 200, 144 +ForegroundNormal=198, 208, 245 +ForegroundPositive=166, 209, 137 +ForegroundVisited=202, 158, 230 + +[Colors:Window] +BackgroundAlternate=35, 38, 52 +BackgroundNormal=41, 44, 60 +DecorationFocus=140,170,238 +DecorationHover=65, 69, 89 +ForegroundActive=239, 159, 118 +ForegroundInactive=165, 173, 206 +ForegroundLink=140,170,238 +ForegroundNegative=231, 130, 132 +ForegroundNeutral=229, 200, 144 +ForegroundNormal=198, 208, 245 +ForegroundPositive=166, 209, 137 +ForegroundVisited=202, 158, 230 + +[DirSelect Dialog] +DirSelectDialog Size=727,480 +History Items[$e]=file:$HOME/.config/yolk/,file:$HOME/.con,file:$HOME/Code/wir_calc,file:$HOME/Documents/ISO,file:$HOME/Code/triangle_inf,file:///var/home/someone/Code/bulk_rename,file:///var/home/someone/Nextcloud/Office/DieLinke/solid/orga,file:///var/home/someone/Nextcloud/Office/Schule/TiP/rnote,file:///var/home/someone/Documents/ISO,file:$HOME/Code/webwatcher,file:$HOME/Code/watch_construction,file:$HOME/Code/pico_rgb,file:$HOME/Code/bulk_rename,file:$HOME/Code/sort_visualizer,file:///var/home/someone/Nextcloud/Office/Schule/InfT/rnote,file:///var/home/someone/Nextcloud/Office/Schule/p5,file:$HOME/Pictures/ScreenshotLap,file:$HOME/Code/webwatcher,file:$HOME/Code/group_builder,file:///var/home/someone/Nextcloud/Office/Schule/Wir/rnote,file:///var/home/someone/Nextcloud/Office/Schule/Inf/rnote,file:///var/home/someone/Nextcloud/Office/Schule/Pol/rnote,file:///var/home/someone/Nextcloud/Office/Schule/Eng/rnote,file:///var/home/someone/Nextcloud/Office/Schule/Phy/rnote,file:$HOME/Nextcloud/Office/Schule/Kun/rnote,file:$HOME/Nextcloud/Office/Schule/Deu/rnote,file:$HOME/Nextcloud/Office/Schule/Mat/rnote,file:$HOME/Nextcloud/Office/Schule/Mat/rnote,file:$HOME/Nextcloud/Office/Schule/Deu/rnote,file:$HOME/Nextcloud/Office/Schule/anderes,file:$HOME/Nextcloud/Office/Schule/Deu/rnote,file:$HOME/Nextcloud/Office/Schule/p5/rnote,file:$HOME/Nextcloud/Shared,file:$HOME/Code/bmi,file:$HOME/Code/rotating_display,file:$HOME/Code/tkinter,file:$HOME/Nextcloud/Office/Schule/Inf/wx_pp/py,file:$HOME/Nextcloud/Office/Schule/Inf/wx_pp,file:$HOME/Nextcloud/Office/Schule/Inf/wx_pp/py,file:$HOME/Code/tkinter,file:$HOME/Code/test_py,file:$HOME/Code/gtk_stf,file:$HOME/Code/test_py,file:$HOME/Code/text_plotter,file:$HOME/Code/geb_db,file:$HOME/Code/alt_geb_db,file:$HOME/Nextcloud/Office/Schule/Inf/ten_days_of_py,file:$HOME/Nextcloud/Office/Schule/TiP/rnote,file:$HOME/Nextcloud/Office/Schule/DQI22-12/Phy/rnote,file:$HOME/Nextcloud/Office/Schule/Kun/rnote +Splitter State=\x00\x00\x00\xff\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x8c\x00\x00\x02\xa8\x00\xff\xff\xff\xff\x01\x00\x00\x00\x01\x00 + +[General] +ColorSchemeHash=d9b3f338b5f1fd4e3389cb52a430776ddde2db0c + +[KDE] +LookAndFeelPackage=Catppuccin-Frappe-Blue +ShowDeleteCommand=false + +[KFileDialog Settings] +Allow Expansion=false +Automatically select filename extension=true +Breadcrumb Navigation=false +Decoration position=2 +LocationCombo Completionmode=5 +PathCombo Completionmode=5 +Show Bookmarks=false +Show Full Path=false +Show Inline Previews=true +Show Preview=false +Show Speedbar=true +Show hidden files=true +Sort by=Date +Sort directories first=true +Sort hidden files last=false +Sort reversed=true +Speedbar Width=140 +View Style=DetailTree + +[PreviewSettings] +EnableRemoteFolderThumbnail=false +MaximumRemoteSize=0 + +[WM] +activeBackground=48,52,70 +activeBlend=198,208,245 +activeForeground=198,208,245 +inactiveBackground=35,38,52 +inactiveBlend=165,173,206 +inactiveForeground=165,173,206 diff --git a/eggs/kde_config/knfsshare b/eggs/kde_config/knfsshare new file mode 100644 index 0000000..8d95f3c --- /dev/null +++ b/eggs/kde_config/knfsshare @@ -0,0 +1,2 @@ +[General] +exportsFile=/etc/exports diff --git a/eggs/kde_config/konsolesshconfig b/eggs/kde_config/konsolesshconfig new file mode 100644 index 0000000..7078b6f --- /dev/null +++ b/eggs/kde_config/konsolesshconfig @@ -0,0 +1,22 @@ +[Global plugin config] +manageProfile=false + +[SSH Config][docker-local] +hostname=localhost +identifier=docker-local +importedFromSshConfig=true +port=22 +profileName= +sshkey= +useSshConfig=true +username=root + +[SSH Config][git.urmel.duckdns.org] +hostname=git.urmel.duckdns.org +identifier=git.urmel.duckdns.org +importedFromSshConfig=true +port= +profileName= +sshkey=~/.ssh/gitea-urmel +useSshConfig=true +username=git diff --git a/eggs/kde_config/krecentconnections b/eggs/kde_config/krecentconnections new file mode 100644 index 0000000..8ceb60c --- /dev/null +++ b/eggs/kde_config/krecentconnections @@ -0,0 +1,6 @@ +[General] +Index=someone + +[someone] +Type=SMB +URL=smb://192.168.2.214/dataSomeone diff --git a/eggs/kde_config/kwinoutputconfig.json b/eggs/kde_config/kwinoutputconfig.json new file mode 100644 index 0000000..7697f8d --- /dev/null +++ b/eggs/kde_config/kwinoutputconfig.json @@ -0,0 +1,394 @@ +[ + { + "data": [ + { + "autoRotation": "InTabletMode", + "brightness": 0.25, + "colorProfileSource": "sRGB", + "connectorName": "eDP-1", + "edidHash": "a357420b7993c0ea3dad3a74b5eceabb", + "edidIdentifier": "BOE 2139 0 50 2018 0", + "highDynamicRange": false, + "iccProfilePath": "", + "mode": { + "height": 1080, + "refreshRate": 60000, + "width": 1920 + }, + "overscan": 0, + "rgbRange": "Automatic", + "scale": 1.25, + "sdrBrightness": 200, + "sdrGamutWideness": 0, + "transform": "Normal", + "vrrPolicy": "Automatic", + "wideColorGamut": false + }, + { + "allowSdrSoftwareBrightness": true, + "autoRotation": "InTabletMode", + "brightness": 0.9, + "colorPowerTradeoff": "PreferEfficiency", + "colorProfileSource": "sRGB", + "connectorName": "HDMI-A-1", + "edidHash": "f6e74d9128f0e609350a2ce0e43315ff", + "edidIdentifier": "ACR 5429 1094716227 14 2014 0", + "highDynamicRange": false, + "iccProfilePath": "", + "mode": { + "height": 1080, + "refreshRate": 50000, + "width": 1920 + }, + "overscan": 0, + "rgbRange": "Automatic", + "scale": 1.25, + "sdrBrightness": 200, + "sdrGamutWideness": 0, + "transform": "Normal", + "vrrPolicy": "Automatic", + "wideColorGamut": false + }, + { + "autoRotation": "InTabletMode", + "colorProfileSource": "sRGB", + "connectorName": "HDMI-A-1", + "edidHash": "aa2d8e3898d1f630be5f772bd8d28642", + "edidIdentifier": "GSM 30454 114239 12 2016 0", + "highDynamicRange": false, + "iccProfilePath": "", + "mode": { + "height": 1440, + "refreshRate": 59973, + "width": 3440 + }, + "overscan": 0, + "rgbRange": "Automatic", + "scale": 1, + "sdrBrightness": 200, + "sdrGamutWideness": 0, + "transform": "Normal", + "vrrPolicy": "Automatic", + "wideColorGamut": false + }, + { + "autoRotation": "InTabletMode", + "colorProfileSource": "sRGB", + "connectorName": "HDMI-A-1", + "edidHash": "b997ff6068eca8259f10bb2d45af9b67", + "edidIdentifier": "SAN 48721 16843009 0 2009 0", + "highDynamicRange": false, + "iccProfilePath": "", + "mode": { + "height": 768, + "refreshRate": 60004, + "width": 1024 + }, + "overscan": 0, + "rgbRange": "Automatic", + "scale": 1, + "sdrBrightness": 200, + "sdrGamutWideness": 0, + "transform": "Normal", + "vrrPolicy": "Automatic", + "wideColorGamut": false + }, + { + "allowSdrSoftwareBrightness": false, + "autoRotation": "InTabletMode", + "brightness": 0.7, + "colorPowerTradeoff": "PreferEfficiency", + "colorProfileSource": "sRGB", + "connectorName": "eDP-1", + "edidHash": "9d47fe3d0d81dc3ae00798e2d2896606", + "edidIdentifier": "AUO 52140 0 27 2023 0", + "highDynamicRange": false, + "iccProfilePath": "", + "mode": { + "height": 1600, + "refreshRate": 90001, + "width": 2560 + }, + "overscan": 0, + "rgbRange": "Automatic", + "scale": 1.5, + "sdrBrightness": 200, + "sdrGamutWideness": 0, + "transform": "Normal", + "vrrPolicy": "Automatic", + "wideColorGamut": false + }, + { + "allowSdrSoftwareBrightness": true, + "autoRotation": "InTabletMode", + "brightness": 1, + "colorPowerTradeoff": "PreferEfficiency", + "colorProfileSource": "sRGB", + "connectorName": "HDMI-A-1", + "edidHash": "10089410fdf44861716ff0e8293b3768", + "edidIdentifier": "IFS 58 1174 13 2016 0", + "highDynamicRange": false, + "iccProfilePath": "", + "mode": { + "height": 1080, + "refreshRate": 60000, + "width": 1920 + }, + "overscan": 0, + "rgbRange": "Automatic", + "scale": 1, + "sdrBrightness": 200, + "sdrGamutWideness": 0, + "transform": "Normal", + "vrrPolicy": "Automatic", + "wideColorGamut": false + } + ], + "name": "outputs" + }, + { + "data": [ + { + "lidClosed": false, + "outputs": [ + { + "enabled": true, + "outputIndex": 0, + "position": { + "x": 0, + "y": 0 + }, + "priority": 0 + } + ] + }, + { + "lidClosed": true, + "outputs": [ + { + "enabled": true, + "outputIndex": 0, + "position": { + "x": 0, + "y": 0 + }, + "priority": 0 + } + ] + }, + { + "lidClosed": false, + "outputs": [ + { + "enabled": true, + "outputIndex": 0, + "position": { + "x": 1536, + "y": 0 + }, + "priority": 0 + }, + { + "enabled": true, + "outputIndex": 1, + "position": { + "x": 0, + "y": 0 + }, + "priority": 1 + } + ] + }, + { + "lidClosed": false, + "outputs": [ + { + "enabled": true, + "outputIndex": 0, + "position": { + "x": 3440, + "y": 0 + }, + "priority": 0 + }, + { + "enabled": true, + "outputIndex": 2, + "position": { + "x": 0, + "y": 0 + }, + "priority": 1 + } + ] + }, + { + "lidClosed": false, + "outputs": [ + { + "enabled": true, + "outputIndex": 0, + "position": { + "x": 0, + "y": 0 + }, + "priority": 0 + }, + { + "enabled": true, + "outputIndex": 3, + "position": { + "x": 1920, + "y": 48 + }, + "priority": 1 + } + ] + }, + { + "lidClosed": true, + "outputs": [ + { + "enabled": false, + "outputIndex": 0, + "position": { + "x": 0, + "y": 0 + }, + "priority": -1 + }, + { + "enabled": true, + "outputIndex": 3, + "position": { + "x": 1920, + "y": 48 + }, + "priority": 0 + } + ] + }, + { + "lidClosed": false, + "outputs": [ + { + "enabled": true, + "outputIndex": 4, + "position": { + "x": 0, + "y": 0 + }, + "priority": 0 + } + ] + }, + { + "lidClosed": true, + "outputs": [ + { + "enabled": true, + "outputIndex": 4, + "position": { + "x": 0, + "y": 0 + }, + "priority": 0 + } + ] + }, + { + "lidClosed": false, + "outputs": [ + { + "enabled": true, + "outputIndex": 4, + "position": { + "x": 0, + "y": 0 + }, + "priority": 0 + }, + { + "enabled": true, + "outputIndex": 1, + "position": { + "x": 1707, + "y": 101 + }, + "priority": 1 + } + ] + }, + { + "lidClosed": false, + "outputs": [ + { + "enabled": true, + "outputIndex": 4, + "position": { + "x": 1920, + "y": 0 + }, + "priority": 0 + }, + { + "enabled": true, + "outputIndex": 5, + "position": { + "x": 0, + "y": 0 + }, + "priority": 1 + } + ] + }, + { + "lidClosed": true, + "outputs": [ + { + "enabled": false, + "outputIndex": 4, + "position": { + "x": 1920, + "y": 0 + }, + "priority": -1 + }, + { + "enabled": true, + "outputIndex": 5, + "position": { + "x": 0, + "y": 0 + }, + "priority": 0 + } + ] + }, + { + "lidClosed": true, + "outputs": [ + { + "enabled": false, + "outputIndex": 4, + "position": { + "x": 0, + "y": 0 + }, + "priority": -1 + }, + { + "enabled": true, + "outputIndex": 1, + "position": { + "x": 0, + "y": 0 + }, + "priority": 0 + } + ] + } + ], + "name": "setups" + } +] diff --git a/eggs/kde_locals/ark/ark_recentfiles b/eggs/kde_locals/ark/ark_recentfiles new file mode 100644 index 0000000..a76a9c5 --- /dev/null +++ b/eggs/kde_locals/ark/ark_recentfiles @@ -0,0 +1,2 @@ +[RecentFiles] +files\size=0 diff --git a/eggs/kde_locals/dbus-1/services/ca.desrt.dconf.service b/eggs/kde_locals/dbus-1/services/ca.desrt.dconf.service new file mode 120000 index 0000000..a26386d --- /dev/null +++ b/eggs/kde_locals/dbus-1/services/ca.desrt.dconf.service @@ -0,0 +1 @@ +/nix/store/25yz8fy75jxk2bz0vjfyn9zrghgb4fp9-home-manager-files/.local/share/dbus-1/services/ca.desrt.dconf.service \ No newline at end of file diff --git a/eggs/kde_locals/kactivitymanagerd/resources/database b/eggs/kde_locals/kactivitymanagerd/resources/database new file mode 100644 index 0000000..8131808 Binary files /dev/null and b/eggs/kde_locals/kactivitymanagerd/resources/database differ diff --git a/eggs/kde_locals/kactivitymanagerd/resources/database-shm b/eggs/kde_locals/kactivitymanagerd/resources/database-shm new file mode 100644 index 0000000..dbc8a88 Binary files /dev/null and b/eggs/kde_locals/kactivitymanagerd/resources/database-shm differ diff --git a/eggs/kde_locals/kactivitymanagerd/resources/database-wal b/eggs/kde_locals/kactivitymanagerd/resources/database-wal new file mode 100644 index 0000000..3e2ff53 Binary files /dev/null and b/eggs/kde_locals/kactivitymanagerd/resources/database-wal differ diff --git a/eggs/kde_locals/kactivitymanagerd/resources/test-backup/database b/eggs/kde_locals/kactivitymanagerd/resources/test-backup/database new file mode 100644 index 0000000..8131808 Binary files /dev/null and b/eggs/kde_locals/kactivitymanagerd/resources/test-backup/database differ diff --git a/eggs/kde_locals/kactivitymanagerd/resources/test-backup/database-shm b/eggs/kde_locals/kactivitymanagerd/resources/test-backup/database-shm new file mode 100644 index 0000000..da51122 Binary files /dev/null and b/eggs/kde_locals/kactivitymanagerd/resources/test-backup/database-shm differ diff --git a/eggs/kde_locals/kactivitymanagerd/resources/test-backup/database-wal b/eggs/kde_locals/kactivitymanagerd/resources/test-backup/database-wal new file mode 100644 index 0000000..8a814d0 Binary files /dev/null and b/eggs/kde_locals/kactivitymanagerd/resources/test-backup/database-wal differ diff --git a/eggs/kde_locals/kactivitymanagerd/resources/working-backup/database b/eggs/kde_locals/kactivitymanagerd/resources/working-backup/database new file mode 100644 index 0000000..d681706 Binary files /dev/null and b/eggs/kde_locals/kactivitymanagerd/resources/working-backup/database differ diff --git a/eggs/kde_locals/kactivitymanagerd/resources/working-backup/database-shm b/eggs/kde_locals/kactivitymanagerd/resources/working-backup/database-shm new file mode 100644 index 0000000..c4201fb Binary files /dev/null and b/eggs/kde_locals/kactivitymanagerd/resources/working-backup/database-shm differ diff --git a/eggs/kde_locals/kactivitymanagerd/resources/working-backup/database-wal b/eggs/kde_locals/kactivitymanagerd/resources/working-backup/database-wal new file mode 100644 index 0000000..23578da Binary files /dev/null and b/eggs/kde_locals/kactivitymanagerd/resources/working-backup/database-wal differ diff --git a/eggs/kde_locals/kate/anonymous.katesession b/eggs/kde_locals/kate/anonymous.katesession new file mode 100644 index 0000000..4edbab3 --- /dev/null +++ b/eggs/kde_locals/kate/anonymous.katesession @@ -0,0 +1,129 @@ +[Kate Plugins] +cmaketoolsplugin=false +compilerexplorer=false +eslintplugin=false +externaltoolsplugin=true +formatplugin=false +katebacktracebrowserplugin=false +katebuildplugin=false +katecloseexceptplugin=false +katecolorpickerplugin=false +katectagsplugin=false +katefilebrowserplugin=false +katefiletreeplugin=true +kategdbplugin=false +kategitblameplugin=false +katekonsoleplugin=true +kateprojectplugin=true +katereplicodeplugin=false +katesearchplugin=true +katesnippetsplugin=false +katesqlplugin=false +katesymbolviewerplugin=false +katexmlcheckplugin=false +katexmltoolsplugin=false +keyboardmacrosplugin=false +ktexteditorpreviewplugin=false +latexcompletionplugin=false +lspclientplugin=true +openlinkplugin=false +rainbowparens=false +rbqlplugin=false +tabswitcherplugin=true +templateplugin=false +textfilterplugin=true + +[MainWindow0] +Active ViewSpace=0 +Kate-MDI-H-Splitter=0,979,0 +Kate-MDI-Sidebar-0-Bar-0-TvList=kate_private_plugin_katefiletreeplugin,kateproject,kateprojectgit,lspclient_symbol_outline +Kate-MDI-Sidebar-0-LastSize=200 +Kate-MDI-Sidebar-0-SectSizes=0 +Kate-MDI-Sidebar-0-Splitter=531 +Kate-MDI-Sidebar-1-Bar-0-TvList= +Kate-MDI-Sidebar-1-LastSize=200 +Kate-MDI-Sidebar-1-SectSizes=0 +Kate-MDI-Sidebar-1-Splitter=531 +Kate-MDI-Sidebar-2-Bar-0-TvList= +Kate-MDI-Sidebar-2-LastSize=200 +Kate-MDI-Sidebar-2-SectSizes=0 +Kate-MDI-Sidebar-2-Splitter=979 +Kate-MDI-Sidebar-3-Bar-0-TvList=output,diagnostics,kate_plugin_katesearch,kateprojectinfo,kate_private_plugin_katekonsoleplugin +Kate-MDI-Sidebar-3-LastSize=200 +Kate-MDI-Sidebar-3-SectSizes=0 +Kate-MDI-Sidebar-3-Splitter=1024 +Kate-MDI-Sidebar-Style=2 +Kate-MDI-Sidebar-Visible=true +Kate-MDI-ToolView-diagnostics-Position=3 +Kate-MDI-ToolView-diagnostics-Show-Button-In-Sidebar=true +Kate-MDI-ToolView-diagnostics-Visible=false +Kate-MDI-ToolView-kate_plugin_katesearch-Position=3 +Kate-MDI-ToolView-kate_plugin_katesearch-Show-Button-In-Sidebar=true +Kate-MDI-ToolView-kate_plugin_katesearch-Visible=false +Kate-MDI-ToolView-kate_private_plugin_katefiletreeplugin-Position=0 +Kate-MDI-ToolView-kate_private_plugin_katefiletreeplugin-Show-Button-In-Sidebar=true +Kate-MDI-ToolView-kate_private_plugin_katefiletreeplugin-Visible=false +Kate-MDI-ToolView-kate_private_plugin_katekonsoleplugin-Position=3 +Kate-MDI-ToolView-kate_private_plugin_katekonsoleplugin-Show-Button-In-Sidebar=true +Kate-MDI-ToolView-kate_private_plugin_katekonsoleplugin-Visible=false +Kate-MDI-ToolView-kateproject-Position=0 +Kate-MDI-ToolView-kateproject-Show-Button-In-Sidebar=true +Kate-MDI-ToolView-kateproject-Visible=false +Kate-MDI-ToolView-kateprojectgit-Position=0 +Kate-MDI-ToolView-kateprojectgit-Show-Button-In-Sidebar=true +Kate-MDI-ToolView-kateprojectgit-Visible=false +Kate-MDI-ToolView-kateprojectinfo-Position=3 +Kate-MDI-ToolView-kateprojectinfo-Show-Button-In-Sidebar=true +Kate-MDI-ToolView-kateprojectinfo-Visible=false +Kate-MDI-ToolView-lspclient_symbol_outline-Position=0 +Kate-MDI-ToolView-lspclient_symbol_outline-Show-Button-In-Sidebar=true +Kate-MDI-ToolView-lspclient_symbol_outline-Visible=false +Kate-MDI-ToolView-output-Position=3 +Kate-MDI-ToolView-output-Show-Button-In-Sidebar=true +Kate-MDI-ToolView-output-Visible=false +Kate-MDI-V-Splitter=0,531,0 + +[MainWindow0 Settings] +WindowState=8 + +[MainWindow0-Splitter 0] +Children=MainWindow0-ViewSpace 0 +Orientation=1 +Sizes=979 + +[MainWindow0-ViewSpace 0] +Count=0 +Documents= + +[Open Documents] +Count=0 + +[Open MainWindows] +Count=1 + +[Plugin:kateprojectplugin:] +projects= + +[Plugin:katesearchplugin:MainWindow:0] +BinaryFiles=false +CurrentExcludeFilter=-1 +CurrentFilter=-1 +ExcludeFilters= +ExpandSearchResults=false +Filters= +FollowSymLink=false +HiddenFiles=false +MatchCase=false +Place=1 +Recursive=true +Replaces= +Search= +SearchAsYouTypeAllProjects=true +SearchAsYouTypeCurrentFile=true +SearchAsYouTypeFolder=true +SearchAsYouTypeOpenFiles=true +SearchAsYouTypeProject=true +SearchDiskFiles= +SearchDiskFiless= +SizeLimit=128 +UseRegExp=false diff --git a/eggs/kde_locals/klipper/data/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b b/eggs/kde_locals/klipper/data/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b new file mode 100644 index 0000000..2c7c284 --- /dev/null +++ b/eggs/kde_locals/klipper/data/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b @@ -0,0 +1 @@ +echo deep > /sys/power/mem_sleep \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b/5d5a7f481a343c5958df9c5ccf09a392b0089cd5 b/eggs/kde_locals/klipper/data/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b/5d5a7f481a343c5958df9c5ccf09a392b0089cd5 new file mode 100644 index 0000000..d613fbb Binary files /dev/null and b/eggs/kde_locals/klipper/data/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b/5d5a7f481a343c5958df9c5ccf09a392b0089cd5 differ diff --git a/eggs/kde_locals/klipper/data/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b/85cb9d813b3bdfa4e0b73ecfa7385d16397c52be b/eggs/kde_locals/klipper/data/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b/85cb9d813b3bdfa4e0b73ecfa7385d16397c52be new file mode 100644 index 0000000..5856bbb Binary files /dev/null and b/eggs/kde_locals/klipper/data/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b/85cb9d813b3bdfa4e0b73ecfa7385d16397c52be differ diff --git a/eggs/kde_locals/klipper/data/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b/b9e1ab106ee770e4418c5288a937766e8ad8cce0 b/eggs/kde_locals/klipper/data/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b/b9e1ab106ee770e4418c5288a937766e8ad8cce0 new file mode 100644 index 0000000..38f900f Binary files /dev/null and b/eggs/kde_locals/klipper/data/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b/b9e1ab106ee770e4418c5288a937766e8ad8cce0 differ diff --git a/eggs/kde_locals/klipper/data/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b/bbf98a0fffaf6d35ccdcfb7fc02397f7797623c7 b/eggs/kde_locals/klipper/data/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b/bbf98a0fffaf6d35ccdcfb7fc02397f7797623c7 new file mode 100644 index 0000000..2a0a022 --- /dev/null +++ b/eggs/kde_locals/klipper/data/0929ce6d8ca03011e491c9fc38add29d3e2d2c0b/bbf98a0fffaf6d35ccdcfb7fc02397f7797623c7 @@ -0,0 +1 @@ +
echo deep > /sys/power/mem_sleep
\ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/0c664f275a7f3172f3e896332ae8c15f238f65f9/0c664f275a7f3172f3e896332ae8c15f238f65f9 b/eggs/kde_locals/klipper/data/0c664f275a7f3172f3e896332ae8c15f238f65f9/0c664f275a7f3172f3e896332ae8c15f238f65f9 new file mode 100644 index 0000000..492b19b --- /dev/null +++ b/eggs/kde_locals/klipper/data/0c664f275a7f3172f3e896332ae8c15f238f65f9/0c664f275a7f3172f3e896332ae8c15f238f65f9 @@ -0,0 +1 @@ +git config --global user.name \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/14e8d839609e23688dbb439b28b8b967bd41b234/004f70b925922ebee297e9b8ff2893e620da4296 b/eggs/kde_locals/klipper/data/14e8d839609e23688dbb439b28b8b967bd41b234/004f70b925922ebee297e9b8ff2893e620da4296 new file mode 100644 index 0000000..fdb82c1 --- /dev/null +++ b/eggs/kde_locals/klipper/data/14e8d839609e23688dbb439b28b8b967bd41b234/004f70b925922ebee297e9b8ff2893e620da4296 @@ -0,0 +1,9 @@ + + + + + + + +plasma
+ diff --git a/eggs/kde_locals/klipper/data/14e8d839609e23688dbb439b28b8b967bd41b234/14e8d839609e23688dbb439b28b8b967bd41b234 b/eggs/kde_locals/klipper/data/14e8d839609e23688dbb439b28b8b967bd41b234/14e8d839609e23688dbb439b28b8b967bd41b234 new file mode 100644 index 0000000..eff359e --- /dev/null +++ b/eggs/kde_locals/klipper/data/14e8d839609e23688dbb439b28b8b967bd41b234/14e8d839609e23688dbb439b28b8b967bd41b234 @@ -0,0 +1 @@ +plasma \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/3895a5629b5d4b9ceb64b8e2965cec1addfae26a/1ebb56a4144be3f70b5ab9628c9bae400eebd180 b/eggs/kde_locals/klipper/data/3895a5629b5d4b9ceb64b8e2965cec1addfae26a/1ebb56a4144be3f70b5ab9628c9bae400eebd180 new file mode 100644 index 0000000..70aae7c --- /dev/null +++ b/eggs/kde_locals/klipper/data/3895a5629b5d4b9ceb64b8e2965cec1addfae26a/1ebb56a4144be3f70b5ab9628c9bae400eebd180 @@ -0,0 +1 @@ +
~/.local/share
\ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/3895a5629b5d4b9ceb64b8e2965cec1addfae26a/3895a5629b5d4b9ceb64b8e2965cec1addfae26a b/eggs/kde_locals/klipper/data/3895a5629b5d4b9ceb64b8e2965cec1addfae26a/3895a5629b5d4b9ceb64b8e2965cec1addfae26a new file mode 100644 index 0000000..fb83932 --- /dev/null +++ b/eggs/kde_locals/klipper/data/3895a5629b5d4b9ceb64b8e2965cec1addfae26a/3895a5629b5d4b9ceb64b8e2965cec1addfae26a @@ -0,0 +1 @@ +~/.local/share \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/565d38d25dc70f3863eac1b7bc2277cc3afef9d9/565d38d25dc70f3863eac1b7bc2277cc3afef9d9 b/eggs/kde_locals/klipper/data/565d38d25dc70f3863eac1b7bc2277cc3afef9d9/565d38d25dc70f3863eac1b7bc2277cc3afef9d9 new file mode 100644 index 0000000..1a2331a --- /dev/null +++ b/eggs/kde_locals/klipper/data/565d38d25dc70f3863eac1b7bc2277cc3afef9d9/565d38d25dc70f3863eac1b7bc2277cc3afef9d9 @@ -0,0 +1 @@ +Dynamic Workspaces \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/565d38d25dc70f3863eac1b7bc2277cc3afef9d9/6953d25bd676c8d345e1cf62e33dd15e55087fdd b/eggs/kde_locals/klipper/data/565d38d25dc70f3863eac1b7bc2277cc3afef9d9/6953d25bd676c8d345e1cf62e33dd15e55087fdd new file mode 100644 index 0000000..85fcc6c --- /dev/null +++ b/eggs/kde_locals/klipper/data/565d38d25dc70f3863eac1b7bc2277cc3afef9d9/6953d25bd676c8d345e1cf62e33dd15e55087fdd @@ -0,0 +1,2 @@ +Dynamic Workspaces + diff --git a/eggs/kde_locals/klipper/data/565d38d25dc70f3863eac1b7bc2277cc3afef9d9/aab1531a2650eb8ab894776ce83ac1cb5d7681b1 b/eggs/kde_locals/klipper/data/565d38d25dc70f3863eac1b7bc2277cc3afef9d9/aab1531a2650eb8ab894776ce83ac1cb5d7681b1 new file mode 100644 index 0000000..3ce6bd1 --- /dev/null +++ b/eggs/kde_locals/klipper/data/565d38d25dc70f3863eac1b7bc2277cc3afef9d9/aab1531a2650eb8ab894776ce83ac1cb5d7681b1 @@ -0,0 +1,8 @@ + + +

Dynamic Workspaces

\ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/5e559d6d2f7280041b6c2d6267a97722706ecbc8/39c213bdf017d05e197918a12ef7bfaaecd9885d b/eggs/kde_locals/klipper/data/5e559d6d2f7280041b6c2d6267a97722706ecbc8/39c213bdf017d05e197918a12ef7bfaaecd9885d new file mode 100644 index 0000000..57435d0 --- /dev/null +++ b/eggs/kde_locals/klipper/data/5e559d6d2f7280041b6c2d6267a97722706ecbc8/39c213bdf017d05e197918a12ef7bfaaecd9885d @@ -0,0 +1 @@ +/sys/power/mem_sleep \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/5e559d6d2f7280041b6c2d6267a97722706ecbc8/5d5a7f481a343c5958df9c5ccf09a392b0089cd5 b/eggs/kde_locals/klipper/data/5e559d6d2f7280041b6c2d6267a97722706ecbc8/5d5a7f481a343c5958df9c5ccf09a392b0089cd5 new file mode 100644 index 0000000..d613fbb Binary files /dev/null and b/eggs/kde_locals/klipper/data/5e559d6d2f7280041b6c2d6267a97722706ecbc8/5d5a7f481a343c5958df9c5ccf09a392b0089cd5 differ diff --git a/eggs/kde_locals/klipper/data/5e559d6d2f7280041b6c2d6267a97722706ecbc8/5e559d6d2f7280041b6c2d6267a97722706ecbc8 b/eggs/kde_locals/klipper/data/5e559d6d2f7280041b6c2d6267a97722706ecbc8/5e559d6d2f7280041b6c2d6267a97722706ecbc8 new file mode 100644 index 0000000..94397ee --- /dev/null +++ b/eggs/kde_locals/klipper/data/5e559d6d2f7280041b6c2d6267a97722706ecbc8/5e559d6d2f7280041b6c2d6267a97722706ecbc8 @@ -0,0 +1 @@ +/sys/power/mem_sleep \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/5e559d6d2f7280041b6c2d6267a97722706ecbc8/ae418126d40f1d5af501c90e9284c617f1355b7e b/eggs/kde_locals/klipper/data/5e559d6d2f7280041b6c2d6267a97722706ecbc8/ae418126d40f1d5af501c90e9284c617f1355b7e new file mode 100644 index 0000000..804ab5a Binary files /dev/null and b/eggs/kde_locals/klipper/data/5e559d6d2f7280041b6c2d6267a97722706ecbc8/ae418126d40f1d5af501c90e9284c617f1355b7e differ diff --git a/eggs/kde_locals/klipper/data/5e559d6d2f7280041b6c2d6267a97722706ecbc8/dab1065158a23776937fca28488a10496b871105 b/eggs/kde_locals/klipper/data/5e559d6d2f7280041b6c2d6267a97722706ecbc8/dab1065158a23776937fca28488a10496b871105 new file mode 100644 index 0000000..b64385f Binary files /dev/null and b/eggs/kde_locals/klipper/data/5e559d6d2f7280041b6c2d6267a97722706ecbc8/dab1065158a23776937fca28488a10496b871105 differ diff --git a/eggs/kde_locals/klipper/data/79f430bd2ece7afad0c524d053d0c896ad8da249/79f430bd2ece7afad0c524d053d0c896ad8da249 b/eggs/kde_locals/klipper/data/79f430bd2ece7afad0c524d053d0c896ad8da249/79f430bd2ece7afad0c524d053d0c896ad8da249 new file mode 100644 index 0000000..0a3c408 --- /dev/null +++ b/eggs/kde_locals/klipper/data/79f430bd2ece7afad0c524d053d0c896ad8da249/79f430bd2ece7afad0c524d053d0c896ad8da249 @@ -0,0 +1 @@ +git config --global user.name "Your Name" \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/80977bda6f389578dfe6f45832060924ec780adb/160e5094aa48afd1729c49e3d013665988e95e3f b/eggs/kde_locals/klipper/data/80977bda6f389578dfe6f45832060924ec780adb/160e5094aa48afd1729c49e3d013665988e95e3f new file mode 100644 index 0000000..ca4c9cd --- /dev/null +++ b/eggs/kde_locals/klipper/data/80977bda6f389578dfe6f45832060924ec780adb/160e5094aa48afd1729c49e3d013665988e95e3f @@ -0,0 +1,9 @@ + + + + + + + +/.local/share/plasma
+ diff --git a/eggs/kde_locals/klipper/data/80977bda6f389578dfe6f45832060924ec780adb/80977bda6f389578dfe6f45832060924ec780adb b/eggs/kde_locals/klipper/data/80977bda6f389578dfe6f45832060924ec780adb/80977bda6f389578dfe6f45832060924ec780adb new file mode 100644 index 0000000..54f4ad8 --- /dev/null +++ b/eggs/kde_locals/klipper/data/80977bda6f389578dfe6f45832060924ec780adb/80977bda6f389578dfe6f45832060924ec780adb @@ -0,0 +1 @@ +/.local/share/plasma \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/8aba21f70ef97af8c1ae1c8a7dc38b2814424572/5d5a7f481a343c5958df9c5ccf09a392b0089cd5 b/eggs/kde_locals/klipper/data/8aba21f70ef97af8c1ae1c8a7dc38b2814424572/5d5a7f481a343c5958df9c5ccf09a392b0089cd5 new file mode 100644 index 0000000..d613fbb Binary files /dev/null and b/eggs/kde_locals/klipper/data/8aba21f70ef97af8c1ae1c8a7dc38b2814424572/5d5a7f481a343c5958df9c5ccf09a392b0089cd5 differ diff --git a/eggs/kde_locals/klipper/data/8aba21f70ef97af8c1ae1c8a7dc38b2814424572/8aba21f70ef97af8c1ae1c8a7dc38b2814424572 b/eggs/kde_locals/klipper/data/8aba21f70ef97af8c1ae1c8a7dc38b2814424572/8aba21f70ef97af8c1ae1c8a7dc38b2814424572 new file mode 100644 index 0000000..7d0e097 --- /dev/null +++ b/eggs/kde_locals/klipper/data/8aba21f70ef97af8c1ae1c8a7dc38b2814424572/8aba21f70ef97af8c1ae1c8a7dc38b2814424572 @@ -0,0 +1 @@ + /sys/power/state \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/8aba21f70ef97af8c1ae1c8a7dc38b2814424572/9731832c96a5a640c710d1f728d65d5ec132d635 b/eggs/kde_locals/klipper/data/8aba21f70ef97af8c1ae1c8a7dc38b2814424572/9731832c96a5a640c710d1f728d65d5ec132d635 new file mode 100644 index 0000000..4c0ce88 --- /dev/null +++ b/eggs/kde_locals/klipper/data/8aba21f70ef97af8c1ae1c8a7dc38b2814424572/9731832c96a5a640c710d1f728d65d5ec132d635 @@ -0,0 +1 @@ + /sys/power/state \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/8aba21f70ef97af8c1ae1c8a7dc38b2814424572/c732171543535d74ad921fb12d1a6ca42bcfaa80 b/eggs/kde_locals/klipper/data/8aba21f70ef97af8c1ae1c8a7dc38b2814424572/c732171543535d74ad921fb12d1a6ca42bcfaa80 new file mode 100644 index 0000000..2de1a16 Binary files /dev/null and b/eggs/kde_locals/klipper/data/8aba21f70ef97af8c1ae1c8a7dc38b2814424572/c732171543535d74ad921fb12d1a6ca42bcfaa80 differ diff --git a/eggs/kde_locals/klipper/data/8aba21f70ef97af8c1ae1c8a7dc38b2814424572/dab1065158a23776937fca28488a10496b871105 b/eggs/kde_locals/klipper/data/8aba21f70ef97af8c1ae1c8a7dc38b2814424572/dab1065158a23776937fca28488a10496b871105 new file mode 100644 index 0000000..b64385f Binary files /dev/null and b/eggs/kde_locals/klipper/data/8aba21f70ef97af8c1ae1c8a7dc38b2814424572/dab1065158a23776937fca28488a10496b871105 differ diff --git a/eggs/kde_locals/klipper/data/942f44761b080e7c5e280e112007a19cfd9864df/1531f9fd2662a20027338664890c40eb68f60be1 b/eggs/kde_locals/klipper/data/942f44761b080e7c5e280e112007a19cfd9864df/1531f9fd2662a20027338664890c40eb68f60be1 new file mode 100644 index 0000000..e5f0fd4 --- /dev/null +++ b/eggs/kde_locals/klipper/data/942f44761b080e7c5e280e112007a19cfd9864df/1531f9fd2662a20027338664890c40eb68f60be1 @@ -0,0 +1,9 @@ + + + + + + + +--system
+ diff --git a/eggs/kde_locals/klipper/data/942f44761b080e7c5e280e112007a19cfd9864df/942f44761b080e7c5e280e112007a19cfd9864df b/eggs/kde_locals/klipper/data/942f44761b080e7c5e280e112007a19cfd9864df/942f44761b080e7c5e280e112007a19cfd9864df new file mode 100644 index 0000000..700699b --- /dev/null +++ b/eggs/kde_locals/klipper/data/942f44761b080e7c5e280e112007a19cfd9864df/942f44761b080e7c5e280e112007a19cfd9864df @@ -0,0 +1 @@ +--system \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/a4ad590057a559571d9c5c14788a20a6e1e1c04f/a4ad590057a559571d9c5c14788a20a6e1e1c04f b/eggs/kde_locals/klipper/data/a4ad590057a559571d9c5c14788a20a6e1e1c04f/a4ad590057a559571d9c5c14788a20a6e1e1c04f new file mode 100644 index 0000000..447984e --- /dev/null +++ b/eggs/kde_locals/klipper/data/a4ad590057a559571d9c5c14788a20a6e1e1c04f/a4ad590057a559571d9c5c14788a20a6e1e1c04f @@ -0,0 +1 @@ +[s2idle] diff --git a/eggs/kde_locals/klipper/data/a4ad590057a559571d9c5c14788a20a6e1e1c04f/ab417632c518ce7d120fa371aec2ec452e74fd31 b/eggs/kde_locals/klipper/data/a4ad590057a559571d9c5c14788a20a6e1e1c04f/ab417632c518ce7d120fa371aec2ec452e74fd31 new file mode 100644 index 0000000..9745b6c --- /dev/null +++ b/eggs/kde_locals/klipper/data/a4ad590057a559571d9c5c14788a20a6e1e1c04f/ab417632c518ce7d120fa371aec2ec452e74fd31 @@ -0,0 +1,10 @@ + + + + + + + +[s2idle]
+
+ diff --git a/eggs/kde_locals/klipper/data/ad25a756eec1f40d55e65396c8a3a939edbf2cae/02e6001ad8e5a7a87ea9e06a570b664a94b5c86b b/eggs/kde_locals/klipper/data/ad25a756eec1f40d55e65396c8a3a939edbf2cae/02e6001ad8e5a7a87ea9e06a570b664a94b5c86b new file mode 100644 index 0000000..e8e8e93 --- /dev/null +++ b/eggs/kde_locals/klipper/data/ad25a756eec1f40d55e65396c8a3a939edbf2cae/02e6001ad8e5a7a87ea9e06a570b664a94b5c86b @@ -0,0 +1 @@ +
.gitconfig
\ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/ad25a756eec1f40d55e65396c8a3a939edbf2cae/ad25a756eec1f40d55e65396c8a3a939edbf2cae b/eggs/kde_locals/klipper/data/ad25a756eec1f40d55e65396c8a3a939edbf2cae/ad25a756eec1f40d55e65396c8a3a939edbf2cae new file mode 100644 index 0000000..e717d37 --- /dev/null +++ b/eggs/kde_locals/klipper/data/ad25a756eec1f40d55e65396c8a3a939edbf2cae/ad25a756eec1f40d55e65396c8a3a939edbf2cae @@ -0,0 +1 @@ +.gitconfig \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e/45ebac7bd348c0dcd6ee47de2fd0ff3cdda1f447 b/eggs/kde_locals/klipper/data/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e/45ebac7bd348c0dcd6ee47de2fd0ff3cdda1f447 new file mode 100644 index 0000000..c6fd2ab --- /dev/null +++ b/eggs/kde_locals/klipper/data/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e/45ebac7bd348c0dcd6ee47de2fd0ff3cdda1f447 @@ -0,0 +1 @@ +
freeze
\ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e/5d5a7f481a343c5958df9c5ccf09a392b0089cd5 b/eggs/kde_locals/klipper/data/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e/5d5a7f481a343c5958df9c5ccf09a392b0089cd5 new file mode 100644 index 0000000..d613fbb Binary files /dev/null and b/eggs/kde_locals/klipper/data/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e/5d5a7f481a343c5958df9c5ccf09a392b0089cd5 differ diff --git a/eggs/kde_locals/klipper/data/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e/aabdd8d55626b07ae970c27648bd5c28d222cdbe b/eggs/kde_locals/klipper/data/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e/aabdd8d55626b07ae970c27648bd5c28d222cdbe new file mode 100644 index 0000000..560992b Binary files /dev/null and b/eggs/kde_locals/klipper/data/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e/aabdd8d55626b07ae970c27648bd5c28d222cdbe differ diff --git a/eggs/kde_locals/klipper/data/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e b/eggs/kde_locals/klipper/data/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e new file mode 100644 index 0000000..280e4ae --- /dev/null +++ b/eggs/kde_locals/klipper/data/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e @@ -0,0 +1 @@ +freeze \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e/b9e1ab106ee770e4418c5288a937766e8ad8cce0 b/eggs/kde_locals/klipper/data/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e/b9e1ab106ee770e4418c5288a937766e8ad8cce0 new file mode 100644 index 0000000..38f900f Binary files /dev/null and b/eggs/kde_locals/klipper/data/adcdee7c29e76d6c7249456e6ff99ae44efe9e6e/b9e1ab106ee770e4418c5288a937766e8ad8cce0 differ diff --git a/eggs/kde_locals/klipper/data/b84e18458feefb0150715436ad5e22e1e05c60a3/44b5fe7f7e9e005acaf11af49bead13de5f0d382 b/eggs/kde_locals/klipper/data/b84e18458feefb0150715436ad5e22e1e05c60a3/44b5fe7f7e9e005acaf11af49bead13de5f0d382 new file mode 100644 index 0000000..1174c24 --- /dev/null +++ b/eggs/kde_locals/klipper/data/b84e18458feefb0150715436ad5e22e1e05c60a3/44b5fe7f7e9e005acaf11af49bead13de5f0d382 @@ -0,0 +1,8 @@ + + +

Kyattsukuro

\ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/b84e18458feefb0150715436ad5e22e1e05c60a3/b84e18458feefb0150715436ad5e22e1e05c60a3 b/eggs/kde_locals/klipper/data/b84e18458feefb0150715436ad5e22e1e05c60a3/b84e18458feefb0150715436ad5e22e1e05c60a3 new file mode 100644 index 0000000..7f2d9b2 --- /dev/null +++ b/eggs/kde_locals/klipper/data/b84e18458feefb0150715436ad5e22e1e05c60a3/b84e18458feefb0150715436ad5e22e1e05c60a3 @@ -0,0 +1 @@ +Kyattsukuro \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/c2b7df6201fdd3362399091f0a29550df3505b6a/26042c1454274c738af431aafe21b7d5ba5ba28c b/eggs/kde_locals/klipper/data/c2b7df6201fdd3362399091f0a29550df3505b6a/26042c1454274c738af431aafe21b7d5ba5ba28c new file mode 100644 index 0000000..882cac9 --- /dev/null +++ b/eggs/kde_locals/klipper/data/c2b7df6201fdd3362399091f0a29550df3505b6a/26042c1454274c738af431aafe21b7d5ba5ba28c @@ -0,0 +1 @@ +
}
\ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/c2b7df6201fdd3362399091f0a29550df3505b6a/c2b7df6201fdd3362399091f0a29550df3505b6a b/eggs/kde_locals/klipper/data/c2b7df6201fdd3362399091f0a29550df3505b6a/c2b7df6201fdd3362399091f0a29550df3505b6a new file mode 100644 index 0000000..ff30235 --- /dev/null +++ b/eggs/kde_locals/klipper/data/c2b7df6201fdd3362399091f0a29550df3505b6a/c2b7df6201fdd3362399091f0a29550df3505b6a @@ -0,0 +1 @@ +} \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/d48245ad6a95ff21709957d50e62dc08d630fe3c/5d5a7f481a343c5958df9c5ccf09a392b0089cd5 b/eggs/kde_locals/klipper/data/d48245ad6a95ff21709957d50e62dc08d630fe3c/5d5a7f481a343c5958df9c5ccf09a392b0089cd5 new file mode 100644 index 0000000..d613fbb Binary files /dev/null and b/eggs/kde_locals/klipper/data/d48245ad6a95ff21709957d50e62dc08d630fe3c/5d5a7f481a343c5958df9c5ccf09a392b0089cd5 differ diff --git a/eggs/kde_locals/klipper/data/d48245ad6a95ff21709957d50e62dc08d630fe3c/c4a57be6f07f54847fa76860779a8b9c8bafe7fd b/eggs/kde_locals/klipper/data/d48245ad6a95ff21709957d50e62dc08d630fe3c/c4a57be6f07f54847fa76860779a8b9c8bafe7fd new file mode 100644 index 0000000..a36fed2 --- /dev/null +++ b/eggs/kde_locals/klipper/data/d48245ad6a95ff21709957d50e62dc08d630fe3c/c4a57be6f07f54847fa76860779a8b9c8bafe7fd @@ -0,0 +1 @@ +/sys/power/state \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/d48245ad6a95ff21709957d50e62dc08d630fe3c/c732171543535d74ad921fb12d1a6ca42bcfaa80 b/eggs/kde_locals/klipper/data/d48245ad6a95ff21709957d50e62dc08d630fe3c/c732171543535d74ad921fb12d1a6ca42bcfaa80 new file mode 100644 index 0000000..2de1a16 Binary files /dev/null and b/eggs/kde_locals/klipper/data/d48245ad6a95ff21709957d50e62dc08d630fe3c/c732171543535d74ad921fb12d1a6ca42bcfaa80 differ diff --git a/eggs/kde_locals/klipper/data/d48245ad6a95ff21709957d50e62dc08d630fe3c/d48245ad6a95ff21709957d50e62dc08d630fe3c b/eggs/kde_locals/klipper/data/d48245ad6a95ff21709957d50e62dc08d630fe3c/d48245ad6a95ff21709957d50e62dc08d630fe3c new file mode 100644 index 0000000..f00dcc0 --- /dev/null +++ b/eggs/kde_locals/klipper/data/d48245ad6a95ff21709957d50e62dc08d630fe3c/d48245ad6a95ff21709957d50e62dc08d630fe3c @@ -0,0 +1 @@ +/sys/power/state \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/d48245ad6a95ff21709957d50e62dc08d630fe3c/dab1065158a23776937fca28488a10496b871105 b/eggs/kde_locals/klipper/data/d48245ad6a95ff21709957d50e62dc08d630fe3c/dab1065158a23776937fca28488a10496b871105 new file mode 100644 index 0000000..b64385f Binary files /dev/null and b/eggs/kde_locals/klipper/data/d48245ad6a95ff21709957d50e62dc08d630fe3c/dab1065158a23776937fca28488a10496b871105 differ diff --git a/eggs/kde_locals/klipper/data/da655ed999402b68796400573d00a4f0f3d8405e/da655ed999402b68796400573d00a4f0f3d8405e b/eggs/kde_locals/klipper/data/da655ed999402b68796400573d00a4f0f3d8405e/da655ed999402b68796400573d00a4f0f3d8405e new file mode 100644 index 0000000..5c0313f --- /dev/null +++ b/eggs/kde_locals/klipper/data/da655ed999402b68796400573d00a4f0f3d8405e/da655ed999402b68796400573d00a4f0f3d8405e @@ -0,0 +1 @@ +find . -type f -regex '.*\(k\|rc\|pulse\|session\|gtk\|autostart\|xbel\).*' \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/da655ed999402b68796400573d00a4f0f3d8405e/e519c3fae783e1fc9a03998c8e6f5adb784fcb8c b/eggs/kde_locals/klipper/data/da655ed999402b68796400573d00a4f0f3d8405e/e519c3fae783e1fc9a03998c8e6f5adb784fcb8c new file mode 100644 index 0000000..27f1192 --- /dev/null +++ b/eggs/kde_locals/klipper/data/da655ed999402b68796400573d00a4f0f3d8405e/e519c3fae783e1fc9a03998c8e6f5adb784fcb8c @@ -0,0 +1 @@ +
find . -type f -regex '.*\(k\|rc\|pulse\|session\|gtk\|autostart\|xbel\).*'
\ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/f28ab43d514e1f1fd65e715103f933b2af7bc7ab/05460354e2bee3e5acf1905b80b54d838a189b4b b/eggs/kde_locals/klipper/data/f28ab43d514e1f1fd65e715103f933b2af7bc7ab/05460354e2bee3e5acf1905b80b54d838a189b4b new file mode 100644 index 0000000..fe717d6 Binary files /dev/null and b/eggs/kde_locals/klipper/data/f28ab43d514e1f1fd65e715103f933b2af7bc7ab/05460354e2bee3e5acf1905b80b54d838a189b4b differ diff --git a/eggs/kde_locals/klipper/data/f28ab43d514e1f1fd65e715103f933b2af7bc7ab/72eec1012c1c6302bd8f6cdabe3158d7a94688b5 b/eggs/kde_locals/klipper/data/f28ab43d514e1f1fd65e715103f933b2af7bc7ab/72eec1012c1c6302bd8f6cdabe3158d7a94688b5 new file mode 100644 index 0000000..7aea73e --- /dev/null +++ b/eggs/kde_locals/klipper/data/f28ab43d514e1f1fd65e715103f933b2af7bc7ab/72eec1012c1c6302bd8f6cdabe3158d7a94688b5 @@ -0,0 +1,13 @@ +
+ + +
+ +
+
+ +
+
\ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/f28ab43d514e1f1fd65e715103f933b2af7bc7ab/978b7c4bce1ff968fce854ef9a11f4729d5b6a78 b/eggs/kde_locals/klipper/data/f28ab43d514e1f1fd65e715103f933b2af7bc7ab/978b7c4bce1ff968fce854ef9a11f4729d5b6a78 new file mode 100644 index 0000000..8d92579 Binary files /dev/null and b/eggs/kde_locals/klipper/data/f28ab43d514e1f1fd65e715103f933b2af7bc7ab/978b7c4bce1ff968fce854ef9a11f4729d5b6a78 differ diff --git a/eggs/kde_locals/klipper/data/f28ab43d514e1f1fd65e715103f933b2af7bc7ab/d082f7e249d835bcfa4fef87afdee6375e18042b b/eggs/kde_locals/klipper/data/f28ab43d514e1f1fd65e715103f933b2af7bc7ab/d082f7e249d835bcfa4fef87afdee6375e18042b new file mode 100644 index 0000000..e7e929c Binary files /dev/null and b/eggs/kde_locals/klipper/data/f28ab43d514e1f1fd65e715103f933b2af7bc7ab/d082f7e249d835bcfa4fef87afdee6375e18042b differ diff --git a/eggs/kde_locals/klipper/data/f28ab43d514e1f1fd65e715103f933b2af7bc7ab/f28ab43d514e1f1fd65e715103f933b2af7bc7ab b/eggs/kde_locals/klipper/data/f28ab43d514e1f1fd65e715103f933b2af7bc7ab/f28ab43d514e1f1fd65e715103f933b2af7bc7ab new file mode 100644 index 0000000..a9b1b86 --- /dev/null +++ b/eggs/kde_locals/klipper/data/f28ab43d514e1f1fd65e715103f933b2af7bc7ab/f28ab43d514e1f1fd65e715103f933b2af7bc7ab @@ -0,0 +1,3 @@ + +[Kyattsukuro] +Kyattsukuro \ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/f6522a52aa02c9064f6ef7a661b83bd222aee32c/1a7d177d4e42d809c040a0be517b68679ce259b0 b/eggs/kde_locals/klipper/data/f6522a52aa02c9064f6ef7a661b83bd222aee32c/1a7d177d4e42d809c040a0be517b68679ce259b0 new file mode 100644 index 0000000..f541598 --- /dev/null +++ b/eggs/kde_locals/klipper/data/f6522a52aa02c9064f6ef7a661b83bd222aee32c/1a7d177d4e42d809c040a0be517b68679ce259b0 @@ -0,0 +1,19 @@ +file:///home/someone/.local/share/ark +file:///home/someone/.local/share/dbus-1 +file:///home/someone/.local/share/dolphin +file:///home/someone/.local/share/kactivitymanagerd +file:///home/someone/.local/share/kate +file:///home/someone/.local/share/kded6 +file:///home/someone/.local/share/klipper +file:///home/someone/.local/share/knewstuff3 +file:///home/someone/.local/share/konsole +file:///home/someone/.local/share/kwalletd +file:///home/someone/.local/share/kwin +file:///home/someone/.local/share/libkunitconversion +file:///home/someone/.local/share/plasma +file:///home/someone/.local/share/sddm +file:///home/someone/.local/share/krunnerstaterc +file:///home/someone/.local/share/recently-used.xbel +file:///home/someone/.local/share/user-places.xbel +file:///home/someone/.local/share/user-places.xbel.bak +file:///home/someone/.local/share/user-places.xbel.tbcache diff --git a/eggs/kde_locals/klipper/data/f6522a52aa02c9064f6ef7a661b83bd222aee32c/8f7b80066e119830f97daf982a39d780faefd78b b/eggs/kde_locals/klipper/data/f6522a52aa02c9064f6ef7a661b83bd222aee32c/8f7b80066e119830f97daf982a39d780faefd78b new file mode 100644 index 0000000..7a411a2 --- /dev/null +++ b/eggs/kde_locals/klipper/data/f6522a52aa02c9064f6ef7a661b83bd222aee32c/8f7b80066e119830f97daf982a39d780faefd78b @@ -0,0 +1,19 @@ +file:///home/someone/.local/share/ark +file:///home/someone/.local/share/dbus-1 +file:///home/someone/.local/share/dolphin +file:///home/someone/.local/share/kactivitymanagerd +file:///home/someone/.local/share/kate +file:///home/someone/.local/share/kded6 +file:///home/someone/.local/share/klipper +file:///home/someone/.local/share/knewstuff3 +file:///home/someone/.local/share/konsole +file:///home/someone/.local/share/kwalletd +file:///home/someone/.local/share/kwin +file:///home/someone/.local/share/libkunitconversion +file:///home/someone/.local/share/plasma +file:///home/someone/.local/share/sddm +file:///home/someone/.local/share/krunnerstaterc +file:///home/someone/.local/share/recently-used.xbel +file:///home/someone/.local/share/user-places.xbel +file:///home/someone/.local/share/user-places.xbel.bak +file:///home/someone/.local/share/user-places.xbel.tbcache diff --git a/eggs/kde_locals/klipper/data/fda46fea45dd50d9c5e033343d5fb8c673cc8582/a08288139d45fb5adddaa065a51cfbe3d9078631 b/eggs/kde_locals/klipper/data/fda46fea45dd50d9c5e033343d5fb8c673cc8582/a08288139d45fb5adddaa065a51cfbe3d9078631 new file mode 100644 index 0000000..f90b628 --- /dev/null +++ b/eggs/kde_locals/klipper/data/fda46fea45dd50d9c5e033343d5fb8c673cc8582/a08288139d45fb5adddaa065a51cfbe3d9078631 @@ -0,0 +1 @@ +
#{ targets: "~/.config/xsettingsd",
enabled: true },
\ No newline at end of file diff --git a/eggs/kde_locals/klipper/data/fda46fea45dd50d9c5e033343d5fb8c673cc8582/fda46fea45dd50d9c5e033343d5fb8c673cc8582 b/eggs/kde_locals/klipper/data/fda46fea45dd50d9c5e033343d5fb8c673cc8582/fda46fea45dd50d9c5e033343d5fb8c673cc8582 new file mode 100644 index 0000000..047859f --- /dev/null +++ b/eggs/kde_locals/klipper/data/fda46fea45dd50d9c5e033343d5fb8c673cc8582/fda46fea45dd50d9c5e033343d5fb8c673cc8582 @@ -0,0 +1,2 @@ +#{ targets: "~/.config/xsettingsd", + enabled: true }, \ No newline at end of file diff --git a/eggs/kde_locals/klipper/history3.sqlite b/eggs/kde_locals/klipper/history3.sqlite new file mode 100644 index 0000000..4f8e601 Binary files /dev/null and b/eggs/kde_locals/klipper/history3.sqlite differ diff --git a/eggs/kde_locals/klipper/history3.sqlite-shm b/eggs/kde_locals/klipper/history3.sqlite-shm new file mode 100644 index 0000000..c3d02b5 Binary files /dev/null and b/eggs/kde_locals/klipper/history3.sqlite-shm differ diff --git a/eggs/kde_locals/klipper/history3.sqlite-wal b/eggs/kde_locals/klipper/history3.sqlite-wal new file mode 100644 index 0000000..d271326 Binary files /dev/null and b/eggs/kde_locals/klipper/history3.sqlite-wal differ diff --git a/eggs/kde_locals/knewstuff3/konsole.knsregistry b/eggs/kde_locals/knewstuff3/konsole.knsregistry new file mode 100644 index 0000000..1a474c7 --- /dev/null +++ b/eggs/kde_locals/knewstuff3/konsole.knsregistry @@ -0,0 +1,29 @@ + + + + + Catppuccin Frappe for Konsole + api.kde-look.org + catppuccin + https://store.kde.org/p/2143624 + + 7d86b8a + 50 + 2959 + /home/someone/.local/share/konsole/Catppuccin-Frappe.colorscheme + 2143624 + 2024-04-03 + <p>----- Konsole Colourscheme for Catppuccin Frapp&eacute; -----</p> + +<p>Catppuccin is a community-driven pastel theme that aims to be a middle ground between low and high contrast themes. It consists of 4 soothing warm palettes with 26 eye-candy colours each, perfect for coding, designing, and much more! Here, it's used as a colourscheme for Konsole. Hope you enjoy!https://catppuccin.com/</p> + +<p>Any issues can be reported here: https://github.com/catppuccin/konsole/issues</p> + + + https://images.pling.com/cache/100x100-4/img/00/00/68/35/48/2143624/konsole-frappe.png + https://images.pling.com/cache/770x540-4/img/00/00/68/35/48/2143624/konsole-frappe.png + https://files06.pling.com/api/files/download/j/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTcxMjEwODM0NywibyI6IjEiLCJzIjoiNDU1NzcwOGNiNDAyN2ZjMmRjNWY5NDUwNGI3YTkyMzBkYmM4YmQzZGYwZGVkMzBlNjVmNGJkNzkwMGEwZmE0MDVmMTE0OTA0ZmYxNGRkZmMyM2U2Mzg2Y2ZiNWVkZmI3MDU2YmU1ZmRlOGVlYmE1MzNmMjk2Mjc5MTllZWNlMDgiLCJ0IjoxNzQ4NjU3NjMwLCJzdGZwIjpudWxsLCJzdGlwIjoiODcuMTMzLjI4LjI1NSJ9.OQ1FGjlxwlv317KJIa6pkJfUmRhfZfs9M6BnEheeCeo/Catppuccin-Frappe.colorscheme + original-product,pastel,konsole,catppuccin,mit-license,addon + installed + + diff --git a/eggs/kde_locals/knewstuff3/kwinscripts.knsregistry b/eggs/kde_locals/knewstuff3/kwinscripts.knsregistry new file mode 100644 index 0000000..c8fa45d --- /dev/null +++ b/eggs/kde_locals/knewstuff3/kwinscripts.knsregistry @@ -0,0 +1,64 @@ + + + + + Truely Maximized + api.kde-look.org + fin444 + https://store.kde.org/p/2136524 + + 1.1.0 + 57 + 5913 + /home/someone/.local/share/kwin/scripts/truely-maximized/ + 2136524 + 2024-12-21 + <p>A Kwin script that truely maximizes your screen space by hiding the title bars of your windows when they are maximized. You can configure a blacklist from the script settings. There is also an optional screen edge listener to toggle it off/on (look in your screen edge listener settings).</p> + +<p>This is the Plasma 6 version. The Plasma 5 version can be found here: https://www.pling.com/p/2018573/</p> + +<p>Based on (but not forked from) bahamondev/hide-titles https://store.kde.org/p/1354715</p> + + + https://images.pling.com/cache/100x100-4/img/00/00/71/36/84/2136524/max11.png + https://images.pling.com/cache/770x540-4/img/00/00/71/36/84/2136524/max11.png + https://files06.pling.com/api/files/download/j/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTczNDgxMzM3MCwibyI6IjEiLCJzIjoiOWI5OTJkMTFkNTMyYmMxODZlM2UxYTcxMGUzYWM1YjEyMjUzNTJhOWJhODhlZmI5MmM4OWI0NDljOTVhZDI3YmY4ZGFhOTU2OGJhZjI3YzA0YTJmZjljYzJmZDRmNDdmMzQzOTM3YzNlMDdmNTgyODk0YzJjNTQ0MTU5MDgxNDkiLCJ0IjoxNzQ4NjU0MTg2LCJzdGZwIjpudWxsLCJzdGlwIjoiODcuMTMzLjI4LjI1NSJ9.WwQ1rSrdg_ghrfdVyRNV49KjFXgwseIdVVsL0KHzEn0/truely-maximized-1.2.0.kwinscript + linux,gplv3,original-product,unix + installed + + + KWin dynamic workspaces + api.kde-look.org + d86leader + https://store.kde.org/p/1312691 + + 3.2 + 75 + 13985 + /home/someone/.local/share/kwin/scripts/dynamic_workspaces/ + 1312691 + 2025-04-13 + <p>A kwin script that creates and deletes desktops as you move windows on the last one.</p> + +<p>I intented to replicate some of gnome-desktop's behavior with moving windows around. +As this is a simple script for satisfying my needs, it only workds horizontally left-toright. +The behaviour is following:</p> + +<ul> +<li>There is always an empty desktop on the right</li> +<li>When you move a window to that desktop, a new desktop is created</li> +<li>When you move window away from last desktop, or close the window, +the desktop is destroyed</li> +</ul> + +<p>If you encounter problems, file an issue at my github repo: https://github.com/d86leader/dynamic<em>workspaces +If you don't encounter problems, file a star on my github repo: https://github.com/d86leader/dynamic</em>workspaces , why don't ya.</p> + + + https://images.pling.com/cache/100x100-4/img/00/00/53/85/99/1312691/f3197437783b57b5ca24861dc05d50a390d1.png + https://images.pling.com/cache/770x540-4/img/00/00/53/85/99/1312691/f3197437783b57b5ca24861dc05d50a390d1.png + https://files06.pling.com/api/files/download/j/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTc0NDU1MjEyMCwibyI6IjEiLCJzIjoiZDMxYmU5ZjhiZDM5YmJmZjk0YjhkYmNiNzg3NWZlZGE4MDgzMzk1MDM5MjJmMjljYTk2NzYxYjJlZTM1OTFlYjJhY2I4N2YxM2ExMTQ3Njc3YmM4ZjFjZjQwNjY0YjBkZDU1NmE1YzQ0MjdjYzBiZmNjNmEzNWFkMGMwNjkwNmUiLCJ0IjoxNzQ4NjUzOTY0LCJzdGZwIjpudWxsLCJzdGlwIjoiODcuMTMzLjI4LjI1NSJ9.GCOII9YmPyFcft3GeHLiwZX6PAr8bDzAoZ7tc94_deg/dynamic-workspaces.tar.gz + bsd-license,linux,original-product,unix + installed + + diff --git a/eggs/kde_locals/knewstuff3/plasmoids.knsregistry b/eggs/kde_locals/knewstuff3/plasmoids.knsregistry new file mode 100644 index 0000000..933b3d0 --- /dev/null +++ b/eggs/kde_locals/knewstuff3/plasmoids.knsregistry @@ -0,0 +1,27 @@ + + + + + Application Title Bar + api.kde-look.org + antroids + https://store.kde.org/p/2135509 + + 0.8.5 + 83 + 14232 + /home/someone/.local/share/plasma/plasmoids/com.github.antroids.application-title-bar/ + 2135509 + 2025-04-22 + <p>Widget with window title and control buttons.</p> + +<p>In cases of panel freezes or crashes: https://github.com/antroids/application-title-bar?tab=readme-ov-file#-in-cases-of-panel-freezes-or-crashes-</p> + + + https://images.pling.com/cache/100x100-4/img/00/00/77/08/97/2135509/logonew.png + https://images.pling.com/cache/770x540-4/img/00/00/77/08/97/2135509/logonew.png + https://files06.pling.com/api/files/download/j/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTc0NTM0MDAyMSwibyI6IjEiLCJzIjoiZDUyZjhlNWMyMGI1MjIyM2Y4YmY0ZWVjZWFhZjRmYTE2NzdkYjUwZTgzMjAxYjA3ZmQ0MDVjYWEyOGZkMzM0MTExYzU4N2FlYWIzYzBhYmZhNjIzYzFmMzRkZDA3Njc0OWIwZDgxOTI2ZWFmODcyZDk5Nzg2Y2U4OWI0OWQ5ZTIiLCJ0IjoxNzQ4NjUzNzExLCJzdGZwIjpudWxsLCJzdGlwIjoiODcuMTMzLjI4LjI1NSJ9.F-19BHqFtfzt8DACcj6Ryw4qThwrl8FFYGsTbkdxH0g/application-title-bar-0-8-5.plasmoid + unix,original-product,plasma,plasma##majorversion=6,plasmoid,notitlebar,widget,window,linux,kde,kde-plasma,extension,gplv3,buttons + installed + + diff --git a/eggs/kde_locals/knewstuff3/xcursor.knsregistry b/eggs/kde_locals/knewstuff3/xcursor.knsregistry new file mode 100644 index 0000000..01b71aa --- /dev/null +++ b/eggs/kde_locals/knewstuff3/xcursor.knsregistry @@ -0,0 +1,31 @@ + + + + + Catppuccin Frappe Cursors + api.kde-look.org + catppuccin + https://store.kde.org/p/2135233 + + v1.0.1 + 50 + 3435 + /home/someone/.icons/catppuccin-frappe-blue-cursors/* + 2135233 + 2024-10-30 + <p>----- Cursors for Catppuccin's Frappe -----</p> + +<p>Catppuccin is a community-driven pastel theme that aims to be a middle ground between low and high contrast themes. It consists of 4 soothing warm palettes with 26 eye-candy colours each, perfect for coding, designing, and much more! Here are our cursors, available in 16 different variants. Hope you enjoy!</p> + +<p>This project is a modification of <a href="https://github.com/varlesh/volantes-cursors">Volantes Cursors</a> with the Catppuccin palettes.</p> + +<p>Any issues can be reported here: https://github.com/catppuccin/cursors/issues</p> + + + https://images.pling.com/cache/100x100-4/img/00/00/68/35/48/2135233/cursors-frappe.png + https://images.pling.com/cache/770x540-4/img/00/00/68/35/48/2135233/cursors-frappe.png + https://files06.pling.com/api/files/download/j/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTczMDMyNjI3MSwibyI6IjEiLCJzIjoiZDBkYjUwZTNhZDMyMTAyYTllYWNiODhmNWJhZmQ0YmZkMjVhOGJhY2ZlZWU0NWVmMGJhMTQ5OTVjMjQxNmZjNDJiZTExNWEwYzcwOWNmYTBkOGRjNTY0ZTc4ZjQ3MGYxOWMzZDQ1YzZkNjNkOTdjMjgwNmY1M2EzZWIxMGZjNzgiLCJ0IjoxNzQ4NjU3ODcxLCJzdGZwIjpudWxsLCJzdGlwIjoiODcuMTMzLjI4LjI1NSJ9.58rIdEk1uMPxpCYRHuRPEFJaTFSVCt1sj4dirdUbQ9Q/catppuccin-frappe-blue-cursors.zip + linux,catppuccin,cursor,cursors,efi,gplv2,pastel,unix + installed + + diff --git a/eggs/kde_locals/konsole/Cat.profile b/eggs/kde_locals/konsole/Cat.profile new file mode 100644 index 0000000..68179c8 --- /dev/null +++ b/eggs/kde_locals/konsole/Cat.profile @@ -0,0 +1,6 @@ +[Appearance] +ColorScheme=Catppuccin-Frappe + +[General] +Name=Cat +Parent=FALLBACK/ diff --git a/eggs/kde_locals/konsole/Catppuccin-Frappe.colorscheme b/eggs/kde_locals/konsole/Catppuccin-Frappe.colorscheme new file mode 100644 index 0000000..1a7d3a9 --- /dev/null +++ b/eggs/kde_locals/konsole/Catppuccin-Frappe.colorscheme @@ -0,0 +1,96 @@ +[Background] +Color=48,52,70 + +[BackgroundFaint] +Color=48,52,70 + +[BackgroundIntense] +Color=48,52,70 + +[Color0] +Color=115,121,148 + +[Color0Faint] +Color=115,121,148 + +[Color0Intense] +Color=115,121,148 + +[Color1] +Color=231,130,132 + +[Color1Faint] +Color=231,130,132 + +[Color1Intense] +Color=231,130,132 + +[Color2] +Color=166,209,137 + +[Color2Faint] +Color=166,209,137 + +[Color2Intense] +Color=166,209,137 + +[Color3] +Color=229,200,144 + +[Color3Faint] +Color=229,200,144 + +[Color3Intense] +Color=229,200,144 + +[Color4] +Color=140,170,238 + +[Color4Faint] +Color=140,170,238 + +[Color4Intense] +Color=140,170,238 + +[Color5] +Color=202,158,230 + +[Color5Faint] +Color=202,158,230 + +[Color5Intense] +Color=202,158,230 + +[Color6] +Color=153,209,219 + +[Color6Faint] +Color=153,209,219 + +[Color6Intense] +Color=153,209,219 + +[Color7] +Color=198,208,245 + +[Color7Faint] +Color=198,208,245 + +[Color7Intense] +Color=198,208,245 + +[Foreground] +Color=198,208,245 + +[ForegroundFaint] +Color=198,208,245 + +[ForegroundIntense] +Color=198,208,245 + +[General] +Blur=false +ColorRandomization=false +Description=Catppuccin Frappé +Opacity=1 +Wallpaper= diff --git a/eggs/kde_locals/krunnerstaterc b/eggs/kde_locals/krunnerstaterc new file mode 100644 index 0000000..a6eb0ed --- /dev/null +++ b/eggs/kde_locals/krunnerstaterc @@ -0,0 +1,5 @@ +[PlasmaRunnerManager] +LaunchCounts=4 exec:///run/current-system/sw/bin/code,1 exec:///run/current-system/sw/bin/rnote,2 exec:///run/current-system/sw/bin/dolphin,8 exec:///run/current-system/sw/bin/konsole,5 exec:///run/current-system/sw/bin/virt-manager,1 exec:///run/current-system/sw/bin/nextcloud,7 exec:///run/current-system/sw/bin/librewolf --name librewolf,1 krunner_systemsettings_kcm_workspace,5 exec:///run/current-system/sw/bin/systemsettings,1 exec:///run/current-system/sw/bin/gimp-3.0 + +[PlasmaRunnerManager][History] +e33200df-9983-40fd-8947-71417c6b518e=li,code,ko,sett,k,lib,rno,nex,ne,virt,set,dol,plas,gim,rn diff --git a/eggs/kde_locals/kwalletd/kdewallet.kwl b/eggs/kde_locals/kwalletd/kdewallet.kwl new file mode 100644 index 0000000..17b45e9 Binary files /dev/null and b/eggs/kde_locals/kwalletd/kdewallet.kwl differ diff --git a/eggs/kde_locals/kwalletd/kdewallet.salt b/eggs/kde_locals/kwalletd/kdewallet.salt new file mode 100644 index 0000000..4177045 Binary files /dev/null and b/eggs/kde_locals/kwalletd/kdewallet.salt differ diff --git a/eggs/kde_locals/kwalletd/kdewallet_attributes.json b/eggs/kde_locals/kwalletd/kdewallet_attributes.json new file mode 100644 index 0000000..89dd93e --- /dev/null +++ b/eggs/kde_locals/kwalletd/kdewallet_attributes.json @@ -0,0 +1,37 @@ +{ + "$fdo_created": "1748649994", + "$fdo_modified": "1748704742", + "Chromium Keys/Chromium Safe Storage": { + "$fdo_created": "1748704742", + "$fdo_mime_type": "text/plain", + "$fdo_modified": "1748704742", + "attributes": { + "server": "Chromium Keys", + "type": "plaintext", + "user": "Chromium Safe Storage", + "xdg:schema": "org.qt.keychain" + } + }, + "Network Management/{c516568c-5866-4a45-8972-61d7a14c3b87};802-11-wireless-security": { + "$fdo_created": "1748654444", + "$fdo_mime_type": "text/plain", + "$fdo_modified": "1748654444", + "attributes": { + "server": "Network Management", + "type": "map", + "user": "{c516568c-5866-4a45-8972-61d7a14c3b87};802-11-wireless-security", + "xdg:schema": "org.qt.keychain" + } + }, + "Network Management/{c7feb8ed-6e5d-4bab-a630-502c5da75888};802-11-wireless-security": { + "$fdo_created": "1748654427", + "$fdo_mime_type": "text/plain", + "$fdo_modified": "1748654427", + "attributes": { + "server": "Network Management", + "type": "map", + "user": "{c7feb8ed-6e5d-4bab-a630-502c5da75888};802-11-wireless-security", + "xdg:schema": "org.qt.keychain" + } + } +} diff --git a/eggs/kde_locals/kwin/scripts/dynamic_workspaces/LICENSE b/eggs/kde_locals/kwin/scripts/dynamic_workspaces/LICENSE new file mode 100644 index 0000000..06fccbc --- /dev/null +++ b/eggs/kde_locals/kwin/scripts/dynamic_workspaces/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2019, Nikita Sorokovikov +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/eggs/kde_locals/kwin/scripts/dynamic_workspaces/README.md b/eggs/kde_locals/kwin/scripts/dynamic_workspaces/README.md new file mode 100644 index 0000000..e1d1dd6 --- /dev/null +++ b/eggs/kde_locals/kwin/scripts/dynamic_workspaces/README.md @@ -0,0 +1,51 @@ +# Dynamic Workspaces + +A kwin script that creates and deletes desktops as you move windows on the last one. + +I intented to replicate some of gnome-desktop's behavior with moving windows around. +As this is a simple script for satisfying my needs, +it only workds horizontally left-toright. +What I did is this: + +- There is always an empty desktop on the right +- When you move a window to that desktop, a new desktop is created +- When you move window away from last desktop, or close the window, + the desktop is destroyed + +Version 3.1 tested on Plasma versions from 5.27 to 6.2.5. For versions tested +since 5.6, see releases `1.*`, latest found +[here](https://github.com/d86leader/dynamic_workspaces/releases/tag/v1.0.1) + +## Installation + +On plasma 6: + +``` bash +git clone https://github.com/d86leader/dynamic_workspaces.git +cd dynamic_workspaces +kpackagetool6 --type KWin/Script --install . +``` + +On plasma 5, instead of the last line: + +```sh +plasmapkg2 --type kwinscript -i . +``` + +Then you might need to restart kwin. Do this by either logging out and back in, or by running `kwin_wayland --replace` in krunner. + +### Upgrade + +If updating, change the `plasmapkg2`/`kpackagetool6` command above to the following: + +``` bash +# plasma 6 +kpackagetool6 --type KWin/Script --upgrade . +# plasma 5 +plasmapkg2 --type kwinscript -u . +``` + +## Known issues + +This script doesn't live well with other scripts that create workspaces. +Mix at your own risk! diff --git a/eggs/kde_locals/kwin/scripts/dynamic_workspaces/contents/code/main.js b/eggs/kde_locals/kwin/scripts/dynamic_workspaces/contents/code/main.js new file mode 100644 index 0000000..44c5877 --- /dev/null +++ b/eggs/kde_locals/kwin/scripts/dynamic_workspaces/contents/code/main.js @@ -0,0 +1,310 @@ +// This scripts relies on two things: +// 1. `workspace.desktops` and `client.desktops` giving me desktops in the same +// order as in pager and all context menus +// 2. Desktops being comparable for equality with `==` operator + +// Desktop numbers are from zero (unlike how it worked in plasma 5) + + +const MIN_DESKTOPS = 2; +const LOG_LEVEL = 2; // 0 trace, 1 debug, 2 info + + +function log(...args) { print("[dynamic_workspaces] ", ...args); } +function debug(...args) { if (LOG_LEVEL <= 1) log(...args); } +function trace(...args) { if (LOG_LEVEL <= 0) log(...args); } + + +// In plasma 6 simply removing a desktop breaks the desktop switching +// animation. We use a workaround with emitting more switches at the right time +// to force the animation to play +let animationFixup = false; + + +/***** Plasma 5/6 differences *****/ + + +const isKde6 = typeof workspace.windowList === "function"; +const compat = isKde6 + ? + { addDesktop = () => + { workspace.createDesktop(workspace.desktops.length, undefined); } + , windowAddedSignal = ws => ws.windowAdded + , windowList = ws => ws.windowList() + , desktopChangedSignal = c => c.desktopsChanged + + , toDesktop = d => d + , workspaceDesktops = () => workspace.desktops + , lastDesktop = () => workspace.desktops[workspace.desktops.length - 1] + , deleteLastDesktop = () => + { + try + { + animationFixup = true; + + const last = workspace.desktops[workspace.desktops.length - 1]; + // replay the animation by switching again + const current = workspace.currentDesktop; + const index = workspace.desktops.indexOf(current); + // in any weird corner case switch to current desktop + const target = index + 1 < workspace.desktops.length || index === -1 + ? workspace.desktops[index + 1] + : current; + + workspace.currentDesktop = target; + workspace.removeDesktop(last); + workspace.currentDesktop = current; + } + finally + { + animationFixup = false; + } + } + , findDesktop = (ds, d) => ds.indexOf(d) + + , clientDesktops = c => c.desktops + , setClientDesktops = (c, ds) => + { + c.desktops = ds; + } + , clientOnDesktop = (c, d) => c.desktops.indexOf(d) !== -1 + } + : + { addDesktop = () => + { workspace.createDesktop(workspace.desktops, "dyndesk"); } + , windowAddedSignal = ws => ws.clientAdded + , windowList = ws => ws.clientList() + , desktopChangedSignal = c => c.desktopChanged + + // emulate plasma 6 behaviour with custom types + , toDesktop = number => {{ index: number - 1 }} + , workspaceDesktops = () => + { + let r = []; + for (let i = 0; i < workspace.desktops; ++i) + { + const desktop = + { index: i + }; + r.push(desktop); + } + return r; + } + , lastDesktop = () => {{ index: workspace.desktops - 1 }} + , deleteLastDesktop = () => + { workspace.removeDesktop(workspace.desktops - 1); } + , findDesktop = (ds, d) => + { + for (let i = 0; i < ds.length; ++i) + { + if (ds[i].index === d.index) + { + return i; + } + } + return -1; + } + + , clientDesktops = c => + c + .x11DesktopIds + .map(id => {return {index: id - 1}}) + , setClientDesktops = (c, ds) => + { + // Plasma 5 is supports window on multiple desktops, and there + // are even functions for it in the API, but they are bugged. + // So we have to do this. So far, noone has complained, so + // maybe noone uses this feature? + c.desktop = ds[0]; + } + , clientOnDesktop = (c, d) => c.desktop === d.index + 1 + }; + + +/***** Logic definition *****/ + + +// shifts a window to the left if it's more to the right than number +function shiftRighterThan(client, number) +{ + trace(`shiftRighterThan(${client.caption}, ${number})`); + if (number === 0) return; + // Build a new array by comparing old client desktops with all available + // desktops + const allDesktops = compat.workspaceDesktops(); + const clientDesktops = compat.clientDesktops(client); + let newDesktops = []; + // we assume the desktop in both lists are sorted + + let i = 0; + for (const d of clientDesktops) + { + // page through all desktops until we find the current one + while (d != allDesktops[i]) + { + i += 1; + if (i > allDesktops.length) throw new Error("Did the behaviour of equality change?"); + }; + // push either current, or the one before it + if (i < number || i === 0) + { + newDesktops.push(d); + } + else + { + newDesktops.push(allDesktops[i - 1]); + } + } + + compat.setClientDesktops(client, newDesktops); +} + +/** + * Delete a desktop by index + * + * @returns true if desktop was deleted, false if wasn't + */ +function removeDesktop(number) +{ + trace(`removeDesktop(${number})`); + + const desktopsLength = compat.workspaceDesktops().length; + if (desktopsLength - 1 <= number) + { + debug("Not removing desktop at end"); + return false; + } + if (desktopsLength <= MIN_DESKTOPS) + { + debug("Not removing desktop, too few left"); + return false; + } + + // plasma6 allows us to delete desktops in the middle. Unfortunately, this + // messes up pager, so we have to do what we did un plasma5 and shift all + // windows by hand to delete the last desktop + compat.windowList(workspace).forEach((client) => + { + shiftRighterThan(client, number) + }); + compat.deleteLastDesktop(); + debug("Desktop removed"); + return true; +} + +// tells if desktop has no windows of its own +function isEmptyDesktop(number) +{ + trace(`isEmptyDesktop(${number})`) + const desktop = compat.workspaceDesktops()[number]; + const cls = compat.windowList(workspace); + for (client of cls) + { + if (compat.clientOnDesktop(client, desktop) + && !client.skipPager // ignore hidden windows + && !client.onAllDesktops // ignore windows on all desktops + ) { + debug(`Desktop ${number} not empty because ${client.caption} is there`); + return false; + } + } + + return true; +} + +/** + * Checks for new created or moved windows if they are occupying the last desktop + * -> if yes, create new one to the right + */ +function onDesktopChangedFor(client) +{ + trace(`onDesktopChangedFor(${client.caption})`); + + const lastDesktops = compat.lastDesktop(); + if (compat.clientOnDesktop(client, lastDesktops)) + { + compat.addDesktop(); + } +} + +/** + * When creating new windows, check whether they are occupying the last desktop + */ +function onClientAdded(client) +{ + if (client === null) + { + log("onClientAdded(null) - that may happen rarely"); + return; + } + trace(`onClientAdded(${client.caption})`); + + if (client.skipPager) + { + debug("Ignoring added hidden window"); + return; + } + + // add a new desktop for a client too right + if (compat.clientOnDesktop(client, compat.lastDesktop())) + { + compat.addDesktop(); + } + + // subscribe the client to create desktops when desktop switched + compat.desktopChangedSignal(client).connect(() => { onDesktopChangedFor(client); }); +} + +/** + * Deletes empty desktops to the right in case of a left switch + */ +function onDesktopSwitch(oldDesktop) +{ + trace(`onDesktopSwitch(${oldDesktop})`); + + if (animationFixup) return; + + const allDesktops = compat.workspaceDesktops(); + const oldDesktopIndex = compat.findDesktop(allDesktops, compat.toDesktop(oldDesktop)); + const currentDesktopIndex = compat.findDesktop(allDesktops, compat.toDesktop(workspace.currentDesktop)); + const getDesktopsLength = () => compat.workspaceDesktops().length; + const keepEmptyMiddleDesktops = readConfig("keepEmptyMiddleDesktops", false); + + if (oldDesktopIndex <= currentDesktopIndex) + { + debug("Desktop switched to the right - ignoring"); + return; + } + + // Loop through desktops right-to-left and delete empty ones: + // - Starts from second-to-last desktop (preserving always one empty desktop at the end) + // - Stops before reaching current desktop (preserves what user is viewing) + // - Extra check (desktopIdx > 0) prevents an infinite loop caused by abnormal conditions + // In case of interference with other plugins, we'll only examine as many desktops as we initially detect + for (let desktopIdx = getDesktopsLength() - 2; desktopIdx > currentDesktopIndex && desktopIdx > 0; --desktopIdx) + { + debug(`Examine desktop ${desktopIdx}`); + if (isEmptyDesktop(desktopIdx)) + { + removeDesktop(desktopIdx); + } + else if (keepEmptyMiddleDesktops) + { + debug("Found non-empty desktop, stopping purge"); + break; + } + } +} + + +/***** Main part *****/ + + +// Adding or removing a client might create desktops. +// For all existing clients: +compat.windowList(workspace).forEach(onClientAdded); +// And for all future clients: +compat.windowAddedSignal(workspace).connect(onClientAdded); + +// Switching desktops might remove desktops +workspace.currentDesktopChanged.connect(onDesktopSwitch); diff --git a/eggs/kde_locals/kwin/scripts/dynamic_workspaces/contents/config/main.xml b/eggs/kde_locals/kwin/scripts/dynamic_workspaces/contents/config/main.xml new file mode 100644 index 0000000..6adec06 --- /dev/null +++ b/eggs/kde_locals/kwin/scripts/dynamic_workspaces/contents/config/main.xml @@ -0,0 +1,14 @@ + + + + + + + false + + + + \ No newline at end of file diff --git a/eggs/kde_locals/kwin/scripts/dynamic_workspaces/contents/ui/config.ui b/eggs/kde_locals/kwin/scripts/dynamic_workspaces/contents/ui/config.ui new file mode 100644 index 0000000..e586aa9 --- /dev/null +++ b/eggs/kde_locals/kwin/scripts/dynamic_workspaces/contents/ui/config.ui @@ -0,0 +1,27 @@ + + + KWin::DynamicWorkspacesConfigForm + + + + 0 + 0 + 200 + 100 + + + + Dynamic Workspaces + + + + + + Keep empty desktops between occupied ones + + + + + + + \ No newline at end of file diff --git a/eggs/kde_locals/kwin/scripts/dynamic_workspaces/metadata.json b/eggs/kde_locals/kwin/scripts/dynamic_workspaces/metadata.json new file mode 100644 index 0000000..b5ff8e3 --- /dev/null +++ b/eggs/kde_locals/kwin/scripts/dynamic_workspaces/metadata.json @@ -0,0 +1,23 @@ +{ "KPackageStructure": "KWin/Script" +, "KPlugin": + { "Authors": + [ { "Email": "opendesktop@morj.men" + , "Name": "morj" + } + ] + , "Description": "Automatically adds and removes workspaces when windows move to empty ones" + , "Icon": "preferences-system-windows-script-test" + , "Id": "dynamic_workspaces" + , "License": "BSD" + , "Name": "Dynamic Workspaces" + , "Version": "3.2.0" + } +, "X-KDE-PluginKeyword": "workspaces" + +, "X-Plasma-API": "javascript" +, "X-Plasma-API-Minimum-Version": "6.0" + +, "X-KDE-Library": "kwin/effects/configs/kcm_kwin4_genericscripted" +, "X-Plasma-MainScript": "code/main.js" +, "X-KDE-ConfigModule": "kwin/effects/configs/kcm_kwin4_genericscripted" +} diff --git a/eggs/kde_locals/kwin/scripts/truely-maximized/LICENSE b/eggs/kde_locals/kwin/scripts/truely-maximized/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/eggs/kde_locals/kwin/scripts/truely-maximized/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/eggs/kde_locals/kwin/scripts/truely-maximized/contents/code/main.js b/eggs/kde_locals/kwin/scripts/truely-maximized/contents/code/main.js new file mode 100644 index 0000000..ebe31af --- /dev/null +++ b/eggs/kde_locals/kwin/scripts/truely-maximized/contents/code/main.js @@ -0,0 +1,100 @@ +// utils +var shouldHideTiled = false; + +function shouldHideTitle(window) { + if (shouldHideTiled && window.tile !== null) { + return true; + } + var area = workspace.clientArea(KWin.MaximizeArea, window); + return window.width >= area.width && window.height >= area.height; +} + +// management code +var blacklist = []; // initialized in init() +const managed = []; + +function tryManage(window) { + if (blacklist.includes(window.resourceClass)) { + return; + } + if (window.noBorder) { + return; // if the border is already disabled, something else is managing it - don't mess with that + } + managed.push(window.internalId); +} +function isManaged(window) { + return managed.includes(window.internalId); +} + +// listeners +function windowAdded(window) { + tryManage(window); + if (isManaged(window)) { + if (shouldHideTitle(window)) { + window.noBorder = true; + } + function statusChanged() { + window.noBorder = shouldHideTitle(window); + } + // always connect all signals even if the related option is disabled + // to support config hot reloading if KWin supports that + window.maximizedChanged.connect(statusChanged); + window.tileChanged.connect(statusChanged); + } +} +workspace.windowAdded.connect(windowAdded); + +workspace.windowRemoved.connect((window) => { + if (isManaged(window)) { + managed.splice(managed.indexOf(window.internalId), 1); + } +}); + +var lastScreenEdge = 0; +function screenEdgeActivated() { + if (Date.now() - lastScreenEdge < 200) { + // a bug in kwin sometimes causes a double trigger, so we enforce a 200ms cooldown + return; + } + for (window of workspace.windowList()) { + if (window.active) { + if (isManaged(window) && shouldHideTitle(window)) { + window.noBorder = !window.noBorder; + lastScreenEdge = Date.now(); + } + return; + } + } +} + +// magic code to register a screen edge listener that the user can then configure in screen edges settings +// it's just done this way, there isn't really an explanation in the docs +var registeredBorders = []; +function initScreenEdges() { + for (var i in registeredBorders) { + unregisterScreenEdge(registeredBorders[i]); + } + registeredBorders = []; + var borders = readConfig("BorderActivate", "").toString().split(","); + for (var i in borders) { + var border = parseInt(borders[i]); + if (isFinite(border)) { + registeredBorders.push(border); + registerScreenEdge(border, screenEdgeActivated); + } + } +} + +// init +function init() { + blacklist = readConfig("blacklist", "yakuake").split(",").filter((name) => name.length != 0); + shouldHideTiled = readConfig("shouldHideTiled", false); + initScreenEdges(); +} +options.configChanged.connect(init); +init(); + +// not part of init() bc it is called when config changed +for (window of workspace.windowList()) { + windowAdded(window); +} diff --git a/eggs/kde_locals/kwin/scripts/truely-maximized/contents/config/main.xml b/eggs/kde_locals/kwin/scripts/truely-maximized/contents/config/main.xml new file mode 100644 index 0000000..49706be --- /dev/null +++ b/eggs/kde_locals/kwin/scripts/truely-maximized/contents/config/main.xml @@ -0,0 +1,12 @@ + + + + + + yakuake + + + false + + + diff --git a/eggs/kde_locals/kwin/scripts/truely-maximized/contents/ui/config.ui b/eggs/kde_locals/kwin/scripts/truely-maximized/contents/ui/config.ui new file mode 100644 index 0000000..8d48957 --- /dev/null +++ b/eggs/kde_locals/kwin/scripts/truely-maximized/contents/ui/config.ui @@ -0,0 +1,71 @@ + + + Form + + + + 0 + 0 + 755 + 142 + + + + + 0 + 142 + + + + Form + + + + + + + 11 + true + + + + Due to a limitation of Kwin, you must disable and re-enable the script for changes to take effect. + + + + + + + Window Class Blacklist (comma-separated) + + + + + + + + + + Qt::Orientation::Horizontal + + + + + + + Optional Features: + + + + + + + Also &hide title bar for tiled windows + + + + + + + + diff --git a/eggs/kde_locals/kwin/scripts/truely-maximized/metadata.json b/eggs/kde_locals/kwin/scripts/truely-maximized/metadata.json new file mode 100644 index 0000000..819664c --- /dev/null +++ b/eggs/kde_locals/kwin/scripts/truely-maximized/metadata.json @@ -0,0 +1,22 @@ +{ + "KPlugin": { + "Name": "Truely Maximized", + "Description": "Truely maximizes your screen space by hiding the title bars of your windows when they are maximized.", + "Icon": "preferences-system-windows", + "Version": "1.2.0", + "Id": "truely-maximized", + "License": "GPLv3", + "Website": "https://github.com/fin444/truely-maximized", + "Authors": [ + { + "Name": "fin444", + "Email": "fin444_dev@proton.me" + } + ] + }, + "X-Plasma-API": "javascript", + "KPackageStructure": "KWin/Script", + "X-Plasma-API-Minimum-Version": "6.0", + "X-KWin-Border-Activate": true, + "X-KDE-ConfigModule": "kwin/effects/configs/kcm_kwin4_genericscripted" +} diff --git a/eggs/kde_locals/libkunitconversion/currency.xml b/eggs/kde_locals/libkunitconversion/currency.xml new file mode 100644 index 0000000..fed8702 --- /dev/null +++ b/eggs/kde_locals/libkunitconversion/currency.xml @@ -0,0 +1,41 @@ + + + Reference rates + + European Central Bank + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/config/config.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/config/config.qml new file mode 100644 index 0000000..a23ba19 --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/config/config.qml @@ -0,0 +1,34 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import QtQuick +import org.kde.plasma.configuration + +ConfigModel { + ConfigCategory { + name: i18n("Appearance") + icon: "preferences-desktop-color" + source: "config/ConfigAppearance.qml" + } + + ConfigCategory { + name: i18n("Behavior") + icon: "preferences-desktop" + source: "config/ConfigBehavior.qml" + } + + ConfigCategory { + name: i18n("Replacements") + icon: "document-replace" + source: "config/TitleReplacements.qml" + } + + ConfigCategory { + name: i18n("Effects") + icon: "special-effects-symbolic" + source: "config/effect/ConfigEffects.qml" + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/config/main.xml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/config/main.xml new file mode 100644 index 0000000..7609eda --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/config/main.xml @@ -0,0 +1,251 @@ + + + + + + + 1 + + + + + + + + + 0 + + + + + + 0 + + + 100 + + + 100 + + + 0 + + + 1 + + + 128 + + + false + + + + + + + + 2 + + + + + + + + 0 + + + windowCloseButton,windowMaximizeButton,windowMinimizeButton,windowIcon,windowTitle + + + + false + + + windowCloseButton,windowMaximizeButton,windowMinimizeButton,windowIcon,windowTitle + + + + + + + + + 2 + + + + 0 + + + 640 + + + 11 + + + + + + + + + 0 + + + true + + + + + + + + + 2 + + + + + + + + + 0 + + + + + + + + 2 + + + false + + + <Unknown> + + + 10 + + + 0 + + + 0 + + + 10 + + + + + + + + + + + 0 + + + true + + + true + + + true + + + false + + + false + + + + true + + + true + + + 10 + + + + true + + + true + + + + Window Move + + + + + + Window Maximize + + + + + + + + + + Window Close + + + + + + + + + + 120 + + + 0 + + + Window Maximize + + + Window Minimize + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/ActiveTasksModel.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/ActiveTasksModel.qml new file mode 100644 index 0000000..6971be4 --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/ActiveTasksModel.qml @@ -0,0 +1,152 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ +import QtQuick +import org.kde.taskmanager as TaskManager + +TaskManager.TasksModel { + id: tasksModel + + enum ActiveTaskSource { + ActiveTask, + LastActiveTask, + LastActiveMaximized + } + + signal activeWindowUpdated + + property ActiveWindow activeWindow + property bool hasActiveWindow: activeTaskIndex.valid + property TaskManager.VirtualDesktopInfo virtualDesktopInfo + property TaskManager.ActivityInfo activityInfo + property Repeater filteredTasksRepeater + property var activeTaskIndex: getInvalidIndex() + property Loader showingDesktopStateListener: Loader { + property bool showingDesktop: false + + source: "KWindowSystemAdapter.qml" + onStatusChanged: function () { + if (status == Loader.Ready) { + showingDesktop = Qt.binding(function () { + return item.showingDesktop; + }); + } else { + showingDesktop = false; + } + } + onShowingDesktopChanged: updateActiveTaskIndex() + } + + function getInvalidIndex() { + return index(-1, -1); + } + + function getFirstRowIndex() { + return index(0, 0); + } + + function updateActiveTaskIndex() { + if (showingDesktopStateListener.showingDesktop) { + activeTaskIndex = getInvalidIndex(); + } else { + switch (plasmoid.configuration.widgetActiveTaskSource) { + case ActiveTasksModel.ActiveTaskSource.ActiveTask: + activeTaskIndex = filterTask(activeTask) ? activeTask : getInvalidIndex(); + break; + case ActiveTasksModel.ActiveTaskSource.LastActiveTask: + case ActiveTasksModel.ActiveTaskSource.LastActiveMaximized: + activeTaskIndex = hasIndex(0, 0) && filterTask(getFirstRowIndex()) ? getFirstRowIndex() : getInvalidIndex(); + break; + } + } + activeWindow.update(); + } + + function filterTask(index) { + if (!index || !index.valid) + return false; + if (plasmoid.configuration.widgetActiveTaskFilterNotMaximized) + return tasksModel.data(index, TaskManager.AbstractTasksModel.IsMaximized) || false; + return true; + } + + screenGeometry: plasmoid.containment.screenGeometry + activity: activityInfo.currentActivity + virtualDesktop: virtualDesktopInfo.currentDesktop + filterByActivity: plasmoid.configuration.widgetActiveTaskFilterByActivity + filterByScreen: plasmoid.configuration.widgetActiveTaskFilterByScreen + filterByVirtualDesktop: plasmoid.configuration.widgetActiveTaskFilterByVirtualDesktop + filterHidden: true + filterMinimized: true + filterNotMaximized: plasmoid.configuration.widgetActiveTaskSource == ActiveTasksModel.ActiveTaskSource.LastActiveMaximized + onDataChanged: function (from, to, roles) { + if (hasActiveWindow && activeTaskIndex >= from && activeTaskIndex <= to) + updateActiveTaskIndex(); + else if (!hasActiveWindow && getFirstRowIndex() >= from && getFirstRowIndex() <= to) + updateActiveTaskIndex(); + } + onActiveTaskChanged: updateActiveTaskIndex() + onCountChanged: updateActiveTaskIndex() + sortMode: TaskManager.TasksModel.SortLastActivated + groupMode: TaskManager.TasksModel.GroupDisabled + Component.onCompleted: updateActiveTaskIndex() + + virtualDesktopInfo: TaskManager.VirtualDesktopInfo {} + + activityInfo: TaskManager.ActivityInfo { + readonly property string nullUuid: "00000000-0000-0000-0000-000000000000" + } + + activeWindow: ActiveWindow { + function update() { + minimizable = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsMinimizable) || false; + maximizable = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsMaximizable) || false; + closable = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsClosable) || false; + movable = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsMovable) || false; + minimized = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsMinimized) || false; + maximized = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsMaximized) || false; + shadeable = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsShadeable) || false; + shaded = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsShaded) || false; + keepAbove = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsKeepAbove) || false; + keepBelow = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsKeepBelow) || false; + hasAppMenu = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.ApplicationMenuServiceName) || false; + onAllVirtualDesktops = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsOnAllVirtualDesktops) || false; + fullScreenable = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsFullScreenable) || false; + fullScreen = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsFullScreen) || false; + resizable = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsResizable) || false; + active = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.IsActive) || false; + appName = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.AppName); + genericAppName = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.GenericAppName); + decoration = tasksModel.data(activeTaskIndex, TaskManager.AbstractTasksModel.Decoration); + icon = tasksModel.data(activeTaskIndex, Qt.DecorationRole); + tasksModel.activeWindowUpdated(); + } + + onActionCall: function (action) { + switch (action) { + case ActiveWindow.Action.Close: + return tasksModel.requestClose(activeTaskIndex); + case ActiveWindow.Action.Minimize: + return tasksModel.requestToggleMinimized(activeTaskIndex); + case ActiveWindow.Action.Maximize: + return tasksModel.requestToggleMaximized(activeTaskIndex); + case ActiveWindow.Action.Move: + return tasksModel.requestMove(activeTaskIndex); + case ActiveWindow.Action.KeepAbove: + return tasksModel.requestToggleKeepAbove(activeTaskIndex); + case ActiveWindow.Action.KeepBelow: + return tasksModel.requestToggleKeepBelow(activeTaskIndex); + case ActiveWindow.Action.Shade: + return tasksModel.requestToggleShaded(activeTaskIndex); + case ActiveWindow.Action.Activate: + return tasksModel.requestActivate(activeTaskIndex); + case ActiveWindow.Action.FullScreen: + return tasksModel.requestToggleFullScreen(activeTaskIndex); + case ActiveWindow.Action.Resize: + return tasksModel.requestResize(activeTaskIndex); + } + } + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/ActiveWindow.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/ActiveWindow.qml new file mode 100644 index 0000000..0f45eee --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/ActiveWindow.qml @@ -0,0 +1,91 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import QtQuick + +QtObject { + id: activeWindow + + enum Action { + Close, + Minimize, + Maximize, + Move, + AllDesktops, + KeepAbove, + KeepBelow, + Shade, + Help, + Menu, + AppMenu, + Activate, + FullScreen, + Resize + } + + property bool minimizable: false + property bool maximizable: false + property bool closable: false + property bool movable: false + property bool minimized: false + property bool maximized: false + property bool shadeable: false + property bool shaded: false + property bool hasAppMenu: false + property bool onAllVirtualDesktops: false + property bool keepAbove: false + property bool keepBelow: false + property bool fullScreenable: false + property bool fullScreen: false + property bool resizable: false + property bool active: false + property var appName + property var genericAppName + property var decoration + property var icon + + signal actionCall(int action) + + function actionSupported(action) { + switch (action) { + case ActiveWindow.Action.Close: + return closable; + case ActiveWindow.Action.Minimize: + return minimizable; + case ActiveWindow.Action.Maximize: + return maximizable; + case ActiveWindow.Action.Move: + return movable; + case ActiveWindow.Action.Shade: + return shadeable; + case ActiveWindow.Action.AppMenu: + return hasAppMenu; + case ActiveWindow.Action.Fullscreen: + return fullScreenable; + case ActiveWindow.Action.Resize: + return resizable; + default: + return true; + } + } + + function buttonChecked(windowControlButtonType) { + switch (windowControlButtonType) { + case WindowControlButton.Type.MinimizeButton: + return minimized; + case WindowControlButton.Type.MaximizeButton: + return maximized; + case WindowControlButton.Type.KeepAboveButton: + return keepAbove; + case WindowControlButton.Type.KeepBelowButton: + return keepBelow; + case WindowControlButton.Type.ShadeButton: + return shaded; + default: + return false; + } + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/ConfigManager.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/ConfigManager.qml new file mode 100644 index 0000000..153eacc --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/ConfigManager.qml @@ -0,0 +1,118 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import QtQuick +import QtCore +import QtQuick.Dialogs + +Loader { + id: settingsLoader + + active: false + + property string name + property date dateCreated + property string settingsJson + property url location + property bool writeMode: true + + signal configSaved(url fileUrl) + signal configLoaded(url fileUrl, var settings) + + property var configExportFileDialog: FileDialog { + nameFilters: ["Configuration (*.cfg)"] + defaultSuffix: "cfg" + fileMode: FileDialog.SaveFile + onAccepted: savePlasmoidConfig(selectedFile) + } + + property var configImportFileDialog: FileDialog { + nameFilters: ["Configuration (*.cfg)"] + defaultSuffix: "cfg" + fileMode: FileDialog.OpenFile + onAccepted: loadPlasmoidConfig(selectedFile) + } + + sourceComponent: Settings { + location: settingsLoader.location + property int version: 0 + property string name + property date dateCreated + property string settingsJson + } + + onLoaded: function () { + if (writeMode) { + item.name = name; + item.dateCreated = new Date(); + item.settingsJson = settingsJson; + configSaved(item.location); + } else { + name = item.value("name", ""); + dateCreated = item.value("dateCreated", new Date()); + settingsJson = item.value("settingsJson", "{}"); + configLoaded(item.location, JSON.parse(settingsJson)); + } + active = false; + } + + function showConfigExportFileDialog() { + configExportFileDialog.open(); + } + + function showConfigImportFileDialog() { + configImportFileDialog.open(); + } + + function saveSettings(name, settings, fileUrl) { + name = name; + settingsJson = JSON.stringify(settings); + location = fileUrl; + writeMode = true; + active = true; + } + + function loadSettings(fileUrl) { + location = fileUrl; + writeMode = false; + active = true; + } + + function getPlasmoidConfig() { + let configMap = {}; + const config = plasmoid.configuration; + const propertyNames = config.keys(); + for (let index = 0; index < propertyNames.length; index++) { + const propertyName = propertyNames[index]; + const propertyValue = config[propertyName]; + configMap[propertyName] = propertyValue; + } + return configMap; + } + + function savePlasmoidConfig(fileUrl) { + const config = getPlasmoidConfig(); + saveSettings("Application Title Bar Configuration", config, fileUrl); + } + + function loadPlasmoidConfig(fileUrl) { + const loadedConfig = loadSettings(fileUrl); + } + + function updatePlasmoidConfig(loadedConfig) { + let plasmoidConfig = plasmoid.configuration; + for (const propertyName in loadedConfig) { + let loadedValue = loadedConfig[propertyName]; + let loadedValueString = JSON.stringify(loadedValue); + let plasmoidValue = plasmoidConfig[propertyName]; + let plasmoidValueString = JSON.stringify(plasmoidValue); + if (loadedValueString !== plasmoidValueString && !plasmoidConfig.isImmutable(propertyName)) { + //console.log("Diff in " + propertyName + " : '" + plasmoidConfig[propertyName] + "' !== '" + loadedValue + "'"); + plasmoidConfig[propertyName] = loadedValue; + } + } + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/ContextualActions.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/ContextualActions.qml new file mode 100644 index 0000000..ea313ca --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/ContextualActions.qml @@ -0,0 +1,93 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import QtQuick +import QtCore +import QtQuick.Dialogs +import QtQuick.Controls +import org.kde.plasma.core as PlasmaCore +import org.kde.plasma.plasmoid + +QtObject { + property Item configManager: ConfigManager { + onConfigLoaded: function (fileUrl, loadedConfig) { + updatePlasmoidConfig(loadedConfig); + } + } + + Plasmoid.contextualActions: [ + PlasmaCore.Action { + text: i18n("Ma&ximize") + enabled: tasksModel.activeWindow.maximizable + checked: tasksModel.activeWindow.maximized + icon.name: "window-maximize" + checkable: true + onTriggered: tasksModel.activeWindow.actionCall(ActiveWindow.Action.Maximize) + }, + PlasmaCore.Action { + text: i18n("Mi&nimize") + enabled: tasksModel.activeWindow.minimizable + icon.name: "window-minimize" + checkable: false + onTriggered: tasksModel.activeWindow.actionCall(ActiveWindow.Action.Minimize) + }, + PlasmaCore.Action { + text: i18n("Keep &Above Others") + checked: tasksModel.activeWindow.keepAbove + icon.name: "window-keep-above" + checkable: true + onTriggered: tasksModel.activeWindow.actionCall(ActiveWindow.Action.KeepAbove) + }, + PlasmaCore.Action { + text: i18n("Keep &Below Others") + checked: tasksModel.activeWindow.keepBelow + icon.name: "window-keep-below" + checkable: true + onTriggered: tasksModel.activeWindow.actionCall(ActiveWindow.Action.KeepBelow) + }, + PlasmaCore.Action { + text: i18n("&Fullscreen") + enabled: tasksModel.activeWindow.fullScreenable + checked: tasksModel.activeWindow.fullScreen + icon.name: "view-fullscreen" + checkable: true + onTriggered: tasksModel.activeWindow.actionCall(ActiveWindow.Action.FullScreen) + }, + PlasmaCore.Action { + text: i18n("&Move") + icon.name: "transform-move" + enabled: tasksModel.activeTask.movable + checkable: false + onTriggered: tasksModel.activeWindow.actionCall(ActiveWindow.Action.Move) + }, + PlasmaCore.Action { + text: i18n("&Resize") + icon.name: "image-resize-symbolic" + enabled: tasksModel.activeTask.resizable + checkable: false + onTriggered: tasksModel.activeWindow.actionCall(ActiveWindow.Action.Resize) + }, + PlasmaCore.Action { + text: i18n("&Close") + icon.name: "window-close" + enabled: tasksModel.activeTask.closable + checkable: false + onTriggered: tasksModel.activeWindow.actionCall(ActiveWindow.Action.Close) + }, + PlasmaCore.Action { + text: i18n("&Export configuration...") + icon.name: "document-export" + checkable: false + onTriggered: configManager.showConfigExportFileDialog() + }, + PlasmaCore.Action { + text: i18n("&Import configuration...") + icon.name: "document-import" + checkable: false + onTriggered: configManager.showConfigImportFileDialog() + } + ] +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/ExecutableDataSource.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/ExecutableDataSource.qml new file mode 100644 index 0000000..26326fc --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/ExecutableDataSource.qml @@ -0,0 +1,29 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ +import org.kde.plasma.plasma5support as P5Support + +// Replace by QML plugin when it will be available: https://invent.kde.org/plasma/plasma-workspace/-/issues/54 +P5Support.DataSource { + id: executable + + signal exited(string cmd, int exitCode, int exitStatus, string stdout, string stderr) + + function exec(cmd) { + if (cmd) + connectSource(cmd); + } + + engine: "executable" + connectedSources: [] + onNewData: function (sourceName, data) { + var exitCode = data["exit code"]; + var exitStatus = data["exit status"]; + var stdout = data["stdout"]; + var stderr = data["stderr"]; + exited(sourceName, exitCode, exitStatus, stdout, stderr); + disconnectSource(sourceName); + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/KWinConfig.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/KWinConfig.qml new file mode 100644 index 0000000..7a6fd8e --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/KWinConfig.qml @@ -0,0 +1,222 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ +import "../" +import Qt.labs.folderlistmodel +import QtCore +import QtQuick + +Item { + id: kWinConfig + + readonly property string auroraeThemesPath: "aurorae/themes/" + property string setBorderlessMaximizedWindowsCommand: kwriteconfigCommandName !== "" ? kwriteconfigCommandName + " --file kwinrc --group Windows --key BorderlessMaximizedWindows " : "" + property string getBorderlessMaximizedWindowsCommand: kreadconfigCommandName !== "" ? kreadconfigCommandName + " --file kwinrc --group Windows --key BorderlessMaximizedWindows --default false" : "" + property string reconfigureCommand: qdbusCommandName !== "" ? qdbusCommandName + " org.kde.KWin /KWin reconfigure" : "" + property string getAllKWinShortcutNamesCommand: qdbusCommandName !== "" ? qdbusCommandName + " org.kde.kglobalaccel /component/kwin org.kde.kglobalaccel.Component.shortcutNames" : "" + property string invokeKWinShortcutCommand: qdbusCommandName !== "" ? qdbusCommandName + " org.kde.kglobalaccel /component/kwin org.kde.kglobalaccel.Component.invokeShortcut " : "" + property var borderlessMaximizedWindows + property var callbacksOnExited: [] + property var auroraeThemesLocations: StandardPaths.locateAll(StandardPaths.GenericDataLocation, auroraeThemesPath, StandardPaths.LocateDirectory) + property ListModel auroraeThemes + property var shortcutNames: [] + property string qdbusCommandName: "qdbus" + property string kwriteconfigCommandName: "kwriteconfig6" + property string kreadconfigCommandName: "kreadconfig6" + property string lastError: "" + + function findExistingFromListCommand(commandsList) { + let cmd = ""; + if (commandsList) { + cmd += "if command -v " + commandsList[0] + " > /dev/null; then echo " + commandsList[0] + "; "; + for (const c of commandsList.slice(1)) { + cmd += "elif command -v " + c + " > /dev/null; then echo " + c + "; "; + } + cmd += "else exit 1; fi"; + } + return cmd; + } + + function setBorderlessMaximizedWindows(val) { + if (setBorderlessMaximizedWindowsCommand === "") { + return; + } + let cmd = setBorderlessMaximizedWindowsCommand + val + " && " + reconfigureCommand + " && " + getBorderlessMaximizedWindowsCommand; + callbacksOnExited.push({ + "cmd": cmd, + "callback": function (cmd, exitCode, exitStatus, stdout, stderr) { + if (exitCode == 0) { + borderlessMaximizedWindows = stdout.trim() == "true"; + } else { + lastError = "Unable to update set BorderlessMaximizedWindows status: '" + stderr + "'"; + } + } + }); + executable.exec(cmd); + } + + function updateBorderlessMaximizedWindows() { + if (getBorderlessMaximizedWindowsCommand === "") { + return; + } + let cmd = getBorderlessMaximizedWindowsCommand; + callbacksOnExited.push({ + "cmd": cmd, + "callback": function (cmd, exitCode, exitStatus, stdout, stderr) { + if (exitCode == 0) { + borderlessMaximizedWindows = stdout.trim() == "true"; + } else { + lastError = "Unable to update get BorderlessMaximizedWindows status: '" + stderr + "'"; + } + } + }); + executable.exec(cmd); + } + + function updateAuroraeThemes() { + auroraeThemes.clear(); + for (var locationIndex = 0; locationIndex < auroraeThemesLocationsRepeater.count; locationIndex++) { + let locationItem = auroraeThemesLocationsRepeater.itemAt(locationIndex); + for (var themeIndex = 0; themeIndex < locationItem.count; themeIndex++) { + let themeModel = locationItem.itemAt(themeIndex); + auroraeThemes.append({ + "name": themeModel.fileName, + "folder": themeModel.fileName, + "path": themeModel.filePath + }); + } + } + auroraeThemesChanged(); + } + + function updateKWinShortcutNames() { + if (getAllKWinShortcutNamesCommand === "") { + return; + } + let cmd = getAllKWinShortcutNamesCommand; + callbacksOnExited.push({ + "cmd": cmd, + "callback": function (cmd, exitCode, exitStatus, stdout, stderr) { + if (exitCode == 0) { + shortcutNames = stdout.trim().split(/\r?\n/).sort(); + } else { + lastError = "Unable to update KWin shortcuts: '" + stderr + "'"; + } + } + }); + executable.exec(cmd); + } + + function invokeKWinShortcut(shortcut) { + let cmd = invokeKWinShortcutCommand; + let trimmedShortcut = shortcut.trim(); + if (shortcutNames.length === 0 || shortcutNames.includes(trimmedShortcut)) + executable.exec(cmd + "\"" + trimmedShortcut + "\""); + else + print("Error: shortcut '" + trimmedShortcut + "' not found in the list!"); + } + + function updateQdbusCommandName() { + updateCommandName(["/usr/lib/qt6/bin/qdbus", "qdbus", "qdbus6", "qdbus-qt6"], function (commandName) { + qdbusCommandName = commandName; + qdbusCommandNameChanged(); + }); + } + + function updateKwriteconfigCommandName() { + updateCommandName(["kwriteconfig6", "kwriteconfig"], function (commandName) { + kwriteconfigCommandName = commandName; + kwriteconfigCommandNameChanged(); + }); + } + + function updateKreadconfigCommandName() { + updateCommandName(["kreadconfig6", "kreadconfig"], function (commandName) { + kreadconfigCommandName = commandName; + kreadconfigCommandNameChanged(); + }); + } + + function updateCommandName(commandsList, setCommandNameCallback) { + const cmd = findExistingFromListCommand(commandsList); + callbacksOnExited.push({ + "cmd": cmd, + "callback": function (cmd, exitCode, exitStatus, stdout, stderr) { + if (exitCode == 0) { + setCommandNameCallback(stdout.trim()); + } else { + setCommandNameCallback(""); + lastError = "Unable to find command from list: " + commandsList; + } + } + }); + executable.exec(cmd); + } + + function clearLastError() { + lastError = ""; + } + + ExecutableDataSource { + id: executable + } + + Connections { + function onExited(cmd, exitCode, exitStatus, stdout, stderr) { + //print("onExited: cmd: " + cmd + "; exitCode:" + exitCode + "; stdout: " + stdout + "; stderr: " + stderr); + if (exitCode == 0) { + clearLastError(); + } + for (var i = 0; i < callbacksOnExited.length; i++) { + if (callbacksOnExited[i].cmd === cmd) { + callbacksOnExited[i].callback(cmd, exitCode, exitStatus, stdout, stderr); + callbacksOnExited.splice(i, 1); + break; + } + } + } + + target: executable + } + + Repeater { + id: auroraeThemesLocationsRepeater + + model: auroraeThemesLocations + + delegate: Repeater { + required property string modelData + + model: FolderListModel { + folder: modelData + showDirs: true + showFiles: false + showHidden: true + onCountChanged: kWinConfig.updateAuroraeThemes() + } + + delegate: Item { + required property string fileName + required property string filePath + } + } + } + + auroraeThemes: ListModel {} + + Component.onCompleted: function () { + updateQdbusCommandName(); + updateKwriteconfigCommandName(); + updateKreadconfigCommandName(); + } + + onQdbusCommandNameChanged: function () { + updateKWinShortcutNames(); + } + + onKreadconfigCommandNameChanged: function () { + updateBorderlessMaximizedWindows(); + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/KWindowSystemAdapter.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/KWindowSystemAdapter.qml new file mode 100644 index 0000000..b224e23 --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/KWindowSystemAdapter.qml @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ +import QtQuick +import org.kde.kwindowsystem + +QtObject { + property bool showingDesktop: KWindowSystem.showingDesktop +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/MouseHandlers.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/MouseHandlers.qml new file mode 100644 index 0000000..143033b --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/MouseHandlers.qml @@ -0,0 +1,44 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import QtQuick + +Item { + id: handlers + anchors.fill: parent + + signal invokeKWinShortcut(string shortcut) + + WidgetDragHandler { + id: dragHandler + Component.onCompleted: { + invokeKWinShortcut.connect(handlers.invokeKWinShortcut); + } + onInvokeKWinShortcut: tapHandler.stopLongPressTimer() + } + + WidgetTapHandler { + id: tapHandler + Component.onCompleted: { + invokeKWinShortcut.connect(handlers.invokeKWinShortcut); + } + onInvokeKWinShortcut: dragHandler.stopDrag() + } + + WidgetWheelHandler { + orientation: Qt.Vertical + Component.onCompleted: { + invokeKWinShortcut.connect(handlers.invokeKWinShortcut); + } + } + + WidgetWheelHandler { + orientation: Qt.Horizontal + Component.onCompleted: { + invokeKWinShortcut.connect(handlers.invokeKWinShortcut); + } + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/SortableItemsRow.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/SortableItemsRow.qml new file mode 100644 index 0000000..73f4497 --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/SortableItemsRow.qml @@ -0,0 +1,76 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +Item { + id: listItemsContainer + + property alias model: listItemsRepeater.model + property Component sourceComponent + + RowLayout { + Component { + id: listItemDelegate + + MouseArea { + id: dragArea + + required property var modelData + + drag.axis: Drag.XAxis + drag.target: contentLoader + Layout.preferredWidth: contentLoader.width + Layout.preferredHeight: contentLoader.height + + DropArea { + anchors.fill: parent + anchors.margins: 5 + onEntered: drag => { + listItemsRepeater.model.move(drag.source.DelegateModel.itemsIndex, dragArea.DelegateModel.itemsIndex, 1); + } + } + + Loader { + id: contentLoader + + Drag.source: dragArea + Drag.active: dragArea.drag.active + Drag.hotSpot.x: width / 2 + Drag.hotSpot.y: height / 2 + onLoaded: item.modelData = modelData + sourceComponent: listItemsContainer.sourceComponent + } + + states: State { + when: dragArea.drag.active + + ParentChange { + target: contentLoader + parent: listItemsContainer + } + + AnchorChanges { + target: contentLoader + + anchors { + horizontalCenter: undefined + verticalCenter: undefined + } + } + } + } + } + + Repeater { + id: listItemsRepeater + + delegate: listItemDelegate + } + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetDragHandler.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetDragHandler.qml new file mode 100644 index 0000000..3b7020f --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetDragHandler.qml @@ -0,0 +1,49 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import QtQuick +import org.kde.plasma.plasmoid + +/* +* Drag handler implemented in that strange way as workaround for cases, when window layout changed during the drag interaction. +*/ +PointHandler { + property bool dragInProgress: false + property var cfg: plasmoid.configuration + + signal invokeKWinShortcut(string shortcut) + + function distance(p1, p2) { + let dx = p2.x - p1.x; + let dy = p2.y - p1.y; + return Math.sqrt(dx * dx + dy * dy); + } + + function stopDrag() { + dragInProgress = false; + } + + enabled: cfg.windowTitleDragEnabled + dragThreshold: cfg.windowTitleDragThreshold + acceptedButtons: Qt.LeftButton | Qt.MiddleButton + onActiveChanged: function () { + if (active && (!cfg.windowTitleDragOnlyMaximized || tasksModel.activeWindow.maximized)) + dragInProgress = true; + else + stopDrag(); + } + onPointChanged: function () { + if (active && dragInProgress && point && point.pressPosition && point.position) { + if (distance(point.pressPosition, point.position) > dragThreshold) { + stopDrag(); + if (point.pressedButtons & Qt.LeftButton && cfg.widgetMouseAreaLeftDragAction != "") + invokeKWinShortcut(cfg.widgetMouseAreaLeftDragAction); + else if (point.pressedButtons & Qt.MiddleButton && cfg.widgetMouseAreaMiddleDragAction != "") + invokeKWinShortcut(cfg.widgetMouseAreaMiddleDragAction); + } + } + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetEffectsRepeater.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetEffectsRepeater.qml new file mode 100644 index 0000000..e9c1060 --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetEffectsRepeater.qml @@ -0,0 +1,63 @@ +/* + * SPDX-FileCopyrightText: 2025 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ +import "config/effect/" +import "config/effect/effect.js" as EffectUtils +import QtQuick + +Repeater { + id: effectsRepeater + + model: plasmoid.configuration.effects + + property var effectRules: [] + + function updateEffectRules() { + let rulesList = []; + for (var i = 0; i < plasmoid.configuration.effectRules.length; i++) { + const ruleModel = JSON.parse(plasmoid.configuration.effectRules[i]); + const rule = EffectUtils.Condition.fromModel(ruleModel); + rulesList[i] = rule; + } + effectRules = rulesList; + updateEffectsState(); + } + + function updateEffectsState() { + var effectsState = []; + for (var i = 0; i < effectsRepeater.effectRules.length; i++) { + if (!effectsState[i]) { + const rule = effectsRepeater.effectRules[i]; + effectsState[rule.effectIndex] = rule.checkCondition(root); + } + } + for (var i = 0; i < effectsRepeater.count; i++) { + const item = effectsRepeater.itemAt(i); + if (item) { + item.opacity = effectsState[i] ? 1.0 : 0.0; + } + } + } + + MergedMultiEffect { + anchors.fill: widgetRow + source: widgetRow + opacity: 0.0 + visible: opacity !== 0.0 + + required property int index + required property var modelData + + onModelDataChanged: function () { + effectModel.updateFromJson(modelData); + } + + Behavior on opacity { + NumberAnimation { + duration: plasmoid.configuration.widgetButtonsAnimation + } + } + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetElement.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetElement.qml new file mode 100644 index 0000000..34f5913 --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetElement.qml @@ -0,0 +1,23 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import QtQuick + +QtObject { + + enum Type { + WindowControlButton, + WindowTitle, + WindowIcon, + Spacer + } + + enum DisabledMode { + Deactivated, + HideKeepSpace, + Hide + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetTapHandler.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetTapHandler.qml new file mode 100644 index 0000000..24d00b1 --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetTapHandler.qml @@ -0,0 +1,62 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import QtQuick + +/* +* Tap handler implemented in that strange way as workaround for cases, when window layout changed during the long press interaction. +*/ +TapHandler { + id: tapHandler + + property var cfg: plasmoid.configuration + property Timer longPressTimer: Timer { + property int pressedButtons: 0 + interval: Qt.styleHints.mousePressAndHoldInterval + onTriggered: function () { + if (pressedButtons & Qt.LeftButton && cfg.widgetMouseAreaLeftLongPressAction != "") + invokeKWinShortcut(cfg.widgetMouseAreaLeftLongPressAction); + else if (pressedButtons & Qt.MiddleButton && cfg.widgetMouseAreaMiddleLongPressAction != "") + invokeKWinShortcut(cfg.widgetMouseAreaMiddleLongPressAction); + } + } + + signal invokeKWinShortcut(string shortcut) + + enabled: cfg.widgetMouseAreaClickEnabled + acceptedButtons: Qt.LeftButton | Qt.MiddleButton + longPressThreshold: 0 + exclusiveSignals: TapHandler.SingleTap | TapHandler.DoubleTap + onSingleTapped: function (eventPoint, button) { + if (button === Qt.LeftButton && cfg.widgetMouseAreaLeftClickAction != "") + invokeKWinShortcut(cfg.widgetMouseAreaLeftClickAction); + else if (button === Qt.MiddleButton && cfg.widgetMouseAreaMiddleClickAction != "") + invokeKWinShortcut(cfg.widgetMouseAreaMiddleClickAction); + } + onDoubleTapped: function (eventPoint, button) { + if (button === Qt.LeftButton && cfg.widgetMouseAreaLeftDoubleClickAction != "") + invokeKWinShortcut(cfg.widgetMouseAreaLeftDoubleClickAction); + else if (button === Qt.MiddleButton && cfg.widgetMouseAreaMiddleDoubleClickAction != "") + invokeKWinShortcut(cfg.widgetMouseAreaMiddleDoubleClickAction); + } + + onPointChanged: function () { + if (point.pressedButtons & acceptedButtons) { + restartLongPressTimer(point.pressedButtons); + } else { + stopLongPressTimer(); + } + } + + function restartLongPressTimer(pressedButtons) { + longPressTimer.restart(); + longPressTimer.pressedButtons = pressedButtons; + } + + function stopLongPressTimer() { + longPressTimer.stop(); + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetToolTip.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetToolTip.qml new file mode 100644 index 0000000..7bc35ac --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetToolTip.qml @@ -0,0 +1,33 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import org.kde.plasma.core as PlasmaCore +import org.kde.taskmanager as TaskManager + +PlasmaCore.ToolTipArea { + enum ToolTipMode { + Disabled, + MaximizedWindow, + Always + } + + active: showToolTip() + mainText: tasksModel.activeWindow.genericAppName || "" + icon: tasksModel.activeWindow.icon + + property TaskManager.TasksModel tasksModel + + function showToolTip() { + switch (plasmoid.configuration.widgetToolTipMode) { + case WidgetToolTip.ToolTipMode.Disabled: + return false; + case WidgetToolTip.ToolTipMode.MaximizedWindow: + return tasksModel.hasActiveWindow && tasksModel.activeWindow.maximized; + default: + return tasksModel.hasActiveWindow; + } + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetWheelHandler.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetWheelHandler.qml new file mode 100644 index 0000000..880ef49 --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WidgetWheelHandler.qml @@ -0,0 +1,86 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import QtQuick + +WheelHandler { + property var cfg: plasmoid.configuration + property int verticalRotation: 0 + property int horizontalRotation: 0 + property bool firstHorizontalEvent: true + property bool firstVerticalEvent: true + property int firstEventDistance: cfg.widgetMouseAreaWheelFirstEventDistance + property int nextEventDistance: cfg.widgetMouseAreaWheelNextEventDistance + + signal invokeKWinShortcut(string shortcut) + signal wheelUp + signal wheelDown + signal wheelLeft + signal wheelRight + + enabled: cfg.widgetMouseAreaWheelEnabled + target: null + acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad + onActiveChanged: function () { + if (!active) { + verticalRotation = 0; + horizontalRotation = 0; + firstHorizontalEvent = true; + firstVerticalEvent = true; + } + } + onWheel: function (wheelEvent) { + let dx = wheelEvent.angleDelta.x; + let dy = wheelEvent.angleDelta.y; + if (orientation == Qt.Horizontal) { + horizontalRotation = (horizontalRotation < 0) == (dx < 0) ? (horizontalRotation + dx) : dx; + let distance = Math.abs(horizontalRotation); + if ((firstHorizontalEvent && distance >= firstEventDistance) || (nextEventDistance > 0 && distance >= nextEventDistance)) { + if (horizontalRotation < 0) + wheelRight(); + else + wheelLeft(); + if (firstHorizontalEvent) { + firstHorizontalEvent = false; + horizontalRotation -= Math.sign(horizontalRotation) * firstEventDistance; + } else { + horizontalRotation -= Math.sign(horizontalRotation) * nextEventDistance; + } + } + } else { + verticalRotation = (verticalRotation < 0) == (dy < 0) ? (verticalRotation + dy) : dy; + let distance = Math.abs(verticalRotation); + if ((firstVerticalEvent && distance >= firstEventDistance) || (nextEventDistance > 0 && distance >= nextEventDistance)) { + if (verticalRotation < 0) + wheelDown(); + else + wheelUp(); + if (firstVerticalEvent) { + firstVerticalEvent = false; + verticalRotation -= Math.sign(verticalRotation) * firstEventDistance; + } else { + verticalRotation -= Math.sign(verticalRotation) * nextEventDistance; + } + } + } + } + onWheelUp: function () { + if (cfg.widgetMouseAreaWheelUpAction != "") + invokeKWinShortcut(cfg.widgetMouseAreaWheelUpAction); + } + onWheelDown: function () { + if (cfg.widgetMouseAreaWheelDownAction != "") + invokeKWinShortcut(cfg.widgetMouseAreaWheelDownAction); + } + onWheelLeft: function () { + if (cfg.widgetMouseAreaWheelLeftAction != "") + invokeKWinShortcut(cfg.widgetMouseAreaWheelLeftAction); + } + onWheelRight: function () { + if (cfg.widgetMouseAreaWheelRightAction != "") + invokeKWinShortcut(cfg.widgetMouseAreaWheelRightAction); + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WindowControlButton.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WindowControlButton.qml new file mode 100644 index 0000000..9f79312 --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/WindowControlButton.qml @@ -0,0 +1,176 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import QtCore +import QtQuick +import "windowControlButton.js" as WCB + +Item { + id: button + + enum Type { + MinimizeButton, + MaximizeButton, + RestoreButton, + CloseButton, + AllDesktopsButton, + KeepAboveButton, + KeepBelowButton, + ShadeButton, + HelpButton, + MenuButton, + AppMenuButton + } + + function getAccessibleName(type) { + switch (type) { + case WindowControlButton.Type.MinimizeButton: + return "Minimize"; + case WindowControlButton.Type.MaximizeButton: + return "Maximize"; + case WindowControlButton.Type.RestoreButton: + return "Restore"; + case WindowControlButton.Type.CloseButton: + return "Close"; + case WindowControlButton.Type.AllDesktopsButton: + return "All Desktops"; + case WindowControlButton.Type.KeepAboveButton: + return "Keep Above"; + case WindowControlButton.Type.KeepBelowButton: + return "Keep Below"; + case WindowControlButton.Type.ShadeButton: + return "Shade"; + case WindowControlButton.Type.HelpButton: + return "Help"; + case WindowControlButton.Type.MenuButton: + return "Menu"; + case WindowControlButton.Type.AppMenuButton: + return "Application Menu"; + default: + return ""; + } + } + + /* + * Active* - icons for active windows. + * *Disabled - disabled non-interactive buttons + */ + enum IconState { + Active, + ActiveHover, + ActivePressed, + ActiveChecked, + ActiveHoverChecked, + ActiveCheckedDisabled, + ActiveDisabled, + Inactive, + InactiveHover, + InactivePressed, + InactiveChecked, + InactiveHoverChecked, + InactiveCheckedDisabled, + InactiveDisabled + } + + enum IconTheme { + Plasma, + Breeze, + Aurorae, + Oxygen + } + + property string themeName + property int buttonType + property string action: WCB.getAction(buttonType) + property bool active: true + property bool hovered: hoverHandler.hovered + property bool pressed: tapHandler.pressed + property bool checked: false + property int iconTheme: WindowControlButton.IconTheme.Plasma + property int animationDuration: 100 + property int iconState: WindowControlButton.IconState.Active + property bool mouseAreaEnabled: enabled + property int verticalPadding: 0 + + Accessible.role: Accessible.Button + Accessible.focusable: true + Accessible.name: i18n(getAccessibleName(buttonType)) + Accessible.onPressAction: buttonActionCall() + Accessible.checked: checked + Accessible.pressed: pressed + + signal actionCall(int action) + + function updateIconState() { + iconState = WCB.calculateIconState(button); + } + + onEnabledChanged: Qt.callLater(updateIconState) + onActiveChanged: Qt.callLater(updateIconState) + onHoveredChanged: Qt.callLater(updateIconState) + onPressedChanged: Qt.callLater(updateIconState) + onCheckedChanged: Qt.callLater(updateIconState) + + function buttonActionCall() { + button.actionCall(WCB.getAction(button.buttonType)); + } + + HoverHandler { + id: hoverHandler + enabled: button.mouseAreaEnabled + } + + TapHandler { + id: tapHandler + enabled: button.mouseAreaEnabled + acceptedButtons: Qt.LeftButton + gesturePolicy: TapHandler.WithinBounds + exclusiveSignals: TapHandler.SingleTap + + onTapped: function () { + buttonActionCall(); + } + } + + Repeater { + id: iconStateRepeater + anchors.fill: parent + model: WCB.statePropertiesMap + + Loader { + id: controlButtonDelegeate + required property int index + required property var modelData + anchors.fill: parent + anchors.topMargin: button.verticalPadding + anchors.bottomMargin: button.verticalPadding + source: WCB.getButtonComponentSourcePath(button.iconTheme) + onLoaded: function () { + let buttonComponent = item; + let buttonState = index; + buttonComponent.hovered = modelData.hovered; + buttonComponent.checked = modelData.checked; + buttonComponent.pressed = modelData.pressed; + buttonComponent.active = modelData.active; + buttonComponent.disabled = modelData.disabled; + buttonComponent.buttonType = Qt.binding(function () { + return button.buttonType; + }); + buttonComponent.animationDuration = Qt.binding(function () { + return button.animationDuration; + }); + buttonComponent.opacity = Qt.binding(function () { + return buttonState == button.iconState ? 1 : 0; + }); + if (iconTheme === WindowControlButton.IconTheme.Aurorae) { + buttonComponent.themeName = Qt.binding(function () { + return button.themeName; + }); + } + } + } + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/common/JsonListModel.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/common/JsonListModel.qml new file mode 100644 index 0000000..3a44d1e --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/common/JsonListModel.qml @@ -0,0 +1,49 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ +import QtQuick + +ListModel { + id: effectsListModel + + required property var tempModel + property list stringListModel + dynamicRoles: true + + function updateModelFromConfig() { + clear(); + for (let i = 0; i < stringListModel.length; i++) { + const effectJson = stringListModel[i]; + tempModel.updateFromJson(effectJson); + append(tempModel.toJsonObject()); + } + } + + function updateConfigFromModel() { + Qt.callLater(_updateConfigFromModel); + } + + function _updateConfigFromModel() { + const length = count; + stringListModel.length = length; + for (let i = 0; i < length; i++) { + tempModel.updateFromJsonObject(get(i)); + stringListModel[i] = tempModel.toJson(); + } + } + + function pushModel(model) { + tempModel.updateFromJsonObject(model); + append(tempModel.toJsonObject()); + updateConfigFromModel(); + } + + function deleteModel(index) { + remove(index); + updateConfigFromModel(); + } + + Component.onCompleted: updateModelFromConfig() +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/common/JsonModel.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/common/JsonModel.qml new file mode 100644 index 0000000..44bd332 --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/common/JsonModel.qml @@ -0,0 +1,51 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ +import QtQuick +import QtQuick.Effects + +QtObject { + id: model + + required property list _propertyNames + + signal propertyChanged(string propertyName, var propertyValue) + + Component.onCompleted: { + for (const propertyName of model._propertyNames) { + model[propertyName + "Changed"].connect(function () { + propertyChanged(propertyName, model[propertyName]); + }); + } + } + + function toJson() { + let cloned = toJsonObject(); + return JSON.stringify(cloned); + } + + function toJsonObject() { + let cloned = {}; + for (const propertyName of model._propertyNames) { + const value = model[propertyName]; + if (value !== undefined && value !== null) { + cloned[propertyName] = value; + } + } + return cloned; + } + + function updateFromJson(json) { + const obj = JSON.parse(json); + updateFromJsonObject(obj); + } + + function updateFromJsonObject(jsonObject) { + for (const propertyName of model._propertyNames) { + const value = jsonObject[propertyName]; + model[propertyName] = value === null ? undefined : value; + } + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/config/AddWidgetElement.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/config/AddWidgetElement.qml new file mode 100644 index 0000000..1e427de --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/config/AddWidgetElement.qml @@ -0,0 +1,65 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ +import QtQuick +import QtQuick.Controls +import org.kde.kirigami as Kirigami + +ComboBox { + textRole: "name" + valueRole: "value" + displayText: currentText ? i18n(currentText) : "" + + model: ListModel { + ListElement { + name: "Add element..." + } + + ListElement { + name: "Window close button" + value: "windowCloseButton" + } + + ListElement { + name: "Window minimize button" + value: "windowMinimizeButton" + } + + ListElement { + name: "Window maximize button" + value: "windowMaximizeButton" + } + + ListElement { + name: "Keep window above button" + value: "windowKeepAboveButton" + } + + ListElement { + name: "Keep window below button" + value: "windowKeepBelowButton" + } + + ListElement { + name: "Shade window button" + value: "windowShadeButton" + } + + ListElement { + name: "Window title" + value: "windowTitle" + } + + ListElement { + name: "Window Icon" + value: "windowIcon" + } + + ListElement { + name: "Spacer" + value: "spacer" + } + } +} diff --git a/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/config/ConfigAppearance.qml b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/config/ConfigAppearance.qml new file mode 100644 index 0000000..1358731 --- /dev/null +++ b/eggs/kde_locals/plasma/plasmoids/com.github.antroids.application-title-bar/contents/ui/config/ConfigAppearance.qml @@ -0,0 +1,452 @@ +/* + * SPDX-FileCopyrightText: 2024 Anton Kharuzhy + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import "../" +import "../config" +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import org.kde.kcmutils as KCM +import org.kde.kirigami as Kirigami +import org.kde.plasma.components as PlasmaComponents + +KCM.SimpleKCM { + id: page + + property alias cfg_widgetButtonsIconsTheme: widgetButtonsIconsTheme.currentIndex + property string cfg_widgetButtonsAuroraeTheme + property alias cfg_widgetButtonsMargins: widgetButtonsMargins.value + property alias cfg_widgetButtonsAspectRatio: widgetButtonsAspectRatio.value + property alias cfg_widgetButtonsAnimation: widgetButtonsAnimation.value + property alias cfg_widgetElementsDisabledMode: widgetElementsDisabledMode.currentIndex + property alias cfg_widgetMargins: widgetMargins.value + property alias cfg_widgetSpacing: widgetSpacing.value + property int cfg_widgetHorizontalAlignment + property int cfg_widgetVerticalAlignment + property alias cfg_widgetFillWidth: widgetFillWidth.checked + property alias cfg_widgetToolTipMode: widgetToolTipMode.currentIndex + property alias cfg_windowTitleMinimumWidth: windowTitleMinimumWidth.value + property alias cfg_windowTitleMaximumWidth: windowTitleMaximumWidth.value + property alias cfg_windowTitleFontSize: windowTitleFontSize.value + property alias cfg_windowTitleFontBold: windowTitleFontBold.checked + property alias cfg_windowTitleFontSizeMode: windowTitleFontSizeMode.currentIndex + property alias cfg_windowTitleSource: windowTitleSource.currentIndex + property alias cfg_windowTitleHorizontalAlignment: windowTitleHorizontalAlignment.currentIndex + property alias cfg_windowTitleVerticalAlignment: windowTitleVerticalAlignment.currentIndex + property alias cfg_windowTitleHideEmpty: windowTitleHideEmpty.checked + property alias cfg_windowTitleUndefined: windowTitleUndefined.text + property alias cfg_windowTitleMarginsLeft: windowTitleMarginsLeft.value + property alias cfg_windowTitleMarginsTop: windowTitleMarginsTop.value + property alias cfg_windowTitleMarginsBottom: windowTitleMarginsBottom.value + property alias cfg_windowTitleMarginsRight: windowTitleMarginsRight.value + property alias cfg_widgetElements: widgetElements.elements + property alias cfg_overrideElementsMaximized: overrideElementsMaximized.checked + property alias cfg_widgetElementsMaximized: widgetElementsMaximized.elements + property alias cfg_windowTitleSourceMaximized: windowTitleSourceMaximized.currentIndex + + Kirigami.FormLayout { + anchors.left: parent.left + anchors.right: parent.right + wideMode: true + + KWinConfig { + id: kWinConfig + + onAuroraeThemesChanged: widgetButtonsAuroraeTheme.updateCurrentIndex() + } + + Kirigami.InlineMessage { + anchors.left: parent.left + anchors.right: parent.right + text: kWinConfig.lastError + type: Kirigami.MessageType.Error + visible: kWinConfig.lastError !== "" + } + + Kirigami.Separator { + Kirigami.FormData.isSection: true + Kirigami.FormData.label: i18n("Widget Layout") + } + + SpinBox { + id: widgetMargins + + Kirigami.FormData.label: i18n("Widget margins:") + from: 0 + to: 32 + } + + SpinBox { + id: widgetSpacing + + Kirigami.FormData.label: i18n("Spacing between elements:") + from: 0 + to: 32 + } + + ComboBox { + id: widgetHorizontalAlignment + + Component.onCompleted: currentIndex = indexOfValue(cfg_widgetHorizontalAlignment) + onActivated: cfg_widgetHorizontalAlignment = currentValue + textRole: "text" + valueRole: "value" + Kirigami.FormData.label: i18n("Horizontal alignment:") + model: [ + { + "value": Qt.AlignLeft, + "text": i18n("Left") + }, + { + "value": Qt.AlignHCenter, + "text": i18n("Center") + }, + { + "value": Qt.AlignRight, + "text": i18n("Right") + }, + { + "value": Qt.AlignJustify, + "text": i18n("Justify") + } + ] + } + + ComboBox { + id: widgetVerticalAlignment + + Component.onCompleted: currentIndex = indexOfValue(cfg_widgetVerticalAlignment) + onActivated: cfg_widgetVerticalAlignment = currentValue + textRole: "text" + valueRole: "value" + Kirigami.FormData.label: i18n("Vertical alignment:") + model: [ + { + "value": Qt.AlignLeft, + "text": i18n("Top") + }, + { + "value": Qt.AlignVCenter, + "text": i18n("Center") + }, + { + "value": Qt.AlignBottom, + "text": i18n("Bottom") + }, + { + "value": Qt.AlignBaseline, + "text": i18n("Baseline") + } + ] + } + + ComboBox { + id: widgetElementsDisabledMode + + textRole: "text" + valueRole: "value" + Kirigami.FormData.label: i18n("Show disabled elements:") + model: [ + { + "value": WidgetElement.DisabledMode.Deactivated, + "text": i18n("Deactivated") + }, + { + "value": WidgetElement.DisabledMode.HideKeepSpace, + "text": i18n("Hide, keep space") + }, + { + "value": WidgetElement.DisabledMode.Hide, + "text": i18n("Hide") + } + ] + } + + CheckBox { + id: widgetFillWidth + + Kirigami.FormData.label: i18n("Fill free space on Panel:") + } + + ComboBox { + id: widgetToolTipMode + + Kirigami.FormData.label: i18n("Tooltip Mode:") + model: [i18n("Disabled"), i18n("Only for maximized windows"), i18n("Enabled")] + } + + WidgetElements { + id: widgetElements + + Kirigami.FormData.label: i18n("Elements:") + } + + AddWidgetElement { + onCurrentValueChanged: function () { + if (currentValue) { + widgetElements.model.append({ + "value": currentValue + }); + currentIndex = 0; + } + } + } + + Kirigami.Separator { + Kirigami.FormData.isSection: true + Kirigami.FormData.label: i18n("Window Control Buttons") + } + + ComboBox { + id: widgetButtonsIconsTheme + + Kirigami.FormData.label: i18n("Button icons source:") + Layout.minimumWidth: Kirigami.Units.gridUnit * 15 + model: [i18n("Plasma: Global icon theme"), i18n("Breeze: Implicit Breeze icons"), i18n("Aurorae: Window decorations theme"), i18n("Oxygen: Implicit Oxygen icons")] + } + + RowLayout { + Kirigami.FormData.label: i18n("Aurorae theme:") + + ComboBox { + id: widgetButtonsAuroraeTheme + + function updateCurrentIndex() { + currentIndex = indexOfValue(cfg_widgetButtonsAuroraeTheme); + } + + Layout.minimumWidth: Kirigami.Units.gridUnit * 15 + enabled: widgetButtonsIconsTheme.currentIndex == 2 && model.count > 0 + Component.onCompleted: updateCurrentIndex() + onActivated: cfg_widgetButtonsAuroraeTheme = currentValue + displayText: !!currentText ? currentText : (model.count > 0) ? i18n("