with_system_controller = false
with_amb = false
-verbose = 3
+verbose = 0
m = murphy.get()
function regulateApplications(t, regulation)
for k,v in pairs(ft(t)) do
- -- iterate through the undefined and entertainment apps, see if
- -- they have been overruled in local config
+ whitelisted = false
+ -- our local application config, which takes precedence
local conf = getApplication(v.appid)
- if conf and conf.resource_class ~= "player" then
+ if conf then
+ if conf.resource_class ~= "player" then
+ whitelisted = true
+ end
+
+ if conf.requisites and conf.requisites.screen then
+ if conf.requisites.screen.driving then
+ whitelisted = true
+ end
+ end
+ end
+
+ if whitelisted then
-- override, don't disable
resmgr:disable_screen_by_appid("*", "*", v.appid, false, false)
else
m:load_plugin('system-controller')
+onscreen_counter = 0
+
window_manager_operation_names = {
[1] = "create",
[2] = "destroy"
local r = m:JSON({surface = surface,
visible = 1,
raise = 1})
+ if ev.appid == onscreen then
+ onscreen_counter = onscreen_counter + 1
+ wmgr:layer_request(m:JSON({layer = 5, visible = 1}))
+ end
+
wmgr:window_request(r,a,0)
elseif event == "revoke" then
if verbose > 0 then
local a = animation({})
local r = m:JSON({surface = ev.surface,
visible = 0})
+ if ev.appid == onscreen then
+ onscreen_counter = onscreen_counter - 1
+ if onscreen_counter <= 0 then
+ onscreen_counter = 0
+ wmgr:layer_request(m:JSON({layer = 5, visible = 0}))
+ end
+ end
wmgr:window_request(r,a,0)
elseif event == "create" then
-- our local application config, which takes precedence
local conf = getApplication(ev.appid)
- -- disable only non-whitelisted applications
- if not conf or conf.resource_class == "player" then
- if blacklisted then
- if verbose > 0 then
- print("disabling screen for " .. ev.appid)
+ if not conf then
+ blacklisted = true
+ else
+ if conf.resource_class == "player" then
+ blacklisted = true
+ end
+
+ -- check the exceptions
+ if conf.requisites and conf.requisites.screen then
+ if conf.requisites.screen.driving then
+ blacklisted = false
end
- resmgr:disable_screen_by_appid("*", "*", ev.appid, true, true)
end
end
+
+ -- disable only non-whitelisted applications
+ if blacklisted then
+ if verbose > 0 then
+ print("disabling screen for " .. ev.appid)
+ end
+ resmgr:disable_screen_by_appid("*", "*", ev.appid, true, true)
+ end
end
elseif event == "destroy" then
pos_y = function(w,h) return (h-64-128)/2+64 end,
width = function(w,h) return w end,
height = function(w,h) return (h-64-128)/2 end
- },
+ },
Control = {
id = 14,
pos_x = 0,
if s == "system" then
local a = animation({})
local r = m:JSON({surface = win.surface,
- visible = 1,
+ visible = 0,
raise = 1})
self:window_request(r,a,0)
else
homescreen = ""
onscreen = ""
+cids = {}
+
-- these shoud be before wmgr:connect() is called
if verbose > 0 then
print("====== creating applications ======")
area = "Center.Full",
privileges = { screen = "none", audio = "none" },
resource_class = "system",
+ requisites = { screen = "driving", audio = "none" },
screen_priority = 30
}
+application {
+ appid = "MediaPlayer",
+ area = "Center.Full",
+ privileges = { screen = "none", audio = "none" },
+ requisites = { screen = "driving", audio = "none" },
+ resource_class = "player",
+ screen_priority = 0
+}
+
+application {
+ appid = "MyMediaPlayer",
+ area = "Center.Full",
+ privileges = { screen = "none", audio = "none" },
+ requisites = { screen = "driving", audio = "none" },
+ resource_class = "player",
+ screen_priority = 0
+}
+
+application {
+ appid = "MeterWidget",
+ area = "Center.Full",
+ privileges = { screen = "none", audio = "none" },
+ requisites = { screen = "driving", audio = "none" },
+ resource_class = "player",
+ screen_priority = 0
+}
+
+application {
+ appid = "org.tizen.ico.app-soundsample",
+ area = "Center.Full",
+ privileges = { screen = "none", audio = "none" },
+ -- uncomment the next line to make the app exempt from regulation
+ -- requisites = { screen = "driving", audio = "none" },
+ resource_class = "player",
+ screen_priority = 0
+}
+
+
if sc then
sc.client_handler = function (self, cid, msg)
local command = msg.command
end
end
- if not connected and appid == "org.tizen.ico.homescreen" then
+ if not connected and appid == "org.tizen.ico.homescreen" then
print('Trying to connect to weston...')
connected = wmgr:connect()
end
+ cids[cid] = appid
end
end
sc.window_handler = function (self, cid, msg)
if verbose > 0 then
print('### ==> received ' ..
- command_name(msg.command) .. ' message')
+ command_name(msg.command) .. ' message from ' .. cids[cid])
if verbose > 1 then
print(tostring(msg))
end
local time = 200
if msg.arg.anim_time then
local t = msg.arg.anim_time
+ -- the actual time for the animation
time = m:AND(t, time_mask)
- nores = not m:AND(t, nores_mask)
+ -- flag for ignoring resource control
+ nores = m:AND(t, nores_mask)
if m:AND(t, raise_mask) then
msg.arg.raise = 1
elseif m:AND(t, lower_mask) then
end
if msg.arg.anim_name then
a.show = { msg.arg.anim_name, time }
- print('time: ' .. tostring(a.show[2]))
+ print('time: ' .. tostring(time))
end
end
if not nores then
local time = 200
if msg.arg.anim_time then
local t = msg.arg.anim_time
+ -- the actual time for the animation
time = m:AND(t, time_mask)
- nores = not m:AND(t, nores_mask)
+ -- flag for ignoring resource control
+ nores = m:AND(t, nores_mask)
end
if msg.arg.anim_name then
a.hide = { msg.arg.anim_name, time }
end
end
+ getKey = function (msg)
+ -- Field rset.key is an id for distinguishing between rsets. All
+ -- resource types appear to contain a different key. Just pick one
+ -- based on what we have on the message.
+
+ key = nil
+
+ if msg and msg.res then
+ if msg.res.sound then
+ key = msg.res.sound.id
+ elseif msg.res.input then
+ key = msg.res.input.name
+ elseif msg.res.window then
+ -- alarm! this appars to be non-unique?
+ key = msg.res.window.resourceId
+ end
+ end
+
+ return key
+ end
+
createResourceSet = function (ctl, client, msg)
- cb = function(rset, data)
- print("> resource callback")
+ cb = function(rset)
+
+ -- m:info("*** resource_cb: client = '" .. msg.appid .. "'")
-- type is either basic (0) or interrupt (1)
requestType = 0
requestType = msg.res.type
end
+ if rset.data.filter_first then
+ rset.data.filter_first = false
+ return
+ end
+
if rset.acquired then
cmd = 0x00040001 -- acquire
+
+ if msg.appid == onscreen then
+ -- notifications are valid only for a number of seconds
+ rset.timer = m:Timer({
+ interval = 5000,
+ oneshot = true,
+ callback = function (t)
+ m:info("notification timer expired")
+
+ if rset.data then
+ reply.res.window = rset.data.window
+ end
+
+ rset:release()
+ rset.timer = nil
+
+ -- Send a "RELEASE" message to client.
+ -- This triggers the resource deletion
+ -- cycle in OnScreen.
+
+ reply = m.JSON({
+ appid = msg.appid,
+ command = cmd,
+ res = {
+ type = requestType
+ }
+ })
+
+ sc:send_message(client, reply)
+ end
+ })
+ end
else
cmd = 0x00040002 -- release
+ if rset.timer then
+ rset.timer.callback = nil
+ rset.timer = nil
+ end
end
reply = m.JSON({
- appid = data.client,
+ appid = msg.appid,
command = cmd,
res = {
type = requestType
}
})
- if rset.resources.audio_playback then
- reply.res.sound = {
- zone = "driver",
- name = msg.appid,
- adjust = 0,
- -- id = "0"
- }
+ if rset.data.sound then
+ reply.res.sound = rset.data.sound
end
- if rset.resources.display then
- reply.res.window = {
- zone = "driver",
- name = msg.appid,
- -- id = "0"
- }
+ if rset.data.window then
+ reply.res.window = rset.data.window
end
- if rset.resources.input then
- reply.res.input = {
- name = msg.appid,
- event = 0
- }
+ if rset.data.input then
+ reply.res.input = rset.data.input
end
- print("sending message to client: " .. data.client)
- if sc:send_message(data.client, reply) then
- print('*** reply OK')
+ if rset.acquired then
+ m:info("resource cb: 'acquire' reply to client " .. client)
else
- print('*** reply FAILED')
+ m:info("resource cb: 'release' reply to client " .. client)
+ end
+
+ if not sc:send_message(client, reply) then
+ m:info('*** reply FAILED')
end
end
- rset = m:ResourceSet({
+ local rset = m:ResourceSet({
application_class = "player",
zone = "driver", -- msg.zone ("full")
callback = cb
rset.data = {
cid = cid,
- ctl = ctl
+ ctl = ctl,
+ filter_first = true
}
if msg.res.sound then
print("sound name: " .. msg.res.sound.name)
print("sound zone:" .. msg.res.sound.zone)
print("sound adjust: " .. tostring(msg.res.sound.adjust))
- if msg.res.sound.id then
- print("sound id: " .. msg.res.sound.id)
- end
+
+ rset.data.sound = msg.res.sound
end
if msg.res.input then
})
rset.resources.input.attributes.pid = tostring(msg.pid)
rset.resources.input.attributes.appid = msg.appid
- print("input name: " .. msg.res.sound.name)
+ print("input name: " .. msg.res.input.name)
print("input event:" .. tostring(msg.res.input.event))
+
+ rset.data.input = msg.res.input
end
if msg.res.window then
rset:addResource({
- resource_name = "display"
+ resource_name = "screen",
+ shared = true
})
- rset.resources.display.attributes.pid = tostring(msg.pid)
- rset.resources.display.attributes.appid = msg.appid
- print("display name: " .. msg.res.display.name)
- print("display zone:" .. msg.res.display.zone)
- if msg.res.display.id then
- print("display id: " .. msg.res.display.id)
+ rset.resources.screen.attributes.pid = tostring(msg.pid)
+ rset.resources.screen.attributes.appid = msg.appid
+ rset.resources.screen.attributes.surface = msg.res.window.resourceId
+ complete_area = msg.res.window.display .. '.' .. msg.res.window.area
+ rset.resources.screen.attributes.area = complete_area
+ if msg.appid == onscreen then
+ rset.resources.screen.attributes.classpri = 1
+ else
+ rset.resources.screen.attributes.classpri = 0
end
+
+ rset.data.window = msg.res.window
end
+ rset.key = getKey(msg)
+
return rset
end
if msg.command == 0x40011 then -- create_res
print("command CREATE_RES")
+ key = getKey(msg)
- if not sets.cid then
- sets.cid = createResourceSet(self, cid, msg)
+ if key then
+ if not sets.cid then
+ sets.cid = {}
+ end
+ sets.cid[key] = createResourceSet(self, cid, msg)
end
elseif msg.command == 0x40012 then -- destroy_res
print("command DESTROY_RES")
+ key = getKey(msg)
- if sets.cid then
- sets.cid:release()
+ if key then
+ if sets.cid and sets.cid[key] then
+ sets.cid[key]:release()
+ sets.cid[key].timer = nil
+ sets.cid[key] = nil -- garbage collecting
+ end
end
- sets.cid = nil -- garbage collecting
-
elseif msg.command == 0x40001 then -- acquire_res
print("command ACQUIRE_RES")
+ key = getKey(msg)
- if not sets.cid then
- sets.cid = createResourceSet(self, cid, msg)
+ if key then
+ if not sets.cid then
+ sets.cid = {}
+ end
+ if not sets.cid[key] then
+ sets.cid[key] = createResourceSet(self, cid, msg)
+ end
+ print("acquiring the resource set")
+ sets.cid[key]:acquire()
end
- sets.cid:acquire()
-
elseif msg.command == 0x40002 then -- release_res
print("command RELEASE_RES")
- if sets.cid then
- sets.cid:release()
+ key = getKey(msg)
+
+ if key then
+ if sets.cid and sets.cid[key] then
+ sets.cid[key]:release()
+
+ if msg.appid == onscreen then
+ -- in case of OnScreen, this actually means that the
+ -- resource set is never used again; let gc do its job
+ sets.cid[key].timer = nil
+ sets.cid[key] = nil -- garbage collecting
+ end
+ end
end
elseif msg.command == 0x40003 then -- deprive_res