Browse Source

refactor window type to include seq of props

fix-resizing
Wesley Kerfoot 4 years ago
parent
commit
7fb32e46f6
  1. 56
      src/nimwin.nim

56
src/nimwin.nim

@ -17,6 +17,14 @@ template HandleKey(key : TKeySym, body : untyped) : untyped =
if (XLookupKeySym(cast[PXKeyEvent](ev.xkey.addr), 0) == key.cuint): if (XLookupKeySym(cast[PXKeyEvent](ev.xkey.addr), 0) == key.cuint):
body body
type
WinPropKind = enum pkString, pkCardinal
WinProp = ref object of RootObj
name : string
case kind: WinPropKind
of pkString: strProp : string
of pkCardinal: cardinalProp : seq[uint]
type Window = ref object of RootObj type Window = ref object of RootObj
x : cint x : cint
y : cint y : cint
@ -24,13 +32,7 @@ type Window = ref object of RootObj
height : cint height : cint
win : TWindow win : TWindow
screen : PScreen screen : PScreen
props : seq[WinProp]
type
WinPropKind = enum pkString, pkCardinal
WinProp = ref object of RootObj
case kind: WinPropKind
of pkString: strProp : string
of pkCardinal: cardinalProp : seq[uint]
proc unpackCardinal(typeFormat : int, proc unpackCardinal(typeFormat : int,
nItems : int, nItems : int,
@ -73,6 +75,11 @@ proc getPropertyValue(display : PDisplay, window : TWindow, property : TAtom) :
var bytesAfterReturn : culong var bytesAfterReturn : culong
var propValue : ptr cuchar var propValue : ptr cuchar
var currentAtomName = display.XGetAtomName(property)
var atomName = newString(currentAtomName.len)
copyMem(addr(atomName[0]), currentAtomName, currentAtomName.len)
discard currentAtomName.XFree
discard display.XGetWindowProperty(window, discard display.XGetWindowProperty(window,
property, property,
longOffset, longOffset,
@ -90,10 +97,11 @@ proc getPropertyValue(display : PDisplay, window : TWindow, property : TAtom) :
if typeName == "STRING": if typeName == "STRING":
var propStrValue = newString(propValue.len) var propStrValue = newString(propValue.len)
copyMem(addr(propStrValue[0]), propValue, propValue.len) copyMem(addr(propStrValue[0]), propValue, propValue.len)
result = some(WinProp(kind: pkString, strProp: propStrValue)) result = some(WinProp(name: atomName, kind: pkString, strProp: propStrValue))
elif typeName == "CARDINAL": elif typeName == "CARDINAL":
result = some( result = some(
WinProp( WinProp(
name: atomName,
kind: pkCardinal, kind: pkCardinal,
cardinalProp: unpackCardinal(actualTypeFormat.int, nitemsReturn.int, propValue) cardinalProp: unpackCardinal(actualTypeFormat.int, nitemsReturn.int, propValue)
) )
@ -105,14 +113,13 @@ proc getPropertyValue(display : PDisplay, window : TWindow, property : TAtom) :
return return
iterator getProperties(display : PDisplay, window : TWindow) : string = iterator getProperties(display : PDisplay, window : TWindow) : Option[WinProp] =
# Get property names/values of a given window on a display # Get property names/values of a given window on a display
var nPropsReturn : cint var nPropsReturn : cint
# pointer to a list of word32 # pointer to a list of word32
var atoms : PAtom = display.XListProperties(window, nPropsReturn.addr) var atoms : PAtom = display.XListProperties(window, nPropsReturn.addr)
var currentAtom : PAtom var currentAtom : PAtom
var currentAtomName : cstring
# Iterate over the list of atom names # Iterate over the list of atom names
for i in 0..(nPropsReturn.int - 1): for i in 0..(nPropsReturn.int - 1):
@ -120,19 +127,7 @@ iterator getProperties(display : PDisplay, window : TWindow) : string =
cast[int](atoms) + cast[int](i * currentAtom[].sizeof) cast[int](atoms) + cast[int](i * currentAtom[].sizeof)
) )
let propValue = display.getPropertyValue(window, currentAtom[]) yield display.getPropertyValue(window, currentAtom[])
currentAtomName = display.XGetAtomName(currentAtom[])
var atomName = newString(currentAtomName.len)
copyMem(addr(atomName[0]), currentAtomName, currentAtomName.len)
discard currentAtomName.XFree
if propValue.isSome:
if propValue.get.kind == pkCardinal:
echo atomName, ": ", propValue.get.cardinalProp
if propValue.get.kind == pkString:
echo atomName, ": ", propValue.get.strProp
yield atomName
discard atoms.XFree discard atoms.XFree
@ -174,21 +169,18 @@ iterator getChildren(display : PDisplay, logFile : File) : Window =
if attr.get.override_redirect == 1: if attr.get.override_redirect == 1:
continue continue
let props = map(toSeq(getProperties(display, currentWindow[])).filterIt(it.isSome), (p) => p.get)
let win = Window( let win = Window(
x: attr.get.x.cint, x: attr.get.x.cint,
y: attr.get.y.cint, y: attr.get.y.cint,
width: attr.get.width, width: attr.get.width,
height: attr.get.height, height: attr.get.height,
win: currentWindow[], win: currentWindow[],
screen: attr.get.screen screen: attr.get.screen,
props: props
) )
let ignored = @["_NET_WM_STRUT_PARTIAL", "_NET_WM_STRUT"]
let winProps = toSeq(getProperties(display, win.win))
if winProps.anyIt(it.in(ignored)):
continue
yield win yield win
discard XFree(childrenReturn) discard XFree(childrenReturn)
@ -336,7 +328,9 @@ when isMainModule:
#discard XCirculateSubwindows(display, root, RaiseLowest) #discard XCirculateSubwindows(display, root, RaiseLowest)
#discard display.XFlush() #discard display.XFlush()
let windowStack = toSeq(getChildren(display, logFile)) let ignored = @["_NET_WM_STRUT_PARTIAL", "_NET_WM_STRUT"]
let windowStack = filter(toSeq(getChildren(display, logFile)), (w) => not w.props.anyIt(it.name.in(ignored)))
discard display.XSetInputFocus(windowStack[0].win, RevertToPointerRoot, CurrentTime) discard display.XSetInputFocus(windowStack[0].win, RevertToPointerRoot, CurrentTime)
discard display.XRaiseWindow(windowStack[0].win) discard display.XRaiseWindow(windowStack[0].win)

Loading…
Cancel
Save