#!/usr/bin/python3
import gettext
import gi
import os
import subprocess
import sys

gi.require_version('Gtk', '3.0')
gi.require_version('XApp', '1.0')
from gi.repository import Gtk, XApp

# i18n
gettext.install("nvidia-prime-applet", "/usr/share/locale")

def get_output(commands):
    process = subprocess.Popen(commands, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
    out, err = process.communicate()
    return out.decode('utf-8').strip()

class Tray:
    def __init__(self):

        self.icon = XApp.StatusIcon()
        self.icon.set_name("nvidia-prime")
        self.icon.connect("activate", self.on_activate)

        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()
        self.icon.set_secondary_menu(menu)

        active_gpu = get_output(["prime-select", "query"])
        if (active_gpu == "nvidia"):
            self.icon.set_icon_name("prime-tray-nvidia-symbolic")
            self.icon.set_tooltip_text(_("Active graphics card: NVIDIA"))
        elif (active_gpu == "intel"):
            self.icon.set_icon_name("prime-tray-intel-symbolic")
            self.icon.set_tooltip_text(_("Active graphics card: Intel"))
        else:
            self.icon.set_icon_name("dialog-error-symbolic")
            self.icon.set_tooltip_text(_("Active graphics card: " + active_gpu))

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

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

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

if __name__ == "__main__":

    # If nvidia-prime isn't installed or isn't supported, exit cleanly
    if not (os.path.exists("/usr/bin/nvidia-settings") and os.path.exists("/usr/bin/prime-select")):
        sys.exit(0)

    output = get_output(["prime-supported"])
    if output != "yes":
        sys.exit(0)

    Tray()
    Gtk.main()
