From a461bf400fae30ed513e97adfa7ac741cdf6e0c7 Mon Sep 17 00:00:00 2001 From: Kat Inskip Date: Mon, 5 Feb 2024 19:28:12 -0800 Subject: [PATCH] feat: kde fixes, icon, logging --- konawall/environments/kde.py | 55 ++++++++++++++++++++++++++++++----- konawall/gui.py | 18 ++++++++---- konawall/icon.png | Bin 0 -> 3205 bytes package.nix | 2 +- setup.py | 4 ++- 5 files changed, 64 insertions(+), 15 deletions(-) create mode 100644 konawall/icon.png diff --git a/konawall/environments/kde.py b/konawall/environments/kde.py index e7bbd79..797beed 100644 --- a/konawall/environments/kde.py +++ b/konawall/environments/kde.py @@ -1,16 +1,55 @@ import subprocess +import dbus from konawall.module_loader import add_environment +# https://powersnail.com/2023/set-plasma-wallpaper/ + +SCRIPT_GET_DESKTOPS = """ +function getDesktops() { + return desktops() + .filter(d => d.screen != -1) + .sort((a, b) => screenGeometry(a.screen).left - screenGeometry(b.screen).left); +} +""" + +SCRIPT_SET_WALLPAPER = """ +function setWallpaper(desktop, path) { + desktop.wallpaperPlugin = "org.kde.image" + desktop.currentConfigGroup = Array("Wallpaper", "org.kde.image", "General") + desktop.writeConfig("Image", path) +} +""" + +SCRIPT_ALL = f""" +{SCRIPT_GET_DESKTOPS} +{SCRIPT_SET_WALLPAPER} +const imageList = IMAGE_LIST; +getDesktops().forEach((desktop, i) => setWallpaper(desktop, imageList[i % imageList.length])); +""" + + +SCRIPT_ONE = f""" +{SCRIPT_GET_DESKTOPS} +{SCRIPT_SET_WALLPAPER} +setWallpaper(getDesktops()[DESKTOP_ID], IMAGE); +""" """ This sets the wallpaper on KDE. """ + +def quote(s): + return "'" + s + "'" + +def plasma_dbus(): + bus = dbus.SessionBus() + plasma = dbus.Interface( + bus.get_object("org.kde.plasmashell", "/PlasmaShell"), dbus_interface="org.kde.PlasmaShell" + ) + return plasma + + @add_environment("kde_setter") def set_wallpapers(files: list, displays: list): - for file in files: - kde_script = f""" - for (const desktop of desktops()) {{ - desktop.currentConfigGroup = ["Wallpaper", "org.kde.image", "General"] - desktop.writeConfig("Image", "{file}") - }} - """ - subprocess.run(["qdbus", "org.kde.plasmashell", "/PlasmaShell", "org.kde.PlasmaShell.evaluateScript", kde_script]) \ No newline at end of file + image_list_string = "[" + ",".join(quote(p) for p in files) + "]" + script = SCRIPT_ALL.replace("IMAGE_LIST", image_list_string) + plasma_dbus().evaluateScript(script) \ No newline at end of file diff --git a/konawall/gui.py b/konawall/gui.py index ca58520..4df3fef 100755 --- a/konawall/gui.py +++ b/konawall/gui.py @@ -70,10 +70,7 @@ class Konawall(wx.adv.TaskBarIcon): height = 128 # Missing texture style, magenta and black checkerboard - image = Image.new('RGB', (width, height), (0, 0, 0)) - dc = ImageDraw.Draw(image) - dc.rectangle((0, 0, width//2, height//2), fill=(255, 0, 255)) - dc.rectangle((width//2, height//2, width, height), fill=(255, 0, 255)) + image = Image.open(os.path.join(os.path.dirname(__file__), 'icon.png')) if "wxMSW" in wx.PlatformInfo: image = image.resize((16, 16)) elif "wxGTK" in wx.PlatformInfo: @@ -331,7 +328,18 @@ def main(): except: version = "testing version" - file_logger = logging.FileHandler("app.log", mode="a") + if wx.Platform == "__WXGTK__": + from xdg_base_dirs import xdg_config_home + log_path = os.path.join(xdg_config_home(), "konawall", "log.toml") + if wx.Platform == "__WXMAC__": + log_path_string = "~/Library/Application Support/konawall/log.toml" + log_path = os.path.expanduser(log_path_string) + elif wx.Platform == "__WXMSW__": + log_path_string = "%APPDATA%\\konawall\\log.toml" + log_path = os.path.expandvars(log_path_string) + else: + log_path = os.path.join(os.path.expanduser("~"), ".config", "konawall", "log.toml") + file_logger = logging.FileHandler(log_path, mode="a") console_logger = logging.StreamHandler() logging.basicConfig( level=logging.DEBUG, diff --git a/konawall/icon.png b/konawall/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a21660e78d205e4b1c829d00ac1fec7ba0cdb62d GIT binary patch literal 3205 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4mJh`hQoG=rx_R+I14-?iy0X7ltGxWVyS%@ z0|Sq_r;B4qMcmuD+!vld6*+FceNy$2C%e2vUf-M0b#2np7^kRXM&7DvhMNu77*-^Q z7-bl#rl?Nu5o|t|b1^GoLOhi1Li^DV0+%b=gs0`)_5Et+ zv}bpP_{aJq^+NIXNB;cp`s!Ww>$geHnU%&&3hb&UPdwayp(e{*g982-Z?0LMB*?(~;nYX|2`5e;JuiO$^hxRZDf9fh&I`n^N!W4HbA6;Q%K?rP zPf7}I#{ZG}xcNxzqmrFp>K$sjm>$Nb@r#MQ_;irVceY=l<$s2&fA~JuP1RKpxTeKn zc6E(8lfpvX( zwV%!h2;}HoG2T|8&+Kq+|6+l}n0@Zy2drNG?Jjw{SmDRU#pm9xnsMia@>v~$=Z|Mw zf0!9`;odH8_lu0LL{$~~3#u}#vhR!hclo1j`1r?dmF0J1?WcFiE9uR3sG3r;C+Lry z`tI$kU*1($;QcO9yj|5QeZF|U!2IRQX1@R85;XVwv;)CMe3a!?@|u6kb7)*Wu70rh zmc*m5pC%$FCC@yJzqu$+=D*)Z&!R*5(Npe+xqN-UQvP^X`~|1uR#$6-x{H##zZfz| zyuKWB|186k>nhb-4*XxZ&?k7cgZGC*L+6Vzi~gm~%VyvEnuW_|TJHVnoffBex_9z_ zDX}Z{mUq5zysLg%CU+9Q*!$cG`66#)8B|>QuKTw&PVU%VtZ(_M#L#=!JC(iRo-c!s z)|+Z9*MI1?mxqDzKffZ!gy($@ljQz-om?aK{}%5{!>$l^*-KyBs=k??FzfoZj^Ci? z#Dz`ox&F@k`0e`9=O;8veyj?Vnsv!Ab;|{p=oI<+OyaLf8FnbVSmNS%faCF2$yeLF z($d%WCFt8TN-Fp}KRI;9tK4gC=&~Ov8#x%nC1R&UJX4D}U9b?!F>1fN?89A=rw$9= z-|3qatz5Tl##D<*iuEdLj-S@7Ym2trc9wbOZONRBId$i*hUzjrsge1|`teOC&oa09 zdU3ilpD$62TKBixv+pnK&Xk$vGgfRqrS8zTck-GapE#cLOCN7JadIbzj+5o2z~T;3 zceD9B0;V!dSbDr;dRj!ylBT1jtBe<)TiLy2kIOgNCl^fPoE@}Qi!#)FF3$8__dscq zb?>%NKUK#GmTT>Se0a>V7{l({yM4caiwXn)@Fdxg>SOJLSjkqhj(g+CTHF z?KUj^G^t8IIPu%9r$Q&Cy7d??@gfRE8D=jdC%&8J!~O})ACXclXO>BNn%iq@#FSo#0ZK|u?dx;;P6@s-XAnAB~t z?q3w6!=%>MbsISRgU!}HoxH7g^YreS7dDo>DmtTHebOlC#KoPy%fc8gT>jfTBj%^t zuP&v(-+i4f|EkWqbn@~I_0#^n)}`C8 zrtVF7P~&}P+xNV+v&37@%IAy8P2)7lw!QsiHM@hh_VNf1Mu!da!Va=r`(dwI7kx@( zT|nwyzl5pnFINb)6~+opPN|VQKjrai8E)f023LPE#47DLQ2Mzuanfjnp-LJUo>Hj4Q&nl-{$Yk~YVy!=CuyLygi-TH;=Hi*Qf6ogWw`|SPKfflm@5a(!XBD}a zrZrkG+h(9JD zAJ4fmS^A)7;#z+-$#i#?hRN-2D+3+gEWJNj@Nbgg>?E%aR?};&G2*RBA_0#kwQV}{ zqBCA?N$7sEpIF9YuxV53k==nv4!Dgz)#L)YZ7FBwoQx5WW5m*?Q@Yy#5p5; z!nU%#fvP)aEaKg}!gpa{>LS(;PMcciT@jj~`qe49@E1dM#gYzp?gW>6!8Ti2c!YPl zoO1G3J+ma((3L^NIbxZEqr;}0+4~$=93;PdUiF1NmG|>Mv8>ITGy48zFzQSwSDC%< z>3oA#{R{?7X7`VtHDO zt`*m=ZI~@N^Voiq#5*^RUR*x?74L(LZ~G>HRTE}f@WSEsD#i&i=fyT|?`XfgI`6{$ za~Iz4Ff7)(x$(2gCy##{E}Rp47`W-G9plNLF;@zn={!#sU*1$;c=*_qs?c9C+*|jU z{_nrGxnmV;!thHmfUtMT+Q{%xr{8TD&r(z^WQ)89igg)_vjMwLWO@`&Bk zlFi!i^$35^@)%D(wbhue`tS=7gMI9ddGY zujt&oDe~HJ#tdtw%RJe)(K4bSY@_Pit_RlkZ{M7}c;8FS@_v;k+g$r~YsweSVm$Em zx!5L)oJIGpuq(bk<|LE1*VFHjmvs1|e#JD~Bd==SSeQK(+I1tun86}bd%A`E`&Tg! zeJuU%ZR&9e*ggA)kY)DX8&Cf{GT|)U_vKv5EnA&!p8tO)fvVptJPhY{KbHC?^XSBm zNwp=#uRPcdYE_nhiZnXobIEge%(-agZ9doY!j~59?zVh0lXK2f-8Tvq*Q@sZy%A6v z?~vsuxz9)H(Z}ziRTmyjU3XJqx#7R>Uw_};UT|OmN8?HJ8QshE1&TL`3&&pPfBtg$ zLUmcszDZBROwI}EEnK|h{@Tyx21~LS0y49hZYrESb>DzdXMg;1_R`&Axh?`5R=25U z<{zs2WtsCJ<=#Q7zqTjmm2(UGMV2mq#W{l~;R3w}~rwmi*V-ydGt6VF-DBL zoU)3om!1<#S-JRfO~LeY$GhU#82IN+3J8BSUwZSM!0-;$*UTx(-5GO(@|hJ_8J8Cp zcU~?`x}KQccs(toZ0elzA2-eo*8k10I3RR?Lv@{<%Cle7GX;Lux}W&C=kL`O*L4pV zoMM`nuVzn*H4_>e8A-6)TDR+6Ag1V&x!l}+2|vuG6N5zfv3qH&&Gq hA-ny3#r47dAY(Vx8|$CmU|?Wi@O1TaS?83{1ONkX@z?+W literal 0 HcmV?d00001 diff --git a/package.nix b/package.nix index 5bd3f02..8e151db 100644 --- a/package.nix +++ b/package.nix @@ -18,7 +18,7 @@ in doCheck = false; propagatedBuildInputs = let - dependencyNames = lib.attrNames poetryBlock.dependencies; + dependencyNames = (lib.attrNames poetryBlock.dependencies) ++ ["dbus-python"]; dependencies = map (name: python311Packages.${name} or dependencyReplacements.${name}) dependencyNames; in dependencies; diff --git a/setup.py b/setup.py index 92639b3..9e4e7b0 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,4 @@ -from setuptools import setup +from setuptools import setup, find_packages with open("README.MD", "r") as f: long_description = f.read() @@ -16,6 +16,8 @@ setup( author_email = poetryBlock["authors"][0].split(" <")[1][:-1], description = poetryBlock["description"], long_description = long_description, + package_data={'': ['*.png', '*.jpg', '*.jpeg', '*.gif', '*.bmp', '*.tiff', '*.webp']}, + include_package_data=True, entry_points = { "console_scripts": [ "konawall = konawall.gui:main",