Blame lib/bluetooth-settings-row.c

Packit 8fb625
/*
Packit 8fb625
 *
Packit 8fb625
 *  Copyright (C) 2013  Bastien Nocera <hadess@hadess.net>
Packit 8fb625
 *
Packit 8fb625
 *  This library is free software; you can redistribute it and/or
Packit 8fb625
 *  modify it under the terms of the GNU Lesser General Public
Packit 8fb625
 *  License as published by the Free Software Foundation; either
Packit 8fb625
 *  version 2.1 of the License, or (at your option) any later version.
Packit 8fb625
 *
Packit 8fb625
 *  This library is distributed in the hope that it will be useful,
Packit 8fb625
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 8fb625
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 8fb625
 *  Lesser General Public License for more details.
Packit 8fb625
 *
Packit 8fb625
 *  You should have received a copy of the GNU Lesser General Public
Packit 8fb625
 *  License along with this library; if not, write to the Free Software
Packit 8fb625
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
Packit 8fb625
 *
Packit 8fb625
 */
Packit 8fb625
Packit 8fb625
#ifdef HAVE_CONFIG_H
Packit 8fb625
#include <config.h>
Packit 8fb625
#endif
Packit 8fb625
Packit 8fb625
#include <gtk/gtk.h>
Packit 8fb625
Packit 8fb625
#include <glib/gi18n-lib.h>
Packit 8fb625
Packit 8fb625
#include "bluetooth-settings-row.h"
Packit 8fb625
#include "bluetooth-enums.h"
Packit 8fb625
#include "bluetooth-utils.h"
Packit 8fb625
#include "gnome-bluetooth-enum-types.h"
Packit 8fb625
Packit 8fb625
#define BLUETOOTH_SETTINGS_ROW_GET_PRIVATE(obj) \
Packit 8fb625
	(bluetooth_settings_row_get_instance_private (obj))
