summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Stevens <nilix@nilfm.cc>2021-03-20 01:15:04 -0400
committerDerek Stevens <nilix@nilfm.cc>2021-03-20 01:15:31 -0400
commita859dcd3e81a524a5ea5465f79914b7c7cf26183 (patch)
tree92f131e3c8f68745f73f3449fc2f320cbfa7870a
first commit
-rwxr-xr-xnitroplasm.py181
1 files changed, 181 insertions, 0 deletions
diff --git a/nitroplasm.py b/nitroplasm.py
new file mode 100755
index 0000000..aed2ce1
--- /dev/null
+++ b/nitroplasm.py
@@ -0,0 +1,181 @@
+#!/usr/bin/python3
+
+# nitroplasm: a lightweight desktop setter for KDE Plasma
+# by Derek Stevens <drkste@zoho.com>
+# written for use with the custom root menu by MatMoul:
+# https://github.com/MatMoul/plasma-containmentactions-customdesktopmenu
+# original script by pashazz:
+# https://github.com/pashazz/ksetwallpaper
+# license: GPLv3
+
+from PyQt5 import QtGui, QtCore
+from PyQt5.QtWidgets import \
+ QApplication, \
+ QWidget, \
+ QComboBox, \
+ QVBoxLayout, \
+ QHBoxLayout, \
+ QPushButton, \
+ QFileDialog , \
+ QLabel, \
+ QSizePolicy
+import sys
+from PyQt5.QtGui import QPixmap
+from Xlib import display
+import subprocess
+import dbus
+import argparse
+
+class Window(QWidget):
+ def __init__(self):
+ super().__init__()
+
+ self.title = "Nitroplasm"
+ self.top = 100
+ self.left = 200
+ self.width = 500
+ self.height = 400
+
+ self.InitWindow()
+
+ def InitWindow(self):
+ self.setWindowIcon(QtGui.QIcon(None))
+ self.setWindowTitle(self.title)
+ self.setGeometry(self.left, self.top, self.width, self.height)
+ self.setFixedSize(self.width, self.height)
+ self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
+ self.setWindowFlags(QtCore.Qt.Dialog)
+
+ vbox = QVBoxLayout()
+ hbox = QHBoxLayout()
+
+ self.image = None
+ self.label = QLabel(self.image)
+ self.label.setScaledContents(False)
+ self.label.setAlignment(QtCore.Qt.AlignCenter)
+ self.label.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
+ self.layout = 2
+ self.monitor = -1
+
+ self.select_button = QPushButton("Select Image")
+ self.select_button.clicked.connect(self.get_image)
+
+ layouts = {
+ "Stretch": 0,
+ "Scale": 1,
+ "Zoom": 2,
+ "Tile": 3,
+ "Vertical Tile": 4,
+ "Horizontal Tile": 5,
+ "Center": 6
+ }
+
+ self.layout_selector = QComboBox()
+ for l in layouts:
+ self.layout_selector.addItem(l, layouts[l])
+ self.layout_selector.currentIndexChanged.connect(self.set_layout)
+ self.layout_selector.setCurrentIndex(2)
+
+ self.monitor_selector = QComboBox()
+ self.monitor_selector.addItem("All Monitors", -1)
+ nDisplays = self.get_displays()
+ print(nDisplays)
+ if nDisplays > 1:
+ for i in range(0, nDisplays):
+ self.monitor_selector.addItem("Monitor" + str(i+1), i)
+ self.monitor_selector.currentIndexChanged.connect(self.set_monitor)
+ self.monitor_selector.setCurrentIndex(0)
+
+ self.apply_button = QPushButton("Apply Image")
+ self.apply_button.setEnabled(False)
+ self.apply_button.clicked.connect(self.apply_image)
+
+ vbox.addWidget(self.label)
+
+ hbox.addWidget(self.select_button)
+ hbox.addWidget(self.layout_selector)
+ hbox.addWidget(self.monitor_selector)
+ hbox.addWidget(self.apply_button)
+
+ vbox.addLayout(hbox)
+ self.setLayout(vbox)
+ self.show()
+
+ def set_layout(self, index):
+ self.layout = self.layout_selector.itemData(index)
+
+ def get_displays(self):
+ if 'RANDR' in display.Display().list_extensions():
+ try:
+ output = [l for l in subprocess.check_output(["xrandr"]).decode("utf-8").splitlines()]
+ return len([l.split()[0] for l in output if " connected " in l])
+ except:
+ return 1
+ else:
+ return 1
+
+ def set_monitor(self, index):
+ self.monitor = self.monitor_selector.itemData(index)
+
+ def get_image(self):
+ fname = QFileDialog.getOpenFileName(
+ self,
+ 'Select Image File',
+ './',
+ 'Image files (*.png *.jpg *.gif *.jpeg)')
+
+ if fname[0]:
+ self.image = fname[0]
+ self.apply_button.setEnabled(True)
+
+ pixmap = QPixmap(self.image).scaled(
+ self.label.width(),
+ self.label.height(),
+ QtCore.Qt.KeepAspectRatio,
+ QtCore.Qt.SmoothTransformation)
+
+ #self.label.setMaximumSize(self.label.width(), self.label.height())
+ self.label.setPixmap(pixmap)
+
+ def set_wallpaper(self, filepath, plugin = 'org.kde.image', layout = 2, desk = -1):
+ if desk < 0:
+ jscript = """
+ var allDesktops = desktops();
+ for (i=0;i<allDesktops.length;i++) {
+ d = allDesktops[i];
+ d.wallpaperPlugin = "%s";
+ d.currentConfigGroup = Array("Wallpaper", "%s", "General");
+ d.writeConfig("Image", "file://%s")
+ d.writeConfig("FillMode", "%s")
+ }
+ """
+ else:
+ jscript = """
+ var d = desktops()[%s];
+ d.wallpaperPlugin = "%s";
+ d.currentConfigGroup = Array("Wallpaper", "%s", "General");
+ d.writeConfig("Image", "file://%s")
+ d.writeConfig("FillMode", "%s")
+ """
+
+ bus = dbus.SessionBus()
+ plasma = dbus.Interface(
+ bus.get_object(
+ 'org.kde.plasmashell',
+ '/PlasmaShell'),
+ dbus_interface='org.kde.PlasmaShell')
+ if desk < 0:
+ plasma.evaluateScript(jscript % (plugin, plugin, filepath, layout))
+ else:
+ plasma.evaluateScript(jscript % (desk, plugin, plugin, filepath, layout))
+
+ def apply_image(self):
+ self.set_wallpaper(self.image, 'org.kde.image', self.layout, self.monitor)
+
+if __name__ == '__main__':
+ if len(sys.argv) == 1:
+ App = QApplication(sys.argv)
+ window = Window()
+ sys.exit(App.exec())
+ else:
+ parser = argparse.ArgumentParser(description='KDE Wallpaper setter')