select 使用 gtk 进入全屏的特定显示器
select certain monitor for going fullscreen with gtk
我打算更换显示全屏的显示器 window。
这在连接投影仪时特别有趣。
我试过使用 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()
无论我提供什么值,我都能在同一台显示器上看到 window(共 3 台)。
我的问题是:如何在不同的显示器上显示全屏 window?
问题似乎是 Gtk 只是忽略了显示器编号,它总是会在 window 当前所在的显示器上全屏显示 window。这很糟糕,但我们可以用它来让它按照我们想要的方式工作。
但首先是关于多显示器的一些理论,它们实际上并不是您电脑的独立显示器。它认为它们共同形成一个共享相同全球起源的屏幕。在那个全局屏幕上,每个监视器都有一个相对于全局原点的原点,就像 windows。
因为我们知道 Gtk 将始终在 window 所在的监视器上全屏显示,我们可以使用 window.move(x,y)
将 window 简单地移动到监视器的原点,然后调用window.fullscreen()
。
(move
函数会将 window 移动到相对于其父级的 (x,y)
位置,在主 window 的情况下是全局屏幕.)
结合所有这些我们得到这个,它在 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()
这是@B8vrede 答案的更新版本,因为从 3.22 开始 get_monitor_geometry
是 deprecated。
def fullscreen_at_monitor(window, n):
display = Gdk.Display.get_default()
monitor = Gdk.Display.get_monitor(display, n)
geometry = monitor.get_geometry()
x = geometry.x
y = geometry.y
window.move(x,y)
window.fullscreen()
我打算更换显示全屏的显示器 window。 这在连接投影仪时特别有趣。
我试过使用 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()
无论我提供什么值,我都能在同一台显示器上看到 window(共 3 台)。
我的问题是:如何在不同的显示器上显示全屏 window?
问题似乎是 Gtk 只是忽略了显示器编号,它总是会在 window 当前所在的显示器上全屏显示 window。这很糟糕,但我们可以用它来让它按照我们想要的方式工作。
但首先是关于多显示器的一些理论,它们实际上并不是您电脑的独立显示器。它认为它们共同形成一个共享相同全球起源的屏幕。在那个全局屏幕上,每个监视器都有一个相对于全局原点的原点,就像 windows。
因为我们知道 Gtk 将始终在 window 所在的监视器上全屏显示,我们可以使用 window.move(x,y)
将 window 简单地移动到监视器的原点,然后调用window.fullscreen()
。
(move
函数会将 window 移动到相对于其父级的 (x,y)
位置,在主 window 的情况下是全局屏幕.)
结合所有这些我们得到这个,它在 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()
这是@B8vrede 答案的更新版本,因为从 3.22 开始 get_monitor_geometry
是 deprecated。
def fullscreen_at_monitor(window, n):
display = Gdk.Display.get_default()
monitor = Gdk.Display.get_monitor(display, n)
geometry = monitor.get_geometry()
x = geometry.x
y = geometry.y
window.move(x,y)
window.fullscreen()