X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3.git;a=blobdiff_plain;f=ioncore%2Fioncore_menudb.lua;h=98d86a2c4b2a8041ae74f4191820126486250347;hp=6032b9415df05e79a9b503724a6e9917966c2b0a;hb=803afbc1cd633f6c025bcd9537e9b7e9aedadd0d;hpb=8366314611bf30a0f31d25bf5f5023186fa87692 diff --git a/ioncore/ioncore_menudb.lua b/ioncore/ioncore_menudb.lua index 6032b94..98d86a2 100644 --- a/ioncore/ioncore_menudb.lua +++ b/ioncore/ioncore_menudb.lua @@ -1,7 +1,7 @@ -- -- ion/ioncore/ioncore_menudb.lua -- Routines for defining menus. -- --- Copyright (c) Tuomo Valkonen 2004-2006. +-- Copyright (c) Tuomo Valkonen 2004-2007. -- -- Ion is free software; you can redistribute it and/or modify it under -- the terms of the GNU Lesser General Public License as published by @@ -28,7 +28,9 @@ function ioncore.defmenu(name, tab) ioncore.warn(TR("Unable to append to non-table menu")) return else - table.append(menus[name], tab) + for k, v in ipairs(tab) do + table.insert(menus[name], v) + end end else menus[name]=tab @@ -117,23 +119,73 @@ end -- Workspace and window lists {{{ -local function makelist(list) - local function mkentry(tgt) - return menuentry(tgt:name(), function() tgt:goto() end) +local function addto(list) + return function(tgt, attr) + local e=menuentry(tgt:name(), function() tgt:goto() end) + e.attr=attr; + table.insert(list, e) + return true end - local entries=table.map(mkentry, list) +end + +local function sort(entries) table.sort(entries, function(a, b) return a.name < b.name end) return entries end function menus.windowlist() - return makelist(ioncore.clientwin_list()) + local entries={} + ioncore.clientwin_i(addto(entries)) + return sort(entries) end function menus.workspacelist() - return makelist(ioncore.region_list("WGenWS")) + local entries={} + local iter_=addto(entries) + + local function iter(obj) + return (not obj_is(obj, "WGroupWS") + or iter_(obj)) + end + + ioncore.region_i(iter) + + return sort(entries) +end + +local function focuslist(do_act) + local entries={} + local seen={} + local iter_=addto(entries) + + local function iter(obj, attr) + if obj_is(obj, "WClientWin") then + iter_(obj, attr) + seen[obj]=true + end + return true + end + + local function iter_act(obj) + return iter(obj, "activity") + end + + local function iter_foc(obj) + return (seen[obj] or iter(obj)) + end + + if do_act then + ioncore.activity_i(iter_act) + end + + ioncore.focushistory_i(iter_foc) + + return entries end +menus.focuslist=function() return focuslist(true) end +menus.focuslist_=function() return focuslist(false) end + -- }}}