summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/config.nim29
-rw-r--r--src/kauw.nim16
-rw-r--r--src/logger.nim3
-rw-r--r--src/types.nim18
-rw-r--r--src/windowmanager.nim106
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