2024-01-23 04:04:08 +01:00
|
|
|
-- This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
-- License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
-- file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
|
|
|
2024-07-11 22:50:33 +02:00
|
|
|
local client = require("pinnacle.grpc.client").client
|
2024-04-21 00:08:49 +02:00
|
|
|
local pinnacle_service = require("pinnacle.grpc.defs").pinnacle.v0alpha1.PinnacleService
|
2024-01-12 04:58:35 +01:00
|
|
|
|
2024-01-15 02:53:43 +01:00
|
|
|
---The entry point to configuration.
|
|
|
|
---
|
2024-03-29 17:57:35 +01:00
|
|
|
---This module contains the `setup` function, which is how you'll access all the ways to configure Pinnacle.
|
2024-02-08 04:39:56 +01:00
|
|
|
---@class Pinnacle
|
2024-01-13 00:20:34 +01:00
|
|
|
local pinnacle = {
|
2024-02-08 04:39:56 +01:00
|
|
|
---@type Input
|
|
|
|
input = require("pinnacle.input"),
|
|
|
|
---@type Tag
|
|
|
|
tag = require("pinnacle.tag"),
|
|
|
|
---@type Output
|
|
|
|
output = require("pinnacle.output"),
|
|
|
|
---@type Window
|
|
|
|
window = require("pinnacle.window"),
|
|
|
|
---@type Process
|
|
|
|
process = require("pinnacle.process"),
|
2024-03-14 23:31:32 +01:00
|
|
|
---@type Util
|
|
|
|
util = require("pinnacle.util"),
|
|
|
|
---@type Layout
|
|
|
|
layout = require("pinnacle.layout"),
|
2024-03-29 17:57:35 +01:00
|
|
|
---@type Render
|
|
|
|
render = require("pinnacle.render"),
|
2024-06-17 23:27:02 +02:00
|
|
|
---@type pinnacle.Snowcap
|
|
|
|
snowcap = require("pinnacle.snowcap"),
|
2024-01-13 00:20:34 +01:00
|
|
|
}
|
2024-01-12 04:58:35 +01:00
|
|
|
|
2024-01-15 02:35:54 +01:00
|
|
|
---Quit Pinnacle.
|
2024-02-08 04:39:56 +01:00
|
|
|
function pinnacle.quit()
|
2024-07-11 22:50:33 +02:00
|
|
|
client():unary_request(pinnacle_service.Quit, {})
|
2024-01-12 04:58:35 +01:00
|
|
|
end
|
|
|
|
|
2024-04-18 23:30:10 +02:00
|
|
|
---Reload the active config.
|
|
|
|
function pinnacle.reload_config()
|
2024-07-11 22:50:33 +02:00
|
|
|
client():unary_request(pinnacle_service.ReloadConfig, {})
|
2024-04-18 23:30:10 +02:00
|
|
|
end
|
|
|
|
|
2024-03-23 07:39:07 +01:00
|
|
|
---Setup a Pinnacle config.
|
2024-01-15 03:03:58 +01:00
|
|
|
---
|
2024-02-08 04:39:56 +01:00
|
|
|
---You must pass in a function that takes in the `Pinnacle` table. This table is how you'll access the other config modules.
|
2024-01-16 23:24:34 +01:00
|
|
|
---
|
2024-02-08 04:39:56 +01:00
|
|
|
---You can also `require` the other modules. Just be sure not to call any of their functions outside this
|
|
|
|
---setup function.
|
2024-01-15 03:03:58 +01:00
|
|
|
---
|
2024-03-23 07:39:07 +01:00
|
|
|
---If you want to run a function with the config without blocking at the end, see `Pinnacle.run`.
|
|
|
|
---
|
2024-01-12 04:58:35 +01:00
|
|
|
---@param config_fn fun(pinnacle: Pinnacle)
|
2024-03-23 07:39:07 +01:00
|
|
|
---
|
|
|
|
---@see Pinnacle.run
|
2024-01-12 04:58:35 +01:00
|
|
|
function pinnacle.setup(config_fn)
|
|
|
|
require("pinnacle.grpc.protobuf").build_protos()
|
2024-06-18 01:08:27 +02:00
|
|
|
local success, snowcap = pcall(require, "snowcap")
|
|
|
|
if success then
|
|
|
|
snowcap.init()
|
|
|
|
end
|
2024-06-17 23:27:02 +02:00
|
|
|
|
2024-07-11 22:50:33 +02:00
|
|
|
require("pinnacle.grpc.client").connect()
|
|
|
|
|
2024-06-17 23:27:02 +02:00
|
|
|
-- Make Snowcap use Pinnacle's cqueues loop
|
2024-07-11 22:50:33 +02:00
|
|
|
require("snowcap.grpc.client").client().loop = client().loop
|
2024-01-13 00:20:34 +01:00
|
|
|
|
2024-03-29 17:57:35 +01:00
|
|
|
-- This function ensures a config won't run forever if Pinnacle is killed
|
|
|
|
-- and doesn't kill configs on drop.
|
2024-07-11 22:50:33 +02:00
|
|
|
client().loop:wrap(function()
|
2024-03-23 07:39:07 +01:00
|
|
|
while true do
|
|
|
|
require("cqueues").sleep(60)
|
2024-07-11 22:50:33 +02:00
|
|
|
local success, err, errno = client().conn:ping(10)
|
2024-03-23 07:39:07 +01:00
|
|
|
if not success then
|
|
|
|
print("Compositor ping failed:", err, errno)
|
|
|
|
os.exit(1)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
2024-02-08 04:39:56 +01:00
|
|
|
config_fn(pinnacle)
|
2024-01-12 04:58:35 +01:00
|
|
|
|
2024-07-11 22:50:33 +02:00
|
|
|
local success, err = client().loop:loop()
|
2024-03-14 23:31:32 +01:00
|
|
|
if not success then
|
|
|
|
print(err)
|
|
|
|
end
|
2024-01-12 04:58:35 +01:00
|
|
|
end
|
|
|
|
|
2024-03-23 07:39:07 +01:00
|
|
|
---Run a function with the Pinnacle API.
|
|
|
|
---
|
|
|
|
---If you are writing a config, use `Pinnacle.setup` instead.
|
|
|
|
---
|
|
|
|
---Like `Pinnacle.setup`, this function takes in a function that takes in the `Pinnacle` table.
|
|
|
|
---This allows you to run anything that `setup` can run.
|
|
|
|
---
|
|
|
|
---*Unlike* `setup`, this will **not** listen to the compositor for incoming key presses, signals, and the like.
|
|
|
|
---This means that this function will not block and can be used to integrate with external applications
|
|
|
|
---like taskbars and widget systems like eww, but it will not allow you to set usable keybinds or
|
|
|
|
---call signal callbacks. This is useful for things like querying compositor information for outputs and
|
|
|
|
---windows.
|
|
|
|
---
|
|
|
|
---@param run_fn fun(pinnacle: Pinnacle)
|
|
|
|
function pinnacle.run(run_fn)
|
|
|
|
require("pinnacle.grpc.protobuf").build_protos()
|
2024-06-18 01:08:27 +02:00
|
|
|
local success, snowcap = pcall(require, "snowcap")
|
|
|
|
if success then
|
|
|
|
snowcap.init()
|
|
|
|
end
|
2024-03-23 07:39:07 +01:00
|
|
|
|
2024-07-11 22:50:33 +02:00
|
|
|
require("pinnacle.grpc.client").connect()
|
|
|
|
|
2024-03-23 07:39:07 +01:00
|
|
|
run_fn(pinnacle)
|
|
|
|
end
|
|
|
|
|
2024-01-12 04:58:35 +01:00
|
|
|
return pinnacle
|