Skip to content

CLI and App

App is a singleton instance of an Astal.Application.

Depending on gtk version require paths will differ

lua
local App = require("astal.gtk3.app")

local App = require("astal.gtk4.app") -- not yet available

Entry point

App:start is a wrapper function for App:run that will only run the application if there is no instance already running with the specified name.

lua
App:start({
    instance_name = "my-instance", -- defaults to "astal"
    main = function()
        -- setup anything
        -- instantiate widgets
    end,
})

Messaging from CLI

If you want to interact with an instance from the CLI, you can do so by sending a request.

lua
App:start({
    main = function() end,

    ---@param request string
    ---@param res fun(response: any): nil
    request_handler = function(request, res)
        if request == "say hi" then
            return res("hi cli")
        end
        res("unknown command")
    end
})
sh
astal say hi
# hi cli

Toggling Windows by their name

In order for Astal to know about your windows, you have to register them. You can do this by specifying a unique name and calling App:add_window.

lua
local App = require("astal.gtk3.app")

local function Bar()
    return Widget.Window({
        name = "Bar",
        setup = function(self)
            App:add_window(self)
        end,
        Widget.Box()
    })
end

You can also invoke App:add_window by simply passing the App to the application prop.

lua
local App = require("astal.gtk3.app")

local function Bar()
    return Widget.Window({
        name = "Bar",
        application = App,
        Widget.Box()
    })
end
sh
astal -t Bar

WARNING

When assigning the application prop make sure name comes before. Props are set sequentially and if name is applied after application it won't work.

Client instances

The first time App:start is invoked the main function gets called. While that instance is running any subsequent execution of the script will call the client function.

lua
App:start({
    -- main instance
    main = function(...)
        local args = { ... }
        print(string.format("{%s}", table.concat(args, ", ")))
    end,

    -- client instance
    client = function(request, ...)
        local res = request("you can send a request to the main instance")
        print(res)
    end,

    -- this runs in the main instance
    request_handler = function(request, res)
        res("response from main instance")
    end
})

Released under the LGPL v2.1 License