#!/usr/bin/env ruby # Require X-kutu library for all x11 functions require_relative "./src/ruby/X-kutu" # Require dependencies require 'json' require 'socket' # Initialize X if X.deploy >= 0 puts "Started kutu WM for X11 successfully! :)" else raise "Failed to deploy X" end # Require submodules require_relative "./src/ruby/utils" require_relative "./src/ruby/controller" require_relative "./src/ruby/window" require_relative "./src/ruby/workspace" require_relative "./src/ruby/events" require_relative "./src/ruby/commands" # Cleanup on exit at_exit do X.cleanup puts "Exited kutu WM, sadly :(" end # Globals $monitors = {} $windows = {} $all_windows = [] $keybind_actions = {} $mousebind_actions = {} $mouse_data = {} $root = X.get_root $rect = {} # Initialize monitors load_monitors! # Run startup script run File.join(__dir__, "./src/shell/startup.sh") # Add keybinds load File.join(__dir__, "./src/ruby/bindings.rb") # Setup unix socket SOCK_PATH = "/tmp/kutu.sock" File.delete(SOCK_PATH) if File.exist?(SOCK_PATH) $socket = Socket.new(:UNIX, :DGRAM) $socket.bind(Socket.pack_sockaddr_un(SOCK_PATH)) # Main loop loop do if IO.select([$socket], nil, nil, 0) command, sender = $socket.recvfrom(1024) reply = handle_command(command) $socket.send(JSON.generate(reply), 0, sender) end event_pointer = X.next_event if !event_pointer.null? event = X.translate_event(event_pointer) handle_event(event) end X.flush sleep 0.001 end