Advertisement
Guest User

Untitled

a guest
Jun 11th, 2015
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.53 KB | None | 0 0
  1. import sys, os, subprocess
  2. from PyQt5 import QtCore
  3. from PyQt5.QtCore import Qt
  4. from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
  5. from Xlib import display, X, Xatom, Xutil
  6. import Xlib.protocol.event
  7.            
  8. atoms = {
  9.     'type_desktop' : '_NET_WM_WINDOW_TYPE_DESKTOP',
  10.     'type_dock'    : '_NET_WM_WINDOW_TYPE_DOCK',    
  11.     'win_type'     : '_NET_WM_WINDOW_TYPE',
  12.     'state_below'  : '_NET_WM_STATE_BELOW',
  13.     'wm_state'     : '_NET_WM_STATE',    
  14.     'wm_check'     : '_NET_SUPPORTING_WM_CHECK',
  15.     'wm_name'      : '_NET_WM_NAME',
  16.     'client_list'  : '_NET_CLIENT_LIST'
  17. }
  18.  
  19. class AppMainWindow(QMainWindow):
  20.     def __init__(self):
  21.         super(AppMainWindow, self).__init__()
  22.         self.display = display.Display()
  23.         self.screen  = self.display.screen()
  24.         self.root    = self.screen.root
  25.        
  26.         wmName = self.getWmName()
  27.  
  28.         self.isKDE = (wmName == 'kwin')
  29.         self.isWM = wmName not in ['marco',            #Mate
  30.                                    'kwin',             #KDE
  31.                                    'xfwm4',            #Xfce
  32.                                    'metacity',         #Gnome2
  33.                                    'mutter',           #GnomeShell
  34.                                    'compiz',           #Compiz
  35.                                    'mutter (muffin)']  #Cinnamon
  36.                                    
  37.         self.win = self.display.create_resource_object("window", int(self.winId()))        
  38.         self.setProp()        
  39.  
  40.     def setProp(self):
  41.         print('self.isWM', self.isWM)
  42.         winType = self.atom('type_desktop') if self.isWM or self.isKDE else self.atom('type_dock')
  43.         self.win.change_property(self.atom('win_type'), Xatom.ATOM, 32, [winType])        
  44.         self.display.flush()
  45.  
  46.     def setBelow(self):
  47.         if self.isWM:
  48.             return 0
  49.         data = [1, self.atom('state_below')]
  50.         self.sendEvent(self.win, self.atom('wm_state'), data)
  51.         self.display.flush()
  52.         print('setbelow')
  53.  
  54.     def sendEvent(self, win, ctype, data, mask=None):
  55.         data = (data+[0]*(5-len(data)))[:5]
  56.         ev = Xlib.protocol.event.ClientMessage(window=win, client_type=ctype, data=(32,(data)))
  57.         if not mask:
  58.             mask = (X.SubstructureRedirectMask | X.SubstructureNotifyMask)
  59.         self.root.send_event(ev, event_mask=mask)
  60.  
  61.     def atom(self, name):
  62.         return self.display.intern_atom(atoms.get(name, name))
  63.        
  64.     def getWmName(self):
  65.         name = ''
  66.         win_id = self.root.get_full_property(self.atom('wm_check'), 0)
  67.         if win_id:
  68.             w = self.display.create_resource_object("window", win_id.value[0])                        
  69.             prop = w.get_full_property(self.atom('wm_name'), 0)
  70.             if prop:
  71.                 name = prop.value
  72.         print('wmname:', name.lower())
  73.         return name.lower()
  74.  
  75.     def setClassName(self, name, className):
  76.         self.win.set_wm_class(name, className)                        
  77.  
  78.     def isPlasmaWindow(self, win):
  79.         name = win.get_wm_class()
  80.         if name and type(name) is tuple and name[0].lower() in ['plasmashell','plasma']:
  81.             prop = win.get_full_property(self.atom('win_type'), 0)
  82.             if prop and self.atom('type_desktop') in prop.value:
  83.                     return True
  84.         return False
  85.        
  86.     def findKDEDesktop(self):
  87.         tasks = self.root.get_full_property(self.atom('client_list'), Xatom.WINDOW).value
  88.         for task in tasks:
  89.             win = self.display.create_resource_object("window", task)
  90.             if self.isPlasmaWindow(win):
  91.                 return win.id
  92.         return 0        
  93.  
  94.     def reparent(self):
  95.         if not self.isKDE:
  96.             return 0
  97.  
  98.         desktop_id = self.findKDEDesktop()        
  99.         if desktop_id:
  100.             desk = self.display.create_resource_object("window", desktop_id)
  101.             self.win.reparent(desk.id, 150, 150)
  102.             self.win.change_attributes(event_mask=(X.ExposureMask|X.StructureNotifyMask))
  103.                                
  104. def main():    
  105.     window = AppMainWindow()
  106.  
  107.     window.setClassName('qt5Test.py', 'qt5Test')
  108.    
  109.     Button = QPushButton('Close', window)
  110.     Button.clicked.connect(QtCore.QCoreApplication.instance().quit)
  111.     Button.move(50, 50)
  112.  
  113.     window.setGeometry(150, 150, 200, 200)
  114.     window.reparent()
  115.     window.show()
  116.     window.setBelow()
  117.        
  118.     sys.exit(app.exec_())
  119.  
  120. if __name__ == '__main__':
  121.     app = QApplication(sys.argv)
  122.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement