Add and load the workspace nesting code by default. Leave the status bar
untouched, since there are quite a few people using it.
This commit is contained in:
parent
7004982d68
commit
1fb9aa3b6a
@ -1,8 +1,9 @@
|
||||
# $OpenBSD: Makefile,v 1.24 2005/09/07 19:53:41 pedro Exp $
|
||||
# $OpenBSD: Makefile,v 1.25 2005/09/29 22:19:39 pedro Exp $
|
||||
|
||||
COMMENT= "light, keyboard friendly window manager"
|
||||
|
||||
DISTNAME= ion-3ds-20050820
|
||||
PKGNAME= ${DISTNAME}p0
|
||||
CATEGORIES= x11
|
||||
|
||||
HOMEPAGE= http://modeemi.cs.tut.fi/~tuomov/ion/
|
||||
@ -23,6 +24,9 @@ NO_REGRESS= Yes
|
||||
|
||||
LIB_DEPENDS= lua.5,lualib.5::lang/lua
|
||||
|
||||
post-install:
|
||||
$(INSTALL_DATA) ${FILESDIR}/*.lua ${PREFIX}/share/examples/ion3
|
||||
|
||||
.include <bsd.port.mk>
|
||||
|
||||
.if defined(NO_SHARED_LIBS) && ${NO_SHARED_LIBS:L} == "yes"
|
||||
|
407
x11/ion/files/detach.lua
Normal file
407
x11/ion/files/detach.lua
Normal file
@ -0,0 +1,407 @@
|
||||
-- $OpenBSD: detach.lua,v 1.1 2005/09/29 22:19:39 pedro Exp $
|
||||
-- Fancy management of transcient windows in ion. Mix WIonWS and
|
||||
-- WFloatWS on the same "workspace".
|
||||
|
||||
-- Written by Matthieu Moy <Matthieu.Moy@imag.fr> on February 17th 2005.
|
||||
-- Public domain.
|
||||
|
||||
if not detach then
|
||||
detach = {
|
||||
-- default "passiveness" for the layer 2 floating workspace.
|
||||
passive = true,
|
||||
-- Whether transcient windows should automatically be made floating
|
||||
manage_transcient_with_float = true,
|
||||
}
|
||||
end
|
||||
|
||||
-- Introduction:
|
||||
|
||||
-- This extension exploits some of ion3's new features: It is now
|
||||
-- possible to attach objects on a second layer on the screen, which
|
||||
-- allows you to have, for example, floating objects on top of a
|
||||
-- traditional WIonWS workspace. See
|
||||
-- http://www-verimag.imag.fr/~moy/ion/ion3/float-split.png if you
|
||||
-- prefer images to explanations :-)
|
||||
|
||||
-- A simple setup is to put the following in your cfg_user.lua:
|
||||
-- dopath("detach.lua")
|
||||
-- detach.setup_hooks()
|
||||
|
||||
-- The layer 2 objects can be either passive or non passive. A passive
|
||||
-- object will only take the focus when the mouse is over it, while a
|
||||
-- non passive object will allways have the focus when shown. (The
|
||||
-- scratchpad is an example of non passive object).
|
||||
|
||||
-- Layer 2 objects can be hidden. This way, a non passive object can
|
||||
-- let the focus to the layer 1.
|
||||
|
||||
-- This script attaches two WFloatWS on the layer 2. One is passive,
|
||||
-- the other not. The function detach.topmost_transient_to_float sends
|
||||
-- a window (or the topmost transcient if the window has transcient)
|
||||
-- to one of them (depending on the value of the 3rd parameter).
|
||||
|
||||
-- The function detach.toggle_floatws shows or hide the current layer
|
||||
-- 2 floating workspace. This is very usefull to get rid of the non
|
||||
-- passive WFloatWS, when it is active and you want to give the focus
|
||||
-- to a layer 1 object.
|
||||
|
||||
|
||||
--------------------
|
||||
-- User functions --
|
||||
--------------------
|
||||
|
||||
|
||||
-- Call this function once and all transcient windows will be managed
|
||||
-- as floating frame in layer 2. Additionally, you may define the
|
||||
-- "float" winprop for other non transcient windows to manage as
|
||||
-- floating frames like this
|
||||
--
|
||||
-- defwinprop {
|
||||
-- class = "Xawtv",
|
||||
-- float = true,
|
||||
-- }
|
||||
--
|
||||
-- the winprop "float_passive", if specified, overrides the
|
||||
-- detach.passive setting. For example,
|
||||
--
|
||||
-- defwinprop {
|
||||
-- class = "Gkrellm",
|
||||
-- float = true,
|
||||
-- float_passive = true
|
||||
-- }
|
||||
--
|
||||
-- will make gkrellm start in a passive floating window. (this means
|
||||
-- the window will not accept focus)
|
||||
--
|
||||
-- Note: Adding all the functions to hooks here may conflict with
|
||||
-- other functions you could have added to the same hook somewhere
|
||||
-- else. If you want to add your personal functions to
|
||||
-- clientwin_do_manage_alt, I suggest not adding detach.manager, but
|
||||
-- doing something like
|
||||
--
|
||||
-- if detach.manager(cwin, table) then
|
||||
-- return true
|
||||
-- end
|
||||
--
|
||||
-- at the beginning of function you'll use in clientwin_do_manage_alt.
|
||||
function detach.setup_hooks ()
|
||||
ioncore.get_hook("clientwin_do_manage_alt"):add(detach.manager)
|
||||
ioncore.get_hook("frame_managed_changed_hook"):add(detach.maybe_leave_layer2)
|
||||
ioncore.get_hook("region_do_warp_alt"):add(detach.skip_l2_warp)
|
||||
end
|
||||
|
||||
|
||||
-- Submenu to add to the WFrame menu:
|
||||
-- Add the line
|
||||
-- submenu("Attach", "menudetach"),
|
||||
-- to the definition defctxmenu("WFrame", { ... })
|
||||
defmenu("menudetach", {
|
||||
menuentry("Topmost transient",
|
||||
"detach.topmost_transient_to_reg(_sub)"),
|
||||
menuentry("To scratchpad",
|
||||
"detach.topmost_transient_to_sp(_sub)"),
|
||||
menuentry("To passive float",
|
||||
"detach.topmost_transient_to_float(_sub, nil, true)"),
|
||||
menuentry("To non passive float",
|
||||
"detach.topmost_transient_to_float(_sub, nil, false)"),
|
||||
})
|
||||
|
||||
|
||||
-- Can be called on any object defining screen_of(). shows or hide the
|
||||
-- floating workspace on layer 2 of this screen. This applies to the
|
||||
-- passive WFloatWS if the second argument is true, and to the non
|
||||
-- passive one if it is false. (detach.passive is used if the argument
|
||||
-- is nil)
|
||||
function detach.toggle_floatws(obj, passive)
|
||||
local screen = obj:screen_of()
|
||||
local sp = detach.find_ws(screen, passive)
|
||||
if sp then
|
||||
screen:l2_set_hidden(sp, 'toggle')
|
||||
end
|
||||
end
|
||||
|
||||
-- close (and relocate managed of) all layer2 WFloatWS on all screens.
|
||||
-- You can call this function from you cfg_user.lua or equivalent to
|
||||
-- avoid having layer 2 workspaces at startup.
|
||||
function detach.close_all_floatws()
|
||||
local screen = ioncore.find_screen_id(0)
|
||||
local cur = screen
|
||||
repeat
|
||||
detach.close_floatws(cur)
|
||||
cur = ioncore.goto_next_screen()
|
||||
until (cur == screen or cur == nil)
|
||||
end
|
||||
|
||||
---------------------------------------------------------
|
||||
-- Normally, simple users shouldn't need to go further --
|
||||
---------------------------------------------------------
|
||||
|
||||
|
||||
-- Put the function "detach.topmost_transient(_sub)" in e.g.
|
||||
-- defctxmenu("WFrame" {}) or ionframe_bindings to use this.
|
||||
function detach.topmost_transient_to_reg(cwin)
|
||||
local l=cwin:managed_list()
|
||||
local trs=l[table.getn(l)]
|
||||
if trs then
|
||||
cwin:manager():attach(trs)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- send either the topmost transcient or the window itself if it has
|
||||
-- no transcient to the scratchpad
|
||||
function detach.topmost_transient_to_sp(cwin)
|
||||
local to_detach = cwin
|
||||
local l=cwin:managed_list()
|
||||
local trs=l[table.getn(l)]
|
||||
if trs then
|
||||
to_detach = trs
|
||||
end
|
||||
-- search for the scratchpad
|
||||
local sp = nil
|
||||
for _,r in cwin:screen_of():llist(2) do
|
||||
if (r:name() == "WScratchpad") then
|
||||
sp = r
|
||||
end
|
||||
end
|
||||
sp:attach(to_detach)
|
||||
if not sp:is_active() then
|
||||
mod_sp.toggle_on(cwin:screen_of())
|
||||
end
|
||||
end
|
||||
|
||||
function detach.ws_name(passive)
|
||||
local passive_loc = detach.passive
|
||||
if passive ~= nil then
|
||||
passive_loc = passive
|
||||
end
|
||||
if passive_loc then
|
||||
return "layer 2 float - passive"
|
||||
else
|
||||
return "layer 2 float - active"
|
||||
end
|
||||
end
|
||||
|
||||
function detach.find_ws(screen, passive)
|
||||
local name = detach.ws_name(passive)
|
||||
local ws
|
||||
for _,r in screen:llist(2) do
|
||||
if r:name() == name then
|
||||
ws = r
|
||||
end
|
||||
end
|
||||
return ws
|
||||
end
|
||||
|
||||
function startswith(s, target)
|
||||
return string.sub(s, 0, string.len(target)) == target
|
||||
end
|
||||
|
||||
function is_l2floatws(ws)
|
||||
return startswith(ws:name(), "layer 2 float - ")
|
||||
end
|
||||
|
||||
-- send either the topmost transcient or the window itself if it has
|
||||
-- no transcient to a floating workspace, on the second layer of the
|
||||
-- screen.
|
||||
-- the parameter "passive" overrides detach.passive if specified.
|
||||
|
||||
-- If "restricted" is true, then, the function will use
|
||||
-- ioncore.defer(), and can be called in restricted mode. Otherwise,
|
||||
-- the action is immediate.
|
||||
function detach.topmost_transient_to_float(cwin, screen, passive, geom, restricted)
|
||||
local to_detach = cwin
|
||||
local l=cwin:managed_list()
|
||||
local trs=l[table.getn(l)]
|
||||
if trs then
|
||||
to_detach = trs
|
||||
end
|
||||
local scr = screen
|
||||
if scr == nil then
|
||||
scr = cwin:screen_of()
|
||||
end
|
||||
-- use a passive WFloatWS ?
|
||||
local passive_loc = detach.passive
|
||||
if passive ~= nil then
|
||||
passive_loc = passive
|
||||
end
|
||||
-- Find it if it already exists ...
|
||||
local name = detach.ws_name(passive_loc)
|
||||
local fws = detach.find_ws(scr, passive_loc)
|
||||
local geom_loc
|
||||
local oldgeom = to_detach:geom()
|
||||
if geom == nil then
|
||||
-- debug.echo("geom==nil")
|
||||
geom_loc = {x=20, y=20, h=oldgeom.h, w=oldgeom.w}
|
||||
else
|
||||
-- debug.echo("geom=={x="..geom.x..",y="..geom.y.."}")
|
||||
geom_loc = {x=geom.x, y=geom.y,
|
||||
h=oldgeom.h, w=oldgeom.w}
|
||||
end
|
||||
if not restricted then
|
||||
-- ... if not, create it
|
||||
if fws == nil then
|
||||
fws = scr:attach_new{
|
||||
type = "WFloatWS",
|
||||
name = name,
|
||||
layer = 2,
|
||||
passive = passive_loc,
|
||||
switchto = false,
|
||||
}
|
||||
end
|
||||
fws:attach(to_detach)
|
||||
fws:screen_of():l2_set_hidden(fws, 'false')
|
||||
to_detach:rqgeom(geom_loc)
|
||||
ioncore.defer(function()
|
||||
to_detach:goto()
|
||||
end)
|
||||
else
|
||||
ioncore.defer(function()
|
||||
-- ... if not, create it
|
||||
if fws == nil then
|
||||
fws = scr:attach_new{
|
||||
type = "WFloatWS",
|
||||
name = name,
|
||||
layer = 2,
|
||||
passive = passive_loc,
|
||||
switchto = false,
|
||||
}
|
||||
end
|
||||
ioncore.defer(function()
|
||||
fws:screen_of():l2_set_hidden(fws, 'false')
|
||||
fws:attach(to_detach)
|
||||
-- fws:goto()
|
||||
to_detach:manager():goto()
|
||||
to_detach:goto()
|
||||
|
||||
to_detach:manager():rqgeom(geom_loc)
|
||||
ioncore.defer(function ()
|
||||
to_detach:rqgeom({h=geom_loc.h})
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
-- close the floating workspaces on layer 2 and relocate the floating
|
||||
-- windows in the layer 1 workspace.
|
||||
-- Usefull to change the settings of the workspace (passive or
|
||||
-- not, ...)
|
||||
function detach.close_floatws(region)
|
||||
local screen
|
||||
if region then
|
||||
screen = region:screen_of()
|
||||
end
|
||||
if (screen == nil) then
|
||||
screen = ioncore.find_screen_id(0)
|
||||
end
|
||||
for _,r in screen:llist(2) do
|
||||
if obj_is(r, "WFloatWS") then
|
||||
local fws = r
|
||||
-- relocate windows to layer 1
|
||||
local dest = screen:lcurrent(1):current()
|
||||
for _,fframe in r:managed_list() do
|
||||
for _,cwin in fframe:llist(1) do
|
||||
dest:attach(cwin)
|
||||
cwin:goto()
|
||||
end
|
||||
end
|
||||
-- and close this workspace
|
||||
ioncore.defer(function () fws:rqclose() end)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Brings a Frame back to the layer 1
|
||||
function detach.float_to_layer1 (cwin)
|
||||
local screen = cwin:screen_of()
|
||||
if screen == nil then
|
||||
screen = ioncore.find_screen_id(0)
|
||||
end
|
||||
screen:lcurrent(1):current():attach(cwin)
|
||||
ioncore.defer(function () cwin:goto() end)
|
||||
end
|
||||
|
||||
-- detach.toggle_float (_sub) to call on a WFrame
|
||||
-- Takes a frame from a WIonWS to a WFloatWS in the second layer.
|
||||
function detach.toggle_float (cwin)
|
||||
if obj_is(cwin:manager(), "WFloatFrame") then
|
||||
detach.float_to_layer1(cwin)
|
||||
else
|
||||
detach.topmost_transient_to_float(cwin)
|
||||
end
|
||||
end
|
||||
|
||||
-- candidate for clientwin_do_manage_alt to manage transient. See
|
||||
-- documentation for detach.manage_transcient_with_float for details.
|
||||
function detach.manager(cwin, table)
|
||||
local wp=ioncore.getwinprop(cwin)
|
||||
if detach.manage_transcient_with_float
|
||||
and table.tfor
|
||||
and not obj_is(table.tfor:manager(), "WFloatWS") then
|
||||
|
||||
local manager = table.tfor:manager()
|
||||
detach.topmost_transient_to_float(cwin,
|
||||
manager:screen_of(),
|
||||
(wp and wp.float_passive),
|
||||
table.geom)
|
||||
table.tfor:goto()
|
||||
return true
|
||||
end
|
||||
if (wp and wp.float) then
|
||||
local screen = cwin:screen_of()
|
||||
if screen == nil then
|
||||
screen = ioncore.find_screen_id(0)
|
||||
end
|
||||
detach.topmost_transient_to_float(cwin,
|
||||
screen,
|
||||
(wp and wp.float_passive),
|
||||
table.geom)
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- DEPRECATED. detach.manager() does all this now.
|
||||
-- candidate for ionws_placement_alt to manage windows with the
|
||||
-- "float" winprop.
|
||||
function detach.ionws_manager(cwin, ws, table)
|
||||
local wp=ioncore.getwinprop(cwin)
|
||||
if wp.float then
|
||||
detach.topmost_transient_to_float(cwin,
|
||||
ws:screen_of(),
|
||||
(wp and wp.float_passive),
|
||||
table.geom,
|
||||
true)
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- candidate for frame_managed_changed_hook.
|
||||
--
|
||||
-- If the action is a "remove", and the layer 2 workspace is empty, hide it.
|
||||
-- This prevents an empty (and thus invisible) layer 2 floating workspace from
|
||||
-- having the focus after its last managed frame is closed, so that focus
|
||||
-- returns to layer 1.
|
||||
function detach.maybe_leave_layer2(tbl)
|
||||
if tbl.mode == "remove" then
|
||||
local mgr = tbl.reg:manager()
|
||||
if is_l2floatws(mgr) then
|
||||
local l = mgr:managed_list()
|
||||
-- The region will be empty if the only managed region is the one
|
||||
-- currently being removed.
|
||||
if table.getn(l) == 1 and l[1] == tbl.reg then
|
||||
ioncore.defer(function () mgr:screen_of():l2_set_hidden(mgr, 'true') end)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function detach.skip_l2_warp(reg)
|
||||
n = reg:manager():manager():name()
|
||||
if is_l2floatws(reg:manager():manager()) then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
15
x11/ion/files/nest-ws.lua
Normal file
15
x11/ion/files/nest-ws.lua
Normal file
@ -0,0 +1,15 @@
|
||||
-- $OpenBSD: nest-ws.lua,v 1.1 2005/09/29 22:19:39 pedro Exp $
|
||||
-- Nest workspaces inside Frames.
|
||||
-- Matthieu Moy <Matthieu.Moy@imag.fr>, February 15th 2005.
|
||||
-- Public domain.
|
||||
|
||||
-- This defines a menu to be used as a submenu for WFrames.
|
||||
-- Add the line
|
||||
-- submenu("Attach", "menuattach"),
|
||||
-- to the definition defctxmenu("WFrame", { ... })
|
||||
|
||||
defmenu("menuattach", {
|
||||
menuentry("WIonWS", "_:attach_new({type=\"WIonWS\" }):goto()"),
|
||||
menuentry("WFloatWS", "_:attach_new({type=\"WFloatWS\"}):goto()"),
|
||||
menuentry("WPaneWS", "_:attach_new({type=\"WPaneWS\" }):goto()"),
|
||||
})
|
15
x11/ion/patches/patch-etc_cfg_ion_lua
Normal file
15
x11/ion/patches/patch-etc_cfg_ion_lua
Normal file
@ -0,0 +1,15 @@
|
||||
$OpenBSD: patch-etc_cfg_ion_lua,v 1.1 2005/09/29 22:19:39 pedro Exp $
|
||||
--- etc/cfg_ion.lua.orig Sat Aug 20 08:33:49 2005
|
||||
+++ etc/cfg_ion.lua Thu Sep 29 18:20:00 2005
|
||||
@@ -57,6 +57,11 @@ dopath("cfg_bindings")
|
||||
-- Define some menus (mod_menu required)
|
||||
dopath("cfg_menus")
|
||||
|
||||
+-- Load workspace nesting stuff.
|
||||
+dopath("detach")
|
||||
+dopath("nest-ws")
|
||||
+detach.setup_hooks()
|
||||
+
|
||||
-- Load additional user configuration. 'true' as second parameter asks
|
||||
-- Ion not to complain if the file is not found.
|
||||
dopath("cfg_user", true)
|
10
x11/ion/patches/patch-etc_cfg_menus_lua
Normal file
10
x11/ion/patches/patch-etc_cfg_menus_lua
Normal file
@ -0,0 +1,10 @@
|
||||
$OpenBSD: patch-etc_cfg_menus_lua,v 1.1 2005/09/29 22:19:39 pedro Exp $
|
||||
--- etc/cfg_menus.lua.orig Sat Aug 20 08:33:49 2005
|
||||
+++ etc/cfg_menus.lua Wed Sep 28 23:46:29 2005
|
||||
@@ -43,4 +43,6 @@ defctxmenu("WFrame", {
|
||||
menuentry("Clear tags", "ioncore.clear_tags()"),
|
||||
menuentry("Window info", "mod_query.show_clientwin(_, _sub)",
|
||||
"_sub:WClientWin"),
|
||||
+ submenu("Attach", "menuattach"),
|
||||
+ submenu("Detach", "menudetach"),
|
||||
})
|
@ -1,4 +1,4 @@
|
||||
@comment $OpenBSD: PLIST,v 1.11 2005/09/07 19:53:41 pedro Exp $
|
||||
@comment $OpenBSD: PLIST,v 1.12 2005/09/29 22:19:39 pedro Exp $
|
||||
%%SHARED%%
|
||||
bin/ion3
|
||||
bin/pwm3
|
||||
@ -67,6 +67,7 @@ share/examples/ion3/cfg_pwm_menus.lua
|
||||
share/examples/ion3/cfg_query.lua
|
||||
share/examples/ion3/cfg_sp.lua
|
||||
share/examples/ion3/cfg_statusbar.lua
|
||||
share/examples/ion3/detach.lua
|
||||
share/examples/ion3/dock-draw.lua
|
||||
share/examples/ion3/look.lua
|
||||
share/examples/ion3/look_brownsteel.lua
|
||||
@ -80,6 +81,7 @@ share/examples/ion3/look_simpleblue.lua
|
||||
share/examples/ion3/look_wheat2.lua
|
||||
share/examples/ion3/lookcommon_clean.lua
|
||||
share/examples/ion3/lookcommon_emboss.lua
|
||||
share/examples/ion3/nest-ws.lua
|
||||
share/ion3/
|
||||
share/ion3/ion-completeman
|
||||
share/ion3/ion-runinxterm
|
||||
|
Loading…
Reference in New Issue
Block a user