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 >
Wrap
Text File
|
2006-11-29
|
23KB
|
861 lines
/**
* File: include/autoinstall/x11_dialogs.ycp
* Summary: Handle X11 dialogs
* Authors: Anas Nashif <nashif@suse.de>
*
* $Id: autoDialog.ycp 33133 2006-09-26 14:19:37Z ms $
*/
{
textdomain "x11";
include "wizard/sequencer.ycp";
import "Label";
import "AutoinstX11";
import "Wizard";
import "Popup";
/**
* Build main Dialog
* @return term
*/
define term updateContents()
{
map x11 = AutoinstX11::x11;
list resolutions = [];
list<string> resolutions_list = [
"640x480 (VGA)",
"768x576 (PAL)",
"800x600 (SVGA)",
"1024x768 (XGA)",
"1152x864 (XGA)",
"1280x768 (WXGA)",
"1280x800 (WXGA)",
"1280x960 (QVGA)",
"1280x1024 (SXGA)",
"1440x900 (WXGA)",
"1400x1050 (SXGA+)",
"1600x1000",
"1600x1024 (WSXGA)",
"1600x1200 (UXGA)",
"1680x1050 (WSXGA+)",
"1900x1200",
"1920x1200 (WUXGA)",
"2048x1536 (QXGA)",
"2560x2048 (QSXGA)",
"2800x2100 (QSXGA+)",
"3200x2400 (QUXGA)"
];
list<map> depths_list = [
$[
"desc" :_("8 Bit / 256 Colors"),
"depth" : 8
],
$[
"desc" :_("15 Bit / 32 K Colors (PPC)"),
"depth" : 15
],
$[
"desc" :_("16 Bit / 64 K Colors"),
"depth" : 16
],
$[
"desc" :_("24 Bit / 16 M Colors"),
"depth" : 24
],
$[
"desc" :_("32 Bit / 16 M Colors"),
"depth" : 32
]
];
foreach(string res, resolutions_list , ``{
resolutions=add(resolutions, `item( `id(res), res, (res == x11["resolution"]:"1024x768")));
});
list color_depths = [];
foreach(map d, depths_list , ``{
color_depths=add(color_depths,
`item( `id(d["depth"]:16), d["desc"]:_("16 Bit / 64 K Colors") ,
( d["depth"]:16 == x11["color_depth"]:16)));
});
list displaymanager =
[
`item(`id ("kdm"), _("KDM"),
(x11["display_manager"]:"kdm" == "kdm")),
`item(`id("gdm"), _("GDM"), (
x11["display_manager"]:"kdm" == "gdm")),
`item(`id("xdm"), _("XDM"), (
x11["display_manager"]:"kdm" == "xdm"))
];
list windowmanager =
[
`item(`id ("kde"), _("KDE"),
(x11["window_manager"]:"kde" == "kde")),
`item(`id("gnome"), _("GNOME"), (
x11["window_manager"]:"kde" == "gnome")),
`item(`id("twm"), _("TWM"), (
x11["window_manager"]:"kde" == "twm")),
`item(`id("fvwm"), _("FVWM"), (
x11["window_manager"]:"kde" == "fvwm"))
];
term contents =
`Top(
`VBox(
`Frame( _("&General Options:"),
`VBox(
`Left(
`CheckBox(
`id(`enable_3d),
_("&Enable 3D Support if possible"),
x11["enable_3d"]:false)
),
`VSpacing(1),
`HBox(
`HWeight(50,
`ComboBox(`id(`depth),
_("Co&lor Depth"),
color_depths
)),
`HSpacing(1),
`HWeight(50,`ComboBox(`id(`resolution), _("Resol&ution"),
resolutions
)
)
)
)
),
`Frame( _("Desktop:"),
`VBox(
`HBox(
`HWeight(30, `ComboBox(`id(`dm), _("&Display Manager"),
displaymanager
)),
`HWeight(70,`Empty())
),
`HBox(
`HWeight(30, `ComboBox(`id(`wm),
_("&Window Manager"),
windowmanager
)),
`HWeight(70,`Empty())
)
)
)
)
);
return contents;
}
/**
* Main X11 Options
* @return symbol
*/
define symbol x11Options()
{
string caption = _("X11 Configuration");
// x11 help 1/3
string help = _("<p>Use this dialog to configure the X11 system and the
display attached to the computer to install.</P>
");
// x11 help 2/3
help = help + _("<P>Additionally, configure if the X11 system should
be started at boot time and what display manager should be used.</p>
");
Wizard::SetContents(caption,
updateContents(), help, true, true);
any ret = nil;
repeat {
ret = UI::UserInput();
if ( ret ==`next )
{
integer depth = (integer)UI::QueryWidget(`id(`depth), `Value);
AutoinstX11::x11["color_depth"] = depth ;
string resol = (string)UI::QueryWidget(`id(`resolution), `Value);
AutoinstX11::x11["resolution"] = resol;
string default_dm = (string)UI::QueryWidget(`id(`dm), `Value);
AutoinstX11::x11["display_manager"] = default_dm;
string default_wm = (string)UI::QueryWidget(`id(`wm), `Value);
AutoinstX11::x11["window_manager"] = default_wm;
boolean enable_3d = (boolean)UI::QueryWidget(`id(`enable_3d), `Value);
AutoinstX11::x11["enable_3d"] = enable_3d;
}
} until ( ret ==`next || ret ==`back || ret == `abort );
return (symbol)ret;
}
/*
* Create dialog for monitor selection
* @param list of vendors and models (each a list of strings)
* @return term dialog as term to be put into Wizard::SetContents()
*/
define term X11VideoDataDialog( list vendors, list models )
{
term x11_video_data_dialog =
`VBox(
`HBox(
`ReplacePoint( `id(`replace_point_vendors),
`SelectionBox( `id(`vendors), `opt(`notify),
// Headline for monitor vendor selection box
_("&Vendor"),
vendors
)
),
`ReplacePoint( `id(`replace_point_models),
`SelectionBox( `id(`models), `opt(`notify),
// Headline for monitor model selection box
_("M&odel"),
models
)
)
),
`VSpacing(0.2),
`VSquash(
`HBox(
`HWeight( 1,
`Frame(
// Frame title for horizontal frequency input fields
_("Horizontal frequency"),
`HBox(
`HWeight( 35, `TextEntry( `id(`min_hsync ), `opt(`shrinkable), _("&min") ) ),
// Separator between min and max frequency fields
`HWeight( 10, `Bottom(`Label( _("-") ) ) ),
`HWeight( 35, `TextEntry( `id(`max_hsync ), `opt(`shrinkable), _("m&ax") ) ),
// Unit for horizontal frequency
`HWeight( 17, `Bottom(`Label( _("kHz") ) ) )
)
)
),
`HSpacing(0.8),
`HWeight( 1,
`Frame(
// Frame title for vertical frequency input fields
_("Vertical frequency"),
`HBox(
`HWeight( 35, `TextEntry( `id(`min_vsync ), `opt(`shrinkable), _("m&in") ) ),
// Separator between min and max frequency fields
`HWeight( 10, `Bottom(`Label( _("-") ) ) ),
`HWeight( 35, `TextEntry( `id(`max_vsync ), `opt(`shrinkable), _("ma&x") ) ),
// Unit for horizontal frequency
`HWeight( 17, `Bottom( `Label( _("Hz") ) ) )
)
)
)
)
)
);
return x11_video_data_dialog;
};
/**
* Get the `Value property of an arbitrary widget
* @param widget_id ID of the widget, e.g. `resolution
* @return the widget's `Value property
*/
define any GetValue( symbol widget_id )
{
return UI::QueryWidget(`id( widget_id ), `Value );
};
/**
* Set the `Value property of an arbitrary widget
* @param widget_id ID of the widget, e.g. `resolution
* @param new_value the new value
*/
define void SetValue( symbol widget_id,
any new_value )
{
UI::ChangeWidget(`id( widget_id ), `Value, new_value );
return;
};
/**
* Get help text for video data dialog
* @return string multi line help text in RichText (HTML like) format
*/
define string X11VideoDataDialogHelpText()
{
/*
* Help text (HTML like) for X11 video data dialog
*/
// help part 1 of 8
string helptext = _("<p>
Please select your monitor's <b>vendor</b> and <b>model</b>.
</p>
");
// help part 2 of 8
helptext = helptext + _("<p>
If your monitor is not listed here, use <b>VESA</b>.
Most monitors comply with this standard.
</p>
");
// help part 5 of 8
helptext = helptext + _("<p>
Modify the monitor's frequencies in the respective input
fields below the selection boxes.
Refer to your monitor manual for your monitor's maximum
frequencies. <b><i>Do not exceed</i></b> the values specified there.
Otherwise, there is a serious risk of <b><i>damaging your monitor</i></b>.
</p>
");
// help part 6 of 8
helptext = helptext + _("<p>
The <b>horizontal frequency</b> (in kHz) specifies how many times
per second the monitor can write a horizontal scan line. This is a
hard limit of the monitor, independent of the screen resolution.
</p>
");
// help part 7 of 8
helptext = helptext + _("<p>
The <b>vertical frequency</b> (in Hz) specifies how many times per
second the image on the screen is refreshed. This value depends on the
screen resolution and the monitor's maximum horizontal frequency.
</p>
");
// help part 8 of 8
helptext = helptext + _("<p>
If you experience a constant high frequency beep from your monitor,
you might wish to use slightly lower frequency values than the maximum
specified in your monitor's manual. This usually helps a lot to reduce
the noise.
</p>
");
return helptext;
};
// get the sync values --> string
//
define string GetMinHsync() ``{ return (string)GetValue(`min_hsync ); };
define string GetMaxHsync() ``{ return (string)GetValue(`max_hsync ); };
define string GetMinVsync() ``{ return (string)GetValue(`min_vsync ); };
define string GetMaxVsync() ``{ return (string)GetValue(`max_vsync ); };
// set the sync values (every single value)
//
define void SetMinHsync( string new_value ) ``{ SetValue(`min_hsync, new_value ); };
define void SetMaxHsync( string new_value ) ``{ SetValue(`max_hsync, new_value ); };
define void SetMinVsync( string new_value ) ``{ SetValue(`min_vsync, new_value ); };
define void SetMaxVsync( string new_value ) ``{ SetValue(`max_vsync, new_value ); };
// set the focus to the input fields
//
define void SetFocusMinHsync() ``{ UI::SetFocus(`id(`min_hsync)); }
define void SetFocusMaxHsync() ``{ UI::SetFocus(`id(`max_hsync)); }
define void SetFocusMinVsync() ``{ UI::SetFocus(`id(`min_vsync)); }
define void SetFocusMaxVsync() ``{ UI::SetFocus(`id(`max_vsync)); }
// get the current vendor and model --> string
//
define string GetCurrentVendor() ``{ return (string)UI::QueryWidget(`id(`vendors), `CurrentItem); }
define string GetCurrentModel () ``{ return (string)UI::QueryWidget(`id(`models), `CurrentItem); }
// set the current vendor and model
//
define void SetCurrentVendor( string new_item ) ``{ UI::ChangeWidget(`id(`vendors), `CurrentItem, new_item ); }
define void SetCurrentModel ( string new_item ) ``{ UI::ChangeWidget(`id(`models), `CurrentItem, new_item ); }
// replace the vendor list
//
define void ReplaceVendors( list new_value ) ``{
UI::ReplaceWidget( `id( `replace_point_vendors),
`SelectionBox( `id(`vendors), `opt(`notify),
// Headline for monitor vendor selection box
_("Vendor"),
new_value
)
);
return;
}
/**
* Replace the model list
* @return void
*/
define void ReplaceModels( list new_value )
{
UI::ReplaceWidget( `id( `replace_point_models),
`SelectionBox( `id( `models),
`opt( `notify ),
// Headline for monitor model selection box
_("Model"),
new_value
)
);
return;
}
// Handle `back button
//
define void SetBackState( boolean new_value )
{
if ( new_value )
Wizard::EnableBackButton();
else
Wizard::DisableBackButton();
}
// CAUTION: This no longer works with the new wizard - no way to query that value!
define boolean GetBackState()
{
return (boolean)UI::QueryWidget(`id(`back), `Enabled );
}
/**
* round up a value given as integer or float to the next integer (ceiling).
*/
define integer ceiling( any value )
{
if ( is( value, integer ) ) return (integer) value; // already integer
if ( is( value, float ) ) // is float
{
if ( tofloat( tointeger( value ) ) == value ) // is whole-numbered
return( tointeger( value ) ); // return as is
else // not whole-numbered
return( tointeger( value ) + 1 ); // round up
}
else
{
y2error( "ceiling(): parameter error: <%1> (only integer and float allowed)", value );
return( nil );
}
}
/**
* Round down a value given as integer or float to the prev. integer (floor).
**/
define integer floor( any value )
{
if ( is( value, integer ) ) return (integer) value; // already integer
if ( is( value, float ) ) // is float
{
return( tointeger( value ) ); // round down
}
else
{
y2error( "floor(): parameter error: <%1> (only integer and float allowed)", value );
return( nil );
}
}
/*
* Check if the number is in the format [+]<number>[kKmMgGtT]
* @return boolean true or false
*/
define boolean IsNumber( string input )
{
integer n = 0;
while ( n < size( input ) )
{
string erg = filterchars( substring( input, n,1 ), "0123456789." );
if ( size( erg ) != 1 )
{
y2milestone("%1", n);
return( false );
}
n = n + 1;
}
return( true );
};
/**
* Get a list of all monitor models for a specified vendor from the monitor database.
* @return list
*/
define list get_models_for_vendor( string vendor, list<map> monitor_db )
{
list<map> vendor_monitors = filter( map monitor, monitor_db, ``(
monitor["vendor"]:"" == vendor ));
return toset( maplist( map monitor, vendor_monitors, ``( monitor["model"]:"")) );
};
/**
* Automagically update the frequency values for a specified model.
*/
define void update_frequency_for_model( string vendor, string model)
{
// Get the data record for this monitor
//
map monitor = (map)find( map m, AutoinstX11::all_monitors,
``(( m["vendor"]:"" == vendor)
&& (m["model"]:"" == model)) );
// Set all the input fields according to this monitor's data
// first, assign the value to a float. the monitor data may contain
// integer values, but tostring expects a float.
float fsyncval = tofloat( monitor["min_hsync"]:0 );
SetMinHsync (tostring( fsyncval, 1 ));
fsyncval = tofloat( monitor["max_hsync"]:0 );
SetMaxHsync (tostring( fsyncval, 1 ));
fsyncval = tofloat( monitor["min_vsync"]:0 );
SetMinVsync (tostring( fsyncval, 1 ));
fsyncval = tofloat( monitor["max_vsync"]:0 );
SetMaxVsync (tostring( fsyncval, 1 ));
return;
}
/*
* Automagically update the models list for a specified vendor.
* Select default first entry if unknown and update its sync values.
* Honor the special "No X11" entry.
* It is assumed that the given vendor is known i.e. is a member of the given monitor_db.
*/
define void change_vendor( string vendor, list<map> monitor_db )
{
if ( vendor == "No X11" )
{
ReplaceModels( [] );
SetMinHsync( "" );
SetMaxHsync( "" );
SetMinVsync( "" );
SetMaxVsync( "" );
AutoinstX11::current_model = "";
}
else
{
list models = get_models_for_vendor( vendor, monitor_db );
ReplaceModels( models );
if ( models != [] )
{
if ( ! contains( models, AutoinstX11::current_model ) )
AutoinstX11::current_model = models[0]:"";
SetCurrentModel( AutoinstX11::current_model );
update_frequency_for_model( vendor, AutoinstX11::current_model );
}
else
{
SetMinHsync( "" );
SetMaxHsync( "" );
SetMinVsync( "" );
SetMaxVsync( "" );
AutoinstX11::current_model = "";
}
}
return;
}
/**
* Read the monitor db and get vendors and models lists.
* Optionally extend db with probed monitor.
*/
define void get_vendors_and_models()
{
if ( AutoinstX11::monitor["monitor_vendor"]: "" == "" )
{
// monitor vendor not known
AutoinstX11::current_vendor = _("unknown vendor");
AutoinstX11::monitor["monitor_vendor"] = AutoinstX11::current_vendor ;
}
if ( AutoinstX11::monitor["monitor_device"]:"" == "" )
{
// monitor model not known
AutoinstX11::current_model = _("unknown model");
AutoinstX11::monitor["monitor_device"] = AutoinstX11::current_model;
}
}
/**
* Display current vendor, model and associated values if possible.
* @return void
*/
define void display_models_and_values()
{
if ( contains( AutoinstX11::vendors, AutoinstX11::current_vendor ) )
{
SetCurrentVendor( AutoinstX11::current_vendor );
change_vendor( AutoinstX11::current_vendor, AutoinstX11::all_monitors );
}
else
{
AutoinstX11::current_vendor = (string) AutoinstX11::vendors[0]:"";
SetCurrentVendor( AutoinstX11::current_vendor );
change_vendor( AutoinstX11::current_vendor, AutoinstX11::all_monitors );
}
return;
}
// Parse the given string assuming it is a "model" string containing VESA
// information formatted as e.g. "1024X768@75HZ". The values for width,
// height, and refresh are extracted and assigned to the X11 user_data struct
// along with a constant color depth of 8 bit (VESA) or 16 bit (LCD).
//
define void store_VESA_LCD( string model, boolean is_VESA )
{
integer currentWidth = 0;
integer currentHeight = 0;
integer currentFrequency = 0;
// First find resolution string within model string.
// E.g. "PANORAMIC SUPERWIDE 1024X768@75HZ" --> "1024X768@75HZ"
//
list<string> res_list = splitstring( model, " " );
if ( size( res_list ) > 0 )
{
string resolution = find(string res, res_list, ``( issubstring( res, "@") ));
// 1. "1024X768@75HZ" --> "1024" and "768@75HZ"
//
list first = splitstring( resolution, "X");
if ( size( first ) > 0 )
{
currentWidth = tointeger( first[0]:"" );
// 2. "768@75HZ" --> "768" and "75HZ"
//
list second = splitstring( first[1]: "" , "@" );
if ( size( second ) > 0 )
{
currentHeight = tointeger( second[0]: "" );
currentFrequency = tointeger( second[1]: "" );
}
}
}
// store the new values into the X11 user_data struct
//
AutoinstX11::display = AutoinstX11::display;
return;
}
/**
* Main Monitor Dialog
* @return symbol
*/
define symbol monitorDialog()
{
AutoinstX11::readMonitorDB();
map display = AutoinstX11::display;
integer min_hsync = ceiling( display["min_hsync"]:0 );
integer max_hsync = floor ( display["max_hsync"]:0 );
integer min_vsync = ceiling( display["min_vsync"]:0 );
integer max_vsync = floor ( display["max_vsync"]:0 );
get_vendors_and_models();
string help_text = X11VideoDataDialogHelpText();
term contents = X11VideoDataDialog( AutoinstX11::vendors, [] );
Wizard::SetContents(
_("Configure Monitor"),
contents,
help_text,
true , true);
display_models_and_values();
// Monitor
string min_hsync_string = "";
string max_hsync_string = "";
string min_vsync_string = "";
string max_vsync_string = "";
symbol ret = `none;
repeat {
ret = (symbol) UI::UserInput();
if ( ret == `vendors )
{
string new_vendor = GetCurrentVendor();
if ( new_vendor != AutoinstX11::current_vendor )
{
AutoinstX11::current_vendor = new_vendor;
change_vendor( AutoinstX11::current_vendor, AutoinstX11::all_monitors );
}
}
else if ( ret == `models )
{
string new_model = GetCurrentModel();
if ( new_model != AutoinstX11::current_model )
{
AutoinstX11::current_model = new_model;
update_frequency_for_model( AutoinstX11::current_vendor,
AutoinstX11::current_model );
}
}
else if ( ret == `next )
{
min_hsync_string = GetMinHsync();
max_hsync_string = GetMaxHsync();
min_vsync_string = GetMinVsync();
max_vsync_string = GetMaxVsync();
// Check the content in the input fields. All input must be valid.
//
if ( ! IsNumber( min_hsync_string ) || size( min_hsync_string ) <= 0 )
{
// A frequency value is not of type numerical. User must correct this.
Popup::Message(_("The minimum horizontal frequency is not a numerical value.
Try again.
"));
SetFocusMinHsync();
ret = `again;
continue;
}
if ( ! IsNumber( max_hsync_string ) || size( max_hsync_string ) <= 0 )
{
// A frequency value is not of type numerical. User must correct this.
Popup::Message(_("Maximum horizontal frequency is not a numerical value.\nPlease try again."));
SetFocusMaxHsync();
ret = `again;
continue;
}
if ( ! IsNumber( min_vsync_string ) || size( min_vsync_string ) <= 0 )
{
// A frequency value is not of type numerical. User must correct this.
Popup::Message(_("The minimum vertical frequency is not a numerical value.
Try again.
"));
SetFocusMinVsync();
ret = `again;
continue;
}
if ( ! IsNumber( max_vsync_string ) || size( max_vsync_string ) <= 0 )
{
// A frequency value is not of type numerical. User must correct this.
Popup::Message(_("Maximum vertical frequency is not a numerical value.\nPlease try again."));
SetFocusMaxVsync();
ret = `again;
continue;
}
min_hsync = ceiling( tofloat( min_hsync_string ) );
max_hsync = floor ( tofloat( max_hsync_string ) );
min_vsync = ceiling( tofloat( min_vsync_string ) );
max_vsync = floor ( tofloat( max_vsync_string ) );
AutoinstX11::display["min_hsync"] = min_hsync ;
AutoinstX11::display["max_hsync"] = max_hsync ;
AutoinstX11::display["max_vsync"] = max_vsync ;
AutoinstX11::display["min_vsync"] = min_vsync ;
if ( AutoinstX11::current_vendor == " VESA" )
{
store_VESA_LCD( AutoinstX11::current_model, true );
}
else if ( AutoinstX11::current_vendor == " LCD" )
{
store_VESA_LCD( AutoinstX11::current_model, false );
}
}
} until ( ret == `next || ret == `back || ret == `abort);
return ret;
}
/**
* Sequencer
*/
define symbol X11AutoSequence () ``{
map dialogs = $[
"x11" : ``( x11Options() ),
"monitor" : ``( monitorDialog() )
];
map sequence = $[
"ws_start" : "x11",
"x11" :
$[
`abort : `abort,
`next : "monitor"
],
"monitor":
$[
`abort : `abort,
`next : `next
]
];
Wizard::CreateDialog ();
Wizard::SetDesktopIcon("x11");
symbol ret = WizardSequencer (dialogs, sequence);
UI::CloseDialog ();
return ret;
}
}