#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright (C) 2005-2008 TUBITAK/UEKAE
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# Please read the COPYING file.

import os
import sys
import optparse

import dbus
import zorg
import zorg.probe
from zorg.consts import package_sep
from zorg.utils import *

zorg_info = " Xorg AutoConfiguration tool"

class ComarLink:
    def __init__(self):
        self.bus = None
        self.iface = None

    def __getattr__(self, method):
        if not self.iface:
            self._connect()

        return getattr(self.iface, method)

    def _connect(self):
        if os.getuid() != 0:
            print "You must be root to use this tool."
            sys.exit(1)

        self.bus = dbus.SystemBus()
        object = self.bus.get_object("tr.org.pardus.comar", "/package/zorg", introspect=False)
        self.iface = dbus.Interface(object, "tr.org.pardus.comar.Xorg.Display")

link = ComarLink()

def safe():
    if link.safeConfig():
        print "Initialized a safe configuration using VESA driver."
    else:
        print "Failed to create a safe configuration with VESA driver."

def probe(opts):
    if force or not xisrunning():
        if link.initialConfig():
            print "Created an initial configuration for your video device."
        else:
            print "An error occured while creating an initial configuration."
    else:
        print "Not probing since X server is running."

def setDriver(driver):
    # shortcuts for packages
    shortcuts = {
            "fglrx":        "fglrx/ati-drivers",
            "nvidia-old":   "nvidia/nvidia-drivers-old",
            "nvidia":       "nvidia/nvidia-drivers",
            "nvidia-new":   "nvidia/nvidia-drivers-new"
            }
    if shortcuts.has_key(driver):
        driver = shortcuts[driver]

    if package_sep in driver:
        drv, pkg = driver.split(package_sep, 1)
        if pkg.replace("-", "_") not in zorg.probe.listDriverPackages():
            print "Package is not installed: %s" % pkg
            sys.exit(1)
    else:
        if not zorg.probe.driverExists(driver):
            print "Driver not found: %s" % driver
            sys.exit(1)

    args = {"driver": driver}
    link.setPendingConfig(args)

    if force or not xisrunning():
        link.applyPendingConfig()
        print "Driver changed to %s." % driver
    else:
        print "Changes will be applied when you restart your X server."

force = False

if __name__ == "__main__":
    parser = optparse.OptionParser(description = "%s version %s"
                                    % (zorg_info, zorg.versionString()))

    parser.add_option("-s", "--safe", action="store_true",
        dest="safe", default=False,
        help="setup VESA 800x600 config without probing hardware")

    parser.add_option("-p", "--probe", action="store_true",
        dest="probe", default=False,
        help="force probing all devices, even if xorg.conf exists")

    parser.add_option("-d", "--driver", action="store", type="string",
        dest="driver", default=None, metavar="DRIVER[%sPACKAGE]" % package_sep,
        help="set video card driver to DRIVER")

    parser.add_option("-f", "--force", action="store_true",
        dest="force", default=False,
        help="force probing even if the X server is running")

    parser.add_option("", "--remove-pending", action="store_true",
        dest="removePending", default=False,
        help="remove pending configuration data")

    parser.add_option("-k", "--keymap", action="store", type="string",
        dest="keymap", default=None, metavar="LAYOUT[/VARIANT]",
        help="changes keyboard map")

    opts, args = parser.parse_args()
    force = opts.force

    if opts.safe:
        safe()

    elif opts.probe:
        probe(opts)

    elif opts.driver:
        setDriver(opts.driver)

    elif opts.removePending:
        link.removePendingConfig()
        print "Pending configurations removed."

    elif opts.keymap:
        keymap = opts.keymap.split("/", 1)
        link.setKeymap(*keymap)

    else:
        parser.print_help()
