app: add Window.Raise to bring a window to the front

Fixes gio#252

Signed-off-by: Pierre Curto <pierre.curto@gmail.com>
This commit is contained in:
Pierre Curto
2021-09-08 22:02:26 +02:00
committed by Elias Naur
parent c5d4e01e3d
commit 2f66ed1dc8
10 changed files with 61 additions and 0 deletions
+23
View File
@@ -79,6 +79,8 @@ type x11Window struct {
wmState C.Atom
// "_NET_WM_STATE_FULLSCREEN"
wmStateFullscreen C.Atom
// "_NET_ACTIVE_WINDOW"
wmActiveWindow C.Atom
}
stage system.Stage
metric unit.Metric
@@ -165,6 +167,26 @@ func (w *x11Window) Config() Config {
return w.config
}
func (w *x11Window) Raise() {
var xev C.XEvent
ev := (*C.XClientMessageEvent)(unsafe.Pointer(&xev))
*ev = C.XClientMessageEvent{
_type: C.ClientMessage,
display: w.x,
window: w.xw,
message_type: w.atoms.wmActiveWindow,
format: 32,
}
C.XSendEvent(
w.x,
C.XDefaultRootWindow(w.x), // MUST be the root window
C.False,
C.SubstructureNotifyMask|C.SubstructureRedirectMask,
&xev,
)
C.XMapRaised(w.display(), w.xw)
}
func (w *x11Window) SetCursor(name pointer.CursorName) {
switch name {
case pointer.CursorNone:
@@ -680,6 +702,7 @@ func newX11Window(gioWin *callbacks, options []Option) error {
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)
w.atoms.wmActiveWindow = w.atom("_NET_ACTIVE_WINDOW", false)
// extensions
C.XSetWMProtocols(dpy, win, &w.atoms.evDelWindow, 1)