2016-09-07 93 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。 –