diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 24 | ||||
-rw-r--r-- | src/config.vapi | 3 | ||||
-rw-r--r-- | src/indicator-bluetooth.vala | 137 |
3 files changed, 164 insertions, 0 deletions
diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..101f8f1 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,24 @@ +bin_PROGRAMS = indicator-bluetooth + +indicator_bluetooth_SOURCES = \ + config.vapi \ + indicator-bluetooth.vala + +indicator_bluetooth_VALAFLAGS = \ + --pkg posix \ + --pkg glib-2.0 \ + --pkg gtk+-3.0 \ + --pkg appindicator3-0.1 + +indicator_bluetooth_CFLAGS = \ + -DVERSION=\"$(VERSION)\" \ + -DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\" \ + -DLOCALE_DIR=\"$(datadir)/locale\" \ + $(INDICATOR_BLUETOOTH_CFLAGS) + +indicator_bluetooth_LDADD = \ + $(INDICATOR_BLUETOOTH_LIBS) + +CLEANFILES = \ + $(patsubst %.vala,%.c,$(filter %.vala, $(SOURCES))) \ + *_vala.stamp diff --git a/src/config.vapi b/src/config.vapi new file mode 100644 index 0000000..a1bb094 --- /dev/null +++ b/src/config.vapi @@ -0,0 +1,3 @@ +public const string VERSION; +public const string GETTEXT_PACKAGE; +public const string LOCALE_DIR; diff --git a/src/indicator-bluetooth.vala b/src/indicator-bluetooth.vala new file mode 100644 index 0000000..88cb175 --- /dev/null +++ b/src/indicator-bluetooth.vala @@ -0,0 +1,137 @@ +[DBus (name = "org.bluez.Manager")] +interface BluezManager : Object +{ + public abstract string default_adapter () throws IOError; +} + +[DBus (name = "org.bluez.Adapter")] +interface BluezAdapter : Object +{ + public abstract string[] list_devices () throws IOError; + public abstract HashTable<string, Variant> get_properties () throws IOError; + public abstract void set_property (string name, Variant value) throws IOError; +} + +[DBus (name = "org.bluez.Device")] +interface BluezDevice : Object +{ + public abstract HashTable<string, Variant> get_properties () throws IOError; +} + +[DBus (name = "org.bluez.Audio")] +interface BluezAudio : Object +{ + public abstract void connect () throws IOError; +} + +[DBus (name = "org.bluez.Input")] +interface BluezInput : Object +{ + public abstract void connect () throws IOError; +} + +int main (string[] args) +{ + Intl.setlocale (LocaleCategory.ALL, ""); + Intl.bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR); + Intl.bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + Intl.textdomain (GETTEXT_PACKAGE); + + Gtk.init (ref args); + + BluezAdapter adapter; + try + { + var manager = Bus.get_proxy_sync<BluezManager> (BusType.SYSTEM, "org.bluez", "/"); + var path = manager.default_adapter (); + adapter = Bus.get_proxy_sync<BluezAdapter> (BusType.SYSTEM, "org.bluez", path); + } + catch (IOError e) + { + return Posix.EXIT_FAILURE; + } + + var indicator = new AppIndicator.Indicator ("indicator-bluetooth", "bluetooth-active", AppIndicator.IndicatorCategory.HARDWARE); + indicator.set_status (AppIndicator.IndicatorStatus.ACTIVE); + + var menu = new Gtk.Menu (); + indicator.set_menu (menu); + + var item = new Gtk.MenuItem.with_label ("Bluetooth: On"); + item.sensitive = false; + item.show (); + menu.append (item); + + item = new Gtk.MenuItem.with_label ("Turn off Bluetooth"); + item.show (); + menu.append (item); + + item = new Gtk.CheckMenuItem.with_label (_("Visible")); + item.activate.connect (() => { adapter.set_property ("Discoverable", new Variant.boolean (true)); }); + item.show (); + menu.append (item); + + var sep = new Gtk.SeparatorMenuItem (); + sep.show (); + menu.append (sep); + + item = new Gtk.MenuItem.with_label (_("Devices")); + item.sensitive = false; + item.show (); + menu.append (item); + + try + { + var devices = adapter.list_devices (); + foreach (var path in devices) + { + var device = Bus.get_proxy_sync<BluezDevice> (BusType.SYSTEM, "org.bluez", path); + var properties = device.get_properties (); + var iter = HashTableIter<string, Variant> (properties); + string name; + Variant value; + //stderr.printf ("%s\n", path); + while (iter.next (out name, out value)) + { + //stderr.printf (" %s=%s\n", name, value.print (false)); + if (name == "Name" && value.is_of_type (VariantType.STRING)) + { + item = new Gtk.MenuItem.with_label (value.get_string ()); + item.show (); + menu.append (item); + + item.submenu = new Gtk.Menu (); + var i = new Gtk.MenuItem.with_label (_("Send files...")); + i.show (); + i.activate.connect (() => { Process.spawn_command_line_async ("bluetooth-sendto --device=DEVICE --name=NAME"); }); + item.submenu.append (i); + + //var i = new Gtk.MenuItem.with_label (_("Keyboard Settings...")); + //i.activate.connect (() => { Process.spawn_command_line_async ("gnome-control-center keyboard"); }); + //var i = new Gtk.MenuItem.with_label (_("Mouse and Touchpad Settings...")); + //i.activate.connect (() => { Process.spawn_command_line_async ("gnome-control-center mouse"); }); + //var i = new Gtk.MenuItem.with_label (_("Sound Settings...")); + //i.activate.connect (() => { Process.spawn_command_line_async ("gnome-control-center sound"); }); + } + } + } + } + catch (IOError e) + { + stderr.printf ("%s\n", e.message); + return Posix.EXIT_FAILURE; + } + + sep = new Gtk.SeparatorMenuItem (); + sep.show (); + menu.append (sep); + + item = new Gtk.MenuItem.with_label (_("Bluetooth Settings...")); + item.activate.connect (() => { Process.spawn_command_line_async ("gnome-control-center bluetooth"); }); + item.show (); + menu.append (item); + + Gtk.main (); + + return 0; +} |