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 / include / x11 / autoDialog.ycp next >
Text File  |  2006-11-29  |  23KB  |  861 lines

  1. /**
  2.  * File:    include/autoinstall/x11_dialogs.ycp
  3.  * Summary:    Handle X11 dialogs
  4.  * Authors:    Anas Nashif <nashif@suse.de>
  5.  *
  6.  * $Id: autoDialog.ycp 33133 2006-09-26 14:19:37Z ms $
  7.  */
  8. {
  9.     textdomain "x11";
  10.     include "wizard/sequencer.ycp";
  11.     import "Label";
  12.     import "AutoinstX11";
  13.     import "Wizard";
  14.     import "Popup";
  15.  
  16.     /**
  17.      * Build main Dialog
  18.      * @return term
  19.      */
  20.     define term updateContents()
  21.     {
  22.     map x11 = AutoinstX11::x11;
  23.     list resolutions        = [];
  24.         list<string> resolutions_list = [
  25.                     "640x480 (VGA)",
  26.                     "768x576 (PAL)",
  27.                     "800x600 (SVGA)",
  28.                     "1024x768 (XGA)",
  29.                     "1152x864 (XGA)",
  30.                     "1280x768 (WXGA)",
  31.                     "1280x800 (WXGA)",
  32.                     "1280x960 (QVGA)",
  33.                     "1280x1024 (SXGA)",
  34.                     "1440x900 (WXGA)",
  35.                     "1400x1050 (SXGA+)",
  36.                     "1600x1000",
  37.                     "1600x1024 (WSXGA)",
  38.                     "1600x1200 (UXGA)",
  39.                     "1680x1050 (WSXGA+)",
  40.                     "1900x1200",
  41.                     "1920x1200 (WUXGA)",
  42.                     "2048x1536 (QXGA)",
  43.                     "2560x2048 (QSXGA)",
  44.                     "2800x2100 (QSXGA+)",
  45.                     "3200x2400 (QUXGA)"
  46.                 ];
  47.     list<map> depths_list = [
  48.                 $[
  49.                   "desc"    :_("8 Bit / 256 Colors"),
  50.                   "depth"    : 8
  51.                 ],
  52.                   $[
  53.                 "desc"    :_("15 Bit / 32 K Colors (PPC)"),
  54.                 "depth"    : 15
  55.                   ],
  56.                   $[
  57.                 "desc"    :_("16 Bit / 64 K Colors"),
  58.                 "depth"    : 16
  59.                   ],
  60.                   $[
  61.                 "desc"    :_("24 Bit / 16 M Colors"),
  62.                 "depth"    : 24
  63.                   ],
  64.                   $[
  65.                 "desc"    :_("32 Bit / 16 M Colors"),
  66.                 "depth"    : 32
  67.                   ]
  68.     ];
  69.  
  70.  
  71.     foreach(string res, resolutions_list , ``{
  72.         resolutions=add(resolutions, `item( `id(res), res, (res == x11["resolution"]:"1024x768")));
  73.     });
  74.     list color_depths       = [];
  75.  
  76.     foreach(map d, depths_list , ``{
  77.         color_depths=add(color_depths,
  78.                 `item( `id(d["depth"]:16), d["desc"]:_("16 Bit / 64 K Colors") ,
  79.                     ( d["depth"]:16 == x11["color_depth"]:16)));
  80.     });
  81.         list displaymanager =
  82.             [
  83.             `item(`id    ("kdm"), _("KDM"),
  84.                     (x11["display_manager"]:"kdm" == "kdm")),
  85.             `item(`id("gdm"), _("GDM"), (
  86.                         x11["display_manager"]:"kdm" == "gdm")),
  87.             `item(`id("xdm"), _("XDM"), (
  88.                         x11["display_manager"]:"kdm" == "xdm"))
  89.             ];
  90.  
  91.         list windowmanager =
  92.             [
  93.             `item(`id    ("kde"), _("KDE"),
  94.                     (x11["window_manager"]:"kde" == "kde")),
  95.             `item(`id("gnome"), _("GNOME"), (
  96.                         x11["window_manager"]:"kde" == "gnome")),
  97.             `item(`id("twm"), _("TWM"), (
  98.                         x11["window_manager"]:"kde" == "twm")),
  99.             `item(`id("fvwm"), _("FVWM"), (
  100.                         x11["window_manager"]:"kde" == "fvwm"))
  101.             ];
  102.     term contents =
  103.         `Top(
  104.          `VBox(
  105.                `Frame( _("&General Options:"),
  106.                    `VBox(
  107.                      `Left(
  108.                        `CheckBox(
  109.                              `id(`enable_3d),
  110.                              _("&Enable 3D Support if possible"),
  111.                              x11["enable_3d"]:false)
  112.                        ),
  113.                      `VSpacing(1),
  114.                      `HBox(
  115.                        `HWeight(50,
  116.                             `ComboBox(`id(`depth),
  117.                                   _("Co&lor Depth"),
  118.                                   color_depths
  119.                                   )),
  120.                        `HSpacing(1),
  121.                        `HWeight(50,`ComboBox(`id(`resolution), _("Resol&ution"),
  122.                                  resolutions
  123.                                  )
  124.                             )
  125.                        )
  126.                      )
  127.                    ),
  128.                `Frame( _("Desktop:"),
  129.                    `VBox(
  130.                      `HBox(
  131.                        `HWeight(30, `ComboBox(`id(`dm), _("&Display Manager"),
  132.                                                    displaymanager
  133.                                   )),
  134.                        `HWeight(70,`Empty())
  135.                        ),
  136.                      `HBox(
  137.                        `HWeight(30, `ComboBox(`id(`wm),
  138.                                                    _("&Window Manager"),
  139.                                                    windowmanager
  140.                                   )),
  141.                        `HWeight(70,`Empty())
  142.                        )
  143.                      )
  144.                    )
  145.                )
  146.          );
  147.     return contents;
  148.     }
  149.  
  150.  
  151.     /**
  152.      * Main X11 Options
  153.      * @return symbol
  154.      */
  155.     define symbol x11Options()
  156.     {
  157.  
  158.  
  159.     string caption = _("X11 Configuration");
  160.  
  161.  
  162.  
  163.         // x11 help 1/3
  164.     string help = _("<p>Use this dialog to configure the X11 system and the
  165. display attached to the computer to install.</P>
  166. ");
  167.         // x11 help 2/3
  168.     help = help + _("<P>Additionally, configure if the X11 system should
  169. be started at boot time and what display manager should be used.</p>
  170. ");
  171.  
  172.     Wizard::SetContents(caption,
  173.                 updateContents(), help, true, true);
  174.  
  175.  
  176.     any ret = nil;
  177.     repeat {
  178.         ret = UI::UserInput();
  179.  
  180.         if ( ret ==`next  )
  181.         {
  182.         integer depth    = (integer)UI::QueryWidget(`id(`depth), `Value);
  183.             AutoinstX11::x11["color_depth"] =  depth ;
  184.  
  185.         string resol    = (string)UI::QueryWidget(`id(`resolution), `Value);
  186.             AutoinstX11::x11["resolution"] =  resol;
  187.  
  188.         string default_dm = (string)UI::QueryWidget(`id(`dm), `Value);
  189.                 AutoinstX11::x11["display_manager"] =  default_dm;
  190.  
  191.         string default_wm = (string)UI::QueryWidget(`id(`wm), `Value);
  192.                 AutoinstX11::x11["window_manager"] =  default_wm;
  193.  
  194.         boolean enable_3d = (boolean)UI::QueryWidget(`id(`enable_3d), `Value);
  195.             AutoinstX11::x11["enable_3d"] = enable_3d;
  196.         }
  197.  
  198.  
  199.     } until (  ret ==`next || ret ==`back || ret == `abort );
  200.  
  201.  
  202.     return (symbol)ret;
  203.     }
  204.  
  205.  
  206.  
  207.     /*
  208.      * Create dialog for monitor selection
  209.      * @param list of vendors and models (each a list of strings)
  210.      * @return term dialog as term to be put into Wizard::SetContents()
  211.      */
  212.     define term  X11VideoDataDialog( list vendors, list models )
  213.     {
  214.  
  215.     term x11_video_data_dialog =
  216.         `VBox(
  217.           `HBox(
  218.             `ReplacePoint( `id(`replace_point_vendors),
  219.                        `SelectionBox( `id(`vendors), `opt(`notify),
  220.                               // Headline for monitor vendor selection box
  221.                               _("&Vendor"),
  222.                               vendors
  223.                               )
  224.                        ),
  225.             `ReplacePoint( `id(`replace_point_models),
  226.                        `SelectionBox( `id(`models), `opt(`notify),
  227.                               // Headline for monitor model selection box
  228.                               _("M&odel"),
  229.                               models
  230.                               )
  231.                        )
  232.             ),
  233.           `VSpacing(0.2),
  234.           `VSquash(
  235.                `HBox(
  236.                  `HWeight( 1,
  237.                        `Frame(
  238.                           // Frame title for horizontal frequency input fields
  239.                           _("Horizontal frequency"),
  240.                           `HBox(
  241.                             `HWeight( 35, `TextEntry( `id(`min_hsync ), `opt(`shrinkable), _("&min") ) ),
  242.  
  243.                             // Separator between min and max frequency fields
  244.                             `HWeight( 10, `Bottom(`Label( _("-") ) ) ),
  245.                             `HWeight( 35, `TextEntry( `id(`max_hsync ), `opt(`shrinkable), _("m&ax") ) ),
  246.  
  247.                             // Unit for horizontal frequency
  248.                             `HWeight( 17, `Bottom(`Label( _("kHz") ) ) )
  249.                             )
  250.                           )
  251.                        ),
  252.                  `HSpacing(0.8),
  253.                  `HWeight( 1,
  254.                        `Frame(
  255.                           // Frame title for vertical frequency input fields
  256.                           _("Vertical frequency"),
  257.                           `HBox(
  258.                             `HWeight( 35, `TextEntry( `id(`min_vsync ), `opt(`shrinkable), _("m&in") ) ),
  259.  
  260.                             // Separator between min and max frequency fields
  261.                             `HWeight( 10, `Bottom(`Label( _("-") ) ) ),
  262.                             `HWeight( 35, `TextEntry( `id(`max_vsync ), `opt(`shrinkable), _("ma&x") ) ),
  263.  
  264.                             // Unit for horizontal frequency
  265.                             `HWeight( 17, `Bottom( `Label( _("Hz") ) ) )
  266.                             )
  267.                           )
  268.                        )
  269.                  )
  270.                )
  271.           );
  272.  
  273.     return x11_video_data_dialog;
  274.     };
  275.  
  276.  
  277.     /**
  278.      * Get the `Value property of an arbitrary widget
  279.      * @param widget_id    ID of the widget, e.g. `resolution
  280.      * @return the widget's `Value property
  281.      */
  282.     define any GetValue( symbol widget_id )
  283.         {
  284.     return UI::QueryWidget(`id( widget_id ), `Value );
  285.     };
  286.  
  287.  
  288.     /**
  289.      * Set the `Value property of an arbitrary widget
  290.      * @param widget_id    ID of the widget, e.g. `resolution
  291.      * @param new_value    the new value
  292.      */
  293.     define void SetValue( symbol    widget_id,
  294.                  any    new_value    )
  295.     {
  296.     UI::ChangeWidget(`id( widget_id ), `Value, new_value );
  297.     return;
  298.     };
  299.  
  300.  
  301.     /**
  302.      * Get help text for video data dialog
  303.      * @return string multi line help text in RichText (HTML like) format
  304.      */
  305.     define string X11VideoDataDialogHelpText()
  306.     {
  307.     /*
  308.      * Help text (HTML like) for X11 video data dialog
  309.      */
  310.  
  311.     // help part 1 of 8
  312.     string helptext = _("<p>
  313. Please select your monitor's <b>vendor</b> and <b>model</b>.
  314. </p>
  315. ");
  316.  
  317.     // help part 2 of 8
  318.     helptext = helptext + _("<p>
  319. If your monitor is not listed here, use <b>VESA</b>.
  320. Most monitors comply with this standard.
  321. </p>
  322. ");
  323.  
  324.  
  325.     // help part 5 of 8
  326.     helptext = helptext + _("<p>
  327. Modify the monitor's frequencies in the respective input
  328. fields below the selection boxes.
  329. Refer to your monitor manual for your monitor's maximum
  330. frequencies. <b><i>Do not exceed</i></b> the values specified there.
  331. Otherwise, there is a serious risk of <b><i>damaging your monitor</i></b>.
  332. </p>
  333. ");
  334.  
  335.     // help part 6 of 8
  336.     helptext = helptext + _("<p>
  337. The <b>horizontal frequency</b> (in kHz) specifies how many times
  338. per second the monitor can write a horizontal scan line. This is a
  339. hard limit of the monitor, independent of the screen resolution.
  340. </p>
  341. ");
  342.  
  343.     // help part 7 of 8
  344.     helptext = helptext + _("<p>
  345. The <b>vertical frequency</b> (in Hz) specifies how many times per
  346. second the image on the screen is refreshed. This value depends on the
  347. screen resolution and the monitor's maximum horizontal frequency.
  348. </p>
  349. ");
  350.  
  351.     // help part 8 of 8
  352.     helptext = helptext + _("<p>
  353. If you experience a constant high frequency beep from your monitor,
  354. you might wish to use slightly lower frequency values than the maximum
  355. specified in your monitor's manual. This usually helps a lot to reduce
  356. the noise.
  357. </p>
  358. ");
  359.  
  360.     return helptext;
  361.  
  362.     };
  363.  
  364.  
  365.     // get the sync values --> string
  366.     //
  367.     define string GetMinHsync()    ``{ return (string)GetValue(`min_hsync ); };
  368.     define string GetMaxHsync()    ``{ return (string)GetValue(`max_hsync ); };
  369.     define string GetMinVsync()    ``{ return (string)GetValue(`min_vsync ); };
  370.     define string GetMaxVsync()    ``{ return (string)GetValue(`max_vsync ); };
  371.  
  372.     // set the sync values (every single value)
  373.     //
  374.     define void SetMinHsync( string new_value ) ``{ SetValue(`min_hsync, new_value ); };
  375.     define void SetMaxHsync( string new_value ) ``{ SetValue(`max_hsync, new_value ); };
  376.     define void SetMinVsync( string new_value ) ``{ SetValue(`min_vsync, new_value ); };
  377.     define void SetMaxVsync( string new_value ) ``{ SetValue(`max_vsync, new_value ); };
  378.  
  379.     // set the focus to the input fields
  380.     //
  381.     define void SetFocusMinHsync() ``{ UI::SetFocus(`id(`min_hsync)); }
  382.     define void SetFocusMaxHsync() ``{ UI::SetFocus(`id(`max_hsync)); }
  383.     define void SetFocusMinVsync() ``{ UI::SetFocus(`id(`min_vsync)); }
  384.     define void SetFocusMaxVsync() ``{ UI::SetFocus(`id(`max_vsync)); }
  385.  
  386.     // get the current vendor and model --> string
  387.     //
  388.     define string GetCurrentVendor() ``{ return (string)UI::QueryWidget(`id(`vendors), `CurrentItem); }
  389.     define string GetCurrentModel () ``{ return (string)UI::QueryWidget(`id(`models),  `CurrentItem); }
  390.  
  391.     // set the current vendor and model
  392.     //
  393.     define void SetCurrentVendor( string new_item ) ``{ UI::ChangeWidget(`id(`vendors), `CurrentItem, new_item ); }
  394.     define void SetCurrentModel ( string new_item ) ``{ UI::ChangeWidget(`id(`models),  `CurrentItem, new_item ); }
  395.  
  396.     // replace the vendor list
  397.     //
  398.     define void ReplaceVendors( list new_value ) ``{
  399.     UI::ReplaceWidget( `id( `replace_point_vendors),
  400.                `SelectionBox( `id(`vendors), `opt(`notify),
  401.                       // Headline for monitor vendor selection box
  402.                       _("Vendor"),
  403.                       new_value
  404.                       )
  405.                );
  406.     return;
  407.     }
  408.  
  409.     /**
  410.      * Replace the model list
  411.      * @return void
  412.      */
  413.     define  void ReplaceModels( list new_value )
  414.     {
  415.  
  416.     UI::ReplaceWidget( `id( `replace_point_models),
  417.                `SelectionBox( `id( `models),
  418.                       `opt( `notify ),
  419.                       // Headline for monitor model selection box
  420.                       _("Model"),
  421.                       new_value
  422.                       )
  423.                );
  424.     return;
  425.     }
  426.  
  427.     // Handle `back button
  428.     //
  429.     define void SetBackState( boolean new_value )
  430.     {
  431.     if ( new_value )
  432.         Wizard::EnableBackButton();
  433.     else
  434.         Wizard::DisableBackButton();
  435.     }
  436.  
  437.     // CAUTION: This no longer works with the new wizard - no way to query that value!
  438.     define boolean GetBackState()
  439.     {
  440.         return (boolean)UI::QueryWidget(`id(`back), `Enabled );
  441.     }
  442.  
  443.  
  444.  
  445.  
  446.  
  447.     /**
  448.      * round up a value given as integer or float to the next integer (ceiling).
  449.      */
  450.     define integer ceiling( any value )
  451.     {
  452.     if ( is( value, integer ) ) return (integer) value;    // already integer
  453.  
  454.     if ( is( value, float ) )                // is float
  455.     {
  456.         if ( tofloat( tointeger( value ) ) == value )    // is whole-numbered
  457.         return( tointeger( value ) );            // return as is
  458.         else                        // not whole-numbered
  459.         return( tointeger( value ) + 1 );        // round up
  460.     }
  461.     else
  462.     {
  463.         y2error( "ceiling(): parameter error: <%1> (only integer and float allowed)", value );
  464.         return( nil );
  465.     }
  466.     }
  467.  
  468.  
  469.     /**
  470.      * Round down a value given as integer or float to the prev. integer (floor).
  471.      **/
  472.     define integer floor( any value )
  473.     {
  474.     if ( is( value, integer ) ) return (integer) value;    // already integer
  475.  
  476.     if ( is( value, float ) )                // is float
  477.     {
  478.         return( tointeger( value ) );            // round down
  479.     }
  480.     else
  481.     {
  482.         y2error( "floor(): parameter error: <%1> (only integer and float allowed)", value );
  483.         return( nil );
  484.     }
  485.     }
  486.     /*
  487.      * Check if the number is in the format [+]<number>[kKmMgGtT]
  488.      * @return boolean true or false
  489.      */
  490.     define boolean IsNumber( string input )
  491.     {
  492.     integer n = 0;
  493.     while ( n < size( input ) )
  494.     {
  495.             string erg = filterchars( substring( input, n,1 ), "0123456789." );
  496.  
  497.             if ( size( erg ) != 1 )
  498.             {
  499.         y2milestone("%1", n);
  500.         return( false );
  501.             }
  502.  
  503.             n = n + 1;
  504.     }
  505.  
  506.     return( true );
  507.     };
  508.  
  509.  
  510.     /**
  511.      * Get a list of all monitor models for a specified vendor from the monitor database.
  512.      * @return list
  513.      */
  514.     define list get_models_for_vendor( string vendor, list<map> monitor_db )
  515.     {
  516.     list<map> vendor_monitors = filter( map monitor, monitor_db, ``(
  517.                     monitor["vendor"]:"" == vendor ));
  518.     return toset( maplist( map monitor, vendor_monitors, ``( monitor["model"]:"")) );
  519.     };
  520.  
  521.     /**
  522.      * Automagically update the frequency values for a specified model.
  523.      */
  524.     define void update_frequency_for_model( string vendor, string model)
  525.     {
  526.     // Get the data record for this monitor
  527.     //
  528.     map monitor = (map)find( map m, AutoinstX11::all_monitors,
  529.                 ``(( m["vendor"]:""  == vendor)
  530.                    && (m["model"]:""  == model)) );
  531.  
  532.  
  533.     // Set all the input fields according to this monitor's data
  534.     // first, assign the value to a float. the monitor data may contain
  535.     // integer values, but tostring expects a float.
  536.  
  537.     float fsyncval = tofloat( monitor["min_hsync"]:0  );
  538.     SetMinHsync (tostring( fsyncval, 1 ));
  539.  
  540.     fsyncval = tofloat( monitor["max_hsync"]:0 );
  541.     SetMaxHsync (tostring( fsyncval, 1 ));
  542.  
  543.     fsyncval = tofloat( monitor["min_vsync"]:0  );
  544.     SetMinVsync (tostring( fsyncval, 1 ));
  545.  
  546.     fsyncval = tofloat( monitor["max_vsync"]:0 );
  547.     SetMaxVsync (tostring( fsyncval, 1 ));
  548.  
  549.  
  550.     return;
  551.     }
  552.  
  553.     /*
  554.      * Automagically update the models list for a specified vendor.
  555.      * Select default first entry if unknown and update its sync values.
  556.      * Honor the special "No X11" entry.
  557.      * It is assumed that the given vendor is known i.e. is a member of the given monitor_db.
  558.      */
  559.     define void change_vendor( string vendor, list<map> monitor_db )
  560.     {
  561.     if ( vendor == "No X11" )
  562.     {
  563.         ReplaceModels( [] );
  564.  
  565.         SetMinHsync( "" );
  566.         SetMaxHsync( "" );
  567.         SetMinVsync( "" );
  568.         SetMaxVsync( "" );
  569.  
  570.         AutoinstX11::current_model = "";
  571.     }
  572.     else
  573.     {
  574.         list models = get_models_for_vendor( vendor, monitor_db );
  575.         ReplaceModels( models );
  576.  
  577.         if ( models != [] )
  578.         {
  579.         if ( ! contains( models, AutoinstX11::current_model ) )
  580.             AutoinstX11::current_model = models[0]:"";
  581.  
  582.         SetCurrentModel( AutoinstX11::current_model );
  583.         update_frequency_for_model( vendor, AutoinstX11::current_model );
  584.         }
  585.         else
  586.         {
  587.         SetMinHsync( "" );
  588.         SetMaxHsync( "" );
  589.         SetMinVsync( "" );
  590.         SetMaxVsync( "" );
  591.  
  592.         AutoinstX11::current_model = "";
  593.         }
  594.     }
  595.     return;
  596.     }
  597.  
  598.     /**
  599.      * Read the monitor db and get vendors and models lists.
  600.      * Optionally extend db with probed monitor.
  601.      */
  602.     define void get_vendors_and_models()
  603.     {
  604.     if (  AutoinstX11::monitor["monitor_vendor"]: ""  == "" )
  605.     {
  606.         // monitor vendor not known
  607.         AutoinstX11::current_vendor = _("unknown vendor");
  608.         AutoinstX11::monitor["monitor_vendor"] = AutoinstX11::current_vendor ;
  609.     }
  610.  
  611.     if (  AutoinstX11::monitor["monitor_device"]:""  == "" )
  612.     {
  613.         // monitor model not known
  614.         AutoinstX11::current_model  = _("unknown model");
  615.         AutoinstX11::monitor["monitor_device"] =  AutoinstX11::current_model;
  616.     }
  617.     }
  618.  
  619.     /**
  620.      * Display current vendor, model and associated values if possible.
  621.      * @return void
  622.      */
  623.     define void display_models_and_values()
  624.     {
  625.     if ( contains( AutoinstX11::vendors, AutoinstX11::current_vendor ) )
  626.     {
  627.         SetCurrentVendor( AutoinstX11::current_vendor );
  628.         change_vendor( AutoinstX11::current_vendor,  AutoinstX11::all_monitors );
  629.     }
  630.     else
  631.     {
  632.         AutoinstX11::current_vendor = (string) AutoinstX11::vendors[0]:"";
  633.         SetCurrentVendor( AutoinstX11::current_vendor );
  634.         change_vendor( AutoinstX11::current_vendor, AutoinstX11::all_monitors );
  635.     }
  636.     return;
  637.     }
  638.  
  639.     // Parse the given string assuming it is a "model" string containing VESA
  640.     // information formatted as e.g. "1024X768@75HZ". The values for width,
  641.     // height, and refresh are extracted and assigned to the X11 user_data struct
  642.     // along with a constant color depth of 8 bit (VESA) or 16 bit (LCD).
  643.     //
  644.     define void store_VESA_LCD( string model, boolean is_VESA )
  645.     {
  646.     integer currentWidth      = 0;
  647.     integer currentHeight     = 0;
  648.     integer currentFrequency  = 0;
  649.  
  650.  
  651.     // First find resolution string within model string.
  652.     // E.g. "PANORAMIC SUPERWIDE 1024X768@75HZ" --> "1024X768@75HZ"
  653.     //
  654.     list<string> res_list = splitstring( model, " " );
  655.  
  656.     if ( size( res_list ) > 0 )
  657.     {
  658.         string resolution = find(string res, res_list, ``( issubstring( res, "@") ));
  659.  
  660.         // 1. "1024X768@75HZ" --> "1024" and "768@75HZ"
  661.         //
  662.         list first = splitstring( resolution, "X");
  663.  
  664.         if ( size( first ) > 0 )
  665.         {
  666.         currentWidth = tointeger( first[0]:"" );
  667.  
  668.         // 2. "768@75HZ" --> "768" and "75HZ"
  669.         //
  670.         list second = splitstring( first[1]: "" , "@" );
  671.  
  672.         if ( size( second ) > 0 )
  673.         {
  674.             currentHeight    = tointeger( second[0]: "" );
  675.             currentFrequency = tointeger( second[1]: "" );
  676.         }
  677.         }
  678.     }
  679.  
  680.     // store the new values into the X11 user_data struct
  681.     //
  682.     AutoinstX11::display = AutoinstX11::display;
  683.     return;
  684.     }
  685.  
  686.  
  687.  
  688.  
  689.     /**
  690.      * Main Monitor Dialog
  691.      * @return symbol
  692.      */
  693.     define symbol monitorDialog()
  694.     {
  695.     AutoinstX11::readMonitorDB();
  696.  
  697.     map display =  AutoinstX11::display;
  698.     integer min_hsync = ceiling( display["min_hsync"]:0 );
  699.     integer max_hsync = floor  ( display["max_hsync"]:0 );
  700.     integer min_vsync = ceiling( display["min_vsync"]:0 );
  701.     integer max_vsync = floor  ( display["max_vsync"]:0 );
  702.  
  703.     get_vendors_and_models();
  704.  
  705.  
  706.     string help_text = X11VideoDataDialogHelpText();
  707.  
  708.     term contents = X11VideoDataDialog( AutoinstX11::vendors, [] );
  709.  
  710.     Wizard::SetContents(
  711.                 _("Configure Monitor"),
  712.                 contents,
  713.                 help_text,
  714.                 true , true);
  715.  
  716.     display_models_and_values();
  717.  
  718.     // Monitor
  719.  
  720.     string min_hsync_string = "";
  721.     string max_hsync_string = "";
  722.     string min_vsync_string = "";
  723.     string max_vsync_string = "";
  724.  
  725.     symbol ret = `none;
  726.     repeat {
  727.         ret = (symbol) UI::UserInput();
  728.  
  729.         if ( ret == `vendors )
  730.         {
  731.         string new_vendor = GetCurrentVendor();
  732.  
  733.         if ( new_vendor != AutoinstX11::current_vendor )
  734.         {
  735.             AutoinstX11::current_vendor = new_vendor;
  736.             change_vendor( AutoinstX11::current_vendor, AutoinstX11::all_monitors );
  737.         }
  738.         }
  739.         else if ( ret == `models )
  740.         {
  741.         string new_model = GetCurrentModel();
  742.  
  743.         if ( new_model != AutoinstX11::current_model )
  744.         {
  745.             AutoinstX11::current_model = new_model;
  746.             update_frequency_for_model( AutoinstX11::current_vendor,
  747.                         AutoinstX11::current_model );
  748.         }
  749.         }
  750.         else if ( ret == `next )
  751.         {
  752.         min_hsync_string = GetMinHsync();
  753.         max_hsync_string = GetMaxHsync();
  754.         min_vsync_string = GetMinVsync();
  755.         max_vsync_string = GetMaxVsync();
  756.  
  757.         // Check the content in the input fields. All input must be valid.
  758.         //
  759.         if ( ! IsNumber( min_hsync_string ) || size( min_hsync_string ) <= 0 )
  760.         {
  761.             // A frequency value is not of type numerical. User must correct this.
  762.             Popup::Message(_("The minimum horizontal frequency is not a numerical value.
  763. Try again.
  764. "));
  765.             SetFocusMinHsync();
  766.             ret = `again;
  767.             continue;
  768.         }
  769.  
  770.         if ( ! IsNumber( max_hsync_string ) || size( max_hsync_string ) <= 0 )
  771.         {
  772.             // A frequency value is not of type numerical. User must correct this.
  773.             Popup::Message(_("Maximum horizontal frequency is not a numerical value.\nPlease try again."));
  774.             SetFocusMaxHsync();
  775.             ret = `again;
  776.             continue;
  777.         }
  778.  
  779.         if ( ! IsNumber( min_vsync_string ) || size( min_vsync_string ) <= 0 )
  780.         {
  781.             // A frequency value is not of type numerical. User must correct this.
  782.             Popup::Message(_("The minimum vertical frequency is not a numerical value.
  783. Try again.
  784. "));
  785.             SetFocusMinVsync();
  786.             ret = `again;
  787.             continue;
  788.         }
  789.  
  790.         if ( ! IsNumber( max_vsync_string ) || size( max_vsync_string ) <= 0 )
  791.         {
  792.             // A frequency value is not of type numerical. User must correct this.
  793.             Popup::Message(_("Maximum vertical frequency is not a numerical value.\nPlease try again."));
  794.             SetFocusMaxVsync();
  795.             ret = `again;
  796.             continue;
  797.         }
  798.  
  799.         min_hsync = ceiling( tofloat( min_hsync_string ) );
  800.         max_hsync = floor  ( tofloat( max_hsync_string ) );
  801.         min_vsync = ceiling( tofloat( min_vsync_string ) );
  802.         max_vsync = floor  ( tofloat( max_vsync_string ) );
  803.  
  804.         AutoinstX11::display["min_hsync"] = min_hsync ;
  805.         AutoinstX11::display["max_hsync"] = max_hsync ;
  806.         AutoinstX11::display["max_vsync"] = max_vsync ;
  807.         AutoinstX11::display["min_vsync"] =  min_vsync ;
  808.  
  809.         if (  AutoinstX11::current_vendor == " VESA" )
  810.         {
  811.             store_VESA_LCD(  AutoinstX11::current_model, true );
  812.  
  813.         }
  814.         else if (  AutoinstX11::current_vendor == " LCD" )
  815.         {
  816.             store_VESA_LCD(  AutoinstX11::current_model, false );
  817.  
  818.         }
  819.         }
  820.     } until ( ret == `next || ret == `back || ret == `abort);
  821.  
  822.     return ret;
  823.     }
  824.  
  825.  
  826.  
  827.     /**
  828.      * Sequencer
  829.      */
  830.     define symbol X11AutoSequence () ``{
  831.  
  832.     map dialogs = $[
  833.             "x11"        :    ``(   x11Options() ),
  834.             "monitor"    :    ``(   monitorDialog() )
  835.  
  836.     ];
  837.  
  838.     map sequence = $[
  839.              "ws_start"    : "x11",
  840.              "x11"    :
  841.              $[
  842.                `abort    : `abort,
  843.                `next    : "monitor"
  844.              ],
  845.              "monitor":
  846.              $[
  847.                `abort    : `abort,
  848.                `next    : `next
  849.              ]
  850.     ];
  851.  
  852.     Wizard::CreateDialog ();
  853.         Wizard::SetDesktopIcon("x11");
  854.     symbol ret  =  WizardSequencer (dialogs, sequence);
  855.     UI::CloseDialog ();
  856.  
  857.     return ret;
  858.     }
  859.  
  860. }
  861.