| #!/usr/bin/env python |
| |
| # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Makes changes to mounted Chromium OS image to allow it to run with VMs |
| |
| This script changes two files within the Chromium OS image to let the image |
| work with VMs, particularly QEMU |
| |
| Currently this script does the following, |
| 1.) Modify the post install script to remove EFI fixup section; the VM's we |
| support don't have EFI support anyway and this section of the script needs |
| access to the actual device drives |
| |
| 2.) For QEMU/KVM, we change the xorg.conf to remove mouse support and instead |
| change it to complete tablet support. This is done to provide better mouse |
| response in the VM since tablets work of absolute coordinates while the mouse |
| works of relative. In a screen that doesn't support a mouse grab (e.g., VNC), |
| relative coordinates can cause the mouse to be flaky |
| |
| """ |
| |
| from optparse import OptionParser |
| import os |
| import stat |
| import sys |
| |
| USAGE = "usage: %prog --mounted_dir=directory --enable_tablet=[true]" |
| |
| INPUT_SECTION_MARKER = r'Section "InputDevice"' |
| SECTION_END_MARKER = r'EndSection' |
| |
| MOUSE_SECTION_IDENTIFIERS = [] |
| MOUSE_SECTION_IDENTIFIERS += ['Identifier "Mouse'] |
| MOUSE_SECTION_IDENTIFIERS += ['Identifier "USBMouse'] |
| |
| REPLACE_USB_MOUSE_PAIR = ('InputDevice "USBMouse" "AlwaysCore"', '') |
| XORG_CONF_FILENAME = os.path.join('etc', 'X11', 'xorg.conf') |
| |
| |
| TABLET_DEVICE_CONFIG = """ |
| Section "InputDevice" |
| Identifier "Mouse1" |
| Driver "evdev" |
| Option "Device" "/dev/input/event2" |
| Option "CorePointer" "true" |
| EndSection |
| """ |
| |
| |
| # Modify the xorg.conf file to remove all mouse sections and replace it |
| # with ours containing the tablet - note: when running under QEMU, you |
| # *need* to specify the -usbdevice tablet option to get the mouse to work |
| def FixXorgConf(mount_point): |
| xorg_conf_filename = os.path.join(mount_point, XORG_CONF_FILENAME) |
| f = open(xorg_conf_filename, 'r') |
| xorg_conf = f.read() |
| f.close() |
| |
| more_sections = 1 |
| last_found = 0 |
| while (more_sections): |
| # Find the input section. |
| m1 = xorg_conf.find(INPUT_SECTION_MARKER, last_found) |
| if m1 > -1: |
| m2 = xorg_conf.find(SECTION_END_MARKER, m1) |
| m2 += len(SECTION_END_MARKER) |
| # Make sure the next iteration doesn't rinse/repeat. |
| last_found = m2 |
| # Check if this is a mouse section. |
| for ident in MOUSE_SECTION_IDENTIFIERS: |
| if xorg_conf.find(ident, m1, m2) != -1: |
| xorg_conf = xorg_conf[0:m1] + xorg_conf[m2:] |
| last_found -= (m2-m1) |
| break |
| else: |
| more_sections = 0 |
| |
| xorg_conf = xorg_conf[0:last_found] + TABLET_DEVICE_CONFIG + \ |
| xorg_conf[last_found:] |
| |
| # Replace UsbMouse with Tablet. |
| xorg_conf = xorg_conf.replace(REPLACE_USB_MOUSE_PAIR[0], |
| REPLACE_USB_MOUSE_PAIR[1]) |
| |
| # Write the file back out. |
| f = open(xorg_conf_filename, 'w') |
| f.write(xorg_conf) |
| f.close() |
| |
| def main(): |
| parser = OptionParser(USAGE) |
| parser.add_option('--mounted_dir', dest='mounted_dir', |
| help='directory where the Chromium OS image is mounted') |
| parser.add_option('--enable_tablet', dest='enable_tablet', |
| default="true", |
| help='fixup image for qemu') |
| (options, args) = parser.parse_args() |
| |
| if not options.mounted_dir: |
| parser.error("Please specify the mount point for the Chromium OS image"); |
| if options.enable_tablet not in ('true', 'false'): |
| parser.error("Please specify either true or false for --enable_tablet") |
| |
| if (options.enable_tablet == 'true'): |
| FixXorgConf(options.mounted_dir) |
| |
| |
| if __name__ == '__main__': |
| main() |