init
This commit is contained in:
commit
dd0280a1e5
|
@ -0,0 +1,43 @@
|
||||||
|
BasedOnStyle: Google
|
||||||
|
|
||||||
|
# force T* or T&
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
PointerAlignment: Left
|
||||||
|
|
||||||
|
TabWidth: 4
|
||||||
|
IndentWidth: 4
|
||||||
|
UseTab: Always
|
||||||
|
IndentPPDirectives: BeforeHash
|
||||||
|
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
|
AllowShortBlocksOnASingleLine: false
|
||||||
|
AllowShortFunctionsOnASingleLine: InlineOnly
|
||||||
|
AllowShortIfStatementsOnASingleLine: Never
|
||||||
|
AllowShortLoopsOnASingleLine: false
|
||||||
|
AllowShortCaseLabelsOnASingleLine: true
|
||||||
|
|
||||||
|
BinPackArguments: true
|
||||||
|
BinPackParameters: true
|
||||||
|
BreakConstructorInitializers: BeforeColon
|
||||||
|
BreakStringLiterals: false
|
||||||
|
|
||||||
|
CompactNamespaces: false
|
||||||
|
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||||
|
ContinuationIndentWidth: 0
|
||||||
|
|
||||||
|
# turning this on causes major issues with initializer lists
|
||||||
|
Cpp11BracedListStyle: false
|
||||||
|
SpaceBeforeCpp11BracedList: true
|
||||||
|
|
||||||
|
FixNamespaceComments: true
|
||||||
|
|
||||||
|
NamespaceIndentation: All
|
||||||
|
ReflowComments: true
|
||||||
|
|
||||||
|
SortIncludes: CaseInsensitive
|
||||||
|
SortUsingDeclarations: true
|
||||||
|
|
||||||
|
SpacesInSquareBrackets: false
|
||||||
|
SpaceBeforeParens: Never
|
||||||
|
SpacesBeforeTrailingComments: 1
|
|
@ -0,0 +1,11 @@
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
# specifically for YAML
|
||||||
|
[{yml, yaml}]
|
||||||
|
indent_style = space
|
|
@ -0,0 +1,5 @@
|
||||||
|
build/
|
||||||
|
cmake-build-*/
|
||||||
|
/.idea
|
||||||
|
.cache/
|
||||||
|
/compile_commands.json
|
|
@ -0,0 +1,19 @@
|
||||||
|
Copyright (c) 2024 Lily Tsuru <lily@crustywindo.ws>, The NanoSM authors
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
|
@ -0,0 +1,22 @@
|
||||||
|
# nanosm
|
||||||
|
|
||||||
|
A nano-sized not-really-a session manager intended to replace less-than-robust Bash/etc scripts.
|
||||||
|
|
||||||
|
Written in C++20.
|
||||||
|
|
||||||
|
# Why write this?
|
||||||
|
|
||||||
|
Because `app &` then `exec wm` is impressively awful. What if your WM crashes, or your panel? Guess you lose them!
|
||||||
|
|
||||||
|
And if your WM crashes? Your whole xorg server goes with it, meaning so does everything else.
|
||||||
|
|
||||||
|
A more robust solution that's still small and easy to setup is clearly a better idea.
|
||||||
|
|
||||||
|
# Installation
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
|
||||||
|
- Copy `/usr/share/doc/nanosm/nanosm.toml` to `~/.config/nanosm/` and edit it to your liking.
|
||||||
|
- Add `exec nanosm` to the end of your `.xinitrc`.
|
|
@ -0,0 +1,18 @@
|
||||||
|
# The nanosm(1) configuration file.
|
||||||
|
|
||||||
|
[nanosm]
|
||||||
|
# The window manager you want to use. This is the first application
|
||||||
|
# launched, and this will always be true
|
||||||
|
window-manager="/path/to/wm/binary --any-additional-args-here"
|
||||||
|
|
||||||
|
# Enable verbose debug logging. Only useful for debugging issues.
|
||||||
|
verbose=false
|
||||||
|
|
||||||
|
# Restart delay in seconds.
|
||||||
|
restart-delay=1
|
||||||
|
|
||||||
|
# Any applications besides your window manager you want to run at startup.
|
||||||
|
# Note that applications are executed in the order they are declared.
|
||||||
|
[nanosm.apps]
|
||||||
|
lxpanel = { command = "lxpanel" }
|
||||||
|
pcmanfm-desktop = { command = "pcmanfm --desktop" }
|
|
@ -0,0 +1,34 @@
|
||||||
|
#include <memory>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
namespace nanosm {
|
||||||
|
|
||||||
|
/// The nanosm event loop. Pretty barren.
|
||||||
|
struct EventLoop {
|
||||||
|
|
||||||
|
/// A pollable object.
|
||||||
|
struct Pollable {
|
||||||
|
virtual ~Pollable() = default;
|
||||||
|
|
||||||
|
/// Returns the FD. May return nullopt if there is no active file descriptor
|
||||||
|
/// for this polled object (this simply means you won't get events until there is one)
|
||||||
|
virtual std::optional<int> GetFD() const = 0;
|
||||||
|
|
||||||
|
/// Called when the object is ready (do any i/o or handling here)
|
||||||
|
virtual void OnReady() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
EventLoop();
|
||||||
|
~EventLoop();
|
||||||
|
|
||||||
|
/// Add an object to the epoll event loop.
|
||||||
|
void AddObject(int fd, std::shared_ptr<Pollable> obj);
|
||||||
|
|
||||||
|
/// Runs the main loop.
|
||||||
|
void Run();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int epollFd{};
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
general
|
||||||
|
|
||||||
|
|
||||||
|
timer:
|
||||||
|
|
||||||
|
nanosm::Timer : nanosm::EventLoop::Pollable
|
||||||
|
bool Set(... duration, ... callback);
|
||||||
|
// OnReady() will just call the timer callback
|
||||||
|
|
||||||
|
|
||||||
|
proesses:
|
||||||
|
|
||||||
|
nanosm::Process : nanosm::EventLoop::Pollable
|
||||||
|
void Kill();
|
||||||
|
bool Spawn(... exitCallback);
|
||||||
|
|
||||||
|
static std::shared_ptr<Process> SpawnCmdLine();
|
||||||
|
|
||||||
|
nanosm::RestartingProcess final : Process
|
||||||
|
// spawn is shadowed by a version that exits callback to set timerfd-backed timer which on expiry/callback will be cancelled
|
||||||
|
// then spawn the process again (which will make it have a valid pidfd again etc etc
|
||||||
|
|
||||||
|
std::shared_ptr<Timer> timer;
|
||||||
|
|
||||||
|
program mainn flow:
|
||||||
|
|
||||||
|
main()
|
||||||
|
parse config (fail if it's bad)
|
||||||
|
create state (nanosm::NanoSm), from parsed config
|
||||||
|
create event loop
|
||||||
|
post callback into event loop to run state
|
||||||
|
run event loop
|
||||||
|
|
||||||
|
nanosm::NanoSm::Run()
|
||||||
|
spawn wm (if this fails give up and exit early)
|
||||||
|
for each app (in toml order):
|
||||||
|
spawn app
|
||||||
|
|
||||||
|
return (the event loop wil persist and keep everything alive until it needs to shutdown)
|
|
@ -0,0 +1,8 @@
|
||||||
|
#include "EventLoop.hpp"
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
nanosm::EventLoop ev;
|
||||||
|
|
||||||
|
ev.Run();
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue