diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/config.nim | 29 | ||||
-rw-r--r-- | src/kauw.nim | 16 | ||||
-rw-r--r-- | src/logger.nim | 3 | ||||
-rw-r--r-- | src/types.nim | 18 | ||||
-rw-r--r-- | src/windowmanager.nim | 106 |
5 files changed, 172 insertions, 0 deletions
diff --git a/src/config.nim b/src/config.nim new file mode 100644 index 0000000..23bd093 --- /dev/null +++ b/src/config.nim @@ -0,0 +1,29 @@ +import types + +# settings, or something along those lines +# currently unused +const + # default mod key, run xmodmap to see what the mod keys are on your current keyboard layout + # Mod1 is alt and Mod4 is super + modifier* = "mod1" + + # if it isn't obvious, hex values go here + colours* = ( + focused: 0xFBFDFF, + unfocused: 0x9BCDFF, + background: 0x232323) + + # store keybindings here + keybindings*: seq[Key] = @[ + closeWindow.initKey( + keys = @["c"], + mods = @[modifier, "shift"]), + + nextWindow.initKey( + keys = @["tab"], + mods = @[modifier]), + + spawnCustom.initKey( + keys = @["return"], + mods = @[modifier], + "st")]
\ No newline at end of file diff --git a/src/kauw.nim b/src/kauw.nim new file mode 100644 index 0000000..c1b0d4c --- /dev/null +++ b/src/kauw.nim @@ -0,0 +1,16 @@ +import + /windowmanager, + logging, /logger + +proc main() = + let wm = createWindowManager() + + if wm == nil: + consoleLog.log(lvlError, "failed to initialize window manager") + quit QuitFailure + + wm.run() + + quit QuitSuccess + +main()
\ No newline at end of file diff --git a/src/logger.nim b/src/logger.nim new file mode 100644 index 0000000..8e0c36f --- /dev/null +++ b/src/logger.nim @@ -0,0 +1,3 @@ +import logging + +var consoleLog* = newConsoleLogger(fmtStr="kauw/ $time/ $levelname: ")
\ No newline at end of file diff --git a/src/types.nim b/src/types.nim new file mode 100644 index 0000000..0352fc2 --- /dev/null +++ b/src/types.nim @@ -0,0 +1,18 @@ +type + KeyFunc* = enum + closeWindow, + nextWindow, + spawnCustom + + Key* = object + mods*: seq[string] + keys*: seq[string] + keyfunc*: KeyFunc + command*: string + +proc initKey* (keyfunc: KeyFunc, mods: seq[string], keys: seq[string], command = ""): Key = + return Key( + mods: mods, + keys: keys, + command: command, + keyfunc: keyfunc)
\ No newline at end of file diff --git a/src/windowmanager.nim b/src/windowmanager.nim new file mode 100644 index 0000000..e90ec94 --- /dev/null +++ b/src/windowmanager.nim @@ -0,0 +1,106 @@ +import + x11/[x, xlib], + logging, /logger + +type + WindowManager* = ref object + display: PDisplay + root: Window + +# Error Handlers +proc onWMDetected (display: PDisplay, e: PXErrorEvent): cint{.cdecl.} +proc onXError (display: PDisplay, e: PXErrorEvent): cint{.cdecl.} + +# Events +proc onCreateNotify (wm: WindowManager, e: PXCreateWindowEvent): void +proc onDestroyNotify (wm: WindowManager, e: PXDestroyWindowEvent): void +proc onReparentNotify (wm: WindowManager, e: PXReparentEvent): void +proc onMapNotify (wm: WindowManager, e: PXMapEvent): void +proc onUnmapNotify (wm: WindowManager, e: PXUnmapEvent): void +proc onConfigureNotify (wm: WindowManager, e: PXConfigureEvent): void +proc onMapRequest (wm: WindowManager, e: PXMapRequestEvent): void +proc onConfigureRequest (wm: WindowManager, e: PXConfigureRequestEvent): void +proc onButtonPress (wm: WindowManager, e: PXButtonEvent): void +proc onButtonRelease (wm: WindowManager, e: PXButtonEvent): void +proc onMotionNotify (wm: WindowManager, e: PXMotionEvent): void +proc onKeyPress (wm: WindowManager, e: PXKeyEvent): void +proc onKeyRelease (wm: WindowManager, e: PXKeyEvent): void + +# Run window manager +proc run* (wm: WindowManager) = + discard XSetErrorHandler onWMDetected # Temporary error handler if there is another window manager running + + discard wm.display.XSelectInput(wm.root, SubstructureNotifyMask or SubstructureRedirectMask) + discard wm.display.XSync XBool false + + discard XSetErrorHandler onXError + + while true: + var e: PXEvent + discard wm.display.XNextEvent e + + case e.theType: + of CreateNotify: wm.onCreateNotify addr e.xcreatewindow + of DestroyNotify: wm.onDestroyNotify addr e.xdestroywindow + of ReparentNotify: wm.onReparentNotify addr e.xreparent + of MapNotify: wm.onMapNotify addr e.xmap + of UnmapNotify: wm.onUnmapNotify addr e.xunmap + of ConfigureNotify: wm.onConfigureNotify addr e.xconfigure + of MapRequest: wm.onMapRequest addr e.xmaprequest + of ConfigureRequest: wm.onConfigureRequest addr e.xconfigurerequest + of ButtonPress: wm.onButtonPress addr e.xbutton + of ButtonRelease: wm.onButtonRelease addr e.xbutton + of MotionNotify: wm.onMotionNotify addr e.xmotion + of KeyPress: wm.onKeyPress addr e.xkey + of KeyRelease: wm.onKeyRelease addr e.xkey + else: consoleLog.log(lvlWarn, "ignored event") + +proc createWindowManager*: WindowManager = + var display = XOpenDisplay nil + + if display == nil: + consoleLog.log(lvlError, "failed to open X display " & $XDisplayName nil) + quit QuitFailure + + return WindowManager( + display: display, + root: display.DefaultRootWindow()) + +# Error Handlers +proc onWMDetected (display: PDisplay, e: PXErrorEvent): cint{.cdecl.} = + if e.theType == BadAccess: + consoleLog.log(lvlError, "other window manager detected") + quit QuitFailure + + return 0 + +proc onXError (display: PDisplay, e: PXErrorEvent): cint{.cdecl.} = + var errorText = newString 1024 + + discard display.XGetErrorText( + cint e.error_code, + cstring errorText, + cint len errorText) + + consoleLog.log( + lvlError, "received X error: \n" & + " request: " & $e.request_code & "\n" & + " error code: " & $e.error_code & " - " & errorText & "\n" & + " resource id: " & $e.resourceid) + + return 0 + +# Events +proc onCreateNotify (wm: WindowManager, e: PXCreateWindowEvent) = return +proc onDestroyNotify (wm: WindowManager, e: PXDestroyWindowEvent) = return +proc onReparentNotify (wm: WindowManager, e: PXReparentEvent) = return +proc onMapNotify (wm: WindowManager, e: PXMapEvent) = return +proc onUnmapNotify (wm: WindowManager, e: PXUnmapEvent) = return +proc onConfigureNotify (wm: WindowManager, e: PXConfigureEvent) = return +proc onMapRequest (wm: WindowManager, e: PXMapRequestEvent) = return +proc onConfigureRequest (wm: WindowManager, e: PXConfigureRequestEvent) = return +proc onButtonPress (wm: WindowManager, e: PXButtonEvent) = return +proc onButtonRelease (wm: WindowManager, e: PXButtonEvent) = return +proc onMotionNotify (wm: WindowManager, e: PXMotionEvent) = return +proc onKeyPress (wm: WindowManager, e: PXKeyEvent) = return +proc onKeyRelease (wm: WindowManager, e: PXKeyEvent) = return
\ No newline at end of file |