Awesome!
No, that's not your cries of joy. Awesome is the Window Manager that I use on all of my machines nowadays. In addition to laying out my windows in a pleasing fashion, it also exposes a powerful lua API for customizing and scripting, well, everything. This includes the UI, allowing for some very in-depth customizations!Last time, I made a list of tasks to complete:
- Automatically opening my wiki every morning
- A simple timer that fits with my workflow
- A way to create tasks remotely while at work
Hello, Wiki!
Originally, I said that opening my wiki in the morning would be "super-easy to do". I lied! I lied to everyone, even myself! And what a lie it was.An Unexpected Snag
The easiest way for me to make programs start on launch is to add them to my xinitrc file. In this case, I actually can't do that. Because the terminal that I run vim in won't have its settings ready before my xinitrc finishes running. That means that if I use my xinitrc to bring up my wiki, the colors and fonts will be wrong and it'll have a horrifying scrollbar that looks like it crawled out of Windows 3.1.Obviously, I don't want that. Awesome gives me the ability to run applications, so I can have it launch my wiki. Perfect, right? Wrong! To help debug scripts and configuration, Awesome provides a mechanism to restart it without closing anything. This is also great! However, this means that every time I restart Awesome it'll also open the wiki again. So, we have a conundrum.
The Solution
The second problem can be solved, but it'll take a few small additions. The goal here is to have Awesome run certain programs on startup, but only if it isn't restarting. To do that, I need to store some information across runs.Conveniently, Awesome has an event that runs when it exits. Even better, that event tells you whether the exit is part of a restart or not! So, I simply write a value to a file based on whether Awesome is restarting or not. Then, Awesome can read the value when it starts and use it to make decisions. The result looks like this:
awesome.connect_signal("exit", function(restart) local lastrun = io.open("~/.config/awesome/lastrun", "w") if lastrun ~= nil then if restart then lastrun:write(0) else lastrun:write(1) end lastrun:close() end end) ... local lastrun = io.open("~/.config/awesome/lastrun", "r") if lastrun ~= nil then local was_quit = lastrun:read("*n") if was_quit == 1 then for i,e in pairs(autostart_once) do awful.spawn(e) end end lastrun:close() else for i,e in pairs(autostart_once) do awful.spawn(e) end end for i,e in pairs(autostart_each) do awful.spawn(e) end
As you can see, it's actually pretty simple. Anything that I add to the autostart_once list will only start if Awesome shut down properly last time it ran. On the other hand, anything in the autostart_each list will run every time Awesome runs. This makes for a convenient solution that I can use as much as I want going forward.
So, that was a semi-complicated solution to a relatively simple problem. Come back next time for some tougher-but-more-straightforward scripting.
No comments:
Post a Comment