commit a859dcd3e81a524a5ea5465f79914b7c7cf26183 Author: Derek Stevens Date: Sat Mar 20 01:15:04 2021 -0400 first commit 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 +# 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