app: added support for fullscreen mode

The option field WindowMode allows changing the window mode of an application in either Windowed or Fullscreen.
Only macOS, Windows and X11 platforms are currently supported.

Updates gio#89.

Signed-off-by: pierre <pierre.curto@gmail.com>
This commit is contained in:
pierre
2021-03-23 15:39:25 +01:00
committed by Elias Naur
parent bc2c3db43e
commit 238dd1aa86
7 changed files with 171 additions and 1 deletions
+24 -1
View File
@@ -71,6 +71,12 @@ type x11Window struct {
atom C.Atom
// "GTK_TEXT_BUFFER_CONTENTS"
gtk_text_buffer_contents C.Atom
// "_NET_WM_NAME"
wmName C.Atom
// "_NET_WM_STATE"
wmState C.Atom
// _NET_WM_STATE_FULLSCREEN"
wmStateFullscreen C.Atom
}
stage system.Stage
cfg unit.Metric
@@ -141,6 +147,18 @@ func (w *x11Window) SetCursor(name pointer.CursorName) {
C.XDefineCursor(w.x, w.xw, c)
}
func (w *x11Window) SetWindowMode(mode WindowMode) {
switch mode {
case Windowed:
C.XDeleteProperty(w.x, w.xw, w.atoms.wmStateFullscreen)
case Fullscreen:
C.XChangeProperty(w.x, w.xw, w.atoms.wmState, C.XA_ATOM,
32, C.PropModeReplace,
(*C.uchar)(unsafe.Pointer(&w.atoms.wmStateFullscreen)), 1,
)
}
}
func (w *x11Window) ShowTextInput(show bool) {}
// Close the window.
@@ -612,6 +630,9 @@ func newX11Window(gioWin Callbacks, opts *Options) error {
w.atoms.clipboardContent = w.atom("CLIPBOARD_CONTENT", false)
w.atoms.atom = w.atom("ATOM", false)
w.atoms.targets = w.atom("TARGETS", false)
w.atoms.wmName = w.atom("_NET_WM_NAME", false)
w.atoms.wmState = w.atom("_NET_WM_STATE", false)
w.atoms.wmStateFullscreen = w.atom("_NET_WM_STATE_FULLSCREEN", false)
// set the name
ctitle := C.CString(opts.Title)
@@ -625,11 +646,13 @@ func newX11Window(gioWin Callbacks, opts *Options) error {
format: 8,
nitems: C.ulong(len(opts.Title)),
},
w.atom("_NET_WM_NAME", false))
w.atoms.wmName)
// extensions
C.XSetWMProtocols(dpy, win, &w.atoms.evDelWindow, 1)
w.SetWindowMode(opts.WindowMode)
// make the window visible on the screen
C.XMapWindow(dpy, win)