Packit 8fb625
Packit 8fb625
typedef struct _BluetoothSettingsRowPrivate BluetoothSettingsRowPrivate;
Packit 8fb625
Packit 8fb625
struct _BluetoothSettingsRowPrivate {
Packit 8fb625
	/* Widget */
Packit 8fb625
	GtkWidget *label;
Packit 8fb625
	GtkWidget *status;
Packit 8fb625
	GtkWidget *spinner;
Packit 8fb625
Packit 8fb625
	/* Properties */
Packit 8fb625
	GDBusProxy *proxy;
Packit 8fb625
	gboolean paired;
Packit 8fb625
	gboolean trusted;
Packit 8fb625
	BluetoothType type;
Packit 8fb625
	gboolean connected;
Packit 8fb625
	char *name;
Packit 8fb625
	char *bdaddr;
Packit 8fb625
	gboolean legacy_pairing;
Packit 8fb625
Packit 8fb625
	gboolean pairing;
Packit 8fb625
};
Packit 8fb625
Packit 8fb625
enum {
Packit 8fb625
	PROP_0,
Packit 8fb625
	PROP_PROXY,
Packit 8fb625
	PROP_PAIRED,
Packit 8fb625
	PROP_TRUSTED,
Packit 8fb625
	PROP_TYPE,
Packit 8fb625
	PROP_CONNECTED,
Packit 8fb625
	PROP_NAME,
Packit 8fb625
	PROP_ADDRESS,
Packit 8fb625
	PROP_PAIRING,
Packit 8fb625
	PROP_LEGACY_PAIRING
Packit 8fb625
};
Packit 8fb625
Packit 8fb625
G_DEFINE_TYPE_WITH_PRIVATE(BluetoothSettingsRow, bluetooth_settings_row, GTK_TYPE_LIST_BOX_ROW)
Packit 8fb625
Packit 8fb625
static void
Packit 8fb625
label_might_change (BluetoothSettingsRow *self)
Packit 8fb625
{
Packit 8fb625
	BluetoothSettingsRowPrivate *priv = BLUETOOTH_SETTINGS_ROW_GET_PRIVATE (self);
Packit 8fb625
Packit 8fb625
	if (!priv->paired && !priv->trusted)
Packit 8fb625
		gtk_label_set_text (GTK_LABEL (priv->status), _("Not Set Up"));
Packit 8fb625
	else if (priv->connected)
Packit 8fb625
		gtk_label_set_text (GTK_LABEL (priv->status), _("Connected"));
Packit 8fb625
	else
Packit 8fb625
		gtk_label_set_text (GTK_LABEL (priv->status), _("Disconnected"));
Packit 8fb625
Packit 8fb625
	if (priv->pairing)
Packit 8fb625
		gtk_widget_show (priv->spinner);
Packit 8fb625
	else
Packit 8fb625
		gtk_widget_show (priv->status);
Packit 8fb625
}
Packit 8fb625
Packit 8fb625
static void
Packit 8fb625
bluetooth_settings_row_init (BluetoothSettingsRow *self)
Packit 8fb625
{
Packit 8fb625
	BluetoothSettingsRowPrivate *priv = BLUETOOTH_SETTINGS_ROW_GET_PRIVATE (self);
Packit 8fb625
Packit 8fb625
	gtk_widget_init_template (GTK_WIDGET (self));
Packit 8fb625
Packit 8fb625
	/* Placeholder text and spinner */
Packit 8fb625
	g_object_bind_property (priv->spinner, "visible",
Packit 8fb625
				priv->status, "visible", G_BINDING_INVERT_BOOLEAN | G_BINDING_BIDIRECTIONAL);
Packit 8fb625
	g_object_bind_property (priv->spinner, "active",
Packit 8fb625
				priv->status, "visible", G_BINDING_INVERT_BOOLEAN | G_BINDING_BIDIRECTIONAL);
Packit 8fb625
}
Packit 8fb625
Packit 8fb625
static void
Packit 8fb625
bluetooth_settings_row_finalize (GObject *object)
Packit 8fb625
{
Packit 8fb625
	BluetoothSettingsRow *self = BLUETOOTH_SETTINGS_ROW (object);
Packit 8fb625
	BluetoothSettingsRowPrivate *priv = BLUETOOTH_SETTINGS_ROW_GET_PRIVATE (self);
Packit 8fb625
Packit 8fb625
	g_clear_object (&priv->proxy);
Packit 8fb625
	g_clear_pointer (&priv->name, g_free);
Packit 8fb625
	g_clear_pointer (&priv->bdaddr, g_free);
Packit 8fb625
Packit 8fb625
	G_OBJECT_CLASS(bluetooth_settings_row_parent_class)->finalize(object);
Packit 8fb625
}
Packit 8fb625
Packit 8fb625
static void
Packit 8fb625
bluetooth_settings_row_get_property (GObject        *object,
Packit 8fb625
				     guint           property_id,
Packit 8fb625
				     GValue         *value,
Packit 8fb625
				     GParamSpec     *pspec)
Packit 8fb625
{
Packit 8fb625
	BluetoothSettingsRow *self = BLUETOOTH_SETTINGS_ROW (object);
Packit 8fb625
	BluetoothSettingsRowPrivate *priv = BLUETOOTH_SETTINGS_ROW_GET_PRIVATE (self);
Packit 8fb625
Packit 8fb625
	switch (property_id) {
Packit 8fb625
	case PROP_PROXY:
Packit 8fb625
		g_value_set_object (value, priv->proxy);
Packit 8fb625
		break;
Packit 8fb625
	case PROP_PAIRED:
Packit 8fb625
		g_value_set_boolean (value, priv->paired);
Packit 8fb625
		break;
Packit 8fb625
	case PROP_TRUSTED:
Packit 8fb625
		g_value_set_boolean (value, priv->trusted);
Packit 8fb625
		break;
Packit 8fb625
	case PROP_TYPE:
Packit 8fb625
		g_value_set_flags (value, priv->type);
Packit 8fb625
		break;
Packit 8fb625
	case PROP_CONNECTED:
Packit 8fb625
		g_value_set_boolean (value, priv->connected);
Packit 8fb625
		break;
Packit 8fb625
	case PROP_NAME:
Packit 8fb625
		g_value_set_string (value, priv->name);
Packit 8fb625
		break;
Packit 8fb625
	case PROP_ADDRESS:
Packit 8fb625
		g_value_set_string (value, priv->bdaddr);
Packit 8fb625
		break;
Packit 8fb625
	case PROP_PAIRING:
Packit 8fb625
		g_value_set_boolean (value, priv->pairing);
Packit 8fb625
		break;
Packit 8fb625
	case PROP_LEGACY_PAIRING:
Packit 8fb625
		g_value_set_boolean (value, priv->legacy_pairing);
Packit 8fb625
		break;
Packit 8fb625
	default:
Packit 8fb625
		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
Packit 8fb625
		break;
Packit 8fb625
	}
Packit 8fb625
}
Packit 8fb625
Packit 8fb625
static void
Packit 8fb625
update_row (BluetoothSettingsRow *self)
Packit 8fb625
{
Packit 8fb625
	BluetoothSettingsRowPrivate *priv = BLUETOOTH_SETTINGS_ROW_GET_PRIVATE (self);
Packit 8fb625
Packit 8fb625
	if (priv->name == NULL) {
Packit 8fb625
		gtk_label_set_text (GTK_LABEL (priv->label),
Packit 8fb625
				    bluetooth_type_to_string (priv->type));
Packit 8fb625
		gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
Packit 8fb625
	} else {
Packit 8fb625
		gtk_label_set_text (GTK_LABEL (priv->label), priv->name);
Packit 8fb625
		gtk_widget_set_sensitive (GTK_WIDGET (self), TRUE);
Packit 8fb625
	}
Packit 8fb625
}
Packit 8fb625
Packit 8fb625
static void
Packit 8fb625
bluetooth_settings_row_set_property (GObject        *object,
Packit 8fb625
				     guint           property_id,
Packit 8fb625
				     const GValue   *value,
Packit 8fb625
				     GParamSpec     *pspec)
Packit 8fb625
{
Packit 8fb625
	BluetoothSettingsRow *self = BLUETOOTH_SETTINGS_ROW (object);
Packit 8fb625
	BluetoothSettingsRowPrivate *priv = BLUETOOTH_SETTINGS_ROW_GET_PRIVATE (self);
Packit 8fb625
Packit 8fb625
	switch (property_id) {
Packit 8fb625
	case PROP_PROXY:
Packit 8fb625
		g_clear_object (&priv->proxy);
Packit 8fb625
		priv->proxy = g_value_dup_object (value);
Packit 8fb625
		break;
Packit 8fb625
	case PROP_PAIRED:
Packit 8fb625
		priv->paired = g_value_get_boolean (value);
Packit 8fb625
		label_might_change (self);
Packit 8fb625
		break;
Packit 8fb625
	case PROP_TRUSTED:
Packit 8fb625
		priv->trusted = g_value_get_boolean (value);
Packit 8fb625
		label_might_change (self);
Packit 8fb625
		break;
Packit 8fb625
	case PROP_TYPE:
Packit 8fb625
		priv->type = g_value_get_flags (value);
Packit 8fb625
		update_row (self);
Packit 8fb625
		break;
Packit 8fb625
	case PROP_CONNECTED:
Packit 8fb625
		priv->connected = g_value_get_boolean (value);
Packit 8fb625
		label_might_change (self);
Packit 8fb625
		break;
Packit 8fb625
	case PROP_NAME:
Packit 8fb625
		g_free (priv->name);
Packit 8fb625
		priv->name = g_value_dup_string (value);
Packit 8fb625
		update_row (self);
Packit 8fb625
		break;
Packit 8fb625
	case PROP_ADDRESS:
Packit 8fb625
		g_free (priv->bdaddr);
Packit 8fb625
		priv->bdaddr = g_value_dup_string (value);
Packit 8fb625
		break;
Packit 8fb625
	case PROP_PAIRING:
Packit 8fb625
		priv->pairing = g_value_get_boolean (value);
Packit 8fb625
		label_might_change (self);
Packit 8fb625
		break;
Packit 8fb625
	case PROP_LEGACY_PAIRING:
Packit 8fb625
		priv->legacy_pairing = g_value_get_boolean (value);
Packit 8fb625
		break;
Packit 8fb625
	default:
Packit 8fb625
		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
Packit 8fb625
		break;
Packit 8fb625
	}
Packit 8fb625
}
Packit 8fb625
Packit 8fb625
static void
Packit 8fb625
bluetooth_settings_row_class_init (BluetoothSettingsRowClass *klass)
Packit 8fb625
{
Packit 8fb625
	GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit 8fb625
	GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
Packit 8fb625
Packit 8fb625
	bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
Packit 8fb625
Packit 8fb625
	object_class->finalize = bluetooth_settings_row_finalize;
Packit 8fb625
	object_class->get_property = bluetooth_settings_row_get_property;
Packit 8fb625
	object_class->set_property = bluetooth_settings_row_set_property;
Packit 8fb625
Packit 8fb625
	g_object_class_install_property (object_class, PROP_PROXY,
Packit 8fb625
					 g_param_spec_object ("proxy", NULL,
Packit 8fb625
							      "The D-Bus object path of the device",
Packit 8fb625
							      G_TYPE_DBUS_PROXY, G_PARAM_READWRITE));
Packit 8fb625
	g_object_class_install_property (object_class, PROP_PAIRED,
Packit 8fb625
					 g_param_spec_boolean ("paired", NULL,
Packit 8fb625
							      "Paired",
Packit 8fb625
							      FALSE, G_PARAM_READWRITE));
Packit 8fb625
	g_object_class_install_property (object_class, PROP_TRUSTED,
Packit 8fb625
					 g_param_spec_boolean ("trusted", NULL,
Packit 8fb625
							      "Trusted",
Packit 8fb625
							      FALSE, G_PARAM_READWRITE));
Packit 8fb625
	g_object_class_install_property (object_class, PROP_TYPE,
Packit 8fb625
					 g_param_spec_flags ("type", NULL,
Packit 8fb625
							      "Type",
Packit 8fb625
							      BLUETOOTH_TYPE_TYPE, BLUETOOTH_TYPE_ANY, G_PARAM_READWRITE));
Packit 8fb625
	g_object_class_install_property (object_class, PROP_CONNECTED,
Packit 8fb625
					 g_param_spec_boolean ("connected", NULL,
Packit 8fb625
							      "Connected",
Packit 8fb625
							      FALSE, G_PARAM_READWRITE));
Packit 8fb625
	g_object_class_install_property (object_class, PROP_NAME,
Packit 8fb625
					 g_param_spec_string ("name", NULL,
Packit 8fb625
							      "Name",
Packit 8fb625
							      NULL, G_PARAM_READWRITE));
Packit 8fb625
	g_object_class_install_property (object_class, PROP_ADDRESS,
Packit 8fb625
					 g_param_spec_string ("address", NULL,
Packit 8fb625
							      "Address",
Packit 8fb625
							      NULL, G_PARAM_READWRITE));
Packit 8fb625
	g_object_class_install_property (object_class, PROP_PAIRING,
Packit 8fb625
					 g_param_spec_boolean ("pairing", NULL,
Packit 8fb625
							      "Pairing",
Packit 8fb625
							      FALSE, G_PARAM_READWRITE));
Packit 8fb625
	g_object_class_install_property (object_class, PROP_LEGACY_PAIRING,
Packit 8fb625
					 g_param_spec_boolean ("legacy-pairing", NULL,
Packit 8fb625
							      "Legacy pairing",
Packit 8fb625
							      FALSE, G_PARAM_READWRITE));
Packit 8fb625
Packit 8fb625
	/* Bind class to template */
Packit 8fb625
	gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/bluetooth/bluetooth-settings-row.ui");
Packit 8fb625
	gtk_widget_class_bind_template_child_private (widget_class, BluetoothSettingsRow, label);
Packit 8fb625
	gtk_widget_class_bind_template_child_private (widget_class, BluetoothSettingsRow, spinner);
Packit 8fb625
	gtk_widget_class_bind_template_child_private (widget_class, BluetoothSettingsRow, status);
Packit 8fb625
}
Packit 8fb625
Packit 8fb625
/**
Packit 8fb625
 * bluetooth_settings_row_new:
Packit 8fb625
 *
Packit 8fb625
 * Returns a new #BluetoothSettingsRow widget.
Packit 8fb625
 *
Packit 8fb625
 * Return value: A #BluetoothSettingsRow widget
Packit 8fb625
 **/
Packit 8fb625
GtkWidget *
Packit 8fb625
bluetooth_settings_row_new (void)
Packit 8fb625
{
Packit 8fb625
	return g_object_new (BLUETOOTH_TYPE_SETTINGS_ROW, NULL);
Packit 8fb625
}