#!/usr/bin/env python3

import gettext
import os
import subprocess
import sys
from gi.repository import Gtk, Gdk

# i18n
gettext.install("mate-optimus", "/usr/share/locale")

class Tray:
    def __init__(self):

        self.icon = Gtk.StatusIcon()
        self.icon.set_title("mate-optimus")
        self.icon.connect("popup-menu", self.on_popup_menu)
        self.icon.connect("activate", self.on_activate)

        process = subprocess.Popen(['prime-select', 'query'], stdout=subprocess.PIPE)
        out, err = process.communicate()
        active_gpu = out.decode('utf-8')

        if ('nvidia' in active_gpu):
            self.icon.set_from_icon_name("optimus-tray-nvidia")
            self.icon.set_tooltip_text(_("Active graphics card: NVIDIA"))
        elif ('intel' in active_gpu):
            self.icon.set_from_icon_name("optimus-tray-intel")
            self.icon.set_tooltip_text(_("Active graphics card: Intel"))
        else:
            self.icon.set_from_icon_name("dialog-error")
            self.icon.set_tooltip_text(_("Active graphics card: " + active_gpu))

    def on_activate(self, icon, data=None):
        self.run_nvidia_settings();

    def run_nvidia_settings (self, arg=None):
        subprocess.Popen(["nvidia-settings", "-page", "PRIME Profiles"])

    def on_popup_menu(self, icon, button, time, data = None):
        menu = Gtk.Menu()

        item = Gtk.MenuItem(label=_("NVIDIA Settings"))
        item.connect("activate", self.run_nvidia_settings)
        menu.append(item)

        menu.append(Gtk.SeparatorMenuItem())

        item = Gtk.MenuItem(label=_("Quit"))
        item.connect("activate", self.terminate)
        menu.append(item)

        menu.show_all()

        device = Gdk.Display.get_default().get_device_manager().get_client_pointer()
        menu.popup_for_device(device, None, None, lambda w,x: icon.position_menu(menu, icon), icon, button, time)

    def terminate(self, window = None, data = None):
        Gtk.main_quit()

if __name__ == "__main__":
    # If NVIDIA Prime is not installed or isn't supported then exit.
    if not (os.path.exists("/usr/bin/nvidia-settings") and os.path.exists("/usr/bin/prime-select")):
        sys.exit(0)

    devnull = open(os.devnull, 'wb')
    process = subprocess.Popen(['prime-supported'], stdout=subprocess.PIPE, stderr=devnull)
    out, err = process.communicate()
    devnull.close()
    prime_supported = out.decode('utf-8')
    if 'yes' not in prime_supported:
        sys.exit(0)

    Tray()
    Gtk.main()
