#!/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 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): 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 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