From 9475c9965d5da5e343e566bb5a0c39d3e0582a09 Mon Sep 17 00:00:00 2001 From: Ottatop Date: Thu, 20 Jul 2023 15:22:22 -0500 Subject: [PATCH] Move functions around --- api/lua/msg.lua | 3 +- api/lua/output.lua | 62 +++++++++++++++++++++++++++----------- api/lua/tag.lua | 67 ++++++++++++++++++++--------------------- api/lua/test_config.lua | 10 +++--- src/api/msg.rs | 2 +- src/state.rs | 21 ++++--------- 6 files changed, 91 insertions(+), 74 deletions(-) diff --git a/api/lua/msg.lua b/api/lua/msg.lua index 3fc3f8e..dbc74db 100644 --- a/api/lua/msg.lua +++ b/api/lua/msg.lua @@ -37,7 +37,6 @@ --Outputs ---@field GetOutputProps { output_name: string } --Tags ----@field GetTagsByOutput { output_name: string } ---@field GetTagsByName { tag_name: string } ---@field GetTagOutput { tag_id: TagId } ---@field GetTagActive { tag_id: TagId } @@ -65,7 +64,7 @@ --Outputs ---@field Output { output_name: OutputName? } ---@field Outputs { output_names: OutputName[] } ----@field OutputProps { make: string?, model: string?, loc: integer[]?, res: integer[]?, refresh_rate: integer?, physical_size: integer[]?, focused: boolean? } +---@field OutputProps { make: string?, model: string?, loc: integer[]?, res: integer[]?, refresh_rate: integer?, physical_size: integer[]?, focused: boolean?, tag_ids: integer[]? } --Tags ---@field Tags { tag_ids: TagId[] } ---@field TagActive { active: boolean? } diff --git a/api/lua/output.lua b/api/lua/output.lua index 19c8159..b18ef61 100644 --- a/api/lua/output.lua +++ b/api/lua/output.lua @@ -5,9 +5,15 @@ -- SPDX-License-Identifier: MPL-2.0 ---@class Output A display. ----@field name string The name of this output (or rather, of its connector). +---@field private _name string The name of this output (or rather, of its connector). local op = {} +---Get this output's name. This is something like "eDP-1" or "HDMI-A-0". +---@return string +function op:name() + return self._name +end + ---Get all tags on this output. See `tag.get_on_output`. ---@return Tag[] function op:tags() @@ -31,7 +37,7 @@ end function op:make() SendRequest({ GetOutputProps = { - output_name = self.name, + output_name = self._name, }, }) @@ -45,7 +51,7 @@ end function op:model() SendRequest({ GetOutputProps = { - output_name = self.name, + output_name = self._name, }, }) @@ -59,7 +65,7 @@ end function op:loc() SendRequest({ GetOutputProps = { - output_name = self.name, + output_name = self._name, }, }) @@ -77,7 +83,7 @@ end function op:res() SendRequest({ GetOutputProps = { - output_name = self.name, + output_name = self._name, }, }) @@ -96,7 +102,7 @@ end function op:refresh_rate() SendRequest({ GetOutputProps = { - output_name = self.name, + output_name = self._name, }, }) @@ -110,7 +116,7 @@ end function op:physical_size() SendRequest({ GetOutputProps = { - output_name = self.name, + output_name = self._name, }, }) @@ -128,7 +134,7 @@ end function op:focused() SendRequest({ GetOutputProps = { - output_name = self.name, + output_name = self._name, }, }) @@ -138,15 +144,17 @@ function op:focused() end ---This is an internal global function used to create an output object from an output name. ----@param props Output +---@param output_name string The name of the output. ---@return Output -function NewOutput(props) +local function new_output(output_name) + ---@type Output + local o = { _name = output_name } -- Copy functions over for k, v in pairs(op) do - props[k] = v + o[k] = v end - return props + return o end ------------------------------------------------------ @@ -174,7 +182,7 @@ function output.get_by_name(name) for _, output_name in pairs(output_names) do if output_name == name then - return NewOutput({ name = output_name }) + return new_output(output_name) end end @@ -195,7 +203,7 @@ function output.get_by_model(model) ---@type Output[] local outputs = {} for _, output_name in pairs(output_names) do - local o = NewOutput({ name = output_name }) + local o = new_output(output_name) if o:model() == model then table.insert(outputs, o) end @@ -219,7 +227,7 @@ function output.get_by_res(width, height) ---@type Output local outputs = {} for _, output_name in pairs(output_names) do - local o = NewOutput({ name = output_name }) + local o = new_output(output_name) if o:res() and o:res().w == width and o:res().h == height then table.insert(outputs, o) end @@ -254,7 +262,7 @@ function output.get_focused() local output_names = response.RequestResponse.response.Outputs.output_names for _, output_name in pairs(output_names) do - local o = NewOutput({ name = output_name }) + local o = new_output(output_name) if o:focused() then return o end @@ -275,7 +283,7 @@ function output.connect_for_all(func) ---@param args Args table.insert(CallbackTable, function(args) local args = args.ConnectForAllOutputs - func(NewOutput({ name = args.output_name })) + func(new_output(args.output_name)) end) SendMsg({ ConnectForAllOutputs = { @@ -284,4 +292,24 @@ function output.connect_for_all(func) }) end +---Get the output the specified tag is on. +---@param tag Tag +---@return Output|nil +function output.get_for_tag(tag) + SendRequest({ + GetTagOutput = { + tag_id = tag:id(), + }, + }) + + local response = ReadMsg() + local output_name = response.RequestResponse.response.Output.output_name + + if output_name == nil then + return nil + else + return new_output(output_name) + end +end + return output diff --git a/api/lua/tag.lua b/api/lua/tag.lua index 2fd3e96..e7f7746 100644 --- a/api/lua/tag.lua +++ b/api/lua/tag.lua @@ -16,18 +16,26 @@ local tag = {} ---| "CornerBottomRight" # One main corner window in the bottom right with a column of windows on the left and a row on the top. ---@class Tag ----@field private id integer The internal id of this tag. +---@field private _id integer The internal id of this tag. local tg = {} ----@param props Tag +---@param tag_id integer ---@return Tag -local function new_tag(props) +local function new_tag(tag_id) + ---@type Tag + local t = { _id = tag_id } -- Copy functions over for k, v in pairs(tg) do - props[k] = v + t[k] = v end - return props + return t +end + +---Get this tag's internal id. +---@return integer +function tg:id() + return self._id end ---Get this tag's active status. @@ -35,7 +43,7 @@ end function tg:active() SendRequest({ GetTagActive = { - tag_id = self.id, + tag_id = self._id, }, }) @@ -49,7 +57,7 @@ end function tg:name() SendRequest({ GetTagName = { - tag_id = self.id, + tag_id = self._id, }, }) @@ -61,20 +69,7 @@ end ---Get this tag's output. ---@return Output|nil output The output this tag is on, or nil if the tag doesn't exist. function tg:output() - SendRequest({ - GetTagOutput = { - tag_id = self.id, - }, - }) - - local response = ReadMsg() - local output_name = response.RequestResponse.response.Output.output_name - - if output_name == nil then - return nil - else - return NewOutput({ name = output_name }) - end + return require("output").get_for_tag(self) end ---Set this tag's layout. @@ -110,7 +105,7 @@ function tag.add(output, ...) SendMsg({ AddTags = { - output_name = output.name, + output_name = output:name(), tag_names = tag_names, }, }) @@ -132,7 +127,7 @@ end function tag.add_table(output, names) SendMsg({ AddTags = { - output_name = output.name, + output_name = output:name(), tag_names = names, }, }) @@ -155,7 +150,7 @@ function tag.toggle(name, output) if output ~= nil then SendMsg({ ToggleTag = { - output_name = output.name, + output_name = output:name(), tag_name = name, }, }) @@ -164,7 +159,7 @@ function tag.toggle(name, output) if op ~= nil then SendMsg({ ToggleTag = { - output_name = op.name, + output_name = op:name(), tag_name = name, }, }) @@ -188,7 +183,7 @@ function tag.switch_to(name, output) if output ~= nil then SendMsg({ SwitchToTag = { - output_name = output.name, + output_name = output:name(), tag_name = name, }, }) @@ -197,7 +192,7 @@ function tag.switch_to(name, output) if op ~= nil then SendMsg({ SwitchToTag = { - output_name = op.name, + output_name = op:name(), tag_name = name, }, }) @@ -213,7 +208,7 @@ function tag.set_layout(name, layout, output) if output ~= nil then SendMsg({ SetLayout = { - output_name = output.name, + output_name = output:name(), tag_name = name, layout = layout, }, @@ -223,7 +218,7 @@ function tag.set_layout(name, layout, output) if op ~= nil then SendMsg({ SetLayout = { - output_name = op.name, + output_name = op:name(), tag_name = name, layout = layout, }, @@ -244,20 +239,24 @@ end ---@return Tag[] function tag.get_on_output(output) SendRequest({ - GetTagsByOutput = { - output_name = output.name, + GetOutputProps = { + output_name = output:name(), }, }) local response = ReadMsg() - local tag_ids = response.RequestResponse.response.Tags.tag_ids + local tag_ids = response.RequestResponse.response.OutputProps.tag_ids ---@type Tag[] local tags = {} + if tag_ids == nil then + return tags + end + for _, tag_id in pairs(tag_ids) do - table.insert(tags, new_tag({ id = tag_id })) + table.insert(tags, new_tag(tag_id)) end return tags @@ -281,7 +280,7 @@ function tag.get_by_name(name) local tags = {} for _, tag_id in pairs(tag_ids) do - table.insert(tags, new_tag({ id = tag_id })) + table.insert(tags, new_tag(tag_id)) end return tags diff --git a/api/lua/test_config.lua b/api/lua/test_config.lua index 2920958..b7ab3db 100644 --- a/api/lua/test_config.lua +++ b/api/lua/test_config.lua @@ -109,11 +109,11 @@ require("pinnacle").setup(function(pinnacle) print("----------------------") - -- local tags = tag.get_on_output(output.get_focused()) - -- for _, tg in pairs(tags) do - -- print(tg:name()) - -- print(tg:output() and tg:output().name or "nil output") - -- end + local tags = tag.get_on_output(output.get_focused() --[[@as Output]]) + for _, tg in pairs(tags) do + print(tg:name()) + print((tg:output() and tg:output():name()) or "nil output") + end end) -- Tags --------------------------------------------------------------------------- diff --git a/src/api/msg.rs b/src/api/msg.rs index 45e0b4a..e9e3e2a 100644 --- a/src/api/msg.rs +++ b/src/api/msg.rs @@ -106,7 +106,6 @@ pub enum Request { GetOutputs, GetOutputProps { output_name: String }, // Tags - GetTagsByOutput { output_name: String }, // TODO: move into props GetTagsByName { tag_name: String }, GetTagOutput { tag_id: TagId }, GetTagActive { tag_id: TagId }, @@ -224,6 +223,7 @@ pub enum RequestResponse { physical_size: Option<(i32, i32)>, /// Whether the output is focused or not. focused: Option, + tag_ids: Option>, }, Tags { tag_ids: Vec, diff --git a/src/state.rs b/src/state.rs index 68ab8e4..a483647 100644 --- a/src/state.rs +++ b/src/state.rs @@ -457,6 +457,11 @@ impl State { .focused_output .as_ref() .and_then(|foc_op| output.map(|op| op == foc_op)); + let tag_ids = output.as_ref().map(|output| { + output.with_state(|state| { + state.tags.iter().map(|tag| tag.id()).collect::>() + }) + }); crate::api::send_to_client( &mut stream, &OutgoingMsg::RequestResponse { @@ -468,26 +473,12 @@ impl State { refresh_rate, physical_size, focused, + tag_ids, }, }, ) .expect("failed to send to client"); } - Request::GetTagsByOutput { output_name } => { - let output = self.space.outputs().find(|op| op.name() == output_name); - if let Some(output) = output { - let tag_ids = output.with_state(|state| { - state.tags.iter().map(|tag| tag.id()).collect::>() - }); - crate::api::send_to_client( - &mut stream, - &OutgoingMsg::RequestResponse { - response: RequestResponse::Tags { tag_ids }, - }, - ) - .expect("failed to send to client"); - } - } Request::GetTagsByName { tag_name } => { let tag_ids = self .space