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 / Mouse.ycp < prev    next >
Text File  |  2006-11-29  |  14KB  |  465 lines

  1. /**************
  2. FILE          : Mouse.ycp
  3. ***************
  4. PROJECT       : YaST2 - Yet another Setup Tool
  5.               :
  6. AUTHOR        : Marcus SchΣfer <ms@suse.de>
  7.               :
  8. BELONGS TO    : YaST2 - GPM mouse setup NOT X11 Mouse !
  9.               :
  10. DESCRIPTION   : YaST module: Provide a simple configuration
  11.               : for textmode mouse configuration (GPM)
  12.               :
  13. STATUS        : Development
  14. **************/
  15. /*! \brief YaST2 - mouse configuration interface (GPM)
  16. *
  17. * File:        Mouse.ycp
  18. * Package:     GPM Configuration
  19. * Summary:     Main Module started if yast2 mouse is called
  20. * Authors:     Marcus Schaefer <ms@suse.de>
  21. */
  22. { // begin
  23. module "Mouse";
  24.  
  25. textdomain "mouse";
  26. //==========================================
  27. // Imports...
  28. //------------------------------------------
  29. import "Arch";
  30. import "Misc";
  31. import "Mode";
  32. import "Stage";
  33. import "Linuxrc";
  34. import "ModuleLoading";
  35.  
  36. //==========================================
  37. // Globals accessed via Mouse::<variable>
  38. //------------------------------------------
  39. global string  mouse      = "none";    // current mouse
  40. global string  mset          = "";        // x11 config values
  41. global string  gpm          = "";        // gpm config values
  42. global string  device      = "";        // mouse device
  43. global boolean emul3      = false;    // emulate 3 buttons ?
  44. global integer wheels      = 0;        // number of wheels
  45. global integer buttons      = 0;        // number of buttons
  46. global string  name       = "";     // user readable name
  47. global string  unique_key = "";        // unique key
  48.  
  49. //==========================================
  50. // Module globals
  51. //------------------------------------------
  52. boolean already_probed = false;        // memorize if already probed
  53. list<map> plist = [];               // list got from last probing
  54. map<string, list> mice = $[];
  55. boolean first_proposal = true;
  56.  
  57. //==========================================
  58. // Set...
  59. //------------------------------------------
  60. global define void Set ( string mouse_id );
  61.  
  62. //==========================================
  63. // Restore...
  64. //------------------------------------------
  65. global define boolean Restore() ``{
  66.     // ...
  67.     // Restore the the data from sysconfig.
  68.     // ---
  69.     mouse  = Misc::SysconfigRead(.sysconfig.mouse.YAST_MOUSE, mouse );
  70.     device = Misc::SysconfigRead(.sysconfig.mouse.MOUSEDEVICE, device );
  71.     gpm    = Misc::SysconfigRead(.sysconfig.mouse.MOUSETYPE, "" );
  72.     if( gpm=="" ) {
  73.         // Try to read old variable for compatibility on update of old system
  74.         gpm = Misc::SysconfigRead(.sysconfig.mouse.GPM_PROTOCOL, "" );
  75.     }
  76.     name   = Misc::SysconfigRead(.sysconfig.mouse.FULLNAME, name );
  77.     emul3  = ( Misc::SysconfigRead(
  78.             .sysconfig.mouse.XEMU3, (emul3 ? "yes" : "no")
  79.     ) == "yes");
  80.     mset   = Misc::SysconfigRead(.sysconfig.mouse.XMOUSETYPE, mset );
  81.     buttons = tointeger( Misc::SysconfigRead(
  82.         .sysconfig.mouse.BUTTONS, sformat("%1", buttons)
  83.     ));
  84.     wheels = tointeger( Misc::SysconfigRead(
  85.         .sysconfig.mouse.WHEELS, sformat("%1", wheels)
  86.     ));
  87.     y2milestone("Restored data (sysconfig) for mouse: <%1>", mouse );
  88.     return true;
  89. }
  90.  
  91. //==========================================
  92. // Functions...
  93. //------------------------------------------
  94. global define void Mouse() ``{
  95.     // ...
  96.     // The module constructor.
  97.     // Sets the proprietary module data defined globally for public access.
  98.     // This is done only once (and automatically) when the module is
  99.     // loaded for the first time.
  100.     // ---
  101.     y2milestone("Stage::initial %1 Mode::config %2 Mode::rep %3 Mode::cont %4",
  102.          Stage::initial(), Mode::config(), Stage::reprobe(), Stage::cont()
  103.     );
  104.     if( Stage::initial() || Mode::config() ) {
  105.         return;
  106.     }
  107.     // ...
  108.     // Running system: Restore formerly stored state
  109.     // from sysconfig.
  110.     // ---
  111.     Restore();
  112.     if( size(mouse)>0 && Stage::cont() ) {
  113.         Set( mouse );
  114.     }
  115. }
  116.  
  117. //==========================================
  118. // do_really_probe...
  119. //------------------------------------------
  120. define list<map> do_really_probe( boolean manual ) ``{
  121.     // ...
  122.     // Do a hardware probing of the attached mouse. Depending on the
  123.     // parameter "manual" this is done by really probing the mouse
  124.     // hardware or by just reading the libhd database.
  125.     // ---
  126.     y2milestone("Probing for mouse hardware...");
  127.     list<map> mouseprobelist = [];
  128.     if( manual ) {
  129.         // libhd data lookup...
  130.         mouseprobelist = (list<map>)SCR::Read(.probe.mouse.manual);
  131.         y2milestone( "Probed manual (no HW interception): <%1>",
  132.             mouseprobelist
  133.         );
  134.         if ( mouseprobelist == nil ) {
  135.             mouseprobelist = [];
  136.         }
  137.         if ( mouseprobelist == [] ) {
  138.             // ...
  139.             // Data lookup not successful ==> Trying a real
  140.             // hardware probing as fallback
  141.             // ---
  142.             y2warning("Manual probing failed ==> Now trying a real HW Probing");
  143.             return( do_really_probe( false ));
  144.         }
  145.     } else {
  146.         // real hardware interception...
  147.         mouseprobelist = (list<map>)SCR::Read(.probe.mouse);
  148.         y2milestone("Really probed with HW interception: <%1>", mouseprobelist);
  149.         if ( mouseprobelist == nil ) {
  150.             mouseprobelist = [];
  151.         }
  152.         if( mouseprobelist != [] ) {
  153.             // ...
  154.             // Probing was successful ==>  Now probing has taken place
  155.             // ---
  156.             already_probed = true;
  157.         }
  158.     }
  159.     if( size( mouseprobelist ) > 0 ) {
  160.         // ...
  161.         // found a mouse -> get value from bus, select first mouse only
  162.         //
  163.         map firstmouse = $[];
  164.         integer idx=0;
  165.         while( size(firstmouse)==0 && idx<size(mouseprobelist) ) {
  166.             map conf = (map)SCR::Read(
  167.                 .probe.status, mouseprobelist[idx,"unique_key"]:""
  168.             );
  169.             y2milestone( "key %1 conf %2",
  170.             mouseprobelist[idx,"unique_key"]:"", conf );
  171.             if( conf["available"]:`no == `yes ) {
  172.                 firstmouse = mouseprobelist[idx]:$[];
  173.             }
  174.             idx = idx + 1;
  175.         }
  176.         device  = firstmouse["dev_name"]:"";
  177.         unique_key = firstmouse["unique_key"]:"";
  178.         string bus = firstmouse["bus"]:"";
  179.         map mprotocol = firstmouse["mouse",0]:$[];
  180.         y2milestone( "mprotocol: <%1>", mprotocol );
  181.  
  182.         buttons = mprotocol["buttons"]:0;
  183.         wheels  = mprotocol["wheels"]:0;
  184.         gpm        = mprotocol["gpm"]:"";
  185.         mset    = mprotocol["xf86"]:"";
  186.         emul3   = mprotocol["emul3"]:(buttons<3);
  187.         // ...
  188.         // search mouse in raw database (file access)
  189.         // ---
  190.         mice = (map<string,list>)eval(SCR::Read (
  191.             .target.yast2, "mouse_raw.ycp")
  192.         );
  193.         list<list> tl = maplist( string mouse_id, list mouse_data, mice, ``{
  194.             mouse_data[1,"id"] = mouse_id;
  195.             return(mouse_data);
  196.         });
  197.         tl = filter( list mouse_data, tl, ``(
  198.             mouse_data[1,"gpm"]:"" == gpm &&
  199.             mouse_data[1,"device"]:"" == device
  200.         ));
  201.         y2milestone( "gpm %1 device %2 bus %3", gpm, device, bus );
  202.         y2milestone( "tl = %1", tl );
  203.         if ( size(tl)>1 ) {
  204.         if ( find( list md, tl, ``(md[1,"bus"]:"" == bus)) != nil ) {
  205.             tl = filter( list md, tl, ``(md[1,"bus"]:"" == bus));
  206.             y2milestone( "tl = %1", tl );
  207.         }
  208.         }
  209.         mouse = tl[0,1,"id"]:"none";
  210.         y2milestone( "found mouse %1", mouse );
  211.     }
  212.     if ( mouse == "none" ) {
  213.         y2warning("No mouse found, probed '%1'", mouseprobelist);
  214.     }
  215.     y2milestone ("Mouse::Probe %1", mouse);
  216.     y2milestone ("unique_key %1", unique_key );
  217.     return mouseprobelist;
  218. }
  219.  
  220. //==========================================
  221. // Probe...
  222. //------------------------------------------
  223. global define string Probe() ``{
  224.     // ...
  225.     // Probe for mouse, return mouse_id for use with Set.
  226.     // This is a "real" probe only under certain circunstances...
  227.     // ---
  228.     mouse = "none";
  229.     // ...
  230.     // Don't expect a mouse with serial console.
  231.     //
  232.     if( Linuxrc::serial_console() || Arch::s390 () ) {
  233.         return mouse;
  234.     }
  235.     // ...
  236.     // During installation actually do probe only if called the
  237.     // first time. Afterwards only read the libhd data base.
  238.     // Probing in the running system (under X11) currently doesn't
  239.     // work.
  240.     // ---
  241.     if( Stage::initial() ) {
  242.         if( already_probed ) {
  243.             // already probed
  244.             y2milestone("Initial: manual probing");
  245.             plist = do_really_probe( true );
  246.         } else {
  247.             // not yet probed
  248.             y2milestone("Initial: real HW-probing");
  249.             plist = do_really_probe( false );
  250.         }
  251.     } else if( Stage::reprobe() ) {
  252.         // reprobe for mouse hardware
  253.         y2milestone("Reprobe: real HW-probing");
  254.         plist = do_really_probe ( false );
  255.     } else {
  256.         // ...
  257.         // When called from within the running system we can safely read
  258.         // the libhd database to avoid erroneous HW-probing under Y11.
  259.         // ---
  260.         y2milestone("Running system: manual probing");
  261.         plist = do_really_probe( true );
  262.     }
  263.     y2milestone( "plist %1", plist );
  264.     return mouse;
  265. }
  266.  
  267. //==========================================
  268. // Set...
  269. //------------------------------------------
  270. global define void Set( string mouse_id ) ``{
  271.     // ...
  272.     // Set system to selected mouse.
  273.     // Load modules, set global variables, call xmset.
  274.     // ---
  275.     y2milestone ("Mouse::Set (%1)", mouse_id);
  276.     if (
  277.         ((mouse_id == "19_usb")   ||
  278.          (mouse_id == "23_exps2") ||
  279.          (mouse_id == "21_imps2")
  280.         ) && ! Mode::config()
  281.     ) {
  282.         if (Mode::test()) {
  283.             y2milestone ("Testmode - not loading modules");
  284.         } else {
  285.             y2milestone ("Hopefully all USB modules are loaded via hotplug");
  286.             // ...
  287.         }
  288.     }
  289.     // ...
  290.     // Get mouse data base for possible retranslation.
  291.     // ---
  292.     mice = (map<string, list>)eval(SCR::Read (
  293.         .target.yast2, ["mouse_raw.ycp", $[]]
  294.     ));
  295.     locale translate = mice[mouse_id, 0]:mouse_id;
  296.     name = (string) eval (translate);
  297.     y2milestone ("Mouse '%1', name '%2'", mouse_id, name);
  298.     // ...
  299.     // Overwrite perhaps probed data only if the
  300.     // mouse could be found in the DB.
  301.     //
  302.     if( name != "" ) {
  303.         map mouse_data = mice[mouse_id, 1]:$[];
  304.         device    = mouse_data["device"]:"";
  305.         gpm    = mouse_data["gpm"]:"";
  306.         mset    = mouse_data["mset"]:"";
  307.         emul3    = mouse_data["emul3"]:false;
  308.         wheels    = mouse_data["wheels"]:0;
  309.     }
  310.     mouse = mouse_id;
  311.     return;
  312. }
  313.  
  314. //==========================================
  315. // MakeProposal...
  316. //------------------------------------------
  317. global define string MakeProposal(
  318.     boolean force_reset, boolean language_changed)
  319. ``{
  320.     // ...
  321.     // Return proposal string and set system mouse.
  322.     // ---
  323.     y2milestone("MakeProposal force_reset: %1 language_changed: %2",
  324.         force_reset, language_changed
  325.     );
  326.     string n = "";
  327.     if( size(mice)==0 || first_proposal || language_changed ) {
  328.         mice = (map<string, list>)eval(SCR::Read(
  329.             .target.yast2, ["mouse_raw.ycp", $[]]
  330.         ));
  331.     }
  332.     first_proposal = false;
  333.  
  334.     if( force_reset ) {
  335.         string mouse_id = Probe();
  336.         if (mouse_id == "none") {
  337.             Mouse::mouse = "none";
  338.         }
  339.         Set( Mouse::mouse );
  340.     }
  341.     n = mice[mouse, 0]:mouse;
  342.     y2milestone("MakeProposal ret: %1", n );
  343.     return n;
  344. }
  345.  
  346. //==========================================
  347. // Found...
  348. //------------------------------------------
  349. global define boolean Found () ``{
  350.     // ...
  351.     // Report if a mouse was alread found.
  352.     // ---
  353.     return ( mouse != "none" );
  354. }
  355.  
  356. //==========================================
  357. // Selection...
  358. //------------------------------------------
  359. global define map<string, string> Selection() ``{
  360.     // ...
  361.     // Return a map of ids and names to build up a selection list
  362.     // for the user. The key is used later in the Set function
  363.     // to select this mouse. The name is a translated string.
  364.     // ---
  365.     // try translated mouse.ycp first, if this doesnt exist
  366.     // use the raw (untranslated) version
  367.     // ---
  368.     locale translate = "";
  369.     string mouse_name = "";
  370.     mice = (map<string, list>)eval(SCR::Read (
  371.         .target.yast2, ["mouse_raw.ycp", $[]]
  372.     ));
  373.     map<string, string> selection =  mapmap(
  374.         string mouse_code, list mouse_value, mice, ``{
  375.         translate = mouse_value[0]:"";
  376.         mouse_name = (string)eval(translate);
  377.         return $[mouse_code: mouse_name];
  378.     });
  379.     if (Mode::config()) {
  380.         // save translated label text
  381.         selection["probe"] = _("Probe");
  382.     }
  383.     return selection;
  384. }
  385.  
  386. //==========================================
  387. // Save...
  388. //------------------------------------------
  389. global define void Save() ``{
  390.     // ...
  391.     // Save state to target.
  392.     // ---
  393.     if( Mode::update() ) {
  394.         return;
  395.     }
  396.     y2milestone("device %1 mouse %2 reprobe:%3",
  397.         device, mouse, Stage::reprobe()
  398.     );
  399.     if((device != "") || (mouse=="none") || (Stage::reprobe())) {
  400.         // if we have a mouse device, set gpm_param
  401.         SCR::Write( .sysconfig.mouse.FULLNAME, name);
  402.         SCR::Write( .sysconfig.mouse.FULLNAME.comment,
  403.             "\n# The full name of the attached mouse.\n#\n"
  404.         );
  405.         SCR::Write( .sysconfig.mouse.YAST_MOUSE, mouse);
  406.         SCR::Write( .sysconfig.mouse.YAST_MOUSE.comment,
  407.             "\n# The YaST-internal identifier of the attached mouse.\n#\n"
  408.         );
  409.         SCR::Write( .sysconfig.mouse.MOUSEDEVICE, device);
  410.         // Comment written by third party
  411.         SCR::Write( .sysconfig.mouse.XMOUSEDEVICE,device);
  412.         SCR::Write( .sysconfig.mouse.XMOUSEDEVICE.comment,
  413.             "\n# Mouse device used for the X11 system.\n#\n"
  414.         );
  415.         SCR::Write( .sysconfig.mouse.BUTTONS, sformat( "%1", buttons ) );
  416.         SCR::Write( .sysconfig.mouse.BUTTONS.comment,
  417.             "\n# The number of buttons of the attached mouse.\n#\n"
  418.         );
  419.         SCR::Write( .sysconfig.mouse.WHEELS, sformat( "%1", wheels ) );
  420.         SCR::Write( .sysconfig.mouse.WHEELS.comment,
  421.             "\n# The number of wheels of the attached mouse.\n#\n"
  422.         );
  423.         if (mset != "") {
  424.             SCR::Write( .sysconfig.mouse.XMOUSETYPE, mset);
  425.             SCR::Write( .sysconfig.mouse.XMOUSETYPE.comment,
  426.                 "\n# The mouse type under X11, e.g. \"ps/2\"\n#\n"
  427.             );
  428.             SCR::Write( .sysconfig.mouse.MOUSETYPE, gpm);
  429.             SCR::Write( .sysconfig.mouse.MOUSETYPE.comment,
  430.                 "\n# The GPM mouse type, e.g. \"ps2\"\n#\n"
  431.             );
  432.         }
  433.         SCR::Write(.sysconfig.mouse, nil); // flush
  434.         y2milestone("Saved sysconfig data for mouse: <%1>", name );
  435.     }
  436.     // ...
  437.     // Only if the mouse has been probed in this run the unique_key
  438.     // is not empty. Only in this case mark the device as "configured".
  439.     // In any other case the device should already be configured and
  440.     // the marking can't be done because the unique_key is missing.
  441.     // ==> Only mark after probing!
  442.     //
  443.     y2milestone( "configured mouse key %1", unique_key );
  444.     if( unique_key != "" ) {
  445.         SCR::Write( .probe.status.configured, unique_key, `yes );
  446.         y2milestone("Marked mouse <%1> as configured", unique_key );
  447.         if( !Linuxrc::serial_console() ) {
  448.             SCR::Write( .probe.status.needed, unique_key, `yes );
  449.             y2milestone("Marked mouse <%1> as needed", unique_key );
  450.         }
  451.     }
  452.     if( Stage::initial() || Stage::reprobe() ) {
  453.         foreach( map e, plist, ``{
  454.             y2milestone( "unique_key %2 entry %1", e, unique_key );
  455.             if( e["unique_key"]:"" != unique_key ) {
  456.                 y2milestone("set needed to no for key %1", e["unique_key"]:"" );
  457.                 SCR::Write( .probe.status.needed, e["unique_key"]:"", `no );
  458.             }
  459.         });
  460.     }
  461.     y2milestone("Saved data for mouse: <%1>", name );
  462.     return;
  463. }
  464. } // end
  465.