commit 77444ac47c65dfda50d25f4e7614d85695b1264e
parent a43acd458f842cbe9b80c34edab82d72de1a26d5
Author: Daniel Barlow <dan@telent.net>
Date: Sat, 23 Apr 2022 23:31:58 +0100
add binding to iterate through outputs
Diffstat:
1 file changed, 50 insertions(+), 0 deletions(-)
diff --git a/kiwmi/kiwmi/luak/kiwmi_server.c b/kiwmi/kiwmi/luak/kiwmi_server.c
@@ -147,6 +147,55 @@ l_kiwmi_server_output_at(lua_State *L)
}
static int
+new_kiwmi_output(lua_State *L, void *lua, struct wlr_output *wlr_output)
+{
+ if (wlr_output) {
+ lua_pushcfunction(L, luaK_kiwmi_output_new);
+ lua_pushlightuserdata(L, lua);
+ lua_pushlightuserdata(L, wlr_output->data);
+ if (lua_pcall(L, 2, 1, 0)) {
+ wlr_log(WLR_ERROR, "%s", lua_tostring(L, -1));
+ return 0;
+ }
+ } else {
+ lua_pushnil(L);
+ }
+ return 1;
+}
+
+static int
+l_kiwmi_server_next_output(lua_State *L)
+{
+ struct kiwmi_object *obj =
+ *(struct kiwmi_object **)luaL_checkudata(L, 1, "kiwmi_server");
+
+ struct kiwmi_server *server = obj->object;
+
+ struct kiwmi_output *found = 0;
+ struct kiwmi_output *current = 0;
+
+ if((lua_gettop(L) > 2) && !lua_isnil(L, 3)) {
+ obj =
+ *(struct kiwmi_object **)luaL_checkudata(L, 3, "kiwmi_output");
+ if (!obj->valid) {
+ return luaL_error(L, "kiwmi_output no longer valid");
+ }
+ current = obj->object;
+ }
+
+ struct kiwmi_output *output;
+ wl_list_for_each(output, &(server->desktop).outputs, link) {
+ if((found == current) || (current == 0))
+ return new_kiwmi_output(L, obj->lua, output->wlr_output);
+
+ if(current->wlr_output == output->wlr_output)
+ found = current;
+ }
+ lua_pushnil(L);
+ return 1;
+}
+
+static int
l_kiwmi_server_quit(lua_State *L)
{
struct kiwmi_object *obj =
@@ -345,6 +394,7 @@ static const luaL_Reg kiwmi_server_methods[] = {
{"unfocus", l_kiwmi_server_unfocus},
{"verbosity", l_kiwmi_server_verbosity},
{"view_at", l_kiwmi_server_view_at},
+ {"outputs", l_kiwmi_server_next_output},
{NULL, NULL},
};