diff --git a/src/nimwin.nim b/src/nimwin.nim index 2239bfd..aabb70f 100644 --- a/src/nimwin.nim +++ b/src/nimwin.nim @@ -452,6 +452,23 @@ proc deleteWindow(display : PDisplay, window : Window) = else: discard display.XDestroyWindow(window.win) +proc setActiveWindow(display : PDisplay, root : TWindow, window : PWindow) = + let netActiveWindow : TAtom = display.XInternAtom("_NET_ACTIVE_WINDOW", false.TBool) + let windowType : TAtom = display.XInternAtom("WINDOW", false.TBool) + discard display.XChangeProperty(root, netActiveWindow, windowType, 32, PropModeReplace, cast[ptr cuchar](window), 1) + +proc getActiveWindowName(display : PDisplay, root : TWindow) : Option[string] = + var winNameReturn : cstring + + for prop in getProperties(display, root): + if prop.isSome and prop.get.kind == pkWindow and prop.get.name == "_NET_ACTIVE_WINDOW": + if prop.get.windowProps.len > 0: + discard display.XFetchName(prop.get.windowProps[0], winNameReturn.addr) + + result = cstringToNim(winNameReturn) + discard winNameReturn.XFree + + when isMainModule: discard "~/.nimwin".expandTilde.existsOrCreateDir @@ -598,6 +615,11 @@ when isMainModule: windowZipper.rhs = windowStack.reversed windowZipper.lhs = @[] + if currentFocus.isSome: + var focus = currentFocus.get + display.setActiveWindow(root, focus.addr) + echo display.getActiveWindowName(root) + elif (ev.theType == MapNotify) and (ev.xmap.override_redirect == 0): let rootAttrs = getAttributes(display, root.addr) if rootAttrs.isSome: