OBSD4* : wiki

Gestion de l'icône de volume dans la barre de notifications

Petit script pour avoir une icône dans la barre de notifications et régler le volume sonore. Il est destiné aux environnements minimalistes comme fluxbox, et ne dépend donc de rien en particulier sauf python et gi.

Il est tout vilain, n'hésitez pas à l'améliorer ;)

#!/usr/local/bin/python3
import os
import sys
from gi import require_version
require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk

name="Volume"

def get_lvl():
    cmd = "mixerctl -n outputs.master"
    result = os.popen(cmd)
    result = result.readline().split(",")[0]
    lvl= int(int(result)/255*100)
    return lvl

def get_mute():
    cmd = "mixerctl -n outputs.master.mute"
    result = os.popen(cmd)
    result = result.readline().strip()
    return(result)

class Menu:

    def destroy(self, widget, data=None):
        Gtk.main_quit()

    def set_icon(self):
        if get_mute() == "on":
            self.tray.set_from_icon_name("stock_volume-mute")
        else:
            lvl = get_lvl()
            if lvl == 0:
                self.tray.set_from_icon_name("stock_volume-0")
            elif lvl < 20:
                self.tray.set_from_icon_name("stock_volume-min")
            elif lvl < 70:
                self.tray.set_from_icon_name("stock_volume-med")
            elif lvl > 70:
                self.tray.set_from_icon_name("stock_volume-max")



    def __init__(self):
        get_mute()
        self.tray = Gtk.StatusIcon()
        self.set_icon()
        self.tray.connect('popup-menu', self.on_right_click)
        self.tray.connect('activate', self.on_left_click)
        self.tray.connect('scroll_event', self.on_scroll)
        self.tray.set_tooltip_text('Volume : {}%'.format(get_lvl()))

    def on_scroll(self, widget, event):
        if event.direction == Gdk.ScrollDirection.DOWN:
            os.system("mixerctl outputs.master=-10")
        elif event.direction == Gdk.ScrollDirection.UP:
            os.system("mixerctl outputs.master=+10")
        self.set_icon()

    def on_left_click(self, event):
        os.system("mixerctl outputs.master.mute=toggle")
        self.set_icon()

    def on_right_click(self, icon, button, time):
        # Quit-menu item
        self.menu = Gtk.Menu()
        box = Gtk.Box()
        box.set_spacing(10)

        img = Gtk.Image()
        img.set_from_stock(Gtk.STOCK_CANCEL, Gtk.IconSize.MENU)
        label = Gtk.Label("Quit")
        box.add(img)
        box.add(label)
        quit = Gtk.MenuItem()
        quit.add(box)
        quit.connect("activate", Gtk.main_quit)
        self.menu.append(quit)

        self.menu.show_all()

        self.menu.popup(None, None, None, self.tray, button, time)

    def main(self):
        Gtk.main()

if __name__ == "__main__":
     app = Menu()
     app.main()