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',
- 'client_list' : '_NET_CLIENT_LIST'
- }
- class AppMainWindow(QMainWindow):
- def __init__(self):
- super(AppMainWindow, self).__init__()
- self.display = display.Display()
- self.screen = self.display.screen()
- self.root = self.screen.root
- wmName = self.getWmName()
- self.isKDE = (wmName == 'kwin')
- self.isWM = 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):
- print('self.isWM', self.isWM)
- winType = self.atom('type_desktop') if self.isWM or self.isKDE 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()
- print('setbelow')
- 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 getWmName(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
- print('wmname:', name.lower())
- return name.lower()
- def setClassName(self, name, className):
- self.win.set_wm_class(name, className)
- def isPlasmaWindow(self, win):
- name = win.get_wm_class()
- if name and type(name) is tuple and name[0].lower() in ['plasmashell','plasma']:
- prop = win.get_full_property(self.atom('win_type'), 0)
- if prop and self.atom('type_desktop') in prop.value:
- return True
- return False
- def findKDEDesktop(self):
- tasks = self.root.get_full_property(self.atom('client_list'), Xatom.WINDOW).value
- for task in tasks:
- win = self.display.create_resource_object("window", task)
- if self.isPlasmaWindow(win):
- return win.id
- return 0
- def reparent(self):
- if not self.isKDE:
- return 0
- desktop_id = self.findKDEDesktop()
- if desktop_id:
- desk = self.display.create_resource_object("window", desktop_id)
- self.win.reparent(desk.id, 150, 150)
- self.win.change_attributes(event_mask=(X.ExposureMask|X.StructureNotifyMask))
- 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.reparent()
- 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