From 77af7cb705b5b2c18efc2ce39b790d29f423041a Mon Sep 17 00:00:00 2001 From: Janos Kovacs Date: Sun, 16 Feb 2014 21:03:55 +0200 Subject: [PATCH] system-controller: support for disabling single windows (surfaces) Change-Id: Ib35cb922c1b6cbfcc7edeae6aa1f11075d8cf7a8 --- packaging.in/murphy.lua | 8 +++--- src/plugins/system-controller/data-types.h | 1 + .../system-controller/resource-manager/audio.c | 2 +- .../resource-manager/resource-manager.h | 1 + .../system-controller/resource-manager/screen.c | 30 +++++++++++++++++----- .../resource-manager/scripting-resource-manager.c | 22 +++++++++++++++- 6 files changed, 52 insertions(+), 12 deletions(-) diff --git a/packaging.in/murphy.lua b/packaging.in/murphy.lua index 664189b..67e94ef 100644 --- a/packaging.in/murphy.lua +++ b/packaging.in/murphy.lua @@ -776,12 +776,12 @@ resmgr = resource_manager { local regulation = mdb.select.select_driving_mode.single_value - if regulation then + if regulation == 1 then conf = getApplication(ev.appid) -- disable only non-whitelisted applications if not conf or conf.resource_class == "player" then - resmgr:disable_screen_by_appid("*", "*", v.appid, true) + resmgr:disable_screen_by_appid("*", "*", ev.appid, true) end end @@ -1364,7 +1364,7 @@ if sc then if msg.arg.anim_time then local t = msg.arg.anim_time time = m:AND(t, time_mask) - nores = m:AND(t, nores_mask) + nores = not m:AND(t, nores_mask) if m:AND(t, raise_mask) then msg.arg.raise = 1 elseif m:AND(t, lower_mask) then @@ -1405,7 +1405,7 @@ if sc then if msg.arg.anim_time then local t = msg.arg.anim_time time = m:AND(t, time_mask) - nores = m:AND(t, nores_mask) + nores = not m:AND(t, nores_mask) end if msg.arg.anim_name then a.hide = { msg.arg.anim_name, time } diff --git a/src/plugins/system-controller/data-types.h b/src/plugins/system-controller/data-types.h index 87e6bec..b9d7814 100644 --- a/src/plugins/system-controller/data-types.h +++ b/src/plugins/system-controller/data-types.h @@ -69,6 +69,7 @@ enum mrp_sysctl_scripting_field_e { SCREEN_EVENT_HANDLER, /* 22 */ DISABLE_AUDIO_BY_APPID, /* 23 */ DISABLE_SCREEN_BY_APPID, + /* 25 */ DISABLE_SCREEN_BY_SURFACE, /* 26 */ DISABLE_AUDIO_BY_REQUISITE, /* 27 */ DISABLE_SCREEN_BY_REQUISITE, }; diff --git a/src/plugins/system-controller/resource-manager/audio.c b/src/plugins/system-controller/resource-manager/audio.c index 4ecde12..bb687e7 100644 --- a/src/plugins/system-controller/resource-manager/audio.c +++ b/src/plugins/system-controller/resource-manager/audio.c @@ -542,7 +542,7 @@ static audio_resource_t *audio_resource_create(mrp_resmgr_audio_t *audio, mrp_resmgr_notifier_queue_audio_event(audio->resmgr, ar->zoneid, zonename, MRP_RESMGR_EVENTID_CREATE, - app->appid, ar->audioid); + appid, ar->audioid); mrp_resmgr_notifier_flush_audio_events(audio->resmgr, ar->zoneid); return ar; diff --git a/src/plugins/system-controller/resource-manager/resource-manager.h b/src/plugins/system-controller/resource-manager/resource-manager.h index dd878e4..911b26a 100644 --- a/src/plugins/system-controller/resource-manager/resource-manager.h +++ b/src/plugins/system-controller/resource-manager/resource-manager.h @@ -68,6 +68,7 @@ enum mrp_resmgr_disable_e { MRP_RESMGR_DISABLE_REQUISITE, MRP_RESMGR_DISABLE_APPID, + MRP_RESMGR_DISABLE_SURFACEID, MRP_RESMGR_DISABLE_MAX }; diff --git a/src/plugins/system-controller/resource-manager/screen.c b/src/plugins/system-controller/resource-manager/screen.c index a1d4b80..4c8ab7f 100644 --- a/src/plugins/system-controller/resource-manager/screen.c +++ b/src/plugins/system-controller/resource-manager/screen.c @@ -112,6 +112,7 @@ struct disable_iterator_s { union { const char *appid; mrp_application_requisite_t req; + uint32_t surfaceid; }; uint32_t zones; int counter; @@ -261,6 +262,9 @@ static int screen_disable_cb(void *key, void *object, void *user_data) goto disable; break; + case MRP_RESMGR_DISABLE_SURFACEID: + goto disable; + disable: disable = sr->disable & it->mask; if (it->disable) { @@ -321,6 +325,7 @@ int mrp_resmgr_screen_disable(mrp_resmgr_screen_t *screen, char fullname[1024]; uint32_t mask; uint32_t z; + void *hk, *obj; MRP_ASSERT(screen && data, "invalid argument"); @@ -366,18 +371,33 @@ int mrp_resmgr_screen_disable(mrp_resmgr_screen_t *screen, dit.areaid = area_id; dit.disable = disable; dit.type = type; - dit.mask = BIT(type - 1); dit.zones = 0; dit.counter = 0; - + switch (type) { case MRP_RESMGR_DISABLE_REQUISITE: + dit.mask = BIT(MRP_RESMGR_DISABLE_REQUISITE - 1); dit.req = *(mrp_application_requisite_t *)data; + mrp_htbl_foreach(screen->resources, screen_disable_cb, &dit); break; - + case MRP_RESMGR_DISABLE_APPID: + dit.mask = BIT(MRP_RESMGR_DISABLE_APPID - 1); dit.appid = (const char *)data; + mrp_htbl_foreach(screen->resources, screen_disable_cb, &dit); + break; + + case MRP_RESMGR_DISABLE_SURFACEID: + dit.mask = BIT(MRP_RESMGR_DISABLE_APPID - 1); + dit.surfaceid = *(uint32_t *)data; + hk = NULL + dit.surfaceid; + if (!(obj = mrp_htbl_lookup(screen->resources, hk))) { + mrp_log_error("system-controller: failed to disable screen: " + "can't find surface %u", dit.surfaceid); + return -1; + } + screen_disable_cb(hk, obj, &dit); break; default: @@ -386,11 +406,9 @@ int mrp_resmgr_screen_disable(mrp_resmgr_screen_t *screen, return -1; } - mrp_htbl_foreach(screen->resources, screen_disable_cb, &dit); - for (z = 0; dit.zones && z < MRP_ZONE_MAX; z++) { mask = (((uint32_t)1) << z); - + if ((mask & dit.zones)) { dit.zones &= ~mask; mrp_resource_owner_recalc(z); diff --git a/src/plugins/system-controller/resource-manager/scripting-resource-manager.c b/src/plugins/system-controller/resource-manager/scripting-resource-manager.c index e562e5d..e232c09 100644 --- a/src/plugins/system-controller/resource-manager/scripting-resource-manager.c +++ b/src/plugins/system-controller/resource-manager/scripting-resource-manager.c @@ -99,6 +99,7 @@ MRP_LUA_CLASS_DEF_SIMPLE ( static mrp_funcbridge_t *area_create; static mrp_funcbridge_t *window_raise; +static mrp_funcbridge_t *disable_screen_by_surface; static mrp_funcbridge_t *disable_screen_by_appid; static mrp_funcbridge_t *disable_screen_by_requisite; static mrp_funcbridge_t *disable_audio_by_appid; @@ -221,6 +222,10 @@ static int resmgr_getfield(lua_State *L) mrp_funcbridge_push(L, window_raise); break; + case DISABLE_SCREEN_BY_SURFACE: + mrp_funcbridge_push(L, disable_screen_by_surface); + break; + case DISABLE_SCREEN_BY_APPID: mrp_funcbridge_push(L, disable_screen_by_appid); break; @@ -463,7 +468,16 @@ static bool disable_screen_bridge(lua_State *L, *ret_type = MRP_FUNCBRIDGE_NO_DATA; - if (!strcmp((const char *)data, "app")) { + if (!strcmp((const char *)data, "sur")) { + if (strcmp(signature, "ossdb")) { + mrp_log_error("bad signature: expected 'ossdb' got '%s'", + signature); + return false; + } + type = MRP_RESMGR_DISABLE_SURFACEID; + data = (void *)&args[3].integer; + } + else if (!strcmp((const char *)data, "app")) { if (strcmp(signature, "osssb")) { mrp_log_error("bad signature: expected 'osssb' got '%s'", signature); @@ -601,6 +615,7 @@ static bool register_methods(lua_State *L) static funcbridge_def_t funcbridge_defs[] = { FUNCBRIDGE(area_create , area_create , "oos" , NULL), FUNCBRIDGE(window_raise , window_raise , "osdd" , NULL), + FUNCBRIDGE(disable_screen_by_surface , disable_screen, "ossdb","sur"), FUNCBRIDGE(disable_screen_by_appid , disable_screen, "osssb","app"), FUNCBRIDGE(disable_screen_by_requisite, disable_screen, "ossob","req"), FUNCBRIDGE(disable_audio_by_appid , disable_audio , "ossb" ,"app"), @@ -778,6 +793,11 @@ mrp_resmgr_scripting_field_name_to_type(const char *name, ssize_t len) return DISABLE_SCREEN_BY_APPID; break; + case 25: + if (!strcmp(name, "disable_screen_by_surface")) + return DISABLE_SCREEN_BY_SURFACE; + break; + case 26: if (!strcmp(name, "disable_audio_by_requisite")) return DISABLE_AUDIO_BY_REQUISITE; -- 2.7.4