2016-09-07 92 views
5

我打算更换显示器,在其中显示全屏窗口。 当投影机连接起来时,这特别有趣。选择某个显示器用于全屏显示gtk

我试过使用fullscreen_on_monitor但是不会产生任何可见的变化。

这是一个非工作例如:

#!/usr/bin/env python 
import sys 

import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import Gtk 
from gi.repository import Gdk 

w = Gtk.Window() 

screen = Gdk.Screen.get_default() 
print ("Montors: %d" % screen.get_n_monitors()) 
if len(sys.argv) > 1: 
    n = int(sys.argv[1]) 
else: 
    n = 0 

l = Gtk.Button(label="Hello, %d monitors!" % screen.get_n_monitors()) 
w.add(l) 
w.show_all() 

w.fullscreen_on_monitor(screen, n) 
l.connect("clicked", Gtk.main_quit) 
w.connect("destroy", Gtk.main_quit) 
Gtk.main() 

我能看到同样的监视器(出3)在窗口,无论这个值的我提供。

我的问题是:如何让全屏窗口出现在不同的显示器上?

回答

3

问题似乎是,Gtk只是忽略了显示器的编号,它总是全屏显示当前窗口所在的显示器上的窗口。这很糟糕,但我们可以用它来使它按照我们想要的方式工作。

但首先有关多个显示器的一些理论,它们实际上并不是您PC的单独显示器。它认为它们共同组成了一个共享相同全球起源的屏幕。在全局屏幕上,每个显示器都有一个相对于全局原点的原点,就像窗口一样。

因为我们知道Gtk将始终全屏显示在窗口所在的显示器上,所以我们可以简单地使用window.move(x,y)将窗口移动到显示器的原点,然后调用window.fullscreen()

(该move功能到它的父,这在主窗口的情况下,是全球屏幕的窗口移动到的位置(x,y)相对。)

结合这一切,我们得到这个,它完美的作品Windows 10:

def fullscreen_at_monitor(window, n): 
    screen = Gdk.Screen.get_default() 

    monitor_n_geo = screen.get_monitor_geometry(n) 
    x = monitor_n_geo.x 
    y = monitor_n_geo.y 

    window.move(x,y) 

    window.fullscreen() 
+0

你可以备份“Gtk只是忽略监视器号码”与代码? gtk_window_fullscreen_on_monitor'定义在这里:https://git.gnome.org/browse/gtk+/tree/gtk/gtkwindow.c#n10502最终调用这里定义的'gdk_window_fullscreen_on_monitor':https://git.gnome.org/browse/ gtk +/tree/gdk/gdkwindow.c?id = ea1295c9ab40ab8c1b5b80ccf1575710c5ff6b86#n10820然后我不知道如何进一步关注。 –

+0

如果你看看源代码,一切确实显得很好。所以问题的根源很可能在GTK Python Bindings或Window Manager中。要备份此声明,您自己的代码已经显示出来,设置不同的监视器编号不会导致不同的行为。但底部的代码确实有效:) – B8vrede

+1

我确认它可以工作。谢谢! FTR:我在Ubuntu 16.04上运行GNOME 3.18。 –