Browse Source

ignore sticky windows

master
Wesley Kerfoot 4 years ago
parent
commit
277f870b59
  1. 56
      src/nimwin.nim

56
src/nimwin.nim

@ -20,12 +20,13 @@ template HandleKey(key : TKeySym, body : untyped) : untyped =
body
type
WinPropKind = enum pkString, pkCardinal
WinPropKind = enum pkString, pkCardinal, pkAtom
WinProp = ref object of RootObj
name : string
case kind: WinPropKind
of pkString: strProp : string
of pkCardinal: cardinalProp : seq[uint]
of pkAtom: atomProps : seq[string]
type Window = ref object of RootObj
x : cint
@ -73,7 +74,7 @@ proc getPropertyValue(display : PDisplay, window : TWindow, property : TAtom) :
var actualType : TAtom
var actualTypeFormat : cint
var nitemsReturn : culong
var nItemsReturn : culong
var bytesAfterReturn : culong
var propValue : ptr cuchar
@ -90,7 +91,7 @@ proc getPropertyValue(display : PDisplay, window : TWindow, property : TAtom) :
AnyPropertyType.TAtom,
actualType.addr,
actualTypeFormat.addr,
nitemsReturn.addr,
nItemsReturn.addr,
bytesAfterReturn.addr,
propValue.addr)
@ -108,7 +109,30 @@ proc getPropertyValue(display : PDisplay, window : TWindow, property : TAtom) :
WinProp(
name: atomName,
kind: pkCardinal,
cardinalProp: unpackCardinal(actualTypeFormat.int, nitemsReturn.int, propValue)
cardinalProp: unpackCardinal(actualTypeFormat.int, nItemsReturn.int, propValue)
)
)
elif typeName == "ATOM":
var currentAtomName : cstring
var atomNames : seq[string]
discard display.XGetAtomNames(cast[PAtom](propValue), nItemsReturn.cint, currentAtomName.addr)
var currentAtomNames : ptr cstring = currentAtomName.addr
for i in 0..(nItemsReturn.int - 1):
currentAtomName = (cast[ptr cstring](
cast[int](currentAtomNames) + cast[int](i * currentAtomNames[].sizeof)
))[]
var atomStrValue : string = newString(currentAtomName.len)
copyMem(addr(atomStrValue[0]), currentAtomName, currentAtomName.len)
if atomStrValue.len > 0:
atomNames &= atomStrValue
result = some(
WinProp(
name: atomName,
kind: pkAtom,
atomProps: atomNames
)
)
else:
@ -199,6 +223,8 @@ iterator getChildren(display : PDisplay) : Window =
echo prop.name, ": ", prop.cardinalProp
else:
echo prop.name, prop.kind
if prop.kind == pkAtom:
echo "Atoms = ", prop.atomProps
yield win
@ -289,6 +315,19 @@ proc calculateStruts(display : PDisplay) : tuple[top: uint, bottom: uint]=
result.top = max(result.top, prop.cardinalProp[2])
result.bottom = max(result.bottom, prop.cardinalProp[3])
proc shouldTrackWindow(window : Window) : bool =
let ignored = @["_NET_WM_STRUT_PARTIAL", "_NET_WM_STRUT"]
if window.props.anyIt(it.name.in(ignored)):
return false
for prop in window.props:
if prop.kind == pkAtom:
for atomValue in prop.atomProps:
if atomValue == "_NET_WM_STATE_STICKY":
return false
return true
when isMainModule:
discard "~/.nimwin".expandTilde.existsOrCreateDir
@ -356,9 +395,7 @@ when isMainModule:
#discard XCirculateSubwindows(display, root, RaiseLowest)
#discard display.XFlush()
let ignored = @["_NET_WM_STRUT_PARTIAL", "_NET_WM_STRUT"]
let windowStack = filter(toSeq(getChildren(display)), (w) => not w.props.anyIt(it.name.in(ignored)))
let windowStack = filter(toSeq(getChildren(display)), shouldTrackWindow)
if windowStack.len > 0:
discard display.XSetInputFocus(windowStack[0].win, RevertToPointerRoot, CurrentTime)
@ -432,6 +469,11 @@ when isMainModule:
# Ignore struts
ignore = true
break
if prop.isSome and prop.get.kind == pkAtom:
for atomValue in prop.get.atomProps:
if atomValue == "_NET_WM_STATE_STICKY":
ignore = true
break
if not ignore:
discard XMoveResizeWindow(display,

Loading…
Cancel
Save