Prevent overflow while calculating frame size hints
[notion/jeffpc.git] / ioncore / ioncore_wd.lua
blob8675cd0c269efc858b718623ac6964352a27345e
1 --
2 -- ion/share/ioncore_wd.lua
3 --
4 -- Copyright (c) Tuomo Valkonen 2004-2009.
5 --
6 -- See the included file LICENSE for details.
7 --
9 local savefile="saved_wd"
10 local dirs={}
11 local lfs
13 if pcall(function() return require('lfs') end) then
14 lfs=_G["lfs"]
15 end
17 local function checkdir(d)
18 if not lfs then
19 return true
20 else
21 local t, err=lfs.attributes(d, "mode")
22 if not t then
23 return nil, err
24 elseif t=="directory" then
25 return true
26 else
27 return nil, TR("Not a directory.")
28 end
29 end
30 end
32 local function regtreepath_i(reg)
33 local function f(s, v)
34 if v then
35 return v:manager()
36 else
37 return s
38 end
39 end
40 return f, reg, nil
41 end
43 --DOC
44 -- Change default working directory for new programs started in \var{reg}.
45 function ioncore.chdir_for(reg, dir)
46 assert(dir==nil or type(dir)=="string")
47 if dir=="" or dir==nil then
48 dirs[reg]=nil
49 return true
50 else
51 local ok, err=checkdir(dir)
52 if ok then
53 dirs[reg]=dir
54 end
55 return ok, err
56 end
57 end
59 --DOC
60 -- Get default working directory for new programs started in \var{reg}.
61 function ioncore.get_dir_for(reg)
62 for r in regtreepath_i(reg) do
63 if dirs[r] then
64 return dirs[r]
65 end
66 end
67 end
70 local function lookup_script_warn(script)
71 local script=ioncore.lookup_script(script)
72 if not script then
73 warn(TR("Could not find %s", script))
74 end
75 return script
76 end
79 local function lookup_runinxterm_warn(prog, title, wait)
80 local rx=lookup_script_warn("ion-runinxterm")
81 if rx then
82 rx="exec "..rx
83 if wait then
84 rx=rx.." -w"
85 end
86 if title then
87 rx=rx.." -T "..string.shell_safe(title)
88 end
89 if prog then
90 rx=rx.." -- "..prog
91 end
92 end
93 return rx
94 end
97 --DOC
98 -- Run \var{cmd} with the environment variable DISPLAY set to point to the
99 -- root window of the X screen \var{reg} is on. If \var{cmd} is prefixed
100 -- by a colon (\code{:}), the following command is executed in an xterm
101 -- (or other terminal emulator) with the help of the \command{ion-runinxterm}
102 -- script. If the command is prefixed by two colons, \command{ion-runinxterm}
103 -- will ask you to press enter after the command is finished, even if it
104 -- returns succesfully.
106 -- For GUI commands, you might prefer to use mod\_query.exec\_on\_merr(), which
107 -- monitors the process's \code{stderr} and shows any output as warnings on
108 -- the screen instead of in notions own output.
109 function ioncore.exec_on(reg, cmd, merr_internal)
110 local _, _, col, c=string.find(cmd, "^[%s]*(:+)(.*)")
111 if col then
112 cmd=lookup_runinxterm_warn(c, nil, string.len(col)>1)
113 if not cmd then
114 return
116 if XTERM then
117 cmd='XTERMCMD='..string.shell_safe(XTERM)..' '..cmd
120 return ioncore.do_exec_on(reg, cmd, ioncore.get_dir_for(reg),
121 merr_internal)
125 local function load_config()
126 local d=ioncore.read_savefile(savefile)
127 if d then
128 dirs={}
129 for nm, d in pairs(d) do
130 local r=ioncore.lookup_region(nm)
131 if r then
132 local ok, err=checkdir(d)
133 if ok then
134 dirs[r]=d
135 else
136 warn(err)
144 local function save_config()
145 local t={}
146 for r, d in pairs(dirs) do
147 local nm=obj_exists(r) and r:name()
148 if nm then
149 t[nm]=d
152 ioncore.write_savefile(savefile, t)
156 local function init()
157 load_config()
158 ioncore.get_hook("ioncore_snapshot_hook"):add(save_config)
159 ioncore.get_hook("ioncore_post_layout_setup_hook"):add(load_config)
162 init()