2012-05-02 4 views
1

Я сделал это 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-позиция окна - это несколько видимых пикселей вниз. Для этого я использовал функцию set_geometry в библиотеке wnck. Любые идеи о том, как исправить это? Благодарю.

ответ

0

Ой, забыл упомянуть, что я решил эту проблему. Я изменил некоторые вещи в коде, но я думаю, что использование GdkWindow для репозиции вместо Wnck устраняет проблему позиционирования. Эта версия держит выпадающий терминал открытым до тех пор, пока горячая клавиша снова не будет нажата. BTW, я сопоставил горячую клавишу с этим скриптом, добавив специальную горячую клавишу в настройках клавиатуры 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()