Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys, os, subprocess
- from PyQt5 import QtCore
- from PyQt5.QtCore import Qt
- from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
- from Xlib import display, X, Xatom, Xutil
- import Xlib.protocol.event
- atoms = {
- 'type_desktop' : '_NET_WM_WINDOW_TYPE_DESKTOP',
- 'type_dock' : '_NET_WM_WINDOW_TYPE_DOCK',
- 'win_type' : '_NET_WM_WINDOW_TYPE',
- 'state_below' : '_NET_WM_STATE_BELOW',
- 'wm_state' : '_NET_WM_STATE',
- 'wm_check' : '_NET_SUPPORTING_WM_CHECK',
- 'wm_name' : '_NET_WM_NAME'
- }
- class AppMainWindow(QMainWindow):
- def __init__(self):
- super(AppMainWindow, self).__init__()
- self.display = display.Display()
- self.screen = self.display.screen()
- self.root = self.screen.root
- self.isWM = self.wmName() not in ['marco', #Mate
- 'kwin', #KDE
- 'xfwm4', #Xfce
- 'metacity', #Gnome2
- 'mutter', #GnomeShell
- 'compiz', #Compiz
- 'mutter (muffin)'] #Cinnamon
- self.win = self.display.create_resource_object("window", int(self.winId()))
- self.setProp()
- def setProp(self):
- winType = self.atom('type_desktop') if self.isWM else self.atom('type_dock')
- self.win.change_property(self.atom('win_type'), Xatom.ATOM, 32, [winType])
- self.display.flush()
- def setBelow(self):
- if self.isWM:
- return 0
- data = [1, self.atom('state_below')]
- self.sendEvent(self.win, self.atom('wm_state'), data)
- self.display.flush()
- def sendEvent(self, win, ctype, data, mask=None):
- data = (data+[0]*(5-len(data)))[:5]
- ev = Xlib.protocol.event.ClientMessage(window=win, client_type=ctype, data=(32,(data)))
- if not mask:
- mask = (X.SubstructureRedirectMask | X.SubstructureNotifyMask)
- self.root.send_event(ev, event_mask=mask)
- def atom(self, name):
- return self.display.intern_atom(atoms.get(name, name))
- def wmName(self):
- name = ''
- win_id = self.root.get_full_property(self.atom('wm_check'), 0)
- if win_id:
- w = self.display.create_resource_object("window", win_id.value[0])
- prop = w.get_full_property(self.atom('wm_name'), 0)
- if prop:
- name = prop.value
- return name.lower()
- def setClassName(self, name, className):
- self.win.set_wm_class(name, className)
- def main():
- window = AppMainWindow()
- window.setClassName('qt5Test.py', 'qt5Test')
- Button = QPushButton('Close', window)
- Button.clicked.connect(QtCore.QCoreApplication.instance().quit)
- Button.move(50, 50)
- window.setGeometry(150, 150, 200, 200)
- window.show()
- window.setBelow()
- sys.exit(app.exec_())
- if __name__ == '__main__':
- app = QApplication(sys.argv)
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement