[network-manager-applet/nma-1-0] editor: populate available Bluetooth devices in Bluetooth page (rh #1271581)



commit 90017ad50ce00e2bc1e4a6fa17e860aecb2742ec
Author: Jiří Klimeš <jklimes redhat com>
Date:   Thu Dec 17 13:13:51 2015 +0100

    editor: populate available Bluetooth devices in Bluetooth page (rh #1271581)
    
    (cherry picked from commit 7444686857e8829e3921857151594405df49405b)

 src/connection-editor/ce-page-bluetooth.ui |   17 ++++----
 src/connection-editor/ce-page.c            |   15 +++++--
 src/connection-editor/ce-page.h            |    1 +
 src/connection-editor/page-bluetooth.c     |   61 +++++++++++++++++++++++----
 src/connection-editor/page-ethernet.c      |    4 +-
 src/connection-editor/page-infiniband.c    |    4 +-
 src/connection-editor/page-wifi.c          |    4 +-
 src/connection-editor/page-wimax.c         |    4 +-
 8 files changed, 80 insertions(+), 30 deletions(-)
---
diff --git a/src/connection-editor/ce-page-bluetooth.ui b/src/connection-editor/ce-page-bluetooth.ui
index f67ef9b..e72a3c6 100644
--- a/src/connection-editor/ce-page-bluetooth.ui
+++ b/src/connection-editor/ce-page-bluetooth.ui
@@ -10,13 +10,15 @@
     <property name="column_spacing">12</property>
     <property name="row_spacing">6</property>
     <child>
-      <object class="GtkEntry" id="bluetooth_bdaddr">
+      <object class="GtkBox" id="bluetooth_device_vbox">
+        <property name="orientation">vertical</property>
         <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="primary_icon_activatable">False</property>
-        <property name="secondary_icon_activatable">False</property>
-        <property name="primary_icon_sensitive">True</property>
-        <property name="secondary_icon_sensitive">True</property>
+        <property name="can_focus">False</property>
+        <property name="valign">start</property>
+        <property name="spacing">12</property>
+        <child>
+          <placeholder/>
+        </child>
       </object>
       <packing>
         <property name="left_attach">1</property>
@@ -25,13 +27,12 @@
       </packing>
     </child>
     <child>
-      <object class="GtkLabel" id="label1">
+      <object class="GtkLabel" id="bluetooth_device_label">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
         <property name="xalign">0</property>
         <property name="label" translatable="yes">_Device:</property>
         <property name="use_underline">True</property>
-        <property name="mnemonic_widget">bluetooth_bdaddr</property>
       </object>
       <packing>
         <property name="x_options">GTK_FILL</property>
diff --git a/src/connection-editor/ce-page.c b/src/connection-editor/ce-page.c
index f837a22..6cbea07 100644
--- a/src/connection-editor/ce-page.c
+++ b/src/connection-editor/ce-page.c
@@ -31,6 +31,7 @@
 
 #include <nm-setting-connection.h>
 #include <nm-utils.h>
+#include <nm-device-bt.h>
 
 #include "ce-page.h"
 #include "nma-marshal.h"
@@ -425,7 +426,10 @@ _get_device_list (CEPage *self,
                if (!G_TYPE_CHECK_INSTANCE_TYPE (dev, device_type))
                        continue;
 
-               ifname = nm_device_get_iface (NM_DEVICE (dev));
+               if (device_type == NM_TYPE_DEVICE_BT)
+                       ifname = nm_device_bt_get_name (NM_DEVICE_BT (dev));
+               else
+                       ifname = nm_device_get_iface (NM_DEVICE (dev));
                if (mac_property)
                        g_object_get (G_OBJECT (dev), mac_property, &mac, NULL);
 
@@ -457,7 +461,7 @@ _device_entry_parse (const char *entry_text, char **first, char **second)
                return TRUE;
        }
 
-       sp = strchr (entry_text, ' ');
+       sp = strstr (entry_text, " (");
        if (sp) {
                *first = g_strndup (entry_text, sp - entry_text);
                left = sp + 1;
@@ -553,7 +557,8 @@ ce_page_setup_device_combo (CEPage *self,
 }
 
 gboolean
-ce_page_device_entry_get (GtkEntry *entry, int type, char **ifname, GByteArray **mac, const char 
*device_name, GError **error)
+ce_page_device_entry_get (GtkEntry *entry, int type, gboolean check_ifname,
+                          char **ifname, GByteArray **mac, const char *device_name, GError **error)
 {
        char *first, *second;
        const char *ifname_tmp = NULL, *mac_tmp = NULL;
@@ -570,7 +575,7 @@ ce_page_device_entry_get (GtkEntry *entry, int type, char **ifname, GByteArray *
        if (first) {
                if (_mac_is_valid (first, type))
                        mac_tmp = first;
-               else if (nm_utils_iface_valid_name (first))
+               else if (!check_ifname || nm_utils_iface_valid_name (first))
                        ifname_tmp = first;
                else
                        valid = FALSE;
@@ -581,7 +586,7 @@ ce_page_device_entry_get (GtkEntry *entry, int type, char **ifname, GByteArray *
                                mac_tmp = second;
                        else
                                valid = FALSE;
-               } else if (nm_utils_iface_valid_name (second)) {
+               } else if (!check_ifname || nm_utils_iface_valid_name (second)) {
                        if (!ifname_tmp)
                                ifname_tmp = second;
                        else
diff --git a/src/connection-editor/ce-page.h b/src/connection-editor/ce-page.h
index 69955f5..cda5978 100644
--- a/src/connection-editor/ce-page.h
+++ b/src/connection-editor/ce-page.h
@@ -129,6 +129,7 @@ void ce_page_setup_device_combo (CEPage *self,
 gboolean ce_page_mac_entry_valid (GtkEntry *entry, int type, const char *property_name, GError **error);
 gboolean ce_page_interface_name_valid (const char *iface, const char *property_name, GError **error);
 gboolean ce_page_device_entry_get (GtkEntry *entry, int type,
+                                   gboolean check_ifname,
                                    char **ifname, GByteArray **mac,
                                    const char *device_name,
                                    GError **error);
diff --git a/src/connection-editor/page-bluetooth.c b/src/connection-editor/page-bluetooth.c
index d2b3ae4..7137a10 100644
--- a/src/connection-editor/page-bluetooth.c
+++ b/src/connection-editor/page-bluetooth.c
@@ -29,6 +29,8 @@
 
 #include <nm-setting-connection.h>
 #include <nm-setting-bluetooth.h>
+#include <nm-device-bt.h>
+#include <nm-utils.h>
 
 #include "page-bluetooth.h"
 #include "nm-connection-editor.h"
@@ -41,7 +43,7 @@ G_DEFINE_TYPE (CEPageBluetooth, ce_page_bluetooth, CE_TYPE_PAGE)
 typedef struct {
        NMSettingBluetooth *setting;
 
-       GtkEntry *bdaddr;
+       GtkComboBoxText *bdaddr;
 
        gboolean disposed;
 } CEPageBluetoothPrivate;
@@ -51,10 +53,24 @@ bluetooth_private_init (CEPageBluetooth *self)
 {
        CEPageBluetoothPrivate *priv = CE_PAGE_BLUETOOTH_GET_PRIVATE (self);
        GtkBuilder *builder;
+       GtkWidget *vbox;
+       GtkLabel *label;
 
        builder = CE_PAGE (self)->builder;
 
-       priv->bdaddr = GTK_ENTRY (gtk_builder_get_object (builder, "bluetooth_bdaddr"));
+       priv->bdaddr = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new_with_entry ());
+       gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX (priv->bdaddr), 0);
+       gtk_widget_set_tooltip_text (GTK_WIDGET (priv->bdaddr),
+                                    _("MAC address of the Bluetooth device. Example: 00:11:22:33:44:55"));
+
+       vbox = GTK_WIDGET (gtk_builder_get_object (builder, "bluetooth_device_vbox"));
+       gtk_container_add (GTK_CONTAINER (vbox), GTK_WIDGET (priv->bdaddr));
+       gtk_widget_set_halign (GTK_WIDGET (priv->bdaddr), GTK_ALIGN_FILL);
+       gtk_widget_show_all (GTK_WIDGET (priv->bdaddr));
+
+       /* Set mnemonic widget for Device label */
+       label = GTK_LABEL (gtk_builder_get_object (builder, "bluetooth_device_label"));
+       gtk_label_set_mnemonic_widget (label, GTK_WIDGET (priv->bdaddr));
 
 }
 
@@ -63,9 +79,13 @@ populate_ui (CEPageBluetooth *self, NMConnection *connection)
 {
        CEPageBluetoothPrivate *priv = CE_PAGE_BLUETOOTH_GET_PRIVATE (self);
        NMSettingBluetooth *setting = priv->setting;
+       const GByteArray *bdaddr;
 
-       ce_page_mac_to_entry (nm_setting_bluetooth_get_bdaddr (setting),
-                             ARPHRD_ETHER, priv->bdaddr);
+       bdaddr = nm_setting_bluetooth_get_bdaddr (setting);
+       ce_page_setup_device_combo (CE_PAGE (self), GTK_COMBO_BOX (priv->bdaddr),
+                                   NM_TYPE_DEVICE_BT, NULL,
+                                   bdaddr, ARPHRD_ETHER, NM_DEVICE_BT_HW_ADDRESS, TRUE);
+       g_signal_connect_swapped (priv->bdaddr, "changed", G_CALLBACK (ce_page_changed), self);
 }
 
 static void
@@ -134,9 +154,13 @@ static void
 ui_to_setting (CEPageBluetooth *self)
 {
        CEPageBluetoothPrivate *priv = CE_PAGE_BLUETOOTH_GET_PRIVATE (self);
-       GByteArray *bdaddr;
+       GtkWidget *entry;
+       GByteArray *bdaddr = NULL;
+
+       entry = gtk_bin_get_child (GTK_BIN (priv->bdaddr));
+       if (entry)
+               ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, FALSE, NULL, &bdaddr, NULL, NULL);
 
-       bdaddr = ce_page_entry_to_mac (priv->bdaddr, ARPHRD_ETHER, NULL);
        g_object_set (priv->setting,
                      NM_SETTING_BLUETOOTH_BDADDR, bdaddr,
                      NULL);
@@ -149,9 +173,28 @@ ce_page_validate_v (CEPage *page, NMConnection *connection, GError **error)
 {
        CEPageBluetooth *self = CE_PAGE_BLUETOOTH (page);
        CEPageBluetoothPrivate *priv = CE_PAGE_BLUETOOTH_GET_PRIVATE (self);
-
-       if (!ce_page_mac_entry_valid (priv->bdaddr, ARPHRD_ETHER, _("bdaddr"), error))
-               return FALSE;
+       GtkWidget *entry;
+       GByteArray *bdaddr = NULL;
+       char *str_addr;
+
+       entry = gtk_bin_get_child (GTK_BIN (priv->bdaddr));
+       if (entry) {
+               ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, FALSE, NULL, &bdaddr, NULL, NULL);
+               if (!bdaddr || !utils_ether_addr_valid ((struct ether_addr *)bdaddr->data)) {
+                       if (bdaddr)
+                               str_addr = nm_utils_hwaddr_ntoa (bdaddr->data, ARPHRD_ETHER);
+                       else
+                               str_addr = g_strdup ("null");
+                       g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC,
+                                    _("invalid Bluetooth device (%s)"), str_addr);
+                       g_free (str_addr);
+                       if (bdaddr)
+                               g_byte_array_free (bdaddr, TRUE);
+                       return FALSE;
+               }
+               if (bdaddr)
+                       g_byte_array_free (bdaddr, TRUE);
+       }
 
        ui_to_setting (self);
        return nm_setting_verify (NM_SETTING (priv->setting), NULL, error);
diff --git a/src/connection-editor/page-ethernet.c b/src/connection-editor/page-ethernet.c
index 92404c8..d10e2ae 100644
--- a/src/connection-editor/page-ethernet.c
+++ b/src/connection-editor/page-ethernet.c
@@ -312,7 +312,7 @@ ui_to_setting (CEPageEthernet *self)
 
        entry = gtk_bin_get_child (GTK_BIN (priv->device_combo));
        if (entry)
-               ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, &ifname, &device_mac, NULL, NULL);
+               ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, TRUE, &ifname, &device_mac, NULL, 
NULL);
        cloned_mac = ce_page_entry_to_mac (priv->cloned_mac, ARPHRD_ETHER, NULL);
 
        g_object_set (s_con,
@@ -345,7 +345,7 @@ ce_page_validate_v (CEPage *page, NMConnection *connection, GError **error)
 
        entry = gtk_bin_get_child (GTK_BIN (priv->device_combo));
        if (entry) {
-               if (!ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, NULL, NULL, _("Ethernet 
device"), error))
+               if (!ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, TRUE, NULL, NULL, _("Ethernet 
device"), error))
                        return FALSE;
        }
 
diff --git a/src/connection-editor/page-infiniband.c b/src/connection-editor/page-infiniband.c
index 8e1eae6..a3c8a32 100644
--- a/src/connection-editor/page-infiniband.c
+++ b/src/connection-editor/page-infiniband.c
@@ -199,7 +199,7 @@ ui_to_setting (CEPageInfiniband *self)
 
        entry = gtk_bin_get_child (GTK_BIN (priv->device_combo));
        if (entry)
-               ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_INFINIBAND, &ifname, &device_mac, NULL, 
NULL);
+               ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_INFINIBAND, TRUE, &ifname, &device_mac, 
NULL, NULL);
 
        g_object_set (s_con,
                      NM_SETTING_CONNECTION_INTERFACE_NAME, ifname,
@@ -224,7 +224,7 @@ ce_page_validate_v (CEPage *page, NMConnection *connection, GError **error)
 
        entry = gtk_bin_get_child (GTK_BIN (priv->device_combo));
        if (entry) {
-               if (!ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_INFINIBAND, NULL, NULL, 
_("infiniband device"), error))
+               if (!ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_INFINIBAND, TRUE, NULL, NULL, 
_("infiniband device"), error))
                        return FALSE;
        }
 
diff --git a/src/connection-editor/page-wifi.c b/src/connection-editor/page-wifi.c
index 9249453..ac7cad2 100644
--- a/src/connection-editor/page-wifi.c
+++ b/src/connection-editor/page-wifi.c
@@ -547,7 +547,7 @@ ui_to_setting (CEPageWifi *self)
                bssid = ce_page_entry_to_mac (GTK_ENTRY (entry), ARPHRD_ETHER, NULL);
        entry = gtk_bin_get_child (GTK_BIN (priv->device_combo));
        if (entry)
-               ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, &ifname, &device_mac, NULL, NULL);
+               ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, TRUE, &ifname, &device_mac, NULL, 
NULL);
        cloned_mac = ce_page_entry_to_mac (priv->cloned_mac, ARPHRD_ETHER, NULL);
 
        g_object_set (s_con,
@@ -592,7 +592,7 @@ ce_page_validate_v (CEPage *page, NMConnection *connection, GError **error)
 
        entry = gtk_bin_get_child (GTK_BIN (priv->device_combo));
        if (entry) {
-               if (!ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, NULL, NULL, _("Wi-Fi 
device"), error))
+               if (!ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, TRUE, NULL, NULL, _("Wi-Fi 
device"), error))
                        return FALSE;
        }
 
diff --git a/src/connection-editor/page-wimax.c b/src/connection-editor/page-wimax.c
index e7a470e..ff88013 100644
--- a/src/connection-editor/page-wimax.c
+++ b/src/connection-editor/page-wimax.c
@@ -158,7 +158,7 @@ ui_to_setting (CEPageWimax *self)
 
        entry = gtk_bin_get_child (GTK_BIN (priv->device_combo));
        if (entry)
-               ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, &ifname, &device_mac, NULL, NULL);
+               ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, TRUE, &ifname, &device_mac, NULL, 
NULL);
 
        g_object_set (s_con,
                      NM_SETTING_CONNECTION_INTERFACE_NAME, ifname,
@@ -189,7 +189,7 @@ ce_page_validate_v (CEPage *page, NMConnection *connection, GError **error)
 
        entry = gtk_bin_get_child (GTK_BIN (priv->device_combo));
        if (entry) {
-               if (!ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, NULL, NULL, _("WiMAX 
device"), error))
+               if (!ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, TRUE, NULL, NULL, _("WiMAX 
device"), error))
                        return FALSE;
        }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]