2012-05-02 38 views
1

移動後,我做了這個Python腳本:窗口位置有點偏離剛產卵和使用python-wnck

from gi.repository import Gtk, Gdk, GdkX11, Wnck 
from subprocess import PIPE, Popen 


class WindowError(Exception): 
    pass 


def undecorate(aWindow): 
    gdkdis = GdkX11.X11Display.get_default() 
    gdkwin = GdkX11.X11Window.foreign_new_for_display(gdkdis, aWindow.get_xid()) 
    gdkwin.set_decorations(Gdk.WMDecoration.BORDER) 

def dropdown(aTitle): 
    Gtk.main_iteration() 

    screen = Wnck.Screen.get_default() 
    screen.force_update() 

    for window in screen.get_windows(): 
     if window.get_name() == aTitle: 
      timestamp = Gtk.get_current_event_time() 

      undecorate(window) 

      window.set_skip_pager(True) 
      window.set_skip_tasklist(True) 
      window.stick() 
      window.pin() 

      window.maximize_horizontally() 
      window.set_geometry(Wnck.WindowGravity.STATIC, 
           Wnck.WindowMoveResizeMask.Y, 
           0, 0, -1, -1) 

      window.activate(timestamp) 
      window.unminimize(timestamp) 

      break 
    else: 
     raise WindowError('Window with title "{}" not found'.format(aTitle)) 

def getActive(): 
    Gtk.main_iteration() 

    screen = Wnck.Screen.get_default() 
    screen.force_update() 

    return screen.get_active_window() 


def main(): 
    active = getActive() 

    if active.get_name() == 'Dropdown Terminal': 
     if active.is_minimized(): 
      dropdown('Dropdown Terminal') 
     else: 
      active.minimize() 
      return 
    else: 
     try: 
      dropdown('Dropdown Terminal') 
     except WindowError: 
      Popen(['roxterm', '--profile=Dropdown'], stdout=PIPE, stderr=PIPE) 
      dropdown('Dropdown Terminal') 


if __name__ == "__main__": 
    main() 

它所做的是它使roxterm行爲像Guake。我遇到的唯一問題是,當我打開一個新的roxterm實例並立即將窗口移動到(0,0)時,窗口的最終y位置向下幾個可見像素。我使用wnck庫中的set_geometry函數來執行此操作。任何想法如何解決它?謝謝。

回答

0

哎呀,忘了提及我解決了這個問題。我在代碼中改變了一些東西,但我認爲使用GdkWindow來重新定位而不是Wnck來修復定位問題。此版本讓下拉終端保持打開狀態,直到再次按下熱鍵。順便說一句,我通過在Gnome的鍵盤首選項中添加自定義熱鍵將熱鍵映射到此腳本。

from gi.repository import Gtk, Gdk, GdkX11, Wnck 
from subprocess import PIPE, Popen 


class WindowError(Exception): 
    pass 


def getScreen(): 
    Gtk.main_iteration() 

    screen = Wnck.Screen.get_default() 
    screen.force_update() 

    return screen 

def getGDKWindow(aWindow): 
    gdkdisplay = GdkX11.X11Display.get_default() 
    gdkwindow = GdkX11.X11Window.foreign_new_for_display(gdkdisplay, aWindow.get_xid()) 

    return gdkwindow 

def getWindow(aTitle): 
    screen = getScreen() 
    active = screen.get_active_window() 

    if active.get_name() == aTitle: 
     return active 

    for window in screen.get_windows(): 
     if window.get_name() == aTitle: 
      return window 

    return None 

def adjust(aWindow): 
    gdkwindow = getGDKWindow(aWindow) 

    gdkwindow.set_decorations(Gdk.WMDecoration.BORDER) 
    gdkwindow.move(0,0) 

    aWindow.set_skip_pager(True) 
    aWindow.set_skip_tasklist(True) 

    aWindow.maximize_horizontally() 

    aWindow.stick() 
    aWindow.make_above() 


def onWindowOpen(aScreen, aWindow, aData): 
    if aWindow.get_name() == aData: 
     adjust(aWindow) 

     Gtk.main_quit() 


def main(): 
    timestamp = Gtk.get_current_event_time() 
    window  = getWindow('Dropdown Terminal') 

    if window: 
     if window.is_minimized(): 
      window.activate(timestamp) 
      window.unminimize(timestamp) 
     else: 
      window.minimize() 
    else: 
     Popen(['roxterm', '--separate', '--profile=Dropdown', '--directory=.']) 

     getScreen().connect('window-opened', onWindowOpen, 'Dropdown Terminal') 

     Gtk.main() 


if __name__ == "__main__": 
    main()