122 lines
3.6 KiB
Python
Executable File
122 lines
3.6 KiB
Python
Executable File
#! /usr/bin/python3
|
|
|
|
from __future__ import print_function
|
|
from __future__ import division
|
|
from __future__ import absolute_import
|
|
from __future__ import unicode_literals
|
|
|
|
import sys
|
|
import os.path
|
|
import os
|
|
import signal
|
|
import dbus
|
|
from dbus.mainloop.glib import DBusGMainLoop
|
|
from blueman.Constants import *
|
|
import gi
|
|
gi.require_version("Gtk", "3.0")
|
|
gi.require_version('Notify', '0.7')
|
|
from gi.repository import Gtk
|
|
from gi.repository import Gdk
|
|
from gi.repository import GObject
|
|
from gi.repository import Notify
|
|
try: import __builtin__ as builtins
|
|
except ImportError: import builtins
|
|
|
|
DBusGMainLoop(set_as_default=True)
|
|
|
|
#support running uninstalled
|
|
_dirname = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
|
|
if os.path.exists(os.path.join(_dirname, "CHANGELOG.md")):
|
|
sys.path.insert(0, _dirname)
|
|
|
|
from blueman.Functions import *
|
|
|
|
from blueman.main.DbusService import DbusService
|
|
|
|
import blueman.plugins.applet
|
|
from blueman.plugins.AppletPlugin import AppletPlugin
|
|
from blueman.plugins.BasePlugin import BasePlugin
|
|
|
|
import blueman.bluez as Bluez
|
|
|
|
from blueman.main.SignalTracker import SignalTracker
|
|
|
|
from blueman.main.PluginManager import PersistentPluginManager
|
|
|
|
# Workaround introspection bug, gnome bug 622084
|
|
signal.signal(signal.SIGINT, signal.SIG_DFL)
|
|
signal.signal(signal.SIGTERM, signal.SIG_DFL)
|
|
|
|
class BluemanApplet(object):
|
|
def __init__(self):
|
|
setup_icon_path()
|
|
if not Notify.init("Blueman"):
|
|
dprint("Error: Failed to initialize libnotify")
|
|
|
|
check_single_instance("blueman-applet")
|
|
|
|
self.Manager = None
|
|
self.DbusSvc = DbusService("org.blueman.Applet", "/")
|
|
self.Signals = SignalTracker()
|
|
|
|
self.Plugins = PersistentPluginManager(AppletPlugin, blueman.plugins.applet, self)
|
|
self.Plugins.Load()
|
|
|
|
self.Plugins.Run("on_plugins_loaded")
|
|
|
|
self.bus = dbus.SystemBus()
|
|
self.bus.watch_name_owner("org.bluez", self.on_dbus_name_owner_change)
|
|
|
|
Bluez.Adapter().handle_signal(self.on_adapter_property_changed, 'PropertyChanged', path_keyword='path')
|
|
|
|
Gtk.main()
|
|
|
|
|
|
def manager_init(self):
|
|
try:
|
|
|
|
self.Signals.DisconnectAll()
|
|
self.Manager = Bluez.Manager()
|
|
self.Plugins.Run("on_manager_state_changed", True)
|
|
|
|
self.Signals.Handle("bluez", self.Manager, self.on_adapter_removed, "AdapterRemoved")
|
|
self.Signals.Handle("bluez", self.Manager, self.on_adapter_added, "AdapterAdded")
|
|
|
|
except dbus.exceptions.DBusException as e:
|
|
dprint(e)
|
|
self.manager_deinit()
|
|
dprint("Bluez DBus API not available. Listening for DBus name ownership changes")
|
|
|
|
def manager_deinit(self):
|
|
self.Signals.DisconnectAll()
|
|
self.Manager = None
|
|
self.Plugins.Run("on_manager_state_changed", False)
|
|
|
|
def on_dbus_name_owner_change(self, owner):
|
|
dprint("org.bluez owner changed to", owner)
|
|
if owner == "":
|
|
self.manager_deinit()
|
|
elif self.Manager is None:
|
|
self.manager_init()
|
|
|
|
def on_adapter_property_changed(self, key, value, path):
|
|
self.Plugins.Run("on_adapter_property_changed", path, key, value)
|
|
|
|
def on_adapter_added(self, path):
|
|
dprint("Adapter added ", path)
|
|
|
|
def on_activate():
|
|
dprint("Adapter activated")
|
|
self.Plugins.Run("on_adapter_added", path)
|
|
|
|
adapter = Bluez.Adapter(path)
|
|
wait_for_adapter(adapter, on_activate)
|
|
|
|
def on_adapter_removed(self, path):
|
|
dprint("Adapter removed ", path)
|
|
self.Plugins.Run("on_adapter_removed", path)
|
|
|
|
|
|
set_proc_title()
|
|
BluemanApplet()
|