home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / usr / share / YaST2 / modules / Desktop.ycp < prev    next >
Text File  |  2006-11-29  |  6KB  |  229 lines

  1. /**
  2.  * File:    modules/Desktop.ycp
  3.  * Package:    yast2
  4.  * Summary:    Handling of .desktop entries
  5.  * Author:    Michal Svec <msvec@suse.cz>
  6.  *
  7.  * $Id: Desktop.ycp 26631 2005-12-19 13:16:25Z ug $
  8.  */
  9.  
  10. {
  11.  
  12. module "Desktop";
  13. textdomain "base";
  14. import "Map";
  15.  
  16. /**
  17.  * YaST configuration modules
  18.  */
  19. global map<string,map> Modules = $[];
  20.  
  21. /**
  22.  * YaST configuration groups
  23.  *
  24.  * <PRE>
  25.     Groups=$[
  26.     "Hardware":$[
  27.         "Icon":"hardware56.png",
  28.         "Name":"_(\"Hardware\")",
  29.         "SortKey":"20",
  30.         "Textdomain":"base",
  31.         "modules":["cdrom", "hwinfo", ...]
  32.     ],
  33.     ...
  34.    ];
  35.  * </PRE>
  36.  */
  37. global map<string,map> Groups = $[];
  38.  
  39. /**
  40.  * Optional agent path to the desktop files
  41.  */
  42. global path AgentPath = .yast2.desktop;
  43.  
  44. /**
  45.  * Optional language for reading translated entries
  46.  */
  47. string Language = "";
  48. string LanguageFull = "";
  49.  
  50. /**
  51.  */
  52. define string ReadLocalizedKey(path keypath, string key) {
  53.  
  54.     if(key != "Name" && key != "GenericName")
  55.     return (string) SCR::Read(add(keypath, key));
  56.  
  57.     string ret = "";
  58.     string newkey = "";
  59.  
  60.     if(LanguageFull != nil || LanguageFull != "") {
  61.     newkey = sformat("%1[%2]", key, LanguageFull);
  62.     ret = (string) SCR::Read(add(keypath, newkey));
  63.     if(ret != nil && ret != "") return ret;
  64.     }
  65.  
  66.     if(Language != nil || Language != "") {
  67.     newkey = sformat("%1[%2]", key, Language);
  68.     ret = (string) SCR::Read(add(keypath, newkey));
  69.     if(ret != nil && ret != "") return ret;
  70.     }
  71.  
  72.     return (string) SCR::Read(add(keypath, key));
  73. }
  74.  
  75. /**
  76.  * Read module and group data from desktop files
  77.  * @param Values list of values to be parsed (empty to read all)
  78.  */
  79. global define void Read(list<string> Values) {
  80.  
  81.     /* read modules */
  82.     map filemap = $[];
  83.     path filepath = nil;
  84.     string name = nil;
  85.  
  86.     path ps = add(AgentPath, "s");
  87.     list<string> files = (list<string>) SCR::Dir(ps);
  88.  
  89.     /* read language */
  90.     LanguageFull = "";
  91.     Language = WFM::GetLanguage();
  92.     if(regexpmatch(Language, "(.*_[^.]*)\\.?.*")) // matches: ll_TT ll_TT.UTF-8
  93.     LanguageFull = regexpsub(Language, "(.*_[^.]*)\\.?.*", "\\1");
  94.     if(regexpmatch(Language, "(.*)_"))
  95.     Language = regexpsub(Language, "(.*)_", "\\1");
  96.     y2debug("LanguageFull=%1", LanguageFull);
  97.     y2debug("Language=%1", Language);
  98.  
  99.     /* read groups */
  100.     list<string> groups = (list<string>) SCR::Dir(.yast2.groups.s);
  101.     y2debug("groups=%1", groups);
  102.     foreach(string group, groups, {
  103.     filemap = $[];
  104.     filepath = .yast2.groups.v + group + "Desktop Entry";
  105.  
  106.     filemap["Icon"] = SCR::Read(filepath + "Icon");
  107.     filemap["SortKey"] = SCR::Read(filepath + "X-SuSE-YaST-SortKey");
  108.     filemap["Hidden"] = SCR::Read(filepath + "Hidden");
  109.     filemap["Name"] = ReadLocalizedKey(filepath, "Name");
  110.     filemap["modules"] = [];
  111.  
  112.     string name = (string) SCR::Read(filepath + "X-SuSE-YaST-Group");
  113.     Groups[name] = filemap;
  114.     });
  115.     y2debug("Groups=%1", Groups);
  116.  
  117.     /* read modules */
  118.     foreach(string file, files, {
  119.     filemap = $[];
  120.     filepath = AgentPath + .v + file + ."Desktop Entry";
  121.     list<string> values = (list<string>) SCR::Dir(filepath);
  122.     if(Values != nil && Values != []) values = Values;
  123.     foreach(string value, values, {
  124.         string ret = ReadLocalizedKey(filepath, value);
  125.         if(ret != nil && ret != "") filemap[value] = ret;
  126.     });
  127.     string name = regexpsub(file, "^.*/(.*)\.desktop", "\\1");
  128.     if(name != "" && name != nil) {
  129.         Modules[name] = filemap;
  130.         string group = filemap["X-SuSE-YaST-Group"]:"";
  131.         if(group != "") Groups[group, "modules", size(Groups[group,"modules"]:[])] = name;
  132.     }
  133.     });
  134.     y2debug("Groups=%1", Groups);
  135.     y2debug("Modules=%1", Modules);
  136.  
  137. }
  138.  
  139. /**
  140.  */
  141. global define string Translate(string key) {
  142.     if(regexpmatch(key, "_\\(\"(.*)\"\\)") == true) {
  143.     locale ke = regexpsub(key, "_\\(\"(.*)\"\\)", "\\1");
  144.     key = (string) eval(ke);
  145.     y2milestone("%1 -> %2", ke, key);
  146.     }
  147.     return key;
  148. }
  149.  
  150. /**
  151.  */
  152. define list <term> CreateList(map M) {
  153.     list keys = Map::Keys(M);
  154.     keys = sort(any x, any y, keys, {
  155.     return M[x, "SortKey"]:"" < M[y, "SortKey"]:"";
  156.     });
  157.     
  158.     keys = filter (any key, keys, {
  159.     return M[key, "Hidden"]:"false" != "true";
  160.     });
  161.     
  162.     y2debug("keys=%1", keys);
  163.  
  164.     return maplist(any name, keys, {
  165.     return `item(`id(name), Translate(M[name, "Name"]:"???"));
  166.     });
  167. }
  168.  
  169. /**
  170.  */
  171. global define list <term> GroupList() {
  172.     return CreateList(Groups);
  173. }
  174.  
  175. /**
  176.  */
  177. global define list <term> ModuleList(string group) {
  178.     list <string> mods = Groups[group, "modules"]:[];
  179.     list <term> l = [];
  180.  
  181.     /* support sort keys: #36466 */
  182.     mods = sort(string x, string y, mods, {
  183.     // y2internal("%1 < %2", Modules[x, "X-SuSE-YaST-SortKey"]:(Modules[x,"Name"]:""), Modules[y, "X-SuSE-YaST-SortKey"]:(Modules[y,"Name"]:""));
  184.     return Modules[x, "X-SuSE-YaST-SortKey"]:(Modules[x,"Name"]:"") < Modules[y, "X-SuSE-YaST-SortKey"]:(Modules[y,"Name"]:"");
  185.     });
  186.  
  187.     foreach(string m, mods, {
  188.     if(haskey(Modules, m) &&  Modules[m, "Hidden"]:"false" != "true")
  189.         l = add(l, `item(`id(m), Modules[m,"Name"]:"???"));
  190.     });
  191.  
  192.     // y2debug too costly: y2debug("%1", m);
  193.     return l;
  194. }
  195.  
  196. /**
  197.  */
  198. map<string, string> MakeAutostartMap (string exec, list<string> args) {
  199.     return $[
  200.     "Encoding": "UTF-8",
  201.     "Name": exec,
  202.     "Exec": exec,
  203.     "X-SuSE-Autostart": exec + " " + mergestring (args, " "),
  204.     "Hidden": "true",
  205.     "Icon": exec,
  206.     "Type": "Application",
  207.     ];
  208. }
  209.  
  210. /**
  211.  * Runs a program by writing a special desktop file.
  212.  * Works with KDE and GNOME.
  213.  * Useful for kinternet, see bug 37864#c17
  214.  * @param exec program to exec (basename)
  215.  */
  216. global void RunViaDesktop (string exec, list<string> args) {
  217.     string content = "[KDE Desktop Entry]\n";
  218.     foreach (string key, string value, MakeAutostartMap (exec, args), {
  219.     content = content + sformat ("%1=%2\n", key, value);
  220.     });
  221.     string dir = "/var/lib/Desktop";
  222.     SCR::Write (.target.string,
  223.         sformat ("%1/yast2-run-%2.desktop", dir, exec),
  224.         content);
  225. }
  226.  
  227. /* EOF */
  228. }
  229.