def check_bluetooth_status(message, exitfunc, *args, **kwargs): try: applet = AppletService() except: print("Blueman applet needs to be running") exitfunc() if "PowerManager" in applet.QueryPlugins(): if not applet.GetBluetoothStatus(): d = Gtk.MessageDialog(None, type=Gtk.MessageType.ERROR) d.props.icon_name = "blueman" d.props.text = _("Bluetooth Turned Off") d.props.secondary_text = message d.add_button("Exit", Gtk.ResponseType.NO) d.add_button(_("Enable Bluetooth"), Gtk.ResponseType.YES) resp = d.run() d.destroy() if resp != Gtk.ResponseType.YES: exitfunc() else: applet.SetBluetoothStatus('(b)', True, **kwargs) if not applet.GetBluetoothStatus(): print('Failed to enable bluetooth') exitfunc()
def on_load(self, container): self.Builder = Gtk.Builder() self.Builder.set_translation_domain("blueman") self.Builder.add_from_file(UI_PATH + "/services-transfer.ui") self.widget = self.Builder.get_object("transfer") self.ignored_keys = [] container.pack_start(self.widget, True, True, 0) a = AppletService() if "TransferService" in a.QueryPlugins(): self._setup_transfer() else: self.widget.props.sensitive = False self.widget.props.tooltip_text = _("Applet's transfer service plugin is disabled") return True
def check_bluetooth_status(message, exitfunc, *args, **kwargs): try: applet = AppletService() except: print "Blueman applet needs to be running" exitfunc() if "PowerManager" in applet.QueryPlugins(): if not applet.GetBluetoothStatus(): d = gtk.MessageDialog(None, type=gtk.MESSAGE_ERROR) d.props.icon_name = "blueman" d.props.text = _("Bluetooth Turned Off") d.props.secondary_text = message d.add_button(gtk.STOCK_QUIT, gtk.RESPONSE_NO) d.add_button(_("Enable Bluetooth"), gtk.RESPONSE_YES) resp = d.run() d.destroy() if resp != gtk.RESPONSE_YES: exitfunc() else: applet.SetBluetoothStatus(True, *args, **kwargs)
def on_request_menu_items(self, manager_menu, device): items = [] appl = AppletService() self.has_dun = False serial_items = [] def add_menu_item(manager_menu, service): if service.connected: item = create_menuitem(service.name, get_x_icon(service.icon, 16)) item.connect("activate", manager_menu.on_disconnect, service) items.append((item, service.priority + 100)) else: item = create_menuitem(service.name, get_icon(service.icon, 16)) if service.description: item.props.tooltip_text = service.description item.connect("activate", manager_menu.on_connect, service) if service.group == 'serial': serial_items.append(item) if isinstance(service, DialupNetwork): self.has_dun = True else: items.append((item, service.priority)) item.show() for service in device.get_services(): try: add_menu_item(manager_menu, service) except Exception as e: dprint("Failed to load service %s" % service.name) traceback.print_exc() continue if service.group == 'serial': for dev in rfcomm_list(): if dev["dst"] == device.Address and dev["state"] == "connected": devname = _("Serial Port %s") % "rfcomm%d" % dev["id"] item = create_menuitem(devname, get_x_icon("modem", 16)) item.connect("activate", manager_menu.on_disconnect, service, dev["id"]) items.append((item, 120)) item.show() if service.group == 'network' and service.connected: if "DhcpClient" in appl.QueryPlugins(): def renew(x): appl.DhcpClient(Network(device.get_object_path()).get_properties()["Interface"]) item = create_menuitem(_("Renew IP Address"), get_icon("view-refresh", 16)) item.connect("activate", renew) item.show() items.append((item, 201)) if self.has_dun and "PPPSupport" in appl.QueryPlugins(): def open_settings(i, device): from blueman.gui.GsmSettings import GsmSettings d = GsmSettings(device.Address) d.run() d.destroy() item = Gtk.SeparatorMenuItem() item.show() serial_items.append(item) item = create_menuitem(_("Dialup Settings"), get_icon("gtk-preferences", 16)) serial_items.append(item) item.show() item.connect("activate", open_settings, device) if len(serial_items) > 1: sub = Gtk.Menu() sub.show() item = create_menuitem(_("Serial Ports"), get_icon("modem", 16)) item.set_submenu(sub) item.show() items.append((item, 90)) for item in serial_items: sub.append(item) else: for item in serial_items: items.append((item, 80)) return items
def setup_network(self): self.Config = Config("org.blueman.network") nap_enable = self.Builder.get_object("nap-enable") r_dnsmasq = self.Builder.get_object("r_dnsmasq") r_dhcpd = self.Builder.get_object("r_dhcpd") r_udhcpd = self.Builder.get_object("r_udhcpd") net_ip = self.Builder.get_object("net_ip") rb_nm = self.Builder.get_object("rb_nm") rb_blueman = self.Builder.get_object("rb_blueman") rb_dun_nm = self.Builder.get_object("rb_dun_nm") rb_dun_blueman = self.Builder.get_object("rb_dun_blueman") nap_frame = self.Builder.get_object("nap_frame") warning = self.Builder.get_object("warning") if not self.Config["nap-enable"]: nap_frame.props.sensitive = False nc = NetConf.get_default() if nc.ip4_address is not None: net_ip.props.text = inet_ntoa(nc.ip4_address) nap_enable.props.active = True else: net_ip.props.text = "10.%d.%d.1" % (randint(0, 255), randint( 0, 255)) if nc.get_dhcp_handler() is None: nap_frame.props.sensitive = False nap_enable.props.active = False r_dnsmasq.props.active = True self.Config["nap-enable"] = False have_dhcpd = have("dhcpd3") or have("dhcpd") have_dnsmasq = have("dnsmasq") have_udhcpd = have("udhcpd") if nc.get_dhcp_handler() == DnsMasqHandler and have_dnsmasq: r_dnsmasq.props.active = True elif nc.get_dhcp_handler() == DhcpdHandler and have_dhcpd: r_dhcpd.props.active = True elif nc.get_dhcp_handler() == UdhcpdHandler and have_udhcpd: r_udhcpd.props.active = True else: r_dnsmasq.props.active = True if not have_dnsmasq and not have_dhcpd and not have_udhcpd: nap_frame.props.sensitive = False warning.props.visible = True warning.props.sensitive = True nap_enable.props.sensitive = False self.Config["nap-enable"] = False if not have_dnsmasq: r_dnsmasq.props.sensitive = False r_dnsmasq.props.active = False if not have_dhcpd: r_dhcpd.props.sensitive = False r_dhcpd.props.active = False if not have_udhcpd: r_udhcpd.props.sensitive = False r_udhcpd.props.active = False r_dnsmasq.connect("toggled", lambda x: self.option_changed_notify("dnsmasq")) r_dhcpd.connect("toggled", lambda x: self.option_changed_notify("dhcpd")) r_udhcpd.connect("toggled", lambda x: self.option_changed_notify("udhcpd")) net_ip.connect("changed", lambda x: self.option_changed_notify("ip", False)) nap_enable.connect("toggled", lambda x: self.option_changed_notify("nap_enable")) self.Config.bind_to_widget("nap-enable", nap_enable, "active", Gio.SettingsBindFlags.GET) nap_enable.bind_property("active", nap_frame, "sensitive", 0) applet = AppletService() avail_plugins = applet.QueryAvailablePlugins() active_plugins = applet.QueryPlugins() def dun_support_toggled(rb, x): if rb.props.active and x == "nm": applet.SetPluginConfig('(sb)', "PPPSupport", False) applet.SetPluginConfig('(sb)', "NMDUNSupport", True) elif rb.props.active and x == "blueman": applet.SetPluginConfig('(sb)', "NMDUNSupport", False) applet.SetPluginConfig('(sb)', "PPPSupport", True) def pan_support_toggled(rb, x): if rb.props.active and x == "nm": applet.SetPluginConfig('(sb)', "DhcpClient", False) applet.SetPluginConfig('(sb)', "NMPANSupport", True) elif rb.props.active and x == "blueman": applet.SetPluginConfig('(sb)', "NMPANSupport", False) applet.SetPluginConfig('(sb)', "DhcpClient", True) if "PPPSupport" in active_plugins: rb_dun_blueman.props.active = True if "NMDUNSupport" in avail_plugins: rb_dun_nm.props.sensitive = True else: rb_dun_nm.props.sensitive = False rb_dun_nm.props.tooltip_text = _( "Not currently supported with this setup") if "DhcpClient" in active_plugins: rb_blueman.props.active = True if "NMPANSupport" in avail_plugins: rb_nm.props.sensitive = True else: rb_nm.props.sensitive = False rb_nm.props.tooltip_text = _( "Not currently supported with this setup") if "NMPANSupport" in active_plugins: rb_nm.props.active = True if "NMDUNSupport" in active_plugins: rb_dun_nm.props.active = True rb_nm.connect("toggled", pan_support_toggled, "nm") rb_blueman.connect("toggled", pan_support_toggled, "blueman") rb_dun_nm.connect("toggled", dun_support_toggled, "nm") rb_dun_blueman.connect("toggled", dun_support_toggled, "blueman")
def setup_network(self): self.Config = Config("org.blueman.network") gn_enable = self.Builder.get_object("gn-enable") # latest bluez does not support GN, apparently gn_enable.props.visible = False nap_enable = self.Builder.get_object("nap-enable") r_dnsmasq = self.Builder.get_object("r_dnsmasq") r_dhcpd = self.Builder.get_object("r_dhcpd") net_ip = self.Builder.get_object("net_ip") net_nat = self.Builder.get_object("net_nat") rb_nm = self.Builder.get_object("rb_nm") rb_blueman = self.Builder.get_object("rb_blueman") rb_dun_nm = self.Builder.get_object("rb_dun_nm") rb_dun_blueman = self.Builder.get_object("rb_dun_blueman") nap_frame = self.Builder.get_object("nap_frame") warning = self.Builder.get_object("warning") rb_blueman.props.active = self.Config["dhcp-client"] if not self.Config["nap-enable"]: nap_frame.props.sensitive = False nc = NetConf.get_default() if nc.ip4_address != None: net_ip.props.text = inet_ntoa(nc.ip4_address) else: net_ip.props.text = "10.%d.%d.1" % (randint(0, 255), randint( 0, 255)) #if ns["masq"] != 0: # net_nat.props.active = ns["masq"] if nc.get_dhcp_handler() == None: nap_frame.props.sensitive = False nap_enable.props.active = False else: if nc.get_dhcp_handler() == DnsMasqHandler: r_dnsmasq.props.active = True else: r_dhcpd.props.active = True if not have("dnsmasq") and not have("dhcpd3") and not have("dhcpd"): nap_frame.props.sensitive = False warning.props.visible = True warning.props.sensitive = True nap_enable.props.sensitive = False if not have("dnsmasq"): r_dnsmasq.props.sensitive = False r_dnsmasq.props.active = False r_dhcpd.props.active = True if not have("dhcpd3") and not have("dhcpd"): r_dhcpd.props.sensitive = False r_dhcpd.props.active = False r_dnsmasq.props.active = True r_dnsmasq.connect("toggled", lambda x: self.option_changed_notify("dnsmasq")) net_ip.connect("changed", lambda x: self.option_changed_notify("ip", False)) self.Config.bind_to_widget("nat", net_nat, "active") self.Config.bind_to_widget("gn-enable", gn_enable, "active") self.Config.bind_to_widget("nap-enable", nap_frame, "sensitive") self.Config.bind_to_widget("nap-enable", nap_enable, "active") applet = AppletService() avail_plugins = applet.QueryAvailablePlugins() active_plugins = applet.QueryPlugins() def dun_support_toggled(rb, x): if rb.props.active and x == "nm": applet.SetPluginConfig("PPPSupport", False) applet.SetPluginConfig("NMDUNSupport", True) elif rb.props.active and x == "blueman": applet.SetPluginConfig("NMDUNSupport", False) applet.SetPluginConfig("PPPSupport", True) def pan_support_toggled(rb, x): if rb.props.active and x == "nm": applet.SetPluginConfig("DhcpClient", False) applet.SetPluginConfig("NMPANSupport", True) elif rb.props.active and x == "blueman": applet.SetPluginConfig("NMPANSupport", False) applet.SetPluginConfig("DhcpClient", True) if "PPPSupport" in active_plugins: rb_dun_blueman.props.active = True if "NMDUNSupport" in avail_plugins: rb_dun_nm.props.sensitive = True else: rb_dun_nm.props.sensitive = False rb_dun_nm.props.tooltip_text = _( "Not currently supported with this setup") if "NMPANSupport" in avail_plugins: rb_nm.props.sensitive = True else: rb_nm.props.sensitive = False rb_nm.props.tooltip_text = _( "Not currently supported with this setup") if "NMPANSupport" in active_plugins: rb_nm.props.active = True if "NMDUNSupport" in active_plugins: rb_dun_nm.props.active = True rb_nm.connect("toggled", pan_support_toggled, "nm") rb_blueman.connect("toggled", pan_support_toggled, "blueman") rb_dun_nm.connect("toggled", dun_support_toggled, "nm") rb_dun_blueman.connect("toggled", dun_support_toggled, "blueman")
def on_request_menu_items(self, manager_menu, device): if BlueZInterface.get_interface_version()[0] < 5: return self.on_request_menu_items_bluez4(manager_menu, device) items = [] uuids = device.UUIDs appl = AppletService() uuids16 = [uuid128_to_uuid16(uuid) for uuid in uuids] if set(uuids16) & set(self.connectable_uuids): # FIXME: This should only be done once! manager_menu.Signals.Handle("bluez", device, manager_menu.service_property_changed, "PropertyChanged") if device.get_properties()['Connected']: # FIXME: More generic icon item = create_menuitem(_("_Disconnect"), get_x_icon("mouse", 16)) manager_menu.Signals.Handle("gobject", item, "activate", manager_menu.on_disconnect, device) items.append((item, 100)) else: # FIXME: More generic icon item = create_menuitem(_("_Connect"), get_icon("mouse", 16)) manager_menu.Signals.Handle("gobject", item, "activate", manager_menu.on_connect, device) items.append((item, 1)) item.show() for name, service in device.Services.items(): if name == "network": manager_menu.Signals.Handle( "bluez", service, manager_menu.service_property_changed, "PropertyChanged") sprops = service.get_properties() if not sprops["Connected"]: for uuid in uuids: uuid16 = uuid128_to_uuid16(uuid) if uuid16 == NAP_SVCLASS_ID or uuid16 == GN_SVCLASS_ID: label = _("Group Network" ) if uuid16 == GN_SVCLASS_ID else _( "Network Access _Point") item = create_menuitem( label, get_icon("network-wireless", 16)) manager_menu.Signals.Handle( "gobject", item, "activate", manager_menu.on_connect, device, name, uuid) item.show() items.append((item, 80)) else: item = create_menuitem(_("Network"), get_x_icon("network-wireless", 16)) manager_menu.Signals.Handle("gobject", item, "activate", manager_menu.on_disconnect, device, name) item.show() items.append((item, 101)) if "DhcpClient" in appl.QueryPlugins(): def renew(x): appl.DhcpClient(sprops["Interface"]) item = create_menuitem(_("Renew IP Address"), get_icon("view-refresh", 16)) manager_menu.Signals.Handle("gobject", item, "activate", renew) item.show() items.append((item, 201)) return items
def on_request_menu_items_bluez4(self, manager_menu, device): # BlueZ 4 only items = [] uuids = device.UUIDs appl = AppletService() for name, service in device.Services.items(): if name == "serial": ports_list = rfcomm_list() def flt(dev): if dev["dst"] == device.Address and dev[ "state"] == "connected": return dev["channel"] active_ports = map(flt, ports_list) def get_port_id(channel): for dev in ports_list: if dev["dst"] == device.Address and dev[ "state"] == "connected" and dev[ "channel"] == channel: return dev["id"] serial_items = [] num_ports = 0 has_dun = False try: for port_name, channel, uuid in sdp_get_cached_rfcomm( device.Address): if SERIAL_PORT_SVCLASS_ID in uuid: if name is not None: if channel in active_ports: item = create_menuitem( port_name, get_x_icon("blueman-serial", 16)) manager_menu.Signals.Handle( "gobject", item, "activate", manager_menu.on_disconnect, device, name, "/dev/rfcomm%d" % get_port_id(channel)) item.show() items.append((item, 150)) else: item = create_menuitem( port_name, get_icon("blueman-serial", 16)) manager_menu.Signals.Handle( "gobject", item, "activate", manager_menu.on_connect, device, name, channel) item.show() serial_items.append(item) elif DIALUP_NET_SVCLASS_ID in uuid: if name is not None: if channel in active_ports: item = create_menuitem( port_name, get_x_icon("modem", 16)) manager_menu.Signals.Handle( "gobject", item, "activate", manager_menu.on_disconnect, device, name, "/dev/rfcomm%d" % get_port_id(channel)) item.show() items.append((item, 150)) else: item = create_menuitem( port_name, get_icon("modem", 16)) manager_menu.Signals.Handle( "gobject", item, "activate", manager_menu.on_connect, device, name, channel) item.show() serial_items.append(item) has_dun = True except KeyError: for uuid in uuids: uuid16 = uuid128_to_uuid16(uuid) if uuid16 == DIALUP_NET_SVCLASS_ID: item = create_menuitem(_("Dialup Service"), get_icon("modem", 16)) manager_menu.Signals.Handle( "gobject", item, "activate", manager_menu.on_connect, device, name, uuid) item.show() serial_items.append(item) has_dun = True if uuid16 == SERIAL_PORT_SVCLASS_ID: item = create_menuitem( _("Serial Service"), get_icon("blueman-serial", 16)) manager_menu.Signals.Handle( "gobject", item, "activate", manager_menu.on_connect, device, name, uuid) item.show() serial_items.append(item) for dev in ports_list: if dev["dst"] == device.Address: if dev["state"] == "connected": devname = _( "Serial Port %s") % "rfcomm%d" % dev["id"] item = create_menuitem(devname, get_x_icon("modem", 16)) manager_menu.Signals.Handle( "gobject", item, "activate", manager_menu.on_disconnect, device, name, "/dev/rfcomm%d" % dev["id"]) items.append((item, 120)) item.show() def open_settings(i, device): from blueman.gui.GsmSettings import GsmSettings d = GsmSettings(device.Address) d.run() d.destroy() if has_dun and "PPPSupport" in appl.QueryPlugins(): item = Gtk.SeparatorMenuItem() item.show() serial_items.append(item) item = create_menuitem(_("Dialup Settings"), get_icon("preferences-desktop", 16)) serial_items.append(item) item.show() manager_menu.Signals.Handle("gobject", item, "activate", open_settings, device) if len(serial_items) > 1: sub = Gtk.Menu() sub.show() item = create_menuitem(_("Serial Ports"), get_icon("modem", 16)) item.set_submenu(sub) item.show() items.append((item, 90)) for item in serial_items: sub.append(item) else: for item in serial_items: items.append((item, 80)) elif name == "network": manager_menu.Signals.Handle( "bluez", service, manager_menu.service_property_changed, "PropertyChanged") sprops = service.get_properties() if not sprops["Connected"]: for uuid in uuids: uuid16 = uuid128_to_uuid16(uuid) if uuid16 == GN_SVCLASS_ID: item = create_menuitem( _("Group Network"), get_icon("network-wireless", 16)) manager_menu.Signals.Handle( "gobject", item, "activate", manager_menu.on_connect, device, name, uuid) item.show() items.append((item, 80)) if uuid16 == NAP_SVCLASS_ID: item = create_menuitem( _("Network Access Point"), get_icon("network-wireless", 16)) manager_menu.Signals.Handle( "gobject", item, "activate", manager_menu.on_connect, device, name, uuid) item.show() items.append((item, 81)) else: item = create_menuitem(_("Network"), get_x_icon("network-wireless", 16)) manager_menu.Signals.Handle("gobject", item, "activate", manager_menu.on_disconnect, device, name) item.show() items.append((item, 101)) if "DhcpClient" in appl.QueryPlugins(): def renew(x): appl.DhcpClient(sprops["Interface"]) item = create_menuitem(_("Renew IP Address"), get_icon("view-refresh", 16)) manager_menu.Signals.Handle("gobject", item, "activate", renew) item.show() items.append((item, 201)) elif name == "input": manager_menu.Signals.Handle( "bluez", service, manager_menu.service_property_changed, "PropertyChanged") sprops = service.get_properties() if sprops["Connected"]: item = create_menuitem(_("Input Service"), get_x_icon("mouse", 16)) manager_menu.Signals.Handle("gobject", item, "activate", manager_menu.on_disconnect, device, name) items.append((item, 100)) else: item = create_menuitem(_("Input Service"), get_icon("mouse", 16)) manager_menu.Signals.Handle("gobject", item, "activate", manager_menu.on_connect, device, name) items.append((item, 1)) item.show() elif name == "headset": sprops = service.get_properties() if sprops["Connected"]: item = create_menuitem(_("Headset Service"), get_icon("blueman-handsfree", 16)) manager_menu.Signals.Handle("gobject", item, "activate", manager_menu.on_disconnect, device, name) items.append((item, 110)) else: item = create_menuitem(_("Headset Service"), get_icon("blueman-handsfree", 16)) manager_menu.Signals.Handle("gobject", item, "activate", manager_menu.on_connect, device, name) items.append((item, 10)) item.show() elif name == "audiosink": sprops = service.get_properties() if sprops["Connected"]: item = create_menuitem(_("Audio Sink"), get_icon("blueman-headset", 16)) manager_menu.Signals.Handle("gobject", item, "activate", manager_menu.on_disconnect, device, name) items.append((item, 120)) else: item = create_menuitem(_("Audio Sink"), get_icon("blueman-headset", 16)) item.props.tooltip_text = _( "Allows to send audio to remote device") manager_menu.Signals.Handle("gobject", item, "activate", manager_menu.on_connect, device, name) items.append((item, 20)) item.show() elif name == "audiosource": sprops = service.get_properties() if not sprops["State"] == "disconnected": item = create_menuitem(_("Audio Source"), get_icon("blueman-headset", 16)) manager_menu.Signals.Handle("gobject", item, "activate", manager_menu.on_disconnect, device, name) items.append((item, 121)) else: item = create_menuitem(_("Audio Source"), get_icon("blueman-headset", 16)) item.props.tooltip_text = _( "Allows to receive audio from remote device") manager_menu.Signals.Handle("gobject", item, "activate", manager_menu.on_connect, device, name) items.append((item, 21)) item.show() return items
from blueman.plugins.ManagerPlugin import ManagerPlugin from blueman.main.PulseAudioUtils import PulseAudioUtils, EventType from blueman.main.SignalTracker import SignalTracker from blueman.gui.manager.ManagerDeviceMenu import ManagerDeviceMenu from blueman.gui.MessageArea import MessageArea from blueman.Functions import get_icon, create_menuitem from blueman.main.AppletService import AppletService import gtk a = AppletService() if not "PulseAudio" in a.QueryPlugins(): raise ImportError("PulseAudio applet plugin not loaded, nothing to do here") class PulseAudioProfile(ManagerPlugin): def on_load(self, user_data): self.devices = {} self.item = None self.deferred = [] pa = PulseAudioUtils() pa.connect("event", self.on_pa_event) pa.connect("connected", self.on_pa_ready) def on_pa_ready(self, utils): dprint("connected") for dev in self.deferred: self.regenerate_with_device(dev.Address)