#!/usr/bin/env python
from gi.repository import Gtk, Gdk, GdkX11, Gio, GLib
import sys
import subprocess
import shlex
import argparse
import syslog

parser = argparse.ArgumentParser(description="XScreenSaver chainloader")
parser.add_argument("--standalone", action="store_true", help="run as standalone window instead of embedded in screensaver", dest="standalone")
parser.add_argument("--dir", action="store", help="directory to search for xscreensaver hacks")
parser.add_argument("--hack", action="store", help="xscreensaver hack to load")
args = parser.parse_args()

hackCalled = False

def loadHack (plug, data):
    global hackCalled

    if hackCalled:
        return
    xid = str(plug.get_window().get_xid())

    directories = ["/usr/lib/xscreensaver/",
                   "/usr/libexec/xscreensaver/",
                   "/usr/local/lib/xscreensaver/",
                   "/usr/local/libexec/xscreensaver/"]
    if args.dir:
        directories.append(args.dir)

    if (args.hack):
        hack = args.hack
    else:
        settings = Gio.Settings.new("org.cinnamon.desktop.screensaver")
        hack = settings.get_string("xscreensaver-hack")

    success = False

    for direc in directories:
        try:
            path = shlex.split(direc + hack)
            path.append("-window-id")
            path.append(xid)
            GLib.spawn_async(path)
            success = True
            hackCalled = True
            break;
        except:
            pass

    if not success:
        syslog.syslog("cinnamon-screensaver: Screensaver '%s' not found" % hack)
        color = Gdk.RGBA()
        color.red = 0
        color.green = 0
        color.blue = 0
        color.alpha = 1
        label = Gtk.Label()
        label.override_background_color(Gtk.StateFlags.NORMAL, color)
        label.show()
        plug.add(label)

if __name__ == "__main__":
    if args.standalone:
        plug = Gtk.Window()
    else:
        plug = Gtk.Plug()

    plug.show_all()
    plug.connect("delete-event", Gtk.main_quit)
    xid = str(plug.get_window().get_xid())
    print("WINDOW ID=" + xid)
    sys.stdout.flush()

    plug.connect("draw", loadHack)
    Gtk.main()
