You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
calculate-utils-3-install/pym/install/variables/X11.py

336 lines
12 KiB

# -*- coding: utf-8 -*-
# Copyright 2008-2016 Mir Calculate. http://www.calculate-linux.org
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import sys
import re
from os import path
from calculate.lib.datavars import Variable, VariableError, ReadonlyVariable
from calculate.lib.utils.portage import isPkgInstalled
from calculate.lib.utils.files import readFile
from calculate.lib.utils.common import (getVideoFromXorgLog,
getVideoFromXorgConf,
getVideoFromCmdLine,
getAvailableVideo, getValueFromCmdLine,
getCompositeFromXorgconf,
getVideoFromModules,
getVideoFromVendor, getInstalledVideo,
CmdlineParams)
from calculate.install.distr import DistributiveError
import fcntl
import struct
from collections import OrderedDict
from calculate.lib.cl_lang import setLocalTranslate, _
setLocalTranslate('cl_install3', sys.modules[__name__])
class VideoVariable(Variable):
"""
Video variables not using for flash installation
"""
xorg_need = True
default_video = "default"
driver_names = OrderedDict([
('default', _("X.Org Server auto detection")),
('radeon', _("AMD Radeon (radeon)")),
('amdgpu', _("AMD AMDGPU (amdgpu)")),
('fglrx', _("AMD Catalyst (fglrx)")),
('intel', _("Intel (intel)")),
('nouveau', _("Nvidia Nouveau (nouveau)")),
('nvidia', _("Nvidia Graphics Driver (nvidia)")),
('vesa', _("Generic VESA (vesa)")),
])
def uncompatible(self):
"""
Video setting up unavailable for flash installation
"""
if self.Get('os_install_root_type') == 'flash':
return \
_("Video configuration unavailable for Flash install")
if (self.Get('install.os_install_x11_server_set') == 'off' and
self.xorg_need):
return \
_("This distribution does not provide a Xorg server")
return ""
class ResolutionVariable(VideoVariable):
"""
Abstract resolution variable
"""
fbres = False
def choice(self):
resolutions = ["640x480", "800x480", "800x600", "1024x576", "1024x600",
"1024x768", "1200x800", "1280x800", "1280x720",
"1280x768", "1280x1024", "1360x768", "1366x768",
"1368x768", "1400x1050", "1440x900", "1680x945",
"1680x1050", "1920x1080", "1920x1200", "1600x768",
"1600x900", "1600x1200", "2048x1152", "2560x1440",
"2560x1600"]
if self.fbres:
return map(lambda x: "%s-32" % x,
resolutions)
else:
return resolutions
def check(self, value):
"""
Check resolution format 1234x567
"""
if not re.match('^\d+x\d+(-\d+(@\d+)?)?$', value):
raise VariableError(
_("Wrong resolution {resolution} {example}").format(
resolution=value,
example="(%s:%s)" % (_("Example"), "1024x768")))
class VariableOsInstallX11Resolution(ResolutionVariable):
"""
X.org resolution
"""
type = 'choiceedit'
opt = ['-X']
metavalue = "<width>x<height>"
# разрешение по умолчанию пустое - это нужно для livecd
# для автоопределения разрешения xorg сервером
fallback_resolution = ""
def init(self):
self.help = _("set the Xorg resolution")
self.label = _("Screen resolution")
def get(self):
# get resolution from xorg.log
res = self.Get('os_x11_resolution')
if res or self.Get('install.os_install_root_type') in (
'livecd', 'usb-hdd'):
return res or self.fallback_resolution
else:
return self.fallback_resolution
class VariableOsInstallX11VideoAvailable(VideoVariable):
"""
Get available (already installed or installable drivers
"""
type = "list"
# supported = ["nvidia", "fglrx", "amdgpu", "nouveau", "intel", "radeon"]
supported = ["nvidia", "fglrx", "amdgpu", "nouveau", "intel", "radeon"]
def get(self):
image = self.Get('cl_image')
if image:
with image:
try:
distrPath = image.getDirectory()
if isPkgInstalled('xorg-server', prefix=distrPath):
return (sorted(filter(self.supported.__contains__,
getAvailableVideo(
prefix=distrPath))) +
[self.default_video])
except DistributiveError:
pass
return []
def humanReadable(self):
return map(lambda x: self.driver_names.get(x, x), self.Get())
class VariableOsX11KmsVideoDrv(ReadonlyVariable):
"""
Список KMS драйверов
"""
type = "list"
value = ["radeon", "intel", "nouveau", "amdgpu"]
class VariableOsInstallX11VideoDrv(VideoVariable):
"""
Video driver used by xorg
"""
type = 'choiceedit'
opt = ['--video']
metavalue = "VIDEODRV"
def init(self):
self.help = _("set the video driver")
self.label = _("Video driver")
def choice(self):
"""Get available (already installed or installable drivers"""
if self.Get('os_install_x11_server_set') == 'on':
values = self.Get('os_install_x11_video_available')
else:
values = self.Get('os_x11_kms_video_drv') + [self.default_video]
return map(lambda x: (x, self.driver_names.get(x, x)),
(x for x in self.driver_names.keys() if x in values))
def get(self):
if self.Get('os_install_x11_server_set') == 'on':
# get available videodriver list from install or configure distributive
list_video = self.Choice('os_install_x11_video_drv')
if not list_video:
return self.default_video
# if type system is usb-hdd then get detect video driver
if self.Get('os_install_root_type') == 'usb-hdd':
methods = ((getVideoFromModules, ()),
(getVideoFromCmdLine, ()),
(getVideoFromVendor,
(self.Get('hr_video'), list_video)))
else:
# test current video driver for install system
methods = ((getVideoFromXorgLog, ('/', list_video)),
(getVideoFromXorgConf, ('/',)),
(getVideoFromModules, ()),
(getVideoFromCmdLine, ()),
(getVideoFromVendor,
(self.Get('hr_video'), list_video)))
for func, args in methods:
drv = func(*args)
if drv in list_video:
return drv
return self.default_video
else:
for drv in map(lambda x: x[0], self.choice()):
videoSysPath = path.join("/sys/module", drv, "refcnt")
refcnt = readFile(videoSysPath).strip()
if refcnt.isdigit() and int(refcnt) > 0:
return {'i915': 'intel'}.get(drv, drv)
else:
return self.default_video
pkgDrvMap = {'nvidia': ('NVidia', 'x11-drivers/nvidia-drivers'),
'fglrx': ('ATI', 'x11-drivers/ati-drivers'),
'vboxdrv': ('VirtualBox', 'x11-drivers/xf86-video-virtualbox')}
def check(self, value):
if self.Get('os_install_x11_server_set') == 'on':
if self.Get('cl_action') == 'system':
availDrvs = self.Get('os_install_x11_video_available')
if not value in availDrvs:
raise VariableError(_("Only %s drivers are available") %
",".join(availDrvs))
else:
if not value in getInstalledVideo(prefix="/") and \
not value in ("auto", self.default_video):
error = _("video driver %s is unavailable") % value
if value in self.pkgDrvMap:
error += ". " + (_("Install driver %s with:")
% self.pkgDrvMap[value][0])
error += "\n" + ("emerge %s" % self.pkgDrvMap[value][1])
raise VariableError(error)
else:
availDrivers = self.Get('os_x11_kms_video_drv') + [
self.default_video]
if not value in availDrivers:
raise VariableError("Only %s drivers are available" %
",".join(availDrivers))
def uncompatible(self):
"""
Video setting up unavailable for flash installation
"""
if self.Get('os_install_root_type') == 'flash':
return \
_("Video configuration unavailable for Flash install")
return ""
class VariableOsInstallX11VideoDrvPrev(VariableOsInstallX11VideoDrv):
"""
Предыдущее значение os_install_x11_videodrv
"""
class VariableHrVideoId(ReadonlyVariable):
"""
BusID of video card
TODO: need realization
"""
value = ""
class VariableOsInstallX11Composite(VideoVariable):
"""
on/off composite
"""
type = 'bool'
opt = ['--composite']
def init(self):
self.help = _("toggle composite")
self.label = _("Composite")
def get(self):
"""On/off composite"""
defaultCompositeOn = ("nvidia", "intel", "fglrx", # "amdgpu",
"nouveau", "radeon", "default")
composite = getValueFromCmdLine(CmdlineParams.Calculate,
CmdlineParams.Composite)
videodrv = getValueFromCmdLine(CmdlineParams.Calculate,
CmdlineParams.Video)
if videodrv != "auto":
composite = {'nocomposite': 'off',
'off': 'off',
'on': 'on',
'composite': 'on'}.get(composite)
else:
composite = None
if self.Get('os_install_x11_video_drv') in defaultCompositeOn:
defaultComposite = "on"
elif self.Get('hr_virtual') == 'vmware':
defaultComposite = "on"
else:
defaultComposite = "off"
if self.Get('os_install_x11_video_drv') == self.Get('os_x11_video_drv'):
state = getCompositeFromXorgconf()
else:
state = None
return composite or state or defaultComposite
class VariableOsInstallFbResolution(ResolutionVariable):
"""
Framebuffer resolution
"""
type = 'choiceedit'
opt = ['--fb']
metavalue = "<width>x<height>"
xorg_need = False
fbres = True
def init(self):
self.help = _("set the framebuffer resolution")
self.label = _("Framebuffer resolution")
FBIOGET_VSCREENINFO = 0x4600
def get(self):
"""Get current framebuffer resolution"""
try:
fbdev = os.open('/dev/fb0', os.O_RDONLY)
data = fcntl.ioctl(fbdev, self.FBIOGET_VSCREENINFO, " " * 8)
res = struct.unpack("II", data)
return "%sx%s" % (res[0], res[1])
except (IOError, OSError):
pass
return "1024x768"