607 lines
22 KiB
C
607 lines
22 KiB
C
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
|
|
*
|
|
* Copyright (C) 2011-2012 Richard Hughes <richard@hughsie.com>
|
|
*
|
|
* Licensed under the GNU General Public License Version 2
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include <glib-object.h>
|
|
#include <glib/gi18n.h>
|
|
#define HANDY_USE_UNSTABLE_API
|
|
#include <handy.h>
|
|
#include <NetworkManager.h>
|
|
|
|
#include "panel-common.h"
|
|
|
|
#include "list-box-helper.h"
|
|
#include "connection-editor/net-connection-editor.h"
|
|
#include "connection-editor/ce-page.h"
|
|
|
|
#include "net-device-ethernet.h"
|
|
|
|
struct _NetDeviceEthernet
|
|
{
|
|
NetDeviceSimple parent;
|
|
|
|
GtkBuilder *builder;
|
|
GtkButton *add_profile_button;
|
|
GtkBox *box;
|
|
GtkButton *details_button;
|
|
GtkFrame *details_frame;
|
|
HdyActionRow *details_row;
|
|
GtkLabel *device_label;
|
|
GtkSwitch *device_off_switch;
|
|
GtkScrolledWindow *scrolled_window;
|
|
|
|
GtkListBox *list;
|
|
gboolean updating_device;
|
|
|
|
GHashTable *connections;
|
|
};
|
|
|
|
G_DEFINE_TYPE (NetDeviceEthernet, net_device_ethernet, NET_TYPE_DEVICE_SIMPLE)
|
|
|
|
static char *
|
|
device_ethernet_get_speed (NetDeviceSimple *device_simple)
|
|
{
|
|
NMDevice *nm_device;
|
|
guint speed;
|
|
|
|
nm_device = net_device_get_nm_device (NET_DEVICE (device_simple));
|
|
|
|
speed = nm_device_ethernet_get_speed (NM_DEVICE_ETHERNET (nm_device));
|
|
if (speed > 0) {
|
|
/* Translators: network device speed */
|
|
return g_strdup_printf (_("%d Mb/s"), speed);
|
|
} else
|
|
return NULL;
|
|
}
|
|
|
|
static GtkWidget *
|
|
device_ethernet_add_to_stack (NetObject *object,
|
|
GtkStack *stack,
|
|
GtkSizeGroup *heading_size_group)
|
|
{
|
|
NetDeviceEthernet *self = NET_DEVICE_ETHERNET (object);
|
|
|
|
gtk_stack_add_named (stack, GTK_WIDGET (self->box), net_object_get_id (object));
|
|
return GTK_WIDGET (self->box);
|
|
}
|
|
|
|
static void
|
|
add_details_row (GtkWidget *details, gint top, const gchar *heading, const gchar *value)
|
|
{
|
|
GtkWidget *heading_label;
|
|
GtkWidget *value_label;
|
|
|
|
heading_label = gtk_label_new (heading);
|
|
gtk_style_context_add_class (gtk_widget_get_style_context (heading_label), "dim-label");
|
|
gtk_widget_set_halign (heading_label, GTK_ALIGN_END);
|
|
gtk_widget_set_hexpand (heading_label, TRUE);
|
|
|
|
gtk_grid_attach (GTK_GRID (details), heading_label, 0, top, 1, 1);
|
|
|
|
value_label = gtk_label_new (value);
|
|
gtk_widget_set_halign (value_label, GTK_ALIGN_START);
|
|
gtk_widget_set_hexpand (value_label, TRUE);
|
|
gtk_label_set_selectable (GTK_LABEL (value_label), TRUE);
|
|
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (heading_label), value_label);
|
|
|
|
gtk_grid_attach (GTK_GRID (details), value_label, 1, top, 1, 1);
|
|
}
|
|
|
|
static gchar *
|
|
get_last_used_string (NMConnection *connection)
|
|
{
|
|
g_autoptr(GDateTime) now = NULL;
|
|
g_autoptr(GDateTime) then = NULL;
|
|
gint days;
|
|
GTimeSpan diff;
|
|
guint64 timestamp;
|
|
NMSettingConnection *s_con;
|
|
|
|
s_con = nm_connection_get_setting_connection (connection);
|
|
if (s_con == NULL)
|
|
return NULL;
|
|
timestamp = nm_setting_connection_get_timestamp (s_con);
|
|
if (timestamp == 0)
|
|
return g_strdup (_("never"));
|
|
|
|
/* calculate the amount of time that has elapsed */
|
|
now = g_date_time_new_now_utc ();
|
|
then = g_date_time_new_from_unix_utc (timestamp);
|
|
diff = g_date_time_difference (now, then);
|
|
days = diff / G_TIME_SPAN_DAY;
|
|
if (days == 0)
|
|
return g_strdup (_("today"));
|
|
else if (days == 1)
|
|
return g_strdup (_("yesterday"));
|
|
else
|
|
return g_strdup_printf (ngettext ("%i day ago", "%i days ago", days), days);
|
|
}
|
|
|
|
static void
|
|
add_details (GtkWidget *details, NMDevice *device, NMConnection *connection)
|
|
{
|
|
NMIPConfig *ip4_config = NULL;
|
|
NMIPConfig *ip6_config = NULL;
|
|
const gchar *ip4_address = NULL;
|
|
const gchar *ip4_route = NULL;
|
|
g_autofree gchar *ip4_dns = NULL;
|
|
const gchar *ip6_address = NULL;
|
|
gint i = 0;
|
|
|
|
ip4_config = nm_device_get_ip4_config (device);
|
|
if (ip4_config) {
|
|
GPtrArray *addresses;
|
|
|
|
addresses = nm_ip_config_get_addresses (ip4_config);
|
|
if (addresses->len > 0)
|
|
ip4_address = nm_ip_address_get_address (g_ptr_array_index (addresses, 0));
|
|
|
|
ip4_route = nm_ip_config_get_gateway (ip4_config);
|
|
ip4_dns = g_strjoinv (" ", (char **) nm_ip_config_get_nameservers (ip4_config));
|
|
}
|
|
ip6_config = nm_device_get_ip6_config (device);
|
|
if (ip6_config) {
|
|
GPtrArray *addresses;
|
|
|
|
addresses = nm_ip_config_get_addresses (ip6_config);
|
|
if (addresses->len > 0)
|
|
ip6_address = nm_ip_address_get_address (g_ptr_array_index (addresses, 0));
|
|
}
|
|
|
|
if (ip4_address && ip6_address) {
|
|
add_details_row (details, i++, _("IPv4 Address"), ip4_address);
|
|
add_details_row (details, i++, _("IPv6 Address"), ip6_address);
|
|
} else if (ip4_address) {
|
|
add_details_row (details, i++, _("IP Address"), ip4_address);
|
|
} else if (ip6_address) {
|
|
add_details_row (details, i++, _("IPv6 Address"), ip6_address);
|
|
}
|
|
|
|
add_details_row (details, i++, _("Hardware Address"),
|
|
nm_device_ethernet_get_hw_address (NM_DEVICE_ETHERNET (device)));
|
|
|
|
if (ip4_route)
|
|
add_details_row (details, i++, _("Default Route"), ip4_route);
|
|
if (ip4_dns)
|
|
add_details_row (details, i++, _("DNS"), ip4_dns);
|
|
|
|
if (nm_device_get_state (device) != NM_DEVICE_STATE_ACTIVATED) {
|
|
g_autofree gchar *last_used = NULL;
|
|
last_used = get_last_used_string (connection);
|
|
add_details_row (details, i++, _("Last used"), last_used);
|
|
}
|
|
}
|
|
|
|
static void populate_ui (NetDeviceEthernet *self);
|
|
|
|
static gboolean
|
|
device_state_to_off_switch (NMDeviceState state)
|
|
{
|
|
switch (state) {
|
|
case NM_DEVICE_STATE_UNMANAGED:
|
|
case NM_DEVICE_STATE_UNAVAILABLE:
|
|
case NM_DEVICE_STATE_DISCONNECTED:
|
|
case NM_DEVICE_STATE_DEACTIVATING:
|
|
case NM_DEVICE_STATE_FAILED:
|
|
return FALSE;
|
|
default:
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
static void
|
|
device_ethernet_refresh_ui (NetDeviceEthernet *self)
|
|
{
|
|
NMDevice *nm_device;
|
|
NMDeviceState state;
|
|
g_autofree gchar *speed = NULL;
|
|
g_autofree gchar *status = NULL;
|
|
|
|
nm_device = net_device_get_nm_device (NET_DEVICE (self));
|
|
|
|
gtk_label_set_label (self->device_label, net_object_get_title (NET_OBJECT (self)));
|
|
|
|
state = nm_device_get_state (nm_device);
|
|
gtk_widget_set_sensitive (GTK_WIDGET (self->device_off_switch),
|
|
state != NM_DEVICE_STATE_UNAVAILABLE
|
|
&& state != NM_DEVICE_STATE_UNMANAGED);
|
|
self->updating_device = TRUE;
|
|
gtk_switch_set_active (self->device_off_switch, device_state_to_off_switch (state));
|
|
self->updating_device = FALSE;
|
|
|
|
if (state != NM_DEVICE_STATE_UNAVAILABLE)
|
|
speed = net_device_simple_get_speed (NET_DEVICE_SIMPLE (self));
|
|
status = panel_device_status_to_localized_string (nm_device, speed);
|
|
hdy_action_row_set_title (self->details_row, status);
|
|
|
|
populate_ui (self);
|
|
}
|
|
|
|
static void
|
|
editor_done (NetDeviceEthernet *self)
|
|
{
|
|
device_ethernet_refresh_ui (self);
|
|
}
|
|
|
|
static void
|
|
show_details (NetDeviceEthernet *self, GtkButton *button, const gchar *title)
|
|
{
|
|
GtkWidget *row;
|
|
NMConnection *connection;
|
|
GtkWidget *window;
|
|
NetConnectionEditor *editor;
|
|
NMClient *client;
|
|
NMDevice *nmdev;
|
|
|
|
window = gtk_widget_get_toplevel (GTK_WIDGET (self->box));
|
|
|
|
row = g_object_get_data (G_OBJECT (button), "row");
|
|
connection = NM_CONNECTION (g_object_get_data (G_OBJECT (row), "connection"));
|
|
|
|
nmdev = net_device_get_nm_device (NET_DEVICE (self));
|
|
client = net_object_get_client (NET_OBJECT (self));
|
|
editor = net_connection_editor_new (GTK_WINDOW (window), connection, nmdev, NULL, client);
|
|
if (title)
|
|
net_connection_editor_set_title (editor, title);
|
|
g_signal_connect_swapped (editor, "done", G_CALLBACK (editor_done), self);
|
|
net_connection_editor_run (editor);
|
|
}
|
|
|
|
static void
|
|
show_details_for_row (NetDeviceEthernet *self, GtkButton *button)
|
|
{
|
|
show_details (self, button, NULL);
|
|
}
|
|
|
|
static void
|
|
show_details_for_wired (NetDeviceEthernet *self)
|
|
{
|
|
/* Translators: This is used as the title of the connection
|
|
* details window for ethernet, if there is only a single
|
|
* profile. It is also used to display ethernet in the
|
|
* device list.
|
|
*/
|
|
show_details (self, self->details_button, _("Wired"));
|
|
}
|
|
|
|
static void
|
|
add_row (NetDeviceEthernet *self, NMConnection *connection)
|
|
{
|
|
GtkWidget *row;
|
|
GtkWidget *widget;
|
|
GtkWidget *box;
|
|
GtkWidget *details;
|
|
NMDevice *nmdev;
|
|
NMActiveConnection *aconn;
|
|
gboolean active;
|
|
GtkWidget *image;
|
|
|
|
active = FALSE;
|
|
|
|
nmdev = net_device_get_nm_device (NET_DEVICE (self));
|
|
aconn = nm_device_get_active_connection (nmdev);
|
|
if (aconn) {
|
|
const gchar *uuid1, *uuid2;
|
|
uuid1 = nm_active_connection_get_uuid (aconn);
|
|
uuid2 = nm_connection_get_uuid (connection);
|
|
active = g_strcmp0 (uuid1, uuid2) == 0;
|
|
}
|
|
|
|
row = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
|
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
|
gtk_box_pack_start (GTK_BOX (row), box, FALSE, TRUE, 0);
|
|
widget = gtk_label_new (nm_connection_get_id (connection));
|
|
gtk_widget_set_margin_start (widget, 12);
|
|
gtk_widget_set_margin_end (widget, 12);
|
|
gtk_widget_set_margin_top (widget, 8);
|
|
gtk_widget_set_margin_bottom (widget, 8);
|
|
gtk_box_pack_start (GTK_BOX (box), widget, FALSE, TRUE, 0);
|
|
|
|
if (active) {
|
|
widget = gtk_image_new_from_icon_name ("object-select-symbolic", GTK_ICON_SIZE_MENU);
|
|
gtk_widget_set_halign (widget, GTK_ALIGN_CENTER);
|
|
gtk_widget_set_valign (widget, GTK_ALIGN_CENTER);
|
|
gtk_box_pack_start (GTK_BOX (box), widget, FALSE, TRUE, 0);
|
|
|
|
details = gtk_grid_new ();
|
|
gtk_grid_set_row_spacing (GTK_GRID (details), 10);
|
|
gtk_grid_set_column_spacing (GTK_GRID (details), 10);
|
|
|
|
gtk_box_pack_start (GTK_BOX (row), details, FALSE, TRUE, 0);
|
|
|
|
add_details (details, nmdev, connection);
|
|
}
|
|
|
|
/* filler */
|
|
widget = gtk_label_new ("");
|
|
gtk_widget_set_hexpand (widget, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (box), widget, TRUE, TRUE, 0);
|
|
|
|
image = gtk_image_new_from_icon_name ("emblem-system-symbolic", GTK_ICON_SIZE_MENU);
|
|
gtk_widget_show (image);
|
|
widget = gtk_button_new ();
|
|
gtk_style_context_add_class (gtk_widget_get_style_context (widget), "image-button");
|
|
gtk_widget_set_margin_start (widget, 12);
|
|
gtk_widget_set_margin_end (widget, 12);
|
|
gtk_widget_set_margin_top (widget, 8);
|
|
gtk_widget_set_margin_bottom (widget, 8);
|
|
gtk_widget_show (widget);
|
|
gtk_container_add (GTK_CONTAINER (widget), image);
|
|
gtk_widget_set_halign (widget, GTK_ALIGN_CENTER);
|
|
gtk_widget_set_valign (widget, GTK_ALIGN_CENTER);
|
|
atk_object_set_name (gtk_widget_get_accessible (widget), _("Options…"));
|
|
gtk_box_pack_start (GTK_BOX (box), widget, FALSE, TRUE, 0);
|
|
g_object_set_data (G_OBJECT (widget), "edit", widget);
|
|
g_object_set_data (G_OBJECT (widget), "row", row);
|
|
g_signal_connect_swapped (widget, "clicked", G_CALLBACK (show_details_for_row), self);
|
|
|
|
gtk_widget_show_all (row);
|
|
|
|
g_object_set_data (G_OBJECT (row), "connection", connection);
|
|
|
|
gtk_container_add (GTK_CONTAINER (self->list), row);
|
|
}
|
|
|
|
static void
|
|
connection_removed (NetDeviceEthernet *self, NMRemoteConnection *connection)
|
|
{
|
|
if (g_hash_table_remove (self->connections, connection))
|
|
device_ethernet_refresh_ui (self);
|
|
}
|
|
|
|
static void
|
|
populate_ui (NetDeviceEthernet *self)
|
|
{
|
|
GList *children, *c;
|
|
GSList *connections, *l;
|
|
NMConnection *connection;
|
|
gint n_connections;
|
|
|
|
children = gtk_container_get_children (GTK_CONTAINER (self->list));
|
|
for (c = children; c; c = c->next) {
|
|
gtk_container_remove (GTK_CONTAINER (self->list), c->data);
|
|
}
|
|
g_list_free (children);
|
|
|
|
connections = net_device_get_valid_connections (NET_DEVICE (self));
|
|
for (l = connections; l; l = l->next) {
|
|
NMConnection *connection = l->data;
|
|
if (!g_hash_table_contains (self->connections, connection)) {
|
|
g_hash_table_add (self->connections, connection);
|
|
}
|
|
}
|
|
n_connections = g_slist_length (connections);
|
|
|
|
if (n_connections > 1) {
|
|
gtk_widget_hide (GTK_WIDGET (self->details_frame));
|
|
for (l = connections; l; l = l->next) {
|
|
NMConnection *connection = l->data;
|
|
add_row (self, connection);
|
|
}
|
|
gtk_widget_show (GTK_WIDGET (self->scrolled_window));
|
|
} else if (n_connections == 1) {
|
|
connection = connections->data;
|
|
gtk_widget_hide (GTK_WIDGET (self->scrolled_window));
|
|
gtk_widget_show_all (GTK_WIDGET (self->details_frame));
|
|
g_object_set_data (G_OBJECT (self->details_button), "row", self->details_button);
|
|
g_object_set_data (G_OBJECT (self->details_button), "connection", connection);
|
|
|
|
} else {
|
|
gtk_widget_hide (GTK_WIDGET (self->scrolled_window));
|
|
gtk_widget_hide (GTK_WIDGET (self->details_frame));
|
|
}
|
|
|
|
g_slist_free (connections);
|
|
}
|
|
|
|
static void
|
|
client_connection_added_cb (NetDeviceEthernet *self)
|
|
{
|
|
device_ethernet_refresh_ui (self);
|
|
}
|
|
|
|
static void
|
|
add_profile (NetDeviceEthernet *self)
|
|
{
|
|
NMConnection *connection;
|
|
NMSettingConnection *sc;
|
|
g_autofree gchar *uuid = NULL;
|
|
g_autofree gchar *id = NULL;
|
|
NetConnectionEditor *editor;
|
|
GtkWidget *window;
|
|
NMClient *client;
|
|
NMDevice *nmdev;
|
|
const GPtrArray *connections;
|
|
|
|
connection = nm_simple_connection_new ();
|
|
sc = NM_SETTING_CONNECTION (nm_setting_connection_new ());
|
|
nm_connection_add_setting (connection, NM_SETTING (sc));
|
|
|
|
uuid = nm_utils_uuid_generate ();
|
|
|
|
client = net_object_get_client (NET_OBJECT (self));
|
|
connections = nm_client_get_connections (client);
|
|
id = ce_page_get_next_available_name (connections, NAME_FORMAT_PROFILE, NULL);
|
|
|
|
g_object_set (sc,
|
|
NM_SETTING_CONNECTION_UUID, uuid,
|
|
NM_SETTING_CONNECTION_ID, id,
|
|
NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRED_SETTING_NAME,
|
|
NM_SETTING_CONNECTION_AUTOCONNECT, TRUE,
|
|
NULL);
|
|
|
|
nm_connection_add_setting (connection, nm_setting_wired_new ());
|
|
|
|
window = gtk_widget_get_toplevel (GTK_WIDGET (self->box));
|
|
|
|
nmdev = net_device_get_nm_device (NET_DEVICE (self));
|
|
editor = net_connection_editor_new (GTK_WINDOW (window), connection, nmdev, NULL, client);
|
|
g_signal_connect_swapped (editor, "done", G_CALLBACK (editor_done), self);
|
|
net_connection_editor_run (editor);
|
|
}
|
|
|
|
static void
|
|
device_off_toggled (NetDeviceEthernet *self)
|
|
{
|
|
NMClient *client;
|
|
NMDevice *nm_device;
|
|
NMConnection *connection;
|
|
|
|
if (self->updating_device)
|
|
return;
|
|
|
|
client = net_object_get_client (NET_OBJECT (self));
|
|
nm_device = net_device_get_nm_device (NET_DEVICE (self));
|
|
|
|
if (gtk_switch_get_active (self->device_off_switch)) {
|
|
connection = net_device_get_find_connection (NET_DEVICE (self));
|
|
if (connection != NULL) {
|
|
nm_client_activate_connection_async (client,
|
|
connection,
|
|
nm_device,
|
|
NULL, NULL, NULL, NULL);
|
|
}
|
|
} else {
|
|
nm_device_disconnect (nm_device, NULL, NULL);
|
|
}
|
|
}
|
|
|
|
static void
|
|
device_title_changed (NetDeviceEthernet *self)
|
|
{
|
|
device_ethernet_refresh_ui (self);
|
|
}
|
|
|
|
static void
|
|
connection_activated (NetDeviceEthernet *self, GtkListBoxRow *row)
|
|
{
|
|
NMClient *client;
|
|
NMDevice *nm_device;
|
|
NMConnection *connection;
|
|
|
|
client = net_object_get_client (NET_OBJECT (self));
|
|
nm_device = net_device_get_nm_device (NET_DEVICE (self));
|
|
|
|
if (!NM_IS_DEVICE_ETHERNET (nm_device) ||
|
|
!nm_device_ethernet_get_carrier (NM_DEVICE_ETHERNET (nm_device)))
|
|
return;
|
|
|
|
connection = NM_CONNECTION (g_object_get_data (G_OBJECT (gtk_bin_get_child (GTK_BIN (row))), "connection"));
|
|
|
|
nm_client_activate_connection_async (client,
|
|
connection,
|
|
nm_device,
|
|
NULL, NULL, NULL, NULL);
|
|
}
|
|
|
|
static void
|
|
device_ethernet_constructed (GObject *object)
|
|
{
|
|
NetDeviceEthernet *self = NET_DEVICE_ETHERNET (object);
|
|
NMClient *client;
|
|
|
|
g_signal_connect_swapped (self->device_off_switch, "notify::active",
|
|
G_CALLBACK (device_off_toggled), self);
|
|
|
|
self->list = GTK_LIST_BOX (gtk_list_box_new ());
|
|
gtk_list_box_set_selection_mode (self->list, GTK_SELECTION_NONE);
|
|
gtk_list_box_set_header_func (self->list, cc_list_box_update_header_func, NULL, NULL);
|
|
gtk_container_add (GTK_CONTAINER (self->scrolled_window), GTK_WIDGET (self->list));
|
|
g_signal_connect_swapped (self->list, "row-activated",
|
|
G_CALLBACK (connection_activated), self);
|
|
gtk_widget_show (GTK_WIDGET (self->list));
|
|
|
|
g_signal_connect_swapped (self->details_button, "clicked",
|
|
G_CALLBACK (show_details_for_wired), self);
|
|
|
|
g_signal_connect_swapped (self->add_profile_button, "clicked",
|
|
G_CALLBACK (add_profile), self);
|
|
|
|
client = net_object_get_client (NET_OBJECT (object));
|
|
g_signal_connect_object (client, NM_CLIENT_CONNECTION_ADDED,
|
|
G_CALLBACK (client_connection_added_cb), object, G_CONNECT_SWAPPED);
|
|
g_signal_connect_object (client, NM_CLIENT_CONNECTION_REMOVED,
|
|
G_CALLBACK (connection_removed), self, G_CONNECT_SWAPPED);
|
|
|
|
device_ethernet_refresh_ui (self);
|
|
}
|
|
|
|
static void
|
|
device_ethernet_finalize (GObject *object)
|
|
{
|
|
NetDeviceEthernet *self = NET_DEVICE_ETHERNET (object);
|
|
|
|
g_clear_object (&self->builder);
|
|
g_hash_table_destroy (self->connections);
|
|
|
|
G_OBJECT_CLASS (net_device_ethernet_parent_class)->finalize (object);
|
|
}
|
|
|
|
static void
|
|
device_ethernet_refresh (NetObject *object)
|
|
{
|
|
NetDeviceEthernet *self = NET_DEVICE_ETHERNET (object);
|
|
device_ethernet_refresh_ui (self);
|
|
}
|
|
|
|
static void
|
|
net_device_ethernet_class_init (NetDeviceEthernetClass *klass)
|
|
{
|
|
NetDeviceSimpleClass *simple_class = NET_DEVICE_SIMPLE_CLASS (klass);
|
|
NetObjectClass *obj_class = NET_OBJECT_CLASS (klass);
|
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
|
|
simple_class->get_speed = device_ethernet_get_speed;
|
|
obj_class->refresh = device_ethernet_refresh;
|
|
obj_class->add_to_stack = device_ethernet_add_to_stack;
|
|
object_class->constructed = device_ethernet_constructed;
|
|
object_class->finalize = device_ethernet_finalize;
|
|
}
|
|
|
|
static void
|
|
net_device_ethernet_init (NetDeviceEthernet *self)
|
|
{
|
|
g_autoptr(GError) error = NULL;
|
|
|
|
self->builder = gtk_builder_new ();
|
|
gtk_builder_add_from_resource (self->builder,
|
|
"/org/gnome/control-center/network/network-ethernet.ui",
|
|
&error);
|
|
if (error != NULL) {
|
|
g_warning ("Could not load interface file: %s", error->message);
|
|
return;
|
|
}
|
|
|
|
self->add_profile_button = GTK_BUTTON (gtk_builder_get_object (self->builder, "add_profile_button"));
|
|
self->box = GTK_BOX (gtk_builder_get_object (self->builder, "box"));
|
|
self->details_button = GTK_BUTTON (gtk_builder_get_object (self->builder, "details_button"));
|
|
self->details_frame = GTK_FRAME (gtk_builder_get_object (self->builder, "details_frame"));
|
|
self->details_row = HDY_ACTION_ROW (gtk_builder_get_object (self->builder, "details_row"));
|
|
self->device_label = GTK_LABEL (gtk_builder_get_object (self->builder, "device_label"));
|
|
self->device_off_switch = GTK_SWITCH (gtk_builder_get_object (self->builder, "device_off_switch"));
|
|
self->scrolled_window = GTK_SCROLLED_WINDOW (gtk_builder_get_object (self->builder, "scrolled_window"));
|
|
|
|
self->connections = g_hash_table_new (NULL, NULL);
|
|
|
|
g_signal_connect (self, "notify::title", G_CALLBACK (device_title_changed), NULL);
|
|
}
|