ACC SHELL

Path : /usr/share/YaST2/modules/
File Upload :
Current File : //usr/share/YaST2/modules/DefaultDesktop.ycp

/**
 * 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