ACC SHELL
/**
* File: DefaultDesktop.ycp
* Package: Handling of default desktop selection
* Authors: Jiri Srain <jsrain@suse.cz>
* Lukas Ocilka <locilka@suse.cz>
*
* $Id: DefaultDesktop.ycp 57028 2009-04-29 10:58:09Z lslezak $
*/
{
module "DefaultDesktop";
textdomain "packager";
import "ProductFeatures";
import "ProductControl";
import "Installation";
import "PackagesProposal";
import "Mode";
// All desktop definitions are taken from control file
// @see GetAllDesktopsMap
map <string, map> all_desktops = nil;
/**
* Desktop which was selected in the desktop selection dialog.
* Must be defined in control file in section software->supported_desktops.
*/
string desktop = nil;
any MissingKey (map & desktop_def, string key) {
any ret = nil;
y2warning ("Wrong desktop def, missing '%1' key: %2", key, desktop_def);
switch (key) {
case "order":
ret = 99;
break;
case "desktop":
ret = "unknown";
break;
default:
ret = "";
break;
};
return ret;
}
boolean initialized = false;
global void SetDesktop (string new_desktop);
/**
* Initialize default desktop from control file if specified there
*/
global void Init () {
if (initialized == true || Mode::autoinst() ) {
y2debug ("Already initialized");
return;
}
initialized = true;
// See BNC #424678
if (all_desktops == nil) {
y2milestone ("Getting supported desktops from control file");
list <map> desktops_from_cf = [];
// supported_desktops migh be undefined
any any_desktops_from_cf = ProductFeatures::GetFeature ("software", "supported_desktops");
if (any_desktops_from_cf != "" && any_desktops_from_cf != "") {
desktops_from_cf = (list <map>) any_desktops_from_cf;
}
all_desktops = $[];
map <string, any> one_desktop = $[];
string desktop_name = "";
foreach (map one_desktop_cf, desktops_from_cf, {
desktop_name = one_desktop_cf["name"]:"";
if (desktop_name == "") {
y2error ("Missing 'name' in %1", one_desktop_cf);
return;
}
string desktop_label = (string) one_desktop_cf["label_id"]:MissingKey (one_desktop_cf, "label_id");
// required keys
one_desktop = $[
"desktop" : one_desktop_cf["desktop"]:MissingKey (one_desktop_cf, "desktop"),
"logon" : one_desktop_cf["logon"]:MissingKey (one_desktop_cf, "logon"),
"cursor" : one_desktop_cf["cursor"]:MissingKey (one_desktop_cf, "logon"),
"packages" : splitstring (one_desktop_cf["packages"]:"", " \t\n"),
"patterns" : splitstring (one_desktop_cf["patterns"]:"", " \t\n"),
"order" : one_desktop_cf["order"]:MissingKey (one_desktop_cf, "order"),
// BNC #449818, after switching the language name should change too
"label_id" : desktop_label,
"label" : ProductControl::GetTranslatedText (desktop_label),
];
// 'icon' in optional
if (haskey (one_desktop_cf, "icon")) {
one_desktop["icon"] = (string) one_desktop_cf["icon"]:"";
}
// 'description' is optional
if (haskey (one_desktop_cf, "description_id")) {
string description_id = (string) one_desktop_cf["description_id"]:"";
one_desktop["description"] = ProductControl::GetTranslatedText (description_id);
// BNC #449818, after switching the language description should change too
one_desktop["description_id"] = description_id;
}
// bnc #431251
// If this desktop is selected, do not deselect patterns
if (haskey (one_desktop_cf, "do_not_deselect_patterns")) {
one_desktop["do_not_deselect_patterns"] = (boolean) one_desktop_cf["do_not_deselect_patterns"]:false;
}
all_desktops[desktop_name] = one_desktop;
});
}
string default_desktop = ProductFeatures::GetStringFeature
("software", "default_desktop");
if (default_desktop == "")
default_desktop = nil;
y2milestone ("Default desktop: '%1'", default_desktop);
SetDesktop (default_desktop);
}
/**
* Forces new initialization...
*/
global void ForceReinit () {
initialized = false;
Init();
}
/**
* Returns map of pre-defined default system tasks
*
* @return map <string, map> all_system_tasks
*
* @struct $[
* "desktop ID" : $[
* "desktop" : "desktop to start", // DEFAULT_WM
* "order" : integer,
* "label" : _("Desktop Name Visible in Dialog (localized - initial localization)"),
* "label_id" : _("Desktop Name Visible in Dialog (original)"),
* "description" : _("Description text of the desktop (localized - initial localization)"),
* "description_id" : _("Description text of the desktop (originale)"),
* "patterns" : ["list", "of", "related", "patterns"],
* "icon" : "some-icon", // filename from the 64x64 directory of the current theme (without .png suffix)
* ],
* ]
*/
global map <string, map> GetAllDesktopsMap () {
Init();
return all_desktops;
}
/**
* Return list installed desktops or desktop selected for installation.
*
* @see GetAllDesktopsMap
*/
global list <string> SelectedDesktops () {
Init();
Pkg::TargetInit (Installation::destdir, true);
Pkg::SourceStartManager (true);
Pkg::PkgSolve (true);
list <string> all_sel_or_inst_patterns = maplist (map <string, any> one_pattern, Pkg::ResolvableProperties ("", `pattern, ""), {
if (one_pattern["status"]:`unknown == `selected || one_pattern["status"]:`unknown == `installed) {
return one_pattern["name"]:"";
}
});
// all selected or installed patterns
all_sel_or_inst_patterns = filter (string one_pattern, all_sel_or_inst_patterns, {
return (one_pattern != nil);
});
list <string> selected_desktops = [];
boolean selected = true;
foreach (string desktop_name, map desktop_def, GetAllDesktopsMap(), {
selected = true;
foreach (string one_pattern, desktop_def["patterns"]:[], {
if (! contains (all_sel_or_inst_patterns, one_pattern)) {
selected = false;
return;
}
});
if (selected)
selected_desktops = add (selected_desktops, desktop_name);
});
return selected_desktops;
}
/**
* Get the currently set default desktop, nil if none set
* @return string desktop or nil
*/
global string Desktop () {
Init();
return desktop;
}
string packages_proposal_ID = "DefaultDesktop";
/**
* Set the default desktop
* @param desktop a string, one of those desktops defined in control file or nil
*/
global void SetDesktop (string new_desktop) {
Init();
if (new_desktop == nil) {
// Reset the selected patterns
y2milestone ("Reseting DefaultDesktop");
PackagesProposal::SetResolvables (packages_proposal_ID, `pattern, []);
} else if (! haskey (all_desktops, new_desktop)) {
y2error ("Attempting to set desktop to unknown %1", new_desktop);
} else {
desktop = new_desktop;
y2milestone ("New desktop has been set: %1", desktop);
if (desktop != nil && desktop != "") {
// Require new patterns
PackagesProposal::SetResolvables (packages_proposal_ID, `pattern, all_desktops[desktop,"patterns"]:[]);
}
}
}
/**
* Get preffered window/desktop manager for the selected desktop
* @return string preffered window/desktop manager, empty if no one
*/
global string PrefferedWindowManager () {
Init();
return all_desktops[desktop,"desktop"]:"";
}
/**
* Get patterns which should be selected for currently selected desktop
* @return a list of patterns
*/
global list<string> PatternsToSelect () {
Init();
return all_desktops[desktop, "patterns"]:[];
}
/**
* Get patterns which should be NOT selected for currently selected desktop
* @return a list of patterns
*/
global list<string> PatternsToDeselect () {
Init();
// patterns which must be selected
list <string> patterns_to_select = PatternsToSelect();
list <string> patterns_to_deselect = [];
// bnc #431251
// A dummy desktop is selected, do not deselect already selected patterns
if (all_desktops[desktop, "do_not_deselect_patterns"]:false == true) {
y2milestone ("Desktop %1 has 'do_not_deselect_patterns' set", desktop);
} else {
// go through all known system task definitions
foreach (string one_desktop, map desktop_descr, GetAllDesktopsMap(), {
// all patterns required by a system type
foreach (string one_pattern, desktop_descr["patterns"]:[], {
// if not required, add it to 'to deselect'
if (one_pattern != nil && ! contains (patterns_to_select, one_pattern)) {
patterns_to_deselect = add (patterns_to_deselect, one_pattern);
}
});
});
}
y2milestone ("Patterns to deselect '%1' -> %2", desktop, patterns_to_deselect);
return patterns_to_deselect;
}
/**
* Get the description of the currently selected desktop for the summary
* @return string the description of the desktop
*/
global string Description () {
Init();
return ProductControl::GetTranslatedText (all_desktops[desktop, "label_id"]:"");
}
/* EOF */
}
ACC SHELL 2018