select certain monitor for going fullscreen with gtk

时光怂恿深爱的人放手 提交于 2021-02-07 14:42:54

问题


I intend to change the monitor where I show a fullscreen window. This is especially interesting when having a projector hooked up.

I've tried to use fullscreen_on_monitor but that doesn't produce any visible changes.

Here is a non-working example:

#!/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()

I get to see the window on the very same monitor (out of 3), regardless of the value I provide.

My question is: how do I make the fullscreen window appear on a different monitor?


回答1:


The problem seems to be that Gtk just ignores the monitor number, it will always fullscreen the window on the monitor on which the window currently is positioned. This sucks, but we can use that to make it work the way we want to.

But first some theory about multiple monitors, they aren't actually separate monitors for your pc. It considers them to collectively form one screen which share the same global origin. On that global screen each monitor has a origin relative to the global origin, just like windows.

Because we know that Gtk will always fullscreen on the monitor on which the window is we can simply move the window to the origin of the monitor using window.move(x,y) and then call window.fullscreen().

(The move function will move the window to a position (x,y) relative to it's parent, which in the case of the main window is the global screen.)

Combining all this we get this, which works perfectly on 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()



回答2:


Here is an updated version of @B8vrede's answer, because get_monitor_geometry is deprecated since 3.22.

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()


来源:https://stackoverflow.com/questions/39367246/select-certain-monitor-for-going-fullscreen-with-gtk

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!