首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用python-wnck生成和移动窗口后,窗口位置稍微偏离了一点

在使用python-wnck生成和移动窗口后,窗口位置稍微偏离了一点
EN

Stack Overflow用户
提问于 2012-05-02 21:48:17
回答 1查看 780关注 0票数 2

我写了这个Python脚本:

代码语言:javascript
复制
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函数。对如何修复它有什么想法吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-12 02:38:49

哦,忘了说我解决了这个问题。我更改了代码中的一些东西,但我认为使用GdkWindow而不是Wnck来重新定位解决了定位问题。此版本使下拉终端保持打开状态,直到再次按下热键。顺便说一句,我在Gnome的键盘首选项中添加了一个自定义热键,从而将热键映射到此脚本。

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10415097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档