|
楼主 |
发表于 2004-1-20 18:57:52
|
显示全部楼层
最新发现,bug应该是在/usr/bin/X11/xconfig这个文件中。我的文件如下:
#!/usr/bin/python
import sys,os,signal,commands
import string
sys.path.append ('.')
#sys.path.append ('..')
sys.path.append ('/usr/lib/mongoose')
sys.path.append ('/usr/lib/mongoose/textw')
from constants_text import *
from snack import *
signal.signal(signal.SIGINT,signal.SIG_DFL)
from log import log
from xf86config4 import XF86Config
from xf86config4 import XRES_VGA
from xf86config4 import XRES_640x480_60Hz
from xf86config4 import XRES_800x600_60Hz
from xf86config4 import XRES_1024x768_60Hz
from xf86config4 import XRES_1280x1024_60Hz
from xf86config4 import XRES_LCD
from xf86config4 import XRES_LCD_1024x480_864Hz
from xf86config4 import XRES_LCD_1024x512_88Hz
from xf86config4 import XRES_LCD_1280x600_60Hz
from xf86config4 import XRES_LCD_1400x1050_60Hz
from xf86config4 import XRES_LCD_1400x1050_6224Hz
from xf86config4 import XRES_LCD_1600x1200_592Hz
from xf86config4 import XRES_LCD_1280x768_60Hz
from xf86config4 import XRES_LCD_1024x600_58Hz
from xf86config4 import *
from kbd import Keyboard
from mouse import MouseConfigFile
from rhpl.translate import _, cat, N_, textdomain
textdomain("mongoose")
import time
#from gtk import *
#from _gtk import gtk_set_locale
import xkbC
from mouse_text import MouseWindow
from keyboard_text import KeyboardWindow
from xconfig_text import MonitorWindow
from xconfig_text import CardWindow
from distro import *
XCMODE_CONFIGURE =1<<0
XCMODE_INITIALSET =1<<1
#XRES_VGA = 1
#XRES_640x480_60Hz = 2
#XRES_800x600_60Hz = 3
#XRES_1024x768_60Hz = 4
#XRES_1280x1024_60Hz = 5
#XRES_LCD = 6
#XRES_LCD_1024x480_864Hz = 6
#XRES_LCD_1024x512_88Hz = 7
#XRES_LCD_1280x600_60Hz = 8
#XRES_LCD_1400x1050_60Hz = 9
#XRES_LCD_1400x1050_6224Hz = 10
#XRES_LCD_1600x1200_592Hz = 11
#XRES_LCD_1280x768_60Hz = 12
#XRES_LCD_1024x600_58Hz = 13
class XconfigTodo:
def __init__(self,installer = XRES_800x600_60Hz, lcd=0, vesa=0):
self.x = XF86Config(installer = installer, lcd = lcd, vesa = vesa)
self.x.monitors()
self.keyboard = Keyboard()
self.mouse = MouseConfigFile(skip_probe = 1)
self.verbose = 0
self.havegdm = 0
self.wm = 0
self.xconfig_width = 40
self.initlevel = self.getDefaultRunlevel()
self.rootmsg = _("X Configuration %s") % distro().get(DISTRO_COPYRIGHT)
self.conf = None
def confKeyboard(self,conf):
if conf.has_key('Keyboardrule'): rule = conf['Keyboardrule']
else: return
if conf.has_key('Keyboardmodel'): model = conf['Keyboardmodel']
else: return
if conf.has_key('Keyboardlayout'): layout = conf['Keyboardlayout']
else: return
if conf.has_key('Keyboardvariant'): variant = conf['Keyboardvariant']
else: variant = None
if conf.has_key('Keyboardoptions'): options = conf['Keyboardoptions']
else: options = None
if conf.has_key('Keyboarddisablexkb'): disableXkb = conf['Keyboarddisablexkb']
else: disableXkb = 0
# from log import log
if (os.access("/tmp/.X0-lock", os.R_OK) or \
os.environ.has_key('DISPLAY')) and \
os.access('/usr/X11R6/bin/setxkbmap',os.X_OK):
# log("Set xkbmap")
cmd = '/usr/X11R6/bin/setxkbmap'
if model and model != '':
cmd = cmd + " -model " + model
if layout and layout != '':
cmd = cmd + " -layout " + layout
# if variant and variant != '':
# cmd = cmd + " -variant " + variant
# log(cmd)
commands.getstatusoutput(cmd)
#xkb.XKB().setRule(model,layout,variant,options)
# log(conf)
self.x.setKeyboard(rule,model,layout,variant,options,disableXkb)
# log(self.x.KeyboardOpt)
# log(self.x.keyOptions)
self.keyboard.setfromx(model,layout)
def confMouse(self,conf):
#if conf.has_key('MouseDevice'):
# self.mouse.setDevice(conf['MouseDevice'])
if conf.has_key('MouseName'):
if conf.has_key('MouseEmu3btn') and conf['MouseEmu3btn']=='yes':
self.mouse.setEmulate3btns(1)
else:
self.mouse.setEmulate3btns(0)
#self.mouse.setXProtocol(0)
self.x.setMouse(self.mouse)
def confMonitor(self,conf):
if conf.has_key('MonitorMan') and \
conf.has_key('MonitorName') and \
conf.has_key('MonitorHoriz') and \
conf.has_key('MonitorVert'):
self.x.setMonitor((conf['MonitorName'],
(conf['MonitorHoriz'],conf['MonitorVert'])),
conf['MonitorMan'])
def saveconfigfile(self,path='/etc/X11'):
self.confKeyboard(self.conf)
self.confMouse(self.conf)
self.confMonitor(self.conf)
if self.conf.has_key('DispModes'): self.x.modes = self.conf['DispModes']
if self.conf.has_key('DefDepth'): self.x.DispOpt[0] = self.conf['DefDepth']
if self.conf.has_key('DispOpt4'): self.x.DispOpt[1] = self.conf['DispOpt4']
if self.conf.has_key('DispOpt8'): self.x.DispOpt[2] = self.conf['DispOpt8']
if self.conf.has_key('DispOpt16'): self.x.DispOpt[3] = self.conf['DispOpt16']
if self.conf.has_key('DispOpt24'): self.x.DispOpt[4] = self.conf['DispOpt24']
self.x.write(path)
self.setDefaultRunlevel()
def setforxtest(self, modes, DispOpt):
self.confKeyboard(self.conf)
self.confMouse(self.conf)
self.confMonitor(self.conf)
self.x.modes = modes
self.x.DispOpt[0] = DispOpt[0]
self.x.DispOpt[1] = DispOpt[1]
self.x.DispOpt[2] = DispOpt[2]
self.x.DispOpt[3] = DispOpt[3]
self.x.DispOpt[4] = DispOpt[4]
def setDefaultRunlevel(self):
try:
inittab = open ('/etc/inittab','r')
except IOError:
log ("WARNING, there is no inittab, bad things will happen!")
return
lines = inittab.readlines()
inittab.close()
inittab = open ('/etc/inittab','w')
for line in lines:
if len (line) > 3 and line[:3] == "id:":
fields = string.split (line, ':')
fields[1] = str (self.initlevel)
line = string.join (fields, ':')
inittab.write (line)
inittab.close ()
def getDefaultRunlevel(self):
try:
inittab = open ('/etc/inittab','r')
except IOError:
log ("WARNING, there is no inittab, bad things will happen!")
return 3
lines = inittab.readlines()
inittab.close()
for line in lines:
if len (line) > 3 and line[:3] == "id:":
fields = string.split (line, ':')
return int(fields[1])
return 3
class WelcomeWindow:
def run(self, screen, toolname, mode=0):
label = _("Welcome to %s") % toolname
msg = label + _(" This program will configure your keyboard, mouse, video card, and monitor for use with the X Window System.")
btnlist = []
if mode&XCMODE_CONFIGURE: btnlist.append((_("Configure"),"c"))
if mode&XCMODE_INITIALSET: btnlist.append((_("Initial setup"),"i"))
else: return 0;
btn = ButtonChoiceWindow(screen,label,msg,btnlist,50)
if btn == "c": return XCMODE_CONFIGURE
return XCMODE_INITIALSET
class SaveQuitWindow:
def run(self, screen, todo):
msg = _("The X Window System has been configured. Your XF86Config file has been written to %s.") % ("/etc/X11/XF86Config")
ButtonChoiceWindow(screen,_("Finished"),msg,[_("Ok")],60)
class CancelWindow:
def run(self, screen, todo):
msg = _("You have chosen to cancel the X Window System configuration process. You may re-run this program at any time to reconfigure X.")
ButtonChoiceWindow(screen,_("Cancelled"),msg,[_("Ok")],60)
class XCCardWindow:
def __init__(self,hideback=0,needcancel=0):
(rc,str) = commands.getstatusoutput("/bin/rpm -q --queryformat=%{NAME} gdm")
if rc == 0 and str == 'gdm': havegdm = 1
else: havegdm = 0
# havegdm = (rc == 0) and (str == 'gdm')
self.func = CardWindow(hideback,needcancel,havegdm)
self.xtestpath = None
if not os.access("/tmp/.X0-lock", os.R_OK) and \
not os.environ.has_key('DISPLAY') and \
os.access("/usr/lib/mongoose/Xtest/Xtest",os.X_OK):
self.xtestpath = "/usr/lib/mongoose/Xtest/Xtest"
def autosetup(self, todo, conf=None, printonly=0):
return self.func.autosetup(todo, wmlist=[], conf=conf, printonly=printonly)
def __call__(self, screen, todo, conf):
return self.func(screen,todo,wmlist=[],xtestpath=self.xtestpath,conf=conf)
class StepRun:
def run(self,screen,todo):
steplist = [
[ N_("Keyboard Selection"), KeyboardWindow ],
[ N_("Mouse Configuration"), MouseWindow ],
[ N_("X Monitor Configuration"), MonitorWindow ],
[ N_("Videocard Configuration"), XCCardWindow ],
]
ret = INSTALL_OK
rootlen = len(todo.rootmsg)
brkstr = (screen.width - rootlen) * " "
step = 0
stepend = len(steplist)
while(step < stepend):
rootlen = len(todo.rootmsg)
screen.drawRootText(0,0,todo.rootmsg)
screen.drawRootText(rootlen,0,brkstr)
screen.drawRootText((screen.width-len(_(steplist[step][0]))),0,_(steplist[step][0]))
if step == 0: ret = apply(steplist[step][1](1,1),(screen,todo,todo.conf))
else: ret = apply(steplist[step][1](0,1),(screen,todo,todo.conf))
if ret == INSTALL_OK: step = step + 1
elif ret == INSTALL_BACK: step = step - 1
elif ret == INSTALL_CANCEL: break
screen.refresh()
return ret
class create_text_line:
def get(self,width,left,right):
return left + (width - len(left) - len(right) - 2) * "." + " " + right + "\n"
class keyboard_menu:
def __init__(self):
self.textline = create_text_line()
self.func = KeyboardWindow(1,1)
def text(self,todo):
if todo.conf.has_key('Keyboardmodel'): modelname = todo.conf['Keyboardmodel']
else: modelname = _("unknown")
if todo.conf.has_key('Keyboardlayout'): layoutname = todo.conf['Keyboardlayout']
else: layoutname = _("unknown")
m = self.textline.get(todo.xconfig_width,_("Model "),modelname)
l = self.textline.get(todo.xconfig_width,_("Layout "),layoutname)
return (_("Keyboard configuration"),m + l)
class mouse_menu:
def __init__(self):
self.textline = create_text_line()
self.func = MouseWindow(1,1)
def text(self,todo):
if todo.conf.has_key('MouseName'): mousename = todo.conf['MouseName']
else: mousename = _("unknown")
if todo.conf.has_key('MouseDevice'): devname = "/dev/" + todo.conf['MouseDevice']
else: devname = _("unknown")
if todo.conf.has_key('MouseEmu3btn') and todo.conf['MouseEmu3btn'] > 0:
emuname = _("Yes")
else: emuname = _("No")
type = _("Mouse name\n") + self.textline.get(todo.xconfig_width,"",mousename)
dev = self.textline.get(todo.xconfig_width,_("Device connect "),devname)
emu = self.textline.get(todo.xconfig_width,_("Emulate 3 Buttons "),emuname)
return (_("Mouse configuration"),type+dev+emu)
class monitor_menu:
def __init__(self):
self.textline = create_text_line()
self.func = MonitorWindow(1,1)
def text(self,todo):
if todo.conf.has_key('MonitorMan'): monitor_man = todo.conf['MonitorMan']
else: monitor_man = _("unprobe")
if todo.conf.has_key('MonitorName'): monitor_model = todo.conf['MonitorName']
else: monitor_model = _("unprobe")
if todo.conf.has_key('MonitorHoriz'): monitor_hsync = todo.conf['MonitorHoriz']
else: monitor_hsync = _("unprobe")
if todo.conf.has_key('MonitorVert'): monitor_vsync = todo.conf['MonitorVert']
else: monitor_vsync = _("unprobe")
manu = _("Manufacturer\n") + self.textline.get(todo.xconfig_width,"",monitor_man)
model = _("Model\n")+self.textline.get(todo.xconfig_width,"",monitor_model)
hs = self.textline.get(todo.xconfig_width,_("H frequency range "),monitor_hsync+_(" kHz"))
vs = self.textline.get(todo.xconfig_width,_("V frequency range "),monitor_vsync+_(" Hz"))
return (_("Monitor configuration"),manu+model+hs+vs)
class card_menu:
def __init__(self):
self.textline = create_text_line()
self.func = XCCardWindow(1,1)
def text(self,todo):
if todo.conf.has_key('Card'): card_name = todo.conf['Card']
else: card_name = _("unprobe")
if todo.conf.has_key('DefDepth'):
card_color = self.func.func.colorlist[(todo.conf['DefDepth']>>3)]
else:
card_color = _("AUTO")
if todo.conf.has_key('DefSize'):
card_size = todo.conf['DefSize']
if card_size == '': card_size = _("AUTO")
elif card_size == 'CUSTOM': card_size = _("CUSTOM")
else:
card_size = _("AUTO")
vc = _("Video card\n") + self.textline.get(todo.xconfig_width,"",card_name)
dc = self.textline.get(todo.xconfig_width,_("Desktop Color Depth "),card_color)
ds = self.textline.get(todo.xconfig_width,_("Desktop Resolution (Size) "),card_size)
if todo.initlevel == 5: glm = _("Graphical")
else: glm = _("Text")
gl = self.textline.get(todo.xconfig_width,_("Login "),glm)
return (_("Videocard configuration"),vc+dc+ds+gl)
class MenuRun:
def jobCB(self,todo):
(label,text) = self.joblist.current().text(todo)
self.conlabel.setText(string.center(label,todo.xconfig_width))
self.context.setText(text)
self.base.draw()
self.screen.refresh()
def run(self,screen,todo):
self.screen = screen
self.base = GridFormHelp(screen, _("X Configuration"), "configurex", 1, 30)
self.base.add(Label(_("Select the item that you would like to configure from the list below.")),0,0)
self.joblist = Listbox(4,scroll = 0,returnExit = 1)
self.joblist.append(_("Keyboard Selection"),keyboard_menu())
self.joblist.append(_("Mouse Configuration"),mouse_menu())
self.joblist.append(_("Monitor Configuration"),monitor_menu())
self.joblist.append(_("Videocard Configuration"),card_menu())
listgrid = Grid(1,2)
listgrid.setField(Label(_("Category")),0,0,padding = (0, 0, 0, 1))
listgrid.setField(self.joblist,0,1)
self.conlabel = Textbox(todo.xconfig_width,1,"")
self.context = Textbox(todo.xconfig_width,7,"")
contgrid = Grid(1,2)
contgrid.setField(self.conlabel,0,0,padding = (0, 0, 0, 1))
contgrid.setField(self.context,0,1)
middle = Grid(2,1)
middle.setField(listgrid,0,0,anchorTop=1)
middle.setField(contgrid,1,0,padding = (3, 0, 1, 0))
self.base.add(middle,0,1,padding = (0, 2, 0, 1))
but = ButtonBar(screen,[(_("Step configuration"),"stepm"),
(_("Save and Quit"),"saveq"),(_("Cancel"),"cancel")])
self.base.add(but,0,2)
self.joblist.setCallback(self.jobCB,todo)
self.jobCB(todo)
ret = INSTALL_OK
while(1):
rc = self.base.run()
if rc == self.joblist:
self.joblist.current().func(screen,todo,todo.conf)
self.jobCB(todo)
screen.refresh()
else:
press = but.buttonPressed(rc)
if press == "stepm":
ret = INSTALL_NOOP
break
elif press == "saveq":
break
elif press == "cancel":
ret = INSTALL_CANCEL
break
screen.popWindow()
screen.refresh()
return ret
class EndofXconfig:
def run(self):
if os.access("/tmp/XF86Config",os.R_OK):
commands.getstatusoutput("rm -rf /tmp/XF86Config")
if os.access("/tmp/XF86Config.test",os.R_OK):
commands.getstatusoutput("rm -rf /tmp/XF86Config.test")
if os.access("/tmp/XF86Config.bak",os.R_OK):
commands.getstatusoutput("rm -rf /tmp/XF86Config.bak")
if os.environ.has_key('HOME'):
filename = os.environ['HOME']+"/XF86Config.new"
if os.access(filename,os.R_OK):
cmd = "rm -rf "+filename
commands.getstatusoutput(cmd)
class MainRun:
def run(self,toolname = 'xconfig',installer = XRES_800x600_60Hz, lcd=0, vesa=0):
screen = SnackScreen()
screen.suspendCallback(self.debugSelf,screen)
signal.signal(signal.SIGINT,signal.SIG_IGN)
signal.signal(signal.SIGTSTP,signal.SIG_IGN)
todo = XconfigTodo(installer,lcd,vesa)
screen.drawRootText(0,0,todo.rootmsg)
setmode = 0
if not os.access("/tmp/.X0-lock", os.R_OK) and \
not os.environ.has_key('DISPLAY'):
setmode = setmode|XCMODE_INITIALSET
if os.access("/etc/X11/XF86Config",os.R_OK):
setmode = setmode|XCMODE_CONFIGURE
selectmode = WelcomeWindow().run(screen,toolname,setmode)
if setmode==0:
msg= _("Your X environment is very confused,So xconfig can not work on it!Please close your X Window and run \"xconfig\" again.")
ButtonChoiceWindow(screen,_("Bad X environment"),msg,[_("Ok")],60)
screen.finish()
return
if selectmode&XCMODE_INITIALSET and setmode&XCMODE_CONFIGURE:
commands.getstatusoutput("mv -f /etc/X11/XF86Config /etc/X11/XF86Config.save")
todo.conf = todo.x.readconfigfile(screen)
rc = INSTALL_NOOP
if os.access("/etc/X11/XF86Config",os.R_OK):
rc = MenuRun().run(screen,todo)
if rc == INSTALL_NOOP:
rc = StepRun().run(screen,todo)
if rc == INSTALL_OK:
todo.saveconfigfile()
SaveQuitWindow().run(screen,todo)
else:
if selectmode&XCMODE_INITIALSET and setmode&XCMODE_CONFIGURE:
commands.getstatusoutput("mv -f /etc/X11/XF86Config.save /etc/X11/XF86Config")
CancelWindow().run(screen,todo)
screen.finish()
def debugSelf(self,screen):
screen.suspend()
import pdb
try:
pdb.set_trace()
except:
sys.exit(-1)
screen.resume()
class AutoRun:
def run(self,installer = XRES_800x600_60Hz, lcd=0, vesa=0):
print _("Setting /etc/X11/XF86Config...")
todo = XconfigTodo(installer,lcd,vesa)
if os.access("/etc/X11/XF86Config",os.R_OK):
commands.getstatusoutput("mv -f /etc/X11/XF86Config /etc/X11/XF86Config.save")
KeyboardWindow(hideback=1,needcancel=0).autosetup(todo)
MouseWindow(hideback=1,needcancel=0).autosetup(todo)
MonitorWindow(hideback=1,needcancel=0).autosetup(todo)
XCCardWindow(hideback=1,needcancel=0).autosetup(todo)
print _("Complete.")
class PrintRun:
def run(self,installer = XRES_800x600_60Hz, lcd=0, vesa=0):
todo = XconfigTodo(installer,lcd,vesa)
if os.access("/etc/X11/XF86Config",os.R_OK):
print _("Reading /etc/X11/XF86Config...\n")
conf = todo.x.readconfigfile(None)
else:
print _("robing current hardware...")
conf=None
KeyboardWindow(hideback=1,needcancel=0).autosetup(todo,conf=conf,printonly=1)
MouseWindow(hideback=1,needcancel=0).autosetup(todo,conf=conf,printonly=1)
MonitorWindow(hideback=1,needcancel=0).autosetup(todo,conf=conf,printonly=1)
XCCardWindow(hideback=1,needcancel=0).autosetup(todo,conf=conf,printonly=1)
print "\n",_("Complete.")
if __name__ == "__main__":
import os
if os.geteuid() != 0:
print _("This program can only be run as root.\n")
sys.exit(0)
# needpkglist = [ 'XFree86', 'XFree86-libs' ]
# for pkg in needpkglist:
# cmd = "/bin/rpm -q --queryformat=%{NAME} " + pkg
# (rc,rcstr) = commands.getstatusoutput(cmd)
# if rc:
# print _("ackage '%s' cannot installed.") % pkg
# sys.exit(rc)
toolname = 'xconfig'
if len(sys.argv)>0:
argstr = sys.argv[0]
index = string.rfind(argstr,"/")
if index >= 0:
argstr = argstr[index+1:]
toolname = argstr
logname = '/var/tmp/' + toolname + '.log'
log.logFile = open(logname, "w")
errfd = os.open (logname, os.O_CREAT | os.O_WRONLY)
os.close(2)
os.dup2(errfd, 2)
os.close(errfd)
#if os.environ.has_key('LANG'):
# if os.environ['LANG'][:2] != 'zh':
# cat.setlangs (os.environ['LANG'][:2])
# else:
# cat.setlangs (os.environ['LANG'])
installer = XRES_800x600_60Hz
lcd = 0
vesa = 0
execmode = 'normal'
if len(sys.argv)>1:
inres = 0
for arg in sys.argv[1:]:
if inres:
if arg == 'VGA': installer = XRES_VGA
elif arg == '640x480': installer = XRES_640x480_60Hz
elif arg == '800x600': installer = XRES_800x600_60Hz
elif arg == '1024x768': installer = XRES_1024x768_60Hz
elif arg == '1280x1024': installer = XRES_1280x1024_60Hz
elif arg == '1024x480': installer = XRES_LCD_1024x480_864Hz
elif arg == '1024x512': installer = XRES_LCD_1024x512_88Hz
elif arg == '1280x600': installer = XRES_LCD_1280x600_60Hz
elif arg == '1400x1050': installer = XRES_LCD_1400x1050_60Hz
elif arg == '1600x1200': installer = XRES_LCD_1600x1200_592Hz
elif arg == '1280x768': installer = XRES_LCD_1280x768_60Hz
elif arg == '1024x600': installer = XRES_LCD_1024x600_58Hz
inres = 0
continue
if arg == '-?' or arg == '-h' or arg == '--help':
print _("Usage: %s [Option...]") % toolname
print _(" -?, -h, --help Print this help.")
print _(" -r, --res <resolution> resolution set.")
print _(" resolution = VGA,640x480,800x600,1024x768,1280x1024")
print _(" 1024x480,1024x512,1280x600,1400x1050")
print _(" 1600x1200,1280x768,1024x600")
print _(" --lcd for DVI LCD.")
print _(" --vesa force VESA mode.")
print _(" -a, --auto Auto setup.")
print _(" -p, --print Print current XF86Config value or probe value.\n")
sys.exit(0)
elif arg == '-a' or arg == '--auto':
execmode = 'auto'
elif arg == '-p' or arg == '--probe':
execmode = 'print'
elif arg == '-r' or arg == '--res':
inres = 1
elif arg == '--lcd':
lcd = 1
elif arg == '--vesa':
vesa = 1
else:
print _("Usage: %s [-?hapr]\n") % toolname
sys.exit(0)
if execmode == 'normal':
MainRun().run(toolname,installer,lcd,vesa)
elif execmode == 'auto':
AutoRun().run(installer,lcd,vesa)
elif execmode == 'print':
PrintRun().run(installer,lcd,vesa)
EndofXconfig().run()
log.logFile.close()
sys.exit(0) |
|